FormDestSender.prototype.send = null;
FormDestSender.prototype.service = null;
FormDestSender.prototype.send = FormDestSender_send;
FormDestSender.prototype.formAso = FormDestSender_formAso;
FormDestSender.service = null;
FormDestSender.fill = null;
FormDestSender.setDefaultOnLoad = null;
FormDestSender.fire = null;


/**
 * Tworzy instancję klasy FormSender
 * Zaleca się aby formularz opakowany był w jakiś element np. div
 * zwłaszcza w przypadku, kiedy nieznany jest element docelowy.
 *
 * @version 4.1.1
 *
 * 1.10 - dodanie funkcji nasłuchujących przyjście odpowiedzi
 * 1.20 - wyświetlanie zawartości cddata w paczce VIEW
 * 1.21 - Poprawka związana z wysyłaniem post z określonym miejscem odbioru (target)
 * 2.00 - Poprawka pozwalająca korzystać z FCKEditora
 * 2.01 - Wprowadzenie obsługi wszystkich elementów formularza
 * 2.02 - Poprawka związana z FCK
 * 2.03 - (gig) Blokowanie klawisza send przy wysyłaniu (ważna)
 * 2.10 - (gig) Blokowanie formularza za pomoca maski
 * 2.11.0 - (ge2b) Wstawianie komunikatów do znacznika fieldset z legend
 * 2.12.0 - (ge2b) Ważna poprawka wprowadzenie atrapy formularza
 * 2.13.0 - (web) Wprowadzenie obsugi ckeditora od 3.0
 * 2.13.1 - (p7) Poprawka interpretacji action
 * 3.0.0 - (p7) Wprowadzenie wypełniania formularza (niegotowe)
 * 3.1.0 - (dt2) Wydzielenie funkcji obsługi edytorów oraz innych na onSubmit
 * 3.1.1 - (dt2) Wypełnianie gotowe, oprócz obslugi edytora CK
 * 3.2.0 - (dt2) Działający formdestsender wraz z wypełnianiem ckeditora
 * 3.3.0 - (obs) wykorzystanie statusTarget z DestSendera
 * 3.3.1 - (web24) Zmiana komunikatu z h2 na div class=status_txt
 * 4.0.0 - (web24) Uniwersalizacja z konieczności dostosowaie do nowej wersji Firefox
 * 4.0.1 - (web24) Dodanie parametru ajax=true, do żądania oraz poprawka klawisza OK
 * 4.1.0 - (web24) Przywrócenie kompatybilności z poprzednia wersją i klawiszem form.sendButton
  */

function FormDestSender(onLoadFunction) {
    this.onLoadFunction = onLoadFunction;
}

function FormDestSender_formAso(sendButton, formId, target){
    this.form = document.getElementById(formId);
    this.send(sendButton, target);
}

function FormDestSender_send(sendButton, target){

    var form;
    
    if (sendButton.nodeName == 'INPUT') { // stare wywołanie z klawisza

        if (this.form) form = this.form;
        else form = sendButton.form;
        form.sendButton = sendButton;
    }
    else {
        /* tutaj send button wywołany jest z oncliku */
        form = sendButton;
        sendButton = form.sendButton;
    }

    var formParent = form.parentNode;

    /* blokowanie formularza na czas wysłania */
//    sendButton.disabled = true;
    var blocker = document.createElement('div');
    blocker.className = 'blocker';
    blocker.style.position='absolute';
    blocker.style.width='100%';
    blocker.style.height='100%';
    blocker.style.zIndex='1000';
    form.style.position='relative';
    form.insertBefore(blocker, form.firstChild);

    /* analiza formularza */

    var action = form.action;
    if (!action) action = window.location.href;
    var method = form.method ? form.method : 'POST';
    var enctype = form.enctype;

    /* aktualizaje danych niestandardowych */
    FormDestSender.fire('submit', form);

//    if (FormDestSender.onsubmitFunction)
//        for(var i = 0; i < FormDestSender.onsubmitFunction.length; i++){
//            FormDestSender.onsubmitFunction[i](form);
//        }

    /* analiza warunku onsubmit */

    if (form.onsubmit) if (!form.onsubmit()) {
//        sendButton.disabled = false;
        form.removeChild(blocker);
        return;
    }

    /* obsługa inputów formularza */

    var elements = form.elements;
    var element;
    var data = new Array();

    for(var elNo = 0; elNo < elements.length; elNo++){
        element = elements[elNo];

        if (element.name) {

            if (element.tagName == 'SELECT') {
                for (var optNo = 0; optNo < element.options.length; optNo++ ) {
                    var option = element.options[optNo];
                    if (option.selected)
                        data.push(element.name, option.value);
                }
            }else
            if (element.checked
                || element.type == 'text'
                || element.type == 'password'
                || element.type == 'hidden'
                || element.tagName == 'TEXTAREA'){
//                || element == sendButton) {

                data.push(element.name, element.value);
            }

        }
    }
    /* dodanie klawisza, który wysyła */
    data.push(sendButton.name, sendButton.value);

    var postData = '';
    for(var paramNo = 0; paramNo < data.length; paramNo += 2){
        if (postData.length) postData += "&";
        postData += data[paramNo] + '=' + encodeURIComponent(data[paramNo + 1]);
    }


    var sender = new DestSender(target, method, enctype);
    if (this.onLoadFunction) sender.onload(this.onLoadFunction);
    if (FormDestSender.onLoadFunction)
        sender.onload(FormDestSender.onLoadFunction)


    /* ANALIZA ODPOWIEDZI SERWERA
     * funkcja generowana jest dla każdego obiektu, ze względu
     * na odnośniki
     */

    sender.listener =
    function(txt, xml, sender) {

        /* wypełnienie formularza na podstawie nadesłanej informacji */
        FormDestSender.fill(form, sender.variables);


        /* odblokowanie formularza */
//        sendButton.disabled = false;

        /* właczenie inputów */
//        for (var n = 0; n < form.elements.length; n++) {
//            form[n].disabled = false;
//        }
        form.removeChild(blocker);

        if (xml && sender.statusText && !sender.statusTarget ) {

            var consumed = sender.getVariable('consumed');
            var fieldset = document.createElement('fieldset');
            fieldset.innerHTML = '<legend>Komunikat</legend>'
            var contentDiv = document.createElement('div');
            contentDiv.className = 'status_txt'
            fieldset.appendChild(contentDiv);

            /* konstrukcja atrapy */
            var formAtrapa = document.createElement('form');
            formAtrapa.className = form.className;
            var formId = form.getAttribute('id');
            if (formId) formAtrapa.setAttribute('id', formId);
            formAtrapa.appendChild(fieldset);

            var buttonNodeName = sendButton.nodeName;

            var button= document.createElement(buttonNodeName);
            if (buttonNodeName == 'INPUT') {
                button.value = "OK";
                button.type = "button";
            }
            else button.innerHTML = "OK";

            button.className = 'button';
            button.onclick = function(){
                formParent.innerHTML = '';
                formParent.appendChild(form);
            }

            formParent.innerHTML = '';
            formParent.appendChild(formAtrapa);
            contentDiv.innerHTML = sender.statusText;

            fieldset.appendChild(button);

        }

        var dalej = !consumed || target;
        return dalej;
    };

    var getParams = {'ajax' : true};
    sender.send(action, getParams, postData);

}


FormDestSender.fill = function(form, values){
    if (!values) return;

    var elements = form.elements;
    var element;
    var value, elName;

    /* funkcja ustawiająca wartość inputów */

    var ustaw = function(element, value) {
        if (typeof(value) != 'undefined') {

            if (element.type == 'radio' || element.type == 'checkbox'){
                if (element.value == value) element.checked = 'checked';
            }else {
                if (element.tagName == 'TEXTAREA' || element.tagName == 'SELECT' || element.type == 'text' || element.type == 'password' || element.type == 'hidden') {
                    element.value = value;
                }
            }
        }
    }

    for(var elNo = 0; elNo < elements.length; elNo++){
        element = elements[elNo];

        if (element.name) {
            elName = element.name;
            value = values[elName];

            if (elName.substr(-2) == '[]') {

                if (typeof(value) != 'undefined')
                    for(var n = 0; n < value.length; n++){
                        ustaw(element, value[n]);
                    }
            } else {
                ustaw(element, value);
            }
        }
    }

    FormDestSender.fire('fill', form);

}


/**
* Ustawia domyślną funkcję odbierającą
*/
FormDestSender.setDefaultOnLoad = function(funkcja) {
    FormDestSender.onLoadFunction = funkcja;
}


/**
 * Ustawia wskazany formularz do obsługi przez FormDestSender
 * Mozna wskazać cel odpowiedzi oraz funkcję obsługi ładowania
 */
FormDestSender.service = function(formId, target, onLoadFunction) {

    var form = $el(formId);
    var onSubmit = form.onsubmit;
    form.onsubmit = null;
    EventUtil.addEventHandler(form, 'submit', function(event){

        form.onsubmit = null;
        var element;
        if (!event) {
            event = window.event;
            element = event.srcElement;
            event.returnValue = false;
        } else {
            element = event.target;
            event.preventDefault();
        }

        form.onsubmit = onSubmit;
        new FormDestSender(onLoadFunction).send(element, target);
        
    });

    form.onsubmit = onSubmit;

    /* ustawienie onlick na klawiszach, coby wiedzieć kto nadusił */
    var elements = form.elements;
    for(var i = 0; i < elements.length; i++) {
        if (elements[i].type == 'submit') {
            EventUtil.addEventHandler(elements[i], 'click',
                function(event){
                    var button;
                    if (!event) {
                        event = window.event;
                        button = event.srcElement;
                    } else {
                        button = event.target;
                    }

                    form.sendButton = button;
                }
            );
        }
    }

}


/**
* Listenerzy akcji
*/
FormDestSender.on = function (obiekt) {
    if (!FormDestSender.nonStandardInput) FormDestSender.nonStandardInput = new Array();
    FormDestSender.nonStandardInput.push(obiekt);
}


FormDestSender.fire = function(eventName, form) {

    /* wypełnianie danych niestandardowych */
    var metoda;
    if (FormDestSender.nonStandardInput)
        for(var i = 0; i < FormDestSender.nonStandardInput.length; i++){
            metoda = FormDestSender.nonStandardInput[i][eventName];
            if (metoda) metoda(form)
        }

}

