// ばねのようにマウスを追いかける画像

// Based on "Elastic Bullets" script, portions Copyright
// (C) 1999-2000 Philip Winston
// http://www.geocities.com/pwinston/ebullets/

var spring_x = 0, spring_y = 0;
var spring_array = new Array();

var spring_resist = 10;    // 空気抵抗
var spring_bounce = 0.75;  // 反発力

function spring_init() {
    var i, j;
    var div = document.getElementById(spring_id);
    if(!div) return;
    for(i = 0, j = 0; i < div.childNodes.length; i++) {
        var img = div.childNodes[i];
        if(img.nodeName != "IMG") continue;
        var img2 = document.createElement("img");
        img2.src = img.src;
        img2.style.position = "absolute";
        img2.style.left = "-20px";
        img2.style.top = "100px";
        document.body.appendChild(img2);
        
        var spr = new Object();
        spring_array[j] = spr;
        spr.x = -50;
        spr.y = 100;
        spr.dx = 0;
        spr.dy = 0;
        spr.width = 0;  if(img.width) spr.width = img.width;
        spr.height = 0; if(img.height) spr.height = img.height;
        spr.obj = img2;
        j++;
    }
    if(j > 0) setTimeout("spring_timer()", spring_interval);
}

function spring_move(e) {
    if(spring_array.length == 0) spring_init();
    if(spring_array.length == 0) return;
    
    var x, y;
    if(window.event) {
        x = event.clientX + spring_scrollleft();
        y = event.clientY + spring_scrolltop();
    }
    else if(e) {
        x = e.pageX; y = e.pageY;
    }
    spring_x = x; spring_y = y;
}

function spring_timer() {
    var i;
    for (i = 0; i < spring_array.length; i++) {
        var spr = spring_array[i];
        var x = spr.x, y = spr.y;
        var xp, yp, xn, yn;
        if(i == 0)  { xp = spring_x; yp = spring_y; }
        else { xp = spring_array[i - 1].x; yp = spring_array[i - 1].y; }
        if(i < spring_array.length - 1) {
            xn = spring_array[i + 1].x; yn = spring_array[i + 1].y;
        }
        
        var springx = 0, springy = 0;
        
        var len = Math.sqrt((xp - x)*(xp - x) + (yp - y)*(yp - y));
        if (len > spring_space) {
            var force = spring_strength * (len - spring_space);
            springx = ((xp - x) / len) * force;
            springy = ((yp - y) / len) * force;
        }
        if (i < spring_array.length - 1) {
            var len = Math.sqrt((xn - x)*(xn - x) + (yn - y)*(yn - y));
            if (len > spring_space) {
                var force = spring_strength * (len - spring_space);
                springx += ((xn - x) / len) * force;
                springy += ((yn - y) / len) * force;
            }
        }
        
        var accelx = (springx + -spr.dx * spring_resist);
        var accely = (springy + -spr.dy * spring_resist) + spring_grav;
        
        spr.dx += accelx * 0.01;
        spr.dy += accely * 0.01;
        
        if (Math.abs(spr.dx) < 0.1 && Math.abs(spr.dy) < 0.1 &&
            Math.abs(accelx) < 0.1 && Math.abs(accely) < 0.1) {
            spr.dx = 0;
            spr.dy = 0;
        }
        
        spr.x += spr.dx;
        spr.y += spr.dy;
        
        if(spr.y - spring_scrolltop() > spring_winheight() - spr.height - 1) {
            if(spr.dy > 0) spr.dy = spring_bounce * -spr.dy;
            spr.y = spring_scrolltop() + spring_winheight() - spr.height - 1;
        }
        if(spr.x - spring_scrollleft() > spring_winwidth() - spr.width - 1) {
            if(spr.dx > 0) spr.dx = spring_bounce * -spr.dx;
            spr.x = spring_scrollleft() + spring_winwidth() - spr.width - 1;
        }
        if(spr.x - spring_scrollleft() < 0) {
            if(spr.dx < 0) spr.dx = spring_bounce * -spr.dx;
            spr.x = spring_scrollleft();
        }
        
        spr.obj.style.left = Math.floor(spr.x) + "px";
        spr.obj.style.top = Math.floor(spr.y) + "px";
    }
    setTimeout("spring_timer()", spring_interval);
}

/* ------------------------------------
  ウィンドウの幅取得
------------------------------------ */
function spring_winwidth () {
    if(document.compatMode == "CSS1Compat") {
        return document.body.parentNode.clientWidth;
    }
    else if(document.body && document.body.clientWidth)
        return document.body.clientWidth;
    else if(self.innerWidth)
        return self.innerWidth;
    return 400;
}

/* ------------------------------------
  ウィンドウの高さ取得
------------------------------------ */
function spring_winheight () {
    if(document.compatMode == "CSS1Compat") {
        return document.body.parentNode.clientHeight;
    }
    else if(document.body && document.body.clientHeight)
        return document.body.clientHeight;
    else if(self.innerHeight)
        return self.innerHeight;
    return 600;
}

/* ------------------------------------
  スクロール領域の上端
------------------------------------ */
function spring_scrolltop () {
    if(document.compatMode == "CSS1Compat") {
        return document.body.parentNode.scrollTop;
    }
    else if(document.body && document.body.scrollTop) {
        return document.body.scrollTop;
    }
    else if(self.pageYOffset)
        return self.pageYOffset;
    return 0;
}

/* ------------------------------------
  スクロール領域の左端
------------------------------------ */
function spring_scrollleft () {
    if(document.compatMode == "CSS1Compat") {
        return document.body.parentNode.scrollLeft;
    }
    else if(document.body && document.body.scrollLeft) {
        return document.body.scrollLeft;
    }
    else if(self.pageXOffset)
        return self.pageXOffset;
    return 0;
}

if(document.getElementById) document.onmousemove = spring_move;
