imos.form = function(form, newInstance) {
    if (typeof newInstance == 'undefined') {
        return new imos.form(form, true);
    }
    form = $(form);
    return imos.Object.extend(form, this);
}
imos.form.prototype.toString = function() {
    return '[imos.form]';
}
imos.form.prototype.disable = function() {
    var elements = this.getElements();
    for (i = 0; i < elements.length; i++) {
        elements[i].disabled = true;
    }
}
imos.form.prototype.enable = function() {
    var elements = this.getElements();
    for (i = 0; i < elements.length; i++) {
        elements[i].disabled = false;
    }
}
imos.form.prototype.send = function() {

}
imos.form.prototype.getElements = function() {
    elements = [];
    for (nodeName in imos.form.serializers) {
        nodeSet = this.getElementsByTagName(nodeName);
        for (i = 0; i < nodeSet.length; i++) {
            elements.push(nodeSet[i]);
        }
    }
    return elements;
}
imos.form.prototype.serialize = function () {
    var queryComponents = [], elements;
    elements = this.getElements();
    for (i = 0; i < elements.length; i++) {
        parameters = imos.form.serializers[elements[i].nodeName.toLowerCase()](elements[i]);
        if (parameters.length > 0 && parameters[0].length > 0) {
            if (typeof parameters[1] == 'object') {
                for (n = 0; n < parameters[1].length; n++) {
                    queryComponents.push(parameters[0] + '=' + encodeURIComponent(parameters[1][n]));
                }
            } else {
                queryComponents.push(parameters[0] + '=' + encodeURIComponent(parameters[1]));
            }
        }

    }
    return queryComponents.join('&');
}
imos.form.serializers = {
    input: function(element) {
        switch (element.type.toLowerCase()) {
            case 'submit':
            case 'hidden':
            case 'password':
            case 'text':
                return [element.name, element.value];
            case 'checkbox':
            case 'radio':
                return element.checked?[element.name, element.value]:[];
        }
    },
    textarea: function(element) {
        return [element.name, element.value];
    },
    select: function(element) {
        if (element.type == 'select-one') {
            var value = '', option, index = element.selectedIndex;
            if (index >= 0) {
              option = element.options[index];
              value = option.value;
              if (!value && !('value' in option)) {
                value = option.text;
              }
            }
            return [element.name, value];
        } else {
            var value = new Array();
            for (var i = 0; i < element.length; i++) {
                var option = element.options[i];
                if (option.selected) {
                    var optionValue = option.value;
                    if (!optionValue && !('value' in option)) {
                        optionValue = option.text;
                    }
                    value.push(optionValue);
                }
            }
            return [element.name, value];
        }
    },
    button: function(element) {
        return [element.name, element.value];
    }
}

