(function($, window) {

var document = window.document;
var aflax = null;
var lang = null;
var flashLoaded = false;
var flashLoadedCallbacks = [];

function initAFLAX() {
  var requiredVersion = new com.deconcept.PlayerVersion([8, 0, 0]);
  var installedVersion = com.deconcept.FlashObjectUtil.getPlayerVersion();
  if (!installedVersion.versionIsValid(requiredVersion))
    return;
  aflax = new AFLAX("http://" + document.domain + "/aflax.swf");
  aflax.insertFlash(1, 1, "#ffffff", "insertFlashDone", true);
}
window.initAFLAX = initAFLAX;

function insertFlashDone() {
  flashLoaded = true;
  for (i = 0; i < flashLoadedCallbacks.length; i++) {
    var func = flashLoadedCallbacks[i];
    func();
  }
  flashLoadedCallbacks = [];
}
window.insertFlashDone = insertFlashDone;

function waitOnFlash(func) {
  if (flashLoaded)
    func();
  else
    flashLoadedCallbacks.push(func);
}

function playAudioFlash(url, onDone) {
  var sound = null;
  var timeoutID = null;
  function play() {
    sound = new AFLAX.FlashObject(aflax, "Sound");
    sound.exposeFunction("loadSound", sound);
    sound.exposeFunction("start", sound);
    sound.exposeFunction("stop", sound);
    sound.exposeProperty("position", sound);
    sound.exposeProperty("duration", sound);
    sound.loadSound(url, true);
    sound.start();
    if (onDone) {
      function poll() {
        if (sound.getPosition() >= sound.getDuration() && sound.getDuration() > 0)
          onDone();
        else
          timeoutID = window.setTimeout(poll, 50);
      }
      poll();
    }
  }
  waitOnFlash(play);
  function stop() {
    if (sound)
      sound.stop();
    if (timeoutID)
      window.clearTimeout(timeoutID);
  }
  return {stop: stop};
}

function playAudioWMP(url, onDone) {
  var wmp = new ActiveXObject("WMPlayer.OCX");
  wmp.settings.volume = 100;
  wmp.URL = url;
  var timeoutID = null;
  function stop() {
    wmp.controls.stop();
    if (timeoutID)
      window.clearTimeout(timeoutID);
  }
  if (onDone) {
    function poll() {
      var state = wmp.playState;
      if (state == 8 || state == 1)
        onDone();
      else
        timeoutID = window.setTimeout(poll, 50);
    }
    poll();
  }
  return {stop: stop};
}

var playAudio;

var audioQueue = [];
var currentPlayer = null;

function playNext() {
  if (audioQueue.length > 0) {
    var url = audioQueue.shift();
    function onDone() {
      currentPlayer = null;
      playNext();
    }
    currentPlayer = playAudio(url, onDone);
  }
}

function enqueueAudio(url) {
  audioQueue.push(url);
  if (currentPlayer == null)
    playNext();
}

function enqueuePremadePrompt(name) {
  enqueueAudio("http://" + document.domain + "/prompts/" + name + ".mp3");
}

function enqueuePromptText(text) {
  enqueueAudio("http://" + document.domain + "/tts?lang=" + lang + "&text=" + window.encodeURIComponent(text));
}

function stopAudio() {
  if (currentPlayer) {
    currentPlayer.stop();
    currentPlayer = null;
  }
  audioQueue = [];
}

function onKeyDown(event) {
  stopAudio();
  if (event.keyCode == 0x77) {
    enqueuePremadePrompt("tutorial");
    return false;
  }
  return true;
}

function start() {
  if (navigator.appName == "Microsoft Internet Explorer") {
    poll();
    $("#downloadLink").focus();
    enqueuePromptText(welcomePrompt);
  } else {
    enqueuePromptText(notIEPrompt);
  }
}

var prevStatus = null;

function poll() {
  var url = "http://" + document.domain + "/status";
  $.get(url, function(doc) {
    var root = doc.documentElement;
    var status = root.getAttribute("status");
    var osLang = root.getAttribute("lang");
    if (!osLang)
      osLang = lang;
    if (osLang == "fr")
      key = "E";
    else
      key = "R";
    if (status != prevStatus) {
      prevStatus = status;
      if (status == "started") {
        enqueuePromptText(downloadDialogPrompt.replace(/__KEY__/, key));
      } else if (status == "done") {
        function runPrompt() {
          stopAudio();
          enqueuePromptText(runDialogPrompt.replace(/__KEY__/, key));
        }
        window.setTimeout(runPrompt, 1000);
        return;
      }
    }
    window.setTimeout(poll, 500);
  }, "xml");
}

$(document).ready(function() {
  lang = $("html").attr("lang");
  $(document).keydown(onKeyDown);
  $("#downloadLink").click(function() {
    $(this).blur().hide();
  });
  if (aflax)
    playAudio = playAudioFlash;
  else
    playAudio = playAudioWMP;
  start();
});

})(jQuery, window, undefined);
