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