/**
 * ChainedSelect - slick & sexy chained select
 *
 * @version		1.0.1
 *
 * @license		MIT-style license
 * @author		Constantin Boiangiu <constantin [at] php-help.ro>
 * @copyright	Author
 */
 
var ChainedSelect=new Class({Implements:[Options],options:{element:null,optionsContainer:null,selectName:null,selectedValue:null,selectedMessage:null,defaultMessage:"Please select an option",navHome:"Main options",optionsURL:null,fromTop:15,keepSelection:true,displayHistory:true},initialize:function(A){this.setOptions(A);if(!this.options.element||!this.options.optionsContainer){return}this.isVisible=false;this.currentKey=0;this.history=new Array();this.historyPath=[];this.container=$(this.options.element);this.start()},start:function(){this.container.set({html:this.options.selectedMessage||this.options.defaultMessage,"class":this.options.element});this.inject();this.listEffect=new Fx.Morph(this.listContainer,{duration:600,wait:false,transition:Fx.Transitions.Sine.easeOut});this.wrapEffect=new Fx.Morph(this.wrapper,{duration:600,wait:false,transition:Fx.Transitions.Sine.easeOut});this.container.addEvent("click",this.getOptions.bind(this))},inject:function(){this.selectedOption=new Element("input",{type:"hidden",name:this.options.selectName,value:this.options.selectedValue}).injectAfter(this.container);this.listContainer=new Element("div",{id:this.options.optionsContainer,styles:{position:"absolute",opacity:0,"z-index":100000}}).injectInside(document.body);new Element("div",{"class":"pointer",html:"<!--design purposes-->"}).injectInside(this.listContainer);this.navigator=new Element("div",{"class":"navigator"}).injectInside(this.listContainer);this.title=new Element("span",{"class":"title"}).injectInside(this.navigator);this.returnLink=new Element("a",{"class":"returnLink",href:"#",styles:{display:"none"}}).injectInside(this.navigator).addEvent("click",this.goBack.bind(this));this.wrapper=new Element("div",{"class":"scrollWrapper"}).injectInside(this.listContainer)},getOptions:function(){if(this.isVisible){this.hideList();return}else{this.showList()}$defined(this.responseResult)?this.populateList():this.makeRequest()},showList:function(){var A=this.container.getCoordinates();this.listContainer.set({styles:{top:A.top+A.height+this.options.fromTop,left:A.left,display:"block"}});this.listEffect.start({opacity:1});this.isVisible=true},hideList:function(){this.listEffect.start({opacity:0}).chain(function(){this.listContainer.setStyle("display","none");if(!this.options.keepSelection){this.currentKey=0;this.history.empty();$clear(this.previousKey);this.returnLink.setStyle("display","none");this.populateList()}}.bind(this));this.isVisible=false},populateList:function(){if($defined(this.previousKey)&&this.previousKey==this.currentKey&&this.options.keepSelection){return}this.wrapper.empty();if(this.currentKey==0&&this.history.length==0){this.historyLink(this.options.navHome,0)}var A=new Hash(this.responseResult.get(this.currentKey));A.map(function(C,B){this.makeEntry(C,B);if(this.responseResult.get(B)){this.addNavigation(C,B)}}.bind(this));this.wrapEffect.start({opacity:[0,1]})},makeEntry:function(A,B){new Element("div",{"class":"entry",text:A,id:"key_"+B}).injectInside(this.wrapper).addEvent("click",function(D){this.hideList();this.selectedOption.set({value:B});if(this.options.displayHistory){this.setPath(B);A="";for(var C=this.historyPath.length-1;C>=0;C--){A+=this.historyPath[C]+(C>0?" - ":"")}this.historyPath.empty()}this.container.set({html:A})}.bind(this))},setPath:function(A){this.responseResult.map(function(D,B){var C=new Hash(this.responseResult.get(B));if(C.has(A)){this.historyPath.push(C.get(A));this.setPath(B)}}.bind(this))},addNavigation:function(B,C){var A=new Element("a",{"class":"nav",href:"#"}).injectInside($("key_"+C));A.addEvent("click",function(D){new Event(D).stop();this.setCurrentKey(C);this.returnLink.setStyle("display","block");this.populateList();this.historyLink(B,C)}.bind(this))},historyLink:function(B,A){this.history.include(A);this.title.set({html:B})},goBack:function(B){new Event(B).stop();this.history.erase(this.currentKey);this.currentKey=$defined(this.previousKey)?this.previousKey:0;var A=this.history.indexOf(this.previousKey);this.previousKey=A<=0?null:this.history[A-1];if(this.currentKey==0){this.returnLink.setStyle("display","none")}this.title.set({html:this.responseResult[this.previousKey||0][this.currentKey]||this.options.navHome});this.populateList()},setCurrentKey:function(A){this.previousKey=this.currentKey;this.currentKey=A},makeRequest:function(){this.listContainer.addClass("loading");var A=new Request.JSON({url:this.options.optionsURL,onComplete:function(B){this.responseResult=new Hash(B);this.listContainer.removeClass("loading");this.populateList()}.bind(this)}).get()}});
