// ElementCache.js
var ElementCache=Class.create(Hash,{'options':{'require_class_name':false,'class_name':'cache','require_prefix':false,'prefix':'cache-'},'_cache':function($target){var id=$target.readAttribute('id');if(!id){return}
if(this.options.require_class_name){var has_class_name=target.hasClassName(this.options.class_name);if(!has_class_name){return;}}
if(this.options.require_prefix){var has_prefix=id.startsWith(this.options.prefix);if(!has_prefix){return;}}
this.set(id,$target);},'initialize':function($super,$target,$options){$super();this.target=$($target);if($options){Object.extend(this.options,$options);}
var cache=this._cache.bind(this);this.target.descendants().each(cache);}});

// ImagePreloader.js
var ImagePreloader=Class.create({'images':new Array(),'_preload':function($src){var target=document.createElement('img');Event.observe(target,'load',this.handle_load.bind(this,target));target.src=$src;},'handle_load':function($target){Event.stopObserving($target,'load');this.images=this.images.without($target.src);if(!this.images.length){this.notify_complete();}},'notify_complete':function(){var event_name=this.id+':preloading:completed';fire(event_name,{});},'initialize':function($id,$images){var str=typeof('');var arr=typeof([]);if($id&&typeof($id)==str){this.id=$id;}
else{warn('ImagePreloader constructor must be passed a valid id');return;}
if($images){var type=typeof($images);if(type==str){this.images=new Array($images);}
else if(type==arr){this.images=$images;}
else{warn('ImagePreloader constructor must be passed a string or array of $images');return;}
this.preload=this._preload.bind(this);this.images.clone().each(this.preload);}}});


