var required=false;
var notRequired=true;
var whitespace=" \t\n\r";
var decimalPointDelimiter=".";
var daysInMonth=new Array(12);
var formDataHasChanged=false;
daysInMonth[1]=31;
daysInMonth[2]=29;
daysInMonth[3]=31;
daysInMonth[4]=30;
daysInMonth[5]=31;
daysInMonth[6]=30;
daysInMonth[7]=31;
daysInMonth[8]=31;
daysInMonth[9]=30;
daysInMonth[10]=31;
daysInMonth[11]=30;
daysInMonth[12]=31;
var iDayPrefix="The second field in ";
var iDaySuffix=" must be a day number between 1 and 31.";
var iMonthPrefix="The first field in ";
var iMonthSuffix=" must be a month number between 1 and 12.";
var iYearPrefix="The third field in ";
var iYearSuffix=" must be a 4 digit year number.";
function isEmpty(s){
 return ((s==null)||(s.length==0));
}
function isWhitespace(s){
 var i;
 if(isEmpty(s)){
  return true;
 }
 for (i=0;i<s.length;i++){
  var c=s.charAt(i);
  if(whitespace.indexOf(c)==-1){
   return false;
  }
 }
 return true;
}
function isInteger(s){
 var i;
 if(isEmpty(s)){
  if(isInteger.arguments.length==1){
   return required;
  }
  else{
   return notRequired;
  }
 }
 for(i=0;i<s.length;i++){
  var c=s.charAt(i);
  if(!isDigit(c)){
   return false;
  }
 }
 return true;
}
function isFloat(s){
 var i;
 var seenDecimalPoint=false;
 if(isEmpty(s)){
  if(isFloat.arguments.length==1){
   return required;
  }
  else{
   return(isFloat.arguments[1]==true);
  }
 }
 if(s==decimalPointDelimiter){
  return false;
 }
 for(i=0;i<s.length;i++){
  var c=s.charAt(i);
  if((c==decimalPointDelimiter)&&!seenDecimalPoint){
   seenDecimalPoint=true;
  }
  else if(!isDigit(c)){
   return false;
  }
 }
 return true;
}
function isDigit(c){
 return((c>="0")&&(c<="9"));
}
function stripWhitespace(s){
 return stripCharsInBag(s,whitespace);
}
function stripCharsInBag(s,bag){
 var i;
 var returnString="";
 for(i=0;i<s.length;i++){
  var c=s.charAt(i);
  if(bag.indexOf(c)==-1){
   returnString+=c;
  }
 }
 return returnString;
}
function isYear(s){
 if(isEmpty(s)){
  return false;
 }
 if(!isInteger(s)){
  return false;
 }
 return(s.length==4);
}
function isIntegerInRange(s,a,b){
 if(isEmpty(s)){
  return false;
 }
 if(!isInteger(s)){
  return false;
 }
 var num=parseInt(s,10);
 return ((num>=a)&&(num<=b));
}
function isMonth(s){
 if(isEmpty(s)){
  return false;
 }
 else{
  return isIntegerInRange(s,1,12);
 }
}
function isDay(s){
 if(isEmpty(s)){
  return false;
 }
 else{
  return isIntegerInRange(s,1,31);
 }
}
function daysInFebruary(year){
 return(((year%4==0)&&((!(year%100==0))||(year%400==0)))?29:28);
}
function isDate(month,day,year){
 if(!(isYear(year,false)&&isMonth(month,false)&&isDay(day,false))){
  return false;
 }
 var intYear=parseInt(year,10);
 var intMonth=parseInt(month,10);
 var intDay=parseInt(day,10);
 if(intDay>daysInMonth[intMonth]){
  return false;
 }
 if((intMonth==2)&&(intDay>daysInFebruary(intYear))){
  return false;
 }
 return true;
}
function selectField(theField){
 theField.select();
}
function stripBegEndSpaces(field){
 var pos=0;
 var interString="";
 var finalString="";
 while(pos<field.value.length&&field.value.charAt(pos)==" "){
  pos++;
 }
 while(pos<field.value.length){
  interString+=field.value.charAt(pos);
  pos++;
 }
 var cnt=interString.length-1;
 while(cnt>0&&interString.charAt(cnt)==" "){
  cnt--;
 }
 var index=0;
 while(index<=cnt){
  finalString+=interString.charAt(index);
  index++;
 }
 field.value=finalString;
}
function focusField(field,radio,values){
 var value=getRadioButtonValue(radio);
 var a=values.split(';');
 for(i=0;i<a.length;i++){
  if(a[i]==value){
   return false;
  }
 }
 field.blur();
 return true;
}
function checkBadCharsField(field,fieldName){
 for(var i=0;i<field.value.length;i++){
  if(field.value.charAt(i)=="="){
   addError(fieldName+" cannot have a '=' character.");
   break;
  }
  if(field.value.charAt(i)=="|"){
   addError(fieldName+" cannot have a '|' character.");
   break;
  }
 }
 return;
}
function checkBadCharsForm(form){
 for(var i=0;i<form.elements.length;i++){
  if((form.elements[i].type=="text")||(form.elements[i].type=="password")){
   checkBadCharsField(form.elements[i],form.elements[i].name);
  }
 }
}
function validPassword(pwd){
 var letters="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 var letterCount=0;
 var digits="0123456789";
 var digitCount=0;
 for(i=0;i<pwd.length;i++){
  var c=pwd.charAt(i);
  if(letters.indexOf(c)>=0){
   letterCount++;
  }
  if(digits.indexOf(c)>=0){
   digitCount++;
  }
  if((letterCount>=1)&&(digitCount>=1)){
   return true;
  }
 }
 return false;
}
function checkRadioButtonChecked(radio){
 for(var i=0;i<radio.length;i++){
  if(radio[i].checked==true){
   return true;
  }
 }
 return false;
}
function getRadioButtonValue(radio){

 //special case: "radio of one" has no length
 if (!radio.length) {
   return radio.checked ? radio.value : "";
 }

 var found=false;
 for(var i=0;i<radio.length;i++){
  if(radio[i].checked==true){
   found=true;
   break;
  }
 }
 if(found){
  return radio[i].value;
 }
 else{
  return "";
 }
}
function isRadioButtonOption(radio,value)
{
 for(var i=0;i<radio.length;i++){
  if(radio[i].value==value){
   return true;
  }
 }
 return false;
}
function setRadioButtonChecked(radio,value){
 for(vari=0;i<radio.length;i++){
  if(radio[i].value==value){
   radio[i].checked=true;
   return true;
  }
 }
 return false;
}
function clearRadioButton(radio){
 for(var i=0;i<radio.length;i++){
  radio[i].checked=false;
 }
 return;
}
function setRadioButtonState(radio,value,enabled){
 for(var i=0;i<radio.length;i++){
  if(radio[i].value==value){
   radio[i].disabled=!enabled;
   return true;
  }
 }
 return false;
}

function getSelectValue(select){
 return select.options[select.selectedIndex].value;
}

//returns the text of the selected option in a select
function getSelectText(select){
 return select.options[select.selectedIndex].text;
}

/* This is the global Pop-Up window function
function openWindow(theURL,winName,features)
	{
  		window.open(theURL,winName,features);
	}*/

/* Disable Stus Bar message on ALL links */
function hidestatus(){
	window.status=''
	return true
}

/* Pick School */
function jumpMenu(targ,selObj,restore){
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}

function MM_findObj(n, d) {
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function jumpMenuGo(selName,targ,restore){
  var selObj = MM_findObj(selName); if (selObj) jumpMenu(targ,selObj,restore);
}

function openWindow(HREF, Name) {
	var pixelHeight=600;
	var pixelWidth=717;
	var CenteredX = (screen.width - pixelWidth) / 2;
	var CenteredY = (screen.height - pixelHeight) / 3;
	window.open(HREF,Name,'top='+CenteredY+',left='+CenteredX+',height='+pixelHeight+',width='+pixelWidth+',scrollbars=yes,menubar=no,status=no,toolbar=no,resizable=no');
}

function openWindowSize(HREF, Name, w, h) {
	var pixelHeight=h;
	var pixelWidth=w;
	var CenteredX = (screen.width - pixelWidth) / 2;
	var CenteredY = (screen.height - pixelHeight) / 3;
	window.open(HREF,Name,'top='+CenteredY+',left='+CenteredX+',height='+pixelHeight+',width='+pixelWidth+',scrollbars=yes,menubar=no,status=no,toolbar=no,resizable=no');
}

function openWindowPrint(HREF, Name) {
	var pixelHeight=600;
	var pixelWidth=717;
	var CenteredX = (screen.width - pixelWidth) / 2;
	var CenteredY = (screen.height - pixelHeight) / 3;
	window.open(HREF,Name,'top='+CenteredY+',left='+CenteredX+',height='+pixelHeight+',width='+pixelWidth+',scrollbars=yes,menubar=yes,status=no,toolbar=no,resizable=no');
}

function formatMoney(fieldObj){
	var i;
	var s='0'+fieldObj.value;
	var s2='';
	var stripChars="~`!@#$%^&*()_-+={[}]|'\":;?/><,abcdefghijklmnopqrstuvwxyz";
	for(i=0;i<s.length;i++){ var c=s.charAt(i); if(stripChars.indexOf(c)==-1){ s2+=c; } }
	s2=s2*100/100;
	if(parseFloat(s2)){
    	if(s2==Math.round(s2)){ s2+=".00"; }
   		else{ s2=s2+"0"; s2=(s2.substring(0,(s2.indexOf(".")+3))) }
  	}else{ s2="0.00" }
	fieldObj.value=s2;
}


function formatFloat(fieldObj){
	var i;
	var s='0'+fieldObj.value;
	var s2='';
	var stripChars="~`!@#$%^&*()_-+={[}]|'\":;?/><,abcdefghijklmnopqrstuvwxyz";
	var precision=(formatFloat.arguments.length==1)?2:formatFloat.arguments[1];
	var precisionMask='';
	for(i=0;i<precision;i++){ precisionMask+="0"; }
	for(i=0;i<s.length;i++){ var c=s.charAt(i); if(stripChars.indexOf(c)==-1){ s2+=c; } }
	var roundingValue=parseInt("1"+precisionMask+"0");
	s2=(s2*roundingValue)/roundingValue;
	if(parseFloat(s2)){
    	if(s2==Math.round(s2)){ s2+="."+precisionMask; }
   		else{ s2=s2+precisionMask; s2=(s2.substring(0,(s2.indexOf(".")+(precision+1)))) }
  	}else{ s2="0."+precisionMask; }
	fieldObj.value=s2;
}

function getLayer(name){
	 if (document.all){
	    return document.all[name].style;
	  }else if (document.layers){
	    return document.layers[name];
	  }else return false;
}

function setLayerVisibility(layerID,desiredStatus){
	i=getLayer(layerID);
	i.visibility=desiredStatus;
	return true;
}

function inArray(val,arr){
	for(i=0;i<arr.length;i++){
		if(val.toLowerCase() == arr[i].toLowerCase()){
			return true;
		}
	}
	return false;
}

function formatPhoneNumber(fieldObj){
	var i;
	var s=fieldObj.value;
	var s2='';
	var s3='';
	var stripChars="~`!@##$%^&*()_-+={[}]|'\":;?/><,. abcdefghijklmnopqrstuvwxyz";
	var extDelim='x';
	var extDelimFound=false;
	var preExtDelimDigitCount=0;
	for(i=0;i<s.length;i++){
		var c=s.charAt(i);
		if(c==extDelim){ extDelimFound=true; }
		if(stripChars.indexOf(c)==-1){ s2+=c; if(!extDelimFound) preExtDelimDigitCount++; }
	}
	if(parseInt(s2) && preExtDelimDigitCount >=10){
		s3="("+s2.substring(0,3)+") "+s2.substring(3,6)+"-"+s2.substring(6,10);
		if(s2.length > 10){
			s3 += " x"+s2.substring(10);
		}
	}
	if(s3.length) fieldObj.value=s3;
}

function reloadForm(targetAction){
	var formIndex=(reloadForm.arguments.length>1)?reloadForm.arguments[1]:0;
	document.forms[formIndex].action.value=targetAction;
	document.forms[formIndex].displayAction.value='form';
	document.forms[formIndex].submit();
}

var isSubmitted=false;
function submitForm(inputForm){
	if (!validateForm(inputForm)){
		alert(error);
		errorCount = 0;
		error = "";
		valid = true;
		return false;
	}

	if(!isSubmitted){ isSubmitted=true; return true; }
	else{ return false; }
}

function submitFormNoLock(inputForm){
	if (!validateForm(inputForm)){
		alert(error);
		errorCount = 0;
		error = "";
		valid = true;
		return false;
	}

	return true;
}

function confirmDelete(obj){
	return confirm("Are you sure you want to delete \""+obj+"\"?");
}

//moves participants between lists while maintaining alphabetical order; called above (TODO: could be upgraded to DOM at a later point)
function moveListItems(srcList, destList) {
	var listCtr = 0;
	var currOption = null;
	while (listCtr < srcList.options.length) {
		currOption = srcList.options[listCtr];
		if (currOption.selected) {

			//parse first and last name from value string
			var srcFirstName = currOption.value.substring(currOption.value.lastIndexOf(",") + 1, currOption.value.length);
			var srcLastName = currOption.value.substring(currOption.value.indexOf("|") + 1, currOption.value.lastIndexOf(","));

			//flag to keep track of whether this option is inserted into destList or needs to be added to the end
			var isInserted = false;
			for (var i = 0; i < destList.options.length; i++) {

				//parse first and last name from value string
				var destFirstName = destList.options[i].value.substring(destList.options[i].value.lastIndexOf(",") + 1, destList.options[i].value.length);
				var destLastName = destList.options[i].value.substring(destList.options[i].value.indexOf("|") + 1, destList.options[i].value.lastIndexOf(","));

				//alphabetize (case-insensitive)
				if (destLastName.toUpperCase() > srcLastName.toUpperCase() || (destLastName.toUpperCase() == srcLastName.toUpperCase() && destFirstName.toUpperCase() > srcFirstName.toUpperCase())) {

					//insert before current dest option, but first we must move the options after it forward one place
					destList.options[destList.options.length] = new Option();
					for (var j = destList.options.length - 1; j > i; j--) {
						destList.options[j].text = destList.options[j-1].text;
						destList.options[j].value = destList.options[j-1].value;
					}

					destList.options[i] = new Option(currOption.text, currOption.value);
					isInserted = true;
					break;
				}
			}

			//if currOption was not inserted, add at end
			if (!isInserted) {
				destList.options[destList.options.length] = new Option(currOption.text, currOption.value);
			}

			//delete from source list
			srcList.options[listCtr] = null;
		}
		else {
			listCtr++;
		}
	}
}

function saveListItems(srcList, destList){
	var listItemIdList="";
	var currID;
	for(var i=0; i<srcList.length; i++){
		if(i) listItemIdList+=",";
		currID=srcList.options[i].value.substring(0, srcList.options[i].value.indexOf("|"));
		listItemIdList+=currID;
	}
	destList.value=listItemIdList;
}

function validatePwd(fieldObj){
	if(fieldObj.value.length > 0){
		if(fieldObj.value.length < 6){ addError("Your password must consist of at least 6 characters, including at least 1 letter and at least 1 number."); }
		else if (!validPassword (fieldObj.value)) {addError("Your password must consist of at least 1 letter and at least 1 number."); }
	}
}

function setField(formName,fieldName,str){
	var frmObj,fieldObj;
	frmObj=document[formName];
	fieldObj=frmObj[fieldName];
	fieldObj.value=str;
}
function selectFieldValue(formName,fieldName,val){
	var i,frmObj,fieldObj,fieldLength;
	frmObj=document.all[formName];
	fieldObj=frmObj[fieldName];
	fieldLength=fieldObj.options.length;
	for(i=0;i<fieldLength;i++){
		if(fieldObj.options[i].value==val)
			fieldObj.options[i].selected=true;
	}
}
function unCheck(){
	args=unCheck.arguments;
	thisForm=document.forms[0];
	for(i=0;i<args.length;i++) thisForm[args[i]].checked=false;
}
function openPopup(href,winName,w,h){
	window.open(href,winName,'height='+h+',width='+w+',scrollbars=yes,menubar=no,status=no,toolbar=no,resizable=no');
}

//deletes selected options in a single- or multiple- select
function deleteSelected(selectObj) {

	var ctr = 0;
	while (ctr < selectObj.options.length) {
		if (selectObj.options[ctr].selected) {
			selectObj.options[ctr] = null;
		}
		else {
			ctr++;
		}
	}

}

//selects all options in a (multiple- ) select
function selectAll(selectObj) {

	for (var i = 0; i < selectObj.options.length; i++) {
		selectObj.options[i].selected = true;
	}

}

/*
searches a select whose options' values are delimited strings; returns true if
any option's delimited string at index marked by "index" is equal to str

for example:
searchSelect(mySelect, "foo", "|", 1)

would return true if mySelect is:
<select>
	<option value="1|foo|Hello World">Hello World</option>
	<option value="2|goo|Goodbye World">Goodbye World</option>
</select>

note(s):
-index is zero-based and defaults to zero if not given
-if no delim is passed in, options' values are compared to str in whole
*/
function searchSelect(selectObj, str, delim, index) {

	var noDelim = (arguments.length < 3);

	//index defaults to zero
	if (arguments.length < 4) {
		index = 0;
	}

	var currVal;
	for (var i = 0; i < selectObj.options.length; i++) {

		currVal = selectObj.options[i].value;

		if (noDelim) {
			if (currVal == str) {
				return true;
			}
		}
		else {
			if (currVal.split(delim)[index] == str) {
				return true;
			}
		}

	}

	return false;

}

//escapes pipes and commas; useful when adding options to a multiple- select
function escapePipesCommas(str) {
	return str.replace(/,/g, "&#044;").replace(/\|/g, "&#124;");
}

//initials the first letter of str (rest is lowercased)
function initCaps(str) {
	return str.substr(0, 1).toUpperCase() + str.substr(1).toLowerCase();
}

//displays an "other" field when 'other' is selected in a drop down
function otherHandler(fieldObj,reloadAction){
	var formIndex=(otherHandler.arguments.length>2)?otherHandler.arguments[2]:0;
	var inputForm=document.forms[formIndex];
	var updatedFieldName=fieldObj.name;
	var oldFieldName="old"+updatedFieldName.charAt(0).toUpperCase()+updatedFieldName.substring(1,fieldObj.name.length);
	var updatedObjValue=getSelectValue(inputForm[updatedFieldName]);
	var oldObjValue=inputForm[oldFieldName].value;
	if( (isOther(oldObjValue) && !isOther(updatedObjValue)) || (!isOther(oldObjValue) && isOther(updatedObjValue)) ){
		reloadForm(reloadAction);
	}
}
function isOther(id){ return (id==-1)?true:false; }

// these come in handy when you have multiple submit buttons for a single form, each having a seperate purpose
function setBtnPressed(thisObj){
	var formIndex=(setBtnPressed.arguments.length>1)?setBtnPressed.arguments[1]:0;
	var inputForm=document.forms[formIndex];
	inputForm.btnPressed.value=thisObj.name.toString();
}
function getBtnPressed(){
	var formIndex=(getBtnPressed.arguments.length>1)?getBtnPressed.arguments[1]:0;
	var inputForm=document.forms[formIndex];
	return inputForm.btnPressed.value;
}

//formats an integer with a suffix (st, nd, rd, th)
function formatIntegerWithSuffix(integer) {

	switch (integer%10) {
	case 0:
	case 4:
	case 5:
	case 6:
	case 7:
	case 8:
	case 9:
		return integer + "th";
	break;
	case 1:
		return integer + "st";
	break;
	case 2:
		return integer + "nd";
	break;
	case 3:
		return integer + "rd";
	break;
	}

}

function noSaveConfirm(){
	if(formDataHasChanged){
		var confirmMsg="Are you sure you want to leave this page without submitting? Your changes will not be saved.";

		// HACK to change warning verbiage for the profile section
		var isProfileSection=false;
		if(document.location){ isProfileSection=(document.location.toString().indexOf("ction=profile.") != -1)?true:false; }
		if(isProfileSection){ confirmMsg="Are you sure you want to leave this page without updating your profile? Your changes will not be saved."; }

		return confirm(confirmMsg);
	}
	return true;
}

/* call in onBlur to limit input to numbers only */
function formatNumeric(theObject) {

	var theString=theObject.value;

	// these are the only characters that we are allowing
	var allowedChars="0123456789";

	var newString="";

	for(i=0;i<theString.length;i++){

		var c=theString.charAt(i);

		if(allowedChars.indexOf(c)!=-1){
			newString+=c;
		}

	}

	// fill in the field with the new string that we have created
	theObject.value=newString;

}

/*-----------------------------------------------------------------------------------------------------
	global JS vars
-----------------------------------------------------------------------------------------------------*/
var Delimiter=",";
var DelimLen=Delimiter.length;
var decimalPointDelimiter=".";
var required=false;
var notRequired=true;


/*-----------------------------------------------------------------------------------------------------
	List Functions
		- simulates commonly used Cold Fusion list functions
-----------------------------------------------------------------------------------------------------*/
function ListAppend(AppendList,string,delim){
	if (arguments.length < 3) { delim = ","; }
	ReturnList=trimList(AppendList);
	if(ReturnList.length) ReturnList+=delim;
	ReturnList+=string;
	return ReturnList;
}

function ListGetAt(list,index,delim){
	if (arguments.length < 3) { delim = ","; }
	if(list.indexOf(delim) == -1) return list;
	loc=0;
	for(i=0;i<index;i++){
		loc=list.indexOf(delim,loc);
		loc+=DelimLen;
	}
	if(loc == -1) loc=0;
	startPosition=loc;
	endPosition=list.indexOf(delim,startPosition);
	if(endPosition == -1) endPosition=list.length;
	return list.substring(startPosition,endPosition);
}

function ListDeleteAt(list,index,delim){
	if (arguments.length < 3) { delim = ","; }
	if(list.indexOf(delim) == -1) return '';
	loc=0;
	for(i=1;i<index;i++){
		loc=list.indexOf(delim,loc);
		loc+=DelimLen;
	}
	if(loc == -1) loc=0;
	startPosition=loc;
	endPosition=list.indexOf(delim,startPosition);
	endPosition=(endPosition == -1)?list.length:endPosition+DelimLen;
	ReturnList=list.substring(0,startPosition)+list.substring(endPosition);
	return trimList(ReturnList);
}

//trims off superfluous delimiters from the end of a list.
function trimList(listToTrim){
	while(listToTrim.substring(listToTrim.length-DelimLen) == Delimiter)
		listToTrim=listToTrim.substring(0,listToTrim.length-DelimLen);
	return listToTrim;
}

function ListLen(list, delim) {
	if (arguments.length < 2){ delim = ","; }
	return list.split(delim).length;
}


/*
finds an element in an array
- search is case-insensitive
- returns index of element or null if not found
*/
function arrayFind(arrayObj,val){
	for(var i=0; i < arrayObj.length; i++){
		if(arrayObj[i].toUpperCase()==val.toUpperCase()) return i;
	}
	return null;
}

function arrayDeleteAt(arrayObj,index){
	var z=0;
	var returnArray=new Array();
	for(var i=0; i < arrayObj.length; i++){
		if(i != index){ returnArray[z]=arrayObj[i]; z++; }
	}
	return returnArray;
}

/*
finds an element in a list
- uses arrayFind() above
- delim param is optional; defaults to comma
*/
function listFind(list, val, delim) {
	if (arguments.length < 3) {
		delim = ",";
	}
	return arrayFind(list.split(delim), val);
}

function jumpTo(jumpObj){
	var anchorTitle=getSelectValue(jumpObj);
	var re=new RegExp('#.*','g');
	var jumpTo=document.location.href;
	var jumpTo=jumpTo.replace(re,'');
	document.location.href=jumpTo+"#"+anchorTitle;
}