/*
 * $Id:$
 *
 * This is a javascript file used for helping to validate forms and such.
 */

/*
 * Validate formElt - onfail will be called with the error message.
 * rules is a list of validation rules.
 */
function setupValidation(formElt, onfail, rules, onsuccess) {
    function lookup(nameOrElt) {
        if($(formElt).elements[nameOrElt]) {
            return $(formElt).elements[nameOrElt];
        } else if($(nameOrElt)) {
            return $(nameOrElt);
        } else {
            return onfail("Unknown form element: [" + nameOrElt + "]");
        }
    }

    $(formElt).onsubmit = function() {
        function fail(mesg) {
            onfail(mesg);
            return false;
        }
        function checkit(rules) {
            if(rules.length == 0) {
                if(onsuccess) {
                    return onsuccess($(formElt));
                } else {
                    return true;
                }
            }
            var first = rules.shift();
            return first(lookup, function() {
                             return checkit(rules)
                         }, fail);
        }
        return checkit(rules.clone());
    }
}


function requiredField(elt, what) {
    return function(lookup, ok, failed) {
        if(lookup(elt).value == '') {
            return failed(what + " is a required field");
        } else {
            return ok();
        }
    }
}


function integerField(elt, what) {
    return function(lookup, ok, failed) {
        if(lookup(elt).value == '' || lookup(elt).value.match(/^[0-9]+$/)) {
            return ok()
        } else {
            return failed(what + " needs to a be number");
        }
    }
}

function emailField(elt, what) {
    return function(lookup, ok, failed) {
        if(lookup(elt).value.match(/^[^@]+[@][^.]+[.][^.]+.*$/)) {
            return ok();
        } else {
            return failed(what + " is not a valid e-mail address");
        }
    };
}


function urlField(elt, what, formId) {
    if(formId) {
        var field = $(formId).elements[elt];
        field.onblur = function() {
            if(!this.value.match(/^http/)) {
                this.value = "http://" + this.value;
            }
        }
    }
    return function(lookup, ok, failed) {
        if(lookup(elt).value.match(/^http:\/\/[^.]+[.].*$/)) {
            return ok();
        } else {
            return failed(what + " is not a valid URL. It needs to start with http://");
        }
    };
}


function checkedField(elt, mesg) {
    return function(lookup, ok, failed) {
        var field = lookup(elt);
        if(field.checked) {
            return ok();
        } else {
            return failed(mesg);
        }
    }
} 


function selectedField(elt, empty, what) {
    return function(lookup, ok, failed) {
        var field = lookup(elt);
        var value = selectedValue(field, empty);
        if(value) {
            return ok();
        } else {
            return failed("You must select a value for " + what);
        }
    }
} 

function isFilledIn(elt) {
    return $(elt).value.trim() != '';
}

function isEmail(elt) {
    return isFilledIn($(elt)) && $(elt).value.trim().match(/^[^@,; ]+@[^.,; ]+[.][^.,; ]+.*/);
}