//========================================================================

//   "WebHangman"  JavaScript Hangman  

//

//   Copyright (C) 2000,2001  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: Jan Mulder info@EnglishCafe.co.uk

//

//=======================================================================



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;



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 preloadImages()

{

 this.length = preloadImages.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 = preloadImages.arguments[i];

 }

 updateProgress(this);

}



var pictures = new preloadImages(

 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+"image4.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="#CCCCCC" cellspacing="'+cellDimension+'" cellpadding="'+cellDimension+'"><TR>'

  +'<TD bgcolor="CCCCCC"><A href="javascript:void(showHint())"><IMG border=0 SRC="'+sourceDir+'hintbtn.gif" width="'+imgWidth+'" height="'+imgHeight+'" alt="show hint"></A></TD>'

  +'<TD><textarea cols="35" rows="3" name="hint"></textarea></TD>'

  +'</TR></TABLE><font face="Arial" size="2">Warning: If you click on hint, you are one step closer to Hangman!</font></FORM>'

  );



}



getBrowserInfo();