function slideArea(elementId, action) {
	var obj = $('#text_area_'+elementId);
	var contentHeight = obj.height();
	var i = Math.abs(obj.css("top").replace(/px/,"")) + 210;
	if (action=='down') {
		if (i < contentHeight-50) {		
				obj.animate({top: -i}, {duration: 1500, easing: 'backout'});		
		}
		else { // We are at the bottom
//			alert(obj.prev.(".blah"));
		}
	}	
	else {
		obj.animate({top: 0}, {duration: 1000, easing: 'backout'}); 				
	}	
}

function showAndHide(element) {
	$(element).fadeIn(500).fadeTo(8000, 1).fadeOut(500);
	return false;
}


function fnKeyDownHandler(getdropdown, e)
{
fnSanityCheck(getdropdown);

// Press [ <- ] and [ -> ] arrow keys on the keyboard to change alignment/flow.
// ...go to Start : Press  [ <- ] Arrow Key
// ...go to End : Press [ -> ] Arrow Key
// (this is useful when the edited-text content exceeds the ListBox-fixed-width)
// This works best on Internet Explorer, and not on Netscape

var vEventKeyCode = FindKeyCode(e);

// Press left/right arrow keys
if(vEventKeyCode == 37)
{
fnLeftToRight(getdropdown);
}
if(vEventKeyCode == 39)
{
fnRightToLeft(getdropdown);
}

// Delete key pressed
if(vEventKeyCode == 46)
{
fnDelete(getdropdown);
}

// backspace key pressed
if(vEventKeyCode == 8 || vEventKeyCode==127)
{
if(e.which) //Netscape
{
  //e.which = ''; //this property has only a getter.
}
else //Internet Explorer
{
  //To prevent backspace from activating the -Back- button of the browser
  e.keyCode = '';
  if(window.event.keyCode)
  {
  window.event.keyCode = '';
  }
}
return true;
}

// Tab key pressed, use code below to reorient to Left-To-Right flow, if needed
//if(vEventKeyCode == 9)
//{
//  fnLeftToRight(getdropdown);
//}
}

function fnLeftToRight(getdropdown)
{
getdropdown.style.direction = "ltr";
}

function fnRightToLeft(getdropdown)
{
getdropdown.style.direction = "rtl";
}

function fnDelete(getdropdown)
{
if(getdropdown.options.length != 0)
// if dropdown is not empty
{
if (getdropdown.options.selectedIndex == vEditableOptionIndex_A)
// if option the Editable field
{
  getdropdown.options[getdropdown.options.selectedIndex].text = '';
  getdropdown.options[getdropdown.options.selectedIndex].value = '';
}
}
}


/*
Since Internet Explorer and Netscape have different
ways of returning the key code, displaying keys
browser-independently is a bit harder.
However, you can create a script that displays keys
for either browser.
The following function will display each key
in the status line:

The "FindKey.." function receives the "event" object
from the event handler and stores it in the variable "e".
It checks whether the "e.which" property exists (for Netscape),
and stores it in the "keycode" variable if present.
Otherwise, it assumes the browser is Internet Explorer
and assigns to keycode the "e.keyCode" property.
*/

function FindKeyCode(e)
{
if(e.which)
{
keycode=e.which;  //Netscape
}
else
{
keycode=e.keyCode; //Internet Explorer
}

//alert("FindKeyCode"+ keycode);
return keycode;
}

function FindKeyChar(e)
{
keycode = FindKeyCode(e);
if((keycode==8)||(keycode==127))
{
character="backspace"
}
else if((keycode==46))
{
character="delete"
}
else
{
character=String.fromCharCode(keycode);
}
//alert("FindKey"+ character);
return character;
}

function fnSanityCheck(getdropdown)
{
if(vEditableOptionIndex_A>(getdropdown.options.length-1))
{
alert("PROGRAMMING ERROR: The value of variable vEditableOptionIndex_... cannot be greater than (length of dropdown - 1)");
return false;
}
}

var vEditableOptionIndex_A = 0;

// Give Index of Editable option in the dropdown.
// For eg.
// if first option is editable then vEditableOptionIndex_A = 0;
// if second option is editable then vEditableOptionIndex_A = 1;
// if third option is editable then vEditableOptionIndex_A = 2;
// if last option is editable then vEditableOptionIndex_A = (length of dropdown - 1).
// Note: the value of vEditableOptionIndex_A cannot be greater than (length of dropdown - 1)

var vEditableOptionText_A = "Enter New...";

// Give the default text of the Editable option in the dropdown.
// For eg.
// if the editable option is <option ...>--?--</option>,
// then set vEditableOptionText_A = "--?--";

/*------------------------------------------------
Global Variables required for
fnChangeHandler_A(), fnKeyPressHandler_A() and fnKeyUpHandler_A()
for Editable Dropdowns
-------------------------- Subrata Chakrabarty  */

var vPreviousSelectIndex_A = 0;
// Contains the Previously Selected Index, set to 0 by default

var vSelectIndex_A = 0;
// Contains the Currently Selected Index, set to 0 by default

var vSelectChange_A = 'MANUAL_CLICK';
// Indicates whether Change in dropdown selected option
// was due to a Manual Click
// or due to System properties of dropdown.

// vSelectChange_A = 'MANUAL_CLICK' indicates that
// the jump to a non-editable option in the dropdown was due
// to a Manual click (i.e.,changed on purpose by user).

// vSelectChange_A = 'AUTO_SYSTEM' indicates that
// the jump to a non-editable option was due to System properties of dropdown
// (i.e.,user did not change the option in the dropdown;
// instead an automatic jump happened due to inbuilt
// dropdown properties of browser on typing of a character )

/*------------------------------------------------
Functions required for  Editable Dropdowns
-------------------------- Subrata Chakrabarty  */

function fnChangeHandler_A(getdropdown)
{
fnSanityCheck(getdropdown);

vPreviousSelectIndex_A = vSelectIndex_A;
// Contains the Previously Selected Index

vSelectIndex_A = getdropdown.options.selectedIndex;
// Contains the Currently Selected Index

if ((vPreviousSelectIndex_A == (vEditableOptionIndex_A)) && (vSelectIndex_A != (vEditableOptionIndex_A))&&(vSelectChange_A != 'MANUAL_CLICK'))
// To Set value of Index variables - Subrata Chakrabarty
{
  getdropdown[(vEditableOptionIndex_A)].selected=true;
  vPreviousSelectIndex_A = vSelectIndex_A;
  vSelectIndex_A = getdropdown.options.selectedIndex;
  vSelectChange_A = 'MANUAL_CLICK';
  // Indicates that the Change in dropdown selected
  // option was due to a Manual Click
}
}

function fnKeyPressHandler_A(getdropdown, e)
{
fnSanityCheck(getdropdown);

keycode = FindKeyCode(e);
keychar = FindKeyChar(e);

// Check for allowable Characters
// The various characters allowable for entry into Editable option..
// may be customized by minor modifications in the code (if condition below)
// (you need to know the keycode/ASCII value of the  character to be allowed/disallowed.
// - Subrata Chakrabarty

if ((keycode>47 && keycode<59)||(keycode>62 && keycode<127) ||(keycode==32))
{
  var vAllowableCharacter = "yes";
}
else
{
  var vAllowableCharacter = "no";
}

//alert(window); alert(window.event);

if(getdropdown.options.length != 0)
// if dropdown is not empty
  if (getdropdown.options.selectedIndex == (vEditableOptionIndex_A))
  // if selected option the Editable option of the dropdown
  {

    var vEditString = getdropdown[vEditableOptionIndex_A].value;

    // make Editable option Null if it is being edited for the first time
    if((vAllowableCharacter == "yes")||(keychar=="backspace"))
    {
      if (vEditString == vEditableOptionText_A)
        vEditString = "";
    }
    if (keychar=="backspace")
    // To handle backspace - Subrata Chakrabarty
    {
      vEditString = vEditString.substring(0,vEditString.length-1);
      // Decrease length of string by one from right

      vSelectChange_A = 'MANUAL_CLICK';
      // Indicates that the Change in dropdown selected
      // option was due to a Manual Click

    }
    //alert("EditString2:"+vEditString);

    if (vAllowableCharacter == "yes")
    // To handle addition of a character - Subrata Chakrabarty
    {
      vEditString+=String.fromCharCode(keycode);
      // Concatenate Enter character to Editable string

      // The following portion handles the "automatic Jump" bug
      // The "automatic Jump" bug (Description):
      //   If a alphabet is entered (while editing)
      //   ...which is contained as a first character in one of the read-only options
      //   ..the focus automatically "jumps" to the read-only option
      //   (-- this is a common property of normal dropdowns
      //    ..but..is undesirable while editing).

      var i=0;
      var vEnteredChar = String.fromCharCode(keycode);
      var vUpperCaseEnteredChar = vEnteredChar;
      var vLowerCaseEnteredChar = vEnteredChar;


      if(((keycode)>=97)&&((keycode)<=122))
      // if vEnteredChar lowercase
        vUpperCaseEnteredChar = String.fromCharCode(keycode - 32);
        // This is UpperCase


      if(((keycode)>=65)&&((keycode)<=90))
      // if vEnteredChar is UpperCase
        vLowerCaseEnteredChar = String.fromCharCode(keycode + 32);
        // This is lowercase

      if(e.which) //For Netscape
      {
        // Compare the typed character (into the editable option)
        // with the first character of all the other
        // options (non-editable).

        // To note if the jump to the non-editable option was due
        // to a Manual click (i.e.,changed on purpose by user)
        // or due to System properties of dropdown
        // (i.e.,user did not change the option in the dropdown;
        // instead an automatic jump happened due to inbuilt
        // dropdown properties of browser on typing of a character )

        for (i=0;i<=(getdropdown.options.length-1);i++)
        {
          if(i!=vEditableOptionIndex_A)
          {
            var vReadOnlyString = getdropdown[i].value;
            var vFirstChar = vReadOnlyString.substring(0,1);
            if((vFirstChar == vUpperCaseEnteredChar)||(vFirstChar == vLowerCaseEnteredChar))
            {
              vSelectChange_A = 'AUTO_SYSTEM';
              // Indicates that the Change in dropdown selected
              // option was due to System properties of dropdown
              break;
            }
            else
            {
              vSelectChange_A = 'MANUAL_CLICK';
              // Indicates that the Change in dropdown selected
              // option was due to a Manual Click
            }
          }
        }
      }
    }

    // Set the new edited string into the Editable option
    getdropdown.options[vEditableOptionIndex_A].text = vEditString;
    getdropdown.options[vEditableOptionIndex_A].value = vEditString;

    return false;
  }
return true;
}

function fnKeyUpHandler_A(getdropdown, e)
{
fnSanityCheck(getdropdown);

if(e.which) // Netscape
{
  if(vSelectChange_A == 'AUTO_SYSTEM')
  {
    // if editable dropdown option jumped while editing
    // (due to typing of a character which is the first character of some other option)
    // then go back to the editable option.
    getdropdown[(vEditableOptionIndex_A)].selected=true;
  }

  var vEventKeyCode = FindKeyCode(e);
  // if [ <- ] or [ -> ] arrow keys are pressed, select the editable option
  if((vEventKeyCode == 37)||(vEventKeyCode == 39))
  {
    getdropdown[vEditableOptionIndex_A].selected=true;
  }
}
}