var Ticker = function()
{	
	// Classes
	var TickerItem = function(title, href, openInNewWindow, sortOrder)
	{
		this.title = title;
		this.href = href;
		this.openInNewWindow = openInNewWindow;
		this.sortOrder = sortOrder;
	};
	TickerItem.method('equals', function(tickerItem2)
	{
		if (!this.title == tickerItem2.title)
			return false;
		
		if (!this.href == tickerItem2.href)
			return false;
			
		if (!this.openInNewWindow == tickerItem2.openInNewWindow)
			return false;
			
		if (!this.sortOrder == tickerItem2.sortOrder)
			return false;	
			
		return true;
	});
			
	function TickerRunner(targetElement)
	{
		this.url = '/handlers/Ticker.ashx';
		this.targetElement = targetElement;
		this.tickerItems = [];
		this.tickerHolder = null;
		this.tickerMoveDistance = 6;
		this.itemSpacing = 10;
		this.lastItemIndex = 0;
		this.isRunning = false;
		this.updateInterval = 140;
		this.checkForNewItemsInterval = 30000;
		this.checkForNewItemsIntervalId = -1;
		this.firstItemRight = 100000;
		this.widths = [];
		this.itemsFromDb = [];
		this.intervalId = -1;
		
		if(!TickerRunner.Instances)
			TickerRunner.Instances = new Array();
			
		this.id = TickerRunner.Instances.length;
		TickerRunner.Instances[this.id] = this;
	}
	TickerRunner.method('_run', function()
	{
		this.tickerHolder = $(this.targetElement);
		
		this.tickerHolder.empty();
		this.firstItemRight = 100000;
					
		if (this.tickerItems.length)
		{
			var _this = this;
			
			this._calculateWidths();
			
			this.tickerHolder.css('display', 'block');
			
			var tickerItem = this._createTickerElement(this.tickerItems[0]);
			
			this.firstItemRight = $(this.tickerHolder).width();
			
			this.tickerHolder.append(tickerItem);
			
			this.lastItemIndex = 0;
			
			this.counter = 0;
							
			this.isRunning = true;
			this.intervalId = setInterval('Ticker.TickerRunner.Instances[' + this.id + '].start()', this.updateInterval);
			
			this.checkForNewItemsIntervalId = setInterval('Ticker.TickerRunner.Instances[' + this.id + ']._update()', this.checkForNewItemsInterval);
		}
	});
	TickerRunner.method('_update', function()
	{
		var tickerItems = [];
		var params = {};
		var _this = this;
	
		$.getJSON(_this.url, params, function(json)
		{
			$.each(json, function()
			{
				var tickerItem = new TickerItem(this.Title, this.Href, this.OpenInNewWindow, this.SortOrder);
									
				tickerItems[tickerItems.length] = tickerItem;
			});	
			
			if (tickerItems.length != _this.tickerItems.length)
			{			
				_this.tickerItems = tickerItems;
				
				_this.pause();
		
				_this._run();
				
				return;
			}
			else
			{
				for (i = 0; i < tickerItems.length; i++)
				{
					if (!tickerItems[i].equals(_this.tickerItems[i]))
					{					
						_this.tickerItems = tickerItems;
				
						_this.pause();
				
						_this._run();
						
						return;
					}
				}
			}
		});
	});
	TickerRunner.method('_calculateWidths', function()
	{
		var body = $('body');
		
		var tempDiv = $('<div id="calc" />');
		var jsTempDiv = $(tempDiv);
		
		jsTempDiv.css('position', 'absolute');
		jsTempDiv.css('left', '-999px');
		
		$(body).append(tempDiv);
		
		for (i = 0; i < this.tickerItems.length; i++)
		{
			var tickerItem = this._createTickerElement(this.tickerItems[i]);
			$(tickerItem).css('position', '');
			$(tickerItem).css('left', '');
			
			jsTempDiv.html(tickerItem);
			
			this.widths[i] = tickerItem.width();
		}
		
		//jsTempDiv.remove();
	});
	TickerRunner.method('_createTickerElement', function(tickerItem)
	{
		var tickerHolderWidth = $(this.tickerHolder).css('width');
		
		var tickerElement;
			
		if (tickerItem.href)
		{
			tickerElement = $('<a/>');
			tickerElement.attr('href', tickerItem.href);
			
			if (tickerItem.openInNewWindow)
				tickerElement.attr('target', 'blank');
		}
		else
		{
			tickerElement = $('<span/>');
		}
						
		tickerElement.html(tickerItem.title.replace(/ /gi, '&nbsp;'));
		
		var jqTickerItem = $(tickerElement);
		
		jqTickerItem.css('position', 'absolute');
		jqTickerItem.css('left', tickerHolderWidth);
		
		return tickerElement;
	});
	TickerRunner.method('start', function()
	{
		var items = $(this.tickerHolder).children();
		var tickerMoveDistance = this.tickerMoveDistance;
		var itemSpacing = this.itemSpacing;
		
		var _this = this;
		
		var count = 0;
		
		this.firstItemRight = this.firstItemRight - tickerMoveDistance;
					
		var rightPos = this.firstItemRight - tickerMoveDistance;
		
		var firstItemEdge = this.firstItemRight + $(items[0]).width();
		
		$.each(items, function()
		{
			if (firstItemEdge <= 0)
			{
				
				_this.firstItemRight += $(this).width() + itemSpacing;
				firstItemEdge = 1;
				rightPos = _this.firstItemRight - tickerMoveDistance;
				
				$(this).remove();
			}
			else
			{
				$(this).css('left', rightPos);
				
				rightPos += $(this).width() + itemSpacing;
			}
			
			count++;
		});
		
		var lastItem = items[items.length - 1];
		var left = Number($(lastItem).css('left').replace(/^(\d+).+/, '$1'));
		var right = left + this.widths[this.lastItemIndex];
								
		if ((right + this.itemSpacing) < $(this.tickerHolder).width())
		{
			var nextItem;
			
			this.lastItemIndex = this.lastItemIndex + 1;
			
			if (this.lastItemIndex >= this.tickerItems.length)
				this.lastItemIndex = 0;				
		
			var tickerItem = this._createTickerElement(this.tickerItems[this.lastItemIndex]);
							
			$(tickerItem).css('left', right + this.itemSpacing);
			
			this.tickerHolder.append(tickerItem);
			
			$(tickerItem).css('width', $(tickerItem).width());
		}
		
		this.counter = this.counter + 1;
								
		if (!this.isRunning)
		{
			this.intervalId = setInterval('Ticker.TickerRunner.Instances[' + this.id + '].start()', this.updateInterval);
			this.isRunning = true;
		}
	});
	TickerRunner.method('pause', function()
	{		
		clearInterval(this.intervalId);
		this.intervalId = null;
		this.isRunning = false;
	});
	TickerRunner.method('init', function()
	{
		var tickerItems = [];
		var params = {};
		var _this = this;
	
		$.getJSON(_this.url, params, function(json)
		{
			$.each(json, function()
			{
				var tickerItem = new TickerItem(this.Title, this.Href, this.OpenInNewWindow, this.SortOrder);
									
				tickerItems[tickerItems.length] = tickerItem;
			});		
			
			_this.tickerItems = tickerItems;
							
			_this.hasInitted = true;
			
			_this.tickerHolder = $(_this.targetElement);
							
			_this.tickerHolder.bind('mouseover', function() { _this.pause(); });
			_this.tickerHolder.bind('mouseout', function() { _this.start(); });
			
			_this._run();
		});
	});
	
	
	return {
		// Classes
		TickerItem : TickerItem,
		TickerRunner : TickerRunner
	};
}();