

(function($){  

	var automationID; /* Thread Declaration */

 	$.fn.tickerTicker = function() {  
  
		var defaults = {  
			intervalLength : 5000,
			fadeIntervalLength : 2400, 
			fadeOut : 30,
			fadeIn : 15,
			bufferingFactor : 5,
			incrementCounter : 0,
			incrementCount : 0,
			cycleState : 0
		  };  
	
	  	var node = $.extend(defaults);    

		/* Return Anonymous Function Over Node */
    	return this.each(function() {  
 
		$.tickerTickerUI = {
			init: function(n){ 

				$.tickerTickerUI.refineInitialSequence();
				$.tickerTickerUI.prepareCycleData();

				$.incrementCounter = $("#listing > *").length;

				Automata();
				$("#listing").mouseover(function(){ clearInterval(automationID); });
				$("#listing").mouseout(function(){ Automata(); });

			},
			refineInitialSequence: function () {

				try {

					var _bufferingFactor = $.bufferingFactor;
					var _materials = $("#listing").html();
					var _newMaterials = new String("");
					
					for ( var x = 0 ; x < _bufferingFactor ; x++) {
						_newMaterials += _materials;
					} // End For-Loop

					$("#listing").html(_newMaterials);

				}
				catch(e) { }
				
			},
			/* Prepare Datablock for Reconstruction Method */
			prepareCycleData: function () {

				try {
				
					var _materials = $("#listing").html();
					$("#datablock").html(_materials);
					
				}
				catch(e) { }
				
			},
			fader: function() {
			
				var fadeIn = $.fadeIn;
				var fadeOut = $.fadeOut;
				var fadeIntervalLength = $.fadeIntervalLength;
					
				var In = parseInt($("#listing").css("top")) - fadeIn;
				var Out = parseInt($("#listing").css("top")) - fadeOut;
				
				/* Debugging */
				$("#show").click(function () {
		      		var n = $("#listing").queue("fx");
		      		$("#data").text("Queue length is: " + n.length);
		    		});
		    		
				$("#listing").animate({ opacity: 0, top: In }, fadeIntervalLength );	
				$("#listing").animate({ opacity: 1, top: Out }, fadeIntervalLength );
				$("#data").text( $("#listing").css("top") );
			
				/********************************/

				/* Resetting Condition */
				//var limit = $.incrementCounter;
				var limit;
				($.cycleState==0) ? limit = $.incrementCounter : limit = $.incrementCounter + 1 ;

				if ( $.incrementCount > limit ) {

					$.tickerTickerUI.reconstruct();

					} // End If

				$.incrementCount++;
			
			},
			reconstruct: function() {

				/* Load Proto Block */
				var datablock = $("#datablock").html();
		
				/* Clean Out Existing Block */
				$("#ticker").empty();
		
				/* Reset List */
				$("#ticker").append("<ul id=\"listing\" style=\"top:25px\">");
				$("#listing").append(datablock);
				$("#listing").append("<li>&nbsp;</li>");
				$("#ticker").append("</ul>");

				/* Clear Increment */
				$.incrementCount = 0;
				$.incrementCounter = $("#listing > *").length;

				/* Adjust Logic Using Cycle State */
				CycleState();

				/* Renew Event Handlers (necessary here) */
				$("#listing").mouseover(function(){
					clearInterval(automationID);
					});
				$("#listing").mouseout(function(){
					Automata();
					});

			} // End Method
				 
	    } // End Object Literal Class Definition

		/**********************************************/

 		var Automata = function () {
			fadeFunc = $.tickerTickerUI.fader;
			automationID = setInterval( fadeFunc, node.intervalLength );
			} // End
			
		var CycleState = function () {
			if( $.cycleState == 0 ) $.cycleState = 1; 
			} // End

		$.tickerTickerUI.init(node);
		
	 	}); // End Each-Main 

 	} // End Plugin
 	
})(jQuery);  


$(document).ready(function() {  

	$('#ticker').tickerTicker();  

});

