
(function(){this.Processing=function Processing(aElement,aCode){if(typeof aElement=="string")
aElement=document.getElementById(aElement);var p=buildProcessing(aElement);if(aCode)
p.init(aCode);return p;};function log(){try{console.log.apply(console,arguments);}catch(e){try{opera.postError.apply(opera,arguments);}catch(e){}}}
var parse=Processing.parse=function parse(aCode,p){aCode=aCode.replace(/\/\/ .*\n/g,"\n");aCode=aCode.replace(/([^\s])%([^\s])/g,"$1 % $2");aCode=aCode.replace(/(?:static )?(\w+ )(\w+)\s*(\([^\)]*\)\s*{)/g,function(all,type,name,args){if(name=="if"||name=="for"||name=="while"){return all;}else{return"Processing."+name+" = function "+name+args;}});aCode=aCode.replace(/\.length\(\)/g,".length");aCode=aCode.replace(/([\(,]\s*)(\w+)((?:\[\])+| )\s*(\w+\s*[\),])/g,"$1$4");aCode=aCode.replace(/([\(,]\s*)(\w+)((?:\[\])+| )\s*(\w+\s*[\),])/g,"$1$4");aCode=aCode.replace(/new (\w+)((?:\[([^\]]*)\])+)/g,function(all,name,args){return"new ArrayList("+args.slice(1,-1).split("][").join(", ")+")";});aCode=aCode.replace(/(?:static )?\w+\[\]\s*(\w+)\[?\]?\s*=\s*{.*?};/g,function(all){return all.replace(/{/g,"[").replace(/}/g,"]");});var intFloat=/(\n\s*(?:int|float)(?:\[\])?(?:\s*|[^\(]*?,\s*))([a-z]\w*)(;|,)/i;while(intFloat.test(aCode)){aCode=aCode.replace(new RegExp(intFloat),function(all,type,name,sep){return type+" "+name+" = 0"+sep;});}
aCode=aCode.replace(/(?:static )?(\w+)((?:\[\])+| ) *(\w+)\[?\]?(\s*[=,;])/g,function(all,type,arr,name,sep){if(type=="return")
return all;else
return"var "+name+sep;});aCode=aCode.replace(/=\s*{((.|\s)*?)};/g,function(all,data){return"= ["+data.replace(/{/g,"[").replace(/}/g,"]")+"]";});aCode=aCode.replace(/static\s*{((.|\n)*?)}/g,function(all,init){return init;});aCode=aCode.replace(/super\(/g,"superMethod(");var classes=["int","float","boolean","string"];function ClassReplace(all,name,extend,vars,last){classes.push(name);var static="";vars=vars.replace(/final\s+var\s+(\w+\s*=\s*.*?;)/g,function(all,set){static+=" "+name+"."+set;return"";});return"function "+name+"() {with(this){\n  "+
(extend?"var __self=this;function superMethod(){extendClass(__self,arguments,"+extend+");}\n":"")+
vars.replace(/,\s?/g,";\n  this.").replace(/\b(var |final |public )+\s*/g,"this.").replace(/this.(\w+);/g,"this.$1 = null;")+
(extend?"extendClass(this, "+extend+");\n":"")+"<CLASS "+name+" "+static+">"+(typeof last=="string"?last:name+"(");}
var matchClasses=/(?:public |abstract |static )*class (\w+)\s*(?:extends\s*(\w+)\s*)?{\s*((?:.|\n)*?)\b\1\s*\(/g;var matchNoCon=/(?:public |abstract |static )*class (\w+)\s*(?:extends\s*(\w+)\s*)?{\s*((?:.|\n)*?)(Processing)/g;aCode=aCode.replace(matchClasses,ClassReplace);aCode=aCode.replace(matchNoCon,ClassReplace);var matchClass=/<CLASS (\w+) (.*?)>/,m;while((m=aCode.match(matchClass))){var left=RegExp.leftContext,allRest=RegExp.rightContext,rest=nextBrace(allRest),className=m[1],staticVars=m[2]||"";allRest=allRest.slice(rest.length+1);rest=rest.replace(new RegExp("\\b"+className+"\\(([^\\)]*?)\\)\\s*{","g"),function(all,args){args=args.split(/,\s*?/);if(args[0].match(/^\s*$/))
args.shift();var fn="if ( arguments.length == "+args.length+" ) {\n";for(var i=0;i<args.length;i++){fn+="    var "+args[i]+" = arguments["+i+"];\n";}
return fn;});rest=rest.replace(/(?:public )?Processing.\w+ = function (\w+)\((.*?)\)/g,function(all,name,args){return"ADDMETHOD(this, '"+name+"', function("+args+")";});var matchMethod=/ADDMETHOD([\s\S]*?{)/,mc;var methods="";while((mc=rest.match(matchMethod))){var prev=RegExp.leftContext,allNext=RegExp.rightContext,next=nextBrace(allNext);methods+="addMethod"+mc[1]+next+"});"
rest=prev+allNext.slice(next.length+1);}
rest=methods+rest;aCode=left+rest+"\n}}"+staticVars+allRest;}
aCode=aCode.replace(/Processing.\w+ = function addMethod/g,"addMethod");function nextBrace(right){var rest=right;var position=0;var leftCount=1,rightCount=0;while(leftCount!=rightCount){var nextLeft=rest.indexOf("{");var nextRight=rest.indexOf("}");if(nextLeft<nextRight&&nextLeft!=-1){leftCount++;rest=rest.slice(nextLeft+1);position+=nextLeft+1;}else{rightCount++;rest=rest.slice(nextRight+1);position+=nextRight+1;}}
return right.slice(0,position-1);}
aCode=aCode.replace(/\(int\)/g,"0|");aCode=aCode.replace(new RegExp("\\(("+classes.join("|")+")(\\[\\])?\\)","g"),"");aCode=aCode.replace(/(\d+)f/g,"$1");aCode=aCode.replace(/('[a-zA-Z0-9]')/g,"$1.charCodeAt(0)");aCode=aCode.replace(/#([a-f0-9]{6})/ig,function(m,hex){var num=toNumbers(hex);return"color("+num[0]+","+num[1]+","+num[2]+")";});function toNumbers(str){var ret=[];str.replace(/(..)/g,function(str){ret.push(parseInt(str,16));});return ret;}
return aCode;};function buildProcessing(curElement){var p={};p.PI=Math.PI;p.TWO_PI=2*p.PI;p.HALF_PI=p.PI/2;p.P3D=3;p.CORNER=0;p.RADIUS=1;p.CENTER_RADIUS=1;p.CENTER=2;p.POLYGON=2;p.QUADS=5;p.TRIANGLES=6;p.POINTS=7;p.LINES=8;p.TRIANGLE_STRIP=9;p.TRIANGLE_FAN=4;p.QUAD_STRIP=3;p.CORNERS=10;p.CLOSE=true;p.RGB=1;p.HSB=2;p.LEFT=1;p.CENTER=2;p.RIGHT=3;var curContext=curElement.getContext("2d");var doFill=true;var doStroke=true;var loopStarted=false;var hasBackground=false;var doLoop=true;var looping=0;var curRectMode=p.CORNER;var curEllipseMode=p.CENTER;var inSetup=false;var inDraw=false;var curBackground="rgba(204,204,204,1)";var curFrameRate=1000;var curShape=p.POLYGON;var curShapeCount=0;var curvePoints=[];var curTightness=0;var opacityRange=255;var redRange=255;var greenRange=255;var blueRange=255;var pathOpen=false;var mousePressed=false;var keyPressed=false;var firstX,firstY,secondX,secondY,prevX,prevY;var curColorMode=p.RGB;var curTint=-1;var curTextSize=12;var curTextFont="Arial";var getLoaded=false;var start=(new Date).getTime();p.pmouseX=0;p.pmouseY=0;p.mouseX=0;p.mouseY=0;p.mouseButton=0;p.mouseDragged=undefined;p.mouseMoved=undefined;p.mousePressed=undefined;p.mouseReleased=undefined;p.keyPressed=undefined;p.keyReleased=undefined;p.draw=undefined;p.setup=undefined;p.width=curElement.width-0;p.height=curElement.height-0;p.frameCount=0;p.color=function color(aValue1,aValue2,aValue3,aValue4){var aColor="";if(arguments.length==3){aColor=p.color(aValue1,aValue2,aValue3,opacityRange);}else if(arguments.length==4){var a=aValue4/opacityRange;a=isNaN(a)?1:a;if(curColorMode==p.HSB){var rgb=HSBtoRGB(aValue1,aValue2,aValue3);var r=rgb[0],g=rgb[1],b=rgb[2];}else{var r=getColor(aValue1,redRange);var g=getColor(aValue2,greenRange);var b=getColor(aValue3,blueRange);}
aColor="rgba("+r+","+g+","+b+","+a+")";}else if(typeof aValue1=="string"){aColor=aValue1;if(arguments.length==2){var c=aColor.split(",");c[3]=(aValue2/opacityRange)+")";aColor=c.join(",");}}else if(arguments.length==2){aColor=p.color(aValue1,aValue1,aValue1,aValue2);}else if(typeof aValue1=="number"){aColor=p.color(aValue1,aValue1,aValue1,opacityRange);}else{aColor=p.color(redRange,greenRange,blueRange,opacityRange);}
function HSBtoRGB(h,s,b){h=(h/redRange)*100;s=(s/greenRange)*100;b=(b/blueRange)*100;if(s==0){return[b,b,b];}else{var hue=h%360;var f=hue%60;var br=Math.round(b/100*255);var p=Math.round((b*(100-s))/10000*255);var q=Math.round((b*(6000-s*f))/600000*255);var t=Math.round((b*(6000-s*(60-f)))/600000*255);switch(Math.floor(hue/60)){case 0:return[br,t,p];case 1:return[q,br,p];case 2:return[p,br,t];case 3:return[p,q,br];case 4:return[t,p,br];case 5:return[br,p,q];}}}
function getColor(aValue,range){return Math.round(255*(aValue/range));}
return aColor;}
p.nf=function(num,pad){var str=""+num;while(pad-str.length)
str="0"+str;return str;};p.AniSprite=function(prefix,frames){this.images=[];this.pos=0;for(var i=0;i<frames;i++){this.images.push(prefix+p.nf(i,(""+frames).length)+".gif");}
this.display=function(x,y){p.image(this.images[this.pos],x,y);if(++this.pos>=frames)
this.pos=0;};this.getWidth=function(){return getImage(this.images[0]).width;};this.getHeight=function(){return getImage(this.images[0]).height;};};function buildImageObject(obj){var pixels=obj.data;var data=p.createImage(obj.width,obj.height);if(data.__defineGetter__&&data.__lookupGetter__&&!data.__lookupGetter__("pixels")){var pixelsDone;data.__defineGetter__("pixels",function(){if(pixelsDone)
return pixelsDone;pixelsDone=[];for(var i=0;i<pixels.length;i+=4){pixelsDone.push(p.color(pixels[i],pixels[i+1],pixels[i+2],pixels[i+3]));}
return pixelsDone;});}else{data.pixels=[];for(var i=0;i<pixels.length;i+=4){data.pixels.push(p.color(pixels[i],pixels[i+1],pixels[i+2],pixels[i+3]));}}
return data;}
p.createImage=function createImage(w,h,mode){var data={};data.width=w;data.height=h;data.data=[];if(curContext.createImageData){data=curContext.createImageData(w,h);}
data.pixels=new Array(w*h);data.get=function(x,y){return this.pixels[w*y+x];};data._mask=null;data.mask=function(img){this._mask=img;};data.loadPixels=function(){};data.updatePixels=function(){};return data;};p.createGraphics=function createGraphics(w,h){var canvas=document.createElement("canvas");var ret=buildProcessing(canvas);ret.size(w,h);ret.canvas=canvas;return ret;};p.beginDraw=function beginDraw(){};p.endDraw=function endDraw(){};p.tint=function tint(rgb,a){curTint=a;};function getImage(img){if(typeof img=="string"){return document.getElementById(img);}
if(img.img||img.canvas){return img.img||img.canvas;}
for(var i=0,l=img.pixels.length;i<l;i++){var pos=i*4;var c=(img.pixels[i]||"rgba(0,0,0,1)").slice(5,-1).split(",");img.data[pos]=parseInt(c[0]);img.data[pos+1]=parseInt(c[1]);img.data[pos+2]=parseInt(c[2]);img.data[pos+3]=parseFloat(c[3])*100;}
var canvas=document.createElement("canvas")
canvas.width=img.width;canvas.height=img.height;var context=canvas.getContext("2d");context.putImageData(img,0,0);img.canvas=canvas;return canvas;}
p.image=function image(img,x,y,w,h){x=x||0;y=y||0;var obj=getImage(img);if(curTint>=0){var oldAlpha=curContext.globalAlpha;curContext.globalAlpha=curTint/opacityRange;}
if(arguments.length==3){curContext.drawImage(obj,x,y);}else{curContext.drawImage(obj,x,y,w,h);}
if(curTint>=0){curContext.globalAlpha=oldAlpha;}
if(img._mask){var oldComposite=curContext.globalCompositeOperation;curContext.globalCompositeOperation="darker";p.image(img._mask,x,y);curContext.globalCompositeOperation=oldComposite;}};p.exit=function exit(){clearInterval(looping);};p.save=function save(file){};p.loadImage=function loadImage(file){var img=document.getElementById(file);if(!img)
return;var h=img.height,w=img.width;var canvas=document.createElement("canvas");canvas.width=w;canvas.height=h;var context=canvas.getContext("2d");context.drawImage(img,0,0);var data=buildImageObject(context.getImageData(0,0,w,h));data.img=img;return data;};p.loadFont=function loadFont(name){return{name:name,width:function(str){if(curContext.mozMeasureText)
return curContext.mozMeasureText(typeof str=="number"?String.fromCharCode(str):str)/curTextSize;else
return 0;}};};p.textFont=function textFont(name,size){curTextFont=name;p.textSize(size);};p.textSize=function textSize(size){if(size){curTextSize=size;}};p.textAlign=function textAlign(){};p.text=function text(str,x,y){if(str&&curContext.mozDrawText){curContext.save();curContext.mozTextStyle=curTextSize+"px "+curTextFont.name;curContext.translate(x,y);curContext.mozDrawText(typeof str=="number"?String.fromCharCode(str):str);curContext.restore();}};p.char=function char(key){return key;};p.println=function println(){};p.map=function map(value,istart,istop,ostart,ostop){return ostart+(ostop-ostart)*((value-istart)/(istop-istart));};String.prototype.replaceAll=function(re,replace){return this.replace(new RegExp(re,"g"),replace);};p.Point=function Point(x,y){this.x=x;this.y=y;this.copy=function(){return new Point(x,y);}};p.Random=function(){var haveNextNextGaussian=false;var nextNextGaussian;this.nextGaussian=function(){if(haveNextNextGaussian){haveNextNextGaussian=false;return nextNextGaussian;}else{var v1,v2,s;do{v1=2*p.random(1)-1;v2=2*p.random(1)-1;s=v1*v1+v2*v2;}while(s>=1||s==0);var multiplier=Math.sqrt(-2*Math.log(s)/s);nextNextGaussian=v2*multiplier;haveNextNextGaussian=true;return v1*multiplier;}};};p.ArrayList=function ArrayList(size,size2,size3){var array=new Array(0|size);if(size2){for(var i=0;i<size;i++){array[i]=[];for(var j=0;j<size2;j++){var a=array[i][j]=size3?new Array(size3):0;for(var k=0;k<size3;k++){a[k]=0;}}}}else{for(var i=0;i<size;i++){array[i]=0;}}
array.size=function(){return this.length;};array.get=function(i){return this[i];};array.remove=function(i){return this.splice(i,1);};array.add=function(item){return this.push(item);};array.clone=function(){var a=new ArrayList(size);for(var i=0;i<size;i++){a[i]=this[i];}
return a;};array.isEmpty=function(){return!this.length;};array.clear=function(){this.length=0;};return array;};p.colorMode=function colorMode(mode,range1,range2,range3,range4){curColorMode=mode;if(arguments.length>=4){redRange=range1;greenRange=range2;blueRange=range3;}
if(arguments.length==5){opacityRange=range4;}
if(arguments.length==2){p.colorMode(mode,range1,range1,range1,range1);}};p.beginShape=function beginShape(type){curShape=type;curShapeCount=0;curvePoints=[];};p.endShape=function endShape(close){if(curShapeCount!=0){if(close||doFill)
curContext.lineTo(firstX,firstY);if(doFill)
curContext.fill();if(doStroke)
curContext.stroke();curContext.closePath();curShapeCount=0;pathOpen=false;}
if(pathOpen){if(doFill)
curContext.fill();if(doStroke)
curContext.stroke();curContext.closePath();curShapeCount=0;pathOpen=false;}};p.vertex=function vertex(x,y,x2,y2,x3,y3){if(curShapeCount==0&&curShape!=p.POINTS){pathOpen=true;curContext.beginPath();curContext.moveTo(x,y);firstX=x;firstY=y;}else{if(curShape==p.POINTS){p.point(x,y);}else if(arguments.length==2){if(curShape!=p.QUAD_STRIP||curShapeCount!=2)
curContext.lineTo(x,y);if(curShape==p.TRIANGLE_STRIP){if(curShapeCount==2){p.endShape(p.CLOSE);pathOpen=true;curContext.beginPath();curContext.moveTo(prevX,prevY);curContext.lineTo(x,y);curShapeCount=1;}
firstX=prevX;firstY=prevY;}
if(curShape==p.TRIANGLE_FAN&&curShapeCount==2){p.endShape(p.CLOSE);pathOpen=true;curContext.beginPath();curContext.moveTo(firstX,firstY);curContext.lineTo(x,y);curShapeCount=1;}
if(curShape==p.QUAD_STRIP&&curShapeCount==3){curContext.lineTo(prevX,prevY);p.endShape(p.CLOSE);pathOpen=true;curContext.beginPath();curContext.moveTo(prevX,prevY);curContext.lineTo(x,y);curShapeCount=1;}
if(curShape==p.QUAD_STRIP){firstX=secondX;firstY=secondY;secondX=prevX;secondY=prevY;}}else if(arguments.length==4){if(curShapeCount>1){curContext.moveTo(prevX,prevY);curContext.quadraticCurveTo(firstX,firstY,x,y);curShapeCount=1;}}else if(arguments.length==6){curContext.bezierCurveTo(x,y,x2,y2,x3,y3);curShapeCount=-1;}}
prevX=x;prevY=y;curShapeCount++;if(curShape==p.LINES&&curShapeCount==2||(curShape==p.TRIANGLES)&&curShapeCount==3||(curShape==p.QUADS)&&curShapeCount==4){p.endShape(p.CLOSE);}};p.curveVertex=function(x,y,x2,y2){if(curvePoints.length<3){curvePoints.push([x,y]);}else{var b=[],s=1-curTightness;curvePoints.push([x,y]);b[0]=[curvePoints[1][0],curvePoints[1][1]];b[1]=[curvePoints[1][0]+(s*curvePoints[2][0]-s*curvePoints[0][0])/6,curvePoints[1][1]+(s*curvePoints[2][1]-s*curvePoints[0][1])/6];b[2]=[curvePoints[2][0]+(s*curvePoints[1][0]-s*curvePoints[3][0])/6,curvePoints[2][1]+(s*curvePoints[1][1]-s*curvePoints[3][1])/6];b[3]=[curvePoints[2][0],curvePoints[2][1]];if(!pathOpen){p.vertex(b[0][0],b[0][1]);}else{curShapeCount=1;}
p.vertex(b[1][0],b[1][1],b[2][0],b[2][1],b[3][0],b[3][1]);curvePoints.shift();}};p.curveTightness=function(tightness){curTightness=tightness;};p.bezierVertex=p.vertex;p.rectMode=function rectMode(aRectMode){curRectMode=aRectMode;};p.imageMode=function(){};p.ellipseMode=function ellipseMode(aEllipseMode){curEllipseMode=aEllipseMode;};p.dist=function dist(x1,y1,x2,y2){return Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));};p.year=function year(){return(new Date).getYear()+1900;};p.month=function month(){return(new Date).getMonth();};p.day=function day(){return(new Date).getDay();};p.hour=function hour(){return(new Date).getHours();};p.minute=function minute(){return(new Date).getMinutes();};p.second=function second(){return(new Date).getSeconds();};p.millis=function millis(){return(new Date).getTime()-start;};p.ortho=function ortho(){};p.translate=function translate(x,y){curContext.translate(x,y);};p.scale=function scale(x,y){curContext.scale(x,y||x);};p.rotate=function rotate(aAngle){curContext.rotate(aAngle);};p.pushMatrix=function pushMatrix(){curContext.save();};p.popMatrix=function popMatrix(){curContext.restore();};p.redraw=function redraw(){if(hasBackground){p.background();}
p.frameCount++;inDraw=true;p.pushMatrix();p.draw();p.popMatrix();inDraw=false;};p.loop=function loop(){if(loopStarted)
return;looping=setInterval(function(){try{p.redraw();}
catch(e){clearInterval(looping);throw e;}},1000/curFrameRate);loopStarted=true;};p.frameRate=function frameRate(aRate){curFrameRate=aRate;};p.background=function background(img){if(arguments.length){if(img&&img.img){curBackground=img;}else{curBackground=p.color.apply(this,arguments);}}
if(curBackground.img){p.image(curBackground,0,0);}else{var oldFill=curContext.fillStyle;curContext.fillStyle=curBackground+"";curContext.fillRect(0,0,p.width,p.height);curContext.fillStyle=oldFill;}};p.sq=function sq(aNumber){return aNumber*aNumber;};p.sqrt=function sqrt(aNumber){return Math.sqrt(aNumber);};p.int=function int(aNumber){return Math.floor(aNumber);};p.min=function min(aNumber,aNumber2){return Math.min(aNumber,aNumber2);};p.max=function max(aNumber,aNumber2){return Math.max(aNumber,aNumber2);};p.ceil=function ceil(aNumber){return Math.ceil(aNumber);};p.floor=function floor(aNumber){return Math.floor(aNumber);};p.float=function float(aNumber){return typeof aNumber=="string"?p.float(aNumber.charCodeAt(0)):parseFloat(aNumber);};p.byte=function byte(aNumber){return aNumber||0;};p.random=function random(aMin,aMax){return arguments.length==2?aMin+(Math.random()*(aMax-aMin)):Math.random()*aMin;};p.noise=function(x,y,z){return arguments.length>=2?PerlinNoise_2D(x,y):PerlinNoise_2D(x,x);};function Noise(x,y){var n=x+y*57;n=(n<<13)^n;return Math.abs(1.0-(((n*((n*n*15731)+789221)+1376312589)&0x7fffffff)/1073741824.0));};function SmoothedNoise(x,y){var corners=(Noise(x-1,y-1)+Noise(x+1,y-1)+Noise(x-1,y+1)+Noise(x+1,y+1))/16;var sides=(Noise(x-1,y)+Noise(x+1,y)+Noise(x,y-1)+Noise(x,y+1))/8;var center=Noise(x,y)/4;return corners+sides+center;};function InterpolatedNoise(x,y){var integer_X=Math.floor(x);var fractional_X=x-integer_X;var integer_Y=Math.floor(y);var fractional_Y=y-integer_Y;var v1=SmoothedNoise(integer_X,integer_Y);var v2=SmoothedNoise(integer_X+1,integer_Y);var v3=SmoothedNoise(integer_X,integer_Y+1);var v4=SmoothedNoise(integer_X+1,integer_Y+1);var i1=Interpolate(v1,v2,fractional_X);var i2=Interpolate(v3,v4,fractional_X);return Interpolate(i1,i2,fractional_Y);}
function PerlinNoise_2D(x,y){var total=0;var p=0.25;var n=3;for(var i=0;i<=n;i++){var frequency=Math.pow(2,i);var amplitude=Math.pow(p,i);total=total+InterpolatedNoise(x*frequency,y*frequency)*amplitude;}
return total;}
function Interpolate(a,b,x){var ft=x*p.PI;var f=(1-p.cos(ft))*.5;return a*(1-f)+b*f;}
p.red=function(aColor){return parseInt(aColor.slice(5));};p.green=function(aColor){return parseInt(aColor.split(",")[1]);};p.blue=function(aColor){return parseInt(aColor.split(",")[2]);};p.alpha=function(aColor){return parseInt(aColor.split(",")[3]);};p.abs=function abs(aNumber){return Math.abs(aNumber);};p.cos=function cos(aNumber){return Math.cos(aNumber);};p.sin=function sin(aNumber){return Math.sin(aNumber);};p.pow=function pow(aNumber,aExponent){return Math.pow(aNumber,aExponent);};p.constrain=function constrain(aNumber,aMin,aMax){return Math.min(Math.max(aNumber,aMin),aMax);};p.sqrt=function sqrt(aNumber){return Math.sqrt(aNumber);};p.atan2=function atan2(aNumber,aNumber2){return Math.atan2(aNumber,aNumber2);};p.radians=function radians(aAngle){return(aAngle/180)*p.PI;};p.size=function size(aWidth,aHeight){var fillStyle=curContext.fillStyle;var strokeStyle=curContext.strokeStyle;curElement.width=p.width=aWidth;curElement.height=p.height=aHeight;curContext.fillStyle=fillStyle;curContext.strokeStyle=strokeStyle;};p.noStroke=function noStroke(){doStroke=false;};p.noFill=function noFill(){doFill=false;};p.smooth=function smooth(){};p.noLoop=function noLoop(){doLoop=false;};p.fill=function fill(){doFill=true;curContext.fillStyle=p.color.apply(this,arguments);};p.stroke=function stroke(){doStroke=true;curContext.strokeStyle=p.color.apply(this,arguments);};p.strokeWeight=function strokeWeight(w){curContext.lineWidth=w;};p.point=function point(x,y){var oldFill=curContext.fillStyle;curContext.fillStyle=curContext.strokeStyle;curContext.fillRect(Math.round(x),Math.round(y),1,1);curContext.fillStyle=oldFill;};p.get=function get(x,y){if(arguments.length==0){var c=p.createGraphics(p.width,p.height);c.image(curContext,0,0);return c;}
if(!getLoaded){getLoaded=buildImageObject(curContext.getImageData(0,0,p.width,p.height));}
return getLoaded.get(x,y);};p.set=function set(x,y,obj){if(obj&&obj.img){p.image(obj,x,y);}else{var oldFill=curContext.fillStyle;var color=obj;curContext.fillStyle=color;curContext.fillRect(Math.round(x),Math.round(y),1,1);curContext.fillStyle=oldFill;}};p.arc=function arc(x,y,width,height,start,stop){if(width<=0)
return;if(curEllipseMode==p.CORNER){x+=width/2;y+=height/2;}
curContext.beginPath();curContext.moveTo(x,y);curContext.arc(x,y,curEllipseMode==p.CENTER_RADIUS?width:width/2,start,stop,false);if(doFill)
curContext.fill();if(doStroke)
curContext.stroke();curContext.closePath();};p.line=function line(x1,y1,x2,y2){curContext.lineCap="round";curContext.beginPath();curContext.moveTo(x1||0,y1||0);curContext.lineTo(x2||0,y2||0);curContext.stroke();curContext.closePath();};p.bezier=function bezier(x1,y1,x2,y2,x3,y3,x4,y4){curContext.lineCap="butt";curContext.beginPath();curContext.moveTo(x1,y1);curContext.bezierCurveTo(x2,y2,x3,y3,x4,y4);curContext.stroke();curContext.closePath();};p.triangle=function triangle(x1,y1,x2,y2,x3,y3){p.beginShape();p.vertex(x1,y1);p.vertex(x2,y2);p.vertex(x3,y3);p.endShape();};p.quad=function quad(x1,y1,x2,y2,x3,y3,x4,y4){p.beginShape();p.vertex(x1,y1);p.vertex(x2,y2);p.vertex(x3,y3);p.vertex(x4,y4);p.endShape();};p.rect=function rect(x,y,width,height){if(width==0&&height==0)
return;curContext.beginPath();var offsetStart=0;var offsetEnd=0;if(curRectMode==p.CORNERS){width-=x;height-=y;}
if(curRectMode==p.RADIUS){width*=2;height*=2;}
if(curRectMode==p.CENTER||curRectMode==p.RADIUS){x-=width/2;y-=height/2;}
curContext.rect(Math.round(x)-offsetStart,Math.round(y)-offsetStart,Math.round(width)+offsetEnd,Math.round(height)+offsetEnd);if(doFill)
curContext.fill();if(doStroke)
curContext.stroke();curContext.closePath();};p.ellipse=function ellipse(x,y,width,height){x=x||0;y=y||0;if(width<=0&&height<=0)
return;curContext.beginPath();if(curEllipseMode==p.RADIUS){width*=2;height*=2;}
var offsetStart=0;if(width==height)
curContext.arc(x-offsetStart,y-offsetStart,width/2,0,Math.PI*2,false);if(doFill)
curContext.fill();if(doStroke)
curContext.stroke();curContext.closePath();};p.link=function(href,target){window.location=href;};p.loadPixels=function(){p.pixels=buildImageObject(curContext.getImageData(0,0,p.width,p.height)).pixels;};p.updatePixels=function(){var colors=/(\d+),(\d+),(\d+),(\d+)/;var pixels={};pixels.width=p.width;pixels.height=p.height;pixels.data=[];if(curContext.createImageData){pixels=curContext.createImageData(p.width,p.height);}
var data=pixels.data;var pos=0;for(var i=0,l=p.pixels.length;i<l;i++){var c=(p.pixels[i]||"rgba(0,0,0,1)").match(colors);data[pos]=parseInt(c[1]);data[pos+1]=parseInt(c[2]);data[pos+2]=parseInt(c[3]);data[pos+3]=parseFloat(c[4])*100;pos+=4;}
curContext.putImageData(pixels,0,0);};p.extendClass=function extendClass(obj,args,fn){if(arguments.length==3){fn.apply(obj,args);}else{args.call(obj);}};p.addMethod=function addMethod(object,name,fn){if(object[name]){var args=fn.length;var oldfn=object[name];object[name]=function(){if(arguments.length==args)
return fn.apply(this,arguments);else
return oldfn.apply(this,arguments);};}else{object[name]=fn;}};p.init=function init(code){p.stroke(0);p.fill(255);curContext.translate(0.5,0.5);if(code){(function(Processing){with(p){eval(parse(code,p));}})(p);}
if(p.setup){inSetup=true;p.setup();}
inSetup=false;if(p.draw){if(!doLoop){p.redraw();}else{p.loop();}}
attach(curElement,"mousemove",function(e){var scrollX=window.scrollX!=null?window.scrollX:window.pageXOffset;var scrollY=window.scrollY!=null?window.scrollY:window.pageYOffset;p.pmouseX=p.mouseX;p.pmouseY=p.mouseY;p.mouseX=e.clientX-curElement.offsetLeft+scrollX;p.mouseY=e.clientY-curElement.offsetTop+scrollY;if(p.mouseMoved){p.mouseMoved();}
if(mousePressed&&p.mouseDragged){p.mouseDragged();}});attach(curElement,"mousedown",function(e){mousePressed=true;p.mouseButton=e.which;if(typeof p.mousePressed=="function"){p.mousePressed();}else{p.mousePressed=true;}});attach(curElement,"contextmenu",function(e){e.preventDefault();e.stopPropagation();});attach(curElement,"mouseup",function(e){mousePressed=false;if(typeof p.mousePressed!="function"){p.mousePressed=false;}
if(p.mouseReleased){p.mouseReleased();}});attach(document,"keydown",function(e){keyPressed=true;p.key=e.keyCode+32;if(e.shiftKey){p.key=String.fromCharCode(p.key).toUpperCase().charCodeAt(0);}
if(typeof p.keyPressed=="function"){p.keyPressed();}else{p.keyPressed=true;}});attach(document,"keyup",function(e){keyPressed=false;if(typeof p.keyPressed!="function"){p.keyPressed=false;}
if(p.keyReleased){p.keyReleased();}});function attach(elem,type,fn){if(elem.addEventListener)
elem.addEventListener(type,fn,false);else
elem.attachEvent("on"+type,fn);}};return p;}})();var GLOBAL_PROCESSING;function set_canvas(id){var canvas=document.getElementById(id);GLOBAL_PROCESSING=Processing(canvas);}
function size(height,width){GLOBAL_PROCESSING.size(height,width);}
function stroke(color){GLOBAL_PROCESSING.stroke(color);}
function background(color){GLOBAL_PROCESSING.background(color);}
function line(x1,y1,x2,y2){GLOBAL_PROCESSING.line(x1,y1,x2,y2);}
var draw=function(){};function frameRate(rate){var interval=1000.00/rate;setInterval(draw,interval);}
function height(){return GLOBAL_PROCESSING.height;}
function width(){return GLOBAL_PROCESSING.width;}
function rect(x,y,width,height){return GLOBAL_PROCESSING.rect(x,y,width,height);}
function ellipse(x,y,width,height){return GLOBAL_PROCESSING.ellipse(x,y,width,height);}
function triangle(x1,y1,x2,y2,x3,y3){return GLOBAL_PROCESSING.triangle(x1,y1,x2,y2,x3,y3);}
function fill(color){return GLOBAL_PROCESSING.fill(color);}
var color=function(r,g,b,a){if(!a)
return"rgb("+r+","+g+","+b+")";else
return"rgba("+r+","+g+","+b+","+a+")";};function translate(width,height){return GLOBAL_PROCESSING.translate(width,height);}
function noFill(){return GLOBAL_PROCESSING.noFill();}
function noStroke(){return GLOBAL_PROCESSING.noStroke();}
function mouse_pos(){return{x:GLOBAL_PROCESSING.mouseX,y:GLOBAL_PROCESSING.mouseY};}
function previous_mouse_pos(){return{x:GLOBAL_PROCESSING.pmouseX,y:GLOBAL_PROCESSING.pmouseY};}
function mousePressed(func){GLOBAL_PROCESSING.mousePressed=func;}
function mouseReleased(func){GLOBAL_PROCESSING.mouseReleased=func;}
function mouseMoved(func){GLOBAL_PROCESSING.mouseMoved=func;}
function mouseReleased(func){GLOBAL_PROCESSING.mouseDragged=func;}
function millis(){return GLOBAL_PROCESSING.millis();}
function initProcessing(){GLOBAL_PROCESSING.init();}
(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();var CreepWaveController=function(){var cwc=new Object();Object.extend(cwc,InertDrawable);cwc.delay=25000;cwc.last=millis()-20000;cwc.wave=1;cwc.spawn_wave=function(bonus){WIDGETS.wave.innerHTML=this.wave;var settings={wave:this.wave,bonus:bonus};var mixins=[];var n=Math.random();if(n<0.1)
mixins.push(WaterAdverseMixin);else if(n<0.2)
mixins.push(WaterLovingMixin);else if(n<0.3)
mixins.push(MountainAdverseMixin);else if(n<0.4)
mixins.push(MountainLovingMixin);else if(n<0.5)
mixins.push(ImmuneMixin);else if(n<0.6)
mixins.push(FlyingMixin);if(this.wave%15==0){mixins.push(BossMixin);settings.remaining=1;}
else if(this.wave%5==0)mixins.push(StrongMixin);else if(this.wave%3==0)mixins.push(QuickMixin);create_creep_wave_with_mixins(settings,mixins);this.wave++;cwc.last=SET.now;};cwc.update=function(){if(SET.now-cwc.last>cwc.delay){this.spawn_wave();}}
assign_to_depth(cwc,SET.system_render_level);return cwc;};var CreepWave=function(settings){var cw=new Object();Object.extend(cw,InertDrawable);cw.remaining=20;cw.wave=1;cw.last=0;cw.interval=1000;Object.extend(cw,settings);cw.spawn_creep=function(){Creep(this.wave);};cw.spawn=function(){this.remaining--;this.spawn_creep();this.last=SET.now;if(this.remaining<1){this.is_dead=function(){return true;};if(this.bonus)
SET.score+=this.bonus;}}
cw.update=function(){if(SET.now-this.last>this.interval){this.spawn();}}
assign_to_depth(cw,SET.system_render_level);SET.creep_variety="Normal Creeps";return cw;};var create_creep_wave_with_mixins=function(settings,mixins){if(!mixins)mixins=[];var cw=CreepWave(settings);cw.knows_creep_variety=false;cw.spawn_creep=function(){var c=Creep(cw.wave);mixins.forEach(function(mixin){mixin(c);});if(cw.knows_creep_variety==false){SET.creep_variety=c.creep_type+"s";cw.knows_creep_variety=true;}}
return cw;}
var NeutralTerrain=function(gx,gy){var terrain_color=color(200,200,200);var t=Square(gx,gy,terrain_color);t.type="neutral";t.tower_range_modifier=1.0;t.tower_damage_modifier=1.0;t.tower_frequency_modifier=1.0;return t;}
var WaterTerrain=function(gx,gy){var t=NeutralTerrain(gx,gy);t.color=color(78,150,236);t.type="water";return t;}
var MountainTerrain=function(gx,gy){var t=NeutralTerrain(gx,gy);t.color=color(228,51,51);t.type="mountain";t.tower_range_modifier=1.25;return t;}
var PowerPlantTerrain=function(gx,gy){var t=NeutralTerrain(gx,gy);t.color=color(189,194,78);t.type="power plant";t.tower_damage_modifier=2.0;return t;}
var populate_terrains=function(){var p_mountains=SET.terrain_percent_mountains||0.05;var p_water=SET.terrain_percent_water||0.1;var p_power_plant=SET.terrain_percent_power_plant||0.01;var range_mountain=p_mountains;var range_water=p_mountains+p_water;var range_power_plant=p_power_plant+range_water;var entrance=SET.entrance;var exit=SET.exit;var gwidth=SET.gwidth;var gheight=SET.gheight;for(var gy=0;gy<gheight;gy++){if(gy!=entrance.gy){NeutralTerrain(0,gy);}
if(gy!=exit.gy){NeutralTerrain(gwidth-1,gy);}}
for(var gx=1;gx<gwidth-1;gx++){for(var gy=0;gy<gheight;gy++){var n=Math.random();if(n<=range_mountain)
MountainTerrain(gx,gy);else if(n<=range_water)
WaterTerrain(gx,gy);else if(n<=range_power_plant)
PowerPlantTerrain(gx,gy);else
NeutralTerrain(gx,gy);}}}
var random=function(max){return Math.floor(Math.random()*(max+1));};var calc_path=function(x1,y1,x2,y2,speed){var ac=y2-y1;var bc=x2-x1;var ab=Math.sqrt(Math.pow(ac,2)+Math.pow(bc,2));var de=(1.0*speed*ac)/ab;var be=(1.0*speed*bc)/ab;return{y:de,x:be};};var dist=function(x1,y1,x2,y2){var ac=y2-y1;var bc=x2-x1;return Math.sqrt(Math.pow(ac,2)+Math.pow(bc,2));}
var grid_to_pixel=function(gx,gy){if(gy==undefined){gy=gx.gy;gx=gx.gx;}
return{x:gx*SET.pixels_per_square,y:gy*SET.pixels_per_square};};var pixel_to_grid=function(x,y){if(y==undefined){y=x.y;x=x.x;}
var grid_x=Math.floor(x/SET.pixels_per_square);var grid_y=Math.floor(y/SET.pixels_per_square);return{gx:grid_x,gy:grid_y};};var center_of_square=function(gx,gy){if(gy==undefined){gy=gx.gy;gx=gx.gx;}
var coords=grid_to_pixel(gx,gy);return{x:coords.x+SET.half_pixels_per_square,y:coords.y+SET.half_pixels_per_square};};var draw_square_in_grid=function(gx,gy){var pos=grid_to_pixel(gx,gy);rect(pos.x,pos.y,SET.pixels_per_square,SET.pixels_per_square);}
var draw_circle_in_grid=function(gx,gy){var pos=grid_to_pixel(gx,gy);var h=SET.half_pixels_per_square;var l=SET.pixels_per_square;ellipse(pos.x+h,pos.y+h,l,l);};var can_build_here=function(gx,gy){if(get_tower_at(gx,gy)!=false)return false;if((gx==SET.entrance.gx)&&(gy==SET.entrance.gy))return false;if((gx==SET.exit.gx)&&(gy==SET.exit.gy))return false;return true;};var get_tower_at=function(gx,gy){var cached=SET.grid_cache_at(gx,gy);if(cached.tower)return cached.tower;var towers=SET.rendering_groups[SET.tower_render_level];for(var i=0;i<towers.length;i++){var tower=towers[i];if(tower.gx==gx&&tower.gy==gy){cached.tower=tower;return tower;}}
return false;};var get_terrain_at=function(gx,gy){var cached=SET.grid_cache_at(gx,gy);if(cached.terrain)return cached.terrain;var squares=SET.rendering_groups[SET.square_render_level];for(var i=0;i<squares.length;i++){var square=squares[i];if(square.gx==gx&&square.gy==gy){cached.terrain=square;return square;}}
return;}
var get_creep_nearest=function(x,y,sensitivity){if(!sensitivity)sensitivity=10;var creeps=SET.rendering_groups[SET.creep_render_level];var len=creeps.length;var nearest_creep;var distance=sensitivity;for(var i=0;i<len;i++){var creep=creeps[i];var d=dist(x,y,creep.x,creep.y);if(d<distance){distance=d;nearest_creep=creep;}}
return(distance<sensitivity)?nearest_creep:undefined;}
Object.extend=function(destination,source){for(var property in source){destination[property]=source[property];}
return destination;};var pp=function(obj,depth){if(depth==undefined)depth=4;depth-=1;if(depth<=0)
return''+obj;if(obj instanceof Array){var str="[";obj.forEach(function(i){str+=pp(i,depth)+", ";});return str+"]";}
if(obj instanceof String)
return'"'+str+'"';if(obj instanceof Object){var str="{";for(prop in obj){if(prop=="ancestor")
depth=0;str+=pp(prop,depth)+":"+pp(obj[prop],depth)+", ";}
return str+"}";}
return''+obj;}
var log=function(label,thing){if(thing==undefined)
$('#log').append(label+"<br/>");else
$('#log').append(label+": "+pp(thing)+"<br/>");}
Array.prototype.equals=function(testArr){if(this.length!=testArr.length)return false;for(var i=0;i<testArr.length;i++){if(this[i].equals){if(!this[i].equals(testArr[i]))return false;}
if(this[i]!=testArr[i])return false;}
return true;}
var insert_sorted=function(array,value,sortKey){var vkey=sortKey(value);var min=0;var max=array.length;var mid=-1;while(true){if(max<=min){break;}
mid=Math.floor((max+min)/2);if(mid>=array.length||mid<0){log("outofbounds in insert sorted");break;}
if(vkey<=sortKey(array[mid]))
max=mid-1;else
min=mid+1;}
mid=Math.floor((max+min)/2);if(array[mid])
if(vkey>sortKey(array[mid]))
mid+=1;mid=Math.max(0,mid);var result=array.slice(0,mid).concat([value]).concat(array.slice(mid))
return result;}
var move_towards=function(obj,x,y,tx,ty,speed){var path=calc_path(x,y,tx,ty,speed);obj.x+=path.x;obj.y+=path.y;obj.x=Math.max(0,Math.min(SET.width,obj.x));obj.y=Math.max(0,Math.min(SET.height,obj.y));}
var CreepHpUpdater=function(creep){var chp=new Object();Object.extend(chp,InertDrawable);chp.update=function(){WIDGETS.creep_hp.innerHTML=creep.hp;}
chp.should_die=false;chp.is_dead=function(){if(chp.should_die||!creep||!SET.state||SET.state.name()!="CreepSelectMode"||creep.is_dead()){unselect();if(chp.kz)
chp.kz.is_dead=function(){return true;};return true;}
else return false;}
chp.draw=function(){if(chp.kz)chp.kz.is_dead=function(){return true;};chp.kz=KillZone(creep.x,creep.y,15);}
assign_to_depth(chp,SET.system_render_level);return chp;}
var FlyingMixin=function(creep){creep.creep_type="Flying "+creep.creep_type;creep.terrain['water']=1.0;creep.terrain['mountain']=1.0;creep.ignores_towers=true;return creep;}
var WaterAdverseMixin=function(creep){creep.terrain['water']=0.25;creep.creep_type="Water-Hating "+creep.creep_type;return creep;}
var WaterLovingMixin=function(creep){creep.terrain['water']=2.0;creep.creep_type="Water-Loving "+creep.creep_type;return creep;}
var MountainAdverseMixin=function(creep){creep.terrain['mountain']=0.25;creep.creep_type="Mountain-Hating "+creep.creep_type;return creep;}
var MountainLovingMixin=function(creep){creep.terrain['mountain']=1.25;creep.creep_type="Mountain-Loving "+creep.creep_type;return creep;}
var ImmuneMixin=function(creep){creep.terrain['mountain']=1.0;creep.terrain['neutral']=1.0;creep.terrain['water']=1.0;creep.terrain['mountain']=1.0;creep.terrain['power plant']=1.0;creep.creep_type="Immune "+creep.creep_type;return creep;}
var StrongMixin=function(creep){creep.color=color(0,255,255);creep.size=creep.size*1.3;creep.hp=Math.floor(creep.hp*2);creep.value=Math.floor(creep.value*1.5);creep.creep_type="Strong "+creep.creep_type;return creep;}
var QuickMixin=function(creep){creep.creep_type="Quick "+creep.creep_type;creep.color=color(200,150,50);creep.speed=creep.speed*1.5;creep.hp=Math.floor(creep.hp*.75);creep.size=creep.size*0.9;creep.value=Math.floor(creep.value*1.25);return creep;}
var BossMixin=function(creep){creep.creep_type="Boss "+creep.creep_type;creep.color=color(255,100,150);creep.size=creep.size*1.5;creep.hp=Math.floor(creep.hp*10);creep.value=Math.floor(creep.value*20);return creep;}
var Creep=function(wave){var cp=SET.creeps_spawned;var c=new Object();c.terrain={"entrance":1.0,"exit":1.0,"mountain":0.75,"water":0.5,"neutral":1.0,"power plant":2.0};c.x=SET.entrance.x_mid;c.y=SET.entrance.y_mid;c.color=SET.creep_color;c.size=SET.creep_size;c.hp=Math.floor(SET.creep_hp*Math.pow(1.4,wave));c.value=SET.creep_value+wave;c.speed=SET.creep_speed;c.last=millis();c.is_dead=function(){if(this.hp<=0){SET.gold+=this.value;SET.score+=this.value;return true;}
return false;}
c.terrain_modified_speed=function(){var terrain=get_terrain_at(this.gx,this.gy);if(terrain){var terrain_type=terrain.type;var terrain_modifier=c.terrain[terrain_type];}
else{var terrain_modifier=1.0;}
return c.speed*terrain_modifier;}
c.ignores_towers=false;c.update=function(){var gpos=pixel_to_grid(this);this.gx=gpos.gx;this.gy=gpos.gy;if(this.gx==SET.exit.gx&&this.gy==SET.exit.gy){this.hp=-1;this.value=0;SET.lives--;if(SET.lives<1)game_lost();}
else if(!this.ignores_towers){var elapsed=SET.now-this.last;var terrain_modified_speed=this.terrain_modified_speed();var speed=(elapsed/1000)*terrain_modified_speed;this.last=SET.now;var next_block=pathfind(gpos);if(next_block==undefined){game_lost();error("Pathfinding failed.  Erroring hard so that we catch these bugs.");log("creep",this);return;}
var coords=center_of_square(next_block.gx,next_block.gy)
move_towards(this,this.x,this.y,coords.x,coords.y,speed);}
else if(this.ignores_towers){var elapsed=SET.now-this.last;var terrain_modified_speed=this.terrain_modified_speed();var speed=(elapsed/1000)*terrain_modified_speed;move_towards(this,this.x,this.y,SET.exit.x_mid,SET.exit.y_mid,speed)
this.last=SET.now;}}
c.draw=function(){noStroke();fill(this.color);ellipse(this.x,this.y,this.size,this.size);}
c.creep_type="Normal Creep";c.display_stats=function(){WIDGETS.creep_type.innerHTML=this.creep_type;WIDGETS.creep_hp.innerHTML=this.hp;WIDGETS.creep_value.innerHTML=this.value+" gold";WIDGETS.creep.style.display="block";}
SET.creeps_spawned++;assign_to_depth(c,SET.creep_render_level);return c;};var known_best_paths=undefined;var reset_pathfinding=function(new_value){if(new_value==undefined){var coords=[SET.exit.gx,SET.exit.gy];new_value={};SET.grid_cache_reset_all_values_for_key("valid_tower_location");new_value[coords]={};}
var previous=known_best_paths;known_best_paths=new_value;return previous;}
var valid_path_location=function(gx,gy){if(gx<0||gy<0)return false;if(gx>=SET.gwidth||gy>=SET.gheight)return false;if(get_tower_at(gx,gy)!=false)
return false;if(SET.considering_location&&SET.considering_location.gx==gx&&SET.considering_location.gy==gy)
return false;return true;}
var pathfind=function(start_block){if([start_block.gx,start_block.gy]in known_best_paths){return known_best_paths[[start_block.gx,start_block.gy]].next_block.gpos;}
var successors=function(block){var candidates=[];var normal_dist=10;[[0,1],[1,0],[-1,0],[0,-1]].forEach(function(pair){var gpos={gx:block.gpos.gx+pair[0],gy:block.gpos.gy+pair[1],dist:normal_dist};if(valid_path_location(gpos.gx,gpos.gy))
candidates.push(gpos);});var diag_dist=14;[[1,1],[-1,-1],[1,-1],[-1,1]].forEach(function(pair){var gpos={gx:block.gpos.gx+pair[0],gy:block.gpos.gy+pair[1],dist:diag_dist};if(valid_path_location(gpos.gx,gpos.gy)&&valid_path_location(block.gpos.gx,gpos.gy)&&valid_path_location(gpos.gx,block.gpos.gy))
candidates.push(gpos);})
return candidates;}
var heuristic=function(gpos){var dx=Math.abs(gpos.gx-SET.exit.gx);var dy=Math.abs(gpos.gy-SET.exit.gy);var dist=Math.min(dx,dy)*14;dist+=(Math.max(dx,dy)-Math.min(dx,dy))*10
return dist}
var closed={};var pqueue=[{gpos:start_block,f:heuristic(start_block),g:0}];while(pqueue.length>0){var block=pqueue[0];pqueue=pqueue.slice(1);if(closed[[block.gpos.gx,block.gpos.gy]]==true){continue;}
if([block.gpos.gx,block.gpos.gy]in known_best_paths){while("ancestor"in block){block.ancestor.next_block=block;known_best_paths[[block.ancestor.gpos.gx,block.ancestor.gpos.gy]]=block.ancestor
block=block.ancestor;}
var result=known_best_paths[[start_block.gx,start_block.gy]].next_block.gpos;return result;}
closed[[block.gpos.gx,block.gpos.gy]]=true;successors(block).forEach(function(s){var suc={gpos:s,g:s.dist+block.g,ancestor:block};suc.f=suc.g+heuristic(suc.gpos);pqueue=insert_sorted(pqueue,suc,function(bl){return bl.f});})}}
var UserInterfaceMode=function(){this.action=function(x,y){};this.is_legal=function(x,y){return undefined;};this.draw=function(x,y){};this.set_up=function(){};this.tear_down=function(){};this.can_leave_mode=function(x,y){return true;};this.can_enter_mode=function(x,y){return true;};this.name=function(){return"UserInterfaceMode";};};var attempt_to_enter_ui_mode=function(mode,error_msg){if(!SET.state||SET.state.can_leave_mode()){unselect();if(mode.can_enter_mode()){SET.state=mode;var pos=mouse_pos();SET.state.set_up(pos.x,pos.y);}
else if(!error_msg)
{error("Not enough gold, you need at least "+mode.cost)};}};var BuildTowerMode=function(){var is_blocking_paths=function(gpos){pathfind({gx:SET.entrance.gx,gy:SET.entrance.gy});if(!([gpos.gx,gpos.gy]in known_best_paths)){var safe=true;[[1,1],[-1,-1],[1,-1],[-1,1]].forEach(function(pair){if(!valid_path_location(gpos.gx+pair[0],gpos.gy+pair[1])){safe=false;}});if(safe)
return true;}
SET.considering_location=gpos;var previous_pathfinding=reset_pathfinding();var valid=pathfind({gx:SET.entrance.gx,gy:SET.entrance.gy});var creeps=SET.rendering_groups[SET.creep_render_level];creeps.forEach(function(creep){valid=valid&&pathfind(pixel_to_grid(creep));});SET.considering_location=undefined;reset_pathfinding(previous_pathfinding);if(!valid)
return false;return true;}
this.is_legal=function(x,y){var gpos=pixel_to_grid(x,y);if(can_build_here(gpos.gx,gpos.gy)==false)return false;var cache=SET.grid_cache_at(gpos.gx,gpos.gy);if(cache["valid_tower_location"]==undefined){cache["valid_tower_location"]=is_blocking_paths(gpos);}
return cache["valid_tower_location"];};this.draw=function(x,y){var gpos=pixel_to_grid(x,y);var mid=center_of_square(gpos);var radius=SET.half_pixels_per_square;if(this.br)
this.br.is_dead=function(){return true;}
this.br=BuildRadius(mid.x,mid.y,radius);if(this.is_legal(x,y))
this.br.color=SET.bg_colors.positive;else
this.br.color=SET.bg_colors.negative;};this.set_up=function(x,y){this.draw(x,y);$('').trigger(this.name());};this.tear_down=function(){if(this.br){this.br.is_dead=function(){return true;};}};this.action=function(x,y){var gpos=pixel_to_grid(x,y);this.tower(gpos.gx,gpos.gy);SET.gold-=this.cost;reset_pathfinding();};this.can_enter_mode=function(x,y){if(SET.gold>=this.cost)return true;else return false;};this.can_leave_mode=function(){if(SET.gold<this.cost)return true;return!shift_down;};this.name=function(){return"BuildTowerMode";};};BuildTowerMode.prototype=new UserInterfaceMode();var BuildMissileTowerMode=function(){this.cost=100;this.tower=MissileTower;this.name=function(){return"BuildMissileTowerMode";};};BuildMissileTowerMode.prototype=new BuildTowerMode();var build_missile_tower=function(){attempt_to_enter_ui_mode(new BuildMissileTowerMode());};var BuildCannonTowerMode=function(){this.cost=75;this.tower=CannonTower;this.name=function(){return"BuildCannonTowerMode";};};BuildCannonTowerMode.prototype=new BuildTowerMode();var build_cannon_tower=function(){attempt_to_enter_ui_mode(new BuildCannonTowerMode());};var BuildLaserTowerMode=function(){this.cost=25;this.tower=LaserTower;this.name=function(){return"BuildLaserTowerMode";};};BuildLaserTowerMode.prototype=new BuildTowerMode();var build_laser_tower=function(){attempt_to_enter_ui_mode(new BuildLaserTowerMode());};var BuildGatlingTowerMode=function(){this.cost=50;this.tower=GatlingTower;this.name=function(){return"BuildGatlingTowerMode";}};BuildGatlingTowerMode.prototype=new BuildTowerMode();var build_gatling_tower=function(){attempt_to_enter_ui_mode(new BuildGatlingTowerMode());}
var TowerSelectMode=function(){this.set_up=function(x,y){var gpos=pixel_to_grid(x,y);this.tower=get_tower_at(gpos.gx,gpos.gy);if(this.tower){this.tower.display_stats();this.killzone=KillZone(this.tower.x_mid,this.tower.y_mid,this.tower.range*SET.pixels_per_square);WIDGETS.tower.style.display="block";}};this.tear_down=function(){WIDGETS.tower.style.display="none";if(this.killzone)
this.killzone.is_dead=function(){return true;};};this.can_enter_mode=function(x,y){var gpos=pixel_to_grid(x,y);var tower=get_tower_at(gpos.gx,gpos.gy);return(tower==false)?false:true;}};TowerSelectMode.prototype=new UserInterfaceMode();var select_tower=function(){SET.state=new TowerSelectMode();};var CreepSelectMode=function(){this.set_up=function(x,y){this.creep=get_creep_nearest(x,y);if(this.creep){this.creep.display_stats();WIDGETS.creep.style.display="block";this.hp_updater=CreepHpUpdater(this.creep);}};this.tear_down=function(){WIDGETS.creep.style.display="none";if(this.hp_updater){this.hp_updater.should_die=true;}};this.name=function(){return"CreepSelectMode";};};CreepSelectMode.prototype=new UserInterfaceMode();var select_creep=function(){SET.state=CreepSelectMode();};var AimBombMode=function(){this.cost=SET.bomb_cost;this.radius=SET.missile_blast_radius*SET.pixels_per_square*1.0;this.draw=function(x,y){if(this.mr)this.mr.is_dead=function(){return true;};this.mr=MissileRadius(x,y,this.radius);}
this.set_up=function(x,y){this.draw(x,y);$('').trigger("AimBombMode");}
this.tear_down=function(){if(this.mr)this.mr.is_dead=function(){return true;};}
this.can_enter_mode=function(x,y){if(SET.gold>=this.cost)return true;else return false;};this.name=function(){return"AimBombMode";};this.is_legal=function(){return true;};this.action=function(x,y){var creeps=SET.rendering_groups[SET.creep_render_level];var l=creeps.length;var range=Math.floor(this.radius);for(var i=0;i<l;i++){var creep=creeps[i];var d=Math.floor(dist(x,y,creep.x,creep.y));if(d<=range)
creep.hp=Math.floor(creep.hp/2);}
play_sound("bomb");SET.gold-=this.cost;var cost_increase=SET.bomb_cost*0.25;if(cost_increase<25)cost_increase=25;SET.bomb_cost=Math.floor(SET.bomb_cost+cost_increase);WIDGETS.bomb_cost.innerHTML=SET.bomb_cost;}}
AimBombMode.prototype=new UserInterfaceMode();var aim_bomb=function(x,y){attempt_to_enter_ui_mode(new AimBombMode());};var PauseMode=function(){this.name=function(){return"PauseMode"};this.can_leave_mode=function(x,y){return false;};this.set_up=function(){this.began_at=millis();$('').trigger("PauseMode");}
this.tear_down=function(){var elapsed=millis()-this.began_at;SET.rendering_groups.forEach(function(group){group.forEach(function(member){if(member.last)
member.last+=elapsed;});});}
this.name=function(){return"PauseMode";};};PauseMode.prototype=new UserInterfaceMode();var GameOverMode=function(){this.set_up=function(x,y){SET.score+=SET.gold;SET.gold=0;$('').trigger("game_over",true);}
this.name=function(){return"GameOverMode";};this.can_leave_mode=function(x,y){return false;};};GameOverMode.prototype=new UserInterfaceMode();var CircleZone=function(x,y,r){var cz=new Object();Object.extend(cz,InertDrawable);var d=2*r;cz.color=SET.killzone_color;cz.draw=function(){fill(this.color);stroke(255);ellipse(x,y,d,d);};return cz}
var KillZone=function(x,y,r){var kz=new CircleZone(x,y,r);assign_to_depth(kz,SET.killzone_render_level);return kz;};var BuildRadius=function(x,y,r){var br=KillZone(x,y,r);assign_to_depth(br,SET.build_zone_render_level);return br;};var MissileRadius=function(x,y,r){var mr=KillZone(x,y,r);mr.color=color(0,40,40,0.5);return mr;}
var Tower=function(settings){var tower=GridSquare(settings.gx,settings.gy,settings.color);Object.extend(tower,settings);tower.set_range=function(range){tower.range=range;tower.prange=range*SET.pixels_per_square;};tower.account_for_terrain=function(){var terrain=get_terrain_at(this.gx,this.gy);this.damage=this.damage*terrain.tower_damage_modifier;this.set_range(this.range*terrain.tower_range_modifier);this.reload_rate=this.reload_rate*terrain.tower_frequency_modifier;};tower.set_range(3.5);tower.damage=5.0;tower.attack=function(creep){};var mid=center_of_square(tower.gx,tower.gy);tower.x_mid=mid.x;tower.y_mid=mid.y;tower.fired_at=0;tower.reload_rate=1000;tower.weapon_ready=function(){if(SET.now-tower.fired_at>tower.reload_rate){tower.fired_at=SET.now;return true;}
return false;};tower.update=function(){var creeps=SET.rendering_groups[SET.creep_render_level];if(creeps.length==0)return;var closest_creep;var closest_distance;creeps.forEach(function(creep){var distance=dist(tower.x_mid,tower.y_mid,creep.x,creep.y);if(distance<tower.prange){if(!closest_creep){closest_creep=creep;closest_distance=distance;}
else{if(distance<closest_distance){closest_creep=creep;closest_distance=distance;}}}});if(closest_creep&&tower.weapon_ready()==true)
tower.attack(closest_creep);}
tower.sale_value=50;tower.sell=function(){SET.gold+=Math.floor(this.sale_value*0.75);this.is_dead=function(){return true;};SET.grid_cache_at(this.gx,this.gy).tower=undefined;unselect();}
tower.display_stats=function(){WIDGETS.tower_type.innerHTML=this.type;WIDGETS.tower_range.innerHTML=this.range;WIDGETS.tower_damage.innerHTML=this.damage;WIDGETS.tower_rate.innerHTML=this.reload_rate;WIDGETS.tower_sell_button.innerHTML="Sell tower for "+Math.floor(this.sale_value*0.75)+" gold!";WIDGETS.tower_upgrade_button.innerHTML="<u>U</u>pgrade for "+Math.floor(this.upgrade_cost)+" gold!";WIDGETS.tower_upgrade_button.onclick=function(){tower.upgrade();}
WIDGETS.tower_sell_button.onclick=function(){tower.sell();reset_pathfinding();}
WIDGETS.tower.style.display="block";};tower.draw=function(){noStroke();fill(this.color);draw_circle_in_grid(this.gx,this.gy);}
assign_to_depth(tower,SET.tower_render_level);return tower;};var MissileTower=function(gx,gy){var mt=Tower({gx:gx,gy:gy,color:color(250,150,50)});mt.type="Missile Tower";mt.damage=5000;mt.upgrade_cost=100;mt.sale_value=100;mt.set_range(5.5);mt.reload_rate=2000;mt.attack=function(creep){assign_to_depth(Missile(this,creep),SET.bullet_render_level);}
mt.upgrade=function(){if(SET.gold>=this.upgrade_cost){SET.gold-=this.upgrade_cost;this.sale_value=Math.floor(this.sale_value+this.upgrade_cost);this.upgrade_cost=Math.floor(this.upgrade_cost*1.5);this.damage=Math.floor(this.damage*2.5);this.set_range(this.range+0.5);unselect();SET.state=new TowerSelectMode();SET.state.set_up(this.x_mid,this.y_mid);}
else error("You don't have enough gold to upgrade, you need "+(this.upgrade_cost-SET.gold)+" more.");}
mt.account_for_terrain();return mt;}
var LaserTower=function(gx,gy){var lt=Tower({gx:gx,gy:gy,color:color(90,150,50)});lt.type="Laser Tower";lt.attack=function(creep){assign_to_depth(Laser(this,creep),SET.bullet_render_level);};lt.upgrade_cost=25;lt.sale_value=13;lt.upgrade=function(){if(SET.gold>=this.upgrade_cost){SET.gold-=this.upgrade_cost;this.sale_value=Math.floor(this.sale_value+this.upgrade_cost);this.upgrade_cost=Math.floor(this.upgrade_cost*1.5);this.damage=Math.floor(this.damage*2.0);this.set_range(this.range+0.25);this.reload_rate=this.reload_rate-10;unselect();SET.state=new TowerSelectMode();SET.state.set_up(this.x_mid,this.y_mid);}
else error("You don't have enough gold to upgrade, you need "+(this.upgrade_cost-SET.gold)+" more.");}
lt.damage=10;lt.set_range(4);lt.reload_rate=250;lt.account_for_terrain();return lt;};var CannonTower=function(gx,gy){var lt=Tower({gx:gx,gy:gy,color:color(100,120,140)});lt.type="Cannon Tower";lt.attack=function(creep){assign_to_depth(CannonBall(this,{x:creep.x,y:creep.y,hp:1}),SET.bullet_render_level);};lt.upgrade_cost=75;lt.sale_value=50;lt.upgrade=function(){if(SET.gold>=this.upgrade_cost){SET.gold-=this.upgrade_cost;this.sale_value=Math.floor(this.sale_value+this.upgrade_cost);this.upgrade_cost=Math.floor(this.upgrade_cost*1.5);this.damage=Math.floor(this.damage*2.0);this.set_range(this.range+0.25);this.reload_rate=this.reload_rate-10;unselect();SET.state=new TowerSelectMode();SET.state.set_up(this.x_mid,this.y_mid);}
else error("You don't have enough gold to upgrade, you need "+(this.upgrade_cost-SET.gold)+" more.");}
lt.damage=100;lt.set_range(4);lt.reload_rate=1000;lt.account_for_terrain();return lt;};var GatlingTower=function(gx,gy){var gt=Tower({gx:gx,gy:gy,color:color(250,250,50)});gt.type="Gatling Tower";gt.damage=50;gt.upgrade_cost=25;gt.sale_value=50;gt.set_range(3.5);gt.reload_rate=100;gt.shots_per_volley=12;gt.shots_left_in_volley=gt.shots_per_volley;gt.pause_after_volley=2000;gt.finish_reload_at=0;gt.reloading=false;gt.fire_next_at=0;gt.weapon_ready=function(){if(gt.reloading&&gt.finish_reload_at<SET.now){gt.shots_left_in_volley=gt.shots_per_volley;gt.reloading=false;}
if(!gt.reloading&&gt.fire_next_at<SET.now){return true;}
return false;};gt.attack=function(creep){assign_to_depth(Bullet(this,creep),SET.bullet_render_level);gt.shots_left_in_volley--;gt.fire_next_at=SET.now+gt.reload_rate;if(gt.shots_left_in_volley<1){gt.reloading=true;gt.finish_reload_at=SET.now+gt.pause_after_volley;}}
gt.upgrade=function(){if(SET.gold>=this.upgrade_cost){SET.gold-=this.upgrade_cost;this.sale_value=Math.floor(this.sale_value+this.upgrade_cost);this.upgrade_cost=Math.floor(this.upgrade_cost*1.5);this.damage=Math.floor(this.damage*2.5);this.set_range(this.range+0.5);this.reload_rate=Math.floor(this.reload_rate*0.95);unselect();SET.state=new TowerSelectMode();SET.state.set_up(this.x_mid,this.y_mid);}
else error("You don't have enough gold to upgrade, you need "+(this.upgrade_cost-SET.gold)+" more.");}
gt.account_for_terrain();return gt;}
var Weapon=function(tower,target){var w=new Object();w.x=tower.x_mid;w.y=tower.y_mid;w.target=target;w.tower=tower;w.proximity=7;w.damage=tower.damage;w.last=millis();w.impact=function(target){this.is_dead=function(){return true;};target.hp-=this.damage;}
w.update=function(){var distance=dist(this.x,this.y,this.target.x,this.target.y);if(distance<this.proximity){this.impact(this.target);}
else{var elapsed=1.0*(SET.now-this.last);var speed=this.speed*(elapsed/1000);this.last=SET.now;move_towards(this,this.x,this.y,target.x,target.y,this.speed);}}
w.is_dead=function(){if(!target||target.hp<=0)return true;return false;};return w;};var Bullet=function(tower,target){var b=new Object();Object.extend(b,Weapon(tower,target));b.size=5;b.color=color(255,255,255);b.fill_color=color(100,255,0);b.speed=8;b.damage=tower.damage;b.proximity=10;b.draw=function(){stroke(b.color);fill(b.fill_color);ellipse(this.x,this.y,this.size,this.size);}
return b;}
var CannonBall=function(tower,target){var c=new Object();Object.extend(c,Weapon(tower,target));c.midpoint={x:Math.floor((c.x+target.x)/2.0),y:Math.floor((c.y+target.y)/2.0)};c.middist=dist(c.x,c.y,c.midpoint.x,c.midpoint.y);c.min_size=8
c.size_variance=4;c.color=color(0,0,0);c.fill_color=color(50,50,50);c.speed=8;c.damage=tower.damage;c.proximity=25;c.splash_range=50.0;c.draw=function(){var percent_to_apex=((this.middist-dist(this.x,this.y,this.midpoint.x,this.midpoint.y))/this.middist);size=((1-Math.pow(1-percent_to_apex,2))*this.size_variance)+this.min_size;log("drawing cannonball",size);stroke(this.color);fill(this.fill_color);ellipse(this.x,this.y,size,size);};c.impact=function(target){this.is_dead=function(){return true;};var creeps=SET.rendering_groups[SET.creep_render_level];var l=creeps.length;var range=Math.floor(this.splash_range);for(var i=0;i<l;i++){var creep=creeps[i];var d=Math.floor(dist(this.x,this.y,creep.x,creep.y));if(d<=range){creep.hp-=this.damage;}}};return c;};var Missile=function(tower,target){var m=new Object();Object.extend(m,Weapon(tower,target));m.size=10;m.color=color(255,0,0);m.fill_color=color(250,50,50);m.speed=8;m.damage=tower.damage;m.proximity=20;m.is_dead=function(){if(!this.target||this.target.hp<=0){this.target=get_creep_nearest(this.x,this.y,100);}
if(!this.target)return true;return false;}
m.draw=function(){stroke(m.color);fill(m.fill_color);var mx=this.x;var my=this.y;var size=this.size;var tx=this.target.x;var ty=this.target.y;var tth=Math.atan((ty-my)/(tx-mx));var angle=2.35619449;triangle(mx,my,mx+size*Math.cos(tth-2.35619449),my+size*Math.sin(tth+2.35619449),mx+size*Math.cos(tth+2.35619449),my+size*Math.sin(tth-2.35619449));}
return m;};var Laser=function(tower,target){var l=new Object();Object.extend(l,Weapon(tower,target));l.tail=20;l.color=color(0,0,255);l.speed=10;l.proximity=10;l.draw=function(){var path=calc_path(l.x,l.y,tower.x_mid,tower.y_mid,l.tail);stroke(l.color);line(l.x,l.y,l.x+path.x,l.y+path.y);}
return l;};var assign_to_depth=function(obj,depth){var rendering_group=SET.rendering_groups[depth];if(rendering_group==undefined)SET.rendering_groups[depth]=[obj];else rendering_group.push(obj);}
var update_groups=function(groups){var obj_update=function(x){if(x!=undefined)x.update();};var obj_is_alive=function(x){if(x==undefined||x.is_dead())return false;return true;};var obj_draw=function(x){x.draw();};for(var i=groups.length-1;i>=0;i--){var group=groups[i];if(group!=undefined){group.forEach(obj_update);var alive=group.filter(obj_is_alive);alive.forEach(obj_draw);groups[i]=alive;}}}
var default_set=function(){var set={};set.pixels_per_square=25;set.half_pixels_per_square=(1.0*set.pixels_per_square)/2;set.height=450;set.width=600;set.framerate=60;set.gheight=Math.floor(set.height/set.pixels_per_square);set.gwidth=Math.floor(set.width/set.pixels_per_square);set.grid_cache={};set.grid_cache_at=function(gx,gy){var gx_cache=set.grid_cache[gx];if(!gx_cache){gx_cache={};set.grid_cache[gx]=gx_cache;}
var gy_cache=gx_cache[gy];if(!gy_cache){gy_cache={};gx_cache[gy]=gy_cache;}
return gy_cache;}
set.grid_cache_reset_all_values_for_key=function(key){for(gx in set.grid_cache){for(gy in set.grid_cache[gx]){delete set.grid_cache[gx][gy][key];}}}
set.bg_colors={neutral:color(90,80,70),positive:color(60,80,250),negative:color(250,80,60)};set.bg_color=set.bg_colors.neutral;set.grid_color=color(255,255,255);set.entrance_color=color(255,100,100);set.exit_color=color(100,100,250);set.killzone_color=color(200,50,50,0.5);set.creep_color=color(255,255,0);set.rendering_groups=[];for(var i=0;i<=7;i++)set.rendering_groups.push([]);set.system_render_level=7;set.square_render_level=6;set.killzone_render_level=5;set.grid_render_level=4;set.tower_render_level=3;set.build_zone_render_level=2;set.creep_render_level=1;set.bullet_render_level=0;set.state=undefined;set.creep_variety="Normal Creeps";set.creep_size=10;set.creep_hp=10;set.creep_value=1;set.creep_speed=50;set.missile_blast_radius=5;set.missile_damage=100;set.gold=200;set.creeps_spawned=0;set.max_creeps=1;set.score=0;set.lives=20;set.nukes=3;set.bomb_cost=50;return set};var SET;var fetch_ui_widgets=function(){var w={};w.score=document.getElementById("score");w.gold=document.getElementById("gold");w.lives=document.getElementById("lives");w.nukes_left=document.getElementById("nukes_left");w.creep_variety=document.getElementById("creep_variety");w.wave=document.getElementById("wave");w.till_next_wave=document.getElementById("till_next_wave");w.bomb_cost=document.getElementById("bomb_cost");w.tower=document.getElementById("tower");w.tower_type=document.getElementById("tower_type");w.tower_range=document.getElementById("tower_range");w.tower_damage=document.getElementById("tower_damage");w.tower_rate=document.getElementById("tower_rate");w.tower_upgrade_button=document.getElementById("tower_upgrade_button");w.tower_sell_button=document.getElementById("tower_sell_button");w.creep=document.getElementById("creep");w.creep_type=document.getElementById("creep_type");w.creep_hp=document.getElementById("creep_hp");w.creep_value=document.getElementById("creep_value");return w;};var WIDGETS;var InertDrawable=new Object();Object.extend(InertDrawable,{update:function(){},is_dead:function(){return false;},draw:function(){}});var SettingUpdater=function(){var su=new Object();Object.extend(su,InertDrawable);su.update=function(){SET.now=millis();}
assign_to_depth(su,SET.system_render_level);return su;};var UIUpdater=function(){var uiu=new Object();Object.extend(uiu,InertDrawable);uiu.update=function(){WIDGETS.creep_variety.innerHTML=SET.creep_variety;WIDGETS.score.innerHTML=SET.score;WIDGETS.gold.innerHTML=SET.gold;WIDGETS.lives.innerHTML=SET.lives;WIDGETS.nukes_left.innerHTML=SET.nukes+" left";WIDGETS.till_next_wave.innerHTML=Math.floor(((SET.creep_wave_controller.last+SET.creep_wave_controller.delay)-SET.now)/1000)};assign_to_depth(uiu,SET.system_render_level);return uiu;}
var Grid=function(){var grid=new Object();Object.extend(grid,InertDrawable);grid.draw=function(){stroke(SET.grid_color);var p=SET.pixels_per_square;var w=SET.width;var h=SET.height;for(i=0;i<w;i+=p){line(i,0,i,h);}
for(i=0;i<h;i+=p){line(0,i,w,i);}};assign_to_depth(grid,SET.grid_render_level);return grid;};var GridSquare=function(gx,gy,color){var square=new Object();Object.extend(square,InertDrawable);square.gx=gx;square.gy=gy;square.x=grid_to_pixel(gx);square.y=grid_to_pixel(gy);var mid=center_of_square(gx,gy);square.x_mid=mid.x;square.y_mid=mid.y;return square;}
var Square=function(gx,gy,color){var square=GridSquare(gx,gy,color);square.color=color;square.draw=function(){noStroke();fill(this.color);draw_square_in_grid(this.gx,this.gy);}
assign_to_depth(square,SET.square_render_level);return square;};var spawn_wave=function(){if(!SET.state||(SET.state.name()!="GameOverMode"&&SET.state.name()!="PauseMode")){var bonus=Math.floor(((SET.creep_wave_controller.last+SET.creep_wave_controller.delay)-SET.now)/100);SET.creep_wave_controller.spawn_wave(bonus);}}
var nuke_creeps=function(){if(SET.nukes>0){var creeps=SET.rendering_groups[SET.creep_render_level];creeps.forEach(function(x){x.hp=-1;x.value=0;});play_sound("nuke");SET.nukes--;}
else{error("You're all out of nukes!")}};var pause_resume=function(){if(SET.state){var state_name=SET.state.name();if(state_name=="GameOverMode");else if(state_name=="PauseMode"){unselect();}
else{unselect();SET.state=new PauseMode();SET.state.set_up();}}
else{SET.state=new PauseMode();SET.state.set_up();}};var game_lost=function(){unselect();attempt_to_enter_ui_mode(new GameOverMode());}
var generate_map=function(){SET.entrance=Square(0,random(SET.gheight-1),SET.entrance_color);SET.entrance.type="entrance";SET.exit=Square(SET.gwidth-1,random(SET.gheight-1),SET.exit_color);SET.exit.type="exit";populate_terrains();}
var reset_game=function(){SET=default_set();WIDGETS=fetch_ui_widgets();WIDGETS.bomb_cost.innerHTML=SET.bomb_cost;SettingUpdater();UIUpdater();generate_map();SET.creep_wave_controller=CreepWaveController();reset_pathfinding();$('').trigger("game_over",false);};var on_mouse_moved=function(){if(SET.state&&SET.state.draw){var pos=mouse_pos();SET.state.draw(pos.x,pos.y);}};var UI_MODES_FROM_CLICK=[TowerSelectMode,CreepSelectMode];var on_mouse_press=function(){var pos=mouse_pos();if(SET.state){if(SET.state.is_legal(pos.x,pos.y)){SET.state.action(pos.x,pos.y);}
if(SET.state.can_leave_mode(pos.x,pos.y)){unselect();}}
if(!SET.state){var len=UI_MODES_FROM_CLICK.length;for(var i=0;i<len;i++){var modeFunc=UI_MODES_FROM_CLICK[i];var mode=new modeFunc();if(mode.can_enter_mode(pos.x,pos.y)){SET.state=mode;SET.state.set_up(pos.x,pos.y);break;}}}}
var message=function(msg){$('').trigger("message",msg);}
var unselect=function(){if(SET.state)SET.state.tear_down();SET.state=undefined;$('').trigger("no_mode");}
var error=function(msg){$('').trigger("error",msg);}
var start_tower_defense=function(){setup=function(){$('#pause_button').html("Pause");set_canvas("tower_defense");reset_game();size(SET.width,SET.height);frameRate(SET.framerate);mouseMoved(on_mouse_moved);mousePressed(on_mouse_press);initProcessing();}
draw=function(){if(SET.state){var state_name=SET.state.name();if(state_name=="GameOverMode"||state_name=="PauseMode")return}
background(SET.bg_color);update_groups(SET.rendering_groups);}
setup();}
