var FormSubmitter = Class.create();
FormSubmitter.prototype = {

    initialize: function(form, focus) {

        // constants
        this.URL_SUFFIX = '&js';


        // private members
        this.form = null;
        this.inputs = [];
        this.nessecary = [];
        this.button = null;

        this.info = [];

        // public members
        this.sendInfo = false;

        // events
        this.onSuccess = null;


        // ctor

        if (!form)
            throw new Error('Ошибка инициализации менеджера формы');

        this.form = form;
        var inputs = this.form.getElementsByTagName('input');

        for (var i = 0; i < inputs.length; i++)
            if (inputs[i].type == 'submit')
            this.button = inputs[i];
        else
            this.inputs.push(inputs[i]);

        var areas = this.form.getElementsByTagName('textarea');
        for (var i = 0; i < areas.length; i++)
            this.inputs.push(areas[i]);

        if (!this.button)
            throw new Error('Ошибка инициализации менеджера формы');

        this.addBehavior();

        if (focus == null) focus = 1;
        if (focus) this.focus();
    },



    // public methods

    focus: function() {
        if (this.inputs.length > 0)
            this.inputs[0].focus();
    },


    // private methods

    addBehavior: function() {
        /*this.button.disabled = true;*/

        this.form.observe('submit', this.submitHandler.bindAsEventListener(this));

        for (var i = 0; i < this.inputs.length; i++) {
            this.inputs[i].name = 'fields[' + this.inputs[i].name + ']';

            $(this.inputs[i]).observe('focus', this.focusHandler.bindAsEventListener());
            $(this.inputs[i]).observe('blur', this.blurHandler.bindAsEventListener());

            if ($(this.inputs[i].parentNode).hasClassName('nessecary'))
                this.nessecary.push(this.inputs[i]);
        }
    },

    getUrl: function() {
        var url = this.form.action + this.URL_SUFFIX;

        for (var i = 0; i < this.inputs.length; i++)
            url += '&' + this.inputs[i].name + '=' + encodeURIComponent(this.inputs[i].value);

        url += '&r=' + Math.random();

        if (this.sendInfo)
            url += this.getInfoUrl();

        return url;
    },

    getInfoUrl: function() {
        var url = '';

        if (this.info.length == 0)
            this.readInfo();

        for (i = 0; i < this.inputs.length; i++)
            url += '&info[' + this.inputs[i].id + ']=' + encodeURIComponent(this.info[this.inputs[i].id]);

        return url;
    },

    readInfo: function() {
        var labels = this.form.getElementsByTagName('label');

        if (labels.length == 0)
            throw new Error('Ошибка чтения полей формы');

        for (var i = 0; i < labels.length; i++)
            this.info[labels[i].htmlFor] = labels[i].innerText;
    },

    checkNessecary: function() {
        if (!this.nessecary)
            return;

        for (var i = 0; i < this.nessecary.length; i++)
            if (this.nessecary[i].value.length == 0) {
            this.nessecary[i].focus();
            return false;
        }

        return true;
    },


    // event handlers

    focusHandler: function(e) {
        $(e.srcElement.parentNode).addClassName('focused');
    },

    blurHandler: function(e) {
        $(e.srcElement.parentNode).removeClassName('focused');
    },

    submitHandler: function(e) {
        e.stop();
        this.button.disabled = true;

        if (!this.checkNessecary())
            return (this.button.disabled = false);

        new Ajax.Request(this.getUrl(),
			{
			    method: 'get',
			    onSuccess: this.responseHandler.bind(this),
			    onFailure: function(response) { alert(response.responseText); }
			});
    },

    responseHandler: function(response) {
        if (response.status == 200) {
            this.form.reset();
            if (this.inputs.length > 0) this.inputs[0].focus();
            alert(response.responseText);

            if (this.onSuccess)
                this.onSuccess();
        } else
            alert(response.responseText);

        this.button.disabled = false;
    }

}