//---------------------------------------------------------------------------
// Copyright :  epharmexx GmbH, 20537 Hamburg, Normannenweg 10
//              Veränderung oder Nutzung der Scripte/Anwendung ist nur mit
//              schriftlicher Genehmigung der epharmexx GmbH gestattet.
//
// Datei:       inc/jd/common.js
//
//              kleine js-Helfer für alle Scripte
//
//              _ausschließlich_ allgemein verwendbare Funktionen, also z.B.
//              keine Funktionen, die auf spezifischen Elemente über deren
//              Namen oder Ids zugreifen!
//
// include:     wird in HTML_HEAD eingebunden
//
// 07.03.06 lb: Script erstellt
//
// $Id: common.js,v 1.21 2006/10/27 15:13:44 lutz Exp $
//---------------------------------------------------------------------------


var global_topframe = findTopFrameset();  // document-Objekt des Applikation-Framesets



// Referenz des DOM-Objects mit der Id $id zurückgeben
function getObjectById(id) {
    return document.all ? document.all[id] : document.getElementById(id);
}

// globale js-Variable sind im Menu-Frame definiert
function getGlobalVariable(name) {

    if (global_topframe.frames['Links']) {
        return global_topframe.frames['Links'][name];
    }
    else if (eval(name)) {
        return eval(name);
    }
    else {
        return null;
    }
}

// das DOM-Object mit der Id $id verbergen
function hide(id) {
    var x = getObjectById(id);
    x.style.display = 'none';
    x.style.visibility = 'hidden';
}

// das DOM-Object mit der Id $id anzeigen
function show(id) {
    var x = getObjectById(id);
    x.style.display = '';
    x.style.visibility = 'visible';
}

function addGetParameter(url, pname, pval) {
    var sep = url.indexOf('?') == -1 ? '?' : '&';
    return url + sep + pname + '=' + pval;
}

//liefert den Wert eines Atrributes eines DOM-Nodes
function getAttributeValue(node,attrName){

    if(node.getAttributeNode(attrName)) return node.getAttributeNode(attrName).value;
    if(node.getAttribute(attrName)) return node.getAttribute(attrName);
    return null;
}

function getElementAbsPos(element) {
    var left = 0;
    var top  = 0;
    var reference = element;
    while(reference){
        top  += reference.offsetTop;
        left += reference.offsetLeft;
        reference = reference.offsetParent;
    }
    return [left, top];
}

// true wenn needle in haystack enthalten ist, sonst false
function inArray(needle, haystack) {
    for (var i=0; i<haystack.length; i++) {
        if (needle == haystack[i]) {
            return true;
        }
    }
    return false;
}


// XMLHttpRequest
function XMLHttpRequestClient(serverScript) {

    var xmlreq = false;
    var method = 'GET';
    var serverUrl = null;
    var response  = null;
    var jsCallback = null;
    var jsCallbackParameters = null;
    var debug = false;

    serverUrl = _serverUrl(serverScript);

    this.Request = doRequest;

    if (typeof XMLHttpRequest == "undefined") {
        function XMLHttpRequest() {
            try {
                xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (E) {
                    xmlhttp = false;
                }
            }
            return xmlhttp;
        }
    }
    else {
        xmlreq = new XMLHttpRequest();
    }
    return;

    function doRequest(handler, handler_parameters, callback, callback_parameters) {

        jsCallback = callback;
        jsCallbackParameters = callback_parameters;

        var sep = serverUrl.search(/\?/) == -1 ? '?' : '&';
        xmlreq.onreadystatechange = ProcessReqChange;
        xmlreq.open(method, serverUrl + sep + 'f=' + handler + _getUrlParameters(handler_parameters), true);
        xmlreq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1');
        xmlreq.send(null);
    }

    function ProcessReqChange() {

        if (xmlreq.readyState == 4) {
            if (jsCallback != null) {
                response = unescape(xmlreq.responseText);

                eval(jsCallback + "(response" + _getParametersList(jsCallbackParameters) + ")");
            }
        }
    }

    function _getUrlParameters(parameters) {
        var str = '';
        for (var i=0; i<parameters.length; i++) {
            str = str + "&p" + i + "=" + encodeURIComponent(parameters[i]);
        }

        return str;
    }

    function _getParametersList(parameters) {

        var str = '';
        for (var i=0; i<parameters.length; i++) {
            str = str + ",'" + parameters[i] + "'";
        }

        return str;
    }


  function _serverUrl(script) {

        try {
            // der ie kann nicht auf window.location zugreifen, wenn die Funktion,
            // die den XMLHttpRequestClient erzeugt, ueber parent.functionname() aufgerufen wird
            var url = window.location['protocol'] +  '//' + window.location['host'] + getGlobalVariable('web_path') + script;
        }
        catch (e) {
            // ... aber er begnuegt sich mit dem Scriptnamen als Parameter furr XMLHttpRequest.open()
            var url = getGlobalVariable('web_path') + script;
        }

        return addGetParameter(url, getGlobalVariable('session_name'), getGlobalVariable('session_id'));
    }


}

// rebuild an array returned from server as string
// optional delimiter defaults to ~
function jsArrayFromString(s, delim) {
    var d = (delim == null)? '~' : delim;
    return s.split(d);
}


// topFramesset liefert das document-Objekt des Applikation-Framesets
function findTopFrameset() {

    var frameset = 'undefined';

    try {
        if (top.location.host == document.location.host) {

            // ein einfacher Frameset, ohne SSL-Frame
            frameset = top;
        }
    }

    // zusätzlicher Frame wegen https
    catch (e) {
        try {
            if (parent.parent.location.host == document.location.host) {

                // Frame im Frame, z.B. ein IFrame zur Listenausgabe
                frameset = parent.parent;
            }
        }
        catch(ee) {
            try {
                if (parent.location.host == document.location.host) {

                    // ein Script in der Stage, das Menu oder der Head
                    frameset = parent;
                }
            }
            catch (eee) {

               // ganz ohne Frameset
               frameset = self;
            }
        }
    }

    return frameset;
}


// beliebigen Inhalt in einen Div-Bereich schreiben
// z.B.
// javascript:requestDivContent('employees/xml_http_vacation_requests.php',
//                              'calendar_navigation', 'navigation', new Array('2006-07-01'))
function requestDivContent(serverscript, func, divid, param) {

    var req = new XMLHttpRequestClient(serverscript);
    req.Request(func, param, "putDivContent", new Array(divid));
}

function putDivContent(content, divid) {
    if (getObjectById(divid))  {
        getObjectById(divid).innerHTML = content;
    }
}

function requestParentDivContent(serverscript, func, divid, param) {

    var req = new XMLHttpRequestClient(serverscript);
    req.Request(func, param, "putParentDivContent", new Array(divid));
}

function putParentDivContent(content, divid) {
    if (parent.getObjectById(divid))  {
        parent.getObjectById(divid).innerHTML = content;
    }
}


// liefert eine Referenz der Methode methodname von Object object,
// das benötigt wird, um die Methode als Eventhandler zu verwenden
function createEventhandlerMethodReference(object, methodname) {
//     alert(methodname);
    return function (event) {
        object[methodname].call(object, event || window.event);
    }
}


// class epxPopupWindow
//
// allgemein verwendbares, verschiebares und in der Größe veränderbares Layer-Popup
// (siehe contacts/contactcenter.[js|php] detailPopupWindow() für eine Anwendung)
function epxPopupWindow(popup) {
    this.popup    = popup;    // Referenz des divs, das das Popup enthält
    this.poptable = null;     // Referenz der äußeren Tabelle des Popoup-Inhalts
    this.contenttable = null;
    this.caption  = null;     // Referenz der Tabellenzelle mit der Popup-Kopfzeile
    this.resizer  = [];       // Referenzen der Images, mit denen die Größe des Popups verändert werden kann

    this.options = {
        drag:   true,         // Popup ist verschiebbar
        resize: true          // Popupgröße ist veränderbar
    };

    this.moveit  = false;     // true, solange das Popup verschoben wird
    this.resize  = false;     // true, während die Größe verändert wird

    this.startxy = [];        // Koordinaten des Divs beim Start des Verschiebens
    this.mousedxy = [];       // Offset der Mauskoordinaten gegenüber startxy
}

// Intialisierungen nachdem das Popup seinen Inhalt hat,
// Aufrzf erfolgt aus der initDisplay()-Methode
epxPopupWindow.prototype.initDisplay = function() {
    if(!this.poptable) {
        this.poptable = getObjectById('pop-table');
    }
    this.contenttable = this.poptable.getElementsByTagName('table')[0];
    this.caption  = this.popup.getElementsByTagName('td')[0];
    this.resizer  = findResizer(this.popup);

    if (this.options['drag']) {
        this.caption.onmouseover = createEventhandlerMethodReference(this, 'popDragStart');
    }
    else {
        this.caption.style.cursor = 'auto';
    }

    for (var i=0; i<this.resizer.length; i++) {
        if (this.options['resize']) {
            this.resizer[i].onmousedown = createEventhandlerMethodReference(this, 'popResizeStart');
        }
        else {
            this.resizer[i].style.cursor = 'auto';
        }
    }

    // liefert Objekt-Referenzen für die Resizer-Grafiken
    function findResizer(popup) {
        var imgs = popup.getElementsByTagName('img');
        var resizers = [];
        for (var i=0; i<imgs.length; i++) {
            if (imgs[i].className == 'pop-resizer') {
                resizers.push(imgs[i]);
            }
        }
        return resizers;
    }
}

// onMouseOver-Handler der Popup-Fenstertitelzeile
epxPopupWindow.prototype.popDragStart = function(e) {
    this.startxy = getElementAbsPos(this.popup);
    this.caption.onmouseout  = createEventhandlerMethodReference(this, 'popDragOut');
    this.caption.onmousedown = createEventhandlerMethodReference(this, 'popDragBegin');
    document.onmouseup       = createEventhandlerMethodReference(this, 'popDragStop');

    // im IE das Markieren von Text und HTML-Elementen unterbinden,
    // für Mozilla wird das return FALSE in popDragBegin() das selbe erreicht
    //    document.onselectstart   = new Function('return false');
    document.onselectstart   = function() {return false;};
}

// onMouseUp-Handler
epxPopupWindow.prototype.popDragStop = function(e) {
    this.moveit = false;
    this.caption.onmousedown = null;
    document.onmouseup       = null;
    document.onmousemove     = null;
}

// onMouseOut-Handler
epxPopupWindow.prototype.popDragOut = function(e) {
    if (!this.moveit) {
        this.popDragStop(e);
    }
    this.caption.onmouseout = null; // createEventhandlerMethodReference(this, 'popDragOut');
}

// onMouseDown-Handler
epxPopupWindow.prototype.popDragBegin = function(e) {
    this.moveit = true;
    this.mousedxy = [e.clientX - this.startxy[0], e.clientY - this.startxy[1]];
    document.onmousemove = createEventhandlerMethodReference(this, 'popDragIt')
}

// onMouse-Move-Handler
epxPopupWindow.prototype.popDragIt = function(e) {
    this.popMove(e.clientX - this.mousedxy[0], e.clientY - this.mousedxy[1]);
}

// das Popup neu postionieren, aber nicht außerhalb des Fensters
epxPopupWindow.prototype.popMove = function(x, y) {
    var winwidth = window.innerWidth ? window.innerWidth : document.body.clientWidth;

    // horizontal verschieben ist möglich, ohne dass das Popup das Fenster verlässt
    if (x >= 0  &&   winwidth > x + this.popup.offsetWidth) {
        this.popup.style.left = x + 'px';
    }
    // ansonsten den Mauszeiger-Offset korrigieren
    else {
        this.mousedxy[0] = x < 0 ? this.mousedxy[0] + x : this.mousedxy[0] + x + this.popup.offsetWidth - winwidth;
    }

    // vertical verschieben
    if (y >= 0) {
        this.popup.style.top  = y + 'px';
    }
    else {
        this.mousedxy[0] = this.mousedxy[0] + x;
    }
}

epxPopupWindow.prototype.popResizeStart = function(e) {
    this.resize = true;

    document.onmouseup   = createEventhandlerMethodReference(this, 'popResizeStop');
    document.onmousemove = createEventhandlerMethodReference(this, 'popResizeIt');
    this.startxy = getElementAbsPos(this.popup);
//     console.debug('startxy ', this.startxy);
//     console.debug('offserHeight ', this.popup.offsetHeight);
//     console.debug('clientY ', e.clientY);
}

epxPopupWindow.prototype.popResizeStop = function(e) {
    this.resize = false;
    document.onmousemove = null;
    document.onmouseup   = null;
    for (var i=0; i<this.resizer.length; i++) {
        this.resizer[i].onmousedown = null;
        this.resizer[i].style.cursor = 'se-resize';
    }
}

epxPopupWindow.prototype.popResizeIt = function(e) {
//     console.debug([parseInt(e.clientX - this.startxy[0]), parseInt(e.clientY - this.startxy[1])], this.popup.offsetHeight);
    this.setSize(parseInt(e.clientX - this.startxy[0]), parseInt(e.clientY - this.startxy[1]));
}

// das Popup anzeigen
epxPopupWindow.prototype.display = function(html) {
    this.popup.innerHTML = html;
    this.popup.style.visibility = 'visible';
    this.initDisplay();
}

// das Popup verstecken
epxPopupWindow.prototype.hide = function() {
    this.popup.style.visibility = 'hidden';
}


epxPopupWindow.prototype.setSize = function(width, height) {
//     console.debug('width1: ', width);
    this.poptable.style.width = width + 'px';
    if (this.contenttable) {
        this.contenttable.style.width  = (width - 6) + 'px';
        this.contenttable.style.height = (height - 19) + 'px';
    }
}

