LiveField=new Class({Implements:Options,options:{field:false,url:'',event:'',autoHide:0,useHeader:0,listeners:[],speakers:[]},initialize:function(options){this.setOptions(options);if(this.field=$(options.field)){if(this.options.event.length>0)this.field.addEvent(options.event,this.onFieldChange.bind(this));this.updateField();}
this.requesters={};},addSpeaker:function(speaker){this.options.speakers.push(speaker);},addListener:function(listener){this.options.listeners.push(listener);listener.addSpeaker(this);},onFieldChange:function(event){this.options.listeners.each(function(listener){listener.onAfterChange();});},toggleEditable:function(editable){if(editable){this.field.disabled=false;this.field.setStyle('color','');this.field.setStyle('background-color','');}else{this.field.disabled=true;this.field.setStyle('color','gray');this.field.setStyle('background-color','#CCCCCC');}},toggleDisplay:function(visible){if(this.options.autoHide){var header=$(this.field.name+'_header');var field=$(this.field.name+'_field');if(visible){if(header)header.setStyle('display','');if(field)field.setStyle('display','');}else{if(header)header.setStyle('display','none');if(field)field.setStyle('display','none');}}},toggleLoading:function(loading){var parent=this.field.getParent();if(parent){if(loading){parent.setStyle('background','url(../../images/loading.gif) no-repeat');this.field.setStyle('visibility','hidden');}else{parent.setStyle('background','');this.field.setStyle('visibility','visible');}}},onAfterChange:function(event){var speaker;var query=['l='+this.field.name];for(var i=0;i<this.options.speakers.length;i++){speaker=this.options.speakers[i].field;if(speaker.value.length>0){query.push(speaker.name+'='+speaker.value);}}
if((query.length-1)==this.options.speakers.length){var requester;var sendUrl=this.options.url+(this.options.url.indexOf('?')>0?'&':'?')+query.join('&');if(!$defined(this.requesters[this.field.name])){this.requesters[this.field.name]=new Request.JSON({method:'get',link:'chain','onSuccess':this.onJSONLoad.bind(this)});requester=this.requesters[this.field.name];}else{requester=this.requesters[this.field.name];if(requester.running&&(requester.options.url!=sendUrl)){requester.cancel();}else if(requester.running){sendUrl=false;}}
if(sendUrl){this.cleanField();this.toggleEditable(false);this.toggleDisplay(true);this.toggleLoading(true);requester.options.url=sendUrl;requester.send();}else return false;}else{this.cleanField();this.toggleEditable(false);this.toggleDisplay(false);}
this.field.fireEvent('change');},cleanField:function(){if(this.field.tagName=='SELECT'){while(this.field.options.length>this.options.useHeader)this.field.options[this.options.useHeader]=null;this.field.selectedIndex=0;this.field.fireEvent('change');}},onJSONLoad:function(data,text){if(this.field.tagName=='SELECT'){var index=this.options.useHeader;var lastSection='';var desc,className;if($type(data)=='array')for(var i=0;i<data.length;i++){if(data[i].section){desc='   - '+data[i].desc;className='optSubitem';if((data[i].section!=lastSection)){this.field.options[index]=new Option(data[i].section,'');this.field.options[index].className='optSection';this.field.options[index].disabled=true;index++;lastSection=data[i].section;}}else{desc=data[i].desc;className='';}
this.field.options[index]=new Option(desc,data[i].value);if(className.length>0)this.field.options[index].className=className;if(data[i].data)this.field.options[index].setAttribute('data-custom',data[i].data);index+=1;}}
this.updateField();this.toggleLoading(false);},updateField:function(){if(this.field.tagName=='SELECT'){var haveData=this.field.options.length>Math.min(1,this.options.useHeader);}else{var haveData=true;}
this.toggleEditable(haveData);this.toggleDisplay(haveData);}});
