Selectables=new Class({Implements:[Class.Occlude,Events,Options,Class.TypeAhead],property:"selectables:instance",options:{multiSelect:true,keysDown:[],typeAhead:true,focusElement:null},initialize:function(a,c){this.setOptions(c);this.listContainer=new Element("div");a=[$(a)||a];a=a.flatten();this.lists=$$(a);this.element=this.lists[0];if(this.occlude()){return this.occluded}this.listContainer.wraps(this.element);this.listContainer.setProperty("class",this.element.getProperty("class"));this.listContainer.addClass("SelectablesContainer");if(!this.listContainer.getStyle("position").test("relative|absolute")){this.listContainer.setStyle("position","relative")}this.lists.each(function(f,e,d){if(f.get("tag")=="table"){d[e]=f.getElement("tbody")}});this.lists.clean();if(this.lists.contains(null)){return}this.selectables=new Elements(this.lists.getChildren().flatten());this.selectedElements=new Elements();if(this.options.typeAhead){var b=this.options.focusElement;if(b==null){b=this.listContainer}this.initTypeAhead(b);b.addEvent("click",function(){b.focus()});b.addEvent("blur",function(){this.clearFilter()}.bind(this));this.selectables.each(function(e){if(e.getChildren().length>0){var d=e.getElement("span");e.store("selectables:elements",(d?[d]:[]))}else{e.store("selectables:elements",[e])}},this)}this.selectables.each(function(d){d.store("selectables:display",d.getStyle("display"));if(d.hasClass("Selected")){this.selectedElements.push(d)}d.addEvent("click",function(){this.clickTreeElement(d);if(this.options.typeAhead){b.focus()}return false}.bind(this));d.addEvent("dblclick",function(e){e.target=d;this.fireEvent("dblclick",e);return false}.bind(this))},this);if(this.options.keysDown.length==0){this.keysDown=[];document.addEvent("keydown",function(d){if(d.shift&&this.keysDown.indexOf("shift")==-1){this.keysDown.push("shift")}if(d.control&&this.keysDown.indexOf("control")==-1){this.keysDown.push("control")}}.bind(this));document.addEvent("keyup",function(d){if(!d.shift&&this.keysDown.indexOf("shift")>-1){this.keysDown.splice(this.keysDown.indexOf("shift"),1)}if(!d.control&&this.keysDown.indexOf("control")>-1){this.keysDown.splice(this.keysDown.indexOf("control"),1)}}.bind(this))}else{this.keysDown=this.options.keysDown}this.listContainer.getFirst().addEvent((Browser.ie?"selectstart":"mousedown"),function(){return false})},clickTreeElement:function(b){if(this.options.multiSelect&&this.keysDown.indexOf("shift")>-1){var c,d;var a=this.selectedElements.getLast();this.clearSelection();a.getParent().getChildren().each(function(e){if(e===b&&!c){c=b;d=a}if(e===a&&!c){c=a;d=b}if(c){this.selectedElements.push(e);e.addClass("Selected");if(e===d){c=null}}},this)}else{if(this.options.multiSelect&&this.keysDown.indexOf("control")>-1){this.toggleTreeElement(b)}else{this.clearSelection();this.selectedElements.push(b);b.addClass("Selected")}}this.fireEvent("click")},toggleTreeElement:function(b){var a=this.selectedElements.indexOf(b);if(a>-1){b.removeClass("Selected");this.selectedElements.splice(a,1)}else{b.addClass("Selected");this.selectedElements.push(b)}return b},selectTreeElement:function(b){var a=this.selectedElements.indexOf(b);if(a==-1){b.addClass("Selected");this.selectedElements.push(b)}return b},selectTreeElementByID:function(d,c){var a=this.lists[0];if(a.get("tag")=="tbody"){a=a.getParent()}if(c==null){c=a.get("id")+"_"}var b=this.selectables.filter("#"+c+d)[0];if(b){this.selectTreeElement(b)}return b},selectAll:function(){this.clearSelection();this.selectables.each(function(a){this.selectTreeElement(a)},this)},clearSelection:function(){this.selectables.removeClass("Selected");this.selectedElements=new Elements()},clearFilter:function(){if(!this.options.typeAhead){return}this.selectables.each(function(a){a.retrieve("selectables:elements").each(function(b){b.set("text",b.get("text"))});a.setStyle("display",a.retrieve("selectables:display"));a.removeClass("FilterActive")})},processKeyBuffer:function(c){if(!this.options.typeAhead){return}if(c==""){this.clearFilter()}var a=new RegExp("("+c+")","ig");var b=0;this.selectables.each(function(e){var f="";e.retrieve("selectables:elements").each(function(g){f+=g.get("text")});if(f.test(a)){if(e.get("tag")=="li"){var d=e.getParent().getParent();if(d!=null&&d.get("tag")=="li"&&!d.hasClass("FilterActive")){d.setStyle("display",e.retrieve("selectables:display"));d.addClass("FilterActive")}}b++;e.retrieve("selectables:elements").each(function(g){var h=g.get("text");g.set("html",h.replace(a,'<em class="Match">$1</em>'))});e.setStyle("display",e.retrieve("selectables:display"));e.addClass("FilterActive")}else{e.retrieve("selectables:elements").each(function(g){g.set("text",g.get("text"))});e.setStyle("display","none");e.removeClass("FilterActive")}})},serialize:function(a){return this.selectedElements.map(function(c,b){return(a?a(c,b):c.get("id"))},this)},submitSelection:function(g,f){var b=this.lists[0];if(b.get("tag")=="tbody"){b=b.getParent()}var a=b.get("id");if(f==null){f=a+"_"}var e=function(h){return h.get("id").replace(f,"")};var d=this.serialize(e);var c=new Element("input");c.set("type","hidden");c.set("name",a);c.set("value",d);c.inject(g)}});
