/**
 * Suggest 实现，需要prototype支持
 * @param self_name		当前Suggest对象名称
 * @param ajax_url		Ajax请求地址
 * @param show_obj_name	输入的input的ID
 * @param value_obj_name 值的保存id
 * @param other_param	额外参数列表，需要提供一个哈希
 * @param param_name	参数名称，可不填，默认为keyword
 */
var Suggest = function(self_name,ajax_url,show_obj_name,value_obj_name,other_param,param_name,overflow){
	this._self_name		= '';			// 当前Suggest的名字
	this._ajax_url		= '';			// Ajax请求地址
	this._param_name	= 'keyword';	// 请求参数名
	this._other_param	= {};			// 其他参数列表
	this._first_data	= null;
	this._data 			= null;
	this._show_obj_name	= '';
	this._show_obj		= null;
	this._overflow		= false;
	this._show_parent	= null;
	this._value_obj_name='';
	this._value_obj		= null;
	this._last_v		= '';			// 上一次请求的关键词
	// 关于显示层的部分
	this._suggest_div		= null;
	this._suggest_empty_div	= null;
	
	// 赋值
	if( ajax_url!=undefined ){
		this._ajax_url = ajax_url;
	}
	if( param_name!=undefined ){
		this._param_name = param_name;
	}
	if( self_name!=undefined ){
		this._self_name = self_name;
	}
	if( show_obj_name!=undefined&&show_obj_name!=null&&$(show_obj_name) ){
		this._show_obj_name = show_obj_name;
		this._show_obj = $(show_obj_name);
	}
	if( value_obj_name!=undefined&&value_obj_name!=null&&$(value_obj_name) ){
		this._value_obj_name = value_obj_name;
		this._value_obj = $(value_obj_name);
	}
	if( other_param!=undefined&&other_param!=null ){
		this._other_param = other_param;
	}
	if( overflow!=undefined&&overflow!=null ){
		this._overflow = overflow;
	}
	
	this.resetParam = function(){
		if( this._show_obj_name ){
			this._show_obj = $(this._show_obj_name);
		}
		if ( this._value_obj_name ){
			this._value_obj = $(this._value_obj_name);
		}
		// 处理对象的位置
		this.bind();
		this._suggest_div = $(this._show_obj_name+'_suggest_div');
	};
	
	this.dealOverflow = function(){
		this._show_parent = this._show_obj.parentNode;
		/*
		this._show_parent = document.createElement("div");
		var new_show_obj = this._show_obj.cloneNode(true);
		this._show_obj.replace(this._show_parent);
		this._show_parent.appendChild(new_show_obj);
		*/
	};
	
	// 初始化
	this.initialize = function(){
		if( this._self_name=="" ){
			alert("Suggest：未指定当前对象自身的名称");
			return false;
		}
		if( this._ajax_url=="" ){
			alert("Suggest：未提供数据请求地址");
			return false;
		}
		if( this._show_obj_name==""||this._show_obj==undefined ){
			alert("Suggest：输入控件的对象名错误");
			return false;
		}
		var cmd = 'window.'+this._show_obj_name+'_obj_name';
		cmd += '="'+this._self_name+'";';
		eval(cmd);
		if( this._overflow ){
			this.dealOverflow();
		}
		// 创建对象
		if( this._suggest_div==null ){
			// 处理对象的位置
			var r = this.getpos(this._show_obj);
			this.create();
			this.bind();
		}
	}
	
	// 绑定对象
	this.bind = function(){
		this._show_obj.autoComplete = 'off';
		this._show_obj.className = 'in1';
		this._show_obj.onkeydown = function(evnt){
			var obj_name = '';
			var cmd = 'obj_name = window.'+this.id+'_obj_name;';
			eval(cmd);
			if( obj_name ){
				var evnt = (evnt) ? evnt : ((window.event) ? window.event : "")
				if ( !evnt ) {
					return false;
				}
				cmd = obj_name+'.inputOnkeydown(evnt);';
				eval(cmd);
			}
		};
		this._show_obj.onkeyup = function(evnt){
			var obj_name = '';
			var cmd = 'obj_name = window.'+this.id+'_obj_name;';
			eval(cmd);
			if( obj_name ){
				var evnt = (evnt) ? evnt : ((window.event) ? window.event : "")
				if ( !evnt ) {
					return false;
				}
				cmd = obj_name+'.inputOnkeyup(evnt);';
				eval(cmd);
			}
		};
		this._show_obj.onfocus = function(){
			var obj_name = '';
			var cmd = 'obj_name = window.'+this.id+'_obj_name;';
			eval(cmd);
			if( obj_name ){
				cmd = obj_name+'.inputOnfocus();';
				eval(cmd);
			}
		};
		this._show_obj.onblur = function(){
			var obj_name = '';
			var cmd = 'obj_name = window.'+this.id+'_obj_name;';
			eval(cmd);
			if( obj_name ){
				cmd = obj_name+'.inputOnblur();';
				eval(cmd);
			}
		};
	};
	
	// 获得当前选中的条目
	this.getHotNum = function(){
		var obj;
		var num = 0;
		var hotnum = -1;
		while((obj = $(this._show_obj_name+"_suggest_"+num)) != null){
			if(obj.className == "sgt_on"){
				hotnum = num;
			}
			num++;
		}
		return {"hotnum":hotnum,"totalnum":num};
	};
	
	// 获得输入焦点
	this.inputOnfocus = function(){
		this._show_obj.className = 'in2';
		/*
		if(thisobj.value == ""){
			this._suggest_empty_div.style.display = "block";
			this._suggest_empty_div.innerHTML = "请输入查询内容";
		}
		*/
		this.getRecordList();
	};
	
	// 失去焦点
	this.inputOnblur = function(){
		this._show_obj.className = 'in1';
		//this._suggest_div.style.display = "none";
		this._suggest_empty_div.style.display = "none";
	};
	
	// 键盘按下
	this.inputOnkeydown = function(evnt){
		// 屏蔽回车
		if (evnt.keyCode == 13){
			return false;
		}
		//LEFT
		if(evnt.keyCode == 37 && $(this._show_obj_name).value==""){
			return;
		}
		//RIGHT
		if(evnt.keyCode == 39 && $(this._show_obj_name).value==""){
			return;
		}

		var hotinfo = this.getHotNum();
		var hotnum = hotinfo.hotnum;
		var num = hotinfo.totalnum;
		var suggest_name = this._show_obj_name+'_suggest';
		//DOWN
		if(evnt.keyCode == 40){
			if($(suggest_name+"_0") != null && this._suggest_div.style.display == "block"){
				if(hotnum == -1){
					$(suggest_name+"_0").className = "sgt_on";
				}
				else{
					var nextnum = hotnum == num-1 ? 0 : hotnum+1;
					$(suggest_name+"_"+hotnum).className = "sgt_of";
					$(suggest_name+"_"+nextnum).className = "sgt_on";
				}
				return false;
			}
		}
		//UP
		if(evnt.keyCode == 38){
			if($(suggest_name+"_0") != null && this._suggest_div.style.display == "block"){
				if(hotnum == -1){
					$(suggest_name+"_"+(num-1)).className = "sgt_on";
				}
				else{
					var prevnum = hotnum == 0 ? num-1 : hotnum-1;
					$(suggest_name+"_"+hotnum).className = "sgt_of";
					$(suggest_name+"_"+prevnum).className = "sgt_on";
				}
			}
		}
	};
	
	// 键盘起来
	this.inputOnkeyup = function(evnt){
		//ENTER
		if (evnt.keyCode == 13){
			this.getRecord();
		}
		if(evnt.keyCode == 38 || evnt.keyCode == 40){
		}
		else{
			if( evnt.keyCode!=13 ){
				this.setRecordEmpty();
			}
			this.getRecordList();
		}
	};
	
	// 选择到数据
	this.getRecord = function(){
		var hotinfo = this.getHotNum();
		var hotnum = hotinfo.hotnum;
		var totalnum = hotinfo.totalnum;
		this.setRecord(hotnum);
	};
	
	// 设置值属性为空，表示没有选择
	this.setRecordEmpty = function(){
		if( this._value_obj ){
			this._value_obj.value = '';
		}
	};
	
	// 设置数据值
	this.setRecord = function(index){
		if( this._data[index] ){
			this._show_obj.value = this._data[index]['value'];
			if( this._value_obj ){
				this._value_obj.value = this._data[index]['key'];
			}
		}
		this._suggest_div.style.display = 'none';
		this._show_obj.blur();
		this.inputOnblur();
	};
	
	// Ajax获取数据
	this.getRecordList = function(){
		var v = this._show_obj.value.trim();
		if( v=="" ){
			this._data = [];
			this._last_v = '';
			this.updateData();
			return ;
		}
		if( v==this._last_v ){
			this.updateData();
			return ;
		}
		this._last_v = v;
		this._data = [];
		// 获取数据
		// Ajax请求
		var param = this._other_param;
		param['obj_name'] = encodeURIComponent(this._self_name);
		param[this._param_name] = encodeURIComponent(v);
		param['rid'] = this.randomString();
		var pars = $H(param).toQueryString();
		var url		= this._ajax_url;
		new Ajax.Request(
			url,{
				method:'get',
				evalJS : true,
				parameters:pars,
				onComplete:Suggest.setRecordList
			}
		);
	};
	
	// 随机串
	this.randomString = function(){
		return parseInt(Math.random()*999999);
	};
	
	// 创建层
	this.create = function(){
		if( !$(this._show_obj_name+'_suggest_div') ){
			this._suggest_div = document.createElement("div");
			this._suggest_div.setAttribute('id',this._show_obj_name+'_suggest_div');
			this._suggest_div.className = "fsg_nl";
			this._suggest_div.style.display	= 'none';
			this._suggest_div.style.width	= '210px';
			this._suggest_div.style.backgroundColor = '#eeeeee';
			this._suggest_div.style.fontSize	= "12px";
			if( this._overflow ){
				this._suggest_div.style.zIndex	= "5000";
				this._show_parent.appendChild(this._suggest_div);
			}
			else{
				this._suggest_div.style.position	= "absolute";
				this._suggest_div.style.zIndex	= "5000";
				this._suggest_div.style.left	= '0px';
				this._suggest_div.style.top		= '0px';
				document.body.appendChild(this._suggest_div);
			}
		}
		if( !$(this._show_obj_name+'_suggest_empty_div') ){
			this._suggest_empty_div = document.createElement("div");
			this._suggest_empty_div.setAttribute('id',this._show_obj_name+'_suggest_empty_div');
			this._suggest_empty_div.className		= "fsg_nl";
			this._suggest_empty_div.style.position	= "absolute";
			this._suggest_empty_div.style.zIndex	= "4999";
			this._suggest_empty_div.style.display	= 'none';
			this._suggest_empty_div.style.left		= '0px';
			this._suggest_empty_div.style.width		= '220px';
			this._suggest_empty_div.style.top		= '0px';
			this._suggest_empty_div.style.fontSize	= '12px';
			this._suggest_empty_div.style.paddingLeft = '7px';
			this._suggest_empty_div.style.backgroundColor = '#eeeeee';
			this._suggest_empty_div.style.color = '#666666';
			this._suggest_empty_div.innerHTML = '请输入查询内容';
			document.body.appendChild(this._suggest_empty_div);
		}
	};
	
	// 对象自身处理数据方法
	this.setRecordList = function(ret){
		this._data = ret['result'];
		this.updateData();
	};

	// 将_data中的数据更新到层中
	this.updateData = function(){
		this._suggest_empty_div.style.display = 'none';
		var html = '';
		var len = this._data.length;
		var suggest = this._show_obj_name+'_suggest';
		if( len>0 ){
			for(var i=0;i<len;i++){
				html += '<div id="'+suggest+'_'+i+'" class="sgt_of" style="width:200px;font-size:12px;" onmouseover="'+this._self_name+'.onmouseover(this);" onmousedown="'+this._self_name+'.onmousedown(this);">'+this._data[i]['value']+'</div>';
			}
			this._suggest_div.innerHTML = html;
			this._suggest_div.style.display = 'none';
			if($(suggest+"_0") != null){
				$(suggest+"_0").className = "sgt_on";
			}
			var obj = document.activeElement;
			if( obj.id==this._show_obj_name ){
				if( this._overflow==false ){
					this.setPosition();
				}
				this._suggest_div.style.display = 'block';
			}
		}
		else{
			this._suggest_div.style.display = 'none';
		}
	};
	
	// 获得元素的位置
	this.getpos = function(element){
		if ( arguments.length != 1 || element == null ){
			return null;
		}
		var elmt = element;
		var offsetTop = elmt.offsetTop;
		var offsetLeft = elmt.offsetLeft;
		var offsetWidth = elmt.offsetWidth;
		var offsetHeight = elmt.offsetHeight;
		while( elmt = elmt.offsetParent ){
			// add this judge
			if ( elmt.style.position == 'absolute'|| ( elmt.style.overflow != 'visible' && elmt.style.overflow != '' ) ){
				break;
			}
			offsetTop += elmt.offsetTop;
			offsetLeft += elmt.offsetLeft;
		}
		return {top:offsetTop, left:offsetLeft, right:offsetWidth+offsetLeft, bottom:offsetHeight+offsetTop };
	};
	
	//设置位置
	this.setPosition = function(){
		var r = this.getpos(this._show_obj);
		var left= parseInt(r.left,10);
		var top	= parseInt(r.top,10)+this._show_obj.offsetHeight;
		this._suggest_div.style.left = left+'px';
		this._suggest_div.style.top = top+'px';
	};
	
	// 鼠标划过的样式
	this.onmouseover = function(thisobj){
		var arr		= thisobj.id.split('_');
		var thisnum	= arr[2];
		var obj;
		var num		= 0;
		var suggest = this._show_obj_name+'_suggest';
		while( (obj = $(suggest+'_'+num)) != null){
			if(thisnum == num){
				obj.className = "sgt_on";
			}
			else{
				obj.className = "sgt_of";
			}
			num++;
		}
	};
	//鼠标按下
	this.onmousedown = function(thisobj){
		var arr = thisobj.id.split('_');
		var num = arr[arr.length-1];
		this.setRecord(num);
	};

	this.initialize();
}
// 静态接受数据方法
Suggest.setRecordList = function(xmlRequest){
	var ret = xmlRequest.responseText;
	eval('ret = ' + ret + ';');
	var cmd = ret['obj_name']+".setRecordList(ret);";
	eval(cmd);
};