/********************************
 * Aufruf beim Start jeder Seite
 ********************************/
$(document).ready(function() {
    initWindowFocus();
    initFormFocus();
    restoreScrollY();
    invokeInitFunctions();
});

var EnableWindowFocus = true;
function initWindowFocus() {
    if(!EnableWindowFocus) return;
    try {
        var isStandalone = (top == self && self.frames.length == 0);
        var isFrame = (top != self);
        if(isFrame || isStandalone) {
            self.focus(); 
        }
    } catch(ex) {
        DebugWrite("ERROR setting window focus: " + ex);
        // (This is nice to have, so failure is ignored. Sometimes things can't get focus).
    }
}
var EnableAutoFormFocus = true;
function initFormFocus() { 
  if(!EnableAutoFormFocus) return;
  try {
    // focus the first input element in the first form.
    formIndex = 0;
    if(document.forms[formIndex]) {
        var form = document.forms[formIndex];
        for(i = 0; i < form.elements.length; i++) {
            with(form.elements[i]) {
                var nn = nodeName.toLowerCase();
                if(nn == "select") {
                    focus(); 
                    break;
                } else if (nn == "input") {
                    if(type == "text" || type == "select" || type == "password" || type == "textarea") {
                        focus(); select(); // (both are necessary!)
                        break;
                    }
                }
            } 
        }
    }
  } catch(ex) {
    // (This is nice to have, so failure is ignored. Sometimes things can't get focus).
  }
}

/******************************************************
 * Funktionen zur Registrierung von Modulfunktionen 
 ******************************************************/
var initFunctions = new Array();
function registerInitFunction(f) {
    initFunctions[initFunctions.length] = f;
}
var prepostFunctions = new Array();
function registerPrepostFunction(f) {
    prepostFunctions[prepostFunctions.length] = f;
}
function invokeInitFunctions() {
    var f;
    for(var i = 0; i < initFunctions.length; i++) {
        f = initFunctions[i];
        f();
    }
}
function invokePrepostFunctions() {
    var f;
    for(var i = 0; i < prepostFunctions.length; i++) {
        f = prepostFunctions[i];
        f();
    }
}

/********************************
 * 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) {
    this.obj = null; this.style = null;
    var el;
  if(typeof(name) == "string") {
    if (document.getElementById) {
            el = document.getElementById(name);
    } else if (document.all) {
            el = document.all[name];
    } else if (document.layers) {
            el = document.layers[name];
    }
  } else {
    el = name;
  }
    if (el) {
    if (document.getElementById || document.all) {
            this.obj = el; this.style = el.style; 
        } else {
            this.obj = el; this.style = el;
        }
    } else { 
        // do not throw an exception.
        // alert("getObj(" + name + "): node not found!"); 
    }    
      
}

/*
 * Check this before getObj(name) is applied in case it is not known whether
 * an object exists or not.
 */
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;
  }
}

/**********************************************************
 * Several DHTML macros
 *********************************************************/

/*
 *
 */
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) { // all except Explorer
    size.x = self.pageXOffset;
    size.y = self.pageYOffset;
  } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
    size.x = document.documentElement.scrollLeft;
    size.y = document.documentElement.scrollTop;
  } else if (document.body) { // all other Explorers
    size.x = document.body.scrollLeft;
    size.y = document.body.scrollTop;
  } // no else ? 
  return size;
}
function setScrollPosY(y) {
  if (self.pageYOffset) { // all except Explorer
    self.pageYOffset = y;
  } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
    document.documentElement.scrollTop = y;
  } else if (document.body) { // all other Explorers
    document.body.scrollTop = y;
  } // no else ? 
}


/* 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;
}



/* 
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. Siehe auch getObj()
 */
function setStyle(name, stylename, stylevalue) {
  (new getObj(name)).style[stylename] = stylevalue;
}

/**
 * Liest CSS Wert. Siehe auch getObj()
 */
function getStyle(name, stylename) {
  return (new getObj(name)).style[stylename];
}

/* 
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 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.
 * X-Position ist allerdings fix. Versatz in Negativrichtung, d.h. Minus = unten.
 */
function showhere(layername, offsetY, e)  {  
  var y = 0; 
  var pos = new eventPos(e);
  y = pos.pageY - offsetY; 
  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.top = y;
  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);    
}


/**********************************************************
 * Smart navigation (keeping scroll position)
 * <a href="javascript: smartNavigate(encodedUrl)">link</a>
 *********************************************************/
 function restoreScrollY() {
  var filter  = /[\?&]JsScrollY=([0-9]+)/;
  filter.exec(location.href);
  var scrollY = Number(RegExp.$1);
  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;
}



/**************************************************************
 *  tdg   Funktion für Hilfe-Tips
 * 
 **************************************************************/
 
function showhere(layername, offsetY, e)  {  
  var y = 0; 
  var pos = new eventPos(e);
  y = pos.pageY - offsetY; 
  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.top = y;
  show(layername);    
}

function hide(layername) {
  (new getObj(layername)).style.visibility = 'hidden';
  
}


