/******************************************************************************/
function init()
{
	resize();
	
	// version darstellen
	var testpageVersion = document.getElementById('libVersion');
	testpageVersion.innerHTML = "v" + org.webminster.Vanadium.prototype.LibVersion;
	
	// Preset einfügen und vorauswählen
	addPresets();
	document.getElementById('presets').selectedIndex = 3;
  presetSelected();
}

/******************************************************************************/
function addPresets()
{
  var preset1 = new Object();
  preset1['name'] = "WebPlayer Preview";
  preset1['size'] = "w=250 h=250";
  preset1['autostart'] = "no";
  preset1['random'] = "no";
  preset1['loop'] = "no";
  preset1['preview'] = "./pixmaps/preview.jpg";
  preset1['src'] = "./playlists/playlist.xml";
  preset1['binary'] = "WebPlayer";
  
  var preset2 = new Object();
  preset2['name'] = "WebPlayer Normal";
  preset2['size'] = "w=240 h=64";
  preset2['autostart'] = "yes";
  preset2['random'] = "no";
  preset2['loop'] = "no";
  preset2['preview'] = "";
  preset2['src'] = "./playlists/playlist.xml";
  preset2['binary'] = "WebPlayer";
  
  var preset3 = new Object();
  preset3['name'] = "WebPlayer XSPF";
  preset3['size'] = "w=240 h=64";
  preset3['autostart'] = "yes";
  preset3['random'] = "no";
  preset3['loop'] = "yes";
  preset3['preview'] = "";
  preset3['src'] = "./playlists/xspf_playlist.xspf";
  preset3['binary'] = "WebPlayer";
  
  var preset4 = new Object();
  preset4['name'] = "WebPlayer Video";
  preset4['size'] = "w=500 h=300";
  preset4['autostart'] = "yes";
  preset4['random'] = "no";
  preset4['loop'] = "yes";
  preset4['preview'] = "";
  preset4['src'] = "./playlists/xspf_video_playlist.xspf";
  preset4['binary'] = "WebPlayer";
  
  var preset5 = new Object();
  preset5['name'] = "WebPlayer Sloppy";
  preset5['size'] = "w=240 h=64";
  preset5['autostart'] = "no";
  preset5['random'] = "no";
  preset5['loop'] = "no";
  preset5['preview'] = "";
  preset5['src'] = "./playlists/xspf_sloppy_playlist.xspf";
  preset5['binary'] = "WebPlayer";
  
  var preset6 = new Object();
  preset6['name'] = "WebPlayer Auto Rand Loop";
  preset6['size'] = "w=240 h=64";
  preset6['autostart'] = "yes";
  preset6['random'] = "yes";
  preset6['loop'] = "yes";
  preset6['preview'] = "";
  preset6['src'] = "./playlists/playlist.xml";
  preset6['binary'] = "WebPlayer";
  
  var preset7 = new Object();
  preset7['name'] = "WebPlayer Error XML XSPF";
  preset7['size'] = "w=240 h=64";
  preset7['autostart'] = "yes";
  preset7['random'] = "yes";
  preset7['loop'] = "yes";
  preset7['preview'] = "";
  preset7['src'] = "./playlists/xspf_error_playlist.xspf";
  preset7['binary'] = "WebPlayer";
  
  var preset8 = new Object();
  preset8['name'] = "WebPlayer Error URL XSPF";
  preset8['size'] = "w=240 h=64";
  preset8['autostart'] = "yes";
  preset8['random'] = "no";
  preset8['loop'] = "no";
  preset8['preview'] = "";
  preset8['src'] = "./playlists/xspf_missing_songs_playlist.xspf";
  preset8['binary'] = "WebPlayer";
  
  var preset9 = new Object();
  preset9['name'] = "CaCo3 Test";
  preset9['size'] = "w=800 h=400";
  preset9['autostart'] = "no";
  preset9['random'] = "no";
  preset9['loop'] = "no";
  preset9['preview'] = "";
  preset9['src'] = "";
  preset9['binary'] = "Caco3-Test";
  
  addPreset(preset1['name'], preset1);
  addPreset(preset2['name'], preset2);
  addPreset(preset3['name'], preset3);
  addPreset(preset4['name'], preset4);
  addPreset(preset5['name'], preset5);
  addPreset(preset6['name'], preset6);
  addPreset(preset7['name'], preset7);
  addPreset(preset8['name'], preset8);
  addPreset(preset9['name'], preset9);
}

/******************************************************************************/
function setDivSizes( iPlayerHeight )
{
  var iMenuWidth = 220;
  var iScrollBarWidth = 0;
  var iContentWidth = getWindowWidth() - (iMenuWidth + iScrollBarWidth);
  var iMainHeight = getWindowHeight();
  var iLeftPadding = 10;
  var iTopPadding = 10;
  
  document.getElementById("main").style.width = (getWindowWidth()) - iLeftPadding + "px";
  document.getElementById("player").style.width = iContentWidth - iLeftPadding + "px";
  document.getElementById("trace").style.width = iContentWidth - iLeftPadding + "px";
    
  // document.getElementById("menu").style.height = iMainHeight + "px";
  document.getElementById("player").style.height = iPlayerHeight + "px";
  
  var iTraceHeight = iMainHeight - iPlayerHeight;
  if( iTraceHeight > 40)
  {
    document.getElementById("trace").style.height = iTraceHeight - iTopPadding + "px";
    document.getElementById("trace_control").style.height = 20 + "px";
    document.getElementById("trace_output").style.height = (iTraceHeight - 20) - iTopPadding + "px";
    
    document.getElementById("trace").style.visibility = "visible";
    document.getElementById("trace_control").style.visibility = "visible";
    document.getElementById("trace_output").style.visibility = "visible";
  }
  else
  {
    document.getElementById("trace").style.height = "0px";
    document.getElementById("trace_control").style.height = "0px";
    document.getElementById("trace_output").style.height = "0px";
    
    document.getElementById("trace").style.visibility = "hidden";
    document.getElementById("trace_control").style.visibility = "hidden";
    document.getElementById("trace_output").style.visibility = "hidden";
  }
}

/******************************************************************************/
var aPresets = new Object();
function addPreset( sName, data )
{
  if( aPresets[sName] != null )
  {
    alert("Name of preset used twice: " + sName);
    return;
  }
  // store data
  aPresets[sName] = data;
  
  // add selection
  var presetSelection = document.getElementById("presets");
  var newPreset = new Option(sName, sName, false, false);
  presetSelection.options[presetSelection.length] = newPreset;
}

/******************************************************************************/
function presetSelected()
{
  var presetSelection = document.getElementById("presets");
  if( presetSelection.selectedIndex != -1 )
  {
    var selectedPreset = presetSelection[presetSelection.selectedIndex];
    if( selectedPreset.defaultSelected != true )
    {
      var selectedData = aPresets[selectedPreset.value];
      if( selectedData == null )
      {
        return;
      }

      setPlaylist(selectedData['src']);
      setPreview( selectedData['preview']);
      setSize(    selectedData['size']);
      setIsAutostart( (selectedData['autostart'] == "yes") ? true : false );
      setIsRandom(    (selectedData['random'] == "yes") ? true : false );
      setIsLoop(      (selectedData['loop'] == "yes") ? true : false );
      setBinary(  selectedData['binary']);
    } // if( selectedPreset.defaultSelected != true )
  } // if( presetSelection.selectedIndex != -1 )
}

/******************************************************************************/
function resize()
{
  setDivSizes( readPlayerHeight() );
}
  
window.onresize=resize;
var wp = null;

/******************************************************************************/
function createPlayer()
{      
  // Read settings
  var iSelected   = document.getElementById("binary").selectedIndex;
  var selectedObj = document.getElementById("binary").options[iSelected];
   
  var sBinarySrc  = selectedObj.value;
  var iHeight     = readPlayerHeight();
  var iWidth      = readPlayerWidth();
  
  var sSrc        = document.getElementById("inputSrc").value;  //src
  
  var sAutoStart  = ""; //autostart
  if( document.getElementById("isAutostart").checked )
  { sAutoStart    = "yes"; }
  else
  { sAutoStart    = "no"; }
  
  var sLoop       = ""; //loop
  if( document.getElementById("isLoop").checked )
  { sLoop         = "yes"; }
  else
  { sLoop         = "no"; }
  
  var sRandom     = ""; //random
  if( document.getElementById("isRandom").checked )
  { sRandom       = "yes"; }
  else
  { sRandom       = "no"; }
  
  var sPreviewPath = document.getElementById("previewSrc").value; //preview
  
  var sDebug  = "functionCall"; //debug
  var sRemoteCtrl = "yes"; //remote
  
  // WebPlayer einbinden
  wp = new org.webminster.Vanadium(sBinarySrc, sSrc, iWidth, iHeight, sAutoStart, sLoop, sRandom, sPreviewPath, sRemoteCtrl, sDebug);
  wp.write("player");
 
  // Versionscheck nach zwei Sekundes, da Flashmovie sonst noch nicht verfügbar
  window.setTimeout("checkVersion()", 3000);
}

/******************************************************************************/
function checkVersion()
{	
  // Version auslesen
  var sFlashVersion = wp._getPlayerVar("version");
  var flashVersion = document.getElementById('flashVersion');
  flashVersion.innerHTML = "v" + sFlashVersion;
  
  if( sFlashVersion != org.webminster.Vanadium.prototype.LibVersion )
  {
    flashVersion.className = "wrong_version";
    flashVersion.title     = "Version of flash binary does not match version of libvanadium.js!";
  }
  else
  {
  	flashVersion.className = "correct_version";
  }
}

/******************************************************************************/
function readPlayerHeight()
{
  var sSize = document.getElementById("playerSize").value;
  var iHeight = readVar(sSize, "h");
  if( iHeight == "" || isNaN(iHeight) )
  {
    iHeight = 100;
  }
  
  return iHeight;
}

/******************************************************************************/
function readPlayerWidth()
{
  var sSize = document.getElementById("playerSize").value;
  var iWidth = readVar(sSize, "w");
  if( iWidth == "" || isNaN(iWidth) )
  {
    iWidth = 400;
  }
  
  return iWidth;
}

/******************************************************************************/
function readVar( sString, sVarName )
{
  /** Suche Variable sVarName, die von '=' gefolgt wird, dass wiederum von
    * einer Zahl gefolgt wird. Die Zahl darf von Leerzeichen, Tags etc. (\\b)
    * umgeben sein.
    **/
  var searchExp = new RegExp(sVarName + '=\\b(\\d*)\\b', 'g');
  var result = searchExp.exec(sString);
  
  if( null != result && result.length == 2 )
  {
    return result[1];
  }
  
  return "";
}

/******************************************************************************/
function clearAll( bClearTrace )
{
  var mainFrame = document.getElementById("player");  
  while(mainFrame.hasChildNodes())
  {
    var child   = mainFrame.firstChild;
    mainFrame.removeChild(child);
  }
  
  if( bClearTrace )
  {
    clearTrace();
  }
}

/******************************************************************************/
function doGo()
{  
  resize();
  clearAll( /* bClearTrace = */ true );
  createPlayer();
}

/******************************************************************************/
function doStop()
{
  // Clear content
  clearAll( /* bClearTrace = */ false );
}

/******************************************************************************/
function setPlaylist(sPlaylistPath)
{
  if( sPlaylistPath == null )
  {
    sPlaylistPath = "";
  }
  document.getElementById("inputSrc").value = sPlaylistPath;
}

/******************************************************************************/
function setPreview(sPreviewPath)
{
  if( sPreviewPath == null )
  {
    sPreviewPath = "";
  }
  document.getElementById("previewSrc").value = sPreviewPath;
}

/******************************************************************************/
function setSize(sSize)
{
  if( sSize == null )
  {
    sSize = "";
  }
  document.getElementById("playerSize").value = sSize;
}

/******************************************************************************/
function setIsAutostart(bAutostart)
{
  document.getElementById("isAutostart").checked = bAutostart;
}

/******************************************************************************/
function setIsRandom(bRandom)
{
  document.getElementById("isRandom").checked = bRandom;
}

/******************************************************************************/
function setIsLoop(bLoop)
{
  document.getElementById("isLoop").checked = bLoop;
}

/******************************************************************************/
function setBinary( sBinaryName )
{
  var binarySelection = document.getElementById("binary");
  var iNOfBinaries = binarySelection.options.length;
  for( var i = 0; i < iNOfBinaries; ++i)
  {
    var curBinary = binarySelection.options[i];
    if( curBinary.text == sBinaryName )
    {
      curBinary.selected = true;
    }
  } // for( var i = 0; i < iNOfBinaries; ++i)
}

/******************************************************************************/
var iTracedLines = 0;

function debug( 
  sTraceText, sMethodName, sFileName, iLineOfFile )
{
  createTraceOutput(
    sTraceText, sMethodName, sFileName, iLineOfFile, "debug");
}

/******************************************************************************/
function info( 
  sTraceText, sMethodName, sFileName, iLineOfFile )
{
  createTraceOutput(
    sTraceText, sMethodName, sFileName, iLineOfFile, "info");
}

/******************************************************************************/
function warning( 
  sTraceText, sMethodName, sFileName, iLineOfFile )
{
  createTraceOutput(
    sTraceText, sMethodName, sFileName, iLineOfFile, "warning");
}

/******************************************************************************/
function error( 
  sTraceText, sMethodName, sFileName, iLineOfFile )
{
  createTraceOutput(
    sTraceText, sMethodName, sFileName, iLineOfFile, "error");
}

/******************************************************************************/
function step( 
  sTraceText, sMethodName, sFileName, iLineOfFile )
{
  createTraceOutput(
    sTraceText, sMethodName, sFileName, iLineOfFile, "step");
}

/******************************************************************************/
function createTraceOutput(
  sTraceText, sMethodName, sFileName, iLineOfFile, sTraceClass)
{
  iTracedLines++;
  
  var table       = document.createElement("table");
  var row         = document.createElement("tr");
  
  var colBox      = document.createElement("td");	// coloured box
  var colText     = document.createElement("td");	// text output

	var indexSpan   = document.createElement("span");
	var messageSpan = document.createElement("span");
  var detailsSpan = document.createElement("span");
  
  var tableClass  = document.createAttribute("class");
  tableClass.nodeValue = getTableTraceClass(sTraceClass);  
  table.setAttributeNode(tableClass);
  
  var colBoxClass = document.createAttribute("class");
  colBoxClass.nodeValue = sTraceClass;
  colBox.setAttributeNode(colBoxClass);
  
  var colTextClass    = document.createAttribute("class");
  colTextClass.nodeValue = "text";  
  colText.setAttributeNode(colTextClass);
  
  var indexSpanClass = document.createAttribute("class");
  indexSpanClass.nodeValue = getTableTraceClass("details");
  indexSpan.setAttributeNode(indexSpanClass);
  
  var detailsSpanClass = document.createAttribute("class");
  detailsSpanClass.nodeValue = getTableTraceClass("details");
  detailsSpan.setAttributeNode(detailsSpanClass);
  
  if( iLineOfFile < 1 )
  { iLineOfFile = "?"; }
  
  var sIndexText 	     = "" + iTracedLines + ": ";
  var indexTextHtml    = document.createTextNode(sIndexText);
  
  var sMessageText     = "\"" + sTraceText + "\"";
  var messageTextHtml  = document.createTextNode(sMessageText);
  
	var sDetailsText     = " in " + sMethodName + "() l." + iLineOfFile;
  var detailsTextHtml  = document.createTextNode(sDetailsText);
  
  var traceDiv = document.getElementById("trace_output");
  traceDiv.appendChild(table);
  table.appendChild(row);
  row.appendChild(colBox);
  row.appendChild(colText);
  colText.appendChild(indexSpan);
  colText.appendChild(messageSpan);
  colText.appendChild(detailsSpan);
  
  indexSpan.appendChild(indexTextHtml);
  messageSpan.appendChild(messageTextHtml);
  detailsSpan.appendChild(detailsTextHtml);
  
  window.scrollTo(100, 100);
}

/******************************************************************************/
function clearTrace()
{
  iTracedLines = 0;
  var traceDiv = document.getElementById("trace_output");
  
  while( traceDiv.hasChildNodes() )
  {
    var firstChild = traceDiv.firstChild;
    traceDiv.removeChild(firstChild);
  }
}

/******************************************************************************/
function getTableTraceClass(sTraceClass)
{
  if( !sTraceClass )
  {
    return "info";
  }
  
  var sBase = sTraceClass.split("_")[0];
  var sSwitch = document.getElementById(sBase+"Switch");
  if(sSwitch.checked == true)
  {
    return sBase;
  }
  else
  {
    return sBase + "_hidden";
  }
}

/******************************************************************************/
function resetErrorOutputVisibility()
{
  var traceOutput = document.getElementById("trace_output");
  var traceEntries = traceOutput.childNodes;
  for( var i = 0; i < traceEntries.length; ++i)
  {
    var curTable = traceEntries[i]; // table
    curTable.className = getTableTraceClass(curTable.className);
    
    var curRow = curTable.childNodes[0];    
    var curTextCol = curRow.childNodes[1];
    var curIndexSpan = curTextCol.childNodes[0];
    var curDetailsSpan = curTextCol.childNodes[2];
    
    curIndexSpan.className = getTableTraceClass(curIndexSpan.className);
    curDetailsSpan.className = getTableTraceClass(curDetailsSpan.className);
  } // for( var i = 0; i < ChildNodes.length; ++i)
}

/******************************************************************************/
function testRemote()
{
  // Hier ließe sich einfach ein Testskript erstellen, der Editorfunktionalität
  // testet.
  
  doGo();
 
  wp.incVolume(100);  // set to max
  window.setTimeout("doVolumeTest(100, -1)", 10000);
  window.setTimeout("doVolumeTest(100, 1)", 18000);
  window.setTimeout("doVolumeTest(20, -5)", 26000);
  window.setTimeout("doVolumeTest(20, 5)", 29000);
  
  //window.document.myPlayer.SetVariable("jsMethod", "pause");
}

// Test1
function doVolumeTest(iSteps, iStepAmount)
{  
  for( var i = 0; i < iSteps; i++ )
  {
    if( iStepAmount > 0 )
    {
      wp.incVolume(iStepAmount);
    }
    else
    {
      wp.decVolume(-iStepAmount);
    }
  } // for( var i = 0; i < iSteps; i++ )
}

/******************************************************************************/
function openInWindow(sInputID)
{
  var input = document.getElementById(sInputID);
  if( input == null || input == undefined )
  { return; }
  
  var sValue = input.value;
  if( sValue == null || sValue == undefined || sValue == "" )
  { return; }
  
  window.open(sValue, "_blank");
}

/******************************************************************************/
var iCounter = 0;
function test(iEventType)
{
	iCounter++;	
	if( iCounter % 5 == 0 )
	{
		wp.deregisterEventHandler();
	}
  //alert(iCounter + ".: " + iEventType);
}
