
/**
 * TODO: описать
 */
function FormTracker(_form)
{
    this.form = _form;

    this.controls =
    {
        input:      getByTagName("input", _form),
        textarea:   getByTagName("textarea", _form),
        select:     getByTagName("select", _form)
    };

    this.initialState = 0;

    this.init();
}

FormTracker.prototype =
{
//public
    addListener: function(_event, _func)
    {
        for (var j in this.controls)
            for (var i = 0, l = this.controls[j].length; i < l; i++)
                if (document.addEventListener)
                    this.controls[j][i].addEventListener(_event, _func, false);
                else
                    this.controls[j][i].attachEvent("on" + _event, _func);
    },

    addOnchangeListener: function(_func)
    {
        this.addListener("change", _func);
        this.addListener("click", _func);
        this.addListener("keyup", _func);
    },

    controlsState: function()
    {
        var state = "";

        with (this.controls) {
            for (var i = 0, l = input.length; i < l; i++) {
                // не запоминаем input с незаданным name и input'ы из категории 'Особенное',
                // т.к. они не должны сохраняться
                if(!input[i].name.length
                    || input[i].name == 'v-name_custom_entry'
                    || input[i].name == 'v_value_custom_entry')
                    continue;
                if (input[i].value)
                    state += input[i].value;
                if (input[i].checked)
                    state += input[i].checked;
                if (input[i].selected)
                    state += input[i].selected;
            }

            for (var i = 0, l = textarea.length; i < l; i++)
                if (textarea[i].value && textarea[i].name.length)
                    state += textarea[i].value;

            for (var i = 0, l = select.length; i < l; i++)
                if(select[i].name.length)
                    state += select[i].selectedIndex;
        }

        return state;
    },

//constructor
    init: function()
    {
        if(!window.notInitialState) {
            this.initialState = this.controlsState();
        }
    }
}
