////////////////////////////////////////////////////////////////////////////////
// Constants
////////////////////////////////////////////////////////////////////////////////

var __CFFORM_WARNING_DOCUMENT_FORMS = "document.forms is not supported";

////////////////////////////////////////////////////////////////////////////////
// Static variables
////////////////////////////////////////////////////////////////////////////////

var __cfFormSubmitHandlerSet = new CFEventHandlerExpandedSet();

////////////////////////////////////////////////////////////////////////////////
// Event handlers
////////////////////////////////////////////////////////////////////////////////

function __cfFormHandleLoadEvent()
{
    var forms = document.forms;
    if (typeof(forms) == "undefined") {
        return cfWarningTrigger("__cfFormHandleLoadEvent: " +
                                __CFFORM_WARNING_DOCUMENT_FORMS);
    }
    for (var i = 0; i < forms.length; i++) {
        var form = forms[i];
        if (! form.onsubmit) {
            form.onsubmit = __cfFormHandleSubmitEvent;
        }
        cfFormEnableSubmitButtons(form);
    }
}

function __cfFormHandleSubmitEvent()
{
    cfFormDisableSubmitButtons(this);
    var results = __cfFormSubmitHandlerSet.execute(this.id || this.name);
    for (var i = 0; i < results.length; i++) {
        var result = results[i];
        if (! result) {
            cfFormEnableSubmitButtons(this);
            return false;
        }
    }
    return true;
}

////////////////////////////////////////////////////////////////////////////////
// Public API
////////////////////////////////////////////////////////////////////////////////

function cfFormAddSubmitCallback(id)
{
    __cfFormSubmitHandlerSet.add.apply(__cfFormSubmitHandlerSet, arguments);
}

function cfFormDeselectAllCheckboxes(form, name)
{
    var elements = form.elements[name];
    for (var i = 0; i < elements.length; i++) {
        elements[i].checked = false;
    }
}

function cfFormDisableSubmitButtons(form)
{
    var buttons = cfFormGetSubmitButtons(form);
    for (var i = 0; i < buttons.length; i++) {
        buttons[i].disabled = true;
    }
}

function cfFormEnableSubmitButtons(form)
{
    var buttons = cfFormGetSubmitButtons(form);
    for (var i = 0; i < buttons.length; i++) {
        buttons[i].disabled = false;
    }
}

function cfFormGetParameters(form)
{
    var data = {};
    var elements = form.elements;
    for (var i = 0; i < elements.length; i++) {
        var element = elements[i];
        var name = element.name;
        if (! name) {
            continue;
        }
        var values = data[name];
        if (typeof(values) == "undefined") {
            values = new Array();
            data[name] = values;
        }
        var valueData;
        switch (element.tagName) {
        case "input":
            switch (element.type) {
            case "checkbox":
            case "radio":
                if (element.checked) {
                    valueData = [element.value || '1'];
                } else {
                    valueData = [];
                }
                break;
            default:
                valueData = [element.value || ''];
            }
            break;
        case "select":
            var options = element.options;
            var valueData = [];
            if (element.multiple) {
                for (var i = 0; i < options.length; i++) {
                    var option = options[i];
                    if (option.selected) {
                        valueData.push(option.value || option.text || '');
                    }
                }
            } else {
                var index = element.selectedIndex;
                if (index != -1) {
                    var option = options[index];
                    valueData.push(option.value || option.text || '');
                }
            }
            break;
        default:
            valueData = [element.value || ''];
        }
        values.extend(valueData);
    }
    return data;
}

function cfFormGetSubmitButtons(form)
{
    var buttons = new Array();
    var elements = form.elements;
    for (var i = 0; i < elements.length; i++) {
        var element = elements[i];
        if (element.type == "submit") {
            buttons.push(element);
        }
    }
    return buttons;
}

function cfFormSelectAllCheckboxes(form, name)
{
    var elements = form.elements[name];
    for (var i = 0; i < elements.length; i++) {
        elements[i].checked = true;
    }
}

////////////////////////////////////////////////////////////////////////////////
// Initialization
////////////////////////////////////////////////////////////////////////////////

cfDocumentAddOnLoadCallback(__cfFormHandleLoadEvent);
