(function($){  
	$.fn.ticker = function(options) { 
		
		var opts = $.extend({}, $.fn.ticker.defaults, options); 		
		
		
		var newsID = '#' + $(this).attr('id');

		
		var tagType = $(this).attr('tagName'); 	
		
		return this.each(function() { 
			
			var settings = {				
				position: 0,
				time: 0,
				distance: 0,
				newsArr: {},
				play: true,
				paused: false,
				contentLoaded: false,
				dom: {
					contentID: '#ticker-content',
					titleID: '#ticker-title',
					titleElem: '#ticker-title SPAN',
					tickerID : '#ticker',
					wrapperID: '#ticker-wrapper',
					revealID: '#ticker-swipe',
					revealElem: '#ticker-swipe SPAN',
					controlsID: '#ticker-controls',
					prevID: '#prev',
					nextID: '#next',
					playPauseID: '#play-pause'
				}
			};
			

			if (tagType != 'UL' && opts.htmlFeed === true) {
				debugError('Cannot use <' + tagType.toLowerCase() + '> type of element for this plugin - must of type <ul>');
				return false;
			}

		
			initialisePage();
		
			function countSize(obj) {
			    var size = 0, key;
			    for (key in obj) {
			        if (obj.hasOwnProperty(key)) size++;
			    }
			    return size;
			};
			
			function debugError(obj) {
				if (opts.debugMode) {
					if (window.console && window.console.log) {
						window.console.log(obj);
					}
					else {
						alert(obj);			
					}
				}
			}
			function initialisePage() {

				$(settings.dom.wrapperID).append('<div id="' + settings.dom.tickerID.replace('#', '') + '"><div id="' + settings.dom.titleID.replace('#', '') + '"><span style="display: none;"><!-- --></span></div><p id="' + settings.dom.contentID.replace('#', '') + '"></p><div id="' + settings.dom.revealID.replace('#', '') + '"><span style="display: none;"><!-- --></span></div></div>');
				$(settings.dom.wrapperID).removeClass('no-js').addClass('has-js');
				
				$(settings.dom.tickerElem + ',' + settings.dom.titleElem + ',' + settings.dom.contentID).hide();
				
				if (opts.controls) {
					
					$(settings.dom.controlsID).live('click mouseover mousedown mouseout mouseup', function (e) {
						var button = e.target.id;		
						if (e.type == 'click') {											
							switch (button) {
								case settings.dom.prevID.replace('#', ''):
									
									settings.paused = true;
									$(settings.dom.playPauseID).addClass('paused');
									changeContent(button);
									break;
								case settings.dom.nextID.replace('#', ''):
									
									settings.paused = true;
									$(settings.dom.playPauseID).addClass('paused');
									changeContent(button);
									break;
								case settings.dom.playPauseID.replace('#', ''):
									
									if (settings.play == true) {
										settings.paused = true;
										$(settings.dom.playPauseID).addClass('paused');
										pauseTicker();
									}
									else {
										settings.paused = false;
										$(settings.dom.playPauseID).removeClass('paused');
										restartTicker();
									}
									break;
							}	
						}
						else if (e.type == 'mouseover' && $('#' + button).hasClass('controls')) {
							$('#' + button).addClass('over');
						}
						else if (e.type == 'mousedown' && $('#' + button).hasClass('controls')) {
							$('#' + button).addClass('down');
						}
						else if (e.type == 'mouseup' && $('#' + button).hasClass('controls')) {
							$('#' + button).removeClass('down');
						}
						else if (e.type == 'mouseout' && $('#' + button).hasClass('controls')) {
							$('#' + button).removeClass('over');
						}
					});
					
					$(settings.dom.wrapperID).append('<ul id="' + settings.dom.controlsID.replace('#', '') + '"><li id="' + settings.dom.playPauseID.replace('#', '') + '" class="controls"></li><li id="' + settings.dom.prevID.replace('#', '') + '" class="controls"></li><li id="' + settings.dom.nextID.replace('#', '') + '" class="controls"></li></ul>');
				}
				
				$(settings.dom.contentID).mouseover(function () {
					if (settings.paused == false) {
						pauseTicker();
					}
				}).mouseout(function () {
					if (settings.paused == false) {
						restartTicker();
					}
				});
				
				updateTicker();
			}
			
			function updateTicker() {	
				
				if (settings.contentLoaded == false) {
					
					if (opts.ajaxFeed) {
						
						debugError('Code Me!');
					}
					else if (opts.htmlFeed) { 
						if($(newsID + ' LI').length > 0) {
							$(newsID + ' LI').each(function (i) {	
								
								settings.newsArr['item-' + i] = { type: opts.titleText, content: $(this).html()};
							});							
						}	
						else {
							debugError('Couldn\'t find any content for the ticker to use!');
							return false;
						}
					}
					else {
						debugError('Couldn\'t find any content for the ticker to use!');
						return false;
					}
					settings.contentLoaded = true;
				}
				
				
				$(settings.dom.titleElem).html(settings.newsArr['item-' + settings.position].type);
				$(settings.dom.contentID).html(settings.newsArr['item-' + settings.position].content);
				
				
				if (settings.position == (countSize(settings.newsArr) -1)) {
					settings.position = 0;
				}
				else {		
					settings.position++;
				}
							
				
				distance = $(settings.dom.contentID).width();
				time = distance / opts.speed;
				
				
				$(settings.dom.wrapperID)
					.find(settings.dom.titleID).fadeIn()
						.end().find(settings.dom.titleElem).fadeIn('slow', revealContent);
			}

			
			function revealContent() {
				if(settings.play) {	
					
					var offset = $(settings.dom.titleElem).width() + 20;
					$(settings.dom.revealID).css('left', offset + 'px');
					
					$(settings.dom.revealElem).show(0, function () {
						$(settings.dom.contentID).css('left', offset + 'px').show();
						$(settings.dom.revealID).css('margin-left', '0px').delay(20).animate({
							marginLeft: distance + 'px'
						}, time, 'linear', postReveal);
					});		
				}
				else {
					return false;					
				}
			};
			
			function postReveal() {
				
				if(settings.play) {		
					
					$(settings.dom.contentID).delay(opts.pauseOnItems).fadeOut('slow');
					
					$(settings.dom.revealID).hide(0, function () {
						$(settings.dom.tickerID).delay(opts.pauseOnItems).fadeOut(opts.fadeOutSpeed, function () {
							$(settings.dom.wrapperID)
								.find(settings.dom.titleElem +',' + settings.dom.revealElem + ',' + settings.dom.contentID)
									.hide()
								.end().find(settings.dom.tickerID + ',' + settings.dom.revealID + ',' + settings.dom.titleID)
									.show()
								.end().find(settings.dom.tickerID + ',' + settings.dom.revealID + ',' + settings.dom.titleID)
									.removeAttr('style');								
							updateTicker();						
						});
					});
				}
				else {
					$(settings.dom.revealElem).hide();
				}
			}
			
			function pauseTicker() {
				
				settings.play = false;
				//
				$(settings.dom.tickerID + ',' + settings.dom.revealID + ',' + settings.dom.titleID + ',' + settings.dom.titleElem + ',' + settings.dom.revealElem + ',' + settings.dom.contentID).stop(true, true);
				$(settings.dom.revealID + ',' + settings.dom.revealElem).hide();
				$(settings.dom.wrapperID)
					.find(settings.dom.titleID + ',' + settings.dom.titleElem).show()
						.end().find(settings.dom.contentID).show();
			}
			
			function restartTicker() {
				
				settings.play = true;
				settings.paused = false;
				
				postReveal();	
			}
			
			function changeContent(direction) {
				pauseTicker();
				switch (direction) {
					case 'prev':
						if (settings.position == 0) {
							settings.position = countSize(settings.newsArr) -2;
						}
						else if (settings.position == 1) {
							settings.position = countSize(settings.newsArr) -1;
						}
						else {
							settings.position = settings.position - 2;
						}
						
						$(settings.dom.titleElem).html(settings.newsArr['item-' + settings.position].type);
						$(settings.dom.contentID).html(settings.newsArr['item-' + settings.position].content);						
						break;
					case 'next':
						$(settings.dom.titleElem).html(settings.newsArr['item-' + settings.position].type);
						$(settings.dom.contentID).html(settings.newsArr['item-' + settings.position].content);
						break;
				}
				
				if (settings.position == (countSize(settings.newsArr) -1)) {
					settings.position = 0;
				}
				else {		
					settings.position++;
				}	
			}
		});  
	};  
	
	$.fn.ticker.defaults = {
		speed: 0.10,			
		ajaxFeed: false,
		htmlFeed: true,
		debugMode: true,
		controls: true,
		titleText: 'Latest',		
		pauseOnItems: 2000,
		fadeInSpeed: 300,
		fadeOutSpeed: 300
	};	
})(jQuery);


