/*
 *	jQuery aCaroussel - where 'A' stands for Accessible.
 *  
 *	@handcrafted by 	Jeroen Hulscher (@JeroenHulscher)
 *  @thanks to 			Boy van Amstel (@BoyvanAmstel), Maarten Wolzak (@maarten)
 
 *	@version 			1.1
 */

jQuery.aCarousel = 
{
	build : function(options) {

		try {
		 
			// Default settings
			var defaults = {
				carousel: "li",
				activeClass: "active",
				controlClass: "aCarousel-controls",
				currentClass: "aCarousel-current",
				totalClass: "aCarousel-total",
				timeout: 5500,
				fadeTime: 300,
				currentIndex: 0,
				animationType: null,
				contentClass: "block"
			}
			// Move to options
			var options = jQuery.extend(defaults, options);
			var object = this;
			var carouselItems = jQuery(object).find(options.carousel).size()+1;
			
			// Accessibility overwrite and creation of aCarousel controls
			jQuery(object).addClass("activated").append('<div class="' + options.controlClass + '"></div>');
			for(i=1; i < carouselItems; i++){ jQuery('.' + options.controlClass).append('<a href="#" class="item' + i + '"><span class="hidden">item'+ i +'</span></a>'); }
			
			jQuery(object).find(options.carousel + ':first').addClass(options.activeClass);
			jQuery('.' + options.controlClass).find('a:first').addClass(options.activeClass);
			
			jQuery(object).find(options.carousel).hide();
			jQuery(object).find(options.carousel + "." + options.activeClass).show();
			
			// Set all items on current spot
			jQuery(options.carousel).each(function(){
				if(!jQuery(this).hasClass(options.activeClass)){
					//jQuery(this).find("." + options.contentClass).css('top', '-150px');
					jQuery(this).find("img").css('left','-10px');
				}
			}); 	
			
	        jQuery(object).everyTime(options.timeout, 2, function() {
				jQuery.aCarousel.changeObjects(object, options);	
	        });
	        
	        // When hovering controls
			jQuery(object).find("." + options.controlClass).hover(function() {
				jQuery(object).stopTime(2);
			}, function() {
				jQuery(object).everyTime(options.timeout, 2, function() {
					jQuery.aCarousel.changeObjects(object, options);
				});
			});
	       
			jQuery(object).find("." + options.controlClass + " a").click(function() {
				
				jQuery(object).stopTime(2);
				
				var tempItem = jQuery(this).attr('class').substring(4,5)-1;
		     	var selectedItem = jQuery(object).find(options.carousel).eq(tempItem);
	       		var items = jQuery(object).find(options.carousel); 		
	         	var currentIndex = options.currentIndex;	
	         	var currentItem = jQuery(object).find(options.carousel).find(options.activeClass);
	         	jQuery(items).eq(currentIndex).find("." + options.contentClass).animate({ top: '-150' }, options.fadeTime);
				jQuery(items).eq(currentIndex).find("img").animate({ opacity: 0, left: '-10' }, options.fadeTime);
		 		jQuery(items).eq(currentIndex).fadeOut(options.fadeTime).removeClass(options.activeClass);
				jQuery(object).find("." + options.controlClass + " a").eq(currentIndex).css('background', '#fff');
				jQuery(this).css('background', '#ff4400');
				options.currentIndex = tempItem;
		
				jQuery(object).find("." + options.controlClass + " a." + options.activeClass).removeClass(options.activeClass);		
				jQuery(object).find(options.carousel).eq(tempItem).fadeIn(500).addClass(options.activeClass);
 				jQuery(object).find(options.carousel).eq(tempItem).find("." + options.contentClass).animate({ top: '30' }, 500);
 		 		jQuery(object).find(options.carousel).eq(tempItem).find("img").animate({ opacity: 100, left: '0' }, 500);
 		 		
				return false;
			});
			return this;
		}
		catch(err) {
			return false;
		}
	},
	changeObjects : function(object, options) {
		var items = jQuery(object).find(options.carousel); 			
		var amountItems = jQuery(object).find(options.carousel).size();
		var currentIndex = options.currentIndex;	
		
		switch(options.animationType){
			default:  
		 		jQuery(object).find("." + options.controlClass + " a").css('background','#fff');
				
		 		jQuery(items).eq(currentIndex).find("." + options.contentClass).animate({ top: '-150' }, options.fadeTime);
				jQuery(items).eq(currentIndex).find("img").animate({ opacity: 0, left: '-10' }, options.fadeTime);
		 		jQuery(items).eq(currentIndex).fadeOut(options.fadeTime).removeClass(options.activeClass);

				jQuery(object).find("." + options.controlClass + " a." + options.activeClass).removeClass(options.activeClass);
				
				if (currentIndex >= amountItems - 1) { currentIndex = 0; } else { currentIndex = currentIndex + 1; }
		 		          	
				jQuery(items).eq(currentIndex).fadeIn(500).addClass(options.activeClass);
				jQuery(items).eq(currentIndex).find("." + options.contentClass).animate({ top: '30' }, 500);
		 		jQuery(items).eq(currentIndex).find("img").animate({ opacity: 100, left: '0' }, 500);
		 		
				options.currentIndex = currentIndex;
				jQuery(object).find("." + options.controlClass + " a").eq(currentIndex).css("background", "#ff4400");
			break;
		} 
	}
};

jQuery.fn.extend({ aCarousel: jQuery.aCarousel.build });	

jQuery.fn.extend({
	everyTime: function(interval, label, fn, times, belay) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, times, belay);
		});
	},
	everyTimeX: function(intervalX, labelX, fnX, timesX, belayX) {
		return this.each(function() {
			jQuery.timer.add(this, intervalX, labelX, fnX, timesX, belayX);
		});
	},
	oneTime: function(interval, label, fn) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, 1);
		});
	},
	stopTime: function(label, fn) {
		return this.each(function() {
			jQuery.timer.remove(this, label, fn);
		});
	},
	stopTimeX: function(labelX, fnX) {
		return this.each(function() {
			jQuery.timer.remove(this, labelX, fnX);
		});
	}
});

jQuery.extend({
	timer: {
		guid: 1,
		global: {},
		regex: /^([0-9]+)\s*(.*s)?$/,
		powers: {
			'ms': 1,
			'cs': 10,
			'ds': 100,
			's': 1000,
			'das': 10000,
			'hs': 100000,
			'ks': 1000000
		},
		timeParse: function(value) {
			if (value == undefined || value == null)
				return null;
			var result = this.regex.exec(jQuery.trim(value.toString()));
			if (result[2]) {
				var num = parseInt(result[1], 10);
				var mult = this.powers[result[2]] || 1;
				return num * mult;
			} else {
				return value;
			}
		},
		add: function(element, interval, label, fn, times, belay) {
			var counter = 0;
			if (jQuery.isFunction(label)) {
				if (!times) 
					times = fn;
				fn = label;
				label = interval;
			}
			interval = jQuery.timer.timeParse(interval);
			if (typeof interval != 'number' || isNaN(interval) || interval <= 0)
				return;
			if (times && times.constructor != Number) {
				belay = !!times;
				times = 0;
			}
			times = times || 0;
			belay = belay || false;
			if (!element.$timers) 
				element.$timers = {};
			if (!element.$timers[label])
				element.$timers[label] = {};
			fn.$timerID = fn.$timerID || this.guid++;
			var handler = function() {
				if (belay && this.inProgress) 
					return;
				this.inProgress = true;
				if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
					jQuery.timer.remove(element, label, fn);
				this.inProgress = false;
			};
			handler.$timerID = fn.$timerID;
			if (!element.$timers[label][fn.$timerID]) 
				element.$timers[label][fn.$timerID] = window.setInterval(handler,interval);
			if ( !this.global[label] )
				this.global[label] = [];
			this.global[label].push( element );
		},
		remove: function(element, label, fn) {
			var timers = element.$timers, ret;
			if (timers) {	
				if (!label) {
					for ( label in timers )
						this.remove(element, label, fn);
				} else if ( timers[label] ) {
					if ( fn ) {
						if ( fn.$timerID ) {
							window.clearInterval(timers[label][fn.$timerID]);
							delete timers[label][fn.$timerID];
						}
					} else {
						for ( var fn in timers[label] ) {
							window.clearInterval(timers[label][fn]);
							delete timers[label][fn];
						}
					}
					for ( ret in timers[label] ) break;
					if ( !ret ) {
						ret = null;
						delete timers[label];
					}
				}
				for ( ret in timers ) break;
				if ( !ret ) 
					element.$timers = null;
			}
		}
	}
});
if (jQuery.browser.msie)
	jQuery(window).one("unload", function() {
		var global = jQuery.timer.global;
		for ( var label in global ) {
			var els = global[label], i = els.length;
			while ( --i )
				jQuery.timer.remove(els[i], label);
	}
});
	

