/*
 * 功能：类似GoogleSuggest的下拉提示
 * 作者：杨永国
 */

var req; //定义变量，用来创建xmlHttpRequest对象
var inputField;	//要生成Suggest提示的文本输入框
var suggestListContainer; //下拉提示列表内容所被包含的DIV容器
var suggestListContentTable; //下拉提示列表的内容展示Table
var contentBody; //内容展示Table的<tbody></tbody>
var selItemIndex = -1; //Suggest下拉列表的当前选择项索引
var DEFAULT_SUGGEST_LIST_WIDTH = 0; //下拉提示列表的默认宽度。当为0时，和文本输入框的宽度相同
var remoteUrl = ""; //去后台获取数据的URL地址
var preValue = "";



//创建XMLHttpRequest对象       
function createXMLHttpRequest() {
	if(window.XMLHttpRequest) { //Mozilla 浏览器
		req = new XMLHttpRequest();
	}
	else if (window.ActiveXObject) { // IE浏览器
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
}

//判断浏览器的类型
function getOs() 
{ 
	var OsObject = ""; 
	if(navigator.userAgent.indexOf("MSIE")>0) { 
		return "MSIE"; 
	} 
	if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){ 
		return "Firefox"; 
	} 
}

String.prototype.trim = function()
{
	var reExtraSpace = /^\s*(.*?)\s+$/;
	return this.replace(reExtraSpace,"$1");
}

/**
 * 发送匹配请求函数（注：必须传入event对象，否则FireFox在获得keyCode时不兼容）
 * 参数：
 *		evt 代表事件状态的event对象
 *		url 根据输入框的值，动态取数据的URL地址
 */
function getSuggestList(evt) {

	var typex = document.getElementById('select').value;
	if(inputField.value.trim().length==0){
		//clearSuggestList();
		return ;
	}

	if(evt.keyCode==13){ //回车键（注：FireFox浏览器keyCode必须大写"C"）
		clearSuggestList();
		inputField.blur();
		inputField.select();
		return;
	}



	if (inputField.value.trim().length > 0) {
	
      	if(preValue != inputField.value){
			selItemIndex = -1; //如果输入框值变化，则初始化此变量，保证上、下键是从列表头开始选择
			createXMLHttpRequest();
			
		   	if(typex == "bond"){
		   		if(inputField.value.indexOf('请输入')>=0 || inputField.value.indexOf('代码/名称/拼音')>=0) inputField.value='代码/名称/拼音';
				remoteUrl = "/f10.do?method=searchZQDMList&zqdm=" + encodeURIComponent(inputField.value);
				document.getElementById('popupDiv').style.display='';
			}else if(typex == "fund"){
				if(inputField.value.indexOf('请输入')>=0 || inputField.value.indexOf('代码/名称/拼音')>=0) inputField.value='代码/名称/拼音';
				remoteUrl = "/f10.do?method=searchJJDMList&gpdm=" + encodeURIComponent(inputField.value);
				document.getElementById('popupDiv').style.display='';
			}else if(typex == "qz"){
				if(inputField.value.indexOf('请输入')>=0 || inputField.value.indexOf('代码/名称/拼音')>=0) inputField.value='代码/名称/拼音';
				remoteUrl = "/f10.do?method=searchQZDMList&gpdm=" + encodeURIComponent(inputField.value);
				document.getElementById('popupDiv').style.display='';
			}else if(typex == "stock"){
				if(inputField.value.indexOf('请输入')>=0 || inputField.value.indexOf('代码/名称/拼音')>=0) inputField.value='代码/名称/拼音';
				remoteUrl = "/f10.do?method=searchGPDMList&gpdm=" + encodeURIComponent(inputField.value);
				document.getElementById('popupDiv').style.display='';				
			}else if(typex == "help"){
				if(inputField.value.indexOf('请输入')>=0 || inputField.value.indexOf('代码/名称/拼音')>=0) inputField.value='请输入帮助内容';
				remoteUrl = "/question.do?method=searchByKeyWord&keyWord=" + encodeURIComponent(inputField.value);
				document.getElementById('popupDiv').style.display='';
			}else if(typex == "caixun"){
				if(inputField.value.indexOf('请输入')>=0 || inputField.value.indexOf('代码/名称/拼音')>=0) inputField.value='请输入财讯内容';
				remoteUrl = "/question.do?method=searchByKeyWord&keyWord=" + encodeURIComponent(inputField.value);
				document.getElementById('popupDiv').style.display='';
			}
			req.open("GET", remoteUrl, true);
			req.onreadystatechange = processMatchResponse;//指定响应函数
			req.send(null); // 发送请求
		}
	} else {
    	clearSuggestList();
	}
}

//处理返回匹配信息函数
function processMatchResponse() {
	if (req.readyState == 4) { // 判断对象状态
    	if (req.status == 200) { // 信息已经成功返回，开始处理信息
    		
			createSuggestList();
			
        }else { //页面不正常
            showalert("您所请求的页面有异常。","");
        }
    }
}

//生成Suggest下拉列表
function createSuggestList() {
	clearSuggestList(); //先清除先前的下拉列表
	
	var bonds;
	var size = 0;
	if(req.responseXML==null){ //当没有数据返回时，FireFox这里要特殊处理
		return;
	}else{
		
		bonds = req.responseXML.getElementsByTagName("gpjj");
		size = bonds.length;
		if(size==0)
			return;
	}
	
	 //JSON格式数据
	//if(req.responseText==null){ //当没有数据返回时，FireFox这里要特殊处理
	//	return;
	//}else{
	//	bonds = eval( req.responseText); //JSON格式数据
	//}
    
    renderContainer();
    
    var row, cell, txtNode;
    for (var i = 0; i < size; i++) {
        var nextNode = bonds[i].firstChild.data;
        row = document.createElement("tr");
        row.onmouseout = function() {this.style.backgroundColor ='#FFFAFA';};
        row.onmouseover = function() {this.style.backgroundColor ='#f4a460';};
        row.onmousedown = function() { itemSelected(this);};

        cell = document.createElement("td");
        txtNode = document.createTextNode(nextNode);
        cell.appendChild(txtNode);
        row.appendChild(cell);
        contentBody.appendChild(row);
    }
}

//设置Suggest下拉列表的显示位置及显示样式                
function renderContainer() {
	if(DEFAULT_SUGGEST_LIST_WIDTH == 0){
		suggestListContentTable.width = inputField.clientWidth;
	}else{
		suggestListContentTable.width = DEFAULT_SUGGEST_LIST_WIDTH;
    }

    var left = calculateOffset(inputField,"offsetLeft")-60;
   // alert(left);
    left=44;
    var top = calculateOffset(inputField,"offsetTop") + inputField.offsetHeight-10;
    suggestListContainer.style.width = suggestListContentTable.width;
    suggestListContainer.style.border = "black 1px solid";
    suggestListContainer.style.left = left  + "px";
    suggestListContainer.style.top = top + "px";
    suggestListContainer.style.width = suggestListContentTable.width;
}

/**
 * 计算相对于文本输入框的显示位置
 * 参数：
 *		attr 要计算数值的属性名，'offsetLeft'、'offsetTop'等
 */
function calculateOffset(field,attr) {
	var offset = 0;
	while(field) {
		offset += field[attr]; 
		field = field.offsetParent;
	}
	return offset;
}

/**
 * 下拉列表某行被选中的动作
 * 参数：
 *		row 被选中的下拉列表行
 */
function itemSelected(row) {
	inputField.value = row.firstChild.firstChild.nodeValue.split(" ")[0];
	preValue = inputField.value;
	toF10(); //执行查询, 需要调用的页面实现此方法
	clearSuggestList();
}
    
//清除Suggest下拉列表
function clearSuggestList(){
	suggestListContainer.style.displsy = "none";
	if(inputField.value==''){
		if(document.getElementById('select').value == "stock"){
			inputField.value='代码/名称/拼音';
		}else if(document.getElementById('select').value == "fund"){
			inputField.value='代码/名称/拼音';
		}else if(document.getElementById('select').value == "bond"){
			inputField.value='代码/名称/拼音';
		}else if(document.getElementById('select').value == "qz"){
			inputField.value='代码/名称/拼音';	
		}else if(document.getElementById('select').value == "help"){
			inputField.value='请输入帮助内容';
		}else if(document.getElementById('select').value == "caixun"){
			inputField.value='请输入财讯内容';
		}
		 
	}else{
		
		var ind = contentBody.childNodes.length;
	    for (var i = ind - 1; i >= 0 ; i=i-1) {
	        contentBody.removeChild(contentBody.childNodes[i]);
	    }
	   
	    suggestListContainer.style.border = "none";
	}
}
/**
 * 处理键盘按下动作
 * 参数：
 * 		evt event对象
 *		functionName 键盘按下后需要执行的函数名
 */
function keyDownProcess(evt,functionName)
{
	if(evt.keyCode == 13)
	{
		//toF10(); //执行查询, 需要调用的页面实现此方法
		event.srcElement.select();
	}else{
		if(evt.keyCode == 38 || evt.keyCode == 40){
			selectChange(evt.keyCode);
		}
	}
}

/**
 * 按上、下方向键进行选择
 * 参数：
 *		eventkey 键盘的key值
 */
function selectChange(eventkey){
	var size = contentBody.childNodes.length;
    if(size == null || size == 0)
        return;
        
    if(eventkey == 40){ //向下键
    	if(selItemIndex == size - 1){ //到达列表最底部，重新从顶部开始选择
    		selItemIndex = 0;
    	}else{
        	selItemIndex++;
        }
    }else if(eventkey == 38){ //向上键
    	if(selItemIndex == 0 || selItemIndex == -1){ //到达列表最顶部，重新从最底部开始选择
    		selItemIndex = size - 1;
    	}else{
        	selItemIndex--;
        }
    }
    
    for(var j=0; j<size; j++){
		contentBody.childNodes[j].style.backgroundColor = '#FFFAFA';
	}
	
    for(var i=0; i<size; i++){
		if(selItemIndex == -1){
			return;
		}
		if(i == selItemIndex){
            contentBody.childNodes[i].style.backgroundColor = '#f4a460';
            inputField.value = contentBody.childNodes[i].childNodes[0].innerHTML.split(" ")[0];
		}
    }
    preValue = inputField.value;
}

//执行表单验证并查询
function toF10(){
	var type = document.getElementById('select').value;
	var url = "";
	if(type == "bond" && inputField.value!="代码/名称/拼音"){
		if(inputField.value.trim().length==0){
			showalert("请输入债券代码","");
			return false;
		}
		if(inputField.value.match(/^[a-zA-Z0-9]*$/)==null){
			showalert("债券代码只能包含字母和数字","");
			return false;
		}
		
		url = "/qn_search/zq.jsp?gpdm="+inputField.value;
	}else if(type == "qz" && inputField.value!="代码/名称/拼音"){
		if(inputField.value.trim().length==0){
			showalert("请输入债券代码","");
			return false;
		}
		if(inputField.value.match(/^[a-zA-Z0-9]*$/)==null){
			showalert("权证代码只能包含字母和数字","");
			return false;
		}
		
		url = "/qn_search/qz.jsp?gpdm="+inputField.value;
	}else if(type == "caixun" && inputField.value!="请输入财讯内容"){
		if(inputField.value.trim().length==0){
			showalert("请输入搜索条件","");
			return false;
		}
		url = "/qn_search/cxzl_ss.jsp?searchWord="+encodeURIComponent(inputField.value);
	}else if(type == "zqlp" && inputField.value!="请输入财讯内容"){
		if(inputField.value.trim().length==0){
			showalert("请输入搜索条件","");
			return false;
		}
		url = "/zbh/zqlp.jsp";		
	}else if(type == "fund" && inputField.value!="代码/名称/拼音"){
		if(inputField.value.trim().length==0){
			showalert("请输入基金代码","");
			return false;
		}
		if(inputField.value.match(/^[0-9]\d*$/)==null){
			showalert("基金代码只能包含数字","");
			return false;
		}
		if(inputField.value.length !=6 ){
			showalert("基金代码长度应该为6位","");
			return false;
		}
		
		url = "/qn_search/jj.jsp?gpdm="+inputField.value;
	}else if(type == "stock" && inputField.value!="代码/名称/拼音"){
		if(inputField.value.trim().length==0){
			showalert("请输入股票代码","");
			return false;
		}
		if(inputField.value.match(/^[0-9]\d*$/)==null){
			showalert("股票代码只能包含数字","");
			return false;
		}
		if(inputField.value.length !=6 ){
			showalert("股票代码长度应该为6位","");
			return false;
		}
		
		url = "/qn_search/f10_all.jsp?gpdm="+encodeURIComponent(inputField.value);
	}else if(type=="help"){
		url = "/qn_search/help.jsp?keyWord="+encodeURIComponent(inputField.value);
	}else{
		showalert("请输入搜索内容","");
		return false;
	}
	if(url != '' ){
		window.open(url);
	}
}

//我要报错
function wybc(){
	var url;
	var urlnew="";
	url=window.location.href;
	var urlcs=url.split("&");
	for(var i=0; i<urlcs.length; i++)
	{
		urlnew+=urlcs[i]+"$";
	}
	window.open('/admin/advice/wybc.jsp?source='+urlnew);
}
//et助手同步登录
function syn_wz_login(newUrl){
    window.location = newUrl;
}

	inputField = document.getElementById("inputField");
    suggestListContainer = document.getElementById("popupDiv"); //下拉列表的DIV容器
    suggestListContentTable = document.getElementById("suggestListContentTable"); //下拉列表的内容展示表格
    contentBody = document.getElementById("contentBody");
    
    function changeGjzStyle(butionId,k,type,gjz){

    	  document.getElementById('006-01').className='li-huilan';
		  document.getElementById('006-02').className='li-huilan';
		  document.getElementById('006-03').className='li-huilan';
		  document.getElementById('006-04').className='li-huilan';
		  document.getElementById('006-05').className='li-huilan';
		  document.getElementById('006-06').className='li-huilan';
		  document.getElementById('006-07').className='li-huilan';
    	document.getElementById(butionId).className='li-top-serch-bj';
    	document.getElementById('select').value=type;
    	document.getElementById('inputField').value=gjz;
    }

var Event = {
	addEvent: function(obj, evType, fn){
		if (obj.addEventListener) {
			obj.addEventListener(evType, fn, false);
			return true;
		}
		else {
			if (obj.attachEvent) {
				var r = obj.attachEvent("on" + evType, fn);
				EventCache.add(obj, evType, fn);
				return r;
			}
			else {
				return false;
			}
		}
	},
	removeEvent: function(obj, evType, fn){
		if (obj.removeEventListener) {
			obj.removeEventListener(evType, fn, false);
			return true;
		}
		else {
			if (obj.detachEvent) {
				var r = obj.detachEvent("on" + evType, fn);
				return r;
			}
			else {
				return false;
			}
		}
	},
	getEvent: function(e){
		e = window.event || e;
		e.leftButton = false;
		if (e.srcElement == null && e.target != null) {
			e.srcElement = e.target;
			e.leftButton = (e.button == 1);
		}
		else {
			if (e.target == null && e.srcElement != null) {
				e.target = e.srcElement;
				e.leftButton = (e.button == 0);
			}
			else {
				if (e.srcElement != null && e.target != null) {
				}
				else {
					return null
				}
			}
		}
		if (document.body && document.documentElement) {
			e.mouseX = e.pageX || (e.clientX + Math.max(document.body.scrollLeft, document.documentElement.scrollLeft));
			e.mouseY = e.pageY || (e.clientY + Math.max(document.body.scrollTop, document.documentElement.scrollTop));
		}
		else {
			e.mouseX = -1;
			e.mouseY = -1;
		}
		return e;
	},
	stopEvent: function(e){
		if (e && e.cancelBubble != null) {
			e.cancelBubble = true;
			e.returnValue = false;
		}
		if (e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
		return false;
	}
};
var EventCache=function(){
	var listEvents = [];
	return {
		listEvents: listEvents,
		add: function(node, sEventName, fHandler, bCapture){
			listEvents[listEvents.length] = arguments;
		},
		flush: function(){
			var i, item;
			for (i = listEvents.length - 1; i >= 0; i = i - 1) {
				item = listEvents[i];
				if (item[0].removeEventListener) {
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if (item[1].substring(0, 2) != "on") {
					item[1] = "on" + item[1];
				};
				if (item[0].detachEvent) {
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

Event.addEvent(window,"unload",EventCache.flush);

function error_handler(a, b, c){
	window.status = (c + "\n" + b + "\n\n" + a + "\n\n" + error_handler.caller);
	return true;
}

scrollVertical.prototype.scrollArea=null;      // 滚动的区域
scrollVertical.prototype.scrollMsg=null;       // 要滚动的内容
scrollVertical.prototype.unitHeight=0;         // 单独一行滚动内容的高度（程序中通过过的要滚动行的一个节点的offsetHeight获得） 
scrollVertical.prototype.msgHeight=0;          // 整个滚动内容的高度
scrollVertical.prototype.copyMsg=null;         // 复制滚动内容（程序中使用复制scrollMsg.innerHTML来获得的）
scrollVertical.prototype.scrollValue=0;        // 滚动的值
scrollVertical.prototype.scrollHeight=0;       // 滚动高度
scrollVertical.prototype.isStop=true;          // 停止滚动
scrollVertical.prototype.isPause=false;        // 暂停滚动 
scrollVertical.prototype.scrollTimer=null;     // 滚动计时器
scrollVertical.prototype.speed=2000;           // 滚动的时间间隔

/**
 * @method isMoz - 判断是否为Mozilla系列浏览器
 */ 
scrollVertical.prototype.isMoz = function(){
	return navigator.userAgent.toLowerCase().indexOf('gecko') > 0;
};

/**
 * @method play - 滚动信息的处理方法（函数）
 * @param {Object} o - 滚动类
 */ 
scrollVertical.prototype.play = function(o){
	var s_msg = o.scrollMsg;
	var c_msg = o.copyMsg;
	var s_area = o.scrollArea;
	var msg_h = o.msgHeight;
	
	var anim = function(){
		// 如果已经开始计时（间隔时间执行向上滚动），
		// 就停止它（以免无限制执行，耗系统资源）。
		if (o.scrollTimer) { 
			clearTimeout(o.scrollTimer);
		}
		// 如果暂停了滚动（鼠标放到了滚动层上）
		// 开始以10毫秒的时间间隔运行滚动	
		if (o.isPause) {
			o.scrollTimer = setTimeout(anim, 10);
			return;
		}
		// 当显示完所有信息后（这时滚动的距离就等于要滚动信息的高度msg_h）
		// 这时又重新开始滚动，将滚动距离清零
		if (msg_h - o.scrollValue <= 0) {
			o.scrollValue = 0;
		}
		else {
			o.scrollValue += 1;
			o.scrollHeight += 1;
		}
		// 根据浏览器的不同，处理滚动
		if (o.isMoz) { // Mozilla引擎浏览器
			s_area.scrollTop = o.scrollValue;
		}
		else { // 其余的浏览器则使用控制CSS样式处理滚动
			s_msg.style.top = -1 * o.scrollValue + "px";
			c_msg.style.top = (msg_h - o.scrollValue) + "px";
		}
        // 滚动高度等于显示滚动区域高度时（滚动完一行，一行内容全部显示）
		// 暂停4秒中，然后再开始执行下依次滚动。
		if (o.scrollHeight % s_area.offsetHeight == 0) {
			o.scrollTimer = setTimeout(anim, o.speed);
		}
		else {
			// 在两行内容之间过度滚动时，每10豪秒上升1px
			o.scrollTimer = setTimeout(anim, 10);
		}
	};
	// 执行滚动
	anim();
};

/**
 * scrollVertical 垂直滚动的构造函数
 * @param {Object} disp  -  必须  显示滚动区域的DOM节点（或节点ID） 
 * @param {Object} msg    -  必须  被显示的信息的DOM节点（或节点ID）
 * @param {string} tg     -  可选  以什么标记为一行的标签名称（tagName）
 */
function scrollVertical(disp, msg, tg){
	// 给在之前定义的this.scrollArea付值
	if (typeof(disp) == 'string') {
		// 如果disp给的是节点的ID，通过document.getElementById获取该节点
		// 然后付值给this.scrollArea
		this.scrollArea = document.getElementById(disp);
	}
	else {
		// 如果是DOM节点，直接付给this.scrollArea
		this.scrollArea = disp;
	}
	// 以给this.scrollArea相同的方法给this.scrollMsg付值
	if (typeof(msg) == 'string') {
		this.scrollMsg = document.getElementById(msg);
	}
	else {
		this.scrollMsg = msg;
	}
	
	// 为了开发方便，
	// 不用一直写this.scrollMsg这么常的名字，
	// 将两个对象付给局部变量
	var s_msg = this.scrollMsg;
	var s_area = this.scrollArea;
	
	// 如果没有给定一行的识别标签，
	// 默认将li标签认为是一行的标签
	// 所以上面介绍的，tag参数是可选的
	if (!tg) {
		var tg = 'li';
	}
	
	// 获取单行的高度
	// 获取到第一(s_msg.getElementsByTagName(tg)[0])tg(一行的标签)的高度，作为单行的高度
	this.unitHeight = s_msg.getElementsByTagName(tg)[0].offsetHeight;
	// 获取整个信息框的高度
	// 公式为 单行高度（unitHeight）*行数（s_msg.getElementsByTagName(tg).length，显示信息中包含多少个tg(行)标签）
	this.msgHeight = this.unitHeight * s_msg.getElementsByTagName(tg).length;

    /* 
     * 复制要显示的信息：
     * 连续滚动的实现其实就是通过复制信息，
     * 并将复制的信添加到原始信息后
     * 当原始信息滚动显示完成，就接着滚动显示复制的信息
     * 但给人的错觉是，我们看到信息连续不断的显示
	 */
	// 创建复制内容节点
	var copydiv = document.createElement('div');
	// 这个地方感觉有点嵌妥
	// 直接使用element.id的方式，不过看上去，主流的浏览器都支持
	// 标准的DOM Core方法：
	// copydiv.setAttribute('id',s_area.id + "_copymsgid")
	copydiv.id = s_area.id + "_copymsgid";
    // 复制原始的信息
	// 将原始的信息s_msg中的内容，直接用innerHTML写到
	copydiv.innerHTML = s_msg.innerHTML;
	// 设置复制信息节点的高度
	copydiv.style.height = this.msgHeight + "px";
	// 将复制节点添加到原始接点（scrollMsg）后
	// 其实实现的方法就是将复制信息节点（copydiv）添家到显示区域的节点（scrollArea）中
	s_area.appendChild(copydiv);
	
	this.copyMsg = copydiv;
	// 开始执行滚动方法
	this.play(this);
}
function init_Scroll(){
     var scrollPics = new scrollVertical('container','message','ul');
         scrollPics.speed = 4000;
         scrollPics.isPause = true;
 
     var timer_start = setTimeout(function(){clearTimeout(timer_start);scrollPics.isPause = false;},2000);

     Event.addEvent(scrollPics.scrollArea,"mouseover",function(){scrollPics.isPause = true;});
     Event.addEvent(scrollPics.scrollArea,"mouseout",function(){scrollPics.isPause = false;});
}
Event.addEvent(window,'load',init_Scroll);
