/*
	Supersized - Fullscreen Slideshow jQuery Plugin
	Version 3.1.3
	www.buildinternet.com/project/supersized
	
	By Sam Dunn / One Mighty Roar (www.onemightyroar.com)
	Released under MIT License / GPL License
*/

(function($){

	//Add in Supersized elements
	$(document).ready(function() {
		$('body').prepend('<div id="supersized-loader"></div>').prepend('<div id="supersized"></div>');
		$("#supersized").css("display", "none");
	});	
	
	//Resize image on ready or resize
	$.supersized = 
		function( options ) {		
		//Default settings
		this.settings = {
			
			//Functionality
			slideshow               :   1,		//Slideshow on/off
			autoplay				:	1,		//Slideshow starts playing automatically
			start_slide             :   1,		//Start slide (0 is random)
			random					: 	0,		//Randomize slide order (Ignores start slide)
			slide_interval          :   5000,	//Length between transitions
			transition              :   1, 		//0-None, 1-Fade, 2-Slide Top, 3-Slide Right, 4-Slide Bottom, 5-Slide Left, 6-Carousel Right, 7-Carousel Left
			transition_speed		:	750,	//Speed of transition
			new_window				:	1,		//Image links open in new window/tab
			pause_hover             :   0,		//Pause slideshow on hover
			keyboard_nav            :   1,		//Keyboard navigation on/off
			performance				:	1,		//0-Normal, 1-Hybrid speed/quality, 2-Optimizes image quality, 3-Optimizes transition speed // (Only works for Firefox/IE, not Webkit)
			image_protect			:	1,		//Disables image dragging and right click with Javascript
			image_path				:	'img/', //Default image path
			
			//Size & Position
			min_width		        :   0,		//Min width allowed (in pixels)
			min_height		        :   0,		//Min height allowed (in pixels)
			vertical_center         :   1,		//Vertically center background
			horizontal_center       :   1,		//Horizontally center background
			fit_portrait         	:   0,		//Portrait images will not exceed browser height
			fit_landscape			:   0,		//Landscape images will not exceed browser width  
			
			//Components
			navigation              :   1,		//Slideshow controls on/off
			thumbnail_navigation    :   0,		//Thumbnail navigation
			slide_counter           :   1,		//Display slide numbers
			slide_captions          :   1		//Slide caption (Pull from "title" in slides array)
			
		};
		this.inAnimation = false;					//Prevents animations from stacking
		this.isPaused = false;	
		this.isRequestSlideChange = false;
		
		
		var _instance = this;		
		this._init = function(){									
			
			//Default elements
			var element = $('#supersized');		//Supersized container
			var pauseplay = '#pauseplay';		//Pause/Play		
			
			//General slideshow variables								//Tracks paused on/off
			var image_path = _instance.options.image_path;		//Default image path for navigation control buttons
			
			//Determine starting slide (random or defined)
			if (_instance.options.start_slide){
				_instance.currentSlide = _instance.options.start_slide - 1;	//Default to defined start slide
			}else{
				_instance.currentSlide = Math.floor(Math.random()*_instance.options.slides.length);	//Generate random slide number
			}
			
			//If links should open in new window
			var linkTarget = _instance.options.new_window ? ' target="_blank"' : '';
			
			//Set slideshow quality (Supported only in FF and IE, no Webkit)
			if (_instance.options.performance == 3){
				element.addClass('speed'); 		//Faster transitions
			} else if ((_instance.options.performance == 1) || (_instance.options.performance == 2)){
				element.addClass('quality');	//Higher image quality
			}
			
			//Shuffle slide order if needed		
			if (_instance.options.random){
				arr = _instance.options.slides;
				for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);	//Fisher-Yates shuffle algorithm (jsfromhell.com/array/shuffle)
			    _instance.options.slides = arr;
			}
			
			/***Load initial set of images***/

			if (_instance.options.slides.length > 1){
				//Set previous image
				_instance.currentSlide - 1 < 0  ? loadPrev = _instance.options.slides.length - 1 : loadPrev = _instance.currentSlide - 1;	//If slide is 1, load last slide as previous
				var imageLink = (_instance.options.slides[loadPrev].url) ? "href='" + _instance.options.slides[loadPrev].url + "'" : "";
				$("<img/>").attr("src", _instance.options.slides[loadPrev].image).appendTo(element).wrap('<a ' + imageLink + linkTarget + '></a>');
			}
			
			//Set current image
			imageLink = (_instance.options.slides[_instance.currentSlide].url) ? "href='" + _instance.options.slides[_instance.currentSlide].url + "'" : "";
			$("<img/>").attr("src", _instance.options.slides[_instance.currentSlide].image).appendTo(element).wrap('<a class="activeslide" ' + imageLink + linkTarget + '></a>');
			
			if (_instance.options.slides.length > 1){
				//Set next image
				_instance.currentSlide == _instance.options.slides.length - 1 ? loadNext = 0 : loadNext = _instance.currentSlide + 1;	//If slide is last, load first slide as next
				imageLink = (_instance.options.slides[loadNext].url) ? "href='" + _instance.options.slides[loadNext].url + "'" : "";
				$("<img/>").attr("src", _instance.options.slides[loadNext].image).appendTo(element).wrap('<a ' + imageLink + linkTarget + '></a>');
			}
			/***End load initial images***/
			
			element.hide();					//Hide image to be faded in
			$('#controls-wrapper').hide();	//Hide controls to be displayed
			
			//Account for loading in IE
			$(document).ready(function() {
				resizenow();
			});

			$(window).load(function(){
				
				$('#supersized-loader').hide();		//Hide loading animation
				element.fadeIn('fast');				//Fade in background
				$('#controls-wrapper').show();		//Display controls				
				
				resizenow();	//Resize background image
				
				if (_instance.options.slide_captions) $('#slidecaption').html(_instance.options.slides[_instance.currentSlide].title);		//Pull caption from array
				
				//Start slideshow if enabled
				if (_instance.options.slideshow && _instance.options.slides.length > 1){
		    		slideshow_interval = setInterval(nextslide, _instance.options.slide_interval);	//Initiate slide interval
					//Prevent slideshow if autoplay disabled
		    		if (!(_instance.options.autoplay)){
						clearInterval(slideshow_interval);	//Stop slideshow
						_instance.isPaused = true;	//Mark as paused	    				
					}							
				}	//End slideshow _instance.options
				
			});		//End window load			
					
			//Adjust image when browser is resized
			$(window).resize(function(){            
	    		resizenow();
			});
			
			
			//Adjust image size
			function resizenow() {
				return element.each(function() {
			  	
			  		var t = $('img', element);
			  		
			  		//Resize each image seperately
			  		$(t).each(function(){
			  		
						var ratio = ($(this).height()/$(this).width()).toFixed(2);	//Define image ratio
						thisSlide = $(this);
						
						//Gather browser size
						var browserwidth = $(window).width();
						var browserheight = $(window).height();
						var offset;					
	                    
						/**Resize image to proper ratio**/
						
						if ((browserheight <= _instance.options.min_height) && (browserwidth <= _instance.options.min_width)){	//If window smaller than minimum width and height
						
							if ((browserheight/browserwidth) > ratio){
								_instance.options.fit_landscape && ratio <= 1 ? resizeWidth(true) : resizeHeight(true);	//If landscapes are set to fit
							} else {
								_instance.options.fit_portrait && ratio > 1 ? resizeHeight(true) : resizeWidth(true);		//If portraits are set to fit
							}
						
						} else if (browserwidth <= _instance.options.min_width){		//If window only smaller than minimum width
						
							if ((browserheight/browserwidth) > ratio){
								_instance.options.fit_landscape && ratio <= 1 ? resizeWidth(true) : resizeHeight();	//If landscapes are set to fit
							} else {
								_instance.options.fit_portrait && ratio > 1 ? resizeHeight() : resizeWidth(true);		//If portraits are set to fit
							}
							
						} else if (browserheight <= _instance.options.min_height){	//If window only smaller than minimum height
						
							if ((browserheight/browserwidth) > ratio){
								_instance.options.fit_landscape && ratio <= 1 ? resizeWidth() : resizeHeight(true);	//If landscapes are set to fit
							} else {
								_instance.options.fit_portrait && ratio > 1 ? resizeHeight(true) : resizeWidth();		//If portraits are set to fit
							}
						
						} else {	//If larger than minimums
							
							if ((browserheight/browserwidth) > ratio){
								_instance.options.fit_landscape && ratio <= 1 ? resizeWidth() : resizeHeight();	//If landscapes are set to fit
							} else {
								_instance.options.fit_portrait && ratio > 1 ? resizeHeight() : resizeWidth();		//If portraits are set to fit
							}
							
						}
						
						/**End Image Resize**/
						
						
						/**Resize Functions**/
						
						function resizeWidth(minimum){
							if (minimum){	//If minimum height needs to be considered
								if(thisSlide.width() < browserwidth || thisSlide.width() < _instance.options.min_width ){
									if (thisSlide.width() * ratio >= _instance.options.min_height){
										thisSlide.width(_instance.options.min_width);
							    		thisSlide.height(thisSlide.width() * ratio);
							    	}else{
							    		resizeHeight();
							    	}
							    }
							}else{
								if (_instance.options.min_height >= browserheight && !_instance.options.fit_landscape){	//If minimum height needs to be considered
									if (browserwidth * ratio >= _instance.options.min_height || (browserwidth * ratio >= _instance.options.min_height && ratio <= 1)){	//If resizing would push below minimum height or image is a landscape
										thisSlide.width(browserwidth);
										thisSlide.height(browserwidth * ratio);
									} else if (ratio > 1){		//Else the image is portrait
										thisSlide.height(_instance.options.min_height);
										thisSlide.width(thisSlide.height() / ratio);
									} else if (thisSlide.width() < browserwidth) {
										thisSlide.width(browserwidth);
							    		thisSlide.height(thisSlide.width() * ratio);
									}
								}else{	//Otherwise, resize as normal
									thisSlide.width(browserwidth);
									thisSlide.height(browserwidth * ratio);
								}
							}
						};
						
						function resizeHeight(minimum){
							if (minimum){	//If minimum height needs to be considered
								if(thisSlide.height() < browserheight){
									if (thisSlide.height() / ratio >= _instance.options.min_width){
										thisSlide.height(_instance.options.min_height);
										thisSlide.width(thisSlide.height() / ratio);
									}else{
										resizeWidth(true);
									}
								}
							}else{	//Otherwise, resized as normal
								if (_instance.options.min_width >= browserwidth){	//If minimum width needs to be considered
									if (browserheight / ratio >= _instance.options.min_width || ratio > 1){	//If resizing would push below minimum width or image is a portrait
										thisSlide.height(browserheight);
										thisSlide.width(browserheight / ratio);
									} else if (ratio <= 1){		//Else the image is landscape
										thisSlide.width(_instance.options.min_width);
							    		thisSlide.height(thisSlide.width() * ratio);
									}
								}else{	//Otherwise, resize as normal
									thisSlide.height(browserheight);
									thisSlide.width(browserheight / ratio);
								}
							}
						};
						
						/**End Resize Functions**/
						
						
						//Horizontally Center
						if (_instance.options.horizontal_center){
							$(this).css('left', (browserwidth - $(this).width())/2);
						}
						/*
						//Vertically Center
						if (_instance.options.vertical_center){
							$(this).css('top', (browserheight - $(this).height())/2);
						}*/
						
					});
					
					//Basic image drag and right click protection
					if (_instance.options.image_protect){
						
						$('img', element).bind("contextmenu",function(){
							return false;
						});
						$('img', element).bind("mousedown",function(){
							return false;
						});
					
					}
					
					return false;
					
				});
			};
		
			
			//Next slide
			function nextslide() {
				
				if(_instance.inAnimation) return false;		//Abort if currently animating
					else _instance.inAnimation = true;		//Otherwise set animation marker
			    
			    var slides = _instance.options.slides;	//Pull in slides array
				
				var currentslide = element.find('.activeslide');		//Find active slide
				currentslide.removeClass('activeslide');				//Remove active class
				
			    if ( currentslide.length == 0 ) currentslide = element.find('a:last');	//If end of set, note this is last slide
			    var nextslide = currentslide.next().length ? currentslide.next() : element.find('a:first');
				var prevslide = nextslide.prev().length ? nextslide.prev() : element.find('a:last');
				
				//Update previous slide
				$('.prevslide').removeClass('prevslide');
				prevslide.addClass('prevslide');
				
				//Get the slide number of new slide
				_instance.currentSlide + 1 == slides.length ? _instance.currentSlide = 0 : _instance.currentSlide++;
				
				//If hybrid mode is on drop quality for transition
				if (_instance.options.performance == 1) element.removeClass('quality').addClass('speed');	
				
				/**** Image Loading ****/
				
				//Load next image
				loadSlide = false;
				
				_instance.currentSlide == slides.length - 1 ? loadSlide = 0 : loadSlide = _instance.currentSlide + 1;	//Determine next slide
				imageLink = (_instance.options.slides[loadSlide].url) ? "href='" + _instance.options.slides[loadSlide].url + "'" : "";	//If link exists, build it
				$("<img/>").attr("src", _instance.options.slides[loadSlide].image).appendTo(element).wrap("<a " + imageLink + linkTarget + "></a>");	//Append new image
				
				//currentslide.prev().remove(); //Remove Old Image
	            if (_instance.options.slide_captions){
			    	//$('#slidecaption').fadeTo(500, 0);
			    }
	            //currentslide.fadeTo( 500, 0, function() {
				
	            $(this).prev().remove();
				/**** End Image Loading ****/
				
	            //$('#slidecaption').fadeTo("slow", 1);
				//Update captions
			    if (_instance.options.slide_captions){
			    	(_instance.options.slides[_instance.currentSlide].title) ? $('#slidecaption').html(_instance.options.slides[_instance.currentSlide].title) : $('#slidecaption').html('');
			    }
			    
			    nextslide.hide().addClass('activeslide');	//Update active slide
			    
		    	switch(_instance.options.transition){
		    		
		    		case 0:    //No transition
		    		    nextslide.show(); _instance.inAnimation = false;
		    		    break;
		    		case 1:    //Fade
		    		    //nextslide.fadeTo(_instance.options.transition_speed, 1, function(){ afterAnimation(); });                    
	                    nextslide.fadeTo("slow", 1, function(){ afterAnimation(); });   
		    		    break;
		    		case 2:    //Slide Top
		    		    nextslide.animate({top : -$(window).height()}, 0 ).show().animate({ top:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
		    		    break;
		    		case 3:    //Slide Right
		    			nextslide.animate({left : $(window).width()}, 0 ).show().animate({ left:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
		    			break;
		    		case 4:    //Slide Bottom
		    			nextslide.animate({top : $(window).height()}, 0 ).show().animate({ top:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
		    			break;
		    		case 5:    //Slide Left
		    			nextslide.animate({left : -$(window).width()}, 0 ).show().animate({ left:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
		    			break;
		    		case 6:    //Carousel Right
		    			nextslide.animate({left : $(window).width()}, 0 ).show().animate({ left:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
						currentslide.animate({ left: -$(window).width() }, _instance.options.transition_speed );
		    			break;
		    		case 7:    //Carousel Left
		    			nextslide.animate({left : -$(window).width()}, 0 ).show().animate({ left:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
						currentslide.animate({ left: $(window).width() }, _instance.options.transition_speed );
		    			break;
		    	};            
	            //});            
	  
			}
			
			
			//Previous Slide
			function prevslide() {
			
				if(_instance.inAnimation) return false;		//Abort if currently animating
					else _instance.inAnimation = true;		//Otherwise set animation marker
		
				var slides = _instance.options.slides;	//Pull in slides array
		
				var currentslide = element.find('.activeslide');		//Find active slide
				currentslide.removeClass('activeslide');				//Remove active class
				
			    if ( currentslide.length == 0 ) currentslide = $(element).find('a:first');	//If end of set, note this is first slide
			    var nextslide =  currentslide.prev().length ? currentslide.prev() : $(element).find('a:last');
				var prevslide =  nextslide.next().length ? nextslide.next() : $(element).find('a:first');
				
				//Update previous slide
				$('.prevslide').removeClass('prevslide');
				prevslide.addClass('prevslide');
						
				//Get current slide number
				_instance.currentSlide == 0 ?  _instance.currentSlide = slides.length - 1 : _instance.currentSlide-- ;
				
				//If hybrid mode is on drop quality for transition
				if (_instance.options.performance == 1) element.removeClass('quality').addClass('speed');	
						
				/**** Image Loading ****/
				
				//Load next image
				loadSlide = false;
				_instance.currentSlide - 1 < 0  ? loadSlide = slides.length - 1 : loadSlide = _instance.currentSlide - 1;	//Determine next slide
				imageLink = (_instance.options.slides[loadSlide].url) ? "href='" + _instance.options.slides[loadSlide].url + "'" : "";	//If link exists, build it
				$("<img/>").attr("src", _instance.options.slides[loadSlide].image).prependTo(element).wrap("<a " + imageLink + linkTarget + "></a>");	//Append new image
				
								
				currentslide.next().remove(); //Remove Old Image
				
				/**** End Image Loading ****/
				
				
				//Update slide counter
				if (_instance.options.slide_counter){
				    $('#slidecounter .slidenumber').html(_instance.currentSlide + 1);
				}
				
				//Update captions
			    if (_instance.options.slide_captions){
			    	(_instance.options.slides[_instance.currentSlide].title) ? $('#slidecaption').html(_instance.options.slides[_instance.currentSlide].title) : $('#slidecaption').html('');
			    }
				
			    nextslide.hide().addClass('activeslide');	//Update active slide
			    
			    switch(_instance.options.transition){
			    		
		    		case 0:    //No transition
		    		    nextslide.show(); _instance.inAnimation = false;
		    		    break;
		    		case 1:    //Fade
		    		    nextslide.fadeTo(_instance.options.transition_speed, 1, function(){ afterAnimation(); });
		    		    break;
		    		case 2:    //Slide Top (reverse)
		    		    nextslide.animate({top : $(window).height()}, 0 ).show().animate({ top:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
		    		    break;
		    		case 3:    //Slide Right (reverse)
		    			nextslide.animate({left : -$(window).width()}, 0 ).show().animate({ left:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
		    			break;
		    		case 4:    //Slide Bottom (reverse)
		    			nextslide.animate({top : -$(window).height()}, 0 ).show().animate({ top:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
		    			break;
		    		case 5:    //Slide Left (reverse)
		    			nextslide.animate({left : $(window).width()}, 0 ).show().animate({ left:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
		    			break;
		    		case 6:    //Carousel Right (reverse)
		    			nextslide.animate({left : -$(window).width()}, 0 ).show().animate({ left:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
						currentslide.animate({ left: $(window).width() }, _instance.options.transition_speed );
		    			break;
		    		case 7:    //Carousel Left (reverse)
		    			nextslide.animate({left : $(window).width()}, 0 ).show().animate({ left:0 }, _instance.options.transition_speed, function(){ afterAnimation(); });
						currentslide.animate({ left: -$(window).width() }, _instance.options.transition_speed );
		    			break;	
		    	};
			    	
			}
			
			//After slide animation
			function afterAnimation() {			
				if(_instance.isRequestSlideChange) {
					_instance.currentSlide = 0;
					_instance.options.slides = _instance.tempSlides;	
					_instance.isRequestSlideChange = false;
				}
				_instance.inAnimation = false; 
				
				//If hybrid mode is on swap back to higher image quality
				if (_instance.options.performance == 1){
			    	element.removeClass('speed').addClass('quality');
				}				
				resizenow();				
			}
		};	
		
		//set slide images
		this.setSlides = function( slides ) {
			if( !_instance.inAnimation ) {
				_instance.currentSlide = 0;
				_instance.options.slides = slides;			
			} else {
				_instance.isRequestSlideChange = true;
				_instance.tempSlides = slides;
			}
		};
		
		//Combine _instance.options with default settings
		if (options) {
			this.options = $.extend(this.settings, options);	//Pull from both defaults and supplied _instance.options
		}else{
			this.options = $.extend(this.settings);			//Only pull from default settings		
		}			
		this._init();
	};
		
})(jQuery);


