// Generic Validation Script
if (typeof window.addEvent !== 'function'){
    // addEvent - add an event to an object without overwriting existing events
    // Params - (object) Object Reference, (string) Event handler to attach to, (Ref) Function to run
    function addEvent(obj,evt,fn){
        if (typeof(obj)!="object"){obj = getElement(obj);}
        if (obj.addEventListener){obj.addEventListener(evt,fn,false);return true;}
        else if (obj.attachEvent){var ret = obj.attachEvent('on'+evt, fn);return ret;}
        else {return false;}
    }
}

// Standard check functions
function isRequired(el)
{
    switch (el.type)
    {
        case "text":
        case "textarea":
        case "password":
        case "select-one":
            if (el.value){ return true; }
            return false;
        case "radio":
            var radios = el.form[el.name];
			for (var i=0;i<radios.length;i++) {
				if (radios[i].checked) return true;
			}
			return false;
        case "checkbox":
            return el.checked;
    }
}
function isPattern(el,pat)
{
    var re = new RegExp(pat);
    if (el.value.match(re)){return true;}
    return false;
}
function isNumeric(el)
{
    return isPattern(el,"^[\\d\\s]+$");
}
function isEmail(el)
{
    return isPattern(el,"^.+@.+\\..+$");
}
function doNothing(){return true;}

// Base validation functions
function addValidation()
{
    forms = document.getElementsByTagName('form');
    for(i=0;i<forms.length;i++)
    {
        forms[i].onsubmit = runValidation;
    }
}

validationMessage = new Object();
validationMessage["required"] = "This field is required";
validationMessage["numeric"] = "This field must be a number";
validationMessage["email"] = "Invalid email address";

validationFunctions = new Object();
validationFunctions["required"] = isRequired;
validationFunctions["numeric"] = isNumeric;
validationFunctions["email"] = isEmail;

function runValidation()
{
    var formValid = true;
    var re = /validation_([^\s]+)/i;
    var els = this.elements;
    var errors = new Object();
    for (i=0;i<els.length;i++)
    {
        if (els[i].type==='submit') { continue; }
        var rules = els[i].getAttribute('class');
        if (rules==null) { var rules = els[i].getAttribute('className'); }
        if (!rules) { continue; }
        rules = rules.split(" ");
        for(j=0;j<rules.length;j++){
            var m = re.exec(rules[j]);
            if (m != null){
                if (!validationFunctions[m[1]]){
                    validationFunctions[m[1]] = doNothing;
                }
                var res = validationFunctions[m[1]](els[i]);
                if (!res){
                    showError(els[i],validationMessage[m[1]]);
                    formValid = false;
                }
            }
        }
    }
    if (!formValid){}
    return formValid;
}
function showError(el,msg)
{
    if (!el.errorNode){
        el.className += ' validation_error';
        el.onkeypress = removeError;
        var errorNode = document.createElement('label');
        errorNode.setAttribute('for', el.id);
        errorNode.setAttribute('htmlFor', el.id);
        errorNode.appendChild(document.createTextNode(msg));
        if (el.type=='textarea')
        {
            errorNode.className = 'validation_error_textarea';
	        el.parentNode.insertBefore(errorNode,el);
        }
        else
        {
	        errorNode.className = 'validation_error_message';
            el.parentNode.insertBefore(errorNode,el.nextSibling);
        }
        el.errorNode = el.parentNode.errorNode = errorNode;
    }
}
function removeError()
{
    this.className = this.className.replace(/\svalidation_error/, '');
    if (this.errorNode)
    {
        this.parentNode.removeChild(this.errorNode);
        this.errorNode = this.parentNode.errorNode = null;
    }
}
addEvent(window,'load',addValidation);











