/**
 * Builds and configures a set of dropdown menus that depend on each other to populate and 
 * filter results.
 * @author Adam J. McIntyre
 */

YAHOO.namespace('widget.MultipleSelectItem');YAHOO.widget.MultipleSelectItem=function(el,trigger,callback){this.el=YAHOO.util.Dom.get(el);this.trigger=trigger;this.id=this.el.id;this.children=[];this.triggers=[];this.ancestors=[];this.displayed=false;var that=this;this.onSelectChangeEvent=new YAHOO.util.CustomEvent('onSelectChange',that);this.onSelectAddEvent=new YAHOO.util.CustomEvent('onSelectAdd',that);this.onTriggerEvent=new YAHOO.util.CustomEvent('trigger',that);if(callback){this.onSelectChange(function(e,args,o){callback(e,args,o);},this);}
YAHOO.util.Event.addListener(this.el,'change',function(e,args){if(this.options[this.selectedIndex].value!=''){that.onSelectChangeEvent.fire(args,this);that.onTriggerEvent.fire(args,this);}},this);}
var proto=YAHOO.widget.MultipleSelectItem.prototype;proto.isChild=function(elId){for(var i=0;i<this.children.length;i++){if(elId==this.children[i])
return true;}
return false;}
proto.isAncestor=function(elId){for(var i=0;i<this.ancestors.length;i++){if(elId==this.ancestors[i])
return true;}
return false;}
proto._addChild=function(el,trigger,cb){var msi=new YAHOO.widget.MultipleSelectItem(el,trigger,cb);this.triggers[trigger]=msi;this.children.push(msi);msi.displayed=true;this.onSelectAddEvent.fire(this.arguments,msi);return msi;}
proto._addGroupedChildren=function(gObj,arrBefore,arrAfter,selId,trigger,cb){var sel=document.createElement('select');if(selId){sel.id=selId;}
else{sel.id=this.id+'_child_'+this.children.length;}
if(arrBefore.length>0){for(var i=0;i<arrBefore.length;i++){sel.appendChild(this._addOption(arrBefore[i]));}}
for(var i=0;i<gObj.length;i++){var og=document.createElement('optgroup');og.label=gObj[i].name;var cOpts=gObj[i].childOptions;for(var j=0;j<cOpts.length;j++){og.appendChild(this._addOption(gObj[i].childOptions[j]));}
sel.appendChild(og);}
if(arrAfter.length>0){for(var i=0;i<arrAfter.length;i++){sel.appendChild(this._addOption(arrAfter[i]));}}
return this._addToDOM(sel,trigger,cb);}
proto._addChildItems=function(arr,selId,trigger,cb){var sel=document.createElement('select');if(selId){sel.id=selId;}
else{sel.id=this.id+'_child_'+this.children.length;}
for(var i=0;i<arr.length;i++){sel.appendChild(this._addOption(arr[i]));}
return this._addToDOM(sel,trigger,cb);}
proto._addOption=function(opt){var optEl=document.createElement('option');optEl.value=opt.value;optEl.innerHTML=opt.text;if(opt.id){optEl.id=opt.id;}
if(opt.trigger){optEl.setAttribute('data-trigger',opt.trigger);}
if(opt.optional){optEl.setAttribute(opt.optional.key,opt.optional.value);}
return optEl;}
proto._addToDOM=function(sel,trigger,cb){if(YAHOO.env.ua.webkit>0){var pNode=YAHOO.util.Dom.get(this.el).parentNode;pNode.style.overflow="hidden";sel.style.display='none';pNode.style.width='';}
YAHOO.util.Dom.get(this.el).parentNode.appendChild(sel);if(YAHOO.env.ua.webkit>0){window.focus();sel.style.display='';sel.focus();}
var msi=new YAHOO.widget.MultipleSelectItem(sel.id,trigger,cb);this.triggers[trigger]=msi;this.children.push(msi);msi.displayed=true;this.onSelectAddEvent.fire(this.arguments,msi);return msi;}
proto._getChildItem=function(trigger){if(this.triggers[trigger]){return this.triggers[trigger];}
return null;}
proto.showItem=function(){this.el.style.display='';this.el.focus();this.displayed=true;return this;}
proto.showChildren=function(){for(var i=0;i<this.children.length;i++){this.children[i].showItem();}}
proto.hideItem=function(){this.el.style.display='none';this.displayed=false;this.el.selectedIndex=0;this.hideChildren();return this;}
proto.hideChildren=function(){for(var i=0;i<this.children.length;i++){this.children[i].hideItem();}}
proto.onSelectChange=function(callback,obj){this.onSelectChangeEvent.subscribe(callback,obj);}
proto.removeOnSelectChange=function(callback,obj){this.onSelectChangeEvent.unsubscribe(callback,obj);}
proto.onSelectAdd=function(callback,obj){this.onSelectAddEvent.subscribe(callback,obj);}
proto.removeOnSelectAdd=function(callback,obj){this.onSelectAddEvent.unsubscribe(callback,obj);}
YAHOO.namespace('widget.MultipleDD');YAHOO.widget.MultipleDDMgr=function(rootEl,cb,ajaxUrl){this.el=YAHOO.util.Dom.get(rootEl);var initialMSItem=new YAHOO.widget.MultipleSelectItem(this.el,null,cb);this.managedSelects=[];this.managedSelects[this.el.id]=initialMSItem;this.onSelectDisplayEvent=new YAHOO.util.CustomEvent('onSelectDisplay',this);this.onBeforeSelectDisplayEvent=new YAHOO.util.CustomEvent('onBeforeSelectDisplay',this);}
proto=YAHOO.widget.MultipleDDMgr.prototype;proto.addChild=function(el,parentId,trigger,cb){this.onBeforeSelectDisplayEvent.fire(this,arguments);var item=this.managedSelects[parentId]._addChild(el,trigger,cb);this.managedSelects[item.id]=item;this.onSelectDisplayEvent.fire(this.arguments,item);return item.id;}
proto.addSelectItems=function(arr,selId,parentId,trigger,cb){this.onBeforeSelectDisplayEvent.fire(this,arguments);var item=this.managedSelects[parentId]._addChildItems(arr,selId,trigger,cb);this.managedSelects[item.id]=item;this.onSelectDisplayEvent.fire(this.arguments,item);return item.id;}
proto.addGroupSelectItems=function(gObj,arrBefore,arrAfter,selId,parentId,trigger,cb){this.onBeforeSelectDisplayEvent.fire(this,arguments);var item=this.managedSelects[parentId]._addGroupedChildren(gObj,arrBefore,arrAfter,selId,trigger,cb);this.managedSelects[item.id]=item;this.onSelectDisplayEvent.fire(this.arguments,item);return item.id;}
proto.hideSelects=function(parentId){this.managedSelects[parentId].hideChildren();}
proto.onSelectDisplay=function(callback,obj){this.onSelectDisplayEvent.subscribe(callback,obj);}
proto.removeOnSelectDisplay=function(callback,obj){this.onSelectDisplayEvent.unsubscribe(callback,obj);}
proto.onBeforeSelectDisplay=function(callback,obj){this.onBeforeSelectDisplayEvent.subscribe(callback,obj);}
proto.removeOnBeforeSelectDisplay=function(callback,obj){this.onBeforeSelectDisplayEvent.unsubscribe(callback,obj);}