//
// HoloZoom Image Magnifier
// (c)2007 Webuddha.com, The Holodyn Corporation
//

function holoZoom(){

  this.kBase          = null;
  this.kZoomedLink    = null;
  this.kNormalImage   = null;
  this.kMagnifier     = null;
  this.kMagActive     = false;
  this.kMagTrigger    = 'click';
  this.kMagnifierIcon = {
    'out':  'include/js/holoZoom/magnifier-out.png',
    'over': 'include/js/holoZoom/magnifier-over.png'
    };
  this.kFollowMouse   = 1;
  this.kMagSizes      = [ [160,120], [240,180], [320,240], [420,320] ];
  this.kMagSizeActive = 3;

  // **************************v****************************************************
  this.load = function(baseID){

    // Base Object
      this.kBase = document.getElementById(baseID);
      if( this.kBase.tagName == null ){
        alert('Error Finding '+baseID);
        return;
      }

    // Zoom Link
      for (var i=0; i < this.kBase.childNodes.length; i++)
        if(this.kBase.childNodes[i].tagName == "A")
          this.kZoomedLink = this.kBase.childNodes[i];
      if(this.kZoomedLink.tagName != 'A'){
        alert("Couldn't find Link"); return; }

    // Zoom Image Dimensions
      zoomedWidth   = this.kZoomedLink.href.replace(/.*w=(\d+).*/,'$1');
      zoomedHeight  = this.kZoomedLink.href.replace(/.*h=(\d+).*/,'$1');

    // Thumbnail Image
      for (var i=0; i < this.kZoomedLink.childNodes.length; i++)
        if(this.kZoomedLink.childNodes[i].tagName == "IMG")
          this.kNormalImage = this.kZoomedLink.childNodes[i];
      if(this.kNormalImage.tagName != 'IMG'){
        alert("Couldn't find Image"); return; }

    // Set Base Div Style
      this.kBase.style.position = 'absolute';
      this.kBase.style.width    = this.kNormalImage.width+'px';
      this.kBase.style.height   = this.kNormalImage.height+'px';

    // Thumbnail Image Offset
      var offSet = this._hzGetOffet( this.kNormalImage );
      this.kNormalImage.xOffset = offSet[0];
      this.kNormalImage.yOffset = offSet[1];

    // Set zIndex for Objects
      this.kZoomedLink.style.zIndex = 10000;
      this.kZoomedLink.style.display = 'block';
      this.kZoomedLink.style.position = 'relative';

    // Magnifier Div
      this.kMagnifier = document.createElement("div");
      this.kMagnifier.xMultiplier  = zoomedWidth/this.kNormalImage.width;
      this.kMagnifier.yMultiplier  = zoomedHeight/this.kNormalImage.height;
      this.kMagnifier.id           = baseID + "Magnifier";
      this.kMagnifier.xPosition    = 0;
      this.kMagnifier.yPosition    = 0;

    // Magnifier Styles
      this.kMagnifier.style.position   = "absolute";
      this.kMagnifier.style.border     = "solid 1px #333";
      this.kMagnifier.style.visibility = "hidden";
      this.kMagnifier.style.display    = "none";
      this.kMagnifier.style.backgroundImage  = "url(" + this.kZoomedLink.href + ")";
      this.kMagnifier.style.backgroundRepeat = "no-repeat";
      this.kMagnifier.style.backgroundColor  = "#ffffff";

    // Actions
      this.kMagnifier.hzo = this;
      this.kZoomedLink.hzo = this;
      this.kMagnifier.onmousedown = function(){ this.hzo._hzResize(); }
      this.kZoomedLink.onmousemove = this.kMagnifier.onmousemove = this._hzTrackMouse;
      this.kZoomedLink.onclick = this._hzClickMouse;

    // Create Magnifier
      this.kBase.appendChild(this.kMagnifier);

    // Add Icon
      if( this.kMagnifierIcon ){
        this.kMagIcon = document.createElement('div');
        this.kMagIcon.style.background = 'url('+this.kMagnifierIcon.out+')';
        this.kMagIcon.style.width = '34px';
        this.kMagIcon.style.height = '27px';
        this.kMagIcon.style.position = 'absolute';
        this.kMagIcon.style.bottom = '10px';
        this.kMagIcon.style.right = '10px';
        this.kZoomedLink.appendChild( this.kMagIcon );
      }

    // Set Size
      this._hzResize( this.kMagSizeActive );

  }

  // **************************v****************************************************
  this._hzGetOffet = function(obj) {
    var curleft = curtop = 0;
    if (obj.offsetParent) {
      do {
        curleft += obj.offsetLeft;
        curtop += obj.offsetTop;
      } while (obj = obj.offsetParent);
    }
    return [curleft,curtop];
  }

  // **************************v****************************************************
  this._hzSetPos = function(){
    if( this.kMagnifier.inDrag ){
      var magnifierCenterX = -1*Math.round(((this.kMagnifier.xPosition-this.kNormalImage.xOffset) * this.kMagnifier.xMultiplier) - this.kMagnifier.xSize/2);
      var magnifierCenterY = -1*Math.round(((this.kMagnifier.yPosition-this.kNormalImage.yOffset) * this.kMagnifier.yMultiplier) - this.kMagnifier.ySize/2);
      this.kMagnifier.style.backgroundPosition = magnifierCenterX+"px "+magnifierCenterY+"px";
      if( this.kFollowMouse ){
        this.kMagnifier.style.left = this.kMagnifier.xPosition-this.kNormalImage.xOffset-this.kMagnifier.xSize/2+'px';
        this.kMagnifier.style.top  = this.kMagnifier.yPosition-this.kNormalImage.yOffset-this.kMagnifier.ySize/2+'px';
      }
    }
  }

  // **************************v****************************************************
  this._hzToggle = function( toggle ){
    if( toggle ){
      if( !this.kMagnifier.inDrag ){
        this.kMagnifier.style.visibility = "visible";
        this.kMagnifier.style.display    = "block";
        this.kMagnifier.style.zIndex     = 10001;
        if( this.kMagnifierIcon )
          this.kMagIcon.style.background = 'url('+this.kMagnifierIcon.over+')';
      }
      this.kMagnifier.inDrag = 1;
      this._hzSetPos();
      this.kMagActive = true;
      // this.kMagnifier.appendChild( this.kMagIcon )
    } else {
      this.kMagnifier.inDrag = 0;
      this.kMagnifier.style.visibility = "hidden";
      this.kMagnifier.style.display    = "none";
      if( this.kMagnifierIcon )
        this.kMagIcon.style.background = 'url('+this.kMagnifierIcon.out+')';
      this.kMagActive = false;
      // this.kZoomedLink.appendChild( this.kMagIcon );
    }
  }

  // **************************v****************************************************
  this._hzResize = function( size ){
    if( size )
      this.kMagSizeActive = size;
    else {
      this.kMagSizeActive++;
      if( this.kMagSizeActive > this.kMagSizes.length-1 )
        this.kMagSizeActive = 0;
    }
    this.kMagnifier.xSize = this.kMagSizes[ this.kMagSizeActive ][0];
    this.kMagnifier.ySize = this.kMagSizes[ this.kMagSizeActive ][1];
    this.kMagnifier.style.width  = this.kMagSizes[ this.kMagSizeActive ][0] + "px";
    this.kMagnifier.style.height = this.kMagSizes[ this.kMagSizeActive ][1] + "px";
    this._hzSetPos();
  }

  // **************************v****************************************************
  this._hzClickMouse = function(event) {
    if(!event)event = window.event;
    if(this.hzo.kMagnifier && !this.hzo.kMagActive)
      this.hzo.kMagActive = true;
    return false;
  }

  // **************************v****************************************************
  this._hzTrackMouse = function(event) {
    if(!event)event = window.event;
    if(this.hzo.kMagnifier){
      if( !this.hzo.kMagActive && this.hzo.kMagTrigger == 'click' )return;
      var eventX;
      var eventY;
      var scrollX = this.hzo.getScrollX();
      var scrollY = this.hzo.getScrollY();
      if (event.pageX){
        eventX = event.pageX;
        eventY = event.pageY;
      } else if(event.clientX){
        eventX = event.clientX+scrollX;
        eventY = event.clientY+scrollY;
      }else{
        return;
      }
      if(eventX > this.hzo.kNormalImage.xOffset && eventX < (this.hzo.kNormalImage.xOffset+this.hzo.kNormalImage.width)){
        if(eventY > this.hzo.kNormalImage.yOffset && eventY < this.hzo.kNormalImage.yOffset+this.hzo.kNormalImage.height){
          this.hzo._hzToggle( 1 );
        } else this.hzo._hzToggle( 0 );
      } else this.hzo._hzToggle( 0 );
      if(this.hzo.kMagnifier.inDrag){
        this.hzo.kMagnifier.xPosition = eventX;
        this.hzo.kMagnifier.yPosition = eventY;
        this.hzo._hzSetPos();
      }
    }
  }

  // **************************v****************************************************
  this.getScrollX = function(){
    var scrollX = 0;
    if(typeof window.pageXOffset == "number")
      scrollX = window.pageXOffset;
    else if(document.documentElement && document.documentElement.scrollLeft)
      scrollX = document.documentElement.scrollLeft;
    else if(document.body && document.body.scrollLeft)
      scrollX = document.body.scrollLeft;
    else if(window.scrollX)
      scrollX = window.scrollX;
    if( !scrollX )return 0;
      else return scrollX;
  }

  // **************************v****************************************************
  this.getScrollY = function(){
    var scrollY = 0;
    if(typeof window.pageYOffset == "number")
      scrollY = window.pageYOffset;
    else if(document.documentElement && document.documentElement.scrollTop)
      scrollY = document.documentElement.scrollTop;
    else if(document.body && document.body.scrollTop)
      scrollY = document.body.scrollTop;
    else if(window.scrollY)
      scrollY = window.scrollY;
    if( !scrollY )return 0;
      else return scrollY;
  }

}
