	(function($) {

		$.suggest = function(input, options) {
			var $input = $(input).attr("autocomplete", "off");
			var $results;
			var timeout = false;		// hold timeout ID for suggestion results to appear	
			var prevLength = 0;			// last recorded length of $input.val()
			var cache = [];				// cache MRU list
			var cacheSize = 0;			// size of cache in chars (bytes?)
			if($.trim(options.title)){
				$input.val(options.title).css('color','#aaa');
			}else{
				if($.trim($input.val())=='' || $.trim($input.val())=='中文/拼音')
					$input.val('中文/拼音').css('color','#aaa');
			}
			if( ! options.attachObject )
				options.attachObject = $(document.createElement("ul")).appendTo('body');

			$results = $(options.attachObject);
			$results.addClass(options.resultsClass);
			
			resetPosition();
			$(window)
				.load(resetPosition)		// just in case user is changing size of page while loading
				.resize(resetPosition);

			$input.blur(function() {
				setTimeout(function() { $results.hide();}, 200);
			});
			
			$input.focus(function(){
				if($.trim($(this).val())=='中文/拼音'){
					$(this).val('').css('color','#000');
				}
				if($.trim($(this).val())==''){
					//displayItems('');//显示热门城市列表
				}
			});
			$input.click(function(){
				var q=$.trim($(this).val());
				if(q){
					displayItems(q);
					$(this).select();
				}
			});
						
			// help IE users if possible
			try {
				if($results.bgiframe)
					$results.bgiframe();
			} catch(e) { }

			$input.keyup(processKey);//
			
			function resetPosition() {
				// requires jquery.dimension plugin
			//	var offset = $input.offset();
				//var txtBg = $('.carSearForm span').position();
				$results.css({
					top: ($(input).outerHeight()) + 'px',
					left:"0px"
				});
			}
			
			
			function processKey(e) {
				// handling up/down/escape requires results to be visible
				// handling enter/tab requires that AND a result to be selected
				if ((/27$|38$|40$/.test(e.keyCode) && $results.is(':visible')) ||
					(/^13$|^9$/.test(e.keyCode) && getCurrentResult())) {
		            
		            if (e.preventDefault)
		                e.preventDefault();
					if (e.stopPropagation)
		                e.stopPropagation();

	                e.cancelBubble = true;
	                e.returnValue = false;
					switch(e.keyCode) {
	
						case 38: // up
							prevResult();
							break;
				
						case 40: // down
							nextResult();
							break;
						case 13: // return
							selectCurrentResult();
							break;
							
						case 27: //	escape
							$results.hide();
							break;
	
					}
					
				} else if ($input.val().length != prevLength) {
					if (timeout) 
						clearTimeout(timeout);
					timeout = setTimeout(suggest, options.delay);
					prevLength = $input.val().length;
					
				}			
					
				
			}
			
			function suggest() {
				/**
				 * 判断是否实时获取数据 options.ajaxFlag 为真的话去数据库查询返回数据
				 * if(options.ajaxFlag) 
				 */
				var q = $.trim($input.val());
				if($.trim(q) && options.ajaxFlag){
					if(options.querySelectCb){
						options.querySelectCb(function(data,name,bool){
							options.source = data;
							options.keyName = "name";
							if(name)
								options.keyName = name;
							if(bool)
								options.bool = bool;
							displayItems(q);
						});
					}else{
							displayItems(q);
					}
				}else{
					$results.hide();
				}
			}		
			function displayItems(items) {
				var html = '';
				if (items=='') {
					for(h in options.hot_list){
						html+='<li rel="'+options.hot_list[h][0]+'"><a href="#'+h+'">'+options.hot_list[h][1]+'</a></li>';
					}
					//html='<div class="gray ac_result_tip">请输入中文/拼音或者↑↓选择</div><ul>'+html+'</ul>';
				}
				else {
					/*if (!items)
					return;
					if (!items.length) {
						$results.hide();
						return;
					}*/
					for (var i = 0; i < options.source.length; i++) {
						if(options.bool)
							options.source[i] = i;
						//var reg = new RegExp('^' + items + '.*$', 'im');
						//if ( reg.test(options.source[i][1]) || reg.test(options.source[i][2]) || reg.test(options.source[i][3])) {
							html += '<li rel="' + options.source[i].id + '" id="'+options.source[i].id+'" > <a href="#' + i + '">' + eval("options.source["+i+"]."+options.keyName)+ '</a></li>';
						//}
					}
//					if (html == '') {
//						suggest_tip = '<li class="gray ac_result_tip">对不起，找不到：' + items + '</li>';
//					}
//					else {
//						suggest_tip = '<ul><li class="nhover borderT"><a href="#">我的GPS位置</a></li><li class="nhover"><a class="fr" href="#">[添加]</a>我的家：<em><a href="#">宝安西乡</a></em></li><li class="nhover"><a class="fr" href="#">[修改]</a>工作地点：<em><a href="#">同方信息港</a></em></li></ul>';
//					}
					html =  '<ul>' + html + '</ul>';
				}
				
				if($.trim(items) && options.source.length > 0){
					$(options.attachObject).html(html).show();
					//$results.html(html).show();
				}else{
					$(options.attachObject).html(html).hide();
					//$results.html(html).hide();
				}
				$results = $(options.attachObject);
				for (var i = 0; i < options.source.length; i++) {
					
					$results.find("li[id='"+options.source[i].id+"']").data("data",options.source[i]);
				}
				//$results.children('ul').children('li:first-child').addClass(options.selectClass);
				
				$results.children('ul')
					.children('li')
					.mouseover(function() {
						$results.children('ul').children('li').removeClass(options.selectClass);
						$(this).addClass(options.selectClass);
					})
					.click(function(e) {
						e.preventDefault(); 
						e.stopPropagation();
						selectCurrentResult();
					});
			}
						
			function getCurrentResult() {
			
				if (!$results.is(':visible'))
					return false;
			
				var $currentResult = $results.children('ul').children('li.' + options.selectClass);
				if (!$currentResult.length)
					$currentResult = false;
					
				return $currentResult;

			}
			
			function selectCurrentResult() {
			
				$currentResult = getCurrentResult();
			
				if ($currentResult) {
					$input.val($currentResult.children('a').html().replace(/<span>.+?<\/span>/i,''));
					$results.hide();

					if( $(options.dataContainer) ) {
						$(options.dataContainer).val($currentResult.attr('rel'));
					}
	                
					if (options.onSelect) {
						options.onSelect($currentResult.data("data"));
					}
				}
			
			}
			
			function nextResult() {
			
				$currentResult = getCurrentResult();
			
				if ($currentResult)
					$currentResult
						.removeClass(options.selectClass)
						.next()
							.addClass(options.selectClass);
				else
					$results.children('ul').children('li:first-child').addClass(options.selectClass);
			
			}
			
			function prevResult() {
			
				$currentResult = getCurrentResult();
			
				if ($currentResult)
					$currentResult
						.removeClass(options.selectClass)
						.prev()
							.addClass(options.selectClass);
				else
					$results.children('ul').children('li:last-child').addClass(options.selectClass);
			
			}
	
		};
		
		$.fn.suggest = function(source, options) {
	       
			if (!source)
				return;
			options = options || {};
			options.source = source;
			options.hot_list=options.hot_list || [];
			options.delay = options.delay || 0;
			options.resultsClass = options.resultsClass || 'ac_results';
			options.selectClass = options.selectClass || 'ac_over';
			options.matchClass = options.matchClass || 'ac_match';
			options.minchars = options.minchars || 1;
			options.delimiter = options.delimiter || '\n';
			options.onSelect = options.onSelect || false;
			options.dataDelimiter = options.dataDelimiter || '\t';
			options.dataContainer = options.dataContainer || '#SuggestResult';
			options.attachObject = options.attachObject || null;

			this.each(function() {
				new $.suggest(this, options);
			});
	
			return this;
			
		};
		
	})(jQuery);
