<!-- Adopted from google eyes by mikel -->
<!-- With thanks to Keith Packard and Jeremy Huxtable and Dylan Parker -->

var WEBEYES = {
MAX_DIST_X : 5, 
MAX_DIST_Y : 8, 
EYE_RADIUS_X : 10, 
EYE_RADIUS_Y : 13, 
PUPIL_RADIUS_X : 3, 
PUPIL_RADIUS_Y : 4, 

pupils : [],

init : function() {
var app = WEBEYES;
// setup our mousemove handler
if (document.addEventListener) {
document.addEventListener("mousemove", app.moveEyes, true);
} else if (document.attachEvent) {
document.attachEvent("onmousemove", app.moveEyes);
}

// grab references to the pupils
app.pupils = [ document.getElementById("WEBEYES_pupil0"), document.getElementById("WEBEYES_pupil1"), document.getElementById("WEBEYES_pupil2"), document.getElementById("WEBEYES_pupil3") ];

},

moveEyes : function(e) {
if (!e) e = window.event;
var app = WEBEYES;

for (var i = 0; i < app.pupils.length; i++) {
var pupil = app.pupils[i];

// The middle points of the eyes
var midx = app.getPagePos(pupil.parentNode,true) + app.EYE_RADIUS_X;
var midy = app.getPagePos(pupil.parentNode,false) + app.EYE_RADIUS_Y;


// The distX/distY from eye middles to the mouse
var distX = e.clientX + document.documentElement.scrollLeft - midx;
var distY = e.clientY + document.documentElement.scrollTop - midy;

// The absolute distance from eye middles to the mouse
var dist = Math.sqrt(Math.pow(distX, 2) + Math.pow(distY, 2));

// The relative distance from eye middles to the eyeball edge
var angle = Math.asin(distY / dist);
var relaX = Math.pow((Math.cos(angle) * app.MAX_DIST_Y), 2) / (1 - Math.pow((Math.cos(angle) / app.MAX_DIST_X), 2) * (Math.pow(app.MAX_DIST_X, 2) - Math.pow(app.MAX_DIST_Y, 2)));
var relaY = Math.pow((Math.sin(angle) * app.MAX_DIST_X), 2) / (1 + Math.pow((Math.sin(angle) / app.MAX_DIST_Y), 2) * (Math.pow(app.MAX_DIST_X, 2) - Math.pow(app.MAX_DIST_Y, 2)));
var reladist = Math.sqrt(relaX + relaY);

if (dist > reladist) {
// mouse out of eyeball, scale distX/distY to be at eyeball edge
var scale = reladist / dist;
distX *= scale; distY *= scale;
}

// Place the pupil appropriately
pupil.style.left = parseInt(distX + app.EYE_RADIUS_X - app.PUPIL_RADIUS_X) + "px";
pupil.style.top = parseInt(distY + app.EYE_RADIUS_Y - app.PUPIL_RADIUS_Y-1) + "px";
}
},


// get page coords for an element
getPagePos : function(el, left) {
var val=0;
while(el != null) {
val += el["offset"+(left?"Left":"Top")];
el = el.offsetParent;
}
return val;
}

};

WEBEYES.init();
