/*

javascript by elenzil
http://www.elenzil.com
200109

//These should all be pre-defined before this script is included, yo.
//Then just call oxe_BallsInit ("elenzil", radius);
//      or       oxe_BallsInit2("elenzil", radius, initialVelocity);
var     oxe_FPS                 =       20;
var     oxe_ImagePfx            =       "oxe_abc001/oxe_abc001_";
var     oxe_ImageSfx            =       ".gif";
var     oxe_GravX               =       0;
var     oxe_GravY               =       0.03;
var     oxe_Friction            =       0.993;
var     oxe_GravR               =       0;//0.005;
var     oxe_XPlode              =       0.3;
var     oxe_UseMouse            =       1;
var     oxe_InitVX              =       0;      // optional. if declared, use BallsInit3
var     oxe_InitVY              =       0;      // optional. if declared, use BallsInit3
var     oxe_CB                  =       "";     // optional post-startup callback. use BallsInit4.
var     oxe_CrazyMode           =       0;      // optional. if non-zero, use BallsInit5.
var     oxe_Tweeners            =       0;      // optional. Use BallsInit6.
*/

var     oxe_InitialV            =       10;
var     oxe_InitVXUse           =       0;
var     oxe_InitVYUse           =       0;

var     oxe_Period              =       1000/oxe_FPS;
var     oxe_ns                  =       navigator.appName == "Netscape";
var     oxe_BangImg             =       oxe_ImagePfx + "bang"  + oxe_ImageSfx;
var     oxe_Tween1Img           =       oxe_ImagePfx + "tween" + oxe_ImageSfx;
var     oxe_Tween2Img           =       oxe_ImagePfx + "tween2" + oxe_ImageSfx;

var     oxe_CB1                 =       "";
var     oxe_CB1Called           =       0;

var     oxe_CrazyMode1          =       0;
var     oxe_CrazyModeNum        =       0;

var     oxe_Tween               =       0;

var     oxe_WinW;
var     oxe_WinH;
var     oxe_WinXB;
var     oxe_WinYB;
var     oxe_WinCenX;
var     oxe_WinCenY;

var     oxe_OldOnLoad;
var     oxe_OldMoveHandler;

var     oxe_Balls               =       new     Array;
var     oxe_MouseX              =       0;
var     oxe_MouseY              =       0;

var     oxe_Tweens1             =       new     Array;
var     oxe_Tweens2             =       new     Array;

var	oxe_FN_HREF		=	"";
var	oxe_FN_MouseIn		=	"";
var	oxe_FN_MouseOut		=	"";

function oxe_MoveHandler_NS(e)
  {
  oxe_MouseX = e.pageX;
  oxe_MouseY = e.pageY;

  if (oxe_OldMoveHandler)
        oxe_OldMoveHandler(e);

  return true;
  }

function oxe_MoveHandler_IE()
  {
  oxe_MouseX = window.event.x + document.body.scrollLeft;
  oxe_MouseY = window.event.y + document.body.scrollTop;

  if (oxe_OldMoveHandler)
        oxe_OldMoveHandler();
  }


function oxe_BallsImages()
        {
        var     i, inum;
        var     s;
        var     ball;

        inum    =       oxe_Balls.length;

        if (oxe_UseMouse)
                inum--;

        for (i = 0; i < inum; i++)
                {
                ball                    =       oxe_Balls[i];

                if (ball.bang == 1)
                        {
                        if (ball.imgIsBang == 0)
                                {
                                ball.theImage.src       =       oxe_BangImg;
                                ball.imgIsBang          =       1;
                                }
                        }
                else
                        {
                        if (ball.imgIsBang == 1)
                                {
                                ball.theImage.src       =       ball.img;
                                ball.imgIsBang          =       0;
                                }
                        }
                }
        }

function oxe_BallsPosition()
        {
        var     i, inum;
        var     s;
        var     ball;
        var     tween;
        var     tf, tfp;

        inum    =       oxe_Balls.length;

        if (oxe_UseMouse)
                inum--;

        for (i = 0; i < inum; i++)
                {
                ball            =       oxe_Balls[i];

                ball.layer.left =       ball.px;
                ball.layer.top  =       ball.py;
                }

        if (oxe_Tween >= 1)
                {
                tf      =       .85;
                tfp     =       1 - tf;
                inum    =       oxe_Tweens1.length;
                for (i = 0; i < inum; i++)
                        {
                        tween                   =       oxe_Tweens1[i];
                        ball                    =       tween.Ball1;
                        tween.px                =       tween.px * tf + ball.px * tfp;
                        tween.py                =       tween.py * tf + ball.py * tfp;
                        tween.layer.left        =       tween.px + 12;
                        tween.layer.top         =       tween.py + 12;
                        }
                }

        if (oxe_Tween >= 2)
                {
                tf      =       .90;
                tfp     =       1 - tf;
                for (i = 0; i < inum; i++)
                        {
                        tween                   =       oxe_Tweens2[i];
                        ball                    =       oxe_Tweens1[i];
                        tween.px                =       tween.px * tf + ball.px * tfp;
                        tween.py                =       tween.py * tf + ball.py * tfp;
                        tween.layer.left        =       tween.px + 13;
                        tween.layer.top         =       tween.py + 13;
                        }
                }
        }


function oxe_GetLayer(id)
	{
	if (document.getElementById)
		layer		=	document.getElementById(id);
	else if (document.all)
		layer		=	document.all[id];

	return layer;
	}

function oxe_MakeLayer(id, content)
	{
	document.write("<div style='visibility:visible;position:absolute;' id='"+id+"'>");
//	document.write("<img name="+imgname+" border=0 src='"+imgsrc+"'>");
	document.write(content);
	document.write("</div>");
	return oxe_GetLayer(id);
	}

function oxe_BallsMakeLayers()
        {
        var     i, inum, j, k;
        var     ball;
        var     name;
        var     name2;
        var     tween;
	var	layer;
	var	layerContent;


        inum    =       oxe_Balls.length;
        if (oxe_UseMouse)
                inum--;

        for (i = 0; i < inum; i++)
                {
                ball    =       oxe_Balls[i];

                name    =       "oxe_BallLayer"+i;
                name2   =       "oxe_BallImage"+i;


		layerContent	=	"";
		layerContent	+=	"<img name="+name2+" border=0 src='"+oxe_BangImg+"'>";

		ball.layer	=	oxe_MakeLayer(name, layerContent).style;
                ball.theImage   =       eval("document."+name2);
                ball.imgIsBang  =       1;
                ball.bang       =       0;
                }

        for (i = 0; i < inum && oxe_Tween >= 1; i++)
                {
                tween           =       new Object;
                oxe_Tweens1[i]  =       tween;
                tween.Ball1     =       oxe_Balls[i];
                tween.px        =       tween.Ball1.px;
                tween.py        =       tween.Ball1.py;
                name            =       "oxe_Tween1Layer"+i;
                name2           =       "oxe_Tween1Image"+i;

		layercontent	=	"<img name="+name2+" border=0 src='"+oxe_Tween1Img+"'>";
		tween.layer	=	oxe_MakeLayer(name, layercontent).style;
                tween.theImage  =       eval("document."+name2);
                tween.imgIsBang =       1;
                tween.bang      =       0;
                }

        for (i = 0; i < inum && oxe_Tween >= 2; i++)
                {
                tween           =       new Object;
                oxe_Tweens2[i]  =       tween;
                tween.Ball1     =       oxe_Balls[i];
                tween.px        =       tween.Ball1.px;
                tween.py        =       tween.Ball1.py;
                name            =       "oxe_Tween2Layer"+i;
                name2           =       "oxe_Tween2Image"+i;


		layercontent	=	"<img name="+name2+" border=0 src='"+oxe_Tween2Img+"'>";
		tween.layer	=	oxe_MakeLayer(name, layercontent).style;
                tween.theImage  =       eval("document."+name2);
                tween.imgIsBang =       1;
                tween.bang      =       0;
                }

        }


function oxe_BallsInit6(string, radius, v)
        {
        oxe_Tween       =       oxe_Tweeners;
        oxe_BallsInit5(string, radius, v);
        }

function oxe_BallsInit5(string, radius, v)
        {
        oxe_CrazyMode1  =       oxe_CrazyMode;
        oxe_BallsInit4(string, radius, v);
        }

function oxe_BallsInit4(string, radius, v)
        {
        oxe_CB1         =       oxe_CB;
        oxe_BallsInit3(string, radius, v);
        }

function oxe_BallsInit3(string, radius, v)
        {
        oxe_InitVXUse   =       oxe_InitVX;
        oxe_InitVYUse   =       oxe_InitVY;
        oxe_BallsInit2(string, radius, v);
        }

function oxe_BallsInit2(string, radius, v)
        {
        oxe_InitialV    =       v;
        oxe_BallsInit(string, radius);
        }

function oxe_BallsInit(string, radius)
        {
        var i, inum;
        var     ball;

        inum    =       string.length;
        if (inum <= 0)
                return;

        oxe_Balls.length = inum - 1;
        for (i = 0; i < inum; i++)
                {
                ball                    =       new     Object;
                ball.text               =       string.substr(i, 1);
                ball.radius             =       radius;
                ball.img                =       oxe_ImagePfx + ball.text + oxe_ImageSfx;
                ball.px                 =       (i+1) * radius * 1.8;
                ball.py                 =       (i+0) * radius;
                ball.vx                 =       (inum - i) / 2;
                ball.vy                 =       -.3 * i;
                ball.mouse              =       0;
                ball.imgIsBang          =       0;      // image is bang
                ball.bang               =       0;      // currently is collided
		ball.targ		=	0;	// Use targets ?
		ball.targX		=	0;	// Target Locale
		ball.targY		=	0;	// Target Locale
                oxe_Balls[i]            =       ball;
                }

        // Initial Positions & velocities
        var     theta;
        var     dtheta;
        var     r;
        var     tilt;

        oxe_WinGetInfo();

        theta   =       -3.14159265359 / 2.0;
        dtheta  =       3.14159265 * 2.0 / inum;
        r       =       radius / dtheta;
        r       *=      1.3;
        tilt    =       -1.2;   // the 'tilt' of the initial velocities

        for (i = 0; i < inum; i++)
                {
                ball		=       oxe_Balls[i];
                ball.px		=       Math.cos(theta       ) * r + oxe_WinCenX;
                ball.py		=       Math.sin(theta       ) * r + oxe_WinCenY;
                ball.vx		=       Math.cos(theta + tilt) * oxe_InitialV + oxe_InitVXUse;
                ball.vy		=       Math.sin(theta + tilt) * oxe_InitialV + oxe_InitVYUse;
                theta		+=      dtheta;
                }

        if (oxe_CrazyMode1      ==      1)
                {
                for (i = 0; i < inum; i++)
                        {
                        ball    =       oxe_Balls[i];
                        ball.px =       0;
                        ball.py =       0;
                        ball.vx =       0;      //      Math.cos(theta + tilt) * oxe_InitialV + oxe_InitVXUse;
                        ball.vy =       0;      //      Math.sin(theta + tilt) * oxe_InitialV + oxe_InitVYUse;
                        }
                }

        if (oxe_UseMouse)
                {
                ball                    =       new     Object;
                ball.text               =       'e';
                ball.img                =       oxe_ImagePfx + ball.text + oxe_ImageSfx;
                ball.radius             =       radius * 2;
                ball.px                 =       0;
                ball.py                 =       0;
                ball.vx                 =       0;
                ball.vy                 =       0;
                ball.mouse              =       1;
                oxe_Balls[oxe_Balls.length]     =       ball;
                if (oxe_ns)
                        {
                        oxe_OldMoveHandler      =       document.onMouseMove;
                        document.captureEvents(Event.MOUSEMOVE);
                        document.onmousemove    =       oxe_MoveHandler_NS;
                        }
                else
                        {
                        oxe_OldMoveHandler      =       document.onmousemove;
                        document.onmousemove    =       oxe_MoveHandler_IE;
                        }
                }

	// initial targets

        for (i = 0; i < inum; i++)
                {
                ball		=       oxe_Balls[i];
		ball.targX	=	ball.px;
		ball.targY	=	ball.py;
                }

        oxe_BallsMakeLayers();

        oxe_OldOnLoad   =       window.onload;
        window.onload   =       oxe_OnLoad;

        }

function oxe_WinGetInfo()
        {
        if (oxe_ns)
                {
                oxe_WinW        =       window.innerWidth  + window.pageXOffset - 10;
                oxe_WinH        =       window.innerHeight + window.pageYOffset - 10;
                oxe_WinXB       =       window.pageXOffset + 10;
                oxe_WinYB       =       window.pageYOffset + 10;
                }
        else
        {
                oxe_WinW        =       document.body.clientWidth  + document.body.scrollLeft   - 10;
                oxe_WinH        =       document.body.clientHeight + document.body.scrollTop    - 10;
                oxe_WinXB       =       document.body.scrollLeft        + 10;
                oxe_WinYB       =       document.body.scrollTop         + 10;
                }

        oxe_WinCenX     =       (oxe_WinW + oxe_WinXB) * 0.5;
        oxe_WinCenY     =       (oxe_WinH + oxe_WinYB) * 0.5;
        }

function oxe_CrazyMode1Do()
        {
        var     ball;
        var     dx, dy;
        var     r;

        ball    =       oxe_Balls[oxe_CrazyModeNum];

        dx      =       ball.px - oxe_MouseX;
        dy      =       ball.py - oxe_MouseY;

        r       =       dx * dx + dy * dy;
        r       =       Math.sqrt(r);


        if (r > ball.radius * 1.1)
                {
                oxe_CrazyModeNum++;
                ball.px =       oxe_MouseX;
                ball.py =       oxe_MouseY;
                if (oxe_CrazyModeNum < oxe_Balls.length)
                        {
                        oxe_Balls[oxe_CrazyModeNum].px  =       ball.px;
                        oxe_Balls[oxe_CrazyModeNum].py  =       ball.py;
                        }
                }
        
        }


function oxe_BallsPulse()
        {
        var i, inum;
        var     j, jnum;
        var     ball;
        var     ball2;
        var v1x, v1y;
        var v2x, v2y;
        var     fd1, fd2;
        var     f3;

        oxe_WinGetInfo();

        inum    =       oxe_Balls.length;
        jnum    =       inum;

        if (oxe_UseMouse)
                {
                inum --;
                ball =  oxe_Balls[oxe_Balls.length-1];
                ball.vx =       oxe_MouseX - ball.px;
                ball.vy =       oxe_MouseY - ball.py;
                ball.px =       oxe_MouseX;
                ball.py =       oxe_MouseY;
                }

        for (i = 0; i < inum; i++)
                {
                ball            =       oxe_Balls[i];
                ball.bang       =       0;
                }

        if (oxe_CrazyMode1 == 1 && oxe_CrazyModeNum < inum)
                {
                oxe_CrazyMode1Do();
                oxe_BallsImages();
                oxe_BallsPosition();
                return;
                }

        for (i = 0; i < inum; i++)
                {
                ball    =       oxe_Balls[i];

                if (ball.px < oxe_WinXB)
                        {
                        ball.px =       oxe_WinXB;
                        ball.vx *=      -1;
                        }
                else if (ball.px + ball.radius >= oxe_WinW)
                        {
                        ball.px =       oxe_WinW - ball.radius;
                        ball.vx *=      -1;
                        }

                if (ball.py < oxe_WinYB)
                        {
                        ball.py =       oxe_WinYB;
                        ball.vy *=      -1;
                        }
                else if (ball.py + ball.radius >= oxe_WinH)
                        {
                        ball.py =       oxe_WinH - ball.radius;
                        ball.vy *=      -1;
                        }

                for (j = i + 1; j < jnum; j++)
                        {
                        ball2   =       oxe_Balls[j];

                        v1x             =       ball2.px - ball.px;
                        v1y             =       ball2.py - ball.py;
                        f1              =       Math.sqrt(v1x * v1x + v1y * v1y) * 2;
                        f2              =       f1 - (ball.radius + ball2.radius);
                        if (f2 < 0.0)
                                {
                                ball .bang              =       1;
                                ball2.bang              =       1;
                                v2x                     =       v1x/f1;
                                v2y                     =       v1y/f1;
                                ball .px                +=      v2x * 0.6 * (f2);
                                ball .py                +=      v2y * 0.6 * (f2);
                                ball2.px                -=      v2x * 0.6 * (f2);
                                ball2.py                -=      v2y * 0.6 * (f2);

//                              fd1                     =       ball .vx * v2x + ball .vy * v2y;
//                              fd2                     =       ball2.vx * v2x + ball2.vy * v2y;

                                if (ball2.mouse)
                                        {
                                        ball .vx        -=      v1x * oxe_XPlode * .3;
                                        ball .vy        -=      v1y * oxe_XPlode * .3;
                                        ball2.vx        +=      v1x * oxe_XPlode * .3;
                                        ball2.vy        +=      v1y * oxe_XPlode * .3;
                                        }
                                else
                                        {
                                        ball .vx        -=      v1x * oxe_XPlode;
                                        ball .vy        -=      v1y * oxe_XPlode;
                                        ball2.vx        +=      v1x * oxe_XPlode;
                                        ball2.vy        +=      v1y * oxe_XPlode;
                                        }
                                }
                        }

		if (ball.targ)
			{
	                gx	=       (ball.targX - ball.px) * oxe_GravR + oxe_GravX;
        	        gy	=       (ball.targY - ball.py) * oxe_GravR + oxe_GravY;
			}
		else
			{
	                gx	=       (oxe_WinCenX - ball.px) * oxe_GravR + oxe_GravX;
        	        gy	=       (oxe_WinCenY - ball.py) * oxe_GravR + oxe_GravY;
			}

                ball.px +=      ball.vx;
                ball.py +=      ball.vy;
                ball.vx *=      oxe_Friction;
                ball.vy *=      oxe_Friction;
                ball.vx +=      gx;
                ball.vy +=      gy;
                }

        oxe_BallsImages();
        oxe_BallsPosition();
        }


function oxe_OnLoad()
        {
        oxe_Pulse();

        if (oxe_OldOnLoad)
                oxe_OldOnLoad();


        if (oxe_CB1Called == 0)
                {
                if (oxe_CB1)
                        {
                        oxe_CB1();
                        }
                oxe_CB1Called   =       1;
                oxe_BallsImages();
                }
        }

function oxe_Pulse()
        {
        oxe_BallsPulse();
        setTimeout("oxe_Pulse();", oxe_Period);
        }

