  if (typeof fvalidate == "undefined") {
        var fvalidate = new Object;
    }
    fvalidate.addEvent = function (obj, evt, fn, useCapture) {if (typeof obj.attachEvent != "undefined") {obj.attachEvent("on" + evt, fn);} else if (typeof obj.attachEventListener != "undefined") {obj.addEventListener(evt, fn, Boolean(useCapture));}};
    fvalidate.addEvents = function (obj, evts, fn, useCapture) {var i = 0, evt;while (evt = evts[i++]) {this.addEvent(obj, evt, fn, Boolean(useCapture));}};

    function validateForm(f, bConfirm, bDisable, bDisableR, groupError, errorMode) {
        bConfirm = Boolean(bConfirm);
        bDisable = Boolean(bDisable);
        bDisableR = Boolean(bDisableR);
        groupError = Boolean(groupError);
        errorMode = (typeof errorMode != "undefined") ? parseInt(errorMode, 10) : 0;
        var params, fvCode, type;
        if (typeof f.fv == "undefined") {
            f.fv = new fValidate(f, errorMode, groupError);
        } else {
            f.fv._reset();
            f.fv.errorMode = errorMode;
        }
        var elem, i = 0, attr = f.fv.config.code;
        while (elem = f.elements[i++]) {
            if (elem.nodeName == "FIELDSET") {
                continue;
            }
            fvCode = elem[attr] ? elem[attr] : elem.getAttribute(attr);
            if (!(typeof fvCode == "undefined" ||
                fvCode == null || fvCode == "")) {
                params = fvCode.split("|");
                type = params[0];
                elem.validated = true;
                if (typeof f.fv[type] == "undefined") {
                    f.fv.devError([type, elem.name], "notFound");
                    return false;
                }
                switch (params.last()) {
                  case "bok":
                    params = params.reduce(1, 1);
                    elem.bok = true;
                    break;
                  case "if":
                    params = params.reduce(1, 1);
                    elem._if_ = true;
                    break;
                  case "then":
                    params = params.reduce(1, 1);
                    elem._then_ = true;
                    break;
                  default:
                    params = params.reduce(1, 0);
                }
                if (/radio|checkbox/.test(elem.type)) {
                    elem.group = f.elements[elem.name];
                }
                if (typeof elem.fName == "undefined") {
                    if (typeof elem.group != "undefined") {
                        for (var j = 0; j < elem.group.length; j++) {
                            if (f.fv.config.clearEvent != null) {
                                addEvent(elem.group.item(j), f.fv.config.clearEvent, f.fv, "revertError", false);
                            }
                        }
                    } else {
                        addEvent(elem, f.fv.config.clearEvent, f.fv, "revertError", false);
                    }
                }
                elem.fName = elem.name.format();
                f.fv.elem = elem;
                f.fv.type = type;
                var func = new Function("obj", "method", "obj[method]( " + params.toArgString() + " );");
                func(f.fv, type);
                if (elem.validated == false && groupError == false) {
                    return false;
                }
                if (elem.validated == true) {
                    f.fv.revertError();
                }
            }
        }
        if (groupError) {
            f.fv.showGroupError();
        }
        if (f.fv.errors.length > 0) {
            return false;
        }
        if (bConfirm && !confirm(f.fv.config.confirmMsg)) {
            if (f.fv.config.confirmAbortMsg != "") {
                alert(f.fv.config.confirmAbortMsg);
            }
            return false;
        }
        if (bDisable) {
            if (typeof f.fv.config.submitButton == "object") {
                var sb, j = 0;
                while (sb = f.fv.config.submitButton[j++]) {
                    if (f.fv.elementExists(sb)) {
                        f.elements[sb].disabled = true;
                    }
                }
            } else if (f.fv.elementExists(f.fv.config.submitButton)) {
                f.elements[f.fv.config.submitButton].disabled = true;
            }
        }
        if (bDisableR && f.fv.elementExists(f.fv.config.resetButton)) {
            f.elements[f.fv.config.resetButton].disabled = true;
        }
        return true;

        function addEvent(elem, evt, obj, method, capture) {
            var self = elem;
            if (typeof elem.attachEvent != "undefined") {
                elem.attachEvent("on" + evt, function () {obj[method](self);});
            } else if (typeof elem.addEventListener != "undefined") {
                elem.addEventListener(evt, function () {obj[method](self);}, capture);
            } else if (f.fv.config.eventOverride) {
                eleme["on" + evt] = function () {obj[method](self);};
            }
        }

    }


    function fValidate(f, errorMode, groupError) {
        var self = this;
        this.form = f;
        this.errorMode = errorMode;
        this.groupError = groupError;
        this.errors = new Array;
        this.validated = true;
        this.config = new fValConfig;
        this.i18n = fvalidate.i18n;
        f.onreset = function () {var elem, i = 0;while (elem = this.elements[i++]) {self.revertError(elem);}};
        addLabelProperties();

        function addLabelProperties() {
            if (typeof f.getElementsByTagName == "undefined") {
                return;
            }
            var labels = f.getElementsByTagName("label");
            var label, i = j = 0;
            var elem;
            while (label = labels[i++]) {
                if (typeof label.htmlFor == "undefined") {
                    return;
                }
                elem = f.elements[label.htmlFor];
                if (typeof elem == "undefined") {
                    self.devError([label.htmlFor], "noLabel");
                } else if (typeof elem.label != "undefined") {
                    continue;
                } else if (typeof elem.length != "undefined" &&
                    elem.length > 1 && elem.nodeName != "SELECT") {
                    for (j = 0; j < elem.length; j++) {
                        elem.item(j).label = label;
                    }
                }
                elem.label = label;
            }
        }

    }

    fValidate.prototype._reset = function () {this.errors = new Array;this.showErrors = new Array;};
    fValidate.prototype.elementExists = function (elemName) {return Boolean(typeof this.form.elements[elemName] != "undefined");};
    fValidate.prototype.throwError = function (args, which) {var elem = this.elem;if (typeof elem.name == "undefined") {elem = elem[0];}if (elem.bok && this.isBlank()) {elem.validated = true;return;}if (elem.cv) {return;}elem.validated = false;which = this.setArg(which, 0);args = this.setArg(args, []);emsgElem = (typeof this.elem.getAttribute == "undefined") ? this.elem[0] : this.elem;if (emsgElem.getAttribute(this.config.emsg)) {var error = emsgElem.getAttribute(this.config.emsg);}var error = this.translateMessage(args, this.i18n.errors[this.type][which]);if (this.groupError) {this.errors.push({elem: elem, msg: error});} else {this.showError(error, false, emsgElem);var focusElem = (typeof elem.fields != "undefined") ? elem.fields[0] : elem;this.selectFocus(focusElem);}};
    fValidate.prototype.showError = function (emsg, last, elem) {var self = this, elem = this.setArg(elem, this.elem), isHidden = Boolean(elem.type == "hidden"), label = isHidden ? null : elem.label || null, emsg = elem.getAttribute(this.config.emsg) ? elem.getAttribute(this.config.emsg).replace(/\\n/g, "\n") : emsg, errorClass = this.config.errorClass, singleCSS = this.config.useSingleClassNames;if (typeof this.showErrors == "undefined") {this.showErrors = new Array;}switch (this.errorMode) {case 0:alertError();break;case 1:inputError();break;case 2:labelError();break;case 3:appendError();break;case 4:boxError();break;case 5:inputError();labelError();break;case 6:inputError();appendError();break;case 7:inputError();boxError();break;case 8:inputError();alertError();break;case 9:labelError();appendError();break;case 10:labelError();boxError();break;case 11:labelError();alertError();break;case 12:appendError();boxError();break;case 13:appendError();alertError();break;case 14:boxError();alertError();break;case 15:inputError();labelError();appendError();break;case 16:inputError();labelError();boxError();break;case 17:inputError();labelError();alertError();break;case 18:inputError();appendError();boxError();break;case 19:inputError();appendError();alertError();break;case 20:inputError();boxError();alertError();break;case 21:labelError();appendError();boxError();break;case 22:labelError();appendError();alertError();break;case 23:appendError();boxError();alertError();break;case 24:inputError();labelError();appendError();boxError();break;case 25:inputError();labelError();appendError();alertError();break;case 26:inputError();appendError();boxError();alertError();break;case 27:labelError();appendError();boxError();alertError();break;case 28:inputError();labelError();appendError();boxError();alertError();break;default:;}
function alertError() {if (self.groupError) {self.showErrors.push(emsg);} else {alert(emsg);}if (last) {alert(self.i18n.groupAlert + self.showErrors.join("\n\n- "));}}


function inputError() {if (typeof elem.length != "undefined" && elem.length > 1 && elem.nodeName != "SELECT" || isHidden) {var subelem, i = 0;while (subelem = isHidden ? elem.fields[i++] : elem.item(i++)) {if (subelem.className != "" && singleCSS) {subelem.revertClass = subelem.className;subelem.className = errorClass;} else {self.addCSSClass(subelem, errorClass);}}} else {if (singleCSS) {elem.revertClass = elem.className;elem.className = errorClass;} else {self.addCSSClass(elem, errorClass);}}}


function labelError() {if (label == null) {return;}if (self.config.useSingleClassNames) {label.className = errorClass;} else {self.addCSSClass(label, errorClass);}}


function appendError() {if (label == null || typeof label.innerHTML == "undefined") {return;}if (typeof label.original == "undefined") {label.original = label.innerHTML;}label.innerHTML = label.original + " - " + emsg.toHTML();}


function boxError() {if (typeof self.boxError == "undefined") {self.boxError = document.getElementById(self.config.boxError);}if (self.boxError == null) {self.devError([self.config.boxError], "noBox");return;}if (typeof self.elem.name == "undefined" || self.elem.name == "") {self.devError([self.elem[self.config.code]], "missingName");return;}var errorId = self.config.boxErrorPrefix + self.elem.name, errorElem;if (errorElem = document.getElementById(errorId)) {errorElem.firstChild.nodeValue = emsg.toHTML();} else {errorElem = document.createHTMLElement("li", {id: errorId, innerHTML: emsg.toHTML(), title: self.i18n.boxToolTip});self.boxError.appendChild(errorElem);errorElem.onclick = function () {var elem = self.form.elements[this.id.replace(self.config.boxErrorPrefix, "")];if (typeof elem.fields != "undefined") {elem = elem.fields[0];}if (typeof elem.select != "undefined") {elem.select();}if (typeof elem.focus != "undefined") {elem.focus();}};}self.boxError.style.display = "block";}

};
    fValidate.prototype.removeCSSClass = function (elem, className) {elem.className = elem.className.replace(className, "").trim();};
    fValidate.prototype.addCSSClass = function (elem, className) {this.removeCSSClass(elem, className);elem.className = (elem.className + " " + className).trim();};
    fValidate.prototype.showGroupError = function () {for (var error, firstElem, i = 0; (error = this.errors[i]); i++) {if (i == 0) {firstElem = error.elem;}this.elem = error.elem;this.showError(error.msg, Boolean(i == this.errors.length - 1));}};
    fValidate.prototype.revertError = function (elem) {elem = this.setArg(elem, this.elem);var isHidden = Boolean(elem.type == "hidden"), errorClass = this.config.errorClass, i = 0, errorElem, subelem;if (typeof elem.length != "undefined" && elem.length > 1 && elem.nodeName != "SELECT" || isHidden) {if (isHidden && typeof elem.fields != "undefined") {while (subelem = isHidden ? elem.fields[i++] : elem.item(i++)) {if (typeof subelem.revertClass != "undefined") {subelem.className = subelem.revertClass;}}}} else {if (this.config.useSingleClassNames) {if (typeof subElement.revertClass != "undefined") {elem.className = elem.revertClass;}} else {this.removeCSSClass(elem, errorClass);}}if (typeof elem.label != "undefined") {if (this.config.useSingleClassNames) {elem.label.className = "";} else {this.removeCSSClass(elem.label, errorClass);}elem.label.innerHTML = elem.label.original || elem.label.innerHTML;}if (typeof this.boxError != "undefined") {if (typeof this.boxError.normalize != "undefined") {this.boxError.normalize();}if (errorElem = document.getElementById(this.config.boxErrorPrefix + elem.name)) {this.boxError.removeChild(errorElem);}if (this.boxError.childNodes.length == 0) {this.boxError.style.display = "none";}}};
    fValidate.prototype.selectFocus = function (elem) {if (typeof elem.select != "undefined") {elem.select();}if (typeof elem.focus != "undefined") {elem.focus();}};
    fValidate.prototype.typeMismatch = function () {var pats = {text: "text|password|textarea", ta: "textarea", hidden: "hidden", s1: "select-one", sm: "select-multiple", select: "select-one|select-multiple", rg: "radio", radio: "radio", cb: "checkbox", file: "file"};var fail = false, expected = new Array, result = key = type = regex = "";for (var i = 0; i < arguments.length; i++) {type = pats[arguments[i]];regex = new RegExp(type);result += regex.test(this.elem.type) ? "1" : "0";key += "0";expected.push(type);}if (key ^ result == 0) {this.devError([this.elem.fName, this.elem.type, expected.join("|").replace(/\|/g, this.i18n.or)], "mismatch");this.elem.validated = false;return true;}return false;};
    fValidate.prototype.getValue = function (elem) {switch (elem.type) {case "text":case "password":case "textarea":case "hidden":case "file":return elem.value;case "radio":case "select-single":if (typeof elem.length == "undefined") {return elem.value;} else {for (var i = 0; i < elem.length; i++) {choice = (elem.type == "radio") ? "checked" : "selected";if (elem[i][choice]) {return elem[i].value;}}}case "select-multiple":case "checkbox":if (typeof elem.length == "undefined") {return elem.value;} else {var returnValues = new Array;for (var i = 0; i < elem.length; i++) {choice = (elem.type == "checkbox") ? "checked" : "selected";if (elem[i][choice]) {returnValues.push(elem[i].value);}}return returnValues;}default:return null;}};
    fValidate.prototype.setArg = function (arg, def) {return (typeof arg == "undefined" || arg == "" || arg == null) ? def : arg;};
    fValidate.prototype.isBlank = function (el) {var elem = this.form.elements[el] || this.elem;return Boolean(/^\s*$/.test(elem.value));};
    fValidate.prototype.translateMessage = function (args, format) {var msg = "";for (var i = 0; i < format.length; i++) {msg += (typeof format[i] == "number") ? args[format[i]] : format[i];}return msg;};
    fValidate.prototype.devError = function (args, which) {if (typeof args == "string") {which = args;args = [];}which = this.setArg(which, this.type);var format = this.i18n.devErrors[which];var a = [this.i18n.devErrors.lines[0], "----------------------------------------------------------------------------------------------", this.translateMessage(args, format), "----------------------------------------------------------------------------------------------", this.i18n.devErrors.lines[1]];alert(a.join("\n"));};
    fValidate.prototype.paramError = function (param, elemName) {elemName = this.setArg(elemName, this.elem.name);this.devError([param, this.type, elemName], "paramError");};
    document.createHTMLElement = function (elemName, attribs) {if (typeof document.createElement == "undefined") {return;}var elem = document.createElement(elemName);if (typeof attribs != "undefined") {for (var i in attribs) {switch (true) {case i == "text":elem.appendChild(document.createTextNode(attribs[i]));break;case i == "class":elem.className = attribs[i];break;default:elem.setAttribute(i, "");elem[i] = attribs[i];}}}return elem;};
    Array.prototype.reduce = function (b, e) {var a = new Array;var count = 0;for (var i = b; i < this.length - e; i++) {a[count++] = this[i];}return a;};
    Array.prototype.toArgString = function () {var a = new Array;for (var i = 0; i < this.length; i++) {a.push("'" + this[i] + "'");}return a.toString();};
    Array.prototype.last = function () {return this[this.length - 1];};
    String.prototype.format = function () {return this.replace(/\_/g, " ").replace(/\[|\]/g, "");};
    String.prototype.toHTML = function () {return this.replace(/\n/g, "<br />").replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;");};
    String.prototype.trim = function () {return this.replace(/^\s+|\s+$/, "");};
    String.prototype.toPattern = function () {return this.replace(/([\.\*\+\{\}\(\)\<\>\^\$\\])/g, "\\$1");};
