//alert('validator.js');

Validator = Class.create({
    initialize: function () {
        this.errors = [];
        this.required;
        this.allFields = false;
    },
    validateField: function (field, event) {
        if (field == this.required.last()) { this.allFields = true; }
        switch (field.type) {
            case "text":

                if (field.getValue() == '' || field.present() == '') {
                    this.addError(field);
                }
                if (field.attr("name") == "RegScreenName") {
                    jQuery("#RegScreenName").addClass("error");
                    jQuery("#RegScreenName").parent().validate().showLabel(jQuery("#RegScreenName"), 'Screen name is taken');
                }

                break;
            case "password":
                if (field.getValue() == '' || field.present() == '') {
                    this.addError(field);
                }
                break;
            case "checkbox" || "radio":
                if (field.serialize() == null || field.serialize() == '') {
                    this.addError(field);
                }
                break;
            case "textarea":
                if (field.present() == '' || field.innerHTML == null) {
                    this.addError(field);
                }
                break;
        }
        if (field == this.required.last() && this.errors.length == 0) {
        } else if (field == this.required.last()) {
            event.stop();
            this.reportErrors();
        } else { }
    },
    addError: function (field) {
        var label = this.findLabel(field);

        this.errors.push(label);
    },
    findLabel: function (field) {
        var previous = field.previousSiblings()[0] || '';
        var next = field.nextSiblings()[0] || '';

        var label = 'unknown';
        if (previous.nodeName == 'LABEL') { label = previous.innerHTML.replace(/(<([^>]+)>)/ig, ""); }
        else if (next.nodeName == 'LABEL') { label = next.innerHTML.replace(/(<([^>]+)>)/ig, ""); }

        return label;
    },
    reportErrors: function () {
        var errorlist = '';
        this.errors.each(function (error) {
            errorlist += error + "\n";
        });
        alert('Please fill in the following fields:' + "\n" + errorlist);
    }
});

Validator.forms = [];

Validator.init = function () {

    //alert('Validator.init');
    
    $$('fieldset.form').each(function (form) {
        Validator.forms.push(new FormForValidation(form));
    });
};

Event.observe(window, "load", Validator.init);

FormForValidation = Class.create(Validator, {
    initialize: function (form) {

        //alert('FormForValidation.initialize');
        try {
            this.form = form;

            this.required = this.form.getElementsByClassName('required');

            this.form.getElementsByClassName('submit')[0].down('a').observe('click', this.validate.bindAsEventListener(this));
            this.form.getElementsByClassName('submit')[0].next('a').observe('click', this.clearAll.bindAsEventListener(this));
        }
        catch (e) {
            // SAO - added try/catch for http://devjira1.automation.private:8080/browse/IDSTARZDOTCOM-1791
        }
    },
    validate: function (event) {
        this.errors = [];
        this.allFields = false;

        this.required.each(function (field) {
            this.validateField(field, event);
        } .bind(this));
    },
    clearAll: function (event) {
        event.stop();

        this.form.select('input[type=text], input[type=password]').each(function (field) {
            if (!field.disabled) {
                field.clear();
            }
        });
        this.form.select('textarea').each(function (field) {
            field.innerHTML = '';
        });
        this.form.select('input[type=checkbox], input[type=radio]').each(function (field) {
            if (field.readAttribute('checked')) {
                field.setValue(true);
            } else {
                field.setValue(null);
            }
        });
        this.form.select('select').each(function (field) {
            field.select('option').each(function (option) {
                option.selected = false;
            });
            field.down('option').selected = true;
        });
    }
});
