(function($) {
	var bro = $.browser;
	var inputTxt = language == 'zh' ? '中文/拼音' : "Chinese/Pinyin";
	var info = language == 'zh'
			? "请输入中文/拼音或者↑↓"
			: "Input Chinese/Pinyin or ↑↓ choose";
	var orderinfo = language == 'zh' ? "按拼音排序" : "Order by Pinyin";
	var errorinfo = language == 'zh' ? "对不起，找不到：" : "Sorry,not found:";
	$.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($input.val()) == '' || $.trim($input.val()) == inputTxt)
			$input.val(inputTxt).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() {
					selectCurrentResult();
					setTimeout(function() {
								$results.hide();
								if (bro.msie) {
									if (bro.version == 6.0) {
										$("select").show();
									}
								}

								if ($.trim($input.val()) == '') {
									$input.val(inputTxt).css('color', '#aaa');
								}
							}, 200);
				});

		$input.focus(function() {
					if ($.trim($(this).val()) == inputTxt) {
						$(this).val('').css('color', '#000');
						if (bro.msie) {
							if (bro.version == 6.0) {
								$("select").hide();
							}
						}
					}
					if ($.trim($(this).val()) == '') {
						// 显示热门城市列表
						displayItems('');
						if (bro.msie) {
							if (bro.version == 6.0) {
								$("select").hide();
							}
						}
					}
				});
		$input.click(function() {
					$(this).val("");
					var q = $.trim($(this).val());
					displayItems(q);
					$(this).select();

					if (bro.msie) {
						if (bro.version == 6.0) {
							$("select").hide();
						}
					}
				});

		// help IE users if possible
		try {
			$results.bgiframe();
		} catch (e) {

		}

		/** 开始处理按键 */
		$input.keyup(processKey);

		/**
		 * 清除上次显示的div ul li
		 */
		function resetPosition() {
			// requires jquery.dimension plugin
			var offset = $input.offset();
			$results.css({
						top : (offset.top + input.offsetHeight) + 'px',
						left : offset.left + 'px'
					});
		}

		/**
		 * 进行按键处理
		 */
		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() {
			var q = $.trim($input.val());
			displayItems(q);
		}

		/**
		 * 显示满足条件的下拉列表
		 */
		function displayItems(items) {
			var html = '';
			if (items == '') {
				// 热门城市遍历
				for (h in options.hot_list) {
					html += '<li rel="' + options.hot_list[h][0]
							+ '"><a href="#' + h + '"><span>'
							+ options.hot_list[h][language == 'zh' ? 2 : 1]
							+ '</span>'
							+ options.hot_list[h][language == 'zh' ? 1 : 2]
							+ '</a></li>';
				}
				html = '<div class="gray ac_result_tip">' + info + '</div>'
						+ '<ul>' + html + '</ul>';
			} else {
				/*
				 * if (!items) return; if (!items.length) { $results.hide();
				 * return; }
				 */
				for (var i = 0; i < options.source.length; i++) {
					// 国内城市匹配
					var reg = new RegExp('^' + items + '.*$', 'im');
					if (reg.test(options.source[i][0])
							|| reg.test(options.source[i][1])
							|| reg.test(options.source[i][2])
							|| reg.test(options.source[i][3])) {
						html += '<li rel="' + options.source[i][0]
								+ '"><a href="#' + i + '"><span>'
								+ options.source[i][language == 'zh' ? 2 : 1]
								+ '</span>'
								+ options.source[i][language == 'zh' ? 1 : 2]
								+ '</a></li>';
					}
				}
				if (html == '') {
					suggest_tip = '<div class="gray ac_result_tip">'
							+ errorinfo + items + '</div>';
				} else {
					suggest_tip = '<div class="gray ac_result_tip">' + items
							+ '，' + orderinfo + '</div>';
				}
				html = suggest_tip + '<ul>' + html + '</ul>';
			}

			$results.html(html).show();
			$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.apply($input[0]);
				}
			}

		}

		/**
		 * 按下DOWN 或用鼠标进行向下选择的时候
		 */
		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);

		}
		/**
		 * 按下UP 或用鼠标进行向上选择的时候
		 */
		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);
