﻿// SoundPlayer: loads available media player.
// Version 1.1.2 15Aug2008 MikeSoSoft
// 1.0 04Aug2008 Initial release
// 1.1 09Aug2008 Added methods to return the pluginsPage for each player
// 1.1.1 10Aug2008 Changed init sequence to avoid problem with Plugin.min.js 
//                 not loading in time.
// 1.1.2 15Aug2008 Added 5s wait loop allow Plugin.min.js to load. Failed in live.

// Depends on soundManager from www.schillmania.com for Flash support
// Depends on plugin.js from http://www.knallgrau.at/code/plugin_js for plugin detection.

var soundManager = null;
    
var SoundPlayer = function () {
    var _this = null;
    var initialised = false;
    var soundFile = "";
    var player = null;
    var playerContainterId = "";
    var playerId = "";
    var playerTypes = {None: 0, QT: 1, WM: 2, RP: 3, FL: 4};
    var playerType = playerTypes.None;
    var playerDescriptions = ["No Player", "QuickTime", "Windows Media Player", "RealPlayer", "Flash"];
    var soundManagerId = "sm2";
    var defaults = {autoPlay: false, volume: 50};
    var currentVolume;

    var errorMessages = 
    {missingPluginjs: "File plugin.min.js is missing. SoundPlayer cannot execute.",
     missingSoundManagerjs: "File soundmanager2-delayed-nodebug-jsmin.js is missing. SoundPlayer cannot execute.",
     noSoundFile: "No sound file provided. SoundPlayer has nothing to play.",
     noContainerId: "No container id provided. SoundPlayer cannot play.",
     noElement: "Element with containerId does not exit. SoundPlayer cannot play."
    }
    function displayError(messageId) {
        alert(errorMessages[messageId]);
        return false;
    }

    var userAgent = navigator.userAgent.toLowerCase();
    var is_saf    = ((userAgent.indexOf('applewebkit') != -1) || (navigator.vendor == "Apple Computer, Inc."));
    var is_opera  = (userAgent.indexOf('opera') != -1);
    var is_webtv  = (userAgent.indexOf('webtv') != -1);
    var is_ie     = ((userAgent.indexOf('msie') != -1) && (!is_opera) && (!is_saf) && (!is_webtv));
    var is_ie4    = ((is_ie) && (userAgent.indexOf("msie 4.") != -1));
    var is_moz    = ((navigator.product == 'Gecko') && (!is_saf));

    loadScript("plugin.min.js");
            
    function setOptions(options) {
	    options = options || {};
	    var result = {};
	    for (var prop in defaults) {
	        result[prop] = (options[prop] !== undefined) ? options[prop] : defaults[prop];
	    }
	    return result;
    }

    var startTime = null;
    var initTimer = null;
    var startInit = function () {
        try {if (!Plugin) {return displayError("missingPluginjs")}
        } catch (e) {
            var now = new Date().getTime();
            var timePassed = now - startTime;
            return (timePassed > 5000) ? displayError("missingPluginjs"): false;
        }
        clearInterval(initTimer);
        initTimer = null;
        Plugin.PLUGINS["RealPlayer"].forceEmbedTag = false;
        Plugin.PLUGINS["RealPlayer"].standardEmbedAttributes.nojava = false;
        Plugin.PLUGINS["Windows Media"].classID = "6BF52A52-394A-11D3-B153-00C04F79FAA6"
        
        if (is_ie) {
            loadWindowsMediaPlayer();
            if (!player) {loadQuickTime()};
        } else {
            loadQuickTime();
            if (!player && is_moz) {loadWindowsMediaPlayerInFirefox()};
            if (!player && !is_moz) {loadWindowsMediaPlayer()};
        }
        if (!player) {loadRealPlayer()};
        if (!player) {
            if (!loadFlash()) {endInit()};
        } else {
            endInit();
        }
    }
    
    function endInit() {
        if (player) {
            initialised = true;
            if (_this.onLoad) {_this.onLoad()};
        } else {
            if (_this.onError) {_this.onError()};
        }
    }
    
    function loadQuickTime() {
        if (Plugin.isInstalled("QuickTime")) {
            var vol = Math.floor(defaults.volume/100*255);
            Plugin.embed("QuickTime", 
                         {id: playerId,
                         width: "0", 
                         height: "0", 
                         src: soundFile, 
                         autoplay: defaults.autoPlay,
                         controller: "false",
                         volume: vol
                         }, 
                         playerContainterId);
            test(playerTypes.QT);
        }
    }
    
    function loadWindowsMediaPlayer() {
        if (Plugin.isInstalled("Windows Media")) {
            Plugin.embed("Windows Media", 
                         {id: playerId,
                         width: "0", 
                         height: "0%", 
                         url: soundFile, 
                         autoStart: defaults.autoPlay,
                         uiMode: "invisible",
                         volume: defaults.volume
                         }, 
                         playerContainterId);
            test(playerTypes.WM);
        }
    }
    
    function loadWindowsMediaPlayerInFirefox() {
        if ((is_moz) && (navigator.plugins["Microsoft® Windows Media Player Firefox Plugin"])) {
            var str = '<object id="' + playerId + '" type="application/x-ms-wmp" ';
            str += 'url="' + soundFile + '" width="0" height="0">';
            str += '<param name="uiMode" value="invisible">';
            str += '<param name="autoStart" value="' + defaults.autoPlay + '">';
            str += '<param name="volume" value="' + defaults.volume + '">';
            str += '</object>';
            document.getElementById(playerContainterId).innerHTML = str;
            test(playerTypes.WM);
        }
    }
    
    function loadRealPlayer() {
        if (Plugin.isInstalled("RealPlayer")) {
            Plugin.embed("RealPlayer", 
                         {id: playerId,
                         width: "0", 
                         height: "0", 
                         src: soundFile, 
                         autoplay: defaults.autoPlay
                         }, 
                         playerContainterId);
            test(playerTypes.RP);
            if (player) {player.setVolume(defaults.volume)};
            if (player && defaults.autoPlay) {play()};
        }
    }

    function loadFlash() {
        if (Plugin.isInstalled("Flash")) {
            loadScript("soundmanager2-delayed-nodebug-jsmin.js");
            try {if (!SoundManager) {return displayError("missingSoundManagerjs")}
            } catch (e) {return displayError("missingSoundManagerjs")};
            try {
                soundManager = new SoundManager();
            
                soundManager.onload = function() {
                    player = soundManager.createSound({
                        id: soundManagerId,
                        url: soundFile,
                        autoPlay: defaults.autoPlay,
                        volume: defaults.volume
                    });
                    if (player) {playerType = playerTypes.FL};
                    if (player) {
                        try {pause()} catch (e) {
                            player = null;
                            playerType = playerTypes.None;
                        }
                    }
                    endInit();
                }
                
                soundManager.onerror = function () {
                    if (_this.onError) {_this.onError()};
                }

                soundManager.beginDelayedInit();
                return true;
            } catch (e) {
                player = null;
                playerType = playerTypes.None;
                return false;
            }
        }
    }
    
    function loadScript(fileName) {
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = fileName;
        var hd = document.getElementsByTagName('head');
        hd[0].appendChild(script);
    }

    function test(type) {
        player = document.getElementById(playerId);
        if (player) {
            playerType = type;
            try {pause()} catch (e) {
                player.parentNode.removeChild(player);
                player = null;
                playerType = playerTypes.None;
            }
        }
    }
    
    function play() {
        if (!player) {return false};
        switch (playerType) {
        case playerTypes.QT:
            player.Play();
            break;
        case playerTypes.WM:
            player.controls.play();
            break;
        case playerTypes.RP:
            player.DoPlay();
            break;
        case playerTypes.FL:
            player.resume();
            break;
        }
    }

    function pause() {
        if (!player) {return false};
        switch (playerType) {
        case playerTypes.QT:
            player.Stop();
            break;
        case playerTypes.WM:
            player.controls.pause();
            break;
        case playerTypes.RP:
            player.DoPause();
            break;
        case playerTypes.FL:
            player.pause();
            break;
        }
    }

    function volumeUp() {
        if (!player) {return false};
        if (currentVolume < 100) {currentVolume += 10};
        setVolume();
    }
        
    function volumeDown() {
        if (!player) {return false};
        if (currentVolume > 0) {currentVolume -= 10};
        setVolume();
    }
     
    function setVolume() {
        switch (playerType) {
        case playerTypes.QT:
            player.SetVolume(Math.floor(currentVolume/100*255));
            break;
        case playerTypes.WM:
            player.settings.volume = currentVolume;
            break;
        case playerTypes.RP:
            player.SetVolume(currentVolume);
            break;
        case playerTypes.FL:
            player.setVolume(currentVolume);
            break;
        }
    }

    return {
        init: function (parms) {
            _this = this;
            if (initialised) {return};
            if (!parms.fileName){return displayError("noSoundFile")}else{soundFile = parms.fileName};
            if (!parms.containerId){return displayError("noContainerId")}else{playerContainterId = parms.containerId};
            playerId = parms.containerId + "_1";
            if (!document.getElementById(parms.containerId)){return displayError("noElement")};
            if(parms.options) {defaults = setOptions(parms.options)};
            currentVolume = defaults.volume;
            startTime = new Date().getTime();
            initTimer = setInterval(startInit, 50);
        },
        play: function () {play()},
        pause: function () {pause()},
        volumeUp: function () {volumeUp()},
        volumeDown: function () {volumeDown()},
        playerName: function () {return playerDescriptions[playerType]},
        onLoad: null,
        onError: null,
        pluginsPageQT: function () {return Plugin.PLUGINS["QuickTime"].pluginsPage},
        pluginsPageWM: function () {
            if (is_moz) {
                return "http://port25.technet.com/pages/windows-media-player-firefox-plugin-download.aspx";
            } else {
                return Plugin.PLUGINS["Windows Media"].pluginsPage;
            }
        },
        pluginsPageRP: function () {return Plugin.PLUGINS["RealPlayer"].pluginsPage},
        pluginsPageFL: function () {return Plugin.PLUGINS["Flash"].pluginsPage}
    }
}();