function zoom (entry)
{
	var photo = findChildByClassname (entry, "photo");	
	var desc  = findChildByClassname (entry, "desc");	
	var name  = findChildByClassname (entry, "name");
	var src   = photo.getAttribute("source");
	
	entry.originalName = name.innerHTML;
    name.innerHTML = "Chargement...";

	if (document.body.currentEntry)
	{
		unzoom (document.body.currentEntry);
	}
	
	document.body.currentEntry = entry;
	
	photo.src = "";	
	photo.onload = zoomLoaded;
	
	desc.style.position = "absolute";
	desc.style.zIndex = "999";
	desc.style.top = "-10000px";
	desc.style.left = "-10000px";
	desc.style.display = "block";
	
	photo.style.position = "absolute";
	photo.style.zIndex = "1000";
	photo.style.top = "-10000px";
	photo.style.left = "-10000px";
	photo.style.display = "inline";
	photo.src = src;
}

function unzoom (entry)
{
	var t    = findChildByClassname (entry, "thumb");
	var p    = findChildByClassname (entry, "photo");
 	var desc = findChildByClassname (entry, "desc");
	var tp   = getElementPosition (t);
	var pp   = getElementPosition (p);
	var tw   = t.offsetWidth;
	var th   = t.offsetHeight;
	var w    = p.offsetWidth;
	var h    = p.offsetHeight;
	
	document.body.currentEntry = null;
	
	desc.style.display = "none";
	
	zoomAsync (p, pp.x, pp.y, w, h, tp.x, tp.y, tw, th, 1, false);
}

function zoomLoaded ()
{
	var t    = findChildByClassname (this.parentNode, "thumb");
	var desc = findChildByClassname (this.parentNode, "desc");
	var tp   = getElementPosition (t);
	var tw   = t.offsetWidth;
	var th   = t.offsetHeight;
	var w    = this.offsetWidth;
	var h    = this.offsetHeight;
	var x    = (tp.x + (tw / 2)) - (w / 2);
	var y    = (tp.y + (th / 2)) - (h / 2);
	
	desc.style.width = w + "px";
	
	var size   = getDocumentSize();
	var scroll = getDocumentScroll();
	var mx     = size.x + scroll.x;
	var my     = size.y + scroll.y;
	var dh     = desc.offsetHeight;
	
	if ((x + w) > mx) x -= ((x + w) - mx);
	if ((y + h) > (my - dh)) y -= (((y + h) - my) + dh);
	if (x < scroll.x) x += (scroll.x - x);
	if (y < scroll.y) y += (scroll.y - y);
	
	zoomAsync (this, tp.x, tp.y, tw, th, x, y, w, h, 1, true);
}

function zoomAsync (photo, fromX, fromY, fromW, fromH, toX, toY, toW, toH, step, grow)
{	
	var d  = step / 10;
	var dx = Math.round ((toX - fromX) * d);
	var dy = Math.round ((toY - fromY) * d);
	var dw = Math.round ((toW - fromW) * d);
	var dh = Math.round ((toH - fromH) * d);
	
	photo.style.left   = (fromX + dx) + "px";
	photo.style.top    = (fromY + dy) + "px";
	photo.style.width  = (fromW + dw) + "px";
	photo.style.height = (fromH + dh) + "px";
	
	var func = function () { zoomAsync (photo, fromX, fromY, fromW, fromH, toX, toY, toW, toH, step + 1, grow); };
	
	if (step < 10) setTimeout (func, 10);
	else           endZoom (photo, grow);
}

function endZoom (photo, grow)
{
	var entry = photo.parentNode;
		
	if (grow)
	{
		var name  = findChildByClassname (entry, "name");
		name.innerHTML = entry.originalName;
		entry.onclick = function () { unzoom (entry); };
		showDescription (entry);
	}
	else
	{
		photo.style.display = 'none';
		photo.style.width   = "";
		photo.style.height  = "";
	    entry.onclick = function () {   zoom (entry); };	
	}
}

function showDescription (entry)
{
	var desc  = findChildByClassname (entry, "desc");
	var photo = findChildByClassname (entry, "photo");
	var pp    = getElementPosition (photo);
	var w     = photo.offsetWidth;
	var h     = photo.offsetHeight;
	var x     = pp.x;
	var y     = pp.y + h;
	
	desc.style.position = "absolute";
	desc.style.display  = "block";
	desc.style.top      = (y - desc.offsetHeight) + "px";
	desc.style.left     = x + "px";
	desc.style.width    = w + "px";
	
	moveDescription (desc, y, 1);
}

function moveDescription (desc, targetY, step)
{
	var func = function () { moveDescription (desc, targetY, step + 1); };
	var y = getElementPosition (desc).y;
	
	if (y >= targetY) return;
	
	desc.style.top = (y + 1) + "px";
	setTimeout (func, 10);
}

function findChildByClassname (parent, className)
{
	var child = parent.firstChild;
	while (child != null)
	{
		var cn = child.className;
		if (cn == className) return child;
		child = child.nextSibling;
	}
}

function getElementPosition (e)
{
	var p = {};
	p.x = e.offsetLeft;
	p.y = e.offsetTop;
	
    var c = e.offsetParent;
    while (c)
    {
        p.x += c.offsetLeft;
        p.y += c.offsetTop;
        
        c = c.offsetParent;
    }
    
    return p;
}

function getDocumentScroll ()
{
	var scroll = {};
	
	scroll.x = 0;
	scroll.y = 0;
	
	if (typeof window.pageYOffset == 'number')
	{
		scroll.y = window.pageYOffset;
		scroll.x = window.pageXOffset;
	}
	else if (document.body && (document.body.scrollLeft || document.body.scrollTop))
	{
		scroll.y = document.body.scrollTop;
		scroll.x = document.body.scrollLeft;
	}
	else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop))
	{
		scroll.y = document.documentElement.scrollTop;
		scroll.x = document.documentElement.scrollLeft;
	}
	
	return scroll;
}



function getDocumentSize ()
{
	var size = {};
	
	size.x = 0;
	size.y = 0;
	
	if (typeof window.innerWidth == 'number')
	{
		size.x = window.innerWidth;
		size.y = window.innerHeight;
	}
	else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
	{
		size.x = document.documentElement.clientWidth;
		size.y = document.documentElement.clientHeight;
	}
	else if (document.body && (document.body.clientWidth || document.body.clientHeight))
	{
		size.x = document.body.clientWidth;
		size.y = document.body.clientHeight;
	}
	
	return size;
}