/* ================================================================================

   RADIO DRS - WEBPLAYER

   ----------------------------------------------------------------------
   2007-09-xx  hahnax  init
   2009-09-14  hahnax  Ausgabe der Plugin-Infos zusammengefasst
   2009-11-14  hahnax  Neue Streams integriert + zahlreiche Bugfixes
   2010-03-nn  hahnax  Flashplayer integriert; AoD in Flash-Stream wandeln
   hahnax: Axel Hahn (webmaster@srdrs.ch)
   ================================================================================
*/

// ================================================================================
// CONFIG
// ================================================================================


// ----------------------------------------------------------------------
// ... Player-Konfiguration
//
// Es wird ein Array aus den gefundenen Player-Objekten erstellt.
// Mit Hilfe der Variable sCanplay wird sp�ter festgestellt,
// welches Plugin f�r das per URL �bergebene Medium verwendet
// werden soll.
// allPlayer contains all supported plugins
// ----------------------------------------------------------------------

var allPlayer = {
        /*
	[id] :{
            Name:           Name des Plugins (kurz)
            Fullname:       Name des Plugins (lang)
            sPlayer:        Kürzel zum Ansprechen der Player-Funktionen
            sCanplay:       regex zum Definieren: was darf dieses Plugin abspielen
            bShowVolumebar: Laustaerke anzeigen? Auf 0 setzen, wenn Lautstaerke readonly ist
            sources:        URL zum Installieren des Plugins
        },
        */

        /*
	flash :{
            Name:           'flash',
            Fullname:       'Flashplayer Plugin',
            sPlayer:        'sm2', // SoundManager 2
            sCanplay:       /(^http.*(\/mp3_128|\.mp3)$)/i,
            bShowVolumebar: 1,
            sources:        '<a href="#" OnClick="OpenLink(\'get.adobe.com/flashplayer/\');">Adobe Flash Player</a>'
        },
        */
	flash :{
            Name:           'flash',
            Fullname:       'Flashplayer Plugin [JW Player]',
            sPlayer:        'jw5',
            sCanplay:       /(^http.*(\/mp3_128|\.mp3)$|^rtmp:\/\/.*)/i,
            bShowVolumebar: 1,
            sources:        '<a href="#" OnClick="OpenLink(\'http://get.adobe.com/flashplayer/\');">Adobe Flash Player</a>',

            /* -- special vars for flash player
                  supported streaming applications; 
                  Matching irgendwo in AudioUrl
                  Name des Index ist egal - dient rein zur Doku/ Unterscheidung
             */
            aStreamsLive:  {
                wowzateststream: 'rtmp://82.197.188.200/shoutcast/',
                init7streams: 'streaming.init7.net:1935/shoutcast/'
            }

        },
        html5 : {
            Name:           'html5',
            Fullname:       'HTML5 - Audio',
            sPlayer:        'html5',
            sShouldCanplay:       /(^http.*(\/mp3_128|\.mp3|\.m3u)$|^rtmp:\/\/.*)/i,
            sCanplay:       /^pruefungwoanders$/i,
            bShowVolumebar: 1,
            sources:        '<a href="#" onclick="OpenLink(\'http://www.mozilla-europe.org/en/\');">Mozilla Firefox Browser ab v3.5</a> oder'
                           +'<a href="#" onclick="OpenLink(\'http://www.google.com/chrome/\');">Google Chrome Browser</a>'
        },
	real :{
            Name:           'real',
            Fullname:       'RealPlayer Plugin',
            sPlayer:        'real',
            sCanplay:       /(^http.*(\/mp3_128\.m3u|\/kinderradio\.m3u|\/pirando\.m3u|\/mp3_128\.ram|\/aacp_32.m3u|\/aacp_32.ram|\.mp3|\.ra|\.ram|\.rm|\.smi|\.smil|\.wav)$|^rtsp.*(aacp_32\.sdp|\.mp3$|\.ra$|\.rm$|\.smi$|\.smil$|\.wav$))/i,
            bShowVolumebar: 1,
            sources:        '<a href="#" OnClick="OpenLink(\'http://germany.real.com/player/select/\');">Realplayer</a> | <a href="#" OnClick="OpenLink(\'https://player.helixcommunity.org/2005/downloads/\');">Helix Player</a> | <a href="#" OnClick="OpenLink(\'http://www.codecguide.com/download_real.htm\');">RealplayerAlternative</a>'
        },
	wm :{
            Name:           'wm',
            Fullname:       'Windows Mediaplayer',
            sPlayer:        'wm',
            sCanplay:       /^http.*(\/mp3_128|\/mp3_128\.m3u|\/mp3_128\.asx|\/mp3_128\.ram|\/kinderradio\.m3u|\/pirando\.m3u|\.asx|\.mp3|\.wav|\.wma|\.wmp)$/i,
            bShowVolumebar: 1,
            sources:        '<a href="#" OnClick="OpenLink(\'http://www.microsoft.com/windows/windowsmedia/\');">microsoft.com</a>'
        },
	vlc :{
            Name:           'vlc',
            Fullname:       'VideoLanClient VLC Plugin ',
            sPlayer:        'vlc',
            sCanplay:       /(^http.*(\/mp3_128|\/aacp_64|\/kinderradio\.m3u|\/pirando\.m3u|\.mp3|\.rm|\.wav)$|^rtsp.*(_aacp_32.sdp|\.mp3|\.ra|\.ram|\.rm|\.wav)$)/i,
            bShowVolumebar: 0,
            sources:        '<a href="#" OnClick="OpenLink(\'http://www.videolan.org/\');">www.videolan.org/</a>'
        },
	qt :{
            Name:           'qt',
            Fullname:       'Apple Quicktime Player',
            sPlayer:        'qt',
            sCanplay:       /^http.*(\/kinderradio\.m3u|\/pirando\.m3u|\.mid|\.mp3|\.wav)$/i,
            bShowVolumebar: 1,
            sources:        '<a href="#" OnClick="OpenLink(\'http://www.apple.com/quicktime/\');">Apple Quicktime</a> | <a href="#" OnClick="OpenLink(\'http://www.codecguide.com/download_qt.htm\');">Quicktime Alternative</a>'
        }

}
  s="vlc";
  // VLC-active-X abfangen
  if (detectVLCX()) {
    allPlayer[s]["Fullname"]         = "VideoLanClient VLC Active-X (Datei)";
    allPlayer[s]["sPlayer"]="vlcx";
    allPlayer[s]["bShowVolumebar"]   = 1;
  } 


// Ende der CONFIG .. es folgen sonstige verwendete Variablen

// Array mit Regex der erlaubten Mediafile-Urls
// erstes Element /(.)/ erlaubt alles.
/*
var aAllowUrl = new Array(
  /(.)/,
  /(^\.|^\/)/,
  /^http:\/\/([a-z]*.\.){1,}drs\.ch\//,
  /^http:\/\/([a-z]*.\.){1,}virus\.ch\//,
  /^http:\/\/virus\.ch\//,
  /^http:\/\/asx\.skypro\.ch\//,
  /^http:\/\/live-one\.dmd2\.ch\//
);
*/

// Akamai-CP Codes von SR DRS
var sGeoCP=111067;
var aCP=new Array(sGeoCP, 23910);

var iVolume=80; // Lautstaerke-Default
var bReloadPage=false;
var bIsKinderradio=false;
var iWindowHeight;

var bStream=0;
var bRegi=0;
var sForcedPlayer='';

var oPopup;
var sPlayerContent=""; // HTML-Content des Player-Divs
var sPlayerDiv="player"; // in diesem DIV wird der Player eingef�gt


var bShowDebug=0; // Debug-Infos anzeigen
    // bShowDebug=(getQueryVariable("bShowDebug")=="true");
var sUrl;
var iIdSG=0; //ID des Sendegefaesses
var iIdSH=0; //ID des Sendehinweises

var oProgress; // Objekt f�r Intervall der Progressbar
var oStatus;   // Objekt f�r Intervall der Pluginstatus

var iPlayer=-1; // ID des aktiven Players
var iSliderVol; // Nummer des Lautst�rke-Sliders
var iSliderProgress; // Nummer des Fortschritt-Sliders
var iIntervalProgress=500;
var iIntervalStatus=200;

var bWasPlaying=false;
var sPlayStatus='';

var sPlayerType='';
var sPlayerSkin='';
var oPlayer; // Player-Objekt zum Ansteuern des Plugins

// ================================================================================
// Plugin detection
// aPlayer contains all plugins in the local browser
// ================================================================================
var aPlayer = new Array();
var i=-1;

// default-Werte: wenn kein Player gefunden werden kann, alles abschalten
  i++;
  aPlayer[i]=new Object();
  aPlayer[i]["Name"]             = "-none-";
  aPlayer[i]["sPlayer"]          = "-none-";
  aPlayer[i]["Fullname"]         = "-none-";
  aPlayer[i]["sCanplay"]         = /(\.typesomethingherethatreallydoesnotexist$)/;
  aPlayer[i]["bShowVolumebar"]   = 0;

if (detectFlashplayer()) {
  i++;aPlayer[i]=new Object();aPlayer[i]=allPlayer["flash"];
}

if (detectRealplayer()) {
  i++;aPlayer[i]=new Object();aPlayer[i]=allPlayer["real"];
}

if (detectWindowsmedia() && IsMSIE() ) { // Player-Elemente lassen sich nur im IE mit JS ansteuern
  i++;aPlayer[i]=new Object();aPlayer[i]=allPlayer["wm"];
}

if (detectVLC() || detectVLCX() ) {
  i++;aPlayer[i]=new Object();aPlayer[i]=allPlayer["vlc"];
}

if (!IsOpera()) {
  if (detectQuicktime()) {
    i++;aPlayer[i]=new Object();aPlayer[i]=allPlayer["qt"];
  }
  if (detectHTML5Player()) {
    i++; aPlayer[i]=new Object();aPlayer[i]=allPlayer['html5'];
  }
}


// ================================================================================
// FUNKTIONEN
// ================================================================================


/**
 * ermittelt aus einer rtsp AoD Adresse das Pendant zur Auslieferung mit rtmp
 *
 * Beispiel:
 *   Uebergabe
 *     sUrl=aistream.net/ondemand/7/1232/23910/4c07dd56/audio.drs.ch/drs1/echoderzeit/2010/06/100603_echo_3_eicher.MP3
 *   Rueckgabe:
 *     url=rtmp://cp23910.edgefcs.net/ondemand/mpc/drs1/echoderzeit/2010/06/100603_echo_3_eicher.mp3
 *     fStreamer=rtmp://cp23910.edgefcs.net/ondemand/
 *
 * @param   sUrl  {string}  Audioadresse mit rtsp://...
 * @return  Array mit url und fstreamer-Parameter fuer jw player oder aber false
 * @type    array
 */
function getRtmpFromRtsp(sUrl){

	var sRetUrl=sUrl;
	var sRetStreamer=false;
	
	// Syntax der rtmp-Streams - $1 ist CP-Code
	var sRtmpUrl='rtmp://cp\$1.edgefcs.net/ondemand/mpc';
	// fstreamer ist erster Teil Teil "rtmp://(...)ondemand/"
	var rGetStreamer=new RegExp('(^rtmp.*/ondemand/)mpc/.*$','i');

	// test-Regex zusammenbauen; aCP ist globales Array der CP Codes
	var r='';
	for (var i = 0; i < aCP.length; ++i){
		r+=aCP[i]; if (i < aCP.length-1) r+="|";
	}
	r='('+r+')';
	var rTest=new RegExp('^rtsp.*.v'+r+'e.c'+r+'.g.vr.akamaistream.net.ondemand.*mp3','i'); 

	// Wenn es ein DRS AoD mit gueltigem CP Code ist, dann rtmp ermitteln
	// und MP3 in Kleinschreibung wandeln
	if (rTest.test(sUrl)) {
		var rReplace=new RegExp('^rtsp.*.v'+r+'e.*audio.drs.ch','i'); 
		sRetUrl=sUrl.replace(rReplace, sRtmpUrl).replace(/\.MP3$/, ".mp3");
	}

	// fstreamer fuer jwplayer ermitteln
	sRetStreamer=sRetUrl.replace(rGetStreamer, "$1");
	if (!sRetStreamer) return false;

	return {
		url: sRetUrl,
		fStreamer: sRetStreamer
	}
}


/**
 * MOD-117
 * Fuegt eine Meldung zu Geolocated Audio hinzu
 */
function addGeoMessage(sUrl){
	var sMsg='Diese Sendung ist aus urheberrechtlichen Gr&uuml;nden nur in der Schweiz zum Nachh&ouml;ren verf&uuml;gbar.';

	if (sUrl.indexOf(sGeoCP)<0) return false;
	oDiv=document.getElementById("infoszursendung");
	if (oDiv) oDiv.innerHTML='<p style="margin:0 0 4px; padding: 0 4px;">'+sMsg+'</p>'+oDiv.innerHTML;
	return true;
}

/**
 * Browser-Test
 * @return liegt ein MSIE groesser 5.5 vor?
 * @type boolean
 */
function IsMSIE() {
  var version=0;
  if (navigator.appVersion.indexOf("MSIE")!=-1){
    var temp=navigator.appVersion.split("MSIE");
    version=parseFloat(temp[1]);
  }
  return version>=5.5; //NON IE browser will return 0
}

/**
 * Browser-Test
 * @return liegt ein Opera vor?
 * @type boolean
 */
function IsOpera() {
  return navigator.appName.indexOf("Opera")>=0;
}

/**
 * Browser-Test
 * @return liegt ein Safri Browser auf Mac OS vor?
 * @type boolean
 */
function isSafariOnMac() {
  return (
    navigator.userAgent.indexOf("Macintosh")>=0
    && navigator.userAgent.indexOf("AppleWebKit")>=0
    && navigator.userAgent.indexOf("Safari")>=0
  );
}
/**
 * function getQueryVariable
 * gibt den Wert einer URL-Variable zurueck
 * @param  {string} myvariable  Name der gesuchten Variable
 * @return Wert der URL-Variable oder false
 * @type   string/ boolean/ int
 */
function getQueryVariable(myvariable, defaultvalue) {
  var query = window.location.search.substring(1);
  var vars = query.split("&");
  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
    if (pair[0] == myvariable) {
      return decodeURIComponent(pair[1]);
    }
  }
  return defaultvalue;
}

/**
 * ShowError(msg)
 * Anzeige einer Fehlermeldung mit vorangestelltem Datum
 * Diese Funktion wird aufgerufen von div. Player-Onclick-Funktionen
 * @param msg  {String}  Fehlertext
 * @return true
 */
function ShowError(msg)
{
  var jetzt = new Date();
  var iH = jetzt.getHours();
  var iM = jetzt.getMinutes();
  var iS = jetzt.getSeconds();

  document.getElementById("playerError").innerHTML=iH+':'+iM+':'+iS+' - ' + msg;
  document.getElementById("playerError").style.display = 'block';
  // window.setTimeout("document.getElementById(\"playerError\").style.display = 'none';", 5000);
  return true
}

/**
 * Javascript Errorhandler
 * Die Fehlermeldung wird samt Fehlerquelle (Datei und Zeile) als Fehlermeldung angezeigt.
 * @param msg  {String}  Fehlermeldung
 * @param url  {String}  Adresse des Skripts, das den Fehler enthaelt
 * @param l    {Int}     Zeilennummer, wo Fehler auftrat
 */
function handleErr(msg,url,l)
{
  var dummy=ShowError('Javascript-Fehler:<br><strong>'+ msg + '</strong><br>Quelle: <em>' + url + ':' + l + '</em>');
  msg=null;
  return true;
}

/**
 * Hilfsfunktion: Player-Puffer erweitern
 * @see w_flush()
 * @param sText  {String} hinzuzufuegender Text
 * @return true
 */
function w(sText){
  // document.write(sText);
  sPlayerContent+=sText;
  return true;
}

/**
 * Hilfsfunktion: Player-Puffer anzeigen und Puffervariable leeren
 * @see w()
 */
function w_flush(){
  document.getElementById(sPlayerDiv).innerHTML=sPlayerContent;
  sPlayerContent='';
  return true;
}

// ----------------------------------------------------------------------
// Logging-Functions
// Das Log wird im Div mit der ID "divLogger" fortwährend geschrieben
// ----------------------------------------------------------------------

/**
 * initLogs() - Logs initialisieren
 * @see add2Log()
 */
function initLogs(){
    aLogs=new Array();
    document.getElementById("divLogger").innerHTML='';
    add2Log('Info','<b>Browser</b>: ' + navigator.userAgent);
    add2Log('Info','<b>Plattform</b>: ' + navigator.platform + '; Sprache: ' + navigator.language);
}

/**
 * Einen Log-Eintrag hinzufuegen; das aktuelle Datum wird aut. angefuegt.
 * Das Loglevel ist Teil der CSS-Klasse, womit eine enstpr. farbliche
 * Hervorhebung des Eintrags erfolgt. Man könnte so auch eine Filterfunktion
 * realisieren.
 * @param sLevel  {String}  Loglevel (eines aus Info, Warnung, Fehler, Debug)
 * @param sMsg    {String}  Nachrichtentext
 */
function add2Log(slevel,sMsg){
    if (document.getElementById("divLogger")) {
      document.getElementById("divLogger").innerHTML+='<div class="loglevel'+slevel+'">'
            +'<span class="logdate">' + getDateAndTime() + '</span>'
            +'<span class="loglevel">' + slevel + '</span>'
            +'<span class="logmsg">- ' + sMsg + '</span>\n';
    } else {
      // alert("DIV divLogger nicht gefunden. Mitteilung: "+sMsg);
    }
}
/**
  * Hilfsfunktion:
  * @return aktuelles Datum und Uhrzeit generieren
  * @type string
*/
function getDateAndTime(){
	var sReturn
	var Jetzt = new Date();
	var Tag = Jetzt.getDate();var Monat = Jetzt.getMonth() + 1;var Jahr = Jetzt.getYear();var Stunden = Jetzt.getHours();var Minuten = Jetzt.getMinutes();var Sekunden = Jetzt.getSeconds();
	Tag=(Tag<10) ? '0' + Tag : Tag;
	Monat=(Monat<10) ? '0' + Monat : Monat;
	if (Jahr<1900) Jahr+=1900;

	Stunden=(Stunden<10) ? '0' + Stunden : Stunden;
	Minuten=(Minuten<10) ? '0' + Minuten : Minuten;
	Sekunden=(Sekunden<10) ? '0' + Sekunden : Sekunden;
	sReturn=Tag+'.'+Monat+'.'+Jahr+' '+Stunden+':'+Minuten+':'+Sekunden;

	return sReturn;
}

// ----------------------------------------------------------------------
// Plugin detection
// ----------------------------------------------------------------------
/**
 * Plugin-Erkennung mit Navigator-Objekt (Gecko, Opera, Webkit)
 * Suche nach einem installierten Browser-Plugin
 * Parameter ist eine Liste von Strings.
 * Der Rückgabewert ist true, wenn eines der Argumente in der Liste der
 * Plugins (im Pluginnamen oder in der Pluginbeschreibung) als Teilstring
 * gefunden wird.
 * @return Wurde einer der Strings in der Pluginliste gefunden?
 * @type boolean
 */
function detectPlugin() {
  var daPlugins = detectPlugin.arguments;
  var pluginFound = false;
  if (navigator.plugins && navigator.plugins.length > 0) {
	  var pluginsArrayLength = navigator.plugins.length;
	  for (pluginsArrayCounter=0; pluginsArrayCounter < pluginsArrayLength; pluginsArrayCounter++ ) {
	    var numFound = 0;
	    for(namesCounter=0; namesCounter < daPlugins.length; namesCounter++) {
	  	if( (navigator.plugins[pluginsArrayCounter].name.indexOf(daPlugins[namesCounter]) >= 0) || 
		    (navigator.plugins[pluginsArrayCounter].description.indexOf(daPlugins[namesCounter]) >= 0) ) {
		      numFound++;
		    }   
	    }
	    if(numFound == daPlugins.length) {
		    pluginFound = true;
		    break;
	    }
	  }
  }
  return pluginFound;
} // detectPlugin


// ----------------------------------------------------------------------
// Plugin detection
// Erkennung mit Active-X
// ----------------------------------------------------------------------
/**
 * Plugin-Erkennung mit Active-X (Internet Explorer)
 * Suche nach einem installierten Browser-Plugin
 * Parameter ist eine Liste von Strings.
 * Der Rückgabewert ist true, wenn eines der Argumente ein gueltiges
 * Active-X Objekt ist. Der Parameter muss also ein kompletter Pluginname
 * sein; ein Teilstring in der Pluginliste kann nicht gefunden werden.
 * @return Wurde einer der Strings ein gültiges Active-X?
 * @type boolean
 */
function detectActiveX() {
  var daPlugins = detectActiveX.arguments;
  var pluginFound=false;
  var oPluginTest;
  for(namesCounter=0; namesCounter < daPlugins.length; namesCounter++) {
    try {
      oPluginTest=new ActiveXObject(daPlugins[namesCounter]);
      if (oPluginTest) pluginFound=true;
    }
    catch (e) {
      e=null;
    }
    finally {
      oPluginTest=null;
    } 
  } // for
  return pluginFound
}

function detectHTML5Player() {
  // Opera kennt das Audio-Objekt aber nicht das AudioElement --> uncool.
  if(typeof(HTMLAudioElement) == 'undefined' || typeof(Audio)=='undefined') return false;

  var as = [];
  var o = new Audio("");
  if('function'!=typeof(o.canPlayType)) return false;

  if(o.canPlayType("audio/mpeg")) as.push("^http.*\\.mp3$|^http.*mp3\\_128\\.m3u$");
  if(o.canPlayType("audio/aac"))  as.push("^http.*aacp\\_64\\.m3u$");

  if(as.length < 1) return false;

  // Player Faehigekeiten im canplay-Attribut nachtragen...
  allPlayer['html5'].sCanplay = new RegExp("("+ as.join("|") + ")", "i");
  return true;
}

function detectIphoneBelow32(sUrl) {
  if(!navigator.userAgent) return;
  var s= navigator.userAgent;
  if(!s.match(/CPU iPhone OS (3_0|3_1|2_)/)) return;

  if(confirm('Ihr iPhone kann leider keine Audios direkt im Browser ausgeben. Soll dieses Audio in Quicktime abgespielt werden?')) document.location.href = sUrl;
}

/**
 * Plugin-Test im Webbrowser
 * @return ist ein Flashplayer installiert?
 * @type boolean
 */
function detectFlashplayer() {
  return detectPlugin('Shockwave Flash') ||
    detectActiveX('ShockwaveFlash.ShockwaveFlash');
}
/**
 * Plugin-Test im Webbrowser
 * @return ist ein Real-Plugin installiert?
 * @type boolean
 */
function detectRealplayer() {
  return detectPlugin('RealPlayer') ||
    detectActiveX('rmocx.RealPlayer G2 Control.1', 'rmocx.RealPlayer G2 Control', 'RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)', 'RealVideo.RealVideo(tm) ActiveX Control (32-bit)');
}

/**
 * Plugin-Test im Webbrowser
 * @return ist ein WindowsMedia-Plugin installiert?
 * @type boolean
 */
function detectWindowsmedia() {
  return detectPlugin('Windows Media Player') ||
    detectActiveX('MediaPlayer.MediaPlayer.1');
}

/**
 * Plugin-Test im Webbrowser
 * @return ist ein Quicktime-Plugin installiert?
 * @type boolean
 */
function detectQuicktime() {
  return detectPlugin('QuickTime Plug-in') ||
    detectActiveX('QuickTimeCheckObject.QuickTimeCheck.1');
}

/**
 * Plugin-Test im Webbrowser
 * @return ist ein VLC-Plugin installiert?
 * @type boolean
 */
function detectVLC() {
  return detectPlugin('VLC Multimedia Plugin') ||
    detectPlugin('VLC multimedia plugin') ||
    detectPlugin('VLC Multimedia Plug-in')
    ;
}
/**
 * Plugin-Test im Webbrowser
 * @return ist ein VLC-Active-X installiert?
 * @type boolean
 */
function detectVLCX() {
  return detectActiveX('VideoLAN.VLCPlugin.1');
}

// ----------------------------------------------------------------------
// Anzeige der installierten Plugins - mit Links zu Herstellern
// ----------------------------------------------------------------------
/**
 * Hilfsfunktion zur Ausgabe der intallierten Plugins
 * @param sPlugin  {String}  Plugin-Name
 * @return HTML-Code
 * @type String
 */
function link2Player(sPlugin) {
    var s='';
    
    if (iPlayer<0){
        s="";
    } else {

        if (aPlayer[iPlayer]["Name"]==sPlugin){
            s+="<span style='color:#080;'>(wird gerade zum Abspielen verwendet)</span>";
        } else {
            s+="<span style='color:#080;'>(kompatibel mit diesem Medium)</span>";
        }
    }
    return s;
}

/**
 * Macht Check, ob ein angegebenes Plugin installiert ist und gibt Status aus.
 * - wenn installiert und kompatibel: Link zum Verwenden dieses Plugins
 * - wenn installiert aber nicht kompatibel - entspr. Hinweis
 * - wenn nicht installiert: Ausgabe und Installationsquellen
 * subfunktion fuer ShowPluginList()
 * @param s       {String}  Plugin-Typ (entspr. sPlayer, z.B "real")
 * @param sAudio  {String}  Audio-URL
 * @return HTML-Code
 * @type String
 */
function checkSinglePlugin(s,sAudio){
  var sUsable="<span style='color:#080;'>Ja, ist installiert</span>";
  var sInstalled="<span style='color:#080;'>Ja, ist installiert</span> (nicht kompatibel mit diesem Medium)</span>";
  var sNotInstalled="<span style='color:#c00; '>Nicht installiert</span> ";
  var sNotCompatible="<span style='color:#c00; '>(nicht kompatibel mit diesem Medium)</span> ";
  var sCompatible="<span style='color:#080; '>(kompatibel mit diesem Medium)</span> ";
  var sSources="<br>m&ouml;gliche Installations-Quellen (Auswahl):<br />";
  var sReturn='';

  var sClass='plugin';

  // Test, ob es installiert ist:
  if (isInstalledPlugin(s)) {
    // ja - nun Stream und File fuer das Plugin testen

    if (allPlayer[s]["sCanplay"].test(sAudio)) {
        sReturn+=sUsable + ' ' +link2Player(s);
        add2Log('Info', 'Plugin "' + getFullPluginname(s) + '" ist installiert und kann Medium abspielen.');
    }
    sClass='pluginready'; // heisst: ist installiert und ist kompatibel zum Medium

    if (!sReturn) {
        sReturn=sInstalled;
        sClass='plugininstalled'; // heisst: ist installiert, aber nicht kompatibel zum Medium
        add2Log('Debug', 'Plugin "' + getFullPluginname(s) + '" ist installiert, aber nicht kompatibel mit dem Medium.');
    }

  } else {

      sReturn+=sNotInstalled;
      add2Log('Warnung', 'Plugin "' + getFullPluginname(s) + '" ist NICHT installiert.');
      if (!allPlayer[s]["sCanplay"].test(sAudio))
          sReturn+=sNotCompatible;
      else sReturn+=sCompatible
      sReturn+=sSources + allPlayer[s]["sources"];
  }
  /*
  if (sReturn==sUsable)       add2Log('Info', 'Status: ist installiert und kann Medium abspielen.');
  if (sReturn==sInstalled)    add2Log('Info', 'Status: ist installiert.');
  if (sReturn==sNotInstalled) add2Log('Warnung', 'Status: wurde nicht gefunden.');
  */
 
  sReturn='<div class="'+sClass+'"><p>'
      +'<b>'
      +getFullPluginname(s)
      +'</b><br/>'
      + sReturn
      + '</p></div>';

      // add2Log(slevel, sMsg)
  return sReturn;
}

         /**
         * Hilfsfunktion: erzeugt einzeilige Ausgabe des Plugin-Checks mit Name des
         * Plugins und Angabe, ob dieses installiert ist oder nicht.
         * @return HTML-Ausgabe
         * @type string
         */
        function testPlugin(sPlugin, sText){
            if (!sText) sText=sPlugin;
            var sClass="fail";
            if (isInstalledPlugin(sPlugin)) sClass="ok";
            return '<span class="'+sClass+'" title="Plugin ['+sPlugin+'] im Browser gefunden? '+sClass+'">'+sText+'</span> ';
        }

/**
 * Anzeige der Liste aller unterstuetzten Plugins und Status, ob installiert
 * und ob sie das aktuelle Audioformat unterstützen.
 * @param sAudio  {String} URl zum Audio
 * @return HTML-Tabelle mit Plugins und unterstuetzten Audios
 * @type  String
 */
function ShowPluginList(sAudio) {
  var sReturn="";
  if (window.location.hostname.indexOf("test.drs")+ window.location.hostname.indexOf("drs.local") >0 ){
      var sOut='<p><b>Nachfolgnde Ausgabe erfolgt nur in der Testumgebung:</b><br>Auf diesem Webbrowser installierte Plugins:<br />'
            +testPlugin("flash")
            +testPlugin("real")
            +testPlugin("wm")
            +testPlugin("vlc")
            +testPlugin("qt")
            +testPlugin("html5")
      sOut+='<a href="#" onclick="OpenLink(\'/lib/player/stream-test.php\');" class="dot_link">zur Audio- und Plugin-Testseite</a><br />';
      sOut+='</p>';
      sReturn+=sOut;
  }

  return sReturn;
}


/*
 * Prueft, ob ein angegebenes Audio von irgendeinem installierten Browserplugin
 * abgespielt werden kann
 * @param sUrl  {String}  Adresse des Audios
 * @return Test, ob die Media-URL auf eines der Regex-Muster passt
 * @type boolean
 */
function CheckUrl(sUrl) {
  
  var bTrustUrl=false;
  if (sUrl.indexOf("?")>-1) sUrl=sUrl.substr(0,sUrl.indexOf("?"));

  add2Log('Debug', 'CheckUrl '+sUrl);
  if (sUrl) {
    /*
    for (var i=0; i < aAllowUrl.length; i++ ) {
      if (aAllowUrl[i].test(sUrl)) {
        add2Log('Debug', 'Medien-URL ist OK - sie passt auf dieses Muster: ' + aAllowUrl[i]);
        bTrustUrl=true;
      }
      // else add2Log('Debug', 'NO:' + aAllowUrl[i]);
    }
    */
    bTrustUrl=true;
    if (!bTrustUrl) w('<div class="box">Hinweis:</div><br>Die mitgegebene URL ist falsch oder stammt aus keiner vertrauensw&uuml;rdigen Quelle und wird deshalb nicht abgespielt.<br>');
  } else ShowMediaError('<div class="box">Hinweis:</div><br>Es wurde keine Medien-Datei mitgegeben. Hier wurde wohl ein falscher Link auf diesen Player gesetzt.<br>');
  return bTrustUrl
}

/*
 * Test, ob die Media-URL von einem der im Client-Browser gefundenen Plugins wiedergegeben werden kann
 * @param  sUrl        {String}   sUrl        Audio-Url
 * @param  bShowError  {boolean}  Fehler anzeigen?
 * @return Nr. des gefundenen Players (0..n Nr. im aPlayer-Appray ... oder -1 fuer false)
 * @type int
 */
function CheckPlayer(sUrl, bShowError) {

  var iPlayer=-1;
  var sForcedPlayer=getQueryVariable("forceplayer");
  var sLinkList='';
 
  if (sUrl.indexOf("?")>-1) sUrl=sUrl.substr(0,sUrl.indexOf("?"));

  // -- autodetect a player
  if (sForcedPlayer) {
      add2Log('Debug', 'forceplayer=' + sForcedPlayer);
  }
  add2Log('Debug', 'Url 2 match: ' + sUrl);
  for (var i = 0; i < aPlayer.length; ++i) {
    add2Log('Debug', aPlayer[i]["Name"] + ': ' + aPlayer[i]["sCanplay"].test(sUrl));
    if (aPlayer[i]["sCanplay"].test(sUrl) || (aPlayer[i]["Name"]==sForcedPlayer)) {
      if ((!sForcedPlayer && iPlayer<0) || (aPlayer[i]["Name"]==sForcedPlayer)) {
        iPlayer=i;
        sLinkList+='<b>'+aPlayer[i]["Name"]+'</b> (verwendet) | ';
      }
      else sLinkList+='<a href="?audiourl='+sUrl+'&amp;forceplayer='+aPlayer[i]["Name"]+'&amp;bShowDebug='+bShowDebug+'">'+aPlayer[i]["Name"]+'</a> | ' ;
    }
  }
  if (sLinkList && bShowError) add2Log('Debug', 'kompatible Plugins: '+sLinkList);
  
  if (iPlayer<0 && bShowError) {
    var s='Sie haben kein Browser-Plugin installiert, das dieses Audio abspielen kann.';
    if (sForcedPlayer)s='Das Plugin <b>'+getFullPluginname(sForcedPlayer)+'</b> ('+sForcedPlayer+') ist nicht installiert.<br /><br />';
    s+='<a href="#" onclick="OpenLink(\'/www/de/drs/hilfe/hoeren.html\');" class="dot_link">Hilfe zu Plugins</a>';
    ShowMediaError('<div class="box2">Warnung:</div><div class="box"><p>'+s+'</p></div>');
  }

  return iPlayer
}


/**
 * Plugin-Test am Browser
 * @param  sName  {String}  Name des Plugins
 * @return ist ein angegebenes Plugin installiert?
 * @type boolean
 */
function isInstalledPlugin(sName){
  for (var i = 0; i < aPlayer.length; ++i) {
//alert("sName="+sName+" Name="+aPlayer[i]['Name']+" sPlayer="+aPlayer[i]["sPlayer"]);
    if (aPlayer[i]["Name"] != sName && aPlayer[i]["sPlayer"]!=sName) continue;
    add2Log('Debug', 'Plugin ' + sName + ' gefunden.')
    return true;
  }
  add2Log('Debug', 'Plugin ' + sName + ' nicht installiert....')
  return false;
}

/**
 * gibt vollen Namen eines Plugins zurueck
 * @param sName {String} Kurzer Name des Plugins; Feld "Name" im Player-Array
 * @return voller Name des Plugins; Feld "Fullname" im Player-Array
 * @type String
 */
function getFullPluginname(sName){
  for (var s in allPlayer)
    if (allPlayer[s]["Name"]==sName) return allPlayer[s]["Fullname"].replace(/\(.*\)/,'');
  return false;
}

// belegt oPlayer - entweder Objekt mit ID Mediaplayer oder xplayer (JW5 Player)
/**
 * Wartet auf Initialisierung des Objekts document.MediaPlayer
 * Solange dieses Objekt nicht existiert, ruft sich die Funktion selbst wieder auf
 * Wurde es gefunden, ist die Variable oPlayer zugewiesen. Initial wird die
 * Lautstaerke des Plugins gesetzt
 * @return true
 * @type boolean
 */
function wait4PlayerObject(){
    oPlayer=document.MediaPlayer;
    if (oPlayer==null) setTimeout("wait4PlayerObject()", 1000);
    else {
        add2Log('Debug', 'Player is now available in DOM: ' + oPlayer.name);

        // nach dem Initialisieren die Lautstaerke setzen ... das geht aber manchmal nicht
        // wenn das Plugin noch nicht vollst. da ist oder man die Lauststaerke nicht setzen darf
        try {
          setPlayerVolume();
        }
        catch (e) {
          e=null;
        }

    }
    return true;
};


// ----------------------------------------------------------------------
// JW5 specific functions
// ----------------------------------------------------------------------

/**
 * Hilfsfunktion fuer JW Player
 * Um per JS auf den Playerstatus zugreifen zu koennen, braucht es Listener
 * Doku zu Model Events und deren Variablen:
 * http://developer.longtailvideo.com/trac/wiki/Player4Events
 * Diese Funktion initialisiert die fuer den JW Player notwendigen Listener
 */
function JW5addListeners(){
    var sClass='clickit';   
    if (oPlayer) {
        var playlist=null;
        // fuer Android: Flashplayer anklickbar machen:
        $("#playerobj").addClass(sClass);
        try{
            playlist = oPlayer.getPlaylist();
        }
        catch (e) {
          e=null;
          setTimeout("JW5addListeners()", 500);          
          return false;
        }        
        // sichtbares Flashobjekt wieder verstecken
        $("#playerobj").removeClass(sClass);
        $("#MediaPlayer").css("visibility", "hidden");

        if(playlist && (playlist!=null) && (playlist.length > 0)){
          oPlayer.addModelListener('STATE',      'JW5stateMonitor');
          oPlayer.addModelListener('TIME',       'JW5timeMonitor');
          oPlayer.vars={
              duration: -1,
              position: -1,
              state: -1
          }

          // Hack fuer Safari auf Mac OS - braucht es nicht mehr
          /*
          if (isSafariOnMac()) {
             add2Log('Info', 'HINWEIS betreffend Safari auf Mac OS: Autoplay funktioniert nicht im Flashplayer (JW Player). PLAY wird in 500 ms ausgeloest.');
             setTimeout("Play()", 500);
          }
            */
          return true; 
        }
        else {
            setTimeout("JW5addListeners()", 100);
            return false;
        }
    }
    else {
        setTimeout("JW5addListeners()", 100);
        return false;
    }
};

/**
 * Hilfsfunktion fuer JW Player
 * Hook fuer TIME Listener; in das Array oPlayer.vars werden
 * Abspielposition und Medienlänge geschrieben, damit
 * sie Ausserhalb des Flashplayers gelesen werden können
 * @see JW5addListeners()
 * @see getMediaLen()
 * @see getMediaPos()
 * @return true
 * @type boolean
 */
function JW5timeMonitor(obj){
    // duration, position in [s]
    oPlayer.vars["position"] = obj.position;
    oPlayer.vars["duration"] = obj.duration;
    return true;
};

/**
 * Hilfsfunktion fuer JW Player
 * Hook fuer STATE Listener; in das Array oPlayer.vars wird
 * Abspiel-Status geschrieben, damit er Ausserhalb des Flashplayers gelesen
 * werden kann
 * @see JW5addListeners()
 * @see getMediaStatus()
 * @return true
 * @type boolean
 */
function JW5stateMonitor(obj){
    oPlayer.vars["state"]=obj.newstate;
    return true;
};

// ----------------------------------------------------------------------
// Radioplayer - create object
Radio = function() {

    // Logging
    initLogs();

  iWindowHeight=620;
  if (bIsKinderradio) iWindowHeight=340;

  iSliderVol=-1; // Nummer des Lautst�rke-Sliders
  iSliderProgress=-1; // Nummer des Fortschritt-Sliders

  document.write('<div id="playerError"></div>');


    if (bIsKinderradio) showDiv("playerinfos");

};

// ----------------------------------------------------------------------
// Radio.prototype.play - eine angegebene URL abspielen

/**
 * Radio.prototype.play - eine angegebene URL abspielen
 * wenn kein Argument angegeben wird, wird die Media-URL aus der URL-Variable audiourl geholt
 */
Radio.prototype.play = function() {
  
  iIdSG=0;
  iIdSH=0;
  ClearMediaError(false);

  var bTrustUrl=false;
  sUrl=getQueryVariable("audiourl");
  sUrl=sUrl.replace(/\?$/, ""); // ggf. ? am Ende der Audio-URL abschneiden

  // Sende-Gefaess und - Hinweis aus URL Variablen holen
  iIdSG=getQueryVariable("sg");
  iIdSH=getQueryVariable("sh");
  bStream=getQueryVariable("stream");
  bRegi=getQueryVariable("regi");
  sPlayerType=getQueryVariable("type");
  sPlayerSkin=getQueryVariable("skin");
  sForcedPlayer=getQueryVariable("forceplayer");


  if (sPlayerType=='popup') {
      // Slider initialisieren ... sie werden spaeter bei radio.play() nur noch positioniert.
      document.write('<form action="" method="get" name="frmDummyForSliders" style="margin:0px; padding: 0px; position: absolute; top: 0px;">');
        // -- Lautst�rkeregler
        // diesen vor dem Fortschrittsbalken erzeugen
          var sliderVolumebar_TPL = {
          "b_vertical" : false,
          "b_watch": false,
          "n_controlWidth": 79,
          "n_controlHeight": 25,
          "n_sliderWidth": 10,
          "n_sliderHeight": 10,
          "n_pathLeft" : -4,
          "n_pathTop" : 6,
          "n_pathLength" : 77,
          "s_imgControl": "/static/player/images/loudspeaker_width.gif",
          "s_imgSlider": "/static/player/images/button_small.gif",
          "n_zIndex": 220
          }
          var sliderVolumebar_INIT = {
          "s_form" : "frmDummyForSliders",
          "s_name": "sliderVolumeValue",
          "n_minValue" : 0,
          "n_maxValue" : 100,
          "n_value" : iVolume,
          "n_step" : 10,
          "s_onChange": "setPlayerVolume();", // 20070906 - hahnax: Hook beim �ndern des Slider-Wertes
          "b_exec_hook": 1
          }
          document.write('<div id="playervolumebardummy"><div id="playervolumebarFg"></div>');
          document.write('<!-- Lautst&auml;rke --><input name="sliderVolumeValue" id="sliderVolumeValue" type="hidden" size="3" value="'+sliderVolumebar_INIT.n_value+'">');
          new slider(sliderVolumebar_INIT, sliderVolumebar_TPL);
          document.write('</div>');
          iSliderVol=0;

        // -- Fortschrittsbalken
          var sliderProgressbar_TPL = {
          "b_vertical" : false,
          "b_watch": false,
          "n_controlWidth": 187,
          "n_controlHeight": 25,
          "n_sliderWidth": 10,
          "n_sliderHeight": 10,
          "n_pathLeft" : -4,
          "n_pathTop" : 6,
          "n_pathLength" : 185,
          "s_imgControl": "/static/player/images/length_tobeplayed.gif",
          "s_imgSlider": "/static/player/images/button_small.gif"
          }
          var sliderProgressbar_INIT = {
          "s_form" : "frmDummyForSliders",
          "s_name": "sliderProgressValue",
          "n_minValue" : 0,
          "n_maxValue" : 100, // Position ist relativ: Max. muss 100 sein
          "n_value" : 0,
          "n_step" : 0,
          "s_onChange": "setPosition();", // 20070906 - hahnax: Hook beim �ndern des Slider-Wertes
          "b_exec_hook": 0
          }
          document.write('<div id="playerprogressbardummy"><div id="playerprogressbarFg"></div>');
          document.write('<!-- Position --><input name="sliderProgressValue" id="sliderProgressValue" type="hidden" size="7" value="'+sliderProgressbar_INIT.n_value+'">');
          new slider(sliderProgressbar_INIT, sliderProgressbar_TPL);
          document.write('</div>');

          iSliderVol=0;
          iSliderProgress=iSliderVol+1;

        document.write('</form>'); // Ende Slider
        document.getElementById("playervolumebardummy").style.display = 'none';
        document.getElementById("playerprogressbardummy").style.display = 'none';
  }
  
  /* START: Akamai rtsp mit rtmp ersetzen - DTEC-167
   * Eine rtsp-Adresse wird mit rtmp ersetzt, wenn ein Akamai-rtsp auf ein mp3-File zeigt
   */
  if (!sForcedPlayer && isInstalledPlugin("flash")){
	var aRtmpData=getRtmpFromRtsp(sUrl);
	if (aRtmpData && aRtmpData["url"]) {
		sUrl=aRtmpData["url"];
         	// add2Log('Info', 'Flash Plugin als auch rtsp-Adresse gefunden: ' + sUrl);
	}
  }
  // ENDE: Akamai rtsp mit rtmp ersetzen

  // GEOBLOCKED-Message einblenden
  addGeoMessage(sUrl);


  // Default-Text - verwendetes Plugin
  if (document.getElementById("currentPlugin")) document.getElementById("currentPlugin").innerHTML = '<p>Es wird derzeit kein Medium im Webplayer abgespielt. Es ist kein Plugin aktiv.</p>';

  if (bStream) {

    // wenn vom Portal stream=select kam... oder bstream kein gueltiges Programm ist
    if (bStream=='select' || !aStreamUrl[bStream]) {

      // vom Portal kommend? dann Liste der Programme anzeigen
      sHtml='<div class="box">'
            +'<div class="box2">Bitte w&auml;hlen Sie das gew&uuml;nschte Programm:</div>'
            +'<br />'
            +'<div style="padding-left: 20px;">';
      for (var s in aStreamUrl) {
        if (aStreamUrl[s]["Streams"]) {
          sHtml+='<a href="'+aStreamUrl[s]["Streams"]["mp3-128-m3u"]+'"'
            +'  class="beitrag_hoeren" '
            +'  onclick="javascript:return Radio.open(this,{\'stream\': \''+s+'\'});"'
            +'  >'
            +aStreamUrl[s]["Name"] + '</a>';
        }
      }
      sHtml+='<br />Sie k&ouml;nnen den Sender auch jederzeit oben im Men&uuml; &laquo;Programme&raquo; wechseln.'
        +'</div>'
        +'<br />';
      add2Log('Info', 'bStream=' + bStream + '; Zeige Auswahl der Programme.');
      ShowMediaError(sHtml);
      return false;
    }
   
    if (!bRegi || bRegi>1000) {
      add2Log('Debug', 'Streams suchen; mitgegebene Audio-URL wird ignoriert.');
      // StreamFormat kommt aus den Einstellungen und ist eines von
      // (mp3-128|aac-v2-64|aac-v1-32)
      var sStreamFormat=Get_Cookie("StreamFormat"); 
      if (!sStreamFormat) {
          add2Log('Debug', 'kein Cookie f&uuml;r Stream-Format aus Einstellungen gefunden. Verwende Default-Format (AAC+, wenn Flash installiert ist - ansonsten MP3).');
          if(isInstalledPlugin("flash")) { sStreamFormat="aac-v2-64"; } 
          else { sStreamFormat="mp3-128"; }
      }
      add2Log('Debug', 'Stream-Format: ' + sStreamFormat);

      // zu jedem dieser Formate gibt es mehrere Urls im Array
      // aStreamUrl[Kette]["Streams"][Typ]
      // mit Typ=Streamformat oder Typ=Streamformat +"-(m3u|asx|ram)"

      // bei DRS 1 kann in den Einstellungen das bevorzugte regi erscheinen
      // Wenn ein Regi gewählt wurde, wird der Standard-DRS1-Stream
      // durch den Registream uebersteuert. Zum Glück sind für die Regis nun
      // dieselben Streamingformate und Container vorhanden, wie für die Programme
      if (bStream=="drs1") {
          add2Log('Debug', 'DRS 1 Stream - Check auf Regis.')
          var iRegi=Get_Cookie("StreamRegi");
          add2Log('Debug', 'Regi aus Cookie: ' + iRegi);
          if (bRegi>1000) {
              iRegi=bRegi;
              add2Log('Debug', 'Regi aus URL uebersteuert Cookie ' + iRegi);
          }
          if (!iRegi) {
              add2Log('Debug', 'Noch kein Cookie gesetzt. Verweis auf Einstellungen.');
              $sTxt='<div class="box"><div class="box2">DRS 1: Standard-Programm oder Regionaljournal?</div>'
                + "<p>"
                + "DRS-1-Hörer können entweder das Standard-Programm oder aber DRS 1 mit ihrem bevorzugten Regionaljournal hören.<br /><br />"
                + "Bitte wechseln Sie jetzt zu den &laquo;Einstellungen&raquo; und speichern Sie Ihre Auswahl."
                + "</p>"
                + "<strong>Hinweis:</strong><p>"
                + "Die zusätzliche Auswahlliste für die Regionaljournale können Sie jederzeit in den Einstellungen ändern. "
                + "<br /><br />"
                + "... zu den <a href='#' onclick=\"showDiv('einstellungen');blur();return false;\">Einstellungen</a><br />"
                + "</p></div>";
              // playerbar wegnehmen:
              document.getElementById("ichhoerejetzt").style.display='none';
              ShowMediaError($sTxt);
              return false;
          } else {
              if (iRegi>0 && aStreamUrl["drs1"]["Regis"][iRegi]["Name"] && !getQueryVariable("title")) {
                  add2Log('Debug', 'blende Regi im Titel ein.');
                  document.getElementById("currenttitle").innerHTML+=' - ' + aStreamUrl["drs1"]["Regis"][iRegi]["Name"] + '';
                  add2Log('Debug', 'verwende Regi ' + aStreamUrl["drs1"]["Regis"][iRegi]["Name"] + " (" + iRegi + ")");

              }
              else add2Log('Debug', 'spiele Standard-Programm');
          }
      }

      add2Log('Debug', 'suche Stream-URL ... ');
      var sTmpUrl="";
      var aSuffixes=new Array("-m3u", "-ram", "-asx", "");
      // Wenn Flash installiert und Default-Format MP3 ist, dann Test-Reihenfolge der Streams umstellen:
      // if (isInstalledPlugin("flash") && sStreamFormat=="mp3-128") aSuffixes=Array("", "-m3u", "-ram", "-asx");
      if (isInstalledPlugin("flash")) aSuffixes=Array("-flash", "", "-m3u", "-ram", "-asx");

      for (var i = 0; i < aSuffixes.length; ++i) {
        // nur bei DRS 1: Regis beruecksichtigen
        // if (aStreamUrl[bStream]["Regis"] && aStreamUrl[bStream]["Regis"]["Streams"]){
        if (bStream=="drs1" && iRegi>0){
            add2Log('Debug', 'teste aStreamUrl['+bStream+']["Regis"][Streams]['+sStreamFormat+aSuffixes[i]+']');
            sTmpUrl=aStreamUrl[bStream]["Regis"][iRegi]["Streams"][sStreamFormat+aSuffixes[i]];
        }else {
            sTmpUrl=aStreamUrl[bStream]["Streams"][sStreamFormat+aSuffixes[i]];
            add2Log('Debug', 'teste aStreamUrl['+bStream+'][Streams]['+sStreamFormat+aSuffixes[i]+']');
        }

        if (sTmpUrl) {
            if (CheckPlayer(sTmpUrl,false)>=0) {
                sUrl=sTmpUrl;
                add2Log('Debug', 'OK: ' + sTmpUrl);
                break; // beim ersten abspielbarer URL aufhoeren zu suchen
            }
            add2Log('Debug', 'SKIP ' + sTmpUrl);
        }
      }
      add2Log('Debug', 'Ende Container-Check; AudioUrl = ' + sUrl);

    } // if (!bRegi)
  } // if (bStream)
  
  
  // --- test
  if (sUrl) {
    bTrustUrl=CheckUrl(sUrl);
    iPlayer=CheckPlayer(sUrl,true);
  }

  // Tab Einstellungen -> Plugins
  if (document.getElementById("compatiblePlugins")){
    add2Log('Debug', 'Liste aller unterstützten Plugins:');
    document.getElementById("compatiblePlugins").innerHTML = ShowPluginList(sUrl);
  }

  // Spezielle Hinweise:
  if (bStream) {
    s='<br />Sofern Sie nichts hoeren sollten: Wechseln Sie in den Einstellungen das Stream-Format auf "Normale Qualität: MP3 128 kbit/s".';
    if (sStreamFormat=="aac-v2-64") add2Log('Info', '<b>Hinweis:</b> Die Wiedergabe von AAC 64 kBit/s erfordert mind. eines der folgenden Browser-Plugins: <br />- Flashplayer<br />- Orban Plugin (für Windows Mediaplayer)<br />- VLC' + s);
    if (sStreamFormat=="aac-v1-32") add2Log('Info', '<b>Hinweis:</b> Die Wiedergabe von AAC 32 kBit/s erfordert mind. eines der folgenden Browser-Plugins: <br />- Flashplayer<br />- RealPlayer ab Version 10<br />- Orban Plugin (für Windows Mediaplayer)<br />- VLC' + s);
  } else {
    if (!isInstalledPlugin("real") || !isInstalledPlugin("flash"))
        add2Log('Fehler', '<b>Hinweis:</b> F&uuml;r die Wiedergabe aller Audios On Demand installieren Sie den Flashplayer und das Realplayer Plugin.');
  }


  if (iPlayer<0 || (!bTrustUrl) ) {
    if (sUrl) {
      sHTML='<div class="box">';
      // sHTML+='<strong>verf&uuml;gbare Plugins:</strong>';
      // sHTML+=document.getElementById("compatiblePlugins").innerHTML;
      sHTML+='<p>Sie k&ouml;nnen alternativ versuchen, den folgenden Link direkt im Browser zu öffnen:<br />';
      sHTML+='<a href="'+getQueryVariable("audiourl")+'" target="_blank" class="dot_link">Direktlink zum Audio</a><br />';
      if (getQueryVariable("audiourl")!=sUrl) {
         sHTML+='<a href="'+sUrl+'" target="_blank" class="dot_link">Alternative Adresse</a><br />';
      }

      sHTML+='Oder kopieren Sie die folgende Adresse und öffnen Sie diese im Audioplayer Ihrer Wahl:<br /><br />'
        +'<form class="standard">'
        +'<div class="form-item">'
        +'<input type="text" value="'+getQueryVariable("audiourl")+'" class="form-text">';
        +'</div></form>'
        +'</p></div>';
      // playerbar wegnehmen:
      document.getElementById("ichhoerejetzt").style.display='none';
      ShowMediaError(sHTML);
      return false;
    }
  }
  else {

    if (document.getElementById("playervolumebardummy"))   document.getElementById("playervolumebardummy").style.display = 'none';
    if (document.getElementById("playerprogressbardummy")) document.getElementById("playerprogressbardummy").style.display = 'none';
  
    
    // -- Player-div erstellen
    w('<div id="playerbg">');

    // hierauf werden die Slider-Divs positioniert
    w('<div id="playervolumebar"></div>');
    w('<div id="playerprogressbar"></div>');



    // -- PlayerObjekt-Div
    w('  <div id="playerobj">');

    // allg. Variablen - Pluginuebergreifend
    var iPlayerWidth=184;
    var iPlayerHeight=40;

    // -- Player-Objekt: Flashplayer - Soundmanager 2
    if (aPlayer[iPlayer]["sPlayer"]=="sm2") {

        add2Log('Debug', 'initialisiere Soundmanager2');
        soundManager.debugMode = false;
        soundManager.useConsole = false;

        if (window.location.hostname.indexOf(".test.drs")){
            soundManager.debugMode = bShowDebug;
            soundManager.useConsole = false;
        }

        soundManager.flashVersion = 9;
        soundManager.useMovieStar = true;
        soundManager.url = '/static/player/soundmanager2/swf/';
        var options = {
            id: 'mediaurl',
            url: sUrl,
            serverUrl: 'rtmp://cp23910.edgefcs.net/ondemand/mp3:mpc/focus/',
            autoLoad: false,
            stream: true,
            autoPlay: false,
            onbeforefinishtime: 5000,
            onjustbeforefinishtime: 200,
            multiShot: false,
            multiShotEvents: false,
            pan: 0,
            volume: 100,
            usePeakData: false,
            useWaveformData: false,
            useEQData: false
        }
        soundManager.onload = function() {
            soundManager.createSound('mediaurl',sUrl);
            soundManager.createSound(options);
            soundManager.play('mediaurl');
        };
    } else {

      // alle anderen Plugins brauchen den Flashplayer nicht mehr:
      /*
      add2Log('Debug', 'deaktiviere soundManager Objekt');
      soundManager.destruct();
      */

    } 
    
    // -- Player-Objekt: Flashplayer - JW-Player
    if (aPlayer[iPlayer]["sPlayer"]=="jw5") {

        add2Log('Debug', 'initialisiere JW Player');

        // --- Erkennung von DRS Medien
        // - rtmp-Wiedergabe via AKAMAI
        // - mp3 http Stream
        // Andere rtmp oder andere http Livestreams werden mit diesem
        // Player nicht wiedergegeben
        var bIsRtmpLiveStream=false; // Flag, ob es ein rtmp Livestream ist
        var fStreamer=false;         // jw5 Flashvar streamer
        var fProvider='sound';       // jw5 Flashvar provider

        // Unterscheidung rtmp/ http
        if (sUrl.indexOf('rtmp')==0) {

            fProvider='rtmp';

            // rtmp kann nur wiedergegeben werden, wenn Application
            // Server bekannt ist; fuer rtmp-Livestreams wird
            // noch zusaetzlich ein Flag gesetzt (fuer duration und Pause-Taste)

            // Check auf AoD
            if (aRtmpData && aRtmpData["fStreamer"]) fStreamer=aRtmpData["fStreamer"];

            // Check auf Livestreams
            for (s in aPlayer[iPlayer]["aStreamsLive"])
                if (sUrl.indexOf(aPlayer[iPlayer]["aStreamsLive"][s])>=0) {
                    // fStreamer=aPlayer[iPlayer]["aStreamsLive"][s];
                    // fStreamer ist Audio-Url bis einschl. erstem Verzeichnis:
                    aTmp=sUrl.split('/');
                    fStreamer=aTmp[0]+'/'+aTmp[1]+'/'+aTmp[2]+'/'+aTmp[3]+'/';
                    bIsRtmpLiveStream=true;
                }

            // Application server nicht gefunden?
            if (!fStreamer) {
                document.getElementById("ichhoerejetzt").style.display='none';
                sHTML='<div class="box">'
                    +'<p>'
                    +'<strong>Fehler:</strong>'
                    +'Dieses Audio kann nicht wiedergegeben werden.<br />'
                    +'Sie versuchen, ein Audio mit rtmp Protokoll abzuspielen.<br />'
                    +'Derzeit wird die Wiedergabe von Flash-Audiostreams jedoch nur für Audios '
                    +'von SR DRS unterstützt.<br />'
                    +'<p>Sie k&ouml;nnen alternativ versuchen, den folgenden Link direkt im Browser zu öffnen:<br />'
                    +'<a href="'+sUrl+'" target="_blank" class="dot_link">Direktlink zum Audio</a><br />'
                    +'Oder kopieren Sie die folgende Adresse und öffnen Sie diese im Audioplayer Ihrer Wahl:<br /><br />'
                    +'<input type="text" value="'+sUrl+'" size="10" style="width:365px;"><br />'
                    +'</p></div>';
                ShowMediaError(sHTML);
                return false;
            }
        }
        // jw5 Flashvar file: bei Http die URL; bei rtmp der Teil hinter dem App-Server
        var fFile=sUrl.replace(fStreamer, '');

        // CMS-3470 alte AoD laufen nicht mehr
        // HOTFIX: wenn Url mit rtmp beginnt und Gross MP3 aufhört, dann beim Parameter fFile "mp3:" davorsetzen"
        // ob das die korrekte Regel ist, steht aus (s. INC_1099 "AKAMAI - unangekündigte Umstellung bei Audiostreaming zum zweiten")
	var rTest=new RegExp('^rtmp.*edgefcs.net/ondemand/mpc.*\.MP3$');
	if (rTest.test(sUrl)) fFile='mp3:'+fFile;
        // ENDE HOTFIX

        var sSwfFile='player-licensed_53.swf';  // swf of JW Player

        add2Log('Debug', 'swf=' + sSwfFile);
        add2Log('Debug', 'jw5.streamer=' + fStreamer);
        add2Log('Debug', 'jw5.file=' + fFile);
        add2Log('Debug', 'jw5.provider='+fProvider);

        var flashvars = {
            controlbar: 'none',
            fullscreen: 'false',
            repeat: 'false',
            shuffle: 'false',
            autostart: 'true',
            provider:fProvider,
            streamer: fStreamer,
            file:fFile,
            autoscroll: 'true'
       };

       // Spezialbehandlung der Streams:
       // duration als undefined hinzufuegen
       if (bStream || bIsRtmpLiveStream || sUrl.indexOf("streamserver.ch")>1) {
           flashvars["duration"]=undefined;
           add2Log('Debug', 'jw5.duration=undefined');
       }

        var params = {
            allowscriptaccess: 'always'
        };

        var attributes = {
            name: 'MediaPlayer',
            id: 'MediaPlayer'
        };

        // w('<span style="float: right;"><a href="#" onclick="$(\'#playerobj\').removeClass(\'clickit\')">schliessen [ X ]</a></span><br /><br />');
        w('Bitte das Flash-Objekt<br />anklicken, um es zu aktivieren:<br /><br />');
        w('<div id="MediaPlayer"></div>');
        swfobject.embedSWF('/static/player/jwplayer/'+sSwfFile, 'MediaPlayer', iPlayerWidth, iPlayerHeight, '9', false, flashvars, params, attributes);

        // Listener fuer JW5 initialisieren
        JW5addListeners();

    } 

    // -- Player-Objekt: Real Player
    if (aPlayer[iPlayer]["sPlayer"]=="real") {
      add2Log('Debug', 'erzeuge RealPlayer-Objekt');
      if (isSafariOnMac())
         add2Log('Info', 'HINWEIS betreffend Safari auf Mac OS: Ein bekanntes Problem ist eine Inkomaptibilität zw. Safari im 64-Bit-Modus dem Real Plugin. Sie können versuchen, den Safari-Browser im 32 Bit Modus zu starten.');
      w('    <object'
        +'      classid="clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa"'
        +'      id="MediaPlayer" height="'+iPlayerHeight+'" width="'+iPlayerWidth+'"'
        +'      >'
        +'      <param name="AUTOSTART" value="true">'
        +'      <param name="SRC" value="'+sUrl+'">'
        +'      <param name="CONTROLS" value="StatusField">'
        +'      <embed'
        +'        name="MediaPlayer" height="'+iPlayerHeight+'" width="'+iPlayerWidth+'"'
        +'        type="audio/x-pn-realaudio-plugin" '
        +'        src="'+sUrl+'"'
        +'        border="0" '
        +'        transparentatstart="0" '
        +'        autostart="true" '
        +'        animationatstart="0" '
        +'        controls="StatusField" '
        +'        autosize="true" '
        +'        displaysize="0" '
        +'        >'
        +'      </embed>'
        +'    </object>');
    } // Ende Player-Objekt: Real Player

    // -- Player-Objekt: MediaPlayer
    if (aPlayer[iPlayer]["sPlayer"]=="wm") {
      add2Log('Debug', 'erzeuge MS Mediaplayer-Objekt');
      w('    <object'
       +'      classid="CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95"'
       +'      codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112"'
       +'      id="MediaPlayer" height="'+iPlayerHeight+'" width="'+iPlayerWidth+'"'
       +'      standby="Lade MS Media Player..." type="application/x-oleobject"'
       +'      >'
       +'      <param name="FileName" value="'+sUrl+'">'
       +'      <param name="AnimationatStart" value="false">'
       +'      <param name="AutoSize" value="0">'
       +'      <param name="AutoStart" value="true">'
       +'      <param name="displaySize" value="false">'
       +'      <param name="TransparentAtStart" value="true">'
       +'      <param name="ShowAudioControls" value="false">'
       +'      <param name="ShowControls" value="0">'
       +'      <param name="ShowDisplay" value="1">'
       +'      <param name="ShowPositionControls" value="false">'
       +'      <param name="ShowStatusBar" value="true">'
       +'      <embed'
       +'        name="MediaPlayer" height="22" width="'+iPlayerWidth+'"'
       +'        type="application/x-mplayer2"'
       +'        pluginspage="http://www.microsoft.com/windows/windowsmedia/download/"'
       +'        filename="'+sUrl+'" '
       +'        src=""'
       +'        transparentatstart="1" '
       +'        autostart="1" '
       +'        animationatstart="0" '
       +'        showcontrols="0" '
       +'        showaudiocontrols="0" '
       +'        showpositioncontrols="0" '
       +'        autosize="0" '
       +'        showstatusbar="1" '
       +'        displaysize="0" '
       +'        >'
       +'      </embed>'
       +'    </object>');

    } // Ende  Player-Objekt: MediaPlayer

    // -- HTML5 - Audio
    if(aPlayer[iPlayer]["sPlayer"]=="html5") {
      detectIphoneBelow32(sUrl);
      add2Log('Debug', 'erzeuge HTML5-Audio-Element');
      document.MediaPlayer = document.createElement("audio");
      document.MediaPlayer.setAttribute('id', 'MediaPlayer');
      document.MediaPlayer.name = "html5";
      document.MediaPlayer.setAttribute("src", sUrl);
      document.MediaPlayer.load();
      document.MediaPlayer.play();
      document.MediaPlayer.addEventListener('canplay', function canplayEvent(e) {
        add2Log('Debug', 'HTML5/Audio-Event: canplay: ');
        document.MediaPlayer.play();
      }, false);
      document.MediaPlayer.addEventListener('volumechange', function changeVolume(e) {
        add2Log('Debug', 'HTML5/Audio-Event: volumechange...');
      }, false);
      document.MediaPlayer.addEventListener('canplaythrough', function canplayEvent(e) {
        add2Log('Debug', 'HTML5/Audio-Event: canplaythrough! ');
      }, false);

      document.MediaPlayer.addEventListener('progress', function getPercentProg(e) {
         var oPlayer = document.MediaPlayer;
         var soFar = parseInt(((oPlayer.buffered.end(0) / oPlayer.duration) * 100));
         add2Log('Debug', 'HTML5/Audio-Event: '+soFar+'% gebuffert.');
      }, false);

      document.MediaPlayer.addEventListener('error', function getError(e) {
        var sMediaError = (document.MediaPlayer.error===null) ? "i.O." : document.MediaPlayer.error.code;
        add2Log('Debug', 'HTML5/Audio-Event: Das Laden der Audio-Datei wurde vorzeitig abgebrochen... MediaError='+sMediaError);
      }, false);

      var sMediaError = (document.MediaPlayer.error===null) ? "i.O." : document.MediaPlayer.error.code;
      add2Log('Debug', 'MediaPlayer-eventhandler sind registriert. Playerstatus: '+sMediaError);
    }

    // -- Player-Objekt: Quicktime
    if (aPlayer[iPlayer]["sPlayer"]=="qt") {
      add2Log('Debug', 'erzeuge Quicktime-Player-Objekt');
      w('    <OBJECT'
       +'      CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"'
       +'      CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab"'
       +'      id="MediaPlayer" width="'+iPlayerWidth+'" height="'+iPlayerHeight+'"'
       +'      >'
       +'      <param name="src" value="'+sUrl+'" >'
       +'      <param name="autoplay" value="true">'
       +'      <param name="BGCOLOR" value="white">'
       +'      <param name="controller" value="false">'
       +'      <embed'
       +'        name="MediaPlayer" width="'+iPlayerWidth+'" height="'+iPlayerHeight+'"'
       +'        type="video/quicktime" '
       +'        pluginspage="http://www.apple.com/quicktime/download/"'
       +'        src="'+sUrl+'"'
       +'        autoplay="true"'
       +'        CONTROLLER="false"'
       +'        enablejavascript="true"'
       +'        >'
       +'      </embed>'
       +'    </object>');
    }
    // -- Ende Player-Objekt: Quicktime

    // -- Player-Objekt: VLC Player
    if (aPlayer[iPlayer]["sPlayer"]=="vlc" || aPlayer[iPlayer]["sPlayer"]=="vlcx") {
      add2Log('Debug', 'erzeuge VLC-Player-Objekt');
      w('    <OBJECT'
      //  +'      classid="clsid:E23FE9C6-778E-49D4-B537-38FCDE4887D8"'
       +'      classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921"'
       +'      codebase="http://downloads.videolan.org/pub/videolan/vlc/latest/win32/axvlc.cab"'
       +'      id="MediaPlayer" width="'+iPlayerWidth+'" height="'+iPlayerHeight+'" '
       +'      type="application/x-vlc-plugin"'
      //  +'      version="VideoLAN.VLCPlugin.2"'
       +'      events="True"'
       +'      >'
       +'      <param name="Src" value="'+sUrl+'">'
       +'      <param name="ShowDisplay" value="true">'
       +'      <param name="Loop" value="false">'
       +'      <param name="AutoPlay" value="true">'
       +'      <embed'
       +'        name="MediaPlayer" width="'+iPlayerWidth+'" height="'+iPlayerHeight+'"'
       +'        type="application/x-vlc-plugin"'
       +'        version="VideoLAN.VLCPlugin.2"'
       +'        autoplay="yes" loop="no"'
       +'        target="'+sUrl+'"'
       +'        >'
       +'      </embed>'
       +'    </object>');
    }

    w('  </div>'); // PlayerObjekt-div schliessen


    // -- Playercontrols
    //
    w('  <div id="naviPlayercontrols">');
    w('    <ul>');
    w('<li><a id="start"    href="#" OnClick="javascript:blur();Play();return false;"     accesskey="1" title="Start"></a></li>');

    // wenn es kein Stream ist, dann Pause
    w('<li><a id="stop"     href="#" OnClick="javascript:Stop();return false;"     accesskey="3" title="Stopp"></a></li>');

    // Pause oder Stop?
    // Stop und keine Pause, wenn
    // - Audio=AoD oder Mp3
    // - kein http-Stream oder rtmp 
    if ((bStream=="" || aPlayer[iPlayer]["sPlayer"]=="jw5") && !bIsRtmpLiveStream)
    w('<li><a id="pause"    href="#" OnClick="javascript:Pause();return false;"    accesskey="2" title="Pause"></a></li>');

    w('<li><a id="rewind"   href="#" OnClick="javascript:Rewind();return false;"   accesskey="4" title="zum Anfang" style="display:none;" ></a></li>');
    w('<li><a id="forward"  href="#" OnClick="javascript:Forward();return false;"  accesskey="6" title="vorw&auml;rts" style="display:none;" ></a></li>');
    w('<li><a id="back"     href="#" OnClick="javascript:Backward();return false;" accesskey="5" title="r&uuml;ckw&auml;rts" style="display:none;"></a></li>');
    w('<li><a id="volLess"  href="#" OnClick="javascript:changeVolume(-10);" accesskey="7" title="leiser" style="">-</a></li>');
    w('<li><a id="volMore"  href="#" OnClick="javascript:changeVolume(10);"  accesskey="8" title="lauter" style="">+</a></li>');
    w('    </ul>');
    w('  </div>');


    // -- Playerbg-div schliessen
    w('</div>');

    w_flush(); // Schreibt den HTML-Content des Players
    wait4PlayerObject(); // belegt Variable oPlayer

    // -- Kurzinfo unter Einstellungen -> Plugins: was wird gerade mit welchem Plugin abgespielt:

    add2Log('Info', '<b>Audio-Adresse</b>: ' + sUrl);

    if (sForcedPlayer) add2Log('Info', '<b>erzwungenes Plugin: ' + getFullPluginname(sForcedPlayer) + '</b>');
    else add2Log('Info', '<b>Verwendetes Plugin: ' + getFullPluginname(aPlayer[iPlayer]["Name"]) + '</b>');

    sFilename=sUrl.substr(sUrl.lastIndexOf("\/")+1,sUrl.length);
    sExt=sFilename.substr(sFilename.lastIndexOf("\.")+1,sFilename.length);
    sHinweise='<form class="standard">'
            +'<div class="form-item">';

    // Mediastatus anzeigen
    add2Log('Debug', 'Initialisiere Media-Status (Intervall ' + iIntervalStatus + ' ms)');
    oStatus=window.setInterval("showMediaStatus();", iIntervalStatus);

    // Aktualisieren des Fortschrittsbalkens aktivieren (wg. Autoplay=true)

    if (sPlayerType=='popup') {

        add2Log('Debug', 'Initialisiere Slider (Intervall ' + iIntervalProgress + ' ms)');
        oProgress=window.setInterval("UpdateProgressSlider()", iIntervalProgress);

        if (getQueryVariable("audiourl")!=sUrl)
            sHinweise+='<label for="audioorig">Adresse aus dem angeklickten Link:</label>'
                +'<input id="audioorig" type="text" value="'+getQueryVariable("audiourl")+'" size="10" class="form-text">'
                +'</div>'
                +'<div class="form-item">'
                +'<label for="audioplayed">Vom Webplayer abgespielte Adresse:</label>'
                ;
        else sHinweise+='<label for="audioplayed">Adresse:</label>'
                ;

        sHinweise+='<input type="text" id="audioplayed" value="'+sUrl+'" size="10" class="form-text">'
                +'</div><p>'
                + 'Protokoll: ' + sUrl.substr(0, sUrl.indexOf("\/")-1)
                + '; Dateityp/ Container: ' + sExt+ ' <br />';
        if (sForcedPlayer) sHinweise+='erzwungenes Plugin: ' + getFullPluginname(sForcedPlayer);
        else sHinweise+='Verwendetes Plugin: ' + getFullPluginname(aPlayer[iPlayer]["Name"]);
        sHinweise+='</p></form>';

        document.getElementById("currentPlugin").innerHTML = sHinweise;
        // document.getElementById("currentPlugin").title = sUrl;

        add2Log('Debug', 'Lautstärke unterstützt? ' + aPlayer[iPlayer]["bShowVolumebar"]);
        showVolumebar(aPlayer[iPlayer]["bShowVolumebar"]);

        if (bShowDebug) {
          onerror=handleErr;
          document.getElementById("playerobj").style.top = '20px';
          document.getElementById("playerobj").style.left = '0px';
          document.getElementById("playerError").style.top = '5px';
        }
    } // if (sPlayerType=='popup')


  } // if (iPlayer==-1)

  if (sPlayerType=='popup'){
      // Update der Titelinfos
      if (!bIsKinderradio) initTicker(sUrl, iIdSG, iIdSH, bStream);

      // wenn EPG-Infos vorliegen oder ein Stream abgespielt wird, dann Infos einblenden
      if (iPlayer>=0) {
        if (iIdSH || iIdSG || bStream || bIsKinderradio) showDiv("playerinfos")
        else {
          showDiv("mini");
          sLastPlayerDiv="mini";
        }
      }
  }
  add2Log('Debug', 'Initialisierung prototype.play abgeschlossen.');

  return false;
}

/**
 * Anzeigen/ Verstecken des Lauststaerke-Reglers
 * Manche Plugins koennen die Lautstaerke nicht setzen - in der
 * Pluginkonfiguration ist in bShowVolumebar dann ein entspr. Flag gesetzt
 * @param bVisible {boolean}  Regler sichtbar?
 */
function showVolumebar(bVisible) {
  if (bVisible) {
    document.getElementById("playervolumebardummy").style.display = 'block';

    // geht nicht im Opera
    // changeOpac(35, "playervolumebarFg");
    document.getElementById("playervolumebarFg").style.display = 'block';
  } else {
      document.getElementById("playervolumebarFg").style.display = 'none';
      document.getElementById("playervolumebardummy").style.display = 'none';
  } // Ende Lautstaerkeregler
}


/**
 * Anzeigen/ Verstecken des Positions-Reglers
 * Bei Streams muss der Positionsregler versteckt werden.
 * Hinweis:
 * Versteckt wird der Stream im Soundmanager in der Funktion getMediaLen();
 * beim JW Player wird der Stream mit flashvars["duration"]=undefined; in
 * Radio.prototype.play.
 * @param bVisible {boolean}  Regler sichtbar?
 */
function showProgressbar(bVisible) {
  if (bVisible) {
    document.getElementById("playerprogressbardummy").style.display = 'block';
    document.getElementById("playerprogressbarFg").style.display = 'block';
  } else {
    document.getElementById("playerprogressbardummy").style.display = 'none';
    document.getElementById("playerprogressbarFg").style.display = 'none';
  } // Ende Fortschrittsbalken
}


// ----------------------------------------------------------------------
/**
 * to be used in onclick event of a link
 */
Radio.open = function() {
  var sUrl;
  var aParams=new Array("sg", "sh", "stream", "design", "title", "type", "click", "forceplayer");

  if (Radio.open.arguments) {
    sUrl = "/lib/player/radio.php";
    if (bIsKinderradio) sUrl = "/lib/player/kinderradio.php";

    sParams = "?audiourl=" + encodeURIComponent(Radio.open.arguments[0]);
    if (Radio.open.arguments[1]) {
      for (i in aParams) if (Radio.open.arguments[1][aParams[i]])     sParams += "&"+aParams[i]+"=" + Radio.open.arguments[1][aParams[i]];
    }
    sParams += "&type="+sPlayerType;
    sParams += "&skin="+sPlayerSkin;
    sUrl+=sParams;

  }
  if (sUrl) {
    var sWindowsOptions='width=420,height='+iWindowHeight+',toolbar=0,directories=0,menubar=0,status=0,resizable=1,location=0,scrollbars=0,copyhistory=0';
    oPopup = window.open(sUrl, "srdrsplayer", sWindowsOptions);
    oPopup.focus();
  }
  return false;
}



// ----------------------------------------------------------------------
// Lautstaerke-Funktionen
// ----------------------------------------------------------------------

/**
 * set a volume -- Hook-Funktion des Lautstaerke-Sliders
 * entspr. der Position des Sliders wird im Plugin die Lausstaerke
 * gesetzt
 */
function setPlayerVolume() {
  if (aPlayer[iPlayer]["bShowVolumebar"]) {
    iVolume=document.frmDummyForSliders.sliderVolumeValue.value; // 0..100

    var iWidth = iVolume * A_SLIDERS[iSliderVol].n_controlWidth / 100;
    if (iWidth<0) iWidth=0;
    document.getElementById("playervolumebarFg").style.width = iWidth + 'px';
    
    try {
      switch (aPlayer[iPlayer]["sPlayer"]) {
        case "sm2":
          soundManager.sounds.mediaurl.setVolume(iVolume); // 0..100
          break;
        case "jw5":
            iReturn=oPlayer.sendEvent('VOLUME', iVolume);
            break;
        case "html5":
            document.MediaPlayer.volume = 0.01*iVolume;
            break;
        case "real":
          oPlayer.SetVolume(iVolume); // 0..100
          break;
        case "wm":
          // Lautst�rke geht von -10000..0
          iVolume=-Math.pow(100-iVolume,2);  // quadratisch
          oPlayer.Volume=iVolume;
          break;
        case "qt":
          // QT braucht "ewig" zum Initialisieren. 
          oPlayer.SetVolume(iVolume*2.55); // 0..255
          break;
        case "vlc":
          // geht nicht in Netscape/ Opera :-/
          // document.MediaPlayer.audio.volume ist nur noch readonly
          // http://wiki.videolan.org/Documentation:WebPlugin
          break;
        case "vlcx":
          oPlayer.volume=iVolume; // 0..100
          break;
        default:
          ShowError('setPlayerVolume() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
        break;
      } // switch
    } catch (e) {
      e=null;
    } // try
      
  }
}

/**
 * aendert Position des Volume Sliders und ruft Funktion zum Setzen der
 * Lauststaerke auf; Hook Funktion von Vol+ und Vol-
 * @param  iPercent {integer}  Prozent der Lautstaerke-Aenderung
 */
function changeVolume(iPercent) {
  if (aPlayer[iPlayer]["bShowVolumebar"]) {
    iVolume=document.frmDummyForSliders.sliderVolumeValue.value/1; // 0..100
    if (iVolume) {
      var iNewVolume=forceLimit(iVolume+iPercent, 0, 100)/1;
      document.frmDummyForSliders.sliderVolumeValue.value=iNewVolume;
      setPlayerVolume();
    }
  }
}

// ----------------------------------------------------------------------
// Fortschritt-Funktionen
// ----------------------------------------------------------------------

/**
 * Hole Laenge des gerade abgespielten Mediums
 * @return Laenge in [ms]
 * @type integer
 */
function getMediaLen(){
  var iReturn=false;
  try {
    switch (aPlayer[iPlayer]["sPlayer"]) {
    case "sm2":
      // wenn es ein Stream ist, dann keine Media-Länge zurueckgeben,
      // damit kein Fortschrittsbalken im Player dargestellt wird
      if (soundManager.stream==true)iReturn=-1; else
          iReturn=soundManager.sounds.mediaurl.duration;
      break;
    case "html5":
        if(document.MediaPlayer.duration < Infinity) iReturn=document.MediaPlayer.duration*1000;
        break;
    case "jw5":
        // Anm.: Wert in JW5timeMonitor() gesetzt
        iReturn=oPlayer.vars["duration"]*1000;
        break;
    case "real":
      iReturn=oPlayer.GetLength();
      break;
    case "wm":
      iReturn=oPlayer.duration * 1000;
      break;
    case "qt":
      iReturn=oPlayer.GetDuration() / oPlayer.GetTimeScale()* 1000;
      break;
    case "vlc":
    case "vlcx":
      iReturn=oPlayer.input.length;
      break;
    default:
      ShowError('getMediaLen() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
      break;
    }
  } catch (e) {
    e=null;
  }

  return iReturn;
}

/**
 * Hole Position des gerade abgespielten Mediums
 * @return Position in [ms]
 * @type integer
 */
function getMediaPos(){
  var iReturn=false;
  try {
    switch (aPlayer[iPlayer]["sPlayer"]) {
    case "sm2":
      iReturn=soundManager.sounds.mediaurl.position;
      break;
    case "jw5":
        // Anm.: Wert in JW5timeMonitor() gesetzt
        iReturn=oPlayer.vars["position"]*1000;
        break;
    case "html5":
      // TODO getMediaPos
      iReturn = document.MediaPlayer.currentTime * 1000;
      break;
    case "real":
      iReturn=oPlayer.GetPosition();
      break;
    case "wm":
      iReturn=oPlayer.CurrentPosition * 1000;
      break;
    case "qt":
      iReturn=oPlayer.GetTime() / oPlayer.GetTimeScale() * 1000;
      break;
    case "vlc":
    case "vlcx":
      iReturn=oPlayer.input.time;
      break;
    default:
      ShowError('getMediaPos() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
      break;
    }
  } catch (e) {
    e=null;
  }
    
  return iReturn;
}

/**
 * Holt Mediastatus aus den Plugins und mappt deren Werte auf einen von
 *  unknown
 *  stopped
 *  contacting
 *  buffering
 *  playing
 *  pause
 *  seeking
 *  error
 * @return Playerstatus
 * @type String
 */

function getMediaStatus(){

  var s='unknown';
  
  try {
    switch (aPlayer[iPlayer]["sPlayer"]) {
      case "sm2":

          /* Status-Debug: */
          s="readyState=" + soundManager.sounds.mediaurl.readyState;
          s+=" playState=" + soundManager.sounds.mediaurl.playState;
          s+=" isBuffering=" + soundManager.sounds.mediaurl.isBuffering;
          s+=" paused=" + soundManager.sounds.mediaurl.paused;
          break;
          //
          switch (soundManager.sounds.mediaurl.readyState){
              /*
              readyState:
                0 = uninitialised
                1 = loading
                2 = failed/error
                3 = loaded/success
                */
              case 0:s="uninitialised";break;
              case 2:s="error";break;
              case 1:
              case 3:
                  s="contacting";
                  switch (soundManager.sounds.mediaurl.playState) {
                      /*
                      playState
                            Numeric value indicating the current playing state of the sound.
                            0 = stopped/uninitialised
                            1 = playing or buffering sound (play has been called, waiting for data etc.)
                            Note that a 1 may not always guarantee that sound is being heard, given buffering and autoPlay status.
                      */
                      case 0:s="stopped";break;
                      case 1:
                          if (soundManager.sounds.mediaurl.isBuffering) s="buffering"
                          else s="playing";
                          break;
                  }
                  if (soundManager.sounds.mediaurl.paused) s="pause";
                  break;
          }
      break;
    case "jw5":
        // Anm.:
        // Der JW5 Status wird mit der Listener Funktion JW5stateMonitor
        // in oPlayer.vars["state"] gesetzt (s.o.)
        // moegliche Werte: IDLE, BUFFERING, PLAYING, PAUSED, COMPLETED
        s=oPlayer.vars["state"];
        switch (oPlayer.vars["state"]) {
            case -1:s="playing";break;
            case "IDLE":s="stopped";break;
            case "BUFFERING":s="buffering";break;
            case "PLAYING":s="playing";break;
            case "PAUSED":s="pause";break;
            case "COMPLETED":s="stopped";break;
        }
        break;
    case "real":
      switch (oPlayer.GetPlayState()) {
        // http://service.real.com/help/library/guides/realonescripting/browse/htmfiles/embedmet.htm
        case 0:s="stopped";break;
        case 1:s="contacting";break;
        case 2:s="buffering";break;
        case 3:s="playing";break;
        case 4:s="pause";break;
        case 5:s="seeking";break;
      }
      // s=s+oPlayer.GetPlayState();
      break;
    case "wm":
      switch (oPlayer.playState) {
        // http://msdn2.microsoft.com/en-us/library/ms533677(VS.85).aspx
        case -1:s="contacting";break;
        case -1:s="pause";break;
        case -1:s="seeking";break;
        case 0:s="stopped";break;
        case 2:s="playing";break;
        case 3:s="buffering";break;
      }
      // s=s+oPlayer.playState
      break;
    case "qt":
      oPlayer.playstatechange(iTmp);
      switch (iTmp) {
        // http://lists.apple.com/archives/QuickTime-Users/2006/Jun/msg00092.html
        case 1:s="stopped";break;
        case 2:s="pause";break;
        case 3:s="playing";break;
        case 4:s="seeking";break;   // fast forward
        case 5:s="seeking";break;   // fast rewind
        case 6:s="buffering";break;
        case 7:break;               // waiting
        case 8:s="stopped";break;   // media ended
        case 9:s="contacting";break;// transitioning
        case 10:break;              // player ready
      }
      break;
    case "html5":
      // http://developer.apple.com/safari/library/documentation/AudioVideo/Reference/HTMLMediaElementClassReference/HTMLMediaElement/HTMLMediaElement.html
      status = (document.MediaPlayer.error===null) ? "ok" : document.MediaPlayer.error.code;
      if(status==4) return "error";
      if(document.MediaPlayer.readyState < 4) return "buffering";
      if(document.MediaPlayer.seeking===true) return "seeking";
      if(document.MediaPlayer.paused===true) return "pause";
      if(document.MediaPlayer.ended===true) return "stopped";

      var status = document.MediaPlayer.networkState+"_"+status;
      switch(document.MediaPlayer.networkState) {
        case "1_ok":s="playing";break;
        case "0_3":s="error";break;
        default:s="Netzwerkstatus="+document.MediaPlayer.networkState+" Playerstatus="+sMediaError; alert(s); break;
      }
    case "vlc":
    case "vlcx":
      // http://www.videolan.org/doc/play-howto/en/ch04.html
      switch (oPlayer.input.state) {
        case 0:s="stopped";break;
        case 1:s="contacting";break;
        case 2:s="buffering";break;
        case 3:s="playing";break;
        case 4:s="pause";break;
        case 5:s="stopped";break;
        case 6:s="error";break; // ERROR
      }
      break;
    default:
      ShowError('getMediaStatus() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
      break;
    }
  } catch (e) {
    e=null;
  }
    
  // return aStatus[s];
  return s;
}


/**
 * Anzeige des Abspiel-Status des Plugins im Div "playerstatus"
 * Diese Funktion wird permanent aufgerufen durch window.setTimeout
 */
function showMediaStatus(){
  var sIchHoere='Ich h&ouml;re jetzt:';
  var sStatus=sIchHoere;
  aStatus=new Object();
  if (bIsKinderradio) {
    aStatus["unknown"]    = sIchHoere; 
    aStatus["stopped"]    = "Angehalten";
    aStatus["contacting"] = "Einen kleinen Moment ..";
    aStatus["buffering"]  = "Einen kleinen Moment ...";
    aStatus["playing"]    = sIchHoere;
    aStatus["pause"]      = "Pause";
    aStatus["seeking"]    = sIchHoere;
    aStatus["error"]      = "Fehler aufgetreten";
  } else {  
    aStatus["unknown"]    = sIchHoere;
    aStatus["stopped"]    = "Status: Angehalten";
    aStatus["contacting"] = "Status: Verbinden";
    aStatus["buffering"]  = "Status: Daten laden";
    aStatus["playing"]    = sIchHoere;
    aStatus["pause"]      = "Status: Pause";
    aStatus["seeking"]    = "Status: Suche";
    aStatus["error"]      = "Fehler aufgetreten";
  }

  var s=getMediaStatus();
  sStatus=s;

  if (aStatus[s]) sStatus=aStatus[s];


  sPlayStatus=sStatus;

  if (document.getElementById("playerstatus")) {
    document.getElementById("playerstatus").innerHTML = sStatus;
  }
 
  // FS#2469 - Player: am Ende des Abspielvorgangs Player-Anzeige resetten
  if (s=="playing") bWasPlaying=true;
  if (sPlayerType=='inline') {
    try{
      if (top && top.Radio && top.Radio.oLink) {
        if (s=="stopped" && bWasPlaying ) { top.Radio.closeAll(); }
        if (s=="error" || s=="stopped" ) {  
          top.Radio.showError("Fehler:\nDas Audio unter der Adresse\n\n"+sUrl+"\n\nkonnte im Inline-Player nicht wiedergegeben werden.");  }
      }
    }
    catch(e){
      // nop
    }
  }

  if (s=="stopped" && bWasPlaying) {
      add2Log('Debug', 'Ende des Mediums erreicht.');
      Stop();
  }
  
  // Wenn aktueller Status gleich letztem Status, dann raus hier.
  if (sPlayStatus==sStatus) return;
  add2Log('Debug', 'Playerstatus: "' + sStatus + '"');
  
  if (document.getElementById("playtime")) {
    var sVisibility='hidden';

    // FS#2471 - Pause blendet aktuelle Position aus
    if (s=="playing" || s=="pause"  || s=="unknown") sVisibility='visible';
    document.getElementById("playtime").style.visibility=sVisibility;
  }
  
}

  
/**
 * set a position to play -- Hook-Funktion des Fortschritt-Sliders
 * Wenn der Slider verschoben wird, soll Wiedergabe beim festgelegten
 * Punkt weitergehen
 * Position im Titel ist relativ: sliderProgressbar_TPL.n_maxValue ist 100
 */
function setPosition() {
    var iNewPos;
    var iProgressValue=document.frmDummyForSliders.sliderProgressValue.value;
    add2Log('Debug', 'setPosition(); new position of slider: ' + iProgressValue);
    switch (aPlayer[iPlayer]["sPlayer"]) {
    case "sm2":
      if(getMediaPos()>0) {
        iNewPos=iProgressValue / 100 * getMediaLen();
        soundManager.sounds.mediaurl.setPosition(iNewPos);
      }
      break;
    case "jw5":
      if(getMediaPos()>0) {
        iNewPos=iProgressValue / 100 * getMediaLen() / 1000;
        oPlayer.sendEvent('SEEK', iNewPos);
      }
      break;
    case "html5":
        iNewPos=iProgressValue / 100.0 * getMediaLen() / 1000.0;
        document.MediaPlayer.currentTime = iNewPos;
      break;
    case "real":
      if(getMediaPos()>0) {
        iNewPos=iProgressValue / 100 * getMediaLen();
        oPlayer.SetPosition(iNewPos);
      }
      break;
    case "wm":
      if  (getMediaPos()>0) {
        iNewPos=iProgressValue / 100 * getMediaLen() / 1000;
        oPlayer.currentPosition=iNewPos;
      }
      break;
    case "qt":
      if  (getMediaPos()>0) {
        iNewPos=iProgressValue / 100 * getMediaLen() * oPlayer.GetTimeScale() / 1000;
        oPlayer.SetTime(iNewPos);
      }
      break;
    case "vlc":
    case "vlcx":
      if (getMediaPos()>0) {
        iNewPos=iProgressValue / 100 * getMediaLen();
        oPlayer.input.time=iNewPos;
      }
      break;
    default:
        ShowError('setPosition() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
      break;
    } // switch
}


/**
  * Slider anhand der Abspiel-Position setzen und Zeit anzeigen
  * Ausfuehrung des Hooks wird aufgehoben, damit kein Loop zw. Setzen des Sliders
  * und Aendern der Position durch Aenderung des Sliders entsteht
  * Es wird nur ausgefuehrt, wenn Slider nicht im Mousedown-Modus (window.n_activeSliderId != 1)
  */
function UpdateProgressSlider() {
  // var sTimer='-:--';
  var sTimer='';
    if (window.n_activeSliderId != 1) {
      var iNewPosSlider=0;
      A_SLIDERS[iSliderProgress].b_exec_hook=0;
      iNewPosSlider=getMediaPos()/getMediaLen() * 100;
      A_SLIDERS[iSliderProgress].f_setValue(iNewPosSlider);
      A_SLIDERS[iSliderProgress].b_exec_hook=1;

      var iWidth = iNewPosSlider * A_SLIDERS[iSliderProgress].n_controlWidth / 100;
      if (iWidth<0 || (!iWidth)) iWidth=0;
      var sTimeTotal=getMediaLen();
      var sTimeCurrent=getMediaPos();
      if ((sTimeTotal>1) && (sTimeCurrent>0)) {
        sTimer=GenerateTime(sTimeTotal);
        if ((sTimeTotal>1)) sTimer=GenerateTime(sTimeCurrent) +"/ "+ sTimer;
        if (sTimer=="0:00/ 0:00") sTimer="0:00";
        document.getElementById("playerprogressbarFg").style.width = iWidth + 'px';
        document.getElementById("rewind").style.display = "";
        document.getElementById("forward").style.display = "";
        document.getElementById("back").style.display = "";
        showProgressbar(true);
      } else {
        document.getElementById("rewind").style.display = "none";
        document.getElementById("forward").style.display = "none";
        document.getElementById("back").style.display = "none";

        // showProgressbar(false);
      }
      
    } // if (window.n_activeSliderId != 1) {
  
  // document.getElementById("playtime").innerHTML = sStatus;
  document.getElementById("playtime").innerHTML = sTimer;
  
}

/**
 * Hilfsfunktion zur Zeitanzeige Abspielposiotion/ Dauer
 * generiert aus Anzahl Millisekunden eine Zeit im Fomat M:SS
 * Werte werden dabei immer abgerundet
 */
function GenerateTime(iMs) {
  var iSecTotal=parseInt(iMs/1000);
  var iMin=parseInt(iSecTotal/60);
  var iSec=iSecTotal-(iMin*60);
  
  var sReturn=iMin+":";
  if (iSec<10) sReturn+="0";
  sReturn+=iSec;
  
  return sReturn
}



// ----------------------------------------------------------------------
// Player-Tasten
// ----------------------------------------------------------------------

/**
 * Player: onclick Funktion für Play/ Resume
 */
function Play(){
  add2Log('Debug', 'Playerfunktion Play();');
  try {
    setPlayerVolume();
    switch (aPlayer[iPlayer]["sPlayer"]) {
    case "sm2":
      // Hinweis: play() spielt Medium immer von Begin
      if (soundManager.sounds.mediaurl.paused) soundManager.sounds.mediaurl.resume()
      else soundManager.sounds.mediaurl.play();
      break;
    case "html5":
      iReturn=oPlayer.play();
      break;
    case "jw5":
        iReturn=oPlayer.sendEvent('PLAY');
        break;
    case "real":
      oPlayer.DoPlay();
      break;
    case "wm":
      // document.getElementById("MediaPlayer").Play();
      oPlayer.Play();
      break;
    case "qt":
      oPlayer.Play();
      break;
    case "vlc":
    case "vlcx":
      oPlayer.playlist.play();
      break;
    default:
      ShowError('Play() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
      break;
    }
    if(document.getElementById("stop"))  document.getElementById("stop").style.display = "";
    if(document.getElementById("pause")) document.getElementById("pause").style.display = "";

    // FS#2469 - Player: am Ende des Abspielvorgangs Player-Anzeige resetten
    // s.a.
    // Stop()
    document.getElementById("sl1slider").style.visibility='visible';

    // --- nicht einschalten oProgress=window.setInterval("UpdateProgressSlider()", iIntervalProgress);
    UpdateProgressSlider();
  }
  catch (e) {
    e=null;
    // Wenn Play nicht klappt??
  }
  finally {
  } 
}

/**
 * Stop() - Player: onclick Funktion für Stop
 */
function Stop(){
  bWasPlaying=false;
  add2Log('Debug', 'Playerfunktion Stop();');
  try {
    switch (aPlayer[iPlayer]["sPlayer"]) {
    case "sm2":
  	  soundManager.sounds.mediaurl.stop();
      break;
    case "jw5":
        iReturn=oPlayer.sendEvent('STOP');
        break;
    case "html5":
      oPlayer.pause();
      break;
    case "real":
  	  oPlayer.DoStop();
      break;
    case "wm":
      oPlayer.Stop();
      break;
    case "qt":
  	  oPlayer.Stop();
      break;
    case "vlc":
    case "vlcx":
      oPlayer.playlist.stop();
      break;
    default:
      ShowError('Stop() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
      break;
    }
    if (document.getElementById("stop"))  document.getElementById("stop").style.display = "none";
    if (document.getElementById("pause")) document.getElementById("pause").style.display = "none";

    // FS#2469 - Player: am Ende des Abspielvorgangs Player-Anzeige resetten
    // s.a. Play()
    A_SLIDERS[iSliderProgress].f_setValue(0);
    document.getElementById("sl1slider").style.visibility='hidden';
    document.getElementById("playerprogressbarFg").style.width = '0px';
  	// --- nicht ausschalten window.clearInterval(oProgress);
  }
  catch (e) {
    e=null;
    // und Wenn Stop nicht klappt??
  }
  finally {
  }

    return false;
}

/**
 * Pause() - Player: onclick Funktion für Pause
 */
function Pause(){
  add2Log('Debug', 'Playerfunktion Pause();');
  try {
    switch (aPlayer[iPlayer]["sPlayer"]) {
      case "sm2":
        soundManager.sounds.mediaurl.pause();
        break;
      case "jw5":
        iReturn=oPlayer.sendEvent('PLAY', false);
        break;
      case "html5":
        document.MediaPlayer.pause();
        break;
      case "real":
        oPlayer.DoPause();
        break;
      case "wm":
        oPlayer.Pause();
        break;
      case "qt":
        oPlayer.Pause();
        break;
      case "vlc":
      case "vlcx":
        // oPlayer.playlist.pause();
        oPlayer.playlist.togglePause();
        break;
      default:
        ShowError('Pause() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
        break;
    } // switch
    if (document.getElementById("stop"))  document.getElementById("stop").style.display = "none";
    if (document.getElementById("pause")) document.getElementById("pause").style.display = "none";
  }
  catch (e) {
    e=null;
    // Wenn Pause nicht klappt, dann auf Stop ausweichen.
    if (document.getElementById("pause"))  document.getElementById("pause").style.zIndex = "-10";
    Stop();
  }
  finally {
  } 
	// --- nicht ausschalten window.clearInterval(oProgress);
}

/**
 * Rewind() - Player: onclick Funktion für Rewind
 */
function Rewind(){
  add2Log('Debug', 'Playerfunktion Rewind();');
  changePlayPosition(-1);
}

/**
 * Forward() - Player: onclick Funktion für Forward
 */
function Forward(){
  add2Log('Debug', 'Playerfunktion Forward();');
  // changePlayPosition(0.05);
  changePlayPosition2(10);
}
/**
 * Backward() - Player: onclick Funktion für Backward
 */
function Backward(){
  add2Log('Debug', 'Playerfunktion Backward();');
  // changePlayPosition(-0.05);
  changePlayPosition2(-10);
}

/**
 * forceLimit(iValue, iMin, iMax)
 * Hilfsfunktion zum Begrenzen eines Zahlenwertes auf ein angegebenes
 * Minimum bzw. Maximum. Der Rückgabewert bleibt gleich, wenn
 * der Wert sich innerhalb der Grenzen bewegt.
 * @param: iValue  {float}  Eingabewert
 * @param: iMin    {float}  erlaubter Minimalwert
 * @param: iMax    {float}  erlaubter Maximalwert
 * @return: float  
 */
function forceLimit(iValue, iMin, iMax) {
  if (iValue<iMin) iValue=iMin;
  if (iValue>iMax) iValue=iMax;
  return iValue;
}

/**
 * Abspiel-Position des Mediums setzen
 * @param: iPercent  {int}  Sprungweite der Verschiebung (0.05 fuer 5%; negative Werte zum zurueckspringen)
 */
function changePlayPosition(iPercent){
    var iNewPos;
    switch (aPlayer[iPlayer]["sPlayer"]) {
    case "sm2":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+(getMediaLen()*iPercent), 0, getMediaLen());
        soundManager.sounds.mediaurl.setPosition(iNewPos);
      }
      break;
    case "jw5":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+(getMediaLen()*iPercent), 0, getMediaLen());
        iReturn=oPlayer.sendEvent('SEEK', iNewPos);
      }
      break;
    case "html5":
      if(getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+(getMediaLen()*iPercent), 0, getMediaLen());
        document.MediaPlayer.currentTime = iNewPos;
      } 
      break;
    case "real":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+(getMediaLen()*iPercent), 0, getMediaLen());
        oPlayer.SetPosition(iNewPos);
      }
      break;
    case "wm":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+(getMediaLen()*iPercent), 0, getMediaLen());
        oPlayer.currentPosition=iNewPos / 1000;
      }
      break;
    case "qt":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+(getMediaLen()*iPercent), 0, getMediaLen());
        iNewPos=iNewPos * oPlayer.GetTimeScale() / 1000;
        oPlayer.SetTime(iNewPos);
      }
      break;
    case "vlc":
    case "vlcx":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+(getMediaLen()*iPercent), 0, getMediaLen());
        oPlayer.input.time=iNewPos;
      }
      break;
    default:
      ShowError('changePlayPosition() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
      break;
    }
    window.setTimeout("UpdateProgressSlider();", 50);
    // UpdateProgressSlider();
}

/**
 * Abspiel-Position des Mediums setzen
 * @param: iSec  {int}  Sprungweite der Verschiebung in Sekunden (negative Werte zum zurueckspringen)
 */
function changePlayPosition2(iSec){
    var iNewPos;
    switch (aPlayer[iPlayer]["sPlayer"]) {
    case "sm2":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+iSec*1000, 0, getMediaLen());
        soundManager.sounds.mediaurl.setPosition(iNewPos);
      }
      break;
    case "jw5":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+iSec*1000, 0, getMediaLen()) / 1000;
        iReturn=oPlayer.sendEvent('SEEK', iNewPos);
      }
      break;
    case "html5":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+iSec*1000, 0, getMediaLen()) / 1000;
        iReturn=document.MediaPlayer.currentTime=iNewPos;
      }
      break;
    case "real":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+iSec*1000, 0, getMediaLen());
        oPlayer.SetPosition(iNewPos);
      }
      break;
    case "wm":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+iSec*1000, 0, getMediaLen());
        oPlayer.currentPosition=iNewPos / 1000;
      }
      break;
    case "qt":
      if (getMediaLen()) {
        // iNewPos=forceLimit(getMediaPos()+iSec*1000, 0, getMediaLen());
        iNewPos=iNewPos * oPlayer.GetTimeScale() / 1000;
        oPlayer.SetTime(iNewPos);
      }
      break;
    case "vlc":
    case "vlcx":
      if (getMediaLen()) {
        iNewPos=forceLimit(getMediaPos()+iSec*1000, 0, getMediaLen());
        oPlayer.input.time=iNewPos;
      }
      break;
    default:
      ShowError('Forward() not implemented for player "' + aPlayer[iPlayer]["sPlayer"] + '"');
      break;
    }
    window.setTimeout("UpdateProgressSlider();", 50);
    // UpdateProgressSlider();
}


/**
 * OpenLink(sUrl)
 * Link oeffnen
 * Wenn der Opener noch existiert, dann im Opener anzeigen, sonst neues Fenster.
 * @param: sUrl  string  Adresse
 * @return: false (damit href-Attribut im Link nicht den Link direkt oeffnet)
 * @type boolean
 */
function OpenLink(sUrl){
  try{
    var sOpener=window.opener.name;
  }
  catch (e) {
    e=null;
  }
  
  if (sOpener && sOpener!="player") {
    window.opener.location.href=sUrl;
    window.opener.focus();
  }
  else {
    var oPopup=window.open(sUrl, "","") ;
    oPopup.focus();
  }
  return false;
}

/**
 * schliesst im Player angezeigte Hinweis- oder Fehlermeldung
 * @param bShowPlayerinfos  {boolean}  div "playerinfos" anzeigen?
 */
function ClearMediaError(bShowPlayerinfos) {
  document.getElementById("mediaerror").display = 'none';
  document.getElementById("mediaerror").innerHTML = "";
  if (bShowPlayerinfos) showDiv("playerinfos");
}

/**
 * Fehlermeldung des Players anzeigen (bei falschem Medium; fehlendes Plugin)
 * Es werden die Steuerelemente des Players ausgeblendet und andere Links,
 * die den Benutzer woanders hinfuehren koennten.
 * @param  sTxt  {String}  Fehlermeldung
 */
function ShowMediaError(sTxt) {

 if (sPlayerType=='inline' && top && top.Radio && top.Radio.oLink) {
      top.Radio.showError("Fehler:\n"+sTxt);
      return false;
  }

  add2Log('Fehler', 'angezeigte Meldung (stripped): ' + sTxt.replace(/<[^>]*>/g, ""));
  document.getElementById("mediaerror").innerHTML = document.getElementById("mediaerror").innerHTML + sTxt;
  showDiv("mediaerror");

  document.getElementById("bmediaerror").style.display = '';
  document.getElementById("mediaerror").style.display = 'block';

  // Navigationselemente ausblenden, die den User wegfuehren
  if (document.getElementById("bmax")) document.getElementById("bmax").style.display = 'none';
  if (document.getElementById("bmin")) document.getElementById("bmin").style.display = 'none';

  if (!bIsKinderradio) {
      sLastPlayerDiv="mediaerror";
  }

}

/**
 * onchange des Dropdown Sendungen A-Z
 * Es wird per OpenLink() im Browser die Seite der Sendung geoeffnet
 * @param  sValue {String}  Zieladresse
 * @return: false (damit href-Attribut im Link nicht den Link direkt oeffnet)
 * @type boolean
 */
function srdrsabisz_chosen(sValue) {
  // OpenLink('/lib/mehr_infos_zur_sendung/?sg_id='+iValue);
  if (sValue && sValue>"") OpenLink(sValue);
  return false;
}

/**
 * onchange des Dropdown Themen
 * Es wird per OpenLink() im Browser die Seite des Themas geoeffnet
 * @param  sValue {String}  Zieladresse
 * @return: false (damit href-Attribut im Link nicht den Link direkt oeffnet)
 * @type boolean
 */
function srdrsthemen_chosen(sValue) {
  if (sValue && sValue>"") OpenLink(sValue);
  return false;
}

// ================================================================================

