﻿/*******************************************************************************
 *        程序 ID     ：    ProductPrompt
 *        程序名称    ：    金融产品代码输入提示

 *        处 理       ：    金融产品代码输入处理
 *        功 能       ：    根据输入的金融品种数据,进行模糊匹配,显示模糊匹配数据
 *
 *        修改履历
 *        年  月  日 区分 所 属/担 当        内 容                              对应编号
 *        ---------- ---- ------------------ ---------------------------------- --------
 *        2007/11/30 编写 Intasect/张玉华    新規作成
 *        2007/12/10 编写 Intasect/张玉华    添加注释头                         NO.U6126
 *        2008/03/10 编写 Intasect/蒋和伟    删除只允许输入字母、数字的校验     NO.52 NO.53
 *
 *        Copyright ( C ) 2006 by Intasect communications(Chengdu), Co, Ltd.
 *        All rights reserved.
 *
********************************************************************************/

//品种提示下拉公共处理域
var ProductPromptCom = {
	//下拉框DIV容器
	ListDiv : "autolist",
	//下拉框边框颜色
	ListDivBorderColor : "#b1cfdf",
	//选中的字体颜色
	SelectedFontColor : "#646464",
	//选中的div颜色
	SelectedColor : "#a8cede",
	//未选中的div颜色
	NoSelectColor : "#fcfdfe",
	//未选中的字体颜色
	NoSelectFontColor : "#646464",
	//获取金融产品对应的类型数组名称
	GetType : function(type){
		var array=null;
		switch(type){
			case "W001":array=stock_code;break;//股票
			case "W002":array=bond_code;break;//债券
			case "W003":array=fund_code;break;//基金
			case "W004":array=foreign_code;break;//外汇
			case "W005":array=gold_code;break;//黄金
			default:array=stock_code;break;//缺省为股票
		}
		return array;
	},
	//获取要显示的下拉单元的数组
	GetShowProducts : function(text,$AC){
		var array=ProductPromptCom.GetType($AC.type);//获取相关品种的数据数组
		var arrayLen=array.length;//获取品种数组长度
		var resultArray=new Array();
		var count=0;
		for(var i=0;i<arrayLen;i++){
			if(		array[i][0].toUpperCase().indexOf(text)>=0//先ID比较，模糊匹配
					||array[i][2].toUpperCase().indexOf(text)>=0//再名称比较，模糊匹配
					||array[i][3].toUpperCase().indexOf(text)>=0){//最后简称比较，忽略大小写，模糊匹配
						resultArray.push(array[i]);
						count++;
			}
			if(count>=$AC.showNum){
				break;
			}
		}
		return resultArray;
	},
	//获取下拉框单行的HTML字符串
	GetRowHTML : function(array,color,fontColor,length,objId,showCompart,index){
		return "<div id=\""+objId+"_divcoderow_"+index+"\" "+//初始化第一条为选中
						"style=\"cursor:hand;color:"+fontColor+";background-color:"+color+";font-size:9pt;white-space:nowrap;\" "+
						"onmouseover=\"ProductPromptCom.RowHover(this,'"+length+"','"+objId+"');\" "+
						"onclick=\"ProductPromptCom.RowClick(this,'"+objId+"');\" "+
						"pvalue=\""+array[1]+"\" pshowValue=\""+array[0]+"\" ptext=\""+array[2]+"\">" +
						array[0]+showCompart+array[2]+
						"</div>";
	},
	//获取下拉框的HTML字符串
	GetListHTML : function(array,obj){
		var strHTML="<div id=\"outdiv\">";
		var length=array.length;//获取数组元素个数
		if(length<1){//判断数组元素个数
			strHTML+="</div>";
			return strHTML;
		}
		var $PPC=ProductPromptCom;
		strHTML+=$PPC.GetRowHTML(array[0],$PPC.SelectedColor,$PPC.SelectedFontColor,length,obj.id,obj.assclass.showCompart,0);
		obj.assclass.hoverRowId=obj.id+"_divcoderow_0";
		obj.assclass.value=array[0][1];//选中品种编号
		obj.assclass.showValue=array[0][0];//选中品种显示编号
		obj.assclass.text=array[0][2];//选中品种名称
		for(var i=1;i<array.length;i++){
			strHTML+=$PPC.GetRowHTML(array[i],$PPC.NoSelectColor,$PPC.NoSelectFontColor,length,obj.id,obj.assclass.showCompart,i);
		}
		strHTML+="</div>";
		return strHTML;
	},
	//隐藏动态下拉列表层
	CloseListDiv : function(id)
	{
		id=$(id);
		if(id!=null){
			id.style.display = "none";
			id.innerHTML = "";
		}
	},
	//显示动态下拉列表层
	OpenListDiv : function(obj,id)
	{
		var id = $(id);
		id=$(id);
		if(id!=null){
			id.style.top=ProductPromptCom.GetTop(obj)+obj.clientHeight;
			id.style.left=ProductPromptCom.GetLeft(obj);
			id.style.display="block";
		}
	},
	//获取控件的左边绝对位置
	GetLeft : function(obj)
	{
		var left=obj.offsetLeft;
		while(obj=obj.offsetParent){
			left+=obj.offsetLeft;
		}
		return left;
	},
	//获取控件的顶端绝对位置
	GetTop : function(obj)
	{
		var top=obj.offsetTop;
		while(obj=obj.offsetParent){
			top+=obj.offsetTop;
		}
		return top;
	},
	//如果当前选中的和早先选中不是同一条，恢复早先选中条的样式
	RowHover : function (obj,length,id)
	{
		if(!obj){
			return;
		}
		id=$(id).assclass;
		if(obj.id==id.hoverRowId){
			return;
		}
		if(!(id.hoverRowId==null||id.hoverRowId=="")){
			var oldRow=$(id.hoverRowId);
			id.hoverRowId=obj.id;
			oldRow.style.backgroundColor=ProductPromptCom.NoSelectColor;
			oldRow.style.color=ProductPromptCom.NoSelectFontColor;
			
		}
		obj.style.backgroundColor=ProductPromptCom.SelectedColor;
		obj.style.color=ProductPromptCom.SelectedFontColor;
	},
	//显示下拉框处理
	ShowList : function(obj)
	{
		var $PPC=ProductPromptCom;
		var $AC=obj.assclass;
		$AC.showValue=null;
		$AC.text=null;
		$AC.value=null;
		$PPC.CloseListDiv($PPC.ListDiv);//隐藏动态下拉列表层
		if(!obj){
			return;
		}
		var text=obj.value.replace(/^\s*|\s*$/g,"");//获取输入框文本
		if (text==""){
			return;
		}
		text=text.toUpperCase();//将录入框的数据转化为大写,用于根据拼音检索
		var array=$PPC.GetShowProducts(text,$AC);//获取要显示的下拉单元的数组
		if(array.length>0){//判断是否有要显示的下拉单元
			$($PPC.ListDiv).style.width=obj.scrollWidth+"px";
			$($PPC.ListDiv).innerHTML=$PPC.GetListHTML(array,obj);
			$PPC.OpenListDiv(obj,$PPC.ListDiv);
		}
	},
	//根据step设定选定行
	SetSelectRow : function(obj,step)
	{
		var $AC=obj.assclass;
		if($AC==null){
			return;
		}
		if($AC.hoverRowId==null){
			return;
		}
		var oldRow=$($AC.hoverRowId)
		if(oldRow==null){
			return;
		}
		var selectedIndex=$AC.hoverRowId.split("_");
		selectedIndex=new Number(selectedIndex[selectedIndex.length-1]);
		if(selectedIndex==0&&step==-1){//如果是第一条,则向上递减时定位到最后一条
			selectedIndex=$AC.showNum-1;
		}
		else if(selectedIndex>=($AC.showNum-1)&&step==1){//如果是最后一条,则向上递减时定位到第一条(从0开始计数)
			selectedIndex=0;
		}
		else{
			selectedIndex=selectedIndex+step;
		}
		var newRow=$(obj.id+"_divcoderow_"+selectedIndex);
		if(newRow==null){
			return;
		}
		oldRow.style.backgroundColor = ProductPromptCom.NoSelectColor;//改变原来选择的行的样式
		oldRow.style.color = ProductPromptCom.NoSelectFontColor;
		newRow.style.backgroundColor = ProductPromptCom.SelectedColor;//改变新选择的行的样式
		newRow.style.color = ProductPromptCom.SelectedFontColor;
		$AC.hoverRowId=newRow.id;
		ProductPromptCom.KeepSelectedRow($AC);
		
	},
	//行点击
	RowClick : function(row,obj)
	{
		obj=$(obj);
		if(obj==null||row==null){
			return;
		}
		$AC=obj.assclass;
		if(obj==null){
			return;
		}
		$AC.hoverRowId=row.id;
		ProductPromptCom.KeepSelectedRow($AC);
		ProductPromptCom.ShowSelectedRow(obj);
	},
	//保存当前选定行
	KeepSelectedRow : function(obj)
	{
		row=$(obj.hoverRowId);
		obj.showValue=row.pshowValue;
		obj.value=row.pvalue;
		obj.text=row.ptext;
	},
	//显示选定行
	ShowSelectedRow : function(obj)
	{
		if(obj.assclass.showValue!=null&&obj.assclass.showCompart!=null&&obj.assclass.text!=null){
			obj.value=obj.assclass.showValue+obj.assclass.showCompart+obj.assclass.text;
		}
		obj.focus();
		obj.select();
	},
	//检查选择的品种的编码和名称是否和关联录入框的数据相同并且是正确存在的
	CheckCodeRight : function(obj,type){
		var $AC=obj.assclass;
		var text=obj.value.replace(/^\s*|\s*$/g,"");//录入框数据
		if(text==""){
			return false;
		}
		var value=$AC.showValue+$AC.showCompart+$AC.text;//选择的品种的编码和名称组合成录入框的数据
		if(text!=value){//检查选择的品种的编码和名称是否和关联录入框的数据相同
			if(text!=$AC.showValue){//判断关联录入框中的编码数据是否和选择的品种的编码相同
				return false;
			}
		}
		value=$AC.value;//选择的品种的编码
		if(value==null||value==""){
			return false;
		}
		text=obj.assclass.text;//选择的品种的名称
		if (text==null||text==""){
			return false;
		}
		var showValue=obj.assclass.showValue;//选择品种的显示编码
		if (showValue==null||showValue==""){
			return false;
		}
		type=ProductPromptCom.GetType(type);
		var length=type.length;
		var result=false;
		for(var i=0;i<length;i++){//检查选择的品种的编码和名称是否是正确存在的
			if(type[i][1]==value&&type[i][2]==text&&type[i][0]==showValue){
				result=true;
				break;
			}
		}
		return result;
	},
	KeyUpHandle : function(e)//键盘按钮释放事件处理
	{
		if(e.srcElement.assclass.search){
			ProductPromptCom.ShowList(e.srcElement);//显示选择下拉框
		}
		return true;
	},
	KeyDownHandle : function(e)
	{
		var $PPC=ProductPromptCom;

		//DEL NO.52
		
		if(e.keyCode==13||e.keyCode==9){//回车和TAB键
			e.srcElement.assclass.search=false;
			if(e.keyCode==13&&$(ProductPromptCom.ListDiv).style.display=="none"){//回车键
				e.srcElement.focus();
				e.srcElement.select();
				eval(e.srcElement.assclass.enterHandler);
				return true;
			}
			$PPC.ShowSelectedRow(e.srcElement);//显示选定行
			$PPC.CloseListDiv($PPC.ListDiv);//设定下拉选择框不可见
		}
		else if(e.keyCode==38){//KEY_UP
			e.srcElement.assclass.search=false;
			if($(ProductPromptCom.ListDiv).style.display=="none"){
				return false;
			}
			$PPC.SetSelectRow(e.srcElement,-1);
		}
		else if(e.keyCode==40){//KEY_DOWN
			e.srcElement.assclass.search=false;
			if($(ProductPromptCom.ListDiv).style.display=="none"){
				return false;
			}
			$PPC.SetSelectRow(e.srcElement,1);
		}
		else if(e.keyCode==37 || e.keyCode==39)
		{
			e.srcElement.assclass.search=false;
			return true;
		}
		else{
			e.srcElement.assclass.search=true;
			return true;
		}
	}
};
//品种提示下拉类
function ProductPrompt(id,type,enterHandler,showNum,showCompart)//寻找输入匹配类
{
	this.domId=id;//关联的录入框ID
	this.type=type;//品种类别id
	this.value=null;//选中品种编号
	this.showValue=null;//选中品种显示编号
	this.text=null;//选中品种名称
	this.search=false;
	this.hoverRowId=null;
	this.enterHandler=enterHandler;//选定后回车处理事件
	this.showNum=(showNum==null)?20:showNum;//显示的品种个数
	this.showCompart=(showCompart==null)?"   ":showCompart;//显示文本中显示品种编码和品种名称的分隔
	$(this.domId).attachEvent("onkeydown", ProductPromptCom.KeyDownHandle);
	$(this.domId).attachEvent("onkeyup",ProductPromptCom.KeyUpHandle);
	$(this.domId).setAttribute("assclass",this);
	document.write("<div id=\""+ProductPromptCom.ListDiv+"\" style=\"background-color:"+ProductPromptCom.NoSelectColor+";border:1px solid "+ProductPromptCom.ListDivBorderColor+";position:absolute;display:none;z-index:99900;\"></div>");
};
//相应点击事件，如果在动态下拉列表层和代码输入框之外点击鼠标则关闭动态下拉列表层
function document.onclick()
{
	if(event.srcElement.assclass==null){
		if(ProductPromptCom.ListDiv!=""){
			ProductPromptCom.CloseListDiv(ProductPromptCom.ListDiv);
		}
	}
}
