/**
 * Uniwersalna klasa do wysyłania poleceń
 *
 * @version 2.8.1
 *
 * 2.6.0 (ge2b) ważna poprawka, analogiczna do AjaxTableCommand (wielokrotność)
 * 2.6.1 (ge2b) poprawka dostępu do this (wrrrrrr)
 * 2.6.2 (ge2b) jeszcze jedna poprawka dostępu do this (wrrrrrr)
 * 2.7.0 (ge2b) Dodanie dwóch metod umożliwiających dodawanie i ustawianie
 *              parametrów wysyłania w tabeli
 * 2.8.0 (web) Dodanie sendQuery, z powodu historii przeglądarki
 * 2.8.1 (web2.4) Bug rejestracji polecenia cmd
 */

AjaxCommands.prototype.send;
AjaxCommands.prototype.listener;
AjaxCommands.prototype.cmd;

AjaxCommands.prototype.buildSender;
AjaxCommands.prototype.buildCommand;


function AjaxCommands(url, messageHeader) {

    var messageConsole;
    if (messageHeader) messageConsole = new MessageConsole(messageHeader);

    var instance = this;

//    if (!AjaxCommands._created) {
//        AjaxCommands._created = true;

        this.getURL = function() {
            return url;
        };

        this.buildSender =
            function(params, komunikat, postFunction, toStore, targetId) {

                var sender = toStore instanceof DestSender ?
                    toStore : new DestSender(targetId);

                sender.listener = instance.listener;

                var senderBuilder = {

                    params : new Array(),
                    extraParams : new Array(),

                    message : null,
                    
                    send : function(queryString) {
                        if (!queryString) queryString = '';
                        else if (queryString[0] != '?') queryString = '?' + queryString;
                        
                        var params = dtUtils.arrayMerge(senderBuilder.params, senderBuilder.extraParams);
                        sender.send(instance.getURL() + queryString, params);
                        if (messageConsole) {
                            komunikat = komunikat ? komunikat : 'Command sended';
                            messageConsole.message('< :' + komunikat);
                        }
                        return sender;
                    },


                    appendConsoleMessage : function(message){
                        if (!senderBuilder.message) senderBuilder.message = '';
                        senderBuilder.message += message;
                    },

                    addPostFunction : function(postFunction){
                        if (postFunction) sender.onload(postFunction);
                    },

                    addParam : function(name, value){
                        if (value) senderBuilder.extraParams[name] = value;
                    },

                    setParams : function(paramsArray){
                        if (paramsArray) senderBuilder.extraParams = paramsArray;
                    },

                    addParams : function(paramsArray){
                        if (paramsArray) {
                            for (var paramName in paramsArray) {
                                senderBuilder.extraParams[paramName] =
                                    paramsArray[paramName];

                            }
                        }
                    },

                    setModule : function(module) {
                        if (module) senderBuilder.params['module'] = module;
                    },

                    setAction : function(action) {
                        if (action) senderBuilder.params['action'] = action;
                    },

                    setCommand : function(command) {
                        if (command) senderBuilder.params['cmd'] = command;
                    },

                    getDestSender : function() {
                        return sender;
                    }

                }

                if (params) senderBuilder.params = params;
                if (komunikat) senderBuilder.appendConsoleMessage(komunikat);
                if (postFunction) senderBuilder.addPostFunction(postFunction);
                senderBuilder.addParam('ajax', 'true');

                sender.store('start', new Date());
                if (toStore) sender.store('stored', toStore);

                return senderBuilder;
            }


        /**
         * Wysyła komunikaty do serwera
         *
         * @param params tablica parametrów do wysłania
         * @param komunikat komuniakt komunikat na konsolę
         * @param listener listener funkcja wywołana po przyjściu odpowiedzi
         * @param toStore obieklt do zapamiętania w senderze
         */
        this.send =
            function(params, komunikat, postFunction, toStore, respondeId) {

            var pomocnik =
            instance.buildSender(
                params, komunikat, postFunction, toStore, respondeId);
            pomocnik.send();

            return pomocnik.getDestSender();

        };

        this.sendQuery =
            function(queryString, komunikat, postFunction, toStore, respondeId) {

            var pomocnik =
            instance.buildSender(
                null, komunikat, postFunction, toStore, respondeId);
            pomocnik.send(queryString);

            return pomocnik.getDestSender();

        };


        this.listener = function(text, xml, sender) {
            var time = new Date();
            var czas = (time - sender.restore('start'))/1000;
            var statusText = sender.statusText;
            var status = null;
            if (!statusText) statusText = "Polecenie wykonane";
            status = sender.status;
            if (status) statusText += ' - status:' + status;

            statusText += ' [' + czas + 's]';
            if (messageConsole) messageConsole.message('> :' + statusText);

            var listener = sender.restore('listener');
            if (listener) return listener(text, xml, sender, status);
            else return true;
        };


        this.cmd =
            function(cmd, params, komunikat, postFunction, respondeId) {

                return instance.buildCommand(
                cmd, params, komunikat, postFunction, respondeId).send();
        };

        this.buildCommand =
            function(cmd, params, komunikat, postFunction, respondeId) {

                var builder = instance.buildSender(params, komunikat, postFunction, null, respondeId);
//                builder.addParam('cmd', cmd);
                builder.setCommand(cmd);

                return builder;

            }
//    }
}

