/**
 *	CentredScroller: A jQuery plugin for creating a scrollable slideshow that loops
 *	The currently active slide is always centred
 *
 *	Dependencies: jquery-1.4.2+
 *	
 *	@project	ca.thomasjbradley.applications.centredscroller
 *	@author		Thomas J Bradley <hey@thomasjbradley.ca>
 *	@link		http://thomasjbradley.ca/labs/centred-scroller
 *	@link		http://github.com/thomasjbradley/centred-scroller
 *	@copyright	Copyright MMX, Thomas J Bradley
 *	@license	New BSD License
 *	@version	1.0.0
 */
(function($){function CentredScroller(selector,options){var self=this;var settings=$.extend({},$.fn.centredScroller.defaults,options);var $context=$(selector);var currentIndex=0;var $slides=$getSlideGroup().children().clone();var timeouts={'transitionend':null,'resize':null,'autoadvance':null};var callbacks={'next':null,'prev':null,'display':null,'onautoadvanceafter':null,'onautoadvancebefore':null};$(window).bind('resize',function(){removeTransitions();clearTimeout(timeouts.resize);timeouts.resize=setTimeout(transitionEnd,10);});if(typeof window.onorientationchange!='undefined'){window.onorientationchange=function(){removeTransitions();clearTimeout(timeouts.resize);timeouts.resize=setTimeout(transitionEnd,10);};}tagSlides();$context.prepend('<div style="position:absolute; top:0px; width:100%;"><div id="centredScroller-left-measure" style="width:'+getItemWidth()+'px; margin:0 auto;"></div></div>');displaySlides();addTransitions();startAutoAdvance(settings.autoAdvance);$.extend(self,{getIndex:function(){return currentIndex;},display:function(index,callback){stopAutoAdvance();display(index,callback);timeouts.autoadvance=setTimeout(startAutoAdvance,settings.interactionDelay);},next:function(callback){stopAutoAdvance();next(callback);timeouts.autoadvance=setTimeout(startAutoAdvance,settings.interactionDelay);},prev:function(callback){stopAutoAdvance();prev(callback);timeouts.autoadvance=setTimeout(startAutoAdvance,settings.interactionDelay);},startAutoAdvance:function(time){startAutoAdvance(time);},stopAutoAdvance:function(){stopAutoAdvance();},onAutoAdvanceBefore:function(callback){callbacks.onautoadvancebefore=null;if(jQuery.isFunction(callback)){callbacks.onautoadvancebefore=callback;}},onAutoAdvanceAfter:function(callback){callbacks.onautoadvanceafter=null;if(jQuery.isFunction(callback)){callbacks.onautoadvanceafter=callback;}},cssTransitionsAvailable:function(){return cssTransitionsAvailable();}});function tagSlides(){$slides.each(function(index){$(this).attr(settings.dataAttr,index);$(this).removeClass(settings.currentClass);});}function $getSlideGroup(){return $context.children(settings.slideGroup);}function getItemWidth(){return $getSlideGroup().children().eq(0).width();}function getDisplayItemsCount(){var itemWidth=getItemWidth();var sWidth=$context.width();var displayItemsCount=Math.ceil(sWidth/itemWidth);displayItemsCount+=(displayItemsCount%2===0)?1:0;displayItemsCount+=2;return displayItemsCount;}function displaySlides(){var itemWidth=getItemWidth();$('#centredScroller-left-measure').width(itemWidth);var margin=$('#centredScroller-left-measure').offset().left-$context.offset().left;var displayItemsCount=getDisplayItemsCount();var extra=Math.floor(displayItemsCount/2);var prev=getPrevIndex(currentIndex);var next=getNextIndex(currentIndex);var $itemsClone=$getSlideGroup().clone();$itemsClone.children().remove();$itemsClone.append($slides.eq(prev).clone());$itemsClone.append($slides.eq(currentIndex).clone());$itemsClone.append($slides.eq(next).clone());for(var i=0;i<extra-1;i++){prev=getPrevIndex(prev);$itemsClone.prepend($slides.eq(prev).clone());}for(var j=0;j<extra-1;j++){next=getNextIndex(next);$itemsClone.append($slides.eq(next).clone());}$('['+settings.dataAttr+'='+currentIndex+']',$itemsClone).addClass(settings.currentClass);$itemsClone.css({'width':itemWidth*displayItemsCount,'left':margin-itemWidth*extra});$getSlideGroup().replaceWith($itemsClone);}function animateTo(newLeft,callbackIndex){addTransitions();$getSlideGroup().children().removeClass(settings.currentClass);var bugFixCurrentLeft=$getSlideGroup().position().left;if(cssTransitionsAvailable()){$getSlideGroup().css({'left':newLeft});timeouts.transitionend=setTimeout(function(){transitionEnd(callbackIndex);},settings.duration);}else
{$getSlideGroup().animate({'left':newLeft},settings.duration,'swing',function(){transitionEnd(callbackIndex);});}}function transitionEnd(callbackIndex){clearTimeout(timeouts.transitionend);timeouts.transitionend=null;removeTransitions();displaySlides();if(jQuery.isFunction(callbacks[callbackIndex])){callbacks[callbackIndex].apply(self);}}function addTransitions(){if(cssTransitionsAvailable()){$getSlideGroup().css({'-moz-transition':'left '+settings.duration+'ms ease-in-out','-o-transition':'left '+settings.duration+'ms ease-in-out','-webkit-transition':'left '+settings.duration+'ms ease-in-out','transition':'left '+settings.duration+'ms ease-in-out'});}}function removeTransitions(){$getSlideGroup().css({'-moz-transition':'left 0s linear','-o-transition':'left 0s linear','-webkit-transition':'left 0s linear','transition':'left 0s linear'});}function cssTransitionsAvailable(){var s=document.createElement('slideshow'),s_style=s.style;if(typeof s_style.transitionProperty!=='undefined'||typeof s_style.WebkitTransitionProperty!=='undefined'||typeof s_style.MozTransitionProperty!=='undefined'||typeof s_style.OTransitionProperty!=='undefined'||typeof s_style.msTransitionProperty!=='undefined'||typeof s_style.KhtmlTransitionProperty!=='undefined'){return true;}return false;}function display(index,callback){var $slideGroup=$getSlideGroup();if(index>$slideGroup.children().length-1){return;}var $current=$('.'+settings.currentClass,$slideGroup);if(parseInt($current.attr(settings.dataAttr),10)==index){return;}var $visibleSlides=$('['+settings.dataAttr+'='+index+']',$slideGroup);if($visibleSlides.length>0){var triggered=false;$visibleSlides.each(function(){if($(this).next().hasClass(settings.currentClass)){prev(callback);triggered=true;return;}else if($(this).prev().hasClass(settings.currentClass)){next(callback);triggered=true;return;}});if(triggered){return;}if($visibleSlides.eq(0).index()>$current.index()){var displayItemsCount=getDisplayItemsCount();var extra=Math.floor(displayItemsCount/2);var padTotal=extra-($slideGroup.children().length-1-$visibleSlides.eq(0).index());var itemWidth=getItemWidth();var newLeft=$getSlideGroup().position().left-(($visibleSlides.eq(0).index()-$current.index())*itemWidth);padRight(padTotal);callbacks.display=callback;currentIndex=index;animateTo(newLeft,'display');}else
{var displayItemsCount=getDisplayItemsCount();var extra=Math.floor(displayItemsCount/2);var padTotal=extra-$visibleSlides.eq(0).index();var newLeft=$getSlideGroup().position().left;padLeft(padTotal);callbacks.display=callback;currentIndex=index;animateTo(newLeft,'display');}return;}if(index>currentIndex){var lastIndex=parseInt($slideGroup.children().last().attr(settings.dataAttr),10);var displayItemsCount=getDisplayItemsCount();var extra=Math.floor(displayItemsCount/2);var padTotal=extra+(index-lastIndex);var itemWidth=getItemWidth();var newLeft=$getSlideGroup().position().left-(padTotal*itemWidth);padRight(padTotal);callbacks.display=callback;currentIndex=index;animateTo(newLeft,'display');}else
{var lastIndex=parseInt($slideGroup.children().first().attr(settings.dataAttr),10);var displayItemsCount=getDisplayItemsCount();var extra=Math.floor(displayItemsCount/2);var padTotal=extra+(lastIndex-index);var newLeft=$getSlideGroup().position().left;padLeft(padTotal);callbacks.display=callback;currentIndex=index;animateTo(newLeft,'display');}}function next(callback){var itemWidth=getItemWidth();var newLeft=$getSlideGroup().position().left-itemWidth;callbacks.next=callback;currentIndex=getNextIndex(currentIndex);animateTo(newLeft,'next');}function prev(callback){var itemWidth=getItemWidth();var newLeft=$getSlideGroup().position().left+itemWidth;callbacks.prev=callback;currentIndex=getPrevIndex(currentIndex);animateTo(newLeft,'prev');}function autoAdvance(){if(jQuery.isFunction(callbacks.onautoadvancebefore)){callbacks.onautoadvancebefore.apply(self);}var itemWidth=getItemWidth();var newLeft=$getSlideGroup().position().left-itemWidth;currentIndex=getNextIndex(currentIndex);animateTo(newLeft,'onautoadvanceafter');}function startAutoAdvance(time){clearInterval(timeouts.autoadvance);var interval=settings.autoAdvance;if(typeof time!='undefined'){interval=settings.autoAdvance;}if(interval>99){timeouts.autoadvance=setInterval(autoAdvance,settings.autoAdvance);}}function stopAutoAdvance(){clearInterval(timeouts.autoadvance);timeouts.autoadvance=null;}function getNextIndex(index){return(index+1>=$slides.length)?0:index+1;}function getPrevIndex(index){return(index-1<0)?$slides.length-1:index-1;}function padRight(total){if(total<=0){return;}var $slideGroup=$getSlideGroup();var itemWidth=getItemWidth();var lastIndex=parseInt($slideGroup.children().last().attr(settings.dataAttr),10);var nextIndex=getNextIndex(lastIndex);for(var i=0;i<total;i++){$slideGroup.append($slides.eq(nextIndex).clone());nextIndex=getNextIndex(nextIndex);}$slideGroup.css({'width':$slideGroup.width()+total*itemWidth});}function padLeft(total){if(total<=0){return;}var $itemsClone=$getSlideGroup().clone();var oldLeft=$getSlideGroup().position().left;var itemWidth=getItemWidth();var lastIndex=parseInt($itemsClone.children().first().attr(settings.dataAttr),10);var prevIndex=getPrevIndex(lastIndex);for(var i=0;i<total;i++){$itemsClone.prepend($slides.eq(prevIndex).clone());prevIndex=getPrevIndex(prevIndex);}$itemsClone.css({'width':itemWidth*$itemsClone.children().length,'left':oldLeft-itemWidth*total});$getSlideGroup().replaceWith($itemsClone);}}$.fn.centredScroller=function(options){var api=null;this.each(function(){api=new CentredScroller(this,options);});return api;};$.fn.centredScroller.defaults={autoAdvance:0,duration:400,interactionDelay:5000,currentClass:'current',slideGroup:'.slides',dataAttr:'data-centredscroller-index'};})(jQuery);

