﻿var Validation =
{
    rules:
    {
        valRequired: /./,
        valTel: /^[\d\s]+$/,
        valEmail: /^$|^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$/, //Changed so that the validation is optional. Therefore if no email address is entered, it does match. (Curtis -- 26/07/2010)
        valDate: /^[0-3][0-9]\/([0][1-9]|[1][0-2])\/[1-2][0-9]{3}$/,
        valUrl: /^$|^(http:\/\/).+$/ //Changed so that the validation is optional. Therefore if no URL is entered, it does match. (Curtis -- 26/07/2010)
    },

    errors:
    {
        valRequired: 'Oops! You forgot to fill out this field!',
        valTel: 'Please enter a valid telephone number',
        valEmail: 'Please enter a valid email address',
        valDate: 'Please enter a valid date (DD/MM/YYYY)',
        valUrl: 'URL must begin with http://',
        valMax: 'Oops! Maximum of {maxchars} characters!' //This doesn't have a matching 'rule' regular expression
    },

    init: function ()
    {
        var send_button = $(".send_button")[0];
        $(send_button).bind("click", Validation.validate);
    },

    validate: function (event)
    {

        var FormContainers = $(".FormContainer");

        for (var h = 0, hh = FormContainers.length; h < hh; h++)
        {
            var fields = FormContainers[h].childNodes;

            for (var i = 0, ii = fields.length; i < ii; i++) {
                if (fields[i].nodeType == 1 && fields[i].tagName.toLowerCase() == "p") {
                    var inputs = fields[i].childNodes;

                    for (var j = 0, jj = inputs.length; j < jj; j++) {

                        if ((typeof (inputs[j]) != "undefined") && (inputs[j].nodeType == 1) && (inputs[j].tagName.toLowerCase() == "input" || inputs[j].tagName.toLowerCase() == "select" || inputs[j].tagName.toLowerCase() == "textarea")) {
                            if (inputs[j].tagName.toLowerCase() == "input" || inputs[j].tagName.toLowerCase() == "textarea") {
                                var className = inputs[j].className;

                                // Stores the full className so that it can be put back in when an error is found
                                var origClassName = className;

                                var classRegExp = /(^| )(\S+)( |$)/;
                                var classResult;

                                while (classResult = classRegExp.exec(className)) {
                                    var oneClass = classResult[2];
                                    var rule = Validation.rules[oneClass];

                                    if (typeof rule != "undefined") {
                                        if ((!rule.test(inputs[j].value)) || ((oneClass == "valRequired") && ($(inputs[j]).hasClass("textbox_watermark")) && ($(inputs[j]).hasClass("watermark")))) {
                                            Validation.highlight(inputs[j], Validation.errors[oneClass]);

                                            inputs[j].className = origClassName;
                                            event.preventDefault();
                                            return;
                                        }
                                        else {
                                            Validation.removeHightlight(inputs[j]);
                                        }
                                    }
                                    else if (oneClass.indexOf("valMax") > -1) {
                                        var maxChars = oneClass.replace("valMax", "");

                                        if (inputs[j].value.length > maxChars) {
                                            Validation.highlight(inputs[j], (Validation.errors['valMax']).replace("{maxchars}", maxChars));

                                            inputs[j].className = origClassName;
                                            event.preventDefault();
                                            return;
                                        }
                                        else {
                                            Validation.removeHightlight(inputs[j]);
                                        }
                                    }

                                    className = className.replace(oneClass, '');
                                }
                            }
                            else if (inputs[j].tagName.toLowerCase() == "select" && $(inputs[j]).hasClass("valRequired")) {
                                if (inputs[j].selectedIndex == 0) {
                                    Validation.highlight(inputs[j], Validation.errors['valRequired']);

                                    event.preventDefault();
                                    return;
                                }
                                else {
                                    Validation.removeHightlight(inputs[j]);
                                }
                            }

                        }

                    }
                }
            }
        }
        
    },

    highlight: function (input, errorMessage)
    {
        var inputParent = input.parentNode;

        input.focus();
        if ($(inputParent).hasClass("valError") == false)
        {
            inputParent.className += " valError";

            var errorBox = document.createElement("span");
            errorBox.className = "valError";
            var errorText = document.createTextNode(errorMessage);

            errorBox.appendChild(errorText);
            inputParent.appendChild(errorBox);
        }
        else
        {
            inputParent.childNodes[inputParent.childNodes.length - 1].innerText = errorMessage;
        }

    },

    removeHightlight: function (input)
    {
        var inputParent = input.parentNode;

        if ($(inputParent).hasClass("valError") == true) 
        {
            $(inputParent).removeClass("valError");

            var errorBox = inputParent.lastChild;
            inputParent.removeChild(errorBox);
        }
    }
}

Validation.init();
