<html>
<!-- Phrase generator Copyright (c) 1996 Bill Dortch, hIdaho Design -->
<head>
<title>A JavaScript Phrase Generator</title>
<script language="JavaScript">
<!-- begin script
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 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 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 center (text) {
  return '<table width=100% height=100% border=0 cellpadding=0 cellspacing=0>' +
    '<tr><td align="center" valign="center">' + text + '</td></tr></table>';
}

//*********************************************
// Park-Miller Pseudo-Random Number Generator
// JavaScript implementation by David N. Smith
// of IBM's T J Watson Research Center
//*********************************************
function NextRandomNumber()  {
  var hi   = this.seed / this.Q;
  var lo   = this.seed % this.Q;
  var test = this.A * lo - this.R * hi;
  if (test > 0)
    this.seed = test;
  else
    this.seed = test + this.M;
  return (this.seed * this.oneOverM);
}
function RandomNumberGenerator() {
  var d = new Date();
  this.seed = 2345678901 +
    (d.getSeconds() * 0xFFFFFF) +
    (d.getMinutes() * 0xFFFF);
  this.A = 48271;
  this.M = 2147483647;
  this.Q = this.M / this.A;
  this.R = this.M % this.A;
  this.oneOverM = 1.0 / this.M;
  this.next = NextRandomNumber;
  return this;
}
function Word () {
  var argv = Word.arguments;
  var argc = argv.length;
  this.list = new Object();
  for (var i = 0; i < argc; i++)
    this.list[i] = argv[i];
  this.count = argc;
  this.toString = WordString;
  return this;
}
function WordString () {
  var i = Math.round((this.count - 1) * rand.next());
  return this.list[i];
}
function DarkColor () {
  this.red = Math.round (127 * rand.next());
  this.green = Math.round (127 * rand.next());
  this.blue = Math.round (127 * rand.next());
  this.toString = ColorString;
  return this;
}
function LightColor () {
  this.red = Math.round (127 * rand.next()) + 128;
  this.green = Math.round (127 * rand.next()) + 128;
  this.blue = Math.round (127 * rand.next()) + 128;
  this.toString = ColorString;
  return this;
}

var rand = new RandomNumberGenerator();

var verb = new Word ("have", "get", "buy", "eat", "bite", "lick", "smell", "kiss",
  "pet", "stroke", "kill", "feed", "rub");

var article = new Word ("a", "the", "my", "your");

var adjective = new Word ("nice", "lousy", "pretty", "lovely", "smelly", "hairy",
  "lavender", "yellow", "fine", "poor", "nasty", "incredible", "tasty", "fuzzy", "silly");

var singularNoun = new Word ("umbrella", "shoe", "sneaker", "knife", "shirt", "dog", "cat",
  "rooster", "penguin", "pinky", "nose", "doorknob", "bedpost", "elbow", "fish",
  "armpit", "gorilla");

var pluralNoun = new Word ("umbrellas", "shoes", "sneakers", "knives", "shirts", "dogs",
  "cats", "roosters", "penguins", "pinkies", "noses", "doorknobs", "bedposts", "elbows",
  "fish", "armpits", "gorillas");

function isVowel (ch) {
  if (ch == 'a' || ch == 'e' || ch == 'i' ||
      ch == 'o' || ch == 'u')
    return true;
  return false;
}
function phrase (adjs) {
  var size = "" + (Math.round(rand.next() * 3) + 4);
  var format = " ";
  if (rand.next() >= .5)
    format += "b";
  if (rand.next() >= .5)
    format += "i";
  if (rand.next() >= .5)
    format += "f";
  var body;
  if (rand.next() >= .5)
    body = new BodyColor (new DarkColor(), new LightColor());
  else
    body = new BodyColor (new LightColor(), new DarkColor());
  var plural = (rand.next() > .5);
  var vb = verb.toString();
  var first = vb.charAt(0);
  var vb = first.toUpperCase() + vb.substring(1,vb.length);
  var art = article.toString();
  var adj = new Object();
  for (var i = 0; i < adjs; i++)
    adj[i] = adjective.toString();
  var nn = (plural) ? pluralNoun.toString() : singularNoun.toString();
  if (plural && art == "a")
    art = "some";
  if (art == "a") {
    if (adjs > 0)
      first = adj[0].charAt(0);
    else
      first = nn.charAt(0);
    if (isVowel(first))
      art = "an";
  }
  var ph = vb + " " + art + " ";
  for (i = 0; i < adjs; i++)
    ph += adj[i] + " ";
  ph += nn;
  var screen = new Static (body,center(new Text(ph,size,format)));
  return screen.toString();
}
function printPhrase () {
  var adj = self.control.document.cont.adj.selectedIndex;
  if (adj == 3)
    adj = Math.round (rand.next()*2);
  self.show.location = "javascript:parent.phrase(" + adj + ")";
}
var emptyFrame = '<html><body bgcolor="#FFFFFF"></body></html>';
var titleFrame = '<html><body bgcolor="#500010" text="#FFFFFF">' +
  '<h1 align="center">JS-Phrase</h1></body></html>';
var controlFrame =
  '<html><body bgcolor="#808080" text="#FFFFFF">' +
  '<form name="cont">' +
  '<table width=100% height=100% border=0 cellpadding=0 cellspacing=0>' +
  '<tr align="center">' +
  '<td colspan=2><b>Number of Adjectives</b> <select name="adj">' +
  '<option>None' +
  '<option>1' +
  '<option>2' +
  '<option selected>Random' +
  '</select></td>' +
  '<td colspan=2><input type="button" value="Generate Phrase!" onclick="parent.printPhrase()"></td>' +
  '</tr>' +
  '</table>' +
  '</form>' +
  '</body></html>';
function initialize () {
  self.head.location = "javascript:parent.titleFrame";
  self.control.location = "javascript:parent.controlFrame";
  var adj = Math.round(rand.next()*2);
  self.show.location = "javascript:parent.phrase(" + adj + ")";
}
// end script -->
</script>
</head>
<frameset rows="52,*,128" onLoad="initialize()">
  <frame name="head" src="javascript:parent.emptyFrame" noresize scrolling="no"
     marginwidth=1 marginheight=1>
  <frame name="show" src="javascript:parent.emptyFrame" noresize
     marginwidth=1 marginheight=1>
  <frame name="control" src="javascript:parent.emptyFrame" noresize scrolling="no"
     marginwidth=1 marginheight=1>
</frameset>
</html>
