/**
 * Formular anzeigen
 *
 * @param string|element form Formularelement oder ID des Formulares
 * @param object options Werte die in Formularelementen gesetzt werden
 */
function display_form(form, options)
{
    if ($type(form) == "string") {
        form = $(form);
    }

   
    if (form.hasClass("hidden"))
    {
        if ($defined(options))
        {
            for (var index in options)
            {
                var elem = form.getElement("input[name="+index+"]") || form.getElement("textarea[name="+index+"]") || form.getElement("select[name="+index+"]");
                elem.set("value", options[index]);
            }
        }
        
        form.removeClass("hidden");
     }
}

/**
 * Formular abschicken
 *
 * @param element form Formularelement
 */
function submit_form(form)
{
    if (http_request_state(1)) {
        return false;
    }
    
    if (Browser  &&  Browser.Engine  &&  Browser.Engine.gecko) {
        var action = form.get("action");
    }
    else {
        var action = form.action;
    }

    new Request.JSON({
        url: '/callback/'+action,
        onRequest: form_request.bind(form),
        onComplete: form_complete.bind(form)
    }).post(form);

    return false;
}

/**
 * Wird ausgefuehrt wenn ein Formular abgeschickt wurde
 * - Formular wird gesperrt
 */
function form_request()
{
    form_button_mirroring(this.getElement('input[type=submit]'));
}

/**
 * Wird ausgefuehrt nachdem eine Antwort auf das Formular gekommen ist
 * - Fehler und andere Meldungen ausgeben
 * - Formular wieder freigeben
 *
 * @param JSON response JSON Antwort der Anfrage
 */
function form_complete(response)
{
    system_message(response.messages);

    if (response.close) {
        close_form(this);
    }

    if (response.success  &&  !response.dontclear) {
        clear_form(this);
    }

    if (response.redirect) {
        window.wait_for_redirect = response.redirect;
    }

    if (response.refresh) {
        window.wait_for_refresh = true;
    }

    form_button_mirroring(this.getElement('input[type=submit]'));
}

/**
 * Formular ausblenden
 *
 * @param string|element form Formularelement oder ID des Formulares
 */
function close_form(form)
{
    if ($type(form) == "string") {
        form = $(form);
    }

    if (!form.hasClass("hidden")) {
        form.addClass("hidden");
    }

    if ($("calendar")) {
        $("calendar").dispose();
    }

    clear_form(form);
}

/**
 * Formular reinigen
 *
 * @param string|element form Formularelement oder ID des Formulares
 */
function clear_form(form)
{
    if ($type(form) == "string") {
        form = $(form);
    }

    var elements = [];

    elements.combine(form.getElements('input[type=hidden]'));
    elements.combine(form.getElements('input[type=text]'));
    elements.combine(form.getElements('input[type=password]'));
    elements.combine(form.getElements('textarea'));
    elements.combine(form.getElements('select'));

    elements.each(function(e){
        e.set("value", "");
    });

    if (form.getElement("#job_form_changes"))
    {
        form.getElement("#job_form_changes").getElement("td").set("text", "");
        form.getElement("#job_form_changes").addClass("hidden");
    }
}

/**
 * Checkboxes markieren oder aufheben
 *
 * @param string formid ID des Formulares
 */
function markCheckboxes(formid)
{
    var elem = $(formid);

    if (!elem) {
        return false;
    }

    var inputs = elem.getElements("input[type=checkbox]");

    if (window.checkboxes_marked)
    {
        inputs.each(function(e){ e.checked = false; });
        
        window.checkboxes_marked = false;
    }
    else
    {
        inputs.each(function(e){ e.checked = true; });

        window.checkboxes_marked = true;
    }
}

/**
 * Wechselt Name und Value von button aus
 *
 * @param element button Button-Element
 */
function form_button_mirroring(button)
{
    var button_value = button.value;
    var button_alt   = button.name;

    button.set({
        'disabled': !button.get("disabled"),
        'value':    button_alt,
        'name':     button_value
    });
}

