// MouseTrail-Effekt

var nDots=8;

var DivHTML="";

if (document.all&&window.print)

document.body.style.Text="overflow-x:hidden;overflow-y:scroll"

var Xpos=0;

var Ypos=0;

// Zeitabstand der Aktualisierungen - keine Echzeit

var DELTAT=.01;

// Floatingspanne in Pixeln

var SEGLEN=10;

// Spielraum beim Floaten

var SPRINGK=10;

// Allgemeine physische Angaben

var MASS=1;

var GRAVITY=50;

var RESISTANCE=10;

// Abbruchkriterien gegen Endlosschleife

var STOPVEL=0.1;

var STOPACC=0.1;

var DOTSIZE=22;

// BOUNCE ist der Prozentsatz der Beschleunigung, der nach dem Abprall übrigbleibt

var BOUNCE=0.75;

var isNetscape=navigator.appName=="Netscape";

if(!document.images)

{var isIE3="true";}

// Followmouse ist immer an!

var followmouse=true;

var dots=new Array();

if(!isNetscape && !isIE3)

{for(i=0;i<= nDots-1;i++)

{var width=22;

var Zufall=Math.random();

if(Zufall!=0)

{if(Zufall<0.5){var Zufall=Zufall+0.5}}

width=parseInt(width*Zufall);

if(i==0)

{DivHTML += "<div id='dot"+i+"' style='position: absolute; visibility: hidden; height: "+width+"; width: "+width+";'><img src='blase.gif'></div>\n"}

else {DivHTML += "<div id='dot"+i+"' style='position: absolute; visibility: visible; height: "+width+"; width: "+width+";'><img src='blase.gif'></div>\n"}}

document.write(DivHTML);}



init();

function init()

{if(!isNetscape && !isIE3)

{var i=0;

 for (i=0;i<nDots;i++)

 {dots[i]=new dot(i);}

 if (!isNetscape)

 {}

 // Positionen

 for (i=0;i<nDots;i++)

 {dots[i].obj.left=dots[i].X;dots[i].obj.top=dots[i].Y;}

 if (isNetscape)

 {startanimate();}

 else

 {setTimeout("startanimate()", 2000);}}}



function dot(i)

{this.X=Xpos;this.Y=Ypos;this.dx=0;this.dy=0;

 if(isNetscape){this.obj=eval("document.dot"+i);}

 else{this.obj=eval("dot"+i+".style");}}



function startanimate()

{setInterval("animate()", 20);}



// Anordnung

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;}



// Speichern der Mouseposition für Verwendung durch animate()

function MoveHandler(e)

{Xpos=e.pageX;

Ypos=e.pageY;

return true;}



// Speichern der Mouseposition für Verwendung durch animate()

function MoveHandlerIE()

{Xpos=window.event.x+document.body.scrollLeft;Ypos=window.event.y+document.body.scrollTop;}



if (isNetscape)

{document.captureEvents(Event.MOUSEMOVE);document.onMouseMove=MoveHandler;}

else

{document.onmousemove=MoveHandlerIE;}



function vec(X, Y)

{this.X=X;this.Y=Y;}



// addier die Kräfte X und Y für Hüpfer von dot[i] auf dot[j]

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);

if (i>0){springForce(i-1,i,spring);}

if (i<(nDots-1)){springForce(i+1,i,spring);}

    // Luftwiderstand

var resist=new vec(-dots[i].dx*RESISTANCE,-dots[i].dy*RESISTANCE);

// Berechnung der neuen Beschleunigung unter Einbeziehung der Gravität

var accel=new vec((spring.X+resist.X)/MASS,(spring.Y + resist.Y)/ MASS + GRAVITY);

// Berechnung der neuen Geschwindigkeit

dots[i].dx+=(DELTAT*accel.X);

dots[i].dy+=(DELTAT*accel.Y);

// Stoppen bei zu geringer Bewegung

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;}

// Bewegung

dots[i].X+=dots[i].dx;

dots[i].Y+=dots[i].dy;

// ermittelt die Fenstergröße

var height, width;

if (isNetscape)

{height=window.innerHeight+document.scrollTop;

width=window.innerWidth+document.scrollLeft;}

else

{height=document.body.clientHeight+document.body.scrollTop;

width=document.body.clientWidth+document.body.scrollLeft;}

// Abprallen von 3 Wänden (nicht Oberkante)

if (dots[i].Y>=height-DOTSIZE-1)

{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;}

// Bewegung

dots[i].obj.left=dots[i].X;

dots[i].obj.top=dots[i].Y;}}