var defaultEmptyOK = false;
var whitespace = " \t\n\r";
var digits = "0123456789";

// m is an abbreviation for "missing"
var mPrefix = "You did not enter a value into the "
var mSuffix = " field. This is a required field. Please enter it now."
var phoneNumberDelimiters = "()- ";
var validUSPhoneChars = digits + phoneNumberDelimiters;
var digitsInUSPhoneNumber = 10;
var sPhone = "Phone Number";
var iUSPhone = "This field must be a 10 digit U.S. phone number (like 415 555 1212). Please re-enter it now.";
var pUSPhone = "10 digit U.S. phone number (like 415 555 1212).";
var sEmail = "Email"
var iEmail = "This field must be a valid email address (like foo@bar.com). Please re-enter it now."
var pEmail = "valid email address (like foo@bar.com)."

function checkString(formelem, expr, msg){
	var myRegExp = expr;
	if(!myRegExp.test(formelem.value)){
		alert(msg);
		formelem.focus();
		return false;
	}return true;
}

function isChecked(formelem, msg){
	if (formelem == null) return true;
	
	var ischecked = false;
	for(i=0;i<formelem.length;i++){
		if(formelem[i].checked) ischecked = true;
	}
	if(ischecked == false){
        alert(msg);
		formelem[0].focus()
		return false;
    }
    return true;
}

function checkDate(formelem, msg) {
	if (formelem == null || /^\s*$/.test(formelem.value)) return true;
	
	var dateRegExp = /^\s*([1-9]|0[1-9]|1[012])\/([1-9]|0[1-9]|[12][0-9]|3[01])\/(\d\d)\s*$/;
	var matchedDate = formelem.value.match(dateRegExp);
	var result = false;
	if (matchedDate != null) {
		var year = matchedDate[3];
		var month = matchedDate[1];
		var day = matchedDate[2];
	
		if (day == 31 && (month == 4 || month == 6 || month == 9 || month == 11)) {
			result = false;
		} else if (day >= 30 && month == 2) {
			result = false;
		} else if (month == 2 && day == 29 && year % 4 != 0) {
			result = false;
		} else {
			result = true;
		}
	}
	
	if (!result) {
		alert(msg);
		return false;
	}
	return true;
}

function checkAtLeastOne(elemArray, msg) {
	if (elemArray == null || elemArray.length == 0) return true;
	
	var result = false;
	for (var x in elemArray) {
		if (/\S+/.test(elemArray[x].value)) {
			result = true;
			break;
		}
	}

	if (!result) {
		alert(msg);
		return false;
	}
	return true;
}

function toggleDate(c) {
	var f = c.form;
	var name = c.name.substr(7); //remove "choice_" prefix
	if (c.checked) {
		if (c.value == "date") {
			f[name].disabled = false;
			f[name + "_txt"].disabled = true;
			f[name + "_txt"].value = "";
		} else if (c.value == "text") {
			f[name].disabled = true;
			f[name].value = "";
			f[name + "_txt"].disabled = false;
		}
	}
}

function toggleDiv(sHideOrShow, sDiv){
	if(sHideOrShow == "hide"){
		document.getElementById(sDiv).style.display = 'none';
	}else if(sHideOrShow == "show"){
		document.getElementById(sDiv).style.display = '';
	}
}

//checkEmail (TEXTFIELD theField [, BOOLEAN emptyOK==false])
//
// Check that string theField.value is a valid Email.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function checkEmail (theField, emptyOK)
{   
	if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else if (!isEmail(theField.value, false)) 
       return warnInvalid (theField, iEmail);
    else return true;
}

function isEmail (s)
{   
	if (isEmpty(s)) 
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);
   
    if (isWhitespace(s)) return false;
    
    // there must be >= 1 character before @, so we
    // start looking at character position 1 
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;
    
    // do some preliminary checks for @. or ..  .@ or ending on .
    if(s.indexOf("@.") >= 0  || s.indexOf("..") >= 0  ||  s.charAt(sLength - 1) == "." )
        return false;
    
    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { 
    	i++;
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
         else i += 2;
    
    // look for .'s
    while ((i < sLength) && (s.charAt(i) != "."))
    { 
    	i++;
    }  
    // there must be at least one character after the .
    if (i >= sLength - 1) return false;
    else return true;
}



// Notify user that contents of field theField are invalid.
// String s describes expected contents of theField.value.
// Put select theField, pu focus in it, and return false.
function warnInvalid(theField, s)
{   
	theField.focus();
    theField.select();
    alert(s);
    return false;
}

function isString(theField, s, emptyOK)
{   
	// Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if (isString.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value))
       return warnEmpty(theField, s);
    else return true;
}



function isWhitespace(s)
{   
	var i;
    // Is s empty?
    if (isEmpty(s)) return true;
    // Search through string's characters one by one
    // until we find a non-whitespace character.
    // When we do, return false; if we don't, return true.
    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (whitespace.indexOf(c) == -1) return false;
    }
    // All characters are whitespace.
    return true;
}

function isBlank(s)
{
	for(var i = 0; i < s.length; i++)
    {
		var c = s.charAt(i);
        if (c!= ' ')
        	return false;
    }
    return true;
}

function isEmpty(s)
{   return ((s == null) || (s.length == 0));
}

function warnEmpty(theField, s)
{	theField.focus();
    alert(mPrefix + s + mSuffix);
    return false;
}

function reformat(s)
{   var arg;
    var sPos = 0;
    var resultString = "";

    for (var i = 1; i < reformat.arguments.length; i++) {
       arg = reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}

function isUSPhoneNumber (s)
{   if (isEmpty(s)) 
       if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isUSPhoneNumber.arguments[1] == true);
    return (isInteger(s) && s.length == digitsInUSPhoneNumber)
}


function reformatUSPhone (USPhone)
{   
    return (reformat (USPhone, "(", 3, ") ", 3, "-", 4));
}

function checkUSPhone (theField, emptyOK)
{   if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters);
       if (!isUSPhoneNumber(normalizedPhone, false)) 
          return warnInvalid (theField, iUSPhone);
       else 
       {  // if you don't want to reformat as (123) 456-789, comment next line out
          theField.value = reformatUSPhone(normalizedPhone);
          return true;
       }
    }
}

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++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}

function isInteger (s) {
	var i;

    if (isEmpty(s)) 
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == true);

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);

        if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}

function isDigit (c)
{   
    return ((c >= "0") && (c <= "9"));
}