/*---------------------------------------------------------------------------------------------

@author       Constantin Saguin - @brutaldesign
@link            http://csag.co
@github        http://github.com/brutaldesign/swipebox
@version     1.2.1
@license      MIT License

----------------------------------------------------------------------------------------------*/
var loadedImgs=new Array();
;(function (window, document, $, undefined) {
	
	$.swipebox = function(elem, options) {

		var defaults = {
			useCSS : true,
			initialIndexOnArray : 0,
			hideBarsDelay : 3000,
			videoMaxWidth : 1140,
			vimeoColor : 'CCCCCC',
			beforeOpen: null,
		      	afterClose: null
		},
		
		plugin = this,
		elements = [], // slides array [{href:'...', title:'...'}, ...],
		elem = elem,
		selector = elem.selector,
		$selector = $(selector),
		isTouch = document.createTouch !== undefined || ('ontouchstart' in window) || ('onmsgesturechange' in window) || navigator.msMaxTouchPoints,
		supportSVG = !!(window.SVGSVGElement),
		winWidth = window.innerWidth ? window.innerWidth : $(window).width(),
		winHeight = window.innerHeight ? window.innerHeight : $(window).height(),
		html = '<div id="swipebox-overlay">\
				<div id="cover_in2"></div>\
				<div id="swipebox-slider"></div>\
				<div id="swipebox-caption"></div>\
					<a id="swipebox-close"><i class="icon-cancel2"></i></a>\
					<a id="swipebox-prev"><i class="icon-arrow-left-3"></i></a>\
					<a id="swipebox-next"><i class="icon-arrow-right-3"></i></a>\
		</div>';

		plugin.settings = {}

		plugin.init = function(){

			plugin.settings = $.extend({}, defaults, options);

			if ($.isArray(elem)) {

				elements = elem;
				ui.target = $(window);
				ui.init(plugin.settings.initialIndexOnArray);

			}else{

				$selector.click(function(e){
					elements = [];
					var index , relType, relVal;

					if (!relVal) {
						relType = 'rel';
						relVal  = $(this).attr(relType);
					}

					if (relVal && relVal !== '' && relVal !== 'nofollow') {
						$elem = $selector.filter('[' + relType + '="' + relVal + '"]');
					}else{
						$elem = $(selector);
					}

					$elem.each(function(){

						var title = null, href = null;
						
						if( $(this).attr('title') )
							title = $(this).attr('title');

						if( $(this).attr('href') )
							href = $(this).attr('href');

						elements.push({
							href: href,
							title: title
						});
					});
					
					index = $elem.index($(this));
					e.preventDefault();
					e.stopPropagation();
					ui.target = $(e.target);
					ui.init(index);
				});
			}
		}

		plugin.refresh = function() {
			if (!$.isArray(elem)) {
				ui.destroy();
				$elem = $(selector);
				ui.actions();
			}
		}
		
		
		var ui = {

			init : function(index){
				if (plugin.settings.beforeOpen) 
					plugin.settings.beforeOpen();
				this.target.trigger('swipebox-start');
				$.swipebox.isOpen = true;
				this.build();
				this.openSlide(index);
				this.openMedia(index);
				this.preloadMedia(index+1);
				this.preloadMedia(index-1);
			},

			build : function(){
				var $this = this;

				$('body').append(html);
			
				if($this.doCssTrans()){
					$('#swipebox-slider').css({
						'-webkit-transition' : 'left 0.4s ease',
						'-moz-transition' : 'left 0.4s ease',
						'-o-transition' : 'left 0.4s ease',
						'-khtml-transition' : 'left 0.4s ease',
						'transition' : 'left 0.4s ease'
					});
					
					
					$('#swipebox-action, #swipebox-caption').css({
						'-webkit-transition' : '0.5s',
						'-moz-transition' : '0.5s',
						'-o-transition' : '0.5s',
						'-khtml-transition' : '0.5s',
						'transition' : '0.5s'
					});
				}
				//$('#swipebox-overlay').fadeIn(250);
				$('#swipebox-overlay').click(function() {
					//$this.closeSlide();
				});
				/*
				if(supportSVG){
					var bg = $('#swipebox-action #swipebox-close').css('background-image');
					bg = bg.replace('png', 'svg');
					$('#swipebox-action #swipebox-prev,#swipebox-action #swipebox-next,#swipebox-action #swipebox-close').css({
						'background-image' : bg
					});
				}*/
				$var=0;
				$.each( elements,  function(){
					$('#swipebox-slider').append('<div class="slide" rel="'+$var+'"></div>');
					$var++;
				});

				$this.setDim();
				$this.actions();
				$this.keyboard();
				$this.gesture();
				$this.animBars();
				$this.resize();
				
			},

			setDim : function(){

				var width, height, sliderCss = {};
				
				if( "onorientationchange" in window ){

					window.addEventListener("orientationchange", function() {
						if( window.orientation == 0 ){
							width = winWidth;
							height = winHeight;
						}else if( window.orientation == 90 || window.orientation == -90 ){
							width = winHeight;
							height = winWidth;
						}
					}, false);
					
				
				}else{

					width = window.innerWidth ? window.innerWidth : $(window).width();
					height = window.innerHeight ? window.innerHeight : $(window).height();
				}

				sliderCss = {
					width : width,
					height : height
				}


				$('#swipebox-overlay').css(sliderCss);

			},

			resize : function (){
				var $this = this;
				
				$(window).resize(function() {
					$this.setDim();
				}).resize();
			},

			supportTransition : function() {
				var prefixes = 'transition WebkitTransition MozTransition OTransition msTransition KhtmlTransition'.split(' ');
				for(var i = 0; i < prefixes.length; i++) {
					if(document.createElement('div').style[prefixes[i]] !== undefined) {
						return prefixes[i];
					}
				}
				return false;
			},

			doCssTrans : function(){
				if(plugin.settings.useCSS && this.supportTransition() ){
					return true;
				}
			},

			gesture : function(){
				if ( isTouch ){
					var $this = this,
					distance = null,
					swipMinDistance = 10,
					startCoords = {},
					endCoords = {};
					var bars = $('#swipebox-caption, #swipebox-action');

					bars.addClass('visible-bars');
					$this.setTimeout();
					
					
					if (typeof document.body.ontouchstart == "undefined") {
					
						window.handlerF3 = function (e){
							e.preventDefault();
							e.stopPropagation();
							distance = endCoords.pageX - startCoords.pageX;
							if( distance >= swipMinDistance ){
								// swipeLeft
								$this.getPrev();
							}else if( distance <= - swipMinDistance ){
								// swipeRight
								$this.getNext();
							}else{
								// tap
								if(!bars.hasClass('visible-bars')){
									$this.showBars();
									$this.setTimeout();
								}else{
									$this.clearTimeout();
									$this.hideBars();
								}
							}	
							$('.touching')[0].removeEventListener('pointermove', window.handlerF2);
							$('.touching').removeClass('touching');
						};
						window.handlerF2 = function (e){
							e.preventDefault();
							e.stopPropagation();
							endCoords = (typeof e.targetTouches != 'undefined') ? e.targetTouches[0] : {pageX: e.pageX, pageY: e.pageY};
						}
						window.handlerF1 = function (e){
							$('body').addClass('touching');
		  					endCoords = (typeof e.targetTouches != 'undefined') ? e.targetTouches[0] : {pageX: e.pageX, pageY: e.pageY};
		    				startCoords.pageX = (typeof e.targetTouches != 'undefined') ? e.targetTouches[0].pageX : e.pageX;
							//console.dir(endCoords);
							//console.dir(startCoords);
							$('.touching')[0].addEventListener("pointermove", window.handlerF2, false);
							return false;
						}
						
						document.body.addEventListener("pointerdown", window.handlerF1, false);
						document.body.addEventListener("pointerup",window.handlerF3, false);
						
					} else {

					$('body').bind('touchstart', function(e){
						$(this).addClass('touching');

		  				endCoords = e.originalEvent.targetTouches[0];
		    				startCoords.pageX = e.originalEvent.targetTouches[0].pageX;

						$('.touching').bind('touchmove',function(e){
							e.preventDefault();
							e.stopPropagation();
		    					endCoords = e.originalEvent.targetTouches[0];

						});
			           			
			           			return false;

	           			}).bind('touchend',function(e){
	           				e.preventDefault();
					e.stopPropagation();
   				
   					distance = endCoords.pageX - startCoords.pageX;
	       				
	       				if( distance >= swipMinDistance ){
	       					
	       					// swipeLeft
	       					$this.getPrev();
	       				
	       				}else if( distance <= - swipMinDistance ){
	       					
	       					// swipeRight
	       					$this.getNext();
	       				
	       				}else{
	       					// tap
	       					if(!bars.hasClass('visible-bars')){
							$this.showBars();
							$this.setTimeout();
						}else{
							$this.clearTimeout();
							$this.hideBars();
						}

	       				}	

	       				$('.touching').off('touchmove').removeClass('touching');
						
					});
					}
           		}
			},
			
			setTimeout: function(){
				return;
				if(plugin.settings.hideBarsDelay > 0){
					var $this = this;
					$this.clearTimeout();
					$this.timeout = window.setTimeout( function(){
						$this.hideBars() },
						plugin.settings.hideBarsDelay
					);
				}
			},
			
			clearTimeout: function(){	
				window.clearTimeout(this.timeout);
				this.timeout = null;
			},

			showBars : function(){
				var bars = $('#swipebox-caption, #swipebox-action');
				if(this.doCssTrans()){
					bars.addClass('visible-bars');
				}else{
					$('#swipebox-caption').animate({ top : 0 }, 500);
					$('#swipebox-action').animate({ bottom : 0 }, 500);
					setTimeout(function(){
						bars.addClass('visible-bars');
					}, 1000);
				}
			},

			hideBars : function(){
				return;
				var bars = $('#swipebox-caption, #swipebox-action');
				if(this.doCssTrans()){
					bars.removeClass('visible-bars');
				}else{
					$('#swipebox-caption').animate({ top : '-50px' }, 500);
					$('#swipebox-action').animate({ bottom : '-50px' }, 500);
					setTimeout(function(){
						bars.removeClass('visible-bars');
					}, 1000);
				}
			},

			animBars : function(){
				var $this = this;
				var bars = $('#swipebox-caption, #swipebox-action');
					
				bars.addClass('visible-bars');
				$this.setTimeout();
				
				

				$('#swipebox-action').hover(function() {
				  		$this.showBars();
						bars.addClass('force-visible-bars');
						$this.clearTimeout();
					
					},function() { 
						bars.removeClass('force-visible-bars');
						$this.setTimeout();

				});
			},

			keyboard : function(){
				var $this = this;
				$(window).bind('keyup', function(e){
					e.preventDefault();
					e.stopPropagation();
					if (e.keyCode == 37){
						$this.getPrev();
					}
					else if (e.keyCode==39){
						$this.getNext();
					}
					else if (e.keyCode == 27) {
						$this.closeSlide();
					}
				});
			},

			actions : function(){
				var $this = this;
				if ($.support.touch()) {
					if( elements.length < 2 ){
						$('#swipebox-prev, #swipebox-next').hide();
					}else{
						$('#swipebox-prev').bind('touchend', function(e){
							e.preventDefault();
							e.stopPropagation();
							$this.getPrev();
							$this.setTimeout();
						});
						
						$('#swipebox-next').bind('touchend', function(e){
							e.preventDefault();
							e.stopPropagation();
							$this.getNext();
							$this.setTimeout();
						});
					}
	
					$('#swipebox-close').bind('touchend', function(e){
                        e.preventDefault();
                        e.stopPropagation();
						$this.closeSlide();
					});
				} else {
					if( elements.length < 2 ){
						$('#swipebox-prev, #swipebox-next').hide();
					}else{
						$('#swipebox-prev').bind('click', function(e){
							e.preventDefault();
							e.stopPropagation();
							$this.getPrev();
							$this.setTimeout();
						});
						
						$('#swipebox-next').bind('click', function(e){
							e.preventDefault();
							e.stopPropagation();
							$this.getNext();
							$this.setTimeout();
						});
					}
	
					$('#swipebox-close').bind('click', function(e){
						$this.closeSlide();
					});
				}
			},
			
			setSlide : function (index, isFirst){
				isFirst = isFirst || false;
				
				var slider = $('#swipebox-slider');
				
				if(this.doCssTrans()){
					slider.css({ left : (-index*100)+'%' });
				}else{
					slider.animate({ left : (-index*100)+'%' });
				}
				
				$('#swipebox-slider .slide').removeClass('current');
				$('#swipebox-slider .slide').eq(index).addClass('current');
				this.setTitle(index);

				if( isFirst ){
					slider.fadeIn();
				}


				if ($('.swipebox-video-container').size()) {
					$('.swipebox-video-container').each(function () {
                        $(this).find('iframe')[0].contentWindow.postMessage('{"event":"command","func":"' + 'stopVideo' + '","args":""}', '*');
					});

				}

                if ($('.swipebox-video-container').size()) {
                    /*$('#swipebox-slider .current').find('iframe')[0].contentWindow.postMessage('{"event":"command","func":"' + 'playVideo' + '","args":""}', '*');*/
                }


				$('#swipebox-prev, #swipebox-next').removeClass('disabled');
				if(index == 0){
					$('#swipebox-prev').addClass('disabled');
				}else if( index == elements.length - 1 ){
					$('#swipebox-next').addClass('disabled');
				}
			},
		
			openSlide : function (index){
				$('html').addClass('swipebox');
				$(window).trigger('resize'); // fix scroll bar visibility on desktop
				this.setSlide(index, true);
			},
		
			preloadMedia : function (index){
				var $this = this, src = null;

				if( elements[index] !== undefined )
					src = elements[index].href;

				if( !$this.isVideo(src) ){
					setTimeout(function(){
						$this.openMedia(index);
					}, 1000);
				}else{
					$this.openMedia(index);
				}
			},
			
			openMedia : function (index){
				var $this = this, src = null;

				if( elements[index] !== undefined )
					src = elements[index].href;

				if(index < 0 || index >= elements.length){
					return false;
				}

				if( !$this.isVideo(src) ){
					$this.loadMedia(src, function(){
						$('#swipebox-slider .slide').eq(index).html(this);
						$('#swipebox-slider .slide').eq(index).find("img").attr("alt", elements[index].title);
					});
				}else{
					$('#swipebox-slider .slide').eq(index).html($this.getVideo(src));
				}


				
				
				
				
			},

			setTitle : function (index, isFirst){
				var title = null;

				$('#swipebox-caption').empty();

				if( elements[index] !== undefined )
					title = elements[index].title;
				
				if(title){
					$('#swipebox-caption').append("<p>"+title+"</p>");
				}
			},

			isVideo : function (src){

				if( src ){
					if( 
						src.match(/youtube\.com\/watch\?v=([a-zA-Z0-9\-_]+)/) 
						|| src.match(/vimeo\.com\/([0-9]*)/) 
					){
						var iever=10000;
						if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ 
							iever=new Number(RegExp.$1);
						}
					
						if (iever>8) {
							$('#swipebox-overlay').css("background", "rgba(255,255,255,.9)");
						} else {
							$('#swipebox-overlay').css("background", "url(/library/pagination/background-images/trasp.png) top left repeat");
						}
						return true;
					}
				}
					
			},

			getVideo : function(url){
				var iframe = '';
				var output = '';
				var youtubeUrl = url.match(/watch\?v=([a-zA-Z0-9\-_]+)/);
				var vimeoUrl = url.match(/vimeo\.com\/([0-9]*)/);
				if( youtubeUrl ){

					iframe = '<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/'+youtubeUrl[1]+'?rel=0&controls=1&showinfo=0&wmode=transparent&modestbranding=1&autoplay=0&rel=0&enablejsapi=1" frameborder="0" allowfullscreen></iframe>';
				
				}else if(vimeoUrl){

					iframe = '<iframe width="560" height="315"  src="http://player.vimeo.com/video/'+vimeoUrl[1]+'?byline=0&amp;portrait=0&amp;color='+plugin.settings.vimeoColor+'" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>';
				
				}


				return '<div class="swipebox-video-container" style="max-width:'+plugin.settings.videomaxWidth+'px"><div class="swipebox-video">'+iframe+'</div></div>';
			},
			
			loadMedia : function (src, callback){
				
				if (jQuery.inArray( src, loadedImgs )!=-1) {
					return;
				} else {
					$('#cover_in2').fadeIn();
					loadedImgs.push(src);
					
				}
				if( !this.isVideo(src) ){
					var img = $('<img  style="opacity: 0">').on('load', function(){
						$('#cover_in2').fadeOut();				
						callback.call(img);
						$(img).animate(
							{opacity: 1}, 1000, 'linear'
						);
					});
					img.attr('src',src);
					
					
					
						
				}	
			},
			
			getNext : function (){
				var $this = this;
				index = $('#swipebox-slider .slide').index($('#swipebox-slider .slide.current'));
				if(index+1 < elements.length){
					index++;
					$this.setSlide(index);
					$this.preloadMedia(index+1);
				}
				else{
					
					$('#swipebox-slider').addClass('rightSpring');
					setTimeout(function(){
						$('#swipebox-slider').removeClass('rightSpring');
					},500);
				}
			},
			
			getPrev : function (){
				index = $('#swipebox-slider .slide').index($('#swipebox-slider .slide.current'));
				if(index > 0){
					index--;
					this.setSlide(index);
					this.preloadMedia(index-1);
				}
				else{
					
					$('#swipebox-slider').addClass('leftSpring');
					setTimeout(function(){
						$('#swipebox-slider').removeClass('leftSpring');
					},500);
				}
			},


			closeSlide : function (){
				loadedImgs=new Array(); 
				$('html').removeClass('swipebox');
				$(window).trigger('resize');
				this.destroy();
			},

			destroy : function(){
				$(window).unbind('keyup');
				$('body').unbind('touchstart');
				$('body').unbind('touchmove');
				$('body').unbind('touchend');
				if (typeof document.body.removeEventListener != 'undefined') {
					document.body.removeEventListener('pointerdown', window.handlerF1);
					document.body.removeEventListener('pointermove', window.handlerF2);
					document.body.removeEventListener('pointerup', window.handlerF3);
				}
				$('#swipebox-slider').unbind();
				//$('#swipebox-overlay').fadeOut(350, function() {
					$('#swipebox-overlay').remove();
					if (!$.isArray(elem))
						elem.removeData('_swipebox');
					if ( this.target )
						this.target.trigger('swipebox-destroy');
					$.swipebox.isOpen = false;
					if (plugin.settings.afterClose) 
						plugin.settings.afterClose();
 				//});
			}

		};

		plugin.init();
		
		
		
	};
	
	

	$.fn.swipebox = function(options){
		if (!$.data(this, "_swipebox")) {
			var swipebox = new $.swipebox(this, options);
			this.data('_swipebox', swipebox);
		}
		return this.data('_swipebox');
	}

}(window, document, jQuery));