function openAWindow( pageToLoad, winName, width, height, center) {
	/* Opens a new window on the users desktop.

	   Arguments:
	   pageToLoad - The URL of a page to load in the browser window.
	                This can be a relative URL or fully qualified.
	   winName - 	Name of the new window.  NO SPACES!
	   width - 	The horizontal size of the new window.
     		   height - 	The vertical size of the new window.
	   center -     toggle centering on 4.0 browsers.
                              1=centered window 0=no centering

	   Values in the "args" section below can all be toggled in the
	   same fashion as the center toggle.  Just modify the appropriate
	   value in the args section to be either 0 or 1.

	   A call to this function might look like this:
	   <a href="javascript:openAWindow('ice.html','ice',375,250,1)">Ice</a>

	 
	*/
				 
	xposition=0; yposition=0;
	if ((parseInt(navigator.appVersion) >= 4 ) && (center)){
		xposition = (screen.width - width) / 2;
	        yposition = (screen.height - height) / 2;
		}
	args = "width=" + width + "," 
	    + "height=" + height + "," 
	    + "location=0," 
	    + "menubar=0,"
	    + "resizable=0,"
	    + "scrollbars=0,"
	    + "status=0," 
	    + "titlebar=0,"
	    + "toolbar=0,"
	    + "hotkeys=0,"
	    + "screenx=" + xposition + ","  //NN Only
	    + "screeny=" + yposition + ","  //NN Only
	    + "left=" + xposition + ","     //IE Only
	    + "top=" + yposition;           //IE Only

	window.open( pageToLoad,winName,args );
}

function IsNumeric(sText){
	var ValidChars = "0123456789.";
	var IsNumber=true;
	var Char;
	if(sText.length>0){
		for (i = 0; i < sText.length && IsNumber == true; i++) 
		{ 
			Char = sText.charAt(i); 
			if (ValidChars.indexOf(Char) == -1) 
			{
				IsNumber = false;
			}
		}
	}
	else{
		IsNumber = false;
	}
	return IsNumber;
}

Object.prototype.isArray = function() {
   return this.constructor == Array;
}

function textCounter (field, countfield, maxlimit) {
  	if (field.value.length > maxlimit)
  	field.value = field.value.substring(0, maxlimit);
  	else
    countfield.value = maxlimit - field.value.length;
}

//Validate a string of email addresses semicolon delimited
function editEmailAddressesSemicolon(strString){
	var value;
	var arr = new Array();
	arr=strString.split(";");
	for(value=0;value<arr.length;value++){
		arr[value]=trim(arr[value],0);
		if (arr[value].length>0){
			if (!editEmailAddress(arr[value])){
				return false;
			}
		}
	}
	return true;
}

//Validate email address is formed correctly	
function editEmailAddress(emailAddress) {
    var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(2([0-4]\d|5[0-5])|1?\d{1,2})(\.(2([0-4]\d|5[0-5])|1?\d{1,2})){3} \])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    return re.test(emailAddress);
}

function FCKeditor_OnComplete( editorInstance )
{
    //alert( editorInstance.Name ) ;
    //alert(editorInstance.Config['CharCount']) ;
		//editorInstance.Config['CharCount'] = 0;
    //alert(editorInstance.Config['CharCount']) ;

}

function trim(inputString,doInner) 
{
	// Removes leading and trailing spaces from the passed string. Also removes
	// consecutive spaces and replaces it with one space. If something besides
	// a string is passed in (null, custom object, etc.) then return the input.
	//
	// Inputs
	// inputString: String to trim
	// doInner: 0 or 1, 0=trim left and right spaces only
	//									1=trim inner spaces as well
	//
	if (typeof inputString != "string") { return inputString; }
	var retValue = inputString;
	var ch = retValue.substring(0, 1);
	while (ch == " ") 
	{ // Check for spaces at the beginning of the string
		retValue = retValue.substring(1, retValue.length);
		ch = retValue.substring(0, 1);
	}
	ch = retValue.substring(retValue.length-1, retValue.length);
	while (ch == " ") 
	{ // Check for spaces at the end of the string
		retValue = retValue.substring(0, retValue.length-1);
		ch = retValue.substring(retValue.length-1, retValue.length);
	}
	if (doInner == 1)
	{
		while (retValue.indexOf("  ") != -1) 
		{ // Note that there are two spaces in the string - look for multiple spaces within the string
			retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ")+1, retValue.length); // Again, there are two spaces in each of the strings
		}
	}
   return retValue; // Return the trimmed string back to the user
} // Ends the "trim" function

function gblAlertBox(strMsg){
	alert(strMsg);
}

function sortBy(strColumn){
	if (document.theForm.sortby.value!=strColumn){
		document.theForm.sortby.value=strColumn;
		document.theForm.sortdirection.value="";
	}
	switch(document.theForm.sortdirection.value){
		case "":
			document.theForm.sortdirection.value="desc"
			break;
		case "asc":
			document.theForm.sortdirection.value="desc"
			break;
		case "desc":
			document.theForm.sortdirection.value="asc"
			break;
	}
	submitFunction(1);
	return;
}

function checkdate2(input){
input.value=trim(input.value);
if(input.value!=""){
	var validformat=/^\d{1,2}\/\d{1,2}\/\d{4}$/ //Basic check for format validity
	var returnval=false
	if (!validformat.test(input.value)){
		returnval=false
	}
	else{ //Detailed check for valid date ranges
	var monthfield=input.value.split("/")[0]
	var dayfield=input.value.split("/")[1]
	var yearfield=input.value.split("/")[2]
	var dayobj = new Date(yearfield, monthfield-1, dayfield)
	if ((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield)){
		returnval=false
	}
	else
	returnval=true
	}
	if (returnval==false) input.select()
	return returnval
	}
}

function checkdatevalue(input){
//alert("|" + input.value + "|");
//alert(input.value=="");
input=trim(input);
if(input!=""){
	var validformat=/^\d{1,2}\/\d{1,2}\/\d{4}$/ //Basic check for format validity
	var returnval=false
	if (!validformat.test(input)){
		returnval=false
	}
	else{ //Detailed check for valid date ranges
		var monthfield=input.split("/")[0]
		var dayfield=input.split("/")[1]
		var yearfield=input.split("/")[2]
		var dayobj = new Date(yearfield, monthfield-1, dayfield)
		if ((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield)){
			returnval=false
		}
	else
	returnval=true
	}
	return returnval
	}
}

/**--------------------------
//* 0 if the dates are same 
//* -1 if the first one is an earlier date 
//* 1 if the first one is a later date 
//---------------------------**/
function compareDates (value1, value2) {
   var date1, date2;
   var month1, month2;
   var year1, year2;
   
   month1 = value1.substring (0, value1.indexOf ("/"));
   date1 = value1.substring (value1.indexOf ("/")+1, value1.lastIndexOf ("/"));
   year1 = value1.substring (value1.lastIndexOf ("/")+1, value1.length);

   month2 = value2.substring (0, value2.indexOf ("/"));
   date2 = value2.substring (value2.indexOf ("/")+1, value2.lastIndexOf ("/"));
   year2 = value2.substring (value2.lastIndexOf ("/")+1, value2.length);

	if ((year1-year2)<0) return -1;
	else if ((year1-year2)>0) return 1;
	else if ((month1-month2)<0) return -1;
	else if ((month1-month2)>0) return 1;
	else if ((date1-date2)<0) return -1;
	else if ((date1-date2)>0) return 1;
  else return 0;

} 

function returnObjById( id ){
	//cross-browser method of getting a handle to an element
  if (document.getElementById)
      var returnVar = document.getElementById(id);
  else if (document.all)
      var returnVar = document.all[id];
  else if (document.layers)
      var returnVar = document.layers[id];
  return returnVar;
}

<!-- Dynamic Version by: Nannette Thacker -->
<!-- http://www.shiningstar.net -->
<!-- Original by :  Ronnie T. Moore -->
<!-- Web Site:  The JavaScript Source -->
<!-- Use one function for multiple text areas on a page -->
<!-- Limit the number of characters per textarea -->
<!-- Begin
function textCounter(field,cntfield,maxlimit) {
if (field.value.length > maxlimit) // if too long...trim it!
field.value = field.value.substring(0, maxlimit);
// otherwise, update 'characters left' counter
else
cntfield.value = maxlimit - field.value.length;
}
//  End -->

	var xmlhttp;
	var strFeedbackTarget; // bridge variable to get the Result field name from the ajaxFunction routine to the stateChanged routine
	//
	// ajaxFunction(URL, Feedback)
	// URL: the URL to call to do the processing including querystring information
	// Feedback: the field to target with the feedback text returned from the URL called to do the processing
	//
	function ajaxFunction(strURL, strFeedbackField){
		strFeedbackTarget = strFeedbackField;
		xmlhttp=GetXmlHttpObject();
		if (xmlhttp==null){
		  alert ("Your browser does not support XMLHTTP");
		  return;
		}
		xmlhttp.onreadystatechange=stateChanged;
		xmlhttp.open("GET",strURL,true);
		xmlhttp.send();
	}
	
	function stateChanged(){
		if (xmlhttp.readyState==4){
		  document.getElementById(strFeedbackTarget).innerHTML=xmlhttp.responseText;
	  }
	}
	
	function GetXmlHttpObject(){
		if (window.XMLHttpRequest)
		  {
		  // code for IE7+, Firefox, Chrome, Opera, Safari
		  return new XMLHttpRequest();
		  }
		if (window.ActiveXObject)
		  {
		  // code for IE6, IE5
		  return new ActiveXObject("Microsoft.XMLHTTP");
		  }
		return null;
	}
