//========================================================================
//   "WebHangman"  JavaScript Hangman  
//
//   Copyright (C) 2000,2002  Jan Mulder
//
//   This program is free software; you can redistribute it and/or modify
//   it under the terms of the GNU General Public License as published by
//   the Free Software Foundation; either version 2 of the License, or
//   (at your option) any later version, and as long as this notice is
//   kept unmodified at the top of the script source code.
//
//   This program is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU General Public License (license.txt) for more details.
//
//   Contact: http://janmulder.com/contact/
//
//   Last updated: 19th March 2002
//
//=======================================================================

var numRight = 0;
var numWrong = 0;
var wordCount = 0;
var doneAction = '';

var thisAnswer;
var thisHint;
var lastAnswer = '';
var answerIdx;
var blankChar = '*';
var answerDisplay;
var maxAttempts = 7;
var usedLetters = '';
var wrongLetters = '';
var maxLength = 0;

var gameOver = false;
var gameStart = true;
var isHint = false;
var imgWidth;
var imgHeight;
var cellDimension;
var firstRun = true;
var words = new Array(
 "ALTERNATING CURRENT","Current that reverses direction",
 "ATOMS","Smallest particles of any element",
 "BATTERY","Group of electric cells that provides current",
 "CAPACITOR","Stores electricity for future use",
 "CONDUCTOR","Object that allows current to flow easily",
 "DIRECT CURRENT","Current that flows in one direction",
 "ELECTRICITY","A form of energy",
 "ELECTRON","Negatively charged particle of an atom",
 "ENERGY","The ability to do work and produce power",
 "FOSSIL FUEL","Naturally occurring fuel",
 "GENERATOR","Machine that produces electricity",
 "HYDROELECTRICITY","Electricity produced from running water",
 "INSULATOR","Object that does not allow electricity to pass",
 "KINETIC ENERGY","Conversion of potential energy into motion",
 "LIGHTNING","Static electrical discharge",
 "MAGNET","Object surrounded by a magnetic field",
 "MECHANICAL ENERGY","Energy of motion used to perform work",
 "NUCLEAR POWER","Energy produced by splitting atoms",
 "OHMS","Units of measurement for electrical resistance",
 "POWER","The force of energy used to do work",
 "PROTONS","Positively charged particles of an atom",
 "RESISTANCE","Opposition to electricity passing through",
 "SOLAR ENERGY","Energy produced by the sun",
 "SWITCH","Device that opens or closes a circuit",
 "TRANSFORMER","Device that raises or lowers voltage",
 "VOLTAGE","Moves current through a conductor",
 "VOLT","A unit for measuring voltage",
 "WATT","A unit for measuring electric power"
);

tempArray = new Array();
wordArray = new Array();

alphaLower = 'abcdefghijklmnopqrstuvwxyz';

doneLoading = false;
imageCount = 0;
var progressBar = '||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||';

function updateProgress(ims)
{
 var cnt=0;

 for(var i = 0; i < ims.length; i++)
  if(ims[i].complete || ims[i].errored) cnt++;

 if(ims.length > 0)
    window.status='Loading ['+Math.round((cnt / imageCount)*100)+'%] ' + progressBar.substring(0, cnt);

 if(cnt < ims.length)
 {
  tempArray = ims;
  setTimeout("updateProgress(tempArray)",200);
 }
 else
  onComplete();
}

function onComplete()
{
 window.status='Done';
 doneLoading = true;
}

function preloadImgs()
{
 this.length = preloadImgs.arguments.length;
 imageCount = this.length;
 for (var i = 0; i < this.length; i++)
 {
  this[i] = new Image();
  this[i].errored=false;
  this[i].onerror=new Function("this["+i+"].errored=true");
  this[i].src = preloadImgs.arguments[i];
 }
 updateProgress(this);
}

var pictures = new preloadImgs(
 sourceDir+"newbtn.gif", sourceDir+"scores.gif", sourceDir+"hintbtn.gif", 
 sourceDir+"a.gif", sourceDir+"b.gif", sourceDir+"c.gif", sourceDir+"d.gif",
 sourceDir+"e.gif", sourceDir+"f.gif", sourceDir+"g.gif", sourceDir+"h.gif",
 sourceDir+"i.gif", sourceDir+"j.gif", sourceDir+"k.gif", sourceDir+"l.gif",
 sourceDir+"m.gif", sourceDir+"n.gif", sourceDir+"o.gif", sourceDir+"p.gif",
 sourceDir+"q.gif", sourceDir+"r.gif", sourceDir+"s.gif", sourceDir+"t.gif",
 sourceDir+"u.gif", sourceDir+"v.gif", sourceDir+"w.gif", sourceDir+"x.gif",
 sourceDir+"y.gif", sourceDir+"z.gif",
 sourceDir+"image1.gif", sourceDir+"image2.gif", sourceDir+"image3.gif", sourceDir+"image4.gif",
 sourceDir+"image5.gif", sourceDir+"image6.gif", sourceDir+"lose.gif", sourceDir+"win.gif"
);

function doFunction(aFunction)
{
 if (aFunction.indexOf('(') > -1)
   eval( aFunction );
 else
   eval(aFunction+'()');
}

function endGame()
{
  gameOver = true;
  document.control.you.value = numRight;
  document.control.me.value = numWrong;
  if (doneAction != '')
    doFunction(doneAction);
}

function showHint()
{
  if (wrongLetters.indexOf(blankChar) == -1)
    wrongLetters = wrongLetters+blankChar;

   if ( wrongLetters.length < maxAttempts )
     document.hangimage.src=sourceDir+"image"+wrongLetters.length+".gif";

  document.hintForm.hint.value=thisHint;
}

function setBrowserInfo(cd, iw, ih)
{
  cellDimension = cd;
  imgWidth = iw;
  imgHeight = ih;
}

function getBrowserInfo()
{
  isOpera = (navigator.userAgent.indexOf('Opera') != -1);

  if (isOpera)
    setBrowserInfo(0, 50, 26);
  else if (navigator.appName == 'Netscape')
    setBrowserInfo(0, 49, 26);
  else
    setBrowserInfo(1, 48, 24);
}

function updateAnswer( str )
{
  for (var i=0; i < str.length; i++)
  {
    if ((lastAnswer.charAt(i) == str.charAt(i)) && (!gameStart))
      continue;
    if (str.charAt(i) == " ")
      eval('document.ans'+i+'.src="'+sourceDir+'space.gif"');
    else if (str.charAt(i) == blankChar)
      eval('document.ans'+i+'.src="'+sourceDir+'blank.gif"');
    else
      eval('document.ans'+i+'.src="'+sourceDir+str.charAt(i)+'.gif"');
  }
  lastAnswer = str;

  if (gameStart)
    for (var i=str.length; i < maxLength; i++)
       eval('document.ans'+i+'.src="'+sourceDir+'space.gif"');

  gameStart = false;
}

function arrayDelete( arrayName, delIndex )
{
  var ar = new Array();
  for (var ii = 0; ii < arrayName.length; ii++)
  {
     if (ii != delIndex)
      ar[ar.length] = arrayName[ii];
  }
  return ar;
}

function Word(aWord,aHint)
{
  this.value=aWord;
  this.hint=aHint;
  if (aWord.length > maxLength)
    maxLength = aWord.length;
}

function loadWords( wArray )
{
  var ar = new Array();

  for (var i=0; i < wArray.length; i=i+2)
    ar[ar.length] = new Word(wArray[i], wArray[i+1]);

  wordCount = ar.length;
  return ar;
}

function newPuzzle()
{
  gameOver = false;
  gameStart = true;
  usedLetters = '';
  wrongLetters = '';
  answerDisplay= '';
  lastAnswer = '';

  for (var i=0; i < 26; i++)
    eval('document.img'+alphaLower.charAt(i)+'.src="'+sourceDir+alphaLower.charAt(i)+'.gif"');

  answerIdx = Math.floor(Math.random()*wordArray.length);
  thisAnswer = (wordArray[answerIdx].value).toLowerCase();
  thisHint = wordArray[answerIdx].hint;

  if (wordArray.length > 1)
    wordArray = arrayDelete( wordArray, answerIdx );
  else
    wordArray = loadWords(words);

  for(var i=0; i<thisAnswer.length; i++)
  {
     if ( thisAnswer.charAt(i) == " " )
       answerDisplay = answerDisplay+" ";
     else
       answerDisplay = answerDisplay+blankChar;
  }

  updateAnswer(answerDisplay);

  if (isHint)
    document.hintForm.hint.value=' ';

  document.hangimage.src=sourceDir + "image0.gif";

  if ((firstRun) && (navigator.appName == 'Netscape'))
    setTimeout('netscapeLoad()',1000);

  firstRun = false;
}

function netscapeLoad()
{
  for (var i=0; i < answerDisplay.length; i++)
    if (answerDisplay.charAt(i) == blankChar)
      eval('document.ans'+i+'.src="'+sourceDir+'blank.gif"');
}

function check(character)
{
  if (gameOver) return;
  if (usedLetters.indexOf(character) == -1)
  {
    usedLetters = usedLetters+character;
    eval('document.img'+character+'.src="'+sourceDir+'space.gif"');
  }
  else
    return;

  var wrongLetter = true;
  for( i = 0; i < thisAnswer.length; i++ )
  {
    if ( thisAnswer.indexOf(character, i) == -1 ) break;

    if ( thisAnswer.charAt(i) == character )
    {
       wrongLetter = false;
       if( i == 0 )
         answerDisplay = character + answerDisplay.substring(i+1,thisAnswer.length);
       else if ( i == thisAnswer.length-1 )
         answerDisplay = answerDisplay.substring(0,i)+character;
       else
         answerDisplay = answerDisplay.substring(0,i)+character+answerDisplay.substring(i+1,thisAnswer.length);
     }
  }

  if (wrongLetter)
  {
    if (wrongLetters.indexOf(character) == -1)
      wrongLetters = wrongLetters+character;

     if ( wrongLetters.length < maxAttempts )
       document.hangimage.src=sourceDir+"image"+wrongLetters.length+".gif";
     else
     {
        updateAnswer(thisAnswer);
        document.hangimage.src = sourceDir+"lose.gif";
        numWrong++;
        endGame();
     }
  }
  else
  {
    updateAnswer(answerDisplay);

    if( answerDisplay.indexOf(blankChar) == -1 )
    {
      document.hangimage.src=sourceDir+"win.gif";
      numRight++;
      endGame();
    }
  }
}

function drawAnswer()
{
  wordArray = loadWords(words);
  for (var i=0; i < maxLength; i++)
  {
    document.writeln(
    '<img border=0 SRC=\''
    + sourceDir + 'space.gif\' name="ans'
    + i
    +'">'
    );
  }
  newPuzzle();
}

function drawControl()
{
document.writeln('<FORM name="control">');

document.writeln(
  '<TABLE border="1" bgcolor="#CCCCCC" cellspacing="'+cellDimension+'" cellpadding="'+cellDimension+'"><TR>'
  +'<TD background="'+sourceDir+'newbtn.gif" width="'+imgWidth+'" height="'+imgHeight+'"><A href="javascript:void(newPuzzle())"><IMG border=0 SRC="'+sourceDir+'space.gif" width="42" height="22" alt="new puzzle"></A></TD>'
  +'<TD background="'+sourceDir+'scores.gif" >'
  +'<IMG border=0 SRC="'+sourceDir+'space.gif" width="90" height="10"><input type="text" size="5" name="you" value="0">'
  +'<IMG border=0 SRC="'+sourceDir+'space.gif" width="90" height="10"><input type="text" size="5" name="me" value="0"></B></TD>'
  +'</TR><TR><TD colspan=3 bgcolor="#FFFFFF" align="center">'
);

document.writeln('<table border="0" bgcolor="#FFFFFF" cellpadding="3"><tr>');
for (var i=0; i < 13; i++)
{
  document.writeln('<td align="center">');

  if (navigator.appName == 'Netscape')
    document.writeln(
    '<A href=\'javascript:void(check("'
    + alphaLower.charAt(i)
    + '"))\'>'
    );
  document.writeln(
  '<img width=16 height=16 border=0 SRC=\''
  + sourceDir + alphaLower.charAt(i)
  + '.gif\' onClick=\'check("'
  + alphaLower.charAt(i)
  + '")\' name="img'
  + alphaLower.charAt(i)
  + '"></A></td>'
  );
}

document.writeln('</tr><tr>');

for (var i=13; i < 26; i++)
{
  document.writeln('<td align="center">');

  if (navigator.appName == 'Netscape')
    document.writeln(
    '<A href=\'javascript:void(check("'
    + alphaLower.charAt(i)
    + '"))\'>'
    );
  document.writeln(
  '<img border=0 width=16 height=16 SRC=\''
  + sourceDir + alphaLower.charAt(i)
  + '.gif\' onClick=\'check("'
  + alphaLower.charAt(i)
  + '")\' name="img'
  + alphaLower.charAt(i)
  + '"></A></td>'
  );
}

document.writeln('</tr></table></td></tr></TABLE>');
document.writeln('</FORM>');
}

function drawHangman()
{
  document.writeln('<img name="hangimage" src="'+sourceDir+'image0.gif" width=140 height=180>');
}

function drawHint()
{
  isHint = true;

  document.writeln('<FORM name="hintForm">');
  document.writeln(
  '<TABLE border="1" bgcolor="#F5A232" cellspacing="'+cellDimension+'" cellpadding="'+cellDimension+'"><TR>'
  +'<TD background="'+sourceDir+'hintbtn.gif" width="'+imgWidth+'" height="'+imgHeight+'"><A href="javascript:void(showHint())"><IMG border=0 SRC="'+sourceDir+'space.gif" width="42" height="22" alt="show hint"></A></TD>'
  +'<TD background="'+sourceDir+'hintbar.gif" width="'+imgWidth+'" height="'+imgHeight+'"><input type="text" size="35" name="hint" value=""></TD>'
  +'</TR></TABLE></FORM>'
  );

}

getBrowserInfo();