(function($) {
	$.fn.typeahead = function() {
		var $this = this, typeahead_timeout, wrapper, dropdown_list, request, typeahead_selected;

		var hover_color = '#fae3c3';
		var font_family = 'helvetica, arial, sans-serif';
		var font_size = '14px';
		var padding = '7px';
		var border = '1px';
		var background_color = '#F0F0F0';

		var update_options = function() {
			request = $.getJSON('/typeahead.php?input=' + encodeURI($this.val()), function(data) {
				var options = [];
				dropdown_list.innerHTML = '';

				for (p in data.predictions) {
					var li = document.createElement('li');
					li.innerHTML = data.predictions[p].description;

					$(li).css('cursor', 'pointer').css('backgroundColor', background_color).css('padding', padding).css('font-family', font_family).css('font-size', font_size);

					$(li).bind('click', function() {
						use_selected($(this));
					});

					$(li).bind('mouseover mouseout', function(event) {
						var typeahead_selected_temp = $(typeahead_selected);

						if (event.type == 'mouseover') {
							typeahead_selected_temp.removeClass('typeahead_selected');
							typeahead_selected_temp.css('background-color', background_color);

							$(this).addClass('typeahead_selected');
							$(this).css('background-color', hover_color);
						} else {
							typeahead_selected_temp.addClass('typeahead_selected');
							typeahead_selected_temp.css('background-color', hover_color);

							$(this).removeClass('typeahead_selected');
							$(this).css('background-color', background_color);
						}

					});

					if (p === '0') {
						typeahead_selected = li;
						$(li).addClass('typeahead_selected').css('background-color', hover_color);
					}

					dropdown_list.appendChild(li);
				}
			});
		};

		var create_dropdown = function() {
			wrapper = document.createElement('div');
			wrapper.setAttribute('style', 'position: absolute; display: none; padding: 0px; margin: 0px;');

			dropdown_list = document.createElement('ul');
			dropdown_list.setAttribute('style', 'padding: 0px; margin: 0px;');
			dropdown_list.setAttribute('id','ul-typeahead');

			wrapper.appendChild(dropdown_list);
			document.body.appendChild(wrapper);
		};

		var reset_dropdown_position = function() {
			if($this.offset()) { 
				var width = $this.outerWidth();
				var pos_top = $this.offset().top + $this.outerHeight()+22;
				var pos_left = $this.offset().left;

				$(wrapper).css('width', width).css('top', pos_top).css('left', pos_left).hide();
			}
		};

		var hide_dropdown = function() {
			$(wrapper).hide();
		};

		var show_dropdown = function() {
			$(wrapper).show();
		};

		var use_selected = function(selection) {
			var selected_address = selection.html();
			$this.val(selected_address);
			$this.focus();
			hide_dropdown();
		};
		
		var select_li = function(index){
			typeahead_selected = $('#ul-typeahead li:eq('+index+')');
			$('li.typeahead_selected').removeClass('typeahead_selected').css('background-color', background_color);
			$('#ul-typeahead li:eq('+index+')').addClass('typeahead_selected').css('background-color', hover_color);
		}
		
		var update_selected = function(key_code){
			var index = $('#ul-typeahead li').index($('.typeahead_selected')); 
			var size = $('#ul-typeahead li').size()-1;
			if(key_code==40) { //arrow down
				index = index+1; 
				if(index<=size){ 
					select_li(index);
				} else {
					select_li(0);
				}
			} else if(key_code==38) { 	//up arrow
				index = index-1;				
				if(index>=0){
					select_li(index);
				} else {
					select_li(size);
				}
			}
		}

		$this.keyup(function(e) {
			show_dropdown();

			if (e.which == 13) {
				use_selected($(typeahead_selected));
			} else if (e.which == 40 || e.which==38) {	
				update_selected(e.which);
			} else {
				update_options();
			}
		});

		$this.attr('autocomplete', 'off');
		create_dropdown();
		reset_dropdown_position();
	};
})(jQuery);

