/**
 * Routines to validate a form.
 * 
 * $Id:$
 * 
 * Copyright (c) 2003,2004 TOLRA Micro Systems Limited. All rights reserved.
 * 
 * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

function validateForm(theForm) {

    var errMsg = "There are problems with the following field(s):\n\n";

    var formEls = theForm.elements;
    var validated = true;

    for(var i=0;i<formEls.length;i++) {
        var currEl = formEls[i];
        var currName = currEl.name;
        var currValue = currEl.value;

        if(currName) {
            // Get the fields
            var fields = currName.split(/__/);
            currName = fields[0].replace(/_/g, " ");
            fields = fields.length > 1 ? fields[1].split(/[_\[\]]/) : "";
    
            switch(currEl.type.toLowerCase()) {
            case "text":
            case "textarea":
            case "password":
    
                for(var n=0;n<fields.length;n++) {
                    var f = fields[n].toLowerCase();
    
                    if(f == "req") {
                        if(!/\S/.test(currValue)) {
                            errMsg += "The required field \"" + currName + "\" was left blank.\n";
                            validated = false;
                        }
                    }
                    else if(f == "alpha") {
                        if(/[^a-z -\.\,]/i.test(currValue)) {
                            errMsg += "The field \"" + currName + "\" contains illegal characters.\n";
                            validated = false;
                        }
                    }
                    else if(f == "alphanum") {
                        if(/[^\w -\.\,]/i.test(currValue)) {
                            errMsg += "The field \"" + currName + "\" contains illegal characters.\n";
                            validated = false;
                        }
                    }
                    else if(f == "nospace") {
                        if(/\s/.test(currValue)) {
                            errMsg += "The field \"" + currName + "\" must not contain any spaces.\n";
                            validated = false;
                        }
                    }
                    else if(f == "int") {
                        if(/\D/.test(currValue)) {
                            errMsg += "The field \"" + currName + "\" can only contain digits 0-9.\n";
                            validated = false;
                        }
                    }
                    else if(f == "dec") {
                        if(!/^\d*(\.\d+)?$/.test(currValue)) {
                            errMsg += "The value entered in the field \"" + currName + "\" is not a number.\n";
                            validated = false;
                        }
                    }
                    else if(f == "email") {
                        if(!/^[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}$/i.test(currValue)) {
                            errMsg += "The field \"" + currName + "\" does not contain a valid email address.\n";
                            validated = false;
                        }
                    }
                    else if(f.indexOf("min") == 0) {
                        var m = parseInt(f.split("min")[1]);
                        if(currValue.length < m) {
                            errMsg += "The field \"" + currName + "\" must contain at least " + m + " characters.\n";
                            validated = false;
                        }
                    }
                    else if(f.indexOf("max") == 0) {
                       var m = parseInt(f.split("max")[1]);
                       if(currValue.length > m) {
                           errMsg += "The field \"" + currName + "\" must contain at most " + m + " characters.\n";
                           validated = false;
                       }
                    }
                    else if(f == "url") {
                        if(/\S/.test(currValue) && !/^http:\/\/([a-z0-9\-]+\.)+[a-z0-9\.\?&=~, %#_\-\/]+(\.[a-z0-9\.\?&=~, %#_\-]+)?$/i.test(currValue)) {
                            errMsg += "The field \"" + currName + "\" is not a valid URL.\n";
                            validated = false;
                        }
                    }
                    else if(f == "txt") {
                        if(/[^\w\n\r \.\,<>\?\/\|\\!"£$%\^&\*\(\)\+-=`\{\}\[\]:;@'~#€]/.test(currValue)) {
                            errMsg += "The field \"" + currName + "\" contains illegal characters.\n";
                            validated = false;
                        }
                    }
                }
                break;
    
            case "checkbox":
                var tmp = 0;
                var c = 0;
                for(var n=0;n<theForm[currEl.name].length;n++) {
                    if(theForm[currEl.name][n].checked)
                        tmp++;
                    c++;
                }
                if(c) i+=c-1;
    
                for(var n=0;n<fields.length;n++) {
                    var f = fields[n].toLowerCase();
        
                    if(f.indexOf("min") == 0) {
                        var m = parseInt(f.split("min")[1]);
                        if(tmp < m) {
                            errMsg += "You must check at least " + m + " of the \"" + currName + "\" checkboxes.\n";
                            validated = false;
                        }
                    }
                    else if(f.indexOf("max") == 0) {
                        var m = parseInt(f.split("max")[1]);
                        if(tmp > m) {
                            errMsg += "You must check no more than " + m + " of the \"" + currName + "\" checkboxes.\n";
                            validated = false;
                        }
                    }
                }
    
                break;
    
            case "radio":
                var tmp = false;
                var c = 0;
                for(var n=0;n<theForm[currEl.name].length;n++) {
                    if(theForm[currEl.name][n].checked)
                        tmp = true;
                    c++;
                }
                if(c) i+=c-1;
    
                for(var n=0;n<fields.length;n++) {
                    var f = fields[n].toLowerCase();
                    if(f == "rbreq") {
                        if(!tmp) {
                            errMsg += "You must select one of the \"" + currName + "\" radio buttons.\n";
                            validated = false;
                        }
                    }
                }
                break;
    
            case "select-one":
                for(var n=0;n<fields.length;n++) {
                    var f = fields[n].toLowerCase();
                    if(f == "opreq") {
                        if(currEl.selectedIndex == -1) {
                            errMsg += "You must select one of the \"" + currName + "\" options.\n";
                            validated = false;
                        }
                    }
                }
                break;
    
            case "select-multiple":
                var tmp = 0;
                for(var n=0;n<theForm[currEl.name].length;n++) {
                    if(theForm[currEl.name][n].selected)
                        tmp++;
                }
    
                for(var n=0;n<fields.length;n++) {
                    var f = fields[n].toLowerCase();
        
                    if(f.indexOf("min") == 0) {
                        var m = parseInt(f.split("min")[1]);
                        if(tmp < m) {
                            errMsg += "You must select at least " + m + " of the \"" + currName + "\" options.\n";
                            validated = false;
                        }
                    }
                    else if(f.indexOf("max") == 0) {
                        var m = parseInt(f.split("max")[1]);
                        if(tmp > m) {
                            errMsg += "You must select no more than " + m + " of the \"" + currName + "\" options.\n";
                            validated = false;
                        }
                    }
                }
    
                break;
            }
        }
    }

    if(!validated)
        alert(errMsg);

    return(validated);
}
