function Defined (strObj) { return "undefined" != typeof (eval (strObj)); }
var fImages = Defined ("document.images") ? 1 : 0;
var fNav4   = (Defined ("document.layers")) ? 1 : 0;
var fExp4   = (Defined ("document.all") && ("Win32" == eval ("navigator.platform"))) ? 1 : 0;
var fVer4   = fExp4 || fNav4;

var gstrOnLoad = "";
function OnLoadAdd (strCmd) { gstrOnLoad += strCmd +";"; onload=OnLoadEval; }
function OnLoadEval () { setTimeout ('eval (gstrOnLoad)', 200); }

var winWidth = window.innerWidth;
var winHeight = window.innerHeight;

function onResize() 
{
  if (fNav4 && ("Win32" == eval ("navigator.platform")) && (window.innerWidth != winWidth || window.innerHeight != winHeight) ) 
  {
    location.reload();
  }
}

// ------------ IMAGES -------------

var gnResetDelay = 500;
var garImages = new Array ();
var gidTimeout = null;
var gfImgComplete = 0;
var gstrOperators = "=+-*/%!&|~^<>";
var garCommands = new Array ();


function ImgUpdate ()
{
  if (! gfImgComplete) return;
  for (var nImage = 0; nImage < garImages.length; ++ nImage)
  {
    var Img = garImages [nImage];
    if (Img.fModified)
    {
      Img.src = Img.strSrc;
      Img.fModified = 0;
    }
  }
}

function ImgOnLoad ()
{
  for (var nImage = 0; nImage < document.images.length; ++ nImage)
  {
    var Img = document.images [nImage];
    if (("object" != typeof Img) || (! Img.src) || (! Img.name))
      continue;
    var nDotPos = Img.src.lastIndexOf ('.');
    if ((nDotPos < 2) || ("0" != Img.src.charAt (nDotPos - 1)))
      continue;
    var strPhases = Img.src.charAt (nDotPos - 2);
    if (! (("2" <= strPhases) && ("9" >= strPhases)))
      continue;
   
    ImgInit (Img);

    var nPhases = parseInt (strPhases);
    Img.arPhases = new Array ();
    for (var nPhase = 0; nPhase < nPhases; ++ nPhase)
    {
      Img.arPhases ["img"+ nPhase] = new Image ();
      Img.arPhases ["img"+ nPhase].src = ImgSrc (Img.src, nPhase);
    }
    garImages [garImages.length] = Img;
  }
  gfImgComplete = 1;
  ImgUpdate ();
}

if (fImages) OnLoadAdd ("ImgOnLoad ()");

//------------ ANIM -------------

var blnDebug = 0;

function InitMethods (strClass)
{
  var strCode = '';
  for (numArg = 1; numArg < InitMethods.arguments.length; ++ numArg)
    strCode += strClass +'.prototype.'+ InitMethods.arguments[numArg] +'='+ InitMethods.arguments[numArg] +';';
  eval (strClass +'.prototype.mblnInit=1');
  return strCode;
}

function GetEvent ()
{
  return window.event ? window.event : window.parent.frames[0].event;
}

function GetTime ()
{
  var refDate = new Date ();
  var numResult = refDate.getTime ();
  refDate = null;
  return numResult;
}

function HandleEvent ()
{
//==== HandleEvent METHODS

function Add (refProc, grefScrn)
{
  HandleEvent.refHandler = refProc;
  HandleEvent.mgrefScrn = grefScrn;
  if (fExp4) { with (grefScrn.mrefEl)
  {
  	document.onmousedown = HandleEvent.EventMouseDown
  	document.onmouseup   = HandleEvent.EventMouseUp
    document.onkeyup     = HandleEvent.EventKeyUp;
    document.onkeydown   = HandleEvent.EventKeyDown;
    document.onkeypress  = HandleEvent.EventKeyPress;
  }}
  else
  {
  	document.onmousedown = HandleEvent.EventMouseDown
  	document.onmouseup   = HandleEvent.EventMouseUp
  }
  document.onkeyup     = HandleEvent.EventKeyUp;
  document.onkeydown   = HandleEvent.EventKeyDown;
  document.onkeypress  = HandleEvent.EventKeyPress;
  if (!fExp4) document.captureEvents (Event.KEYUP|Event.KEYDOWN|Event.KEYPRESS|Event.MOUSEDOWN|Event.MOUSEUP);
}

function EventMouseDown (e)
{
	var x; var y;
  if (fExp4)
  {
    var refEvent = GetEvent ();
		x = refEvent.x
		y = refEvent.y + document.body.scrollTop
  }
  else
  {
    var refScrn = HandleEvent.mgrefScrn;
    if (e.which != 1) return true;
		x = e.pageX - refScrn.mnumPageX;
		y = e.pageY - refScrn.mnumPageY;
    if (x < 0 || x > refScrn.mboxPos.W || y < 0 || y > refScrn.mboxPos.H) return true;
  }

	if (StatSprite.mrefOverFired)
  {
    (HandleEvent.refHandler) ('mousedown', StatSprite.mrefOverFired);
		return false;
	}
  return true;
}

function EventMouseUp(e)
{
	var x; var y;
  if (fExp4)
  {
    var refEvent = GetEvent ();
		x = refEvent.x
		y = refEvent.y + document.body.scrollTop
  }
  else
  {
    var refScrn = HandleEvent.mgrefScrn;
    if (e.which != 1) return true;
		x = e.pageX - refScrn.mnumPageX;
		y = e.pageY - refScrn.mnumPageY;
    if (x < 0 || x > refScrn.mboxPos.W || y < 0 || y > refScrn.mboxPos.H) return true;
  }

	if (StatSprite.mrefOverFired)
  {
    (HandleEvent.refHandler) ('mouseup', StatSprite.mrefOverFired);
		return false;
	}
  return true;
}

function EventKeyUp (e)
{
  var key;
  if(fExp4) { var refEvent = GetEvent (); key = refEvent.keyCode; }
  else      { key = e.which; }
  (HandleEvent.refHandler) ('keyup', key);
}

function EventKeyDown (e)
{
  var key;
  if(fExp4) { var refEvent = GetEvent (); key = refEvent.keyCode; }
  else      { key = e.which; }
  (HandleEvent.refHandler) ('keydown', key);
}

function EventKeyPress (e)
{
  var key;
  if(fExp4) { var refEvent = GetEvent (); key = refEvent.keyCode; }
  else      { key = e.which; }
  (HandleEvent.refHandler) ('keypress', key);
}

//==== HandleEvent CONSTRUCTOR

if (! this.mblnInit) eval (InitMethods ('HandleEvent', 'Add',
  'EventMouseDown', 'EventMouseUp',
  'EventKeyUp', 'EventKeyDown', 'EventKeyPress'));

//==== HandleEvent END

}

var HandleEvent = new HandleEvent ();

function Box (numX, numY, numW, numH)
{
//==== BOX METHODS

function MoveBy (numX, numY)
{
  if ('object' == typeof (numX))
  {
    this.X += numX.X;
    this.Y += numX.Y;
  }
  else
  {
    this.X += numX;
    this.Y += numY;
  }
}

function hll (d) { this.X = d.X; }                 
function vtt (d) { this.Y = d.Y; }                
function hlr (d) { this.X = d.X + d.W; }           
function vtb (d) { this.Y = d.Y + d.H; }          
function hlc (d) { this.X = d.X + d.W/2; }         
function vtc (d) { this.Y = d.Y + d.H/2; }        
function hrl (d) { this.X = d.X - this.W; }           
function vbt (d) { this.Y = d.Y - this.H; }          
function hrr (d) { this.X = d.X + d.W - this.W; }     
function vbb (d) { this.Y = d.Y + d.H - this.H; }    
function hrc (d) { this.X = d.X + d.W/2 - this.W; }   
function vbc (d) { this.Y = d.Y + d.H/2 - this.H; }  
function hcl (d) { this.X = d.X - this.W/2; }         
function vct (d) { this.Y = d.Y - this.H/2; }        
function hcr (d) { this.X = d.X + d.W - this.W/2; }   
function vcb (d) { this.Y = d.Y + d.H - this.H/2; }  
function hcc (d) { this.X = d.X + d.W/2 - this.W/2; } 
function vcc (d) { this.Y = d.Y + d.H/2 - this.H/2; }
function hnn (d) { }                            
function vnn (d) { }

function Align (strMode, boxDest)
{
  this['h'+ strMode.substring (0,2)] (boxDest);
  this['v'+ strMode.substring (2,4)] (boxDest);
}

function AsString ()
{
  return 'Box ('+ this.X +', '+ this.Y +', '+ this.W +', '+ this.H +')';
}

function Compare (boxDest)
{
  with (boxDest) 
    return (this.X == X) && (this.Y == Y) && (this.W == W) && (this.H == H);
}

//==== BOX CONSTRUCTOR

if (! this.mblnInit) eval (InitMethods ('Box', 'MoveBy', 'Align', 'AsString', 'Compare',
  'hll', 'vtt', 'hlr', 'vtb', 'hlc', 'vtc', 'hrl', 'vbt', 'hrr', 'vbb', 'hrc', 
  'vbc', 'hcl', 'vct', 'hcr', 'vcb', 'hcc', 'vcc', 'hnn', 'vnn'));

if ('object' == typeof (numX))
{
  if (null == numY)
  {
    this.X = numX.X;
    this.Y = numX.Y;
  }
  else
  {
    eval ("this.X = numX.X + numY.X; this.Y = numX.Y + numY.Y;");
  }
  this.W = numX.W;
  this.H = numX.H;
}
else
{
  this.X = numX;
  this.Y = numY;
  this.W = numW;
  this.H = numH;
}

//==== BOX END
}

function Screen (strId, numX, numY, numW, numH, strBgColor)
{
//==== SCREEN METHODS

function Update ()
{
  this.mboxPos = new Box (this.mnumIniPos);
  this.mnumPageX = this.mboxPos.X;
  this.mnumPageY = this.mboxPos.Y;
  if (fExp4)
  { 
    this.mrefEl.document.body.style.backgroundColor = this.mstrBgColor;
    with (document.all[this.mstrId])
    {
      style.width = this.mboxPos.W;
      style.height = this.mboxPos.H;
      this.mstrCmdShow = 'document.all["'+ this.mstrId +'"].style.visibility = "visible"';
//      style.visibility = 'visible';
    }
  }
  else
  {
    this.mnumPageX += this.mrefEl.pageX;
    this.mnumPageY += this.mrefEl.pageY;
  }
  this.mboxClip = new Box (0, 0, this.mboxPos.W, this.mboxPos.H);
}

//==== SCREEN CONSTRUCTOR

if (! this.mblnInit) eval (InitMethods ('Screen', 'Update'));

this.mstrId       = (fExp4 ? 'ifr' : 'lyr') + strId;
this.mrefEl       = fExp4 ? document.frames[this.mstrId] : document.layers [this.mstrId];
this.mnumIniPos   = new Box (numX, numY, numW, numH);
this.mstrBgColor  = (fExp4 && null == strBgColor) ? document.body.bgColor : strBgColor;
this.mstrCmdShow  = null;
this.Update ();

//==== SCREEN END
}

function Sprite (refScrn, numW, numH)
{

//==== SPRITE METHODS

function IsVisible  () { return this.mblnVisible; }
function GetZIndex  () { return this.mnumZIndex;  }
function GetBgColor () { return this.mnumBgColor; }
function GetContent () { return this.mstrContent; }

function SetVisible (blnYes)
{
  if (blnYes != this.mblnVisible)
  {
    this.mblnVisible = blnYes ? 1 : 0;
    this.mrefChanged [blnYes ? 'Show' : 'Hide'] = 1;
  }
}

function SetZIndex (numZIndex)
{
  if (numZIndex != this.mnumZIndex)
  {
    this.mnumZIndex = numZIndex;
    this.mrefStyle.ZIndex = this.mnumZIndex;
    this.mrefChanged ['ZIndex'] = 1;
  }
}

function UpdZIndex ()
{
  if (blnDebug) alert ("update ZIndex: "+ this.mnumZIndex);
  this.mrefStyle.ZIndex = this.mnumZIndex;
}

function SetCursor (strCursor)
{
  this.mrefStyle.cursor = strCursor;
}

function GetBgColor ()
{
  return this.mstrBgColor;
}

function SetBgColor (strBgColor)
{
  if (strBgColor != this.mstrBgColor)
  {
    this.mstrBgColor = strBgColor;
    this.mrefChanged ['BgColor'] = 1;
  }
}

function UpdBgColor ()
{
  if (blnDebug) alert ("update BgColor: "+ this.mstrBgColor);
  if (fExp4) this.mrefStyle.backgroundColor = this.mstrBgColor ? this.mstrBgColor : 'transparent';
  else       this.mrefStyle.bgColor         = this.mstrBgColor ? this.mstrBgColor : null;
}

function SetContent (strContent)
{
  if (strContent != this.mstrContent)
  {
    this.mstrContent = strContent;
    this.mrefChanged ['Content'] = 1;
  }
}

function UpdContent ()
{
  if (blnDebug) alert ("update Content: "+ this.mstrContent);
  if (fExp4)
  {
    this.mrefEl.innerHTML = unescape (this.mstrContent);
  }
  else
  {
    this.mrefEl.document.open ("text/html");
    this.mrefEl.document.write (unescape (this.mstrContent));
    this.mrefEl.document.close ();
  }
}

function SetPos (numX, numY)
{
  if ('object' == typeof (numX))
  {
    this.mboxPos = new Box (numX);
  }
  else
  {
    if (numX != null) this.mboxPos.X = numX;
    if (numY != null) this.mboxPos.Y = numY;
  }
  this.mrefChanged ['PosClip'] = 1;
}

function UpdPosClip ()
{
  var numX = this.mrefScrn.mnumPageX + this.mboxPos.X;
  var numY = this.mrefScrn.mnumPageY + this.mboxPos.Y;

  var numClipX = Math.max (0, Math.max (this.mrefScrn.mnumPageX + this.mrefScrn.mboxClip.X - numX, this.mboxClip.X));
  var numClipY = Math.max (0, Math.max (this.mrefScrn.mnumPageY + this.mrefScrn.mboxClip.Y - numY, this.mboxClip.Y));
  var numClipW = Math.min (this.mboxPos.W, Math.min (this.mrefScrn.mnumPageX + this.mrefScrn.mboxClip.X + this.mrefScrn.mboxClip.W - numX, this.mboxClip.X + this.mboxClip.W));
  var numClipH = Math.min (this.mboxPos.H, Math.min (this.mrefScrn.mnumPageY + this.mrefScrn.mboxClip.Y + this.mrefScrn.mboxClip.H - numY, this.mboxClip.Y + this.mboxClip.H));

  var blnUpdPos = 0;
  if (this.mnumSavX != numX) { this.mnumSavX = numX; ++ blnUpdPos; }
  if (this.mnumSavY != numY) { this.mnumSavY = numY; ++ blnUpdPos; }

  var blnUpdClip = 0;
  if (this.mnumSavClipX != numClipX) { this.mnumSavClipX = numClipX; ++ blnUpdClip; }
  if (this.mnumSavClipY != numClipY) { this.mnumSavClipY = numClipY; ++ blnUpdClip; }
  if (this.mnumSavClipW != numClipW) { this.mnumSavClipW = numClipW; ++ blnUpdClip; }
  if (this.mnumSavClipH != numClipH) { this.mnumSavClipH = numClipH; ++ blnUpdClip; }

  if (blnUpdClip)
  {
    if (blnDebug > 1) alert ("update Clip "+ (new Box (numClipX, numClipY, numClipW, numClipH)).AsString ());
    if (fExp4)
    {
      this.mrefStyle.clip = 'rect('+ numClipY +' '+  numClipW +' '+ numClipH +' '+ numClipX +')';
    }
    else
    {
      this.mrefEl.clip.left   = numClipX;
      this.mrefEl.clip.top    = numClipY;
      this.mrefEl.clip.right  = numClipW;
      this.mrefEl.clip.bottom = numClipH;
    }
  }
  if (blnUpdPos)
  {
    if (blnDebug > 1) alert ("update Pos "+ (new Box (numX, numY, 0, 0)).AsString ());
    if (fExp4)
    {
      this.mrefStyle.left = numX;
      this.mrefStyle.top  = numY;
    }
    else
    {
      this.mrefEl.pageX  = numX;
      this.mrefEl.pageY  = numY;
    }
  }
}

function SetClip (numClipX, numClipY, numClipW, numClipH)
{
  if ('object' == typeof numClipX)
  {
    this.mboxClip = new Box (numClipX);
  }
  else
  {
    if (numClipX != null) this.mboxClip.X = numClipX;
    if (numClipY != null) this.mboxClip.Y = numClipY;
    if (numClipW != null) this.mboxClip.W = numClipW;
    if (numClipH != null) this.mboxClip.H = numClipH;
  }
  this.mrefChanged ['PosClip'] = 1;
}

function Align (strMode, boxDest)
{
  if (null == boxDest) { boxDest = this.mrefScrn.mboxPos }
  this.mboxPos.Align (strMode, boxDest);
  this.mrefChanged ['PosClip'] = 1;
}

function GetAlign (strMode, boxDest)
{
  if (null == boxDest) { boxDest = new Box (this.mrefScrn.mboxPos); }
  var boxResult = new Box (this.mboxPos);
  boxResult.Align (strMode, boxDest);
  return boxResult;
}

function GetPos ()
{
  return new Box (this.mboxPos);
}

function GetClip ()
{
  return new Box (this.mboxClip);
}

function Redraw ()
{
  var blnHide = this.mrefChanged ['Hide']; delete this.mrefChanged ['Hide'];
  var blnShow = this.mrefChanged ['Show']; delete this.mrefChanged ['Show'];
  if (blnHide)
  {
    if (blnDebug) alert ("update Visible: 0");
    this.mrefStyle.visibility = this.mstrCmdHide;
  }
  for (var Prop in this.mrefChanged) { eval ('this.Upd'+ Prop +'()'); delete this.mrefChanged [Prop]; }
  if (blnShow && this.mblnVisible)
  {
    if (blnDebug) alert ("update Visible: 1");
    this.mrefStyle.visibility = this.mstrCmdShow;
    if (this.mrefScrn.mstrCmdShow)
    {
      eval (this.mrefScrn.mstrCmdShow);
      this.mrefScrn.mstrCmdShow = null;
    }
  }
}

function HandleMouse (refHandle)
{
  if(this.mrefEl.captureEvents)
    this.mrefEl.captureEvents(Event.MOUSEOVER|Event.MOUSEOUT);
  this.mrefEl.onmouseover = this.HandleMouseOver;
  this.mrefEl.onmouseout = this.HandleMouseOut;
}

function HandleMouseOver (e)
{
  if(fExp4)
  {
    var refEvent = GetEvent ();
    if(refEvent.srcElement == this && refEvent.srcElement.tagName == "DIV")
      refEvent.cancelBubble = true;
    else if(refEvent.srcElement == this)
      return;
  }
  else { if(e.target != this) { routeEvent(e); return; } }

  var refSprite = this.mrefSprite;
  if (StatSprite.mrefOutSpr == refSprite)
  {
    clearTimeout (StatSprite.mnumOutTimer);
    StatSprite.mnumOutTimer = null;
    StatSprite.mrefOutSpr == null;
  }
  else
  {
    StatSprite.mrefOverSpr = refSprite;
    if (StatSprite.mrefOverFired)
    {
      StatSprite.FireMouseOver ()
    }
    else
    {
      clearTimeout (StatSprite.mnumOverTimer);
      StatSprite.mnumOverTimer = setTimeout ('StatSprite.FireMouseOver ()', 100);
    }
  }
}

function FireMouseOver ()
{
  StatSprite.mnumOverTimer = null;
  if (StatSprite.mrefOverFired != StatSprite.mrefOverSpr)
  {
    clearTimeout (StatSprite.mnumOutTimer);
    StatSprite.mnumOutTimer = null;
    if (StatSprite.mrefOverFired)
      (HandleEvent.refHandler) ('mouseout', StatSprite.mrefOverFired);
    StatSprite.mrefOverFired = StatSprite.mrefOverSpr;
    (HandleEvent.refHandler) ('mouseover', StatSprite.mrefOverSpr);
  }
  StatSprite.mrefOverSpr = null;
}

function HandleMouseOut (e)
{
  if(fExp4)
  {
    var refEvent = GetEvent ();
    if(refEvent.srcElement == this && refEvent.srcElement.tagName == "DIV")
      refEvent.cancelBubble = true;
    else if(refEvent.srcElement == this)
      return;
  }
  else { if(e.target != this) { routeEvent(e); return; }}

  var refSprite = this.mrefSprite;
  if (StatSprite.mrefOverFired)
  {
    StatSprite.mrefOutSpr = refSprite;
    clearTimeout (StatSprite.mnumOutTimer);
    StatSprite.mnumOutTimer = setTimeout ('StatSprite.FireMouseOut ()', 300);
  }
  else
  {
    clearTimeout (StatSprite.mnumOverTimer);
    StatSprite.mnumOverTimer = null;
    StatSprite.mrefOverSpr = null;
  }
}

function FireMouseOut ()
{
  StatSprite.mnumOutTimer = null;
  if (StatSprite.mrefOverFired)
  {
    (HandleEvent.refHandler) ('mouseout', StatSprite.mrefOverFired);
    StatSprite.mrefOverFired = null;
    StatSprite.mrefOutSpr = null;
  }
}



//==== SPRITE CONSTRUCTOR

if (! this.mblnInit) eval (InitMethods (
  'Sprite', 'Redraw', 'IsVisible', 'GetContent', 'SetVisible', 'SetCursor', 
  'GetBgColor', 'SetBgColor', 'UpdBgColor', 'SetContent', 'UpdContent', 'SetPos', 'SetClip',
  'UpdPosClip', 'Align', 'GetAlign', 'GetPos', 'GetClip', 'SetZIndex', 'GetZIndex', 'UpdZIndex',
  'HandleMouse', 'HandleMouseOver', 'HandleMouseOut', 'FireMouseOver', 'FireMouseOut'));

if (!refScrn) return;
this.mrefScrn     = refScrn;
this.mboxPos      = new Box (0, 0, numW, numH);
this.mboxClip     = new Box (0, 0, numW, numH);
this.mstrBgColor  = '';
this.mblnVisible  = 0;
this.mstrContent  = '';
this.mrefChanged  = new Object;
this.mrefHandler  = null;

this.mnumOutTimer  = null;
this.mnumOverTimer = null;
this.mrefOutSpr    = null;
this.mrefOverSpr   = null;
this.mrefOverFired = null;

this.mstrId = 'lyrSprite';
if (fExp4)
{
  var refDoc = document.frames[this.mrefScrn.mstrId].document;
  this.mstrId += refDoc.all.length;
  var strSprite = '<div id=' + this.mstrId +' '+
    'style="position:absolute; overflow:none; '+
    'left:'+ this.mboxPos.X +'; top:'+ this.mboxPos.Y +'; '+
    'width:'+ this.mboxPos.W +';'+
    'height:'+ this.mboxPos.H +';'+
    'visibility:hidden;"></div>';
  refDoc.body.insertAdjacentHTML ("BeforeEnd", strSprite);
  this.mrefEl      = refDoc.all [this.mstrId];
  this.mrefStyle   = this.mrefEl.style;
  this.mstrCmdShow = 'visible';
  this.mstrCmdHide = 'hidden';
  this.mnumZIndex  = this.mrefStyle.zIndex;
}
else
{
  this.mstrId += document.layers.length;
  this.mrefEl = document.layers [this.mstrId] = new Layer (this.mboxPos.W);
  this.mrefEl.resizeTo (this.mboxPos.W, this.mboxPos.H);
  this.mrefEl.visibility = 'hide';
  this.mrefEl.left = this.mboxPos.X;
  this.mrefEl.top = this.mboxPos.Y;
  this.mrefStyle = this.mrefEl;
  this.mstrCmdShow = 'show';
  this.mstrCmdHide = 'hide';
  this.mnumZIndex  = this.mrefStyle.zIndex;
}

this.mrefEl.mrefSprite = this;
this.SetPos (0,0);
this.Redraw ();

//==== SPRITE END
}

var StatSprite = new Sprite ();

function Animation ()
{
//==== ANIMATION METHODS

this.refPuppets = new Object ();

function Animate ()
{
  var numPupets = 0;
  var numTime = GetTime ();
  var strEval = '';
  for (idxPuppet in this.refPuppets)
  {
    var refPuppet = this.refPuppets [idxPuppet];
    with (refPuppet.arrPath [refPuppet.numPos])
    {
      var numDelta  = ((numTime - ST) / (ET - ST));
      if (numTime < ET)
      {
        refPuppet.refSpr.SetPos (
          SX + (EX - SX) * numDelta,
          SY + (EY - SY) * numDelta)
        refPuppet.refSpr.SetClip (
          SC.X + (EC.X - SC.X) * numDelta,
          SC.Y + (EC.Y - SC.Y) * numDelta,
          SC.W + (EC.W - SC.W) * numDelta,
          SC.H + (EC.H - SC.H) * numDelta);
        refPuppet.refSpr.Redraw ();
      }
      else
      {
        if (AC) refPuppet.refSpr.SetClip (EC);
        refPuppet.refSpr.SetPos (EX, EY);
        refPuppet.refSpr.Redraw ();
  
        strEval += Eval +';';
        ++ refPuppet.numPos;
        if (refPuppet.numPos == refPuppet.arrPath.length)
        {
          delete this.refPuppets [idxPuppet];
        }
      }
    }
    ++ numPupets;
  }  
  if (numPupets)
    this.mhndTimer = setTimeout ('Anim.Animate ()', this.numRefresh);
  else
    this.mhndTimer = null;
  if (strEval)
    setTimeout (strEval, this.numRefresh * 2);
}

function MoveTo (boxPos, boxClip)
{
  refSpr = this.mrefCurrent;
  var refPuppet = this.refPuppets [refSpr.mstrId];

  var numStartX;
  var numStartY;
  var numStartC;
  var numStartT;
  if (! refPuppet)
  {
    refPuppet = new Object ();
    refPuppet.refSpr = refSpr;
    refPuppet.arrPath = new Array ();
    refPuppet.numPos = 0;
    this.refPuppets [refSpr.mstrId] = refPuppet;
    numStartX = refSpr.mboxPos.X;
    numStartY = refSpr.mboxPos.Y;
    boxStartC = refSpr.GetClip ();
    numStartT = GetTime ();
    if (null == boxPos) boxPos = refSpr.GetPos ();
    if (null == boxClip) boxClip = refSpr.GetClip ();
  }
  else
  {
    var refPrevPoint = refPuppet.arrPath [refPuppet.arrPath.length-1];
    numStartX = refPrevPoint.EX;
    numStartY = refPrevPoint.EY;
    boxStartC = new Box (refPrevPoint.EC);
    numStartT = refPrevPoint.ET;
    if (null == boxPos) boxPos = new Box (refPrevPoint.EX, refPrevPoint.EY);
    if (null == boxClip) boxClip = new Box (refPrevPoint.EC);
  }

  var refPoint = refPuppet.arrPath [refPuppet.arrPath.length] = new Object;
  refPoint.EX = boxPos.X;
  refPoint.EY = boxPos.Y;
  refPoint.EC = new Box (boxClip);
  refPoint.SX = numStartX;
  refPoint.SY = numStartY;
  refPoint.SC = boxStartC;
  refPoint.ST = numStartT;
  refPoint.AC = ! refPoint.SC.Compare (refPoint.EC);
  
  with (refPoint)
  {
    var numTime1 = Math.max (Math.max (SX - EX, SY - EY),
      Math.max (EX - SX, EY - SY)) * 1000 / this.mnumSpeed;
    var numTime2 = Math.max (Math.max (SC.X - EC.X, SC.Y - EC.Y),
      Math.max (EC.X - SC.X, EC.Y - SC.Y)) * 1000 / this.mnumSpeed;
    var numTime3 = Math.max (Math.max (SC.W - EC.W, SC.H - EC.H),
      Math.max (EC.W - SC.W, EC.H - SC.H)) * 1000 / this.mnumSpeed;
  }
    
  refPoint.ET = refPoint.ST + Math.max (numTime1, Math.max (numTime2, numTime3));
  refPoint.Eval = '';
}

function ScriptFor (refCurent)
{
  this.mrefCurrent = refCurent;
}

function Speed (numSpeed)
{
  this.mnumSpeed = numSpeed;
}

function Eval (strCode)
{
  refSpr = this.mrefCurrent;
  var refPuppet = this.refPuppets [refSpr.mstrId];
  if (refPuppet && refPuppet.arrPath.length)
  {
    var refPrevPoint = refPuppet.arrPath [refPuppet.arrPath.length-1];
    refPrevPoint.Eval = strCode;
  }
}

function RunScript ()
{
  if (! this.mhndTimer)
    this.mhndTimer = setTimeout ('Anim.Animate ()', this.numRefresh);
}

function Delete (strName)
{
  if (! this ['ref'+ strName]) return;
  this['ref'+ strName].Delete ();
  delete this['ref'+ strName];
}

function Add (strName, refObject)
{
  if (this ['ref'+ strName]) alert (strName +' already exists');
  this ['ref'+ strName] = refObject;
  return refObject;
}

//==== ANIMATION CONSTRUCTOR

if (! this.mblnInit) eval (InitMethods ('Animation', 'Animate', 'RunScript', 'Add', 'Delete',
  'ScriptFor', 'Speed', 'MoveTo', 'Eval'));
this.numRefresh = 10;
this.mhndTimer = null;

//==== ANIMATION END
}

var Anim = new Animation ();

//==== SCROLLER

function scrlOnLoad ()
{
  scrl.screen = new Screen ('Scroller', 0, 0, scrl.width, scrl.height, scrl.bgcolor);

  scrl.pages[scrl.pages.length] = scrl.pages[0];
  for (var i=0; i<scrl.pages.length; ++i)
  {
    var html = '<div style="margin-right: 4px; color:'+ scrl.tcolor +';font-size:'+ scrl.fsize  +';'+
      'font-family:'+ scrl.fface  +';">'+ unescape (scrl.pages[i]) +'</div>';
    html = html.replace (/<a\s+/gi, '<a target='+ scrl.target +' style="color:'+ scrl.lcolor +';font-size:'+ scrl.lsize  +';"');
    html = html.replace (/<hr>/gi, '<hr noshade size=1 style="color:'+ scrl.tcolor +'">');
    var spr = Anim.Add ('page'+i, new Sprite (scrl.screen, scrl.width, scrl.height));
    spr.SetContent (escape (html));
    spr.SetBgColor (scrl.bgcolor);
    scrl.pages[i] = spr;
  }

  scrl.pagenum = scrl.pages.length;
  scrlUpdate ();
}

function scrlSlide ()
{
  var align = Math.random() < 0.5
    ? Math.random() < 0.5 ? 'lrttrltt' : 'rlttlrtt'
    : Math.random() < 0.5 ? 'lltbllbt' : 'llbtlltb';
  var spr = scrl.pages[scrl.pagenum-1];
  Anim.ScriptFor (spr);
  Anim.Speed     (scrl.speed);
  Anim.MoveTo    (new Box (spr.GetAlign (align.substr(0, 4))));
  spr = scrl.pages[scrl.pagenum];
  spr.SetPos (spr.GetAlign (align.substr(4, 4)));
  Anim.ScriptFor (spr);
  Anim.Speed     (scrl.speed);
  Anim.MoveTo    (new Box (spr.GetAlign ('lltt')));
  Anim.Eval      ('scrlUpdate ()');
  Anim.RunScript ();
}

function scrlUpdate ()
{
  ++ scrl.pagenum;

  if (scrl.pagenum >= scrl.pages.length)
  {
    for (var i=0; i<scrl.pages.length; ++i)
    {
      var spr = scrl.pages[i];
      spr.SetPos (spr.GetAlign (i ? 'lltb' : 'lltt'));
      spr.SetVisible (1);
      spr.Redraw     ();
    }
    scrl.pagenum = 1;
  }

  setTimeout ("scrlSlide ()", scrl.pause)
}

function scrlInit ()
{
  if (! fVer4 && 0) return;
  scrl.msie = fExp4;
  OnLoadAdd ('scrlOnLoad ()');
}

