/**
 * Windows Media Player Module
 * @see com.metafusion.VideoPlayer
 * @author m.donay@meta-fusion.com
 */
com.metafusion.WMPlayer = function(){

    //-----// public members //-----//
    
    com.metafusion.WMPlayer.prototype.classname = "com.metafusion.WMPlayer";
    com.metafusion.WMPlayer.prototype.target = "";
    
    
    //-----// private members //-----//
    
    /**
     * _name: DOM id of the player object
     */
    var _name = "wmplayer";
    
    /**
     * _player: points to the player object
     * call registerPlayer() to initialize.
     * @see registerPlayer()
     */
    var _player = null;
    
    
    //-----// public functions //-----//
	
    /**
     * switch visibility of the player object
     * @param {Object} visible
     */
	com.metafusion.WMPlayer.prototype.setVisible = function(visible){
		if ( (typeof visible) == (typeof true))
		{
			_player.style.visibility = visible? 'visible' : 'hidden';
		}        
	}
	
    /**
     * assigns parameters to the player object.
     * called by com.metafusion.PlayerApplication.showPlayer(target)
     * @param {String} key
     * @param {Object} value
     */
    com.metafusion.WMPlayer.prototype.addVariable = function(key, value){
        switch (key) {
            case "src":{
                src = value;
                break;
            }
            case "width":{
                width = value;
                break;
            }
            case "height":{
                height = value;
                break;
            }
            case "stateChangeEventListener":{
                stateChangeEventListener = value;
                break;
            }
            case "errorEventListener":{
                errorEventListener = value;
                break;
            }
            case "scriptEventListener":{
                scriptEventListener = value;
                break;
            }
            case "positionChangeEventListener":{
                positionChangeEventListener = value;
                break;
            }
            default:
                {
                    break;
                }
        }
    }
    
    /**
     * gets the total length of the clip currently loaded
     * @return time in milliseconds
     */
    com.metafusion.WMPlayer.prototype.getLength = function(){
        if (!_player) {
            //debug(this.classname + ': Player object not registered');
            return "error";
        }
		if (!_player.currentMedia) {
			return "error";
		}
		return _player.currentMedia.duration * 1000;
    }
    
    /**
     * gets the current playhead position
     * @return time in milliseconds
     */
    com.metafusion.WMPlayer.prototype.getPosition = function(){
        if (!_player) {
            debug(this.classname + ': Player object not registered');
            return "error";
        }
        if (!_player.controls) {
            debug(this.classname + ': Player controls not accessable');
            return "error";
        }
        return Math.round(_player.controls.currentPosition * 1000);
    }
    
    /**
     * sets the playhead position
     * @param {Number} position: new position in milliseconds
     */
    com.metafusion.WMPlayer.prototype.setPosition = function(position){
        if (!_player) {
            debug(this.classname + ': Player object not registered');
            return "error";
        }
        if (!_player.controls) {
            debug(this.classname + ': Player controls not accessable');
            return "error";
        }
        _player.controls.currentPosition = (position / 1000);
        return "new position: " + Math.round(_player.controls.currentPosition * 1000);
    }
/**
 * 091102_1747_malte hotfix for backend:workprogramme/agenda link compatibility
 * document.MediaPlayer.SetPosition(0*1000);
 */
com.metafusion.WMPlayer.prototype.SetPosition = com.metafusion.WMPlayer.prototype.setPosition;
    
    /**
     * starts the videoplayback
     */
    com.metafusion.WMPlayer.prototype.play = function(){
        if (!_player) {
            debug(this.classname + ': Player object not registered');
            return;
        }
        if (!_player.controls) {
            debug(this.classname + ': Player controls not accessable');
            return;
        }
        _player.controls.play();
    }
	
	/**
	 * gets some available metadata.
	 */
	com.metafusion.WMPlayer.prototype.getMetadata = function()
	{
		    var Media = _player.currentMedia;
			var Controls = _player.controls;
		    if(!Media)
		    {
		        debug("No current media.");
		        return;
		    }
		
		    // Retrieve the metadata we want to display.
		    var Title = Media.getItemInfo("Title");
		    var Artist = Media.getItemInfo("WM/AlbumArtist");
		    var AlbumTitle = Media.getItemInfo("WM/AlbumTitle");
		    var Duration = Media.durationString;
			var UserCustom1 = Media.getItemInfo("UserCustom1");
			var UserCustom2 = Media.getItemInfo("UserCustom2");
			var Bitrate = Media.getItemInfo("Bitrate");
			var FileSize = Media.getItemInfo("FileSize");
			var FormatTag = Media.getItemInfo("FormatTag");
			var FourCC = Media.getItemInfo("FourCC");
			var FrameRate = Media.getItemInfo("FrameRate");
			var MediaType = Media.getItemInfo("MediaType");
			var Category = Media.getItemInfo("WM/Category");
			var SubTitle = Media.getItemInfo("WM/SubTitle");
			var Writer = Media.getItemInfo("WM/Writer");
			var Description = Media.getItemInfo("WM/Description");
			var Event = Media.getItemInfo("Event");
			var CurrentMarker = Controls.currentMarker;
			var MarkerCount = Media.markerCount;
			
		    // Test the duration string value.
		    // Streaming media always returns zero.
		    if(Duration == "00:00")
		    {
		       Duration = "No duration available";
		    }
		
			var output = "";
			output += 
		    output += "Title: " + Title+"<br>";
		    output += "Artist: " + Artist+"<br>";
		    output += "Album: " + AlbumTitle+"<br>";
			
			output += "UserCustom1: " + UserCustom1+"<br>";
			output += "UserCustom2: " + UserCustom2+"<br>";
			output += "Bitrate: " + Bitrate+"<br>";
			output += "FileSize: " + FileSize+"<br>";
			output += "FormatTag: " + FormatTag+"<br>";
			output += "FourCC: " + FourCC+"<br>";
			output += "FrameRate: " + FrameRate+"<br>";
			output += "MediaType: " + MediaType+"<br>";
			output += "Category: " + Category+"<br>";
			output += "SubTitle: " + SubTitle+"<br>";
			output += "Writer: " + Writer+"<br>";
			output += "Description: " + Description+"<br>";
			output += "Event: " + Event+"<br>";
			output += "CurrentMarker: " + CurrentMarker + " - ";
			output += "MarkerCount: " + MarkerCount + "<br>";
			
		    output += "Duration: " + Duration+"<br>";
			return output;
		}
		
    /**
     * stops the videoplayback
     */
    com.metafusion.WMPlayer.prototype.stop = function(){
        if (!_player) {
            debug(this.classname + ': Player object not registered');
            return;
        }
        if (!_player.controls) {
            debug(this.classname + ': Player controls not accessable');
            return;
        }
        _player.controls.stop();
    }
    
    /**
     * pause the videoplayback
     */
    com.metafusion.WMPlayer.prototype.pause = function(){
        if (!_player) {
            debug(this.classname + ': Player object not registered');
            return;
        }
        if (!_player.controls) {
            debug(this.classname + ': Player controls not accessable');
            return;
        }
        _player.controls.pause();
    }
    
    /**
     * writes the player object into the DOM.
     * currently distincts between Firefox and IE
     * TODO: check other browser / OS
     *
     * Events for firefox in wmplayer 6.4 style:
     * function OnDS<event name>Evt(<event parameters>){}
     * @param {String} target: id of the HTMLObject to contain the player
     */
    com.metafusion.WMPlayer.prototype.write = function(_target, sessionType){
    
    
        /**
         * @see http://forum.flip4mac.com/forum/messageview.aspx?catid=9&threadid=1271
         * Flip4Mac WMV Supports the following methods and properties from the Windows Media 6.4 SDK Methods:
         * "play","pause","Play","Pause","Stop","Next","Previous","Open"
         * Properties:
         * "CurrentPosition","FileName","PlayState"
         * and basic embed info
         * <embed type="application/x-mplayer2"
         * src="[...the path to your content...] "
         * showStatusBar="[true/false]"
         * showControls="[true/false]"
         * kioskmode="[true/false]"
         * height="[player height] "
         * width="[player width] "
         * scale="ASPECT"
         * </embed>
         */
        //debug(this.classname + ": sessionType " + sessionType);
        
        var output = '';
        if (checkBrowserName("msie")) {
            output += '<object';
            output += ' id="' + _name + '"'
            output += ' type="application/x-ms-wmp"';
            output += ' classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6"';
            output += ' width="' + width.toString() + '"';
            output += ' height="' + height.toString() + '"';
            output += '">';
            output += '<param name="URL" value="' + src + '"/>';
            output += '<param name="uiMode" value="none">';
            output += '<param name="stretchToFit" value="true">';
            output += '<param name="showstatusbar" value="true">';
            output += '</object>';
            
            output += '<script';
            output += ' for="' + _name + '"';
            output += ' event="PlayStateChange(NewState)"';
            output += '>';
            output += 'stateChangeEventListener(NewState);';
            output += '</script>';
            
            output += '<script';
            output += ' for=' + _name + '';
            output += ' event="Error()"';
            output += '>';
            output += 'errorEventListener();';
            output += '</script>';
            
            if (sessionType == com.metafusion.PlayerApplication.SESSION_LIVE) {
                output += '<script';
                output += ' for=' + _name + '';
                output += ' event="ScriptCommand(scType, Param)"';
                output += '>';
                output += 'scriptEventListener(scType, Param);';
                output += '</script>';
            }
            
            output += '<script';
            output += ' for=' + _name + '';
            output += ' event="PositionChange(oldPosition, newPosition)"';
            output += '>';
            output += 'positionChangeEventListener(oldPosition, newPosition);';
            output += '</script>';
        }
        else 
            if (checkBrowserName("firefox")) {
                output += '<object';
                output += ' id="' + _name + '"';
                output += ' type="application/x-ms-wmp"';
                output += ' width="' + width.toString() + '"';
                output += ' height="' + height.toString() + '"';
                output += '>';
                output += '<param name="url" value="' + src + '"/>';
                output += '<param name="uiMode" value="none">';
                output += '<param name="stretchToFit" value="true">';
                output += '<param name="showstatusbar" value="true">';
				
                
                if (checkPlatform("mac")) {
                    output += '<embed type="application/x-mplayer2"';
                    output += ' id="' + _name + '"';
                    output += ' src="' + src + '"';
                    output += ' showStatusBar="false"';
                    output += ' showControls="false"';
                    output += ' kioskmode="false"';
                    output += ' height="' + height.toString() + '"';
                    output += ' width="' + width.toString() + '"';
                    output += ' scale="100%"';
                    output += '</embed>';
                }
                
                output += '</object>';
                
                var e = "";
                e = document.createElement("script");
                e.event = "PlayStateChange(NewState)";
                e.id = e.event;
                e.innerHTML += 'function OnDSPlayStateChangeEvt(NewState){';
                e.innerHTML += 'stateChangeEventListener(NewState);';
                e.innerHTML += '}';
                if (!$$(e.id)) {
                    document.getElementsByTagName("head")[0].appendChild(e);
                }
                
                e = document.createElement("script");
                e.event = "Error()";
                e.id = e.event;
                e.innerHTML += 'function OnDSErrorEvt(){';
                e.innerHTML += 'errorEventListener();';
                e.innerHTML += '}';
                if (!$$(e.id)) {
                    document.getElementsByTagName("head")[0].appendChild(e);
                }
                
                if (sessionType == com.metafusion.PlayerApplication.SESSION_LIVE) {
                    e = document.createElement("script");
                    e.event = "scriptCommand(scType, Param)";
                    e.id = e.event;
                    e.innerHTML += 'function OnDSScriptCommandEvt(scType, Param){';
                    e.innerHTML += 'scriptEventListener(scType, Param);';
                    e.innerHTML += '}';
                    if (!$$(e.id)) {
                        document.getElementsByTagName("head")[0].appendChild(e);
                    }
                }
                
                e = document.createElement("script");
                e.event = "positionChange(oldPosition, newPosition)";
                e.id = e.event;
                e.innerHTML += 'function OnDSPositionChangeEvt(oldPosition, newPosition){';
                e.innerHTML += 'positionChangeEventListener(oldPosition, newPosition);';
                e.innerHTML += '}';
                if (!$$(e.id)) {
                    document.getElementsByTagName("head")[0].appendChild(e);
                }
            }
            else {
                output = 'Your browser/operating system is not supported.'
            }
        $$(_target).innerHTML = output;
        
        this.target = _target;
        /*
         * the wmplayer plugin isn't accessable instantly in firefox (guessed)
         * hack for firefox: setTimeout(function,0) moves the function call
         * to the end of the excecution queue.
         */
        setTimeout(registerPlayer, 0);
    }
    
    /**
     * gets the (most recent) error details from the player.
     * called if an Error event occured
     * @return (String) error description and type
     */
    com.metafusion.WMPlayer.prototype.retrieveErrorDescription = function(){
        var msg = this.classname + ': Videoerror';
        if (!_player) {
            msg = this.classname + ": There is no player - thus it has thrown an error";
        }
        else 
            if (typeof _player.error != "undefined") {
                // Store the most recent error item number.
                var max = _player.error.errorCount - 1
                
                // Store the most recent error in an error item object.
                var errItem = _player.error.item(max);
                
                // Use the error item object to store the error info.
                var errDesc = errItem.errorDescription;
                var errNum = errItem.errorCode.toString(16);
                
                msg = this.classname + ': ' + errNum + "\n" + errDesc;
            }
        return msg;
    }
    
    /**
     * Shows or hides the player controls)
     */
    com.metafusion.WMPlayer.prototype.showControls = function(show){
        if (true || $$(_name) != null) {
            if (show == true) {
                $$(_name).uiMode = "mini";
            }
            else {
                $$(_name).uiMode = "none";
            }
        }
    }
    
    
    /**
     * sets up an DOM pointer to the player object, referenced by _name
     */
    function registerPlayer(){
        if ($$(_name)) {
            _player = $$(_name);
        }
        else {
            error(this.classname + ': registration of player failed');
        }
    }
}
