/* 
Panda JavaScript Components
http://panda-js.org/ 

Release 0.1
*/
window.panda=(function(){var util,app,Module;Module=function(name){this.imported={};this.self={};this.name=function(){return name;};};Module.prototype={self:null,imported:null,name:null,use:function(){var i=0,l=arguments.length,imported=this.imported,module;for(i;i<l;i++){module=arguments[i];imported[module]=app.module(module);}return this;},define:function(module){this.self=module.apply(this,util.values(this.imported));return this;},expose:function(){var target=util.namespace(this.name());if(this.self!==null){util.extend(this.self,target);}}};util={values:function(object){var out=[],i;for(i in object){out.push(object[i]);}return out;},keys:function(object){var out=[],i;for(i in object){out.push(i);}return out;},namespace:function(namespace){var components=namespace.split(/[^a-z0-9]+/ig),context=window,i,l,component;for(i=0,l=components.length;i<l;i+=1){component=components[i];if(!context[component]){context[component]={};}context=context[component];}return context;},extend:function(from,to){for(var i in from){to[i]=to[i]||from[i];}return to;},each:function(object,callback){var i,l;if(!!object.length&&!!object[0]){for(i=0,l=object.length;i<l;i++){callback(object[i],i,object);}}else{for(i in object){callback(object[i],i,object);}}},require:function(path,callback){var script=document.createElement('script'),target=document.body||document.documentElement;script.src=path;script.onload=callback;target.appendChild(script);}};app={registry:{},autoRun:function(){var scriptNode=document.getElementById('panda-js');if(!scriptNode)return;scriptNode.onload=function(){eval(scriptNode.innerHTML);};},module:function(name){var registry=app.registry,module=registry[name];if(!module){module=new Module(name);app.registry[name]=module;}return module;}};app.autoRun();return util.extend(util,function(name){return app.module(name);});}());
