/**
* Name: piroBox v.1.2 BETA
* Date: October 2009
* Autor: Diego Valobra (http://www.pirolab.it),(http://www.diegovalobra.com)
* Version: 1.2 BETA
* Licence: CC-BY-SA http://creativecommons.org/licenses/by-sa/2.5/it/
**/

(function($) {



	$.fn.piroBox = function(opt) {
		opt = jQuery.extend({
		my_speed : null,
		close_speed : 300,
		bg_alpha : 0.5,
		this_next : 'next_out',
		this_prev :  'prev_out',
		radius : 4,
		credit : $(jQuery('<div class="credits"><a href="/pirobox/" title="view plugin" target="_blank">Pirobox V.1.2</a></div>'))
		}, opt);
		$.fn.fixPNG = function() {
			return this.each(function () {
				var image = $(this).css('backgroundImage');
				if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
					image = RegExp.$1;
					$(this).css({
						'backgroundImage': 'none',
						'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=" + ($(this).css('backgroundRepeat') == 'no-repeat' ? 'crop' : 'scale') + ", src='" + image + "')"
					}).each(function () {
						var position = $(this).css('position');
						if (position != 'absolute' && position != 'relative')
							$(this).css('position', 'relative');
					});
				}
			});
		};		
		function start_pirobox() {
			var corners = $(jQuery(
			'<tr>'+					   
			'<td colspan="3" class="pirobox_up"></td>'+
			'</tr>'+	
			'<tr>'+	
			'<td class="t_l"></td>'+
			'<td class="t_c"></td>'+
			'<td class="t_r"></td>'+
			'</tr>'+
			'<tr>'+
			'<td class="c_l"></td>'+
			'<td class="c_c"><span><span></span></span><div></div></td>'+
			'<td class="c_r"></td>'+
			'</tr>'+
			'<tr>'+
			'<td class="b_l"></td>'+
			'<td class="b_c"></td>'+
			'<td class="b_r"></td>'+
			'</tr>'+
			'<tr>'+
			'<td colspan="3" class="pirobox_down"></td>'+
			'</tr>'));
			var gallery = $('a.pirobox_gall');
			var single = $('a.pirobox');
			var window_height =  $(window).height();
			var bg_overlay = $(jQuery('<div class="bg_thumbs" style="display: none"></div>').css({'opacity':+opt.bg_alpha,'height':window_height+'px'}));
			var main_cont = $(jQuery('<table class="pirobox_content" cellpadding="0" cellspacing="0"></table>'));
			var caption = $(jQuery('<div class="caption" style="display: none"></div>').css({'opacity':'0.8','-moz-border-radius':opt.radius+'px','-khtml-border-radius':opt.radius+'px','-webkit-border-radius':opt.radius+'px','border-radius':opt.radius+'px'}));
			var piro_nav = $(jQuery('<div class="piro_nav"></div>'));
			var close = $(jQuery('<div class="thumbs_close"></div>'));
			var prev = $(jQuery('<a href="#prev" title="puede desplazarse por la galerķa usando las flechas del teclado" class="'+opt.this_prev+'"></a>'));
			var next = $(jQuery('<a href="#next" title="puede desplazarse por la galerķa usando las flechas del teclado" class="'+opt.this_next+'"></a>'));
			var img_active = gallery.length;
			gallery.each(function(i){
				this.rel = i+1 + "&nbsp;de&nbsp;" + img_active;
			});
			$(window).resize(function(){
				var new_w_bg = $(window).height();
				bg_overlay.css({'visibility':'visible','height':+ new_w_bg +'px'});				  
			});				

			$('a.pirobox_gall:first').attr('id','first');
			$('a.pirobox_gall:last').attr('id','last');
			$('body').append(bg_overlay).append(main_cont);
			main_cont.append(corners);
			$('.pirobox_up').append(close).append(opt.credit);
			$('.pirobox_down').append(piro_nav);
			piro_nav.append(prev).append(next).append(caption);
			if(prev.is('.prev_out') || next.is('.next_out')){
				$('body').append(prev).append(next);
				prev.add(next).hide()
			}else{
				piro_nav.append(prev).append(next);
			}
			main_cont.hide();
			prev.add(next).click(function(c) {
				c.preventDefault();
				var image_count = parseInt(gallery.filter('.item').attr('rev'),10);
				var start = $(this).is('.prev_out,.prev') ? gallery.eq(image_count - 1) : gallery.eq(image_count + 1);
				if(!start.size()) {
					start = $(this).is('.prev_out,.prev') ? gallery.eq(gallery.size() - 1) : gallery.eq(0);
				}
				if(start.size()) {
					start.click();
					close.add(caption).add(next).add(prev).add('.credits').css('visibility','hidden');
				}
			});
			single.each(function(d) {
				var item = $(this);
				item.click(function(d) {
					d.preventDefault();
					open(item.attr('href'));
					item.children().fadeTo(100,0.1);
					var this_url = item.attr('href');
						var descr = item.attr('title');		
						if( descr == ""){
					caption.html('<p>'+ '&nbsp;'+'<a href='+ this_url +' class="link_to" target="_blank" title="Ver imagen en una nueva ventana"></a></p>');
									 }else{
					caption.html('<p>'+ descr+'<a href='+ this_url +' class="link_to" target="_blank" title="Ver imagen en una nueva ventana"></a></p>');
									 }
					$('.c_c').addClass('unique');
					next.add(prev).add(close).add(caption).css('display','none');
				});
			});
			gallery.each(function(array) {
					var item = $(this);
					item.click(function(c) {
						c.preventDefault();
						open(item.attr('href'));
						var this_url = item.attr('href');
						var descr = item.attr('title');	
						var number = item.attr('rel');
						if( descr == ""){
						caption.html('<p>'+'&nbsp;' +'<em class="number">' + number + '</em><a href='+ this_url +' class="link_to" target="_blank" title="Ver imagen en una nueva ventana"></a></p>');
						}else{
						caption.html('<p>'+ descr+'<em class="number">' + number + '</em><a href='+ this_url +' class="link_to" target="_blank" title="Ver imagen en una nueva ventana"></a></p>');
						}
						
						if(item.is('#last')){
							$('.number').css('text-decoration','underline');	  
						}else{
							$('.number').css('text-decoration','none');
							}				
						if(item.is('#first')){
							prev.hide();
							next.show();		
						}else{
							next.add(prev).show();		  
						}
						if(item.is('#last')){
							prev.show();
							next.hide();			  
						}else{
						}
						if(array == array ){
							gallery.filter('.item').removeClass('item').children().fadeTo(100,1);
							item.addClass('item').children().fadeTo(100,0.1);
							$('.c_c').removeClass('unique');		
						}else if(array == 0){
							next.add(prev).hide();
						}
					});
				item.attr({'rev': array});
			});
			var open = function(my_url) {
				close.add(caption).add(next).add(prev).add('.credits').css('visibility','hidden');
				if(main_cont.is(':visible')) {
					$('.c_c div').children().fadeOut(300, function() {
						$('.c_c div').children().remove();
						load_img(my_url);
					});
				} else {
					$('.c_c div').children().remove();
					main_cont.show();
					bg_overlay.fadeIn(300,function(){

						load_img(my_url);
					});
				}
			}
			$.browser.msie6 =($.browser.msie && /MSIE 6\.0/i.test(window.navigator.userAgent));
			if( $.browser.msie6 && !/MSIE 8\.0/i.test(window.navigator.userAgent)) {
				$('.t_l,.t_c,.t_r,.c_l,.c_r,.b_l,.b_c,.b_r,a.next, a.prev,a.prev_out,a.next_out,.c_c,.thumbs_close').fixPNG();
				var ie_w_h =  $(document).height();
			  	bg_overlay.css('height',ie_w_h+ 'px'); 
			}
			if( $.browser.msie) {
			opt.close_speed = 0;
			}
				var load_img = function(my_url) {
				if(main_cont.is('.loading')) {return;}
				main_cont.addClass('loading');
				var img = new Image();
				img.onerror = function (evt){
					var main_cont_h = $(main_cont).height();
					main_cont.css({marginTop : parseInt($(document).scrollTop())-(main_cont_h/1.9)});
				  $('.c_c div').append('<p class="err_mess">There seems to be an Error:&nbsp;<a href="#close" class="close_pirobox">Close Pirobox</a></p>');
					$('.close_pirobox').click(function() {
					  main_cont.add(bg_overlay).fadeOut(opt.close_speed);
					  gallery.add(single).children().fadeTo(100,1);
					  main_cont.removeClass('loading');
						return false;
					});
				}
				img.onload = function(evt) {
					var imgH = img.height;
					var imgW = img.width;
					var main_cont_h = $(main_cont).height();
					var w_H = $(window).height();
					var w_W = $(window).width();
					if(imgH+100 > w_H || imgW+100 > w_W){
						var new_img_W = imgW;
						var new_img_H = imgH;
						var _x = (imgW + 100)/w_W;
						var _y = (imgH + 100)/w_H;
						if ( _y > _x ){
							new_img_W = Math.round(imgW * (1/_y));
							new_img_H = Math.round(imgH * (1/_y));
						} else {
							new_img_W = Math.round(imgW * (1/_x));
							new_img_H = Math.round(imgH * (1/_x));
						}
						imgH += new_img_H;
						imgW += new_img_W;
						$(img).height(new_img_H).width(new_img_W).hide();
						$('.c_c div').animate({height:new_img_H+'px',width:new_img_W+'px'},opt.my_speed);				
						main_cont.animate({
						height : (new_img_H+20) + 'px' ,
						width : (new_img_W+20) + 'px' , 
						marginLeft : '-' +((new_img_W)/2+10) +'px',
						marginTop : parseInt($(document).scrollTop())-(new_img_H/1.9)-10},opt.my_speed, function(){	
						$('.piro_nav,.caption').css({width:(new_img_W/1.3)+'px'});
						$('.piro_nav').css('margin-left','-'+(new_img_W/1.3)/2+'px');
							var caption_height = caption.height();
							caption.css({'bottom':'-'+(caption_height+10)+'px'});
							$('.c_c div').append(img);
							close.css('display','block');
							next.add(prev).add(close).add('.credits').css('visibility','visible');
							caption.css({'visibility':'visible','display':'block'});
								$(img).show().fadeIn(300);
									 main_cont.removeClass('loading');
									
							});
				}else{
					$(img).height(imgH).width(imgW).hide();				
						$('.c_c div').animate({height:imgH+'px',width:imgW+'px'},opt.my_speed);
						main_cont.animate({
						height : (imgH+20) + 'px' ,
						width : (imgW+20) + 'px' , 
						marginLeft : '-' +((imgW)/2+10) +'px',
						marginTop : parseInt($(document).scrollTop())-(imgH/1.9)-10},opt.my_speed, function(){
						$('.piro_nav,.caption').css({width:(imgW/1.3)+'px'});
						$('.piro_nav').css('margin-left','-'+(imgW/1.3)/2+'px');
							var caption_height = caption.height();
							caption.css({'bottom':'-'+(caption_height+10)+'px'});
							$('.c_c div').append(img);
							close.css('display','block');
							next.add(prev).add(close).add('.credits').css('visibility','visible');
							caption.css({'visibility':'visible','display':'block'});
								$(img).fadeIn(300);
									main_cont.removeClass('loading');
									
							});			
					}
			  }	
				var win_h = $(window).height();
				var nav_h = $(prev).height();
				$('.prev_out').add('.next_out').css({marginTop : parseInt($(document).scrollTop())+(win_h/nav_h-125)});	
			  	$('.caption p').css({'-moz-border-radius':opt.radius+'px','-khtml-border-radius':opt.radius+'px','-webkit-border-radius':opt.radius+'px','border-radius':opt.radius+'px'});
				img.src = my_url;
				if($(main_cont).is(':visible')){
					window.onscroll = function (){
						var main_cont_h = $(main_cont).height();
						main_cont.css({
						marginTop : parseInt($(this).scrollTop())-(main_cont_h/1.9)
						});
						var Nwin_h = $(window).height();
						var Nnav_h = $(prev).height();
						$('.prev_out').add('.next_out').css({marginTop : parseInt($(document).scrollTop())+(Nwin_h/Nnav_h-125)});				
					}
				}
				bg_overlay.add(close).click(function(c) {
				  if($(img).is(':visible')){
					  c.preventDefault();
					  close.add(bg_overlay).add(main_cont).add(caption).add(next).add(prev).fadeOut(opt.close_speed);
					  main_cont.removeClass('loading');
					  gallery.add(single).children().fadeTo(100,1);
					}
				});	
					$().bind("keydown.thumbs_close", function (c) {
					if (c.keyCode === 27 || c.keyCode === 8) {
						c.preventDefault();
						if($(img).is(':visible') || $('.c_c>div>p>a').is('.close_pirobox')){
					  close.add(bg_overlay).add(main_cont).add(caption).add(next).add(prev).fadeOut(opt.close_speed);
					  main_cont.removeClass('loading');
					  gallery.add(single).children().fadeTo(100,1);
							}
						}
					}).bind("keydown.next", function(e) {
						if ($('.c_c').is('.unique') || $('.item').is('#first')){
						//alert('first');
						}else if($('.c_c').is('.c_c')&&(e.keyCode === 37)) {
							e.preventDefault();
							if($(img).is(':visible')){
							prev.click();
							} 
						}
						if ($('.c_c').is('.unique') || $('.item').is('#last')){
						//alert('last');
						}else if($('.c_c').is('.c_c')&&(e.keyCode === 39)) {
							e.preventDefault();
							if($(img).is(':visible')){
							next.click();
							} 
						}						

				});
			}
		}
		start_pirobox();
	}
})(jQuery);
