 
  // -- Dates
  // -- date range
  // -- number
  // -- String character
  // -- Zip
  // -- email
  // -- phone number
  // -- currency
  
	function bolIsValidNumber(numberField) {
		if (typeof (numberField.value) == "undefined") {
			return false;
		}
		
		if (numberField.value.length == 0) {
			return true;
		}
			
		if (bolIsNumeric(numberField.value)) {
			return true;
		}
		return false;
		
	}

	function bolIsValidDateCompare(startDate, endDate, operator) {

	    var loc_startDate = bolDateCompareString(startDate.value);
	    var loc_endDate = bolDateCompareString(endDate.value);
	    return eval("\"" + loc_startDate + "\"" + operator + "\"" + loc_endDate + "\"");
	}

	function bolIsValidDateFormat(dateField) {
		var dateString = bolStrip(dateField.value, " ");
		//alert(dateString);
		var newValue = bolIsValidDateFormatString(dateString);
		if (newValue != "") {
			dateField.value = newValue;
			return true;
			}
		return false;
	}	

	function bolIsValidDateFormatString(dateStr) {
	    if (typeof (dateStr) == "undefined") {
	        return "";
	    }
	    var dateLen = dateStr.length;
	    if ((bolIsNumeric(dateStr)) && (dateLen == 8)) {
	        dateStr = dateStr.substring(0, 2) + "/" + dateStr.substring(2, 4) + "/" + dateStr.substring(4, 8);
	        dateLen = dateStr.length;
	    }
	    if ((bolIsNumeric(dateStr)) && (dateLen == 6)) {
	        dateStr = dateStr.substring(0, 2) + "/" + dateStr.substring(2, 4) + "/" + dateStr.substring(4, 6);
	        dateLen = dateStr.length;
	    }
	    if (bolIsNumeric(dateStr)) {
	        return "";
	    }
	    var spacerIndex = bolIndexOfFirstNotIn("0123456789", dateStr);
	    var spacerChar = dateStr.charAt(spacerIndex);
	    if (bolIsLetter(spacerChar)) {
	        return "";
	    }
	    var firstSpacer = dateStr.indexOf(spacerChar);
	    var secondSpacer = dateStr.lastIndexOf(spacerChar);
	    var monthStr = dateStr.substring(0, firstSpacer);
	    var dayStr = dateStr.substring(firstSpacer + 1, secondSpacer);
	    var yearStr = dateStr.substring(secondSpacer + 1, dateLen);
	    if ((!bolIsNumeric(monthStr)) || (!bolIsNumeric(dayStr)) || (!bolIsNumeric(yearStr))) {
	        return "";
	    }
	    if (monthStr.length == 1) {
	        monthStr = "0" + monthStr;
	    }
	    if (dayStr.length == 1) {
	        dayStr = "0" + dayStr;
	    }
	    var month = parseInt(monthStr, 10);
	    var day = parseInt(dayStr, 10);
	    var year = parseInt(yearStr, 10);
	    if (yearStr.length == 2) {
	        if (year > 71) {
	            yearStr = "19" + yearStr;
	        } else {
	            yearStr = "20" + yearStr;
	        }
	    }
	    if ((monthStr.length != 2) || (dayStr.length != 2) || (yearStr.length != 4)) {
	        return "";
	    }
	    var daysInMonth = new Array(12);
	    daysInMonth[1] = 31;
	    daysInMonth[2] = 28;
	    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;
	    if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0)) {
	        daysInMonth[2] = 29;
	    }
	    if ((month < 1) || (month > 12)) {
	        return "";
	    }
	    if ((day < 1) || (day > daysInMonth[month])) {
	        return "";
	    }
	    return (monthStr + "/" + dayStr + "/" + yearStr);
	}

	function validateZIP(field) {
		var valid = "0123456789-";
		var hyphencount = 0;
		
		if (field.length!=5 && field.length!=10) {
			alert("Please enter your 5 digit or 5 digit+4 zip code.");
			return false;
		}
		for (var i=0; i < field.length; i++) {
			temp = "" + field.substring(i, i+1);
			if (temp == "-") hyphencount++;
			if (valid.indexOf(temp) == "-1") {
				alert("Invalid characters in your zip code.  Please try again.");
				return false;
			}
			if ((hyphencount > 1) || ((field.length==10) && ""+field.charAt(5)!="-")) {
			alert("The hyphen character should be used with a properly formatted 5 digit+four zip code, like '12345-6789'.   Please try again.");
			return false;
			}
		}
		return true;
	}

	function validateEmail(emailvalue) {
		if (emailvalue.search("@") == -1 || emailvalue.search("[.*]") == -1) { // validate email
			return false;
		}
		return true;
		
	}

	function validatePhoneNumber(phoneField) {
		var phonevalue = bolStrip(phoneField.value, " ");
		
		if (phonevalue == "") {
			phoneField.value = "";
			return true;
		}
		
		var newValue = validatePhoneNumberString(phonevalue);
		if (newValue != "") {
			phoneField.value = newValue;
			return true;
			}
		return false;
	}
	
	function validatePhoneNumberString(phonevalue) {
	
	    var phoneLen = phonevalue.length;
	    
	    if (phonevalue.charAt(0) == "(" ) {
	    	// try to remove the brackets
	    	phonevalue = phonevalue.substring(1, phoneLen);
	    	phoneLen = phonevalue.length;
	    	if (phonevalue.charAt(3) == ")") {
	    		phonevalue = phonevalue.substring(0, 3) + phonevalue.substring(4, phoneLen);
	    		phoneLen = phonevalue.length;
	    	}	    			    
	    }
	    phonevalue = bolStrip(phonevalue, " ");
	 
		phonevalue = phonevalue.replace(/ /g, "-");

	    if ((bolIsNumeric(phonevalue)) && (phoneLen == 10)) {
	        phonevalue = phonevalue.substring(0, 3) + "-" + phonevalue.substring(3, 6) + "-" + phonevalue.substring(6, 10);
	        phoneLen = phonevalue.length;
	    }
	 
	    if (bolIsNumeric(phonevalue)) {
	        return "";
	    }

	    var spacerIndex = bolIndexOfFirstNotIn("0123456789", phonevalue);
	    var spacerChar = phonevalue.charAt(spacerIndex);

	    var firstSpacer = phonevalue.indexOf(spacerChar);
	    var secondSpacer = phonevalue.lastIndexOf(spacerChar);
	    
	    var areacodeStr = phonevalue.substring(0, firstSpacer);
	    var firstthreeStr = phonevalue.substring(firstSpacer + 1, secondSpacer);
	    var lastfourStr = phonevalue.substring(secondSpacer + 1, phoneLen);
	   
	    if ((!bolIsNumeric(areacodeStr)) || (!bolIsNumeric(firstthreeStr)) || (!bolIsNumeric(lastfourStr))) {
	        return "";
	    }			

	    if ((areacodeStr.length != 3) || (firstthreeStr.length != 3) || (lastfourStr.length != 4)) {
	        return "";
	    }
	   
	   return (areacodeStr + "-" + firstthreeStr + "-" + lastfourStr);	
	}

function bolIsValidDollar(dollarField) {
    var newValue = bolIsValidDollarString(dollarField.value);
    if (newValue == "") {
        return false;
    }
    dollarField.value = newValue;
    return true;
}

function bolIsValidDollarString(dollarString) {
    var dollarStr = bolStrip(dollarString, " ");
    dollarStr = bolRemove(dollarStr, "$");
    dollarStr = bolRemove(dollarStr, ",");
    
    if (bolIsComposedOfChars("0.", dollarStr)) {
		return "0.00";
    }
    if (!bolIsComposedOfChars("0123456789.", dollarStr)) {
        return "";
    }
    var firstNonZero = bolIndexOfFirstNotIn("0", dollarStr);
    dollarStr = dollarStr.substring(firstNonZero, dollarStr.length);
    if ((dollarStr == ".") || (dollarStr.length == 0) || (dollarStr.indexOf(".") != dollarStr.lastIndexOf("."))) {
        return "";
    }
    var decimalIndex = dollarStr.indexOf(".");
    var dollars = "";
    var cents = "";
    if (decimalIndex == -1) {
        dollars = dollarStr;
        cents = "00";
    } else {
        if (decimalIndex == (dollarStr.length - 1)) {
            dollars = dollarStr.substring(0, decimalIndex);
            cents = "00";
        } else {
            if (decimalIndex == 0) {
                dollars = "0";
                cents = dollarStr.substring(1, dollarStr.length);
            } else {
                dollars = dollarStr.substring(0, decimalIndex);
                cents = dollarStr.substring((decimalIndex + 1), dollarStr.length);
            }
        }
    }
    if (cents.length == 1) {
        cents = cents + "0";
    }
    if (cents.length > 2) {
        return "";
    }
    if ((dollars.length + cents.length) > 15) {
        return "";
    }
    return (dollars + "." + cents);
}

	
	// Utility Methods

	function bolRemove(string, rChar) {
	    var retStr = "";
	    for (var i = 0; i < string.length; i++) {
	        var ch = string.charAt(i);
	        if (ch != rChar) {
	            retStr = retStr + ch;
	        }
	    }
	    return retStr;
	}
	
	function bolStrip(string, sChar) {
	    if ((string == null) || (string == "")) {
	        return "";
	    }
	    var startIndex = bolIndexOfFirstNotIn(sChar, string);
	    var endIndex = bolIndexOfLastNotIn(sChar, string);
	    if (startIndex == -1) {
	        return "";
	    }
	    return string.substring(startIndex, endIndex + 1);
	}	

	function bolIndexOfFirstNotIn(okayChars, inString) {
	    var i;
	    for (i = 0; i < inString.length; i++) {
	        var charm = inString.charAt(i);
	        if (okayChars.indexOf(charm) == -1) {
	            return i;
	        }
	    }
	    return -1;
	}
	
	function bolIsNumeric(number) {
	    number = number + "";
	    return ((number.length > 0) && bolIsComposedOfChars("0123456789", number));
	}
	
	function bolIsLetter(aChar) {
	    return ((aChar >= "a") && (aChar <= "z")) || ((aChar >= "A") && (aChar <= "Z"));
	}
	
	function bolIsValidString(aString) {
		var reValid = /^[-a-zA-Z0-9é_.\\-\\(\\)<>@&+=,*'#/;:\s]+$/;
		
		if (String(aString).length == 0) {
			return true;
		} else {
			return reValid.test(aString);
		} 	
	}
	
	function bolIsValidNAZip(aString) {
		var reValid = /^[a-zA-Z0-9- ]+$/;
		
		if (String(aString).length == 0) {
			return true;
		} else {
			return reValid.test(aString);
		} 	
	}
	
	function bolIsValidNonNullString(aString) {
		var reValid = /^[a-zA-Z0-9_.\\-\\(\\)<>@+=,'#/;:\s]+$/;
		
		if (String(aString).length == 0) {
			return false;
		} else {
			return reValid.test(aString);
		} 	
	}
	
	function bolIsValidUsernamePassword (s)	{ 
		
		var reValidUsePass = /^[a-zA-Z0-9_]+$/;
		
	    if (String(s).length <= 5) {
			return false;
	    } else {
			return reValidUsePass.test(s);
	    }
	}
	
	function bolDateCompareString(dateString) {
	    var month = dateString.substring(0, 2);
	    var day = dateString.substring(3, 5);
	    var year = dateString.substring(6, 10);
	    return year + month + day;
	}

	function bolIndexOfLastNotIn(okayChars, inString) {
	    var i;
	    for (i = inString.length - 1; i >= 0; i--) {
	        var charm = inString.charAt(i);
	        if (okayChars.indexOf(charm) == -1) {
	            return i;
	        }
	    }
	    return -1;
	}

	function bolIndexOfFirstNotIn(okayChars, inString) {
	    var i;
	    for (i = 0; i < inString.length; i++) {
	        var charm = inString.charAt(i);
	        if (okayChars.indexOf(charm) == -1) {
	            return i;
	        }
	    }
	    return -1;
	}

	function bolIsComposedOfChars(validChars, inString) {
	    return bolIndexOfFirstNotIn(validChars, inString) == -1;
	}
	
	function bolIsNumeric(number) {
	    number = number + "";
	    return ((number.length > 0) && bolIsComposedOfChars("0123456789", number));
	}

	function bolGetTodayAsmmddyyyy() {
	    var todayDate = new Date();
	    var today = (todayDate.getMonth() + 1) + "/" + todayDate.getDate() + "/" + bolGetFullYear(todayDate);
	    return (bolIsValidDateFormatString(today));
	}
	
	function bolGetFullYear(dateObj) {
	    var year = parseInt(dateObj.getYear(), 10);
	    if (year < 1000) {
	        year += 1900;
	    }
	    return year;
	}
	
	function cleanXMLData(xmlText) {

		xmlText = xmlText.replace(/&/g, "&amp;");
		xmlText = xmlText.replace(/"/g, "&quot;");
		xmlText = xmlText.replace(/</g, "&lt;");
		xmlText = xmlText.replace(/>/g, "&gt;");
		xmlText = xmlText.replace(/'/g, "&apos;");

		return xmlText;    
	}

