<!-- hide code

/*
Elastic Trail script (By Philip Winston @ pwinston@yahoo.com, URL: http://www.geocities.com/pwinston/)
Script featured on Dynamicdrive.com
For this and 100's more DHTML scripts, visit http://dynamicdrive.com
*/

var EMTDots = 0;
var EMTisNetscape = navigator.appName=="Netscape";

var EMT_Xpos = 0;
var EMT_Ypos = 0;
var dots = new Array();

//
// Most are actually defined in the function
//

// fixed time step, no relation to real time
   // var DELTAT = .01;

// size of one spring in pixels
   // var SEGLEN = 10;

// spring constant, stiffness of springs
   // var SPRINGK = 10;

// all the physics is bogus, just picked stuff to make it look okay
   // var MASS = 1;

// Positive XGRAVITY pulls right, negative pulls left
// Positive YGRAVITY pulls down, negative up
   // var XGRAVITY = 0;
   // var YGRAVITY = 50;

// RESISTANCE determines a slowing force proportional to velocity
   // var RESISTANCE = 10;

// stopping criterea to prevent endless jittering
// doesn't work when sitting on bottom since floor
// doesn't push back so acceleration always as big as gravity
   // var STOPVEL = 0.1;
   // var STOPACC = 0.1;
   // var DOTSIZE = 11;

// BOUNCE is percent of velocity retained when 
// bouncing off a wall
   // var BOUNCE = 0.75;

// always on for now, could be played with to
// let dots fall to botton, get thrown, etc.
   // var followmouse = true;


if (EMTisNetscape) {
    document.captureEvents(Event.MOUSEMOVE);
    document.onMouseMove = EMTMoveHandler;
} else {
    document.onmousemove = EMTMoveHandlerIE;
}


function EMTinit( ndots )
{
    EMTDots = ndots
    var i = 0;
    for (i = 0; i < EMTDots; i++) {
        dots[i] = new EMTdot(i);
    }
    
    if (!EMTisNetscape) {
        // I only know how to read the locations of the 
        // <LI> items in IE
        //skip this for now
        // setInitPositions(dots)
    }
    
    // set their positions
    for (i = 0; i < EMTDots; i++) {
        dots[i].obj.left = dots[i].X;
        dots[i].obj.top = dots[i].Y;
    }
    
    
    if (EMTisNetscape) {
        // start right away since they are positioned
        // at 0, 0
        EMTstartanimate();
    } else {
        // let dots sit there for a few seconds
        // since they're hiding on the real bullets
        setTimeout("EMTstartanimate()", 1000);
    }
}



function EMTdot(i) 
{
    this.X = EMT_Xpos;
    this.Y = EMT_Ypos;
    this.dx = 0;
    this.dy = 0;
    if (EMTisNetscape) {	
        this.obj = eval("document.EMTdot" + i);
    } else {
        this.obj = eval("EMTdot" + i + ".style");
    }
}


function EMTstartanimate() {	
    setInterval("EMTanimate()", 20);
}


// This is to line up the bullets with actual LI tags on the page
// Had to add -DOTSIZE to X and 2*DOTSIZE to Y for IE 5, not sure why
// Still doesn't work great.
/************************
function setInitPositions(dots)
{
    // initialize dot positions to be on top 
    // of the bullets in the <ul>
    var startloc = document.all.tags("LI");
    var i = 0;
    for (i = 0; i < startloc.length && i < (EMTDots - 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;
    }
    // put 0th dot above 1st (it is hidden)
    dots[0].X = dots[1].X;
    dots[0].Y = dots[1].Y - SEGLEN;
}
**********************/

// just save mouse position for EMTanimate() to use
function EMTMoveHandler(e)
{
    EMT_Xpos = e.pageX;
    EMT_Ypos = e.pageY;	  
    return true;
}

// just save mouse position for EMTanimate() to use
function EMTMoveHandlerIE() {
    EMT_Xpos = window.event.x + document.body.scrollLeft;
    EMT_Ypos = window.event.y + document.body.scrollTop;	  
}


function EMTvec(X, Y)
{
    this.X = X;
    this.Y = Y;
}

// adds force in X and Y to spring for dot[i] on dot[j]
function EMTspringForce(i, j, spring)
{
  var SPRINGK = 10;
  var SEGLEN = 10;

    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 EMTanimate() {
  var DELTAT = .01;
  var MASS = 1;
  var XGRAVITY = 0;
  var YGRAVITY = 50;
  var RESISTANCE = 10;
  var STOPVEL = 0.1;
  var STOPACC = 0.1;
  var DOTSIZE = 11;
  var BOUNCE = 0.75;
  var followmouse = true;
	
    // dots[0] follows the mouse,
    // though no dot is drawn there
    var start = 0;
    if (followmouse) {
        dots[0].X = EMT_Xpos;
        dots[0].Y = EMT_Ypos;	
        start = 1;
    }
    
    for (i = start ; i < EMTDots; i++ ) {
        
        var spring = new EMTvec(0, 0);
        if (i > 0) {
            EMTspringForce(i-1, i, spring);
        }
        if (i < (EMTDots - 1)) {
            EMTspringForce(i+1, i, spring);
        }
        
        // air resisitance/friction
        var resist = new EMTvec(-dots[i].dx * RESISTANCE,
            -dots[i].dy * RESISTANCE);
        
        // compute new accel, including gravity
        var accel = new EMTvec((spring.X + resist.X)/MASS + XGRAVITY,
            (spring.Y + resist.Y)/ MASS + YGRAVITY);
        
        // compute new velocity
        dots[i].dx += (DELTAT * accel.X);
        dots[i].dy += (DELTAT * accel.Y);
        
        // stop dead so it doesn't jitter when nearly still
        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;
        }
        
        // move to new position
        dots[i].X += dots[i].dx;
        dots[i].Y += dots[i].dy;
        
        // get size of window
        var height, width;
        if (EMTisNetscape) {
            height = window.innerHeight + window.pageYOffset;
            width = window.innerWidth + window.pageXOffset;
        } else {	
            height = document.body.clientHeight + document.body.scrollTop;
            width = document.body.clientWidth + document.body.scrollLeft;
        }
        
        // bounce off 3 walls (leave ceiling open)
        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;
        }
        
        // move img to new position
        dots[i].obj.left = dots[i].X;			
        dots[i].obj.top =  dots[i].Y;		
    }
}

// end code hiding -->