/*
---
name: Chosen
description: Creates a Picker, which can be used for anything
authors: Patrick Filler, Jules Janssen, Jonnathan Soares
requires: [Core/*, More/Locale]
provides: Chosen
...
*/
Elements.implement({chosen:function(a,b){return this.each(function(c){if(!c.hasClass("chzn-done"))return new Chosen(c,a,b)})}});
var Chosen=new Class({active_field:!1,mouse_on_container:!1,results_showing:!1,result_highlighted:null,result_single_selected:null,choices:0,initialize:function(a){this.click_test_action=this.test_active_click.bind(this);this.form_field=a;this.is_multiple=this.form_field.multiple;this.is_rtl=this.form_field.hasClass("chzn-rtl");this.set_up_html();this.register_observers()},set_up_html:function(){var a,b;if(!this.form_field.id)this.form_field.id=String.uniqueID();this.container_id=this.form_field.id.replace(/(:|\.)/g,
"_")+"_chzn";this.f_width=this.form_field.getCoordinates().width;this.default_text=this.form_field.get("data-placeholder")?this.form_field.get("data-placeholder"):Locale.get("Chosen.placeholder",this.form_field.multiple);this.container=(new Element("div",{id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":"")+" chzn-container-"+(this.is_multiple?"multi":"single")})).setStyle("width",this.f_width);this.is_multiple?this.container.set("html",'<ul class="chzn-choices"><li class="search-field"><input type="text" value="'+
this.default_text+'" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'):this.container.set("html",'<a href="javascript:void(0)" class="chzn-single"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');this.form_field.setStyle("display","none").grab(this.container,
"after");this.dropdown=this.container.getElement("div.chzn-drop");a=this.container.getCoordinates().height;b=this.f_width-this.dropdown.get_side_border_padding();this.dropdown.setStyles({width:b,top:a});this.search_field=this.container.getElement("input");this.search_results=this.container.getElement("ul.chzn-results");this.search_field_scale();this.search_no_results=this.container.getElement("li.no-results");this.is_multiple?(this.search_choices=this.container.getElement("ul.chzn-choices"),this.search_container=
this.container.getElement("li.search-field")):(this.search_container=this.container.getElement("div.chzn-search"),this.selected_item=this.container.getElement(".chzn-single"),a=b-this.search_container.get_side_border_padding()-this.search_field.get_side_border_padding(),this.search_field.setStyle("width",a));this.results_build();this.set_tab_index()},register_observers:function(){this.container.addEvents({click:this.container_click.bind(this),mouseenter:this.mouse_enter.bind(this),mouseleave:this.mouse_leave.bind(this)});
this.search_results.addEvents({click:this.search_results_click.bind(this),mouseover:this.search_results_mouseover.bind(this),mouseout:this.search_results_mouseout.bind(this)});this.form_field.addEvent("liszt:updated",this.results_update_field.bind(this));this.search_field.addEvents({blur:this.input_blur.bind(this),keyup:this.keyup_checker.bind(this),keydown:this.keydown_checker.bind(this)});this.is_multiple?(this.search_choices.addEvent("click",this.choices_click.bind(this)),this.search_field.addEvent("focus",
this.input_focus.bind(this))):this.selected_item.addEvent("focus",this.activate_field.bind(this))},container_click:function(a){a&&a.type==="click"&&a.stopPropagation();if(this.pending_destroy_click)this.pending_destroy_click=!1;else{if(this.active_field){if(!this.is_multiple&&a&&(a.target===this.selected_item||a.target.getParents("a.chzn-single").length))a.preventDefault(),this.results_toggle()}else{if(this.is_multiple)this.search_field.value="";document.addEvent("click",this.click_test_action);this.results_show()}this.activate_field()}},
mouse_enter:function(){this.mouse_on_container=!0},mouse_leave:function(){this.mouse_on_container=!1},input_focus:function(){this.active_field||setTimeout(this.container_click.bind(this),50)},input_blur:function(){if(!this.mouse_on_container)this.active_field=!1,setTimeout(this.blur_test.bind(this),100)},blur_test:function(){!this.active_field&&this.container.hasClass("chzn-container-active")&&this.close_field()},close_field:function(){document.removeEvent("click",this.click_test_action);this.is_multiple||
(this.selected_item.set("tabindex",this.search_field.get("tabindex")),this.search_field.set("tabindex",-1));this.active_field=!1;this.results_hide();this.container.removeClass("chzn-container-active");this.winnow_results_clear();this.clear_backstroke();this.show_search_field_default();this.search_field_scale()},activate_field:function(){!this.is_multiple&&!this.active_field&&(this.search_field.set("tabindex",this.selected_item.get("tabindex")),this.selected_item.set("tabindex",-1));this.container.addClass("chzn-container-active");
this.active_field=!0;this.search_field.set("value",this.search_field.get("value"));this.search_field.focus()},test_active_click:function(a){a.target.getParents("#"+this.container_id).length?this.active_field=!0:this.close_field()},results_build:function(){this.parsing=!0;this.results_data=this.form_field.select_to_array();this.is_multiple&&this.choices>0?(this.search_choices.getElements("li.search-choice").destroy(),this.choices=0):this.is_multiple||this.selected_item.getElements("span").set("text",
this.default_text);var a="";this.results_data.each(function(b){b.group?a+=this.result_add_group(b):b.empty||(a+=this.result_add_option(b),b.selected&&this.is_multiple?this.choice_build(b):b.selected&&!this.is_multiple&&this.selected_item.getElements("span").set("text",b.text))},this);this.show_search_field_default();this.search_field_scale();this.search_results.set("html",a);this.parsing=!1},result_add_group:function(a){return a.disabled?"":(a.dom_id=this.container_id+"_g_"+a.array_index,'<li id="'+
a.dom_id+'" class="group-result"><div>'+a.label+"</div></li>")},result_add_option:function(a){var b;return a.disabled?"":(a.dom_id=this.container_id+"_o_"+a.array_index,b=a.selected&&this.is_multiple?[]:["active-result"],a.selected&&b.push("result-selected"),a.group_array_index!=null&&b.push("group-option"),'<li id="'+a.dom_id+'" class="'+b.join(" ")+'"><div>'+a.html+"</div></li>")},results_update_field:function(){this.result_clear_highlight();this.result_single_selected=null;this.results_build()},
result_do_highlight:function(a){var b,c,e,f;if(a)this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),c=parseInt(this.search_results.getStyle("maxHeight"),10),f=this.search_results.getScroll().y,e=c+f,b=this.result_highlight.getPosition(this.search_results).y+this.search_results.getScroll().y,a=b+this.result_highlight.getCoordinates().height,a>=e?this.search_results.scrollTo(0,a-c>0?a-c:0):b<f&&this.search_results.scrollTo(0,b)},result_clear_highlight:function(){this.result_highlight&&
this.result_highlight.removeClass("highlighted");this.result_highlight=null},results_toggle:function(){this.results_showing?this.results_hide():this.results_show()},results_show:function(){this.is_multiple||(this.selected_item.addClass("chzn-single-with-drop"),this.result_single_selected&&this.result_do_highlight(this.result_single_selected));this.dropdown.setStyles({top:this.is_multiple?this.container.getCoordinates().height:this.container.getCoordinates().height-1,left:0});this.results_showing=
!0;this.search_field.focus();this.search_field.set("value",this.search_field.get("value"));this.winnow_results()},results_hide:function(){this.is_multiple||this.selected_item.removeClass("chzn-single-with-drop");this.result_clear_highlight();this.dropdown.setStyle("left",-9E3);this.results_showing=!1},set_tab_index:function(){var a;this.form_field.get("tabindex")&&(a=this.form_field.get("tabindex"),this.form_field.set("tabindex",-1),this.is_multiple?this.search_field.set("tabindex",a):(this.selected_item.set("tabindex",
a),this.search_field.set("tabindex",-1)))},show_search_field_default:function(){this.is_multiple&&this.choices<1&&!this.active_field?(this.search_field.set("value",this.default_text),this.search_field.addClass("default")):(this.search_field.set("value",""),this.search_field.removeClass("default"))},search_results_click:function(a){var b=a.target.hasClass("active-result")?a.target:a.target.getParent(".active-result");if(b)this.result_highlight=b,this.result_select(a)},search_results_mouseover:function(a){(a=
a.target.hasClass("active-result")?a.target:a.target.getParent(".active-result"))&&this.result_do_highlight(a)},search_results_mouseout:function(a){(a.target.hasClass("active-result")||a.target.getParent(".active-result"))&&this.result_clear_highlight()},choices_click:function(a){a.preventDefault();this.active_field&&!a.target.hasClass("search-choice")&&!a.target.getParent(".search-choice")&&!this.results_showing&&this.results_show()},choice_build:function(a){var b=this.container_id+"_c_"+a.array_index;
this.choices+=1;this.search_container.grab((new Element("li",{id:b})).addClass("search-choice").set("html","<span>"+a.html+'</span><a href="#" class="search-choice-close" rel="'+a.array_index+'"></a>'),"before");document.id(b).getElement("a").addEvent("click",this.choice_destroy_link_click.bind(this))},choice_destroy_link_click:function(a){a.preventDefault();this.pending_destroy_click=!0;this.choice_destroy(a.target)},choice_destroy:function(a){this.choices-=1;this.show_search_field_default();this.is_multiple&&
this.choices>0&&this.search_field.value.length<1&&this.results_hide();this.result_deselect(a.get("rel"));a.getParent("li").destroy()},result_select:function(a){var b,c;if(this.result_highlight)b=this.result_highlight,c=b.get("id"),this.result_clear_highlight(),b.addClass("result-selected"),this.is_multiple?this.result_deactivate(b):this.result_single_selected=b,b=c.substr(c.lastIndexOf("_")+1),b=this.results_data[b],b.selected=!0,this.form_field.options[b.options_index].selected=!0,this.is_multiple?
this.choice_build(b):this.selected_item.getElement("span").set("text",b.text),(!this.is_multiple||!a.control)&&this.results_hide(),this.search_field.set("value",""),this.form_field.fireEvent("change"),this.search_field_scale()},result_activate:function(a){a.addClass("active-result").setStyle("display","block")},result_deactivate:function(a){a.removeClass("active-result").setStyle("display","none")},result_deselect:function(a){var b;b=this.results_data[a];b.selected=!1;this.form_field.options[b.options_index].selected=
!1;document.id(this.container_id+"_o_"+a).removeClass("result-selected").addClass("active-result").setStyle("display","block");this.result_clear_highlight();this.winnow_results();this.form_field.fireEvent("change");this.search_field_scale()},results_search:function(){this.results_showing?this.winnow_results():this.results_show()},winnow_results:function(){var a,b,c,e,f,g,i,h,j;this.no_results_clear();f=0;g=this.search_field.get("value")===this.default_text?"":(new Element("div",{text:this.search_field.get("value").trim()})).get("html");
c=RegExp("^"+g.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");j=RegExp(g.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");this.results_data.each(function(d){if(!d.disabled&&!d.empty)if(d.group)document.id(d.dom_id).setStyle("display","none");else if(!this.is_multiple||!d.selected){a=!1;e=d.dom_id;if(c.test(d.html))a=!0,f+=1;else if(d.html.indexOf(" ")>=0||d.html.indexOf("[")===0)b=d.html.replace(/\[|\]/g,"").split(" "),b.length&&b.each(function(b){c.test(b)&&(a=!0,f+=1)});a?(g.length?(i=d.html.search(j),
h=d.html.substr(0,i+g.length)+"</em>"+d.html.substr(i+g.length),h=h.substr(0,i)+"<em>"+h.substr(i)):h=d.html,document.id(e).get("html")!==h&&document.id(e).set("html",h),this.result_activate(document.id(e)),d.group_array_index!=null&&document.id(this.results_data[d.group_array_index].dom_id).setStyle("display","block")):(this.result_highlight&&e===this.result_highlight.get("id")&&this.result_clear_highlight(),this.result_deactivate(document.id(e)))}},this);f<1&&g.length?this.no_results(g):this.winnow_results_set_highlight()},
winnow_results_clear:function(){this.search_field.set("value","");this.search_results.getElements("li").each(function(a){a.hasClass("group-result")?a.setStyle("display","block"):(!this.is_multiple||!a.hasClass("result-selected"))&&this.result_activate(a)},this)},winnow_results_set_highlight:function(){if(!this.result_highlight){var a=!this.is_multiple?this.search_results.getElements(".result-selected"):[],a=a.length?a[0]:this.search_results.getElement(".active-result");a!=null&&this.result_do_highlight(a)}},
no_results:function(a){var b=(new Element("li",{"class":"no-results"})).set("html",Locale.get("Chosen.noResults")+' "<span></span>"');b.getElement("span").set("html",a);this.search_results.grab(b)},no_results_clear:function(){this.search_results.getElements(".no-results").destroy()},keydown_arrow:function(){var a;this.result_highlight?this.results_showing&&(a=this.result_highlight.getNext("li.active-result"))&&this.result_do_highlight(a):(a=this.search_results.getElement("li.active-result"))&&this.result_do_highlight(a);
this.results_showing||this.results_show()},keyup_arrow:function(){if(!this.results_showing&&!this.is_multiple)this.results_show();else if(this.result_highlight){var a=this.result_highlight.getAllPrevious("li.active-result");a.length?this.result_do_highlight(a[0]):(this.choices>0&&this.results_hide(),this.result_clear_highlight())}},keydown_backstroke:function(){this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.getElement("a")),this.clear_backstroke()):(this.pending_backstroke=this.search_choices.getLast("li.search-choice"),
this.pending_backstroke.addClass("search-choice-focus"))},clear_backstroke:function(){this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus");this.pending_backstroke=null},keyup_checker:function(a){this.search_field_scale();switch(a.key){case "backspace":this.is_multiple&&this.backstroke_length<1&&this.choices>0?this.keydown_backstroke():this.pending_backstroke||(this.result_clear_highlight(),this.results_search());break;case "enter":a.preventDefault();this.results_showing&&
this.result_select(a);break;case "esc":this.results_showing&&this.results_hide();break;case "tab":case "up":case "down":case "shift":case "ctrl":break;default:this.results_search()}},keydown_checker:function(a){this.search_field_scale();a.key!=="backspace"&&this.pending_backstroke&&this.clear_backstroke();switch(a.key){case "backspace":this.backstroke_length=this.search_field.value.length;break;case "tab":this.mouse_on_container=!1;break;case "enter":a.preventDefault();break;case "up":a.preventDefault();
this.keyup_arrow();break;case "down":this.keydown_arrow()}},search_field_scale:function(){var a,b;if(this.is_multiple)a={position:"absolute",visibility:"hidden"},b=this.search_field.getStyles("font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"),Object.merge(a,b),a=new Element("div",{styles:a}),a.set("text",this.search_field.get("value")),document.body.grab(a),b=a.getCoordinates().width+25,a.destroy(),b>this.f_width-10&&(b=this.f_width-10),this.search_field.setStyle("width",
b),a=this.container.getCoordinates().height,this.dropdown.setStyle("top",a)}});Element.implement({get_side_border_padding:function(){var a=this.getStyles("padding-left","padding-right","border-left-width","border-right-width"),a=Object.filter(a,function(a){return typeof a=="string"}),a=Object.map(a,function(a){return a.toInt()}),a=Object.values(a),b=0,c=a.length;if(c)for(;c--;)b+=a[c];return b},select_to_array:function(){var a=new SelectParser;this.getChildren().each(function(b){a.add_node(b)});return a.parsed}});
var SelectParser=new Class({options_index:0,parsed:[],add_node:function(a){a.nodeName==="OPTGROUP"?this.add_group(a):this.add_option(a)},add_group:function(a){var b=this.parsed.length;this.parsed.push({array_index:b,group:!0,label:a.label,children:0,disabled:a.disabled});a.getChildren().each(function(c){this.add_option(c,b,a.disabled)},this)},add_option:function(a,b,c){a.nodeName==="OPTION"&&(a.text!==""?(b!=null&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,
value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1)}});
