// External Box
// 
// Every <a rel="externalbox-something">content</a> will have its 
// content copied to <div id="something"> when clicked

(function($)
{
	var sourceElements = {}; // sourceElements['id'] = domelement

	var relRegexp = /\sexternalbox-(\S+)\s/;
	var openbydefaultRegexp = /\sexternalboxopenbydefault\s/;
	
	
	$.ExternalBox = {
		disabled: false,
		
		setDisabled: function(disabled)
		{
			$.ExternalBox.disabled = disabled;
		}
	};
	
	$(function()
	{
		var a, links, rel, regexp, result;
		
		links = $('a[rel]').get();
		for (a = 0; a < links.length; a++)
		{
			rel = links[a].getAttribute("rel");
			if (!rel) continue;
			
			result = relRegexp.exec(" "+rel+" ");
			if (result)
			{
				// result[1] is the target id
				$(links[a]).bind("click", {targetId: result[1]}, externalbox_click);
				if (openbydefaultRegexp.test(" "+rel+" "))
					$(links[a]).click();
			}
		}
	});
	
	$.fn.externalbox = function()
	{
		var links, a, len, rel;
		links = $(this).get();
		
		for (a = 0, len = links.length; a < len; a++)
		{
			rel = links[a].getAttribute("rel");
			if (!rel) continue;
			
			result = relRegexp.exec(" "+rel+" ");
			if (result)
			{
				// result[1] is the target id
				$(links[a]).bind("click", {targetId: result[1]}, externalbox_click);
				if (openbydefaultRegexp.test(" "+rel+" "))
					$(links[a]).click();
			}
		}
	};
	
	function img_load(e)
	{
		var a, len, target, elementQueue;
		target = e.data.target;
		elementQueue = e.data.elementQueue;
		len = elementQueue.length;
		
		if (this.getAttribute('src') === 'about:blank') return; // wrong load event
		
		$(target).removeClass("externalbox-loading");
		if (!len) return;
		
		//remove any old elements in the target div
		while (target.childNodes.length)
		{
			target.removeChild(target.firstChild);
		}
		
		for (a = 0; a < len; a++)
		{
			target.appendChild(elementQueue[a]);
		}
		elementQueue.length = 0; //Empty the queue, incase this event is fired multiple times, it will be parsed only once
	}
	
	function externalbox_click(e)
	{
		var oldSource, source, target, a, len, imgs, node, elementQueue; 

		if ($.ExternalBox.disabled) return;
		e.preventDefault();
		
		oldSource = sourceElements[e.data.targetid];
		sourceElements[e.data.targetid]	= source = this; // <a rel="externalbox-something">...</a>
		target = document.getElementById(e.data.targetId);
		if (!target) return;
		
		elementQueue = []; // When you click on an image, the external <div> is not filled until the image has finnished loading
		
		$(target).addClass("externalbox-loading");
		
		imgs = [];

		elementQueue.push(div('extraDiv0'));
		elementQueue.push(div('extraDiv1'));
		
		//copy the content of this link
		for (a = 0, len = source.childNodes.length; a < len; a++)
		{
			node = source.childNodes[a].cloneNode(true);
			elementQueue.push(node);
			
			if (node.nodeName.toUpperCase() === 'IMG')
			{
				imgs.push(node);
			}
			
			if (node.getElementsByTagName) //could be a text node
				$.merge(imgs, node.getElementsByTagName('node'));
		}
		
		function div(classname)
		{
			var node = document.createElement('div');
			node.setAttribute('class', classname);
			return node;
		}
		
		elementQueue.push(div('extraDiv2'));
		elementQueue.push(div('extraDiv3'));
		
		for(a = 0, len = imgs.length; a < len; a++)
		{
			node = imgs[a];
			node.removeAttribute('width');
			node.removeAttribute('height');
			
			node.setAttribute('src', 'about:blank');
			
			$(node).bind('load', {target: target, elementQueue: elementQueue}, img_load)
			       .bind('error', {target: target, elementQueue: elementQueue}, img_load);
			
			node.setAttribute('src', source.getAttribute('href'));
		}
		
		
		$(source).addClass("externalbox-open");
		$(source.parentNode).addClass("externalbox-open");
		if (oldSource && oldSource !== source)
		{
			$(oldSource).removeClass("externalbox-open");
			$(oldSource.parentNode).removeClass("externalbox-open");
		}
		
		if (window.supersleight) //png fix
			supersleight.run(target);
		
		
		if (window.fullscreenimage_findFullscreenImage)
			setTimeout(fullscreenimage_findFullscreenImage, 0);
	}
})(jQuery);