/*!
 * jquery.ql-infinite-carousel.js
 * @author Thomas Fersterer
 * @copyright Quadratliter | Werbung & Design - Thomas Fersterer
 * @link {http://www.quadratliter.at}
 * Date: 21-03-2011
 * 
 */

;(function( $ ){
	
	$.fn.qlInfiniteCarousel = function(options) {
		return this.each(function() {   
            $.qlInfiniteCarousel(this, options);
        });
	};
	
	$.qlInfiniteCarousel = function(container, options) {
		var settings = {
			// next: '#next',
			// prev: '#prev',
			style: 'slide',
			speed: 1000, // animation speed
			easing: '', // animation easing
			autoplay: false, // set to true for autoplay
			pause: 4000, // pause between slides
			axis: 'x', // which direction should be scrolled
			markActive: false
		};
		if(options) {
			$.extend(settings, options);
		}
		var sliderList = $(container).children()[0];
		
		if(settings.children === null) {
			var elements = $(sliderList).children();
		}
		else {
			var elements = $(sliderList).children(settings.children);
		}
		
		var isAnimating = false;
		var numElements = elements.length;
		var mouseOver = false;
		
		if(numElements > 1) {
			var firstElementOnViewport = 1;
			var firstElementWidth = elemWidth(elements[0]);
			var firstElementHeight = elemHeight(elements[0]);
			var viewportWidth = $(container).width();
			var viewportHeight = $(container).height();
			var shownInViewport = countElemInViewport();
			/*console.log($(container));
			console.log(viewportHeight);
			console.log(firstElementHeight);
			console.log(shownInViewport);*/
			
			$(container).bind('next.qlInfiniteCarousel', function() {
				showNext();
			});
			$(container).bind('prev.qlInfiniteCarousel', function() {
				showPrev();
			});
			
			if (settings.next) {
				$(settings.next).click(function(){
					$(container).trigger('next.qlInfiniteCarousel');
				});
			}
			if (settings.prev) {
				$(settings.prev).click(function(){
					$(container).trigger('prev.qlInfiniteCarousel');
				});
			}
			
			cloneElements();
			chkMouseOver();
			if( settings.autoplay ) {
				initAutoplay();
			}
		}
		
		function elemWidth(e) {
			return $(e).outerWidth("true");
		};
		function elemHeight(e) {
			return $(e).outerHeight("true");
		};
		
		function countElemInViewport() {
			if (settings.axis == 'x') {
				return Math.round(viewportWidth / firstElementWidth);
			}
			else {
				return Math.round(viewportHeight / firstElementHeight);
			}
		};
		
		function cloneElements() {
			if (settings.axis == 'x') {
				$(sliderList).css('width', (numElements + shownInViewport) * firstElementWidth + firstElementWidth*2 + 'px');
			}
			else {
				$(sliderList).css('height', (numElements + shownInViewport) * firstElementHeight + firstElementHeight*2 + 'px');
			}
				
			// for next
			for(var i=0; i<shownInViewport; i++) {
				$(sliderList).append($(elements[i]).clone());
			}
		};
		
		function chkMouseOver() {
			$(sliderList).hover(function(){
				mouseOver = true;
			}, function(){
				mouseOver = false;
			});
		};
		
		function initAutoplay() {
			var intervalId = window.setInterval(showNext, settings.pause);
			
			if (settings.next) {
				$(settings.next).click(function(e){
					if(e.originalEvent) {
						window.clearInterval(intervalId);
					}
				});
			}
			if (settings.prev) {
				$(settings.prev).click(function(e){
					if(e.originalEvent) {
						window.clearInterval(intervalId);
					}
				});
			}
			
			
		};
		
		function addActiveClass(firstElementOnViewport) {
			if( settings.markActive ) {
				var elemKey = firstElementOnViewport-1;
				var currElem = $(elements[elemKey]);
				if( currElem.length < 1 ) { currElem = $(elements[0]); }
				
				//console.log('firstViewport: '+firstElementOnViewport+' // length: '+currElem.length+' // title: '+currElem.find('img').attr('title'));
				$(elements).removeClass('active');
				
				currElem.addClass('active');
				$(container).trigger('setActive.qlInfiniteCarousel');
			}
		};
		
		function showNext() {
			if( settings.autoplay && mouseOver==true ) { doAnim = false; }
			else { doAnim = true; }
			
			if( !isAnimating && doAnim ) {
				$(container).trigger('showNext.qlInfiniteCarousel');
				
				if(firstElementOnViewport > numElements) {
					firstElementOnViewport = 2;
					
					if( settings.axis=='x' ) { $(sliderList).css('left', '0px'); }
					else { $(sliderList).css('top', '0px'); }
				}
				else {
					firstElementOnViewport++;
				}
				addActiveClass(firstElementOnViewport);
				
				move('next');
			}
		};
		
		function showPrev() {
			if( settings.autoplay && mouseOver==true ) { doAnim = false; }
			else { doAnim = true; }
			
			if( !isAnimating && doAnim ) {
				$(container).trigger('showPrev.qlInfiniteCarousel');
				
				if(firstElementOnViewport == 1) {
					firstElementOnViewport = numElements;
					
					if( settings.axis=='x' ) { $(sliderList).css('left', '-'+ numElements * firstElementWidth +'px'); }
					else { $(sliderList).css('top', '-'+ numElements * firstElementHeight +'px'); }
				}
				else {
					firstElementOnViewport--;
				}
				addActiveClass(firstElementOnViewport);
				
				move('prev');
			}
		};
		
		function move(dir){
			if( settings.axis=='x' ) { moveX(dir); }
			else { moveY(dir); }
		};
		function moveX(dir) {
			if( dir=='next' ) { var direction = '-='; }
			else { var direction = '+='; }
			
			$(sliderList).animate({
				left: direction + firstElementWidth,
				queue: true
			}, settings.speed, settings.easing, function(){
				isAnimating = false;
			});
			isAnimating = true;
		};
		function moveY(dir) {
			if( dir=='next' ) { var direction = '-='; }
			else { var direction = '+='; }
			
			$(sliderList).animate({
				top: direction + firstElementHeight,
				queue: true
			}, settings.speed, settings.easing, function(){
				isAnimating = false;
			});
			isAnimating = true;
		};
	};
})( jQuery );
