var buttonCover;
var clipsign;
var score;
var turn;
var clockValue;
var clockTimerId;
var quitNow;
var waiting;
var countdownValue;
var countdownTimerId;

// Collections of items
var allItems = new Array();
var items;

// Image arrays
var station = new Array();
var number = new Array();
var scoreImg = new Array();
var outcomeImages = new Array();

// Object references
var score_hundreds;
var score_tens;
var score_ones;
var outcome;
var sign;
var countdownObj;

var akallaItems = ["akalla", "husby", "kista", "hallonbergen", "nackrosen", "solnacentrum", "stadshagen", "fridhemsplan", "radhuset", "tcentralen", "kungstradgarden"];

var hjulstaItems = ["hjulsta", "tensta", "rinkeby", "rissne", "duvbo", "sundbybergscentrum", "vreten", "huvudsta", "vastraskogen", "stadshagen", "fridhemsplan", "radhuset", "tcentralen", "kungstradgarden"];

var hasselbyItems = ["hasselbystrand", "hasselbygard", "johannelund", "vallingby", "racksta", "blackeberg", "islandstorget", "angbyplan", "akeshov", "brommaplan", "abrahamsberg", "storamossen", "alvik", "kristineberg", "thorildsplan", "fridhemsplan", "steriksplan", "odenplan", "radmansgatan", "hotorget", "tcentralen"];

var norsborgItems = ["norsborg", "hallunda", "alby", "fittja", "masmo", "varbygard", "varberg", "skarholmen", "satra", "bredang", "malarhojden", "axelsberg", "ornsberg", "aspudden", "liljeholmen", "hornstull", "zinkensdamm", "mariatorget", "slussen", "gamlastan", "tcentralen"];

var fruangenItems = ["fruangen", "vastertorp", "hagerstensasen", "telefonplan", "midsommarkransen", "liljeholmen", "hornstull", "zinkensdamm", "mariatorget", "slussen", "gamlastan", "tcentralen"];

var hagsatraItems = ["hagsatra", "ragsved", "hogdalen", "bandhagen", "stureby", "svedmyra", "sockenplan", "enskedegard", "globen", "gullmarsplan", "skanstull", "medborgarplatsen", "slussen", "gamlastan", "tcentralen"];

var farstaItems = ["farstastrand", "farsta", "hokarangen", "gubbangen", "tallkrogen", "skogskyrkogarden", "sandsborg", "blasut", "skarmarbrink", "gullmarsplan", "skanstull", "medborgarplatsen", "slussen", "gamlastan", "tcentralen"];

var skarpnackItems = ["skarpnack", "bagarmossen", "karrtorp", "bjorkhagen", "hammarbyhojden", "skarmarbrink", "gullmarsplan", "skanstull", "medborgarplatsen", "slussen", "gamlastan", "tcentralen"];

var ropstenItems = ["ropsten", "gardet", "karlaplan", "ostermalmstorg", "tcentralen"];

var morbyItems = ["morbycentrum", "danderydssjukhus", "bergshamra", "universitetet", "tekniskahogskolan", "stadion", "ostermalmstorg", "tcentralen"];


function uniq(a) {
  var b = a.sort();
  var u = new Array();

  var i;
  var j = 0;

  u[j++] = b[0];
  var tmp = b[0];

  for(i=1; i<b.length; i++) {
    if(b[i]!=tmp) {
      u[j++] = b[i];
      tmp = b[i];
    }
  }   
  
  return u;
}

function hideAll(objList)
{
  for(i=0; i<objList.length; i++) {
    obj = document.getElementById(objList[i]);
    obj.style.visibility = "hidden";
  }
}

function showAll(objList)
{
  for(i=0; i<objList.length; i++) {
    obj = document.getElementById(objList[i]);
    obj.style.visibility = "visible";
  }
}

function updateScore(s) {
    var rem;
    var ones;
    var tens;
    var hundreds;

    ones = s % 10;
    rem = (s - ones)/10;
    tens = rem % 10;
    rem = (rem - tens)/10;
    hundreds = rem % 10;
    score_hundreds.src = scoreImg[hundreds].src;
    score_tens.src = scoreImg[tens].src;
    score_ones.src = scoreImg[ones].src;
}

function updateClock() {
  var clipvar;

  if(clockValue>=120) {
    stop();
    return;
  }
  clockValue++;
  clipleft = clockValue - (clockValue % 10);
  clipsign.style.clip = "rect(auto, auto, auto, " + clipleft + "px)";

  clockTimerId = setTimeout("updateClock()", gamedelay);
}

function countdown(n) {
  if(waiting) {
    countdownObj.src = number[n].src;
    countdownValue = n;
    if(n>0) {
      callstring = "countdown(" + (n-1) + ")";
      countdownTimerId = setTimeout(callstring, 1000);
    }
    else
      countdownTimerId = setTimeout("response(-1)", 1000);
  }
}

function showAnswer(phase, answer) {
  var obj = document.getElementById(answer);
  if(phase>0) {
    if(phase%2==0) {
      obj.style.visibility = "visible";
    } else {
      obj.style.visibility = "hidden";
    }
    setTimeout("showAnswer(" + (phase-1) + ", answer)", 1000);
  } else {
    sign.src = "stations/void.gif";
    countdownObj.src = "digits_1/idle.gif";
    obj.style.visibility = "hidden";
    next();
  }
}

function response(r) {
  if(waiting!=true) {
//    alert("Not now!");
    return;
  }
  waiting = false;
  clearTimeout(countdownTimerId);

  if(r==answer) {
    outcome.src = outcomeImages["correct"].src;
    showAnswer(3, answer);
    //    alert(countdownValue);
    if(countdownValue >= 5) { 
      score+=3;
    } else {
      score +=2;
    }
    updateScore(score);
  } else if(r==-1) {
    // Timeout
    outcome.src = outcomeImages["false"].src;
    showAnswer(5, answer);
    if(score>=1)
      score--;
    updateScore(score);
  } else {
    // Wrong answer
    outcome.src = outcomeImages["false"].src;
    showAnswer(5, answer);
    if(score>=1) { score--; }
    if(score<0) { score=0; }
    updateScore(score);
  }
}

function next() {
  if(quitNow)
    return;
  outcome.src = outcomeImages["idle"].src;
  turn++;
  answer = items[turn];
  if(answer!="-1") {
    sign.src = station[answer].src;
    countdownTimerId = setTimeout("countdown(10)", 0);
    waiting = true;
  } else {
    stop();
    return;
  }
}

function start()
{
  buttonCover.style.clip = "rect(auto,200px,auto,67px)";

  score = 0;
  updateScore(score);
  turn = 0;

  tmpAllItems = allItems;
  items = new Array();
  var n = tmpAllItems.length;
  for(i=1; i<=n; i++) {
    x = Math.random();
    y = Math.round(x*(tmpAllItems.length-1));
    c = tmpAllItems[y];
    tmp = tmpAllItems.slice(0, y);
    tmp2 = tmp.concat(tmpAllItems.slice(y+1));
//    confirm("x=" + x + ", y=" + y + ", c=" + c + ", tmp=" + tmp + ", tmp2=" + tmp2);
    tmpAllItems = tmp2;
    items[i] = c;
  }
  items[n+1] = "-1";

  clockValue = 0;
  updateClock();

  showAll(allItems);
  quitNow = false;
  next();
}

function stop() {
  quitNow = true;
  clearTimeout(clockTimerId);
  clearTimeout(countdownTimerId);
  buttonCover.style.clip = "rect(auto, 67, auto, 0)";
  hideAll(allItems);
  waiting = false;
  outcome.src = outcomeImages["still"].src;
  countdownObj.src = "digits_1/idle.gif";
  sign.src = "stations/void.gif";
}

function init()
{
  outcomeImages["idle"] = new Image();
  outcomeImages["idle"].src = "outcome.gif";
  outcomeImages["correct"] = new Image();
  outcomeImages["correct"].src = "outcome_correct.gif";
  outcomeImages["false"] = new Image();
  outcomeImages["false"].src = "outcome_false.gif";
  outcomeImages["still"] = new Image();
  outcomeImages["still"].src = "outcome_still.gif";

  allItems = norsborgItems;
  allItems = allItems.concat(fruangenItems);
  allItems = allItems.concat(ropstenItems);
  allItems = allItems.concat(morbyItems);
  allItems = allItems.concat(akallaItems);
  allItems = allItems.concat(hjulstaItems);
  allItems = allItems.concat(hasselbyItems);
  allItems = allItems.concat(hagsatraItems);
  allItems = allItems.concat(farstaItems);
  allItems = allItems.concat(skarpnackItems);

  setTimeout("hideAll(allItems)", 1000);
  setTimeout("showAll(allItems)", 2000);

  allItems = uniq(allItems);
  gamedelay = 2000;

  for(i=0; i<allItems.length; i++) {
    station[allItems[i]] = new Image();
    station[allItems[i]].src = "stations/" + allItems[i] + ".gif";
  }

  for(i=0; i<=9; i++) {
    number[i] = new Image();
    number[i].src = "digits_1/" + i + ".gif";
    scoreImg[i] = new Image();
    scoreImg[i].src = "digits_2/" + i + ".gif";
  }
  number[10] = new Array();
  number[10].src = "digits_1/idle.gif";
  scoreImg[10] = new Array();
  scoreImg[10].src = "digits_2/void.gif";

  clipsign = document.getElementById("clipsign");
  buttonCover = document.getElementById("buttonCover");
  score_hundreds = document.getElementById("hundreds");
  score_tens = document.getElementById("tens");
  score_ones = document.getElementById("ones");
  outcome = document.getElementById("outcome");
  sign = document.getElementById("sign");
  countdownObj = document.getElementById("countdown");

  setTimeout("start()", 3000);
}
