var swfinit_data = new Array();

function swfinit_callEmbed(playerid, parameters)
{
  var data = swfinit_getData(playerid);
  data.embedParameters = parameters;
  var modifiedParameters = swfinit_shallowClone(parameters);
  modifiedParameters[6] = swfinit_shallowClone(modifiedParameters[6]);
  modifiedParameters[6].repeat = '';
  data.modifiedParameters = modifiedParameters;
  return swfobject.embedSWF.apply(swfobject, data.modifiedParameters);
}

function swfinit(playerid, playlistItems, startItem, startTime, statusDiv)
{
  data = swfinit_getData(playerid);
  data.playlistItems = playlistItems;
  data.startItem = startItem;
  data.startTime = startTime;
  data.statusDiv = statusDiv;

  swfinit_inner(playerid);
}

function swfinit_inner(playerid)
{
  var data = swfinit_getData(playerid);
  swfinit_addLog(playerid, 'INIT');

  var player = document.getElementById(playerid);

  if (!player.getConfig) // Not connected...
  {
    swfinit_addLog(playerid, '*RECALL*');
    setTimeout(function() { 
      var containerId = data.embedParameters[1];
      var parent = player.parentNode;

      var newDiv = document.createElement('div');
      newDiv.id = containerId;

      parent.insertBefore(newDiv, player);
      parent.removeChild(player);

      swfobject.embedSWF.apply(swfobject, data.modifiedParameters);
    }, 500);
    return;
  }

  var playlistClone = new Array();
  var selectedPlaylistItem = playlistItems[data.startItem];

  var secondHalfPlaylistItem = swfinit_shallowClone(selectedPlaylistItem);
  secondHalfPlaylistItem.start = data.startTime;
  playlistClone[playlistClone.length] = secondHalfPlaylistItem;

  for (var i = 1 + data.startItem; i < playlistItems.length; ++i)
  {
    playlistClone[playlistClone.length] = swfinit_shallowClone(playlistItems[i]);
  }
  for (var i = 0; i < data.startItem; ++i)
  {
    playlistClone[playlistClone.length] = swfinit_shallowClone(playlistItems[i]);
  }
  playlistClone[playlistClone.length] = swfinit_shallowClone(selectedPlaylistItem);

  data.playlistClone = playlistClone;

  window['swfinit_playlistListener_' + playerid] = function(obj) { swfinit_playlistListener(obj, playerid); }
  player.addControllerListener('PLAYLIST', 'swfinit_playlistListener_' + playerid);

  swfinit_addLog(playerid, 'INIT1.5');
  player.sendEvent('LOAD', playlistClone);
}

function swfinit_shallowClone(obj)
{
  var newObj = new obj.constructor();

  for(var key in obj)
  {
    newObj[key] = obj[key];
  }

  return newObj;
}

function swfinit_playlistListener(obj, playerid)
{
  var player = document.getElementById(playerid);
  swfinit_addLog(playerid, 'INIT2');

  if (!window['swfinit_itemListener_' + playerid])
  {
    window['swfinit_itemListener_' + playerid] = function(obj) { swfinit_itemListener(obj, playerid); }
    player.addControllerListener('ITEM', 'swfinit_itemListener_' + playerid);
  }

  if (!window['swfinit_stateListener_' + playerid])
  {
    window['swfinit_stateListener_' + playerid] = function(obj) { swfinit_stateListener(obj, playerid); }
    player.addModelListener('STATE', 'swfinit_stateListener_' + playerid);
  }

  if (!window['swfinit_positionListener_' + playerid])
  {
    window['swfinit_positionListener_' + playerid] = function(obj) { swfinit_positionListener(obj, playerid); }
    player.addModelListener('TIME', 'swfinit_positionListener_' + playerid);
  }

  if (!window['swfinit_seekListener_' + playerid])
  {
    window['swfinit_seekListener_' + playerid] = function(obj) { swfinit_seekListener(obj, playerid); }
    player.addControllerListener('SEEK', 'swfinit_seekListener_' + playerid);
  }

  if (!window['swfinit_tick_' + playerid])
  {
    window['swfinit_tick_' + playerid] = function() { swfinit_tick(playerid); }
    setTimeout(window['swfinit_tick_' + playerid], 100);
  }

  player.sendEvent('ITEM', 0);
}

function swfinit_itemListener(obj, playerid)
{
  var data = swfinit_getData(playerid);
  swfinit_addLog(playerid, 'ITEM ' + obj.index + ' "' + data.playlistClone[obj.index].title + '"');
  var seekPosition = data.playlistClone[obj.index].start;
  if (seekPosition) swfinit_addLog(playerid, 'AT ' + seekPosition);
  
  data.reportedIndex = obj.index;
  data.seekPosition = seekPosition;
  data.lastPosition = 0;
  data.positionChangeTime = false;
}

function swfinit_stateListener(obj, playerid)
{
  var data = swfinit_getData(playerid);
  var player = document.getElementById(playerid);
  swfinit_report(playerid, obj.newstate);

  if (obj.newstate == 'BUFFERING' || obj.newstate == 'PLAYING')
  {
    data.reportedActivityIndex = data.reportedIndex;
  }
  else if (obj.newstate == 'COMPLETED')
  {
    swfinit_handleCompleted(playerid);
  }

  data.lastState = obj.newstate;
}

function swfinit_positionListener(obj, playerid)
{
  var data = swfinit_getData(playerid);
  
  if (data.lastPosition != obj.position)
  {
    data.lastPosition = obj.position;
    data.positionChangeTime = new Date();
  }

  swfinit_report(playerid, data.lastState + ' POSITION ' + new Number(obj.position).toFixed(2)
                           + ' TIME ' + new Date().toTimeString());
}

function swfinit_seekListener(obj, playerid)
{
  var data = swfinit_getData(playerid);
  data.seekPosition = obj.position;
  data.lastPosition = 0;
  data.positionChangeTime = false;

  swfinit_addLog(playerid, 'SEEK ' + new Number(obj.position).toFixed(2));
}

function swfinit_tick(playerid)
{
  var data = swfinit_getData(playerid);
  swfinit_checkStallOnFinish(data, playerid);

  setTimeout(window['swfinit_tick_' + playerid], 100);
}

function swfinit_checkStallOnFinish(data, playerid)
{
  if (data.positionChangeTime &&
      (data.playlistClone[data.reportedIndex].duration_virtual - (data.seekPosition + data.lastPosition) < 2) &&
      (new Date() - data.positionChangeTime > 1000) &&
      // Prevent "just seeked" situation from triggering completion too early:
      (Math.abs(data.seekPosition - data.lastPosition) > 2 || new Date() - data.positionChangeTime > 5000))
  {
    swfinit_addLog(playerid, 'FORCING COMPLETED (' + (data.seekPosition + data.lastPosition) + ' vs. ' + data.playlistClone[data.reportedIndex].duration_virtual + ')');
    swfinit_handleCompleted(playerid);
    return true;
  }
  return false;
}

function swfinit_handleCompleted(playerid)
{
  var data = swfinit_getData(playerid);
  var player = document.getElementById(playerid);
  
  if (data.reportedIndex == data.playlistItems.length)
  {
    if (data.embedParameters[6].repeat == 'always')
    {
      swfinit_addLog(playerid, '*RESTART*');
      setTimeout(function() { player.sendEvent('ITEM', 1); }, 1000);
    }
  }
  else
  {
    if (data.embedParameters[6].repeat == 'always')
    {
      if (data.reportedActivityIndex == data.reportedIndex)
      {
        swfinit_addLog(playerid, '*NEXT*');
        player.sendEvent('ITEM', 1 + data.reportedIndex);
      }
      else
      {
        swfinit_addLog(playerid, '*AGAIN*');
        player.sendEvent('ITEM', data.reportedIndex);
      }
    }
    else if (data.embedParameters[6].repeat == 'once')
    {
      swfinit_addLog(playerid, '*REPEAT*');
      player.sendEvent('ITEM', data.reportedIndex);
    }
  }
}

function swfinit_getData(playerid)
{
  if (!swfinit_data[playerid])
  {
    swfinit_data[playerid] = {};
  }
  return swfinit_data[playerid];
}

function swfinit_addLog(playerid, html)
{
  var data = swfinit_getData(playerid);
  if (data.log == null) data.log = '';
  if (data.log.length > 10000) data.log = '';
  data.log += ' ' + html;

  if (data.statusDiv)
  {
    document.getElementById(data.statusDiv).innerHTML = data.log + ' ' + (data.report != null ? data.report : '');
  }
}

function swfinit_report(playerid, html)
{
  var data = swfinit_getData(playerid);
  data.report = html;
  if (data.statusDiv)
  {
    document.getElementById(data.statusDiv).innerHTML = (data.log != null ? data.log : '') + ' ' + data.report;
  }
}

