
function easeIn(t,b,c,d){return-c*Math.cos(t/d*(Math.PI/2))+c+b;}
STATE={AT_REST:0,ACCELERATING:1,DECELERATING:2,BRAKING:3,SNAPPING:4};DIRECTION={LEFT:0,RIGHT:1};ACCELERATION={ramp:[],length:20,level:0,max:20};SNAP={ramp:[],length:10,level:0,target:0};var minScroll=250;var framerate=25;var interval=(1000/framerate);var direction;var state=STATE.AT_REST;var offset;var output;var projects;var projectDivs;var container;var scrollLeft;var scrollRight;var contentWidth=0;function moveDiv(){if(direction===DIRECTION.LEFT){offset+=ACCELERATION.ramp[ACCELERATION.level];}else{offset-=ACCELERATION.ramp[ACCELERATION.level];}
projects.css("left",offset);}
function maxScroll(){return container.width()-contentWidth-18;}
function hasOvershot(){return(offset>minScroll||offset<maxScroll());}
function generateSnapBack(start,change){SNAP.ramp=[];for(var i=0;i<SNAP.length;i+=1){SNAP.ramp.push(easeIn(i,start,change,SNAP.length));}}
function snapBack(){if(direction===DIRECTION.LEFT){SNAP.target=minScroll;}else{SNAP.target=maxScroll();}
generateSnapBack(offset,SNAP.target-offset);state=STATE.SNAPPING;}
function snapDiv(){if(SNAP.level<(SNAP.length-1)){SNAP.level+=1;offset=SNAP.ramp[SNAP.level];}else{SNAP.level=0;state=STATE.AT_REST;offset=SNAP.target;}
projects.css("left",offset);}
function update(){switch(state){case STATE.AT_REST:break;case STATE.ACCELERATING:if(ACCELERATION.level<(ACCELERATION.length-1)){ACCELERATION.level+=1;}else{ACCELERATION.level=(ACCELERATION.length-1);}
if(hasOvershot()){state=STATE.BRAKING;}
moveDiv();break;case STATE.DECELERATING:if(ACCELERATION.level>0){ACCELERATION.level-=1;if(hasOvershot()){state=STATE.BRAKING;}}else{ACCELERATION.level=0;if(hasOvershot()){snapBack();}else{state=STATE.AT_REST;}}
moveDiv();break;case STATE.BRAKING:if(ACCELERATION.level>3){ACCELERATION.level-=4;}else{ACCELERATION.level=0;snapBack();}
moveDiv();break;case STATE.SNAPPING:snapDiv();break;}}
for(var i=0;i<ACCELERATION.length;i+=1){ACCELERATION.ramp.push(easeIn(i,0,ACCELERATION.max,ACCELERATION.length));}
$(document).ready(function(){setInterval(update,interval);projects=$("#projects");projectDivs=$(".project");container=$("#container");scrollLeft=$("#scrollleft");scrollRight=$("#scrollright");output=$("#output");var project;offset=projects.offset().left;projectDivs.each(function(){project=$(this);contentWidth+=(project.width()+parseInt(project.css("margin-left"),10)+parseInt(project.css("margin-right"),10));});contentWidth+=(parseInt(projects.css("padding-left"),10)+parseInt(projects.css("padding-right"),10));direction=DIRECTION.LEFT;state=STATE.ACCELERATING;scrollLeft.bind("touchstart",function(){$(this).addClass("active");direction=DIRECTION.LEFT;state=STATE.ACCELERATING;});scrollLeft.bind("touchend",function(){$(this).removeClass("active");direction=DIRECTION.LEFT;state=STATE.DECELERATING;});scrollRight.bind("touchstart",function(){$(this).addClass("active");direction=DIRECTION.RIGHT;state=STATE.ACCELERATING;});scrollRight.bind("touchend",function(){$(this).removeClass("active");direction=DIRECTION.RIGHT;state=STATE.DECELERATING;});scrollLeft.hover(function(){$(this).addClass("active");direction=DIRECTION.LEFT;state=STATE.ACCELERATING;},function(){$(this).removeClass("active");direction=DIRECTION.LEFT;state=STATE.DECELERATING;});scrollRight.hover(function(){$(this).addClass("active");direction=DIRECTION.RIGHT;state=STATE.ACCELERATING;},function(){$(this).removeClass("active");direction=DIRECTION.RIGHT;state=STATE.DECELERATING;});});