// on page load call XMDB_init
jQuery(document).ready(XMDB_init);

// add thickbox to href elements that have a class of .cXMDB
function XMDB_init()
{
	jQuery("a.cXMDB").click
	(
		function(event)
		{
			// stop default behaviour
			event.preventDefault();
			// remove click border
			this.blur();

			// get caption: either title or name attribute
			var caption = this.title || this.name || "";

			// get rel attribute for image groups
			var group = this.rel || false;

			// display the box for the elements href
			XMDB_show(caption, this.href, group);
		}
	);
}

// called when the user clicks on a cXMDB link
function XMDB_show(caption, url, rel)
{
	// create iframe, overlay and box if non-existent
	if ( !jQuery("#XMDB_HideSelect").length )
	{
		jQuery("body").append("<iframe id='XMDB_HideSelect'></iframe><div id='XMDB_overlay'></div><div id='XMDB_window'></div>");
		//jQuery("#XMDB_overlay").click(XMDB_remove);
		jQuery("#masthead").addClass('layerfix');
		jQuery("#mainnav").addClass('layerfix');
		jQuery("#adbatch").css('visibility','hidden');
	}

	// TODO replace or check if event is already assigned
	jQuery(window).scroll(XMDB_position);
  
	// TODO replace
	XMDB_overlaySize();
  
	// TODO create loader only once, hide and show on demand
	jQuery("body").append("<div id='XMDB_load'>&nbsp;</div>");
	XMDB_load_position();
  
	// check if a query string is involved
	var baseURL = url.match(/(.+)?/)[1] || url;

	// regex to check if a href refers to an image
	var imageURL = /\.(jpe?g|png|gif|bmp)/gi;

	// check for images
	if ( baseURL.match(imageURL) )
	{
		var dummy = { caption: "", url: "", html: "" };

		var prev = dummy, next = dummy, imageCount = "";

		// if an image group is given
		if ( rel )
		{
			function getInfo(image, id, label)
			{
				return {
					caption: image.title,
					url: image.href,
					html: "<span id='XMDB_" + id + "'>&nbsp;&nbsp;<a href='#'>" + label + "</a></span>"
				}
			}

			// find the anchors that point to the group
			var imageGroup = jQuery("a[@rel="+rel+"]").get();
			var foundSelf = false;
      
			// loop through the anchors, looking for ourself, saving information about previous and next image
			for (var i = 0; i < imageGroup.length; i++)
			{
				var image = imageGroup[i];
				var urlTypeTemp = image.href.match(imageURL);

				// look for ourself
				if ( image.href == url )
				{
					foundSelf = true;
					imageCount = "Image " + (i + 1) + " of "+ (imageGroup.length);
				}
				else
				{
					// when we found ourself, the current is the next image
					if ( foundSelf )
					{
						next = getInfo(image, "next", "Next &gt;");
						// stop searching
						break;
					}
					else
					{
						// didn't find ourself yet, so this may be the one before ourself
						prev = getInfo(image, "prev", "&lt; Prev");
					}
				}
			}
		}
    
		imgPreloader = new Image();
		imgPreloader.onload = function()
		{
			imgPreloader.onload = null;
			// Resizing large images
			var pagesize = XMDB_getPageSize();
			var x = pagesize[0] - 150;
			var y = pagesize[1] - 150;
			var imageWidth = imgPreloader.width;
			var imageHeight = imgPreloader.height;
			if (imageWidth > x)
			{
				imageHeight = imageHeight * (x / imageWidth);
				imageWidth = x;
				if (imageHeight > y)
				{ 
					imageWidth = imageWidth * (y / imageHeight);
					imageHeight = y; 
				}
			}
			else if (imageHeight > y)
			{ 
				imageWidth = imageWidth * (y / imageHeight);
				imageHeight = y; 
				if (imageWidth > x)
				{
					imageHeight = imageHeight * (x / imageWidth);
					imageWidth = x;
				}
			}
			// End Resizing
		  
			// TODO don't use globals
			XMDB_WIDTH = imageWidth + 30;
			XMDB_HEIGHT = imageHeight + 60;
		  
			// TODO empty window content instead
			jQuery("#XMDB_window").append("<a href='' id='XMDB_ImageOff' title='Close'><img id='XMDB_Image' src='"+url+"' width='"+imageWidth+"' height='"+imageHeight+"' alt='"+caption+"'/></a>" + "<div id='XMDB_caption'>"+caption+"<div id='XMDB_secondLine'>" + imageCount + prev.html + next.html + "</div></div><div id='XMDB_closeWindow'><a href='#' id='XMDB_closeWindowButton' title='Close'>x</a></div>");
		  
			jQuery("#XMDB_closeWindowButton").click(XMDB_remove);
		  
			function buildClickHandler(image)
			{
				return function()
				{
					jQuery("#XMDB_window").remove();
					jQuery("body").append("<div id='XMDB_window'></div>");
					XMDB_show(image.caption, image.url, rel);
					return false;
				};
			}
			var goPrev = buildClickHandler(prev);
			var goNext = buildClickHandler(next);
			if ( prev.html )
			{
				jQuery("#XMDB_prev").click(goPrev);
			}
		  
			if ( next.html )
			{
				jQuery("#XMDB_next").click(goNext);
			}
		  
			// TODO use jQuery, maybe with event fix plugin, or just get the necessary parts of it
			document.onkeydown = function(e)
			{
				if (e == null)
				{ // ie
					keycode = event.keyCode;
				}
				else
				{ // mozilla
					keycode = e.which;
				}
				switch(keycode)
				{
					case 27:
						XMDB_remove();
						break;
					case 190:
						if( next.html )
						{
							document.onkeydown = null;
							goNext();
						}
						break;
					case 188:
						if( prev.html )
						{
							document.onkeydown = null;
							goPrev();
						}
						break;
				}
			}
		  
			// TODO don't remove loader etc., just hide and show later
			XMDB_position();
			jQuery("#XMDB_load").remove();
			jQuery("#XMDB_ImageOff").click(XMDB_remove);
		  
			// for safari using css instead of show
			// TODO is that necessary? can't test safari
			jQuery("#XMDB_window").css({display:"block"});
		}
		imgPreloader.src = url;
    
	}
	else
	{ //code to show html pages
		var modalContentW;
		var queryString = url.match(/\?(.+)/)[1];
		var params = XMDB_parseQuery( queryString );
    
		XMDB_WIDTH = (params['width']*1) + 30;
		XMDB_HEIGHT = (params['height']*1) + 40;
		if(jQuery.browser.msie)
			modalContentW = XMDB_WIDTH - 37;
		else
			modalContentW = XMDB_WIDTH - 59;

		var modalContentH = XMDB_HEIGHT - 45;
    
		if(url.indexOf('XMDB_iframe') != -1)
		{
			urlNoQuery = url.split('XMDB_');
			jQuery("#XMDB_window").append("<div id='XMDB_title'><div id='XMDB_modalWindowTitle'>"+caption+"</div><div id='XMDB_closeModalWindow'><a href='#' id='XMDB_closeWindowButton' title='Close'>x</a></div></div><iframe frameborder='0' hspace='0' src='"+urlNoQuery[0]+"' id='XMDB_iframeContent' name='XMDB_iframeContent' style='width:"+(modalContentW + 29)+"px;height:"+(modalContentH + 17)+"px;' onload='XMDB_showIframe()'> </iframe>");
		}
		else
		{
			jQuery("#XMDB_window").append("<div id='XMDB_title'><div id='XMDB_modalWindowTitle'>"+caption+"</div><div id='XMDB_closeModalWindow'><a href='#' id='XMDB_closeWindowButton'>x</a></div></div><div id='XMDB_modalContent' style='width:"+(modalContentW+29)+"px;height:"+(modalContentH+20)+"px;'></div>");
		}
       
		jQuery("#XMDB_closeWindowButton").click(XMDB_remove);
		if(url.indexOf('XMDB_inline') != -1)
		{  
			jQuery("#XMDB_modalContent").html(jQuery('#' + params['inlineId']).html());
			XMDB_position();
			jQuery("#XMDB_load").remove();
			jQuery("#XMDB_window").css({display:"block"});
		}
		else if(url.indexOf('XMDB_iframe') != -1)
		{
			XMDB_position();
			if(frames['XMDB_iframeContent'] == undefined)
			{ //be nice to safari
				jQuery("#XMDB_load").remove();
				jQuery("#XMDB_window").css({display:"block"});
				jQuery(document).keyup( function(e){ var key = e.keyCode; if(key == 27){XMDB_remove()} });
			}
		}
		else
		{
			jQuery("#XMDB_modalContent").load
			(url, 
				function()
				{
					XMDB_position();
					jQuery("#XMDB_load").remove();
					jQuery("#XMDB_window").css({display:"block"}); 
					jQuery("ul.dynimo").find("li span").toggle
					(
						function()
						{
							jQuery(this).parent("li").find("ul").fadeIn("xfast"); jQuery(this).addClass("high");
						},
						function()
						{
							jQuery(this).parent("li").find("ul").fadeOut("xfast"); jQuery(this).removeClass("high");
						}
					).end().find("li b").toggle
					(
						function(){ jQuery(this).parent("li").find("ul.show").fadeOut("xfast"); jQuery(this).addClass("high"); },
						function(){ jQuery(this).parent("li").find("ul.show").fadeIn("xfast"); jQuery(this).removeClass("high"); }
					);
				}
			);
		}
	}

	jQuery(window).resize(XMDB_position);

	document.onkeyup = function(e)
	{   
		if (e == null)
		{ // ie
			keycode = event.keyCode;
		}
		else
		{ // mozilla
			keycode = e.which;
		}
		if(keycode == 27)
		{ // close
			XMDB_remove();
		}  
	}
}

//helper functions below
function XMDB_showIframe()
{
	jQuery("#XMDB_load").remove();
	jQuery("#XMDB_window").css({display:"block"});
}

function XMDB_remove()
{
	jQuery("#XMDB_imageOff").unbind("click");
	jQuery("#XMDB_overlay").unbind("click");
	jQuery("#XMDB_closeWindowButton").unbind("click");
	jQuery("#XMDB_window").fadeOut("fast",function(){jQuery('#XMDB_window,#XMDB_overlay,#XMDB_HideSelect').remove();});
	jQuery("#XMDB_load").remove();
	jQuery("#masthead").removeClass('layerfix');
	jQuery("#mainnav").removeClass('layerfix');
	jQuery("#adbatch").css('visibility','visible');
	document.onkeyup = null;
	return false;
}

function XMDB_position()
{
	var pagesize = XMDB_getPageSize();  
	var arrayPageScroll = XMDB_getPageScrollTop();
	var style = {width: XMDB_WIDTH, left: (arrayPageScroll[0] + (pagesize[0] - XMDB_WIDTH)/2), top: (arrayPageScroll[1] + (pagesize[1]-XMDB_HEIGHT)/2)};
	jQuery("#XMDB_window").css(style);
}

function XMDB_overlaySize()
{
	if (window.innerHeight && window.scrollMaxY || window.innerWidth && window.scrollMaxX)
	{  
		yScroll = window.innerHeight + window.scrollMaxY;
		xScroll = window.innerWidth + window.scrollMaxX;
		var deff = document.documentElement;
		var wff = (deff&&deff.clientWidth) || document.body.clientWidth || window.innerWidth || self.innerWidth;
		var hff = (deff&&deff.clientHeight) || document.body.clientHeight || window.innerHeight || self.innerHeight;
		xScroll -= (window.innerWidth - wff);
		yScroll -= (window.innerHeight - hff);
	}
	else if (document.body.scrollHeight > document.body.offsetHeight || document.body.scrollWidth > document.body.offsetWidth)
	{ // all but Explorer Mac
		yScroll = document.body.scrollHeight;
		xScroll = document.body.scrollWidth;
	}
	else
	{ // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		yScroll = document.body.offsetHeight;
		xScroll = document.body.offsetWidth;
	}
	jQuery("#XMDB_overlay").css({"height": yScroll, "width": xScroll});
	jQuery("#XMDB_HideSelect").css({"height": yScroll,"width": xScroll});
}

function XMDB_load_position()
{
	var pagesize = XMDB_getPageSize();
	var arrayPageScroll = XMDB_getPageScrollTop();
	jQuery("#XMDB_load")
		.css({left: (arrayPageScroll[0] + (pagesize[0] - 100)/2), top: (arrayPageScroll[1] + ((pagesize[1]-100)/2)) })
		.css({display:"block"});
}

function XMDB_parseQuery ( query )
{
	// return empty object
	if( !query )
		return {};
	var params = {};

	// parse query
	var pairs = query.split(/[;&]/);
	for ( var i = 0; i < pairs.length; i++ )
	{
		var pair = pairs[i].split('=');
		if ( !pair || pair.length != 2 )
			continue;
		// unescape both key and value, replace "+" with spaces in value
		params[unescape(pair[0])] = unescape(pair[1]).replace(/\+/g, ' ');
	}
	return params;
}

function XMDB_getPageScrollTop()
{
	var yScrolltop;
	var xScrollleft;
	if (self.pageYOffset || self.pageXOffset)
	{
		yScrolltop = self.pageYOffset;
		xScrollleft = self.pageXOffset;
	}
	else if (document.documentElement && document.documentElement.scrollTop || document.documentElement.scrollLeft )
	{ // Explorer 6 Strict
		yScrolltop = document.documentElement.scrollTop;
		xScrollleft = document.documentElement.scrollLeft;
	}
	else if (document.body)
	{ // all other Explorers
		yScrolltop = document.body.scrollTop;
		xScrollleft = document.body.scrollLeft;
	}
	arrayPageScroll = new Array(xScrollleft,yScrolltop) 
	return arrayPageScroll;
}

function XMDB_getPageSize()
{
	var de = document.documentElement;
	var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
	var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight
	arrayPageSize = new Array(w,h) 
	return arrayPageSize;
}