/**
 * Author: Olexandr Tarasiuk
 * Date: 01.04.2009
 * Version: 1.0.0
 * @Required /scripts/net/integrio/scripting/ajax/AjaxRequest.js
 * @Required /scripts/net/integrio/scripting/ajax/FormField.js
 */
function Form(id, fields, responseProcessor) {
    this.id = id;
    this.fields = fields;
    this.responseProcessor = responseProcessor;
    this.tag = null;
    this.action = null;
    this.processResponse = function(res) {
        for (var pName in res.parameters) {
            var pValue = res.parameters[pName];
            for (var j = 0; j < this.fields.length; j++) {
                if (this.fields[j].id == pName) {
                    this.fields[j].setValue(pValue);
                    break;
                }
            }
        }
        if (res.parameters["net_integrio_scripting_ajax_Form_error"]) {
            if (FormField.REQUIRED_MESSAGE_MODE == "DIALOG")
            $createMessageDialog(res.parameters["net_integrio_scripting_ajax_Form_error"]).show();
        else if (FormField.REQUIRED_MESSAGE_MODE = "ALERT") {
            alert(res.parameters["net_integrio_scripting_ajax_Form_error"]);
            this.tag.focus();
        } else
            throw "Invalid REQUIRED_MESSAGE_MODE " + FormField.REQUIRED_MESSAGE_MODE;
        }
        if (this.responseProcessor) this.responseProcessor(res);
    };
    this.submit = function() {
        for (var i = 0; i < this.fields.length; i++) {
            if (!this.fields[i].validate()) return;
        }
        var onSuccess = function(res) {
            res.sender.processResponse(res);
        };
        var f = document.getElementById(id);
        if (f.method.toUpperCase() == "POST") {
            f.submit();
            return;
        }
        var req = new AjaxRequest(this.action, onSuccess, this);
        for (var i = 0; i < this.fields.length; i++) {
            var field = this.fields[i];
            if (field.tag.tagName == "INPUT" && field.tag.type == "checkbox") {
                if (field.tag.checked) req.setParameter(field.id, field.getValue());
            } else {
                if (field.tag.tagName=="SELECT" && field.tag.multiple){
                    for (var j=0;j<field.tag.options.length;j++){
                        if (field.tag.options.item(j).selected){
                            req.setParameter(field.id, field.tag.options.item(j).value);
                        }
                    }
                } else {
                    req.setParameter(field.id, field.getValue());
                }
            }
        }
        req.submitAsync();
    };
    this.init = function() {
        var f = document.getElementById(this.id);
        if (!f) return false;
        var formId = this.id;
        if (f.attachEvent) {
            f.attachEvent("onsubmit", function() {
                try {
                    Form.REGISTERED_FORMS[formId].submit();
                } catch (e) {
                    alert(e.message);
                }
                return false;
            });
        } else {
            f.onsubmit = function() {
                try {
                    Form.REGISTERED_FORMS[formId].submit();
                } catch (e) {
                    alert(e.message);
                }
                return false;
            };
        }

        this.tag = f;
        this.action = f.action;
        for (var i = 0; i < this.fields.length; i++) this.fields[i].init();
        return true;
    };
}
Form.REGISTERED_FORMS = new Array();

Form.registerForm = function(id, fields, responseProcessor) {
    Form.REGISTERED_FORMS[id] = new Form(id, fields, responseProcessor);
    Form.initForm(id);
};
Form.initForm = function(id) {
    if (!Form.REGISTERED_FORMS[id].init())
        setTimeout("Form.initForm(\"" + id + "\")", 100);
};