/********************************
 * Function um ein popup zu öffnen
 ********************************/
function open_w(url, name, width, height) {
    var ah = screen.availHeight;
    var aw = screen.availWidth;

    var str = "status=no,toolbar=no,location=no,menubar=no,resizable=no,height=" + height + ",innerHeight=" + height;
    str += ",width=" + width + ",innerWidth=" + width;

    var xc = (aw - width) / 2;
    var yc = (ah - height) / 2;

    str += ",left=" + xc + ",screenX=" + xc;
    str += ",top=" + yc + ",screenY=" + yc;

    var editorWin = window.open(url, name, str).focus();
    editorWin.focus();
}


/********************************
 * Aufruf beim Start jeder Seite 
 ********************************/
function init() {
    RemoveMacIEshadow();
    invokeInitFunctions();
    DHTML_init();
    restoreScrollY();
    fancybox_init();
}


/********************************
 * Fancybox initialisieren
 ********************************/
function fancybox_init() {
    if (typeof $ != 'undefined' && typeof $.fancybox != 'undefined') {
        // alle Links der Klasse "fancybox-iframe" mit openFancybox() verdrahten (siehe dort)
        $('a.fancybox-iframe').click(function () {
            openFancybox($(this).attr('href'), 'iframe', false);
            return false;
        });
        // alle Links der Klasse "fancybox-ajax" mit openFancybox() verdrahten (siehe dort)
        $('a.fancybox-ajax').click(function () {
            openFancybox($(this).attr('href'), 'ajax', true);
            return false;
        });
        // alle Links der Klasse "fancybox-image" direkt mit fancybox verdrahten
        $('a.fancybox-image').fancybox({ 'titlePosition': 'inside', 'cyclic': true });
    }
}



/********************************
 * Einfache Objekte
 ********************************/
function xy(x, y) {
  this.x = x;
  this.y = y;
}

/************************************
 * Browserunabhängiges DHTML API
 * Konzepte gemäss http://www.quirksmode.org/
 ************************************/

/*
 * Usage: 
 * var x = new getObj('layername');
 * var y = new getObj(this); // von Eventauslöser
 * x.style.top = 20
 * alert(x.obj.id)
 */
function getObj(name) {
  if(typeof(name) == "string") {
    if (document.getElementById) {
      this.obj = document.getElementById(name);
      this.style = document.getElementById(name).style;
    } else if (document.all) {
      this.obj = document.all[name];
      this.style = document.all[name].style;
    } else if (document.layers) {
      this.obj = document.layers[name];
      this.style = document.layers[name];
    }
  } else {
    this.obj = name;
    if (document.getElementById) {
      this.style = this.obj.style;
    } else if (document.all) {
      this.style = this.obj.style;
    } else if (document.layers) {
      this.style = this.obj;
    }
  }
}

function objectExists(name) {
  if (document.getElementById) {
    if(document.getElementById(name)) return true;
  } else if (document.all) {
    if(document.all[name]) return true;
  } else if (document.layers) {
    if(document.layers[name]) return true;
  }
}

function getPos(obj) {
  var curleft = 0;
  var curtop = 0;
  if (obj.offsetParent) {
    while (obj.offsetParent) {
      curleft += obj.offsetLeft
      curtop += obj.offsetTop
      obj = obj.offsetParent;
    }
  }  else if (obj.x) {
    curleft += obj.x;
    curtop += obj.y;
  }
  var pos = new xy(curleft, curtop);
  return pos;
}



/* The inner dimensions of the window or frame. */
function getWindowSize() {
  var size = new xy(); 
  if (self.innerHeight) { // all except Explorer
    size.x = self.innerWidth;
    size.y = self.innerHeight;
  } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
    size.x = document.documentElement.clientWidth;
    size.y = document.documentElement.clientHeight;
  } else if (document.body) { // other Explorers
    size.x = document.body.clientWidth;
    size.y = document.body.clientHeight;
  } // no else ? 
  return size;
}

/* How much the page has scrolled. */
function getScrollPos() {
  var size = new xy(); 
  if (self.pageYOffset) { // some browsers
    size.x = self.pageXOffset;
    size.y = self.pageYOffset;
  } else if (document.documentElement && document.documentElement.scrollTop) { // IE XHTML, strict
    size.x = document.documentElement.scrollLeft;
    size.y = document.documentElement.scrollTop;
  } else if (document.body) { // others like IE non-strict, Firefox
    size.x = document.body.scrollLeft;
    size.y = document.body.scrollTop;
  } else {
        // not recognized
  }
  return size;
}
function setScrollPosY(y) {
    if(self.scrollTo) {
        self.scrollTo(0, y); // works with most browsers
    } else {
        // not recognized
  }
    return;
}


/* The height of the total page (usually the body element). */
function getPageSize() {
  var size = new xy(); 
  var test1 = document.body.scrollHeight;
  var test2 = document.body.offsetHeight
  if (test1 > test2) { // all but Explorer Mac
      size.x = document.body.scrollWidth;
      size.y = document.body.scrollHeight;
  } else { // Explorer Mac, would also work in Explorer 6 Strict, Mozilla and Safari
      size.x = document.body.offsetWidth;
      size.y = document.body.offsetHeight;
  }
  return size;
}

/**********************************************************
 * Smart navigation (keeping scroll position)
 * <a href="javascript: smartNavigate(encodedUrl)">link</a>
 *********************************************************/
 function restoreScrollY() {
  var scrollY = getQSValue('JsScrollY');
  if(scrollY) setScrollPosY(scrollY);
} 
function smartNavigate(url) {
  var sep;
  if(url.indexOf('?') > -1) { sep = '&'; } else {sep = '?'; }
  url = url + sep + 'JsScrollY=' + getScrollPos().y
  location.href = url;
  return;
}
function getQSValue(key) {
    var result = null;
    var i = location.search.indexOf(key);
    if (i != -1) {
        i += key.length + 1;
        var j = location.search.indexOf('&', i);
        if (j != -1) {
            result = location.search.substr(i, j - i);
        }
        else {
            result = location.search.substr(i);
        }
    }
    return result;
}


/****************************************
 * Browserunabhängiges DHTML API (Legacy)
 ****************************************/
var DHTML = 0;
var DOM = 0;
var MS4 = 0;
var NS4 = 0;
var OP = 0;
var winRef = "";
var layerRef = "";
var layerLeftBracket = "";
var layerRightBracket = "";
var styleRef = ""; 
var scrollX  = "", scrollY  = ""; // Ausdruck zum Ermitteln der Position der linken obere innere Fensterecke zum Dokumentursprung

function DHTML_init() {
  if (window.opera) {
    OP = 1;
  }
  if(document.getElementById) {
    DHTML = 1;
    DOM = 1;
  }
  if(document.all && !OP) {
    DHTML = 1;
    MS4 = 1;
  }
  if (window.netscape && window.screen &&!DOM && !OP){
    DHTML = 1;
    NS4 = 1;
  }
  // Entscheiden, ob DOM, alte Netscape oder alte MS IE Syntax. 
  if (DOM) {
    winRef   = "window."
    layerRef = ".getElementById"
    styleRef = ".style"
    layerLeftBracket  = "(";
    layerRightBracket = ")";
  } else if (NS4) {
    winRef   = ""
    layerRef = ".layers"
    styleRef = ""
    layerLeftBracket  = "[";
    layerRightBracket = "]";
  } else { 
    // MS4, but also others. 
    winRef   = ""
    layerRef = ".all"
    styleRef = ".style"
    layerLeftBracket  = "[";
    layerRightBracket = "]";
  }
  if (navigator.appName == "Netscape") {
    scrollX  = "window.pageXOffset"
    scrollY  = "window.pageYOffset"
  } else {
    scrollX  = "document.body.scrollLeft"
    scrollY  = "document.body.scrollTop"
  }
}


/**
 * Dokument-relative Position eines Mausklicks.
 */
function eventPos(e) {
  this.pageX = 0;
  this.pageY = 0;
  if (navigator.appName == "Netscape") {
    this.pageX = e.pageX;
    this.pageY = e.pageY;
  } else {
    this.pageX = document.body.scrollLeft + e.clientX;
    this.pageY = document.body.scrollTop + e.clientY;
  }
}


/**
 * Setzt CSS Wert anhand Objektnamen.
 */
function setStyle(layer, stylename, stylevalue) {
  return eval('layer' + styleRef + "." + stylename + " = '" + stylevalue + "';"); 
}

/**
 * Objekt mit angegebenem Namen verstecken.
 */
function hide(layername) {
  (new getObj(layername)).style.visibility = 'hidden';
}  
        
/**
 * Objekt mit angegebenem Namen zeigen.
 */
function show(layername) {
  (new getObj(layername)).style.visibility = 'visible';
}

/**
 * Objekt mit angegebenem Namen zeigen.
 * (display / nodisplay / switchdisplay)
 */
function nodisplay(layername) {
    var obj = (new getObj(layername));
    if(obj) {
        obj.style.display = 'none';
    } else {
        alert(layername);
    }
}				
function display(layername) {
    var obj = (new getObj(layername));
    if(obj) {
        obj.style.display = '';
    } else {
        alert(layername);
    }
}
function switchdisplay(layername) {
    var obj = (new getObj(layername));
    if(obj) {
        this_display = obj.style.display;
        if (this_display == 'none') {
            display(layername);
        }
        else {
            nodisplay(layername);
        }
    } else {
        alert(layername);
    }
}	



/**
 * Objekt mit angegebenem Namen an Bildschirmoberkante verschieben und zeigen.
 */
function showscrolled(layername) {
  var yscrolled = eval(scrollY);
  yscrolled=parseInt(yscrolled)+200;  
  (new getObj(layername)).style.top = yscrolled;
  show(layername);
}

/**
 * Objekt mit angegebenem Namen an Eventposition (Mausklick) zeigen.
 */
function showUnderMousePointer(layername, offsetX, offsetY, e) {
  var x, y;      
  var pos = new eventPos(e);
  x = pos.pageX + offsetY; 
  y = pos.pageY + offsetY; 
  if(x < 0) { x = 0; }
  if(y < 0) { y = 0; }
  if(navigator.userAgent.indexOf("Safari") > -1 && y == 0) {
    y = eval(scrollY); // Safari bug, some events have all coordinates to 0 (e.g. button onclick)
  }
  (new getObj(layername)).style.left = x;
  (new getObj(layername)).style.top = y;
  show(layername);    
}


//register a function to load onLoad :)
var initFunctions = new Array();
function registerInitFunction(f) {
    initFunctions[initFunctions.length] = f;
}
function invokeInitFunctions() {
    var f;
    for(var i = 0; i < initFunctions.length; i++) {
        f = initFunctions[i];
        f();
    }
}



/**
 * Resize Outerframe in centered layouts
 */
function getTopAndBottomY(outerframeObj) {
    var topY; 
    var bottomY;
    var maxY = 0;
    var minY = 10000;
    for(var i = 0; i <= (outerframeObj.childNodes.length - 1); i++) {
        var obj = outerframeObj.childNodes[i];
        if(obj.nodeName == 'DIV') {
            topY = getPos(obj).y
            bottomY = topY + obj.offsetHeight;
            if(bottomY > maxY) {
                maxY = bottomY;
            }
            if(topY < minY) {
                minY = topY;
            }
        }
    }
    if(10000 == minY) { minY = 0 }
    var pair = new xy(minY, maxY);
    return pair;
}

function adjustPageHeight(outerFrameName) {
    var outerframe = document.getElementById(outerFrameName);
    if(outerframe) {
        var contentTop; var contentBottom;
        with(getTopAndBottomY(outerframe)) {
            contentTop = x;
            contentBottom = y; 
        }
        var outerTop = getPos(outerframe).y;
        var paddingTop = contentTop - outerTop; 
        var outerBottom = contentBottom + paddingTop; // same padding as above
        outerframe.style.height = "" + (outerBottom - outerTop) + "px";
    }
}



/************************************************************
 * Navigationsverhalten Home 
 ************************************************************/
 
var ua = navigator.userAgent.toLowerCase();
var isIE = ((ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1)); 

var oldBoxClass = "";
var oldLinkClass = "";
function mouseOver(box) {
    oldBoxClass = box.className;
    box.className = oldBoxClass + " " + oldBoxClass.replace(/-clicked/, "") + "-hover";
    var link;
    if(isIE) {
        link = box.childNodes[0];
    } else {
        link = box.childNodes[1];
    }
    if(link != null) {
        oldLinkClass = link.className;
        link.className = oldLinkClass + " " + oldLinkClass.replace(/-clicked/, "") + "-hover";
    }
}

function mouseOut(box) {
    box.className = oldBoxClass;
    oldBoxClass = "";
    var link;
    if(isIE) {
        link = box.childNodes[0];
    } else {
        link = box.childNodes[1];
    }
    if(link != null) {
        link.className = oldLinkClass;
        oldLinkClass = "";
    }
}



/************************************************************
 * Verhindert die Schatten-Markierung jedes Links auf MacIE5  
 ************************************************************/
function RemoveMacIEshadow() {
  if (document.images&&navigator.userAgent.indexOf("MSIE")!=-1) {
    for(i=0;i<document.links.length;i++) {
      target=eval("document.links[i]");
      target.onfocus=BlurHandler;
    }
  }
}
    
function BlurHandler() {
  obj=window.event.srcElement;
  if(obj.tagName == "a" || obj.tagName=="A") obj.blur();
}



/************************************************************
 * JavaScript Pendant zu Server.UrlEncode
 * http://www.rgagnon.com/jsdetails/js-0096.html
 * *********************************************************/
function URLencode(sStr) {
    sStr = escape(sStr)
    sStr = sStr.replace(/\+/g, '%2B');
    sStr = sStr.replace(/\//g, '%2F'); 
    sStr = sStr.replace(/\'/g, '%27');
    sStr = sStr.replace(/\"/g, '%22');
    return sStr;
}

/************************************************************
 * JavaScript eMail-Adressen-Verschlüsseler
 * URL: (http://www.derwok.de/service/email_stopspam/)
 ************************************************************/
function UnCryptMailto(s) {
    s = unescape(s); // Url Decode
    var shift = 2; //Has to be the same as in the method CryptMailto (->find in tools).
    var n=0;
    var r="";
    for(var i=0;i<s.length;i++) { 
        n=s.charCodeAt(i); 
        if (n>=8364) {n = 128;}
        r += String.fromCharCode(n-(shift)); 
    }
    return r;
}

function linkTo_UnCryptMailto(s) {
    location.href=UnCryptMailto(s);
}

function httpAjax(myAjaxPath, data, method) {
    $.ajax({
        type: "POST",
        url: myAjaxPath,
        data: data,
        beforeSend: function(xhr) {
          xhr.setRequestHeader("X-AjaxPro-Method", method);
        },
        success: function(s) {
          // on success
          var o = null;
          eval("o = " + s + ";");
          $("#ajaxWorkDetails").attr("innerHTML", o.value);

          // nachträgliches initialisieren der thickbox...
          // tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox
          imgLoader = new Image();// preload image
          imgLoader.src = tb_pathToImage;
        }
    }); 
}
function Left(str, n){
    if (n <= 0)
        return "";
    else if (n > String(str).length)
        return str;
    else
        return String(str).substring(0,n);
}
function Right(str, n){
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}

/*
* Adapterfunktion. Öffnet einen Fancybox-IFrame anhand eines einzigen Parameters: dem URL. 
* (folgende Eigenschaften werden dort aus den URL-Parametern gelesen: width, height, modal, lang)
* Beispiel: <button onclick="openFancybox('http://www.foo.ch/?height=300&width=300', 'iframe')" >klick mich!</button>
* - String url: Link, der in der Fancybox geöffnet werden soll
* - String fancyboxType: Erlaubt sind Typen wie in fancybox({ type: fancyboxType }). Konkret: 'image', 'ajax', 'iframe', 'swf' or 'inline' 
* - Boolean keepArgs: Gibt die URL-Parameter width, height, modal, lang weiter, statt sie vor der Übergabe zu entfernen
* uvb/8.6.2011
*/
function openFancybox(url, fancyboxType, keepArgs) {
    // URL analysieren:
    var a = url.split('?');
    var urlWithoutQuery = a[0];
    var query = (a[1] ? '?' + a[1] : '');
    var urlParams = queryToObject(query);

    // Argumente für den Fancybox-Aufruf
    var args = {}; // Json-Objekt
    args.type = fancyboxType;

    // width, height und modal aus urlParams lesen. Falls vorhanden in Fancybox-Argumente übergeben und aus urlParams entfernen
    var w = parseInt(urlParams.width);
    if (!isNaN(w)) {
        args.width = parseInt(w);
        if (!keepArgs) {
            delete urlParams.width;
        }
    }
    var h = parseInt(urlParams.height);
    if (!isNaN(h)) {
        args.height = parseInt(h);
        if (!keepArgs) {
            delete urlParams.height;
        }
    }
    var m = urlParams.modal;
    if (m != null && m != '') {
        args.modal = (m == 'true');
        if (!keepArgs) {
            delete urlParams.modal;
        }
    }
    var l = urlParams.lang;
    if (l != null && l != '') {
        // (vorläufig ignorieren, da z.B. "schliessen" rein grafisch funktioniert)
        if (!keepArgs) {
            delete urlParams.lang;
        }
    }

    args.href = urlWithoutQuery + objectToQuery(urlParams);

    $.fancybox(args);

}

/*
* Zerlegt einen QueryString in ein Objekt mit allen Elementen (siehe auch objectToQuery)
* uvb/8.6.2011
*/
function queryToObject(queryString) {
    var urlParams = {};
    var e,
        a = /\+/g,  // Regex for replacing addition symbol with a space
        r = /([^&=]+)=?([^&]*)/g,
        d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
        q = queryString.substring(1);

    while (e = r.exec(q))
        urlParams[d(e[1])] = d(e[2]);
    return urlParams;
}

/*
* Setzt einen QueryString aus einem Objekt in einen String zusammen (siehe auch queryToObject)
* uvb/8.6.2011
*/
function objectToQuery(urlParams) {
    var query = '';
    for (key in urlParams) {
        query += (query.length == 0 ? '?' : '&') + key + '=' + encodeURIComponent(urlParams[key]);
    }
    return query;
}
