var FormBuilderValidate = {
    textValidator: function(fieldset, element) {
        var fldErrors = { "fieldset": fieldset, "message": "", "fields": [] };
        element.fields.each(function(field, index) {
            if (field.isRequired && fieldset.fields[index].field.value == "")
                fldErrors.fields.push(index);
        }, this);
        return (fldErrors.fields.length > 0 ? fldErrors : null);
    },

    multValidator: function(fieldset) {
        var hasValue = false;
        fieldset.fields[0].field.select("input").each(function(input, index) {
            if (input.checked)
                hasValue = true;
        }, this);
        if (hasValue)
            return null;
        else
            return { "fieldset": fieldset, "message": "", "fields": [0] };
    },

    validators: [{
        "fieldType": "email",
        "validate": function(fieldset) {
            var fldErrors = null;
            var isValidEmail = fieldset.fields[0].field.value.match(/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/);
            if (!isValidEmail && fieldset.fields[0].field.value != "") {
                fldErrors = { "fieldset": fieldset, "message": "", "fields": [0] }
                fldErrors.message = "Please enter a valid email address";
            }
            return fldErrors;
        }
    }, {
        "fieldType": "date",
        "validate": function(fieldset) {
            var fldErrors = { "fieldset": fieldset, "message": "", "fields": [] };
            if (!isFinite(Number(fieldset.fields[0].field.value)) && fieldset.fields[0].field.value != "") fldErrors.fields.push(0);
            if (!isFinite(Number(fieldset.fields[1].field.value)) && fieldset.fields[1].field.value != "") fldErrors.fields.push(1);
            if ((!isFinite(Number(fieldset.fields[2].field.value)) || fieldset.fields[2].field.value.length != 4) && fieldset.fields[2].field.value != "") fldErrors.fields.push(2);
            if (fldErrors.fields.length > 0)
                fldErrors.message = "Invalid Date, please follow specified format";
            return (fldErrors.fields.length > 0 ? fldErrors : null);
        }
    }, {
        "fieldType": "time",
        "formatTypes": [{
            "type": "Hour and Minutes,",
            "validate": function(fieldset) {
                var fldErrors = { "fieldset": fieldset, "message": "", "fields": [] };
                if (!isFinite(Number(fieldset.fields[0].field.value)) && fieldset.fields[0].field.value != "") fldErrors.fields.push(0);
                if (!isFinite(Number(fieldset.fields[1].field.value)) && fieldset.fields[1].field.value != "") fldErrors.fields.push(1);
                if (fldErrors.fields.length > 0)
                    fldErrors.message = "Invalid Time, please follow specified format";
                return (fldErrors.fields.length > 0 ? fldErrors : null);
            }
        }, {
            "type": "Hour, Minutes, and Second,",
            "validate": function(fieldset) {
                var fldErrors = { "fieldset": fieldset, "message": "", "fields": [] };
                if (!isFinite(Number(fieldset.fields[0].field.value)) && fieldset.fields[0].field.value != "") fldErrors.fields.push(0);
                if (!isFinite(Number(fieldset.fields[1].field.value)) && fieldset.fields[1].field.value != "") fldErrors.fields.push(1);
                if (!isFinite(Number(fieldset.fields[2].field.value)) && fieldset.fields[2].field.value != "") fldErrors.fields.push(2);
                if (fldErrors.fields.length > 0)
                    fldErrors.message = "Invalid Time, please follow specified format";
                return (fldErrors.fields.length > 0 ? fldErrors : null);
            }
}]
        }, {
            "fieldType": "price",
            "validate": function(fieldset) {
                var fldErrors = null;
                fieldset.fields[0].field.value = fieldset.fields[0].field.value.strip();
                if (fieldset.fields[0].field.value != "") {
                    if (!isFinite(Number(fieldset.fields[0].field.value))) {
                        fldErrors = { "fieldset": fieldset, "message": "", "fields": [0] }
                        fldErrors.message = "Invalid Number";
                    }
                }
                return fldErrors;
            }
        }, {
            "fieldType": "number",
            "validate": function(fieldset) {
                var fldErrors = null;
                if (fieldset.fields[0].field.value != "") {
                    if (!isFinite(Number(fieldset.fields[0].field.value))) {
                        fldErrors = { "fieldset": fieldset, "message": "", "fields": [0] }
                        fldErrors.message = "Invalid Number";
                    }
                }
                return fldErrors;
            }
        }, {
            "fieldType": "fileupload",
            "allowExt": new Array("zip", "txt", "html", "htm", "htc", "js", "css", "ico", "xml", "swf", "gif", "jpg", "jpeg", "bmp", "png", "psd", "tif", "ics", "aif", "aifc", "aiff", "asf", "asx", "au", "avi", "class", "flv", "m1v", "m3u", "m4a", "m4v", "mid", "midi", "mov", "mp2", "mp2v", "mp3", "mpa", "mpe", "mpeg", "mpg", "mpv2", "mvr", "rm", "rma", "rmi", "rmv", "snd", "wav", "wax", "wm", "wma", "wmp", "wmv", "wmx", "wvx", "doc", "docx", "pdf", "vcs", "xls", "xlsx", "xspf", "ppt", "pptx", "pub", "pubx"),
            "validate": function(fieldset) {
                var value = fieldset.fields[0].field.value;
                if (value != "") {
                    var ext = value.substring(value.lastIndexOf(".") + 1, value.length).toLowerCase();
                    for (var i = 0; i < this.allowExt.length; i++) {
                        if (this.allowExt[i] == ext)
                            return null;
                    }
                    return { "fieldset": fieldset, "message": "This file type is not supported. Please contact the system administrators if you have any questions.", "fields": [0] };
                }
                return null;
            }
}],

            initialize: function() {
            },

            Validate: function(form) {
                //Clear the current errors if any
                this.RemoveErrors(form);

                //Validate the fields
                var addErrors = null;
                form.elements.each(function(element, eIndex) {
                    //Find the validator we need.
                    if (element.isRequired) {
                        if (element.fieldType == "multiplechoice" || element.fieldType == "checkbox")
                            addErrors = this.multValidator(form.fieldsets[eIndex]);
                        else
                            addErrors = this.textValidator(form.fieldsets[eIndex], element);
                    }
                    if (!addErrors) {
                        var validator = this.SelectValidator(element.fieldType, element.formatType);
                        if (validator)
                            addErrors = validator.validate(form.fieldsets[eIndex]);
                    }

                    //Add the error report if there is one.
                    if (addErrors) {
                        form.fldErrors = form.fldErrors.concat(addErrors);
                        addErrors = null;
                    }
                }, this);

                //If there are errors then add them to the form.
                if (form.fldErrors.length > 0) {
                    this.AddErrors(form);
                    return false;
                } else {
                    form.errorSummary.hide();
                    return true;
                }
            },

            SelectValidator: function(fieldType, formatType) {
                //Search through the predefined validators, and make sure we select the one for the formatType
                for (vIndex = 0; vIndex < this.validators.length; vIndex++) {
                    if (this.validators[vIndex].fieldType == fieldType) {
                        var v = this.validators[vIndex];
                        if (v.formatTypes) {
                            for (fIndex = 0; fIndex < v.formatTypes.length; fIndex++) {
                                if (v.formatTypes[fIndex].type.indexOf(formatType + ",") > -1) {
                                    return v.formatTypes[fIndex];
                                }
                            }
                        } else {
                            return v;
                        }
                    }
                }
            },

            RemoveErrors: function(form) {
                //Clears all of the error classes and messages on the form.
                form.errorSummary.select("p")[0].update("Please enter the required information");
                form.fldErrors.each(function(error, index) {
                    error.fieldset.removeClassName("fieldItemError");
                    if (error.fields)
                        error.fieldset.select(".fieldBlockError").each(function(field, index) {
                            field.removeClassName("fieldBlockError");
                        }, this);
                }, this);
                form.fldErrors = new Array();
            },

            AddErrors: function(form) {
                //Attaches the error classes to the field, fieldset and form with the message.
                form.fldErrors.each(function(error, index) {
                    if (error.message != "")
                        form.errorSummary.select("p")[0].update(error.message);
                    error.fieldset.addClassName("fieldItemError");
                    if (error.fields)
                        var fldList = error.fieldset.select(".fieldBlock");
                    error.fields.each(function(field, index) {
                        fldList[field].addClassName("fieldBlockError");
                    }, this);
                }, this);
                form.errorSummary.show();
                form.errorSummary.scrollTo();
            }
        }