/*
 * Biblioteka przydatnych funkcji opracowana
 * przez DT Studio s.c.
 *
 * @version 1.8.4
 * 1.3  - arrayToURLParams przekazuje parametry tablicowe
 * 1.31  - emelki poprawnie zwracają informacje o dodatkowych parametrów
 * 1.4  - Dodanie image changera
 * 1.41  - Zaznaczanie pola tekstowego na początek edycji
 * 1.42  - dodanie addEventListener
 * 1.43  - wączenie ajaxowego tła w fullimage
 * 1.5.0  - (ge2b) Dodanie Serwisu setValue dla selekcji w nowym oknie (nie działa)
 * 1.5.1  - (ge2b) Małe acz istotne bugontko
 * 1.6.0  - (p7) Dodanie metody getUrlParam
 * 1.7.0  - (p7) Nowy parametr i działanie funkcji $$el, teraz także tworzy
 * 1.7.1  - (p7) Poprawka e Event umożliwia dodawanie eventów do window
 * 1.7.2  - (pt) Standardowe wyświetlanie normalnych obrazków w fullimage
 * 1.8.0  - (obs) Nowe wrzuty do kontenerów i metoda innerXHTML
 * 1.8.1  - (web2.4) Wyrzucenie śmieci
 * 1.8.2  - (web2.4) Funkcja usługowo testowa arrayShow(array)
 * 1.8.3  - (web2.4) scriptInsert jako wklejenie tekstu i nieznaczne przyśpieszenie
 * 1.8.4  - (web2.4) bug do 1.8.3
 */


function fullimage(img, showBigImage){

    var image = img.src;
    var tab = ImageChanger.pathFile(image);

    if (showBigImage) tab['path'] += '_big';
    var bigImage = tab['path'] + '/' + tab['file'];
    var pane = ajaxAction.setBack(true);
    pane.onclick = function(){
        pane.innerHTML = '';
        ajaxAction.setBack(false);
    }

    pane.innerHTML = '<img class="big_image" src="' + bigImage +'"/>';

//

//      $('#_disabledPane').append('<img id="image_preview" style=";border:1px solid white;margin-top:120px;max-height:500px"  onclick="$('+"'image_preview'"+').remove();ajaxAction.setBack(false);" src="'+image+'"/>');
//    $('body').append('<div id="szadok" onclick="$('+"'#szadok'"+').remove();ajaxAction.setBack(false);"><img style="border:1px solid white;margin-top:5%;max-height:80%;max-width:80%"  onclick="$('+"'#szadok'"+').remove()" src="'+bigImage+'"/></div>');
//    $('#szadok').fadeIn('slow');

}


/**
 * Funckja zwraca obiekt o podanym id,
 * lub obiekt jeśli parametr jest obiektem
 */
function $el(elementName) {
    var isString = (elementName === elementName.toString());
    if (isString) return document.getElementById(elementName);
    else return elementName;
}

function $$el(elementName, tag) {
    var element = document.getElementsByName(elementName);
    if (!element) {
        if (!tag) tag = 'div';
        element = document.createElement(tag);
    }
    return element;
}

var dtUtils = {

    /**
     * Zamyka wskazany element
     * @param element element do kolapsu
     * @param on wysokość po włączeniu
     * @param off wysokość po włączeniu lub null, gdy ma zniknąć
     */
    colapse : function(element, on, off) {
        var el = $el(element);
        if (!off) {
            if (!el.style.display || el.style.display == '') el.style.display = 'none';
            else {
                el.style.display = '';
                if (on) el.style.height = on;
            }
        } else {
            if (!el.style.height || el.style.height == off) el.style.height = on;
            else el.style.height = off;
        }
    },


    /**
     * Konwertuje tablicę asocjacyjną na parametry URL
     */
    arrayToURLParams : function(paramsArray, dzielnik, sufix) {

        if (!dzielnik) dzielnik = "&";
        if (!sufix) sufix = '';
        var params = "";
        var value;
        if (paramsArray)
            for (var paramName in paramsArray) {
                if (paramsArray[paramName] instanceof Array)
                    this.arrayToURLParams(paramsArray[paramName], dzielnik, '[]');
                else {
                    value = "";
                    if (paramsArray[paramName])
                        value = '=' + encodeURIComponent(paramsArray[paramName]);
                    params += dzielnik + paramName + sufix + value;
                }
            }

        //        var params = encodeURIComponent(paramsArray.join(dzielnik));
        return params;
    },

    getUrlParam : function(paramName) {
        return dtUtils.getQueryParam(paramName, window.location);
    },

    getQueryParam : function(paramName, query) {
        var reParam = new RegExp('(?:[\?&]|&amp;)' + paramName + '=([^&]+)', 'i') ;
        //      var match = window.location.search.match(reParam) ;
        var match = query.search.match(reParam) ;

        return (match && match.length > 1) ? match[1] : '' ;
    },

    /**
     * Łączy wiele tablic w jedną
     */

    arrayMerge : function(array1, array2) {

        var arrays = arguments;
        var mergedArray = new Array();

        for (var ia = 0; ia < arrays.length; ia++) {
            var array = arrays[ia];
            for (var i in array)
                mergedArray[i] = array[i];
        }
        return mergedArray;
    },

    arrayShow : function(arrayToShow) {

        var cechy = '';
        for(var i in arrayToShow){
            cechy += '' + i + ' = ' + arrayToShow[i] + '\n';
        }
        alert(cechy);

    }
}


/**
 * Proste opakowanie dla klasy zapewniające pełna obsługę inputów
 */
function FullModuleInputService(input, command, action, moduleName, parameters, ajaxControler) {

    var funkcja = function(editor) {
        var element     = editor.getSource();
        var oldValue    = editor.getOldValue();
        var newValue    = editor.getNewValue();

        if (!command) command = 'setValue';
        if (!ajaxControler) command = 'ajax.do.php';

        if (!parameters) parameters = new Array();

        parameters['cmd'] = command;
        parameters['action'] = action;
        parameters['module'] = moduleName;
        parameters['oldValue'] = oldValue;
        parameters['newValue'] = newValue;

        var sender = new DestSender();
        sender.send(ajaxControler, parameters);

    }

    return new InputService(input, funkcja);
}


function ModuleInputAction(input, moduleName, action, funkcja, parameters, targetId, noClear){

    if (!parameters) parameters = new Array();
    parameters['module'] = moduleName;
    parameters['action'] = action;

    if (noClear && noClear !== false) noClear = true;

    return new InputService(input, funkcja, null, null, null, parameters, targetId, noClear);
}


/**
 * Proste opakowanie dla klasy InputService 
 * dla łatwiejszego ustawiania parametrów
 */
function ModuleInputService(moduleName, key, funkcja, action, targetId) {
    return new InputService(
    key, funkcja, null, null, null, {'module' : moduleName, 'action':action}, targetId);
}


/**
 * Ustawiać na onclick dla inputów
 * Wywołują funkcję na onchange z parametrem emelek
 */
function InputService(input, funkcja, editClass, row, col, params, targetId, noClear) {

    var keyMemory = input.value;
    var mKeyClass = input.className;
    var mEditClass = editClass ? editClass : 'edit';
    var edit = function() {
        if (input.className == 'editable') input.className = mEditClass;
        keyMemory = input.value;input.select();}
    var cancel = function() {input.className = mKeyClass;input.value = keyMemory;}

    var emelek = {
        editor      : true,
        getNewValue : function() {return input.value;},
        getOldValue : function() {return keyMemory;},
        getRow      : function() {return row;},
        getColumn   : function() {return col;},
        getSource   : function() {return input;},
        getParams   : function(name) {
            if (!params) return null;
            if (!name) return params; else return params[name];
        },
        status      : function(status) {}

    }

    /* uwaga wewnątrz tych funkcji <this> oznacza element HTML key */
    input.onfocus = function() {edit();}
    if (!noClear) input.onblur = function() {cancel();}
    input.onkeyup = function(event) {
        if (!event) event = window.event;
        if (event.keyCode == 13) {
            input.disabled = false;
            funkcja( emelek );
            keyMemory = input.value;
            input.blur();
        }
        if (event.keyCode == 27) input.blur();
    }
    edit();

}

/**
 * Ustawiać na onclick dla selektów
 * Wywołują funkcję na onchange z parametrem emelek
 */
function SelectService(select, funkcja, row, col, params) {
    var keyMemory = select.value;

    var emelek = {
        //        editor      : true,
        getNewValue : function() {return select.value;},
        getOldValue : function() {return keyMemory;},
        getRow      : function() {return row;},
        getColumn   : function() {return col;},
        getSource   : function() {return select;},
        getParams   : function(name) {
            if (!params) return null;
            if (!name) return params; else return params[name];
        },
        status      : function(status) {}
    }

    /* uwaga wewnątrz tych funkcji <this> oznacza element HTML key */
    select.onchange = function() {
        funkcja( emelek );
        keyMemory = select.value;
    }
}

/**
 * Ustawiać na onclick dla selektów
 * Wywołują funkcję na onchange z parametrem emelek
 */
function PathService(key, value, funkcja, row, col, params) {

    var oldValue = value;
    var newValue = null;

    var emelek = {
        getNewValue : function() {return newValue;},
        getOldValue : function() {return oldValue;},
        getRow      : function() {return row;},
        getColumn   : function() {return col;},
        getSource   : function() {return key;},
        getParams   : function(name) {
            if (!params) return null;
            if (!name) return params; else return params[name];
        },
        status      : function(status) {},
        refresh     : true
    }

    var heniek = function(link) {
        newValue = link;
        funkcja( emelek );
        oldValue = link;
    }
    
    key.browser.onFileSelect = heniek;

}


/**
 * Ustawiać na mouseover dla przycisków otwierających okna
 */
function WindowService(key, value, setValueObject, row, col, params) {

    var oldValue = value;
    var newValue = null;

    var emelek = {
        getNewValue : function() {return newValue;},
        getOldValue : function() {return oldValue;},
        getRow      : function() {return row;},
        getColumn   : function() {return col;},
        getSource   : function() {return key;},
        getParams   : function(name) {
            if (!params) return null;
            if (!name) return params; else return params[name];
        },
        status      : function(status) {},
        refresh     : true
    }

    var heniek = function(link) {
        newValue = link;
        setValueObject.setValue( emelek );
        oldValue = link;
    }

    key.onclik = heniek;

}


/**
 * Generuje zdarzenie pozwalające wymieniać na przemian obrazki
 * Zastosowanie: klik małej ikonki do podglądu dużego
 * @version 1.0
 */
function ImageChanger(smallImg, bigImg, smallPath, bigPath, eventType){

    var smallImage = smallImg.src;
    var bigImage = bigImg.src;

    var sInfo = ImageChanger.pathFile(smallImage);
    var bInfo = ImageChanger.pathFile(bigImage);

    smallImage = sInfo['file'];
    bigImage = bInfo['file'];

    if (!smallPath) smallPath = sInfo['path'];
    if (!bigPath) bigPath = bInfo['path'];

    bigImg.src = bigPath + smallImage;
    smallImg.src = smallPath + bigImage;

}

ImageChanger.pathFile = function(file) {
    var tab = file.split('/');
    var plik = tab[tab.length - 1];
    var path = tab.length > 1 ?
    file.substr(0, file.length - plik.length) : '';
    tab = path.split('/_');
    path = tab.length == 1 ? tab[0] : tab[0] + '/';
    return {'path' : path, 'file' : plik};
}


/* KONIEC IMAGE CHANGER */


/**
 * Wykonuje podobne zadanie co innerHTML, ale tutaj dla elementów XML
 * służy tylko do odczytu
 * @param xmlElement - element, któremu należy odczytać zawartość
 */
function innerXHTML(xmlElement) {
    var inner = "";
    var nodeName;
    var nodeValue;
    var attrs;
    for (var child = xmlElement.firstChild; child; child = child.nextSibling) {
        nodeName = child.nodeName.toLowerCase();
        if (nodeName && nodeName[0] != '#') {
            inner += '<' + nodeName;
            attrs = child.attributes;
            if (attrs)
                for(var i = attrs.length - 1; i >= 0 ; i--){
                    inner += ' ' + attrs[i].name + '="' + attrs[i].value + '"';
                }
            if (child.hasChildNodes()){
                inner += '>';
                inner += innerXHTML(child);
            }
            inner += '</' + nodeName + '>';
        } else {
            nodeValue = child.nodeValue;
            if (nodeValue) inner += nodeValue;
        }
    }
    return inner;
}



function ScriptRunner(scriptTag, targetHTML, kursor) {

    this.kursor = kursor;
    this.targetHTML = kursor ? kursor.parentNode : targetHTML;

    var src = scriptTag.getAttribute('src');

    if (!src) this.run(innerXML(scriptTag));
    else this.loadAndRun(src);

}

ScriptRunner.prototype.run = function(source, starget, skursor){

    var target = starget ? starget : this.targetHTML;
    var kursor = skursor ? skursor : this.kursor;

    document.write = function(output) {
        if (output)
            xHTML.insertScript(output, target, kursor);
    }

    try{
        eval(source);
    }catch(e){
        alert(e);
        alert('Błąd w ładowanym skrypcie: ' + source)
    }

}

ScriptRunner.prototype.loadAndRun = function(url) {

    var a = new Asynchronous();

    var runner = this.run;
    var target = this.targetHTML;
    var kursor = this.kursor;

    a.complete = function(status, statusText, responseText){
        runner(responseText, target, kursor);
    }
    a.call(url);

}


var xHTML = {

    oryginalWrite : document.write,

    insertScript : function(scriptTxt, target, kursor) {
        var div = document.createElement('div');
        div.innerHTML = scriptTxt;
        xHTML.insertChilds(div, target, kursor);
    },

    insertChilds : function(xmlElement, target, kursor) {

        var child;

        if ( !xmlElement.getElementsByTagName('script').length ) {
            var df = document.createDocumentFragment();
            for (child = xmlElement.firstChild; child; child = child.nextSibling) {
                df.appendChild(child.cloneNode(true));
            }
            xHTML.insertAfter(target, kursor, df);
            return;
        }

        var nodeName;
        var clone;

        for (child = xmlElement.firstChild; child; child = child.nextSibling) {

            nodeName = child.nodeName.toLowerCase();

            if ( (nodeName[0] == '#' || !child.getElementsByTagName('script').length) && nodeName != 'script') {
                clone = child.cloneNode(true);
                xHTML.insertAfter(target, kursor, clone);
                kursor = clone;
            } else {
                if (nodeName != 'script') {
                    clone = child.cloneNode(false);
                    xHTML.insertAfter(target, kursor, clone);

                    if (child.hasChildNodes()){
                        xHTML.insertChilds(child, clone);
                    }
                    kursor = clone;

                } else {
                    /* tu napewno noda jest skryptem */
//                    clone = xHTML.insertScriptTag(child, target);
                    new ScriptRunner(child, target, kursor);
                    kursor = target.lastChild;
                }
            }
        }
    },


    /**
     * @param parent obiekt, do któego należy wstawić element
     * @param kursorTag tag po którym należy wstawić element, jeśli tag = null
     * wsatawianie będzie na początek rodzica
     * @param tagToInsert tag który ma być wstawiony
     */
    insertAfter : function(parent, kursorTag, tagToInsert) {
        var next;

        if (kursorTag) {
            parent = kursorTag.parentNode;
            next = kursorTag.nextSibling;
        } else next = parent.firstChild;
        
        if (next) parent.insertBefore(tagToInsert, next);
        else parent.appendChild(tagToInsert);
    }
}

/**
     * Wykorzystywane dla tagówe z javascryptem dla innych się nie nadaje
     * @param xmlElement - element, któremu należy odczytać zawartość
     */
function innerXML(xmlElement) {
    var inner = "";
    for (var child = xmlElement.firstChild;
        child; child = child.nextSibling) {
        inner += child.nodeValue;
    }
    return inner;
}


function getBodySize() {

    var w = (window.innerWidth) ? window.innerWidth : document.body.offsetWidth;
    var h = (window.innerHeight) ? window.innerHeight : document.body.offsetHeight;

    var size = {
        width : w,
        height : h
    };
    return size;
}

var EventUtil = new Object();
EventUtil.addEventHandler = function(target, eventType, listener) {
    if (target != window) target = $el(target);
    if (target.addEventListener)
        target.addEventListener(eventType, listener, false);
    else if (target.attachEvent)
        target.attachEvent('on' + eventType, listener);
    else
        target['on' + eventType] = listener;
    
}

EventUtil.addEventListener = EventUtil.addEventHandler;

