/**
 * oft genutzte Objekte in DHTML:
 *  Coord
 *  Canvas
 * oft genutzt Funktionen in DHTML
 *  @return LayerReference getLayerRef(String ID)
 *  @return void setPosition(LayerReference objLayer, Coord coords)  
 *  @return void setVisibility(LayerReference objLayer, boolean visible)
 *  @return Coord getMouseXY(evt)
 *  @return void setVisibility4DivByPrefix(prefix, visible)
 */

// Objekte
function Coord(x, y){
  this.x = (!x)?0:x;
  this.y = (!y)?0:y;
  
  this.toString = objToString;
  this.equals = equalsCoord;
}

function Canvas(x, y, width, height){
  this.width =  (!width) ? 0 : parseInt(width, 10);
  this.height = (!height)? 0 : parseInt(height, 10);
  
  this.Coord = Coord;
  this.Coord(x, y);
  
  this.equalsCoord = this.equals;
  this.equals = equalsCanvas;
}

function objToString(obj){
  var o=obj || this;
  var ret = "{";
  for(p in o ){
    if (typeof o[p] == "function" || typeof o[p] == "object") continue;
    if(ret.length > 1)
      ret += ",";
    ret += p + ":" + o[p];
  }
  return ret + "}";
}

function equalsCoord(/*Coord*/ c){
  return (this.x == c.x && this.y == c.y);
}
function equalsCanvas(/*Canvas*/ c){
  return ( this.equalsCoord == c.equalsCoord && this.width == c.width && this.height == c.height);
}
Canvas.prototype.isCoordInside = /*boolean*/ function(/* Coord */ coord){
  if(coord.x > this.x && (coord.x < this.x + this.width) 
    && coord.y > this.y && (coord.y < this.y + this.height) ){
    return true;
  }
  return false;
}

// Funktionen

function getLayerRef (id, document) {
  if (!document)
    document = window.document;
  if (document.layers) {
    for (var l = 0; l < document.layers.length; l++)
      if (document.layers[l].id == id)
        return document.layers[l];
    for (var l = 0; l < document.layers.length; l++) {
      var result = getLayerRef(id, document.layers[l].document);
      if (result)
        return result;
    }
    return null;
  }
  else if (document.all) {
    return document.all[id];
  }
  else if (document.getElementById) {
    return document.getElementById(id);
  }
}

function setPosition(objLayer, coords){

    if (document.layers) {
      objLayer.top = coords.y;
      objLayer.left = coords.x;
    } else if (window.opera) {
      objLayer.style.top = coords.y;
      objLayer.style.left = coords.x;
    } else if (document.all) {
      objLayer.style.top = coords.y;
      objLayer.style.pixelLeft = coords.x;
    } else if (document.getElementById) {
      objLayer.style.top = coords.y + 'px'; 
      objLayer.style.left = coords.x + 'px';
    }
}

function setVisibility(objLayer, visible) {

  if(document.layers){
    objLayer.visibility  = 
        (visible == true) ? 'show' : 'hide';
  } else {
    objLayer.style.visibility = 
        (visible == true) ? 'visible' : 'hidden';
  }

}

function setVisibility4DivByPrefix(prefix, visible, d){
  if (!d)
    d = window.document;

  if(document.layers){
    for (var l = 0; l < d.layers.length; l++){
      if(d.layers[l].id.substr(0, prefix.length ) == prefix)
        setVisibility(d.layers[l], visible);
      setVisibility4DivByPrefix(prefix, 
                                visible, 
                                d.layers[l].document);
    }

  } else if(document.all) {

    var layers = document.all.tags("div"); 
    for(i=0; i < layers.length; i++) { 
      if(layers[i].id.substr(0, prefix.length ) == prefix )
        setVisibility(document.all.tags("div")[i], visible);
    }

  } else if(document.getElementsByTagName) {

    var layers = document.getElementsByTagName("div");
    for(i=0; i < layers.length; i++){
      if(layers[i].id.substr(0, prefix.length ) == prefix)
        setVisibility(layers[i], visible);
    }

  }
}

/*
function getMouseXY(evt) {
  e = evt || window.event;
  if(!e) return null;
  
  if(document.layers) {
    return new Coord(e.pageX, e.pageY);
  }else if(window.opera){
    return new Coord(e.clientX, e.clientY);
  }else if(document.all ) {
    return new Coord(e.clientX + document.body.scrollLeft, e.clientY + document.body.scrollTop);
  }else if(document.getElementById) {
    return new Coord(e.pageX , e.pageY );
  }
}
*/

function getMouseXY(ev) {
	var pos = new Coord();
	if(ev.pageX){
		pos.x = ev.pageX;	
		pos.y = ev.pageY;
	} else if(window.event && window.event.clientX) {
		var isStrictMode = document.compatMode && document.compatMode != 'BackCompat' ? true : false;
		var scrollX = isStrictMode ? document.documentElement.scrollLeft : document.body.scrollLeft;
		var scrollY	= isStrictMode ? document.documentElement.scrollTop : document.body.scrollTop;
		pos.x = window.event.clientX + scrollX;
		pos.y = window.event.clientY + scrollY;
	}
	return pos;
}

function getPageCoords (element) {
  var coords = new Coord();
  while (element) {
    coords.x += element.offsetLeft;
    coords.y += element.offsetTop;
    element = element.offsetParent;
  }
  return coords;
} 

Function.prototype.bind = function(object) {
  var __method = this;
  return function() {
    __method.apply(object, arguments);
  };
};
function registerNodeListener(obj, evType, fn ) {
  try {
    if( obj.addEventListener ) {
      obj.addEventListener(evType, fn, false);
    } else if( obj.attachEvent ) {
      obj.attachEvent( "on"+evType, fn );
    } else {
      throw "Unsupported browser!";
    }
  } catch(e) {
    alert('exception ' + e.message + ' while trying to add a listener to ' + obj + ', event: ' + evType + ', function: ' + fn);
  }
  return {'owner' : obj, 'type' : evType, 'func' : fn };
}
function removeNodeListener( nodeInfo ) {
  if(!nodeInfo){
    return;
  }
  if( nodeInfo.owner.removeEventListener ) {
    nodeInfo.owner.removeEventListener(nodeInfo.type, nodeInfo.func, false);
  } else if( nodeInfo.owner.detachEvent ) {
    nodeInfo.owner.detachEvent("on" + nodeInfo.type, nodeInfo.func);
  } else {
    throw "Unsupported browser!";
  }
}