// zocoTicker - jQuery ticker
// copyright 2009 Elaine Montoya, zocoloco studios - www.zocoloco.com
//
// version 1.0
// date 2009-03-02
//
//
// requires jQuery//
//
// usage:
//		<script type="text/javascript" charset="utf-8">
//			$(document).ready(function(){
//				
//				$("ul").zocoTicker("init",{
//					delay:5000, 					// delay between ticker items
//					speed:500, 						// animation speed
//					tickerdiv:'##ticker',	// ticker div id (use hash mark)
//					selection:'li',				// sub-selection to use for each element
//					animations: {
//						_in:'fadeIn',				// fade in animation
//						out:'fadeOut'				// fade out animation
//					},
//					callbacks: {
//						_in:function(ul) {	// called when fade in starts
//						},
//						out:function(ul) {	// called when fade out starts
//						},
//						init:function(ul) { // called when ticker is initialized
//						}
//					}
//					
//				}).zocoTicker("loop") 			// set ticker to loop from start
//				
//			});
//		</script>
//    
//			<div id="ticker">
//				</cfoutput><con:container label="#stobj.objectID#_tickerItems" defaultMirrorLabel="Global Ticker Items"><cfoutput>
//      </div>
//
(function($){
	
	defaults = {
		speed:500,
		delay:5000,
		linked:true,
		tickerdiv:"#ticker",
		selection:"li"
	};
		
	callbacks = {
		_in:false,
		out:false,
		init:false
	};
	
	animations = {
		_in:"fadeIn",
		out:"fadeOut"
	};
	
	zocoTicker = {
		init:function(collection, args) {
			settings = $.extend(defaults, {});
			settings.animations = animations;
			settings.callbacks = callbacks;
						
			if(args) {
				settings = $.extend(settings, args);
				settings.animations = $.extend(settings.animations, args.animations);
				settings.callbacks = $.extend(settings.callbacks, args.callbacks);
			}
			
			return collection.each(function(n, element){ 
				element.zocoTicker = {
					looping:false,
					current:false,
					settings:settings,
					animating:false
				};
			
				$(element.zocoTicker.settings.selection,element.zocoTicker.settings.tickerdiv).each(function(n, item){
					if(!element.zocoTicker.current) {
						element.zocoTicker.current = item;

					} else {
						$(item).hide();
					}
				});
				
				zocoTicker._callback(element, "init");
			});
		},
		
		_callback:function(element, name) {
			if(element.zocoTicker.settings.callbacks[name]) {
				element.zocoTicker.settings.callbacks[name](element);
			}
		},
		
		_change:function(element, next) {
			if(element.zocoTicker.current != next && !element.zocoTicker.animating) {
				element.zocoTicker.animating = true;
				
				if(element.zocoTicker.current) {
					eval("jQuery(element.zocoTicker.current)."+element.zocoTicker.settings.animations.out+"(element.zocoTicker.settings.speed);");
					zocoTicker._callback(element, "out");
				}
				
				element.zocoTicker.current = next;
				
				setTimeout(function(){
						eval("jQuery(element.zocoTicker.current)."+element.zocoTicker.settings.animations._in+"(element.zocoTicker.settings.speed);");
						zocoTicker._callback(element, "_in");
						setTimeout(function(){element.zocoTicker.animating = false;}, element.zocoTicker.settings.speed);
					}, element.zocoTicker.settings.speed+10);
			}
		},
		
		_loop:function(element, now) { 		

			return function(){
				if(element.zocoTicker.looping) {
					$(element).zocoTicker("next");
				}
			};
		},
		
		
		next:function(collection) {
			return collection.each(function(n, element){
				next = false;
				first = false;
				step = 0;
				
				$(element.zocoTicker.settings.selection,element.zocoTicker.settings.tickerdiv).each(function(n, item){
					if(n === 0) {
						first = item;
					}
					if(item == element.zocoTicker.current && step === 0) {
						step++;
					} else if(step == 1) {
						next = item;
						step++;
					}
				});
				
				if(!next && element.zocoTicker.settings.linked) {
					next = first;
				}
				
				if(next) {
					zocoTicker._change(element, next);
				}
			});
		},
				
		loop:function(collection) {
			return collection.each(function(n, element){
				zocoTicker.start(collection);
				setInterval(zocoTicker._loop(element), element.zocoTicker.settings.delay);
			});
		},
				
		start:function(collection) {
			return collection.each(function(n, element){
				element.zocoTicker.looping = true;
			});
		}
	};
	
	$.fn.zocoTicker = function(call, args) {
		return zocoTicker[call](this, args);
	};
	
})(jQuery);
