

var computer = {
	/* COMPUTER - website console
		TO-DO
		
		implement page colour changes and standardise sending of "stage" event handlers to the channels
		
	*/
	//replace cas.pauseTimer (add cas.play() method)
	selected:0,
	frames:0,
	anchorY:0,
	
	buffer:[],
	menuItems:new Object({
		work:[
			new Object({
				title:"Cascade",
				description:"Infinitely scrolling generative vibes.",
				instructions:"<p%20class='smalltext'>JAVASCRIPT, HTML5, CANVAS <br/><br/>INSTRUCTIONS: use a scrollwheel, arrow keys or drag the window to move. Double-click to skip to a random point.</p>",
				image:"images/thumbs/05.png",
				link:"http://www.kingsteven.com/",
			}),
		],
		htmlDescription:function(wid){
			return "<span%20style='font-size:150%'>"+ this.work[wid].title +"</span> <br/>"+ this.work[wid].description + "<br/>";
		},
		htmlMenuItem:function(wid){
			return "<img%20src='"+this.work[wid].image+"'/> <br/><span%20style='font-size:150%'>"+ this.work[wid].title + "</span> <br/>" + this.work[wid].description + " <br/> <br/>" + this.work[wid].instructions.split(" ").join("%20") + "<br/>";
		},
		
		about:"<span%20style='font-size:150%;'><br/><a%20href='http://♔.ws'>♔tv</a></span> <br/>by Steven Henry <br/> <br/>Surfing should be beautiful <br/> <br/> <a%20href='mailto:steven@pyxl.org'>email%20me</a> <br/> <br/><a%20href='http://www.pyxl.org'>pyxl.org</a> ",
		clear:["<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>","<br/>"],
		gStrings:["❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ ❤ ♔ "
		,"✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚ ✕ ✚ ✖ ✖ ✚",
		"☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀ ⎈ ☼ ☼ ☀"
		]
	}),
	
	init: function(){
		$('#menu').show();
		$('#cascade').show();
		$('#nojavascript').hide();
		
		//IPHONE SCROLLING FIX
		$("body").bind("touchmove", function (event){
			var e = event.originalEvent;
			e.preventDefault();
		});
		$("body").bind("touchstart", function (event){
			var e = event.originalEvent;
			e.preventDefault();
		});  
		
		//CONSOLE
		$('#menuconsoleinputtext').keypress(function(e) {
			if(e.which == 13) {
				computer.send($(this).val());
				$(this).val("♔>");
			}
		});
		$('#menubuttonchannels').mousedown(function(e) {
			computer.send("♔> channels"); 
		});
		$('#menubuttonabout').mousedown(function(e) {
			 computer.send("♔> about"); 
		});
		$('#menubuttonclear').mousedown(function(e) {
			computer.send("♔> clear");  
		});
			
		computer.buffer = [];
		
		//ADD ANCHOR TO CONSOLE TEXT - to detect the yscroll
		$('#menuconsoletext').html(computer.newAnchor().split("%20").join(" "));
		var a = $('#scrollanchor').offset();
		computer.anchorY = a.top;
		
		var bStr = computer.menuItems.htmlDescription(computer.selected)+" <br/>";
		computer.buffer = bStr.split(" ");
		
		computer.tick();
	},
	send: function(val){
		computer.frames = 0;
		
		if(val == "♔>channels" || val == "♔> channels"){
			var bStr = /*computer.menuItems.clear.join(" ")+*/"♔> channels <br/> <br/>";
			for(var i = 0; i < computer.menuItems.work.length; i++){
				bStr += computer.menuItems.htmlMenuItem(i) + " <br/>";
				computer.buffer = bStr.split(" ");
			}
		}else if(val == "♔>about" || val == "♔> about"){
			var gStr = computer.menuItems.gStrings[Math.floor(Math.random()*computer.menuItems.gStrings.length)];
			var bStr = "♔> about <br/> <br/>" + gStr + " <br/>" +  computer.menuItems.about + " <br/> <br/>" + gStr + " <br/> <br/>";
			computer.buffer = bStr.split(" ");
		}else if(val == "♔>clear" || val == "♔> clear"){
			var bStr =computer.menuItems.clear.join(" ")+computer.menuItems.htmlDescription(computer.selected)+" <br/>";
			computer.buffer = bStr.split(" ");
		}else if(val == "" || val == "♔" || val == "♔>"){
			computer.buffer.push(val+" <br/> <br/>");
		}else{
			computer.buffer.push(val+ ": command not found <br/> <br/>");
		}
		
		cas.play();
	},
	newAnchor: function(){
		return "<span%20id='scrollanchor'></span>";
		cas.play();
	},
	tick: function(){
		
		if(computer.frames < 400){
			//EXTERNAL SCROLL
			var a = $('#scrollanchor').offset();
			if(a.top != computer.anchorY){
				cas.externalScroll(Math.min(Math.max(-(computer.anchorY-a.top)/2, -14),14));
				computer.anchorY = a.top;
			}
			
			if(computer.frames == 300){
				var bStr = computer.menuItems.clear.join(" ")+computer.menuItems.htmlDescription(computer.selected)+" <br/>";
				computer.buffer = bStr.split(" ");
				//computer.frames = -1000;
				cas.play();
			}
			if(computer.frames == 399){//resets the text maintains scroll position
				var l = computer.newAnchor() + computer.menuItems.htmlDescription(computer.selected)+" <br/>";
				$('#menuconsoletext').html(l.split("%20").join(" "));	
				var a = $('#scrollanchor').position();
				computer.anchorY = a.top;
				console.log("computer.anchorY")
			}
			
			if(computer.buffer.length > 0){
				var l = computer.buffer.shift().split("%20").join(" ");
				$('#menuconsoletext').html(""+$('#menuconsoletext').html() + l +" ");
			}
		}
		computer.frames++;
		setTimeout(computer.tick, 50);
	}
};

var cas = {
	/* 
		Cascade by Steven Henry
		
		update shape layers in onResize 
		
		alignment bug - align all layer creation and draw alignment to top center (some are center of screen)
		
		rewrite waves draw function to remove gaps in the vertical modulation waveforms
	*/
	canvas:null,
	ctx:null,
	
	
	framesRendered:0,
	pauseTimer:0,
	rawScroll:0,
	scrollPosition:0,
	skip:false,
	dragging:false,
	dragStartPoint:new Object({x:0,y:0}),
	
	width:0,
	height:0,
	
	layers:null,
	shapeTemplates:null,
	
	init: function(){
		//MOVE TO COMPUTER
		cas.canvas = $('#cascade');
		
		cas.resize();
		$(document).keydown(function(e){
			if (e.keyCode == 38) { 
				cas.scrollBy(4 ,false);
			}else if(e.keyCode == 40){
				cas.scrollBy(-4 ,false);
			}
		});
		$(window).resize(function() {
			cas.resize();
		});
		$(document).mousedown(function(e) {
		  cas.dragging=true;
		  cas.dragStartPoint = new Object({x:e.pageX, y:e.pageY});
		  return false;
		});
		$(document).mousemove(function(e){
			if(cas.dragging){
				cas.scrollBy(e.pageY-cas.dragStartPoint.y, false);
				cas.dragStartPoint = new Object({x:e.pageX, y:e.pageY});
			}
		});
		$(document).mouseup(function(e){
			cas.dragging=false;
		});
		$(document).mouseleave(function(e){
			cas.dragging=false;
		});
		
		//bind to document?
		$(document).dblclick(function() {
			cas.scrollRandom();
			return false;
		}),
		cas.canvas.bind('mousewheel', function(event) {
			cas.scrollBy(event.originalEvent.wheelDeltaY/100, false);
		});
		cas.canvas.bind('DOMMouseScroll', function(event) {
			cas.scrollBy(-event.originalEvent.detail/10, false);
		});
		
		//Rewrite, asign canvas from computer
		if (cas.canvas[0].getContext){  
			cas.ctx = cas.canvas[0].getContext('2d');
		} else {  
			document.write("<h2>Canvas Required</h2>"); 
		}
		
		//TRIANGLE
		cas.shapeTemplates = new Array();
		cas.shapeTemplates[0] = new Array();
		cas.shapeTemplates[0][0] = new Object({x:0,y:1});
		cas.shapeTemplates[0][1] = new Object({x:0.8660254037844388,y:-0.4999999999999998});
		cas.shapeTemplates[0][2] = new Object({x:-0.8660254037844384,y:-0.5000000000000004});
		
		//SQUARE
		cas.shapeTemplates[1] = new Array();
		cas.shapeTemplates[1][0] = new Object({x:0,y:1});
		cas.shapeTemplates[1][1] = new Object({x:1,y:0});
		cas.shapeTemplates[1][2] = new Object({x:0,y:-1});
		cas.shapeTemplates[1][3] = new Object({x:-1,y:0});
		
		//PENTAGON
		cas.shapeTemplates[2] = new Array();
		cas.shapeTemplates[2][0] = new Object({x:0,y:1});
		cas.shapeTemplates[2][1] = new Object({x:0.9510565162951535,y:0.30901699437494745});
		cas.shapeTemplates[2][2] = new Object({x:0.5877852522924732,y:-0.8090169943749473});
		cas.shapeTemplates[2][3] = new Object({x:-0.587785252292473,y:-0.8090169943749475});
		cas.shapeTemplates[2][4] = new Object({x:-0.9510565162951536,y:0.30901699437494723});
		
		cas.populate();
		cas.tick();
		cas.scrollRandom();
		setTimeout(cas.tick, 50);
	},
	resize: function(){
		cas.canvas[0].width = window.innerWidth -12;
		cas.canvas[0].height = window.innerHeight -12;
		cas.width = cas.canvas[0].width;
		cas.height = cas.canvas[0].height;
	},
	scrollBy: function(n, s){
		cas.rawScroll += n;
		cas.skip = s;
		cas.play();
	},
	scrollRandom: function(){
		cas.scrollBy(Math.random()*10000, true);
	},
	externalScroll: function(n){
		if(Math.floor(cas.rawScroll/4) == Math.floor(cas.scrollPosition/4)){
			cas.scrollBy(n, true);
		}
	},
	play: function(){
		cas.pauseTimer = 0;
	},
	pause: function(){
		cas.pauseTimer = 1000;
	},
	populate: function(n){
		cas.layers = new Array();
		cas.layers[0] = new Object();//shapes
		cas.layers[0] = cas.createShapeLayer(50);
		
		cas.layers[1] = new Object();//lines
		cas.layers[1] = cas.createWavesLayer(25, 300);
		
		cas.layers[2] = new Object();//shapes
		cas.layers[2] = cas.createShapeLayer(50);
	},
	createShapeLayer: function(total){
		var layer = new Object();
		layer.type = "shape";
		layer.shapes = new Array();
		
		for(var s = 0; s < total; s++){
			layer.shapes[s] = new Object({
				deformation:1,
				scale:1,
				rotation:0,
				offset:0,
				currentShape:[],
				x:(.5-Math.random())*cas.width,
				y:(.5-Math.random())*(cas.height+200),
				template:[0,0],
				xscroll:0,
				yscroll:0,
				
				deformPoints:[Math.random(),Math.random(),Math.random(),Math.random(),Math.random()],//some random numbers to deform the points by
				
				getShape: function(){
					this.currentShape = new Array();
					for(var p = 0; p < this.template.length; p++){
						this.currentShape[p] = new Object();
						this.currentShape[p].x = (this.template[p].x * (this.deformPoints[p]*(1-this.deformation)) * (this.scale*100));
						this.currentShape[p].y = (this.template[p].y * (this.deformPoints[p]*(1-this.deformation)) * (this.scale*100));
						this.currentShape[p] = cas.rotatePoint(this.currentShape[p], this.rotation);
						this.currentShape[p].x += (this.x*this.offset) + this.x + this.xscroll;
						this.currentShape[p].y +=  this.y + this.yscroll;
					}
					return this.currentShape;
				},
				getScrollPoint: function(){
					var sp = new Object({x:(this.x*this.offset) + this.x + this.xscroll, y:this.y + this.yscroll});
					return sp;
				}
			});
			layer.shapes[s].template = new Array();
			layer.shapes[s].template = cas.shapeTemplates[Math.floor(Math.random()*cas.shapeTemplates.length)];
		}
		
		return layer;
	},
	createWavesLayer: function(total, resolution){
		var layer = new Object();
		layer.type = "wave";
		layer.waves = new Array();
		
		for(var s = 0; s < total; s++){
			layer.waves[s] = new Object({
				yscale:1,
				xscale:1,
				offset:0,
				frequency:4,
				xscroll:0,
				y:(s*(cas.height/total))+((200/total)*s),
				yscroll:0,
				waveStartPoint:0,
				currentWave:[],
				
				getWave: function(){
					this.currentWave = new Array();
					
					var waveSize = Math.floor((this.xscale/2)*resolution);
					this.waveStartPoint = Math.min(Math.max(Math.floor(resolution/2)-waveSize, 0), resolution);
					
					var waveEndPoint = Math.min(Math.max(Math.floor(resolution/2)+waveSize, 0), resolution);
					var waveWidth = (cas.width/resolution);
					var waveHeight = (cas.height/total);
					
					for(var p = 0; p < resolution; p++){
						if(p > this.waveStartPoint && p < waveEndPoint){
							this.currentWave[p] = new Object();
							this.currentWave[p].x = (p*waveWidth)-(cas.width/2)+this.x;
							this.currentWave[p].y = ((Math.sin(cas.deg2rad(p*10*this.frequency))*waveHeight)*this.yscale) + (this.y-(cas.height/2)) + this.yscroll;
						}else{
							this.currentWave[p] = new Object();
						}
					}
					
					return this.currentWave;
				},
				getScrollPoint: function(){
					var sp = new Object({x:this.x, y:(this.y-(cas.height/2)) + this.yscroll});
					return sp;
				}
			});
		}
		
		return layer;
	},
	tick: function(){
		if(cas.skip == false){
			cas.scrollPosition += (cas.rawScroll-cas.scrollPosition)/20;
		}else{
			cas.scrollPosition = cas.rawScroll;
			skip = false;
		}
		if(cas.pauseTimer < 200){//10 seconds
			//CLEAR
			//cas.clear();
			cas.ctx.fillStyle = "rgba(255, 255, 255,"+ (cas.pos( Math.sin(cas.deg2rad(cas.scrollPosition/8.9)) * Math.sin(45+(cas.deg2rad(cas.scrollPosition/128))))) +")";
			cas.ctx.fillRect (0, 0, cas.width, cas.height);
			
			for(var l = 0; l < cas.layers.length; l++){
				if(cas.layers[l].type == "shape"){
					var scrollPoint = new Object();
					
					for(var s = 0; s < cas.layers[l].shapes.length; s++){
						if(l == 0){
							cas.ctx.strokeStyle = "#666666";
							
							
							cas.layers[l].shapes[s].yscroll = cas.scrollPosition*4;
							
							scrollPoint = cas.layers[l].shapes[s].getScrollPoint();
							
							//SCROLLING
							while(scrollPoint.y < -(cas.height+200)/2){
								cas.layers[l].shapes[s].yscroll += (cas.height+200);
								scrollPoint = cas.layers[l].shapes[s].getScrollPoint();
							}
							while(scrollPoint.y > (cas.height+200)/2){
								cas.layers[l].shapes[s].yscroll -= (cas.height+200);
								scrollPoint = cas.layers[l].shapes[s].getScrollPoint();
							}
							
							//MODULATION
							var windowOSC =  1+Math.sin( ( cas.deg2rad( (scrollPoint.y/cas.height)*180)  )*.25);
							cas.layers[l].shapes[s].offset = Math.sin(cas.deg2rad(cas.scrollPosition/8))*windowOSC;
							cas.layers[l].shapes[s].scale = cas.pos(-Math.sin(cas.deg2rad(cas.scrollPosition/8)));
							cas.layers[l].shapes[s].deformation = Math.sin(cas.deg2rad(cas.scrollPosition/4));
							cas.layers[l].shapes[s].rotation = cas.scrollPosition/8;
							
							//EFFECTS
							if(Math.sin(cas.deg2rad(cas.scrollPosition/4)) > .8){
								if(cas.framesRendered%8 < 7){
									cas.drawShape(cas.layers[l].shapes[s].getShape());
								}
							}else{
								cas.drawShape(cas.layers[l].shapes[s].getShape());
							}
						}else if(l == 2){
							cas.ctx.strokeStyle = "#000000";
							
							
							cas.layers[l].shapes[s].yscroll = cas.scrollPosition*2;
							
							scrollPoint = cas.layers[l].shapes[s].getScrollPoint();
							
							//SCROLLING
							while(scrollPoint.y < -(cas.height+200)/2){
								cas.layers[l].shapes[s].yscroll += (cas.height+200);
								scrollPoint = cas.layers[l].shapes[s].getScrollPoint();
							}
							while(scrollPoint.y > (cas.height+200)/2){
								cas.layers[l].shapes[s].yscroll -= (cas.height+200);
								scrollPoint = cas.layers[l].shapes[s].getScrollPoint();
							}
							
							//MODULATION
							var windowOSC = 1-Math.sin( ( cas.deg2rad( (scrollPoint.y/cas.height)*180)  )*.25);
							cas.layers[l].shapes[s].offset = Math.sin(cas.deg2rad(cas.scrollPosition)/6)*windowOSC;
							cas.layers[l].shapes[s].scale = cas.pos(Math.sin(cas.deg2rad(cas.scrollPosition/6)));
							cas.layers[l].shapes[s].deformation = Math.sin(cas.deg2rad(cas.scrollPosition/3))*windowOSC;;
							cas.layers[l].shapes[s].rotation = (cas.scrollPosition/6)+(windowOSC*90)
							
							//EFFECTS
							//strobe effect or perspective tails
							if(Math.sin(cas.deg2rad(cas.scrollPosition/6)) < -.8){
								if(Math.floor(Math.random()*2)==0){
									cas.drawShape(cas.layers[l].shapes[s].getShape());
								}
							}else{
								//faux 3d perspective effect
								var shapeFoTrails = cas.layers[l].shapes[s].getShape();
								cas.drawShape(shapeFoTrails);
								var trailsAmtX = -Math.sin(cas.deg2rad(cas.scrollPosition/2))*Math.sin(cas.deg2rad(cas.scrollPosition/3))*8;
								var trailsAmtY = -Math.sin(cas.deg2rad(cas.scrollPosition/2))*Math.cos(cas.deg2rad(cas.scrollPosition/3))*8;
								
								if(Math.floor(s+(cas.framesRendered/2000))%20 == 0){
									
									var tx = windowOSC*20;
									var ty = windowOSC*20;
									for(var t = 0; t < cas.pos(trailsAmtX); t++){
										for(var i = 0; i < shapeFoTrails.length; i++){
											shapeFoTrails[i].x=(shapeFoTrails[i].x*1.2)+trailsAmtX*10;
											shapeFoTrails[i].y=(shapeFoTrails[i].y*1.2)+trailsAmtY*10;
										}
										cas.drawShape(shapeFoTrails);
										ty += ty;
										tx += tx;
									}
								}
							}
						}
						
					}
				}else if(cas.layers[l].type == "wave"){		
					cas.ctx.strokeStyle = "#cc0000";
					
					for(var w = 0; w < cas.layers[l].waves.length; w++){
						//SCROLLING
						cas.layers[l].waves[w].yscroll =  +cas.scrollPosition*1;
						scrollPoint = cas.layers[l].waves[w].getScrollPoint();
						while(scrollPoint.y < -(cas.height+200)/2){
							cas.layers[l].waves[w].yscroll += (cas.height+200);
							scrollPoint = cas.layers[l].waves[w].getScrollPoint();
						}
						while(scrollPoint.y > (cas.height+200)/2){
							cas.layers[l].waves[w].yscroll -= (cas.height+200);
							scrollPoint = cas.layers[l].waves[w].getScrollPoint();
						}	
						//MODULATION		
						var windowOSC = cas.pos(Math.sin(cas.deg2rad((w/cas.layers[l].waves.length)*180)))*.55;
						cas.layers[l].waves[w].x = (    cas.pos( Math.sin( cas.deg2rad( (w/cas.layers[l].waves.length) * cas.scrollPosition ) ) ) * (cas.width*.1)    )   * Math.sin(cas.deg2rad(cas.scrollPosition/6));
						cas.layers[l].waves[w].xscale = (.1+(windowOSC*cas.pos(Math.sin(cas.deg2rad(cas.scrollPosition)/6)))*cas.pos(-Math.sin(cas.deg2rad(cas.scrollPosition/8))));
						cas.layers[l].waves[w].yscale = (1+(Math.sin(cas.deg2rad(cas.scrollPosition)/64)*2))*(Math.sin(cas.deg2rad(cas.scrollPosition/12)));;
						cas.layers[l].waves[w].frequency += (((cas.pos(Math.sin(cas.deg2rad(cas.scrollPosition/400)))*100) + windowOSC)-cas.layers[l].waves[w].frequency)/20;
						
						if(Math.sin(cas.deg2rad((cas.scrollPosition/4)+22.5)) < -.8){	
							cas.layers[l].waves[w].frequency=cas.layers[l].waves[w].frequency+(windowOSC*Math.sin(cas.deg2rad(cas.scrollPosition)/64)*cas.layers[l].waves[w].frequency)
							cas.drawWave(cas.layers[l].waves[w].getWave(), cas.layers[l].waves[w].waveStartPoint);
						}else{
						 	cas.drawWave(cas.layers[l].waves[w].getWave(), cas.layers[l].waves[w].waveStartPoint);
						}
					}
				}
				
			}
			cas.pauseTimer++;
			cas.framesRendered++;
		}
		setTimeout(cas.tick, 50);
	},
	
	//DRAWING FUNCTIONS
	drawShape: function(shape){
		var point = 0;
		//cas.ctx.beginPath();
		cas.moveTo(shape[0].x, shape[0].y);
		for(var i = 0; i < shape.length; i++){
			cas.lineTo(shape[i].x, shape[i].y);
		}
		cas.ctx.closePath();
	},
	drawWave: function(wave, start){
		var point = 0;
		cas.ctx.beginPath();
		for(var i = start; i < wave.length; i++){
			if(i == start){
				cas.moveTo(wave[start].x, wave[start].y);
			}else{
				cas.lineTo(wave[i].x, wave[i].y);
			}
		}
		cas.moveTo(0, 0);
		cas.ctx.closePath();
	},
	clear: function(){
		cas.ctx.clearRect(0, 0, cas.width, cas.height);
	},
	moveTo: function(x, y){
		cas.ctx.stroke();
		cas.ctx.beginPath();
		cas.ctx.moveTo(x+(cas.width/2), y+(cas.height/2));
	},
	lineTo: function(x, y){
		cas.ctx.lineTo(x+(cas.width/2), y+(cas.height/2));
	},
	
	//MATH
	rotatePoint: function(point, angle){
		var x1 = Math.cos(cas.deg2rad(angle)) * point.x - Math.sin(cas.deg2rad(angle)) * point.y;
		var y1 = Math.sin(cas.deg2rad(angle)) * point.x + Math.cos(cas.deg2rad(angle)) * point.y;
		
		return new Object({x:x1, y:y1});
	},
	rotateShape: function(shape, angle){
		for(var i = 0; i < shape.length; i++){
			shape[i] = cas.rotatePoint(shape[i], angle);
		}
		
		return shape;
	},
	deg2rad: function(d){
		return (d/180)*Math.PI;
	},
	pos:function (n){
		if(n < 0){
			return -n;
		}
		return n;
	}
};

var sef = this;
$(document).ready(function(){
  cas.init(); 
  computer.init();
  
	$("a[@href^='http']").attr('target','_blank');

});



