/**********************************************************************
* vali.js : Slightly insane form validation                           *
* Reed Murphy                                                         *
* http://inflammablesoftware.info/                                    *
**********************************************************************/

function ltrim(string) {
    return string.replace(/^\s+/,"");
}

function rtrim(string) {
    return string.replace(/\s+$/,"");
}

function trim(string) {
    return string.replace(/^\s+|\s+$/g,"");
}

function extract_data_name(elementset) {
    var data;
    var name;
    if (elementset.length <= 0) {
        data = null;
        name = "";
    } else if (elementset.length == 1) {
        data = elementset[0].value;
        name = elementset[0].name;
    } else {
        name = elementset[0].name;
        switch (elementset[0].type) {
            case('radio'):
                for (var i = 0; i < elementset.length; i++) {
                    if (elementset[i].checked) {
                        data = elementset[i].value;
                    }
                }
            break;
            default:
                data = null;
            break;
        }
    }
    var result = Object();
    result.name = name;
    result.data = data;
    return result;
}

function check_rule(ruleset, elementset) {
    var required = false;
    var regex = new Array();
    var date = false;
    var message = "";
    var success = true;

    var x = extract_data_name(elementset);
    var data = x.data;
    var name = x.name;

    var ruleA = ruleset.split(';');
    for (var i = 0; i < ruleA.length; i++) {
        if (ruleA[i].indexOf(':') == -1) {
            var tag = ruleA[i];
            var arg = "";
        } else {
            var split = ruleA[i].split(':');
            var tag = split[0];
            var arg = split[1];
        }
        tag = trim(tag);
        arg = trim(arg);
        
        switch (tag) {
            case(''):
                add_error('Missing tag at index '+i+' for input set "'+name+'"');
                success = false;
            break;
            case('required'):
                required = true;
            break;
            case('optional'):
                required = false;
            break;
            case('regex'):
                regex.push(new RegExp(arg));
            break;
            case('email'):
                regex.push(new RegExp(/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/));
            break;
            case('date'):
            case('time'):
                date = true;
            break;
            case('mobile'):
                data = data.replace(/[\s+()]/g,'');
                regex.push(new RegExp(/^[0-9]{10,11}$/));
            case('phone'):
                data = data.replace(/[\s+()]/g,'');
                regex.push(new RegExp(/^[0-9]{8,11}$/));
            break;
            case('message'):
                message = arg;
            break;
            default:
                add_error('Unknown requirement "'+tag+'" for input set "'+name+'"');
                success = false;
            break;
        }
    }
    
    if (required && (data == "" || data == null)) {
        success = false;
        if (message == "")
            add_error(name+" is required.");
        else
            add_error(message);
    } else if (!required && (data == "" || data == null)) {
        success = true;
    } else {
        if (regex.length != 0) {
            for (var i = 0; i < regex.length; i++) {
                if(!data.match(regex[i])) {
                    success = false;
                    if (message == "")
                        add_error(name+" is invalid.");
                    else
                        add_error(message);
                    break;
                }
            }
        }
        if (date != false && isNaN(Date.parse(data))) {
            success = false;
            if (message == "")
                add_error(name+" is not a valid date / time.");
            else
                add_error(message);
        }
    }
    
    return success;
}

function add_error(string) {
    error += string;
    error += "<br />";
}

function show_error() {
    var errorBox = document.getElementById(errorBoxId);
    if(!errorBoxId || !errorBox) {
        error = error.replace(/<br \/>/g,"\n");
        alert(error);
    } else {
        errorBox.innerHTML = error;
    }
    error = "";
}

function unshow_error() {
    var errorBox = document.getElementById(errorBoxId);
    if (errorBox) {
        errorBox.innerHTML = "";
    }
}

function set_error(elementset) {
    for (var i = 0; i < elementset.length; i++)
        elementset[i].style.border = "thin solid red";
    elementset[0].focus();
}

function set_good(elementset) {
    for (var i = 0; i < elementset.length; i++)
        elementset[i].style.border = "thin solid lime";
}

function parse_form(theForm) {
    var q = new Object;
    var inputs = theForm.elements;
    for (var i = 0; i < inputs.length; i++) {    
        var name = inputs[i].name;
        if(!q[name]) {
            q[name] = new Array();
        }
        q[name].push(inputs[i]);
    }
    return q;
}

function vali_check(theForm) {
    unshow_error();
    var result = true;
    try {
        var inputs = parse_form(theForm);
        for (var name in vali_rules) {
//            alert(name + ":" + vali_rules[name]);
            if(!check_rule(vali_rules[name], inputs[name]))
                result = false;
            if (!result)
                set_error(inputs[name]);
            else
                set_good(inputs[name]);
        }
        show_error();
    } catch(e) {
        alert(e);
        result = false;
    }
    
//    alert("Returning: "+result);
    return result;
}
    
var vali_rules = new Object();
var errorBoxId = "";
var error = "";
