//--------------------------------------------------------------------------------
//Copyright © 1999 G2 Information Technologies, Inc.
//
//Licensing:
//  You are licensed to use this code with HTML pages that you develop. You may not
//  resell this code.
//
//--------------------------------------------------------------------------------
//Purpose:
//  To check if the browser has cookies enabled
//
//  Calling:
//      if (!AreCookiesEnabled()) {alert "cookies are not enabled";}
//--------------------------------------------------------------------------------
var isIE = (navigator.appName.indexOf("Microsoft") != -1);
var isNS = (navigator.appName.indexOf("Netscape") != -1);

var FormElements = new Array();

//Options
var fShowIndividualMessages = false;
var fShowGroupMessage       = true;
var fShowErrorImage         = false;
var sErrorImage_On          = "g2images/error_small.gif";
var sErrorImage_Off         = "g2images/error_blank_small.gif";


//Define the field edit types
var EDIT_NONE           = 0;    //No validation required.
var EDIT_CCNUMBER       = 1;
var EDIT_DATE           = 2;
var EDIT_DATE3          = 16;
var EDIT_EMAIL          = 3;
var EDIT_INTEGER        = 4;    // 0-9 , .
var EDIT_NUMERIC        = 5;    // 0-9
var EDIT_NUMBER         = 6;    // 0-9 , . -
var EDIT_PHONE          = 7;
var EDIT_PHONE3         = 17;
var EDIT_TIME           = 8;
var EDIT_ALPHANUMERIC   = 9;    // a-z 0-9 space
var EDIT_ALPHA          = 10;   // a-z

var EDIT_ADDRESS        = 18;   // a-z 0-9  - ' space
var EDIT_NAME           = 11;   // a-z - ' space
var EDIT_ZIP            = 12;   // a-z
var EDIT_CURRENCY       = 13;   // Same as number ?
var EDIT_STATECODE      = 14;   //
var EDIT_COUNTRYCODE    = 15;   //

//Define the form object types
var OBJTYPE_TEXT    = 1;
var OBJTYPE_SELECT  = 2;
var OBJTYPE_RADIO   = 3;
var OBJTYPE_CHECK   = 4;
var OBJTYPE_SCRIPT  = 5;

var sErrorMessage = "";
var fFieldInError = null;


function g2ValidateForm(formName) {
    var f = document.forms[formName];
    var ret = true;

    sErrorMessage = "";
    fFieldInError = null;

//---Check for code to run before the edit pass.
    if (window.PreEdit != null) {
        ret = PreEdit(f);
        if (fShowIndividualMessages && ret == false) {
            return false;
        }
    }

    for (idx=0; idx<FormElements.length; idx++) {
        var fName = FormElements[idx].name;
//alert(fName);
//--    Clear the old error flag.
        g2ValidateForm_ClearError(f[fName + "_error"]);

        if (FormElements[idx].type == OBJTYPE_SCRIPT) {
            if (!eval(FormElements[idx].req)) {
                if (!validateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].rmsg, sErrorImage_Range))
                    return false;
            }
        }
        else if (FormElements[idx].type == OBJTYPE_TEXT) {
            if (FormElements[idx].req) {
                if (FormElements[idx].edit == EDIT_DATE3) {
                    if (isEmpty(Trim(f[fName + "_1"].value))) {
                        if (!g2ValidateForm_ShowError(FormElements[idx].rmsg, f[fName + "_1"]))
                            return false;
                    }
                    if (isEmpty(Trim(f[fName + "_2"].value))) {
                        if (!g2ValidateForm_ShowError(FormElements[idx].rmsg, f[fName + "_2"]))
                            return false;
                    }
                    if (isEmpty(Trim(f[fName + "_3"].value))) {
                        if (!g2ValidateForm_ShowError(FormElements[idx].rmsg, f[fName + "_3"]))
                            return false;
                    }
                }
                else if (FormElements[idx].edit == EDIT_PHONE3) {
                    if (isEmpty(Trim(f[fName + "_1"].value))) {
                        if (!g2ValidateForm_ShowError(FormElements[idx].rmsg, f[fName + "_1"]))
                            return false;
                    }
                    if (isEmpty(Trim(f[fName + "_2"].value))) {
                        if (!g2ValidateForm_ShowError(FormElements[idx].rmsg, f[fName + "_2"]))
                            return false;
                    }
                    if (isEmpty(Trim(f[fName + "_3"].value))) {
                        if (!g2ValidateForm_ShowError(FormElements[idx].rmsg, f[fName + "_3"]))
                            return false;
                    }
                }
                else {
                    if (isEmpty(f[fName].value)) {
                        if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].rmsg))
                            return false;
                    }
                }
            }

//--        If the field is not empty, validate the input.
            if (FormElements[idx].edit != EDIT_NONE) {
                if (FormElements[idx].edit == EDIT_DATE3 || FormElements[idx].edit == EDIT_PHONE3) {
                    if (!isEmpty(f[fName + "_1"].value) || !isEmpty(f[fName + "_2"].value) || !isEmpty(f[fName + "_3"].value)) {
                        if (FormElements[idx].edit == EDIT_DATE3) {
                            var sTemp = Trim(f[fName + "_1"].value) + "/" + Trim(f[fName + "_2"].value) + "/" + Trim(f[fName + "_3"].value);
                            if (!isDate(sTemp)) {
                                if (!g2ValidateForm_ShowError(f[fName + "_1"], f[fName + "_error"], FormElements[idx].emsg))
                                    return false;
                            }
                        }
                        else if (FormElements[idx].edit == EDIT_PHONE3) {
                            var sTemp = Trim(f[fName + "_1"].value) + " " + Trim(f[fName + "_2"].value) + " " + Trim(f[fName + "_3"].value);
                            if (!isPhoneNumber(sTemp)) {
                                if (!g2ValidateForm_ShowError(f[fName + "_1"], f[fName + "_error"], FormElements[idx].emsg))
                                    return false;
                            }
                        }
                    }
                }
                else if (!isEmpty(f[fName].value)) {
                    if (FormElements[idx].edit == EDIT_ADDRESS) {
                        if (!isAddress(f[fName].value)) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_ALPHA) {
                        if (!isAlpha(f[fName].value)) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_ALPHANUMERIC) {
                        if (!isAlphaNumeric(f[fName].value)) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_CCNUMBER) {
                        if (!isCCNumber(f[fName].value)) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_COUNTRYCODE) {
                        if (!isCountryCode(f[fName].value)) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_DATE) {
                        if (!isDate(Trim(f[fName].value))) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
//                    else if (FormElements[idx].edit == EDIT_DATE3) {
//                        var sTemp = Trim(f[fName + "_1"].value) + "/" + Trim(f[fName + "_2"].value) + "/" + Trim(f[fName + "_3"].value);
//                        if (!isDate(sTemp)) {
//                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))
//                                return false;
//                        }
//                    }
                    else if (FormElements[idx].edit == EDIT_EMAIL) {
                        if (!isEMailAddress(f[fName].value)) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_INTEGER) {
                        if (!isInteger(Trim(f[fName].value))) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_NAME) {
                        if (!isName(f[fName].value)) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_NUMERIC) {
                        if (!isNumeric(Trim(f[fName].value))) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_NUMBER) {
                        if (!isNumber(Trim(f[fName].value))) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_PHONE) {
                        if (!isPhoneNumber(f[fName].value)) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
//                    else if (FormElements[idx].edit == EDIT_PHONE3) {
//                        var sTemp = Trim(f[fName + "_1"].value) + " " + Trim(f[fName + "_2"].value) + " " + Trim(f[fName + "_3"].value);
//                        if (!isPhoneNumber(sTemp)) {
//                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))
//                                return false;
//                        }
//                    }
                    else if (FormElements[idx].edit == EDIT_STATECODE) {
                        if (!isStateCode(Trim(f[fName].value))) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_TIME) {
                        if (!isTime(Trim(f[fName].value))) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                    else if (FormElements[idx].edit == EDIT_ZIP) {
                        if (!isZipCode(Trim(f[fName].value))) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].emsg))  return false;
                        }
                    }
                }
            }

//--        If the field is not empty, check for a range test.
            if (FormElements[idx].edit == EDIT_INTEGER || FormElements[idx].edit == EDIT_NUMERIC || FormElements[idx].edit == EDIT_NUMBER || FormElements[idx].edit == EDIT_ALPHANUMERIC || FormElements[idx].edit == EDIT_ALPHA) {
                if (!isEmpty(f[fName].value) && FormElements[idx].min != null && FormElements[idx].max != null) {
                    if (FormElements[idx].min != null) {
                        if (f[fName].value < FormElements[idx].min) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].rngmsg))  return false;
                        }
                    }

                    if (FormElements[idx].max != null) {
                        if (f[fName].value > FormElements[idx].max) {
                            if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].rngmsg))  return false;
                        }
                    }
                }
            }
        }
        else if (FormElements[idx].type == OBJTYPE_SELECT) {
            if (FormElements[idx].req) {
                if (f[fName].selectedIndex == -1) {
                    if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].rmsg))  return false;
                }
                if (isEmpty(f[fName][f[fName].selectedIndex].value) || f[fName][f[fName].selectedIndex].value == 'NULL') {
                    if (!g2ValidateForm_ShowError(f[fName], f[fName + "_error"], FormElements[idx].rmsg))  return false;
                }
            }
        }
        else if (FormElements[idx].type == OBJTYPE_RADIO) {
            if (FormElements[idx].req) {
                var found = false;
                for (var idx1=0; idx1<f[fName].length; idx1++) {
                    if (f[fName][idx1].checked)
                        found = true;
                }
                if (!found) {
                    var t = f[fName][0];
                    if (!g2ValidateForm_ShowError(f[fName][0], f[fName + "_error"], FormElements[idx].rmsg))  return false;
                }
            }
        }
        else if (FormElements[idx].type == OBJTYPE_CHECK) {
            if (FormElements[idx].req) {
                var found = false;
                if (!f[fName].checked) {
                    fFieldInError = f[fName];
                    var t = f[fName][0];
                    if (!g2ValidateForm_ShowError(f[fName][0], f[fName + "_error"], FormElements[idx].rmsg))  return false;
                }
            }
        }
    }

    if (window.PageEdit != null) {
        ret = PageEdit(f);
        if (fShowIndividualMessages && ret == false) {
            return false;
        }
//        if (ret == 0) {                                 // Error. Did not pass edits.
//            return false;
//        }
    }

    if (fShowIndividualMessages)
        return true;
    else {
        if (sErrorMessage != "") {
            if (fShowGroupMessage)  {
                alert(sErrorMessage);
                if (fFieldInError != null)
				{
                    if(fFieldInError.type != 'hidden')
					{
					    fFieldInError.focus();
					}
				}
            }
            return false;
        }
        else {
            return true;
        }
    }
}
//--------------------------------------------------------------------------------
//Note: the alt property only works on IE.
function g2ValidateForm_ShowError(field, errfield, msg) {
    if (fShowIndividualMessages) {
        alert(msg);
        if(fFieldInError.type != 'hidden')
		{
		    field.focus();
		}

        if (fShowErrorImage) {
            errfield.src = sErrorImage_On;
            errfield.alt = msg;
        }
        return false;
    }
    else {
        sErrorMessage += "\n" + msg;
        if (fFieldInError == null) fFieldInError = field;
        if (fShowErrorImage) {
            errfield.src = sErrorImage_On;
            errfield.alt = msg;
        }
        return true;
    }
}
//--------------------------------------------------------------------------------
function g2ValidateForm_ClearError(field) {
//    try {
//        var x = field.name;
//    }
//    catch (e) {
//        alert("null field");
//    }

    if (fShowErrorImage)
        if (field.src.indexOf(sErrorImage_On) > -1) {
            field.src = sErrorImage_Off;
            field.alt = "";
        }
}
//--------------------------------------------------------------------------------
//Purpose:
//  Constructors for Field object
//
//  Calling:
//      str = FromatAmount(amt);
//--------------------------------------------------------------------------------
function Element (name, type, req, rmsg) {
    this.name   = name;
    this.type   = type;
    this.req    = req;
    this.rmsg   = rmsg;
    this.edit   = EDIT_NONE;
    this.emsg   = "";
    this.min    = null;
    this.max    = null;
    this.rngmsg = "";
}
function Element (name, type, req, rmsg, edit, emsg) {
    this.name   = name;
    this.type   = type;
    this.req    = req;
    this.rmsg   = rmsg;
    this.edit   = edit;
    this.emsg   = emsg;
    this.min    = null;
    this.max    = null;
    this.rngmsg = "";
}
function Element (name, type, req, rmsg, edit, emsg, rangeMin, rangeMax, rngmsg) {
    this.name   = name;
    this.type   = type;
    this.req    = req;
    this.rmsg   = rmsg;
    this.edit   = edit;
    this.emsg   = emsg;
    this.min    = rangeMin;
    this.max    = rangeMax;
    this.rngmsg = rngmsg;
}

//--------------------------------------------------------------------------------
function addElement(field) {
    FormElements[FormElements.length] = field;
}
//--------------------------------------------------------------------------------

function removeElement(field) {
    for(i=0;i<FormElements.length;i++)
	{//alert(FormElements[i].name);
		if(FormElements[i].name == field)
		{
			FormElements[i].req = false;
			//alert(FormElements[i].req);
		}
	}
}

//--------------------------------------------------------------------------------
function isAddress(sInput) {
//--Check for valid characters, numbers, minus, period, space and apostriphy
    var reName = /^[a-z0-9.,\-\' #\/]+$/i;
    return reName.test(sInput);
}
//--------------------------------------------------------------------------------
function isAlpha(sInput) {
//--Check for valid characters.
    var reAlpha = /^[a-z]+$/i;
    return reAlpha.test(sInput);
}
//--------------------------------------------------------------------------------
function isAlphaNumeric(sInput) {
//--Check for valid characters. 0-9, comma, minus
    var reAlphaNumber = /^[a-z0-9 ]+$/i;
    return reAlphaNumber.test(sInput);
}
//----------------------------------------------------------------
function isCCNumber(ccNum) {

//--Check for valid input characters
    var reNumber = /^[0-9\- ]+$/;       // 0-9 space and dash
    if (!reNumber.test(ccNum))
        return false;

//--Start with a clean number
    var str = CleanCCNum(ccNum)

//--Check the length
    if (ccNum.length > 19)
        return (false);

//--Check the credit card length by card type
    var ccType = str.substr(0, 1);	//3=Amex, 4=Visa, 5=MasterCard, 6=Discover
    if (ccType != 3 && ccType != 4 && ccType != 5 && ccType != 6) return false;

//--Check the credit card length by card type
    if (ccType == 3 && str.length!=15) return false;
    if (ccType == 4 && str.length!=13 && str.length!=16) return false;
    if (ccType == 5 && str.length!=16) return false;
    if (ccType == 6 && str.length!=16) return false;

//--Do the checknum test
    var sum = 0;
    var mul = 1;
    var l = str.length;

//Process back to front
//    for (i = 0; i < l; i++) {
//        digit = str.substring(l-i-1, l-i);
    for (var i = l; i > 0; i--) {
        digit = str.substr(i-1, 1);
        tproduct = parseInt(digit, 10) * mul;
        if (tproduct >= 10)
            sum += (tproduct % 10) + 1;
        else
            sum += tproduct;
        if (mul == 1)
            mul++;
        else
            mul--;
    }

    if ((sum % 10) == 0)
        return (true);
    else
        return (false);
}
//----------------------------------------------------------------
//Clean the CC Number
function CleanCCNum(str) {
    var cleanText="";

//--make sure input is a string
    str+="";

    for (var idx=0; idx<str.length; idx++) {
        if (str.substring(idx, idx+1) >= "0" && str.substring(idx, idx+1) <= "9") cleanText += str.substring(idx, idx+1);
    }
    return cleanText;
}
//--------------------------------------------------------------------------------
function isCountryCode(sInput) {

//--List of valid state codes
    var CountryCodes = "|AD|AE|AF|AG|AI|AL|AM|AN|AO|AQ|AR|AS|AT|AU|AW|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BM|BN|BO|BR|BS|BT|BU|BV|BW|BY|BZ|CA|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|CR|CS|CT|CU|CV|CX|CY|CZ|DD|DE|DJ|DK|DM|DO|DZ|EC|EE|EG|EH|ER|ES|ET|FI|FJ|FK|FM|FO|FR|FX|GA|GB|GD|GE|GF|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|HV|ID|IE|IL|IN|IO|IQ|IR|IS|IT|JM|JO|JP|JT|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|MG|MH|MI|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NQ|NR|NU|NZ|OM|PA|PC|PE|PF|PG|PH|PK|PL|PM|PN|PR|PT|PU|PW|PY|QA|RE|RO|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|ST|SU|SV|SY|SZ|TC|TD|TF|TG|TH|TJ|TK|TM|TN|TO|TP|TR|TT|TV|TW|TZ|UA|UG|UK|UM|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WK|WS|YD|YE|YT|YU|ZA|ZM|ZR|ZW|"

//--Check for an empty string
    if (sInput == null || sInput == "")
        return false;

    if (CountryCodes.indexOf("|" + sInput.toUpperCase() + "|") == -1)
        return false;

    return true;
}
//--------------------------------------------------------------------------------
function isDate(sInput) {
    var d = sInput.split("/");
    if (d.length != 3) {
        d = sInput.split("-");
        if (d.length != 3)
            return false;
    }

//--Validate date parts as being numeric
    var reNumber = /^[0-9]+$/;
    if (!reNumber.test(d[0]) ||!reNumber.test(d[1]) ||!reNumber.test(d[2])) return false;

//--Validate the date parts.
    var mm = d[0];
    var dd = d[1];
    var yy =new Number(d[2]);

    if (yy < 2000) {
        if (yy < 50)
            yy = yy + 2000.0;
        else
            yy = yy + 1900.0
    }

    if (mm < 1 || mm > 12) return false;
    if (dd < 1)            return false;
    if (yy < 1)            return false;

    if (mm==1 || mm==3 || mm==5 || mm==7 || mm==8 || mm==10 || mm==12)
        if (dd > 31) return false;

    if (mm==4 || mm==6 || mm==9 || mm==11)
        if (dd > 30) return false;

    if (mm==2) {
        var iLeap = yy % 4;
        if (iLeap == 0 && dd > 29) return false;
        if (iLeap >  0 && dd > 28) return false;
    }

    return true;
}
//--------------------------------------------------------------------------------
function isEMailAddress(sInput) {

    var L1 = sInput.indexOf("@");
//    var L2 = sInput.indexOf(".");

//--Check the number of dots(.).
//    if (L2 > -1) {
//        var t1 = sInput.match(/\./g);
//        if (t1.length > 1) return false;
//    }
//    else
//        return false;

//--Check the number of @s.
    if (L1 > -1) {
        var t2 = sInput.match(/\@/g);
        if (t2.length > 1) return false;
    }
    else
        return false;

//    if (L1 > L2) return false;
//    if (L2 > sInput.length-1) return false;

    var reEmail = /^[\s]*[a-zA-Z0-9_\-\.]+\@[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)+$/;
    return reEmail.test(sInput);
}
//--------------------------------------------------------------------------------
function isEmpty(sInput) {
    if (sInput == null || sInput == "")
        return true;

    var reSpaces = /^ +$/;
    return reSpaces.test(sInput);
}
//--------------------------------------------------------------------------------
function isInteger(sInput) {
//--Check for valid characters. 0-9, comma, minus
    var reNumber = /^[0-9,\-]+$/;
    return reNumber.test(sInput);
}
//--------------------------------------------------------------------------------
function isName(sInput) {
//--Check for valid characters. minus, period, space and apostriphy
    var reName = /^[a-z.,\-\' ]+$/i;
    return reName.test(sInput);
}
//--------------------------------------------------------------------------------
function isNumber(sInput) {
//--Check the number of decimal points.
    if (sInput.indexOf('.') > -1) {
        var xxx = sInput.match(/\./g);
        if (xxx.length > 1) return false;
    }
//--Check for valid characters. 0-9, comma, minus, and decimal-point
    var reNumber = /^[0-9\.,\-]+$/;
    return reNumber.test(sInput);
}
//--------------------------------------------------------------------------------

function isNumeric(sInput) {
//--Check for valid characters. 0-9
    var reNumber = /^[0-9]+$/;
    return reNumber.test(sInput);

}
//--------------------------------------------------------------------------------
function isPhoneNumber(sInput) {

//--Step one. Check for anyting entered.
    if (sInput == null || sInput == "") return false;

    var reSpaces = /^ +$/;
    if (reSpaces.test(sInput)) return false;

//--Step two. Seperate the parts.
    var idx;
    var count   = 0;
    var x       = "";
    var delim   = false;
    var args = new Array(10);

    for (idx=0; idx<10; idx++) {
        args[idx] = "";
    }

    for (idx=0; idx<sInput.length; idx++) {
        x = sInput.substring(idx, idx+1);
        if (x == "(" || x == ")" || x == "-" || x == "/" || x == " ") {
            if (delim) {

            }
            else {
                delim = true;
                if (args[0] != "") {
                    count++;
                }
            }
        }
        else {
            delim = false;
            args[count] = args[count] + x;
        }
    }

//    var InvalidAreaCodes = "|900|800|888|";
    var InvalidAreaCodes = "|900|888|";
    var InvalidPrefixes  = "|555|";
    var InvalidNumbers   = "|1212|";

//--Check the arguments.
    if (count < 2 || count > 4)  return false;
    var reNumber = /^[0-9]+$/;
    count++;

//--prefix & number
    if (count == 2) {
        if (!reNumber.test(args[0]) || !reNumber.test(args[1])) return false;
        if (args[0].length != 3 || args[1].length != 4)         return false;
        if (InvalidPrefixes.indexOf("|" + args[0] + "|") > -1) return false;
        if (InvalidNumbers.indexOf("|" + args[1] + "|") > -1) return false;
    }

//--areacode, prefix & number or prefix, number & extension
    if (count == 3) {
        if (!reNumber.test(args[2])) {  // Item 3 is not numeric. Assume prefix, number & extension
            if (!reNumber.test(args[0]) || !reNumber.test(args[1])) return false;
            if (args[0].length != 3 || args[1].length != 4)         return false;
            if (InvalidPrefixes.indexOf("|" + args[0] + "|") > -1) return false;
            if (InvalidNumbers.indexOf("|" + args[1] + "|") > -1) return false;
        }
        else {                          // areacode, prefix & number
            if (!reNumber.test(args[0]) || !reNumber.test(args[1]) || !reNumber.test(args[2]))  return false;
            if (args[0].length != 3 || args[1].length != 3 || args[2].length != 4)              return false;
            if (InvalidAreaCodes.indexOf("|" + args[0] + "|") > -1) return false;
            if (InvalidPrefixes.indexOf("|" + args[1] + "|") > -1) return false;
            if (InvalidNumbers.indexOf("|" + args[2] + "|") > -1) return false;
        }
    }

//--areacode, prefix, number & extension
    if (count == 4) {
        if (!reNumber.test(args[0]) || !reNumber.test(args[1]) || !reNumber.test(args[2]))  return false;
        if (args[0].length != 3 || args[1].length != 3 || args[2].length != 4)              return false;
        if (InvalidAreaCodes.indexOf("|" + args[0] + "|") > -1) return false;
        if (InvalidPrefixes.indexOf("|" + args[1] + "|") > -1) return false;
        if (InvalidNumbers.indexOf("|" + args[2] + "|") > -1) return false;
    }

    return true;
}
//--------------------------------------------------------------------------------
function isStateCode(sInput) {

//--List of valid state codes
//    var StateCodes = "|AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP|"
//    var USStateCodes = "|AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NC|ND|NE|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY"
//    var TeritoryCodes = "|AS|FM|GU|MH|MP|PR|PW|VI|"
//    var CanadaCodes
    var StateCodes = "|AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NC|ND|NE|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY" + "|AS|FM|GU|MH|MP|PR|PW|VI|";

//--Check for an empty string
    if (sInput == null || sInput == "")
        return false;

    if (StateCodes.indexOf("|" + sInput.toUpperCase() + "|") == -1)
        return false;

    return true;
}
//--------------------------------------------------------------------------------
function isTime(sInput) {
    var am_pm = 0;
    var idx   = 0;
    var t = sInput.toLowerCase();

//--Check for an empty string
    if (sInput == null || sInput == "")
        return false;

    var reSpaces = /^ +$/;
    if (reSpaces.test(sInput))
        return false;

//--Check for AM/PM
    idx = t.indexOf("pm");
    if (idx >= 0) {
        am_pm = 12;
        t = t.substring(0, idx-1);
    }

    idx = t.indexOf("am");
    if (idx >= 0) {
        t = t.substring(0, idx-1);
    }

//--Split the time into parts
    var args = t.split(":");
    if (args.length > 4) return false;
    if (args.length == 1) {
        args[1] = 0;
        args[2] = 0;
    }
    if (args.length == 2) {
        args[2] = 0;
    }


//--Validate time parts as being numeric
    var reNumber = /^[0-9]+$/;
    if (!reNumber.test(args[0]) ||!reNumber.test(args[1]) ||!reNumber.test(args[2])) return false;

//--Validate the time parts.
    if (args[0] < 0  ||  args[0] > 23) return false;
    if (args[1] < 0  ||  args[1] > 59) return false;
    if (args[2] < 0  ||  args[2] > 59) return false;

    return true;
}
//--------------------------------------------------------------------------------
function isZipCode(sInput) {

//--Check for an empty string
    if (sInput == null || sInput == "")
        return false;

//--Split the time into parts, if any
    var args = sInput.split("-");
    if (args.length != 2)
        args = sInput.split(" ");

    if (args.length > 2) return false;

    var reNumber = /^[0-9]+$/;

    if (args.length == 1) {
//--    Check for a canadian zip
        if (args[0].length != 6) {
            if (!reNumber.test(args[0])) return false;
            if (args[0].length != 5 && args[0].length != 9) return false;
        }
    }

    if (args.length == 2) {
        if (!reNumber.test(args[0]) ||!reNumber.test(args[1])) return false;
        if (args[0].length != 5) return false;
        if (args[1].length != 4) return false;
    }

    return true;
}
//----------------------------------------------------------------
function Trim(str) {
    if (str == '')   return '';
    if (str == null) return '';

    var idxEnd = 0
    var idxStart = str.length

    for (var idx=0; idx<=str.length-1; idx++) {
        if (str.substring(idx, idx+1) != ' ') {
            idxStart = idx
            break
        }
    }

    if (idxStart == str.length)
        return ''

    for (var idx=str.length-1; idx>=0; idx--) {
        if (str.substring(idx, idx+1) != ' ') {
            idxEnd = idx
            break
        }
    }
    sTemp = str.substring(idxStart, idxEnd+1)
    return sTemp
}
//--------------------------------------------------------------------------------
//--------------------------------------------------------------------------------
//For IE we must check all the key scrokes.
//Netscape seems to not pass the tab key to the event handler.
function DisabledFieldKeyTest(field) {
    var ret = false;
    if (isIE) {
        e = window.event;
        if (e.keyCode==9 || (e.keyCode>=16 && e.keyCode<=18) || (e.keyCode>=112 && e.keyCode<=123)) ret = true;
    }
    return ret;
}
//--------------------------------------------------------------------------------
