/* Written by Greg Beaven info@stormzdesigns.com.au for MeTTro Pty Ltd.*/

/* Version 1.1 - modified 22/11/2010 */
/* Add external callback funcitonality */
/* added transition effect */
/* Added image caching */

/* Version 1.2 - modified 02/12/2010 */
/* Made more modularised so that multiple sliders can be targeted on the same page */

(function($) {
	$.slider = {   
		init: function(settings, options) {
			settings.int_total_slide_width = $(settings.container + ' ' + settings.itemContainer).width();
			settings.int_current_position = 0;
			settings.int_last_position = 0;
			settings.timer_effect = null;
			settings.int_total_items = $(settings.container + ' ' + settings.itemContainer+' ' + settings.itemClass).size();
			settings.int_total_inner_width = settings.int_total_slide_width * settings.int_total_items;
			
			//Set a container reference
			var str = settings.container
			str = str.replace('#', '');
			str = str.replace('.', '');
			
			settings.containerReference = str;
			
			
			//Due some HTML manipulation to make the base implementation code more light weight
			var str_html = '<div class="inner">';
			str_html += $(settings.container + ' ' + settings.itemContainer).html();
			str_html += '</div>';

			$(settings.container + ' ' + settings.itemContainer).html(str_html);

			$(settings.container + ' ' + settings.itemContainer+' .inner').width(settings.int_total_inner_width);
		
			if (settings.int_total_items > 1) {
				$.slider.createPageCounter(settings, options);
				if (settings.autoSlide && !settings.startAnimationOnCachingComplete) {
					$.slider.setEffectInterval(settings,options);
				}
				else {
					//Call on the image caching funciton
					$.slider.imageCaching(settings, options);	
				}
			}	
			
			settings.fn_callback = function() 
			{
				//allow for external functionality to be called
				settings.onAnimationComplete();	
			}
			
			//Check for additional setup required for the active effect
			$.slider.additionalSetup(settings , options);
		},
		
		imageCaching: function(settings, options) 
		{	
			var bln_effect_initiated = false;
			
			var imageLoadingComplete = function() 
			{	
				if (!bln_effect_initiated) 
				{
					//Start slider normally
					$.slider.setEffectInterval(settings, options);
					bln_effect_initiated = true;
				}
			}
			
			//Find the total images to cache
			obj_items = $(settings.container + ' ' + settings.itemContainer).find('div.inner>div');
			int_total_images = obj_items.size();
			

			obj_items.each(function( int_count ) {
				var obj_img = $(this).find('img').eq(0);
				obj_img.attr({ 'class' : 'tmp'+int_count });
			});
			
			var int_last_pos = int_total_images-1;
			var str_arg = 'img.tmp'+int_last_pos;

			$(str_arg, obj_items ).imagesLoaded(imageLoadingComplete);

		},
		
		additionalSetup: function(settings, options) 
		{
			switch(settings.itemEffect) {
				case "transition":
					//We need to arrange the divs different for this effect so that alpha works
				break;
			}
		},
		
		setEffectInterval: function(settings, options) {
			if (settings.autoSlide) {
				//accessed this way due to a conflicting interval bug
				if(typeof console == "undefined") {
					console = { log: function() { } };
				} else {
					console.log(settings.container + "timer_effect" + ' - ' + settings.waitBetweenItems);	
				}
				settings[settings.container + "timer_effect"] = setInterval(function() { $.slider.goToNextSlide(settings, options); }, settings.waitBetweenItems);	
			}
		},
		goToNextSlide: function(settings, options) {
			settings.int_last_position = settings.int_current_position;
			++settings.int_current_position;
			
			$.slider.slideToPosition(settings.int_current_position, settings, options);
		},
		goToPreviousSlide: function(settings, options) {
			settings.int_last_position = settings.int_current_position;
			--settings.int_current_position;
			
			$.slider.slideToPosition(settings.int_current_position, settings, options);
		},
		createPageCounter: function(settings, options) {
			
			if (settings.showSlidePanel) {
			
				var str_value = '<ul class="counter">';
				var int_ul_width = 0;
				var int_li_count = 0;
				
				for (i = 0; i < settings.int_total_items; i++) {
					if (settings.showSlideNumbers) { var display = (i+1); } else { var display = "&nbsp;" }
					str_value += '<li id="' + settings.containerReference + '-item-'+i+'"><a href="javascript:void(0);">'+display+'</a></li>';
				}
				//alert(settings.counterContainer);
				$(settings.counterContainer).html(str_value);
				$(settings.counterContainer+' ul li a').each(function( int_count ) {		
					int_li_count++;						   
					int_ul_width = int_ul_width + ( Number($(this).parent().width() ));
														   
					$(this).click(function() {
						clearInterval(settings[settings.container + "timer_effect"]);
						$.slider.setEffectInterval(settings, options);
						settings.int_last_position = settings.int_current_position;
						settings.int_current_position = int_count;
						$.slider.slideToPosition(settings.int_current_position, settings, options);
					});
				});
				if (int_li_count > 0) {
					$('#' + settings.containerReference + '-item-'+settings.int_current_position).addClass('on');
				}
			}
		},
		slideToPosition: function(int_position, settings, options) {
			if (int_position >= settings.int_total_items) {
				settings.int_current_position = 0;	
			} else if (int_position < 0) {
				settings.int_current_position = settings.int_total_items-1;	
			}	
			var int_new_position = settings.int_total_slide_width * settings.int_current_position;
			
			//Pass the item over to be animated
			$.slider.animateItem(int_new_position, settings, options);
		},
		animateItem: function(int_new_position, settings, options) 
		{
			var obj_c = $(settings.container + ' ' + settings.itemContainer).find('div.inner>div');
			
			obj_item = obj_c.eq(settings.int_last_position);
			var obj_image = obj_item.find('img');
			
			var obj_l = obj_c.eq(settings.int_current_position);
			var obj_link = obj_l.find('a');
			
			settings.activeLink = obj_link.attr('href');
			//alert(settings.activeLink);
			
			if ( obj_link.attr('href').length > 0 && obj_link.attr('href') != '#') { 
				//alert('here');
				$(settings.activeLinkContainer).attr({'href' : obj_link.attr('href') });
			} else {
				$(settings.activeLinkContainer).attr({'href' : '' });
			}
				
			
			//$.extend(settings, options);
			//$.extend(settings.activeLink, $.slider.settings, options );
			
			//$.extend(this.settings, options);
			
			switch(settings.itemEffect) 
			{
				case "transition":
					$(settings.container + ' ' + settings.itemContainer+' .inner').css({ 'left': -int_new_position+'px' });
					
					var str_html = "";
					str_html += '<div style="position: absolute; top: 0px; left: 0px; z-index: 2;" id="tmp-transition-overlay">';
						str_html += obj_item.html();
					str_html += '</div>';
					
					$(settings.container).append(str_html);
					
					var obj_overlay = $('#tmp-transition-overlay');
					obj_overlay.fadeOut(settings.transitionSpeed, function() { $(this).remove(); });
					
				break;
				case "fade":
					function moveSlide() {

						//Allow a user to specify an offset from the left
						int_new_position = int_new_position - settings.itemOffset;
						
						$(settings.container + ' ' + settings.itemContainer+' .inner').css({ 'left': -int_new_position+'px' });
					}
					$(settings.container + ' ' + settings.itemContainer+' .inner').fadeOut(settings.transitionSpeed, moveSlide).fadeIn(settings.transitionSpeed, settings.fn_callback);
				break;
				case "slide":
					$(settings.container + ' ' + settings.itemContainer+' .inner').animate({ left: -int_new_position+'px' }, settings.transitionSpeed, settings.fn_callback);
				break;
			}
			$('#' + settings.containerReference + '-item-'+settings.int_last_position).removeClass('on');  
			$('#' + settings.containerReference + '-item-'+settings.int_current_position).addClass('on');
		}	
	}
	
	$.fn.extend({
		slider: function(options) {
			this.settings = {
				container: '#hero-slider',
				itemContainer: '.items',
				itemClass: '.item',
				itemOffset: 0,
				counterContainer: '#slider-counter',
				itemEffect: 'slide', //fade or slide, transition
				showSlideNumbers: false,
				showSlidePanel: false,
				autoSlide: true,
				waitBetweenItems: 6000, //milliseconds
				transitionSpeed: 500, //speed between transitions
				enableButtons: false, //Enable next and previous buttons
				startAnimationOnCachingComplete: true,
				forwardButton: '#work-item-next',
				backButton: '#work-item-previous',
				onAnimationComplete: function() {},
				activeLinkContainer: ''
			}
			
			if(options){
				$.extend(this.settings, options);
			}	
			var settings = this.settings;
			if (settings.enableButtons) {
				$(settings.forwardButton).click(function() {
					clearInterval(settings[settings.container + "timer_effect"]);
					$.slider.setEffectInterval(settings, options);
					
					$.slider.goToPreviousSlide(settings);									
				});
				$(settings.backButton).click(function() {
					clearInterval(settings[settings.container + "timer_effect"]);
					$.slider.setEffectInterval(settings, options);
					
					$.slider.goToNextSlide(settings, options);									
				});
			}
			if (settings.int_total_items > 1) {
				if (settings.autoSlide) { 
					$.slider.setEffectInterval();
				}
			}

			//Start slider normally
			$.slider.init(this.settings, options);

		}
	});	
})(jQuery);	
