﻿/* 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;
    
    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;

        return false;
    }

    o.disabled = false;
    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;
            }
    }
}
