(function($){

$.fn.ebw_rotator =
		
		function( settings ){
		
			settings = {
				className		: settings.className	|| 'ebw-rotator',
				selector		: settings.selector		|| 'a',
				nav					: {
						show		: settings.nav.show		|| false,
						arrows	: settings.nav.arrows	|| false,
						cycle		: settings.nav.cycle	|| false
				},
				interval		: settings.interval		|| 0,
				fadeOut			: settings.fadeOut		|| 200,
				fadeIn			: settings.fadeIn			|| 450
			}
			
			var self = this;
			var thisID = $(this).attr("id");
			var thisTag = this.get(0).tagName;
			var descd = '> ' + settings.selector; // make sure only direct descendants are rotated
			var i = 0; // intializeRotator
			var start; // interval
			var reset; // timeout to restart interval;

			if ( thisTag != "DIV" ) {
					$(self).css({ "display" : "none"  });
			    return alert("From 'jquery.rotator.js' - Banner must be contained within a <div>.");
			} else if ( thisID == "" ) {
			    return alert("From 'jquery.rotator.js' - Rotating banner's id undefined. Please use a unique to run rotating banner.");
			} else if ( $(descd,self).size() === 0 ) {
					return alert("From 'jquery-rotator.js' - No <"+settings.selector+"> elements found within #"+thisID+".");
			} else {
				runBannerCode();				
			}

			// begin - Run banner code
			//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
			
			function runBannerCode(){
	
				//hide other banners
				$(descd,self).hide().eq(0).show();
				
				$(self).addClass( settings.className );
				
				
				var numberOfBanners = $(descd,self).size();
				var bannerWidth = $(descd+':first-child img',self).attr("width");
				var bannerHeight = $(descd+':first-child img',self).attr("height");

				//Generate Navigation

				( settings.nav.show ) ? generateNav() : null; // do nothing
				
				function generateNav(){
				
					$(self).append('\n<ol>\n</ol>');
					
					for( var i=0; i < numberOfBanners; i++ ) {
					
						$('> ol',self).append('\n<li><a href="javascript:void(0)">&bull;</a></li>');
					}
					$('> ol li a:eq(0)',self).addClass('on');
					
					if( settings.nav.arrows ) {
						$(self).append('\n<a href="javascript:void(0);" class="arrow prev">&lt;</a>');
						$(self).append('\n<a href="javascript:void(0);" class="arrow next">&gt;</a>');
						
						if( !settings.nav.cycle ) {
						
							$('> a.prev',self).hide();
						}
					}
				
				}
				
					$("> ol li a",self).click(
						
						function(){
	
							var thisPosition = $('> ol li a',self).index(this);
	
							if ( thisPosition == i ){
			
								return clearInterval(start);
							
							} else {
	
								clearInterval(start);
							  
							  doRotation(thisPosition);
							}
						}
					);
					
					$('a.arrow').click(
					
						function(e){
						
							clearInterval(start);
					  	
							var n = i;
							
							if( $(this).hasClass('prev') )
								n = ( --n < 0 ) ? numberOfBanners - 1 : n;
							else if( $(this).hasClass('next') )
								n = ( ++n < numberOfBanners ) ? n : 0;
								
							doRotation(n);
						}
					);
			
				
				function doRotation(int){
				
						$(descd,self).stop(true,true).eq(i).fadeOut( settings.fadeOut,
						
							function(){
							
								i = ( int < numberOfBanners ) ? int : 0;
								
								$(descd,self).eq(i).fadeIn( settings.fadeIn );
								$("> ol li a",self).removeClass("on").eq(i).addClass("on");
								
								if( !settings.nav.cycle ) {
								
									$('> a.arrow',self).show();
								
									if( i == 0 ) {
										$('> a.prev',self).hide();
									} else if( i == ( numberOfBanners - 1 ) ) {
										$('> a.next',self).hide();
									}
								}
							}
						);
				}
								
				if( settings.interval > 0 )
					start = setInterval( function() { doRotation(i+1); }, ( settings.interval + settings.fadeOut + settings.fadeIn ) );
				
			}

			// end - Run banner code

		}

})(jQuery);

