Skip to content
Browse files

Added crafty

  • Loading branch information...
1 parent fabc515 commit 504a8f86c60bb3f2000f4a04e9f7d7091890b8fb @abuisman committed Mar 24, 2012
Showing with 15 additions and 0 deletions.
  1. +15 −0 js/crafty-min.js
View
15 js/crafty-min.js
@@ -0,0 +1,15 @@
+/*!
+* Crafty v0.4.6
+* http://craftyjs.com
+*
+* Copyright 2010, Louis Stowasser
+* Dual licensed under the MIT or GPL licenses.
+*/
+(function(h,g){var r=function(x){return new r.fn.init(x)},w=1,e=50,o=1,n={},c={},p={},s=[],t,i,a,f=0,m=1000/e,b=(new Date).getTime(),q=Array.prototype.slice,d=/\s*,\s*/,u=/\s+/;r.fn=r.prototype={init:function(B){if(typeof B==="string"){var z=0,F,G,E=false,D=false,H,x,y,C,A;if(B==="*"){for(F in c){this[+F]=c[F];z++}this.length=z;return this}if(B.indexOf(",")!==-1){D=true;H=d}else{if(B.indexOf(" ")!==-1){E=true;H=u}}for(F in c){if(!c.hasOwnProperty(F)){continue}G=c[F];if(E||D){x=B.split(H);C=0;A=x.length;y=0;for(;C<A;C++){if(G.__c[x[C]]){y++}}if(E&&y===A||D&&y>0){this[z++]=+F}}else{if(G.__c[B]){this[z++]=+F}}}if(z>0&&!E&&!D){this.extend(n[B])}if(x&&E){for(C=0;C<A;C++){this.extend(n[x[C]])}}this.length=z}else{if(!B){B=0;if(!(B in c)){c[B]=this}}if(!(B in c)){this.length=0;return this}this[0]=B;this.length=1;if(!this.__c){this.__c={}}if(!c[B]){c[B]=this}return c[B]}return this},addComponent:function(D){var A=[],C=0,z,y=0,x,B;if(arguments.length>1){x=arguments.length;for(;y<x;y++){this.__c[arguments[y]]=true;A.push(arguments[y])}}else{if(D.indexOf(",")!==-1){B=D.split(d);x=B.length;for(;y<x;y++){this.__c[B[y]]=true;A.push(B[y])}}else{this.__c[D]=true;A.push(D)}}z=A.length;for(;C<z;C++){comp=n[A[C]];this.extend(comp);if(comp&&"init" in comp){comp.init.call(this)}}this.trigger("NewComponent",z);return this},toggleComponent:function(x){var z=0,y,A;if(arguments.length>1){y=arguments.length;for(;z<y;z++){if(this.has(arguments[z])){this.removeComponent(arguments[z])}else{this.addComponent(arguments[z])}}}else{if(x.indexOf(",")!==-1){A=x.split(d);y=A.length;for(;z<y;z++){if(this.has(A[z])){this.removeComponent(A[z])}else{this.addComponent(A[z])}}}else{if(this.has(x)){this.removeComponent(x)}else{this.addComponent(x)}}}return this},requires:function(A){var B=A.split(d),z=0,x=B.length,y;for(;z<x;++z){y=B[z];if(!this.has(y)){this.addComponent(y)}}return this},removeComponent:function(A,x){if(x===false){var y=n[A],z;for(z in y){delete this[z]}}delete this.__c[A];this.trigger("RemoveComponent",A);return this},has:function(x){return !!this.__c[x]},attr:function(x,y){if(arguments.length===1){if(typeof x==="string"){return this[x]}this.extend(x);this.trigger("Change",x);return this}this[x]=y;var z={};z[x]=y;this.trigger("Change",z);return this},toArray:function(){return q.call(this,0)},timeout:function(y,x){this.each(function(){var z=this;setTimeout(function(){y.call(z)},x)});return this},bind:function(y,z){if(this.length===1){if(!p[y]){p[y]={}}var x=p[y];if(!x[this[0]]){x[this[0]]=[]}x[this[0]].push(z);return this}this.each(function(){if(!p[y]){p[y]={}}var A=p[y];if(!A[this[0]]){A[this[0]]=[]}A[this[0]].push(z)});return this},unbind:function(x,y){this.each(function(){var B=p[x],A=0,z,C;if(B&&B[this[0]]){z=B[this[0]].length}else{return this}if(!y){delete B[this[0]];return this}for(;A<z;A++){C=B[this[0]];if(C[A]==y){C.splice(A,1);A--}}});return this},trigger:function(A,B){if(this.length===1){if(p[A]&&p[A][this[0]]){var z=p[A][this[0]],y=0,x=z.length;for(;y<x;y++){z[y].call(this,B)}}return this}this.each(function(){if(p[A]&&p[A][this[0]]){var E=p[A][this[0]],D=0,C=E.length;for(;D<C;D++){E[D].call(this,B)}}});return this},each:function(z){var y=0,x=this.length;for(;y<x;y++){if(!c[this[y]]){continue}z.call(c[this[y]],y)}return this},clone:function(){var A=this.__c,x,z,y=r.e();for(x in A){y.addComponent(x)}for(z in this){if(z!="0"&&z!="_global"&&z!="_changed"&&typeof this[z]!="function"&&typeof this[z]!="object"){y[z]=this[z]}}return y},setter:function(y,x){if(r.support.setter){this.__defineSetter__(y,x)}else{if(r.support.defineProperty){Object.defineProperty(this,y,{set:x,configurable:true})}else{a.push({prop:y,obj:this,fn:x})}}return this},destroy:function(){this.each(function(){this.trigger("Remove");for(var x in p){this.unbind(x)}delete c[this[0]]})}};r.fn.init.prototype=r.fn;r.extend=r.fn.extend=function(z){var y=this,x;if(!z){return y}for(x in z){if(y===z[x]){continue}y[x]=z[x]}return y};r.extend({init:function(x,y){r.viewport.init(x,y);this.trigger("Load");this.timer.init();return this},stop:function(){this.timer.stop();r.stage.elem.parentNode.removeChild(r.stage.elem);return this},pause:function(x){if(arguments.length==1?x:!this._paused){this.trigger("Pause");this._paused=true;r.timer.stop();r.keydown={}}else{this.trigger("Unpause");this._paused=false;r.timer.init()}return this},isPaused:function(){return this._paused},timer:{prev:(+new Date),current:(+new Date),curTime:Date.now(),init:function(){var x=h.requestAnimationFrame||h.webkitRequestAnimationFrame||h.mozRequestAnimationFrame||h.oRequestAnimationFrame||h.msRequestAnimationFrame||null;if(x){t=function(){r.timer.step();i=x(t)};t()}else{t=setInterval(r.timer.step,1000/e)}},stop:function(){r.trigger("CraftyStop");if(typeof t==="number"){clearInterval(t)}var x=h.cancelRequestAnimationFrame||h.webkitCancelRequestAnimationFrame||h.mozCancelRequestAnimationFrame||h.oCancelRequestAnimationFrame||h.msCancelRequestAnimationFrame||null;if(x){x(i)}t=null},step:function(){f=0;this.curTime=Date.now();if(this.curTime-b>60*m){b=this.curTime-m}while(this.curTime>b){r.trigger("EnterFrame",{frame:o++});b+=m;f++}if(f){r.DrawManager.draw()}},getFPS:function(){return e},simulateFrames:function(x){while(x-->0){r.trigger("EnterFrame",{frame:o++})}r.DrawManager.draw()}},e:function(){var y=k(),x;c[y]=null;c[y]=x=r(y);if(arguments.length>0){x.addComponent.apply(x,arguments)}x.addComponent("obj");r.trigger("NewEntity",{id:y});return x},c:function(y,x){n[y]=x},trigger:function(B,C){var A=p[B],z,y,x;for(z in A){if(!A.hasOwnProperty(z)){continue}for(y=0,x=A[z].length;y<x;y++){if(A[z]&&A[z][y]){if(c[z]){A[z][y].call(r(+z),C)}else{A[z][y].call(r,C)}}}}},bind:function(y,z){if(!p[y]){p[y]={}}var x=p[y];if(!x.global){x.global=[]}return x.global.push(z)-1},unbind:function(B,C){var A=p[B],z,y,x;for(z in A){if(!A.hasOwnProperty(z)){continue}if(typeof C==="number"){delete A[z][C];return true}for(y=0,x=A[z].length;y<x;y++){if(A[z][y]===C){delete A[z][y];return true}}}return false},frame:function(){return o},components:function(){return n},isComp:function(x){return x in n},debug:function(){return c},settings:(function(){var x={},y={};return{register:function(z,A){y[z]=A},modify:function(z,A){if(!y[z]){return}y[z].call(x[z],A);x[z]=A},get:function(z){return x[z]}}})(),clone:v});function k(){var x=w++;if(x in c){return k()}return x}function v(z){if(z===null||typeof(z)!="object"){return z}var x=z.constructor();for(var y in z){x[y]=v(z[y])}return x}r.bind("Load",function(){if(!r.support.setter&&r.support.defineProperty){a=[];r.bind("EnterFrame",function(){var y=0,x=a.length,z;for(;y<x;++y){z=a[y];if(z.obj[z.prop]!==z.obj["_"+z.prop]){z.fn.call(z.obj,z.obj[z.prop])}}})}});h.Crafty=r})(window);(function(Crafty,window,document){(function(parent){var cellsize,HashMap=function(cell){cellsize=cell||64;this.map={}},SPACE=" ";HashMap.prototype={insert:function(obj){var keys=HashMap.key(obj),entry=new Entry(keys,obj,this),i=0,j,hash;for(i=keys.x1;i<=keys.x2;i++){for(j=keys.y1;j<=keys.y2;j++){hash=i+SPACE+j;if(!this.map[hash]){this.map[hash]=[]}this.map[hash].push(obj)}}return entry},search:function(rect,filter){var keys=HashMap.key(rect),i,j,hash,results=[];if(filter===undefined){filter=true}for(i=keys.x1;i<=keys.x2;i++){for(j=keys.y1;j<=keys.y2;j++){hash=i+SPACE+j;if(this.map[hash]){results=results.concat(this.map[hash])}}}if(filter){var obj,id,finalresult=[],found={};for(i=0,l=results.length;i<l;i++){obj=results[i];if(!obj){continue}id=obj[0];if(!found[id]&&obj.x<rect._x+rect._w&&obj._x+obj._w>rect._x&&obj.y<rect._y+rect._h&&obj._h+obj._y>rect._y){found[id]=results[i]}}for(obj in found){finalresult.push(found[obj])}return finalresult}else{return results}},remove:function(keys,obj){var i=0,j,hash;if(arguments.length==1){obj=keys;keys=HashMap.key(obj)}for(i=keys.x1;i<=keys.x2;i++){for(j=keys.y1;j<=keys.y2;j++){hash=i+SPACE+j;if(this.map[hash]){var cell=this.map[hash],m,n=cell.length;for(m=0;m<n;m++){if(cell[m]&&cell[m][0]===obj[0]){cell.splice(m,1)}}}}}},boundaries:function(){var k,ent,hash={max:{x:-Infinity,y:-Infinity},min:{x:Infinity,y:Infinity}},coords={max:{x:-Infinity,y:-Infinity},min:{x:Infinity,y:Infinity}};for(var h in this.map){if(!this.map[h].length){continue}var map_coord=h.split(SPACE),i=map_coord[0],j=map_coord[0];if(i>=hash.max.x){hash.max.x=i;for(k in this.map[h]){ent=this.map[h][k];if(typeof ent=="object"&&"requires" in ent){coords.max.x=Math.max(coords.max.x,ent.x+ent.w)}}}if(i<=hash.min.x){hash.min.x=i;for(k in this.map[h]){ent=this.map[h][k];if(typeof ent=="object"&&"requires" in ent){coords.min.x=Math.min(coords.min.x,ent.x)}}}if(j>=hash.max.y){hash.max.y=j;for(k in this.map[h]){ent=this.map[h][k];if(typeof ent=="object"&&"requires" in ent){coords.max.y=Math.max(coords.max.y,ent.y+ent.h)}}}if(j<=hash.min.y){hash.min.y=j;for(k in this.map[h]){ent=this.map[h][k];if(typeof ent=="object"&&"requires" in ent){coords.min.y=Math.min(coords.min.y,ent.y)}}}}return coords}};HashMap.key=function(obj){if(obj.hasOwnProperty("mbr")){obj=obj.mbr()}var x1=Math.floor(obj._x/cellsize),y1=Math.floor(obj._y/cellsize),x2=Math.floor((obj._w+obj._x)/cellsize),y2=Math.floor((obj._h+obj._y)/cellsize);return{x1:x1,y1:y1,x2:x2,y2:y2}};HashMap.hash=function(keys){return keys.x1+SPACE+keys.y1+SPACE+keys.x2+SPACE+keys.y2};function Entry(keys,obj,map){this.keys=keys;this.map=map;this.obj=obj}Entry.prototype={update:function(rect){if(HashMap.hash(HashMap.key(rect))!=HashMap.hash(this.keys)){this.map.remove(this.keys,this.obj);var e=this.map.insert(this.obj);this.keys=e.keys}}};parent.HashMap=HashMap})(Crafty);Crafty.map=new Crafty.HashMap();var M=Math,Mc=M.cos,Ms=M.sin,PI=M.PI,DEG_TO_RAD=PI/180;Crafty.c("2D",{_x:0,_y:0,_w:0,_h:0,_z:0,_rotation:0,_alpha:1,_visible:true,_globalZ:null,_origin:null,_mbr:null,_entry:null,_children:null,_parent:null,_changed:false,_defineGetterSetter_setter:function(){this.__defineSetter__("x",function(v){this._attr("_x",v)});this.__defineSetter__("y",function(v){this._attr("_y",v)});this.__defineSetter__("w",function(v){this._attr("_w",v)});this.__defineSetter__("h",function(v){this._attr("_h",v)});this.__defineSetter__("z",function(v){this._attr("_z",v)});this.__defineSetter__("rotation",function(v){this._attr("_rotation",v)});this.__defineSetter__("alpha",function(v){this._attr("_alpha",v)});this.__defineSetter__("visible",function(v){this._attr("_visible",v)});this.__defineGetter__("x",function(){return this._x});this.__defineGetter__("y",function(){return this._y});this.__defineGetter__("w",function(){return this._w});this.__defineGetter__("h",function(){return this._h});this.__defineGetter__("z",function(){return this._z});this.__defineGetter__("rotation",function(){return this._rotation});this.__defineGetter__("alpha",function(){return this._alpha});this.__defineGetter__("visible",function(){return this._visible});this.__defineGetter__("parent",function(){return this._parent});this.__defineGetter__("numChildren",function(){return this._children.length})},_defineGetterSetter_defineProperty:function(){Object.defineProperty(this,"x",{set:function(v){this._attr("_x",v)},get:function(){return this._x},configurable:true});Object.defineProperty(this,"y",{set:function(v){this._attr("_y",v)},get:function(){return this._y},configurable:true});Object.defineProperty(this,"w",{set:function(v){this._attr("_w",v)},get:function(){return this._w},configurable:true});Object.defineProperty(this,"h",{set:function(v){this._attr("_h",v)},get:function(){return this._h},configurable:true});Object.defineProperty(this,"z",{set:function(v){this._attr("_z",v)},get:function(){return this._z},configurable:true});Object.defineProperty(this,"rotation",{set:function(v){this._attr("_rotation",v)},get:function(){return this._rotation},configurable:true});Object.defineProperty(this,"alpha",{set:function(v){this._attr("_alpha",v)},get:function(){return this._alpha},configurable:true});Object.defineProperty(this,"visible",{set:function(v){this._attr("_visible",v)},get:function(){return this._visible},configurable:true})},_defineGetterSetter_fallback:function(){this.x=this._x;this.y=this._y;this.w=this._w;this.h=this._h;this.z=this._z;this.rotation=this._rotation;this.alpha=this._alpha;this.visible=this._visible;this.bind("EnterFrame",function(){if(this.x!==this._x||this.y!==this._y||this.w!==this._w||this.h!==this._h||this.z!==this._z||this.rotation!==this._rotation||this.alpha!==this._alpha||this.visible!==this._visible){var old=this.mbr()||this.pos();if(this.rotation!==this._rotation){this._rotate(this.rotation)}else{var mbr=this._mbr,moved=false;if(mbr){if(this.x!==this._x){mbr._x-=this.x-this._x;moved=true}else{if(this.y!==this._y){mbr._y-=this.y-this._y;moved=true}else{if(this.w!==this._w){mbr._w-=this.w-this._w;moved=true}else{if(this.h!==this._h){mbr._h-=this.h-this._h;moved=true}else{if(this.z!==this._z){mbr._z-=this.z-this._z;moved=true}}}}}}if(moved){this.trigger("Move",old)}}this._x=this.x;this._y=this.y;this._w=this.w;this._h=this.h;this._z=this.z;this._rotation=this.rotation;this._alpha=this.alpha;this._visible=this.visible;this.trigger("Change",old);this.trigger("Move",old)}})},init:function(){this._globalZ=this[0];this._origin={x:0,y:0};this._children=[];if(Crafty.support.setter){this._defineGetterSetter_setter()}else{if(Crafty.support.defineProperty){this._defineGetterSetter_defineProperty()}else{this._defineGetterSetter_fallback()}}this._entry=Crafty.map.insert(this);this.bind("Move",function(e){var area=this._mbr||this;this._entry.update(area);this._cascade(e)});this.bind("Rotate",function(e){var old=this._mbr||this;this._entry.update(old);this._cascade(e)});this.bind("Remove",function(){if(this._children){for(var i=0;i<this._children.length;i++){if(this._children[i].destroy){this._children[i].destroy()}}this._children=[]}Crafty.map.remove(this);this.detach()})},_rotate:function(v){var theta=-1*(v%360),rad=theta*DEG_TO_RAD,ct=Math.cos(rad),st=Math.sin(rad),o={x:this._origin.x+this._x,y:this._origin.y+this._y};if(!theta){this._mbr=null;if(!this._rotation%360){return}}var x0=o.x+(this._x-o.x)*ct+(this._y-o.y)*st,y0=o.y-(this._x-o.x)*st+(this._y-o.y)*ct,x1=o.x+(this._x+this._w-o.x)*ct+(this._y-o.y)*st,y1=o.y-(this._x+this._w-o.x)*st+(this._y-o.y)*ct,x2=o.x+(this._x+this._w-o.x)*ct+(this._y+this._h-o.y)*st,y2=o.y-(this._x+this._w-o.x)*st+(this._y+this._h-o.y)*ct,x3=o.x+(this._x-o.x)*ct+(this._y+this._h-o.y)*st,y3=o.y-(this._x-o.x)*st+(this._y+this._h-o.y)*ct,minx=Math.floor(Math.min(x0,x1,x2,x3)),miny=Math.floor(Math.min(y0,y1,y2,y3)),maxx=Math.ceil(Math.max(x0,x1,x2,x3)),maxy=Math.ceil(Math.max(y0,y1,y2,y3));this._mbr={_x:minx,_y:miny,_w:maxx-minx,_h:maxy-miny};var difference=this._rotation-v,drad=difference*DEG_TO_RAD;this.trigger("Rotate",{cos:Math.cos(drad),sin:Math.sin(drad),deg:difference,rad:drad,o:{x:o.x,y:o.y},matrix:{M11:ct,M12:st,M21:-st,M22:ct}})},area:function(){return this._w*this._h},intersect:function(x,y,w,h){var rect,obj=this._mbr||this;if(typeof x==="object"){rect=x}else{rect={x:x,y:y,w:w,h:h}}return obj._x<rect.x+rect.w&&obj._x+obj._w>rect.x&&obj._y<rect.y+rect.h&&obj._h+obj._y>rect.y},within:function(x,y,w,h){var rect;if(typeof x==="object"){rect=x}else{rect={x:x,y:y,w:w,h:h}}return rect.x<=this.x&&rect.x+rect.w>=this.x+this.w&&rect.y<=this.y&&rect.y+rect.h>=this.y+this.h},contains:function(x,y,w,h){var rect;if(typeof x==="object"){rect=x}else{rect={x:x,y:y,w:w,h:h}}return rect.x>=this.x&&rect.x+rect.w<=this.x+this.w&&rect.y>=this.y&&rect.y+rect.h<=this.y+this.h},pos:function(){return{_x:(this._x),_y:(this._y),_w:(this._w),_h:(this._h)}},mbr:function(){if(!this._mbr){return this.pos()}return{_x:(this._mbr._x),_y:(this._mbr._y),_w:(this._mbr._w),_h:(this._mbr._h)}},isAt:function(x,y){if(this.map){return this.map.containsPoint(x,y)}return this.x<=x&&this.x+this.w>=x&&this.y<=y&&this.y+this.h>=y},move:function(dir,by){if(dir.charAt(0)==="n"){this.y-=by}if(dir.charAt(0)==="s"){this.y+=by}if(dir==="e"||dir.charAt(1)==="e"){this.x+=by}if(dir==="w"||dir.charAt(1)==="w"){this.x-=by}return this},shift:function(x,y,w,h){if(x){this.x+=x}if(y){this.y+=y}if(w){this.w+=w}if(h){this.h+=h}return this},_cascade:function(e){if(!e){return}var i=0,children=this._children,l=children.length,obj;if(e.cos){for(;i<l;++i){obj=children[i];if("rotate" in obj){obj.rotate(e)}}}else{var rect=this._mbr||this,dx=rect._x-e._x,dy=rect._y-e._y,dw=rect._w-e._w,dh=rect._h-e._h;for(;i<l;++i){obj=children[i];obj.shift(dx,dy,dw,dh)}}},attach:function(){var i=0,arg=arguments,l=arguments.length,obj;for(;i<l;++i){obj=arg[i];if(obj._parent){obj._parent.detach(obj)}obj._parent=this;this._children.push(obj)}return this},detach:function(obj){if(!obj){for(var i=0;i<this._children.length;i++){this._children[i]._parent=null}this._children=[];return this}for(var i=0;i<this._children.length;i++){if(this._children[i]==obj){this._children.splice(i,1)}}obj._parent=null;return this},origin:function(x,y){if(typeof x==="string"){if(x==="centre"||x==="center"||x.indexOf(" ")===-1){x=this._w/2;y=this._h/2}else{var cmd=x.split(" ");if(cmd[0]==="top"){y=0}else{if(cmd[0]==="bottom"){y=this._h}else{if(cmd[0]==="middle"||cmd[1]==="center"||cmd[1]==="centre"){y=this._h/2}}}if(cmd[1]==="center"||cmd[1]==="centre"||cmd[1]==="middle"){x=this._w/2}else{if(cmd[1]==="left"){x=0}else{if(cmd[1]==="right"){x=this._w}}}}}this._origin.x=x;this._origin.y=y;return this},flip:function(dir){dir=dir||"X";this["_flip"+dir]=true;this.trigger("Change")},rotate:function(e){this._origin.x=e.o.x-this._x;this._origin.y=e.o.y-this._y;this._attr("_rotation",e.theta)},_attr:function(name,value){var pos=this.pos(),old=this.mbr()||pos;if(name==="_rotation"){this._rotate(value);this.trigger("Rotate")}else{if(name==="_z"){this._globalZ=parseInt(value+Crafty.zeroFill(this[0],5),10);this.trigger("reorder")}else{if(name=="_x"||name==="_y"||name==="_w"||name==="_h"){var mbr=this._mbr;if(mbr){mbr[name]-=this[name]-value}this[name]=value;this.trigger("Move",old)}}}this[name]=value;this.trigger("Change",old)}});Crafty.c("Physics",{_gravity:0.4,_friction:0.2,_bounce:0.5,gravity:function(gravity){this._gravity=gravity}});Crafty.c("Gravity",{_gravityConst:0.2,_gy:0,_falling:true,_anti:null,init:function(){this.requires("2D")},gravity:function(comp){if(comp){this._anti=comp}this.bind("EnterFrame",this._enterframe);return this},gravityConst:function(g){this._gravityConst=g;return this},_enterframe:function(){if(this._falling){this._gy+=this._gravityConst;this.y+=this._gy}else{this._gy=0}var obj,hit=false,pos=this.pos(),q,i=0,l;pos._y++;pos.x=pos._x;pos.y=pos._y;pos.w=pos._w;pos.h=pos._h;q=Crafty.map.search(pos);l=q.length;for(;i<l;++i){obj=q[i];if(obj!==this&&obj.has(this._anti)&&obj.intersect(pos)){hit=obj;break}}if(hit){if(this._falling){this.stopFalling(hit)}}else{this._falling=true}},stopFalling:function(e){if(e){this.y=e._y-this._h}this._falling=false;if(this._up){this._up=false}this.trigger("hit")},antigravity:function(){this.unbind("EnterFrame",this._enterframe)}});Crafty.polygon=function(poly){if(arguments.length>1){poly=Array.prototype.slice.call(arguments,0)}this.points=poly};Crafty.polygon.prototype={containsPoint:function(x,y){var p=this.points,i,j,c=false;for(i=0,j=p.length-1;i<p.length;j=i++){if(((p[i][1]>y)!=(p[j][1]>y))&&(x<(p[j][0]-p[i][0])*(y-p[i][1])/(p[j][1]-p[i][1])+p[i][0])){c=!c}}return c},shift:function(x,y){var i=0,l=this.points.length,current;for(;i<l;i++){current=this.points[i];current[0]+=x;current[1]+=y}},rotate:function(e){var i=0,l=this.points.length,current,x,y;for(;i<l;i++){current=this.points[i];x=e.o.x+(current[0]-e.o.x)*e.cos+(current[1]-e.o.y)*e.sin;y=e.o.y-(current[0]-e.o.x)*e.sin+(current[1]-e.o.y)*e.cos;current[0]=x;current[1]=y}}};Crafty.circle=function(x,y,radius){this.x=x;this.y=y;this.radius=radius;this.points=[];var theta;for(var i=0;i<8;i++){theta=i*Math.PI/4;this.points[i]=[Math.sin(theta)*radius,Math.cos(theta)*radius]}};Crafty.circle.prototype={containsPoint:function(x,y){var radius=this.radius,sqrt=Math.sqrt,deltaX=this.x-x,deltaY=this.y-y;return(deltaX*deltaX+deltaY*deltaY)<(radius*radius)},shift:function(x,y){this.x+=x;this.y+=y;var i=0,l=this.points.length,current;for(;i<l;i++){current=this.points[i];current[0]+=x;current[1]+=y}},rotate:function(){}};Crafty.matrix=function(m){this.mtx=m;this.width=m[0].length;this.height=m.length};Crafty.matrix.prototype={x:function(other){if(this.width!=other.height){return}var result=[];for(var i=0;i<this.height;i++){result[i]=[];for(var j=0;j<other.width;j++){var sum=0;for(var k=0;k<this.width;k++){sum+=this.mtx[i][k]*other.mtx[k][j]}result[i][j]=sum}}return new Crafty.matrix(result)},e:function(row,col){if(row<1||row>this.mtx.length||col<1||col>this.mtx[0].length){return null}return this.mtx[row-1][col-1]}};Crafty.c("Collision",{init:function(){this.requires("2D")},collision:function(poly){var area=this._mbr||this;if(!poly){poly=new Crafty.polygon([0,0],[area._w,0],[area._w,area._h],[0,area._h])}this.map=poly;this.attach(this.map);this.map.shift(area._x,area._y);return this},hit:function(comp){var area=this._mbr||this,results=Crafty.map.search(area,false),i=0,l=results.length,dupes={},id,obj,oarea,key,hasMap=("map" in this&&"containsPoint" in this.map),finalresult=[];if(!l){return false}for(;i<l;++i){obj=results[i];oarea=obj._mbr||obj;if(!obj){continue}id=obj[0];if(!dupes[id]&&this[0]!==id&&obj.__c[comp]&&oarea._x<area._x+area._w&&oarea._x+oarea._w>area._x&&oarea._y<area._y+area._h&&oarea._h+oarea._y>area._y){dupes[id]=obj}}for(key in dupes){obj=dupes[key];if(hasMap&&"map" in obj){var SAT=this._SAT(this.map,obj.map);SAT.obj=obj;SAT.type="SAT";if(SAT){finalresult.push(SAT)}}else{finalresult.push({obj:obj,type:"MBR"})}}if(!finalresult.length){return false}return finalresult},onHit:function(comp,callback,callbackOff){var justHit=false;this.bind("EnterFrame",function(){var hitdata=this.hit(comp);if(hitdata){justHit=true;callback.call(this,hitdata)}else{if(justHit){if(typeof callbackOff=="function"){callbackOff.call(this)}justHit=false}}});return this},_SAT:function(poly1,poly2){var points1=poly1.points,points2=poly2.points,i=0,l=points1.length,j,k=points2.length,normal={x:0,y:0},length,min1,min2,max1,max2,interval,MTV=null,MTV2=null,MN=null,dot,nextPoint,currentPoint;for(;i<l;i++){nextPoint=points1[(i==l-1?0:i+1)];currentPoint=points1[i];normal.x=-(nextPoint[1]-currentPoint[1]);normal.y=(nextPoint[0]-currentPoint[0]);length=Math.sqrt(normal.x*normal.x+normal.y*normal.y);normal.x/=length;normal.y/=length;min1=min2=-1;max1=max2=-1;for(j=0;j<l;++j){dot=points1[j][0]*normal.x+points1[j][1]*normal.y;if(dot>max1||max1===-1){max1=dot}if(dot<min1||min1===-1){min1=dot}}for(j=0;j<k;++j){dot=points2[j][0]*normal.x+points2[j][1]*normal.y;if(dot>max2||max2===-1){max2=dot}if(dot<min2||min2===-1){min2=dot}}if(min1<min2){interval=min2-max1;normal.x=-normal.x;normal.y=-normal.y}else{interval=min1-max2}if(interval>=0){return false}if(MTV===null||interval>MTV){MTV=interval;MN={x:normal.x,y:normal.y}}}for(i=0;i<k;i++){nextPoint=points2[(i==k-1?0:i+1)];currentPoint=points2[i];normal.x=-(nextPoint[1]-currentPoint[1]);normal.y=(nextPoint[0]-currentPoint[0]);length=Math.sqrt(normal.x*normal.x+normal.y*normal.y);normal.x/=length;normal.y/=length;min1=min2=-1;max1=max2=-1;for(j=0;j<l;++j){dot=points1[j][0]*normal.x+points1[j][1]*normal.y;if(dot>max1||max1===-1){max1=dot}if(dot<min1||min1===-1){min1=dot}}for(j=0;j<k;++j){dot=points2[j][0]*normal.x+points2[j][1]*normal.y;if(dot>max2||max2===-1){max2=dot}if(dot<min2||min2===-1){min2=dot}}if(min1<min2){interval=min2-max1;normal.x=-normal.x;normal.y=-normal.y}else{interval=min1-max2}if(interval>=0){return false}if(MTV===null||interval>MTV){MTV=interval}if(interval>MTV2||MTV2===null){MTV2=interval;MN={x:normal.x,y:normal.y}}}return{overlap:MTV2,normal:MN}}});Crafty.c("DOM",{_element:null,init:function(){this._element=document.createElement("div");Crafty.stage.inner.appendChild(this._element);this._element.style.position="absolute";this._element.id="ent"+this[0];this.bind("Change",function(){if(!this._changed){this._changed=true;Crafty.DrawManager.add(this)}});function updateClass(){var i=0,c=this.__c,str="";for(i in c){str+=" "+i}str=str.substr(1);this._element.className=str}this.bind("NewComponent",updateClass).bind("RemoveComponent",updateClass);if(Crafty.support.prefix==="ms"&&Crafty.support.version<9){this._filters={};this.bind("Rotate",function(e){var m=e.matrix,elem=this._element.style,M11=m.M11.toFixed(8),M12=m.M12.toFixed(8),M21=m.M21.toFixed(8),M22=m.M22.toFixed(8);this._filters.rotation="progid:DXImageTransform.Microsoft.Matrix(M11="+M11+", M12="+M12+", M21="+M21+", M22="+M22+",sizingMethod='auto expand')"})}this.bind("Remove",this.undraw);this.bind("RemoveComponent",function(compName){if(compName==="DOM"){this.undraw()}})},getDomId:function(){return this._element.id},DOM:function(elem){if(elem&&elem.nodeType){this.undraw();this._element=elem;this._element.style.position="absolute"}return this},draw:function(){var style=this._element.style,coord=this.__coord||[0,0,0,0],co={x:coord[0],y:coord[1]},prefix=Crafty.support.prefix,trans=[];if(!this._visible){style.visibility="hidden"}else{style.visibility="visible"}if(Crafty.support.css3dtransform){trans.push("translate3d("+(~~this._x)+"px,"+(~~this._y)+"px,0)")}else{style.left=~~(this._x)+"px";style.top=~~(this._y)+"px"}style.width=~~(this._w)+"px";style.height=~~(this._h)+"px";style.zIndex=this._z;style.opacity=this._alpha;style[prefix+"Opacity"]=this._alpha;if(prefix==="ms"&&Crafty.support.version<9){if(Crafty.support.version===8){this._filters.alpha="progid:DXImageTransform.Microsoft.Alpha(Opacity="+(this._alpha*100)+")"}else{this._filters.alpha="alpha(opacity="+(this._alpha*100)+")"}}if(this._mbr){var origin=this._origin.x+"px "+this._origin.y+"px";style.transformOrigin=origin;style[prefix+"TransformOrigin"]=origin;if(Crafty.support.css3dtransform){trans.push("rotateZ("+this._rotation+"deg)")}else{trans.push("rotate("+this._rotation+"deg)")}}if(this._flipX){trans.push("scaleX(-1)");if(prefix==="ms"&&Crafty.support.version<9){this._filters.flipX="fliph"}}if(this._flipY){trans.push("scaleY(-1)");if(prefix==="ms"&&Crafty.support.version<9){this._filters.flipY="flipv"}}if(prefix==="ms"&&Crafty.support.version<9){this.applyFilters()}style.transform=trans.join(" ");style[prefix+"Transform"]=trans.join(" ");this.trigger("Draw",{style:style,type:"DOM",co:co});return this},applyFilters:function(){this._element.style.filter="";var str="";for(var filter in this._filters){if(!this._filters.hasOwnProperty(filter)){continue}str+=this._filters[filter]+" "}this._element.style.filter=str},undraw:function(){if(this._element){Crafty.stage.inner.removeChild(this._element)}return this},css:function(obj,value){var key,elem=this._element,val,style=elem.style;if(typeof obj==="object"){for(key in obj){if(!obj.hasOwnProperty(key)){continue}val=obj[key];if(typeof val==="number"){val+="px"}style[Crafty.DOM.camelize(key)]=val}}else{if(value){if(typeof value==="number"){value+="px"}style[Crafty.DOM.camelize(obj)]=value}else{return Crafty.DOM.getStyle(elem,obj)}}this.trigger("Change");return this}});try{document.execCommand("BackgroundImageCache",false,true)}catch(e){}Crafty.extend({DOM:{window:{init:function(){this.width=window.innerWidth||(window.document.documentElement.clientWidth||window.document.body.clientWidth);this.height=window.innerHeight||(window.document.documentElement.clientHeight||window.document.body.clientHeight)},width:0,height:0},inner:function(obj){var rect=obj.getBoundingClientRect(),x=rect.left+(window.pageXOffset?window.pageXOffset:document.body.scrollTop),y=rect.top+(window.pageYOffset?window.pageYOffset:document.body.scrollLeft),borderX=parseInt(this.getStyle(obj,"border-left-width")||0,10)||parseInt(this.getStyle(obj,"borderLeftWidth")||0,10)||0,borderY=parseInt(this.getStyle(obj,"border-top-width")||0,10)||parseInt(this.getStyle(obj,"borderTopWidth")||0,10)||0;x+=borderX;y+=borderY;return{x:x,y:y}},getStyle:function(obj,prop){var result;if(obj.currentStyle){result=obj.currentStyle[this.camelize(prop)]}else{if(window.getComputedStyle){result=document.defaultView.getComputedStyle(obj,null).getPropertyValue(this.csselize(prop))}}return result},camelize:function(str){return str.replace(/-+(.)?/g,function(match,chr){return chr?chr.toUpperCase():""})},csselize:function(str){return str.replace(/[A-Z]/g,function(chr){return chr?"-"+chr.toLowerCase():""})},translate:function(x,y){return{x:x-Crafty.stage.x+document.body.scrollLeft+document.documentElement.scrollLeft-Crafty.viewport._x,y:y-Crafty.stage.y+document.body.scrollTop+document.documentElement.scrollTop-Crafty.viewport._y}}}});(function testSupport(){var support=Crafty.support={},ua=navigator.userAgent.toLowerCase(),match=/(webkit)[ \/]([\w.]+)/.exec(ua)||/(o)pera(?:.*version)?[ \/]([\w.]+)/.exec(ua)||/(ms)ie ([\w.]+)/.exec(ua)||/(moz)illa(?:.*? rv:([\w.]+))?/.exec(ua)||[],mobile=/iPad|iPod|iPhone|Android|webOS/i.exec(ua);if(mobile){Crafty.mobile=mobile[0]}support.setter=("__defineSetter__" in this&&"__defineGetter__" in this);support.defineProperty=(function(){if(!"defineProperty" in Object){return false}try{Object.defineProperty({},"x",{})}catch(e){return false}return true})();support.audio=("Audio" in window);support.prefix=(match[1]||match[0]);if(support.prefix==="moz"){support.prefix="Moz"}if(support.prefix==="o"){support.prefix="O"}if(match[2]){support.versionName=match[2];support.version=+(match[2].split("."))[0]}support.canvas=("getContext" in document.createElement("canvas"));if(support.canvas){var gl;try{gl=document.createElement("canvas").getContext("experimental-webgl");gl.viewportWidth=canvas.width;gl.viewportHeight=canvas.height}catch(e){}support.webgl=!!gl}else{support.webgl=false}support.css3dtransform=(typeof document.createElement("div").style.Perspective!=="undefined")||(typeof document.createElement("div").style[support.prefix+"Perspective"]!=="undefined")})();Crafty.extend({zeroFill:function(number,width){width-=number.toString().length;if(width>0){return new Array(width+(/\./.test(number)?2:1)).join("0")+number}return number.toString()},sprite:function(tile,tileh,url,map,paddingX,paddingY){var spriteName,temp,x,y,w,h,img;if(typeof tile==="string"){paddingY=paddingX;paddingX=map;map=tileh;url=tile;tile=1;tileh=1}if(typeof tileh=="string"){paddingY=paddingX;paddingX=map;map=url;url=tileh;tileh=tile}if(!paddingY&&paddingX){paddingY=paddingX}paddingX=parseInt(paddingX||0,10);paddingY=parseInt(paddingY||0,10);img=Crafty.assets[url];if(!img){img=new Image();img.src=url;Crafty.assets[url]=img;img.onload=function(){for(spriteName in map){Crafty(spriteName).each(function(){this.ready=true;this.trigger("Change")})}}}for(spriteName in map){if(!map.hasOwnProperty(spriteName)){continue}temp=map[spriteName];x=temp[0]*(tile+paddingX);y=temp[1]*(tileh+paddingY);w=temp[2]*tile||tile;h=temp[3]*tileh||tileh;Crafty.c(spriteName,{ready:false,__coord:[x,y,w,h],init:function(){this.requires("Sprite");this.__trim=[0,0,0,0];this.__image=url;this.__coord=[this.__coord[0],this.__coord[1],this.__coord[2],this.__coord[3]];this.__tile=tile;this.__tileh=tileh;this.__padding=[paddingX,paddingY];this.img=img;if(this.img.complete&&this.img.width>0){this.ready=true;this.trigger("Change")}this.w=this.__coord[2];this.h=this.__coord[3]}})}return this},_events:{},addEvent:function(ctx,obj,type,callback){if(arguments.length===3){callback=type;type=obj;obj=window.document}var afn=function(e){var e=e||window.event;callback.call(ctx,e)},id=ctx[0]||"";if(!this._events[id+obj+type+callback]){this._events[id+obj+type+callback]=afn}else{return}if(obj.attachEvent){obj.attachEvent("on"+type,afn)}else{obj.addEventListener(type,afn,false)}},removeEvent:function(ctx,obj,type,callback){if(arguments.length===3){callback=type;type=obj;obj=window.document}var id=ctx[0]||"",afn=this._events[id+obj+type+callback];if(afn){if(obj.detachEvent){obj.detachEvent("on"+type,afn)}else{obj.removeEventListener(type,afn,false)}delete this._events[id+obj+type+callback]}},background:function(color){Crafty.stage.elem.style.background=color},viewport:{clampToEntities:true,width:0,height:0,_x:0,_y:0,scroll:function(axis,v){var change=Math.floor(v-this[axis]),context=Crafty.canvas.context,style=Crafty.stage.inner.style,canvas;this[axis]=v;if(axis=="_x"){if(context){context.translate(change,0)}}else{if(context){context.translate(0,change)}}if(context){Crafty.DrawManager.drawAll()}style[axis=="_x"?"left":"top"]=Math.round(~~v)+"px"},rect:function(){return{_x:-this._x,_y:-this._y,_w:this.width,_h:this.height}},pan:(function(){var tweens={},i,bound=false;function enterFrame(e){var l=0;for(i in tweens){var prop=tweens[i];if(prop.remTime>0){prop.current+=prop.diff;prop.remTime--;Crafty.viewport[i]=Math.floor(prop.current);l++}else{delete tweens[i]}}if(l){Crafty.viewport._clamp()}}return function(axis,v,time){Crafty.viewport.follow();if(axis=="reset"){for(i in tweens){tweens[i].remTime=0}return}if(time==0){time=1}tweens[axis]={diff:-v/time,current:Crafty.viewport[axis],remTime:time};if(!bound){Crafty.bind("EnterFrame",enterFrame);bound=true}}})(),follow:(function(){var oldTarget,offx,offy;function change(){Crafty.viewport.scroll("_x",-(this.x+(this.w/2)-(Crafty.viewport.width/2)-offx));Crafty.viewport.scroll("_y",-(this.y+(this.h/2)-(Crafty.viewport.height/2)-offy));Crafty.viewport._clamp()}return function(target,offsetx,offsety){if(oldTarget){oldTarget.unbind("Change",change)}if(!target||!target.has("2D")){return}Crafty.viewport.pan("reset");oldTarget=target;offx=(typeof offsetx!="undefined")?offsetx:0;offy=(typeof offsety!="undefined")?offsety:0;target.bind("Change",change);change.call(target)}})(),centerOn:function(targ,time){var x=targ.x,y=targ.y,mid_x=targ.w/2,mid_y=targ.h/2,cent_x=Crafty.viewport.width/2,cent_y=Crafty.viewport.height/2,new_x=x+mid_x-cent_x,new_y=y+mid_y-cent_y;Crafty.viewport.pan("reset");Crafty.viewport.pan("x",new_x,time);Crafty.viewport.pan("y",new_y,time)},zoom:(function(){var zoom=1,zoom_tick=0,dur=0,prop=Crafty.support.prefix+"Transform",bound=false,act={},prct={};function enterFrame(){if(dur>0){var old={width:act.width*zoom,height:act.height*zoom};zoom+=zoom_tick;var new_s={width:act.width*zoom,height:act.height*zoom},diff={width:new_s.width-old.width,height:new_s.height-old.height};Crafty.stage.inner.style[prop]="scale("+zoom+","+zoom+")";Crafty.viewport.x-=diff.width*prct.width;Crafty.viewport.y-=diff.height*prct.height;dur--}}return function(amt,cent_x,cent_y,time){var bounds=Crafty.map.boundaries(),final_zoom=amt?zoom*amt:1;act.width=bounds.max.x-bounds.min.x;act.height=bounds.max.y-bounds.min.y;prct.width=cent_x/act.width;prct.height=cent_y/act.height;if(time==0){time=1}zoom_tick=(final_zoom-zoom)/time;dur=time;Crafty.viewport.pan("reset");if(!bound){Crafty.bind("EnterFrame",enterFrame);bound=true}}})(),mouselook:(function(){var active=false,dragging=false,lastMouse={};old={};return function(op,arg){if(typeof op=="boolean"){active=op;if(active){Crafty.mouseObjs++}else{Crafty.mouseObjs=Math.max(0,Crafty.mouseObjs-1)}return}if(!active){return}switch(op){case"move":case"drag":if(!dragging){return}diff={x:arg.clientX-lastMouse.x,y:arg.clientY-lastMouse.y};Crafty.viewport.x+=diff.x;Crafty.viewport.y+=diff.y;Crafty.viewport._clamp();case"start":lastMouse.x=arg.clientX;lastMouse.y=arg.clientY;dragging=true;break;case"stop":dragging=false;break}}})(),_clamp:function(){if(!this.clampToEntities){return}var bound=Crafty.map.boundaries();if(bound.max.x-bound.min.x>Crafty.viewport.width){bound.max.x-=Crafty.viewport.width;if(Crafty.viewport.x<-bound.max.x){Crafty.viewport.x=-bound.max.x}else{if(Crafty.viewport.x>-bound.min.x){Crafty.viewport.x=-bound.min.x}}}else{Crafty.viewport.x=-1*(bound.min.x+(bound.max.x-bound.min.x)/2-Crafty.viewport.width/2)}if(bound.max.y-bound.min.y>Crafty.viewport.height){bound.max.y-=Crafty.viewport.height;if(Crafty.viewport.y<-bound.max.y){Crafty.viewport.y=-bound.max.y}else{if(Crafty.viewport.y>-bound.min.y){Crafty.viewport.y=-bound.min.y}}}else{Crafty.viewport.y=-1*(bound.min.y+(bound.max.y-bound.min.y)/2-Crafty.viewport.height/2)}},init:function(w,h){Crafty.DOM.window.init();this.width=(!w||Crafty.mobile)?Crafty.DOM.window.width:w;this.height=(!h||Crafty.mobile)?Crafty.DOM.window.height:h;var crstage=document.getElementById("cr-stage");Crafty.stage={x:0,y:0,fullscreen:false,elem:(crstage?crstage:document.createElement("div")),inner:document.createElement("div")};if((!w&&!h)||Crafty.mobile){document.body.style.overflow="hidden";Crafty.stage.fullscreen=true}Crafty.addEvent(this,window,"resize",function(){Crafty.DOM.window.init();var w=Crafty.DOM.window.width,h=Crafty.DOM.window.height,offset;if(Crafty.stage.fullscreen){this.width=w;this.height=h;Crafty.stage.elem.style.width=w+"px";Crafty.stage.elem.style.height=h+"px";if(Crafty.canvas._canvas){Crafty.canvas._canvas.width=w;Crafty.canvas._canvas.height=h;Crafty.DrawManager.drawAll()}}offset=Crafty.DOM.inner(Crafty.stage.elem);Crafty.stage.x=offset.x;Crafty.stage.y=offset.y});Crafty.addEvent(this,window,"blur",function(){if(Crafty.settings.get("autoPause")){Crafty.pause()}});Crafty.addEvent(this,window,"focus",function(){if(Crafty._paused&&Crafty.settings.get("autoPause")){Crafty.pause()}});Crafty.settings.register("stageSelectable",function(v){Crafty.stage.elem.onselectstart=v?function(){return true}:function(){return false}});Crafty.settings.modify("stageSelectable",false);Crafty.settings.register("stageContextMenu",function(v){Crafty.stage.elem.oncontextmenu=v?function(){return true}:function(){return false}});Crafty.settings.modify("stageContextMenu",false);Crafty.settings.register("autoPause",function(){});Crafty.settings.modify("autoPause",false);if(!crstage){document.body.appendChild(Crafty.stage.elem);Crafty.stage.elem.id="cr-stage"}var elem=Crafty.stage.elem.style,offset;Crafty.stage.elem.appendChild(Crafty.stage.inner);Crafty.stage.inner.style.position="absolute";Crafty.stage.inner.style.zIndex="1";elem.width=this.width+"px";elem.height=this.height+"px";elem.overflow="hidden";if(Crafty.mobile){elem.position="absolute";elem.left="0px";elem.top="0px";var meta=document.createElement("meta"),head=document.getElementsByTagName("HEAD")[0];meta.setAttribute("name","viewport");meta.setAttribute("content","width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no");head.appendChild(meta);meta=document.createElement("meta");meta.setAttribute("name","apple-mobile-web-app-capable");meta.setAttribute("content","yes");head.appendChild(meta);setTimeout(function(){window.scrollTo(0,1)},0);Crafty.addEvent(this,window,"touchmove",function(e){e.preventDefault()});Crafty.stage.x=0;Crafty.stage.y=0}else{elem.position="relative";offset=Crafty.DOM.inner(Crafty.stage.elem);Crafty.stage.x=offset.x;Crafty.stage.y=offset.y}if(Crafty.support.setter){this.__defineSetter__("x",function(v){this.scroll("_x",v)});this.__defineSetter__("y",function(v){this.scroll("_y",v)});this.__defineGetter__("x",function(){return this._x});this.__defineGetter__("y",function(){return this._y})}else{if(Crafty.support.defineProperty){Object.defineProperty(this,"x",{set:function(v){this.scroll("_x",v)},get:function(){return this._x}});Object.defineProperty(this,"y",{set:function(v){this.scroll("_y",v)},get:function(){return this._y}})}else{this.x=this._x;this.y=this._y;Crafty.e("viewport")}}}},keys:{BACKSPACE:8,TAB:9,ENTER:13,PAUSE:19,CAPS:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,INSERT:45,DELETE:46,"0":48,"1":49,"2":50,"3":51,"4":52,"5":53,"6":54,"7":55,"8":56,"9":57,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,MULTIPLY:106,ADD:107,SUBSTRACT:109,DECIMAL:110,DIVIDE:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,SHIFT:16,CTRL:17,ALT:18,PLUS:187,COMMA:188,MINUS:189,PERIOD:190},mouseButtons:{LEFT:0,MIDDLE:1,RIGHT:2}});Crafty.c("viewport",{init:function(){this.bind("EnterFrame",function(){if(Crafty.viewport._x!==Crafty.viewport.x){Crafty.viewport.scroll("_x",Crafty.viewport.x)}if(Crafty.viewport._y!==Crafty.viewport.y){Crafty.viewport.scroll("_y",Crafty.viewport.y)}})}});Crafty.c("Canvas",{init:function(){if(!Crafty.canvas.context){Crafty.canvas.init()}Crafty.DrawManager.total2D++;this.bind("Change",function(e){if(this._changed===false){this._changed=Crafty.DrawManager.add(e||this,this)}else{if(e){this._changed=Crafty.DrawManager.add(e,this)}}});this.bind("Remove",function(){Crafty.DrawManager.total2D--;Crafty.DrawManager.add(this,this)})},draw:function(ctx,x,y,w,h){if(!this.ready){return}if(arguments.length===4){h=w;w=y;y=x;x=ctx;ctx=Crafty.canvas.context}var pos={_x:(this._x+(x||0)),_y:(this._y+(y||0)),_w:(w||this._w),_h:(h||this._h)},context=ctx||Crafty.canvas.context,coord=this.__coord||[0,0,0,0],co={x:coord[0]+(x||0),y:coord[1]+(y||0),w:w||coord[2],h:h||coord[3]};if(this._mbr){context.save();context.translate(this._origin.x+this._x,this._origin.y+this._y);pos._x=-this._origin.x;pos._y=-this._origin.y;context.rotate((this._rotation%360)*(Math.PI/180))}if(this._alpha<1){var globalpha=context.globalAlpha;context.globalAlpha=this._alpha}this.trigger("Draw",{type:"canvas",pos:pos,co:co,ctx:context});if(this._mbr){context.restore()}if(globalpha){context.globalAlpha=globalpha}return this}});Crafty.extend({canvas:{context:null,init:function(){if(!Crafty.support.canvas){Crafty.trigger("NoCanvas");Crafty.stop();return}var c;c=document.createElement("canvas");c.width=Crafty.viewport.width;c.height=Crafty.viewport.height;c.style.position="absolute";c.style.left="0px";c.style.top="0px";Crafty.stage.elem.appendChild(c);Crafty.canvas.context=c.getContext("2d");Crafty.canvas._canvas=c}}});Crafty.extend({over:null,mouseObjs:0,mousePos:{},lastEvent:null,keydown:{},mouseDispatch:function(e){if(!Crafty.mouseObjs){return}Crafty.lastEvent=e;var maxz=-1,closest,q,i=0,l,pos=Crafty.DOM.translate(e.clientX,e.clientY),x,y,dupes={},tar=e.target?e.target:e.srcElement,type=e.type;if(type==="touchstart"){type="mousedown"}else{if(type==="touchmove"){type="mousemove"}else{if(type==="touchend"){type="mouseup"}}}if(e.which==null){e.mouseButton=(e.button<2)?Crafty.mouseButtons.LEFT:((e.button==4)?Crafty.mouseButtons.MIDDLE:Crafty.mouseButtons.RIGHT)}else{e.mouseButton=(e.which<2)?Crafty.mouseButtons.LEFT:((e.which==2)?Crafty.mouseButtons.MIDDLE:Crafty.mouseButtons.RIGHT)}e.realX=x=Crafty.mousePos.x=pos.x;e.realY=y=Crafty.mousePos.y=pos.y;if(tar.nodeName!="CANVAS"){while(typeof(tar.id)!="string"&&tar.id.indexOf("ent")==-1){tar=tar.parentNode}ent=Crafty(parseInt(tar.id.replace("ent","")));if(ent.has("Mouse")&&ent.isAt(x,y)){closest=ent}}if(!closest){q=Crafty.map.search({_x:x,_y:y,_w:1,_h:1},false);for(l=q.length;i<l;++i){if(!q[i].__c.Mouse||!q[i]._visible){continue}var current=q[i],flag=false;if(dupes[current[0]]){continue}else{dupes[current[0]]=true}if(current.map){if(current.map.containsPoint(x,y)){flag=true}}else{if(current.isAt(x,y)){flag=true}}if(flag&&(current._z>=maxz||maxz===-1)){if(current._z===maxz&&current[0]<closest[0]){continue}maxz=current._z;closest=current}}}if(closest){if(type==="mousedown"){closest.trigger("MouseDown",e)}else{if(type==="mouseup"){closest.trigger("MouseUp",e)}else{if(type=="dblclick"){closest.trigger("DoubleClick",e)}else{if(type=="click"){closest.trigger("Click",e)}else{if(type==="mousemove"){closest.trigger("MouseMove",e);if(this.over!==closest){if(this.over){this.over.trigger("MouseOut",e);this.over=null}this.over=closest;closest.trigger("MouseOver",e)}}else{closest.trigger(type,e)}}}}}}else{if(type==="mousemove"&&this.over){this.over.trigger("MouseOut",e);this.over=null}if(type==="mousedown"){Crafty.viewport.mouselook("start",e)}else{if(type==="mousemove"){Crafty.viewport.mouselook("drag",e)}else{if(type=="mouseup"){Crafty.viewport.mouselook("stop")}}}}if(type==="mousemove"){this.lastEvent=e}},keyboardDispatch:function(e){e.key=e.keyCode||e.which;if(e.type==="keydown"){if(Crafty.keydown[e.key]!==true){Crafty.keydown[e.key]=true;Crafty.trigger("KeyDown",e)}}else{if(e.type==="keyup"){delete Crafty.keydown[e.key];Crafty.trigger("KeyUp",e)}}}});Crafty.bind("Load",function(){Crafty.addEvent(this,"keydown",Crafty.keyboardDispatch);Crafty.addEvent(this,"keyup",Crafty.keyboardDispatch);Crafty.addEvent(this,Crafty.stage.elem,"mousedown",Crafty.mouseDispatch);Crafty.addEvent(this,Crafty.stage.elem,"mouseup",Crafty.mouseDispatch);Crafty.addEvent(this,Crafty.stage.elem,"mousemove",Crafty.mouseDispatch);Crafty.addEvent(this,Crafty.stage.elem,"click",Crafty.mouseDispatch);Crafty.addEvent(this,Crafty.stage.elem,"dblclick",Crafty.mouseDispatch);Crafty.addEvent(this,Crafty.stage.elem,"touchstart",Crafty.mouseDispatch);Crafty.addEvent(this,Crafty.stage.elem,"touchmove",Crafty.mouseDispatch);Crafty.addEvent(this,Crafty.stage.elem,"touchend",Crafty.mouseDispatch)});Crafty.c("Mouse",{init:function(){Crafty.mouseObjs++;this.bind("Remove",function(){Crafty.mouseObjs--})},areaMap:function(poly){if(arguments.length>1){var args=Array.prototype.slice.call(arguments,0);poly=new Crafty.polygon(args)}poly.shift(this._x,this._y);this.map=poly;this.attach(this.map);return this}});Crafty.c("Draggable",{_origMouseDOMPos:null,_oldX:null,_oldY:null,_dragging:false,_dir:null,_ondrag:null,_ondown:null,_onup:null,init:function(){this.requires("Mouse");this._ondrag=function(e){var pos=Crafty.DOM.translate(e.clientX,e.clientY);if(this._dir){var len=(pos.x-this._origMouseDOMPos.x)*this._dir.x+(pos.y-this._origMouseDOMPos.y)*this._dir.y;this.x=this._oldX+len*this._dir.x;this.y=this._oldY+len*this._dir.y}else{this.x=this._oldX+(pos.x-this._origMouseDOMPos.x);this.y=this._oldY+(pos.y-this._origMouseDOMPos.y)}this.trigger("Dragging",e)};this._ondown=function(e){if(e.mouseButton!==Crafty.mouseButtons.LEFT){return}this._origMouseDOMPos=Crafty.DOM.translate(e.clientX,e.clientY);this._oldX=this._x;this._oldY=this._y;this._dragging=true;Crafty.addEvent(this,Crafty.stage.elem,"mousemove",this._ondrag);Crafty.addEvent(this,Crafty.stage.elem,"mouseup",this._onup);this.trigger("StartDrag",e)};this._onup=function upper(e){Crafty.removeEvent(this,Crafty.stage.elem,"mousemove",this._ondrag);Crafty.removeEvent(this,Crafty.stage.elem,"mouseup",this._onup);this._dragging=false;this.trigger("StopDrag",e)};this.enableDrag()},dragDirection:function(dir){if(typeof dir==="undefined"){this._dir=null}else{if((""+parseInt(dir))==dir){this._dir={x:Math.cos(dir/180*Math.PI),y:Math.sin(dir/180*Math.PI)}}else{var r=Math.sqrt(dir.x*dir.x+dir.y*dir.y);this._dir={x:dir.x/r,y:dir.y/r}}}},stopDrag:function(){Crafty.removeEvent(this,Crafty.stage.elem,"mousemove",this._ondrag);Crafty.removeEvent(this,Crafty.stage.elem,"mouseup",this._onup);this._dragging=false;this.trigger("StopDrag");return this},startDrag:function(){if(!this._dragging){this._dragging=true;Crafty.addEvent(this,Crafty.stage.elem,"mousemove",this._ondrag)}return this},enableDrag:function(){this.bind("MouseDown",this._ondown);Crafty.addEvent(this,Crafty.stage.elem,"mouseup",this._onup);return this},disableDrag:function(){this.unbind("MouseDown",this._ondown);this.stopDrag();return this}});Crafty.c("Keyboard",{isDown:function(key){if(typeof key==="string"){key=Crafty.keys[key]}return !!Crafty.keydown[key]}});Crafty.c("Multiway",{_speed:3,_keydown:function(e){if(this._keys[e.key]){this._movement.x=Math.round((this._movement.x+this._keys[e.key].x)*1000)/1000;this._movement.y=Math.round((this._movement.y+this._keys[e.key].y)*1000)/1000;this.trigger("NewDirection",this._movement)}},_keyup:function(e){if(this._keys[e.key]){this._movement.x=Math.round((this._movement.x-this._keys[e.key].x)*1000)/1000;this._movement.y=Math.round((this._movement.y-this._keys[e.key].y)*1000)/1000;this.trigger("NewDirection",this._movement)}},_enterframe:function(){if(this.disableControls){return}if(this._movement.x!==0){this.x+=this._movement.x;this.trigger("Moved",{x:this.x-this._movement.x,y:this.y})}if(this._movement.y!==0){this.y+=this._movement.y;this.trigger("Moved",{x:this.x,y:this.y-this._movement.y})}},init:function(){this._keyDirection={};this._keys={};this._movement={x:0,y:0};this._speed={x:3,y:3}},multiway:function(speed,keys){if(keys){if(speed.x&&speed.y){this._speed.x=speed.x;this._speed.y=speed.y}else{this._speed.x=speed;this._speed.y=speed}}else{keys=speed}this._keyDirection=keys;this.speed(this._speed);this.enableControl();for(var k in keys){if(Crafty.keydown[Crafty.keys[k]]){this.trigger("KeyDown",{key:Crafty.keys[k]})}}return this},enableControl:function(){this.bind("KeyDown",this._keydown).bind("KeyUp",this._keyup).bind("EnterFrame",this._enterframe);return this},disableControl:function(){this.unbind("KeyDown",this._keydown).unbind("KeyUp",this._keyup).unbind("EnterFrame",this._enterframe);return this},speed:function(speed){for(var k in this._keyDirection){var keyCode=Crafty.keys[k]||k;this._keys[keyCode]={x:Math.round(Math.cos(this._keyDirection[k]*(Math.PI/180))*1000*speed.x)/1000,y:Math.round(Math.sin(this._keyDirection[k]*(Math.PI/180))*1000*speed.y)/1000}}return this}});Crafty.c("Fourway",{init:function(){this.requires("Multiway")},fourway:function(speed){this.multiway(speed,{UP_ARROW:-90,DOWN_ARROW:90,RIGHT_ARROW:0,LEFT_ARROW:180,W:-90,S:90,D:0,A:180});return this}});Crafty.c("Twoway",{_speed:3,_up:false,init:function(){this.requires("Fourway, Keyboard")},twoway:function(speed,jump){this.multiway(speed,{RIGHT_ARROW:0,LEFT_ARROW:180,D:0,A:180});if(speed){this._speed=speed}jump=jump||this._speed*2;this.bind("EnterFrame",function(){if(this.disableControls){return}if(this._up){this.y-=jump;this._falling=true}}).bind("KeyDown",function(){if(this.isDown("UP_ARROW")||this.isDown("W")){this._up=true}});return this}});Crafty.c("SpriteAnimation",{_reels:null,_frame:null,_current:null,init:function(){this._reels={}},animate:function(id,fromx,y,tox){var reel,i,tile,tileh,duration,pos;if(arguments.length<4&&typeof fromx==="number"){this._current=id;reel=this._reels[id];duration=fromx;this._frame={reel:reel,frameTime:Math.ceil(duration/reel.length),frame:0,current:0,repeat:0};if(arguments.length===3&&typeof y==="number"){if(y===-1){this._frame.repeatInfinitly=true}else{this._frame.repeat=y}}pos=this._frame.reel[0];this.__coord[0]=pos[0];this.__coord[1]=pos[1];this.bind("EnterFrame",this.drawFrame);return this}if(typeof fromx==="number"){i=fromx;reel=[];tile=this.__tile;tileh=this.__tileh;if(tox>fromx){for(;i<=tox;i++){reel.push([i*tile,y*tileh])}}else{for(;i>=tox;i--){reel.push([i*tile,y*tileh])}}this._reels[id]=reel}else{if(typeof fromx==="object"){i=0;reel=[];tox=fromx.length-1;tile=this.__tile;tileh=this.__tileh;for(;i<=tox;i++){pos=fromx[i];reel.push([pos[0]*tile,pos[1]*tileh])}this._reels[id]=reel}}return this},drawFrame:function(e){var data=this._frame;if(this._frame.current++===data.frameTime){var pos=data.reel[data.frame++];this.__coord[0]=pos[0];this.__coord[1]=pos[1];this._frame.current=0}if(data.frame===data.reel.length&&this._frame.current===data.frameTime){data.frame=0;if(this._frame.repeatInfinitly===true||this._frame.repeat>0){if(this._frame.repeat){this._frame.repeat--}this._frame.current=0;this._frame.frame=0}else{this.trigger("AnimationEnd",{reel:data.reel});this.stop();return}}this.trigger("Change")},stop:function(){this.unbind("EnterFrame",this.drawFrame);this.unbind("AnimationEnd");this._current=null;this._frame=null;return this},reset:function(){if(!this._frame){return this}var co=this._frame.reel[0];this.__coord[0]=co[0];this.__coord[1]=co[1];this.stop();return this},isPlaying:function(id){if(!id){return !!this._interval}return this._current===id}});Crafty.c("Tween",{_step:null,_numProps:0,tween:function(props,duration){this.each(function(){if(this._step==null){this._step={};this.bind("EnterFrame",tweenEnterFrame);this.bind("RemoveComponent",function(c){if(c=="Tween"){this.unbind("EnterFrame",tweenEnterFrame)}})}for(var prop in props){this._step[prop]={prop:props[prop],val:(props[prop]-this[prop])/duration,rem:duration};this._numProps++}});return this}});function tweenEnterFrame(e){if(this._numProps<=0){return}var prop,k;for(k in this._step){prop=this._step[k];this[k]+=prop.val;if(--prop.rem==0){this[k]=prop.prop;this.trigger("TweenEnd",k);if(this._step[k].rem<=0){delete this._step[k]}this._numProps--}}if(this.has("Mouse")){var over=Crafty.over,mouse=Crafty.mousePos;if(over&&over[0]==this[0]&&!this.isAt(mouse.x,mouse.y)){this.trigger("MouseOut",Crafty.lastEvent);Crafty.over=null}else{if((!over||over[0]!=this[0])&&this.isAt(mouse.x,mouse.y)){Crafty.over=this;this.trigger("MouseOver",Crafty.lastEvent)}}}}Crafty.c("Sprite",{__image:"",__tile:0,__tileh:0,__padding:null,__trim:null,img:null,ready:false,init:function(){this.__trim=[0,0,0,0];var draw=function(e){var co=e.co,pos=e.pos,context=e.ctx;if(e.type==="canvas"){context.drawImage(this.img,co.x,co.y,co.w,co.h,pos._x,pos._y,pos._w,pos._h)}else{if(e.type==="DOM"){this._element.style.background="url('"+this.__image+"') no-repeat -"+co.x+"px -"+co.y+"px"}}};this.bind("Draw",draw).bind("RemoveComponent",function(id){if(id==="Sprite"){this.unbind("Draw",draw)}})},sprite:function(x,y,w,h){this.__coord=[x*this.__tile+this.__padding[0]+this.__trim[0],y*this.__tileh+this.__padding[1]+this.__trim[1],this.__trim[2]||w*this.__tile||this.__tile,this.__trim[3]||h*this.__tileh||this.__tileh];this.trigger("Change");return this},crop:function(x,y,w,h){var old=this._mbr||this.pos();this.__trim=[];this.__trim[0]=x;this.__trim[1]=y;this.__trim[2]=w;this.__trim[3]=h;this.__coord[0]+=x;this.__coord[1]+=y;this.__coord[2]=w;this.__coord[3]=h;this._w=w;this._h=h;this.trigger("Change",old);return this}});Crafty.c("Color",{_color:"",ready:true,init:function(){this.bind("Draw",function(e){if(e.type==="DOM"){e.style.background=this._color;e.style.lineHeight=0}else{if(e.type==="canvas"){if(this._color){e.ctx.fillStyle=this._color}e.ctx.fillRect(e.pos._x,e.pos._y,e.pos._w,e.pos._h)}}})},color:function(color){if(!color){return this._color}this._color=color;this.trigger("Change");return this}});Crafty.c("Tint",{_color:null,_strength:1,init:function(){var draw=function d(e){var context=e.ctx||Crafty.canvas.context;context.fillStyle=this._color||"rgb(0,0,0)";context.fillRect(e.pos._x,e.pos._y,e.pos._w,e.pos._h)};this.bind("Draw",draw).bind("RemoveComponent",function(id){if(id==="Tint"){this.unbind("Draw",draw)}})},tint:function(color,strength){this._strength=strength;this._color=Crafty.toRGB(color,this._strength);this.trigger("Change");return this}});Crafty.c("Image",{_repeat:"repeat",ready:false,init:function(){var draw=function(e){if(e.type==="canvas"){if(!this.ready||!this._pattern){return}var context=e.ctx;context.fillStyle=this._pattern;context.fillRect(this._x,this._y,this._w,this._h)}else{if(e.type==="DOM"){if(this.__image){e.style.background="url("+this.__image+") "+this._repeat}}}};this.bind("Draw",draw).bind("RemoveComponent",function(id){if(id==="Image"){this.unbind("Draw",draw)}})},image:function(url,repeat){this.__image=url;this._repeat=repeat||"no-repeat";this.img=Crafty.assets[url];if(!this.img){this.img=new Image();Crafty.assets[url]=this.img;this.img.src=url;var self=this;this.img.onload=function(){if(self.has("Canvas")){self._pattern=Crafty.canvas.context.createPattern(self.img,self._repeat)}self.ready=true;if(self._repeat==="no-repeat"){self.w=self.img.width;self.h=self.img.height}self.trigger("Change")};return this}else{this.ready=true;if(this.has("Canvas")){this._pattern=Crafty.canvas.context.createPattern(this.img,this._repeat)}if(this._repeat==="no-repeat"){this.w=this.img.width;this.h=this.img.height}}this.trigger("Change");return this}});Crafty.extend({_scenes:[],_current:null,scene:function(name,intro,outro){if(arguments.length===1){Crafty("2D").each(function(){if(!this.has("Persist")){this.destroy()}});if(this._current!==null&&"uninitialize" in this._scenes[this._current]){this._scenes[this._current].uninitialize.call(this)}this._scenes[name].initialize.call(this);var oldScene=this._current;this._current=name;Crafty.trigger("SceneChange",{oldScene:oldScene,newScene:name});return}this._scenes[name]={};this._scenes[name].initialize=intro;if(typeof outro!=="undefined"){this._scenes[name].uninitialize=outro}return},toRGB:function(hex,alpha){var hex=(hex.charAt(0)==="#")?hex.substr(1):hex,c=[],result;c[0]=parseInt(hex.substr(0,2),16);c[1]=parseInt(hex.substr(2,2),16);c[2]=parseInt(hex.substr(4,2),16);result=alpha===undefined?"rgb("+c.join(",")+")":"rgba("+c.join(",")+","+alpha+")";return result}});Crafty.DrawManager=(function(){var dirty_rects=[],dom=[];return{total2D:Crafty("2D").length,onScreen:function(rect){return Crafty.viewport._x+rect._x+rect._w>0&&Crafty.viewport._y+rect._y+rect._h>0&&Crafty.viewport._x+rect._x<Crafty.viewport.width&&Crafty.viewport._y+rect._y<Crafty.viewport.height},merge:function(set){do{var newset=[],didMerge=false,i=0,l=set.length,current,next,merger;while(i<l){current=set[i];next=set[i+1];if(i<l-1&&current._x<next._x+next._w&&current._x+current._w>next._x&&current._y<next._y+next._h&&current._h+current._y>next._y){merger={_x:~~Math.min(current._x,next._x),_y:~~Math.min(current._y,next._y),_w:Math.max(current._x,next._x)+Math.max(current._w,next._w),_h:Math.max(current._y,next._y)+Math.max(current._h,next._h)};merger._w=merger._w-merger._x;merger._h=merger._h-merger._y;merger._w=(merger._w==~~merger._w)?merger._w:merger._w+1|0;merger._h=(merger._h==~~merger._h)?merger._h:merger._h+1|0;newset.push(merger);i++;didMerge=true}else{newset.push(current)}i++}set=newset.length?Crafty.clone(newset):set;if(didMerge){i=0}}while(didMerge);return set},add:function add(old,current){if(!current){dom.push(old);return}var rect,before=old._mbr||old,after=current._mbr||current;if(old===current){rect=old.mbr()||old.pos()}else{rect={_x:~~Math.min(before._x,after._x),_y:~~Math.min(before._y,after._y),_w:Math.max(before._w,after._w)+Math.max(before._x,after._x),_h:Math.max(before._h,after._h)+Math.max(before._y,after._y)};rect._w=(rect._w-rect._x);rect._h=(rect._h-rect._y)}if(rect._w===0||rect._h===0||!this.onScreen(rect)){return false}rect._x=~~rect._x;rect._y=~~rect._y;rect._w=(rect._w===~~rect._w)?rect._w:rect._w+1|0;rect._h=(rect._h===~~rect._h)?rect._h:rect._h+1|0;dirty_rects.push(rect);return true},debug:function(){console.log(dirty_rects,dom)},drawAll:function(rect){var rect=rect||Crafty.viewport.rect(),q=Crafty.map.search(rect),i=0,l=q.length,ctx=Crafty.canvas.context,current;ctx.clearRect(rect._x,rect._y,rect._w,rect._h);q.sort(function(a,b){return a._globalZ-b._globalZ});for(;i<l;i++){current=q[i];if(current._visible&&current.__c.Canvas){current.draw();current._changed=false}}},boundingRect:function(set){if(!set||!set.length){return}var newset=[],i=1,l=set.length,current,master=set[0],tmp;master=[master._x,master._y,master._x+master._w,master._y+master._h];while(i<l){current=set[i];tmp=[current._x,current._y,current._x+current._w,current._y+current._h];if(tmp[0]<master[0]){master[0]=tmp[0]}if(tmp[1]<master[1]){master[1]=tmp[1]}if(tmp[2]>master[2]){master[2]=tmp[2]}if(tmp[3]>master[3]){master[3]=tmp[3]}i++}tmp=master;master={_x:tmp[0],_y:tmp[1],_w:tmp[2]-tmp[0],_h:tmp[3]-tmp[1]};return master},draw:function draw(){if(!dirty_rects.length&&!dom.length){return}var i=0,l=dirty_rects.length,k=dom.length,rect,q,j,len,dupes,obj,ent,objs=[],ctx=Crafty.canvas.context;for(;i<k;++i){dom[i].draw()._changed=false}dom.length=0;if(!l){return}if(l/this.total2D>0.6){this.drawAll();dirty_rects.length=0;return}dirty_rects=this.merge(dirty_rects);for(i=0;i<l;++i){rect=dirty_rects[i];if(!rect){continue}q=Crafty.map.search(rect,false);dupes={};for(j=0,len=q.length;j<len;++j){obj=q[j];if(dupes[obj[0]]||!obj._visible||!obj.__c.Canvas){continue}dupes[obj[0]]=true;objs.push({obj:obj,rect:rect})}ctx.clearRect(rect._x,rect._y,rect._w,rect._h)}objs.sort(function(a,b){return a.obj._globalZ-b.obj._globalZ});if(!objs.length){return}for(i=0,l=objs.length;i<l;++i){obj=objs[i];rect=obj.rect;ent=obj.obj;var area=ent._mbr||ent,x=(rect._x-area._x<=0)?0:~~(rect._x-area._x),y=(rect._y-area._y<0)?0:~~(rect._y-area._y),w=~~Math.min(area._w-x,rect._w-(area._x-rect._x),rect._w,area._w),h=~~Math.min(area._h-y,rect._h-(area._y-rect._y),rect._h,area._h);if(h===0||w===0){continue}ctx.save();ctx.beginPath();ctx.moveTo(rect._x,rect._y);ctx.lineTo(rect._x+rect._w,rect._y);ctx.lineTo(rect._x+rect._w,rect._h+rect._y);ctx.lineTo(rect._x,rect._h+rect._y);ctx.lineTo(rect._x,rect._y);ctx.clip();ent.draw();ctx.closePath();ctx.restore();ent._changed=false}dirty_rects.length=0;merged={}}}})();Crafty.extend({isometric:{_tile:{width:0,height:0},_elements:{},_pos:{x:0,y:0},_z:0,size:function(width,height){this._tile.width=width;this._tile.height=height>0?height:width/2;return this},place:function(x,y,z,obj){var pos=this.pos2px(x,y);pos.top-=z*(this._tile.width/2);obj.attr({x:pos.left+Crafty.viewport._x,y:pos.top+Crafty.viewport._y}).z+=z;return this},pos2px:function(x,y){return{left:x*this._tile.width+(y&1)*(this._tile.width/2),top:y*this._tile.height/2}},px2pos:function(left,top){return{x:Math.ceil(-left/this._tile.width-(top&1)*0.5),y:-top/this._tile.height*2}},centerAt:function(x,y){if(typeof x=="number"&&typeof y=="number"){var center=this.pos2px(x,y);Crafty.viewport._x=-center.left+Crafty.viewport.width/2-this._tile.width/2;Crafty.viewport._y=-center.top+Crafty.viewport.height/2-this._tile.height/2;return this}else{return{top:-Crafty.viewport._y+Crafty.viewport.height/2-this._tile.height/2,left:-Crafty.viewport._x+Crafty.viewport.width/2-this._tile.width/2}}},area:function(){var center=this.centerAt();var start=this.px2pos(-center.left+Crafty.viewport.width/2,-center.top+Crafty.viewport.height/2);var end=this.px2pos(-center.left-Crafty.viewport.width/2,-center.top-Crafty.viewport.height/2);return{x:{start:start.x,end:end.x},y:{start:start.y,end:end.y}}}}});Crafty.c("particles",{init:function(){this._Particles=Crafty.clone(this._Particles)},particles:function(options){if(!Crafty.support.canvas||Crafty.deactivateParticles){return this}var c,ctx,relativeX,relativeY,bounding;c=document.createElement("canvas");c.width=Crafty.viewport.width;c.height=Crafty.viewport.height;c.style.position="absolute";Crafty.stage.elem.appendChild(c);ctx=c.getContext("2d");this._Particles.init(options);relativeX=this.x+Crafty.viewport.x;relativeY=this.y+Crafty.viewport.y;this._Particles.position=this._Particles.vectorHelpers.create(relativeX,relativeY);var oldViewport={x:Crafty.viewport.x,y:Crafty.viewport.y};this.bind("EnterFrame",function(){relativeX=this.x+Crafty.viewport.x;relativeY=this.y+Crafty.viewport.y;this._Particles.viewportDelta={x:Crafty.viewport.x-oldViewport.x,y:Crafty.viewport.y-oldViewport.y};oldViewport={x:Crafty.viewport.x,y:Crafty.viewport.y};this._Particles.position=this._Particles.vectorHelpers.create(relativeX,relativeY);if(typeof Crafty.DrawManager.boundingRect=="function"){bounding=Crafty.DrawManager.boundingRect(this._Particles.register);if(bounding){ctx.clearRect(bounding._x,bounding._y,bounding._w,bounding._h)}}else{ctx.clearRect(0,0,Crafty.viewport.width,Crafty.viewport.height)}this._Particles.update();this._Particles.render(ctx)});return this},_Particles:{presets:{maxParticles:150,size:18,sizeRandom:4,speed:1,speedRandom:1.2,lifeSpan:29,lifeSpanRandom:7,angle:65,angleRandom:34,startColour:[255,131,0,1],startColourRandom:[48,50,45,0],endColour:[245,35,0,0],endColourRandom:[60,60,60,0],sharpness:20,sharpnessRandom:10,spread:10,duration:-1,fastMode:false,gravity:{x:0,y:0.1},jitter:0,particles:[],active:true,particleCount:0,elapsedFrames:0,emissionRate:0,emitCounter:0,particleIndex:0},init:function(options){this.position=this.vectorHelpers.create(0,0);if(typeof options=="undefined"){var options={}}for(key in this.presets){if(typeof options[key]!="undefined"){this[key]=options[key]}else{this[key]=this.presets[key]}}this.emissionRate=this.maxParticles/this.lifeSpan;this.positionRandom=this.vectorHelpers.create(this.spread,this.spread)},addParticle:function(){if(this.particleCount==this.maxParticles){return false}var particle=new this.particle(this.vectorHelpers);this.initParticle(particle);this.particles[this.particleCount]=particle;this.particleCount++;return true},RANDM1TO1:function(){return Math.random()*2-1},initParticle:function(particle){particle.position.x=this.position.x+this.positionRandom.x*this.RANDM1TO1();particle.position.y=this.position.y+this.positionRandom.y*this.RANDM1TO1();var newAngle=(this.angle+this.angleRandom*this.RANDM1TO1())*(Math.PI/180);var vector=this.vectorHelpers.create(Math.sin(newAngle),-Math.cos(newAngle));var vectorSpeed=this.speed+this.speedRandom*this.RANDM1TO1();particle.direction=this.vectorHelpers.multiply(vector,vectorSpeed);particle.size=this.size+this.sizeRandom*this.RANDM1TO1();particle.size=particle.size<0?0:~~particle.size;particle.timeToLive=this.lifeSpan+this.lifeSpanRandom*this.RANDM1TO1();particle.sharpness=this.sharpness+this.sharpnessRandom*this.RANDM1TO1();particle.sharpness=particle.sharpness>100?100:particle.sharpness<0?0:particle.sharpness;particle.sizeSmall=~~((particle.size/200)*particle.sharpness);var start=[this.startColour[0]+this.startColourRandom[0]*this.RANDM1TO1(),this.startColour[1]+this.startColourRandom[1]*this.RANDM1TO1(),this.startColour[2]+this.startColourRandom[2]*this.RANDM1TO1(),this.startColour[3]+this.startColourRandom[3]*this.RANDM1TO1()];var end=[this.endColour[0]+this.endColourRandom[0]*this.RANDM1TO1(),this.endColour[1]+this.endColourRandom[1]*this.RANDM1TO1(),this.endColour[2]+this.endColourRandom[2]*this.RANDM1TO1(),this.endColour[3]+this.endColourRandom[3]*this.RANDM1TO1()];particle.colour=start;particle.deltaColour[0]=(end[0]-start[0])/particle.timeToLive;particle.deltaColour[1]=(end[1]-start[1])/particle.timeToLive;particle.deltaColour[2]=(end[2]-start[2])/particle.timeToLive;particle.deltaColour[3]=(end[3]-start[3])/particle.timeToLive},update:function(){if(this.active&&this.emissionRate>0){var rate=1/this.emissionRate;this.emitCounter++;while(this.particleCount<this.maxParticles&&this.emitCounter>rate){this.addParticle();this.emitCounter-=rate}this.elapsedFrames++;if(this.duration!=-1&&this.duration<this.elapsedFrames){this.stop()}}this.particleIndex=0;this.register=[];var draw;while(this.particleIndex<this.particleCount){var currentParticle=this.particles[this.particleIndex];if(currentParticle.timeToLive>0){currentParticle.direction=this.vectorHelpers.add(currentParticle.direction,this.gravity);currentParticle.position=this.vectorHelpers.add(currentParticle.position,currentParticle.direction);currentParticle.position=this.vectorHelpers.add(currentParticle.position,this.viewportDelta);if(this.jitter){currentParticle.position.x+=this.jitter*this.RANDM1TO1();currentParticle.position.y+=this.jitter*this.RANDM1TO1()}currentParticle.timeToLive--;var r=currentParticle.colour[0]+=currentParticle.deltaColour[0];var g=currentParticle.colour[1]+=currentParticle.deltaColour[1];var b=currentParticle.colour[2]+=currentParticle.deltaColour[2];var a=currentParticle.colour[3]+=currentParticle.deltaColour[3];draw=[];draw.push("rgba("+(r>255?255:r<0?0:~~r));draw.push(g>255?255:g<0?0:~~g);draw.push(b>255?255:b<0?0:~~b);draw.push((a>1?1:a<0?0:a.toFixed(2))+")");currentParticle.drawColour=draw.join(",");if(!this.fastMode){draw[3]="0)";currentParticle.drawColourEnd=draw.join(",")}this.particleIndex++}else{if(this.particleIndex!=this.particleCount-1){this.particles[this.particleIndex]=this.particles[this.particleCount-1]}this.particleCount--}var rect={};rect._x=~~currentParticle.position.x;rect._y=~~currentParticle.position.y;rect._w=currentParticle.size;rect._h=currentParticle.size;this.register.push(rect)}},stop:function(){this.active=false;this.elapsedFrames=0;this.emitCounter=0},render:function(context){for(var i=0,j=this.particleCount;i<j;i++){var particle=this.particles[i];var size=particle.size;var halfSize=size>>1;if(particle.position.x+size<0||particle.position.y+size<0||particle.position.x-size>Crafty.viewport.width||particle.position.y-size>Crafty.viewport.height){continue}var x=~~particle.position.x;var y=~~particle.position.y;if(this.fastMode){context.fillStyle=particle.drawColour}else{var radgrad=context.createRadialGradient(x+halfSize,y+halfSize,particle.sizeSmall,x+halfSize,y+halfSize,halfSize);radgrad.addColorStop(0,particle.drawColour);radgrad.addColorStop(0.9,particle.drawColourEnd);context.fillStyle=radgrad}context.fillRect(x,y,size,size)}},particle:function(vectorHelpers){this.position=vectorHelpers.create(0,0);this.direction=vectorHelpers.create(0,0);this.size=0;this.sizeSmall=0;this.timeToLive=0;this.colour=[];this.drawColour="";this.deltaColour=[];this.sharpness=0},vectorHelpers:{create:function(x,y){return{x:x,y:y}},multiply:function(vector,scaleFactor){vector.x*=scaleFactor;vector.y*=scaleFactor;return vector},add:function(vector1,vector2){vector1.x+=vector2.x;vector1.y+=vector2.y;return vector1}}}});Crafty.extend({audio:{_elems:{},_muted:false,MAX_CHANNELS:5,type:{mp3:"audio/mpeg;",ogg:'audio/ogg; codecs="vorbis"',wav:'audio/wav; codecs="1"',mp4:'audio/mp4; codecs="mp4a.40.2"'},add:function(id,url){if(!Crafty.support.audio){return this}var elem,key,audio=new Audio(),canplay,i=0,sounds=[];if(arguments.length===1&&typeof id==="object"){for(key in id){if(!id.hasOwnProperty(key)){continue}if(typeof id[key]!=="string"){var sources=id[key],i=0,l=sources.length,source;for(;i<l;++i){source=sources[i];ext=source.substr(source.lastIndexOf(".")+1).toLowerCase();canplay=audio.canPlayType(this.type[ext]);if(canplay!==""&&canplay!=="no"){url=source;break}}}else{url=id[key]}for(;i<this.MAX_CHANNELS;i++){audio=new Audio(url);audio.preload="auto";audio.load();sounds.push(audio)}this._elems[key]=sounds;if(!Crafty.assets[url]){Crafty.assets[url]=this._elems[key][0]}}return this}if(typeof url!=="string"){var i=0,l=url.length,source;for(;i<l;++i){source=url[i];ext=source.substr(source.lastIndexOf(".")+1);canplay=audio.canPlayType(this.type[ext]);if(canplay!==""&&canplay!=="no"){url=source;break}}}for(;i<this.MAX_CHANNELS;i++){audio=new Audio(url);audio.preload="auto";audio.load();sounds.push(audio)}this._elems[id]=sounds;if(!Crafty.assets[url]){Crafty.assets[url]=this._elems[id][0]}return this},play:function(id,repeat){if(!Crafty.support.audio){return}var sounds=this._elems[id],sound,i=0,l=sounds.length;for(;i<l;i++){sound=sounds[i];if(sound.ended||!sound.currentTime){sound.play();break}else{if(i===l-1){sound.currentTime=0;sound.play()}}}if(typeof repeat=="number"){var j=0;sounds[i].addEventListener("ended",function(){if(repeat==-1||j<=repeat){this.currentTime=0;this.play();j++}},false)}return this},settings:function(id,settings){if(!settings){for(var key in this._elems){this.settings(key,id)}return this}var sounds=this._elems[id],sound,setting,i=0,l=sounds.length;for(var setting in settings){for(;i<l;i++){sound=sounds[i];sound[setting]=settings[setting]}}return this},mute:function(mute){var sounds,sound,i,l,elem;if(arguments.length==1&&typeof(mute)=="boolean"){this._muted=mute}else{this._muted=!this._muted}for(sounds in this._elems){elem=this._elems[sounds];for(i=0,l=elem.length;i<l;++i){sound=elem[i];if(!sound.ended&&sound.currentTime){if(this._muted){sound.pause()}else{sound.play()}}}}return this}}});(function(){var prev_mute_state;Crafty.bind("Pause",function(){prev_mute_state=Crafty.audio._muted;Crafty.audio.mute(true)});Crafty.bind("Unpause",function(){if(!prev_mute_state){Crafty.audio.mute(false)}})})();Crafty.c("HTML",{inner:"",init:function(){this.requires("2D, DOM")},replace:function(new_html){this.inner=new_html;this._element.innerHTML=new_html;return this},append:function(new_html){this.inner+=new_html;this._element.innerHTML+=new_html;return this},prepend:function(new_html){this.inner=new_html+this.inner;this._element.innerHTML=new_html+this.inner;return this}});Crafty.storage=(function(){var db=null,url,gameName,timestamps={};function process(obj){if(obj.c){var d=Crafty.e(obj.c).attr(obj.attr).trigger("LoadData",obj,process);return d}else{if(typeof obj=="object"){for(var prop in obj){obj[prop]=process(obj[prop])}}}return obj}function unserialize(str){if(typeof str!="string"){return null}var data=(JSON?JSON.parse(str):eval("("+str+")"));return process(data)}function prep(obj){if(obj.__c){var data={c:[],attr:{}};obj.trigger("SaveData",data,prep);for(var i in obj.__c){data.c.push(i)}data.c=data.c.join(", ");obj=data}else{if(typeof obj=="object"){for(var prop in obj){obj[prop]=prep(obj[prop])}}}return obj}function serialize(e){if(JSON){var data=prep(e);return JSON.stringify(data)}else{alert("Crafty does not support saving on your browser. Please upgrade to a newer browser.");return false}}function external(setUrl){url=setUrl}function openExternal(){if(1&&typeof url=="undefined"){return}var xml=new XMLHttpRequest();xhr.open("POST",url);xhr.onreadystatechange=function(evt){if(xhr.readyState==4){if(xhr.status==200){var data=eval("("+xhr.responseText+")");for(var i in data){if(Crafty.storage.check(data[i].key,data[i].timestamp)){loadExternal(data[i].key)}}}}};xhr.send("mode=timestamps&game="+gameName)}function saveExternal(key,data,ts){if(1&&typeof url=="undefined"){return}var xhr=new XMLHttpRequest();xhr.open("POST",url);xhr.send("mode=save&key="+key+"&data="+encodeURIComponent(data)+"&ts="+ts+"&game="+gameName)}function loadExternal(key){if(1&&typeof url=="undefined"){return}var xhr=new XMLHttpRequest();xhr.open("POST",url);xhr.onreadystatechange=function(evt){if(xhr.readyState==4){if(xhr.status==200){var data=eval("("+xhr.responseText+")");Crafty.storage.save(key,"save",data)}}};xhr.send("mode=load&key="+key+"&game="+gameName)}function ts(){var d=new Date();return d.getTime()}if(typeof indexedDB!="object"){if(typeof mozIndexedDB=="object"){window.indexedDB=mozIndexedDB}if(typeof webkitIndexedDB=="object"){window.indexedDB=webkitIndexedDB;window.IDBTransaction=webkitIDBTransaction}}if(typeof indexedDB=="object"){return{open:function(gameName_n){gameName=gameName_n;var stores=[];if(arguments.length==1){stores.push("save");stores.push("cache")}else{stores=arguments;stores.shift();stores.push("save");stores.push("cache")}if(db==null){var request=indexedDB.open(gameName,"Database for "+gameName);request.onsuccess=function(e){db=e.target.result;createStores();getTimestamps();openExternal()}}else{createStores();getTimestamps();openExternal()}function getTimestamps(){try{var trans=db.transaction(["save"],IDBTransaction.READ,0),store=trans.objectStore("save"),request=store.getAll();request.onsuccess=function(e){var i=0,a=event.target.result,l=a.length;for(;i<l;i++){timestamps[a[i].key]=a[i].timestamp}}}catch(e){}}function createStores(){var request=db.setVersion("1.0");request.onsuccess=function(e){for(var i=0;i<stores.length;i++){var st=stores[i];if(db.objectStoreNames.contains(st)){continue}db.createObjectStore(st,{keyPath:"key"})}}}},save:function(key,type,data){if(db==null){setTimeout(function(){Crafty.storage.save(key,type,data)},1);return}var str=serialize(data),t=ts();if(type=="save"){saveExternal(key,str,t)}try{var trans=db.transaction([type],IDBTransaction.READ_WRITE,0),store=trans.objectStore(type),request=store.put({data:str,timestamp:t,key:key})}catch(e){}},load:function(key,type,callback){if(db==null){setTimeout(function(){Crafty.storage.load(key,type,callback)},1);return}try{var trans=db.transaction([type],IDBTransaction.READ,0),store=trans.objectStore(type),request=store.get(key);request.onsuccess=function(e){callback(unserialize(e.target.result.data))}}catch(e){}},getAllKeys:function(type,callback){if(db==null){setTimeout(function(){Crafty.storage.getAllkeys(type,callback)},1)}try{var trans=db.transaction([type],IDBTransaction.READ,0),store=trans.objectStore(type),request=store.getCursor(),res=[];request.onsuccess=function(e){var cursor=e.target.result;if(cursor){res.push(cursor.key);cursor["continue"]()}else{callback(res)}}}catch(e){}},check:function(key,timestamp){return(timestamps[key]>timestamp)},external:external}}else{if(typeof openDatabase=="function"){return{open:function(gameName_n){gameName=gameName_n;if(arguments.length==1){db={save:openDatabase(gameName_n+"_save","1.0","Saves games for "+gameName_n,5*1024*1024),cache:openDatabase(gameName_n+"_cache","1.0","Cache for "+gameName_n,5*1024*1024)}}else{var args=arguments,i=0;args.shift();for(;i<args.length;i++){if(typeof db[args[i]]=="undefined"){db[args[i]]=openDatabase(gameName+"_"+args[i],"1.0",type,5*1024*1024)}}}db.save.transaction(function(tx){tx.executeSql("SELECT key, timestamp FROM data",[],function(tx,res){var i=0,a=res.rows,l=a.length;for(;i<l;i++){timestamps[a.item(i).key]=a.item(i).timestamp}})})},save:function(key,type,data){if(typeof db[type]=="undefined"&&gameName!=""){this.open(gameName,type)}var str=serialize(data),t=ts();if(type=="save"){saveExternal(key,str,t)}db[type].transaction(function(tx){tx.executeSql("CREATE TABLE IF NOT EXISTS data (key unique, text, timestamp)");tx.executeSql("SELECT * FROM data WHERE key = ?",[key],function(tx,results){if(results.rows.length){tx.executeSql("UPDATE data SET text = ?, timestamp = ? WHERE key = ?",[str,t,key])}else{tx.executeSql("INSERT INTO data VALUES (?, ?, ?)",[key,str,t])}})})},load:function(key,type,callback){if(db[type]==null){setTimeout(function(){Crafty.storage.load(key,type,callback)},1);return}db[type].transaction(function(tx){tx.executeSql("SELECT text FROM data WHERE key = ?",[key],function(tx,results){if(results.rows.length){res=unserialize(results.rows.item(0).text);callback(res)}})})},getAllKeys:function(type,callback){if(db[type]==null){setTimeout(function(){Crafty.storage.getAllKeys(type,callback)},1);return}db[type].transaction(function(tx){tx.executeSql("SELECT key FROM data",[],function(tx,results){callback(results.rows)})})},check:function(key,timestamp){return(timestamps[key]>timestamp)},external:external}}else{if(typeof window.localStorage=="object"){return{open:function(gameName_n){gameName=gameName_n},save:function(key,type,data){var k=gameName+"."+type+"."+key,str=serialize(data),t=ts();if(type=="save"){saveExternal(key,str,t)}window.localStorage[k]=str;if(type=="save"){window.localStorage[k+".ts"]=t}},load:function(key,type,callback){var k=gameName+"."+type+"."+key,str=window.localStorage[k];callback(unserialize(str))},getAllKeys:function(type,callback){var res={},output=[],header=gameName+"."+type;for(var i in window.localStorage){if(i.indexOf(header)!=-1){var key=i.replace(header,"").replace(".ts","");res[key]=true}}for(i in res){output.push(i)}callback(output)},check:function(key,timestamp){var ts=window.localStorage[gameName+".save."+key+".ts"];return(parseInt(timestamp)>parseInt(ts))},external:external}}else{return{open:function(gameName_n){gameName=gameName_n},save:function(key,type,data){if(type!="save"){return}var str=serialize(data),t=ts();if(type=="save"){saveExternal(key,str,t)}document.cookie=gameName+"_"+key+"="+str+"; "+gameName+"_"+key+"_ts="+t+"; expires=Thur, 31 Dec 2099 23:59:59 UTC; path=/"},load:function(key,type,callback){if(type!="save"){return}var reg=new RegExp(gameName+"_"+key+"=[^;]*"),result=reg.exec(document.cookie),data=unserialize(result[0].replace(gameName+"_"+key+"=",""));callback(data)},getAllKeys:function(type,callback){if(type!="save"){return}var reg=new RegExp(gameName+"_[^_=]","g"),matches=reg.exec(document.cookie),i=0,l=matches.length,res={},output=[];for(;i<l;i++){var key=matches[i].replace(gameName+"_","");res[key]=true}for(i in res){output.push(i)}callback(output)},check:function(key,timestamp){var header=gameName+"_"+key+"_ts",reg=new RegExp(header+"=[^;]"),result=reg.exec(document.cookie),ts=result[0].replace(header+"=","");return(parseInt(timestamp)>parseInt(ts))},external:external}}}}})();Crafty.c("Text",{_text:"",_textFont:{type:"",weight:"",size:"",family:""},ready:true,init:function(){this.requires("2D");this.bind("Draw",function(e){var font=this._textFont.type+" "+this._textFont.weight+" "+this._textFont.size+" "+this._textFont.family;if(e.type==="DOM"){var el=this._element,style=el.style;style.color=this._textColor;style.font=font;el.innerHTML=this._text}else{if(e.type==="canvas"){var context=e.ctx,metrics=null;context.save();context.fillStyle=this._textColor||"rgb(0,0,0)";context.font=font;context.translate(this.x,this.y+this.h);context.fillText(this._text,0,0);metrics=context.measureText(this._text);this._w=metrics.width;context.restore()}}})},text:function(text){if(!text){return this._text}if(typeof(text)=="function"){this._text=text.call(this)}else{this._text=text}this.trigger("Change");return this},textColor:function(color,strength){this._strength=strength;this._textColor=Crafty.toRGB(color,this._strength);this.trigger("Change");return this},textFont:function(key,value){if(arguments.length===1){if(typeof key==="string"){return this._textFont[key]}if(typeof key==="object"){for(propertyKey in key){this._textFont[propertyKey]=key[propertyKey]}}}else{this._textFont[key]=value}this.trigger("Change");return this}});Crafty.extend({assets:{},load:function(data,oncomplete,onprogress,onerror){var i,l=data.length,current,obj,total=l,j=0,ext;for(i=0;i<l;++i){current=data[i];ext=current.substr(current.lastIndexOf(".")+1).toLowerCase();if(Crafty.support.audio&&(ext==="mp3"||ext==="wav"||ext==="ogg"||ext==="mp4")){obj=new Audio(current);if(navigator.userAgent.indexOf("Chrome")!=-1){j++}}else{if(ext==="jpg"||ext==="jpeg"||ext==="gif"||ext==="png"){obj=new Image();obj.src=current}else{total--;continue}}this.assets[current]=obj;obj.onload=function(){++j;if(onprogress){onprogress.call(this,{loaded:j,total:total,percent:(j/total*100)})}if(j===total){if(oncomplete){oncomplete()}}};obj.onerror=function(){if(onerror){onerror.call(this,{loaded:j,total:total,percent:(j/total*100)})}else{j++;if(j===total){if(oncomplete){oncomplete()}}}}}},modules:function(modulesRepository,moduleMap,oncomplete){if(arguments.length===2&&typeof modulesRepository==="object"){oncomplete=moduleMap;moduleMap=modulesRepository;modulesRepository="http://cdn.craftycomponents.com";
+/*!
+ * $script.js Async loader & dependency manager
+ * https://github.com/ded/script.js
+ * (c) Dustin Diaz, Jacob Thornton 2011
+ * License: MIT
+ */
+}var $script=(function(){var win=this,doc=document,head=doc.getElementsByTagName("head")[0],validBase=/^https?:\/\//,old=win.$script,list={},ids={},delay={},scriptpath,scripts={},s="string",f=false,push="push",domContentLoaded="DOMContentLoaded",readyState="readyState",addEventListener="addEventListener",onreadystatechange="onreadystatechange";function every(ar,fn,i){for(i=0,j=ar.length;i<j;++i){if(!fn(ar[i])){return f}}return 1}function each(ar,fn){every(ar,function(el){return !fn(el)})}if(!doc[readyState]&&doc[addEventListener]){doc[addEventListener](domContentLoaded,function fn(){doc.removeEventListener(domContentLoaded,fn,f);doc[readyState]="complete"},f);doc[readyState]="loading"}function $script(paths,idOrDone,optDone){paths=paths[push]?paths:[paths];var idOrDoneIsDone=idOrDone&&idOrDone.call,done=idOrDoneIsDone?idOrDone:optDone,id=idOrDoneIsDone?paths.join(""):idOrDone,queue=paths.length;function loopFn(item){return item.call?item():list[item]}function callback(){if(!--queue){list[id]=1;done&&done();for(var dset in delay){every(dset.split("|"),loopFn)&&!each(delay[dset],loopFn)&&(delay[dset]=[])}}}setTimeout(function(){each(paths,function(path){if(scripts[path]){id&&(ids[id]=1);return scripts[path]==2&&callback()}scripts[path]=1;id&&(ids[id]=1);create(!validBase.test(path)&&scriptpath?scriptpath+path+".js":path,callback)})},0);return $script}function create(path,fn){var el=doc.createElement("script"),loaded=f;el.onload=el.onerror=el[onreadystatechange]=function(){if((el[readyState]&&!(/^c|loade/.test(el[readyState])))||loaded){return}el.onload=el[onreadystatechange]=null;loaded=1;scripts[path]=2;fn()};el.async=1;el.src=path;head.insertBefore(el,head.firstChild)}$script.get=create;$script.order=function(scripts,id,done){(function callback(s){s=scripts.shift();if(!scripts.length){$script(s,id,done)}else{$script(s,callback)}}())};$script.path=function(p){scriptpath=p};$script.ready=function(deps,ready,req){deps=deps[push]?deps:[deps];var missing=[];!each(deps,function(dep){list[dep]||missing[push](dep)})&&every(deps,function(dep){return list[dep]})?ready():!function(key){delay[key]=delay[key]||[];delay[key][push](ready);req&&req(missing)}(deps.join("|"));return $script};$script.noConflict=function(){win.$script=old;return this};return $script})();var modules=[];for(var i in moduleMap){if(i.indexOf("http://")!=-1){modules.push(i)}else{modules.push(modulesRepository+"/"+i.toLowerCase()+"-"+moduleMap[i].toLowerCase()+".js")}}$script(modules,function(){if(oncomplete){oncomplete()}})}});Crafty.math={abs:function(x){return x<0?-x:x},amountOf:function(checkValue,minValue,maxValue){if(minValue<maxValue){return(checkValue-minValue)/(maxValue-minValue)}else{return(checkValue-maxValue)/(minValue-maxValue)}},clamp:function(value,min,max){if(value>max){return max}else{if(value<min){return min}else{return value}}},degToRad:function(angleInDeg){return angleInDeg*Math.PI/180},distance:function(x1,y1,x2,y2){var squaredDistance=Crafty.math.squaredDistance(x1,y1,x2,y2);return Math.sqrt(parseFloat(squaredDistance))},lerp:function(value1,value2,amount){return value1+(value2-value1)*amount},negate:function(percent){if(Math.random()<percent){return -1}else{return 1}},radToDeg:function(angleInRad){return angleInRad*180/Math.PI},randomElementOfArray:function(array){return array[array.length*Math.random()]},randomInt:function(start,end){return start+Math.floor((1+end-start)*Math.random())},randomNumber:function(start,end){return start+(end-start)*Math.random()},squaredDistance:function(x1,y1,x2,y2){return(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)},withinRange:function(value,min,max){return(value>=min&&value<=max)}};Crafty.math.Vector2D=(function(){function Vector2D(x,y){if(x instanceof Vector2D){this.x=x.x;this.y=x.y}else{if(arguments.length===2){this.x=x;this.y=y}else{if(arguments.length>0){throw"Unexpected number of arguments for Vector2D()"}}}}Vector2D.prototype.x=0;Vector2D.prototype.y=0;Vector2D.prototype.add=function(vecRH){this.x+=vecRH.x;this.y+=vecRH.y;return this};Vector2D.prototype.angleBetween=function(vecRH){return Math.atan2(this.x*vecRH.y-this.y*vecRH.x,this.x*vecRH.x+this.y*vecRH.y)};Vector2D.prototype.angleTo=function(vecRH){return Math.atan2(vecRH.y-this.y,vecRH.x-this.x)};Vector2D.prototype.clone=function(){return new Vector2D(this)};Vector2D.prototype.distance=function(vecRH){return Math.sqrt((vecRH.x-this.x)*(vecRH.x-this.x)+(vecRH.y-this.y)*(vecRH.y-this.y))};Vector2D.prototype.distanceSq=function(vecRH){return(vecRH.x-this.x)*(vecRH.x-this.x)+(vecRH.y-this.y)*(vecRH.y-this.y)};Vector2D.prototype.divide=function(vecRH){this.x/=vecRH.x;this.y/=vecRH.y;return this};Vector2D.prototype.dotProduct=function(vecRH){return this.x*vecRH.x+this.y*vecRH.y};Vector2D.prototype.equals=function(vecRH){return vecRH instanceof Vector2D&&this.x==vecRH.x&&this.y==vecRH.y};Vector2D.prototype.getNormal=function(vecRH){if(vecRH===undefined){return new Vector2D(-this.y,this.x)}return new Vector2D(vecRH.y-this.y,this.x-vecRH.x).normalize()};Vector2D.prototype.isZero=function(){return this.x===0&&this.y===0};Vector2D.prototype.magnitude=function(){return Math.sqrt(this.x*this.x+this.y*this.y)};Vector2D.prototype.magnitudeSq=function(){return this.x*this.x+this.y*this.y};Vector2D.prototype.multiply=function(vecRH){this.x*=vecRH.x;this.y*=vecRH.y;return this};Vector2D.prototype.negate=function(){this.x=-this.x;this.y=-this.y;return this};Vector2D.prototype.normalize=function(){var lng=Math.sqrt(this.x*this.x+this.y*this.y);if(lng===0){this.x=1;this.y=0}else{this.x/=lng;this.y/=lng}return this};Vector2D.prototype.scale=function(scalarX,scalarY){if(scalarY===undefined){scalarY=scalarX}this.x*=scalarX;this.y*=scalarY;return this};Vector2D.prototype.scaleToMagnitude=function(mag){var k=mag/this.magnitude();this.x*=k;this.y*=k;return this};Vector2D.prototype.setValues=function(x,y){if(x instanceof Vector2D){this.x=x.x;this.y=x.y}else{this.x=x;this.y=y}return this};Vector2D.prototype.subtract=function(vecRH){this.x-=vecRH.x;this.y-=vecRH.y;return this};Vector2D.prototype.toString=function(){return"Vector2D("+this.x+", "+this.y+")"};Vector2D.prototype.translate=function(dx,dy){if(dy===undefined){dy=dx}this.x+=dx;this.y+=dy;return this};Vector2D.tripleProduct=function(a,b,c){var ac=a.dotProduct(c);var bc=b.dotProduct(c);return new Crafty.math.Vector2D(b.x*ac-a.x*bc,b.y*ac-a.y*bc)};return Vector2D})();Crafty.math.Matrix2D=(function(){Matrix2D=function(a,b,c,d,e,f){if(a instanceof Matrix2D){this.a=a.a;this.b=a.b;this.c=a.c;this.d=a.d;this.e=a.e;this.f=a.f}else{if(arguments.length===6){this.a=a;this.b=b;this.c=c;this.d=d;this.e=e;this.f=f}else{if(arguments.length>0){throw"Unexpected number of arguments for Matrix2D()"}}}};Matrix2D.prototype.a=1;Matrix2D.prototype.b=0;Matrix2D.prototype.c=0;Matrix2D.prototype.d=1;Matrix2D.prototype.e=0;Matrix2D.prototype.f=0;Matrix2D.prototype.apply=function(vecRH){var tmpX=vecRH.x;vecRH.x=tmpX*this.a+vecRH.y*this.c+this.e;vecRH.y=tmpX*this.b+vecRH.y*this.d+this.f;return vecRH};Matrix2D.prototype.clone=function(){return new Matrix2D(this)};Matrix2D.prototype.combine=function(mtrxRH){var tmp=this.a;this.a=tmp*mtrxRH.a+this.b*mtrxRH.c;this.b=tmp*mtrxRH.b+this.b*mtrxRH.d;tmp=this.c;this.c=tmp*mtrxRH.a+this.d*mtrxRH.c;this.d=tmp*mtrxRH.b+this.d*mtrxRH.d;tmp=this.e;this.e=tmp*mtrxRH.a+this.f*mtrxRH.c+mtrxRH.e;this.f=tmp*mtrxRH.b+this.f*mtrxRH.d+mtrxRH.f;return this};Matrix2D.prototype.equals=function(mtrxRH){return mtrxRH instanceof Matrix2D&&this.a==mtrxRH.a&&this.b==mtrxRH.b&&this.c==mtrxRH.c&&this.d==mtrxRH.d&&this.e==mtrxRH.e&&this.f==mtrxRH.f};Matrix2D.prototype.determinant=function(){return this.a*this.d-this.b*this.c};Matrix2D.prototype.invert=function(){var det=this.determinant();if(det!==0){var old={a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f};this.a=old.d/det;this.b=-old.b/det;this.c=-old.c/det;this.d=old.a/det;this.e=(old.c*old.f-old.e*old.d)/det;this.f=(old.e*old.b-old.a*old.f)/det}return this};Matrix2D.prototype.isIdentity=function(){return this.a===1&&this.b===0&&this.c===0&&this.d===1&&this.e===0&&this.f===0};Matrix2D.prototype.isInvertible=function(){return this.determinant()!==0};Matrix2D.prototype.preRotate=function(rads){var nCos=Math.cos(rads);var nSin=Math.sin(rads);var tmp=this.a;this.a=nCos*tmp-nSin*this.b;this.b=nSin*tmp+nCos*this.b;tmp=this.c;this.c=nCos*tmp-nSin*this.d;this.d=nSin*tmp+nCos*this.d;return this};Matrix2D.prototype.preScale=function(scalarX,scalarY){if(scalarY===undefined){scalarY=scalarX}this.a*=scalarX;this.b*=scalarY;this.c*=scalarX;this.d*=scalarY;return this};Matrix2D.prototype.preTranslate=function(dx,dy){if(typeof dx==="number"){this.e+=dx;this.f+=dy}else{this.e+=dx.x;this.f+=dx.y}return this};Matrix2D.prototype.rotate=function(rads){var nCos=Math.cos(rads);var nSin=Math.sin(rads);var tmp=this.a;this.a=nCos*tmp-nSin*this.b;this.b=nSin*tmp+nCos*this.b;tmp=this.c;this.c=nCos*tmp-nSin*this.d;this.d=nSin*tmp+nCos*this.d;tmp=this.e;this.e=nCos*tmp-nSin*this.f;this.f=nSin*tmp+nCos*this.f;return this};Matrix2D.prototype.scale=function(scalarX,scalarY){if(scalarY===undefined){scalarY=scalarX}this.a*=scalarX;this.b*=scalarY;this.c*=scalarX;this.d*=scalarY;this.e*=scalarX;this.f*=scalarY;return this};Matrix2D.prototype.setValues=function(a,b,c,d,e,f){if(a instanceof Matrix2D){this.a=a.a;this.b=a.b;this.c=a.c;this.d=a.d;this.e=a.e;this.f=a.f}else{this.a=a;this.b=b;this.c=c;this.d=d;this.e=e;this.f=f}return this};Matrix2D.prototype.toString=function(){return"Matrix2D(["+this.a+", "+this.c+", "+this.e+"] ["+this.b+", "+this.d+", "+this.f+"] [0, 0, 1])"};Matrix2D.prototype.translate=function(dx,dy){if(typeof dx==="number"){this.e+=this.a*dx+this.c*dy;this.f+=this.b*dx+this.d*dy}else{this.e+=this.a*dx.x+this.c*dx.y;this.f+=this.b*dx.x+this.d*dx.y}return this};return Matrix2D})();Crafty.c("Delay",{init:function(){this._delays=[];this.bind("EnterFrame",function(){var now=new Date().getTime();for(var index in this._delays){var item=this._delays[index];if(!item.triggered&&item.start+item.delay+item.pause<now){item.triggered=true;item.func.call(this)}}});this.bind("Pause",function(){var now=new Date().getTime();for(var index in this._delays){this._delays[index].pauseBuffer=now}});this.bind("Unpause",function(){var now=new Date().getTime();for(var index in this._delays){var item=this._delays[index];item.pause+=now-item.pauseBuffer}})},delay:function(func,delay){return this._delays.push({start:new Date().getTime(),func:func,delay:delay,triggered:false,pauseBuffer:0,pause:0})}})})(Crafty,window,window.document);

0 comments on commit 504a8f8

Please sign in to comment.
Something went wrong with that request. Please try again.