<html>
<head>
<title>The Show</title>
<script language="JavaScript">
<!-- begin script
//******************************************************
// Chapter 16 - Visual Effects
// Functions/Objects
//******************************************************
var hexchars = '0123456789ABCDEF';
function fromHex (str) {
  var high = str.charAt(0); // Note: Netscape 2.0 bug workaround
  var low = str.charAt(1);
  return (16 * hexchars.indexOf(high)) +
    hexchars.indexOf(low);
}
function toHex (num) {
  return hexchars.charAt(num >> 4) + hexchars.charAt(num & 0xF);
}
function Color (str) {
  this.red = fromHex(str.substring(0,2));
  this.green = fromHex(str.substring(2,4));
  this.blue = fromHex(str.substring(4,6));
  this.toString = ColorString;
  return this;
}
function ColorString () {
  return toHex(this.red) + toHex(this.green) + toHex(this.blue);
}
function BodyColor (bgColor,fgColor,linkColor,vlinkColor,alinkColor) {
  this.bgColor = bgColor;
  this.fgColor = fgColor;
  this.linkColor = linkColor;
  this.vlinkColor = vlinkColor;
  this.alinkColor = alinkColor;
  this.toString = BodyColorString;
  return this;
}
function BodyColorString () {
  return '<body' +
    ((this.bgColor == null) ? '' : ' bgcolor="#' + this.bgColor + '"') +
    ((this.fgColor == null) ? '' : ' text="#' + this.fgColor + '"') +
    ((this.linkColor == null) ? '' : ' link="#' + this.linkColor + '"') +
    ((this.vlinkColor == null) ? '' : ' vlink="#' + this.vlinkColor + '"') +
    ((this.alinkColor == null) ? '' : ' alink="#' + this.alinkColor + '"') +
    '>';
}
function IntColor (start, end, step, steps) {
  this.red = Math.round(start.red+(((end.red-start.red)/(steps-1))*step));
  this.green = Math.round(start.green+(((end.green-start.green)/(steps-1))*step));
  this.blue = Math.round(start.blue+(((end.blue-start.blue)/(steps-1))*step));
  this.toString = ColorString;
  return this;
}
function Alternator (bodyA, bodyB, text) {
  this.bodyA = bodyA;
  this.bodyB = bodyB;
  this.currentBody = "A";
  this.text = text;
  this.toString = AlternatorString;
  return this;
}
function AlternatorString () {
  var str = "<html>";
  with (this) {
    if (currentBody == "A") {
      str += bodyA;
      currentBody = "B";
    }
    else {
      str += bodyB;
      currentBody = "A";
    }
    str += text + '</body></html>';
  }
  return str;
}
function Fader (bodyA, bodyB, steps, text) {
  this.bodyA = bodyA;
  this.bodyB = bodyB;
  this.step = 0;
  this.steps = steps;
  this.text = text;
  this.toString = FaderString;
  return this;
}
function FaderString () {
  var intBody = new BodyColor();
  with (this) {
    if (bodyA.bgColor != null && bodyB.bgColor != null)
      intBody.bgColor = new IntColor (bodyA.bgColor, bodyB.bgColor, step, steps);
    if (bodyA.fgColor != null && bodyB.fgColor != null)
      intBody.fgColor = new IntColor (bodyA.fgColor, bodyB.fgColor, step, steps);
    if (bodyA.linkColor != null && bodyB.linkColor != null)
      intBody.linkColor = new IntColor (bodyA.linkColor, bodyB.linkColor, step, steps);
    if (bodyA.vlinkColor != null && bodyB.vlinkColor != null)
      intBody.vlinkColor = new IntColor (bodyA.vlinkColor, bodyB.vlinkColor, step, steps);
    if (bodyA.alinkColor != null && bodyB.alinkColor != null)
      intBody.alinkColor = new IntColor (bodyA.alinkColor, bodyB.alinkColor, step, steps);
    step++;
    if (step >= steps)
      step = 0;
  }
  return '<html>' + intBody + this.text + '</body></html>';
}
function Static (body, text) {
  this.body = body;
  this.text = text;
  this.toString = StaticString;
  return this;
}
function StaticString () {
  return '<html>' + this.body + this.text + '</body></html>';
}
function Text (text, size, format, color) {
  this.text = text;
  this.length = text.length;
  this.size = size;
  this.format = format;
  this.color = color;
  this.toString = TextString;
  this.substring = TextString;
  return this;
}
function TextString (start, end) {
  with (this) {
    if (TextString.arguments.length < 2 || start >= length) start = 0;
    if (TextString.arguments.length < 2 || end > length) end = length;
    var str = text.substring(start,end);
    if (format != null) {
      if (format.indexOf("b") >= 0) str = str.bold();
      if (format.indexOf("i") >= 0) str = str.italics();
      if (format.indexOf("f") >= 0) str = str.fixed();
    }
    if (size != null) str = str.fontsize(size);
    if (color != null) { 
      var colorstr = color.toString(); // Note: Netscape 2.0 bug workaround
      str = str.fontcolor(colorstr);
    }
  }
  return str;
}
function Block () {
  var argv = Block.arguments;
  var argc = argv.length;
  var len = 0;
  for (var i = 0; i < argc; i++) {
    len += argv[i].length;
    this[i] = argv[i];
  }
  this.length = len;
  this.entries = argc;
  this.toString = BlockString;
  this.substring = BlockString;
  return this;
}  
function BlockString (start, end) {
  with (this) {
    if (BlockString.arguments.length < 2 || start >= length) start = 0;
    if (BlockString.arguments.length < 2 || end > length) end = length;
  }
  var str = "";
  var segstart = 0;
  var segend = 0;
  for (var i = 0; i < this.entries; i++) {
    segend = segstart + this[i].length;
    if (segend > start)
      str += this[i].substring(Math.max(start,segstart)-segstart, Math.min(end,segend)-segstart);
    segstart += this[i].length;
    if (segstart >= end)
      break;
  }
  return str;
}
function Marquee (body, text, maxlength, step) {
  this.body = body;
  this.text = text;
  this.length = text.length;
  this.maxlength = maxlength;
  this.step = step;
  this.offset = 0;
  this.toString = MarqueeString;
  return this;
}
function MarqueeString () {
  with (this) {
    var endstr = offset + maxlength;
    var remstr = 0;
    if (endstr > text.length) {
      remstr = endstr - text.length;
      endstr = text.length;
    }
    var str = nbsp(text.substring(offset,endstr) +
      ((remstr == 0) ? "" : text.substring(0,remstr)));
    offset += step;
    if (offset >= text.length)
      offset = 0;
    else if (offset < 0)
      offset = text.length - 1;
  }
  return '<html>' + this.body + '<table border=0 width=100% height=100%><tr>' +
    '<td align="center" valign="center">' + str + '</td></tr></table></body></html>';
}
function nbsp (strin) {
  var strout = "";
  var intag = false;
  var len = strin.length;
  for(var i=0, j=0; i < len; i++) {
    var ch = strin.charAt(i);
    if (ch == "<")
      intag = true;
    else if (ch == ">")
      intag = false;
    else if (ch == " " && !intag) {
      strout += strin.substring(j,i) + "&nbsp";
      j = i + 1;
    }
  }
  return strout + strin.substring(j,len);
}
function Image (url, width, height) {
  this.url = url;
  this.width = width;
  this.height = height;
  return this;
}
function Animator (name, body) {
  var argv = Animator.arguments;
  var argc = argv.length;
  for (var i = 2; i < argc; i++)
    this[i-2] = argv[i];
  this.name = name;
  this.body = body;
  this.images = argc - 2;
  this.image = 0;
  this.ready = "y";
  this.toString = AnimatorString;
  return this;
}
function AnimatorString () {
  var bodystr = this.body.toString();
  var bodystr = bodystr.substring(0, bodystr.length - 1) +
    ' onLoad="parent.' + this.name + '.ready=\'y\'">';
  var str = '<html>' + bodystr + 
    '<table border=0 width=100% height=100%><tr><td align="center" valign="center">' +
    '<img src="' + this[this.image].url + '" width=' + this[this.image].width + 
    ' height=' + this[this.image].height + '></td></table></body></html>';
  this.image++;
  if (this.image >= this.images)
    this.image = 0;
  this.ready = "n";
  return str;
}
function Event (start, loops, delay, action) {
  this.start = start * 1000;
  this.next = this.start;
  this.loops = loops;
  this.loopsRemaining = loops;
  this.delay = delay * 1000;
  this.action = action;
  return this;
}
function EventQueue (name, delay, loopAfter, loops, stopAfter) {
  this.active = true;
  this.name = name;
  this.delay = delay * 1000;
  this.loopAfter = loopAfter * 1000;
  this.loops = loops;
  this.loopsRemaining = loops;
  this.stopAfter = stopAfter * 1000;
  this.event = new Object();
  this.start = new Date ();
  this.loopStart = new Date();
  this.eventID = 0;
  this.addEvent = AddEvent;
  this.processEvents = ProcessEvents;
  this.startQueue = StartQueue;
  this.stopQueue = StopQueue;
  return this;
}
function AddEvent (event) {
  this.event[this.eventID++] = event;
}
function StartQueue () {
  with (this) {
    active = true;
    start = new Date();
    loopStart = new Date();
    loopsRemaining = loops;
    setTimeout (name + ".processEvents()", this.delay);
  }
}
function StopQueue () {
  this.active = false;
}
function ProcessEvents () {
  with (this) {
    if (!active) return;
    var now = new Date();
    if (now.getTime() - start.getTime() >= stopAfter) {
      active = false;
      return;
    }
    var elapsed = now.getTime() - loopStart.getTime();
    if (elapsed >= loopAfter) {
      if (--loopsRemaining <= 0) {
        active = false;
        return;
      }
      loopStart = new Date();
      elapsed = now.getTime() - loopStart.getTime();
      for (var i in event)
        if (event[i] != null) {
          event[i].next = event[i].start;
          event[i].loopsRemaining = event[i].loops;
        }
    }
    for (var i in event)
      if (event[i] != null)
        if (event[i].next <= elapsed)
          if (event[i].loopsRemaining-- > 0) {
            event[i].next = elapsed + event[i].delay;
            eval (event[i].action);
          }
    setTimeout (this.name + ".processEvents()", this.delay);
  }
}
function xbmDrawPoint (x,y) {
  if (x < 0 || x >= this.pixelWidth ||
      y < 0 || y >= this.height)
    return;
  this.row[y].col[x>>4] |= 1<<(x&0xF);
  this.row[y].redraw = true;
}
function xbmDrawLine (x1,y1,x2,y2) {
  var x,y,e,temp;
  var dx = Math.abs(x1-x2);
  var dy = Math.abs(y1-y2);
  if ((dx >= dy && x1 > x2) || (dy > dx && y1 > y2)) {
    temp = x2;
    x2 = x1;
    x1 = temp;
    temp = y2;
    y2 = y1;
    y1 = temp;
  }
  if (dx >= dy) {
    e = (y2-y1)/((dx == 0) ? 1 : dx);
    for (x = x1, y = y1; x <= x2; x++, y += e)
      this.drawPoint(x,Math.round(y));
  }
  else {
    e = (x2-x1)/dy;
    for (y = y1, x = x1; y <= y2; y++, x += e)
      this.drawPoint(Math.round(x),y);
  }
}
function xbmDrawRect (x1,y1,x2,y2) {
  this.drawLine (x1,y1,x2,y1);
  this.drawLine (x1,y1,x1,y2);
  this.drawLine (x1,y2,x2,y2);
  this.drawLine (x2,y1,x2,y2);
}
function xbmDrawFilledRect (x1,y1,x2,y2) {
  var x,temp;
  if (x1 > x2) {
    temp = x2;
    x2 = x1;
    x1 = temp;
    temp = y2;
    y2 = y1;
    y1 = temp;
  }
  for (x = x1; x <= x2; x++)
    this.drawLine(x,y1,x,y2);
}
function xbmDrawCircle (x,y,radius) {
  for (var a=0, b=1; a < b; a++) {
    b = Math.round(Math.sqrt(Math.pow(radius,2)-Math.pow(a,2)));
    this.drawPoint(x+a,y+b);
    this.drawPoint(x+a,y-b);
    this.drawPoint(x-a,y+b);
    this.drawPoint(x-a,y-b);
    this.drawPoint(x+b,y+a);
    this.drawPoint(x+b,y-a);
    this.drawPoint(x-b,y+a);
    this.drawPoint(x-b,y-a);
  }
}
function xbmDrawFilledCircle (x,y,radius) {
  for (var a=0, b=1; a < b; a++) {
    b = Math.round(Math.sqrt(Math.pow(radius,2)-Math.pow(a,2)));
    this.drawLine(x+a,y+b,x+a,y-b);
    this.drawLine(x-a,y+b,x-a,y-b);
    this.drawLine(x+b,y+a,x+b,y-a);
    this.drawLine(x-b,y+a,x-b,y-a);
  }
}
function xbmReverse () {
  this.negative = !this.negative;
  for (var i = 0; i < this.height; i++)
    this.row[i].redraw = true;
}
function xbmClear (value) {
  if (value == null)
    value = this.initialValue;
  for (var i = 0; i < this.height; i++) {
    this.row[i].redraw = true;
    for (var j = 0; j < this.width; j++)
      this.row[i].col[j] = value;
  }
}
function xbmRowString () {
  if (this.redraw) {
    this.redraw = false;
    this.text = "";
    for (var i = 0; i < this.parent.width; i++) {
      var pixels = this.col[i];
      if (this.parent.negative)
        pixels ^= 0xFFFF;
      var buf = "0x" + hexchars.charAt((pixels>>4)&0xF) +
        hexchars.charAt(pixels&0xF) + ",0x" +
        hexchars.charAt((pixels>>12)&0xF) +
        hexchars.charAt((pixels>>8)&0xF) + ",";
      this.text += buf;
    }
  }
  return this.text;
}
function xbmPartitionString (left,right) {
  if (left == right) {
    var str = this.row[left].toString();
    if (left == 0)
      str = this.head + str;
    else if (left == this.height - 1)
      str += "};\n";
    return str;
  }
  var mid = (left+right)>>1;
  return this.partition(left,mid) + this.partition(mid+1,right);
}
function xbmString () {
  return this.partition(0,this.height - 1);
}
function xbmRow (parent, columns, initialValue) {
  this.redraw = true;
  this.text = null;
  this.parent = parent;
  this.col = new Object();
  for (var i = 0; i < columns; i++)
    this.col[i] = initialValue;
  this.toString = xbmRowString;
  return this;
}
function xbmImage (width, height, initialValue) {
  this.width = (width+15)>>4;
  this.pixelWidth = this.width<<4;
  this.height = height;
  this.head = "#define xbm_width " + (this.pixelWidth) +
    "\n#define xbm_height " + this.height +
    "\nstatic char xbm_bits[] = {\n";
  this.initialValue = ((initialValue == null) ? 0 : initialValue);
  this.negative = false;
  this.row = new Object();
  for (var i = 0; i < height; i++)
    this.row[i] = new xbmRow(this, this.width, this.initialValue);
  this.drawPoint = xbmDrawPoint;
  this.drawLine = xbmDrawLine;
  this.drawRect = xbmDrawRect;
  this.drawFilledRect = xbmDrawFilledRect;
  this.drawCircle = xbmDrawCircle;
  this.drawFilledCircle = xbmDrawFilledCircle;
  this.reverse = xbmReverse;
  this.clear = xbmClear;
  this.partition = xbmPartitionString;
  this.toString = xbmString;
  return this;
}
//******************************************************
// The Show
//******************************************************

var black = new Color ("000000");
var white = new Color ("FFFFFF");
var red = new Color ("FF0000");
var green = new Color ("00FF00");
var blue = new Color ("0000FF");
var yellow = new Color ("FFFF00");
var cyan = new Color ("00FFFF");
var magenta = new Color ("FF00FF");
var pink = new Color ("FF80A0");
var orange = new Color ("FF5010");

var blackOnBlack = new BodyColor (black,black);
var blackOnWhite = new BodyColor (white,black);
var whiteOnWhite = new BodyColor (white,white);
var whiteOnBlack = new BodyColor (black,white);
var redOnWhite = new BodyColor (white,red);
var whiteOnRed = new BodyColor (red,white);
var blueOnWhite = new BodyColor (white,blue);
var redOnYellow = new BodyColor (yellow,red);
var yellowOnRed = new BodyColor (red,yellow);
var pinkOnGreen = new BodyColor (green,pink);
var greenOnPink = new BodyColor (pink,green);
var orangeOnWhite = new BodyColor (white,orange);
var whiteOnOrange = new BodyColor (orange,white);
var blueOnYellow = new BodyColor (yellow,blue);
var yellowOnBlue = new BodyColor (blue,yellow);
var blueOnBlack = new BodyColor (black,blue);
var yellowOnBlack = new BodyColor (black,yellow);
var blueOnRed = new BodyColor (red,blue);
var orangeOnGreen = new BodyColor (green,orange);

var blackout = new Static (blackOnBlack, "");
var whiteout = new Static (whiteOnWhite, "");

var square1 = new xbmImage (48,48);
square1.drawRect (23,23,24,24);
square1.drawRect (19,19,28,28);
square1.drawRect (15,15,32,32);
square1.drawRect (11,11,36,36);
square1.drawRect (7,7,40,40);
square1.drawRect (3,3,44,44);
var sq1str = square1.toString();

var square2 = new xbmImage (48,48);
square2.drawRect (22,22,25,25);
square2.drawRect (18,18,29,29);
square2.drawRect (14,14,33,33);
square2.drawRect (10,10,37,37);
square2.drawRect (6,6,41,41);
square2.drawRect (2,2,45,45);
var sq2str = square2.toString();

var square3 = new xbmImage (48,48);
square3.drawRect (21,21,26,26);
square3.drawRect (17,17,30,30);
square3.drawRect (13,13,34,34);
square3.drawRect (9,9,38,38);
square3.drawRect (5,5,42,42);
square3.drawRect (1,1,46,46);
var sq3str = square3.toString();

var square4 = new xbmImage (48,48);
square4.drawRect (20,20,27,27);
square4.drawRect (16,16,31,31);
square4.drawRect (12,12,35,35);
square4.drawRect (8,8,39,39);
square4.drawRect (4,4,43,43);
square4.drawRect (0,0,47,47);
var sq4str = square4.toString();

var circle1 = new xbmImage (48,48);
circle1.drawCircle (23,23,1);
circle1.drawCircle (23,23,7);
circle1.drawCircle (23,23,13);
circle1.drawCircle (23,23,19);
circle1.drawCircle (23,23,25);
var cir1str = circle1.toString();

var circle2 = new xbmImage (48,48);
circle2.drawCircle (23,23,2.5);
circle2.drawCircle (23,23,8.5);
circle2.drawCircle (23,23,14.5);
circle2.drawCircle (23,23,20.5);
circle2.drawCircle (23,23,26.5);
var cir2str = circle2.toString();

var circle3 = new xbmImage (48,48);
circle3.drawCircle (23,23,4);
circle3.drawCircle (23,23,10);
circle3.drawCircle (23,23,16);
circle3.drawCircle (23,23,22);
var cir3str = circle3.toString();

var circle4 = new xbmImage (48,48);
circle4.drawCircle (23,23,5.5);
circle4.drawCircle (23,23,11.5);
circle4.drawCircle (23,23,17.5);
circle4.drawCircle (23,23,23.5);
var cir4str = circle4.toString();

var sqanim = new Animator ("sqanim", blueOnYellow,
  new Image ("javascript:parent.sq1str",48,48),
  new Image ("javascript:parent.sq2str",48,48),
  new Image ("javascript:parent.sq3str",48,48),
  new Image ("javascript:parent.sq4str",48,48)
  );

var ciranim = new Animator ("ciranim", blueOnYellow,
  new Image ("javascript:parent.cir1str",48,48),
  new Image ("javascript:parent.cir2str",48,48),
  new Image ("javascript:parent.cir3str",48,48),
  new Image ("javascript:parent.cir4str",48,48)
  );

var evq = new EventQueue ("evq", .05, 200, 3, 600);

// Object to hold a list of objects
var objlist = new Object();
var obj = 0;

// Function to use table to center vertically/horizontally
function center (text) {
  return '<table width=100% height=100% border=0 cellpadding=0 cellspacing=0>' +
    '<tr><td align="center" valign="center">' + text + '</td></tr></table>';
}

// Function to create a bunch of objects/events
function makeList (frame, start, loops, delay, object) {
  var argv = makeList.arguments;
  var argc = argv.length;
  if (argc % 5 != 0) {
    alert ("Invalid number of arguments")
    return;
  }
  for (var i = 0; i < argc; i += 5, obj++) {
    objlist[obj] = argv[i+4];
    evq.addEvent (new Event(argv[i+1], argv[i+2], argv[i+3],
      ((objlist[obj].ready == null) ? '' : ('if (' + objlist[obj].name + '.ready=="y")')) +
      'self.f' + argv[i] + '.location = "javascript:parent.objlist[' + obj + ']"'));
  }
}

// Note: maximum args to a function appears to be 255,
// so makeList is called twice.

// the countdown
makeList (
  5, 0, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("10","7","b"))),
  5, 3, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("10","7","b"))),
  0, 2, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("9","7","b"))),
  0, 5, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("9","7","b"))),
  8, 4, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("8","7","b"))),
  8, 7, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("8","7","b"))),
  2, 6, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("7","7","b"))),
  2, 9, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("7","7","b"))),
  3, 8, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("6","7","b"))),
  3, 11, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("6","7","b"))),
  7, 10, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("5","7","b"))),
  7, 13, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("5","7","b"))),
  1, 12, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("4","7","b"))),
  1, 15, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("4","7","b"))),
  6, 14, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("3","7","b"))),
  6, 17, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("3","7","b"))),
  9, 16, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("2","7","b"))),
  9, 19, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("2","7","b"))),
  4, 18, 8, .1, new Fader(whiteOnWhite, redOnWhite, 8, center(new Text("1","7","b"))),
  4, 21, 8, .1, new Fader(redOnWhite, whiteOnWhite, 8, center(new Text("1","7","b"))),
// all frames to black
  0, 24, 1, .1, blackout,
  1, 24, 1, .1, blackout,
  2, 24, 1, .1, blackout,
  3, 24, 1, .1, blackout,
  4, 24, 1, .1, blackout,
  5, 24, 1, .1, blackout,
  6, 24, 1, .1, blackout,
  7, 24, 1, .1, blackout,
  8, 24, 1, .1, blackout,
  9, 24, 1, .1, blackout,
// Welcome to the show
  0, 26, 10, .1, new Alternator(yellowOnRed,redOnYellow,center(new Text("Welcome","7","b"))),
  3, 28, 10, .1, new Alternator(pinkOnGreen,greenOnPink,center(new Text("to","7","bf"))),
  4, 30, 10, .1, new Alternator(whiteOnOrange,orangeOnWhite,center(new Text("The","6","bi"))),
  7, 32, 10, .1, new Alternator(orangeOnWhite,whiteOnOrange,center(new Text("Show","7","bi"))),
  0, 34, 1, .1, blackout,
  3, 34, 1, .1, blackout,
// Ladies and Gentlemen...
  1, 34.2, 300, .2, new Marquee(blueOnBlack,
    new Text(" Ladies and Gentlemen, Welcome to the Visual Effects Show! ","7","bf"),15,2), 
  2, 34.2, 300, .2, new Marquee(yellowOnBlack,
    new Text(" Ladies and Gentlemen, Welcome to the Visual Effects Show! ","7","bf"),15,-2),
// Animated circles and squares
  4, 40, 1, .1, blackout,
  7, 40, 1, .1, blackout,
  5, 40, 500, .1, sqanim,
  9, 40, 500, .1, ciranim
  );
// All the World's Your Stage (alternating Alternators!)
makeList (
  0, 40, 60, 2, new Alternator(yellowOnBlue,yellowOnBlue,center(new Text("All","7","b"))),
  0, 41, 60, 2, new Alternator(blueOnYellow,blueOnYellow,center(new Text("The","7","b"))),
  3, 40.5, 60, 2, new Alternator(redOnWhite,redOnWhite,center(new Text("The","7","b"))),
  3, 41.5, 60, 2, new Alternator(whiteOnRed,whiteOnRed,center(new Text("World\'s","7","b"))),
  6, 41, 60, 2, new Alternator(pinkOnGreen,pinkOnGreen,center(new Text("World\'s","7","b"))),
  6, 42, 60, 2, new Alternator(greenOnPink,greenOnPink,center(new Text("Your","7","b"))),
  8, 41.5, 60, 2, new Alternator(blackOnWhite,blackOnWhite,center(new Text("Your","7","b"))),
  8, 42.5, 60, 2, new Alternator(whiteOnBlack,whiteOnBlack,center(new Text("Stage","7","b"))),
// Visual Effects
  4, 43.3, 300, .2, new Fader(orangeOnWhite,yellowOnRed,32,center(new Text("Visual","7","b"))),
  7, 43.6, 300, .2, new Fader(blueOnRed,orangeOnGreen,32,center(new Text("Effects","7","b"))),
// All black, then all white
  0, 190, 1, .1, blackout,
  1, 190, 1, .1, blackout,
  2, 190, 1, .1, blackout,
  3, 190, 1, .1, blackout,
  4, 190, 1, .1, blackout,
  5, 190, 1, .1, blackout,
  6, 190, 1, .1, blackout,
  7, 190, 1, .1, blackout,
  8, 190, 1, .1, blackout,
  9, 190, 1, .1, blackout,
  0, 198, 1, .1, whiteout,
  1, 198, 1, .1, whiteout,
  2, 198, 1, .1, whiteout,
  3, 198, 1, .1, whiteout,
  4, 198, 1, .1, whiteout,
  5, 198, 1, .1, whiteout,
  6, 198, 1, .1, whiteout,
  7, 198, 1, .1, whiteout,
  8, 198, 1, .1, whiteout,
  9, 198, 1, .1, whiteout
  );
function initialize() {
  evq.startQueue();
}
var emptyFrame = '<html><body bgcolor="#FFFFFF"></body></html>';
// end script -->
</script>
<frameset rows="*,*,*,*,*" onLoad="initialize()">
  <frameset cols="3*,2*">
    <frame name="f0" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
    <frame name="f1" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
  </frameset>
  <frameset cols="2*,3*">
    <frame name="f2" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
    <frame name="f3" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
  </frameset>
  <frameset cols="3*,2*">
    <frame name="f4" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
    <frame name="f5" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
  </frameset>
  <frameset cols="2*,3*">
    <frame name="f6" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
    <frame name="f7" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
  </frameset>
  <frameset cols="3*,2*">
    <frame name="f8" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
    <frame name="f9" src="javascript:parent.emptyFrame" scrolling="no" noresize
       marginwidth=1 marginheight=1>
  </frameset>
</frameset>
<noframes>
<h1 align="center">Sorry, JavaScript-enabled browser required</h1>
</noframes>