/*
 * BE BOX - BOX (FCUKED)
 * Copyright (c) 2008 - BELIEVE.cz (http://www.believe.cz/) 
 *
 */

(function($){

jQuery.believeBox = 
{
	allLinks: null,	// all matched elements (links)
	groupLinks: null,	// filtered links by group (rel attribute)
	thisLink: null,	// original link for currently displayed image
	numbers: null,		// links for numbers
	boxWidth: 970,
	activeGroup: null,
	groupNames: ['bebox'],
	useHistory: false,

	imgPreloader: null,
	o: {
		minWidth: 500
	},

	showImageByHash: function(hash)
	{
		var groupMatch = false;
		var gnlength = $.believeBox.groupNames.length;
		for(var i = 0; i < gnlength; i++)
		{
			if(hash.search($.believeBox.groupNames[i]) !== -1 )
			{
				groupMatch = true;
				break;
			}
		} 
		if(groupMatch) 
		{
			var group = hash.replace(/-.*$/, '');
			var imgIndex = parseInt(hash.replace(/^.*-/, ''));
			if($('#believe-window').size() == 0)
			{
				$.believeBox.showBox();
			}
			var link = $("a[@rel=" + group + "]").get(imgIndex-1);
			$.believeBox.initGroup(link);
			return true;
		}
		else
		{
			$.believeBox.hideBox();
			return false;
		}
	},

	showBox: function()
	{
		if(!document.getElementById("believe-window")) 
		{
			this.showOverlay();
			$("body").append("<div id='believe-window'></div>");
			var html =  "<div id='believe-paging'><div id='prevnext'><a href='#' id='believe-prev' rel=''>" + ["predchádzajúca"] + "</a><a href='#' id='believe-next' rel=''>" + ["ďalšie"] + "</a></div><div id='believe-list'></div></div><div id='believe-close'><a href='#' id='believe-close-btn' title='Zatvoriť'>" + ["Zatvoriť"] + "</a></div><a href='' id='believe-image' title='" + ["Zatvoriť"] + "'></a><div id='believe-content'></div><div class='break'></div><h5 id='believe-title'></h5><p id='believe-desc'></p>";		
			$("#believe-window").append(html);
			$("#believe-close-btn").bind('click', this.closeBox);
			this.positionBox();
		}			
	},

	closeBox: function()
	{
		if($.believeBox.useHistory) $.historyLoad('');
		else return $.believeBox.hideBox();
	},

	hideBox: function()
	{
		$('#believe-window, #believe-overlay, #believe-frame').remove();		
		$(document).unbind('keyup');
		this.activeGroup = null;
		return false;
	},

	initGroup: function(elem)
	{
		var that = $.believeBox;
		var group = $(elem).attr('rel');
		if(group)
		{				
			that.groupLinks = that.allLinks.filter("a[@rel=" + group + "]");
			var htmlPages = '';
			that.groupLinks.each(function(i)
			{ 
				htmlPages += " <a href='" + this.href + "'>" + (i + 1) + "</a> ";					 
			});
			$("#believe-list").empty().append(htmlPages); 
			this.numbers = $("#believe-list a");
			$("#believe-prev").unbind('click').bind('click', function(){ $('#believe-list .active').prev().trigger('click'); return false; });
			$("#believe-next").unbind('click').bind('click', function(){ $('#believe-list .active').next().trigger('click'); return false; });
			$("#believe-prev, #believe-next, #believe-list").removeClass('noscreen');
			this.activeGroup = group;
							
			$(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))
				{	
					$("#believe-close-btn").trigger('click');
				} 
				else if((key == 'p') || (keycode == 37))
				{
					$("#believe-prev:visible").trigger('click');
				} 
				else if((key == 'n') || (key == 'd') || (keycode == 39))
				{
					$("#believe-next:visible").trigger('click');
				}
			});
			
			if(this.numbers.size() == 1) $("#believe-prev, #believe-next, #believe-list").addClass('noscreen');
			
			$("#believe-list a").bind('click', that.clickNumber).eq(that.groupLinks.index(elem)).each(function(){
			
				that = $.believeBox;
				
				that.numbers.removeClass('active');
				$(this).addClass('active');
				var index = that.numbers.index(this);
				if(index == 0) $("#believe-prev").addClass("noscreen");
				else $("#believe-prev").removeClass("noscreen");
				if(index == that.numbers.size() - 1) $("#believe-next").addClass("noscreen");
				else $("#believe-next").removeClass("noscreen");
				that.thisLink = that.groupLinks.eq(index);
				that.preloadContent(this.href);
				// that.preloadImage(this.href);
				return false;
			
			});
		}
		else 
		{
			this.groupLinks = $(elem);
			$("#believe-prev, #believe-next, #believe-list").addClass('noscreen');
			this.preloadImage(elem.href);
		}
	},

	clickNumber: function()
	{
		var that = $.believeBox;
		var hash = that.activeGroup + '-' + ($(this).text());		
		if(that.useHistory) $.historyLoad(hash);
		else that.showImageByHash(hash);
		return false;		
	},

	preloadContent: function(href)
	{	
		var regexp = /\.jpg|\.png|\.gif$/;
		if(href.search(regexp) !== -1)
		{
			// Open Image in believeBox:
			$('#believe-title, #believe-desc, #believe-image').removeClass('noscreen');
			$("#believe-content").addClass('noscreen');
			$.believeBox.preloadImage(href);
		}
		else
		{
			// Open HTML using AJAX:
			$("#believe-content").removeClass('noscreen').addClass('loader');
			$('#believe-title, #believe-desc, #believe-image').addClass('noscreen');			
			$.believeBox.preloadHtml(href);
		}
	},
			
	preloadImage: function(href)
	{			
		ioff = $('#believe-image');
		if( ioff.size() == 1)
		{ 
			ioff.height( ioff[0].offsetHeight + "px");
		}
		$("img", ioff).remove();
		$('#believe-content').empty();
		
		this.imgPreloader = document.createElement('img');
		$(this.imgPreloader).bind('load', this.showImage).attr('src', href);
	},

	preloadHtml: function(href)
	{			
		ioff = $('#believe-image');
		$("img", ioff).remove();
		$("#believe-content").load(href, null, function(){ $("#believe-content").removeClass('loader'); }); 
	},
	
	showImage: function(e)
	{
		that = $.believeBox;
			
		this.onload = null;
		
		var imageWidth = this.width;
		var imageHeight = this.height;
		
		var jqimg = $('img', that.thisLink);		
		
		var caption = jqimg.attr('alt') || that.thisLink.attr('title'); 
		var desc = jqimg.attr('title');
		var longdesc = jqimg.attr('longdesc');
		
		var enhdesc = desc ? desc + ', ' : '';
					
		if(longdesc) enhdesc += '<a href="' + longdesc + '">' + longdesc + '</a>'; 
		
		if(caption)	$("#believe-title").removeClass("noscreen").html(caption);
		else $("#believe-title").addClass("noscreen").empty();
		
		if(enhdesc) $("#believe-desc").removeClass("noscreen").html(enhdesc);
		else $("#believe-desc").addClass("noscreen").empty();				
		
		$('#believe-image').removeClass('noscreen');
		
		boxWidth = imageWidth + 2*15+10;
		if(boxWidth < that.o.minWidth) boxWidth = that.o.minWidth;
			
		that.positionBox();
		
		this.alt = caption;
		if(desc) this.title = desc;
		ioff.height("auto").empty().append(this).bind('click', that.hideBox);

		$("#believe-window").css({display:"block"});			
				
	},
	
	positionBox: function() 
	{	
		var that = $.believeBox;
		var arrayPageScroll = that.getPageScrollTop();
		
		$("#believe-window").css({marginLeft: '-' + parseInt(that.boxWidth / 2) + 'px', width: that.boxWidth + 'px', top: (arrayPageScroll[1] + 40)+"px"});			
	},
		
	getPageScrollTop: function()
	{
		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;
	},
	
	showOverlay: function()
	{
		if(!document.getElementById("believe-frame")) 
		{
			$("body").append("<iframe id='believe-frame'></iframe><div id='believe-overlay'></div>");
			$("#believe-overlay").bind('click', this.closeBox);
		  	var documentHeight = $(document).height();
		  	var windowHeight = $(window).height();
		  	var maxHeight = documentHeight > windowHeight ? documentHeight : windowHeight;		  	
			$("#believe-overlay, #believe-frame").css("height", maxHeight);
		}
	}

};


jQuery.fn.believeBox = function(options)
{	
	var o = jQuery.extend({
		minWidth: 540
  	}, options);
  
	$.believeBox.allLinks = this;
	
	return this.each(function() 
	{	
		$(this).bind('click', function(e)
		{			 
			var group = this.rel;			
			var hash = this.rel + '-' + ($("a[rel=" + group + "]").index(this) + 1);
			if($.believeBox.useHistory) $.historyLoad(hash);
			else $.believeBox.showImageByHash(hash);
			return false;	 
		});	
	});
};

})(jQuery)

