function validateElement(element, type, name, blnSendBack) {
    var isValid = true;
    type = type.toLowerCase();
    var msg = "The '" + element.value + "' is not a valid '" + name + "' value!";
    var elnum = 0;

    if (type == "required") {
        msg = "A value in '" + name + "' is required!";

        if ((element[0] && element[0].type == "checkbox") || element.type == "checkbox") {
            var i;
            var checked = false;
            if (element[0]) {
                for (i = 0; i < element.length && !checked; i ++)
                    checked = element[i].checked;
            } else
                checked = element.checked;
            isValid = checked;
        } else if (element.type == "select-one") {
            msg = "One '" + name + "' must be selected!";
            isValid = false;
            for (var i=0; i<element.length; i++) {
                if (element[i].selected == true && element[i].value != '') {
                    isValid = true;
                    break;
                }
            }
        } else if (element.type == "select-multiple") {
            msg = "At least one '" + name + "' must be selected!";
            isValid = false;
            for (var i=0; i<element.length; i++) {
                if (element[i].selected == true && element[i].value != '') {
                    isValid = true;
                    break;
                }
            }
        } else if (element[0] && element[0].type == "radio") {
            msg = "One '" + name + "' must be selected!";
            isValid = false;
            for (var i=0; i<element.length; i++) {
                if (element[i].checked == true) {
                    isValid = true;
                    break;
                }
            }
        } else
            isValid = !(isEmpty(element.value) || isWhitespace(element.value));
    } else if (type == "requirednotzero") {
        if (element.type == "select-one") {
            msg = "One '" + name + "' must be selected!";
            isValid = false;
            for (var i=0; i<element.length; i++) {
                if (element[i].selected == true && element[i].value != '0') {
                    isValid = true;
                    break;
                }
            }
        } else if (element.type == "select-multiple") {
            msg = "At least one '" + name + "' must be selected!";
            isValid = false;
            for (var i=0; i<element.length; i++) {
                if (element[i].selected == true && element[i].value != '0') {
                    isValid = true;
                    break;
                }
            }
        }
    } else if (type == "requiredlist") {
        if (element.type == "select-one") {
            msg = "One '" + name + "' must be selected!";
            isValid = false;
            if (element.length > 0)
                isValid = true;
        } else if (element.type == "select-multiple") {
            msg = "At least one '" + name + "' must be selected!";
            isValid = false;
            if (element.length > 0)
                isValid = true;
        }
    } else if (type == "date")
        isValid = isDate(getDatePart(element.value, "y"), getDatePart(element.value, "m"), getDatePart(element.value, "d"));
    else if (type == "integer")
        isValid = isInteger(element.value);
    else if (type == "integer1")
        isValid = isInteger(element.value);
    else if (type == "double")
        isValid = isDouble(element.value);
    else if (type == "cash")
        isValid = isCash(element.value);
    else if (type == "ssn")
        isValid = isSSN(element.value);
    else if (type == "float")
        isValid = isFloat(element.value);
    else if (type == "email")
        isValid = isEmail(element.value);
    else if (type == "time") {
        msg = "The '" + element.value + "' is not a valid '" + name + "' value! Use HH:MM format (no spaces)";
        isValid = isTime(element.value);
    } else if (type == "visa" || type == "master" || type == "americanexpress" || type == "amex"
                || type == "discover" || type == "jcb"  || type == "dinersclub"
                || type == "carteblanche" || type == "enroute")
        isValid = isCardMatch (type, element.value)
    else if (type == "multitime") {
        for (i=0; i<element.length; i++) {
            msg = "The '" + element[i].value + "' is not a valid '" + name + "' value! Use HH:MM format (no spaces)";
            isValid = isTime(element[i].value);
            if (!isValid) {
                elnum = i;
                break;
            }
        }
    } else if (type == "multidouble") {
        for (i=0; i<element.length; i++) {
            msg = "The '" + element[i].value + "' is not a valid '" + name + "' value!";
            isValid = isDouble(element[i].value);
            if (!isValid) {
                elnum = i;
                break;
            }
        }
    } else if (type == "multicash") {
        for (i=0; i<element.length; i++) {
            msg = "The '" + element[i].value + "' is not a valid cash value! Use $#####.## with no commas.";
            isValid = isCash(element[i].value);
            if (!isValid) {
                elnum = i;
                break;
            }
        }
    } else
        isValid = false;

    if (!isValid &&  blnSendBack) {
        alert(msg);
        if (element.focus)
            element.focus();
        else if (element[0].focus)
            element[0].focus();

        if (element.select)
            element.select();

        if (elnum >0) {
            element[elnum].focus();
            if (element[elnum].select)
                element[elnum].select();
        }

    } else {
        if (isValid==false)
            alert(msg);
    }

    return isValid;
}

var reWhitespace = /^\s+$/
var reLetter = /^[a-zA-Z]$/
var reAlphabetic = /^[a-zA-Z]+$/
var reAlphanumeric = /^[a-zA-Z0-9]+$/
var reDigit = /^\d/
var reLetterOrDigit = /^([a-zA-Z]|\d)$/
var reInteger = /^\d+$/
var reSignedInteger = /^(-)?\d+$/
var reFloat = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/
var reSignedFloat = /^(((-)?\d+(\.\d*)?)|((-)?(\d*\.)?\d+))$/
var reEmail = /^.+\@.+\..+$/
var reDouble = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/
var reCash = /^[$.0-9]$/

var vbt_defaultEmptyOK = true;

function isEmpty(s) {
    return ((s == null) || (s.length == 0));
}

function isWhitespace(s) {
    return (isEmpty(s) || reWhitespace.test(s));
}

function isLetter(c) {
    return reLetter.test(c);
}

function isDigit(c) {
    return reDigit.test(c);
}

function isLetterOrDigit(c) {
    return reLetterOrDigit.test(c);
}

function isSSN(s) {
    if (isEmpty(s))
        if (isSSN.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isSSN.arguments[1] == true);

    return (reInteger.test(s) && s.length == 9);
}

function isInteger(s) {
    if (isEmpty(s))
        if (isInteger.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isInteger.arguments[1] == true);

    return reInteger.test(s);
}

function isSignedInteger(s) {
    if (isEmpty(s))
        if (isSignedInteger.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isSignedInteger.arguments[1] == true);
    else {
        return reSignedInteger.test(s);
    }
}

function isPositiveInteger(s) {
    var secondArg = vbt_defaultEmptyOK;

    if (isPositiveInteger.arguments.length > 1)
        secondArg = isPositiveInteger.arguments[1];

    return (isSignedInteger(s, secondArg)
            && ( (isEmpty(s) && secondArg) || (parseInt(s) > 0) ) );
}


function isNonnegativeInteger(s) {
    var secondArg = vbt_defaultEmptyOK;

    if (isNonnegativeInteger.arguments.length > 1)
        secondArg = isNonnegativeInteger.arguments[1];

    return (isSignedInteger(s, secondArg)
            && ( (isEmpty(s) && secondArg) || (parseInt(s) >= 0) ) );
}

function isNegativeInteger(s) {
    var secondArg = vbt_defaultEmptyOK;

    if (isNegativeInteger.arguments.length > 1)
        secondArg = isNegativeInteger.arguments[1];

    return (isSignedInteger(s, secondArg)
            && ( (isEmpty(s) && secondArg) || (parseInt(s) < 0) ) );
}

function isNonpositiveInteger(s) {
    var secondArg = vbt_defaultEmptyOK;

    if (isNonpositiveInteger.arguments.length > 1)
        secondArg = isNonpositiveInteger.arguments[1];

    return (isSignedInteger(s, secondArg)
            && ( (isEmpty(s) && secondArg) || (parseInt(s) <= 0) ) );
}

function isFloat(s) {
    if (isEmpty(s))
        if (isFloat.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isFloat.arguments[1] == true);

    return reFloat.test(s)
}

function isSignedFloat(s) {
    if (isEmpty(s))
        if (isSignedFloat.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isSignedFloat.arguments[1] == true);
    else {
        return reSignedFloat.test(s);
    }
}

function isAlphabetic(s) {
    if (isEmpty(s))
        if (isAlphabetic.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isAlphabetic.arguments[1] == true);
    else {
        return reAlphabetic.test(s);
    }
}

function isAlphanumeric(s) {
    if (isEmpty(s))
        if (isAlphanumeric.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isAlphanumeric.arguments[1] == true);
    else {
        return reAlphanumeric.test(s);
    }
}

function isEmail(s) {
    if (isEmpty(s))
        if (isEmail.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isEmail.arguments[1] == true);

    else {
        return reEmail.test(s)
    }
}

function isDouble(s) {
    if (isEmpty(s))
        if (isDouble.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isDouble.arguments[1] == true);

    return reDouble.test(s)
}

function isCash(s) {
    if (isEmpty(s))
        if (isCash.arguments.length == 1) return vbt_defaultEmptyOK;
        else return (isCash.arguments[1] == true);

    if (isCash.arguments.length == 1) return reCash.test(s.substring(0, 1));

    return (reCash.test(s.substring(0, 1)) && reDouble.test(s.substring(1, s.length)))
}

var format_date = "mdy";
vdt_defaultEmptyOK = true;
daysInMonth = [31,29,31,30,31,30,31,31,30,31,30,31]

function getDatePart(s, part) {
    var format;
    var separator;
    var first;
    var second;
    var third;
    var i,j;

    if (getDatePart.arguments.length > 2)
        format = getDatePart.arguments[2];
    else
        format = format_date;

    if ((s == null) || (s.length == 0))
        return null;

    i = 0;
    while ((i < s.length) && (s.charAt(i) >= "0") && (s.charAt(i) <= "9"))
        i++;

    if (i < s.length)
        separator = s.charAt(i);

    if ((separator == null) || (separator.length == 0))
        return null;

    j = i;
    first = s.substring(0, j);

    i++;
    while ((i < s.length) && s.charAt(i) != separator)
        i++;

    second = s.substring(j+1, i);
    third = s.substring(i+1, s.length);

    if (part == "day" || part == "d")
        if (format.charAt(0) == "d")
            if (first.charAt(0) == "0")
                return first.charAt(1);
            else
                return first
        else if (format.charAt(1) == "d")
            if (second.charAt(0) == "0")
                return second.charAt(1);
            else
                return second
        else if (format.charAt(2) == "d")
            if (third.charAt(0) == "0")
                return third.charAt(1);
            else
                return third

    if (part == "month" || part == "m")
        if (first.charAt(0) == "0")
            return first.charAt(1);
        else
            return first
    else if (format.charAt(1) == "m")
        if (second.charAt(0) == "0")
            return second.charAt(1);
        else
            return second
    else if (format.charAt(2) == "m")
        if (third.charAt(0) == "0")
            return third.charAt(1);
        else
            return third

    if (part == "year" || part == "y")
        if (format.charAt(0) == "y")
            if (first.length == 2)
                return ("20" + first);
            else
                return first;
        else if (format.charAt(1) == "y")
            if (second.length == 2)
                return ("20" + second);
            else
                return second;
        else if (format.charAt(2) == "y")
            if (third.length == 2)
                return ("20" + third);
            else
                return third;

    return null;
}

function isYear(s) {
    if ((s == null) || (s.length == 0))
        return vdt_defaultEmptyOK;

    for (i = 0; i < s.length; i++) {
       var c = s.charAt(i);
       if (!((c >= "0") && (c <= "9"))) return false;
    }

    return ((s.length == 2) || (s.length == 4));
}

function isMonth(s) {
    if ((s == null) || (s.length == 0))
        return vdt_defaultEmptyOK;

    for (i = 0; i < s.length; i++) {
       var c = s.charAt(i);
       if (!((c >= "0") && (c <= "9"))) return false;
    }

    var num = parseInt(s);
    return ((num >= 1) && (num <= 12));
}

function isDay(s) {
    if ((s == null) || (s.length == 0))
        return vdt_defaultEmptyOK;

    for (i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if (!((c >= "0") && (c <= "9"))) return false;
    }

    var num = parseInt(s);
    return ((num >= 1) && (num <= 31));
}

function daysInFebruary(year) {
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28);
}

function isDate(year, month, day) {
    if (((year == null) || (year.length == 0)) && ((month == null) || (month.length == 0)) && ((day == null) || (day.length == 0)))
        return vdt_defaultEmptyOK;

    if (!(isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;

    var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);

    if (intDay > daysInMonth[intMonth -1]) return false;
    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

    return true;
}

function isTime(timeStr) {
// Checks if time is in HH:MM AM/PM format.
// The seconds and AM/PM are optional.
//  var timePat = /^(\d{1,2}):(\d{2})?(\s?(AM|am|PM|pm))?$/;
    var timePat = /^(\d{1,2}):(\d{2})?$/;

    var matchArray = timeStr.match(timePat);

    if (timeStr == '')
        return true;

    if (matchArray == null)
        return false;

    hour = matchArray[1];
    minute = matchArray[2];
//    ampm = matchArray[4];

//    if (ampm=="") { ampm = null }

    if (hour < 1  || hour > 12) {
        alert("Hour must be between 1 and 12.");
        return false;
    }
/*
    if (hour <= 12 && ampm == null) {
        alert("You must specify AM or PM.");
        return false;
    }
*/
    if (minute < 0 || minute > 59) {
        alert("Minute must be between 0 and 59.");
        return false;
    }

    return true;
}

function checkdate(objName) {
    var datefield = objName;
    if (chkdate(objName) == false) {
        datefield.select();
        alert("Please enter a date in \"mm/dd/yy\" format.");
        datefield.focus();
        return false;
    } else {
        return true;
    }
}

function chkdate(objName) {
    var strDatestyle = "US"; //United States date style
    //var strDatestyle = "EU";  //European date style
    var strDate;
    var strDateArray;
    var strDay;
    var strMonth;
    var strYear;
    var intday;
    var intMonth;
    var intYear;
    var booFound = false;
    var datefield = objName;
    //    var strSeparatorArray = new Array("/");
    var strSeparatorArray = new Array("-"," ","/",".");
    var intElementNr;
    var err = 0;
    var strMonthArray = new Array(12);
    strMonthArray[0] = "Jan";
    strMonthArray[1] = "Feb";
    strMonthArray[2] = "Mar";
    strMonthArray[3] = "Apr";
    strMonthArray[4] = "May";
    strMonthArray[5] = "Jun";
    strMonthArray[6] = "Jul";
    strMonthArray[7] = "Aug";
    strMonthArray[8] = "Sep";
    strMonthArray[9] = "Oct";
    strMonthArray[10] = "Nov";
    strMonthArray[11] = "Dec";
    strDate = datefield.value;
    if (strDate.length < 1) {
        return true;
    }
    for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
        if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
            strDateArray = strDate.split(strSeparatorArray[intElementNr]);
            if (strDateArray.length != 3) {
                err = 1;
                return false;
            } else {
                strDay = strDateArray[0];
                strMonth = strDateArray[1];
                strYear = strDateArray[2];
            }
            booFound = true;
        }
    }
    if (booFound == false) {
        if (strDate.length>5) {
            strDay = strDate.substr(0, 2);
            strMonth = strDate.substr(2, 2);
            strYear = strDate.substr(4);
        }
    }
    if (strYear.length == 2) {
        strYear = '20' + strYear;
    }
    // US style
    if (strDatestyle == "US") {
        strTemp = strDay;
        strDay = strMonth;
        strMonth = strTemp;
    }
    intday = parseInt(strDay, 10);
    if (isNaN(intday)) {
        err = 2;
        return false;
    }
    intMonth = parseInt(strMonth, 10);
    if (isNaN(intMonth)) {
        for (i = 0;i<12;i++) {
            if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
                intMonth = i+1;
                strMonth = strMonthArray[i];
                i = 12;
            }
        }
        if (isNaN(intMonth)) {
            err = 3;
            return false;
        }
    }
    intYear = parseInt(strYear, 10);
    if (isNaN(intYear)) {
        err = 4;
        return false;
    }
    if (intMonth > 12 || intMonth < 1) {
        err = 5;
        return false;
    }
    if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
        err = 6;
        return false;
    }
    if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
        err = 7;
        return false;
    }
    if (intMonth == 2) {
        if (intday < 1) {
            err = 8;
            return false;
        }
        if (LeapYear(intYear) == true) {
            if (intday > 29) {
                err = 9;
                return false;
            }
        } else {
            if (intday > 28) {
                err = 10;
                return false;
            }
        }
    }
    if (strDatestyle == "US") {
        //datefield.value = strMonthArray[intMonth-1] + " " + intday+" " + strYear;
        //datefield.value = intMonth + "/" + intday + "/" + intYear; //strYear; //strMonthArray[intMonth-1] + " " + intday+" " + strYear;

        datefield.value = intMonth + "/" + intday + "/" + intYear.toString().substr(2,2); //strYear; //strMonthArray[intMonth-1] + " " + intday+" " + strYear;

    } else {
        datefield.value = intday + " " + strMonthArray[intMonth-1] + " " + strYear;
    }
    return true;
}

function LeapYear(intYear) {
    if (intYear % 100 == 0) {
        if (intYear % 400 == 0) { return true; }
    } else {
        if ((intYear % 4) == 0) { return true; }
    }
    return false;
}

function doDateCheck(from, to) {
    if (Date.parse(from.value) <= Date.parse(to.value)) {
        //alert("The dates are valid.");
        return true;
    } else {
        if (from.value == "" || to.value == "")
            alert("Please enter a valid value in \"mm/dd/yy\" format for both the start and end dates.");
        else {
            alert("The start date must be earlier than the end date. Please try again.");
            from.select();
            from.focus();
        }
        return false;
    }
}
