function isValidDate(fld) {
     // Replace other commonly used date delimiters
     fld.value = replaceDateDelims(fld);
     fld.value = fixDateDigits(fld);
     fld.value = delSpaces(fld.value);

     if ((isDate(fld)==false) && (fld.value.length > 0)) {
          fld.focus();
          return false;
     }
     return true;


     function isDateInt(s) {
          var i;
          for (i = 0; i < s.length; i++) {
               // Check that current character is number.
               var c = s.charAt(i);
               if (((c < "0") || (c > "9"))) return false;
          }
          // All characters are numbers.
          return true;
     }

     function replaceDateDelims(fld) {

          var newValue = fld.value;

          // Only replace Date Delimiter if a date pattern matches
          if (newValue.search(/^[0-9]+[\/,\-,\s,.][0-9]+[\/,\-,\s,.][0-9]+\s*$/) != -1) {

               // Replace Dashes
               var str = /\-/g;
               newValue = newValue.replace(str,'/');
          
               // Replace Decimals
               var str = /\./g;
               newValue = newValue.replace(str,'/');
          }
     
          return newValue;
     
     }

     function fixDateDigits(fld) {
          var newValue = fld.value;
          
          // Only replace Date Delimiter if a date pattern matches
          if (newValue.search(/^[0-9]+[\/,\-,\s,.][0-9]+[\/,\-,\s,.][0-9]+\s*$/) != -1) {

               var pos1     = newValue.indexOf("/")
               var pos2     = newValue.indexOf("/",pos1+1)
               var strMonth = newValue.substring(0,pos1)
               var strDay   = newValue.substring(pos1+1,pos2)
               var strYear  = newValue.substring(pos2+1)
     
               if (strMonth.length == 1)
                    strMonth = "0" + strMonth;
                    
               if (strDay.length == 1)
                    strDay = "0" + strDay;
                    
               if (strYear.length == 2)
                    strYear = "20" + strYear;
                    
               newValue = strMonth + "/" + strDay + "/" + strYear;
     
          }
     
          return newValue;
          
     }

     function stripCharsInBag(s, bag) {

          var i;
          var returnString = "";
          // Search through string's characters one by one.
          // If character is not in bag, append to returnString.
          for (i = 0; i < s.length; i++) {
               var c = s.charAt(i);
               if (bag.indexOf(c) == -1) returnString += c;
          }

          return returnString;

     }

     function daysInFebruary (year) {

          // February has 29 days in any year evenly divisible by four,
          // EXCEPT for centurial years which are not also divisible by 400.
          return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );

     }

     function DaysArray(n) {

          for (var i = 1; i <= n; i++) {
               this[i] = 31
               if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
               if (i==2) {this[i] = 29}
          }
          return this
     }

     function isDate(fld) {
          // Declaring valid date character, minimum year and maximum year
          var dtCh= "/";
          var minYear=2000;
          var maxYear=2099;

          var daysInMonth = DaysArray(12)
          var pos1=fld.value.indexOf(dtCh)
          var pos2=fld.value.indexOf(dtCh,pos1+1)
          var strMonth=fld.value.substring(0,pos1)
          var strDay=fld.value.substring(pos1+1,pos2)
          var strYear=fld.value.substring(pos2+1)
          strYr=strYear
          
          if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
          if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)

          for (var i = 1; i <= 3; i++) {
               if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
          }

          month=parseInt(strMonth)
          day=parseInt(strDay)
          year=parseInt(strYr)

          if (pos1==-1 || pos2==-1) {
               return false;
          }
          if (strMonth.length<1 || month<1 || month>12) {
               return false;
          }

          if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]) {
               return false;
          }

          if (strYear.length != 4 || year==0 || year<minYear || year>maxYear) {
               return false;
          }

          if (fld.value.indexOf(dtCh,pos2+1)!=-1 || isDateInt(stripCharsInBag(fld.value, dtCh))==false) {
               return false;
          }
          return true;
     }
}



function isValidTime(fld) {
     if (  ((fld.value.search(/^[0]?[1-9]:[0-5][0-9]\s*$/) == -1) && (fld.value.search(/^[1][0-2]:[0-5][0-9]\s*$/) == -1) && (fld.value.length > 0))
          ||
          ((fld.value.length < 4) && (fld.value.length > 0))  ) {
          fld.focus();
          return false;
     }
     return true;
}


function isRequired(fld) {
     // Remove blank spaces and store results in temp variable
	var str = /\s/g;
	var tmpFldVal = fld.value;
	tmpFldVal = tmpFldVal.replace(str,'');
	
	// See if anything is left
	if ((tmpFldVal.length == 0) || (tmpFldVal.length == null)) {
		fld.value = '';
		fld.focus();
		return false;
	}
	return true;
}


function isNumeric(fld) {
	var valid_set='0123456789.';
	for (i=0;i < fld.value.length; ++i) {
		if(valid_set.indexOf(fld.value.charAt(i)) == -1) {
			return false;
		}
    	}
	return true;
}


function isInteger(fld) {
	var valid_set='0123456789';
	for (i=0;i < fld.value.length; ++i) {
		if(valid_set.indexOf(fld.value.charAt(i))==-1) {
			return false;
		}
    	}
	return true;
}


function isFloat(fld) {
	if(fld.value.indexOf('.') == false) {
		return false;
	}
	var valid_set='0123456789.';
	for (i=0;i < fld.value.length; ++i) {
		if(valid_set.indexOf(fld.value.charAt(i)) == -1) {
			return false;
		}
    	}
	return true;
}

function delSpaces(val) {
	var str = /\s/g;
	val = val.replace(str,'');
	return val;
}


function getSelectedCheckbox(buttonGroup) {
   // Go through all the check boxes. return an array of all the ones
   // that are selected (their position numbers). if no boxes were checked,
   // returned array will be empty (length will be zero)
   var retArr = new Array();
   var lastElement = 0;
   if (buttonGroup[0]) { // if the button group is an array (one check box is not an array)
      for (var i=0; i<buttonGroup.length; i++) {
         if (buttonGroup[i].checked) {
            retArr.length = lastElement;
            retArr[lastElement] = i;
            lastElement++;
         }
      }
   } else { // There is only one check box (it's not an array)
      if (buttonGroup.checked) { // if the one check box is checked
         retArr.length = lastElement;
         retArr[lastElement] = 0; // return zero as the only array value
      }
   }
   return retArr;
}


function checkboxCount(fld) {
   var checkboxcount=0;
   for(var i=0;i<fld.length;i++) {
       if(fld[i].checked) {
       	checkboxcount+=1;
       }
   }
   return checkboxcount;
}


function isRequiredDropdown(fld) {
	if ((fld.selectedIndex == '') || (fld.selectedIndex == null))
          return false;
	return true;
}



function isValidEmail(fld) {
	var remove_spaces = /\s/g;
	fld.value = fld.value.replace (remove_spaces, "");

	if (
		(
		//CHECKS FOR A SPECIFIC PATTERN THAT EMAIL SHOULD FOLLOW
		(fld.value.search(/^(.+)@(.+)\.(\w+)\s*$/) == -1) ||

		//CHECKS TO MAKE SURE THE @ AND THE . ARE NOT RIGHT NEXT TO EACH OTHER
		(fld.value.charAt(fld.value.indexOf("@")+1) == ".") ||
		(fld.value.charAt(fld.value.indexOf("@")-1) == ".") ||

		//CHECKS TO MAKE SURE THE LENGTH OF THE EMAIL ADDRESS IS NOT LESS THAT 6CHARACTERS LONG
		(fld.value.length < 6)
		)

		&&

		//BECAUSE EMAIL IS NOT ALWAYS REUQUIRED ALLOW IT TO BE BLANK
		(fld.value.length > 0)
	   ){

	     return false;
	
     }

	return true;

}



function makeUpperCase(fld) {
	var strToConvert = new String(fld.value);
	fld.value = strToConvert.toUpperCase();
	return true;
}


function makeLowerCase(fld) {
	var strToConvert = new String(fld.value);
	fld.value = strToConvert.toLowerCase();
	return true;
}


//MOVE ITEMS FROM ONE MULTI-SELECT BOX TO ANOTHER
function swapSelectBox(fromSelBoxObj, toSelBoxObj) {

	var fromSelBoxArr = new Array();
	var toSelBoxArr   = new Array();
	var arrLookup     = new Array();
	var i;

	for (i = 0; i < toSelBoxObj.options.length; i++) {
		arrLookup[toSelBoxObj.options[i].text] = toSelBoxObj.options[i].value;
		toSelBoxArr[i] = toSelBoxObj.options[i].text;
	}

	var fLength = 0;
	var tLength = toSelBoxArr.length;

	for (i = 0; i < fromSelBoxObj.options.length; i++) {

		arrLookup[fromSelBoxObj.options[i].text] = fromSelBoxObj.options[i].value;

		if (fromSelBoxObj.options[i].selected && fromSelBoxObj.options[i].value != "") {
			toSelBoxArr[tLength] = fromSelBoxObj.options[i].text;
			tLength++;
		}
		else {
			fromSelBoxArr[fLength] = fromSelBoxObj.options[i].text;
			fLength++;
		}
	}

	fromSelBoxArr.sort();
	toSelBoxArr.sort();
	fromSelBoxObj.length = 0;
	toSelBoxObj.length = 0;
	var c;

	for (c = 0; c < fromSelBoxArr.length; c++) {
		var no = new Option();
		no.value = arrLookup[fromSelBoxArr[c]];
		no.text = fromSelBoxArr[c];
		fromSelBoxObj[c] = no;
	}

	for (c = 0; c < toSelBoxArr.length; c++) {
		var no = new Option();
		no.value = arrLookup[toSelBoxArr[c]];
		no.text = toSelBoxArr[c];
		toSelBoxObj[c] = no;
	}

	return true;

}


function moveSelectBoxOption(listObj, hiddenObj, direction) {

     if (direction.toLowerCase() == 'up'){
     
          // CHECK TO MAKE SURE USER IS NOT ALTERING THE DEFAULT MESSAGE
          if(listObj.selectedIndex == -1) return false;
          if(listObj.options[listObj.selectedIndex].value  == -1) return false;
          if(listObj.selectedIndex == 0) return false;
          
          // GET CURRENT TEXT AND VALUES OF THE SELECTED OBJECT AND THE OBJECT ABOVE IT
          var optOneTxt = listObj.options[listObj.selectedIndex].text;
          var optOneVal = listObj.options[listObj.selectedIndex].value;
          var optTwoTxt = listObj.options[listObj.selectedIndex - 1].text;
          var optTwoVal = listObj.options[listObj.selectedIndex - 1].value;
          
          // SWITCH THE OBJECTS 
          listObj.options[listObj.selectedIndex].text = optTwoTxt;
          listObj.options[listObj.selectedIndex].value = optTwoVal;
          listObj.options[listObj.selectedIndex - 1].text = optOneTxt;
          listObj.options[listObj.selectedIndex - 1].value = optOneVal;
          
          // MAKE SURE THE CORRECT FIELD IS NOW HIGHLIGHTED
          listObj.selectedIndex = listObj.selectedIndex -1;
          
          // BUILD A TEMPORARY LIST THAT WILL BE STORED INTO THE PASSED IN HIDDEN VARIABLE
          var tmpNewListOrder='';
          for(var i=0; i < listObj.length; i++){
               tmpNewListOrder = tmpNewListOrder + listObj.options[i].value;
               if (i+1 != listObj.length)
                    tmpNewListOrder = tmpNewListOrder + ',';
          }
          
          // SET HIDDEN VARIABLE WITH NEW LIST ORDER
          hiddenObj.value = tmpNewListOrder;
          

          //DEBUG
          //alert(listObj.options[listObj.selectedIndex].text);
          //alert(listObj.options[listObj.selectedIndex].value);
       
     }
     else if (direction.toLowerCase() == 'down'){
          
          // CHECK TO MAKE SURE USER IS NOT ALTERING THE DEFAULT MESSAGE
          if(listObj.selectedIndex == -1) return false;
          if(listObj.options[listObj.selectedIndex].value  == -1) return false;
          if(listObj.selectedIndex ==listObj.length-1) return false;
          
          // GET CURRENT TEXT AND VALUES OF THE SELECTED OBJECT AND OBJECT BELOW IT
          var optOneTxt = listObj.options[listObj.selectedIndex].text;
          var optOneVal = listObj.options[listObj.selectedIndex].value;
          var optTwoTxt = listObj.options[listObj.selectedIndex+1].text;
          var optTwoVal = listObj.options[listObj.selectedIndex+1].value;
          
          // SWITCH THE OBJECTS 
          listObj.options[listObj.selectedIndex].text = optTwoTxt;
          listObj.options[listObj.selectedIndex+1].text = optOneTxt;
          listObj.options[listObj.selectedIndex].value = optTwoVal;
          listObj.options[listObj.selectedIndex+1].value = optOneVal;
          
          // MAKE SURE THE CORRECT FIELD IS NOW HIGHLIGHTED
          listObj.selectedIndex = listObj.selectedIndex + 1;
          
          // BUILD A TEMPORARY LIST THAT WILL BE STORED INTO THE PASSED IN HIDDEN VARIABLE
          var tmpNewListOrder='';
          for(var i=0; i < listObj.length; i++){
               tmpNewListOrder = tmpNewListOrder + listObj.options[i].value;
               if (i+1 != listObj.length)
                    tmpNewListOrder = tmpNewListOrder + ',';
          }
          
          // SET HIDDEN VARIABLE WITH NEW LIST ORDER
          hiddenObj.value = tmpNewListOrder;
          
          //DEBUG
          //alert(listObj.options[listObj.selectedIndex].text);
          //alert(listObj.options[listObj.selectedIndex].value);
          
     }
     
     return true;

}



function isValidZip(fld) {
	if (
		((fld.value.search(/^[0-9][0-9][0-9][0-9][0-9]\s*$/) == -1)
		||
		(fld.value.search(/^[0-9][0-9][0-9][0-9][0-9][-,\s,.][0-9][0-9][0-9][0-9]\s*$/)== -1))

		&&

		(fld.value.length > 0)
	   ){
	     return false;
	}
	return true;
}


function checkTextAreaLen(field,maxLen){
	if (field.value.length > maxLen){
	     // Trim textarea field to allowed length
		var tempField = '';
		for (i=0;i < maxLen; ++i) {
			if (field.value.charAt(i) != '') {
				tempField = tempField + field.value.charAt(i);
			}
	    	}
		field.value = tempField;
		return false;
	}
	return true;
}