/*
News ticker plugin (BBC news style)
Bryan Gullan,2007-2009
version 1.2.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! :-)

*/
last_settings = null;
ticker_stop = null;
ticker_position = 0;

(function($) {

	function runTicker(settings) {

		if(ticker_stop == 1){
			last_settings = settings;
			return;
		}

		if(ticker_position != 0){
			currentItem += ticker_position;

			if(currentItem == settings.newsItemCounter + 1){
				currentItem = 0;
			}

			if(currentItem < 0){
				currentItem = settings.newsItemCounter;
			}

			currentLength = 0;
			ticker_position = 0;
		}

		if(settings.newsItems.length < 1) {
			return;
		}

		if(settings.firstRun == 1){
			currentLength = settings.currentLength;
			currentItem = settings.currentItem;
			settings.firstRun = 0;
			settings.runCycle = 0;
			currentTickerType = null;
		}else{
			settings.runCycle = 1;
		}

		if(currentItem == settings.newsItemCounter + 1){
			currentItem = 0;
		}

		r = (settings.newsRel[currentItem] == true) ? ' rel="external" title="Link opens in new window" ':  '';

		if(currentLength == 0) {

			newTickerType = settings.newsType[currentItem];

			if(currentTickerType != newTickerType && currentTickerType != null){

				if((settings.newsTypeSeq[currentTickerType] - settings.newsTypeSeq[newTickerType]) == 2 || (settings.newsTypeSeq[currentTickerType] - settings.newsTypeSeq[newTickerType]) == -1){
					$('#bars').cycle('next');
				}else{
					$('#bars').cycle('prev');
				}
			}

			currentTickerType = settings.newsType[currentItem];

			if(settings.newsLinks[currentItem].length > 0) {

				$(settings.newsList).empty().append('<li class="'+settings.newsClasses[currentItem]+'"><a href="'+ settings.newsLinks[currentItem] +'"'+r+'></a></li>');
			}
			else {
				$(settings.newsList).empty().append('<li class="'+settings.newsClasses[currentItem]+'"></li>');
			}
		}

		if( currentLength % 2 == 0) {
				placeHolder = settings.placeHolder1;
		}
		else {
			placeHolder = settings.placeHolder2;
		}


		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').text(tickerText + placeHolder);
			}
			currentLength ++;
			setTimeout(function(){runTicker(settings); settings = null;},settings.tickerRate);
		}
		else {

			if(settings.newsLinks[currentItem].length > 0) {
				$(settings.newsList + ' li a').text(settings.newsItems[currentItem]);
			}
			else {
				$(settings.newsList + ' li').text(settings.newsItems[currentItem]);
			}
			currentLength = 0;
			currentItem ++;
			setTimeout(function(){runTicker(settings); settings = null;},settings.loopDelay);
		}
	}

	$.fn.extend({
		newsTicker: function(settings) {
			settings = jQuery.extend({
		 	  	newsList: "#news",
		   		tickerRate: 80,
		    	startDelay: 100,
		    	loopDelay: 3000,
		    	placeHolder1: " |",
		    	placeHolder2: "_"
			}, settings);

			var newsItems = new Array();
			var newsLinks = new Array();
			var newsClasses = new Array();
			var newsRel = new Array();
			var newsFirst = new Array();
			var newsType = new Array();
			var newsTypeSeq = new Array();
			var newsItemCounter = 0;

			newsTypeSeq['twitter'] = 3;
			newsTypeSeq['latest'] = 2;
			newsTypeSeq['alert'] = 1;
			var stop = false;

			$(settings.newsList + ' li').hide();

			$(settings.newsList + ' li').each(function(){

				newsClasses[newsItemCounter] = $(this).attr("class");

				if($(this).children('a').length) {
					newsItems[newsItemCounter] = $(this).children('a').text();
					newsLinks[newsItemCounter] = $(this).children('a').attr('href');
					newsRel[newsItemCounter]  = ($(this).children('a').attr('rel') == 'external') ? true : false;
				}
				else {
					newsItems[newsItemCounter] = $(this).text();
					newsLinks[newsItemCounter] = '';
					newsRel[newsItemCounter] = false;
				}

				if($(this).attr('class')=='first_ticker'){
					newsFirst[newsItemCounter] = true;
				}else{
					newsFirst[newsItemCounter] = false;
				}

				newsType[newsItemCounter] = $(this).attr('class');

				newsItemCounter ++;
			});



			settings = jQuery.extend(settings,{
				newsItems: newsItems,
				newsLinks: newsLinks,
				newsRel: newsRel,
				newsFirst: newsFirst,
				newsClasses: newsClasses,
				newsItemCounter: newsItemCounter - 1,
				currentItem: 0,
				currentLength: 0,
				runCycle: 0,
				newsType: newsType,
				newsTypeSeq: newsTypeSeq,
				firstRun:1
			});

			setTimeout(function(){runTicker(settings); settings = null;},settings.startDelay);
		}

	});

	$.fn.extend({
		newsTickerC: function(last_settings) {
			setTimeout(function(){runTicker(last_settings); last_settings = null;},last_settings.startDelay);
		}
	});

})(jQuery);