// scripting of the windows media player
// tv1.de - Andi Siegrist

function WindowsMediaPlayer(aName, aPlayerName, aDigitName, aMuteName, aPosName, aTimer, aTimeout, aStartPos) {
  this.name         = aName;
  this.playerName   = aPlayerName;
  this.digitName    = aDigitName;
  this.muteName     = aMuteName;
  this.posName      = aPosName;
  this.timer        = aTimer;
  this.timeout      = aTimeout;
  this.startPos     = aStartPos;
  this.loopFunction = false;

  this.initialized = -1;
  
  this.isGecko = false;
  this.isOpera = false;
}

function WindowsMediaPlayerGo() {
  this.handler      = new WACTimerEvalHandler('winMediaPlayer', this.timeout, window, this.name + ".doIt()");
  this.timer.registerHandler(this.handler);
}

function WindowsMediaPlayerSetGecko(boolValue) {
  this.isGecko = boolValue;
}

function WindowsMediaPlayerSetOpera(boolValue) {
  this.isOpera = boolValue;
}

function WindowsMediaPlayerHalt() {
  if (this.handler)
    this.timer.unregisterHandler(this.handler);
  this.handler = 0;
}

function WindowsMediaPlayerDoIt() {
  if (this.initialized <= 0)
    this.init();
  else
    this.loop();
}

function WindowsMediaPlayerInit() {

  this.playerObj = window.eval(this.docPrefix + this.playerName);

  if ( this.isOpera || this.isGecko || this.playerObj && (!document.all || (this.playerObj.ReadyState && this.playerObj.PlayState))) {
  
    if (this.initialized < 0) {
      this.initialized++;
    }
    else {
      // alert("init");
      this.digit1Obj = window.eval(this.docPrefix + this.digitName + '1');
      this.digit2Obj = window.eval(this.docPrefix + this.digitName + '2');
      this.digitmObj = window.eval(this.docPrefix + this.digitName + 'm');
      this.muteObj   = window.eval(this.docPrefix + this.muteName);
      if (this.startPos && this.startPos > 0)
        this.setPosition(this.startPos);
      this.loop()
      this.initialized = 1;
    }
  }
  else {
    this.playerObj = null;
  }
}

function WindowsMediaPlayerLoop() {
  if (this.loopFunction)
    this.checkBuffering();
  this.changeVolume(0);
  this.changeMute(false);
  if (this.posName)
    this.showPosition();
  if (window.showPlayerPosition)
    showPlayerPosition();
}

function WindowsMediaPlayerPlay() {
  if (!this.playerObj)
    return;
 
  if (!document.all && !eval(this.playerObj.Play))
    return;
    
  this.playerObj.Play();
}

function WindowsMediaPlayerPause() {
  if (!this.playerObj)
    return;

  var state;

  if ( (document.all || this.isGecko ) && (!this.isOpera) ) {
    state = this.playerObj.PlayState;
  }
  else
  {
    if(!eval(this.playerObj.GetPlayState))
      return;
    state = this.playerObj.GetPlayState();
  }

  if (state == 2)
    this.playerObj.Pause();
  else if (state == 1)
    this.playerObj.Play();
}

function WindowsMediaPlayerStop() {

  if (!this.playerObj || !document.all && !eval(this.playerObj.Stop))
    return;

  this.playerObj.Stop();
  if ( (document.all || this.isGecko ) && (!this.isOpera))
  {
    if (this.playerObj.CurrentPosition != 0)
    {
      try 
      {
        this.playerObj.CurrentPosition = pos; 
      } catch(e){}
    }
    //this.playerObj.CurrentPosition = 0;
  }
  else
    this.playerObj.SetCurrentPosition(0);
}

function WindowsMediaPlayerSetRelPosition(relPos) {
  if (!this.playerObj)
    return;
  
  var start;
  var end;
  if ( (document.all || this.isGecko) && (!this.isOpera) ) {
    if (this.playerObj.IsBroadCast)
      return;
    start = this.playerObj.SelectionStart;
    end = this.playerObj.SelectionEnd;
  }
  else {
    if (!eval(this.playerObj.GetSelectionStart))
      return;
    start = this.playerObj.GetSelectionStart();
    end = this.playerObj.GetSelectionEnd();
  }
  
  if (start < 0)
    start = 0;
  var dur = end - start;
  var pos = Math.floor(relPos * dur) + start;
  
  if ( (document.all || this.isGecko) && (!this.isOpera) ) {
    if (this.playerObj.CurrentPosition != pos)
    {
      try 
      {
        this.playerObj.CurrentPosition = pos; 
      } catch(e){}
      //this.playerObj.CurrentPosition = pos; 
    }
  }
  else {
    this.playerObj.SetCurrentPosition(pos);
  }
  this.playerObj.Play();
}

function WindowsMediaPlayerGetRelPosition() {
    
  if (!this.playerObj)
    return 0;

  var start;
  var end;
  var pos;
  if ( (document.all || this.isGecko) && (!this.isOpera) ) {
    if (this.playerObj.IsBroadCast)
      return 0;
    start = this.playerObj.SelectionStart;
    end = this.playerObj.SelectionEnd;
    pos = this.playerObj.CurrentPosition;
  }
  else {
    if (!eval(this.playerObj.GetSelectionStart))
      return 0;
    start = this.playerObj.GetSelectionStart();
    end = this.playerObj.GetSelectionEnd();
    pos = this.playerObj.GetCurrentPosition(); 
  }

  if (start < 0)
    start = 0;
  var dur = end - start;
 
  return (pos - start) / dur;
}

function WindowsMediaPlayerChangeVolume(delta) {
  if (!this.playerObj)
    return;

  var stepsize = 5;
  var volx = 0;
  if ( (document.all || this.isGecko) && (!this.isOpera) )
    volx = this.playerObj.Volume;
  else
  {
    if (!eval(this.playerObj.GetVolume))
      return;
    volx = this.playerObj.GetVolume();
  }
  
  vol = 100 - Math.sqrt(-volx * 2.5);
  if (vol <= 0)
    vol = 0;
  if (vol >= 100)
    vol = 100;
  vol += (delta * stepsize);
  vol -= vol % stepsize;
  if (vol <= 0)
    vol = 0;
  if (vol >= 100)
    vol = 100;
  volx = Math.pow(100 - vol, 2) / -2.5;
  if (delta != 0) {
    if ( (document.all || this.isGecko) && (!this.isOpera) )
      this.playerObj.volume = volx;
    else
      this.playerObj.SetVolume(volx);
  }

  if (!this.digit1Obj)
    return;

  var volStr = (vol < 10 ? "# " : "#") + vol + " #";
  var digitStr = volStr.substring(1,2);
  if (digitStr == " ") digitStr = "leer";
  var oldsrc = this.digit1Obj.src;
  var pos = oldsrc.indexOf("digit");
  this.digit1Obj.src = oldsrc.substring(0, pos) + "digit_" + digitStr + ".gif";
  oldsrc = this.digit2Obj.src;
  pos = oldsrc.indexOf("digit");
  this.digit2Obj.src = oldsrc.substring(0, pos) + "digit_" + volStr.substring(2,3) + ".gif";
  var digitStr = volStr.substring(3,4);
  if (digitStr == " ") digitStr = "leer";
  oldsrc = this.digitmObj.src;
  pos = oldsrc.indexOf("digit");
  this.digitmObj.src = oldsrc.substring(0, pos) + "digitm_" + digitStr + ".gif";
}

function WindowsMediaPlayerChangeMute(toggle) {
  if (!this.playerObj)
    return;

  var muteState;
  if ( (document.all || this.isGecko) && (!this.isOpera) )
    muteState = this.playerObj.mute;
  else
  {
    if (!eval(this.playerObj.GetMute))
      return;
    muteState = this.playerObj.GetMute();
  }
  
  if (toggle) {
    muteState = !muteState;
    if ( (document.all || this.isGecko) && (!this.isOpera))    
      this.playerObj.mute = muteState;
    else
      this.playerObj.SetMute(muteState);
  }

  if (!this.muteObj)
    return;

  var muteStr = (muteState ? "mton.gif" : "mtoff.gif");
  var oldsrc = this.muteObj.src;
  var pos = oldsrc.lastIndexOf("mto");
  if (pos >= 0)
    this.muteObj.src = oldsrc.substring(0, pos) + muteStr;
}

function WindowsMediaPlayerSetPosition(pos) {

  if (!this.playerObj)
    return;

  var start=0;
 
  if ( (document.all || this.isGecko) && (!this.isOpera) ) {
    if (this.playerObj.IsBroadCast)
      return;
    start = this.playerObj.SelectionStart;
  }
  else {
    if (!eval(this.playerObj.GetSelectionStart))
      return;
    start = this.playerObj.GetSelectionStart();
  }

  if (start < 0)
    start = 0;

  if ( (document.all || this.isGecko) && (!this.isOpera) ) {
    this.playerObj.CurrentPosition = start + (pos / 1000);
  }
  else {
    this.playerObj.SetCurrentPosition(start + (pos / 1000));
  }

  this.play();
}

function WindowsMediaPlayerGetPosition() {

  if (!this.playerObj)
    return 0;

  var start=0;
 
  if ( (document.all || this.isGecko) && (!this.isOpera) ) {
    if (this.playerObj.IsBroadCast)
      return -1;
	// Opera 7.2 seems to have a problem with the player plugin;
	// sometimes the player object is undefined at this point, although
	// there has been a check at the beginning of this function
    if (! this.playerObj ) 
    	return 0;

    start = this.playerObj.SelectionStart;
  }
  else {
    if(!eval(this.playerObj.GetSelectionStart))
      start = 0;
    else
      start = this.playerObj.GetSelectionStart();
  }
  
  if (start < 0)
    start = 0;
  var currPos = 0;
  if ( (document.all || this.isGecko) && (!this.isOpera) )
    currPos = this.playerObj.CurrentPosition;
  else
  {
    if (!eval(this.playerObj.GetCurrentPosition))
      currPos = 0;
    else
      currPos = this.playerObj.GetCurrentPosition();
  }
  
  currPos -= start;
  if (currPos < 0)
    currPos = 0;

 return  Math.floor(currPos * 1000);

}

function WindowsMediaPlayerShowPosition() {

  if (!this.playerObj || !this.posName)
    return;

  var relPos = this.getRelPosition() * 20;
  for (var ii = 0; ii < 20; ii++) {
    if (ii < relPos)
      turnAct(this.posName + ii);
    else
      turnOff(this.posName + ii);
  }
}


function WindowsMediaPlayerGetLength() {
  if (!this.playerObj)
    return;
  if ( (document.all || this.isGecko) && (!this.isOpera) ) {
    return eval(this.playerObj.Duration)*1000;
  }
  else {
    if(!eval(this.playerObj.GetDuration))
      return -1;
    return eval(this.playerObj.GetDuration())*1000;
  }
}


function WindowsMediaPlayerNextClip() {
  if (!this.playerObj)
    return;

  this.playerObj.Next();                    //does not work yet
}


function WindowsMediaPlayerPrevClip() {
  if (!this.playerObj)
    return;

  this.playerObj.Previous();                //does not work yet
}


function WindowsMediaPlayerGetNumClips() {
  if (!this.playerObj)
    return;

  var returnValue;

  if ( document.all ) {
    return this.playerObj.EntryCount;
  }
  else {
    return this.playerObj.GetStreamCount();    //does not work yet for netscape
  }
}


function WindowsMediaPlayerGetCurrentClip(array) {
  if (!this.playerObj)
    return;
  if ( document.all ) {
    return this.playerObj.GetCurrentEntry();
  }
  else {
//    return this.playerObj.GetCurrentEntry();       //does not work yet
  }
}


function WindowsMediaPlayerSetCurrentClip(entry) {
  if (!this.playerObj)
    return;

  if ( entry == this.getCurrentClip() ) return;

  if ( entry < 1 ) entry = 1;

  if ( document.all ) {
    var numOfClips = this.getNumClips();
    if ( entry > numOfClips ) entry = numOfClips;

    this.playerObj.SetCurrentEntry(entry);
  }
  else {
//    this.playerObj.SetCurrentEntry(entry);      //does not work yet for Netscape yet
  }
}

						// does not work yet properly
function WindowsMediaPlayerSetMultiClipIvod(pos, array) {

  if (!this.playerObj)
    return;

  var lowerBorder = 0;
  var upperBorder = 0;
  var entry = 0;

  for ( var i = 0; i < array.length; i++ ) {
    ++entry;
    lowerBorder  = upperBorder;
    upperBorder += array[i];

//    prompt("LB: " + lowerBorder + " POS " + pos + " UB " + upperBorder);

    if ( pos > lowerBorder && pos < upperBorder ) break;
  }

  this.stop();

  this.setCurrentClip(entry);

//  prompt("Requested pos:  " + pos + "  REAL POS: " + this.getPosition());
  this.setPosition(pos - lowerBorder);
//  prompt("CE2: " + this.getCurrentClip() + " CURR POS: " + this.getPosition());

  this.play();
}


function WindowsMediaPlayerCheckBuffering() {
  if (!this.playerObj)
    return;
  
  var state = 0;
  var buffPercent = 0;
  if(document.all)
  {
    state = this.playerObj.PlayState - 0;
    buffPerc = this.playerObj.BufferingProgress - 0;
  } 
  else 
  {
    if (!eval(this.playerObj.GetPlayState))
    {
      this.loopFunction(false);
      return;
    }
    state = this.playerObj.GetPlayState() - 0;
    buffPerc = this.playerObj.GetBufferingProgress() - 0;
  }
  
  this.loopFunction(state > 2 || (buffPerc > 0 && buffPerc < 100));
}


function WindowsMediaPlayerIsPlaying() {
  if (!this.playerObj)
    return;

  var state;

  if ( (document.all || this.isGecko ) && (!this.isOpera) ) {
    state = this.playerObj.PlayState;
  }
  else
  {
    if(!eval(this.playerObj.GetPlayState))
      return;
    state = this.playerObj.GetPlayState();
  }
  
  return (state == 2);
}

function WindowsMediaPlayerIsPaused() {
  if (!this.playerObj)
    return;

  var state;

  if ( (document.all || this.isGecko ) && (!this.isOpera) ) {
    state = this.playerObj.PlayState;
  }
  else
  {
    if(!eval(this.playerObj.GetPlayState))
      return;
    state = this.playerObj.GetPlayState();
  }
  
  return (state == 1);
}

function WindowsMediaPlayerIsStopped() {
  if (!this.playerObj)
    return;

  var state;

  if ( (document.all || this.isGecko ) && (!this.isOpera) ) {
    state = this.playerObj.PlayState;
  }
  else
  {
    if(!eval(this.playerObj.GetPlayState))
      return;
    state = this.playerObj.GetPlayState();
  }
  return (state == 0);
}


function WindowsMediaPlayerSetFullScreen() {

	if (!this.playerObj)
	  return;
	if (document.all) 
	{
  	this.playerObj.DisplaySize=3;
  	this.play();
  }
  else
  {
    if(!eval(this.playerObj.SetDisplaySize))
      return;
  	this.playerObj.SetDisplaySize(3);
  }
}

function WindowsMediaPlayerGetBufferingProgress() {
  if (!this.playerObj)
    return;
  
  if (document.all) {
    return parseInt(this.playerObj.BufferingProgress,10);
  }
  else {
    return -1;
  }
}

WindowsMediaPlayer.prototype.getLength        = WindowsMediaPlayerGetLength;
WindowsMediaPlayer.prototype.nextClip         = WindowsMediaPlayerNextClip;
WindowsMediaPlayer.prototype.prevClip         = WindowsMediaPlayerPrevClip;
WindowsMediaPlayer.prototype.getNumClips      = WindowsMediaPlayerGetNumClips;
WindowsMediaPlayer.prototype.getCurrentClip   = WindowsMediaPlayerGetCurrentClip;
WindowsMediaPlayer.prototype.setCurrentClip   = WindowsMediaPlayerSetCurrentClip;
WindowsMediaPlayer.prototype.setMultiClipIvod = WindowsMediaPlayerSetMultiClipIvod;

WindowsMediaPlayer.prototype.go             = WindowsMediaPlayerGo;
WindowsMediaPlayer.prototype.setGecko       = WindowsMediaPlayerSetGecko;
WindowsMediaPlayer.prototype.setOpera       = WindowsMediaPlayerSetOpera;
WindowsMediaPlayer.prototype.doIt           = WindowsMediaPlayerDoIt;
WindowsMediaPlayer.prototype.init           = WindowsMediaPlayerInit;
WindowsMediaPlayer.prototype.loop           = WindowsMediaPlayerLoop;
WindowsMediaPlayer.prototype.play           = WindowsMediaPlayerPlay;
WindowsMediaPlayer.prototype.pause          = WindowsMediaPlayerPause;
WindowsMediaPlayer.prototype.stop           = WindowsMediaPlayerStop;
WindowsMediaPlayer.prototype.halt           = WindowsMediaPlayerHalt;
WindowsMediaPlayer.prototype.changeVolume   = WindowsMediaPlayerChangeVolume;
WindowsMediaPlayer.prototype.changeMute     = WindowsMediaPlayerChangeMute;
WindowsMediaPlayer.prototype.setPosition    = WindowsMediaPlayerSetPosition;
WindowsMediaPlayer.prototype.getPosition    = WindowsMediaPlayerGetPosition;
WindowsMediaPlayer.prototype.setRelPosition = WindowsMediaPlayerSetRelPosition;
WindowsMediaPlayer.prototype.getRelPosition = WindowsMediaPlayerGetRelPosition;
WindowsMediaPlayer.prototype.showPosition   = WindowsMediaPlayerShowPosition;
WindowsMediaPlayer.prototype.checkBuffering = WindowsMediaPlayerCheckBuffering;
WindowsMediaPlayer.prototype.isPlaying    	= WindowsMediaPlayerIsPlaying;
WindowsMediaPlayer.prototype.isPaused     	= WindowsMediaPlayerIsPaused;
WindowsMediaPlayer.prototype.isStopped    	= WindowsMediaPlayerIsStopped;
WindowsMediaPlayer.prototype.docPrefix      = (document.all ? "document.all." : "document.");
WindowsMediaPlayer.prototype.getBufferingProgress = WindowsMediaPlayerGetBufferingProgress;
WindowsMediaPlayer.prototype.setFullScreen  = WindowsMediaPlayerSetFullScreen;