﻿/*
 *Author:sohighthesky
 *From:http://blog.csdn.net/sohighthesky  
 *Date:2009-11-14
 */
/*
 *textbox 指定要显示自动完成的方本框
 *options:参见代码中setOptions中的注释
 */
var autoComplete=function(textbox,options) {
    this.textbox=this.g(textbox);
    this.setOptions(options);
    this.init();
}
autoComplete.prototype={
    g:function(id) {return typeof(id)=="string"?document.getElementById(id):id;},
	ae:function(el,type,call) {
        if(el.addEventListener)el.addEventListener(type,call,false);
		else el.attachEvent("on"+type,call);
    },
	getPos:function(){//取元素坐标
	    var o=this.textbox;
		var x = 0, y = 0;
		do{x += o.offsetLeft; y += o.offsetTop;}
		while(o=o.offsetParent);
		return {'x':x,'y':y};
	},
	setOptions:function(options) {
	    this.options={
	        url:"ShowSearchKey.ashx",//指定页面
	        urlstr:"PinYin",//指定url参数
			urltype:null,
	        suggestAppend:true,//是否在选择时将值添加到文本框
	        isTextboxWidth:false,//默认使用样式表中的宽度，设置为true时，显示与文本框一样的宽度
	        beforeSubmit:function(val,textbox){},//返回false不提交,
	        submitBtn:null//指定要提交的按钮
	    };
		for(var o in options) {this.options[o]=options[o];}
    },
    initxhr:function() {
        this.xhr=false;
	    if(window.XMLHttpRequest) {
		    this.xhr=new XMLHttpRequest();// for IE7/+,Firefox,Opera,Chorme,Safari
	    } else {
		    try {this.xhr=new ActiveXObject("Msxml2.XMLHTTP");/*IE6+*/ } catch(ex) {}
	    }
    },
    ajax:function(){
        var o=this;  
        if(!o.xhr)return;
        try {o.xhr.abort();}catch(ex){}
              
        o.xhr.onreadystatechange=function(){
            if(o.xhr.readyState==4 && o.xhr.status==200) {
                //o.layer.style.display="block";
                o.ii=-1;
                o.layer.innerHTML=o.xhr.responseText;
                var list=o.layer.getElementsByTagName("li");
                var len=list.length;
                o.layer.style.display=(len==0?"none":"block");
                for(var i=0;i<len;i++) {
                    (function(i){
                        var cur=list[i];
                        cur.onmouseover=function() {
                            if(o.ii==-1)
                                o.textbox.setAttribute("txt",o.textbox.value);
                            if(o.last)
                                o.last.className="";
                            this.className="selected";
                            if(o.options.suggestAppend)
                                o.textbox.value=this.innerHTML;
                            o.last=this;
                            o.ii=i;
                        }
                        cur.onclick=function() {
                            o.submit();
                        }
                    })(i);
                }
            }
        };
        var url=o.options.url+"?Stid="+o.options.urltype+"&"+o.options.urlstr+"="+escape(o.getValue());
        o.xhr.open('GET',url,true);
        o.xhr.setRequestHeader("If-Modified-Since","0");//禁用IE缓存，如果你看到这一行，请删除
        o.xhr.send(null);
    },
    showSuggest:function(e) {
        if(e.keyCode==13 || e.keyCode==27 || (e.keyCode>=35 && e.keyCode<=40))return;
        var pos=this.getPos();
        with(this.layer.style){left=pos.x+"px";top=(this.textbox.offsetHeight+pos.y+1)+"px";}//定位
        
        if(this.getValue().length==0){this.hide();return;}//文本为空时返回
        this.ajax();
    },
    hide:function() {
        this.layer.style.display="none";
    },
    getValue:function() {
        return this.textbox.value.replace(/(^\s+)|(\s+$)/g,"");
    },
    keyDown:function(e) {
        var k=e.keyCode;
        var list=this.layer.getElementsByTagName("li");
        var len=list.length;
        if(k==13) {
            this.submit();
            if(e.preventDefault)e.preventDefault(); else e.returnValue=false;//取消默认提交
        } else if(k==27){
            if(this.layer.style.display!="none") {
                this.layer.style.display="none";
                this.textbox.value=this.textbox.getAttribute("txt");
                this.ii=-1;
            }
        } else if((k==38 || k== 40) && len>0) {
            if(this.layer.style.display=="none")
                return;
            if(this.ii==-1)
                this.textbox.setAttribute("txt",this.textbox.value);
            if(k==38) {
                this.ii--;
                if(this.ii==-1)
                    this.ii=len-1;
            }else if(k==40) {
                this.ii++;
                if(this.ii==len)
                    this.ii=0;
            } 
            if(this.last)
                this.last.className="";           
            list[this.ii].className="selected";
            if(this.options.suggestAppend)           
                this.textbox.value=list[this.ii].innerHTML;            
            this.last=list[this.ii];
        }
    },
    submit:function() {
        if(this.ii!=-1)
            this.textbox.value=this.layer.getElementsByTagName("li")[this.ii].innerHTML;
        this.hide(); 
        var o=this;  
		if(o.options.urltype=="Company")
			Job_Search();
		else 
			Talent_Search();
    },
    init:function() {
        this.layer=document.createElement("div");
        this.layer.className="autoSuggest";
        this.hide();
        if(this.options.isTextboxWidth)
            this.layer.style.width=this.textbox.offsetWidth+"px";
        document.body.appendChild(this.layer);
        
        this.textbox.setAttribute("autocomplete","off");
        
        var o=this;
        o.ae(o.textbox,"keydown",function(event){o.keyDown.call(o,event)});
        o.ae(o.textbox,"keyup",function(event){o.showSuggest.call(o,event);});
        o.ae(o.textbox,"blur",function(){o.hide.call(o)});
        
        this.initxhr();
        this.ii=-1;
    }
}
