/********************************
 * Aufruf beim Start jeder Seite
 ********************************/
function toolsInit() {
  DHTML_init();
  window.focus();
  invokeInitFunctions();
}

/********************************
 * 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');
 * x.style.top = 20
 * alert(x.obj.id)
 */
function getObj(name) {
  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];
  }
}

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;
}


/****************************************
 * 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) {
    with((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);    
}



/******************************************************
 * 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();
    }
}

/* Used for the following two sections */
var registeredButtons = new Array(); // radiobuttons or checkboxes
function registerButton(groupName, index, customAnswerFieldName) {
  //alert("registerButton(" + groupName + ", " + index + ")");
  var group = registeredButtons[groupName];
  if(!group) {
    registeredButtons[groupName] = new Array();
    group = registeredButtons[groupName];
    group[index] = new Array();
    group[index]['bt'] = document.forms[0].elements[groupName];
  } else {
    group[index] = new Array();
    group[index]['bt'] = document.forms[0].elements[groupName][index];
  }
  group[index]['ca'] = document.forms[0].elements[customAnswerFieldName];
}


var checkedRadioButtonIndexByGroup = new Array();
// Returns true if an unclick took place.
function tryUnclick(groupName, index) {
  if(checkedRadioButtonIndexByGroup[groupName] == null) {
    checkedRadioButtonIndexByGroup[groupName] = -1;
  }
  if(checkedRadioButtonIndexByGroup[groupName] == index) { // is already checked -> uncheck
    registeredButtons[groupName][index]['bt'].checked = false;
    checkedRadioButtonIndexByGroup[groupName] = -1;
    return true;
  } else { // is not checked -> remember that it's checked now
    checkedRadioButtonIndexByGroup[groupName] = index;
    return false;
  }
}
function radioButtonRememberChecked(groupName, index) {
  //alert("radioButtonRememberChecked(" + groupName + ", " + index + ")");
  checkedRadioButtonIndexByGroup[groupName] = index;
}

/* 
    This section is used to handle connections between custom answer 
    text input fields for radiobuttons/checkboxes. 
    lso allows radio buttons to be unchecked by clicking them a second time
*/
function clickRadioButton(groupName, index) {
  var group; var caField; var caValue; var button;
  group = registeredButtons[groupName];
  button = group[index]['bt']; 
  caField = group[index]['ca'];
  if(caField) {
    caValue = caField.value; 
  }
  if(button && button.type == "radio") {
        deleteAllCustomAnswers(groupName);
    }
  var isUnclicked;
  isUnclicked = tryUnclick(groupName, index);
  if(caField) {
    if(isUnclicked) {
      caField.value = ''; 
    } else {
      caField.focus(); 
      caField.value = caValue; 
    }
  }
}
function clickCheckBox(groupName, index) {
  var group; var caField; var button;
  group = registeredButtons[groupName];
  button = group[index]['bt'];
  caField = group[index]['ca'];
  if(caField) {
    if(button.checked) {
      caField.focus();
    } else {
      caField.value = ''; 
    }
  }
}
function deleteAllCustomAnswers(groupName) {
  var group; var caField;
  group = registeredButtons[groupName];
  if(group) {
    for (var index in group) {
      if(caField = group[index]['ca']) {
        caField.value = ''
      }
    }
  }
}
function changeCustomAnswer(groupName, index, doUncheckWhenEmpty) {
  var group; var caField; var button;
  group = registeredButtons[groupName];
  if(group && group[index]) {
    if(group[index]['bt'].checked) {
            if(doUncheckWhenEmpty) {
                group[index]['bt'].checked = false;
                clickRadioButton(groupName, index)
            }
    } else {
      group[index]['bt'].checked = true;
      clickRadioButton(groupName, index)
    }
  }
}



/**
 * >>>> Zahl mit einer bestimmten Anzahl Nachkommastellen anzeigen.
 */
function formatNumber(num, decPlaces) {
  var intNum = Math.round(num * (Math.pow(10, decPlaces)));
  var strNum = intNum.toString();
  var len = strNum.length;
  var commaIndex = len - decPlaces;
  if(commaIndex < 0) commaIndex = 0;
  var beforeComma = strNum.substr(0, commaIndex);
  if(beforeComma == "") { beforeComma = 0; }
  var afterComma = strNum.substr(commaIndex, decPlaces);
  var zeroStripped = "";
  var i = afterComma.length - 1;
  while(i > -1) { 
    if(zeroStripped != "") {
      zeroStripped = afterComma.charAt(i) + zeroStripped;
    } else {
      if(afterComma.charAt(i) != "0") {
        zeroStripped = afterComma.charAt(i) + zeroStripped;
      }
    }
    i = i - 1;
  }
  afterComma = zeroStripped;
  if(afterComma != "") { afterComma = "." + afterComma; }
  return beforeComma + afterComma;
}

/**
 * >>>> Zahl aus String parsen.
 * Komma wird in Punkt verwandelt. Ungültige Zeichen werden entfernt.
 * Wenn nichts übrig bleibt wird 0 zurückgegeben (statt NaN).
 */
function parseNumber(str) {
  var parsable = "";
  var token = "";
  for(i = 0; i < str.length; i++) {
    token = str.substr(i, 1);
    if(i == 0 && token == "-") {
            parsable += "-";
    } else {
             if(
                token == "0" ||  
                token == "1" ||  
                token == "2" ||  
                token == "3" ||  
                token == "4" ||  
                token == "5" ||  
                token == "6" ||  
                token == "7" ||  
                token == "8" ||  
                token == "9" ||  
                token == "." ||  
                token == ","
            ) {
                if(token == ",") token = ".";
                parsable += token;
            }
        }
  }
  var resultNumber = new Number(parsable); // might not work -> NaN
  if(isNaN(resultNumber)) {
    resultNumber = 0;
  }
  return resultNumber;
}
