// * Interface til WMP objektet

function WMPInterface(playerObj)
{
	this.baseURL = ''; // * URL til streamen uden kvalitet( eller andet)
	this.completeURL = ''; // * URL til streamen MED kvalitet( og andet)
	this.clipQuality = null;
	this.useBitrate = true;
	
	if(isSet(playerObj))
		this.setPlayerReference(playerObj);
}

WMPInterface.prototype.setPlayerReference = function(playerObj)
{
	// * reference til Player Objektet (DOMElementet)
	this.player = playerObj;
	
	// * Et array med attributter der indeholder værdier om f.eks. understøttelse af volumestyring
	this.supportedFeatures = new Object();
	
	this.supportedFeatures.volumeControl = false;
	this.supportedFeatures.playControls = false;
	this.supportedFeatures.seekControls = false;
	this.supportedFeatures.sourceChange = false;
	this.supportedFeatures.playStates = false;
	
	this.playStateListeners = new Array();
	this.volumeListeners = new Array();
	this.positionListeners = new Array();
	this.errorListeners = new Array();
	
	this.previousPlayState = predefinedPlayStates.UNDEFINED;
	
	if(this.player)
	{
		if(isSet(this.player.settings))
			this.supportedFeatures.volumeControl = true;
		if(isSet(this.player.controls) && isSet(this.player.controls.currentPosition))
			this.supportedFeatures.playControls = true;
		if(isSet(this.player.currentMedia))
			this.supportedFeatures.seekControls = true;
		if(isSet(this.player.URL) || isSet(this.player.filename)) // * Dette vil det nok altid blive da den altid har loadet et URL
			this.supportedFeatures.sourceChange = true;
		if(isSet(this.player.playState))
			this.supportedFeatures.playStates = true;
	}
	
	// * Aflæser playerens status og udløser kald til callbacks hvis der er ændringer
	if(this.pollTimer != null)
	{
		clearInterval(this.pollTimer);
	}
	
	var f = function() { f.func.apply(f.scope, new Array()); }
	f.scope = this;
	f.func = this.pollPlayer;
	this.pollTimer = setInterval(f, 500);
}

WMPInterface.prototype.getQuality = function()
{
	return this.clipQuality;
}

WMPInterface.prototype.setQuality = function(quality)
{
	this.clipQuality = quality;
	// * Opdater den fulde URL da den ændrer sig ved kvalitets skift.
	this.generateCompleteURL();
}

// * Returnerer den faktiske bitrate i bit/sec
WMPInterface.prototype.getActualQuality = function(realQuality)
{
	if(this.player.network)
		return this.player.network.bitRate;
	else
		return null;
}

// * Issue play command based on player interface/version
WMPInterface.prototype.play = function()
{
	// * Test og se om vi har en stream der skal afspilles. Ellers stop player for at undgå fejl.
	if( this.baseURL != undefined && this.baseURL != '' )
	{
		hidePlayerImage()
		if(this.isSupported('playControls'))
		{
			if(this.getState() == predefinedPlayStates.PLAYING)
			{
				this.pause();
				// * Hvis ikke vi udløser en PAUSED, så kan der gå op til <timerens timeout> ms før knappen visuelt opdateres
				this.triggerPlayStateChange(predefinedPlayStates.PAUSED);
			}
			else
			{
				this.player.controls.play();
				// * Hvis ikke vi udløser en PLAYING, så kan der gå op til <timerens timeout> ms før knappen visuelt opdateres
				// * Vi venter lidt med dette alligevel
				// this.triggerPlayStateChange(predefinedPlayStates.PLAYING);
			}
			
		}
		else
		{
			// * Det specifikke URL er angivet i startClipURL [global variabel]
			writePlayer();
		}
	}
	else
	{
		unhidePlayerImage();
		if(this.isSupported('playControls'))
			this.player.controls.stop();
	}
}
WMPInterface.prototype.fastForward = function() 
{
	if(this.isSupported('playControls'))
	{
		this.player.controls.fastforward();
	}
}
WMPInterface.prototype.fastReverse = function() 
{
	if(this.isSupported('playControls'))
	{
		this.player.controls.fastReverse();
	}
}
WMPInterface.prototype.pause = function() { if(this.isSupported('playControls')) this.player.controls.pause(); }
WMPInterface.prototype.stop = function() { if(this.isSupported('playControls')) { this.player.controls.stop(); unhidePlayerImage(); } }
WMPInterface.prototype.restart = function()
{
	this.stop();
	this.generateCompleteURL();
	if(this.isSupported('sourceChange'))
	{
		if(isSet(this.player.URL))
			this.player.URL = this.getCompleteURL();
		else
			this.player.filename = this.getCompleteURL();
	}
	this.play();
}

WMPInterface.prototype.playURL = function(url)
{
	// * Afgør om adressen er relativ, og i så fald benyt den globale indstilling til en fuld adresse
	if(url.substring(0, 1) == "/")
		url = streamURLsRelativeTo + url.substring(1); // * Medtag ikke "/" i starten
	else if(!url.match(/(^[a-z0-9A-Z]+:\/\/)/)) // * Hvis uri'en ikke indeholder en protokol
		url = streamURLsRelativeTo + "/" + url;
	
	// * Hvis kilden skiftes og autoplay er sat til, så afspilles den nye URL-adresse automatisk
	this.setURL(url);
	this.restart();
}

WMPInterface.prototype.next = function() { this.player.controls.next(); }
WMPInterface.prototype.previous = function() { this.player.controls.previous(); }

// * Hvis en anden WMP/Player sender andre værdier, eller ikke understøtter at hente en
//   playstate direkte som tal, skal man skrive en metode som laver en tilsvarende playstate
WMPInterface.prototype.getState = function() { return this.player.playState; }

// * Metode til at sætte det komplette URL, udfra kvalitet og stream URL eller andre indstillinger
WMPInterface.prototype.generateCompleteURL = function()
{
	if (this.useBitrate) {
		this.completeURL = this.baseURL + "&bitrate=" + this.getQuality();
	} else {
		this.completeURL = this.baseURL;
	}
}

WMPInterface.prototype.getURL = function()
{
	// * Der er muligvis en bug i WMP der gør at man ikke kan se den scriptede URL, derfor tror vi mere på startClipURL
	return this.baseURL;
}

WMPInterface.prototype.setURL = function(url)
{
	this.baseURL = url;
	// * Opdater den fulde URL da den ændrer sig ved baseURL-skift.
	this.generateCompleteURL();
}

WMPInterface.prototype.getCompleteURL = function()
{
	// * Sørg for at URLen er opdateret.
	this.generateCompleteURL();
	
	if (this.useBitrate) {
		return this.getURL() + "&bitrate=" + this.getQuality();
	} else {
		return this.getURL();
	}
}

// * Nuværende klips længde i sekunder
WMPInterface.prototype.getDuration = function()
{
	if(this.player.currentMedia)
		return this.player.currentMedia.duration;
	else if(this.player.getDuration)
		return this.player.getDuration();
	else
		return 0;
}

// * Nuværende position i klippet i sekunder
WMPInterface.prototype.getPosition = function()
{
	if(this.isSupported('playControls'))
	{
		if(isSet(this.player.controls.currentPosition))
			return this.player.controls.currentPosition;
		else if(this.player.getTime)
			return this.player.getTime();
		else
			return -1;
	}
	else
	{
		return -1;
	}
	
}

WMPInterface.prototype.setPosition = function(seconds)
{
	if(this.isSupported('playControls'))
	{
		if(this.player.controls.currentPosition)
			this.player.controls.currentPosition = seconds;
		else if(this.player.currentPosition)
			this.player.currentPosition = seconds;
	}
	else
	{
		alert('Kan ikke skifte position');
	}
}

// * Sæt volumen med et tal fra 0 (mute) til 100 (maks) - der regnes derfor i procenter.
WMPInterface.prototype.setVolume = function(volume)
{ 
	try
	{
		if (volume > 0)
			this.player.settings.volume = volume;
		else if(volume > 100)
			this.player.settings.volume = 100;
		else
			this.player.settings.volume = 0;
	}
	catch(e)
	{
		// * do nothing about it
	}
}

// * Returnerer volumen i procent (0 er mute, 100 er maks)
WMPInterface.prototype.getVolume = function()
{
	if(this.isSupported('volumeControl'))
		return this.player.settings.volume;
	else
		return -1;
}

WMPInterface.prototype.setFullscreen = function(fullscreen)
{
	try
	{
		this.player.fullScreen = (fullscreen ? 'true' : 'false');
	}
	catch(ex)
	{
		alert('Du skal først afspille en film før du kan skifte til fuld skærm');
	}
}

WMPInterface.prototype.mute = function()
{
	if( this.player.settings.mute )
	{
		this.player.settings.mute = false;
	}
	else
	{
		this.player.settings.mute = true;
	}
}

WMPInterface.prototype.isMuted = function()
{
	return this.player.settings.mute;
}


WMPInterface.prototype.isSupported = function(featureIdentifier)
{
	return this.supportedFeatures[featureIdentifier];
}

WMPInterface.prototype.getWMPVersion = function()
{
	return this.player.versionInfo;
}

WMPInterface.prototype.attachPlayStateListener = function(callback)
{
	this.playStateListeners.push(callback);
}

WMPInterface.prototype.close = function()
{
	this.player.close();
}

WMPInterface.prototype.triggerPlayStateChange = function(newState)
{
	if(isSet(newState) == false)
		newState = this.getState();
	
	if(newState != this.previousPlayState)
	{
		this.previousPlayState = newState;
		for(var i = 0; i < this.playStateListeners.length; i++)
		{
			this.playStateListeners[i](newState);
		}
	}
}

WMPInterface.prototype.attachPositionListener = function(callback)
{
	this.positionListeners.push(callback);
}

WMPInterface.prototype.triggerPositionChange = function(newPosition)
{
	for(var i = 0; i < this.positionListeners.length; i++)
	{
		this.positionListeners[i](newPosition);
	}
}

WMPInterface.prototype.attachVolumeListener = function(callback)
{
	this.volumeListeners.push(callback);
}

WMPInterface.prototype.triggerVolumeChange = function(newVolume)
{
	for(var i = 0; i < this.volumeListeners.length; i++)
	{
		this.volumeListeners[i](newVolume);
	}
}

WMPInterface.prototype.attachErrorListener = function(callback)
{
	this.errorListeners.push(callback);
}

WMPInterface.prototype.triggerError = function(no, description)
{
	for(var i = 0; i < this.errorListeners.length; i++)
	{
		this.errorListeners[i](no, description);
	}
}


// * Funktionen vil selv kalde sig selv
// * Intervallet er dynamisk, da intervallet sættes ned under buffering 
//   for hurtigere at vise filmen når den er klar

WMPInterface.prototype.pollPlayer = function()
{
	//var tickInterval = 500;
	if(mediaPlayer != null)
	{
		if(this.isSupported('playControls'))
			this.triggerPositionChange(this.getPosition());
		
		if(this.isSupported('volumeControl'))
			this.triggerVolumeChange(this.getVolume());
		
		if(isSet(this.player) && isSet(this.player.error) && this.player.error.errorCount > 0)
		{
			var numErrors = this.player.error.errorCount;
			for(var i = 0; i < numErrors; i++)
			{
				var errorItem = this.player.error.item(0);
				this.triggerError(errorItem.errorCode, errorItem.errorDescription);
			}
			this.player.error.clearErrorQueue();
		}
		
		if(this.isSupported("playStates"))
		{
			this.triggerPlayStateChange(this.getState());
		}
	}
	//setTimeout(this.pollPlayer, tickInterval);
}



