/*
 * 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 = "download";
var statisticsFile = "";
var contextpath;
var mediaplayerFile = "/flash/mediaplayer.swf";
if (typeof contextpath != 'undefined') {
  mediaplayerFile = contextpath + mediaplayerFile;
}


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; }
    };


// wp functions
function wp_getRandomGUID() {
        var chars = "0123456789abcdefghiklmnopqrstuvwxyz";
        var string_length = 32;
        var randomstring = '';
        for (var i=0; i<string_length; i++) {
        if (i!=0 && (i % 8) == 0)
                    randomstring += "-";
                var rnum = Math.floor(Math.random() * chars.length);
                randomstring += chars.substring(rnum,rnum+1);
        }
        return 'a'+randomstring;
}


function wp_getFileName(movieFile) {
    var exp = new RegExp("^(.*)\\.[\\w]{1,4}$");
    var res=exp.exec(movieFile);
    if (res==null || res.length==0)
        return null;
    var fn=res[1];
    exp = new RegExp("^(.*)&amp;ext=$");
    res=exp.exec(fn);
    if (res==null || res.length==0)
        return fn;
    return res[1];
}


function wp_getExtension(movieFile) {
    var exp = new RegExp("\\.([\\w]{1,4})$");
    var res=exp.exec(movieFile);
    if (res==null || res.length==0)
        return null;
    return res[1];
}

function wp_renderMovie(movieFile, element_id, movieExtension, width, height, mime, mediaParameters) {
    var myMovie = new GovVid(element_id, width, height);
    movieFile = movieFile.replace(/&amp;/g, "%26");
    if(movieExtension) {
        movieFile = movieFile + '%26ext=.' + movieExtension;
    }
    myMovie.addMovie(movieFile); // supports mov, mp4, wmv, flv
    myMovie.write(element_id); // script puts movie html inside html element
}

function wp_renderMovieNoExt(movieFile, element_id, width, height, mime, mediaParameters) {
    wp_renderMovie(wp_getFileName(movieFile), element_id, wp_getExtension(movieFile), width, height, mime, mediaParameters);
}

