﻿
(function($){
	var focusInstance = null;
$.fn.Suggest = function(config){
	var defaultConfig ={
		containerClassName : "suggest_container",	//提示层样式
		sugKeyClassName : "suggest_key",
		sugResultClassName : "suggest_result",
		selectedItemClassName : "selected_item",
		offsetLeft : 0,								//偏移，默认到文本框左对齐，可以通过该值做调整
		timerDelay : 200,
		resultFormat : "约$result$",
		closeBtnAlt : "关闭提示层",
		showCloseBtn : true,						//是否显示关闭按钮
		autoSubmit : true							//点击选项时，是否自动提交
	};
	
	this.CONFIG = $.extend(defaultConfig,config);
	var requestUrl =  "http://" + window.location.host + "/server.aspx?type=5&temp="+(new Date().getTime().toString(36));	
	var _self = this;
	var $container = null;		//主容器
	var ie = navigator.userAgent.indexOf("MSIE") > 0;
	var mouseDownItem = null;
	
	this.script = null;				//加载脚本
	this.scriptLastestTime = "";	//脚本最后加载时间
	this.scriptTimeout = false;		//脚本是过期
	this.selectedItem ;				//当前选中项索引
	this.dataCache = {};			//缓存查询数据
	this.queryStr = "";				//输入框的值
	this.timer = null;				//计时器
	this.isRunning = false;			//计时器是否处于运行状态
	this.pressingCount = 0;			//按住按键，连续触发keydown事件
	
	//初始化
	this._init = function(){
		_self.createSuggest();		//创建提示层
		var $liItems = $("#suggest_container");	
		
		$(_self).focus(function(){
			_self.start();
		}).blur(function(){
			_self.stop();
			_self.hide();
		}).keydown(function(event){
			var keyCode = event.keyCode;
			switch(keyCode){
				case 13:
					_self.submitForm();
					return;
				case 27:	//ESC键，隐藏层并还原原输入值
					_self.hide();
					_self.setQueryStr();
					break;
				case 38:
				case 40:
					//按住按键，延时处理
					if(_self.pressingCount++ ==0){
						if(_self.isRunning) _self.stop();
						_self.selectItem(keyCode == 40);
					}else if(_self.pressingCount >= 3){
						_self.pressingCount = 0;
					}
					break
			}
			if(keyCode != 38 && keyCode !=40){
				if(!_self.isRunning){
					_self.start();
				}
			}
		}).keyup(function(){
			_self.pressingCount = 0;
		}).attr("autocomplete","off");
		
		$container.mousemove(function(event){
			var target = event.target;
			if(target.nodeName != "LI"){
				target = $(target).parent("li")
			}
			_self.removeSelectedItem();
			_self.setSelecedItem(target);
		}).mousedown(function(e){
			mouseDownItem = e.target ;
			//使输入框不会失去焦点
			//for IE
			_self[0].onbeforedeactivate = function(){
				window.event.returnValue = false;
				_self[0].onbeforedeactivate = null;
			};
			return false;
		}).mouseup(function(event){
			if(mouseDownItem != event.target) return ;
			_self.submitForm();
		});
	};
	//添加提示层
	this.createSuggest = function(){
		$container = $(
				'<div id="suggest_container" >'+
				'</div>')
				.bind("selectstart",function(){ return false;});
		$("body").append($container);
		$container.css({ 
			 position : "absolute" , 
			 left :  $(_self).offset().left + _self.CONFIG.offsetLeft,
			 top : $(_self).offset().top + $(_self).outerHeight() + 5
		})
		if($container.width() == 0){
			$container.css("width",$(_self).outerWidth() - 2);
		}
	};
	//更新提示层数据
	this.fillEleContainer = function(content){
		if(content.length == 1){
			$container.html("");
			$container.prepend(content)
		}else{
			$container.html(content);
		}
		_self.selectedItem = null;
	};
	//启动计时器，监听用户输入
	this.start = function(){
		focusInstance = _self;
		_self.timer = setInterval(function(){
			_self.updateInput();
		},_self.CONFIG.timerDelay);
		_self.isRunning = true;
	};
	//停止计时器
	this.stop = function(){
		focusInstance = null;
		clearInterval(_self.timer);
		_self.isRunning = false;
	};
	//是否需要更新信息
	this.needUpdate = function(){
		return $(_self).val() != _self.queryStr;
	};
	//更新当前文本框
	this.updateInput = function(){
		if(!_self.needUpdate()) return;
		//查询，更新层内容，保存缓存，
		//_self.dataCache[]
		_self.queryStr = $(_self).val();
		var q = _self.queryStr;
		if(!$.trim(q).length){
			_self.fillEleContainer("");
			_self.hide();
			return;
		}
		var content = "";
		if(typeof _self.dataCache[q] != "undefined"){
			//使用缓存数据
			_self.fillEleContainer(_self.dataCache[q]);
			_self.displayContainer();
		}else{
			_self.requestData();
		}
		
	};
	//根据内容显示或隐藏提示层
	this.displayContainer = function(){
		if($container.children("ol").length == 0){
			_self.hide();
		}else{
			_self.show();
		}
	};
	//加载远程数据
	this.requestData = function(){
		if(!ie) _self.script = null;
		if(!_self.script){
			_self.script = $("<script></script>").attr("type","text/javascript");
			document.getElementsByTagName("head")[0].insertBefore(_self.script[0],document.getElementsByTagName("head")[0].firstChild);
			if(!ie){
				var t = new Date().getTime();
				_self.scriptLastestTime = t;
				_self.script.attr("time",t);
				_self.script.load(function(){
					//判断返回的数据是否过期
					_self.scriptTimeout = _self.script.attr("time") != _self.scriptLastestTime;
				})
			}
		}

		_self.script.attr("src",requestUrl + "&id=" + Y("hidSearch").value + "&val=" + encodeURIComponent(_self.queryStr));

	};
	//处理获取到的数据
	this.handleResponse = function(data){
		if(_self.scriptTimeout) return ;
		if(!$.isArray(data)) return;
		var result = data.length == 2 ? data[1] : data[0];
		//格式化数据
		result = _self.formatData(result);
		var len = result.length;
		var content = "";
		if(len>0){
			var $list = $("<ol>");
			for(i=0; i<len; i++){
				$list.append(_self.formatItem(result[i]["key"],result[i]["result"]));
			}
			content = $list;
		}
		_self.fillEleContainer(content);
		_self.appendCloseBtn();
		_self.dataCache[_self.queryStr] =  $container.html();
		_self.displayContainer();
	}
	//格式化结果数组
	this.formatData = function(data){
		var arr = [];
		if(!data) return arr;
		var len = data.length;
		if(!len) return arr;
		var item;
		for( i=0; i<len; i++){
			item = data[i];
			if(typeof(item) == "string"){
				arr[i] = {"key" : item};
			} else if ($.isArray(item) && item.length >= 2){
				arr[i] = {"key" : item[0] , "result" : item[1]};
			}
		}
		return arr;
	};
	//格式化输出项
	this.formatItem = function(key,result){
		var $li = $("<li></li>").append($('<span></span>').addClass(_self.CONFIG.sugKeyClassName).html(key)).attr("key",key);
		if(typeof result != "undefined"){
			var resultText = _self.CONFIG.resultFormat.replace("$result$",result);
			$li.append($('<span></span>').addClass(_self.CONFIG.sugResultClassName).html(resultText));
		}
		return $li[0];
	};
	//更新当前文本框为选中的key
	this.updateInputFromKey = function(){
		$(_self).val(_self.getSelectedItemKey());
	};
	this.appendCloseBtn = function(){
		if(_self.CONFIG.showCloseBtn){
			$('<div class="suggest_close"></div>')
			.append(
				$('<a href="javascript:void(0);">关闭</a>')
				.attr("title",_self.CONFIG.closeBtnAlt)
			).appendTo($container);
		}
	};
	//用键盘选择key
	this.selectItem = function(down){
		//不存在搜索结果，直接返回
		_self.stop();
		var items = $container.find("li");
		if(items.length == 0) return ;
		//按ESc隐藏了，显示返回就可以
		if(_self.isVisible()){
			_self.show();
			return;
		}
		var newSelectedItem;
		if(_self.selectedItem){
			newSelectedItem = down ? $(_self.selectedItem).next() : $(_self.selectedItem).prev();
		}else{
			newSelectedItem = items.eq(down ? 0 : items.length - 1);
		}
		newSelectedItem = newSelectedItem[0]
		_self.removeSelectedItem();
		_self.setSelecedItem(newSelectedItem);
		if(!newSelectedItem){
			//回复原文本框值
			_self.setQueryStr();
			return;
		}
		_self.updateInputFromKey();
	};
	this.isVisible = function(){
		return $container.css("display") == "none";
	};
	//移除选中项
	this.removeSelectedItem = function(){
		$(_self.selectedItem).removeClass(_self.CONFIG.selectedItemClassName);
		_self.selectedItme = null;
	};
	//设置选中项
	this.setSelecedItem = function(target){
		$(target).addClass(_self.CONFIG.selectedItemClassName);
		_self.selectedItem = target;
	};
	//回复原文本框值
	this.setQueryStr = function(){
		$(_self).val(_self.queryStr);
	};
	//获取选中项的key
	this.getSelectedItemKey = function(){
		if(!_self.selectedItem) return "";
		return $(_self.selectedItem).attr("key");
	};
		//显示提示层
	this.show = function(){
		$container.show();
	};
	//隐藏提示层
	this.hide = function(){
		$container.hide();
	};
	this.submitForm = function(){
		if(_self.selectedItem != null ){
			_self.updateInputFromKey();
		}
		$(_self).blur();
		var form = $(_self)[0].form;
		$("#tt2").html("");
		if(!form || !_self.CONFIG.autoSubmit) return false;
		form.submit();
	};
	this._init();
};
CallBack = function(data){
	if(!focusInstance) return;
	focusInstance.handleResponse(data);
}
	
})(jQuery)

$().ready(function(){
	$("#txtSearch").Suggest();
})