/**    
 *    Deserialize forms serialized with the Prototype JavaScript framework (version 1.6.0)
 *    
 */

Object.extend(Form, {
    deselectAll: function(form) {
        var elements = Form.getElements(form);
        for (var index = 0, len = elements.length; index < len; index++) {
            var item = elements[index];
            if(item.type.toLowerCase() === 'checkbox') {
                var checkboxs = Form.getInputs(item.form, 'checkbox', item.name);
                for(var i = 0, len = checkboxs.length; i < len; i++) {
                    checkboxs[i].checked = false;
                }
            } else if(item.tagName.toLowerCase() === 'select'){
                if(item.type === 'select-multiple') {
                    for(var index = 0, len = item.options.length; index < len; index++) {
                        item.options[index].selected = false;
                    }
                }
            }
        }
    },

    deserialize: function(form, data) {
        form = $(form);
        form.reset();
        Form.deselectAll(form);
        var tokens = data.split('&');

        tokens.each(
            function(data, index) {
                data = data.split('=');
                var id = decodeURIComponent(data[0]);
                var value = decodeURIComponent(data[1]);
                if(id != form.id && value)
                    Form.Element.deserialize(form, id, value);
            }
        );
    },
    
    deserializeJSON: function(form, data) {
        form = $(form);
        form.reset();
        Form.deselectAll(form);
        
        var json = data.evalJSON();
        for (var i in json) {
            var id = i;
            var value = json[i];
            if (id != form.id && value)
                Form.Element.deserialize(form, id, value);
        }
    },
    
    deserializeObject: function(form, data) {
        form = $(form);
        form.reset();
        Form.deselectAll(form);
        
        for (var i in data) {
            var id = i;
            var value = data[i];
            if (id != form.id && value)
                Form.Element.deserialize(form, id, value);
        }
    }  
});

Object.extend(Form.Element, {
    deserialize: function(form, element, data) {
        var elements = Form.getElements(form);
        for (var index = 0, len = elements.length; index < len; ++index) {
            var item = elements[index];
            if(item.name == element) {
                var method = item.tagName.toLowerCase();
                Form.Element.Deserializers[method](item, data);
                break;
            }
        }
    }
});

Form.Element.Deserializers = {
    input: function(element, data) {
        switch (element.type.toLowerCase()) {
            case 'submit':
            case 'hidden':
            case 'password':
            case 'text':
                return Form.Element.Deserializers.textarea(element, data);
            case 'checkbox':
                return Form.Element.Deserializers.inputSelector(element, data);
            case 'radio':
                return Form.Element.Deserializers.radioSelector(element, data);
        }
        return false;
    },

    inputSelector: function(element, data) {
        var name = element.name;
        var checkboxs = Form.getInputs(element.form, 'checkbox', element.name);
        for(var i = 0, len = checkboxs.length; i < len; i++) {
            checkboxs[i].checked = true;
        }
    },

    radioSelector: function(element, data) {
        var name = element.name;
        var radiobuttons = Form.getInputs(element.form, 'radio', element.name);
        for(var i = 0, len = radiobuttons.length; i < len; i++) {
            var radiobutton = radiobuttons[i];
            if(radiobutton.value === data)
                radiobutton.checked = true;
        }
    },

    textarea: function(element, data) {
        element.value = data;
    },

    select: function(element, data) {
        return Form.Element.Deserializers[element.type === 'select-one' ?
            'selectOne' : 'selectMany'](element, data);
    },

    selectOne: function(element, data) {
        element.value = data;
    },

    selectMany: function(element, data) {
        if(data instanceof Array) {
            for(var k = 0, len = data.length; k < len; k++) {
                for(var i = 0, len = element.options.length; i < len; i++) {
                    var op = element.options[i];
                    if(op.value === decodeURIComponent(data[k])) {
                        op.selected = true;
                        break;
                    }
                }
            }
        } else {
            for(var i = 0, len = element.options.length; i < len; i++) {
                var op = element.options[i];
                if(op.value === decodeURIComponent(data)) {
                    op.selected = true;
                    break;
                }
            }
        }
    }

}
