/**
 *  Twitter tweet rotator
 *  Author:     mauvm
 *  Required:   jQuery 1.5 or higher
 *  Date:       7/3/2011
 *
 *  @TODO       Convert to jQuery plugin
 **/
$(function(){
	var twitterRotater = {
		// Configuration
		rotateSpeed: 	5000,
		fadeSpeed: 		1500,
		delay:			1000,
		
		// Variables
		$twitter: 		null,
		$twitterItems: 	null,
		$twitterNav: 	null,
		itemLength: 	null,
		timerID: 		null,
		
		// Functions
		init:			function() {
			twitterRotater.$twitter 		= $('ul#twitter');
			twitterRotater.$twitterItems 	= $('ul#twitter li');
			twitterRotater.$twitterNav 		= $('span#twitterNav');
			twitterRotater.itemLength		= twitterRotater.$twitterItems.length;
			
			if ( $.browser.msie && $.browser.version.substr(0,1) < 9 ) {
				// IE fix *sigh*
				twitterRotater.fadeSpeed 	= 0;
				twitterRotater.delay 		= 0;
			}	
			
			if ( twitterRotater.itemLength > 0 ) {
				// Initialize
				twitterRotater.$twitterItems.css('display', 'block').hide();
				twitterRotater.timerID = setTimeout( twitterRotater.rotate, twitterRotater.rotateSpeed );
				twitterRotater.rotate();
				
				// Navigation
				if ( twitterRotater.itemLength > 1 )
				{
					// Build navigation HTML
					for( var i = 1; i <= twitterRotater.itemLength; ++i ){
						twitterRotater.$twitterNav.append('<span class="twitterNavLink '+ ( i == 1 ? 'active' : '' ) +'">' + i + '</span>');
					}
					
					twitterRotater.$twitterNav.find('span.twitterNavLink').bind('click', function(){
						if ( twitterRotater.timerID !== null )
							clearTimeout( twitterRotater.timerID );
						
						// Jump to specific item
						twitterRotater.timerID = setTimeout( twitterRotater.rotate, twitterRotater.rotateSpeed );
						twitterRotater.rotate( null, $(this).index() );	
					});
				}
			}
		},
		rotate:			function( FFFix, index ) {
			if ( twitterRotater.timerID !== null )
				clearTimeout( twitterRotater.timerID );
			
			// Clear active nav link
			twitterRotater.$twitterNav.find('span.twitterNavLink').removeClass('active');
			
			// Rotate
			if ( twitterRotater.itemLength > 1 ) {
				if ( typeof(index) != 'undefined' && index >= 0 ) {
					// Jump to given index
					twitterRotater.$twitter
						.find('> li:visible')
							.stop( true, true )
							.fadeOut( twitterRotater.fadeSpeed )
						.parent()
						.find('> li:eq('+ index +')')
							.delay( twitterRotater.delay )
							.stop( true, true )
							.fadeIn( twitterRotater.fadeSpeed );
				} else if ( twitterRotater.$twitter.find('> li:last').is(':visible') ) {
					// Back to first item
					index = twitterRotater.$twitter
								.find('> li:visible')
									.stop( true, true )
									.fadeOut( twitterRotater.fadeSpeed )
								.parent()
									.find('> li:first')
									.delay( twitterRotater.delay )
									.stop( true, true )
									.fadeIn( twitterRotater.fadeSpeed )
									.index();
				} else if ( twitterRotater.$twitter.find('> li:visible').length > 0 ) {
					// Go to next item
					index = twitterRotater.$twitter
								.find('> li:visible')
									.stop( true, true )
									.fadeOut( twitterRotater.fadeSpeed )
								.next()
									.delay( twitterRotater.delay )
									.stop( true, true )
									.fadeIn( twitterRotater.fadeSpeed )
									.index();
				} else {
					// First item
					index = twitterRotater.$twitter
								.find('> li:first')
									.stop( true, true )
									.fadeIn( twitterRotater.fadeSpeed )
									.index();
				}
				
				// New timeout
				twitterRotater.timerID = setTimeout ( twitterRotater.rotate, twitterRotater.rotateSpeed );
			} else {
				// Only fade in single item
				index = $twitter.find('> li:first').fadeIn( twitterRotater.fadeSpeed ).index();
			}
			
			// Set active nav link
			twitterRotater.$twitterNav.find('span.twitterNavLink:eq('+ index +')').addClass('active');
		}
	};
	
	// Single tweet fix
	var $tweets = $('ul#twitter li');
	if ( $tweets.length > 1 )
		twitterRotater.init();
	else
		$tweets.filter(':first').show();
		
});
