﻿var nDots = 7;
var Xpos = 0;
var Ypos = 0;
var DELTAT = .01;
var SEGLEN = 10;
var SPRINGK = 10;
var MASS = 1;
var GRAVITY = 50;
var RESISTANCE = 10;
var STOPVEL = 0.1;
var STOPACC = 0.1;
var DOTSIZE = 30;
var BOUNCE = 0.75;
var isExplorer = false;
var followmouse = true;
var dots = new Array();
var run=true;
var runText = 'make the little boats STOP';
var haltText = 'make the little boats sail';

if(navigator.appName == 'Microsoft Internet Explorer')
	isExplorer = true;

if(isExplorer)
	document.onmousemove = MoveHandlerIE;
else{
	document.captureEvents(Event.MOUSEMOVE);
	document.onmousemove = MoveHandler;
}

if(which = getCookie('boatsGo')){
	obj = document.getElementById('stopallready');
	if(which == 'true'){
		if(obj)
			obj.innerHTML = runText;
		run = true;
	}
	else{
		if(obj)
			obj.innerHTML = haltText;
		run = false;	
	}
}else{
	setCookie('boatsGo','true',100);
}

init();

function setCookie(c_name,value,expiredays)
{
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+expiredays);
	document.cookie=c_name+ "=" + escape(value) + ((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}

function getCookie(c_name)
{
	if (document.cookie.length>0){
		c_start=document.cookie.indexOf(c_name + "=");
		if (c_start!=-1){
			c_start=c_start + c_name.length+1;
			c_end=document.cookie.indexOf(";",c_start);
			if (c_end==-1) c_end=document.cookie.length;
			return unescape(document.cookie.substring(c_start,c_end));
		}
	  }
	return "";
}

function makeThemStopGo(){
	obj = document.getElementById('stopallready');
 	if (run == true){
 		setCookie('boatsGo','false',100);
 		obj.innerHTML = haltText;
 		run = false;
 	}
 	else{
 		setCookie('boatsGo','true',100);
 		obj.innerHTML = runText;
 		run = true;
 	}
}

function init(){
	var i = 0;
	for (i = 0; i < nDots; i++){
		dots[i] = new dot(i);
	}	
	for (i = 0; i < nDots; i++){ 
		dots[i].obj.left = dots[i].X;  dots[i].obj.top = dots[i].Y;
	}	
	dots[0].obj.visibility = 'hidden';
	setTimeout(startanimate, 500);
}

function startanimate() {	
	setInterval(animate, 20)
}

function dot(i) {
	this.X = Xpos;
	this.Y = Ypos;
	this.dx = 0;
	this.dy = 0;
	this.obj = document.getElementById('dot' + i).style;
}

function setInitPositions(dots) {
	var startloc = document.all.tags("LI");
	var i = 0;
	for (i = 0; i < startloc.length && i < (nDots-1); i++) {
		dots[i+1].X = startloc[i].offsetLeft
		startloc[i].offsetParent.offsetLeft - DOTSIZE;
		dots[i+1].Y = startloc[i].offsetTop +
		startloc[i].offsetParent.offsetTop + 2*DOTSIZE;
	}
	dots[0].X = dots[1].X;
	dots[0].Y = dots[1].Y - SEGLEN;
}

function MoveHandler(e) {
	Xpos = e.pageX;
	Ypos = e.pageY;	
	return true;
}

function MoveHandlerIE() {
	Xpos = window.event.clientX;
	Ypos = window.event.clientY;
}


function vec(X, Y){
	this.X = X;
	this.Y = Y;
}

function springForce(i, j, spring){
	var dx = (dots[i].X - dots[j].X);
	var dy = (dots[i].Y - dots[j].Y);
	var len = Math.sqrt(dx*dx + dy*dy);
	if (len > SEGLEN) {
		var springF = SPRINGK * (len - SEGLEN);
		spring.X += (dx / len) * springF;
		spring.Y += (dy / len) * springF;
   }
}

function animate() {	
	var start = 0;
	if (followmouse) {
		dots[0].X = Xpos;
		dots[0].Y = Ypos;	
		start = 1;
	}
	for (i = start ; i < nDots; i++ ) {
		var spring = new vec(0, 0);
		dots[i].obj.visibility = 'hidden';
		if (i > 0) {
			springForce(i-1, i, spring);
		}
		if (i < (nDots - 1)) {
			springForce(i+1, i, spring);
		}
		var resist = new vec(-dots[i].dx * RESISTANCE, -dots[i].dy * RESISTANCE);
		var accel = new vec((spring.X + resist.X)/ MASS, (spring.Y + resist.Y)/ MASS + GRAVITY);
		dots[i].dx += (DELTAT * accel.X);
		dots[i].dy += (DELTAT * accel.Y);
		if (Math.abs(dots[i].dx) < STOPVEL && Math.abs(dots[i].dy) < STOPVEL &&	Math.abs(accel.X) < STOPACC && Math.abs(accel.Y) < STOPACC) {
			dots[i].dx = 0;
			dots[i].dy = 0;
		}
		dots[i].X += dots[i].dx;
		dots[i].Y += dots[i].dy;
		var height, width;	
		if (isExplorer){	
			height = document.body.clientHeight + document.body.scrollTop;
			width = document.body.clientWidth + document.body.scrollLeft;
		}
		else{
			height = window.innerHeight  // + document.scrollTop;
			width = window.innerWidth  // + document.scrollLeft;
		} 			
/*(		if (dots[i].Y >=  height - DOTSIZE - 1) {  This would keep the boats from going below the bottom of the screen.
			if (dots[i].dy > 0) {
				dots[i].dy = BOUNCE * -dots[i].dy;
			}
			dots[i].Y = height - DOTSIZE - 1;
		}*/
		
		if (dots[i].X >= width - DOTSIZE) {
			if (dots[i].dx > 0) {
				dots[i].dx = BOUNCE * -dots[i].dx;
			}
			dots[i].X = width - DOTSIZE - 1;
		}
		
		if (dots[i].X < 0) {
			if (dots[i].dx < 0) {
				dots[i].dx = BOUNCE * -dots[i].dx;
			}
			dots[i].X = 0;
		}
		
		dots[i].obj.left = dots[i].X + 'px';			
		dots[i].obj.top =  dots[i].Y + 'px';
		if(run==true && i>0) dots[i].obj.visibility = 'visible';		
	}
}




