// ************************************************************************************************
// *** Constructs the ig player object (It wraps the general player object)
// ************************************************************************************************

function PlayerIg(playerName) {
	// ************************************************************************************************
	// *** Interface
	// ************************************************************************************************	
	
	// Fields
	// ******
	this.playerName = playerName;
	this.positionSlider = null;
	this.volumeSlider = null;
	this.setIntervalId = 0;
	
	// Methods
	// *******
	this.fullScreen = player_FullScreen;
	this.next = player_Next;
	this.play = player_Play;
	this.playItem = player_PlayItem;
	this.previous = player_Previous;
	this.getCurrentMediaId = player_GetCurrentMediaId;
	this.getCurrentPlaylist = player_GetCurrentPlaylist;
	this.setCurrentPlaylist = player_SetCurrentPlaylist;
	this.switchMute = player_SwitchMute;
	this.switchQuality = player_SwitchQuality;
	this.syncVolume = player_SyncVolume;
	this.updatePositionSlider = player_UpdatePositionSlider;
	this.getCurrentMedia = player_GetCurrentMedia;
	this.updateBuyButton = player_UpdateBuyButton;
	this.controlSubscription = player_ControlSubscription;

	// ************************************************************************************************
	// *** Implementation
	// ************************************************************************************************
	
	// Fields
	// ******
	this.cookieManager = new CookieManager('megaplayer_session', null, window.location.toString().match('^(http://)?([^/]+)')[2]);
	this.currentPlaylist = null;
	this.player = new PlayerWm(this.playerName + '.player', document.getElementById('playerObj'));
	this.playState = new PlayState();
	this.quality = new Quality();
	this.tools = new Tools();
	this.lastIndex = null;
	this.lastMedia = null;
	this.isControlsEnabled = true;
	
	// Methods
	// *******
	this.setVolume = player_SetVolume;
	this.setPlCurrentItem = player_SetPlCurrentItem;
	this.setPosition = player_SetPosition;
	this.updateMute = player_UpdateMute;
	this.updateStatusMessage = player_UpdateStatusMessage;
	this.updateTimeInfo = player_UpdateTimeInfo;	
	this.updateVote = player_UpdateVote;
	this.updateBanner = player_UpdateBanner;
	this.updatePlayPauseButton = player_UpdatePlayPauseButton;
	this.writeCookie = player_WriteCookie;
	
	// Bind event handlers
	// *******************
	this.player.onCurrentMediaChange.add(this.playerName, 'controlSubscription');
	this.player.onCurrentMediaChange.add(this.playerName, 'updateTimeInfo');
	this.player.onCurrentMediaChange.add(this.playerName, 'setPlCurrentItem');
	this.player.onCurrentMediaChange.add(this.playerName, 'updateVote');
	this.player.onCurrentMediaChange.add(this.playerName, 'updateBanner');
	this.player.onCurrentMediaChange.add(this.playerName, 'writeCookie');
	this.player.onCurrentMediaChange.add(this.playerName, 'updateBuyButton');
	this.player.onCurrentPositionChange.add(this.playerName, 'updateTimeInfo');
	this.player.onCurrentPositionChange.add(this.playerName, 'updatePositionSlider');
	this.player.onMuteChange.add(this.playerName, 'updateMute');
	this.player.onPlayerStateStringChange.add(this.playerName, 'updateStatusMessage');
	this.player.onPlayStateChange.add(this.playerName, 'updatePlayPauseButton');
	
	// Enable full screen mode
	function player_FullScreen() {
		this.player.fullScreen();
	}
	
	// Plays the next playlist item
	function player_Next() 
	{
		if(this.isControlsEnabled)
		{
			var index, currentMedia, currentPlaylist;
			
			// Get the current media item
			currentMedia = this.player.getCurrentMedia();
			
			// Get the current playlist
			currentPlaylist = this.player.getCurrentPlaylist();
			
			// Set the current media item in the playlist
			if(currentMedia != null && currentPlaylist != null)
			{
				index = currentPlaylist.indexOf(currentMedia);
				// It isn't the last media.
				if(index < currentPlaylist.count()- 1)
				{
					this.playItem(index + 1);
				}
			}
		}
	}
	
	// Plays a specific playlist item
	function player_PlayItem(index) 
	{
		this.player.playItem(index);
	}
	
	// Plays the current media item
	function player_Play() {
		if(this.isControlsEnabled)
		{
			if(this.player.getPlayState() == this.playState.playing)
				this.player.pause();
			else
				this.player.play();
		}
	}
	
	// Plays the previous playlist item
	function player_Previous() {
		if(this.isControlsEnabled)
		{
			var index, currentMedia, currentPlaylist;
			
			// Get the current media item
			currentMedia = this.player.getCurrentMedia();
			
			// Get the current playlist
			currentPlaylist = this.player.getCurrentPlaylist();
			
			// Set the current media item in the playlist
			if(currentMedia != null && currentPlaylist != null)
			{
				index = currentPlaylist.indexOf(currentMedia);
				// It isn't the first media.
				if(index > 0)
				{
					this.playItem(index - 1);
				}
			}
			
		}
	}
	
	// Gets current playlist
	function player_GetCurrentPlaylist() {
		return this.currentPlaylist;
	}
	
	// Sets current playlist
	function player_SetCurrentPlaylist(pl) {
		this.currentPlaylist = pl;
		this.player.setCurrentPlaylist(pl.playlist);
	}
	
	// Switches the mute flag
	function player_SwitchMute()
	{
		var bMute = this.player.getMute();
		
		// Set mute player mute state
		this.player.setMute(!bMute);
	}
	
	// Switches the quality
	function player_SwitchQuality() {
		
		// Gets the previous state
		var state = this.player.getPlayState();
		
		// Gets the previous position
		var pos = -1;
		var currentMedia = this.player.getCurrentMedia();
		var currentPlaylist = this.player.getCurrentPlaylist();

		// Set the current media item in the playlist
		if(currentMedia != null && currentPlaylist != null)
			pos = currentPlaylist.indexOf(currentMedia);
	
		var currentQuality = this.player.getQuality();
		var imgObj = document.getElementById('qualityImg');

		// Change image
		if(imgObj != null)
		{
			if (currentQuality == this.quality.high)
			{
				imgObj.src = 'image/labelBroadband.gif';
				imgObj.title = 'Broadband';
			}
			else
			{
				imgObj.src = 'image/labelDialUp.gif';
				imgObj.title = 'Dial-up';
			}
		}
			
		// Set quality
		this.player.setQuality((currentQuality == this.quality.high) ? this.quality.low : this.quality.high);
		
		// Starts playback, if necessary
		if(pos>=0 && state == this.playState.playing)
			this.player.playItem(pos);
	}
	
	// Sets the current position
	function player_SetPosition() {		
		this.player.setPosition(this.positionSlider.getValue() * this.player.getCurrentMediaDuration());
	}
	
	// Sets the playlist current item
	function player_SetPlCurrentItem() {
		var index, currentMedia, currentPlaylist;
		
		// Enable player's controls.
		this.isControlsEnabled = true;
		
		// Get the current media item
		currentMedia = this.player.getCurrentMedia();
		
		// Get the current playlist
		currentPlaylist = this.player.getCurrentPlaylist();
		
		// Set the current media item in the playlist
		if(currentMedia != null && currentPlaylist != null) 
		{
			index = currentPlaylist.indexOf(currentMedia);
			this.currentPlaylist.setCurrentMediaItem(index);
			
			if(this.lastIndex != null && this.lastMedia != null)
			{
				// If it is at the same index, the last media was a preview and the current does not.
				// then disable controls
				if((this.lastIndex == index) && (this.lastMedia.isPreview == false) && (currentMedia.isPreview == true))
				{
					// Disable player's controls because the current media is a vignette.
					this.isControlsEnabled = false;
				}
				else
				{
					this.lastIndex = index;
					this.lastMedia = currentMedia;
				}
			}
			else
			{
				this.lastIndex = index;
				this.lastMedia = currentMedia;
			}
		}
	}
	
	// Sets the player's volume
	function player_SetVolume() {
		this.player.setVolume(this.volumeSlider.getValue() * 100);
	}
	
	// Sets status message
	function player_UpdateStatusMessage() {
		var statusTag = document.getElementById('playerStatus');
		
		if(statusTag != null)
			statusTag.innerHTML = this.player.getStatus();		
	}
	
	// Updates time info
	function player_UpdateTimeInfo() {
		var timeInfoTag = document.getElementById('playerTimeInfo');
		var duration = this.player.getCurrentMediaDuration();
		var currentPosition = (!this.player.getPosition()) ? 0 : this.player.getPosition();
		
		if(timeInfoTag != null)
			timeInfoTag.innerHTML = this.tools.formatSeconds(currentPosition) + ' | ' + this.tools.formatSeconds(duration);
	}
	
	// Syncronizes the slider with player volume
	function player_SyncVolume() {
		this.volumeSlider.setValue(this.player.getVolume() / 100);
	}
	
	// Update position slider
	function player_UpdatePositionSlider() {
		var currentMediaDuration;
		var newPosition;
		
		// Move the position slider only if it is not being dragged
		if(!this.positionSlider.isDragging) {
			currentMediaDuration = this.player.getCurrentMediaDuration();
			newPosition = (currentMediaDuration > 0) ? this.player.getPosition() / currentMediaDuration : 1
			
			if(newPosition == 0) newPosition++;
			
			this.positionSlider.setValue(newPosition);
		}
	}
	
	// Update mute button
	function player_UpdateMute() {
		var obj;
		
		if (! this.player)
			return;
			
		var bMute = this.player.getMute();
		// Get the volume table object
		obj = document.getElementById('btnMute');
		
		// Set the image		
		if(obj != null)
			obj.className = bMute ? 'muteOn' : 'muteOff';
	}
	
	// Update play/pause button
	function player_UpdatePlayPauseButton() {
		var playState = this.player.getPlayState();
		var imgObj = document.getElementById('imgPlayPause');
		
		if(imgObj == null) // If we cannot find the play/pause image, do nothing
			return;
		
		if(playState != this.playState.playing && imgObj.src.indexOf('image/buttonPlay.gif') == -1)
			imgObj.src = 'image/buttonPlay.gif';
		else if(playState == this.playState.playing && imgObj.src.indexOf('image/buttonPause.gif') == -1)
			imgObj.src = 'image/buttonPause.gif';
	}
	
	// Writes the current media item in a cookie
	function player_WriteCookie()
	{
		var currentMedia = this.player.getCurrentMedia();
		var currentIndex = this.getCurrentPlaylist().playlist.indexOf(currentMedia);
		
		this.cookieManager.setValue('curItem', currentIndex);
	}
	
	function player_GetCurrentMediaId()
	{
		var currentMedia = this.player.getCurrentMedia();
		if(currentMedia)
		{
			return(currentMedia.contentId);
		}
		return(0);		
	}
	
	// Update vote information
	function player_UpdateVote() 
	{
		// Releases the vote
		Vote_Unlock();
	}
	
	// Updates banner
	function player_UpdateBanner() 
	{
		if(this.player)
		{
			var currentMedia = this.player.getCurrentMedia();
			var prev = currentMedia.isPreview.toLowerCase() ;

			if(currentMedia)
			{
				if(currentMedia.bannerUrl)
				{
					updateBannerFrame(currentMedia.bannerUrl,prev);
					/*var frameAds = document.getElementById('frameAds');
					if(frameAds)
					{	
						if(frameAds.src!=currentMedia.bannerUrl)
						{	
							frameAds.src=currentMedia.bannerUrl;
						}
					}*/
				}
			}
		}
	}
	
	function player_GetCurrentMedia()
	{
		return (this.player.getCurrentMedia());
	}
	
	function player_UpdateBuyButton ()
	{
		//Show/Hide the Buy Button - based on "item.canBuy" property
		var buttonBuyNow = parent.document.getElementById('BuyNowPlayer');
		var item = playerIg.getCurrentMedia();
		
		if (buttonBuyNow)
		{
			if (item)
			{
				if (item.canBuy == 'true')
					buttonBuyNow.style.visibility = 'visible';
				else
					buttonBuyNow.style.visibility = 'hidden';
			}
		}
	}
	
	function player_ControlSubscription ()
	{
		/*clearInterval(this.setIntervalId);
		
		if (ControlSubscription())
		{
			this.setIntervalId = setInterval ("AddSubscriptionUsedTime()", 5000);
		}*/
	}

}