if (!AimcomTools) { var AimcomTools = { }; }

/**
 * imageZoomer
 *
 * @copyright aimcom.de
 * @autor FX, FH
 */
AimcomTools.ImageZoomer = {

   boxElementID:  undefined,
   imgElementID:  undefined,
   listElementID: undefined,
   boxElement:    undefined,
   imgElement:    undefined,
   listElement:   undefined,
   
   init: function(boxElementID, imgElementID, listElementID) {
   	  this.boxElementID  = boxElementID;
	  this.imgElementID  = imgElementID;
	  this.listElementID = listElementID;
   },
   
   show: function(imagePath, width, height) {     
      this._initElements();
      this.hide();
	  this.imgElement.src = this.transparentImagePath;
	  this.imgElement.src = imagePath;
      this.imgElement.width  = width;
      this.imgElement.height = height;
      AimcomTools.MouseLinker.link(this.boxElement);
      this.boxElement.style.visibility = "visible";
   },
   
   hide: function() {
   	  this.boxElement.style.visibility = "hidden";
   	  AimcomTools.MouseLinker.unlink();
   },
   
   _initElements: function() {
      if (this.boxElement !== undefined) { return; }
      this.boxElement  = this._getElement(this.boxElementID);
	  this.imgElement  = this._getElement(this.imgElementID);
	  this.listElement = this._getElement(this.listElementID);
	  this.transparentImagePath = this.imgElement.src;      
   },
   
   _getElement: function(ID) {
      var element = document.getElementById(ID);
	  if (!element) { alert("AimcomTools.ImageZoomer: element #" + ID + " is undefined!"); }  
      return element;
   }
}

/**
 * mouseLinker
 *
 * links a layer to the mouse cursor. The layer follows the mouse cursor until it
 * is unlinked.
 *
 * @copyright aimcom.de
 * @autor FX
 */
AimcomTools.MouseLinker = {
   mousePosition: {x: 0, y: 0},
   linkedElement: undefined,
   mouseMoveElement: undefined,
   offset: {x:20, y:20},
   
   link: function(linkedElement) {
      this.linkedElement    = linkedElement;
      this.mouseMoveElement = document.getElementsByTagName("body")[0];
      this.mouseMoveElement.onmousemove = function(event) { AimcomTools.MouseLinker.onMouseMove(event); }
   },
   
   unlink: function() {
      if (this.mouseMoveElement === undefined) { return; }
      this.mouseMoveElement.onmousemove = function(event) { };
      this.linkedElement = undefined;
   },
   
   onMouseMove: function(eventParameter) {
      var event = (eventParameter) ? eventParameter : ((window.event) ? window.event : "");
      this.mousePosition.x = event.clientX;
	  this.mousePosition.y = event.clientY;
	  this._updateElement();
   },
   
   _updateElement: function() {
      var innerDimensions = this._getInnerDimensions();
	  var scrollOffset    = this._getScrollOffset();
	  var elementDimensions = this._getElementDimensions(this.linkedElement);
      var spaceNeeded = {x: this.mousePosition.x + this.offset.x * 2 + elementDimensions.width,
                         y: this.mousePosition.y + this.offset.y * 2 + elementDimensions.height};
      var position = {x: scrollOffset.x + this.mousePosition.x,
                      y: scrollOffset.y + this.mousePosition.y};	
      var spaceNeeded2 = {x: this.linkedElement.offsetWidth  + this.offset.x,
                          y: this.linkedElement.offsetHeight + this.offset.y};
	  position.x = (spaceNeeded.x > innerDimensions.width  && this.mousePosition.x > spaceNeeded2.x) ? position.x - elementDimensions.width  - this.offset.x : position.x + this.offset.x; 	     
	  position.y = (spaceNeeded.y > innerDimensions.height && this.mousePosition.y > spaceNeeded2.y) ? position.y - elementDimensions.height - this.offset.y : position.y + this.offset.y; 	
	  this._setPosition(position);	  
   },
   
   _setPosition: function(position) {
      this.linkedElement.style.top  = position.y + "px";
      this.linkedElement.style.left = position.x + "px";
   },
   
   _getElementDimensions: function(element) {
		var dimensions = {width:0, height:0};
    	if(typeof document.layers != 'undefined') {
			dimensions.width  = element.clip.width;
			dimensions.height = element.clip.height;
        } else if (element.offsetWidth) {
			dimensions.width  = parseInt(element.offsetWidth);
			dimensions.height = parseInt(element.offsetHeight);
    	} else {
    	    dimensions.width  = element.style.width;
			dimensions.height = element.style.height;
    	}
    	return dimensions;
   },
   
   _getInnerDimensions: function() {
      var width, height;
	  if (self.innerHeight) {
	     width  = self.innerWidth;
	     height = self.innerHeight;
      } else if (document.documentElement && document.documentElement.clientHeight) {
	     width  = document.documentElement.clientWidth;
	     height = document.documentElement.clientHeight;
      } else if (document.body) {
	     width  = document.body.clientWidth;
	     height = document.body.clientHeight;
      }
      return {width: width, height: height};
   },
   
   _getScrollOffset: function() {
      var x, y;
      if (self.pageYOffset !== undefined) {
	     x = self.pageXOffset;
	     y = self.pageYOffset;
      } else if (document.documentElement && document.documentElement.scrollTop !== undefined) {
	     x = document.documentElement.scrollLeft;
	     y = document.documentElement.scrollTop;
      } else if (document.body !== undefined) {
	     x = document.body.scrollLeft;
	     y = document.body.scrollTop;
      }
	  return {x: x, y: y};
   }
}
   


