var FormHelper = function (form) {
    this.form = form;

    this.get_data = function () {
        var data = '';
        for (var i = 0; i < this.form.elements.length; i ++) {
            var element = this.form.elements[i];
            if (element && element.name) {
                if (!element.disabled) {
                    switch (element.type) {
                    case 'checkbox':
                    case 'radio':
                        if (!element.checked) {
                            break;
                        }
                    default:
                        data += (data ? '&' : '') + element.name + '=' + this.escape(element.value);
                    }
                }
            }
        }
        return data;
    }

    this.set_data = function (data, name) {
//            alert(hash(this.form));
        for (i in data) {
            if (typeof data[i] == 'object') {
                for (j in data[i]) {
                    if (name) {
                        var key = name + '[' + i + '][' + j + ']' ;
                    } else {
                        var key = i + '[' + j + ']';
                    }
                    if (element = this.form[key]) {
                        element.value = data[i][j];
                        if (element.onchange) {
                            element.onchange();
                        }
                    } else {
//                        alert(key);
                    }
                }
            } else {
                if (name) {
                    var key = name + '[' + i + ']';
                } else {
                    var key = i;
                }
                if (element = this.form[key]) {
                    element.value = data[i];
                    if (element.onchange) {
                        element.onchange();
                    }
                } else {
//                    alert(key);
                }
            }
        }
    }

    this.escape = function (str)
    {
        str = str.replace(new RegExp('\r', 'g'), '%' + '0D');
        str = str.replace(new RegExp('\n', 'g'), '%' + '0A');
        str = str.replace(new RegExp('&', 'g'), '%' + '26');
        str = str.replace(new RegExp('#', 'g'), '%' + '23');
        str = str.replace(new RegExp('\\+', 'g'), '%' + '2B');
        return str;
    }

    this.create_input = function (type, name, value, options) {
        switch (type) {
        default:
        case 'hidden':
        case 'text':
        case 'password':
        case 'checkbox':
            if (is_browser_ie()) {
                var input = document.createElement('<input name="' + name + '">');
            } else {
                var input = document.createElement('INPUT');
                input.name = name;
            }
            input.type = type;
            input.value = value;
            input.className = type;
            break;
        case 'textarea':
            if (is_browser_ie()) {
                var input = document.createElement('<textarea name="' + name + '">');
            } else {
                var input = document.createElement('TEXTAREA');
                input.name = name;
            }
            input.value = value;
            input.className = type;
            break;
        case 'select':
            if (is_browser_ie()) {
                var input = document.createElement('<select name="' + name + '">');
            } else {
                var input = document.createElement('SELECT');
                input.name = name;
            }
            for (var i in options) {
                var option = document.createElement('OPTION');
                option.value = i;
                option.innerHTML = options[i];
                if (value == option.value) {
                    option.selected = true;
                }
                input.appendChild(option);
            }
            input.className = type;

            break;
        }
        return input;
    }

    this.create_form = function (name, method, action) {
        if (is_browser_ie()) {
            var form = document.createElement('<form name="' + name + '">');
        } else {
            var form = document.createElement('FORM');
            form.name = name;
        }
        if (method) {
            form.method = method;
        }
        if (action) {
            form.action = action;
        }
        return form;
    }

    this.create_image_checkbox = function (name, value, checked, img_on, img_off) {
        var container = document.createElement('DIV');
        container.style.display = 'inline';
        container.className = 'image-checkbox';

        var check = this.create_input('checkbox', name, value);
        check.style.display = 'none';
        container.appendChild(check);
        container.checkbox = check;

        var image = document.createElement('IMG');
        image.src = img_off;
        image.img_on = img_on;
        image.img_off = img_off;
        image.set_state = function(state) {
            if (state) {
                image.src = img_on;
                check.checked = true;
            } else {
                image.src = img_off;
                check.checked = false;
            }
        }
        image.onclick = function () {
            image.set_state(!check.checked);
        }
        check.onchange = function () {
            if (check.checked) {
                image.src = img_on;
            } else {
                image.src = img_off;
            }
        }
        container.toggle = image.onclick;
        container.set_state = image.set_state;
        container.appendChild(image);
        container.image = image;
        image.container = container;

        return container;

    }

    return this;
}
