/**
 * Obsługa menu i linkowania na stronie utf-8
 * @version 2.2.1
 *
 * 1.30 - możliwość wysyłania wieloktrotnego filtru
 * 1.31 - poprawka w setBack
 * 1.40 - wykorzystanie nextAction
 * 1.50 - Zmiana Search - funkcja zupełnie niekompatybilna
 * 1.60 - Wprowadzenie zaznaczania ostatniego klawisza jako class="active"
 * 1.70 - Dostosowanie do subdir
 * 1.8.0 - w uniAction i moduleAction i sendCommand: okna confirm oraz zwracają fboolean
 * 1.9.0 - dodanie getUrlParams
 * 1.9.1 - (pt) setBack zwraca obiekt zasłonki
 * 1.9.2 - (pt) usunięcie automatycznego tworzenia nazwy modulu w uniAction
 * 1.10.0 - (p7) Zmiany w dynamicLayout (może być więcej) oraz sposób obsługi
 * 1.11.0 - (p7) Wprowadzenie obsługi scroll
 * 1.12.0 - (web) Nowa obsługa layoutów zgodna z nowym systemem wprowadzenia
 * 2.0.0 - (web) Tymczasowa obsługa historii, aż do zamiany wszystkich linków
 *               Mało testowane, działa w zasadzie na layoucie gigabyte
 * 2.1.0 - (obs) Szybkie poprawki do 2.0.0 oraz obsługi klawiszy aktywnych i wybranych
 * 2.2.0 - (web2.4) Całkowite przejście na historię haszową
 * 2.2.1 - (web2.4) Poprawka w dynamicLayout galerii
 */

var ajaxAction = {

    getUrlParam : function(paramName) {
      var reParam = new RegExp('(?:[\?&]|&amp;)' + paramName + '=([^&]+)', 'i') ;
      var match = window.location.search.match(reParam) ;

      return (match && match.length > 1) ? match[1] : '' ;
    },
    
    getURL : ajaxControler,
    instance : this,

    setLayoutManager : function(lm) {
        ajaxAction.installLayoutManager(lm);
    },

    installLayoutManager : function(lm) {
        if (!ajaxAction.layoutManager) ajaxAction.layoutManager = new Array();
        ajaxAction.layoutManager.push(lm);
    },

    sender : new AjaxCommands(ajaxControler),

    /**
     * Funckja do ustawiania parametrów
     * takze zmiennych sesyjnych, drugi parametr postAction tru wywołuje
     * przeładowanie strony lub wywołanie wskazanej metody po ustawieniu */
    setAction : function(parameters, postAction) {

        var param = "?cmd=set";
        var url = ajaxAction.getURL + param;

        var sender = new DestSender();
        if (postAction) {
            if (postAction == true) sender.listener = this.reload;
            else sender.listener = postAction;
        }
        sender.get(url, parameters);
    },

    /** 
     *Przeładowuje stronę
     */
    reload : function(text, xml, sender) {
        location.reload();
    },

    openSubmenuElement : null,

    /* metoda zajmuje się sterowaniem rozwijania podmenu */
    subMenuAction : function(groupName) {

        var group = document.getElementById(groupName);

        if (this.openSubmenuElement) {
            this.collapse(this.openSubmenuElement, true);

            var out = this.openSubmenuElement == group;
            this.openSubmenuElement = null;
            if (out)return;
        }
        
        
        if (group) {
            this.openSubmenuElement = group;
            this.collapse(group, group.style.display != 'none');
        }

    },

    /* Zamyka lub otwiera podmenu subMenu w zależności od collapse */
    collapse : function(subMenu, collapse) {
        if (collapse) {
            subMenu.style.display = "none";
        } else {
            subMenu.style.display = "";
        }
    },


    /**
     * Wywołuje żądanie zmiany wersji językowe  - wymaga podania skrótu
     * Przeładowuje witrynę
     */
    setLang : function(lang) {

        var param = {
            'cmd' : 'setLang',
            'c_lang' : lang
        }
//        "?cmd=setLang&c_lang=" + lang;
//        var url = ajaxAction.getURL + param;

        var sender = new DestSender();
        sender.listener = ajaxAction.reload;
        sender.get(ajaxAction.getURL, param);

//        ajaxAction.setAction({'c_lang' : lang}, true);
    },


    /* pamięta, że trwa oczekiwanie na odpowiedź */
    actionTask : false,

    menuAction : function(actionName, params, keyAction, targetId) {

        /* Nie można tego włączyć, gdyż */
//        this.subMenuAction();

        if (ajaxAction.actionTask) return;
        ajaxAction.actionTask = true;

        if (!params) params = new Array();

        params['action'] = actionName;

        var toStore = ajaxAction.waitSignalEnabled(keyAction);
        ajaxAction.history(params);
        ajaxAction.sender.send(
            params, null, ajaxAction.waitSignalDisabled, toStore, targetId );

    },

    uniAction : function(actionName, moduleName, params, keyAction, targetId, confirmText){

        if (confirmText) {
            if (!window.confirm(confirmText)) return false;
        }

        if (ajaxAction.actionTask) return false;
        ajaxAction.actionTask = true;

        /* specjalne oznaczenie dla akcji z menu tożsamego z wyborem modułu */
//        if (!moduleName) {
//            moduleName = actionName;
////            actionName = '_' + actionName;
//        }

        if (!params) params = new Array();

        params['action'] = actionName;
        if (moduleName) params['module'] = moduleName;

        var toStore = ajaxAction.waitSignalEnabled(keyAction);
        ajaxAction.history(params);
        ajaxAction.sender.send(
            params, null, ajaxAction.waitSignalDisabled, toStore, targetId );

        return true;
    },

    moduleAction : function(moduleName, params, keyAction, targetId, confirmText) {

        if (confirmText) {
            if (!window.confirm(confirmText)) return false;
        }

        if (ajaxAction.actionTask) return false;
        ajaxAction.actionTask = true;

        if (!params) params = new Array();

        params['module'] = moduleName;

        var toStore = ajaxAction.waitSignalEnabled(keyAction);
        ajaxAction.history(params);
        ajaxAction.sender.send(
            params, null, ajaxAction.waitSignalDisabled, toStore, targetId );

        return true;

    },

    systemAction : function(action, parameters, keyAction, targetId) {

        if (ajaxAction.actionTask) return;
        ajaxAction.actionTask = true;

        var param = "";
        param += "?ajax&system=" + action;
        var url = '/ajax.do.php' + param;

//        var sender = new DestSender();
        var sender = new DestSender(targetId);
        sender.setIgnoreServerDest(true);
        sender.listener = this.waitSignalDisabled;
        this.waitSignalEnabled(keyAction, sender);
        ajaxAction.history(parameters);
        sender.get(url, parameters);
    },

    //    i : 100,

    currentKeyAction : null,
    currentKeyActionClass : null,

    /* włącza akcję oczekiwania na odpowiedź z serwera */
    waitSignalEnabled : function(keyAction, sender) {

        document.body.style.cursor='wait';

        if (keyAction == null || keyAction.innerHTML == null) {
            return null;
        }

        if (keyAction != menu.activeButton) {

            if (ajaxAction.currentKeyAction) {
                ajaxAction.currentKeyAction.className = ajaxAction.currentKeyActionClass;
            }
            ajaxAction.currentKeyAction = keyAction;
            ajaxAction.currentKeyActionClass = keyAction.className;
            keyAction.className += ' ' + 'selected';

            var toStore = {
                'key':       keyAction,
                'key.inner': keyAction.innerHTML,
                'key.cursor':keyAction.style.cursor,
                'key.class':keyAction.className
            }

            if (sender) sender.save('stored', toStore);

//            keyAction.style.cursor= 'wait';
        }

//        $loadingText = slownik.translate("wczytywanie danych");
//        keyAction.innerHTML= '<span>' + $loadingText +'</span>';
        return toStore;
    },
    
    /* wyłącza akcję oczekiwania na odpowiedź z serwera */
    waitSignalDisabled : function(text, xml, sender, status) {
        
        document.body.style.cursor = '';
        ajaxAction.actionTask = false;
        window.status = "";

        var stored = sender.restore('stored');
        if (stored) {
            var key = stored['key'];
            key.className = stored['key.class'];
            key.style.cursor= stored['key.cursor'];
        }

        /* ustawienie layout */
        if (ajaxAction.layoutManager && xml) {
            var p = xml.getElementsByTagName('srv');
            if (p.length > 0) {
                
                var layout = p[0].getAttribute('dynamicLayout');
                if (layout) {
                    for(var lindex = 0; lindex < ajaxAction.layoutManager.length; lindex++) {
                        var lm = ajaxAction.layoutManager[lindex];
                        var layoutFunction = lm.setLayout(layout);
                        if (lm[layoutFunction]) {
//                            lm[layoutFunction]();
                            var afterInsert = lm[layoutFunction];
                            if (afterInsert) {
                                sender.afterInsert(afterInsert);
//                                lm.standardInsert = sender.insertFunction;
//                                sender.insertFunction = afterInsert;
                            }
                            lindex = ajaxAction.layoutManager.length;
                        }
                    }
                }
            }
        }

        /** sprawdzenie, zy wymagane jest przsesunięcie zawartości
         * witryny do góry, zakłądając, że zawartośc zawarta jest 
         * w container lub na podstawie wpisu w xml
         */

        var scrollConsumed = false;
        if (xml) {
            var srv = xml.getElementsByTagName('srv');
            if (srv.length > 0) {
                var scrollElement = p[0].getAttribute('scroll');
                if (scrollElement) {
                    scrollConsumed = true;
                    if (scrollElement != 'none') {
                        var scrollTarget = $el(scrollElement).offsetTop;
                        window.scroll(0, scrollTarget);
                    }
                }
            }
        }
        if (!scrollConsumed) {
            var scroll = document.documentElement.scrollTop;
            if ($el('header')) {
                var headerHeight = $el('header').clientHeight;
    //            alert('scroll: ' + scroll + ' - content: ' + headerHeight);
                if ( !headerHeight || scroll - headerHeight > 0 )
                    window.scroll(0, headerHeight - 50);
            }
        }

        return true;
    },

    /**
     * Dodaje witrynę do ulubionych
     */
    addFavorite : function() {
        var url = window.location.href;
        var title = document.title;
        
        if (this.isIE()) {
            window.external.addFavorite(url, title);
        } else
        if (window.sidebar) {
            window.sidebar.addPanel(title, url,"");
        } else
        if (window.opera && window.print) {

            var a = document.createElement('a');
            a.setAttribute('href', url);
            a.setAttribute('title', title);
            a.setAttribute('rel','sidebar');
            a.click();
        } else {
            alert("Zastosuj CTRL + D aby dodać witrynę do ulubionych");
        }
    },


    action : function(editor, addParams, targetId) {

        if (ajaxAction.actionTask) return;
        ajaxAction.actionTask = true;

        var params = editor.getParams();
        var keyAction = editor.getSource();

        if (addParams)
            for(var par in addParams)
                params[par] = addParams[par];

        var toStore = ajaxAction.waitSignalEnabled(keyAction, ajaxAction.sender.getDestSender());
        ajaxAction.history(params);
        /* params, komunikat, funkcja obsługi, do zapamiętania, cel odpowiedzi */
        ajaxAction.sender.send(
            params, null, ajaxAction.waitSignalDisabled, toStore, targetId );

    },

    /* funkcje wspomagające */

    inputFraza : function(editor, targetId) {

        var fraza = editor.getNewValue();
        if (fraza == '') {
            alert('Proszę podać frazę wyszukiwania');
            return false;
        }

        ajaxAction.menuAction(editor, {'fraza':fraza}, targetId);

        return true;
    },


    buttonFraza : function(action, inputId, targetId) {

        var fraza = $el(inputId).value;

        if (fraza == '') {
            alert('Proszę podać frazę wyszukiwania');
            return false;
        }
        
        ajaxAction.menuAction(action, {'fraza':fraza}, null, targetId);
        return true;
    },
   
    /**
     * STRONICOWANIE LISTY
     */
   showPage : function(moduleName, number, lastPage, action) {

        var testInteger = /^\d+$/;
        if(!testInteger.test(number)) {
            aktualna.select();
            alert('Wprowadź wyrażenie numeryczne');
            return false;
        }
        if (number <1) number = 1;
        if (number > lastPage) number = lastPage;


        var params = {
            'module' : moduleName,
            'page' : number
        };
        if (action) params['action'] = action;
        
        
        return ajaxAction.sendCommand('setPage', params, "Zmiana strony listowania");
    },


    setLimit : function(editor) {

        var moduleName = editor.getParams('module');
        var action = editor.getParams('action');
        var nextAction = editor.getParams('nextAction');

        var number = editor.getNewValue();
        var testInteger = /^\d+$/;
        if(!testInteger.test(number)) {
            alert('Nieprawidłowa wartość ' + number +'. Musi być numeryczna');
            return false;
        }

        var params = {
            'module' : moduleName,
            'limit' : number
        };

        if (action) params['action'] = action;
        else if (nextAction ) params['action'] = nextAction;

        return ajaxAction.sendCommand('setLimit', params, "Zmiana limitu");

    },


    setOrder : function(moduleName, fieldName, ord, action) {

        var params = {
            'module'    : moduleName,
            'order'     : fieldName + ' '+ ord
        };

        if (action) params['action'] = action;

        ajaxAction.sendCommand('setOrder', params, "Zmiana sortowania");
    },


    setFilter : function(moduleName, fieldName, value, action) {

        var params = {
            'module' : moduleName,
            'filterColumn' : fieldName,
            'filterValue' : value
        };

        if (action) params['action'] = action;
//        alert('Mam akcję: '+action);

        var updateFilter = function(status) {
            alert('Odebrałem:' + status);
            if (status)
                $el('aktualna').value = 1;
            return true;
        }

        var komunikat = 'Filtrowanie podług ' + fieldName + '=' + value;
//        ajaxAction.sendCommand('filter', params, komunikat, updateFilter);
        ajaxAction.sendCommand('filter', params, komunikat);

    },


    /**
     * Identyczne z setFilter, jednak pobiera emelka
     */
    addFilter : function(editor) {
        
        var moduleName = editor.getParams('module');
        var nextAction = editor.getParams('nextAction');
        var filterColumn = editor.getParams('filterColumn');
        var value = editor.getNewValue();

        var params = {
            'module' : moduleName,
            'filterColumn' : filterColumn,
            'filterValue' : value
        };

        if (nextAction) params['action'] = nextAction;

        return ajaxAction.sendCommand('filter', params, "Zmiana filtru");
    },


    logout : function() {
        ajaxAction.setBack(true);
        ajaxAction.sendCommand('logout', null, null, function(){
//            ajaxAction.menuAction('_init');
            ajaxAction.sendCommand(null, {'action':'_init'}, 'logout', function(){
                ajaxAction.setBack(false);
            });
        });
    },

    sendCommand : function(cmd, params, komunikat, postFunction, confirmText){

        if (confirmText) {
            if (!window.confirm(confirmText)) return false;
        }

        if (ajaxAction.actionTask) return false;
        ajaxAction.actionTask = true;

        var pomocnik = ajaxAction.sender.buildCommand(cmd, params, komunikat, postFunction);
        if (!postFunction) postFunction = ajaxAction.waitSignalDisabled;
        pomocnik.getDestSender().onload(postFunction);
        ajaxAction.waitSignalEnabled();
        ajaxAction.history(pomocnik.params);
        return pomocnik.send();
    },

    /**
     * Włączy lub wyłacza tło pulpitu
     */
    setBack : function(on) {
        var pane = $el('_disabledPane');
        if (!pane) {
            pane = document.createElement('div');
            pane.id = '_disabledPane';
            document.body.appendChild(pane);
        }
        if (on) pane.style.display = 'block';
        else pane.style.display = 'none';
        return pane;
    },

    /**
     * Sprawdza, czy przeglądarka, to Internet Explorer
     */
    isIE : function() {
        var ie = document.all
        return ie;
    }

};

FormDestSender.setDefaultOnLoad(ajaxAction.waitSignalDisabled);


ajaxAction.installLayoutManager(

    {
        setLayout : function(layout) {
            var p = layout.split(':');
            this.next_layout = p.shift();
            this.layout_params = p;
            return this.next_layout;
        },    

    
        galeria : function(targets, funkcja){
//            this.standardInsert(targets, funkcja);
            
            var zaslonka = ajaxAction.setBack(true);
            zaslonka.onclick = function(){
                zaslonka.onclick = null;
                ajaxAction.setBack(false);
                zaslonka.innerHTML = '';
            }
            return true;
        }
    }

);


/* HISTORIA PRZEGLĄDANIA ZA POMOCĄ # */
ajaxAction.historyDisabled = false;
ajaxAction.historyReload = false;

if (!ajaxAction.historyDisabled) {
    
    if ("onhashchange" in window) {
        window.onhashchange = function () {
            ajaxAction.history();
        }
    } else { 
        ajaxAction.storedHash = window.location.hash;
        window.setInterval(function () {
            if (window.location.hash != ajaxAction.storedHash) {
                ajaxAction.storedHash = window.location.hash;
                ajaxAction.history();
            }
        }, 100);
    }
}

ajaxAction.history = function(paramsArray){
    if (ajaxAction.historyDisabled) return;

    if (paramsArray) {
        if (paramsArray['history'] == '0');
        else window.location.hash = '?' + dtUtils.arrayToURLParams(paramsArray);
        return;
    }

//    ajaxAction.setBack(false);
    var hash = window.location.hash;
    if (hash[1] == '?') {

        if (!ajaxAction.actionTask) {
            ajaxAction.actionTask = true;
            var toStore = ajaxAction.waitSignalEnabled();
            ajaxAction.sender.sendQuery(window.location.hash.substring(1),
                null, ajaxAction.waitSignalDisabled, toStore);            
        }

    } else if(!hash) {
        var sq = window.location.search;
        if (!sq) sq = 'action=_init';
        else ajaxAction.historyReload = true;
        ajaxAction.sender.sendQuery(sq, null, ajaxAction.waitSignalDisabled, toStore);
    }
}
