  /*
 * autocomplete.js 
 * Date Created: April 1, 2009
 * Requires: jquery 1.2.3
 * Author: Brandon Quintana
 */
 
autocompleteURL = '/tivo-tco/go.do?def=data.unified.search.json&keyword=';

jQuery(function($) {
	$.fn.autocomplete = function(settings) {
		var defaults = {
			searchInput: $(this),
			defaultValue: $(this).val(),
			resultsClass: 'autocomplete-results',
			activeClass: 'active',
			itemClass: 'item',
			meta : {
				settings: {

				}
			}
		};
		
		var s = $.extend(defaults, settings);
	
		var n = {

		}
	
		var c = {
		};
		
		return this.each(function() {
			/* Initialize
			-------------------------------------------*/

			/**
	 		* @method init
	 		**/
			this.init = function() {
				s.searchInput.attr('autocomplete', 'off');
			
				this._eventManager();
			};

			/* Private Methods
			-------------------------------------------*/
			/**
			 * @method _eventManager()
			 **/
			this._eventManager = function() {
				var $this = this;
				
				$(document).bind('click', function(e) {
					var target = $(e.target);
					
					if(target.is('.' + s.itemClass)) {
						$this._setInput(target);
						$this._submit();
					}
					
					if(n.results) n.results.hide();
				});
				
				$(document).bind('mouseover', function(e) {
					var target = $(e.target);
					
					if(target.is('.' + s.itemClass)) {
						n.results.find('li.' + s.activeClass).removeClass(s.activeClass);
						target.addClass(s.activeClass);
					}
				});
				
				s.searchInput.bind('focus', function(e) {
					if($(this).val() == s.defaultValue)
						$(this).val('');
						$(this).addClass("active");
				});
				
				s.searchInput.bind('blur', function(e) {
					if($(this).val() == '')
						$(this).val(s.defaultValue);
						$(this).removeClass("active");
				});
				
				s.searchInput.bind('keyup', function(e) { 
					switch(e.keyCode) {
						case 38:
							$this._up();
							break;
						case 40:
							$this._down();
							break;
						case 13:
							$this._submit();
							break;
						case 37:
						case 39:
							break;
						default:
							if(s.timeout) clearTimeout(s.timeout);
							s.timeout = setTimeout(function(){ $this._searchRequest(s.searchVal = s.searchInput.val()); }, 500);
					}
					
				});
				
				s.searchInput.bind('keydown', function(e) {
					if (e.keyCode == 13)
						e.preventDefault();
				});
				
				s.searchInput.bind('keypress', function(e) {
					if (e.keyCode == 13)
						e.preventDefault();
				});
				
			};
			
			/**
			 * @method _searchRequest()
			 * @param value
			 **/
			this._searchRequest = function(value) {			
				var url = autocompleteURL + value;
				
				var $this = this;
				
				if(typeof n.results == 'undefined') this._createResultsContainer();
					
				this._positionResults();
			
				$.getJSON(url, function(data) {
					if(typeof data.unifiedItem != 'undefined' && data.unifiedItem.length != 0)
						$this._parseData(data);
					else
						n.results.hide();
				});
			};
			
			/**
			 * @method _up()
			 **/
			this._up = function() {
				var active = n.results.find('li.' + s.activeClass);
				if(active.length == 0)
					this._setInput(n.results.find('li:last'));
				else if (active.is(':first-child'))
					this._resetInput(active);
				else
					this._setInput(active.removeClass(s.activeClass).prev());	
			};
			
			/**
			 * @method _down()
			 **/
			this._down = function() {
				var active = n.results.find('li.' + s.activeClass);
				
				if(n.results.find('li.' + s.activeClass).length == 0)
					this._setInput(n.results.find('li:first'));
				else if (active.is(':last-child'))
					this._resetInput(active);
				else
					this._setInput(active.removeClass(s.activeClass).next());
			};
			
			/**
			 * @method _submit()
			 **/
			this._submit = function() {
				s.searchInput.parents('form').submit();
			};
			
			/**
			 * @method _resetInput()
			 * @parm active
			 **/
			this._resetInput = function(active) {
				active.removeClass(s.activeClass);
				s.searchInput.val(s.searchVal);
			};
			
			/**
			 * @method _setInput()
			 **/
			this._setInput = function(element) {
				element.addClass(s.activeClass);
				s.searchInput.val(element.find('input[name="showTitle"][type="hidden"]').val());
			};
			
			/**
			 * @method _parseData()
			 * @param data
			 **/
			this._parseData = function(data) {
				
				var html = [];
				
				html.push('<ul>');

				for (var i = 0, length = data.unifiedItem.length; i < length; i++) {
					row = data.unifiedItem[i];
					html.push(this._resultsTemplate(row));
				}
				
				html.push('</ul>');
				
				if(n.results.is(':visible'))
					n.results.html(html.join(''));
				else
					n.results.hide().html(html.join('')).fadeIn();
			};
			
			/**
			 * @method _resultsTemplate()
			 * @param row
			 **/
			this._resultsTemplate = function(row) {
				html = [];
				
				if(typeof row.title != 'undefined') {
					html.push('<li class="' + s.itemClass + '">');
					html.push(row.title);
					html.push('<input name="showTitle" type="hidden" value="');
					html.push(row.title);
					html.push('"/></li>');
				}
				
				return  html.join('');
			};

			/**
			 * @method _createResultsContainer()
			 **/
			this._createResultsContainer = function() {
				$('body').append('<div class="' + s.resultsClass + '"></div>');
				
				n.results = $('.' + s.resultsClass);
				
				n.results.css({
					'display' : 'none',
					'position' : 'absolute',
					'border' : '1px solid #2F5275',
					'z-index' : '5000',
					'background' : '#fff'
				});
				
			};
			
			/**
			 * @method _positionResults()
			 **/
			this._positionResults = function() {
				n.results.css({
					top: s.searchInput.offset().top + s.searchInput.outerHeight(true),
					left: s.searchInput.offset().left,
					width: s.searchInput.outerWidth(true)
				});
			};
			
			/* Public Methods
			-------------------------------------------*/
		
			//Call initialize
			this.init();

		});
	};	
});

jQuery(document).ready(function($) {
	$('input#searchFor').autocomplete();
});
