 
/* 
 * -----------------------------------------------------------
 *
 * The DHTML stock selector 选股器, version 1.0 
 * 作者:刘宇其
 *  */
StockSelector = function (onSelected,onClose) {
this.headNumbers=false;
this.headtitle=['','',''];
this.inputField=null;
this.isPopup=true;
this.hidden = false;
this.table = null;
this.element = null;
this.tbody = null;
this.stocks=null;
this.limit=10;
this.sel=null;
this.pos=-1;
this.offsetTop=30;
this.r=null;
this.p=null;
this.iframe=null;
this.onClose = onClose || null;
this.onSelected = onSelected || null;
};
StockSelector._C = null;
StockSelector.selector = null;
StockSelector.is_ie = (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent));
StockSelector.is_ie5 = (StockSelector.is_ie && /msie 5\.0/i.test(navigator.userAgent));
StockSelector.is_opera = /opera/i.test(navigator.userAgent);
StockSelector.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);

StockSelector.getAbsolutePos = function (el) {
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(el.tagName);
	if (is_div && el.scrollLeft) {
		SL = el.scrollLeft;
	}
	if (is_div && el.scrollTop) {
		ST = el.scrollTop;
	}
	var r = {x:el.offsetLeft - SL, y:el.offsetTop - ST};
	if (el.offsetParent) {
		var tmp = this.getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
};
StockSelector.removeClass = function (el, className) {
	if (!(el && el.className)) {
		return;
	}
	var cls = el.className.split(" ");
	var ar = new Array();
	for (var i = cls.length; i > 0; ) {
		if (cls[--i] != className) {
			ar[ar.length] = cls[i];
		}
	}
	el.className = ar.join(" ");
};
StockSelector.addClass = function (el, className) {
	StockSelector.removeClass(el, className);
	el.className += " " + className;
};
StockSelector.getElement = function (ev) {
	var f = StockSelector.is_ie ? window.event.srcElement : ev.currentTarget;
	while (f.nodeType != 1 || /^div$/i.test(f.tagName)) {
		f = f.parentNode;
	}
	return f;
};
StockSelector.getTargetElement = function (ev) {
	var f = StockSelector.is_ie ? window.event.srcElement : ev.target;
	while (f.nodeType != 1) {
		f = f.parentNode;
	}
	return f;
};
StockSelector.stopEvent = function (ev) {
	ev || (ev = window.event);
	if (StockSelector.is_ie) {
		ev.cancelBubble = true;
		ev.returnValue = false;

		//alert("IE stopEvent");
	} else {
		//alert("FF stopEvent");
		ev.preventDefault();
		ev.stopPropagation();
	}
	return false;
};
StockSelector.addEvent = function (el, evname, func) {
	if (el.attachEvent) {
		el.attachEvent("on" + evname, func);
	} else {
		if (el.addEventListener) {
			el.addEventListener(evname, func, true);
		} else {
			el["on" + evname] = func;
		}
	}
};
StockSelector.removeEvent = function (el, evname, func) {
	if (el.detachEvent) {
		el.detachEvent("on" + evname, func);
	} else {
		if (el.removeEventListener) {
			el.removeEventListener(evname, func, true);
		} else {
			el["on" + evname] = null;
		}
	}
};
StockSelector.createElement = function (type, parent) {
	var el = null;
	/**
	if (document.createElementNS) {
		el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
	} else {
		el = document.createElement(type);
	}
	*/
	el = document.createElement(type);
	if (typeof parent != "undefined") {
		
		parent.appendChild(el);
	}
	return el;
};

StockSelector.prototype.create = function (_par) {
	var parent = null;


	if(!document.getElementById('fram_bk')){
			var o = document.createElement('iframe');
		  o.id = 'fram_bk';
		  o.style.position = "absolute";
		  this.iframe=o;
		  document.body.appendChild(o);
	}

	if (!_par) {
		parent = document.getElementsByTagName("body")[0];
		this.isPopup = true;
	} else {
		parent = _par;
		this.isPopup = false;
	}

	if ( this.table !=null && this.table.hasChildNodes() )
		{
		    while ( this.table.childNodes.length >= 1 )
		    {
		        this.table.removeChild( this.table.firstChild );       
		    } 
		}
	var table = StockSelector.createElement("table");
	table.id="bigTable";
	this.table = table;
	table.cellSpacing = 0;
	table.cellPadding = 0;
	table.StockSelector = this;
	StockSelector.addEvent(table, "mousedown", StockSelector.tableMouseDown);
	var div = StockSelector.createElement("div");
	this.element = div;
	div.className = "stock";
	if (this.isPopup) {
		div.style.position = "absolute";
		div.style.display = "none";
	}
	div.appendChild(table);
	var thead = StockSelector.createElement("thead", table);
	var cell = null;
	var row = null;
	var cal = this;
	row = StockSelector.createElement("tr", thead);
	row.className = "headrow";

	for (var i = 0; i <this.headtitle.length; i++) {
		cell = StockSelector.createElement("td", row);
			cell.StockSelector = this;
			cell.innerHTML="<div unselectable='on'>" + this.headtitle[i] + "</div>";			
	}
	
	var tbody = StockSelector.createElement("tbody", table);
	tbody.id="tb";
	this.tbody = tbody;

	if(document.getElementById('fram_bk') != null){
		this.iframe = document.getElementById('fram_bk');
	}

	//alert(this.iframe);
	parent.appendChild(this.element);
};
	
StockSelector.prototype.destroy = function () {

	var el = this.element.parentNode;
	el.removeChild(this.element);
	StockSelector._C = null;
	window._selector = null;
};

StockSelector.prototype.show = function () {

	this.element.style.display = "block";

	if( this.iframe!=null){	
		
		this.iframe.style.display = "block";
	//	alert(this.iframe.style.display);
	}

	this.hidden = false;
	
	if (this.isPopup) {
		window.selector = this;	
		StockSelector.removeEvent(document, "keyup", StockSelector._keyEvent);	
		StockSelector.addEvent(document, "keyup", StockSelector._keyEvent);
		this.isPopup=false;
		//	StockSelector.addEvent(document, "keypress", StockSelector._keyEvent);
			StockSelector.addEvent(document, "mousedown", StockSelector._checkStockSelector);
	}
//		this.hideShowCovered();

	if(this.element.offsetHeight!=null){
	
//		alert(this.iframe.style.display="block");
		h=this.element.offsetHeight;
		w=this.element.offsetWidth;
		this.iframe.style.top=this.element.style.top;
		this.iframe.style.left=this.element.style.left;
		this.iframe.style.height=h+'px';
		this.iframe.style.width=w+'px'
		//alert("top:"+this.iframe.style.top+"left:"+this.iframe.style.left);
	}
/*	
	var sels = document.getElementsByTagName("select");
	var i=0;
	for(i=0;i<sels.length;i++){
		sels[i].style.display="none";
	}
	*/
};
StockSelector.prototype.hide = function () {
	if (this.isPopup) {
		StockSelector.removeEvent(document, "keyup", StockSelector._keyEvent);
		this.isPopup=true;
		//StockSelector.removeEvent(document, "keypress", StockSelector._keyEvent);
		StockSelector.removeEvent(document, "mousedown", StockSelector._checkStockSelector);
	}
	this.element.style.display = "none";
	this.iframe.style.display = "none";
	this.hidden = true;
	var sels = document.getElementsByTagName("select");
	var i=0;
	for(i=0;i<sels.length;i++){
		sels[i].style.display="block";
	}
};



StockSelector._checkStockSelector = function (ev) {
	var sel = window.selector;
	if (!sel) {
		return false;
	}
	var el = StockSelector.is_ie ? StockSelector.getElement(ev) : StockSelector.getTargetElement(ev);
	for (; el != null && el != sel.element; el = el.parentNode) {
	}
	if (el == null) {
		window.selector.callCloseHandler();
		return StockSelector.stopEvent(ev);
	}
};
StockSelector.prototype.callCloseHandler = function () {
	//alert(this.onClose);
	if (this.onClose) {
		this.onClose(this);
	}
	this.hideShowCovered();
};

StockSelector.prototype.hideShowCovered = function () {

	if (!StockSelector.is_ie && !StockSelector.is_opera) {
		return;
	}
	function getVisib(obj) {
		var value = obj.style.visibility;
		if (!value) {
			if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") {
				if (!Calendar.is_khtml) {
					value = document.defaultView.getComputedStyle(obj, "").getPropertyValue("visibility");
				} else {
					value = "";
				}
			} else {
				if (obj.currentStyle) {
					value = obj.currentStyle.visibility;
				} else {
					value = "";
				}
			}
		}
		return value;
	}
	var tags = new Array("applet", "iframe", "select");
	var el = this.element;
	var p = StockSelector.getAbsolutePos(el);
	var EX1 = p.x;
	var EX2 = el.offsetWidth + EX1;
	var EY1 = p.y;
	var EY2 = el.offsetHeight + EY1;
	for (var k = tags.length; k > 0; ) {
		var ar = document.getElementsByTagName(tags[--k]);
		var cc = null;
		for (var i = ar.length; i > 0; ) {
			cc = ar[--i];
			p = StockSelector.getAbsolutePos(cc);
			var CX1 = p.x;
			var CX2 = cc.offsetWidth + CX1;
			var CY1 = p.y;
			var CY2 = cc.offsetHeight + CY1;
			if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
				if (!cc.__msh_save_visibility) {
					cc.__msh_save_visibility = getVisib(cc);
				}
				cc.style.visibility = cc.__msh_save_visibility;
			} else {
				if (!cc.__msh_save_visibility) {
					cc.__msh_save_visibility = getVisib(cc);
				}
				cc.style.visibility = "hidden";
			}
		}
	}
};
StockSelector.getList=function() {
		var sel = window.selector;
		var keyword=simplized(sel.inputField.value);

		var limit=sel.limit;

    var stockList = new Array();
    var flag = keyword.substring(0, 1);
    var stock = null;
    var STOCKS=sel.stocks;
    var lang = 0;
    if(flag >= 0 && flag <= 9) {
        lang = 0;
    }else if((flag >= 'a' && flag <= 'z') || (flag >= 'A' && flag <= 'Z')) {
        lang = 1;
        keyword = keyword.toUpperCase();
    }else {
        lang = 2;
    }
    for(var i = 0; i < STOCKS.length; i++) {
        if(stockList.length >= limit) {
            break;
        }
        stock = STOCKS[i];

        var sw=stock[lang];
        
        if(sw.indexOf(keyword)==0) {
            stockList[stockList.length] = stock;
        }
    }
    
    return stockList;
};
StockSelector.prototype.freshDiv=function() {
		var sel = window.selector;
		var list=StockSelector.getList();		
		if ( sel.tbody.hasChildNodes() )
		{
		    while ( sel.tbody.childNodes.length >= 1 )
		    {
		        sel.tbody.removeChild( sel.tbody.firstChild );       
		    } 
		}

		for (var i = 0; i <list.length; i++) {
			var row = StockSelector.createElement("tr", sel.tbody);
			row.className = "headrow";
			StockSelector.addEvent(row, "keyup", StockSelector.tableMouseDown);
			StockSelector.addEvent(row, "mouseover", StockSelector.tableMouseOver);
			cell = StockSelector.createElement("td", row);
			cell.innerHTML="<div unselectable='off'>" + list[i][0] + "</div>";			
			cell = StockSelector.createElement("td", row);

			cell.innerHTML="<div unselectable='off'>" + list[i][1] + "</div>";			
			cell = StockSelector.createElement("td", row);

			cell.innerHTML="<div unselectable='off'>" + list[i][2] + "</div>";	
			cell = StockSelector.createElement("td", row);
//			cell.StockSelector = this;
//			cell.innerHTML="<div unselectable='off'>" + list[i][3] + "</div>";	
			cell.className = "nav";
		
	}
		if(this.element.offsetHeight!=null){
	
//		alert(this.iframe.style.display="block");
		h=this.element.offsetHeight;
		w=this.element.offsetWidth;
		this.iframe.style.top=this.element.style.top;
		this.iframe.style.left=this.element.style.left;
		this.iframe.style.height=h+'px';
		this.iframe.style.width=w+'px'
	
	}
	//sel.show();

};


StockSelector.cellClick = function (el, ev) {
	var sel = window.selector;
	var el = StockSelector.getTargetElement(ev);
	//alert(sel.item());
	if(sel.item() !=null){
		//sel.inputField.value=sel.item().cells[0].firstChild.firstChild.nodeValue+"."+sel.item().cells[3].lastChild.firstChild.nodeValue;
		sel.inputField.value=sel.item().cells[0].firstChild.firstChild.nodeValue;
	}
	//alert(el.parentNode.firstChild.nodeValue+'.'+el.parentNode.lastChild.nodeValue);
	sel.hide();
};


StockSelector.up = function (el, ev) {
	var sel = window.selector;
	if(sel.pos<=0){
		sel.pos=0;
	}else if(sel.pos>0 && sel.pos<sel.size()){
		sel.pos--;
	}
	
	sel.changeValue();		
};


StockSelector.down = function (el, ev) {
	var sel = window.selector;
	if(sel.pos>=sel.size()){
		sel.pos=sel.size()-1;
	}else if(sel.pos>=0 && sel.pos<sel.size()-1){
		sel.pos++;
	}
		sel.changeValue();
};



StockSelector.prototype.items=function(){
	var sel = window.selector;
	return sel.tbody.rows;
};


StockSelector.prototype.changeValue = function (){
	var sel =window.selector;
for(i=0;i<this.size();i++){
	sel.items()[i].className="headrow";
}
	sel.item().className="selected"

	//sel.inputField.value=sel.item().cells[0].firstChild.firstChild.nodeValue+"."+sel.item().cells[3].firstChild.firstChild.nodeValue;
	sel.inputField.value=sel.item().cells[0].firstChild.firstChild.nodeValue;
};


StockSelector.prototype.showAtElement = function (el, opts) {
	var self = this;
	var p = StockSelector.getAbsolutePos(el);
	if (!opts || typeof opts != "string") {		
		this.showAt(p.x, p.y + el.offsetHeight);
		return true;
	}
	function fixPosition(box) {
		if (box.x < 0) {
			box.x = 0;
		}
		if (box.y < 0) {
			box.y = 0;
		}
		var cp = document.createElement("div");
		var s = cp.style;
		s.position = "absolute";
		s.right = s.bottom = s.width = s.height = "0px";
		document.body.appendChild(cp);
		var br = StockSelector.getAbsolutePos(cp);
		document.body.removeChild(cp);
		if (StockSelector.is_ie) {
			br.y += document.body.scrollTop;
			br.x += document.body.scrollLeft;
		} else {
			br.y += window.scrollY;
			br.x += window.scrollX;
			
		}
		var tmp = box.x + box.width - br.x;
		if (tmp > 0) {
			box.x -= tmp;
		}
		tmp = box.y + box.height - br.y;
		if (tmp > 0) {
			box.y -= tmp;
		}


	}
	this.element.style.display = "block";
	StockSelector.continuation_for_the_fucking_khtml_browser = function () {
		var w = self.element.offsetWidth;
		var h = self.element.offsetHeight;
		self.element.style.display = "none";
		var valign = opts.substr(0, 1);
		var halign = "l";
		if (opts.length > 1) {
			halign = opts.substr(1, 1);
		}
		switch (valign) {
		  case "T":
			p.y -= h;
			break;
		  case "B":
			p.y += el.offsetHeight;
			break;
		  case "C":
			p.y += (el.offsetHeight - h) / 2;
			break;
		  case "t":
			p.y += el.offsetHeight - h;
			break;
		  case "b":
			break;
		}
		switch (halign) {
		  case "L":
			p.x -= w;
			break;
		  case "R":
			p.x += el.offsetWidth;
			break;
		  case "C":
			p.x += (el.offsetWidth - w) / 2;
			break;
		  case "l":
			p.x += el.offsetWidth - w;
			break;
		  case "r":
			break;
		}
		p.width = w;
		p.height = h + 40;
		fixPosition(p);
		self.showAt(p.x, p.y);

	};
	if (StockSelector.is_khtml) {
		setTimeout("StockSelector.continuation_for_the_fucking_khtml_browser()", 10);
	} else {
		StockSelector.continuation_for_the_fucking_khtml_browser();
	}
};
StockSelector.prototype.showAt = function (x, y) {
	var s = this.element.style;
	
	s.left = x + "px";
	s.top = y + "px";
	this.show();
};

StockSelector.tableMouseOver = function (ev) {
	var sel = window.selector;
	var el=StockSelector.getTargetElement(ev);
	sel.changeColor(ev);
	//alert(el.tagName);
	//alert(el.parentNode.tagName);
	//alert(el.parentNode.firstChild.firstChild.nodeValue+"."+el.parentNode.parentNode.cells[3].firstChild.firstChild.nodeValue);
	if(el.tagName=="DIV"){
		//sel.inputField.value=el.parentNode.parentNode.cells[0].firstChild.firstChild.nodeValue+"."+el.parentNode.parentNode.cells[3].firstChild.firstChild.nodeValue;
		sel.inputField.value=el.parentNode.parentNode.cells[0].firstChild.firstChild.nodeValue;
	}
	//sel.inputField.value=el.parentNode.parentNode.cells[0].firstChild.firstChild.nodeValue+"."+el.parentNode.parentNode.cells[3].firstChild.firstChild.nodeValue;
	if (StockSelector.getTargetElement(ev) == StockSelector.getElement(ev)) {
		return StockSelector.stopEvent(ev);
	}
};
StockSelector.tableMouseDown = function (ev) {
	var sel = window.selector;
	var el=StockSelector.getTargetElement(ev);
	
	//alert(el.parentNode.firstChild.firstChild.nodeValue+"."+el.parentNode.parentNode.cells[3].firstChild.firstChild.nodeValue);
	//sel.inputField.value=el.parentNode.parentNode.cells[0].firstChild.firstChild.nodeValue+"."+el.parentNode.parentNode.cells[3].firstChild.firstChild.nodeValue;
	sel.inputField.value=el.parentNode.parentNode.cells[0].firstChild.firstChild.nodeValue;
	sel.hide();
	if (StockSelector.getTargetElement(ev) == StockSelector.getElement(ev)) {
		return StockSelector.stopEvent(ev);
	}
	
};

StockSelector.prototype.changeColor = function (ev){
	var el=StockSelector.getTargetElement(ev);
	for(i=0;i<this.size();i++){
		this.items()[i].className="headrow";
	}
	el.parentNode.parentNode.className="selected";	

	//sel.inputField.value=this.item().cells[0].firstChild.firstChild.nodeValue;
};

StockSelector.prototype.trimInput = function(){
	var sel =window.selector;
	var ip=sel.inputField.value;
	if(ip.indexOf('.')>0){
		ip=ip.substring(0,ip.indexOf('.'));
		sel.inputField.value=ip;
	}

	//alert(sel.item());
//	sel.inputField.value=StockSelector.selector.item().cells[0].firstChild.firstChild.nodeValue;
};

StockSelector.prototype.size = function(){
	var sel = window.selector;
	return sel.tbody.rows.length;
};

StockSelector.prototype.item = function(){
	
	var sel = window.selector;
	if(sel.pos==-1){
		sel.pos=0;
	}
	return sel.tbody.rows[sel.pos];
};

StockSelector._keyEvent = function (ev) {
	var sel=window.selector;
	var el = StockSelector.getTargetElement(ev);
//	alert(el.id);
//	alert(sel.inputField);
//alert(K!=0 && el.id == sel.inputField.id);
	(StockSelector.is_ie) && (ev = window.event);

	var act = (StockSelector.is_ie || ev.type == "keyup"), K = ev.keyCode;	

	if(K!=0 && el.id == sel.inputField.id){				
		sel.show();
	
//alert(K);
		if( (K >=48 && K <=57) || (K >=65 && K <=90) ||(K >=96 && K <=105)|| K==8 || K ==46){		
			sel.pos=-1;
			sel.trimInput();
			sel.freshDiv();
		}else{		
			switch (K) {
			  case 38:

					StockSelector.up(sel.inputField, ev);	
					break;	  
				case 40:
					//iframe_bk=document.getElementById('fram_bk');
					//iframe_bk.style.height="400px";
					StockSelector.down(sel.inputField, ev);
					break;
			  case 13:			  	
					if (act){
						StockSelector.cellClick(sel.inputField, ev);
						//el = StockSelector.getTargetElement(ev);
						//el2 = StockSelector.getElement(ev);
						return false;
						//if(typeof(submitForm) != "undefined")
						//	el2.form.onsubmit=submitForm;
						//alert(el2.form.i);
					}
					break;
				
			  default:
				return false;
			}
	}
}
	return StockSelector.stopEvent(ev);
};
window.selector = null;
