﻿var _gdh;
var oldvalue;

//鼠标选中后……
function accr(o) {
    if (_gdh.targetObj != null) {
        oldvalue = _gdh.targetObj.value = o.innerHTML;
    }
    _gdh.selectedoption = 0;
    return false;
}

function dhCombobox(){
    var dh = this;

    _gdh = this;

    this.callbackName = null;
    this.datasource = [];
    this.targetObj = null;
    this.w = 170;
    this.h = 80;

    var tempArr = [];
    var totalL = 0;
    var startL = 0;
    var endL = 0;

    //匹配用户输入字符结果
    Array.prototype.contains = function(o){
        var tc = [];
        var findFlag = 0;
        var oNew1, oNew2, oNew3;

        oNew1 = "sz" + o;
  	    oNew2 = "sh" + o;
  	    oNew3 = "-" + o;

        for(var i = 0, l = this.length; i < l; i++){
            if ((-1 != this[i].toString().indexOf(oNew1))||(-1 != this[i].toString().indexOf(oNew2))||(-1 != this[i].toString().indexOf(oNew3)) ){
                findFlag=1;
                tc.push(this[i]);
            }
        }
        if (findFlag == 0){
  	        for (var i = 0, l = this.length; i < l; i++) {
  		        if ((-1 != this[i].toString().indexOf(o))){
  		            tc.push(this[i]);
  		        }
  	        }
	    }
        return tc
    }

    function ats(o,s,e){
        return "<a style=\"text-decoration:none;color:grey\" href=\"javascript:void(0);\" onmouseover=\"this.style.fontSize=14;this.style.color='red'\" onmouseout=\"this.style.fontSize=12;this.style.color='#888888'\" onclick=\"accr(this)\">"+o.slice(s,e).join("</a><br /><a style=\"text-decoration:none;color:gray\" href=\"javascript:void(0);\" onmouseover=\"this.style.fontSize=14;this.style.color='red'\" onmouseout=\"this.style.fontSize=12;this.style.color='#888888'\" onclick=\"accr(this)\">")+"</a>";
    }

    function getElementpos(e){
        var t = e.offsetTop;
        var l = e.offsetLeft;
        var w = e.offsetWidth;
        var h = e.offsetHeight;
        while (e = e.offsetParent) {
            t += e.offsetTop;
            l += e.offsetLeft;
        }
        t += h;
        return {top: t,left: l,width: w,height: h}
    }

    var dhPopMenu;

    function showPop(str){
        if (dh.targetObj != null) {
            var posi = getElementpos(dh.targetObj);
            //应用dhLayer类作为结果集容器
            dhPopMenu = new dhlayer();
            dhPopMenu.border = "1px solid #808080";
            dhPopMenu.background = "white";
            dhPopMenu.scrollbarBaseColor = "white";
            dhPopMenu.padding = "0px";
            dhPopMenu.content = str;
            dhPopMenu.show(posi.left, posi.top, dh.w + 20, dh.h + 5, document.body);
            dhPopMenu.body.onscroll  = function(){showmore();dh.targetObj.focus();}
            dhPopMenu.body.onmouseup = function(){dh.targetObj.focus();}
        }
    }

    var selectedoption = 0;

    var oldvalue = null;
	var cninputflag = true;

    //匹配
    function searchKey(e){
        if (!(e==13 && !cninputflag) && e!=38 && e!=40 && e!=37 && e!=39){
            var str = dh.targetObj.value;
            if (str != oldvalue) {
                if (str.replace(/\s/g,"") != ""){
                    tempArr = dh.datasource.contains(str);
                    totalL = tempArr.length;
                    startL = 0;
                    if (100 < totalL) {
                        endL = 100;
                    } else {
                        endL = totalL;
                    }
                    showPop(ats(tempArr,startL,endL));
                    selectedoption = 0;
                }
                oldvalue = str;
            }
            if (typeof dhPopMenu=="object" && dhPopMenu.childNodes[selectedoption]){
                dhPopMenu.childNodes[selectedoption].style.border = "1px dotted #630";
                dhPopMenu.childNodes[selectedoption].style.color = "black";
                dhPopMenu.childNodes[selectedoption].style.fontSize = 14;
            }
        }
    }

    //追加数据
    function showmore(){
        if(endL<totalL){
            if(typeof dhPopMenu=="object"){
                var ch = dhPopMenu.body.scrollHeight;
                var sh = dhPopMenu.body.scrollTop;
                if(ch-sh<=dh.h){
                    startL = endL;
                    if (100<totalL-endL){
                        endL += 100;
                    } else {
                        endL += totalL-endL;
                    }
                    if(document.all){
                        dhPopMenu.body.insertAdjacentHTML("beforeEnd",ats(tempArr,startL,endL))
                    } else {
                        dhPopMenu.body.innerHTML += ats(tempArr,startL,endL);
                    }
                }
            }
        }
    }

    function pressKey(e){
        switch(e){
        case 13:
            if(typeof dhPopMenu=="object" && dhPopMenu.childNodes[selectedoption]){
                if(dh.targetObj!=null){
                    oldvalue = dh.targetObj.value = dhPopMenu.childNodes[selectedoption].innerHTML;
					cninputflag = false;
		        }
                dhPopMenu.hide();
                selectedoption = 0;
                return false;
            }
            break;
        case 38:
            if(typeof dhPopMenu=="object"){
                if(0<selectedoption){
                    dhPopMenu.childNodes[selectedoption].style.border = "none";
                    dhPopMenu.childNodes[selectedoption].style.color = "#888888";
                    dhPopMenu.childNodes[selectedoption].style.fontSize = 12;
                    selectedoption--;
                    if (dhPopMenu.childNodes[selectedoption].innerHTML == "") selectedoption--;
                    dhPopMenu.childNodes[selectedoption].style.border = "1px dotted #630";
                    dhPopMenu.childNodes[selectedoption].style.color = "black";
                    dhPopMenu.childNodes[selectedoption].style.fontSize = 14;
                    dhPopMenu.childNodes[selectedoption].scrollIntoView();
                }
            }
            break;
        case 40:
            if(typeof dhPopMenu=="object"){
                if (dhPopMenu.childNodes.length>1 && selectedoption<dhPopMenu.childNodes.length-1){
                    dhPopMenu.childNodes[selectedoption].style.border = "none";
                    dhPopMenu.childNodes[selectedoption].style.color = "#888888";
                    dhPopMenu.childNodes[selectedoption].style.fontSize = 12;
                }
                if (selectedoption < dhPopMenu.childNodes.length - 1){
                    selectedoption++;
                    if (dhPopMenu.childNodes[selectedoption].innerHTML == "") selectedoption++;
                    dhPopMenu.childNodes[selectedoption].style.border = "1px dotted #630";
                    dhPopMenu.childNodes[selectedoption].style.color = "black";
                    dhPopMenu.childNodes[selectedoption].style.fontSize = 14;
                    if (selectedoption / 2 % 5 == 0)
                        dhPopMenu.childNodes[selectedoption].scrollIntoView();
                }
            }
            break;
        default:break;
        }
    }

    this.setup = function(){
        var targetObj = this.targetObj;
        if(targetObj!=null){
            targetObj.onkeydown = function(e){e=e || window.event; e=e.which || e.keyCode;pressKey(e);}
            targetObj.onkeyup = function(e){e=e || window.event; e=e.which || e.keyCode;searchKey(e);}
        }
    }
}
