/*
News ticker plugin (BBC news style)
Bryan Gullan,2007-2009
version 1.2
updated 2009-02-15
http://www.makemineatriple.com/jquery
Use and distrubute freely with this header

Options (defaults shown):
newsList: "#news" 	// assumes unordered list; specify the ul holding the news items
tickerRate: 80 		// time gap between display of each letter (ms)
startDelay: 100 	// delay before first run of the ticker (ms)
loopDelay: 3000 	// time for which full text of each item is shown at end of print-out (ms)
placeHolder1: " |"	// character placeholder shown on even loops
placeHolder2: "_"	// character placeholder shown on odd loops

Sample usage:
$(document).ready(function() {
	var options = {
  		newsList: "#news",
 		startDelay: 10,
 		placeHolder1: " []"
	}
	$().newsTicker(options);
});

for markup as follows:

<ul id="news">
<li><a href="http://www.makemineatriple.com">MakeMineATriple.com</a></li>
<li><a href="http://www.jquery.com">jQuery</a></li>
</ul>

Underline text decoration on the link is not recommended! :-)

*/

(function($) {
  
  var timeout;
	
	function runTicker(settings) {
	  
		if(settings.firstRun == 1){
			currentLength = settings.currentLength;			
			currentItem = $(settings.itemHolder).html();
			settings.firstRun = 0;			
		}
    if(settings.viewNext){
	    currentItem++;
	    $(settings.itemHolder).html(currentItem);
	    settings.viewNext = false;
    }	else if(settings.viewPrev) {
	    currentItem--;
	    $(settings.itemHolder).html(currentItem);
	    settings.viewPrev = false;      
    }
	  if((currentItem >= settings.newsItemCounter + 1)){
			currentItem = 0;
			$(settings.itemHolder).html(String(0));
		}else if(currentItem < 0 ){
			currentItem = settings.newsItemCounter;
			$(settings.itemHolder).html("" + String(settings.newsItemCounter) + "");		
			//alert(currentItem);	
		}
		//alert(settings.newsLinks);
	   
		if($('#pause').html()=="1"){		  		 

  		$(settings.itemHolder).html(String(currentItem));  		  		
  		
  		if(currentLength == 0) {
  		  if(settings.newsLiClasses[currentItem] == "breaking"){
  		    newsLabel = "BREAKING NEWS:";
  		  }else{
  		    newsLabel = "LATEST:";
  		  }
  		  //alert($(settings.itemHolder).html());
  			if(settings.newsLinks[currentItem].length > 0) {
  				$(settings.newsList).empty().append('<li class="' + settings.newsLiClasses[currentItem] + '">' + newsLabel + ' <a href="'+ settings.newsLinks[currentItem] +'" onmouseover="pause(true)" onmouseout="pause()"></a></li>');
  			}
  			else {
  				$(settings.newsList).empty().append('<li class="' + settings.newsLiClasses[currentItem] + '">' + newsLabel + ' <span></span></li>');
  			}
  		}				
  		
  		if( currentLength % 2 == 0) {
  			placeHolder = settings.placeHolder1;
  		}
  		else {
  			placeHolder = settings.placeHolder2;
  		}	
		    clearTimeout(timeout);
  		if( currentLength <= settings.newsItems[currentItem].length + 1) {
  			var tickerText = settings.newsItems[currentItem].substring(0,currentLength);
  			if(settings.newsLinks[currentItem].length > 0) {
  				$(settings.newsList + ' li a').text(tickerText + placeHolder);
  			}
  			else {
  				$(settings.newsList + ' li span').text(tickerText + placeHolder);
  			}
  			currentLength ++;
  			timeout = setTimeout(function(){runTicker(settings); settings = null;},settings.tickerRate);
  			//alert(timeout);
  		}
  		else {
  			if(settings.newsLinks[currentItem].length > 0) {
  				$(settings.newsList + ' li a').text(settings.newsItems[currentItem]);
  			}
  			else {
  				$(settings.newsList + ' li span').text(settings.newsItems[currentItem]);
  			}
  			currentLength = 0;
  			currentItem ++;
  			timeout = setTimeout(function(){runTicker(settings); settings = null;},settings.loopDelay);	  			
  		}	
		}else{
        if(settings.newsLiClasses[currentItem] == "breaking"){
  		    newsLabel = "BREAKING NEWS:";
  		  }else{
  		    newsLabel = "LATEST:";
  		  }
  		  
  			if(settings.newsLinks[currentItem].length > 0) {
  				$(settings.newsList).empty().append('<li class="' + settings.newsLiClasses[currentItem] + '">' + newsLabel + ' <a href="'+ settings.newsLinks[currentItem] +'" onmouseover="pause(true)" onmouseout="pause()"></a></li>');
  			}
  			else {
  				$(settings.newsList).empty().append('<li class="' + settings.newsLiClasses[currentItem] + '">' + newsLabel + ' <span></span></li>');
  			}
  			
		    if(settings.newsLinks[currentItem].length > 0) {
  				$(settings.newsList + ' li a').text(settings.newsItems[currentItem]);
  			}
  			else {
  				$(settings.newsList + ' li span').text(settings.newsItems[currentItem]);
  			}   			
  			clearTimeout(timeout);
		}
		
	}
	
	$.fn.extend({
		newsTicker: function(settings) {
			settings = jQuery.extend({			     
			    newsListSource: "#newssource",
		 	  	newsList: "#news",
		   		tickerRate: 80,
		    	startDelay: 100,
		    	loopDelay: 3000,
		    	placeHolder1: " |",
		    	placeHolder2: "_",
		    	itemHolder: "#itemHolder",
		    	viewNext: false,
		    	viewPrev: false
			}, settings);
			
			var newsItems = new Array();
			var newsLinks = new Array();
			var newsLiClasses = new Array();
			var newsItemCounter = 0;		  
			$(settings.newsListSource + ' li').each(function(){
			 
			  newsLiClasses[newsItemCounter] = $(this).attr('class');
				if($(this).children('a').length) {
					newsItems[newsItemCounter] = $(this).children('a').text();
					if($(this).children('a').attr('href')){
					   newsLinks[newsItemCounter] = $(this).children('a').attr('href');					   
					}
					else{
					   newsLinks[newsItemCounter] = "/";
					}
				}
				else {
					newsItems[newsItemCounter] = $(this).text();
					newsLinks[newsItemCounter] = '/';
				}
				newsItemCounter ++;
			});
			
			settings = jQuery.extend(settings,{
				newsItems: newsItems,
				newsLinks: newsLinks,
				newsLiClasses: newsLiClasses,
				newsItemCounter: newsItemCounter - 1,
				currentItem: 0,
				currentLength: 0,
				firstRun:1
			});
			
			setTimeout(function(){runTicker(settings); settings = null;},settings.startDelay);
			//setInterval(function(){runTicker(settings); },settings.startDelay);
		}
	
	});
	

})(jQuery);