FormDestSender.prototype.send = null;
FormDestSender.prototype.setDefaultOnLoad = 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 2.10
 *
 * 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
 */

function FormDestSender(formId, onLoadFunction) {

    this.form = $el(formId);
    this.onSubmitListeners = new Array();
    this.onSubmitListeners.push();
    
    if (!FormDestSender.functionCreated) {
        FormDestSender.functionCreated = true;

        FormDestSender.prototype.send =
        function(sendButton, target) {

            var instance = this;
            var form = instance.form;
            var formInner = form.innerHTML;

            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);

            var action = form.action;
            var method = form.method;
            var enctype = form.enctype;

            /* poprawka FCK editora */

            try{
                if (typeof(FCKeditorAPI) != 'undefined')
                if (FCKeditorAPI.Instances) {
                    for ( var name in FCKeditorAPI.Instances ){
                        var oEditor = FCKeditorAPI.Instances[ name ] ;
                        if ( oEditor.GetParentForm && oEditor.GetParentForm() == form )
                            oEditor.UpdateLinkedField() ;
                    }
                }
            }catch(e){}

            /* obsługa formularza */
            form.sendButton = sendButton;
            if (form.onsubmit) if (!form.onsubmit()) {
                sendButton.disabled = false;
                form.removeChild(blocker);
                return;
            }

            var elements = form.elements;
            var element;
            var data = new Array();

            for(var elNo = 0; elNo < elements.length; elNo++){
                element = elements[elNo];

                if (element.name) {
                    element.disabled = true;

                    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) {

//                            alert('Dodaję: ' + element.name + ' => ' + element.value);
                            data.push(element.name, element.value);
                    }

                }
            }

            var params = '';
            for(var paramNo = 0; paramNo < data.length; paramNo += 2){
                if (params.length) params += "&";
                params += data[paramNo] + '=' + encodeURIComponent(data[paramNo + 1]);
//                alert('Mam: ' + data[paramNo] + ' => ' + data[paramNo + 1]);
            }

            
            var sender = new DestSender(target, method, enctype);
            if (onLoadFunction) sender.onload(onLoadFunction);
            if (FormDestSender.onLoadFunction)
                sender.onload(FormDestSender.onLoadFunction)

            sender.listener =
            function(txt, xml, sender) {

//                alert('Mam to wyłączyć? //' + sendButton.disabled);
                sendButton.disabled = false;
                
                /* właczenie inputów */
                for (var n = 0; n < form.elements.length; n++) {
                    form[n].disabled = false;
                }
                form.removeChild(blocker);


//                    if (!sender.status && sender.statusText) {
                if (!target && xml && sender.statusText) {
                        
                    var div = document.createElement('h2');
                        
                    var button = document.createElement(sendButton.nodeName);
                    if (sendButton.nodeName == 'INPUT') {
                        button.value = "OK";
                        button.type = "button";
                    }
                    else button.innerHTML = "OK";

                    button.className = 'button';
                    button.onclick = function(){
                        form.innerHTML = formInner ;
                    }

                    form.innerHTML = '';
                    form.appendChild(div);
                    div.innerHTML = sender.statusText;

                    form.appendChild(button);
                        
                    return false;
                }

                var dalej = xml ? true : false;
                if (!dalej) form.innerHTML = formInner;
                return dalej;
            };

            //            form.innerHTML =
            //                '<h3>Trwa wysyłanie danych</h3>';

            sender.send(action, null, params);

        }
    }
}

/**
* Ustawia domyślną funkcję odbierającą
*/
function FormDestSender_setDefaultOnLoad(funkcja) {
    FormDestSender.onLoadFunction = funkcja;
}

FormDestSender.setDefaultOnLoad = FormDestSender_setDefaultOnLoad;
