function move(e) {
	if (document.all?true:false) { // grab the x-y pos.s if browser is IE
		mx = event.clientX;
		my = event.clientY;
	} else {  // grab the x-y pos.s if browser is NS
		mx = Math.max(0, e.pageX);   // + catch possible negative values in NS4
		my = Math.max(0, e.pageY);
	}
}

function record() {
	this.arr = new Array();
	this.pos = 0;
	
	this.feed = function(redv, greenv, bluev) {
		ob = new Object();
		ob.red = redv;
		ob.green = greenv;
		ob.blue = bluev;
		
		this.arr.push(ob);
	}
	
	this.getv = function() {
		if (this.arr.length > 0) {
			this.pos = (this.pos+1)%this.arr.length;
			ob = this.arr[this.pos];
			return (ob);
		} else {
			//return dummy object
			ob = new Object();
			ob.red = 1.0;
			ob.green = 1.0;
			ob.blue = 1.0;
			return(ob);
		}
	}
	
	return(this);
}

function down(e) {
	mdown = true;
	
	trackNum = (trackNum + 1) % 10;
	
	tracks[trackNum] = new record();
}

function up(e) {
	mdown = false;
}


function frameloop() {
	speed = Math.sqrt(Math.pow(mx-mxo,2) + Math.pow(my-myo,2));
	if ((speed + "") == "NaN") speed = 0;

	if (speed < 1) sp2 -= 5;
	sp2 += Math.min(5,speed/10);
	sp2 = Math.max(0,Math.min(30,sp2));

	mxd = mx - mxo;
	myd = my - myo;
	
	mxo = mx;
	myo = my;
	
	if (Math.abs(mxd) + Math.abs(myd) > 5) hue = ((((Math.atan2(mxd, myd) / Math.PI) + 1.0) / 2) % 1);
	sat = Math.min(1.0, sp2/30);
	
	rgb = hsb2rgb(hue,sat,bri);
	rn = rgb[0];
	gn = rgb[1];
	bn = rgb[2];
	
	smval = 0.13;
	
	r = r + Math.max(-smval,Math.min(smval,(rn - r)));
	g = g + Math.max(-smval,Math.min(smval,(gn - g)));
	b = b + Math.max(-smval,Math.min(smval,(bn - b)));
	
	
	if(mdown) tracks[trackNum].feed(r,g,b);
	
	re = gr = bl = 1.0;
	for (i = 0; i < 10; i++) {
		ob = tracks[(1+i+trackNum)%10].getv();;
		re = 0.4 * re + 0.6 * ob.red;
		gr = 0.4 * gr + 0.6 * ob.green;
		bl = 0.4 * bl + 0.6 * ob.blue;
	}
	
	bgColor = rgb2string(re,gr,bl);

	document.bgColor = bgColor;
}

function init() {
	// den eventhandler initialisieren
	if (!document.all?true:false) {
		document.captureEvents(Event.MOUSEMOVE);
		document.captureEvents(Event.MOUSEDOWN);
		document.captureEvents(Event.MOUSEUP);
	}
	document.onmousemove = move;
	document.onmousedown = down;
	document.onmouseup = up;

	//umgebungsvariablen initialisieren
	// die fenstergröße muß browserabhängig festgestellt werden	
	midW = ((window.innerWidth == null)? document.body.clientWidth : window.innerWidth) / 2;
	midH = ((window.innerHeight == null)? document.body.clientHeight : window.innerHeight) / 2;
	// die position auf mitte setzen
	mx = midW;
	my = midH;

	hue = sat = bri = 1.0;
	r = g = b = 1.0;
	
	sp2 = 0.0;
	
	trackNum = 0;
	tracks = new Array(10);
	for (i = 0; i < 10; i++) tracks[i] = new record();
	
	// den frameloop aktivieren
	timer = window.setInterval("frameloop()", 30);
}

//globale variablen deklarieren
var hue, sat, bri;
var mx, my, mxd, myd, mxo, myo, midW, midH;
var sp2 = 0.0;
var mdown;
var rec;
var r,g,b;
var tracks, trackNum;
