/**
* 
* Image Zoom
* 
* (c) topazmedia
* http://www.topazmedia.de
* 
* @author Julian Servatius
* @version 1.00
* 
* DO NOT COPY WITHOUT PERMISSION
* copright topazmedia, Ludwigsburg,  2007
*/



var zoomFromX = 0;          // DO NOT CHANGE: Die Startbreite für den Zoom 
var zoomFromY = 0;          // DO NOT CHANGE: Die Startbreite für den Zoom
var zoomToX = 0;            // DO NOT CHANGE: Die Zielbreite für den Zoom
var zoomToY = 0;            // DO NOT CHANGE: Die Zielbreite für den Zoom
zoomTempX = 309;        // DO NOT CHANGE: Die Breite während des Zooms, do not change
zoomTempY = 231;        // DO NOT CHANGE: Die Breite während des Zooms, do not change
var zoomWayX = 0;           // DO NOT CHANGE: Die zurückzulegenden Strecke während des Zooms, do not change
var zoomWayY = 0;           // DO NOT CHANGE: Die zurückzulegenden Strecke während des Zooms, do not changes
var zoomImageFactorXY = 0;  // DO NOT CHANGE: Der Bildfaktor Breite zu Höhe
var percentageDone = 0;     // DO NOT CHANGE: Wieviel Prozent sind schon passiert
var direction = 1;          // DO NOT CHANGE:  1=Zoom in, -1= Zoom out

var zoomimage = null;       // DO NOT CHANGE: Das Objekt, in dem gezoomt werden soll
var zoomthumb = null;       // DO NOT CHANGE: Das Objekt, aus dem gezoomt werden soll


var thumbPosition = null;   // DO NOT CHANGE: ein Array mit den Angaben zur Position des Thumbnails, absolut, auf der Seite
var zoomMode = null;        // DO NOT CHANGE:

var zoomModeOut = 2;        // Change 
var zoomModeIn = 2;         // Change 

var bigWidth = 0;
var bigHeight = 0;

var smallWidth = 0;
var smallHeight = 0;

var leftDelayMin = 0;
var topDelayMin = 0;

/**
* Die Funktion Startzoom
* bereitet alles notwendige für den Zoom vor, und startet abschliessend den kontinuierlichen Zoomvorgang
*
* Voraussetzungen:
*
* Ein Bild Thumbnail auf der Seite mit der ID:
* Ein Bild Thumbnail auf der Seite mit der ID:
* Ein Container in dem gezoomt werden soll auf der Seite mit der ID:

*/
function startzoom(originalid, thumbid, x, y)
{

  if ($(originalid) && $(thumbid))
  {
    
    zoomimage = $(originalid);
    zoomimage.style.visibility = 'visible';
    //Position.absolutize(zoomimage);
        
    zoomthumb = $(thumbid);
        
    //Position.absolutize(zoomthumb);    
    //Position.absolutize($('zoomimagecontainer'));
    bigWidth     = zoomimage.width;
    bigHeight     = zoomimage.height;
    
    smallWidth = zoomthumb.width;
    smallHeight = zoomthumb.height;
   
    leftDelayMin = forceInt(zoomimage.parentNode.style.width) - forceInt(bigWidth);
    topDelayMin = forceInt(zoomimage.parentNode.style.height) - forceInt(bigHeight);
    
    prepareZoom("in");

    thumbPosition =  (Position.cumulativeOffset($('zoomimagecontainer')));
 
   
   // thumbPosition = get_dimensions(zoomthumb);
    Event.unloadCache();  // Ein bißchen dirty.. Alle Eventlistener werden hier gekickt!
                          // es würde auch gehen, nur den mouseup listener zu entfernen, aber das buggt gerade
    
    
    // Die Standard events wieder anmelden
    //Event.observe(zoomthumb, 'mouseover', function(event){startzoom('zoombig', 'zoomthumb', Event.pointerX(event), Event.pointerY(event));return false;}, true);
    
    
    //Event.observe(zoomthumb, 'mouseout', function(event){prepareZoom("out");zoom(Event.pointerX(event), Event.pointerY(event));return false;});
    
   
   // Event.observe($('body'), 'mousemove', function(event){return false;}, false);
    Event.observe(zoomimage, 'mousemove', function(event){moveTo(Event.pointerX(event), Event.pointerY(event));return false;},false);
    Event.observe(zoomimage, 'mouseout', function(event){prepareZoom("out");zoom(Event.pointerX(event), Event.pointerY(event));return false;});

    Event.observe(window, 'resize', function(event) {
      thumbPosition = (Position.cumulativeOffset($('zoomimagecontainer')));
    });

    //Event.observe(zoomimage, 'mouseout', function(event){prepareZoom("out");zoom(Event.pointerX(event), Event.pointerY(event));return false;});
   
    //Event.observe(zoomthumb, 'mousemove', function(event){moveTo(Event.pointerX(event), Event.pointerY(event));return false;},false);
    
    
    
    //Event.observe(zoomthumb, 'click', function(event){return false;});
   
    zoom(x, y);
  }	

  return false;
  
}


function flipZoom()
{
  // wenn 
  if (direction==-1)
  {
    zoomimage.style.display ='none';
    zoomthumb.style.display ='block';
    
  }
  else
  {
     //alert (zoomimage.style.display);
     zoomthumb.style.display ='none';
     zoomimage.style.display ='block';
  }
}

/**
* Hier werden dei werte auf einen Zoomout vorgang gesetzt
*/
function prepareZoom(mode)
{
  //
  
//  zoomimage.style.border = '1px solid red';
//  zoomthumb.style.border = '1px solid blue';
  switch (mode)
  {
    // Ich zoome von Groß nach klein
    case "out":

      zoomimage.width = bigWidth;// > 0 ? bigWidth : zoomimage.width;
      zoomimage.height = bigHeight;// > 0 ? bigHeight : zoomimage.height;
      
      zoomFromX   = zoomimage.width;// > 0 ? zoomimage.width : 1;
      zoomFromY   = zoomimage.height;// > 0 ? zoomimage.height : 1;
      
      // Wenn ich zurückzoome, und der Zoom ist nicht vollständig durchgelaufen
      // muss ich dafür sorgen, dass die echten Werte des Vollbildes erhalten bleiben
      
      zoomTempX = zoomFromX;
      zoomTempY = zoomFromY;
      
      zoomToX     = smallWidth; // > 0 ? zoomthumb.width : bigWidth;
      zoomToY     = smallHeight;//  > 0 ? zoomthumb.height : bigHeight;
      direction = -1;
      zoomMode = zoomModeOut;
      flipZoom();
      
      Event.observe(zoomthumb, 'mouseover', function(evt){prepareZoom("in");zoom(Event.pointerX(evt), Event.pointerY(evt));return false;});
    
      
      // TODO: wegnehmen: Event.observe($('body'), 'mousemove', function(event){return false;}, false);
    
    break;
    
    // Ich zoome von klein nach groß
    case "in":
      zoomFromX   = smallWidth;// > 0 ? zoomthumb.width : 1;
      zoomFromY   = smallHeight;// > 0 ? zoomthumb.height : 1;
      
      zoomTempX = zoomFromX;
      zoomTempY = zoomFromY;
    
      zoomToX = bigWidth;// > 0 ? bigWidth : forceInt($(originalid).width);
      zoomToY = bigHeight;// > 0 ? bigHeight : forceInt($(originalid).height);
      
      direction = 1;
      zoomMode = zoomModeIn;
      flipZoom();
      
    break;
  }
    
    // zunächst den Seitenfaktor setzen: 
    zoomImageFactorXY = zoomFromX/zoomFromY;
  
    zoomWayX = forceInt(zoomToX - zoomFromX);
    zoomWayY = forceInt(zoomToY - zoomFromY);
    
}

function moveTo(x, y)
{
   // Die X/Y-Koordinaten des Hauptevents
  // var Pos = zoomimage.offsetLeft + "/" + zoomimage.offsetTop;
   // window.status = "Pos";
  var leftDelay = 0;
  var topDelay = 0;
  

  var thumbPositionX = thumbPosition[0]; ///!!!! Hier liegt ein FEHLER im Mozilla vor
  var thumbPositionY = thumbPosition[1];
 
  
  // Die KLickabweichung nach oben
  var abweichungY = (y-thumbPositionY) / zoomFromY;
  var abweichungX = (x-thumbPositionX) / zoomFromX;
  
 // alert(abweichungX +" "+abweichungY);
  
  percentageDone = percentageDone > 0 ? percentageDone : 1;
  
  // Je weiter ich reinzoome, desto doller..
  leftDelay = (-1)*percentageDone*zoomWayX * abweichungX;
  topDelay = (-1)*percentageDone*zoomWayY * abweichungY;
  
  if (isNaN(leftDelay)) {
    leftDelay = 1;
  }
  
  if (isNaN(topDelay)) {
    topDelay = 1;
  }
   zoomimage.style.marginLeft = forceInt(leftDelay < leftDelayMin ? leftDelayMin : leftDelay) + "px";
   zoomimage.style.marginTop = forceInt(topDelay < topDelayMin ? topDelayMin : topDelay) + "px"; 
}




function zoom(event_x, event_y)
{
  // wieviel Prozent sind erledigt
  percentageDone = (zoomTempX-zoomFromX)/zoomWayX;
  
   //$('product_details_info_text').innerHTML =
   // AUF KEINEN FALL ENTFERNEN! Irgendwas läuft da im Safari mächtig anders
   // als in anderen browsern, ohne den code hier geht das nicht
   try {
    var foo = 
      x + '<br />' +
      y + '<br />' +
      'pdone: ' + percentageDone + '<br />' +
      'tposx: ' + thumbPositionX + '<br />' +
      'tposy: ' + thumbPositionY + '<br />' +
      'abwx: ' + abweichungX  + '<br />' +
      'abwy: ' + abweichungY  + '<br />' +
      'zfx: ' + zoomFromX + '<br />' +
      'zfy: ' + zoomFromY + '<br />' +
      'ztmpx: ' + zoomTempX + '<br />' +
      'ztmpy: ' + zoomTempY + '<br />' +
      'ztx: ' + zoomToX  + '<br />' +   
      'zty: ' + zoomToY  + '<br />' +   
      zoomfactor();
  } catch(e) {return false}
  var nextzoom = false;
  if(zoomTempX*zoomfactor()  <= zoomToX)
  {
    zoomTempX *= zoomfactor();
    nextzoom = true;
  }
  else
  {
    zoomTempX = zoomToX;
  }
  
  if(zoomTempY*zoomfactor() <= zoomToY)
  {
    zoomTempY *= zoomfactor();
    nextzoom = true;
  }
  else
  {
    zoomTempY = zoomToY;
  }
  
  zoomimage.width=zoomTempX;
  zoomimage.height=zoomTempY;
  moveTo(event_x, event_y);
    
  if (nextzoom)
  {
      window.setTimeout("zoom("+event_x+","+event_y+"), 10");
  }
  return false;
}

function forceInt(number) {
  number = parseInt(number);
  return isNaN(number) || !isFinite(number) ? 0 : number;
}





/**
* Dei Funktion errechnet nach beliebigen Kriterien einen Suchfaktior,
* Einfch einen Modus übergeben, und die entsprechende verlaufsformel angeben
*/

function zoomfactor()
{
  switch (zoomMode)
  {
    case 1:
      return Math.sin(percentageDone)+1.0000002;
      break;
    
    case 2:
      return Math.sin((percentageDone^3)*0.1)+1;
      break;
    
    case 3: //
      return (Math.sin(percentageDone*Math.PI)/2);
      break;
    
    case 4: // Zum Move away ganz witzig
      return 1-(Math.cos(percentageDone*Math.PI)/2);
      break;
    default:
       return 1.00;
       break;
  }
}




/*
function absLeft (ele) {
  return ele.offsetParent ? ele.offsetLeft + absLeft(ele.offsetParent) : ele.offsetLeft;
}

function absTop(ele) {
  return ele.offsetParent ? ele.offsetTop + absTop(ele.offsetParent) : ele.offsetTop;
}

function get_dimensions(my_ele)
{
  
  //var my_ele = $(id);
  var result = new Object();
  
  result.x = result.y = result.w = result.h = 0;

  var style;

  if (document.defaultView && document.defaultView.getComputedStyle) {
    style = document.defaultView.getComputedStyle(my_ele, '');
    result.x = Math.max(result.x, forceInt(style.getPropertyValue("left")));
    result.y = Math.max(result.y, forceInt(style.getPropertyValue("top")));
    result.w = Math.max(result.w, forceInt(style.getPropertyValue("width")));
    result.h = Math.max(result.h, forceInt(style.getPropertyValue("height")));
  } else if (window.getComputedStyle) {
    style = window.getComputedStyle(my_ele, '');
    result.x = Math.max(result.x, forceInt(style.getPropertyValue("left")));
    result.y = Math.max(result.y, forceInt(style.getPropertyValue("top")));
    result.w = Math.max(result.w, forceInt(style.getPropertyValue("width")));
    result.h = Math.max(result.h, forceInt(style.getPropertyValue("height")));
  }

  result.x = result.x > 0 ? result.x : absLeft(my_ele);
  result.y = result.y > 0 ? result.y : absTop(my_ele);
  result.w = result.w > 0 ? result.w : (my_ele.offsetWidth ? my_ele.offsetWidth : (my_ele.clientWidth ? my_ele.clientWidth : 0));
  result.h = result.h > 0 ? result.h : (my_ele.offsetHeight ? my_ele.offsetHeight : (my_ele.clientHeight ? my_ele.clientHeight : 0));

  // TODO: scroll-position mit einbeziehen
//alert(result.x + " y: " + result.y);
  return result;
}

*/
