// Logger.js
var log,warn,Logger=Class.create({'DEBUG':true,'STRICT_ERRORS':true,'logging_pane':'logging-pane','initial_message':' - Reporter initalized - ','_log_to_page':function(t){if(this.DEBUG){this.pane.insert('<p>'+t+'</p>');}},'_log_to_console':function(t){if(this.DEBUG){console.log(t);}},'_warn':function(msg,SpecificError){if(this.STRICT_ERRORS){if(SpecificError){throw new SpecificError(msg);}
else{throw new Error(msg);}}
else{this.log('WARNING: '+msg);}},'initialize':function(){try{this._log_to_console(this.initial_message);log=this._log_to_console.bind(this);}
catch(e){var log_to_pane;this.pane=$(this.logging_pane);if(this.pane){try{log_to_pane=this._log_to_page.bind(this);log_to_pane(this.initial_message);log=log_to_pane;return;}
catch(e){}}
else{this.pane=$(document.body);log_to_pane=this._log_to_page.bind(this);log_to_pane(this.initial_message);log=log_to_pane;}}
warn=this._warn.bind(this);}});

// Mapper.js
var fire=Element.Methods.fire.methodize().bind(document);var observe=Element.Methods.observe.methodize().bind(document);var stopObserving=Element.Methods.stopObserving.methodize().bind(document);var map,Mapper=Class.create({'mapping':new Hash(),'_validate':function(name){return!!(name&&typeof(name)==typeof('')&&name.include(':'));},'notify':function(name,memo){fire(name,memo);},'handle':function(event){var keys=Object.keys(event);if(keys.include('eventName')&&keys.include('memo')){var from=event.eventName;if(this.mapping.keys().include(from)){var tos=this.mapping.get(from);tos.each(function(to){this.notify(to.name,Object.extend(event.memo,to.params));}.bind(this));}
else{warn('Event not in mapping: '+event);}}
else{warn('Can\'t map event (either no name or no memo): '+event);}},'map':function(event1,event2,params_){if(this._validate(event1)&&this._validate(event2)){var from=event1;var params;if(params_&&typeof(params_)==typeof({})){params=params_;}
else{params={};}
var to={'name':event2,'params':params};if(this.mapping.keys().include(from)){var current=this.mapping.get(event1);var index,included=current.find(function(to,i){if(to.name==event2){index=i;return true;}
return false;});if(included){current[index]=to;}
else{current.push(to);}
this.mapping.set(event1,current);}
else{this.mapping.set(event1,[to]);observe(event1,this.handler);}}},'initialize':function(event_map){this.handler=this.handle.bindAsEventListener(this);map=this.map.bind(this);if(event_map){event_map.each(function(p){var params,name,to=p.value;name=to.name;params=getattr(to,'params',{});map(p.key,name,params);});}}});

// Slot.js
var Slot=Class.create({'target':null,'id':'','state':null,'focus':'','__all__':new Array(),'expose':function(methods){methods.each(function(method){if(!this.__all__.include(method)){this.__all__.push(method);}}.bind(this));},'register':function(){observe(this.id+':called',this.handle_call);observe(this.id+':requested',this.handle_slot_event);observe(this.id+':state:changed',this.handle_set_state);fire('slot:registered',this);},'unregister':function(){stopObserving(this.id+':called',this.handle_call);stopObserving(this.id+':requested',this.handle_slot_event);stopObserving(this.id+':state:changed',this.handle_set_state);fire('slot:unregistered',this);},'handle_event':function(event){if(hasattr(event,'memo')){var memo=event.memo;var method_name=getattr(memo,'method',false);if(method_name){var method=getattr(this,method_name,false);if(method&&typeof(method)==typeof(function(){})){var params=getattr(memo,'params',false);if(params){this[method_name](params);}
else{this[method_name]();}}}
else{warn('Invalid event (no method): '+memo);}}
else{warn('Invalid event (no memo): '+event);}},'handle_public_broadcast_event':function(event){if(hasattr(event,'memo')){var memo=event.memo;var method=getattr(memo,'method',false);if(method){if(this.__all__.include(method)){this.handle_event(event);}
else{log('Method '+method+' called when not exposed');}}
else{warn('Invalid event (no method): '+memo);}}
else{warn('Invalid event (no memo): '+event);}},'get_state':function(event){return this.state;},'set_state':function(event){var state=getattr(event,'memo',false);if(state&&typeof(state)==typeof({})){if(typeof(getattr(this,'parse_state',false))==typeof(function(){})){state=this.parse_state(state);}
if(hasattr(state,'focus_url')){this.set_focus(state);}
this.state=state;}
else{warn('Slot.set_state: Invalid event, no memo || memo not an object');log(event);}},'get_focus':function(){return this.focus;},'set_focus':function($state){var parts=$state.focus_url.split('/');if(parts.length>1){var memo=$state;memo['focus_url']=parts.slice(1).join('/');fire(parts[0]+':state:changed',memo);}
else{fire('focus:parsed');}
var focus_=parts[0];if(focus_!=this.focus){this.focus=focus_;if(typeof(getattr(this,'focus_on',false))==typeof(function(){})){this.focus_on(focus_);}}},'initialize':function(target,methods){this.target=$(target);this.id=this.target.identify();this.handle_call=this.handle_event.bindAsEventListener(this);this.handle_slot_event=this.handle_public_broadcast_event.bindAsEventListener(this);this.handle_set_state=this.set_state.bindAsEventListener(this);if(methods){this.expose(methods);}
this.target.slot=this;this.register();}});

// ChasteEnvironment.js
var ChasteEnvironment=Class.create({'event_map':new Hash({'state:changed':{'name':'slots:state:requested'},'slots:state:dispatched':{'name':'application:state:changed'},'browser:state:changed':{'name':'record:dispatched'},'slots:updated':{'name':'broadcast:requested','params':{'name':'slotsupdate'}}}),'initialize':function(requires_prickly,does_not_require_history){var logger=new Logger();var mapper=new Mapper(this.event_map);var parser=new RecordParser();var registry=new SlotRegistry();if(requires_prickly){var broadcaster=new Broadcaster();var reciever=new Receiver();}
if(!does_not_require_history){var snitch=new HistorySnitch();}
fire('chaste-environment:initialized',{});}});

// FakeSlot.js
var FakeSlot=Class.create({'register':function(){fire('slot:registered',this);},'unregister':function(){fire('slot:unregistered',this);},'get_state':function(){return null;},'initialize':function(id){this.id=id;this.register();}});

// HistorySnitch.js
var HistorySnitch=Class.create({'container_id':'history','iframe_id':'history-iframe','iframe_src':'/++resource++base/htm/history.htm','records':new Hash(),'ignore':false,'_verify_dependencies':function(){if(window.frames){if(!(this.iframe_id in window.frames)){var iframe=new Element('iframe',{'id':this.iframe_id,'name':this.iframe_id,'src':this.iframe_src});if(!$(this.container_id)){$(document.body).insert(new Element('div',{'id':this.container_id}));}
$(this.container_id).insert(iframe);}
return!!(this.iframe_id in window.frames);}
else{return false;}},'notify':function(record){fire('browser:state:changed',record);},'handle':function(iframe_location){if(!this.ignore){var split=iframe_location.split('?');if(split.length!=2){warn('invalid location in HistorySneak.handle: '+iframe_location);}
else{var timestamp=split[1];var keys=this.records.keys();if(keys.include(timestamp)){this.notify(this.records.get(timestamp));}}}
else{this.ignore=false;}},'record':function(event){if(hasattr(event,'memo')){var record=event.memo;var date=new Date();var timestamp=date.getTime().toString();this.records.set(timestamp,record);this.ignore=true;var src=this.iframe_path+'?'+timestamp;if(Prototype.Browser.WebKit){this.iframe.location=src;}
else{this.iframe.location.href=src;}}
else{warn('Invalid event (no memo): '+event);}},'initialize':function(record){if(this._verify_dependencies()){this.iframe=window.frames[this.iframe_id];this.iframe_path=$(this.iframe_id).readAttribute('src');window.handle_location_change=this.handle.bind(this);observe('application:state:changed',this.record.bindAsEventListener(this));}
else{warn('HistorySnitch can\'t initialize (no iframe support).');}}});

// RecordParser.js
var RecordParser=Class.create({'handle':function(event){var states=$H(getattr(event,'memo',{}));states.each(function(p){var slot=p.key;var state=p.value;fire(slot+':state:changed',state);});},'initialize':function(){observe('record:dispatched',this.handle.bindAsEventListener(this));}});

// ResizeSnitch.js
var ResizeSnitch=Class.create({'complete_resize_delay':0.5,'_finalize_resize':function(){var dims=document.viewport.getDimensions();if(dims!=this.last_known_dimensions){this._execute_resize();}},'_complete_resize':function(){this.resizing=false;if(this.resize_in_buffer){this.handle_resize();}
else{this._finalize_resize.bind(this).delay(this.complete_resize_delay);}},'_execute_resize':function(){try{this.last_known_dimensions=document.viewport.getDimensions();fire('window:resized',this.last_known_dimensions);}
finally{this._complete_resize.bind(this).delay(this.complete_resize_delay);}},'handle_resize':function(event){if(this.resizing){this.resize_in_buffer=true;}
else{this.resizing=true;this.resize_in_buffer=false;this._execute_resize.bind(this).defer();}},'initialize':function($delay){if($delay){this.complete_resize_delay=$delay;}
var handler=this.handle_resize.bindAsEventListener(this);Event.observe(window,'resize',handler);}});

// SlotRegistry.js
var SlotRegistry=Class.create({'ready':false,'slots':new Hash(),'key_cache':new Array(),'register':function(slot){var key=slot.id;this.slots.set(key,slot);},'unregister':function(slot){var key=slot.id;this.slots.unset(key);},'notify':function(){var keys=this.slots.keys();if(keys!=this.key_cache){this.key_cache=keys;log('keys');log(keys);fire('slots:updated',{'slots':keys});}},'_handle':function(event){if(hasattr(event,'memo')){var slot=event.memo;var name=event.eventName;if(name=='slot:registered'){this.register(slot);}
else if(name=='slot:unregistered'){this.unregister(slot);}
else{return;}
if(this.ready){this.notify();}}
else{warn('SlotRegistry.handle recieved a "'+event.eventName+'" event with no memo object: '+event);}},'_dispatch':function(){var states={};this.slots.each(function(slot){states[slot.key]=slot.value.get_state();});if(!this.ready){this.ready=true;this.notify();}
fire('slots:state:dispatched',states);},'initialize':function(){var handle=this._handle.bindAsEventListener(this);observe('slot:registered',handle);observe('slot:unregistered',handle);observe('slots:state:requested',this._dispatch.bind(this));}});

// VisualSlot.js
var VisualSlot=Class.create(Slot,{'reveal':function(target){var class_names=['hide-to-begin-with','invisible-to-begin-with'];class_names.each(function(class_name){if(target.hasClassName(class_name)){target.removeClassName(class_name);}});if(!target.visible()){target.show();}},'chastise':function(){var target=this.target;target.rehide('.hide-to-begin-with');this.reveal(target);},'initialize':function($super,target,methods){$super(target,methods);this.chastise();}});

