/**
 * DenkXweb, Version 1.0.0
 * Copyright (c) 2005 rjm business solutions GmbH
 * All rights reserved, license restrictions apply
 *
 * $Id$
 *
 * Generic Compatibility Layer
 */


/**
 * Globale Variablen zum schnellen Pruefen, ob IE oder Netscape-Objektmodell
 * verfuegbar
 *
 * Benutzt werden kann folgendes:
 *   - isIE      true, wenn Internet Explorer genutzt wird
 *   - isIEMac   true, wenn Internet Explorer unter MacOS(X) genutzt wird
 *   - ieMajor
 *   - isOpera   true, wenn Opera verwendet wird
 *   - isGecko   true, wenn die Gecko Rendering Engine (Mozilla, Firefox,
 *               Galeon usw.) genutzt wird
 *   
 */
var isIE = (navigator.appName != "Netscape");
var isIEMac = (isIE && (navigator.appVersion.indexOf('Macintosh') >= 0));
var isOpera = (navigator.userAgent.indexOf('Opera') >= 0);
var isGecko = (navigator.userAgent.indexOf('Gecko/') >= 0);

var ieMajor = 0;
var ieMinor = 0;
if (isIE) {
  var ua = navigator.userAgent;
  var msiePos = ua.indexOf('MSIE ');
  
  ieMajor = ua.substring(msiePos+5, ua.length);
  ieMajor = ieMajor.substring(0, ieMajor.indexOf('.'));

  ieMinor = ua.substring(msiePos+5+ieMajor.length+1, ua.length);
  var len = ieMinor.indexOf(';');
  if (len < 0)
    len = ieMinor.length;
  ieMinor = ieMinor.substring(0, len);
}

var gecko_version = 0;
if (isGecko) {
  var ua = navigator.userAgent;
  var geckoPos = ua.indexOf('Gecko/');

  gecko_version = ua.substring(geckoPos+6, ua.length);
  var len = gecko_version.indexOf(' ');
  if (len < 0)
    len = gecko_version.length;
  gecko_version = gecko_version.substring(0, len);
}


/**
 * Browser Hack fuer Safari 1.0 unter OSX (toFixed nicht implementiert)
 * extrem haesslich, vgl. jibbering.com/faq 
 */
function stretch(q, l, c) { 
  var s = q;

  if (c.length > 0) 
    while (s.length < l)
      s = c+s;

  return s;
}

function strU(x, m, n) { 
  // x >= 0.0
  var t, s = new String(Math.round(x * Number("1e"+n)));

  if (s.search && s.search(/\D/)!=-1) { 
    return ''+x;
  }

  with (new String(stretch(s, m+n, '0'))) {
    t = length - n;
    return substring(0, t) + '.' + substring(t);
  }
}

function sign(x) { 
  return x < 0 ? '-' : ''; 
}

function strS(x, m, n) { 
  return sign(x) + strU(Math.abs(x), m, n);
}

if (! Number.prototype.toFixed) {
  Number.prototype.toFixed = new Function('n','return strS(this,1,n)');
}
/** Safari hack ende */


/** 
 * Globale Einstellung: Resourcenverzeichnis für Systembilder wie "clearpixel"
 * zum Aufbau des Tooltip-HTMLs
 */
var stockImgDir = '/style/';


/**
 * Class MouseEvent
 *
 * Wrapper-Klasse fuer Mausereignisse, erlaubt den Zugriff auf die gaengisten
 * Attribute im Netscape-Stil.
 *
 * @attr event  Original-Event wie vom Browser geliefert
 */


/** 
 * Konstruktur fuer MouseEvent.
 *
 * @param event  Original-Event wie vom Browser geliefert
 */
function MouseEvent(event) {
  this.event = event || window.event;
 
  this.getPageX = function() {
    var e = this.event;
    return e.pageX || (e.clientX+document.body.scrollLeft) || 0;
  }

  this.getPageY = function() {
    var e = this.event;
    return e.pageY || (e.clientY+document.body.scrollTop) || 0;
  }

  this.getTarget = function() {
    var e = this.event;
    return e.target || e.srcElement;
  }

  this.getCtrlKey = function() {
    var e = this.event;
    return e.ctrlKey;
  }

  this.getMousePt = function() {
    return new Point(this.getPageX(), this.getPageY());
  }

}


/**
 * Berechnet den Abstand des angegebenen DOM-Elements zum Seiten-Ursprung
 * (links oben).
 *
 * @param   element  Ein DOM-Element aus dem HTML-Aufbau der Seite.
 * @return  Ein Objekt vom Typ "Point", das den Abstand von element zum
 *          Seiten-Ursprung (links oben) beschreibt.
 */
function getElemPos(element) {
  var result = new Point(0, 0);
  
  /* IMHO gibt es keine elegante Möglichkeit das ohne Rekursion
     durchzuführen */
  while (element) { 
    if (isIEMac) {
      if (element.tagName != "DIV")
        result.translate(element.clientLeft, element.clientTop);
    } else
      result.translate(element.offsetLeft, element.offsetTop);

    element = element.offsetParent;
  }
  //  alert("Resulting pos: x=" + result.x + ', y=' + result.y);
  return result;
}

/**
 * Setzt Tranzparenz für ein HTML-Element wie angegeben (in %).
 *
 * @param  element        HTML-Element
 * @param  transparency   Prozentwert (Integer-Angabe ohne %-Zeichen)
 */
function setTransparency(element, transparency) {
    var opacity = 100-transparency;

    // IE/Win
    element.style.filter = "alpha(opacity:"+opacity+")";
    // Safari<1.2, Konqueror
    element.style.KhtmlOpacity = opacity/100;
    // Older Mozilla and Firefox
    element.style.MozOpacity = opacity/100;
    // Safari 1.2, newer Firefox and Mozilla, CSS3
    element.style.opacity = opacity/100;
}

function setCursor(element, cursor) {
  // Extrawurst für Internet Explorer < 5.5: "pointer" heisst dort
  // "hand" (und "raider" heisst jetzt "twix")
  if ((cursor == "pointer") && isIE && !isIEMac &&
      ((ieMajor < 5) || (ieMajor == 5 && ieMinor < 5)))
    cursor = "hand";
  element.style.cursor = cursor;
}

/**
 * Erzeugt ein neues Kindelement für das angegebene HTML-Element.
 *
 * @param  parent   Elternelement, unterhalb dessen ein neues Element angelegt
 *                  werden soll
 * @param  tagName  Tag für das neue HTML-Element
 * @return das neue Element
 */
function createChild(parent, tagName) {
  var child = document.createElement(tagName);
  parent.appendChild(child);
  return child;
}


