(function(a){a.dropdownReplacement={defaults:{options:null,selectClass:null,optionsClass:"dropdownOpts",optionsDisplayNum:10,optionClass:"dropdownOpt",optionSelectedClass:"selectedOpt",resizeSelectToFitOptions:false,useHiddenInput:true,resizeOptionsToFitSelect:true,selectCssWidth:null,optionsWidthOffset:3,debounceLookupMs:200,debounceArrowsMs:50,lookupMaxWordLength:3,scrollWidth:17,ellipsisSelectText:true,ellipsisText:"...",charWidth:null,onInit:function(a,b){},onSelect:function(a,b,c){}}};a.expr[":"].dr=function(b,c,d,e){var f=d[3];var g=a(b).dropdownReplacement("option");return g&&(g.getSelect().is(f)||g.getHidden()?g.getHidden().is(f):false)};a.fn.dropdownReplacement=function(c,d){var e=arguments;if(c&&c.options&&a.isFunction(c.options)){a(this).each(function(){b.apply(a(this),e)})}else{b.apply(this,e)}return this};var b=function(b,c){if(typeof b==="string"&&b==="option"){var d=a(this).data("dropdownReplacement");return arguments.length==2?d[c]():d}b=a.extend({},a.dropdownReplacement.defaults,a.isFunction(b)?{onSelect:b}:b);var e=this;var f=a("body");var g=a(window);var h=a.browser.msie&&parseInt(a.browser.version,10)==8;var i=a.browser.msie&&parseInt(a.browser.version,10)<=7;var j=[];var k={};var l={};var m={};var n={};var o={};var p,q,r,s,t,u,v;var w;var x=[];var y=a([]);var z=a([]);var A=null;var B=[];var C=true;var D=[];var E=null;var F=null;var G={};var H=[];var I=-1;var J={selectClass:"dropdown"};var K=a([]);var L={lastLookupWord:null,lastLookupIndex:0,noActions:false,options:function(b){var c=a(b.target);if(c.is("a")){O(false);U(c);Q();return false}else{L.noActions=true;z.trigger("focus")}},focus:function(b){z=a(this);A=b.data.index;if(L.noActions){L.noActions=false;return}var c=R();var d=l[c];U(d);this.selectionStart=this.selectionEnd=-1},select:function(b){z=a(this);this.selectionStart=this.selectionEnd=-1;A=b.data.index;if(P()){O(false);return}var c=R();var d=l[c];O(true);U(d)},unselect:function(a){if(C){O(false)}},optionsOver:function(){C=false;y.removeClass(b.optionSelectedClass)},optionsOut:function(){C=true},selectLookup:function(a){var c=null;var d=b.lookupMaxWordLength>a.length?b.lookupMaxWordLength:a.length;for(var e=0;!c&&e<d;e++){a=a.substring(0,b.lookupMaxWordLength-e);c=o[a]}if(!c){return}if(L.lastLookupWord===a){L.lastLookupIndex=L.lastLookupIndex+1}else{L.lastLookupIndex=0;L.lastLookupWord=a}if(c&&c.length){if(c.length<=L.lastLookupIndex){L.lastLookupIndex=0}var f=c[L.lastLookupIndex];U(f);Q()}}};var M=function(a,c,d,e){b.onSelect.apply(a,[c,d,e])};var N=function(c){if(b.charWidth){return b.charWidth}var d=c||"a b c d e f 1 2 3 4 5 6 A B C D E F ! ! %";if(!G[d]){var e=a("<span>",{text:d,"class":b.selectClass,css:{background:"none",margin:0,padding:0,overflow:"visible",width:"auto",color:"#FFF"}});f.append(e);G[d]=e.width()/d.length;e.remove()}return G[d]};var O=function(a){D[A]=a;if(a){Z()}w[a?"show":"hide"]();if(a){Y(z)}};var P=function(){return D[A]};var Q=function(a){a=a||y.text();var c=n[a];T(z,a);if(b.useHiddenInput){x[A].val(c)}M(z,c,a,A)};var R=function(a){return B[arguments.length?a:A]};var S=function(a,b,c){A=c;z=a;Q(m[b])};var T=function(a,c){B[A]=c;if(b.ellipsisSelectText){E=N(c);var d=a.width();var e=~~(d/E);if(e<c.length){e-=~~((F+5)/E);c=c.substring(0,e)+b.ellipsisText}}a.val(c)};var U=function(a){y.removeClass(b.optionSelectedClass);if(a){y=a;y.addClass(b.optionSelectedClass)}if(P()&&jQuery.scrollTo){a&&w.scrollTo(a)}};var V=function(c){A=0;var d=function(){w=b.options;var c=[];var d=w.find("a");for(var e=0;e<d.length;e++){var f=a(d[e]);c[e]={t:f.text(),v:f.attr("name")};f.addClass(b.optionClass);l[c[e].t]=f;m[c[e].v]=c[e].t}b.options=c};var g=function(){var c=b.options;if(c.length==0){bg("options list must contain values, ex: [{'t':'text', 'v':'value'}]")}if(typeof c[0].t=="undefined"||typeof c[0].v=="undefined"){bg("options json list must contain a list of objects with 2 keys: 't', and 'v'. ex: [{'t':'text', 'v':'value'}]")}w=a("<div>");for(var d=0;d<c.length;d++){var e=a("<a>",{href:"#",name:c[d].v,text:c[d].t,"class":b.optionClass});w.append(e);l[c[d].t]=e;m[c[d].v]=c[d].t}f.append(w)};var h=function(){if(e.length>1){throw bg("trying to widgetize more then ONE 'select' at a time is not supported. You can widgetize multiple 'input' elements.")}var d=c.find("option");if(d.length===0){throw bg("'select' must have ONE or more options elements as children in order to widgetize the select")}b.options=[];var f=a("<input>",{css:{width:c.width()}});for(var h=0;h<d.length;h++){var i=a(d[h]);var j=i.val();var k=i.text();b.options[h]={t:k,v:j};if(i.is(":selected")){f.val(k)}}c.after(f);if(b.useHiddenInput){x[0]=c;c.hide()}else{f.attr("name",c.attr("name"));c.remove()}c=e=f;g()};if(b.options&&a.isFunction(b.options)){b.options=b.options.apply(c,[])}if(c.is("select")){h()}else if(b.options instanceof jQuery){d()}else if(b.options.length){g()}else{throw bg("options must be either a json list or a jQuery object. But it is: "+b.options)}var i=b.options;for(var o=0;o<i.length;o++){k[i[o].t]=j.length;j[j.length]=i[o].t;n[i[o].t]=i[o].v}w.addClass(b.optionsClass);w.click(L.options);w.mouseover(L.optionsOver);w.mouseleave(L.optionsOut);if(a.fn.bgiframe){w.bgiframe()}I=w.width()};var W=function(){for(var a=0;a<j.length;a++){for(var c=1;c<b.lookupMaxWordLength+1;c++){if(j[a].length>=c){var d=j[a].substring(0,c).toUpperCase();if(!o[d]){o[d]=[]}o[d].push(l[j[a]])}}}};var X=function(a){var c=l[j[0]];w.show();var d=a.is(":visible");if(!d){a.show()}var e=c.outerHeight(true);var f=b.optionsDisplayNum*e;var g=w.height();Y(a);if(!d){a.hide()}w.hide();w.css({height:(g<f?g:f)+(h?2:0)})};var Y=function(a){var c=H[A];v=a.outerWidth(true);var d=w.width();if(d==c&&v==d){return}if(b.resizeSelectToFitOptions&&d>v){a.width(d+b.optionsWidthOffset);v=d}if(b.resizeOptionsToFitSelect&&d<v){v-=b.optionsWidthOffset}else if(b.resizeOptionsToFitSelect&&d>v&&d>I){d=v-b.optionsWidthOffset}var e=d>v?d:v;a.data("dropdownReplancement.width",e);H[A]=e;w.width(e)};var Z=function(){var c=z.position();var d=c.top||0;var e=c.left||0;if(d+s>p+g.scrollTop()&&c.top-s>0){d=c.top-s}else{d=d+u-(a.browser.webkit?5:0)}if(!b.resizeSelectToFitOptions&&e+t>q){e-=t-v}if(i){w.css({top:d,left:e})}};var _=function(){var a;var c=[];return function(d){var e=arguments;c.push(String.fromCharCode(d.keyCode));clearTimeout(a);a=setTimeout(function(){L.selectLookup(c.join(""));a=null;c=[]},b.debounceLookupMs)}};var ba=function(b){var c;if(b!=="first"&&b!=="last"){if(y.length>0){c=y[b]("a");if(c.length==0){var d=k[y.text()]+(b==="next"?1:-1);c=a(l[j[d]])}}else{c=l[j[0]]}}else{if(b==="first"){c=l[j[0]]}else{c=l[j[j.length-1]]}}if(c.length===0){return false}else{U(c);return true}};var bb=function(){var a;var c=[];c[38]="prev";c[40]="next";c[33]="first";c[34]="last";return function(d){var e=c[d.keyCode];if(e){if(ba(e)){clearTimeout(a);a=setTimeout(function(){Q();a=null},b.debounceArrowsMs)}}}};var bc=function(){var a=q;var c=p;q=g.width();p=g.height();var d=Math.abs(a-q);var e=Math.abs(c-p);return d>b.scrollWidth&&e>b.scrollWidth};var bd=function(a){var b=a.is(":visible");if(!b){a.show()}v=a.outerWidth(true);u=a.outerHeight(true);s=w.outerHeight(true);t=w.outerWidth(true);if(!b){a.hide()}};var be=function(c){c.addClass(J.selectClass);if(b.selectClass){c.addClass(b.selectClass)}if(a.support.windowsTheme&&a.support.windowsTheme.name){c.addClass("dd-theme-"+a.support.windowsTheme.name);w.addClass("opt-theme-"+a.support.windowsTheme.name)}else{c.addClass("dd-all"+" "+b.selectClass)}if(i){c.addClass("dd-oldIE")}};var bf=function(){if(h){b.optionsWidthOffset-=3}};var bg=function(a){return"jquery.dropdownReplacement exception: "+a};var bh=function(a,b,c){var d={val:function(b){if(arguments.length==1){b=m[b]?b:n[j[0]];S(a,b,c)}else{return n[a.val()]}},text:function(b){if(b){S(a,n[b],c)}else{return R(c)}},getSelect:function(){return a},getHidden:function(){return b},getOptions:function(){return w}};a.data("dropdownReplacement",d);if(b){b.data("dropdownReplacement",d)}};var bi=function(){if(!jQuery.scrollTo){throw bg("jquery.scrollTo plugin is required for this plugin. http://plugins.jquery.com/project/ScrollTo")}bf();var c=a(e[0]);if(b.ellipsisSelectText){E=N();F=N(b.ellipsisText)*b.ellipsisText.length}V(c);W();bc();g.resize(function(){if(bc()){O(false)}});e.each(function(c){var d=a(this);var e;var f=d.is("select");H[c]=-1;if(!d.is("input")&&!f){throw bg("root element must be an 'input' or 'select'")}A=c;if(b.useHiddenInput&&!f&&!x[c]){e=a("<input>");e.val(d.val());d.after(e)}else{e=d}K=K.add(e);if(b.selectCssWidth){e.css({width:b.selectCssWidth})}be(e);if(c===0){X(e);bd(e)}var g=e.val();if(b.useHiddenInput&&!f&&m[g]){g=m[g]}else if(!n[g]){g=j[0]}T(e,g);if(b.useHiddenInput&&!x[c]){d.hide();x[c]=d}bh(e,x[c],c);e.attr("readonly","true");e.bind("click",{index:c},L.select).bind("blur",{index:c},L.unselect).bind("focus",{index:c},L.focus).keyup(_()).keydown(bb()).keydown(function(a){if(a.keyCode==13||a.keyCode==27){O(false);e.blur()}});b.onInit(e,x[c])})};bi();return K}})(jQuery)
