function getFormErrors(form) {
   var errors = new Array();
    // loop thru all form elements
   for (var elementIndex = 0; elementIndex < form.elements.length; elementIndex++) {
      var element = form.elements[elementIndex];
      // text and textarea types
      if (element.type =="hidden" || element.type == "text" || element.type == "textarea") {
         element.value = trimWhitespace(element.value)
         // required element
        if (element.required  && element.value == '') {
           errors[errors.length] = element.requiredError;
         }
         // maximum length
         else if (element.maxlength && isValidLength(element.value, 0, element.maxlength) == false) {
            errors[errors.length] = element.maxlengthError;
         }
         // minimum length
         else if (element.minlength && isValidLength(element.value, element.minlength, Number.MAX_VALUE) == false) {
            errors[errors.length] = element.minlengthError;
         }
         // pattern (credit card number, email address, zip or postal code, alphanumeric, numeric)
         else if (element.pattern) {
           if ( ( (element.pattern.toLowerCase() == 'visa' || element.pattern.toLowerCase() == 'mastercard' || element.pattern.toLowerCase() == 'american express' || element.pattern.toLowerCase() == 'diners club' || element.pattern.toLowerCase() == 'discover' || element.pattern.toLowerCase() == 'enroute' || element.pattern.toLowerCase() == 'jcb' || element.pattern.toLowerCase() == 'credit card') && isValidCreditCard(element.value, element.pattern) == false) ||
                  (element.pattern.toLowerCase() == 'email' && isValidEmailStrict(element.value) == false) ||
                  (element.pattern.toLowerCase() == 'zip or postal code' && isValidZipcode(element.value) == false && isValidPostalcode(element.value) == false) ||
                  (element.pattern.toLowerCase() == 'zipcode' && isValidZipcode(element.value) == false) ||
                  (element.pattern.toLowerCase() == 'postal code' && isValidPostalcode(element.value) == false) ||
                  (element.pattern.toLowerCase() == 'us phone number' && 
                     ( (element.prefix && element.suffix && isValidUSPhoneNumber(element.value, form[element.prefix].value, form[element.suffix].value) == false) || 
                        (!element.prefix && !element.suffix && isValidUSPhoneNumber(element.value) == false) ) ) ||
                  (element.pattern.toLowerCase() == 'alphanumeric' && isAlphanumeric(element.value, true) == false) ||
                  (element.pattern.toLowerCase() == 'numeric' && isNumeric(element.value, true) == false) ||
                  (element.pattern.toLowerCase() == 'alphabetic' && isAlphabetic(element.value, true) == false)||
                  (element.pattern.toLowerCase() == 'decimal' && isDecimalNumeric(element.value) == false)||
                   (element.pattern.toLowerCase() == 'negitiveDecimal' && isNagitiveDecimalNumeric(element.value) == false)||
                  (element.pattern.toLowerCase() == 'date' && isValidDate1(element.value) == false) 
                  ) {
               errors[errors.length] = element.patternError;
            }
         }
      }else if (element.type == "password") {
         // required element
         if (element.required  && element.value == '') {
            errors[errors.length] = element.requiredError;
         }else if (element.maxlength && isValidLength(element.value, 0, element.maxlength) == false) {
            errors[errors.length] = element.maxlengthError;
         }else if (element.minlength && isValidLength(element.value, element.minlength, Number.MAX_VALUE) == false) {
            errors[errors.length] = element.minlengthError;
         }
      }
      if (element.type == "file") {
      	if (element.required  && element.value == '') {
            errors[errors.length] = element.requiredError;
         }
      }else if (element.type == "select-one" || element.type == "select-multiple" || element.type == "select") {
       // required element
		   if (element.required && element.value=="") {
            errors[errors.length] = element.requiredError;
         }else if (element.disallowEmptyValue && element.options[element.selectedIndex].value == '') {
            errors[errors.length] = element.disallowEmptyValueError;
         }
      }else if (element.type == "radio") {
         var radiogroup = form.elements[element.name];
         // required element
         if (radiogroup.length && radiogroup[0] && radiogroup[0].required) {
            var checkedRadioButton = -1;
            for (var radioIndex = 0; radioIndex < radiogroup.length; radioIndex++) {
               if (radiogroup[radioIndex].checked == true) {
                  checkedRadioButton = radioIndex;
                  break;
               }
            }
            // show error if required and flag group as having been tested
          	if (checkedRadioButton == -1 && !radiogroup.tested) {
               errors[errors.length] = radiogroup[0].requiredError;
               radiogroup.tested = true;
            }
            // last radio button in group?  reset tested flag
            if (element == radiogroup[radiogroup.length - 1]) {
               radiogroup.tested = false;
            }
         }
         
         radiogroup = null;
      }
   }
   
   return errors;
}
//check for date
function isDateValid(value) {
	if (value==""){
		return false;	
	}
	var pos = value.indexOf("/");
	if (pos == -1){
		return false;
	}
	var d = parseInt(value.substring(0,pos));
	value = value.substring(pos+1, 999);
	pos = value.indexOf("/");
	if (pos==-1){
	return false;
	}
	var m = parseInt(value.substring(0,pos));
	value = value.substring(pos+1, 999);
	var y = parseInt(value);	
	if (isNaN(d)){
	return false;	
	}
	if (isNaN(m)){
	return false;	
	}
	if (isNaN(y)){
	return false;		
	}
	var type=navigator.appName;
	if (type=="Netscape"){
		var lang = navigator.language;
	}else{ 
		var lang = navigator.userLanguage;
	}
	lang = lang.substr(0,2);
	if (lang == "fr"){
		var date = new Date(y, m-1, d);
	}else{ var date = new Date(d, m-1, y);
	}
	if (isNaN(date)){
		return false;	
	}
	return true;
 }
//check for date (new)
function isValidDate1(dateString){
	dt=dateString.split("/");
	di=dt[0];mi=dt[1];yi=dt[2];
	var dp=parseInt(di, 10);
	var mp=parseInt(mi, 10);
	var mpTmpfld=mp-1;
	var yp=parseInt(yi, 10);
	var datep=new Date(yp,mpTmpfld,dp);
	var ypp=parseInt(datep.getFullYear(),10);
	var dpp=parseInt(datep.getDate(),10);
	var mpp=parseInt(datep.getMonth(),10)+1;
	if(mp==2){
		var leap ;
		leap = yp%4 ;
		if (leap == 0 && dp > 29){		
			return false;	
		}else if( leap != 0 && dp > 28){
			return false;	
        }	
	}
	if(yp<1900 || yp>2100){
		return false;
	}
	if((dp==dpp)&&(mp==mpp)&&(yp==ypp)){	
		return true;
	}else{	
		return false;
	}
	return true;
}
// Check that the number of characters in a string is between a max and a min
function isValidLength(string, min, max) {
	if (string.length < min || string.length > max){
   		return false;
   	}else{
   		return true;
   	}  
}
// Check that a credit card number is valid based using the LUHN formula (mod10 is 0)
function isValidCreditCard(number) {
   	number = '' + number;
	if (number.length > 16 || number.length < 13 ){
   		return false;
   	}else if (getMod10(number) != 0){
   		return false;
   	}else if (arguments[1]) {
    	var type = arguments[1];
      	var first2digits = number.substring(0, 2);
      	var first4digits = number.substring(0, 4);
        if (type.toLowerCase() == 'visa' && number.substring(0, 1) == 4 &&(number.length == 16 || number.length == 13 )){
        	return true;
      	}else if (type.toLowerCase() == 'mastercard' && number.length == 16 &&(first2digits == '51' || first2digits == '52' || first2digits == '53' || first2digits == '54' || first2digits == '55')){
      		return true;
      	}else if (type.toLowerCase() == 'american express' && number.length == 15 &&(first2digits == '34' || first2digits == '37')){
      		return true;
      	}else if (type.toLowerCase() == 'diners club' && number.length == 14 && (first2digits == '30' || first2digits == '36' || first2digits == '38')){
      		return true;
      	}else if (type.toLowerCase() == 'discover' && number.length == 16 && first4digits == '6011'){
      		return true;
      	}else if (type.toLowerCase() == 'enroute' && number.length == 15 && (first4digits == '2014' || first4digits == '2149')){
      		return true;
      	}else if (type.toLowerCase() == 'jcb' && number.length == 16 &&(first4digits == '3088' || first4digits == '3096' || first4digits == '3112' || first4digits == '3158' || first4digits == '3337' || first4digits == '3528')){
      		return true;
       // if the above card types are all the ones that the site accepts, change the line below to 'else return false'
    	}else{ return true;
   		}
   	}else{
   		 return true;
	}
}
// Check that an email address is valid based on RFC 821 (?)
function isValidEmail(address) {
	if (address != '' && address.search) {
    	if (address.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1){
    		return true;
      	}else{
      		return false;
   		}
	}
  // allow empty strings to return true - screen these with either a 'required' test or a 'length' test
   else return true;
}
// Check that an email address has the form something@something.something
// This is a stricter standard than RFC 821 (?) which allows addresses like postmaster@localhost
function isValidEmailStrict(address) {
	if (isValidEmail(address) == false){
		return false;
	}	
   	var domain = address.substring(address.indexOf('@') + 1);
   	if (domain.indexOf('.') == -1){
   		return false;
   	}	
   	if (domain.indexOf('.') == 0 || domain.indexOf('.') == domain.length - 1){
   		return false;
   	}	
   	return true;
}
// Check that a US zip code is valid
function isValidZipcode(zipcode) {
   	zipcode = removeSpaces(zipcode);
   	if (!(zipcode.length == 5 || zipcode.length == 9 || zipcode.length == 10)){
   		return false;
   	}
   	if ((zipcode.length == 5 || zipcode.length == 9) && !isNumeric(zipcode)){
   		return false;
   	}
   	if (zipcode.length == 10 && zipcode.search && zipcode.search(/^\d{5}-\d{4}$/) == -1){
   		return false;
   	}
   	return true;
}

// Check that a Canadian postal code is valid
function isValidPostalcode(postalcode) {
	if (postalcode.search) {
    	postalcode = removeSpaces(postalcode);
        if (postalcode.length == 6 && postalcode.search(/^[a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d$/) != -1){
         	return true;
      		}else if (postalcode.length == 7 && postalcode.search(/^[a-zA-Z]\d[a-zA-Z]-\d[a-zA-Z]\d$/) != -1){
      			return true;
      		}else{
      			return false;
   			}
	}
   return true;
}
// Check that a US or Canadian phone number is valid
function isValidUSPhoneNumber(areaCode, prefixNumber, suffixNumber) {
	if (arguments.length == 1) {
    	var phoneNumber = arguments[0];
      	phoneNumber = phoneNumber.replace(/\D+/g, '');
      	var length = phoneNumber.length;
    	if (phoneNumber.length >= 7) {
        	var areaCode = phoneNumber.substring(0, length-7);
        	var prefixNumber = phoneNumber.substring(length-7, length-4);
        	var suffixNumber = phoneNumber.substring(length-4);
     	 }else{
     	 	return false;
		 }   
   	}else if (arguments.length == 3) {
     	var areaCode = arguments[0];
      	var prefixNumber = arguments[1];
      	var suffixNumber = arguments[2];
	}else{
   	return true;
	}
   	if (areaCode.length != 3 || !isNumeric(areaCode) || prefixNumber.length != 3 || !isNumeric(prefixNumber) || suffixNumber.length != 4 || !isNumeric(suffixNumber)){
   		return false;
     }
   return true;
}
// Check that a string contains only letters and numbers
function isAlphanumeric(string, ignoreWhiteSpace) {
	if (string.search) {
    	if ((ignoreWhiteSpace && string.search(/[^\w\s]/) != -1) || (!ignoreWhiteSpace && string.search(/\W/) != -1)){
    		return false;
   		}
   	}
   	return true;
}
// Check that a string contains only letters
function isAlphabetic(string, ignoreWhiteSpace) {
   	if (string.search) {
	   	if ((ignoreWhiteSpace && string.search(/[^a-zA-Z\s]/) != -1) || (!ignoreWhiteSpace && string.search(/[^a-zA-Z]/) != -1)){
	   		return false;
  	 	}
  	 }
   	return true;
}
// Check that a string contains only numbers
function isNumeric(string, ignoreWhiteSpace) {
	if (string.search) {
    	if ((ignoreWhiteSpace && string.search(/[^\d\s]/) != -1) || (!ignoreWhiteSpace && string.search(/\D/) != -1)){
    		return false;
    	}	
	}
  	 return true;
}
//check for decimal number
function isDecimalNumeric(sText){
	var ValidChars = "0123456789.";
   	var IsNumber=true;
   	var Char;
   	for (i = 0; i < sText.length && IsNumber == true; i++){ 
   		Char = sText.charAt(i); 
      	if (ValidChars.indexOf(Char) == -1){
        	IsNumber = false;
         	}
     }
	return IsNumber;
}

function isNagitiveDecimalNumeric(sText){
	var ValidChars = "0123456789.-";
   	var IsNumber=true;
   	var Char;
   	for (i = 0; i < sText.length && IsNumber == true; i++){ 
   		Char = sText.charAt(i); 
      	if (ValidChars.indexOf(Char) == -1){
        	IsNumber = false;
         	}
     }
	return IsNumber;

}
// Remove characters that might cause security problems from a string 
function removeBadCharacters(string) {
	if (string.replace) {
    	string.replace(/[<>\"\'%;\)\(&\+]/, '');
   	}
   	return string;
}
// Remove all spaces from a string
function removeSpaces(string) {
	var newString = '';
   	for (var i = 0; i < string.length; i++) {
    	if (string.charAt(i) != ' ') newString += string.charAt(i);
   	}
   	return newString;
}
// Remove leading and trailing whitespace from a string
function trimWhitespace(string) {
	var newString  = '';
   	var substring  = '';
   	beginningFound = false;
   	for (var i = 0; i < string.length; i++) {
       // copy non-whitespace characters
    	if (string.charAt(i) != ' ' && string.charCodeAt(i) != 9) {
          // if the temporary string contains some whitespace characters, copy them first
        	if (substring != '') {
            	newString += substring;
            	substring = '';
         }
         newString += string.charAt(i);
         if (beginningFound == false) beginningFound = true;
      }else if (beginningFound == true) substring += string.charAt(i);
   }
   return newString;
}
// Returns a checksum digit for a number using mod 10
function getMod10(number) {
   // convert number to a string and check that it contains only digits
   // return -1 for illegal input
   	number = '' + number;
   	number = removeSpaces(number);
   	if (!isNumeric(number)){
   		return -1;
   	}	
   // calculate checksum using mod10
   	var checksum = 0;
   	for (var i = number.length - 1; i >= 0; i--) {
    	var isOdd = ((number.length - i) % 2 != 0) ? true : false;
      	digit = number.charAt(i);
        if (isOdd){
        	checksum += parseInt(digit);
      	}else {
         	var evenDigit = parseInt(digit) * 2;
         	if (evenDigit >= 10){
         		checksum += 1 + (evenDigit - 10);
         	}else{
         		checksum += evenDigit;
         	}
      }
   }
   return (checksum % 10);
}
// txn date cannot accept future dates
function chkValidCurrentPastDate(dateString){
	dt=dateString.split("/");di=dt[0];mi=dt[1];yi=dt[2];
	//var datep=new Date();var curDt=new Date();
	var datep=new Date();var curDt=new Date();
	datep.setFullYear(parseInt(yi, 10));
	datep.setMonth(parseInt(mi, 10)-1);
	datep.setDate(parseInt(di, 10));
	if(datep>curDt){
		return false;
	}else{
		return true;
	}
}

//-------------------------------------------------------------------
// Trim functions
//   Returns string with whitespace trimmed
//-------------------------------------------------------------------
function LTrim(str){
	if (str==null){return null;}
	for(var i=0;str.charAt(i)==" ";i++);
	return str.substring(i,str.length);
	}
function RTrim(str){
	if (str==null){return null;}
	for(var i=str.length-1;str.charAt(i)==" ";i--);
	return str.substring(0,i+1);
	}
function Trim(str){
	return LTrim(RTrim(str));
}
//-------------------------------------------------------------------
// isNumeric(value)
//   Returns true if value contains a positive float value
//-------------------------------------------------------------------
function isNumeric(val){
	return(parseFloat(val,10)==(val*1));
}
 
