/**
 * Routines to validate a form.
 *
 * $Id:$
 *
 * Copyright (c) 2003,2005 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;

        // Fix up paste from word
        currValue = escape(currValue);
        currValue = currValue.replace(/%u201C/gi, "%22"); // Fix start "
		currValue = currValue.replace(/%u201D/gi, "%22"); // Fix end "
		currValue = currValue.replace(/%u2018/gi, "%27"); // Fix start '
		currValue = currValue.replace(/%u2019/gi, "%27"); // Fix end '
		currEl.value = currValue = unescape(currValue);

        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) && !/^https?:\/\/([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);
}

