/*
 * Biblioteka przydatnych funkcji opracowana
 * przez DT Studio s.c.
 *
 * @version 1.42
 * 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
 */


function fullimage(img, bigPath){

    var image = img.src;
    var tab = ImageChanger.pathFile(image);

    if (!bigPath) bigPath = tab['path'] + '_big';
    var bigImage = bigPath + '/' + tab['file'];

//    ajaxAction.setBack(true);
//      $('#_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()"><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) {
    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 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;

}


/**
 * 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;
    
}

EventUtil.addEventListener = EventUtil.addEventHandler;

