/*
 * Biblioteka przydatnych funkcji opracowana
 * przez DT Studio s.c.
 *
 * @version 1.41
 * 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
 */

/**
 * 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) {
    return document.getElementsByName(elementName);
}

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;
    }
}



function ModuleInputService(moduleName, key, funkcja) {
    return new InputService(key, funkcja, null, null, null, {moduleName : moduleName});
}


/**
 * Ustawiać na onclick dla inputów
 * Wywołują funkcję na onchange z parametrem emelek
 */
function InputService(input, funkcja, editClass, row, col, params) {

    var keyMemory = input.value;
    var mKeyClass = input.className;
    var mEditClass = editClass ? editClass : 'edit';
    var edit = function() {
        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();}
    input.onblur = function() {cancel();}
    input.onkeyup = function(event) {
        if (!event) event = window.event;
        if (event.keyCode == 27) input.blur();
        if (event.keyCode == 13) {
            input.disabled = false;
            funkcja( emelek );
            keyMemory = input.value;
            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;

}


/**
 * 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 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) {
    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;
    
}
