﻿//Global vars
var periodicalExecuter;
var passedTime;
var totalTime;
var items;
var listid;

var started = false;

//List type vars
var iteratelist = false;
var iterateid = 0;
var showcurrent = false; // Only show current item
var showdesc = false;    // Show description in caption

/*
 * A list item is a single item in the list
 * description: a description of the item
 * name: the name which has to be guessed
 */
function ListItem(id, description, names, extra)
{
  var namesString = names;
  var namesArray = namesString.split(",");
  
  this.id          = id;
  this.description = description;
  this.name        = namesArray[0];
  this.names       = namesArray;
  this.extra       = extra;
  this.guessed     = false;
}

function SetTotalTime(time)
{
  totalTime = time;
}

/*
 * Handle input from the user
 * Show a solution if it has been guessed
 * Stop the timer when all solutions have been guessed
 */
function KeyPressed(input, items)
{
  var nbGuessed = 0;
  var guessed = false;

  if(iteratelist)
  {
    guessed = AcceptCurrent(input, items);
  }
  else
  {
    guessed = AcceptAny(input, items);
  }
 
  // Counted nb of guessed items
  for(var i = 0; i < items.length; i++)
  {
    if(items[i].guessed)
    {
      nbGuessed++;
    }
  }

  // If an item was guessed, clear the input field
  if(guessed)
  {
    input.value="";
  }

  // Check for end game
  if(nbGuessed == items.length)
  {
    EndGame("Well done!");
  }

  ShowNbGuessed();
}

/*
 * Accept only the current item
 */
function AcceptCurrent(input, items)
{
  var guessed = false;
  var i = iterateid;
  for(var j = 0; j < items[i].names.length; j++)
  {
    if(FilterInput(input.value) == FilterInput(items[i].names[j]))
    {
      ShowAnswer(items[i]);
      guessed = true;
      items[i].guessed = true;
    }
  }

  if(guessed)
  {
    Skip();
  }

  return guessed;
}

/*
 * Skip the current item
 */
function Skip()
{
    var startid = iterateid;
    try
    {
    	$('Show'+items[iterateid].id).hide();
    } catch(err) {}

    do
    {
      iterateid = (iterateid+1)%items.length;  
    } while(items[iterateid].guessed && startid != iterateid);
	
    if(startid == iterateid)
    {
      try 
      {
	      $('skipbutton').hide();
      } catch(err) {} 
    }

    try
    {
      $('Show'+items[iterateid].id).show();
    } catch(err) {}

    if(showdesc)
    {
      $('caption').innerHTML = items[iterateid].description;
    }

    try 
    {
	    $('Input').value = "";
    } catch(err) {} 
    Focus();
}

function AcceptAny(input, items)
{
  var guessed = false;
  
  for(var i = 0; i < items.length; i++)
  {
    for(var j = 0; j < items[i].names.length; j++)
    {
      if(FilterInput(input.value) == FilterInput(items[i].names[j]))
      {
        ShowAnswer(items[i]);
//              $(''+i).morph('width:200px;color:#00A');
 		    if(!items[i].guessed)
        {
          guessed = true;
       
          /*var top = $(''+i).style.top;
          var left = $(''+i).style.left;
          $(''+i).style.top = -10 + 'px';
          $(''+i).style.left = 400 + 'px';
          $(''+i).morph('top:' + top + ';left:' + left);
          */
        }
        else
        {
          new Effect.Pulsate(''+i);
        }
        items[i].guessed = true;
        break;
      }
    }
  }
  return guessed;
}

/*
 * Show the answer of one item
 */
function ShowAnswer(item)
{
  $(''+item.id).innerHTML = item.name;
}

/* 
 * Show the answer of one item, show description on mouseover
 */
function ShowAnswerAndDescription(item)
{
  $(''+item.id).innerHTML = "<div onmouseover=\"Tip('" +
                            item.name + ", <br> " + item.description + "')\" onmouseout=\"UnTip()\">" + item.name +
                            "</span>";
}


/*
 * Filter the input
 */
function FilterInput(input)
{
  input = input.toLowerCase();
  input = input.replace(/<br\/>/g,"");
  input = input.replace(/<br>/g,"");
  input = input.replace(/\ /g,"");
  input = input.replace(/'/g,"");
  input = input.replace(/[-_]/g,"");
  input = input.replace(/[éèëê]/g,"e");
  input = input.replace(/[öóòô]/g,"o");
  input = input.replace(/[îíìï]/g,"i");
  input = input.replace(/[üúùû]/g,"u");
  input = input.replace(/[ç]/g,"c");

  return input;
}

function FilterSingleQuote(input)
{
  input = input.replace(/'/g,"&#145;");
  return input; 
}

/*
 * Place the items in an image list
 */
function PlaceImageListItems(itemstyle)
{
  for(var i = 0; i < items.length; i++)
  {
    var coordsString = items[i].extra;
    var coords = coordsString.split(",");
    $('image').innerHTML += "<div id=" + items[i].id + " style=\"position:absolute;left:" +
                            coords[0] + "px; top: " + coords[1] + "px;" + itemstyle + "\"> </div>";
  }
                                   
}

/*
 * Fill in missing items
 */
function FillInMissingItems()
{
    for(var i = 0; i < items.length; i++)
    {
        if(!items[i].guessed)
        {
          try
          {
            $(''+items[i].id).style.color = "#F00";
            ShowAnswer(items[i]);
          } catch(err) {}
          try
          {
            $('Show'+items[i].id).show();
          } catch(err) {}
        }
    }
}

function ColorItem(item)
{
  if(item.guessed)
  {
    $(''+item.id).style.color = "#000";
  }
  else
  {
    $(''+item.id).style.color = "#F00";
  }
}

/*
 * Show the number of guessed items
 */
function ShowNbGuessed()
{
  var nbGuessed = 0;
  for(var i = 0; i < items.length; i++)
  {
    if(items[i].guessed)
    {
      nbGuessed++;
    }
  }
  $('LeftMessage').innerHTML = nbGuessed + "/" + items.length;
}

/*
 * Show Solution
 */
function ShowSolution()
{
  EndGame("You gave up..");
}

/*
 * Start the game
 */
function StartGame(time, caption)
{
    if(started)
    {
      return;
    }

    started = true;

    $('Entry').innerHTML = "<span id='caption'>" + caption + "</span> : <input id='Input' type='text' size='25' onKeyUp='KeyPressed(this, items);' name='input'>"; 

    if(showdesc)
    {
      $('caption').innerHTML = items[0].description;
    }

    passedTime = 0;
    totalTime  = time;
    periodicalExecuter = new PeriodicalExecuter(IncTime, 1);
    ShowNbGuessed();
    Focus();
}

/*
 * End the game
 */
function EndGame(message)
{
  $('Entry').innerHTML = "<a href='?'>Home</a> - <a href='" + location.href + "'>Restart</a> - " + 
                         "<a href='" + location.href + "&page=statistics'>Statistics</a>";
  $('RightMessage').innerHTML = message;
  FillInMissingItems();
  periodicalExecuter.stop();
  SubmitGame();
  
  try 
  {
	  $('skipbutton').hide();
  } catch(err) {} 
}

function Focus()
{
  try
  {
    $('Input').focus();
  } catch(err) {}
}

/*
 * Submit game result
 */
function SubmitGame()
{
  var url = "submitgame.php?listid="+listid+"&time="+passedTime+"&listresult=";
  var first = true;
  for(var i = 0; i < items.length; i++)
  {
    if(items[i].guessed)
    {
      if(!first)
      {
        url = url + ",";
      }
      else
      {
        first = false;
      }
      url = url + items[i].id;
    }
  }
  new Ajax.Request(url);
                                                                                                                
}

/*
 * Function being called every second (until the game is finished)
 */
function IncTime(pe)
{
  passedTime++;
  if(passedTime >= totalTime)
  {
    $('Entry').innerHTML = "Time is up";
    EndGame("Better luck next time");
  }
  
  if(passedTime == 20)
  {
    $('ShowSolution').show();
  }

  
  //var interpolate = passedTime/totalTime;
  //var progress = interpolate*800;
  //$('Timer').morph('width:' + progress + 'px; background: ' + interpolateColor(interpolate));

$('timeleft').innerHTML = " - " + SecondsToTime(totalTime-passedTime);
}

/*
 * Load items (descriptions, ...)
 */
function LoadItems(items)
{
  for(var i = 0; i < items.length; i++)
  {
    try
    {
      $('Desc'+items[i].id).innerHTML = items[i].description;
    } catch(err) {}
  }
}

/*
 * Interpolate colours from green to yellow to red
 */
function interpolateColor(i)
{
  if(i < 0.5)
  {
    var red = Math.round(255*2*i);
		if(red < 16) red = "0" + d2h(red);
		else red = d2h(red);		
    return "#" + red + "FF00";
  }
  else
  {
    var green = Math.round(255*(1-2*(i-0.5)));
		if(green < 16) green = "0" + d2h(green);
		else green = d2h(green);		
    return "#FF" + green + "00";
  }
}

/*
 * Interpolation
 */
function interpolate(x1, y1, x3, y3, x2) {
  if (x3 == x1) return y1
  else return (x2-x1)*(y3-y1)/(x3-x1) + y1
}
/*
 * Convert decimal to hex
 */
function d2h(dec)
{
  return dec.toString(16);
}

/*
 * Convert hex to decimal
 */
function h2d(hex) 
{ 
	return parseInt(hex,16);
}

/*
 * Convert seconds to min:sec
 */
function SecondsToTime(seconds)
{
  var min = Math.floor(seconds/60);
  var secs = seconds % 60;
  if(secs < 10)
  {
    secs = "0" + secs;
  }
  return min + ":" + secs;
}

/*
 * Boss functions
 */
var miskcontent;
var boss = false;
var timerrunning = false;
function Boss()
{
  boss = !boss;
  if(boss)
  {
    miskcontent = $('misk').innerHTML;
    try
    {
      periodicalExecuter.stop();
      timerrunning = true;
    } catch(err) {
      timerrunning = false;
    }
    
    $('misk').innerHTML = "<div onclick='Boss()'>Go back</div><center><FORM method=GET action='http://www.google.be/search'><TABLE bgcolor='#FFFFFF'><tr><td><A HREF='http://www.google.be/'><IMG SRC='http://www.google.com/logos/Logo_40wht.gif' border='0' ALT='Google' align='absmiddle'></A><INPUT TYPE=text name=q size=31 maxlength=255 value=''><INPUT TYPE=hidden name=hl value='nl'><INPUT type=submit name=btnG VALUE='Google Zoeken'></td></tr></TABLE> </FORM></center>";
  }
  else
  {
    $('misk').innerHTML = miskcontent;
    try
    {
      if(timerrunning)
      {
        periodicalExecuter = new PeriodicalExecuter(IncTime, 1);
      }
    } catch(err) {}
  }
}

