////////////////////////////////////////////////////////////////////////////////
// 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 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);
