/***********************************************\
Image zooming script
by Nate True, http://cre.ations.net
Free to copy, modify, redistribute, and use 
 provided this fancy notice remains.
If you use this code to great effect,
 please let me know!  I'd love to hear about
 it.  
c_r_e_a_t_i_o_n_s_n_e_t_@_n_a_t_e_t_r_u_e_._c_o_m

en met de groeten van piet!
\***********************************************/

function findParentOfClass(el, parentClass) {
	var p = el;
	while (p.parentNode && p.className != parentClass) {
	    p = p.parentNode;
	}
	if (p && p.className == parentClass) return p;
	return null;
}

function findChildOfClass(el, childClass) {
	var a = el.childNodes;
	var i, p;
	for (i = 0; i < a.length; i++) {
		p = a[i];
		if (p.className == childClass) return p;
		p = findChildOfClass(p, childClass);
		if (p) return p;
	}
	return null;
}

function get_coords(d) {
  var x = 0;
  var y = 0;
  var p = d;
  while (p.offsetParent) {
      x += p.offsetLeft;
      y += p.offsetTop;
    p = p.offsetParent;
  }
  var n = new Object();
  n.x = x;
  n.y = y;
  return n;
}

var zooming;
var dezooming;
var iterating = false;

function dezoom() {
  if (!zooming) return;
    dezooming = zooming;
    zooming = undefined;
    dezooming.targx = dezooming.origx + 4;
    dezooming.targy = dezooming.origy + 4;
    dezooming.targw = dezooming.origw;
    dezooming.targh = dezooming.origh;
    dezooming.origx = dezooming.curx;
    dezooming.origy = dezooming.cury;
    dezooming.origw = dezooming.curw;
    dezooming.origh = dezooming.curh;
    dezooming.newthumb.style.border = '1px solid white';
    dezooming.newimage.style.display = 'none';
    dezooming.one_minus_lambda = 0.8;
    dezooming.newimage.loaded = true;
    if (!iterating) iterate();  
}

function getscrollpos() {
  var r = new Object();
  if (window.innerWidth == undefined) {
    r.w = document.body.clientWidth;
    r.h = document.body.clientHeight;
    r.x = document.body.scrollLeft;
    r.y = document.body.scrollTop;
    r.max_y = document.body.scrollHeight;
  }
  else {
    r.w = window.innerWidth;
    r.h = window.innerHeight;
    r.x = window.scrollX;
    r.y = window.scrollY;
    r.max_y = window.scrollMaxY;
  }
  return r;
}

function imagezoom(link, imgurl) {
  dezoom();
  zooming = new Object();
  zooming.origimg = findChildOfClass(link, "expand_img");
  var coords = get_coords(zooming.origimg);
  zooming.curx = zooming.origx = coords.x - 5;
  zooming.cury = zooming.origy = coords.y - 5;
  zooming.curw = zooming.origw = zooming.origimg.width;
  zooming.curh = zooming.origh = zooming.origimg.height;
  zooming.curopacity = 0;
  zooming.targopacity = 100;
  zooming.newthumb = zooming.origimg.cloneNode(false);
  zooming.newthumb.style.position = "absolute";
  zooming.newthumb.style.left = zooming.origx + "px";
  zooming.newthumb.style.top = zooming.origy + "px";
  zooming.newthumb.style.border = "5px solid white";
  zooming.newthumb.style.zIndex = "100";
  zooming.newimage = document.createElement("img");
  zooming.newimage.style.position = "absolute";
  zooming.newimage.style.left = zooming.origx + "px";
  zooming.newimage.style.top = zooming.origy + "px";
  zooming.newimage.style.border = "5px solid white";
  zooming.newimage.style.zIndex = "120";
  zooming.newimage.style.visibility = "hidden";  
  zooming.imageloaded = false;
  zooming.newimage.onload = function() { this.loaded = true; }
  zooming.one_minus_lambda = 0.93;
  document.getElementById('insertimageshere').appendChild(zooming.newimage);
  document.getElementById('insertimageshere').appendChild(zooming.newthumb);
  zooming.newimage.src = imgurl;
  zooming.origimg.style.visibility = "hidden";
  zooming.link = link;
  
  var scrollpos = getscrollpos();
  wW = scrollpos.w;
  wH = scrollpos.h;
  wX = scrollpos.x;
  wY = scrollpos.y;
  zooming.targw = 640;
  zooming.targh = 480;
  zooming.targx = (wW - zooming.targw) / 2 + wX;
  zooming.targy = (wH - zooming.targh) / 2 + wY;   
  
  var lft = document.getElementById('lostfocusthingy');
  lft.style.left = "-10px";
  lft.style.top = zooming.origy - 20 + "px";
  lft.onblur = function () { dezoom(); };
  lft.focus();
   
  if (!iterating) iterate();
}

var lastiterationtime;
function iterate() {
  var more = false;
  
  if (!iterating) {
    iterating = true;
    lastiterationtime = (new Date()).getTime();
    }

  var now = (new Date()).getTime();
  var delta_t = now - lastiterationtime;
  lastiterationtime = now;

  if (zooming) 
    more = more || step(zooming, delta_t);
  if (dezooming)
    more = more || step(dezooming, delta_t);
  
  if (!more && dezooming) {
    if (dezooming.origimg) 
      dezooming.origimg.style.visibility = 'visible';
    if (dezooming.newimage) 
      dezooming.newimage.parentNode.removeChild(dezooming.newimage);
    if (dezooming.newthumb) 
      dezooming.newthumb.parentNode.removeChild(dezooming.newthumb);
    dezooming = undefined;
  }
  
  if (more) setTimeout("iterate()", 10);
  else iterating = false;
  }

function apply_step(obj, cur, targ, lambda, one_minus_lambda) {
  var orig = eval("obj." + cur);
  eval("obj." + cur + " = obj." + targ + " * lambda + obj." + cur
    + " * one_minus_lambda;");
  return Math.abs(orig - eval("obj." + cur));
}

function step(obj, delta_t) {
  var one_minus_lambda = Math.pow(obj.one_minus_lambda, delta_t / 10);
  var lambda = 1 - one_minus_lambda;
  var opacity_omlambda = Math.pow(0.98, delta_t / 10);
  var opacity_lambda = 1 - opacity_omlambda;
  
  var change = 0;
  
  change += apply_step(obj, "curx", "targx", lambda, one_minus_lambda);
  change += apply_step(obj, "cury", "targy", lambda, one_minus_lambda);
  change += apply_step(obj, "curw", "targw", lambda, one_minus_lambda);
  change += apply_step(obj, "curh", "targh", lambda, one_minus_lambda);
      
  if (obj.newimage.loaded) {
    obj.newimage.style.visibility = "visible";
    change += apply_step(obj, "curopacity", 
      "targopacity", opacity_lambda, opacity_omlambda);
    var curop = Math.ceil(obj.curopacity);
    obj.newimage.style.MozOpacity = curop / 100;
    obj.newimage.style.opacity = curop / 100;
    obj.newimage.style.filter = "filter: alpha(Opacity=" + curop + "); ";
  }
  
  obj.newimage.style.left 
    = obj.newthumb.style.left 
    = obj.curx + "px";
  obj.newimage.style.top
    = obj.newthumb.style.top 
    = obj.cury + "px";
  obj.newimage.style.width 
    = obj.newthumb.style.width 
    = obj.curw + "px";
  obj.newimage.style.height 
    = obj.newthumb.style.height 
    = obj.curh + "px";

  if (change < 0.1 && change > 0 && obj.newimage.loaded) {
    return false;
    }
  return true; 
}

