  //==========================================================================================
  //                         Copyright © 2000, Agate Software, Inc.
  //===========================================================================================
  // Procedure: GiveFocusToFirstTextBox
  //
  // Description: Puts the cursor in the first text box on the page
  //
  //----------------------------------------------------------------------------------------------
  // History                                                   By                    Date
  //----------------------------------------------------------------------------------------------
  // Added                                                     Walter Pelowski       08/28/2001
  // Originally Created By                                     Jeff Benton
  // Added function for limiting textarea boxes.				   Craig Tingley			 05/05/2010
  //============================================================================================	

function GiveFocusToFirstTextBox()
{
  var blnFound = false;
	  
  if(document.forms.length!=0)
  {
    for(i=0; i<document.forms.length; i++)
    {
      for(j=0; j<document.forms[i].length; j++)
      {
        //if (!blnFound)
        //{
          if((document.forms[i].elements[j].type == 'text' && !document.forms[i].elements[j].disabled) || document.forms[i].elements[j].type == 'textarea' || document.forms[i].elements[j].type == 'password' )
          {
            blnFound = true;
            document.forms[i].elements[j].focus();
            window.scrollTo(0,0);
            window.scroll(0,0);
            break;
          }
        //}
      }
	      
      if( blnFound ) break;
    }
  }
}

function checkbrowser()
{
  var browserName=navigator.appName; 
  var browserVer=parseInt(navigator.appVersion);
   
  if ((browserName=='Netscape' && browserVer>=4) || (browserName=='Microsoft Internet Explorer' && browserVer>=4)) 
  {
    version='n3'; 
  }
  else
  {
    version='n2'; 
  }
  if (version=='n3')
  {
    //alert('Your browser passes the test');
  }
  else
  {
    //alert('In order for this site to work properly you should upgrade your browser to Internet Explorer or Netscape versions 4.0 or above.');
    //HARDCODED PATH
    //FIND WAY TO CHANGE IT
    window.location.href = '/megs/Invalid_Browser.asp';
  }
}
//============================================================================================
//                         Copyright © 2000-2003 Agate Software, Inc.
//============================================================================================
// Procedure:		JavaScriptCustomFunctions.browser
//
// Description: Gets all browser/environment settings
// 
// Input:       [none]
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye           
//============================================================================================

function Browser() {
  
  // declare procedure scope variables
  var objUserAgent, strBrowser, intVersionPosition;
  
  // initialise attributes
  this.isIE       = false;
  this.isNetscape = false;
  this.version    = null;

  objUserAgent = navigator.userAgent;

  strBrowser = "MSIE";
  if ((intVersionPosition = objUserAgent.indexOf(strBrowser)) >= 0) {
    this.isIE = true;
    this.version = parseFloat(objUserAgent.substr(intVersionPosition + strBrowser.length));
    return;
  }

  strBrowser = "Netscape6/";
  if ((intVersionPosition = objUserAgent.indexOf(strBrowser)) >= 0) {
    this.isNetscape = true;
    this.version = parseFloat(objUserAgent.substr(intVersionPosition + strBrowser.length));
    return;
  }

  // treat other Gecko browsers as netscape 6.1.
  strBrowser = "Gecko";
  if ((intVersionPosition = objUserAgent.indexOf(strBrowser)) >= 0) {
    this.isNetscape = true;
    this.version = 6.1;
    return;
  }
}

function Maximize(objWindow)
{
  if(isObject(objWindow))
  {
	objWindow.moveTo(0,0); 
	objWindow.outerWidth = screen.availWidth; 
	objWindow.outerHeight = screen.availHeight;  
	objWindow.resizeTo(screen.availWidth,screen.availHeight);
  }
  else
  {
	window.moveTo(0,0); 
	window.outerWidth = screen.availWidth; 
	window.outerHeight = screen.availHeight;  
	window.resizeTo(screen.availWidth,screen.availHeight); 
  }
}      

//==========================================================================================
//                         Copyright © 2000, Agate Software, Inc.
//==========================================================================================
// Procedure: toggleAll
//
// Description: Toggles all instances of a form element type/ID
//
// Input: strObjID  --> Portion of element id which is the same for all elements to be 
//                        toggled
//        objCaller --> [this]
//
//------------------------------------------------------------------------------------------
// History                                                   By                   Date
//------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye         11/15/2002
//==========================================================================================	
  
function toggleAll(strObjID, objCaller) {
  var REObjID = new RegExp(strObjID); // RE to match element id
  var strObjType = objCaller.type;    // element type
  var objForm = eval('document.forms.' + objCaller.form.name);
  
  // loop through elements on form
  for (n=0; n<objForm.length; n++) {
    var objElement = objForm.elements[n];
    
    if ((objElement.type == strObjType) && (REObjID.test(objElement.id)))  {
      switch (strObjType) {
        case 'checkbox':
          objElement.checked = objCaller.checked;
          break;
        default:
          objElement.value = objCaller.value;
          break;
      }
    }
  }
}

//==========================================================================================
//                         Copyright © 2000, Agate Software, Inc.
//==========================================================================================
// Procedure: generatemailto
//
// Description: Generates a mailto for all selected contacts
//
// Input: strObjID			--> Contact checkbox
//        strEmailObjID --> Email element for each contact
//        objCaller			--> [this]
//
//------------------------------------------------------------------------------------------
// History                                                   By                   Date
//------------------------------------------------------------------------------------------
// Created                                                   Brian Dishaw			    07/11/2003
// Modified - Changed to do one email per line							 Brian Dishaw					08/30/2004
//==========================================================================================	
function generatemailto(strObjID, strEmailObjID, objCaller, strEmailBodyObject)
{
	var REObjID = new RegExp(strObjID); // RE to match element id
  var strObjType = objCaller.type;    // element type
  var objForm = eval('document.forms.' + objCaller.form.name);
  //var objEmailSubjectID = document.getElementById(strEmailBodyObject);
  //var objEmailBody = document.getElementById('emailbody_' + objEmailSubjectID.value);
  //var objEmailSubject = document.getElementById('emailsubject_' + objEmailSubjectID.value);
	var strMailTo;
	var objElementID;
	var aryElementID;
	var strElementID;
	var aryEmailSplit;
	var strEmailSplit;
	var aryEmailAddresses = [];
	var blnFound;
	
	strMailTo = 'mailto:';
  strAddresses = '';
  
  var newWindow = window.open('', 'Email_Addresses', 'WIDTH=800,toolbar=no,status=yes,location=no,resizable=yes,scrollbars=yes,dependent');
  newWindow.document.open();
  newWindow.document.write('<table>');
  
	// loop through elements on form
  for (n=0; n<objForm.length; n++) 
  {
    var objElement = objForm.elements[n];
    if (REObjID.test(objElement.id))  
    {
      switch (objElement.type) 
      {
        case 'checkbox':
          if(objElement.checked)
          {
						blnFound = false;
						objElementID = objElement.id;
						aryElementID = objElementID.split('_');
						strElementID = aryElementID[1];
						objElementID = objCaller.document.getElementById(strEmailObjID + '_' + strElementID);
						//aryEmailSplit = objElementID.value.split('(');
						// = aryEmailSplit[1];
						//aryEmailSplit = strEmailSplit.split(')');
						//strEmailSplit = aryEmailSplit[0];
						strEmailSplit = objElementID.value;
						for (m=0; m<aryEmailAddresses.length; m++)
						{
							if (aryEmailAddresses[m].indexOf(strEmailSplit) != -1)
							{
								blnFound = true;
							}
						}
						if (blnFound == false)
						{
							if (isEmail(strEmailSplit) == true)
							{
								newWindow.document.write('<table><tr><td>' + trim(objElementID.value) + '</td></tr></table>');
								aryEmailAddresses.push(strEmailSplit);
							}
						}
          }
          break;
        default:
          break;
      }
    }
  }

  newWindow.document.write('</table>');
  newWindow.document.close();

	//strMailTo = strMailTo + "?subject=" + objEmailSubject.value
	//strMailTo = strMailTo + "&body=" + objEmailBody.value
	window.document.location = strMailTo;
	window.go;
	
	newWindow.setTimeout('window.focus()', 4000);
}


//==========================================================================================
//                         Copyright © 2002, Agate Software, Inc.
//==========================================================================================
// Procedure: clearRadioButtons
//
// Description: Clears all radio buttons on a page
//
// Input: aryFormElements --> An array of elements on the page
//
//------------------------------------------------------------------------------------------
// History                                                   By                   Date
//------------------------------------------------------------------------------------------
// Created                                                   Brian Dishaw         11/26/2002
//==========================================================================================
function clearRadioButtons(aryFormElements) 
{	
	var objElement;
	var objElementType;
	//loop though all elements in the array
	for(n=0; n<aryFormElements.length; n++)
	{
		objElement = aryFormElements[n];
		objElementType = objElement.type;
		switch(objElementType)  
		{
		  case 'radio':
		    objElement.checked = false;
		    break;
		  default:
		    objElement.value = objElement.value;
		    break;
		}
	}
}

//==========================================================================================
//                         Copyright © 2002, Agate Software, Inc.
//==========================================================================================
// Procedure: updateAndValidateTextArea
//
// Description: Updates character counter on text area
//              Text counter area must have same name as test area being counted + '_CharCount'
//
// Input: field --> Text area field name
//        formname --> Name of the form the text area resides on
//
//------------------------------------------------------------------------------------------
// History                                                   By                   Date
//------------------------------------------------------------------------------------------
// Created                                                   Brian Dishaw         12/05/2002
//==========================================================================================
function CountCharacters(field, formname)
{
	var FieldLength;
	var FieldCharacterCount;
	FieldCharacterCount = eval('document.' + formname + '.' + field.name + '_CharCount');
	FieldLength = field.value.length;
	FieldCharacterCount.value = FieldLength;
}	

//==========================================================================================
//                         Copyright © 2002, Agate Software, Inc.
//==========================================================================================
// Procedure: updateAndValidateTextArea
//
// Description: Updates character counter on text area
//              Text counter area must have same name as test area being counted + '_CharCount'
//
// Input: field --> Text area field name
//        formname --> Name of the form the text area resides on
//
//------------------------------------------------------------------------------------------
// History                                                   By                   Date
//------------------------------------------------------------------------------------------
// Created                                                   Brian Dishaw         04/16/2004
//==========================================================================================
function ValidateTextAreaCount()
{
	var aryObjs_TextArea = document.getElementsByTagName('TEXTAREA');
	var lngTot_TextArea;
	var lngCtr_TextArea;
	var blnReturn;
	
	lngTot_TextArea = aryObjs_TextArea.length;
	blnReturn = true
	for(lngCtr_TextArea = 0; lngCtr_TextArea < lngTot_TextArea; lngCtr_TextArea++)
	{
		if(!validate(2, aryObjs_TextArea[lngCtr_TextArea], '', false, true, '', 1, aryObjs_TextArea[lngCtr_TextArea].MaxLength, 0)) 
		{
			blnReturn = false;
		}
	}
	return blnReturn;
}

//============================================================================================
//                         Copyright © 2003, Agate Software, Inc.
//============================================================================================
// Procedure:		DisableCapitalOutlay
//
// Description: Disables Capital Outlay for CI grants.  These are all special cases.
// 
// Input:       strFormName             - Name of the form
//
//--------------------------------------------------------------------------------------------
// History                                                   By                    Date
//--------------------------------------------------------------------------------------------
// Created                                                   Daniel Knauf          02/24/2003
//============================================================================================

// Is this text box supposed to be disabled?  This var is referenced in validate()
var blnDisabledTextBox = new Boolean(false);

function DisableCapitalOutlay(strFormName)
{
  var idx = strFormName.abdFunctionCode_fncID.selectedIndex; 
  var val = strFormName.abdFunctionCode_fncID.options[idx].value;
  var aryData = eval('document.forms.' + strFormName.name + '.elements');

	//Build elements array for selection of contact	
	for(n=0; n<aryData.length; n++) 
	{
		var objElement = aryData[n];
		var strObjName = objElement.name;
    
		switch (strObjName) 
		{
			case 'abcCost500':		
	        if (val == '2850' || val=='2851' || val=='2855' || val=='2856' || val=='2857' || val=='2858' || val=='2852' || val=='2853'){
			      var objTextBox = document.getElementById(strObjName);
			      objTextBox.style.backgroundColor = '';
			      blnDisabledTextBox = false;
			      objTextBox.blur();	
          }else{
			      var objTextBox = document.getElementById(strObjName);
			      objTextBox.style.backgroundColor = '#C0C0C0';   
			      objTextBox.value=''; 
			      blnDisabledTextBox = true;    
          }
        break;
        
 			case 'abcCost501':		
	        if (val == '2817'){
			      var objTextBox = document.getElementById(strObjName);
			      objTextBox.style.backgroundColor = '';
			      blnDisabledTextBox = false;
			      objTextBox.blur();	
          }else{
			      var objTextBox = document.getElementById(strObjName);
			      objTextBox.style.backgroundColor = '#C0C0C0';        
			      objTextBox.value='';
			      blnDisabledTextBox = true;
          }         
				break;
			
			default:			  
				break;
		}
	}
  
}

//============================================================================================
//                         Copyright © 2003, Agate Software, Inc.
//============================================================================================
// Procedure:		disablebox
//
// Description: Invokes the onBlur() function for a text input box.  These are all special cases
// 
// Input:       objTextBox             - the object
//
//--------------------------------------------------------------------------------------------
// History                                                   By                    Date
//--------------------------------------------------------------------------------------------
// Created                                                   Daniel Knauf          02/24/2003
//============================================================================================
function disablebox(objTextBox){

  if (blnDisabledTextBox == true){
    if (objTextBox.name == 'abcCost500'){
      objTextBox.blur();
     }
     else if (objTextBox.name == 'abcCost501'){
      objTextBox.blur();
    }
  }

}

//============================================================================================
//                         Copyright © 2000-2003, Agate Software, Inc.
//============================================================================================
// Procedure:   JavaScriptCustomFunctions.toggleListboxes
//
// Description: Hides ListBoxes when main menu is active
//
// Input:       [none]
//
//--------------------------------------------------------------------------------------------
// History                                                    By                    Date
//--------------------------------------------------------------------------------------------
// Created                                                    Sylvania Dye          09/04/2002
// Modified - Optimised for speed                             Sylvania Dye          10/06/2003
//============================================================================================	

var blnListboxesVisible = true;

function toggleListboxes() {
  var blnPanelOpen = false;
  var rePanel      = /panel(\d)+/;      // panel id regex
  var aryObjs_Div = document.getElementsByTagName('div');
  
  // sniff divs in this document; are any panels visible?
  if (aryObjs_Div.length > 0) {
    var i = aryObjs_Div.length -1;
    DivLoop:
    do {
      switch (blnPanelOpen) {
        case false:
          var aryMenuPanel = aryObjs_Div[i].id.match(rePanel); // is this div a menu panel?
        
          if (aryMenuPanel != null) {
            blnPanelOpen = (aryObjs_Div[i].style.visibility == 'visible') ? true : false;
          }
          break;
        case true:
          break DivLoop;
      }
    }
    while (i--);
  }
  
  // sniff listboxes in this document
  if (aryObjs_Listbox.length > 0) {  
    // there are listboxes on this page - loop through & show/hide all listboxes
    var i = aryObjs_Listbox.length -1;
    do {
      // if a panel is open, hide listboxes; else, show them
      aryObjs_Listbox[i].style.visibility = (blnPanelOpen == true) ? 'hidden' : 'visible';
      blnListboxesVisible = (blnPanelOpen == true) ? false : true;
    }
    while (i--);
  }
}

//============================================================================================
//             		            begin TreeView JavaScript functions
//============================================================================================

//============================================================================================
//                         Copyright © 2002, 2003 Agate Software, Inc.
//============================================================================================
// Procedure:		JavaScriptCustomFunctions.toggleTreeViewNode
//
// Description: Expands or collapses DHTML TreeView nodes
// 
// Input:       ChildNodeID		  -	tag ID of child node to display or hide (string)
//							TriggerIconID	  -	tag ID of trigger icon displayed on click (string *optional)
//              TriggerFolderID - tag ID of trigger folder icon displayed on click (string *optional)
//              ExpandImage     - trigger icon displayed while node is collapsed (string *optional)
//              CollapseImage   - trigger icon displayed while node is expanded (string *optional)
//              ExpandFolder    - folder icon displayed while node is collapsed (string *optional)
//              CollapseFolder  - folder icon displayed while node is expanded (string *optional)
//
//--------------------------------------------------------------------------------------------
// History                                                   By                    Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye          09/19/2002
// Modified - altered function to make all but the first     Sylvania Dye          11/04/2002
//            parameter optional
// Modified - added expand/collapse folder image toggling    Sylvania Dye          02/13/2003
// Modified - fixed bug: improper display of +/- node images Sylvania Dye          03/19/2003
//============================================================================================	
  
function toggleTreeViewNode(ChildNodeID, TriggerIconID, TriggerFolderID, ExpandImage, CollapseImage, ExpandFolder, CollapseFolder) {

	var objNode = document.getElementById(ChildNodeID).style;

	if ((TriggerIconID != '') && (ExpandImage != '') && (CollapseImage != '')) {
	  var objIcon = document.getElementById(TriggerIconID);
    objIcon.src = (objNode.display == 'block') ? ExpandImage : CollapseImage;
  }
  if ((TriggerFolderID != '') && (ExpandFolder != '') && (CollapseFolder != '')) {
    var objFolder = document.getElementById(TriggerFolderID);
    objFolder.src = (objNode.display == 'block') ? ExpandFolder : CollapseFolder;
  }
  objNode.display = (objNode.display == 'block') ? 'none' : 'block';
}

//============================================================================================
//                         Copyright © 2002, 2003 Agate Software, Inc.
//============================================================================================
// Procedure:		JavaScriptCustomFunctions.toggleAllNodes
//
// Description: Expands or collapses all DHTML TreeView nodes
// 
// Input:       NodeCount       - total nodes in tree (long)
//              ExpandImage     - trigger icon to show when node is collapsed (string *optional)
//              CollapseImage   - trigger icon to show when node is expanded (string *optional)
//              ExpandFolder    - folder icon to show when node is collapsed (string *optional)
//              CollapseFolder  - folder icon to show when node is expanded (string *optional)
//              ShowNodesImage  - path to 'Show All Nodes' image (string)
//              HideNodesImage  - path to 'Hide All Nodes' image (string)
//
//--------------------------------------------------------------------------------------------
// History                                                   By                    Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye          09/19/2002
// Modified - altered function to make expand and collapse   Sylvania Dye          11/04/2002
//            icons optional
// Modified - added expand/collapse folder image toggling    Sylvania Dye          02/13/2002
// Modified - fixed bug: improper display of +/- node images Sylvania Dye          03/19/2003
//============================================================================================	
  
function toggleAllNodes(NodeCount, ExpandImage, CollapseImage, ExpandFolder, CollapseFolder, ShowNodesImage, HideNodesImage) {
	var objNode = null;
	var objIcon = null;
	var objFolder = null;
	var blnHasIcons = false;
	var objToggleImage = document.getElementById('ToggleAll');
	
	var n=NodeCount;
	do {
		objNode = document.getElementById('node' + n);
			
		if ((ExpandImage != '') && (CollapseImage != '')) {
			objIcon = (document.getElementById('icon' + n)) ? document.getElementById('icon' + n) : null;
			blnHasIcons = (objIcon != null) ? true : false;
			objFolder = !(document.getElementById('folder' + n)) ? document.getElementById('folder' + n) : null;
		}
			
		if (objToggleImage.src.indexOf(ShowNodesImage) > -1) {
			if (objNode != null) {
				objNode.style.display = 'block';
			}
			if ((objIcon != null) && (blnHasIcons)) {
				objIcon.src = CollapseImage;
			}
			if (objFolder != null) {
				objFolder.src = CollapseFolder;
			}
		} else {
			if (objNode != null) {
				objNode.style.display = 'none';
			}
			if ((objIcon != null) && (blnHasIcons)) {
				objIcon.src = ExpandImage;
			}
			if (objFolder != null) {
				objFolder.src = ExpandFolder;
			}
		}
	}
  while (n--);
  
	if (objToggleImage.src.indexOf(ShowNodesImage) > -1) {
		objToggleImage.src = HideNodesImage;
	} else {
		objToggleImage.src = ShowNodesImage;
	}
}

//============================================================================================
//             		            end TreeView JavaScript functions
//============================================================================================

//============================================================================================
//             		           begin DropMenu JavaScript functions
//============================================================================================

// global variables
var aryObjs_Listbox = document.getElementsByTagName('select'); // listboxes need to hide while menu is on
var browser = new Browser();                                   // browser object for branching
var objActiveNode_Global = null;                               // currently active node

  
// page scope vars
var lngMouseX;
var lngMouseY;
//var blnNN = document.layers;  // nn : others are dom

// inadequate netscape support
// initialise for dom, nn
//if (blnNN) { // nn
  //window.captureEvents(Event.MOUSEMOVE);
  //window.onmousemove = getMouseCoords;
//}

// initialise mouseevent listeners
if (browser.isIE) {
  document.onmousedown = resetMenuNode;
  document.onmousemove = getMouseCoords;
} else {
  document.addEventListener('mousedown', resetMenuNode, true);
  document.addEventListener('mousemove', getMouseCoords, true);
}


//============================================================================================
//                         Copyright © 2000-2003 Agate Software, Inc.
//============================================================================================
// Procedure:		JavaScriptCustomFunctions.getMouseCoords
//
// Description: Returns Mouse coordinates (x, y)
// 
// Input:       [event]
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye           03/26/2003
//============================================================================================	

// get mouse coordinates x,y
function getMouseCoords(event) {
  lngMouseX = (browser.isIE) ? window.event.clientX : event.pageX;
  lngMouseY = (browser.isIE) ? window.event.clientY : event.pageY;
}

function alertMouseCoords() {
  alert('mouseX: ' + lngMouseX + '; mouseY: ' + lngMouseY);
}

//===========================================================================================
//                         Copyright © 2000 - 2003, Agate Software, Inc.
//===========================================================================================
// Procedure:   JavaScriptCustomFunctions.resetMenuNode
//
// Description: Capture mouse clicks on the page so we can close open panels
//
//-------------------------------------------------------------------------------------------
// History                                                   By                    Date
//-------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye          12/11/2003
//===========================================================================================

function resetMenuNode(event) {
  
  // declare procedure scope variables
  var objTrigger;

  // is there an active node?
  if (objActiveNode_Global == null) { return; }  // no active node: return

  // get the event trigger object
  if (browser.isIE) {
    objTrigger = window.event.srcElement;
  } else {
    objTrigger = (event.target.tagName ? event.target : event.target.parentNode);
  }
  
  // was the active node clicked?
  if (objTrigger == objActiveNode_Global) { return; }  // active node was clicked: return

  // if the trigger object is not part of a menu, reset the active node
  if (getNodeParent(objTrigger, 'DIV', 'mnuPanel') == null) {
    toggleMenuNode(objActiveNode_Global, 'off');
    objActiveNode_Global = null;
  }
}

//===========================================================================================
//                         Copyright © 2000 - 2003, Agate Software, Inc.
//===========================================================================================
// Procedure:   JavaScriptCustomFunctions.buildMenuPanel
//
// Description: Build DropMenu panels
//
//-------------------------------------------------------------------------------------------
// History                                                   By                    Date
//-------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye          12/11/2003
//===========================================================================================	

function buildMenuPanel(menuPanel) {
  
  // declare procedure scope variables
  var aryPanelNodes, aryPanelSpans;
  var objNodeText, objNodeArrow;
  var intNodeWidth, intAdjNodeWidth;
  var w, dw;
  var x, y; // loop counters

  // get array of panel spans
  if (browser.isIE) {
    aryPanelSpans = menuPanel.getElementsByTagName('SPAN');
  }

  // get array of panel nodes, node width
  aryPanelNodes = menuPanel.getElementsByTagName('A');
  if (aryPanelNodes.length > 0) {
    intNodeWidth = aryPanelNodes[0].offsetWidth;
  } else {
    return;
  }
  
  // pad node to right-align arrows
  for (x = 0; x < aryPanelNodes.length; x++) {
    aryPanelSpans = aryPanelNodes[x].getElementsByTagName('SPAN');
    objNodeText  = null;
    objNodeArrow = null;
    for (y = 0; y < aryPanelSpans.length; y++) {
      if (hasClass(aryPanelSpans[y], 'mnuNodeText')) { objNodeText = aryPanelSpans[y]; }
      if (hasClass(aryPanelSpans[y], 'mnuNodeArrow')) { objNodeArrow = aryPanelSpans[y]; }
    }
    if (objNodeText != null && objNodeArrow != null) {objNodeText.style.paddingRight = (intNodeWidth - (objNodeText.offsetWidth + objNodeArrow.offsetWidth)) + 'px'; }
  }

  // set width for first panel node (for ie)
  if (browser.isIE) {
    intNodeWidth = aryPanelNodes[0].offsetWidth;
    aryPanelNodes[0].style.width = intNodeWidth + 'px';
    intAdjNodeWidth = aryPanelNodes[0].offsetWidth - intNodeWidth;
    intNodeWidth -= intAdjNodeWidth;
    aryPanelNodes[0].style.width = intNodeWidth + 'px';
  }
  
  // store panel true height
  menuPanel.trueHeight = menuPanel.offsetHeight;
  
  // mark menu as initialized
  menuPanel.isInitialized = true;
}

//===========================================================================================
//                         Copyright © 2000 - 2003, Agate Software, Inc.
//===========================================================================================
// Procedure:   JavaScriptCustomFunctions.getNodeParent
//
// Description: Get a node's parent node
//
//-------------------------------------------------------------------------------------------
// History                                                   By                    Date
//-------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye          12/11/2003
//============================================================================================	

function getNodeParent(node, tagName, className) {

  // starting with the given node, find the nearest containing element with the specified tag name and style class
  while (node != null) {
    if (node.tagName != null && node.tagName == tagName && hasClass(node, className)) { return node; }
    
    node = node.parentNode;
  }

  return node;
}

//===========================================================================================
//                         Copyright © 2000 - 2003, Agate Software, Inc.
//===========================================================================================
// Procedure:   JavaScriptCustomFunctions.hasClass
//
// Description: Determines whether an element has the passed class name in its list
//
//-------------------------------------------------------------------------------------------
// History                                                   By                    Date
//-------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye          12/11/2003
//============================================================================================	

function hasClass(objElement, strName) {
  
  // declare procedure scope variables
  var aryClassList;
  var x;
  
  // parse space-delimited class name list into array for looping
  aryClassList = objElement.className.split(' ');
  
  // loop and test class name array against passed class name
  for (x = 0; x < aryClassList.length; x++) {
    if (aryClassList[x] == strName) { return true; }
  }

  return false;
}

//===========================================================================================
//                         Copyright © 2000 - 2003, Agate Software, Inc.
//===========================================================================================
// Procedure:   JavaScriptCustomFunctions.removeClass
//
// Description: Removes a class name from an element's class list
//
//-------------------------------------------------------------------------------------------
// History                                                   By                    Date
//-------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye          12/11/2003
//============================================================================================	

function removeClass(objElement, strName) {
  
  // declare procedure scope variables
  var aryNewClassList, aryOldClassList;
  var x;

  if (objElement.className == null) { return; }
  
  aryNewClassList = new Array();
  
  // parse space-delimited class name list into array for looping
  aryOldClassList = objElement.className.split(' ');
  
  for (x = 0; x < aryOldClassList.length; x++) {
    if (aryOldClassList[x] != strName) { aryNewClassList.push(aryOldClassList[x]); }
  }
  
  // join new class list array with space delimiters
  objElement.className = aryNewClassList.join(' ');
}

//============================================================================================
//                         Copyright © 2002, 2003 Agate Software, Inc.
//============================================================================================
// Procedure:		JavaScriptCustomFunctions.toggleMenuPanel
//
// Description: Expands or collapses DHTML DropMenu Panels
// 
// Input:       NodeID        - ID of the calling node (string - numeric portion only)
//              State         - 'show' or 'hide' child panel (string)
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye           09/19/2002
// Modified - fixed bugs in hiding/unhighlighting panels     Sylvania Dye           05/19/2003
// Modified - imported from MSHDA; streamlined and           Sylvania Dye           07/16/2003
//            optimised code
// Modified - optimised code                                 Sylvania Dye           12/12/2003
//============================================================================================	
  
function toggleMenuPanel(event, panelID) {
  
  // declare procedure scope variables
  var objTrigger;

  // get the trigger object
  if (browser.isIE) {
    objTrigger = window.event.srcElement;
  } else {
    objTrigger = event.currentTarget;
  }
  
  if (panelID != null) {
    if (objTrigger.menuPanel == null) {
      // get the trigger's menu panel
      objTrigger.menuPanel = document.getElementById(panelID);
      // initialise the panel
      if (objTrigger.menuPanel.isInitialized == null) { buildMenuPanel(objTrigger.menuPanel); }
    }
  }
  
  // turn the currently active node off
  if (objActiveNode_Global != null) { toggleMenuNode(objActiveNode_Global, 'off'); }
  
  // was the active node clicked?
  if (objTrigger != objActiveNode_Global) {
    toggleMenuNode(objTrigger, 'on');  // turn the trigger node on
    objActiveNode_Global = objTrigger;  // the trigger is now the active node
  } else {
    objActiveNode_Global = null;  // clear the active node
  }
  
  // is another panel active?
  if (objActiveNode_Global != null && objActiveNode_Global != objTrigger) {
    toggleMenuPanel(event, panelID);  // recurse function, make this the active panel
  }
  
  return false;
}

//============================================================================================
//                         Copyright © 2000-2003, Agate Software, Inc.
//============================================================================================
// Procedure:   JavaScriptCustomFunctions.hideAllMenuPanels
//
// Description: Hides all DropMenu panels
//
// Input:       level, excludeId
//
//--------------------------------------------------------------------------------------------
// History                                                   By                    Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye           03/26/2003
// Modified - fixed bugs in hiding/unhighlighting panels     Sylvania Dye           05/19/2003
// Modified - optimised for speed                            Sylvania Dye           10/06/2003
// Modified - optimised code                                 Sylvania Dye           12/12/2003
//============================================================================================	
  
function hideAllMenuPanels(panelObj, excludePanelID) {

  if (panelObj == null || panelObj.activeItem == null) { return; } // there is no panel to close

  if (panelObj.activeItem.subMenu != null) {
    hideAllMenuPanels(panelObj.activeItem.subMenu, excludePanelID);  // recurse and hide all sub panels
    
    //if ((excludePanelID == null) || (excludePanelID != panelObj.activeItem.subMenu.id)) {
      
      // get scroll arrow objects
      var objScrollArrow = document.getElementById('scrUpArrow_' + panelObj.activeItem.subMenu.id);
      if (objScrollArrow != null) {
        objScrollArrow.style.visibility = 'hidden';  // hide the scroll up arrow...
        objScrollArrow.removeNode(true);             // and kill it
        //objScrollArrow = null;
      }
      objScrollArrow = document.getElementById('scrDownArrow_' + panelObj.activeItem.subMenu.id);
      if (objScrollArrow != null) {
        objScrollArrow.style.visibility = 'hidden';  // hide the scroll down arrow...
        objScrollArrow.removeNode(true);             // and kill it
        //objScrollArrow = null;
      }
      
      panelObj.activeItem.subMenu.style.visibility = 'hidden';  // hide the panel...
      panelObj.activeItem.subMenu = null;                       // and kill it
      
    }
    removeClass(panelObj.activeItem, 'mnuNodeHover');      // remove the active class from the trigger node...
    panelObj.activeItem = null;                            // and kill the trigger node
    toggleListboxes();                                     // toggle listboxes
  //}
}

//============================================================================================
//                         Copyright © 2000-2003, Agate Software, Inc.
//============================================================================================
// Procedure:   JavaScriptCustomFunctions.toggleMenuNode
//
// Description: Toggles DropMenu nodes
//
// Input:       NodeID, State ('on', 'off')
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye           03/26/2003
// Modified - fixed bugs in hiding/unhighlighting panels     Sylvania Dye           05/19/2003
// Modified - optimised code                                 Sylvania Dye           12/12/2003
//============================================================================================	
	
function toggleMenuNode(triggerNode, state) {
  
  // declare procedure scope variables
  var intPanelLeft, intPanelTop;
  var lngWindowHeight, lngPanelHeight;
  var strPanelOverflow = 'visible';
  
  switch (state) {
    case 'on':
      // append the active class to the trigger node
      triggerNode.className += ' mnuHeaderLinkActive';
      
      if (triggerNode.menuPanel != null) {
        // set panel coordinates
        intPanelLeft = getTrueXYCoords(triggerNode, 'x');
        intPanelTop = getTrueXYCoords(triggerNode, 'y') + triggerNode.offsetHeight;

        // tune panel position for browser/window size
        if (browser.isIE) {
          intPanelLeft += triggerNode.offsetParent.clientLeft;
          intPanelTop += triggerNode.offsetParent.clientTop;
        }
      
        // get maximum coordinates (top) and current panel height
        lngWindowHeight = getWindowDimension('h');
        lngPanelHeight = triggerNode.menuPanel.offsetHeight;
          
        // if panel will be taller than window, resize panel for scrolling
        if (lngPanelHeight > lngWindowHeight) {
          intPanelTop = 0;
          lngPanelHeight = lngWindowHeight - 50; // resize panel to be smaller than window
          strPanelOverflow = 'hidden';           // set overflow for scrolling
          
          // position and display arrow divs above & below panel
          // create new up and down arrow divs
          var objUpArrow = document.createElement('DIV');
          var objDownArrow = document.createElement('DIV');
          // create up arrow
          with (objUpArrow) {
            id = 'scrUpArrow_' + triggerNode.menuPanel.id;
            style.position = 'absolute';
            style.top = intPanelTop;
            style.left = intPanelLeft;
            style.width = triggerNode.menuPanel.offsetWidth;
            style.textAlign = 'center';
            style.textDecoration = 'none';
            style.backgroundColor = '#ffffff';
            style.borderTop = '1px solid';
            style.borderLeft = '1px solid';
            style.borderRight = '1px solid';
            style.borderBottom = 'none';
            style.borderColor = '#c0c0c0';
            style.padding = '0px';
            style.fontSize = '7pt';
            style.cursor = 'default';
            style.display = 'block';
            style.zIndex = triggerNode.menuPanel.zIndex + 1;
            onclick = 'return false;'
        onmouseover = 'scrollPanel(\'' + 'scrUpArrow_' + triggerNode.menuPanel.id + '\',\'' + triggerNode.menuPanel.id + '\', \'up\');'
            innerHTML = '<a href="" style="width: ' + (triggerNode.menuPanel.offsetWidth - 25) + '; text-decoration: none; color: #333333;"  onclick="return false;" onmouseover="scrollPanel(\'' + 'scrUpArrow_' + triggerNode.menuPanel.id + '\',\'' + triggerNode.menuPanel.id + '\', \'up\')">&#9650;</a>';
          }
          document.body.appendChild(objUpArrow);
          intPanelTop = intPanelTop + objUpArrow.offsetHeight;
          // create down arrow
          with (objDownArrow) {
            id = 'scrDownArrow_' + triggerNode.menuPanel.id;
            style.position = 'absolute';
            style.top = intPanelTop + lngPanelHeight;
            style.left = intPanelLeft;
            style.width = triggerNode.menuPanel.offsetWidth;
            style.textAlign = 'center';
            style.textDecoration = 'none';
            style.backgroundColor = '#ffffff';
            style.borderTop = 'none';
            style.borderLeft = '1px solid';
            style.borderRight = '1px solid';
            style.borderBottom = '1px solid';
            style.borderColor = '#c0c0c0';
            style.padding = '0px';
            style.fontSize = '7pt';
            style.cursor = 'default';
            style.display = 'block';
            style.zIndex = triggerNode.menuPanel.zIndex + 1;
            onclick = 'return false;'
        onmouseover = 'scrollPanel(\'' + 'scrDownArrow_' + triggerNode.menuPanel.id + '\',\'' + triggerNode.menuPanel.id + '\', \'down\');'
            innerHTML = '<a href="" style="width: ' + (triggerNode.menuPanel.offsetWidth - 25) + '; text-decoration: none; color: #333333;" onmouseover="scrollPanel(\'' + 'scrDownArrow_' + triggerNode.menuPanel.id + '\',\'' + triggerNode.menuPanel.id + '\', \'down\')">&#9660;</a>';
          }
          document.body.appendChild(objDownArrow);
        }
      
        with (triggerNode.menuPanel.style) {
          // size and position panel
          left = intPanelLeft + 'px';
          top = intPanelTop + 'px';
          if (lngPanelHeight < triggerNode.menuPanel.offsetHeight) {
            height = lngPanelHeight
          }
          // set overflow
          overflow = strPanelOverflow;
      
          visibility = 'visible';
          toggleListboxes();
        }
      }
      break;
    case 'off':
      // remove the active class from the trigger node
      removeClass(triggerNode, 'mnuHeaderLinkActive');
      
      // is a panel visible?
      if (triggerNode.menuPanel != null) {
        hideAllMenuPanels(triggerNode.menuPanel);  // hide sub panels
        
        // get scroll arrow objects
        var objScrollArrow = document.getElementById('scrUpArrow_' + triggerNode.menuPanel.id);
        if (objScrollArrow != null) {
          objScrollArrow.style.visibility = 'hidden';  // hide the scroll up arrow...
          objScrollArrow = null;                       // and kill it
        }
        objScrollArrow = document.getElementById('scrDownArrow_' + triggerNode.menuPanel.id);
        if (objScrollArrow != null) {
          objScrollArrow.style.visibility = 'hidden';  // hide the scroll down arrow...
          objScrollArrow = null;                       // and kill it
        }
        
        triggerNode.menuPanel.style.visibility = 'hidden';  // hide the main panel...
        triggerNode.menuPanel = null;                       // and kill it
        
      }
      toggleListboxes();
    break;
  }
}

//============================================================================================
//                         Copyright © 2000-2003, Agate Software, Inc.
//============================================================================================
// Procedure:   JavaScriptCustomFunctions.toggleSubPanel
//
// Description: Toggles DropMenu nodes
//
// Input:       [event], panelID
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Split from toggleMenuNode for performance                 Sylvania Dye           12/11/2003
/* Modified - IE8 and beyond case sensitive. Panel ID passed 
              in needed to start with a capital. Added a 
              check for that.                                Craig Tingley          01/08/2010
*/
//============================================================================================	
	
function toggleSubPanel(event, panelID) {
  
  // declare procedure scope variables
  var objTriggerNode, objMenuPanel;
  var intPanelLeft, intPanelTop;
  var lngWindowWidth, lngWindowHeight, lngPanelHeight;
  var strPanelOverflow = 'visible';
  var  stringLen 
  var tmpChar
  var postString

  // if panel id is not passed in, there is no subpanel to show - just close existing panel(s)
  if (panelID == null) {
    
    // get the event's containing panel
    if (browser.isIE) {
      objMenuPanel = getNodeParent(window.event.srcElement, 'DIV', 'mnuPanel');
    } else {
      objMenuPanel = event.currentTarget;
    }
  
    // close any active sub menu
    if (objMenuPanel.activeItem != null) { hideAllMenuPanels(objMenuPanel, panelID); }
  
  // if panel id is passed in, show applicable panel
  } else {  
    
    // get the event's node and parent panel
    if (browser.isIE) {
      objTriggerNode = getNodeParent(window.event.srcElement, 'A', 'mnuNode');
    } else {
      objTriggerNode = event.currentTarget;
    }
    objMenuPanel = getNodeParent(objTriggerNode, 'DIV', 'mnuPanel');

    // is another panel open?  hide it.
    if (objMenuPanel.activeItem != null) { hideAllMenuPanels(objMenuPanel, panelID); }
    objMenuPanel.activeItem = objTriggerNode;  // the trigger is now the active node

    // append the active class to the trigger node
    objTriggerNode.className += ' mnuNodeHover';
    if (objTriggerNode.subMenu == null) {
      // get the trigger's menu panel

      objTriggerNode.subMenu = document.getElementById(panelID);

      //case sensitive - sometimes the panelID's first letter is capitalized. Capitalize the letter and try again.
      if (objTriggerNode.subMenu == null) 
      {
        if (panelID.length > 0 )
        {        
          stringLen = panelID.length;
          tmpChar = panelID.substring(0,1).toUpperCase();
          postString = panelID.substring(1,stringLen);
          panelID = tmpChar + postString
          objTriggerNode.subMenu = document.getElementById(panelID);
        }
      }

      // initialize the panel
     if (objTriggerNode.subMenu.isInitialized == null) { buildMenuPanel(objTriggerNode.subMenu); }
    }

    // position the sub panel relative to the trigger node
    intPanelLeft = getTrueXYCoords(objTriggerNode, 'x') + objTriggerNode.offsetWidth;
    intPanelTop = getTrueXYCoords(objTriggerNode, 'y');

    // tune sub panel position for browser/window size
    // get maximum coordinates (w, h) and current panel height
    lngWindowWidth = getWindowDimension('w');
    lngWindowHeight = getWindowDimension('h');
    //lngPanelHeight = objTriggerNode.subMenu.offsetHeight;
    lngPanelHeight = objTriggerNode.subMenu.trueHeight;  // get the true (unresized) panel height
    
    if (intPanelLeft > (lngWindowWidth - objTriggerNode.subMenu.offsetWidth)) {
      // sub panel will be outside window, move right
      intPanelLeft = Math.max(0, intPanelLeft - objTriggerNode.offsetWidth - objTriggerNode.subMenu.offsetWidth
                     + (objMenuPanel.offsetWidth - objTriggerNode.offsetWidth));
    }
    // position panel top relative to window height
    //intPanelTop = Math.max(0, Math.min(intPanelTop, lngWindowHeight));
    
    if ((intPanelTop + lngPanelHeight) > lngWindowHeight) {  // panel will be outside window, move up
	    intPanelTop = (lngWindowHeight - lngPanelHeight);
	  }
	      
    // if panel will be taller than window, resize panel for scrolling
    if (lngPanelHeight > lngWindowHeight) {
      intPanelTop = 0;
      lngPanelHeight = lngWindowHeight - 50; // resize panel to be smaller than window
      strPanelOverflow = 'hidden';           // set overflow for scrolling
      
      // position and display arrow divs above & below panel
      // create new up and down arrow divs
      var objUpArrow = document.createElement('DIV');
      var objDownArrow = document.createElement('DIV');
      
      // create up arrow
      with (objUpArrow) {
        id = 'scrUpArrow_' + objTriggerNode.subMenu.id;
        style.position = 'absolute';
        style.top = intPanelTop;
        style.left = intPanelLeft;
        style.width = objTriggerNode.subMenu.offsetWidth;
        style.textAlign = 'center';
        style.textDecoration = 'none';
        style.backgroundColor = '#ffffff';
        style.borderTop = '1px solid';
        style.borderLeft = '1px solid';
        style.borderRight = '1px solid';
        style.borderBottom = 'none';
        style.borderColor = '#c0c0c0';
        style.padding = '0px';
        style.fontSize = '7pt';
        style.cursor = 'default';
        style.display = 'block';
        style.visibility = 'visible';
		if (typeof objTriggerNode.subMenu.zIndex == "undefined")
		{
			style.zIndex = 1;
		}
		else
		{
			style.zIndex = objTriggerNode.subMenu.zIndex + 1;
		}
        onclick = 'return false;'
        onmouseover = 'scrollPanel(\'' + 'scrUpArrow_' + objTriggerNode.subMenu.id + '\',\'' + objTriggerNode.subMenu.id + '\', \'up\');'
        innerHTML = '<a href="" style="width: ' + (objTriggerNode.subMenu.offsetWidth - 25) + '; text-decoration: none; color: #333333;"  onclick="return false;" onmouseover="scrollPanel(\'' + 'scrUpArrow_' + objTriggerNode.subMenu.id + '\',\'' + objTriggerNode.subMenu.id + '\', \'up\');">&#9650;</a>';
      }
      // this is getting set, but the event is not firing!!!
      //alert(objUpArrow.outerHTML + ', ' + objUpArrow.onmouseover);
      document.body.appendChild(objUpArrow);
      intPanelTop = intPanelTop + objUpArrow.offsetHeight;
      
      // create down arrow
      with (objDownArrow) {
        id = 'scrDownArrow_' + objTriggerNode.subMenu.id;
        style.position = 'absolute';
        style.top = intPanelTop + lngPanelHeight;
        style.left = intPanelLeft;
        style.width = objTriggerNode.subMenu.offsetWidth;
        style.textAlign = 'center';
        style.textDecoration = 'none';
        style.backgroundColor = '#ffffff';
        style.borderTop = 'none';
        style.borderLeft = '1px solid';
        style.borderRight = '1px solid';
        style.borderBottom = '1px solid';
        style.borderColor = '#c0c0c0';
        style.padding = '0px';
        style.fontSize = '7pt';
        style.cursor = 'default';
        style.display = 'block';
        style.visibility = 'visible';
		if (typeof objTriggerNode.subMenu.zIndex == "undefined")
		{
			style.zIndex = 1;
		}
		else
		{
			style.zIndex = objTriggerNode.subMenu.zIndex + 1;
		}
        onclick = 'return false;'
        onmouseover = 'scrollPanel(\'' + 'scrDownArrow_' + objTriggerNode.subMenu.id + '\',\'' + objTriggerNode.subMenu.id + '\', \'down\');'
        innerHTML = '<a href="" style="width: ' + (objTriggerNode.subMenu.offsetWidth - 25) + '; text-decoration: none; color: #333333;" onclick="return false;" onmouseover="scrollPanel(\'' + 'scrDownArrow_' + objTriggerNode.subMenu.id + '\',\'' + objTriggerNode.subMenu.id + '\', \'down\');">&#9660;</a>';
      }
      // this is getting set, but the event is not firing!!!
      //alert(objDownArrow.outerHTML + ', ' + objDownArrow.onmouseover);
      document.body.appendChild(objDownArrow);
    }
	  
    // configure panel
    with (objTriggerNode.subMenu.style) {
      // size and position panel
      left = intPanelLeft + 'px';
      top = intPanelTop + 'px';
      if ((lngPanelHeight > 0) && (lngPanelHeight < objTriggerNode.subMenu.offsetHeight)) {
        //alert('height: ' + height + '; lngPanelHeight: ' + lngPanelHeight + '; offsetHeight: ' + objTriggerNode.subMenu.offsetHeight);
        height = lngPanelHeight;
      }
      // set overflow
      overflow = strPanelOverflow;
      
    }
    
    // display panel
    objTriggerNode.subMenu.style.visibility = 'visible';
    
    toggleListboxes();
    
    // prevent event bubbling (fixes performance issues, other random bugs)
    if (browser.isIE) {
      window.event.cancelBubble = true;
    } else {
      event.stopPropagation();
    }
  }
}

//============================================================================================
//                         Copyright © 2000-2003, Agate Software, Inc.
//============================================================================================
// Procedure:   JavaScriptCustomFunctions.scrollPanel
//
// Description: Scrolls DropMenu panels
//
// Input:       panelID, direction ('Up', 'Down')
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye           03/26/2003
// Modified - optimised code                                 Sylvania Dye           12/12/2003
//============================================================================================	
  
// pass in event, object
var tmrScrollTimer;
//function scrollPanel(event, panelID, direction) {}

function scrollPanel(arrowID, panelID, direction) {
  
  //alert('inside scrollPanel');
  
  // declare procedure scope variables
  var intScrollSpeed = 100;  // panelID scrolling speed (milliseconds)
  
  // get the arrow object
  var objArrow = document.getElementById(arrowID);
  // get the panel to scroll
  var objPanel = document.getElementById(panelID);  //panel
  if (objPanel == null) {
    objPanel = panelID;  //panel
  }
  
  if (objArrow != null) {
    var lngArrowLeft = getTrueXYCoords(objArrow, 'x') - document.body.scrollLeft; // arrow x
    var lngArrowRight = getTrueXYCoords(objArrow, 'x') + objArrow.offsetWidth;  // arrow x + width
    var lngArrowTop = getTrueXYCoords(objArrow, 'y') - document.body.scrollTop; // arrow y
    var lngArrowBottom = getTrueXYCoords(objArrow, 'y') + objArrow.offsetHeight;  // arrow y + height
    
    switch (direction) {
      case 'up':
        if (objPanel.scrollTop > 0) { // panel can be scrolled
          if ((lngMouseX > lngArrowLeft) && (lngMouseX < lngArrowRight) && (lngMouseY > lngArrowTop) && (lngMouseY < lngArrowBottom)) {
            objPanel.scrollTop -= 10; // mouse on arrow, scroll panel
              
            tmrScrollTimer = setTimeout('scrollPanel(\'' + arrowID + '\', \'' + panelID + '\', \'up\');', intScrollSpeed);
              
          } else {  // mouse outside arrow, stop scrolling
            clearTimeout(tmrScrollTimer);
          }
        } else {  // stop scrolling
          scrollPanel(arrowID, panelID, 'end');
        }
        break;
      case 'down':
        if (objPanel.scrollTop <  objPanel.scrollHeight) { // panel can be scrolled
          if ((lngMouseX > lngArrowLeft) && (lngMouseX < lngArrowRight) && (lngMouseY > lngArrowTop) && (lngMouseY < lngArrowBottom)) {
        
            //alert('here');
            objPanel.scrollTop += 10; // mouse on arrow, scroll panel
              
            tmrScrollTimer = setTimeout('scrollPanel(\'' + arrowID + '\', \'' + panelID + '\', \'down\');', intScrollSpeed);
              
          } else {  // mouse outside arrow, stop scrolling
            clearTimeout(tmrScrollTimer);
          }
        } else {  // stop scrolling
          scrollPanel(arrowID, panelID, 'end');
        }
        break;
      case 'end':
        // stop scrolling
        clearTimeout(tmrScrollTimer);
        break;
    }
  }  
}

//============================================================================================
//                         Copyright © 2000-2003 Agate Software, Inc.
//============================================================================================
// Procedure:		JavaScriptCustomFunctions.getTrueXYCoords
//
// Description: Returns true x,y coordinates of a dom element
// 
// Input:       objElement  - dom element we want true coordinates for
//              Position    - 'x' or 'y' position for return value (string *optional)
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye           10/13/2002
// Modified to recurse                                       Sylvania Dye           12/11/2003
//============================================================================================	

function getTrueXYCoords(objElement, Coord) {
  //if (!objElement && this) { objElement = this; } // set element to calculate for if function is used as a method
  
  // declare procedure scope variables
  var lngCoord = 0;
    
  switch (Coord) {
    case 'x':
      lngCoord = objElement.offsetLeft;
      break;
    case 'y':
      lngCoord = objElement.offsetTop;
      break;
  }
  
  if (objElement.offsetParent != null) {
    lngCoord += getTrueXYCoords(objElement.offsetParent, Coord);    // recurse & climb the dom hierarchy
  }
  
  return lngCoord;  // return coordinate
}

//============================================================================================
//                         Copyright © 2000-2003 Agate Software, Inc.
//============================================================================================
// Procedure:		JavaScriptCustomFunctions.getWindowDimension
//
// Description: Returns Window dimensions (w, h)
// 
// Input:       Dimension ('w', 'h')
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Created                                                   Sylvania Dye           03/26/2003
//============================================================================================	
  
function getWindowDimension(dimension) {
  var lngDimension = 0;
  
  switch (dimension) {
    case 'w':
      if (typeof(window.innerWidth) == 'number') {
        lngDimension = window.innerWidth;
      } else {
        if (document.documentElement && document.documentElement.clientWidth) {
          lngDimension = document.documentElement.clientWidth;
        } else {
          if (document.body && document.body.clientWidth) {
            lngDimension = document.body.clientWidth;
          }
        }
      }
      break;
    case 'h':
      if (typeof(window.innerHeight) == 'number') {
        lngDimension = window.innerHeight;
      } else {
        if (document.documentElement && document.documentElement.clientHeight) {
          lngDimension = document.documentElement.clientHeight;
        } else {
          if (document.body && document.body.clientHeight) {
            lngDimension = document.body.clientHeight;
          }
        }
      }
      break;
  }
  
  return lngDimension;
}


//============================================================================================
//                         Copyright © 2000-2003 Agate Software, Inc.
//============================================================================================
// Procedure:		JavaScriptCustomFunctions.ChangeAllCheckBoxStates
//
// Description: toggle all checkboxes
// 
// Input:       checkstate - checked/unchecked
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Created                                                   Stacie Dubie           10/1/2007
//============================================================================================	
function ChangeAllCheckBoxStates(checkState, HiddenField)
{
  // Toggles through all of the checkboxes defined in the CheckBoxIDs array
  // and updates their value to the checkState input parameter

  if (typeof HiddenField!="undefined")
  {
    var ToggleVariable = document.getElementById(HiddenField);

    if (checkState)
    {
      ToggleVariable.value = "True";
    }
    else
    {
      ToggleVariable.value = "False";
    }
  }
  if (CheckBoxIDs != null)
  {
     for (var i = 0; i < CheckBoxIDs.length; i++)
        ChangeCheckBoxState(CheckBoxIDs[i], checkState);
  }
  
}
function ChangeCheckBoxState(id, checkState)
{
  var cb = document.getElementById(id);
  if (cb != null)
     cb.checked = checkState;
}

function ChangeHeaderAsNeeded()
{
    // Whenever a checkbox in the GridView is toggled, we need to
    // check the Header checkbox if ALL of the GridView checkboxes are
    // checked, and uncheck it otherwise
    if (CheckBoxIDs != null)
    {
        // check to see if all other checkboxes are checked
        for (var i = 1; i < CheckBoxIDs.length; i++)
        {
            var cb = document.getElementById(CheckBoxIDs[i]);
            if (!cb.checked)
            {
                // If there is an unchecked checkbox, make sure
                // that the header checkbox is unchecked
                ChangeCheckBoxState(CheckBoxIDs[0], false);
                return;
            }
        }
        
        // If we reach here, ALL GridView checkboxes are checked
        ChangeCheckBoxState(CheckBoxIDs[0], true);
    }
}
//============================================================================================
//                         Copyright © 2000-2003 Agate Software, Inc.
//============================================================================================
// Procedure:		JavaScriptCustomFunctions.ShowHideSection
//
// Description: Returns Window dimensions (w, h)
// 
// Input:       Dimension ('w', 'h')
//
//--------------------------------------------------------------------------------------------
// History                                                   By                     Date
//--------------------------------------------------------------------------------------------
// Created                                                   John Squier            01/17/2008
//============================================================================================	
function ShowHideSection(section)
  {
    var pagecontentsection = document.getElementById(section);
    
    if (pagecontentsection.style.display == "none")
			{
				pagecontentsection.style.display = "block";     
				
			}
		else   
			{
				pagecontentsection.style.display = "none";  
			
			}
  }  

//==========================================================================================
//                         Copyright © 2002, Agate Software, Inc.
//==========================================================================================
// Procedure: toggleLayer
//
// Description: Showing and hiding an element using CSS and Javascript
//              Copied from http://www.netlobo.com/div_hiding.html
//
// Input: whichLayer --> field name
//
//------------------------------------------------------------------------------------------
// History                                                   By                   Date
//------------------------------------------------------------------------------------------
// Created                                                   Stacie Dubie         11/20/2006
//==========================================================================================
function toggleLayer(whichLayer)
{
 
  if (document.getElementById)
  {
    // this is the way the standards work
    var style2 = document.getElementById(whichLayer).style;
    //style2.display = style2.display? "":"block";
  }
  else if (document.all)
  {
    // this is the way old msie versions work
    var style2 = document.all[whichLayer].style;
    //style2.display = style2.display? "":"block";
  }
  else if (document.layers)
  {
    // this is the way nn4 works
    var style2 = document.layers[whichLayer].style;
    //style2.display = style2.display? "":"block";
  }
  
  // toggle show/hide
  if (style2.display == "none")
    {
      style2.display = style2.display? "":"block";
    }
  else
    {
      style2.display = style2.display? "":"none";
    }
}


//============================================================================================
//             		            end DropMenu JavaScript functions
//============================================================================================


//Function for limiting the textarea for Comments
function limitText(limitField, limitCount, limitNum) {
	if (limitField.value.length > limitNum) {
		limitField.value = limitField.value.substring(0, limitNum);
	} 
}
