/**
 * 
 * Copyright (C) 2003 - 2007 by WebMinster ( www.webminster.org )
 *
 * ***** BEGIN LGPL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 
 *
 * ***** END LGPL LICENSE BLOCK *****
 *
 * Where to find LGPL:
 * - LIB_DIR/docs/LGPL-license.txt (version 2.1)
 * - http://www.gnu.org/licenses/lgpl.html (current version)
 *
 * Contributor(s):
 * 
 *   Name                       Email
 * - Markus Langlotz            http://www.webminster.org/contact
 * - Johannes Langlotz          http://www.webminster.org/contact
 * 
 */
 
/**
 * SWFObject v1.5.1: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */
if(typeof deconcept == "undefined") var deconcept = {};
if(typeof deconcept.util == "undefined") deconcept.util = {};
if(typeof deconcept.SWFObjectUtil == "undefined") deconcept.SWFObjectUtil = {};
deconcept.SWFObject = function(swf, id, w, h, ver, c, quality, xiRedirectUrl, redirectUrl, detectKey) {
  if (!document.getElementById) { return; }
  this.DETECT_KEY = detectKey ? detectKey : 'detectflash';
  this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY);
  this.params = {};
  this.variables = {};
  this.attributes = [];
  if(swf) { this.setAttribute('swf', swf); }
  if(id) { this.setAttribute('id', id); }
  if(w) { this.setAttribute('width', w); }
  if(h) { this.setAttribute('height', h); }
  if(ver) { this.setAttribute('version', new deconcept.PlayerVersion(ver.toString().split("."))); }
  this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion();
  if (!window.opera && document.all && this.installedVer.major > 7) {
    // only add the onunload cleanup if the Flash Player version supports External Interface and we are in IE
    // fixes bug in some fp9 versions see http://blog.deconcept.com/2006/07/28/swfobject-143-released/
    if (!deconcept.unloadSet) {
      deconcept.SWFObjectUtil.prepUnload = function() {
        __flash_unloadHandler = function(){};
        __flash_savedUnloadHandler = function(){};
        window.attachEvent("onunload", deconcept.SWFObjectUtil.cleanupSWFs);
      }
      window.attachEvent("onbeforeunload", deconcept.SWFObjectUtil.prepUnload);
      deconcept.unloadSet = true;
    }
  }
  if(c) { this.addParam('bgcolor', c); }
  var q = quality ? quality : 'high';
  this.addParam('quality', q);
  this.setAttribute('useExpressInstall', false);
  this.setAttribute('doExpressInstall', false);
  var xir = (xiRedirectUrl) ? xiRedirectUrl : window.location;
  this.setAttribute('xiRedirectUrl', xir);
  this.setAttribute('redirectUrl', '');
  if(redirectUrl) { this.setAttribute('redirectUrl', redirectUrl); }
}
deconcept.SWFObject.prototype = {
  useExpressInstall: function(path) {
    this.xiSWFPath = !path ? "expressinstall.swf" : path;
    this.setAttribute('useExpressInstall', true);
  },
  setAttribute: function(name, value){
    this.attributes[name] = value;
  },
  getAttribute: function(name){
    return this.attributes[name] || "";
  },
  addParam: function(name, value){
    this.params[name] = value;
  },
  getParams: function(){
    return this.params;
  },
  addVariable: function(name, value){
    this.variables[name] = value;
  },
  getVariable: function(name){
    return this.variables[name] || "";
  },
  getVariables: function(){
    return this.variables;
  },
  getVariablePairs: function(){
    var variablePairs = [];
    var key;
    var variables = this.getVariables();
    for(key in variables){
      variablePairs[variablePairs.length] = key +"="+ variables[key];
    }
    return variablePairs;
  },
  getSWFHTML: function() {
    var swfNode = "";
    if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { // netscape plugin architecture
      if (this.getAttribute("doExpressInstall")) {
        this.addVariable("MMplayerType", "PlugIn");
        this.setAttribute('swf', this.xiSWFPath);
      }
      swfNode = '<embed type="application/x-shockwave-flash" src="'+ this.getAttribute('swf') +'" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ (this.getAttribute('style') || "") +'"';
      swfNode += ' id="'+ this.getAttribute('id') +'" name="'+ this.getAttribute('id') +'" ';
      var params = this.getParams();
       for(var key in params){ swfNode += [key] +'="'+ params[key] +'" '; }
      var pairs = this.getVariablePairs().join("&");
       if (pairs.length > 0){ swfNode += 'flashvars="'+ pairs +'"'; }
      swfNode += '/>';
    } else { // PC IE
      if (this.getAttribute("doExpressInstall")) {
        this.addVariable("MMplayerType", "ActiveX");
        this.setAttribute('swf', this.xiSWFPath);
      }
      swfNode = '<object id="'+ this.getAttribute('id') +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ (this.getAttribute('style') || "") +'">';
      swfNode += '<param name="movie" value="'+ this.getAttribute('swf') +'" />';
      var params = this.getParams();
      for(var key in params) {
       swfNode += '<param name="'+ key +'" value="'+ params[key] +'" />';
      }
      var pairs = this.getVariablePairs().join("&");
      if(pairs.length > 0) {swfNode += '<param name="flashvars" value="'+ pairs +'" />';}
      swfNode += "</object>";
    }
    return swfNode;
  },
  write: function(elementId){
    if(this.getAttribute('useExpressInstall')) {
      // check to see if we need to do an express install
      var expressInstallReqVer = new deconcept.PlayerVersion([6,0,65]);
      if (this.installedVer.versionIsValid(expressInstallReqVer) && !this.installedVer.versionIsValid(this.getAttribute('version'))) {
        this.setAttribute('doExpressInstall', true);
        this.addVariable("MMredirectURL", escape(this.getAttribute('xiRedirectUrl')));
        document.title = document.title.slice(0, 47) + " - Flash Player Installation";
        this.addVariable("MMdoctitle", document.title);
      }
    }
    if(this.skipDetect || this.getAttribute('doExpressInstall') || this.installedVer.versionIsValid(this.getAttribute('version'))){
      var n = (typeof elementId == 'string') ? document.getElementById(elementId) : elementId;
      n.innerHTML = this.getSWFHTML();
      return true;
    }else{
      if(this.getAttribute('redirectUrl') != "") {
        document.location.replace(this.getAttribute('redirectUrl'));
      }
    }
    return false;
  }
}

/* ---- detection functions ---- */
deconcept.SWFObjectUtil.getPlayerVersion = function(){
  var PlayerVersion = new deconcept.PlayerVersion([0,0,0]);
  if(navigator.plugins && navigator.mimeTypes.length){
    var x = navigator.plugins["Shockwave Flash"];
    if(x && x.description) {
      PlayerVersion = new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));
    }
  }else if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0){ // if Windows CE
    var axo = 1;
    var counter = 3;
    while(axo) {
      try {
        counter++;
        axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+ counter);
//        document.write("player v: "+ counter);
        PlayerVersion = new deconcept.PlayerVersion([counter,0,0]);
      } catch (e) {
        axo = null;
      }
    }
  } else { // Win IE (non mobile)
    // do minor version lookup in IE, but avoid fp6 crashing issues
    // see http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/
    try{
      var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
    }catch(e){
      try {
        var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
        PlayerVersion = new deconcept.PlayerVersion([6,0,21]);
        axo.AllowScriptAccess = "always"; // error if player version < 6.0.47 (thanks to Michael Williams @ Adobe for this code)
      } catch(e) {
        if (PlayerVersion.major == 6) {
          return PlayerVersion;
        }
      }
      try {
        axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
      } catch(e) {}
    }
    if (axo != null) {
      PlayerVersion = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));
    }
  }
  return PlayerVersion;
}
deconcept.PlayerVersion = function(arrVersion){
  this.major = arrVersion[0] != null ? parseInt(arrVersion[0]) : 0;
  this.minor = arrVersion[1] != null ? parseInt(arrVersion[1]) : 0;
  this.rev = arrVersion[2] != null ? parseInt(arrVersion[2]) : 0;
}
deconcept.PlayerVersion.prototype.versionIsValid = function(fv){
  if(this.major < fv.major) return false;
  if(this.major > fv.major) return true;
  if(this.minor < fv.minor) return false;
  if(this.minor > fv.minor) return true;
  if(this.rev < fv.rev) return false;
  return true;
}
/* ---- get value of query string param ---- */
deconcept.util = {
  getRequestParameter: function(param) {
    var q = document.location.search || document.location.hash;
    if (param == null) { return q; }
    if(q) {
      var pairs = q.substring(1).split("&");
      for (var i=0; i < pairs.length; i++) {
        if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
          return pairs[i].substring((pairs[i].indexOf("=")+1));
        }
      }
    }
    return "";
  }
}
/* fix for video streaming bug */
deconcept.SWFObjectUtil.cleanupSWFs = function() {
  var objects = document.getElementsByTagName("OBJECT");
  for (var i = objects.length - 1; i >= 0; i--) {
    objects[i].style.display = 'none';
    for (var x in objects[i]) {
      if (typeof objects[i][x] == 'function') {
        objects[i][x] = function(){};
      }
    }
  }
}
/* add document.getElementById if needed (mobile IE < 5) */
if (!document.getElementById && document.all) { document.getElementById = function(id) { return document.all[id]; }}

var SWFObject = deconcept.SWFObject;

// RELEASE-TODO: Java-Script API changed! Update WIKI-Documentation (Remote & RemoteAPI)!

/** Definition of Vanadium */
if(typeof org                               == "undefined")
  var org = {};
if(typeof org.webminster                    == "undefined")
  org.webminster = {};
if(typeof org.webminster.VanadiumInstances  == "undefined")
{ 
  org.webminster.VanadiumInstances = {};
  org.webminster.VanadiumInstances.notifyInstance = function(sId, iEventType)
  {
    if( org.webminster.VanadiumInstances[sId] != null )
    {
    	org.webminster.VanadiumInstances[sId]._notify(iEventType);
    }
  }
}
  

if(typeof org.webminster.Vanadium  == "undefined")
{ 
  org.webminster.Vanadium = function( sBinarySrc, sSrc, iWidth, iHeight, sAutoStart, sLoop, sRandom, sPreviewPath, sRemoteCtrl, sDebug, sId )
  {    
    if(sBinarySrc)
    { this.setAttribute('swf', sBinarySrc); }  
    
    if(iWidth)
    { this.setAttribute('width', iWidth); }
    else
    { this.setAttribute('width', 240); }
    
    if(iHeight)
    { this.setAttribute('height', iHeight); }
    else
    { this.setAttribute('height', 64); }
    
    if(!sId)
    { sId = 'Vanadium'; }
    this.setAttribute('id', sId);
  
    this.addParam("movie", sBinarySrc);
    this.addParam("menu", "false");
    this.addParam("scale", "noscale");
    this.addParam("bgcolor", "#DDDDDD");
    
    this.addVariable("src", sSrc);
    this.addVariable("autostart", sAutoStart);
    this.addVariable("loop", sLoop);
    this.addVariable("random", sRandom);
    this.addVariable("preview", sPreviewPath);
    this.addVariable("remote", sRemoteCtrl);
    this.addVariable("debug", sDebug);
    
    org.webminster.VanadiumInstances[sId] = this;
    
    ////////////////////////////////////////////////////////////////////////////
    // private members
    ////////////////////////////////////////////////////////////////////////////
    var m_fEventHandler = null;
    
    ////////////////////////////////////////////////////////////////////////////
    // public members
    ////////////////////////////////////////////////////////////////////////////
    
    ////////////////////////////////////////////////////////////////////////////
    // private methods
    ////////////////////////////////////////////////////////////////////////////
    function waitUntilCalled( )
    {
      //TODO: check whether "jsCalled" was set to "" by flash movie.
    }
    
    ////////////////////////////////////////////////////////////////////////////
    // public methods
    ////////////////////////////////////////////////////////////////////////////
    // write(string sParentId) is inherited from SWFObject
    
    // returns the DOM object node of the webplayer
    this._getPlayerDOM = function( )
    {
      var id = this.getAttribute('id');
      var player = window.document[id];
      return player;
    }
    
    // binds the instance of vanadium to the player, which has the id sId
    this.setId = function( sId )
    {
    	org.webminster.VanadiumInstances[this.getAttribute('id')] = null;
    	org.webminster.VanadiumInstances[sId] = this;
      this.setAttribute('id', sId);
    }
    
    // starts playing current playlist entry
    this.play = function()
    {
      this._getPlayerDOM().SetVariable("jsCalled", "play");
      waitUntilCalled();
    }
    
    // pauses playing current playlist entry
    this.pause = function()
    {
      this._getPlayerDOM().SetVariable("jsCalled", "pause");
      waitUntilCalled();
    }
    
    // stops playing current playlist entry
    this.stop = function()
    {
      this._getPlayerDOM().SetVariable("jsCalled", "stop");
      waitUntilCalled();
    }
      
    // sets Position of current played entry to iPos (in ms)
    this.setPosition = function( iPos )
    {
      this._getPlayerDOM().SetVariable("jsValue", iPos);
      this._getPlayerDOM().SetVariable("jsCalled", "setPosition");
      waitUntilCalled();
    }
      
    // sets volume of current played entry to iVol (in %)
    this.setVolume = function( iVol )
    {
      this._getPlayerDOM().SetVariable("jsValue", iVol);
      this._getPlayerDOM().SetVariable("jsCalled", "setVolume");
      waitUntilCalled();
    }
      
    // increases volume of current played entry by iVol (in %)
    this.incVolume = function( iVol )
    {
      this._getPlayerDOM().SetVariable("jsValue", iVol);
      this._getPlayerDOM().SetVariable("jsCalled", "incVolume");
      waitUntilCalled();
    }
      
    // decreases volume of current played entry by iVol (in %)
    this.decVolume = function( iVol )
    {
      this._getPlayerDOM().SetVariable("jsValue", iVol);
      this._getPlayerDOM().SetVariable("jsCalled", "decVolume");
      waitUntilCalled();
    }
      
    // continues with the next song in playlist
    this.next = function()
    {
      this._getPlayerDOM().SetVariable("jsCalled", "next");
      waitUntilCalled();
    }
      
    // returns to the previous song in playlist or restarts current song
    // if position of song is less than 4000ms
    this.prev = function()
    {
      this._getPlayerDOM().SetVariable("jsCalled", "prev");
      waitUntilCalled();
    }
      
    // proceeds to the iEntryPos-th playlist-entry
    // goto is reserved to JavaScript language syntax!
    this.gotoEntry = function( iEntryPos )
    {
      this._getPlayerDOM().SetVariable("jsValue", iEntryPos);
      this._getPlayerDOM().SetVariable("jsCalled", "gotoEntry");
      waitUntilCalled();
    }
      
    // opens an info window displaying information about the WebPlayer
    this.openInfoWindow = function()
    {
      this._getPlayerDOM().SetVariable("jsCalled", "openInfoWindow");
      waitUntilCalled();
    }
      
    // registers method fEventHandler. This function will be called every
    // time an event occurres inside the WebPlayer. The function call contains 
    // a parameter defining the EventType which occured.
    //
    // All possible EventTypes are defined below.
    // @see org.webminster.Vanadium.prototype.LOAD_STATUS_CHANGED
    // Please use those constants within your code as numbers might change in
    // future!
    //   
    this.registerEventHandler = function(fEventHandler)
    {
      if( typeof fEventHandler != "function" )
      { return false; }
      
      m_fEventHandler = fEventHandler;            
      
      this._getPlayerDOM().SetVariable("jsValue", this.getAttribute('id'));
      this._getPlayerDOM().SetVariable("jsCalled", "attachObserver");
      waitUntilCalled();
    }
    
    // deregisters registered function
    this.deregisterEventHandler = function()
    {      
      m_fEventHandler = null;            
      
      this._getPlayerDOM().SetVariable("jsValue", this.getAttribute('id'));
      this._getPlayerDOM().SetVariable("jsCalled", "detachObserver");
      waitUntilCalled();
    }
    
    // used to notify this player (not for public use!)
    this._notify = function(iEventType)
    {
    	if( null != m_fEventHandler )
    	{
    		m_fEventHandler(iEventType);
    	} // if( null != m_fEventHandler )
    }
    
    // used to retrieve public (_root) variables from player (not for public use!)
    this._playerVar = function(sVarName)
    {
      var player = this._getPlayerDOM();
      return player.GetVariable(sVarName);
    }
  }
} // if(typeof org.webminster  == "undefined")
  
org.webminster.Vanadium.prototype                       = new SWFObject();
org.webminster.Vanadium.prototype.LibVersion            = "2.5b3";

org.webminster.Vanadium.prototype.LOAD_STATUS_CHANGED   = 1;
org.webminster.Vanadium.prototype.GLOBAL_STATE_CHANGED  = 2;
org.webminster.Vanadium.prototype.LOADER_STATE_CHANGED  = 3;

org.webminster.Vanadium.prototype.POSITION_CHANGED      = 4;
org.webminster.Vanadium.prototype.CURRENT_ENTRY_CHANGED = 7;
org.webminster.Vanadium.prototype.FILE_INFO_CHANGED     = 5;
org.webminster.Vanadium.prototype.PLAYLIST_CHANGED      = 6;

org.webminster.Vanadium.prototype.DISPLAY_FILE_INFO     = 8;
org.webminster.Vanadium.prototype.DISPLAY_PLAYER_INFO   = 9;
org.webminster.Vanadium.prototype.DISPLAY_MOVIE         = 10;

if(typeof org.webminster.Playlist  == "undefined")
{
  org.webminster.Playlist = function( )
  {
    ////////////////////////////////////////////////////////////////////////////
    // private members
    ////////////////////////////////////////////////////////////////////////////
    
    ////////////////////////////////////////////////////////////////////////////
    // public members
    ////////////////////////////////////////////////////////////////////////////
    
    ////////////////////////////////////////////////////////////////////////////
    // private methods
    ////////////////////////////////////////////////////////////////////////////
    
    ////////////////////////////////////////////////////////////////////////////
    // public methods
    ////////////////////////////////////////////////////////////////////////////
  }
}
