/*
 * Copyright 2011 Get Started Pty Ltd
 * For licensing information, contact andrew.thompson@getstarted.com.au
 */
(function($) {
	$.fn.parallaxSlider = function(options) {
		
		var defaults = {
			'fgOffset': 600,
			'frontOffset': 1200,
			'slideDuration': 1500,
			'autoSlide': true,
			'autoSlideTimeout': 5000,
			'preload': true,
			'next': '#next',
			'prev': '#prev',
			'navigation': '#navigation',
			'navToggle': '#nav-toggle'
		};
		
		if (options) $.extend(defaults, options);
		
		return this.each(function(){
		
			var methods = {
				autoSlide: function(timeout)
				{
					if (!autoSliding) return;
					methods.changeSlide(currentSlide + 1);
					setTimeout(function(){methods.autoSlide(timeout);}, timeout);
				},
				stopSliding: function() {
					autoSliding = false;
					clearTimeout(autoSlideTimerId);
				},
				changeSlide: function(slideIndex)  {
					navigation.find('a').removeClass('active').eq(slideIndex).addClass('active');
					
					if (slideIndex == currentSlide) return;
					
					// handle overflow
					var overFlow = false;
					if (slideIndex + 1 > slideCount) {
						slideIndex = 0;
						overFlow = true;
					}
					if (slideIndex < 0) {
						slideIndex = slideCount - 1;
						overFlow = true;
					}
					
					var jumpTo = false;
					if (Math.abs(currentSlide - slideIndex) >= 2) jumpTo = true
					
					var slideDirection = 'right';
					if (slideIndex < currentSlide) slideDirection = 'left';
					
					// animate using jQuery
					var targetLeft = slideIndex * slideWidth * -1;
					if (useCSS) {
						inner.css('left', targetLeft);
					}
					else {
						inner.animate({left: targetLeft}, slideDuration);
					}

					var oldSlideFgOffset = fgOffset;
					var oldSlideFrontOffset = frontOffset;
					if (slideDirection == 'right') {
						oldSlideFgOffset *= -1;
						oldSlideFrontOffset *= -1;
					}
					
					if (useCSS) {
						inner.find('.slide').eq(slideIndex).find('.foreground').css('left', 0);
						inner.find('.slide').eq(slideIndex).find('.front').css('left', 0);
						inner.find('.slide').eq(currentSlide).find('.foreground').css('left', oldSlideFgOffset);
						inner.find('.slide').eq(currentSlide).find('.front').css('left', oldSlideFrontOffset);
					}
					else {
						inner.find('.slide').eq(slideIndex).find('.foreground').css('left', -oldSlideFgOffset).animate({left: 0}, slideDuration);
						inner.find('.slide').eq(slideIndex).find('.front').css('left', -oldSlideFrontOffset).animate({left: 0}, slideDuration);
						inner.find('.slide').eq(currentSlide).find('.foreground').animate({left: oldSlideFgOffset}, slideDuration);
						inner.find('.slide').eq(currentSlide).find('.front').animate({left: oldSlideFrontOffset}, slideDuration);
					}

					var otherslides = inner.find('.slide').each(function(i){
						if (i == slideIndex || i == currentSlide) return;
						if (i < Math.min(slideIndex, currentSlide)) {
							$(this).find('.foreground').css('left', -1*Math.abs(oldSlideFgOffset));
							$(this).find('.front').css('left', -1*Math.abs(oldSlideFrontOffset));					
						}
						else if (i > Math.max(slideIndex, currentSlide)) {
							$(this).find('.foreground').css('left', Math.abs(oldSlideFgOffset));
							$(this).find('.front').css('left', Math.abs(oldSlideFrontOffset));					
						}
						else if (useCSS) {
							$(this).find('.foreground').css('left', oldSlideFgOffset);
							$(this).find('.front').css('left', oldSlideFrontOffset);
						}
						else {
							$(this).find('.foreground').css('left', -oldSlideFgOffset).animate({left: oldSlideFgOffset}, slideDuration);
							$(this).find('.front').css('left', -oldSlideFrontOffset).animate({left: oldSlideFrontOffset}, slideDuration);
						}
					});
				
					currentSlide = slideIndex;
				},
				supports: function() {  
					var div = document.createElement('div'),  
					vendors = 'Khtml Ms O Moz Webkit'.split(' '),  
					len = vendors.length;  
					
					return function(prop) {  
						if ( prop in div.style ) return true;  
						
						prop = prop.replace(/^[a-z]/, function(val) {  
						 return val.toUpperCase();  
						});  
						
						while(len--) {  
						 if ( vendors[len] + prop in div.style ) { 
						    return true;  
						 }  
						}
						return false; 
					} 
				},
				isTouchDevice: function() {
					var el = document.createElement('div');
					el.setAttribute('ontouchstart', 'return;');
					if(typeof el.ontouchstart == 'function'){
						return true;
					}else {
						return false;
					}
				}
			};

			var slideshow = $(this);
		
			var fgOffset = defaults.fgOffset;
			var frontOffset = defaults.frontOffset;
			var slideDuration = defaults.slideDuration;
			var autoSlideTimeout = defaults.autoSlideTimeout;
			var autoSliding = defaults.autoSlide;
			var preload = defaults.preload;
			var next = $(defaults.next);
			var prev = $(defaults.prev);
			var navigation = $(defaults.navigation);
			var navToggle = $(defaults.navToggle);
			var slideCount = slideshow.find('.slide').size();
			var slideWidth = slideshow.width();
			var autoSlideTimerId;
			var currentSlide = 0;

			// does browser support CSS3 transitions?
			var useCSS = methods.supports()('transition');

			// initialise inner sliding panel
			slideshow.css('position','relative');
			var inner = $('<div class="slideshow-inner" />');
			slideshow.wrapInner(inner);
			inner = slideshow.find('.slideshow-inner');
		
			// set widths, positions etc
			inner.css('width', slideCount * slideWidth);
			inner.css('position', 'absolute').css('left',0).css('top',0).css('white-space', 'nowrap');
			slideWidth = slideshow.width();
			
			// initialise offsets
			slideshow.find('.slide:eq(0)').addClass('active');
			slideshow.find('.slide.active .foreground').css('left', 0);	
			slideshow.find('.slide.active .front').css('left', 0);	
			slideshow.find('.slide:not(.active) .foreground').css('left', fgOffset);	
			slideshow.find('.slide:not(.active) .front').css('left', frontOffset);	
			
			slideshow.find('.slide')
				.width(slideWidth)
				.css('display', 'block')
				.css('float', 'left')
				.css('overflow', 'visible');
			
			$(window).resize(function(){
				// reset widths, positions etc
				slideWidth = slideshow.width();
				inner.css('width', slideCount * slideWidth);
				slideshow.find('.slide').width(slideWidth);
				inner.css('left', currentSlide * slideWidth * -1);
			});
			
			if (useCSS) {
				slideshow.find('.foreground, .front').css('-webkit-transition', 'left ' + (slideDuration/1000) + 's ease-in-out');
				slideshow.find('.foreground, .front').css('-moz-transition', 'left ' + (slideDuration/1000) + 's ease-in-out');
				slideshow.find('.foreground, .front').css('-o-transition', 'left ' + (slideDuration/1000) + 's ease-in-out');
				slideshow.find('.foreground, .front').css('-ms-transition', 'left ' + (slideDuration/1000) + 's ease-in-out');
				slideshow.find('.foreground, .front').css('transition', 'left ' + (slideDuration/1000) + 's ease-in-out');
				slideshow.find('.foreground, .front').css('-webkit-transform', 'translateZ(0)');
				inner.css('-webkit-transition', 'left ' + (slideDuration/1000) + 's ease-in-out');
				inner.css('-moz-transition', 'left ' + (slideDuration/1000) + 's ease-in-out');
				inner.css('-o-transition', 'left ' + (slideDuration/1000) + 's ease-in-out');
				inner.css('-ms-transition', 'left ' + (slideDuration/1000) + 's ease-in-out');
				inner.css('transition', 'all ' + (slideDuration/1000) + 's ease-in-out');
				//inner.css('-webkit-transform', 'translateZ(0)');
			}

			navToggle.click(function(e){
				e.preventDefault();
				navigation.fadeToggle(500);	
			});
		
			// checking if background images have loaded
			if (preload) {
				var imagesToLoad = 0;
				slideshow.find('.slide').each(function(){
					var img = $(this).css('background-image').match(/http.+\.[a-z]+/);
					var imgEl = $('<img />').attr('src', img);
					imagesToLoad++;
					imgEl.load(function(){
						imagesToLoad--;
						if (imagesToLoad == 0) {
							// all images loaded, complete initialisation
							autoSlideTimerId = setTimeout(function(){methods.autoSlide(autoSlideTimeout);}, autoSlideTimeout);
						}
					});
				});
			}
			
		
			// prev/next buttons
			next.click(function(e) {
				e.preventDefault();
				methods.stopSliding();
				methods.changeSlide(currentSlide + 1);
			});
			prev.click(function(e) {
				e.preventDefault();
				methods.stopSliding();
				methods.changeSlide(currentSlide - 1);
			});
			
			// hook up navigation
			if (navigation) {
				navigation.find('a').each(function(i){
					$(this).click(function(e){
						e.preventDefault();
						methods.stopSliding();
						methods.changeSlide(i);
						navigation.fadeOut(500);
					});
				});
			}
			
			if (!preload && autoSliding)
			{
				autoSlideTimerId = setTimeout(function(){methods.autoSlide(autoSlideTimeout);}, autoSlideTimeout);
			}
					
			methods.changeSlide(0);

			// mobile support
			if (methods.isTouchDevice()) {
				slideshow.swipe({
					threshold: { x: 50, y: 100 }, // min x, max y
					swipeLeft: function() {
						methods.stopSliding();
						methods.changeSlide(currentSlide + 1);
					},
					swipeRight: function() {
						methods.stopSliding();
						methods.changeSlide(currentSlide - 1);
					}
				});
			}
			
		});
		

	};
})( jQuery );
