/*	
Form validation example :
	
validationTitle =		"Some errror title";
validationTypeFields =	
[
["validationType{data|length}","required{true|false}","dataType{string|number|email|phone|date|url|option|compare}","max length if validationType{int length}","field Name", "Validation title","errorClass"]
];

*/

function Validator(warningTitle) {
    var mValidationFieldsArray = new Array();

    this.Add = function(ValidationObject) {
        mValidationFieldsArray.push(new Array(ValidationObject.ValidationType, ValidationObject.Required, ValidationObject.DataType, ValidationObject.MaxLength, ValidationObject.Field, ValidationObject.FieldTitle, ValidationObject.ErrorClass));
    }

    this.AddObject = function(objectId, objectTitle) {
        var itemObject = new Object();

        itemObject.Field = objectId;
        itemObject.FieldTitle = objectTitle;

        return itemObject;
    }

    this.Validate = function() {
        var warningMessage = '';

        for (j = 0; j < mValidationFieldsArray.length; j++) {
            if (!IsFormFieldFilled(mValidationFieldsArray[j][4], mValidationFieldsArray[j][0], mValidationFieldsArray[j][1], mValidationFieldsArray[j][2], mValidationFieldsArray[j][3])) {
                if (mValidationFieldsArray[j][2] != "option" && mValidationFieldsArray[j][2] != "compare") {
                    try {
                        document.getElementById(mValidationFieldsArray[j][4]).className = mValidationFieldsArray[j][6];
                    }
                    catch (e) {
                        alert('Error: Validation Object "' + mValidationFieldsArray[j][4] + '" does not exist!');
                        return false;
                    }
                }


                if (mValidationFieldsArray[j][2] == "compare") {
                    var fieldItemArray = mValidationFieldsArray[j][4].split("#");
                    document.getElementById(fieldItemArray[0]).className = mValidationFieldsArray[j][6];
                    document.getElementById(fieldItemArray[1]).className = mValidationFieldsArray[j][6];
                }

                warningMessage += ' - ' + mValidationFieldsArray[j][5] + '\n';
            }
        }

        if (warningMessage != '') {

            alert(warningTitle + '\n\n' + warningMessage);
            return false;
        }
        return true;
    }

    function Trim(inputString) {
        while (inputString.substring(0, 1) == ' ') {
            inputString = inputString.substring(1, inputString.length);
        }
        while (inputString.substring(inputString.length - 1, inputString.length) == ' ') {
            inputString = inputString.substring(0, inputString.length - 1);
        }
        return inputString;
    }

    function IsFormFieldFilled(formFieldId, validationType, required, dataType, maxLength) {

        if (validationType == "data") {
            //string|number|email|phone|date|url|option|compare
            switch (dataType) {
                case "string":

                    try {
                        if (document.getElementById(formFieldId).value.length <= 50) {
                            if (!document.getElementById(formFieldId).disabled && required) {
                                return (Trim(document.getElementById(formFieldId).value) != '');
                            }
                            else return true;
                        }
                        else return false;
                    }
                    catch (e) {
                        alert('Error: Object "' + formFieldId + '" does not exist!');
                        return false;
                    }

                    return true;
                    break;
                case "number":
                    try {
                        if (!document.getElementById(formFieldId).disabled) {
                            if (required) {
                                return (Trim(document.getElementById(formFieldId).value) != '' && !isNaN(Trim(document.getElementById(formFieldId).value)));
                            }
                            else {
                                if (Trim(document.getElementById(formFieldId).value) != '') {
                                    return (!isNaN(Trim(document.getElementById(formFieldId).value)));
                                }
                            }
                        }
                    }
                    catch (e) {
                        alert('Error: Object "' + formFieldId + '" does not exist!');
                        return false;
                    }

                    return true;
                    break;
                case "email":
                    try {
                        if (document.getElementById(formFieldId).value.length <= maxLength) {
                            if (!document.getElementById(formFieldId).disabled) {
                                var emailRegxp = /^([\w]+)(.[\w]+)*@([\w]+)(.[\w]{2,5}){1,6}$/;

                                if (required) {
                                    return (Trim(document.getElementById(formFieldId).value) != '' && emailRegxp.test(Trim(document.getElementById(formFieldId).value)));
                                }

                                else {
                                    if (Trim(document.getElementById(formFieldId).value) != '') {
                                        return (emailRegxp.test(Trim(document.getElementById(formFieldId).value)));
                                    }
                                }
                            }
                        }
                        else return false;
                       
                    }
                    catch (e) {
                        alert('Error: Object "' + formFieldId + '" does not exist!');
                        return false;
                    }

                    return true;
                    break;
                case "date":
                    try {
                        if (!document.getElementById(formFieldId).disabled) {
                            var dateRegExPattern = /^((((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$/;

                            objDateField = Trim(document.getElementById(formFieldId).value);

                            if (required) {
                                return (Trim(document.getElementById(formFieldId).value) != '' && objDateField.match(dateRegExPattern) && objDateField.length == 10 && objDateField.indexOf('/') == -1 && objDateField.indexOf('-') == -1 && objDateField.indexOf('/') == -1 && objDateField.indexOf('.') != -1);
                            }
                            else {
                                if (Trim(document.getElementById(formFieldId).value) != '') {
                                    return (objDateField.match(dateRegExPattern) && objDateField.length == 10 && objDateField.indexOf('/') == -1 && objDateField.indexOf('-') == -1 && objDateField.indexOf('/') == -1 && objDateField.indexOf('.') != -1);
                                }
                            }
                        }
                    }
                    catch (e) {
                        alert('Error: Object "' + formFieldId + '" does not exist!');
                        return false;
                    }

                    return true;
                    break;
                case "url":
                    try {
                        if (!document.getElementById(formFieldId).disabled) {
                            var urlRegxp = "^http://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$";
                            matchURL = document.getElementById(formFieldId).value.match(urlRegxp);

                            if (required) {
                                return (Trim(document.getElementById(formFieldId).value) != '' && matchURL != null);
                            }
                            else {
                                if (Trim(document.getElementById(formFieldId).value) != '') {
                                    return (matchURL != null);
                                }
                            }
                        }
                    }
                    catch (e) {
                        alert('Error: Object "' + formFieldId + '" does not exist!');
                        return false;
                    }

                    return true;
                    break;
                case "option":
                    try {
                        var fieldItems = formFieldId.split('#');

                        for (i = 0; i < fieldItems[1]; i++) {
                            fieldName = fieldItems[0] + "_" + (i + 1);
                            if (!document.getElementById(fieldName).disabled) {
                                if (document.getElementById(fieldName).checked) {
                                    return true;
                                }
                            }
                            else {
                                return true;
                            }
                        }
                    }
                    catch (e) {
                        alert('Error: Object "' + formFieldId + '" does not exist!');
                    }
                    return false;
                    break;

                case "radio":

                    var fieldItems = formFieldId.split('#');
                    
                    for (i = -1; i < fieldItems.length; i++) {                        
                        var fieldName = fieldItems + "_" + (i + 1);
                        
                        if (!document.getElementById(fieldName).disabled) {
                            if (document.getElementById(fieldName).checked) {
                                return true;
                            }                            
                        }
                        else {
                            return true;
                        }
                    }

                    return false;
                    break;  
                    
                    
                case "compare":
                    try {
                        fieldItems = formFieldId.split("#");
                        if (!document.getElementById(fieldItems[0]).disabled && !document.getElementById(fieldItems[1]).disabled && (document.getElementById(fieldItems[0]).value != '' || document.getElementById(fieldItems[1]).value != '')) {
                            return (Trim(document.getElementById(fieldItems[0]).value) == Trim(document.getElementById(fieldItems[1]).value));
                        }
                        else {
                            return true;
                        }
                    }
                    catch (e) {
                        alert('Error: Object "' + formFieldId + '" does not exist!');
                        return false;
                    }
                    break;
            }
        }

        if (validationType == "length") {
            try {
                if (!document.getElementById(formFieldId).disabled && document.getElementById(formFieldId).value.indexOf('#') == -1) {
                    return (document.getElementById(formFieldId).value.length <= maxLength);
                }
            }
            catch (e) {
                alert('Error: Object "' + formFieldId + '" does not exist!');
                return false;
            }

            return true;
        }
    }
}