/*
 * GovVid object, developed by the Dutch Ministry of Health, Welfare and Sport and 'Werkgroep Stijlgids' of the New Media Commission (CNM)
 * inspired on:
 *    - swfobject (http://blog.deconcept.com/swfobject/)
 *    - GTObject (http://blog.deconcept.com/2005/01/26/web-standards-compliant-javascript-quicktime-detect-and-embed/)
 *
 * Authors:			Marc Gerritsen (m.gerritsen@minvws.nl) and Michael Wijnakker (m.wijnakker@minvws.nl)
 * Version:			0.8 (22-07-2008)
 * Works on:		Internet Explorer 6/7, Firefox 1.5/2/3, Safari 2/3, Opera 9
 * Description:		Can detect flash version and sees if Quicktime is installed
 *					Generates correct HTML for embedded movie and audio
 *					Can replace a HTML element with the movie/audio html
 *
 *
 * Usage:
 *     myMovie = new GovVid("id", width, height);
 *     myMovie.addMovie("filename"); // supports mov, mp4, wmv, flv, smil
 *     mymovie.addImage("filename"); // adds start image for flv player, only for movies
 *     for flv use path from flvplayer file
 *     myMovie.addCaption("flv","filename"); //adds caption file for flv player, only for movies
 *     myMovie.addAudio("filename"); //supports mp3, can display single mp3 file without movie, or add mp3 as audio description for flvmovie
 *     myMovie.write("htmlelementid"); // script puts movie html inside html element
 *
 * Changes:
 *  (5-11-2007)		- added movieObject.addFlashVars("usecaptions","false"); on line 149
 *  (11-12-2007)	- added addAudio function for adding mp3 files
 *  				- changed function names to prevent problems when using javascript frameworks like prototype.js
 *  				- replaced Flvplayer for Mediaplayer from Jeroen Wijering (can also play single mp3 files)
 *  (22-07-2007)    - Changed innerHTML for correct DOM scripting.
 *                  - added support for embedded smil (so you can use mp4/mov with captions in the quicktime player )
 */

 // change these filenames if you want to use different files
 // leave empty if you don't need asp files
var contentDispositionFile = "content-disposition.asp";
var statisticsFile = "statistics/statistics.asp";
var mediaplayerFile = "flash/mediaplayer.swf";
var govvidOpera = window.opera ? true : false;
var govvidIE = (document.all && document.getElementById && !govvidOpera) ? true : false;
var govvidSafari = (navigator.userAgent.toLowerCase().indexOf('safari') >= 0) ? true : false;
var debug = false;


var arFileTypes = new Array();
arFileTypes["jwmedia"]		= new Array("flv","mp3");
arFileTypes["quicktime"]	= new Array("smil","mp4", "mov","mp3");
arFileTypes["winmedia"]		= new Array("wmv","mp3","wma");



 //GovVid object
 GovVid = function(id, width, height) {
  this.id = id;
  this.width = width;
  this.height = height;
  this.movies = new Object();
  this.audioFiles = new Object();
  this.captions = new Object();
  this.image = "";
 }

//add movie function, adds movie to object, myMovie.addMovie("filename");
GovVid.prototype.addMovie = function(filename) {
   var temp = filename.split("/");
   var thefile = temp[temp.length - 1];
   var file = thefile.split(".");
   var type = file[file.length - 1];
   this.movies[type] = filename;
}

//add movie function, adds movie to object, myMovie.addMovie("filename");
GovVid.prototype.addAudio = function(filename) {
   var temp = filename.split("/");
   var thefile = temp[temp.length - 1];
   var file = thefile.split(".");
   var type = file[file.length - 1];
   this.audioFiles[type] = filename;
}


//adds image to object, myMovie.addImage("filename");
GovVid.prototype.addImage = function(filename) {
  this.image = filename;
}

//adds caption to object, myMovie.addCaption("flv","filename");
GovVid.prototype.addCaption = function(type, filename) {
  this.captions[type] = filename;
}

GovVid.prototype.inArray = function (needleArray,haystackArray) {
  var key;
  var key2;
  for(key in haystackArray)
    for(key2 in needleArray)
      if(key == needleArray[key2])
        return key;
  return false;
}

//writes correct movie to html element
GovVid.prototype.write = function(elementid, movietype) {

    movietype = typeof(movietype) != 'undefined' ? movietype : "choose";
      //get element with id
        var element = document.getElementById(elementid);
    if (element && movietype == "choose") {
      //set with to parentnode - TODO: maybe only on li elements
      element.parentNode.style.width = parseInt(this.width) + "px";
        GovVid_makeListToggle(elementid);
    } else if (movietype != "choose") {
      //delete vieuwCaptions element if exists
      var viewCap = document.getElementById('govvid_viewwithcaptions');
      if(viewCap) viewCap.parentNode.removeChild(viewCap);
    }

    var display = false;
    var version = GovVid_getFlashPlayerVersion();
    var height;
    var testarray = new Array();

    if(version.major > 7 && (movietype == "choose" || GovVid_in_array(arFileTypes["jwmedia"],movietype))) {
      if(mediaplayerFile == undefined || mediaplayerFile == "") {
        alert("voor het afspelen met de flash plugin, is de jwmediaplayer vereist.\n vul de variable mediaplayerFile met de juiste waarde.");
        return false;
      }
      height = parseInt(this.height) + 20;
      if(display = this.inArray(arFileTypes["jwmedia"],this.movies)) {

        var movieObject = new GovVidMovie(mediaplayerFile, this.id, this.width, height);
        movieObject.addFlashVars("autostart", "false");
         // set image if there is a image defined
         if(this.image != "") movieObject.addFlashVars("image", this.image);
         // set caption if there is caption
         if (this.captions["flv"] != undefined) movieObject.addFlashVars("captions", this.captions["flv"]);
        if (this.audioFiles["mp3"] != undefined) movieObject.addFlashVars("audio", this.audioFiles["mp3"]);

        movieObject.addFlashVars("usecaptions","false");
               movieObject.addFlashVars("overstretch","false");
        movieObject.addFlashVars("file", this.movies[display]); //path from flash file location

        if(statisticsFile != undefined && statisticsFile != "") {
            movieObject.addFlashVars("callback",statisticsFile);
             movieObject.addFlashVars("logevents",statisticsFile);
         }

         movieObject.addFlashVars("showdigits","total");
           movieObject.addFlashVars("showbuttons","true");
        movieObject.addFlashVars("showstop","true");
         movieObject.addFlashVars("bufferlength","5");
         movieObject.addFlashVars("backcolor","0x000000");
         movieObject.addFlashVars("frontcolor","0xFFFFFF");
         movieObject.addFlashVars("lightcolor","0xFFFFFF");
         movieObject.showMovie(elementid,"flash");
        //element.innerHTML = movieObject.getFlashHTML();
        return true;
      }
      else if(display = this.inArray(arFileTypes["jwmedia"],this.audioFiles)) {
        var audioObject = new GovVidMovie(mediaplayerFile, this.id, this.width, height);
        audioObject.addFlashVars("file", this.audioFiles[display]); //path from flash file location

        if(statisticsFile != undefined && statisticsFile != "") {
            audioObject.addFlashVars("callback",statisticsFile);
            audioObject.addFlashVars("logevents",statisticsFile);
         }

         audioObject.addFlashVars("showdigits","total");
           audioObject.addFlashVars("showbuttons","true");
        audioObject.addFlashVars("showstop","true");
         audioObject.addFlashVars("bufferlength","5");
         audioObject.addFlashVars("backcolor","0x000000");
         audioObject.addFlashVars("frontcolor","0xFFFFFF");
         audioObject.addFlashVars("lightcolor","0xFFFFFF");
         audioObject.showMovie(elementid,"flash");
        return true;
      }
    }
    if(!GovVid_isQTInstalled() && GovVid_in_array(arFileTypes["quicktime"],movietype)) alert("Geen instalatie van quicktime gevonden.");
    if (GovVid_isQTInstalled() && !display && (movietype == "choose" || GovVid_in_array(arFileTypes["quicktime"],movietype))) {
      // Toon quicktime
      height = parseInt(this.height) + 16;
      if(movietype != "choose") display = movietype;
      else display = this.inArray(arFileTypes["quicktime"],this.movies);
      if(display) {
        if(display == "smil") height = parseInt(this.height) + 115;
        var movieObject = new GovVidMovie(this.movies[display], this.id, this.width, height);
      }
      else if(display = this.inArray(arFileTypes["quicktime"],this.audioFiles)) {
        var movieObject = new GovVidMovie(this.audioFiles[display], this.id, this.width, height);
      }

      if (movieObject) {
        movieObject.showMovie(elementid, "quicktime");
        return true
      }
    }
    if (!display && (movietype == "choose" || GovVid_in_array(arFileTypes["winmedia"],movietype))) {
      // Toon windows media player
      height = parseInt(this.height) + 46;
      if(display = this.inArray(arFileTypes["winmedia"],this.movies)) {
        var movieObject = new GovVidMovie(this.movies[display], this.id, this.width, height);
      }
      else if(display = this.inArray(arFileTypes["winmedia"],this.audioFiles)) {
        var movieObject = new GovVidMovie(this.audioFiles[display], this.id, this.width, height);
      }
      if (movieObject) {
        movieObject.showMovie(elementid, "winmedia");

        if(this.movies["asx"]) {
          //add link
          GovVid_addLinkToList(element, this.movies["asx"], "Bekijk deze video met ondertiteling");
        }

        return true;
      }
    }

    return false;

}

// movie object and functions
GovVidMovie = function(filename, id, width, height) {
  this.filename = filename;
  this.id = id;
  this.width = width;
  this.height = height;
  this.flashvars = new Object();
};

// function to add flash variables to object
GovVidMovie.prototype.addFlashVars = function(name, value) {
  this.flashvars[name] = value;
}

// function that is used by other functions
GovVidMovie.prototype.getFlashVars = function() {
    return this.flashvars;
}


/*
 * HTML generator functions
 *
 *
 */

// adds a param tag
GovVidMovie.prototype.insertParamTag = function(objEl, strName, strValue) {
  var objParam = document.createElement("PARAM");
  objParam.setAttribute('name', strName);
  objParam.setAttribute('value', strValue);
  objEl.appendChild(objParam);
}

 // function that generates quicktime html
GovVidMovie.prototype.getQuicktimeHTML = function() {

  // IE cannot handle adding type attribute with setAttribute
  if (govvidIE) {
    var objObject = document.createElement("<object type='video/quicktime' classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B' />");
  }
  else {
    var objObject = document.createElement("object");
    objObject.setAttribute('type', 'video/quicktime');
  }

  objObject.setAttribute('id', this.id);
  objObject.setAttribute('width', this.width);
  objObject.setAttribute('height', this.height);

  if(govvidIE || govvidSafari)
    this.insertParamTag(objObject, 'src', this.filename);
  else
    objObject.setAttribute('data', this.filename);

  this.insertParamTag(objObject, 'autoplay', 'false');

  return objObject;
}

 // function that generates windows media player html
GovVidMovie.prototype.getWinmediaHTML = function() {

  // IE cannot handle adding type attribute with setAttribute
  if(govvidIE)
    objObject = document.createElement("<object type='video/x-ms-wmv' />");
  else {
    var objObject = document.createElement("object");
    objObject.setAttribute('type', 'video/x-ms-wmv');
  }

  objObject.setAttribute('id', this.id);
  objObject.setAttribute('width', this.width);
  objObject.setAttribute('height', this.height);

  if(govvidIE || govvidSafari || govvidOpera)
    this.insertParamTag(objObject, 'src', this.filename);
  else
    objObject.setAttribute('data', this.filename);

  this.insertParamTag(objObject, 'autostart', '0');

  return objObject;
}

 // function that generates flash html, different for ie or navigator browsers
GovVidMovie.prototype.getFlashHTML = function() {
  var flashVars = "";

  // do flashvars
  if(this.flashvars)
    for (var param in this.getFlashVars())
      flashVars += param + '=' + this.flashvars[param] + '&';

  // IE cannot handle adding type attribute with setAttribute
  if(govvidIE)
    var objObject = document.createElement("<object type='application/x-shockwave-flash' />");
  else {
    var objObject = document.createElement("object");
    objObject.setAttribute('type', 'application/x-shockwave-flash');
  }
  objObject.setAttribute('id', this.id);
  objObject.setAttribute('width', this.width);
  objObject.setAttribute('height', this.height);

  if(govvidIE || govvidSafari)
    this.insertParamTag(objObject, 'src', this.filename);
  else
    objObject.setAttribute('data', this.filename);

  this.insertParamTag(objObject, 'flashvars', flashVars);
  this.insertParamTag(objObject, 'allowfullscreen', 'true');

  return objObject;
}

// replace element with movie html, the get+movie+HTML functions
GovVidMovie.prototype.showMovie = function(elementID, filetype) {
  var element = document.getElementById(elementID);
  if(filetype == 'flash') {
    element = GovVid_EmptyNode(element);
    element.appendChild(this.getFlashHTML());
  } else if (filetype == 'quicktime') {
    element = GovVid_EmptyNode(element);
    element.appendChild(this.getQuicktimeHTML());
  } else if (filetype == 'winmedia') {
    element = GovVid_EmptyNode(element);
    element.appendChild(this.getWinmediaHTML());
  }
}

/*
 * Detector functions
 *
 *
 */

// Function gets flashplayer version, if flash is not installed it returns major:0 minor:0 revision:0
function GovVid_getFlashPlayerVersion(){

  var version = new FlashPlayerVersion([0,0,0]);

  if(navigator.plugins && navigator.mimeTypes.length){
    var x=navigator.plugins["Shockwave Flash"];
    if(x && x.description)
      version = new FlashPlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));
  } else {
    try {
      var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
    } catch(e) {
      try {
        var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
        version = new FlashPlayerVersion([6,0,21]);
        axo.AllowScriptAccess="always";
      } catch(e){
        if(version.major==6){return version;}
      }

      try {
        axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
      } catch(e){}
    }

    if(axo!=null)
      version=new FlashPlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));
  }

   return version;
};
// object used by the getFlashPlayerVersion function
FlashPlayerVersion = function(player){
  this.major = player[0]!=null?parseInt(player[0]):0;
  this.minor = player[1]!=null?parseInt(player[1]):0;
  this.rev   = player[2]!=null?parseInt(player[2]):0;
};

// function checks if quicktime is installed
function GovVid_isQTInstalled() {
  var qtInstalled = false;
  var qtObj       = false;

  if (navigator.plugins && navigator.plugins.length) {
    var navigatorLength = navigator.plugins.length;
    for (var i=0; i < navigatorLength; i++ ) {
      var plugin = navigator.plugins[i];
      if (plugin.name.indexOf("QuickTime") > -1)
        qtInstalled = true;
    }
  } else {

    if (window.ActiveXObject) {
      var control = null;
      try {
        control = new ActiveXObject('QuickTime.QuickTime');
      } catch (e) {
      // Do nothing
      }
      if (control)
        // In case QuickTimeCheckObject.QuickTimeCheck does not exist
        qtInstalled = true;
    }
    else
      alert("no active X");
  }
  return qtInstalled;
}


/*
 * General functions / html functions
 *
 *
 */

 // function hides or shows an element with stylesheet classes
function GovVid_toggle(objid) {
  var el = document.getElementById(objid);
  if ( el.className == 'close' )
    el.className = 'open';
  else
    el.className = 'close';
}

 // function hides or shows an element with stylesheet classes
function GovVid_toggle_both(objid) {
  var strMenu = objid.replace(/ToggleLink/,"ToggleMenu");
  var strLink = objid.replace(/ToggleMenu/,"ToggleLink");

  GovVid_toggle(strMenu);
  GovVid_toggle(strLink);
}

// removes all childnodes from a node
function GovVid_EmptyNode(objNode) {
  for(var i = objNode.childNodes.length-1; i >= 0; i--)
    objNode.removeChild(objNode.childNodes[i]);
  return objNode;
}

// do stuff with links to binary files (not needed for pilot video files)
function GovVid_openBinary() {

  if(contentDispositionFile != undefined && contentDispositionFile != "") {
    var filetypes = new Array("pdf", "wmv", "mov", "mp4", "flv", "3gp","mp3", "srt");
    var myAnchors = document.getElementsByTagName('a');
    var myAnchorsLength = myAnchors.length;

    var baseUrl = new String(document.location);
    var splitUrl = baseUrl.split("/");
    var strBase = "";
    if(baseUrl.indexOf("http://") == 0 && splitUrl.length > 2)
      strBase = "http://" + splitUrl[2];

    for (i=0; i<myAnchorsLength ;i++)  {
      var anchor = myAnchors[i];
      var url = String(anchor.getAttribute('href'));
      var arUrl = url.split(".");
      var filetype = arUrl[arUrl.length-1];

      if(GovVid_in_array(filetypes, filetype.toLowerCase())) {
        var myfile = anchor.href.substr(strBase.length);
        anchor.href = contentDispositionFile + "?File=" + myfile;
        anchor.onclick = function () {
          this.href = this.href;
        }
      } else if (anchor.className == "transcription") {
        anchor.onclick = function () {
          return newWin(this.href,'500','500');
        }
      }
    }
  }
}


function GovVid_addLinkToList(element, strUrl, strLinkText){

  if (element) {
    var parent = GovVid_getParentByClassname("moviecontent", element);
    if (!parent)
      parent = GovVid_getParentByClassname("audiocontent", element);
    if (parent) {
      var elements = parent.getElementsByTagName("UL");

      if (strUrl) {
        var objLi = document.createElement("LI");
        objLi.setAttribute('id','govvid_viewwithcaptions');
        var objA = document.createElement("A");
        objA.setAttribute('href',strUrl);
        var objT = document.createTextNode(strLinkText);
        objA.appendChild(objT);
        objLi.appendChild(objA);

        var elementsLI = elements[0].getElementsByTagName("LI");
        elements[0].insertBefore(objLi,elementsLI[0]);
      }
    }
  }
}
// toggle list
function GovVid_makeListToggle(liID) {
  var element = document.getElementById(liID);

   if(element) {
     var parent = GovVid_getParentByClassname("moviecontent", element);
     if(!parent) parent = GovVid_getParentByClassname("audiocontent", element);
     if(parent)
       var elements = GovVid_getElementsByClassName("toggle","LI",parent);
     else
       var elements = GovVid_getElementsByClassName("toggle","LI");
     //loop elements
     var elementsLength = elements.length;
     for(var i = 0; i < elementsLength; i++) {
        var ulID = "govVid_ToggleMenu_" + i + liID;
        var toggleEl = "";
        var header  = "";

      var childNodesLength = elements[i].childNodes.length;
      for (var j = 0; j < childNodesLength ; j++ ){
         var tagName = elements[i].childNodes[j].tagName;

         if ((tagName == "H2" || tagName == "H3" || tagName == "H4" || tagName == "H5" || tagName == "H6" || tagName == "SPAN" || tagName == "A") && header == "") {
           header = elements[i].childNodes[j];
           var headerID = "govVid_ToggleLink_" + i +  liID;

           // add link to download video header
           if(tagName == "A") {
            header.id = headerID;
              header.onclick = function() {
              GovVid_toggle_both(this.id);
              return false;
            }
           } else {
            var objA = document.createElement("A");
            objA.setAttribute('href','#');
            objA.setAttribute('id',headerID);
            header.appendChild(objA);
            objA.appendChild(header.firstChild)
            objA.onclick = function() {
              GovVid_toggle_both(this.id);
              return false;
            }
           }
           GovVid_toggle(headerID);
         }
         if((tagName == "UL" || tagName == "DIV" || tagName == "P") && toggleEl == "") {
           toggleEl = elements[i].childNodes[j];
           toggleEl.id = ulID;
           GovVid_toggle(ulID);
         }
      }
     }
   }
   else alert("id '" + liID + "'not found!");
}

// funtion to check if a value is in a array, returns true or false
function GovVid_in_array(myArray, value) {
     var myArrayLength = myArray.length;
     for(var i=0; i < myArrayLength; i++)
           if(myArray[i] == value)
         return true;
   return false;
}

function GovVid_getElementsByClassName(className, tag, elm){
  var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
  var tag = tag || "*";
  var elm = elm || document;
  var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
  var returnElements = [];
  var current;
  var length = elements.length;
  for(var i=0; i<length; i++){
    current = elements[i];
    if(testClass.test(current.className))
      returnElements.push(current);
  }
  return returnElements;
}

function GovVid_getParentByClassname(className, elm) {
  var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");

  while(elm.tagName != "BODY") {
    if(testClass.test(elm.className))
      return elm;
    elm = elm.parentNode;
  }
  return false;
}


// flvplayer functions
  var currentPosition;
  var currentVolume;

  function loadFile(caps) { thisMovie("mediaplayer").loadFile(fil); };

  function thisMovie(movieName) {
      if(navigator.appName.indexOf("Microsoft") != -1) {
      return window[movieName];
    } else {
      return document[movieName];
    }
  };

  function sendEvent(typ,prm) {
    thisMovie("mediaplayer").sendEvent(typ,prm);
  };

  function getUpdate(typ,pr1,pr2) {
    if(typ == "time") { currentPosition = pr1; }
    else if(typ == "volume") { currentVolume = pr1; }
  };
