﻿(function(a){a.fn.extend({AutoComplete:function(x){return this.each(function(){if(!(this&&this.tagName==="INPUT"&&this.type==="text")){return}if(this.controller){this.controller.setOption(x)}else{if(a.isPlainObject(x)){this.controller=new q(this,x)}}})}});var p={};var v="";var u="";var q=function(x,y){this.option=a.extend(false,{width:320,maxHeight:null,itemHeight:null,leftOffset:0,listStyle:"normal",listDirection:"down",data:[],ajaxDataType:"json",ajaxParams:{},ajaxTimeout:10000,ajaxType:"GET",maxItems:20,matchHandler:s,emphasisHandler:r,createItemHandler:null,beforeLoadDataHandler:null,afterSelectedHandler:null,emphasis:true,onerror:null},y);k.apply(this,[x]);l.apply(this)};var k=function(x){var y=this;this.timeoutId=null;this.inputView=a(x);this.inputView.attr("autocomplete","off").keyup(this._keyup=function(z){switch(z.keyCode){case 13:case 16:case 17:case 37:case 38:case 39:case 40:break;case 27:e.apply(y);break;default:i.apply(y)}}).keydown(this._keydown=function(z){switch(z.keyCode){case 38:h.apply(y,["up"]);break;case 40:h.apply(y,["down"]);break;case 13:var A=y.searchView.is(":visible");j.apply(y);if(A){return false}break}}).blur(this._blur=function(){a(document).one("click",function(){e.apply(y)})})};var l=function(){var x=this;this.searchView=a("<div class='ac'><ul></ul></div>").appendTo(document.body).on("mouseenter","li",function(){x.searchView.find("li.selected").removeClass("selected");a(this).addClass("selected")}).on("mouseleave","li",function(){a(this).removeClass("selected")}).on("click","li",function(){j.apply(x);e.apply(x)}).css("font-size",this.inputView.css("font-size"));a(window).resize(function(){g.apply(x)})};var d=function(y){var z=this,x=this.searchView.find("ul").empty();if(a.inArray(this.option.listStyle,["normal","iconList","custom"])==-1){throw ["遇到未知的listStyle参数！"]}a.each(y,function(C,A){var D=a("<li><div></div></li>").appendTo(x).addClass(z.option.listStyle).data("data",A).find("div");switch(z.option.listStyle){case"normal":D.append("<span>"+A.label+"</span>");break;case"iconList":var B=a("<img></img>").attr("src",A.image);D.append(a("<div></div>").append(B)).append("<span>"+A.label+"</span>");break;case"custom":D.append(z.option.createItemHandler.apply(z,[C,A]));case"default":break}if(z.option.itemHeight>0){D.height(z.option.itemHeight).css("max-height",z.option.itemHeight)}})};var g=function(){if(this.option.listDirection==="down"){var y=this.inputView.offset().top+this.inputView.outerHeight()}else{if(this.option.listDirection==="up"){var y=this.inputView.offset().top-this.searchView.outerHeight()}else{throw"遇到未知的listDirection参数！"}}var x=this.inputView.offset().left+this.option.leftOffset;this.searchView.css("top",y+"px").css("left",x+"px")};var c=function(){if(typeof(this.option.width)==="string"&&this.option.width.toLowerCase()==="auto"){return this.inputView.outerWidth()-2}else{if(typeof(this.option.width)==="number"){return this.option.width}else{throw"遇到未知的width参数！"}}};var n=function(y){var z=this;if(this.option.listDirection==="up"){y=y.reverse()}try{d.apply(z,[y]);if(this.option.maxHeight>0){this.searchView.css("max-height",this.option.maxHeight+"px");if(a.support.msie){this.searchView.css("height",this.searchView.height()>this.option.maxHeight?this.option.maxHeight+"px":"auto")}}g.apply(this);this.searchView.css("width",c.apply(this)+"px")}catch(x){f.apply(this,[x+""]);return}this.searchView.show()};var e=function(){this.searchView.find("ul").empty();this.searchView.hide()};var h=function(x){var B=this.searchView.find("li.selected");if(B.size()){var A=x==="up"?B.prev():B.next()}else{var A=x==="up"?this.searchView.find("li").last():this.searchView.find("li").first()}if(A.size()){this.searchView.find("li").removeClass("selected");A.addClass("selected");var y=A.outerHeight();var z=A.position().top;if(y+z>this.searchView.height()){this.searchView.scrollTop(this.searchView.scrollTop()+z+y-this.searchView.height())}else{if(z<0){this.searchView.scrollTop(this.searchView.scrollTop()+z)}}}};var j=function(){var A=this,z=this.searchView.find("li.selected");if(z.size()){var x=z.data("data");this.inputView.val(x.value);if(a.isFunction(this.option.afterSelectedHandler)){try{this.option.afterSelectedHandler.apply(A,[x])}catch(y){f.apply(this,["调用afterSelectedHandler错误:"+y]);return}}e.apply(this)}};function o(y){if(!y||!v||!u){return}var x=u+"_"+v;a.data(p,x,y)}function t(){if(!v||!u){return false}var x=u+"_"+v;if(a.data(p,x)){return true}else{return false}}function w(){var x=u+"_"+v;return a.data(p,x)}var b=function(z){jQuery.support.cors=true;var A=this,y=[],x={async:true,dataType:A.option.ajaxDataType,type:A.option.ajaxType,timeout:A.option.ajaxTimeout,success:function(D,C,B){if(A.option.ajaxDataType==="xml"){a(D).find("item").each(function(){var F={value:a(this).text(),label:a(this).text()};for(var E=0;E<this.attributes.length;E++){var G=this.attributes[E].nodeName,H=this.attributes[E].nodeValue;F[G]=H}y.push(F)})}else{if(A.option.ajaxDataType==="json"){y=D}else{throw"遇到未知的ajaxDataType参数！"}}o(y);m(A,y,z)},error:function(C,D,B){throw B}};if(a.isPlainObject(A.option.ajaxParams)){x.data=a.extend(false,{keyword:z},A.option.ajaxParams)}else{if(a.isFunction(A.option.ajaxParams)){x.data=a.extend(false,{keyword:z},A.option.ajaxParams.apply(A,[z]))}else{if(typeof(A.option.ajaxParams)==="string"){x.data="keyword="+z+"&"+A.option.ajaxParams}else{throw"遇到未知的ajaxParams参数！"}}}if(A.timeoutId){clearTimeout(A.timeoutId)}A.timeoutId=setTimeout(function(){a.ajax(A.option.data,x)},400)};var i=function(){var C=this,A=a.trim(this.inputView.val()),x=[],B=true;if(A.length==0){e.apply(C);return}if(a.isFunction(this.option.beforeLoadDataHandler)){try{B=this.option.beforeLoadDataHandler.apply(this,[A])}catch(z){f.apply(this,["调用beforeLoadDataHandler错误:"+z]);return}}if(a.isFunction(this.option.ajaxParams)){try{u=this.option.ajaxParams.apply(this)["objtype"]}catch(z){f.apply(this,["调用ajaxParams错误:"+z]);return}}else{u=this.option.ajaxParams.objtype}v=A;if(t()){var y=w();m(C,y,A)}else{if(B){if(a.isArray(this.option.data)){x=this.option.data;m(C,x,A)}else{if(a.isFunction(this.option.data)){try{x=this.option.data.apply(this,[A]);m(C,x,A)}catch(z){f.apply(this,["调用data错误:"+z]);return}}else{if(typeof(this.option.data)==="string"){try{b.apply(this,[A]);return}catch(z){f.apply(this,["Ajax错误:"+z]);return}}else{f.apply(this,["遇到未知的data参数！"]);return}}}}}};var m=function(A,x,y){var z=[];a.each(x,function(B,D){if(A.option.maxItems>0&&z.length>=A.option.maxItems){return false}if(a.isPlainObject(D)){var C=a.extend(false,{},D)}else{if(typeof(D)==="string"){var C={label:D,value:D,image:D}}else{f.apply(A,["数据源Item类型错误！"]);return false}}if(A.option.matchHandler.apply(A,[y,C])){z.push(C)}});if(y==a.trim(A.inputView.val())){if(z.length>0){n.apply(A,[z])}else{e.apply(A)}}};var f=function(x){if(a.isFunction(this.option.onerror)){this.option.onerror.apply(this,[x])}};q.prototype.setOption=function(x){if(a.isPlainObject(x)){this.option=a.extend(false,this.option,x)}else{if(typeof(x)==="string"){switch(x){case"destroy":this.destroy();break;case"show":this.show();break;default:f.apply(this,["未知的AutoComplete参数！"]);return}}else{f.apply(this,["未知的AutoComplete参数类型！"]);return}}};q.prototype.destroy=function(){this.searchView.remove();this.inputView.unbind("keyup",this._keyup).unbind("keydown",this._keydown).unbind("blur",this._blur);delete this.inputView.get(0).controller};q.prototype.show=function(){i.apply(this)};var s=function(y,x){var z=RegExp(y.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),"i");if(this.option.emphasis&&a.isFunction(this.option.emphasisHandler)){this.option.emphasisHandler.apply(this,[y,x])}return z.test(x.value)};var r=function(y,x){var z=RegExp("("+y.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")+")","ig");x.label=x.label.replace(z,"<em>$1</em>")}})(jQuery);