/**
* Name: piroBox v.1.2.1
* Date: November 2009
* Autor: Diego Valobra (http://www.pirolab.it),(http://www.diegovalobra.com)
* Version: 1.2.1
* 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,
		scrollImage : null,
		pirobox_next : 'piro_next_out',
		pirobox_prev :  'piro_prev_out',
		radius : 4,
		close_all : '.piro_close,.piro_overlay',
		slideShow : null,
		slideSpeed : null, //slideshow duration in seconds
		my_nav_w : null
		}, opt);		
		function start_pirobox() {
			var corners = 
				'<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 window_height =  $(window).height();
			var win_w = $(window).width();
			var bg_overlay = $(jQuery('<div class="piro_overlay"></div>').hide().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('<p class="caption"></p>'));
			var piro_nav = $(jQuery('<div class="piro_nav"></div>'));
			var piro_close = $(jQuery('<div class="piro_close"></div>'));
			var piro_play = $(jQuery('<a href="#play" class="play">play slideshow</a>'));
			var piro_stop = $(jQuery('<a href="#stop" class="stop">stop slideshow</a>'));
			//var piro_number = $(jQuery('<span class="number"></span>'));
			var piro_prev = $(jQuery('<a href="#prev" class="'+opt.pirobox_prev+'"></a>'));
			var piro_next = $(jQuery('<a href="#next" class="'+opt.pirobox_next+'"></a>'));				
			$('#minHeight').append(bg_overlay).append(main_cont);
			main_cont.append(corners);
			$('.pirobox_up').append(piro_close);
			$('.pirobox_down').append(piro_nav);
			$('.pirobox_up').append(piro_play);
			//$('.c_c').append(piro_number);
			$('.c_c').append(caption);
			piro_play.hide();
			//piro_number.hide();
			piro_nav.append(piro_prev).append(piro_next);
			//if(piro_prev.is('.piro_prev_out') || piro_next.is('.piro_next_out')){
				//$(piro_overlay).append(piro_prev).append(piro_next);
				//piro_prev.add(piro_next).hide()
			//}else{
				//piro_nav.append(piro_prev).append(piro_next);
			//}
			//var my_nav_w = piro_prev.width();
			main_cont.hide();
			var my_gall_classes = $("a[class^='pirobox_gall']");
			var map = new Object();
				for (var i=0; i<my_gall_classes.length; i++) {
					var it=$(my_gall_classes[i])
					map['a.'+it.attr('class')]=0;
				}
			var gall_settings = new Array();
				for (var key in map) {
					gall_settings.push(key);
					if($(key).length === 1){//check on set of images
					alert('For single image is recommended to use class pirobox');
					$(key).css('border','2px dotted red');
					}
				}
				for (var i=0; i<gall_settings.length; i++) {
					$(gall_settings[i]).each(function(rel){this.rel = rel+1 + "&nbsp;of&nbsp;" + $(gall_settings[i]).length;});
					var add_first = $(gall_settings[i]+':first').addClass('first');
					var add_last = $(gall_settings[i]+':last').addClass('last');
				}						
			$(my_gall_classes).each(function(rev){this.rev = rev+0});
			var piro_gallery = $(my_gall_classes);
			var piro_single = $('a.pirobox');
			$.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');
						});
					}
				});
			};
			$(window).resize(function(){
				var new_w_bg = $(window).height();
				bg_overlay.css({'visibility':'visible','height':+ new_w_bg +'px'});				  
			});	
			piro_prev.add(piro_next).bind('click',function(c) {
				c.preventDefault();
				var image_count = parseInt($(piro_gallery).filter('.item').attr('rev'));
				var start = $(this).is('.piro_prev_out,.piro_prev') ? $(piro_gallery).eq(image_count - 1) : $(piro_gallery).eq(image_count + 1);
				start.click();
				//piro_close.add(caption).add(piro_next).add(piro_prev).css('visibility','hidden');
				piro_close.add(caption).css('visibility','hidden');
			});
			piro_single.each(function(d) {
				var item = $(this);
				item.bind('click',function(d) {
					d.preventDefault();
					piro_open(item.attr('href'));
					var carTgt = $.trim(item.attr('class').replace('pirobox_gall_','#').replace(/first/,'').replace(/last/,'').replace(/item/,''));
					var carPos = ($(window).width()-$(carTgt).width())/2;
					if(piro_prev.is('.piro_prev_out') || piro_next.is('.piro_next_out')){
						$(carTgt).append(piro_prev).append(piro_next);
						piro_prev.add(piro_next).hide()
					}
          $(carTgt).css({left:carPos});
          $(carTgt).css({left:carPos,visibility:'visible',opacity:0}).animate({opacity:100},'slow');
					var this_url = item.attr('href');
						var descr = item.attr('title');
						if( descr == ""){
						caption.html('');
						}else{
						caption.html(descr);
						}
					$('.c_c').addClass('unique');
					piro_next.add(piro_prev).add(piro_close).add(caption).hide();
					$('.play').remove();
				});
			});
			$(piro_gallery).each(function(array) {
					var item = $(this);
					item.bind('click',function(c) {
						c.preventDefault();
						piro_open(item.attr('href'));
						var carTgt = $.trim(item.attr('class').replace('pirobox_gall_','#').replace(/first/,'').replace(/last/,'').replace(/item/,''));
						var carPos = ($(window).width()-$(carTgt).width())/2;
						if(piro_prev.is('.piro_prev_out') || piro_next.is('.piro_next_out')){
							$(carTgt).append(piro_prev).append(piro_next);
							piro_prev.add(piro_next).hide()
						}
            $(carTgt).css({left:carPos,visibility:'visible',opacity:0}).animate({opacity:100},'slow');
						var this_url = item.attr('href');
						var descr = item.attr('title');	
						//var number = item.attr('rel');
						if( descr == ""){
						caption.html('');
						//$('.c_c .number').html(number);
						}else{
						caption.html(descr);
						//$('.c_c .number').html(number);
						}
						if(item.is('.last')){
							//$('.number').css('text-decoration','underline');
						}else{
							//$('.number').css('text-decoration','none');
							}				
						if(item.is('.first')){
							piro_prev.hide();
							piro_next.show();		
						}else{
							piro_next.add(piro_prev).show();		  
						}
						if(item.is('.last')){
							piro_prev.show();
							piro_next.hide();			  
						}
						if(item.is('.last') && item.is('.first') ){
							piro_prev.add(piro_next).hide();
							//$('.number').hide();
							piro_play.remove();
						}					
							$(piro_gallery).filter('.item').removeClass('item');
							item.addClass('item');
							$('.c_c').removeClass('unique');		
					});
				});
				var piro_open = function(my_url) {
					piro_play.add(piro_stop).hide();
					//piro_number.hide();
					//piro_close.add(caption).add(piro_next).add(piro_prev).css('visibility','hidden');
					piro_close.add(caption).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 {
						$('#minHeight').css({'z-index':5000,height:$(window).height(),top:$(window).scrollTop()});
						$('.c_c div').children().remove();
						main_cont.show();
						bg_overlay.fadeIn(300,function(){
							load_img(my_url);
						});
					}
				}
				var load_img = function(my_url) {
				if(main_cont.is('.loading')) {return;}
				main_cont.addClass('loading');
				//var main_cont_top = $(window).scrollTop() + 162;
				var img = new Image();
				img.onerror = function (){
					var main_cont_h = $(main_cont).height();
					//main_cont.css({top : main_cont_top});
				  $('.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').bind('click',function() {
						$('.err_mess').remove();
						main_cont.add(bg_overlay).fadeOut(opt.close_speed);
						main_cont.removeClass('loading');
						$('.pirobox_up').append(piro_play);
						//$('.c_c').append(piro_number);
						return false;
					});
				}
				img.onload = function() {
					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 + 250)/w_W;
						var _y = (imgH + 250)/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+94) + 'px' ,
						width : (new_img_W+76) + 'px' , 
						marginLeft : '-' +((new_img_W)/2+38) +'px'
						//,top : main_cont_top
						},opt.my_speed, function(){	
						$('.piro_nav,.caption').css({width:(new_img_W)+'px'});
						$('.piro_nav').css('margin-left','-'+(new_img_W+5)/2+'px');
							var caption_height = caption.height();
							caption.css({'bottom':'-'+(caption_height+12)+'px'});
							$('.c_c div').append(img);
							piro_close.css('display','block');
							//piro_next.add(piro_prev).add(piro_close).css('visibility','visible');
							piro_close.css('visibility','visible');
							caption.css({'visibility':'visible','display':'block'});
								$(img).show().fadeIn(300);
									main_cont.removeClass('loading');
									if(opt.slideShow == 'slideshow'){
									   piro_play.add(piro_stop).show();
									}else{
										 piro_play.add(piro_stop).hide();
									}
									//piro_number.show();
							});
				}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+94) + 'px' ,
						width : (imgW+76) + 'px' , 
						marginLeft : '-' +((imgW)/2+38) +'px'
						//,top : main_cont_top
						},opt.my_speed, function(){
						$('.piro_nav,.caption').css({width:(imgW)+'px'});
						$('.piro_nav').css('margin-left','-'+(imgW+5)/2+'px');
							var caption_height = caption.height();
							caption.css({'bottom':'-'+(caption_height+12)+'px'});
							$('.c_c div').append(img);					
							piro_close.css('display','block');
							//piro_next.add(piro_prev).add(piro_close).css('visibility','visible');
							piro_close.css('visibility','visible');
							caption.css({'visibility':'visible','display':'block'});
								$(img).fadeIn(300);
									main_cont.removeClass('loading');
									if(opt.slideShow == 'slideshow'){
									   piro_play.add(piro_stop).show();
									}else{
										 piro_play.add(piro_stop).hide();
									}
									//piro_number.show();
							});			
						}
			  		}
					img.src = my_url;
					var carTgt = $($.trim($('.item').attr('class').replace('pirobox_gall_','#').replace(/first/,'').replace(/last/,'').replace(/item/,'')));
					//var jScrollOff = carTgt.offset();
					//var jScrollTrack = carTgt.find('.jScrollPaneTrack');
					//var jScrollTop = jScrollOff.top + ((jScrollTrack.height()+$(piro_prev).height())/2);
					//$(piro_next).css({ top : jScrollTop,left : jScrollOff.left + carTgt.width() });
					//$(piro_prev).css({ top : jScrollTop,left : jScrollOff.left-40 });
					piro_stop.bind('click',function(x){
						x.preventDefault();
						clearTimeout(timer);
						$(piro_gallery).children().removeAttr('class');
						$('.stop').remove();
						$('.pirobox_up').append(piro_play);
						//piro_next.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left + carTgt.width() });
						//piro_prev.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left-40 });
						piro_next.add(piro_prev).css({ width : opt.my_nav_w});
					});
					piro_play.bind('click',function(w){
						w.preventDefault();
						clearTimeout(timer);
						if($(img).is(':visible')){
						$(piro_gallery).children().addClass(opt.slideShow);
						$('.play').remove();
						$('.pirobox_up').append(piro_stop);
						}
						piro_next.add(piro_prev).css({'width':'0px'});
						return slideshow();
					});
				  $(opt.close_all).bind('click',function(c) {
					clearTimeout(timer);
					if($(img).is(':visible')){
						c.preventDefault();
						//piro_close.add(bg_overlay).add(main_cont).add(caption).add(piro_next).add(piro_prev).fadeOut(opt.close_speed);
						piro_close.add(bg_overlay).add(main_cont).add(caption).fadeOut(opt.close_speed);
						$(caption).empty();
						$('#minHeight').css('z-index',-1);
						carTgt.css({visibility:'hidden'});
						main_cont.removeClass('loading');
						$(piro_gallery).children().removeAttr('class');
						//piro_next.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left + carTgt.width() }).hide();
						//piro_prev.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left-40 }).hide();
						piro_next.add(piro_prev).css({ width : opt.my_nav_w});
						$('.stop').remove();
						$('.pirobox_up').append(piro_play);
						piro_play.hide();
					  }
				  });	
					function slideshow(){
					clearTimeout(timer);
					if( $('.item.last').size() != 0 && $(piro_gallery).children().is('.' + opt.slideShow )){
						var setSize = $('.item').parent().siblings().size()+1;
						var setLast = $('.item.last').attr('rev');
						var newRev = setLast - setSize;
						$('.item.last').attr('rev',newRev);
						piro_next.click();
					}else if($(piro_gallery).children().is('.' + opt.slideShow )){
						piro_next.click();
						}
					}
					var timer = setInterval(slideshow,opt.slideSpeed*1000 );
					$().bind("keydown", function (c) {
					if (c.keyCode === 27) {
						c.preventDefault();
						if($(img).is(':visible') || $('.c_c>div>p>a').is('.close_pirobox')){
					  //piro_close.add(bg_overlay).add(main_cont).add(caption).add(piro_next).add(piro_prev).fadeOut(opt.close_speed);
						piro_close.add(bg_overlay).add(main_cont).add(caption).fadeOut(opt.close_speed);
						$('#minHeight').css('z-index',-1);
						carTgt.css({visibility:'hidden'});
					  main_cont.removeClass('loading');
						clearTimeout(timer);
					  	$(piro_gallery).children().removeAttr('class');
						$('.stop').remove();
						$('.pirobox_up').append(piro_play);
						//piro_next.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left + carTgt.width() });
						//piro_prev.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left-40 });
						piro_next.add(piro_prev).css({ width : opt.my_nav_w});
					  $(piro_gallery).add(piro_single).children().fadeTo(100,1);
							}
						}
					}).bind("keydown", function(e) {
						if ($('.c_c').is('.unique') || $('.item').is('.first')){
						}else if($('.c_c').is('.c_c')&&(e.keyCode === 37)) {
							e.preventDefault();
							if($(img).is(':visible')){
							clearTimeout(timer);
							$(piro_gallery).children().removeAttr('class');
							$('.stop').remove();
							$('.pirobox_up').append(piro_play);
							//piro_next.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left + carTgt.width() });
							//piro_prev.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left-40 });
							piro_next.add(piro_prev).css({ width : opt.my_nav_w});
							piro_prev.click();
							} 
						}
						if ($('.c_c').is('.unique') || $('.item').is('.last')){
						}else if($('.c_c').is('.c_c')&&(e.keyCode === 39)) {
							e.preventDefault();
							if($(img).is(':visible')){
							clearTimeout(timer);
							$(piro_gallery).children().removeAttr('class');
							$('.stop').remove();
							$('.pirobox_up').append(piro_play);
							//piro_next.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left + carTgt.width() });
							//piro_prev.css({ width : my_nav_w, top : jScrollTop,left : jScrollOff.left-40 });
							piro_next.add(piro_prev).css({ width : opt.my_nav_w});
							piro_next.click();
							} 
						}
					});
					$.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,.c_c,.piro_close,a.play,a.stop').fixPNG();
						var ie_w_h =  $(document).height();
						bg_overlay.css('height',ie_w_h+ 'px'); 
					}
					if( $.browser.msie) {
					opt.close_speed = 0;
					}
					function scrollImage (){
						if($(main_cont).is(':visible')){
							window.onscroll = function (){
								var main_cont_h = $(main_cont).height();
								//main_cont.css({ top : main_cont_top });
								var Nwin_h = $(window).height();
								var Nnav_h = $('.piro_prev_out').height();
								//$('.piro_prev_out').add('.piro_next_out').css({marginTop : parseInt($(document).scrollTop())+(Nwin_h/Nnav_h-125)});				
								}
							}
						}
					if(opt.scrollImage == true){
						return scrollImage();
					}
					$(window).resize(function(){
						$('#minHeight').css({height:$(window).height(),top:$(window).scrollTop()});
						var carTgt = $($.trim($('.item').attr('class').replace('pirobox_gall_','#').replace(/first/,'').replace(/last/,'').replace(/item/,'')));
						var carPos = ($(window).width()-carTgt.width())/2;
						carTgt.css({left:carPos});
					});

				}
			}

		start_pirobox();
	}
})(jQuery);
