function Canvas(id){this.canvas=document.getElementById(id);this.ctx=this.canvas.getContext('2d');this.width=this.canvas.width;this.height=this.canvas.height;this.fill_color="#ccc";this.stroke_color="rgba(255,255,255,0.1)";}
Canvas.prototype={isInside:function(pos){return(pos.x>=0&&pos.x<=1&&pos.y>=0&&pos.y<=1);},clear:function(){this.ctx.clearRect(0,0,this.width,this.height);},circle:function(p,r){x=p.x*this.width;y=p.y*this.height;this.ctx.beginPath();this.ctx.strokeStyle=this.stroke_color;this.ctx.moveTo(x+r,y);this.ctx.arc(x,y,r,0,TWO_PI,false);this.ctx.fill();},line:function(x1,x2){this.ctx.beginPath();this.ctx.strokeStyle=this.stroke_color;this.ctx.moveTo(x1.x*this.width,x1.y*this.height);this.ctx.lineTo(x2.x*this.width,x2.y*this.height);this.ctx.stroke();},poligon:function(points){this.ctx.beginPath();this.ctx.fillStyle="rgba(255,255,255,0.2)";this.ctx.moveTo(points[0].curr.x*this.width,points[0].curr.y*this.height);for(var i=0;i<points.length;i++){this.ctx.lineTo(points[i].curr.x*this.width,points[i].curr.y*this.height);}
this.ctx.fill();}};function Constraint(p1,p2,rl,canvas){this.p1=p1;this.p2=p2;this.rest_length=rl||p1.currentPosition().subtract(p2.currentPosition()).length();this.squared_rest_length=this.rest_length*this.rest_length;this.canvas=canvas;}
Constraint.prototype={draw:function(){this.canvas.line(this.p1.currentPosition(),this.p2.currentPosition());},satisfy:function(){var p1=this.p1.currentPosition();var p2=this.p2.currentPosition();var delta=p2.subtract(p1);var p1_im=this.p1.inv_mass;var p2_im=this.p2.inv_mass;var d=delta.squaredLength();var diff=(d-this.squared_rest_length)/((this.squared_rest_length+d)*(p1_im+p2_im));if(p1_im!=0){this.p1.setCurrentPos(p1.add(delta.multiply(p1_im*diff)));}
if(p2_im!=0){this.p2.setCurrentPos(p2.subtract(delta.multiply(p2_im*diff)));}}};function FastVector(x,y){this.x=x;this.y=y;};FastVector.prototype={add:function(B,internal){var nx,ny;if(typeof(B)=='number'){nx=this.x+B;ny=this.y+B;}else{nx=this.x+B.x;ny=this.y+B.y;}
return new FastVector(nx,ny);},add_:function(B){if(typeof(B)=='number'){this.x+=B;this.y+=B;}else{this.x+=B.x;this.y+=B.y;}
return this;},dot:function(B){return((this.x*B.x)+(this.y*B.y));},length:function(){return Math.sqrt((this.x*this.x)+(this.y*this.y));},multiply:function(B){var nx,ny;if(typeof(B)=='number'){nx=this.x*B;ny=this.y*B;}else{nx=this.x*B.x;ny=this.y*B.y;}
return new FastVector(nx,ny);},multiply_:function(B){if(typeof(B)=='number'){this.x*=B;this.y*=B;}else{this.x*=B.x;this.y*=B.y;}
return this;},squaredLength:function(args){return(this.x*this.x)+(this.y*this.y);},sum:function(){return this.x+this.y;},subtract:function(B){var nx,ny;if(typeof(B)=='number'){nx=this.x-B;ny=this.y-B;}else{nx=this.x-B.x;ny=this.y-B.y;}
return new FastVector(nx,ny);},subtract_:function(B){if(typeof(B)=='number'){this.x-=B;this.y-=B;}else{this.x-=B.x;this.y-=B.y;}
return this;},toString:function(){return"["+this.x+","+this.y+"]";}};function Point(p,m,inv_m,canvas){this.curr=this.prev=p;this.mass=m;if(inv_m==0){this.inv_mass=0;}else{this.inv_mass=inv_m||1/m;}
this.force=GRAVITY;this.RADIUS=3;this.canvas=canvas;}
Point.prototype={setCurrentPos:function(p){this.curr=p;},setPreviousPos:function(p){this.prev=p;},currentPosition:function(){return this.curr;},previousPosition:function(){return this.prev;},move:function(){if(this.inv_mass!=0){var new_pos=this.curr.multiply(DRAG_C_1).subtract(this.prev.multiply(DRAG_C_2)).add(GRAVITY_SCALED);new_pos.x=(new_pos.x<0)?0:((new_pos.x>1)?1:new_pos.x);new_pos.y=(new_pos.y<0)?0:((new_pos.y>1)?1:new_pos.y);this.prev=this.curr;this.curr=new_pos;}},draw:function(){this.canvas.circle(this.curr,this.RADIUS);},select:function(){this.canvas.circle(this.curr,this.RADIUS*2);}};var PI=3.1415;var TWO_PI=PI*2;var NUM_POINTS=10;var X_OFFSET=0.1;var Y_OFFSET=0.1;var TOP_X=0.1;var TOP_Y=0.0;var POINT_MASS=20.0;var DRAG=0.01;var DRAG_C_1=2-DRAG;var DRAG_C_2=1-DRAG;var GRAVITY=new FastVector(0.0,1);var DT=0.05;var GRAVITY_SCALED=GRAVITY.multiply(DT*DT);var canvas;var cloth;var timer="";var draw_constraints=true;var draw_points=false;function loadCurtain(){clearInterval(timer);canvas=new Canvas('left_canvas');cloth=new Cloth(canvas);canvas2=new Canvas('right_canvas');cloth2=new Cloth(canvas2,0);runCurtain();timer=setInterval(runCurtain,35);}
runCurtain=function(){canvas.clear();cloth.update();canvas2.clear();cloth2.update();}
function Cloth(canvas,xos){this.canvas=canvas;this.num_iterations=2;this.points=new Array();this.constraints=new Array();var x_offset=X_OFFSET;var y_offset=Y_OFFSET;var x_step=((1-2*x_offset))/(NUM_POINTS-1);var y_step=((1-2*y_offset))/(NUM_POINTS-1);var dist=x_step;for(var i=0,y=TOP_Y;i<NUM_POINTS;i++,y+=y_step){this.points[i]=new Array();for(var j=0,x=TOP_X;j<NUM_POINTS;j++,x+=x_step){var point=new Point(new FastVector(x,y),POINT_MASS,null,this.canvas);this.points[i][j]=point;if(i>0){var c=new Constraint(this.points[i-1][j],this.points[i][j],null,this.canvas);this.constraints.push(c);}}}
for(var i=0;i<this.points[0].length;i++){this.points[0][i].inv_mass=0;}
this.num_constraints=this.constraints.length;this.isAnimating=false;this.isOpened=false;}
Cloth.prototype={update:function(){for(var i=0;i<NUM_POINTS;i++){for(var j=0;j<NUM_POINTS;j++){this.points[i][j].move();}}
for(var j=0;j<this.num_iterations;j++){for(var i=0;i<this.num_constraints;i++){this.constraints[i].satisfy();}}
if(draw_constraints){for(var i=0;i<this.num_constraints;i++){this.constraints[i].draw();}}
if(draw_points){for(var i=0;i<NUM_POINTS;i++){for(var j=0;j<NUM_POINTS;j++){this.points[i][j].draw();}}}
for(var i=1;i<this.points.length;i++){var pts=this.points[i-1];pts=pts.concat(this.points[i].slice(0).reverse());this.canvas.poligon(pts);}},getClosestPoint:function(pos){min_dist=1;min_point=null;for(i=0;i<NUM_POINTS;i++){for(j=0;j<NUM_POINTS;j++){var dist=pos.subtract(this.points[i][j].currentPosition()).length();if(dist<min_dist){min_dist=dist;min_point=this.points[i][j];}}}
return min_point;},slideBy:function(diff){for(var i=0;i<this.points[0].length;i++){var point=this.points[0][i];pos=point.currentPosition();pos=pos.add({x:diff/this.canvas.width,y:0});point.setCurrentPos(pos);point.setPreviousPos(pos);}},slideOpen:function(dir){clearInterval(this.slideInt);if(this.isAnimating)return;this.isAnimating=true;var step=15;var limit=160;var self=this;var ctr=0;this.slideInt=setInterval(function(){self.slideBy(step*dir);if(ctr*step>limit)self.slideStop(dir);ctr++;},35);},slideStop:function(dir){clearInterval(this.slideInt);this.isAnimating=false;this.isOpened=!this.isOpened;}};SimpleCurtain=function(context){this.context=context;this.isOpened=false;}
SimpleCurtain.prototype.slideOpen=function(direction){if(!this.isOpened)this.context.animate({width:'30%'},2000);this.isOpened=false;}
loadSimpleCurtain=function(){cloth=new SimpleCurtain($('#intro-simple .left'));cloth2=new SimpleCurtain($('#intro-simple .right'));}
$(function(){var available=CurtainChooser.run();if(available){var moveCurtain=function(event){var area=200;var center=Math.round($(window).width()/2);if(event.pageX>center-area&&event.pageX<center+area){if(!cloth.isAnimating&&!cloth.isOpened){cloth.slideOpen(-1);cloth2.slideOpen(+1);}}else{if(!cloth.isAnimating&&cloth.isOpened){cloth.slideOpen(+1);cloth2.slideOpen(-1);}}}
$(document).bind('mousemove',moveCurtain);};});CurtainChooser={IS_FAST:false,SPEED_LIMIT:100,run:function(){if($.xbrowser.msie()&&$.xbrowser.version.number()<=6){return false;}else{var start=new Date().getTime();var num=1000;for(var i=0;i<1000000;i++){num=Math.sqrt(num);}
var end=new Date().getTime();var speed=end-start;if(speed<this.SPEED_LIMIT){this.IS_FAST=true;loadCurtain();}else{$('#intro-simple').show();loadSimpleCurtain();}
return true;}}};
