/*
 * PDBox - javascript popup box for displaying images. Supports paging and multiple image groups.
 *  
 * Copyright (c) 2007 PeckaDesign (www.peckadesign.cz)
 *  
 * Parts of code based on Thickbox 2.0 by Cody Lindley (http://www.codylindley.com). Copyright (c) 2006 cody lindley 
 * Licensed under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *   
 */

jQuery.fn.pdBox = function(options)
{	
	var o = jQuery.extend({
		minWidth: 540
  	}, options);
  
	var allLinks = this;	// all matched elements (links) type: jQuery
	var groupLinks = null;	// filtered links by group (rel attribute) type: jQuery
	var thisLink = null;	// original link for currently displayed image type: jQuery
	var numbers = null;		// links for numbers type: jQuery
	var boxWidth = 540;
	var langcode = 'cs';
	var langs = {
		cs: { close: "Zavřít", prev: "předchozí", next: "další" },
		en: { close: "Close", prev: "previous", next: "next" },
		de: { close: "Zumachen", prev: "vorige", next: "folgend" },
		es: { close: "Vaer", prev: "previo", next: "siguiente" },
		fr: { close: "Fermer", prev: "précédant", next: "suivant" },
		it: { close: "Chiudere", prev: "previo", next: " veniente" },
		ru: { close: "закрыть", prev: "предшествующий", next: "последующий" }
	};
	var imgPreloader = null;
	
	return this.each(function() 
	{
		jQuery(this).bind('click', function(){			
			if(navigator.appName != 'Konqueror') showOverlay();			
			showBox();
			initGroup(this);			
			return false;
		});
		

		function showBox()
		{
			if(!document.getElementById("TB_window")) 
			{
				jQuery("body").append("<div id='TB_window'></div>");
				var html =  "<div id='TB_secondLine'><div id='prevnext'><a href='#' id='TB_prev' rel=''>" + langs[langcode]["prev"] + "</a><a href='#' id='TB_next' rel=''>" + langs[langcode]["next"] + "</a></div><div id='TB_pages'></div></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton' title='" + langs[langcode]["close"] + "'>" + langs[langcode]["close"] + "</a></div><div class='break'></div><h2 id='TB_caption'></h2> <p id='TB_desc'></p> <a href='' id='TB_ImageOff' title='" + langs[langcode]["close"] + "'></a>";		
				jQuery("#TB_window").append(html);
				jQuery("#TB_closeWindowButton").bind('click', hideBox);
				positionBox();
			}			
		};
		
		function hideBox()
		{
			hideOverlay();
			jQuery(document).unbind('keyup');
			return false;
		};
		
		function initGroup(elem)
		{
			var group = jQuery(elem).attr('rel');
			if(group)
			{				
				groupLinks = allLinks.filter("a[@rel=" + group + "]");
				var htmlPages = '';
				groupLinks.each(function(i)
				{ 
					htmlPages += " <a href='" + this.href + "'>" + (i + 1) + "</a> ";					 
				});
				jQuery("#TB_pages").append(htmlPages); 
				numbers = jQuery("#TB_pages a");
				jQuery("#TB_prev").bind('click', function(){ jQuery('#TB_pages .active').prev().trigger('click'); return false; });
				jQuery("#TB_next").bind('click', function(){ jQuery('#TB_pages .active').next().trigger('click'); return false; });
				
				
				jQuery(document).bind('keyup', function(e)
				{ 
					var keycode;
					if (!e) var e = window.event;
					if (e.keyCode) keycode = e.keyCode;
					else if (e.which) keycode = e.which;
	
					var key = String.fromCharCode(keycode).toLowerCase();

					if((key == 'x') || (key == 'c') || (keycode == 27))
					{	
						jQuery("#TB_closeWindowButton").trigger('click');
					} 
					else if((key == 'p') || (keycode == 37))
					{
						jQuery("#TB_prev:visible").trigger('click');
					} 
					else if((key == 'n') || (key == 'd') || (keycode == 39))
					{
						jQuery("#TB_next:visible").trigger('click');
					}
				});				
				
				if(numbers.size() == 1) jQuery("#TB_prev, #TB_next, #TB_pages").addClass('hidden');
				
				jQuery("#TB_pages a").bind('click', clickNumber).eq(groupLinks.index(elem)).trigger('click');
			}
			else 
			{
				groupLinks = jQuery(elem);
				jQuery("#TB_prev, #TB_next, #TB_pages").addClass('hidden');
				preloadImage(elem.href);
			}
		};

		function clickNumber()
		{
			numbers.removeClass('active');
			jQuery(this).addClass('active');
			var index = numbers.index(this);
			if(index == 0) jQuery("#TB_prev").addClass("hidden");
			else jQuery("#TB_prev").removeClass("hidden");
			if(index == numbers.size() - 1) jQuery("#TB_next").addClass("hidden");
			else jQuery("#TB_next").removeClass("hidden");
			thisLink = groupLinks.eq(index);
			preloadImage(this.href);
			return false;
		};
				
		function preloadImage(href)
		{
			// jQuery(document).unkeyup();			
			ioff = jQuery('#TB_ImageOff');
			if( ioff.size() == 1)
			{ 
				ioff.height( ioff[0].offsetHeight + "px");
			}
			jQuery("img", ioff).remove();
			
			// var imgPreloader = new Image();
			imgPreloader = document.createElement('img');
			jQuery(imgPreloader).bind('load', showImage);
			jQuery(imgPreloader).attr('src', href);
		};
		
		function showImage(e)
		{			
			/*var img = e.currentTarget;
			alert(img);*/
			
			this.onload = null;
			
			var pagesize = getPageSize();
			var x = pagesize[0] - 150;
			var y = pagesize[1] - 150;
			var imageWidth = this.width;
			var imageHeight = this.height;
			
			var jqimg = jQuery('img', thisLink);
						
			var caption = jqimg.attr('alt'); 
			var desc = jqimg.attr('title');
			var longdesc = jqimg.attr('longdesc');
			
			var enhdesc = desc ? desc + ', ' : '';
						
			if(longdesc) enhdesc += '<a href="' + longdesc + '">' + longdesc + '</a>'; 
			
			if(caption)	jQuery("#TB_caption").removeClass("hidden").html(caption);
			else jQuery("#TB_caption").addClass("hidden").empty();
			
			if(enhdesc) jQuery("#TB_desc").removeClass("hidden").html(enhdesc);
			else jQuery("#TB_desc").addClass("hidden").empty();				
	
			/*
			var tbw = jQuery("#TB_window");
			var ioff = jQuery('#TB_ImageOff');			
			
			if(tbw) var tbwWidth =  tbw[0].offsetWidth;
			else var tbwWidth =  0;
			
			if(ioff) var ioffWidth =  ioff[0].offsetWidth;
			else var ioffWidth =  tbwWidth;
			//*/
			// boxWidth = (tbwWidth - ioffWidth) + imageWidth + 2*15+10;
			
			boxWidth = imageWidth + 2*15+10;
			if(boxWidth < o.minWidth) boxWidth = o.minWidth;
				
			positionBox();
			
			this.alt = caption;
			if(desc) this.title = desc;
			ioff.height("auto").empty().append(this).bind('click', hideBox);

			jQuery("#TB_window").css({display:"block"});			
					
		};
		
		function positionBox() 
		{	
			var arrayPageScroll = getPageScrollTop();
			var pagesize = getPageSize();
			
			jQuery("#TB_window").css({marginLeft: '-' + parseInt(boxWidth / 2) + 'px', width: boxWidth + 'px', top: (arrayPageScroll[1] + 40)+"px"});			
		};
		
		function 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;
		};

	
		function getPageScrollTop()
		{
			var yScrolltop;
			if (self.pageYOffset) 
			{
				yScrolltop = self.pageYOffset;
			} 
			else if (document.documentElement && document.documentElement.scrollTop)
			{	// Explorer 6 Strict
				yScrolltop = document.documentElement.scrollTop;
			} 
			else if (document.body) 
			{	// all other Explorers
				yScrolltop = document.body.scrollTop;
			}
			arrayPageScroll = new Array('',yScrolltop); 
			return arrayPageScroll;
		};
		
		function showOverlay()
		{
			if(!document.getElementById("TB_HideSelect")) 
			{
				jQuery("body").append("<iframe id='TB_HideSelect'></iframe><div id='TB_overlay'></div>");
				jQuery("#TB_overlay").bind('click', hideBox);
				sizeOverlay();
			}
		};
		
		function sizeOverlay()
		{
			if (window.innerHeight && window.scrollMaxY) 
			{	
				var yScroll = window.innerHeight + window.scrollMaxY;
			}
			else if (document.body.scrollHeight > document.body.offsetHeight)
			{	// all but Explorer Mac
				var yScroll = document.body.scrollHeight;
			} 
			else 
			{	// Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
				var yScroll = document.body.offsetHeight;
		  	}
			jQuery("#TB_overlay").css("height", yScroll + 10 + "px");
			jQuery("#TB_HideSelect").css("height", yScroll +"px");
		};

		function hideOverlay()
		{
			jQuery('#TB_window, #TB_overlay, #TB_HideSelect').remove();
		};
	});
};
