var TPlayerWrapper = function()
{
    //## PUBLIC FIELDS

    /**
     * The ID of the hidden frame in the top FRAMESET element
     *
     * @field
     * @type <string>
     */
    this.hiddenFrameID = null;

    /**
     * The PlayerInterface on the visible page
     *
     * @field
     * @type <TPlayerInterface>
     */
    this.playerInterface = null;

    //## PUBLIC METHODS

    /**
     * Select a new station
     *
     * @param <int> stationID The AudioRealm / SpacialNet station ID of the new station
     * @return <void>
     */
    this.selectStation = function(stationID)
    {
		$.ajax({
			url: '/station/tunein/format/json/stationID/'+stationID,
			type: 'GET',
			dataType: 'json'
		});


	Lint.log("TPlayerWrapper::selectStation: Select station " + stationID);
	var fr = this.getHiddenFrame();
	if (fr == null) return;

	var newURL = fr.src;
	var pos = newURL.indexOf('?');
	if (pos != -1) newURL = newURL.substr(0, pos);
	newURL += '?sid=' + stationID;

	if (arguments.length > 1)
		newURL += '&listenurl=' + arguments[1];

	fr.src = newURL;
    }

    /**
     * "Eject" the current stream
     *
     * @return <void>
     */
    this.eject = function()
    {
	this.selectStation(0);
    }

    /**
     * Request an interface refresh from the hidden player
     *
     * @return <void>
     */
    this.requestRefresh = function()
    {
	var c = this.getHiddenPlayer();
	if (c != null) c.refreshInterface();
    }

    /**
     * Play the currently selected stream
     *
     * @return <void>
     */
    this.play = function()
    {
	Lint.log("TPlayerWrapper::play called");
	var c = this.getPlayerController();
	if (c != null)
	{
	    c.player.Play();
	    if (this.playerInterface != null) this.playerInterface.renderStopButton();
	}
    }

    /**
     * Stop playback of current stream
     *
     * @return <void>
     */
    this.stop = function()
    {
	Lint.log("TPlayerWrapper::stop called");
	var c = this.getPlayerController();
	if (c != null)
	{
	    c.player.Stop();
	    if (this.playerInterface != null) this.playerInterface.renderPlayButton();
	}
    }

    /**
     * Toggle the player's muted state
     *
     * @return <void>
     */
    this.toggleMute = function()
    {
	Lint.log("TPlayerWrapper::toggleMute called");
	var c = this.getPlayerController();
	if (c != null)
	{
	    c.player.toggleMute();
	    if (this.playerInterface != null)
	    {
		if (this.getMute()) this.playerInterface.renderUnMuteButton();
		else this.playerInterface.renderMuteButton();
	    }
	}

	var h = this.getHiddenPlayer();
	if (h != null) h.refreshInterface();
    }

    /**
     * Get the player's current muted state
     * 
     * @return <boolean>
     */
    this.getMute = function()
    {
	Lint.log("TPlayerWrapper::getMute called");
	var c = this.getPlayerController();
	if (c != null) return c.player.getMute();
	return false;
    }

    /**
     * Set the player's volume level
     *
     * @param <int> level The new volume level from 0 to 100
     * @return <void>
     */
    this.setVolume = function(level)
    {
	Lint.log("TPlayerWrapper::setVolue called");
	
	// For cosmetics when recovering from mute in the interface
	var wasMute = this.getMute();

	var c = this.getPlayerController();
	if (c != null) c.player.setVolume(level);

	if (wasMute)
	{
	    var h = this.getHiddenPlayer();
	    if (h != null) h.refreshInterface();
	}

	this.setCookie('arVolume', level, 3600);
    }

    /**
     * Get the player's current volume level
     *
     * @return <int> Current level from 0 to 100
     */
    this.getVolume = function()
    {
	Lint.log("TPlayerWrapper::getVolume called");
	var c = this.getPlayerController();
	if (c != null) return c.player.getVolume();
	return 0;
    }

    /**
     * Add the current playing station to the user's favorites list
     *
     * @return <void>
     */
    this.addFavorite = function()
    {
	Lint.log("TPlayerWrapper::addFavorite: Trying to make current station a favorite");
	var c = this.getPlayerController();
	if (c != null)
	{
	    var current = c.stationID;
	    if (current != 0)
		$.ajax({
		    url: '/user/addfavorite/format/json',
		    type: 'POST',
		    data: {stationID:current},
		    dataType: 'json',
		    success: function(data)
		    {
			playerInterface.setFavorite(true);

			if (data.success)
			{
			    // Try to detect station list, if visible,
			    // force a redraw to display new favorite status

			    if (document.getElementById('stations') != null)
			    {
				oCache = {iCacheLower: -1};
				stations.fnDraw();
			    }
			}
		    }
		});
	}
    }

    /**
     * Remove the current station from favorites
     *
     * @param <int> position Preset position
     * @return <void>
     */
    this.removeFavorite = function()
    {
	Lint.log("TPlayerWrapper::removeFavorite: Trying to remove current station from favorites");
	var c = this.getPlayerController();
	if (c != null)
	{
	    var current = c.stationID;
	    if (current != 0)
		$.ajax({
		    url: '/user/removefavorite/format/json',
		    type: 'POST',
		    data: {stationID:current},
		    dataType: 'json',
		    success: function(data)
		    {
			if (data.success)
			{
			    playerInterface.setFavorite(false);

			    $.ajax({
				url: '/user/getpresets/format/json',
				type: 'GET',
				dataType: 'json',
				success: function(data)
				{
				    playerInterface.setPresets(data.presets);

				    // Try to detect station list, if visible,
				    // force a redraw to display new favorite status

				    if (document.getElementById('stations') != null)
				    {
					oCache = {iCacheLower: -1};
					stations.fnDraw();
				    }
				}
			    });
			}
		    }
		});
	}
    }

    /**
     * Set the current playing station as the selected station preset
     *
     * @param <int> position Preset position
     * @return <void>
     */
    this.setPreset = function(position)
    {
	Lint.log("TPlayerWrapper::setPreset: Trying to make current station preset " + position);
	var c = this.getPlayerController();
	if (c != null)
	{
	    var current = c.stationID;
	    if (current != 0)
		$.ajax({
		    url: '/user/setpreset/format/json',
		    type: 'POST',
		    data: {stationID:current,position:position},
		    dataType: 'json',
		    success: function(data)
		    {
			if (data.success)
			{
			    $.ajax({
				url: '/user/getpresets/format/json',
				type: 'GET',
				dataType: 'json',
				success: function(data)
				{
				    playerInterface.setPresets(data.presets);
				    playerInterface.refreshFavorite();

				    // Try to detect station list, if visible,
				    // force a redraw to display new favorite status

				    if (document.getElementById('stations') != null)
				    {
					oCache = {iCacheLower: -1};
					stations.fnDraw();
				    }
				}
			    });
			}
		    }
		});
	}
    }

    //## PRIVATE METHODS

    // Get the player controller in the hidden frame
    this.getPlayerController = function()
    {
	var fr = this.getHiddenFrame();
	if (fr == null) return null;

	if (typeof(fr.contentWindow.PlayerControl) == 'undefined')
	{
	    Lint.log("TPlayerWrapper::getPlayerController can't reach player controller");
	    return null;
	}
	return fr.contentWindow.PlayerControl;
    }

    // Get the hidden player interface in the hidden frame
    this.getHiddenPlayer = function()
    {
	var fr = this.getHiddenFrame();
	if (fr == null) return null;

	if (typeof(fr.contentWindow.hiddenPlayer) == 'undefined')
	{
	    Lint.log("TPlayerWrapper::getHiddenPlayer can't reach hidden player interface");
	    return null;
	}
	return fr.contentWindow.hiddenPlayer;
    }

    // Get the hidden frame
    this.getHiddenFrame = function()
    {
	if (this.hiddenFrameID == null)
	{
	    Lint.log("TPlayerWrapper::hiddenFrameID not set");
	    return null;
	}

	var fr = top.document.getElementById(this.hiddenFrameID);
	if (fr == null)
	{
	    Lint.log("TPlayerWrapper::getPlayerController can't reach hidden frame");
	    return null;
	}

	return fr;
    }

    // Set cookies
    this.setCookie = function(c_name,value,expiredays)
    {
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+expiredays);
	document.cookie=c_name+ "=" +escape(value) +
	    ((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
    }
}
