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_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 + '"');
  data.reportedIndex = obj.index;
}

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

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

  data.lastState = obj.newstate;
  if (obj.newstate != 'PLAYING') data.lastPosition = false;
}

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

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

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

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

function swfinit_checkStalledPlayback(data, playerid)
{
  if (data.lastPosition && data.positionChangeTime && (new Date() - data.positionChangeTime > 1000))
  {
    swfinit_addLog(playerid, 'FORCING COMPLETED');
    swfinit_handleCompleted(playerid);
  }
}

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.reportedBufferingIndex == 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;
  }
}
