﻿/* 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);
    }
    this.Remove=function(obj)
    {
        for(fpos in this) {
            if (this[fpos].Field && this[fpos].Field.id == obj.id) {
                this.splice(fpos, 1);
                break;
            }
        }
    }
}
    
function Field(fField,fRequired,fType,fError)
{
    this.Field=fField;
    this.Required=fRequired;
    this.Type=fType;
    this.Error=fError;
}

/*
    Helpers
*/
function showhelper(o)
{
    document.getElementById("hlp" + o.id.replace(formcid + "_", "")).innerHTML = o.title;
    document.getElementById("hlp" + o.id.replace(formcid + "_", "")).className = "show";
    if (document.getElementById("hlp" + o.id.replace(formcid + "_", "")).parentNode.className != "fieldsethelp fixed") {
        document.getElementById("hlp" + o.id.replace(formcid + "_", "")).parentNode.className = "fieldsethelp on";
    }
    var pdiv = document.getElementById("hlp" + o.id.replace(formcid + "_", "")).parentNode;
    while(pdiv.tagName != "DIV") {
        pdiv = pdiv.parentNode;
    }
    pdiv.className = pdiv.className.replace(" hidden", "");
}

function hidehelper(o)
{
    if (document.getElementById("hlp" + o.id.replace(formcid + "_", "")).className != "fixed") {
        document.getElementById("hlp" + o.id.replace(formcid + "_", "")).innerHTML = "";
        document.getElementById("hlp" + o.id.replace(formcid + "_", "")).className = "";
        if (document.getElementById("hlp" + o.id.replace(formcid + "_", "")).parentNode.className != "fieldsethelp fixed") {
            document.getElementById("hlp" + o.id.replace(formcid + "_", "")).parentNode.className = "fieldsethelp";
        }
    }
    var pdiv = document.getElementById("hlp" + o.id.replace(formcid + "_", "")).parentNode;
    while(pdiv.tagName != "DIV") {
        pdiv = pdiv.parentNode;
    }
    pdiv.className += " hidden";
}

function showroaminghelp(o, fid)
{
    // Show text
    document.getElementById("roaminghelp").innerHTML = document.getElementById(fid).title;
    document.getElementById("roaminghelp").className = "";
    var rwidth, pwidth;
    if (document.getElementById("roaminghelp").style.pixelWidth) {
        rwidth = document.getElementById("roaminghelp").style.pixelWidth;
        pwidth = o.parentNode.style.pixelWidth;
    } else {
        rwidth = document.getElementById("roaminghelp").offsetWidth;
        pwidth = o.parentNode.offsetWidth;
    }

    // Set position
    document.getElementById("roaminghelp").setAttribute("style", "top: " + (o.offsetTop + 20) + "px; right: " + (pwidth - o.offsetLeft) + "px")
   // document.getElementById("roaminghelp").setAttribute("style", "top: 100px; left: 100px")
}

function hideroaminghelp()
{
    document.getElementById("roaminghelp").innerHTML = "";
    document.getElementById("roaminghelp").className = "hidden";
}
/*
    Key Press
*/
function keypressmanager(objEvent, func) {

    var iKeyCode, strKey;

    if (isIE) {
        iKeyCode = objEvent.keyCode;
    }
    else {
        iKeyCode = objEvent.which; 
    }

    if (iKeyCode == 13) {
        eval(func);
        return false;
    }
    
    return true;

}

/*
    Validation
*/

validationCollection = new CreateCollection("FieldCollection");

function validate()
{
    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())

        return false;
    }

    return true;
}

function validatefield(field)
{
    // Check required first
    if (field.Required && field.Type == "checkbox") {
        // Get the checkbox name
        var cbnamearr = field.Field.name.split("$");
        var cbname = cbnamearr[cbnamearr.length - 1];
        cbname = "_" + cbname.replace(field.Field.title.replace(/\s/g, "_").replace(":", ""), "");
        // Check for a checked box
        var cboxes = document.getElementsByTagName("input");
        for (var i = 0; i < cboxes.length; i++) {
            if (cboxes[i].id.indexOf(cbname) > -1 && cboxes[i].checked == true) {
                return true;
            }
        }
        // None checked so return false
        return false;
    }
    if (field.Required && field.Field.value == "") {
        return false;
    }
    else if(!field.Required && field.Field.value == "") {
        return true;
    }

    // Check min characters
    if (field.Type.type == undefined && field.Type.substring(0, 3) == "min") {
        if (field.Field.value.length < parseInt(field.Type.substring(4, field.Type.length))) {
            return false;
        }
        else {
            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 "emailmemo":
            var objRegExp = /^.+@[^\.].*\.[a-z]{2,}$/;
            //check for format for each line
            var emaillines;
            if (field.Field.value.indexOf("\r\n") > -1) {
                emaillines = field.Field.value.split("\r\n");
            }
            else {
                emaillines = field.Field.value.split("\n");
            }
            for (var i = 0; i < emaillines.length; i++) {
                if (!objRegExp.test(emaillines[i])) {
                    return false;
                }
            }
            return true;
	    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;
            }
    }
}

function ValidateItem(ftype, fvalue)
{
    switch(ftype)
    {
	    case "text":
            return true;
	    case "integer":
	        var objRegExp = /(^-?\d\d*$)/;
            //check for integer characters
            return objRegExp.test(fvalue);
	    case "decimal":
            var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
            //check for numeric characters
            return objRegExp.test(fvalue);
	    case "currency":
            var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
            //check for numeric characters
            return objRegExp.test(fvalue);
	    case "email":
            var objRegExp = /^.+@[^\.].*\.[a-z]{2,}$/;
            //check for format
            return objRegExp.test(fvalue);
	    case "emailmemo":
            var objRegExp = /^.+@[^\.].*\.[a-z]{2,}$/;
            //check for format for each line
            var emaillines;
            if (field.Field.value.indexOf("\r\n") > -1) {
                emaillines = field.Field.value.split("\r\n");
            }
            else {
                emaillines = field.Field.value.split("\n");
            }
            for (var i = 0; i < emaillines.length; i++) {
                if (!objRegExp.test(emaillines[i])) {
                    return false;
                }
            }
            return true;
	    case "date":
            var objRegExp;
            var dValue = fvalue;
            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;
    }
} 