var photo = 
{
	expand: function(a,image,itype,thumb_x,thumb_y,thumb_source_size)
	{
		if (!photo.wait)
		{
			photo.wait = document.createElement('img');
			photo.wait.src='/cms/images/wait.gif';
			photo.wait.style.position= 'absolute';
			photo.wait.style.zIndex = 999;
			photo.wait.style.visibility = 'hidden';
			document.body.appendChild(photo.wait);
			document.onkeydown = photo.key;
		}

		if (a.pholder)
		{
			photo.shutdown(a.pholder)
			return false;
		}
				
		var aimgs = a.getElementsByTagName('img');
		var aimg = aimgs[0];
		
		a.image = aimg;
		
		photo.inProgress = true;
		
		var pholder = photo.getHolder();
		a.pholder = pholder
		pholder.photoInfo.a = a;
				
		var prevnext = photo.prevnext(a);
		
		if (prevnext.prev)
			pholder.photoInfo.leftLink.style.display = '';
		else
			pholder.photoInfo.leftLink.style.display = 'none';
			
		if (prevnext.next)
			pholder.photoInfo.rightLink.style.display = '';
		else
			pholder.photoInfo.rightLink.style.display = 'none';
		
		document.body.appendChild(pholder);
		
		var caption = a.lastChild;
		if (caption && caption.tagName == 'SPAN')
		{
			pholder.photoInfo.captionHolder.innerHTML = caption.innerHTML;
		}
		else
			pholder.photoInfo.captionHolder.innerHTML = '';
		
		pholder.photoInfo.zindex = photo.zindex;
		pholder.photoInfo.resizing = true;
		pholder.photoInfo.thumb = aimg;
		pholder.photoInfo.thumb_x = thumb_x;
		pholder.photoInfo.thumb_y = thumb_y;
		pholder.photoInfo.thumb_size = thumb_source_size;
		
		var pos = util.epos(pholder.photoInfo.thumb);
		pholder.photoInfo.startLeft = pos.x;
		pholder.photoInfo.startTop = pos.y;
		
		
		pholder.photoInfo.startWidth = aimg.width;
		pholder.photoInfo.startHeight = aimg.height;
		
		if (aimg.height > aimg.width)
			pos.y += (aimg.height - aimg.width) / 2;
		
		if (aimg.height < aimg.width)
		{
			pos.x += (aimg.width - aimg.height) / 2;
		}
		
		pholder.photoInfo.cX = pos.x + pholder.photoInfo.thumb.width / 2;			
		pholder.photoInfo.cY = pos.y + pholder.photoInfo.thumb.height / 2;		
		
		if (photo.wait)
		{
			photo.wait.style.left = (pholder.photoInfo.cX - 12) + 'px';
			photo.wait.style.top = (pholder.photoInfo.cY - 12) + 'px';
			photo.wait.style.visibility = 'visible';
		}
		
		pholder.photoInfo.img.onload = photo.onloaded;

		pholder.photoInfo.img.src="pictures/p" + image + '.' + itype; // /s

		return false;
	},
	
	onloaded: function()
	{
		var pholder = this.pholder;
		
		var yTop = util.yTop()
		var yLeft = util.yLeft();
		
		var wW = document.documentElement.clientWidth || document.body.clientWidth;
		var wH = document.documentElement.clientHeight || document.body.clientHeight;

		if (photo.wait)
			photo.wait.style.visibility = 'hidden';
		
		pholder.photoInfo.dragged = false;

		var realImgH = pholder.photoInfo.img.height;
		var realImgW = pholder.photoInfo.img.width;

		var rescale = 1;
		if (wW <= 1024)
			rescale = 6/8;
		
		var imgH = realImgH * rescale;
		var imgW = realImgW * rescale;
		
		if (typeof(pholder.photoInfo.thumb_size) != 'number')
		{
			pholder.photoInfo.thumb_x = 0;
			pholder.photoInfo.thumb_y = 0;
			pholder.photoInfo.thumb_size = imgW;
		}

		pholder.style.width = imgW + 'px';;
		
		var holderFullH = pholder.offsetHeight;
		var holderH = pholder.offsetHeight;
		pholder.style.width = '';

		
		pholder.photoInfo.endWidth = imgW;
		pholder.photoInfo.endHeight = imgH;
		
		var startScale = pholder.photoInfo.thumb.width / pholder.photoInfo.thumb_size;
		
		pholder.photoInfo.imgStartLeft = -pholder.photoInfo.thumb_x * startScale - 1;
		pholder.photoInfo.imgStartTop = -pholder.photoInfo.thumb_y * startScale - 1;
		pholder.photoInfo.imgStartWidth = realImgW * startScale;
		
		pholder.photoInfo.imgEndLeft = 0;
		pholder.photoInfo.imgEndTop = 0;
		pholder.photoInfo.imgEndWidth = imgW;

		pholder.photoInfo.endTop = pholder.photoInfo.cY - holderFullH / 2;
		var botLim = yTop + wH - 20;
		if (pholder.photoInfo.endTop + holderFullH > botLim)
			pholder.photoInfo.endTop = botLim - holderFullH;
		if (pholder.photoInfo.endTop < yTop + 10)
			pholder.photoInfo.endTop = yTop + 10;
			
		pholder.photoInfo.endLeft = pholder.photoInfo.cX - imgW / 2;
		var rightLim = yLeft + wW - 20;
		if (pholder.photoInfo.endLeft + imgW > rightLim)
			pholder.photoInfo.endLeft = rightLim - imgW;
		if (pholder.photoInfo.endLeft < yLeft + 10)
			pholder.photoInfo.endLeft = yLeft + 10;
		
		pholder.photoInfo.incrW = (pholder.photoInfo.endWidth - pholder.photoInfo.startWidth) / photo.iters;
		pholder.photoInfo.incrH = (pholder.photoInfo.endHeight - pholder.photoInfo.startHeight) / photo.iters;
		pholder.photoInfo.incrTop = (pholder.photoInfo.startTop - pholder.photoInfo.endTop) / photo.iters;
		pholder.photoInfo.incrLeft = (pholder.photoInfo.startLeft - pholder.photoInfo.endLeft) / photo.iters;
		
		pholder.photoInfo.imgIncrTop = (pholder.photoInfo.imgStartTop - pholder.photoInfo.imgEndTop) / photo.iters;
		pholder.photoInfo.imgIncrLeft = (pholder.photoInfo.imgStartLeft - pholder.photoInfo.imgEndLeft) / photo.iters;
		pholder.photoInfo.imgIncrWidth = (pholder.photoInfo.imgStartWidth - pholder.photoInfo.imgEndWidth) / photo.iters;

		pholder.photoInfo.iter = 0;
		
		pholder.style.left = (pholder.photoInfo.startLeft - pholder.photoInfo.incrLeft * pholder.photoInfo.iter) + 'px';
		pholder.style.top = (pholder.photoInfo.startTop - pholder.photoInfo.incrTop * pholder.photoInfo.iter) + 'px';
		pholder.style.width = (pholder.photoInfo.startWidth + pholder.photoInfo.incrW * pholder.photoInfo.iter) + 'px';
		pholder.style.height = (pholder.photoInfo.startHeight + pholder.photoInfo.incrH * pholder.photoInfo.iter) + 'px';
		
		pholder.photoInfo.img.style.top = (pholder.photoInfo.imgStartTop) + 'px';
		pholder.photoInfo.img.style.left = (pholder.photoInfo.imgStartLeft - pholder.photoInfo.imgIncrLeft * pholder.photoInfo.iter) + 'px';
		pholder.photoInfo.img.style.width = (pholder.photoInfo.imgStartWidth - pholder.photoInfo.imgIncrWidth * pholder.photoInfo.iter) + 'px';

		pholder.photoInfo.iter = 0;
		
		photo.settopmost(pholder);
		
		
		setTimeout(function(){photo.expanding();},photo.itertime);
	},
	
	expanding: function()
	{
		
		if (++photo.topmost.photoInfo.iter > photo.iters)
		{
			photo.topmost.photoInfo.img.style.width = photo.topmost.photoInfo.imgEndWidth + 'px';
			photo.topmost.photoInfo.img.style.top = '';
			photo.topmost.photoInfo.img.style.left = '';
						
			photo.topmost.style.height = ''; 
			photo.topmost.style.width = photo.topmost.photoInfo.imgEndWidth + 'px';
			photo.topmost.style.left = (photo.topmost.photoInfo.endLeft-1) + 'px';
			photo.topmost.style.top = (photo.topmost.photoInfo.endTop-1) + 'px';
			photo.topmost.photoInfo.resizing = false;
			
			photo.topmost.photoInfo.thumb.style['filter'] = 'alpha(opacity=30)';
			photo.topmost.photoInfo.thumb.style['-moz-opacity'] = '.30';
			photo.topmost.photoInfo.thumb.style['opacity'] = '.30';
			photo.topmost.photoInfo.thumb.className = 'unexpand';
			
			photo.topmost.photoInfo.bevel.style.width = (photo.topmost.photoInfo.endWidth - 7) + 'px';
			photo.topmost.photoInfo.bevel.style.height = (photo.topmost.photoInfo.endHeight - 8) + 'px';
			photo.topmost.photoInfo.bevel.style.visibility = 'visible';
			
			photo.topmost.photoInfo.bevel.onmousedown = photo.mousedown;
			photo.topmost.photoInfo.img.onmousedown = photo.mousedown;
			photo.topmost.className = 'photoholder photoholderborder';
			
			photo.inProgress = false;
		}
					
		else
		{
//			var mag = photo.iters; - Math.pow(photo.iters - photo.topmost.photoInfo.iter,3) / photo.iters / photo.iters;
			var mag = photo.topmost.photoInfo.iter;
			photo.topmost.style.left = Math.round(photo.topmost.photoInfo.startLeft - photo.topmost.photoInfo.incrLeft * mag) + 'px';
			photo.topmost.style.top = Math.round(photo.topmost.photoInfo.startTop - photo.topmost.photoInfo.incrTop * mag) + 'px';
			photo.topmost.style.width = Math.round(photo.topmost.photoInfo.startWidth + photo.topmost.photoInfo.incrW * mag) + 'px';
			photo.topmost.style.height = Math.round(photo.topmost.photoInfo.startHeight + photo.topmost.photoInfo.incrH * mag) + 'px';

			photo.topmost.photoInfo.img.style.top = Math.round(photo.topmost.photoInfo.imgStartTop - photo.topmost.photoInfo.imgIncrTop * mag) + 'px';
			photo.topmost.photoInfo.img.style.left = Math.round(photo.topmost.photoInfo.imgStartLeft - photo.topmost.photoInfo.imgIncrLeft * mag) + 'px';
			photo.topmost.photoInfo.img.style.width = Math.round(photo.topmost.photoInfo.imgStartWidth - photo.topmost.photoInfo.imgIncrWidth * mag) + 'px';
			
			photo.topmost.style['visibility'] = 'visible';
			setTimeout(function(){photo.expanding();},photo.itertime);
		}
	},
	
	shutdownall: function()
	{
		var images = photo.getImages();
				
		for (var i = 0;i < images.length;i++)
		{
			if (images[i].pholder)
			{
				photo.shutdown(images[i].pholder);
			}
		}
	},
	
	shutdown: function(pholder)
	{

		pholder.photoInfo.thumb.style['filter'] = '';
		pholder.photoInfo.thumb.style['-moz-opacity'] = '';
		pholder.photoInfo.thumb.style['opacity'] = '';
		pholder.photoInfo.thumb.className = 'expand';
		
		
		
		pholder.photoInfo.resizing = true;
//		pholder.photoInfo.caption.style.display = 'none';
		pholder.photoInfo.bevel.style.visibility = 'hidden';
		
		pholder.photoInfo.incrW = (pholder.photoInfo.endWidth - pholder.photoInfo.startWidth) / photo.awayIters;
		pholder.photoInfo.incrH = (pholder.photoInfo.endHeight - pholder.photoInfo.startHeight) / photo.awayIters;
		pholder.photoInfo.incrTop = (pholder.photoInfo.endTop - pholder.photoInfo.startTop) / photo.awayIters;
		pholder.photoInfo.incrLeft = (pholder.photoInfo.endLeft - pholder.photoInfo.startLeft) / photo.awayIters;

		pholder.style.width = pholder.photoInfo.endWidth + 'px';
		pholder.style.height = pholder.photoInfo.endHeight + 'px';
		pholder.style.left = pholder.photoInfo.endLeft + 'px';
		pholder.style.top = pholder.photoInfo.endTop + 'px';
		pholder.style.backgroundColor = '';
		
	
		pholder.photoInfo.imgIncrTop = (pholder.photoInfo.imgStartTop - pholder.photoInfo.imgEndTop) / photo.awayIters;
		pholder.photoInfo.imgIncrLeft = (pholder.photoInfo.imgStartLeft - pholder.photoInfo.imgEndLeft) / photo.awayIters;
		pholder.photoInfo.imgIncrWidth = (pholder.photoInfo.imgStartWidth - pholder.photoInfo.imgEndWidth) / photo.awayIters;

		pholder.className = 'photoholder';
		
		pholder.photoInfo.iter = 0;
		setTimeout(function(){photo.contracting(pholder);},photo.itertime);
	},
	
	contracting: function(pholder)
	{
		if (++pholder.photoInfo.iter >= photo.awayIters)
		{
			photo.remove(pholder);
		}
		else
		{
			pholder.style.width = Math.round(pholder.photoInfo.endWidth - pholder.photoInfo.incrW * pholder.photoInfo.iter) + 'px';
			pholder.style.height = Math.round(pholder.photoInfo.endHeight - pholder.photoInfo.incrH * pholder.photoInfo.iter) + 'px';
			pholder.style.left = Math.round(pholder.photoInfo.endLeft - pholder.photoInfo.incrLeft * pholder.photoInfo.iter) + 'px';
			pholder.style.top = Math.round(pholder.photoInfo.endTop - pholder.photoInfo.incrTop * pholder.photoInfo.iter) + 'px';
			
			pholder.photoInfo.img.style.top = Math.round(pholder.photoInfo.imgEndTop + pholder.photoInfo.imgIncrTop * pholder.photoInfo.iter) + 'px';
			pholder.photoInfo.img.style.left = Math.round(pholder.photoInfo.imgEndTop + pholder.photoInfo.imgIncrLeft * pholder.photoInfo.iter) + 'px';
			pholder.photoInfo.img.style.width = Math.round(pholder.photoInfo.imgEndWidth + pholder.photoInfo.imgIncrWidth * pholder.photoInfo.iter) + 'px';
			
			var opac = 1 - pholder.photoInfo.iter / photo.awayIters;
			
			pholder.photoInfo.img.style.opacity = opac;
			pholder.photoInfo.img.style['filter'] = 'alpha(opacity=' + opac * 100 + ')';
			pholder.photoInfo.img.style['-moz-opacity'] = opac;
			
			setTimeout(function(){photo.contracting(pholder);},photo.itertime);
		}
	},
	
	findtopmost: function()
	{
		var zindex = 0;
		var ph = null;		
		var images = photo.getImages();
				
		for (var i = 0;i < images.length;i++)
		{
			if (images[i].pholder)
			{
				if (images[i].pholder.photoInfo.zindex > zindex)
				{
					zindex = images[i].pholder.photoInfo.zindex;
					ph = images[i].pholder;
				}
			}
		}
		if (ph)
			photo.settopmost(ph);
	},
	
	remove: function(pholder)
	{
		pholder.photoInfo.img.onmousedown = null;
		pholder.photoInfo.img.onmouseup = null;
		pholder.photoInfo.img.onmousemove = null;
		pholder.photoInfo.img.onmouseout = null;
		
		pholder.photoInfo.a.pholder = null;
		
		pholder.photoInfo.thumb.pholder = null;
		
		document.body.removeChild(pholder);

		photo.findtopmost();
	},
	
	settopmost: function(ph)
	{
		if (photo.topmost)
		{
			photo.topmost.style.backgroundColor = "#dddddd";
			photo.topmost.photoInfo.bevel.className = 'imagebevel select';
		}
		
		photo.topmost = ph;
		photo.topmost.style.backgroundColor = "#ffffff";
		photo.topmost.photoInfo.bevel.className = 'imagebevel unexpand';
		photo.zindex++;
		photo.topmost.style['zIndex'] = photo.zindex;
		photo.topmost.photoInfo.zindex = photo.zindex;
	},
	
	mousedown: function(e)
	{
		e = e || window.event; 
		var pholder = e.target || e.srcElement;
		
		
		if (pholder.pholder) pholder = pholder.pholder;
		
		if (pholder.photoInfo.resizing)
			return false;

		if (photo.topmost != pholder)
			photo.settopmost(pholder);		
		else
			pholder.photoInfo.dismissable = true;
		
		pholder.photoInfo.dragStartX = e.clientX;
		pholder.photoInfo.dragStartY = e.clientY;
		pholder.photoInfo.newX = pholder.photoInfo.endLeft;
		pholder.photoInfo.newY = pholder.photoInfo.endTop;
		
		pholder.photoInfo.bevel.onmousemove = photo.mousemove;
		pholder.photoInfo.bevel.onmouseout = photo.mouseout;
		pholder.photoInfo.bevel.onmouseup = photo.mouseup;
		pholder.photoInfo.img.onmousemove = photo.mousemove;
		pholder.photoInfo.img.onmouseout = photo.mouseout;
		pholder.photoInfo.img.onmouseup = photo.mouseup;
		
		return false;
	},
	
	mouseout: function(e)
	{
		e = e || window.event; 
		var pholder = e.target || e.srcElement;
		
		if (pholder.pholder) pholder = pholder.pholder;
		
		pholder.photoInfo.bevel.onmousemove = null;
		pholder.photoInfo.bevel.onmouseout = null;
		pholder.photoInfo.img.onmousemove = null;
		pholder.photoInfo.img.onmouseout = null;
		pholder.photoInfo.img.onmouseupe = null;
		pholder.photoInfo.img.onmouseup = null;
		pholder.photoInfo.dragged = false;
		
		pholder.photoInfo.endLeft = pholder.photoInfo.newX;
		pholder.photoInfo.endTop = pholder.photoInfo.newY;
	},
	
	mousemove: function(e)
	{
		e = e || window.event; 
		var pholder = e.target || e.srcElement;
		
		if (pholder.pholder) 
			pholder = pholder.pholder;
		
		if (pholder.photoInfo.resizing)
			return false;

		var newX = e.clientX - pholder.photoInfo.dragStartX + pholder.photoInfo.endLeft;
		var newY = e.clientY - pholder.photoInfo.dragStartY + pholder.photoInfo.endTop;

		var dx = Math.abs(newX - pholder.photoInfo.newX);
		var dy = Math.abs(newY - pholder.photoInfo.newY);
		var d = (dx > dy) ? dx : dy;
		
		if (pholder.photoInfo.dragged || d > 5)
		{
			pholder.photoInfo.dragged = true;
	
			pholder.style['left'] = newX + "px";
			pholder.style['top'] = newY + "px";
	
			pholder.photoInfo.newX = newX; 
			pholder.photoInfo.newY = newY
			
			pholder.photoInfo.dismissable = false;
		}
				
		return false;
	},
	
	mouseup: function(e)
	{
		e = e || window.event; 
		var pholder = e.target || e.srcElement;
		
		if (pholder.pholder) pholder = pholder.pholder;
		
		if (pholder.photoInfo.resizing)
			return false;
	
		pholder.photoInfo.bevel.onmousemove = null;
		pholder.photoInfo.bevel.onmouseout = null;
		pholder.photoInfo.img.onmousemove = null;
		pholder.photoInfo.img.onmouseout = null;
				
		if (!pholder.photoInfo.dragged && pholder.photoInfo.dismissable && pholder == photo.topmost)
		{
			photo.shutdown(pholder);
		}
		else
		{
			pholder.photoInfo.endLeft = pholder.photoInfo.newX;
			pholder.photoInfo.endTop = pholder.photoInfo.newY;
		}
		
		pholder.photoInfo.dragged = false;
		pholder.photoInfo.dismaissable = false;
				
		return false;
	},

	getHolder: function()
	{
		photo.zindex++;
		
		var pholder = document.createElement('div');
		pholder.className = 'photoholder';
		pholder.style.top = '0px';
		pholder.style.left = '0px';;
		pholder.photoInfo = {};
		
		pholder.photoInfo.img = document.createElement('img');
		pholder.appendChild(pholder.photoInfo.img);
		pholder.photoInfo.img.pholder = pholder;
		pholder.photoInfo.img.style.position = 'relative';
		
		pholder.photoInfo.bevel = document.createElement('div');
		pholder.photoInfo.bevel.className = 'imagebevel unexpand';
		pholder.photoInfo.bevel.title = 'Click to un-zoom. Click and drag to move.';
		pholder.photoInfo.bevel.style.visibility = 'hidden';
		pholder.photoInfo.bevel.pholder = pholder;
		pholder.appendChild(pholder.photoInfo.bevel);
		
		var pleft = document.createElement('img');
		pleft.src="/cms/images/pleft.gif";
		pleft.onclick = function(){photo.prevPhoto(pholder);};
		pleft.title = '[left arrow] Previous photo';
		pleft.style.cursor = 'pointer';
		pleft.style.cssFloat = 'left';
		pleft.style.styleFloat = 'left';
		pholder.appendChild(pleft);
		
		var pright = document.createElement('img');
		pright.src="/cms/images/pright.gif";
		pright.onclick = function(){photo.nextPhoto(pholder);};
		pright.title = '[right arrow] Next photo';
		pright.style.cursor = 'pointer';
		pright.style.cssFloat = 'right';
		pright.style.styleFloat = 'right';
		pholder.appendChild(pright);

		var pspan = document.createElement('div');		
		pholder.appendChild(pspan);
		pholder.photoInfo.captionHolder = pspan;
		
		pholder.photoInfo.leftLink = pleft;
		pholder.photoInfo.rightLink = pright;
			
		pholder.style.zIndex = photo.zindex;

		return pholder;
	},
	
	
	prevPhoto: function(pholder)
	{
		if (photo.inProgress)
			return;
				
		var limg = pholder || photo.topmost;
		if (limg)
		{
			var images = photo.getImages();
			for (var i = 0;i < images.length;i++)
			{
				if (limg == images[i].pholder)
				{
					if (i)
					{
						if (images[i-1].pholder)
						{
							photo.settopmost(images[i-1].pholder);
						}
						else
						{
							images[i-1].onclick();
						}
						photo.shutdown(limg);
					}
					break;
				}
			}
		}
	},
	
	nextPhoto: function(pholder)
	{
		if (photo.inProgress)
			return;
			
		var limg = pholder || photo.topmost;
		if (limg)
		{
			var images = photo.getImages();
			for (var i = 0;i < images.length;i++)
			{
				if (limg == images[i].pholder)
				{
					if (i < images.length - 1)
					{
						if (images[i+1].pholder)
						{
							photo.settopmost(images[i+1].pholder)
						}
						else
						{
							images[i+1].onclick();
						}
						photo.shutdown(limg);
					}
					break;
				}
			}
		}
	},
	
	key: function(e)
	{
		e = e || window.event; 
		target = e.target || e.srcElement;
		if (target.form)
			return true;
		switch(e.keyCode)
		{
			case 37: // left
				photo.prevPhoto();
				break;
			case 39: // right
				photo.nextPhoto();
				break;
		}
	},
		
	prevnext: function(a)
	{
		var prev = null;
		var next = null;
		
		var images = photo.getImages();
		
		for (var i = 0;i < images.length;i++)
		{
			if (images[i] == a)
			{
				if (i)
					prev = true;
				if (i < images.length - 1)
					next = true;
			}
		}
		
		return {prev: prev, next: next};
	},
	
	getImages: function()
	{
		return document.getElementsByName('photo_expand');
	},
	
	
	inProgress: false,
	topmost: null,
	zindex: 1000,
	itertime: 30,
	iters: 10,
	awayIters: 16

};


