/**
 * Horizontal Stock Ticker for jQuery.
 * 
 * @package jStockTicker
 * @author Peter Halasz <skinner@gmail.com>
 * @license http://www.gnu.org/licenses/gpl-3.0.txt GPL v3.0
 * @copyright (c) 2009, Peter Halasz all rights reserved.
 */
( function($) {

	$.fn.jStockTicker = function(options) {

		if (typeof (options) == 'undefined') {
			options = {};
		}

		var settings = $.extend( {}, $.fn.jStockTicker.defaults, options);

		var $ticker = $(this);

		settings.tickerID = $ticker[0].id;
		
		$.fn.jStockTicker.settings[settings.tickerID] = {};

		var $wrap = null;

		if ($ticker.parent().get(0).className != 'wrap') {
			$wrap = $ticker.wrap("<div class='wrap'></div>");
		}

		var $tickerContainer = null;

		if ($ticker.parent().parent().get(0).className != 'container') {
			$tickerContainer = $ticker.parent().wrap(
					"<div class='container_"+settings.tickerID+"'></div>");
		}
		
		var node = $ticker[0].firstChild;
		var next;
		
		while(node) {
			next = node.nextSibling;
			if(node.nodeType == 3) {
				$ticker[0].removeChild(node);
			}
			node = next;
		}
		
		var shiftLeftAt = $ticker.children().get(0).offsetWidth;
		
		$.fn.jStockTicker.settings[settings.tickerID].shiftLeftAt = shiftLeftAt;
		$.fn.jStockTicker.settings[settings.tickerID].left = 0;
		$.fn.jStockTicker.settings[settings.tickerID].runid = null;
		
		$ticker.width(2 * screen.availWidth);
		
		function startTicker() {
			stopTicker();
			
			var params = $.fn.jStockTicker.settings[settings.tickerID]; 
			params.left -= settings.speed;
			if(params.left <= params.shiftLeftAt * -1) {
				params.left = 0;
				$ticker.append($ticker.children().get(0));
				params.shiftLeftAt = $ticker.children().get(0).offsetWidth;
			}
			
			$ticker.css('left', params.left + 'px');
			params.runId = setTimeout(arguments.callee, settings.interval);
			
			$.fn.jStockTicker.settings[settings.tickerID] = params;
		}
		
		function stopTicker() {
			var params = $.fn.jStockTicker.settings[settings.tickerID];
			if (params.runId)
			    clearTimeout(params.runId);
			    
			params.runId = null;
			
			$.fn.jStockTicker.settings[settings.tickerID] = params;
		}
		
		function updateTicker() {
			
			stopTicker();
			startTicker();
		}
		
		$ticker.hover(stopTicker,startTicker);
		
		startTicker();
	};

	$.fn.jStockTicker.settings = {};
	
	$.fn.jStockTicker.defaults = {
		tickerID :null,
		url :null,
		speed :1,
		interval :20
	};
	$.fn.jvStockTicker = function(options) {

			if (typeof (options) == 'undefined') {
				options = {};
			}

			var settings = $.extend( {}, $.fn.jvStockTicker.defaults, options);

			var $ticker = $(this);

			settings.tickerID = $ticker[0].id;

			$.fn.jvStockTicker.settings[settings.tickerID] = {};

			var $wrap = null;

			if ($ticker.parent().get(0).className != 'wrap') {
				$wrap = $ticker.wrap("<div class='wrap'></div>");
			}

			var $tickerContainer = null;

			if ($ticker.parent().parent().get(0).className != 'container') {
				$tickerContainer = $ticker.parent().wrap(
						"<div class='container_"+settings.tickerID+"'></div>");
			}

			var node = $ticker[0].firstChild;
			var next;

			while(node) {
				next = node.nextSibling;
				if(node.nodeType == 3) {
					$ticker[0].removeChild(node);
				}
				node = next;
			}

			var shiftLeftAt = $ticker.children().get(0).offsetHeight;

			$.fn.jvStockTicker.settings[settings.tickerID].shiftLeftAt = shiftLeftAt;
			$.fn.jvStockTicker.settings[settings.tickerID].top = 0;
			$.fn.jvStockTicker.settings[settings.tickerID].runid = null;

			$ticker.height(2 * screen.availWidth);

			function startTicker() {
				stopTicker();

				var params = $.fn.jvStockTicker.settings[settings.tickerID]; 
				params.top -= settings.speed;
				if(params.top <= params.shiftLeftAt * -1) {
					params.top = 0;
					$ticker.append($ticker.children().get(0));
					params.shiftLeftAt = $ticker.children().get(0).offsetHeight;
				}

				$ticker.css('top', params.top + 'px');
				params.runId = setTimeout(arguments.callee, settings.interval);

				$.fn.jvStockTicker.settings[settings.tickerID] = params;
			}

			function stopTicker() {
				var params = $.fn.jvStockTicker.settings[settings.tickerID];
				if (params.runId)
					clearTimeout(params.runId);

				params.runId = null;

				$.fn.jvStockTicker.settings[settings.tickerID] = params;
			}

			function updateTicker() {

				stopTicker();
				startTicker();
			}

			$ticker.hover(stopTicker,startTicker);

			startTicker();
		};

		$.fn.jvStockTicker.settings = {};

		$.fn.jvStockTicker.defaults = {
			tickerID :null,
			url :null,
			speed :1,
			interval :20
	};

	
	
})(jQuery);