/* Forms scripting
--------------------------  */

// Collection creation function
function CreateCollection(ClassName) {
    var obj = new Array();
    eval("var t=new " + ClassName + "()");
    for (_item in t) {
        obj[_item] = t[_item];
    }
    return obj;
}

function FieldCollection() {
    this.Add = function(obj) {
        this.push(obj);
    }
}

function Field(fField, fRequired, fType, fError) {
    this.Field = fField;
    this.Required = fRequired;
    this.Type = fType;
    this.Error = fError;
}

validationCollection = new CreateCollection("FieldCollection");

function validate(o) {
    // Disable button and show animation
    o.disabled = true;
    document.getElementById("ajaxloader").className = "";

    var valForm = new Array();

    for (var i = 0; i < validationCollection.length; i++) {
        if (!validatefield(validationCollection[i])) {
            valForm[valForm.length] = '\r\n' + validationCollection[i].Error;
        }
    }

    if (valForm.length > 0) {
        // Invalid
        alert("Some errors occurred in your submission:" + valForm.toString())

        // Enable button and hide animation
        o.disabled = false;
        document.getElementById("ajaxloader").className = "hidden";

        return false;
    }

    o.disabled = false;
    document.getElementById("ajaxloader").className = "hidden";
    return true;
}

function validatefield(field) {
    // Check required first
    if (field.Required && field.Field.value == "") {
        return false;
    }
    else if (!field.Required && field.Field.value == "") {
        return true;
    }

    switch (field.Type) {
        case "text":
            return true;
        case "integer":
            var objRegExp = /(^-?\d\d*$)/;
            //check for integer characters
            return objRegExp.test(field.Field.value);
        case "decimal":
            var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
            //check for numeric characters
            return objRegExp.test(field.Field.value);
        case "currency":
            var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
            //check for numeric characters
            return objRegExp.test(field.Field.value);
        case "email":
            var objRegExp = /^.+@[^\.].*\.[a-z]{2,}$/;
            //check for format
            return objRegExp.test(field.Field.value);
        case "date":
            var objRegExp;
            var dValue = field.Field.value;
            if (dValue.indexOf(" ") > -1) {
                // Date and time format
                objRegExp = /^\d{1,2}(\-|\/)\d{1,2}\1\d{4}\s\d{1,2}\:\d{1,2}$/;
            }
            else {
                // date format
                objRegExp = /^\d{1,2}(\-|\/)\d{1,2}\1\d{4}$/;
            }
            //check to see if in correct format
            if (!objRegExp.test(dValue)) {
                return false;
            }
            else {
                if (dValue.indexOf(" ") > -1) {
                    dValue = dValue.substr(0, dValue.indexOf(" "));
                }

                var strSeparator = dValue.substring(2, 3) //find date separator
                var arrayDate = dValue.split(strSeparator); //split date into month, day, year
                //create a lookup for months not equal to Feb.
                var arrayLookup = { '01': 31, '03': 31, '04': 30, '05': 31, '06': 30, '07': 31, '08': 31, '09': 30, '1': 31, '3': 31, '4': 30, '5': 31, '6': 30, '7': 31, '8': 31, '9': 30, '10': 31, '11': 30, '12': 31 }
                // Get month day and year
                var intDay = parseInt(arrayDate[0], 10);
                var intMonth = parseInt(arrayDate[1], 10);
                var intYear = parseInt(arrayDate[2]);

                //check if month value and day value agree
                if (arrayLookup[intMonth] != null) {
                    if (intDay <= arrayLookup[intMonth] && intDay != 0) {
                        //found in lookup table, good date
                        return true;
                    }
                }

                //check for February
                if (intMonth == 2) {
                    if (intDay > 0 && intDay < 29) {
                        // Good date
                        return true;
                    }
                    else if (intDay == 29) {
                        if ((intYear % 4 == 0) && (intYear % 100 != 0) || (intYear % 400 == 0)) {
                            // year div by 4 and ((not div by 100) or div by 400) ->ok
                            // Good date
                            return true;
                        }
                    }
                }
            }
            //any other values, bad date
            return false;
        default:
            if (field.Field.value != field.Type.value) {
                return false;
            }
            else {
                return true;
            }
    }
}

