/********************************************************************************
 ** BaseNodeListener 
 ** - Superclass for other listeners
 *******************************************************************************/

// Declare find player.
var findPlayer = xmp.baseplayer.BasePlayer.findPlayer;

function XMPPlayerListener( name, player ) {
	XMPPlayerListener.ctor.call( this, name, player );
}

// Derive "XMPPlayerListener" from "AbstractNodeListener".
xmp.DERIVE_CLASS( xmp.baseplayer.listeners.DefaultPlayerListener, XMPPlayerListener );

XMPPlayerListener.prototype.setStatus = function( node, status, details ) {
	XMPPlayerListener.base.setStatus.call(this, node, status, details);
};

XMPPlayerListener.prototype.handleEnded = function( node ) {
	callControllerMethod('setEnabled',false);
	callControllerMethod('setEmailEnabled',true);
	callControllerMethod('setTime',0);
	if (node.getNodeTypeId() != "GenericSlate") {
		callControllerMethod('togglePlay',false);	
	}
};
XMPPlayerListener.prototype.handleBuffering = function( node, buffStateObj ) {
	callControllerMethod('setLoadedPercent',(0.01*buffStateObj.percent));
};
XMPPlayerListener.prototype.handleTimelineChange = function( node, position, duration ) {
	if (node.getNodeTypeId() != "GenericSlate") {
		if (XMPPlayer.getActivePlayer().isScrubbing == false) {
			callControllerMethod('togglePlay',true);
			callControllerMethod('setTime',position);
		}
	}
};
XMPPlayerListener.prototype._findNextContentNode = function( ) {	
	var lookAhead = this.getPlayer().getLookAheadNodeArray();	
	for ( var i = 0; i < lookAhead.length; i++ ) {
		var node = lookAhead[i];
		if ( node.isContentType() ) {
			return node;
		}
	}	
	return null;
};
XMPPlayerListener.prototype._findPreviousContentNode = function( ) {	
	var lookBehind = this.getPlayer().getLookBehindNodeArray();
	for ( var i = 0; i < lookBehind.length; i++ )
	{
		var node = lookBehind[i];
		if ( node.isContentType() ) {
			return node;
		}
	}
	return null;
};

/********************************************************************************
 ** AdNodeListener
 ** - drives ad videos
 *******************************************************************************/

function AdNodeListener(name, player ) {
	AdNodeListener.ctor.call( this, name, player );
	this._logger = new xmp.util.internals.CategoryLogger( 'AdNodeListener' );
}

xmp.DERIVE_CLASS( xmp.baseplayer.listeners.DefaultAdNodeListener, AdNodeListener );

AdNodeListener.prototype.handlePlay = function( node ) {
	callControllerMethod('setScrubberEnabled',false);
};

AdNodeListener.prototype.handleRenderAd = function(node, resource, renderer) {
   this.getPlayer().renderAdResource(node, resource, renderer);
};

//AdNodeListener.prototype.handleOpen = function( node ) {
//	if (node.getNodeTypeId() != "AdInsertNotForSale" && XMPPlaylistManager.getInstance().SAConfiguration.loadSynchUnit != false) {
//		this.getPlayer().loadSynchUnit(node);
//	}
//}

AdNodeListener.prototype.handleComplete = function( node ) {	
	AdNodeListener.base.handleComplete.call( this, node );	
	if (XMPPlaylistManager.getInstance().SAConfiguration.loadSynchUnit != false) {
	  this.getPlayer().renderAds(node, 'external');
	}
	
	callControllerMethod('setEnabled',true);
	callControllerMethod('setScrubberEnabled',false);
	callControllerMethod('setDuration', node.getPlayableData().getDataObject().trt);

	if (XMPPlaylistManager.getInstance().activePlaylist == 'saplaylist') {
		XMPPlaylistManager.getInstance().SAConfiguration.updateContentHandler(this.getPlayer()._findNextContentNode().getPlayableData().getDataObject());
	}
	
	if ( XMPPlaylistManager.getInstance().SAConfiguration.videoDivId == 'cnnXMPlive' ) {
		new Insertion.Top('cnnXMPliveControls', '<div id="xmpControlsMessage">Buffering live stream...</div>');
	}
};

AdNodeListener.prototype.handleOverrideAdResources = function(node, overrideContext) {
	var contextName = overrideContext.expandString('${player.context_name}');
	var nodeTypeId = node.getNodeTypeId();
	if (nodeTypeId != 'SponsoredAd' && XMPPlaylistManager.getInstance().activePlaylist == 'saplaylist' && XMPPlaylistManager.getInstance().SAConfiguration.overrideVideoAd == true) {
		if (nodeTypeId == 'PreRoll' &&  XMPPlaylistManager.getInstance().SAConfiguration.overridePreRoll != null) {
			overrideContext.getResource('primary').setId(XMPPlaylistManager.getInstance().SAConfiguration.overridePreRoll);
		}
		if (nodeTypeId == 'PostRoll' &&  XMPPlaylistManager.getInstance().SAConfiguration.overridePostRoll != null) {
			overrideContext.getResource('primary').setId(XMPPlaylistManager.getInstance().SAConfiguration.overridePostRoll);
		}
		if (XMPPlaylistManager.getInstance().SAConfiguration.loadSynchUnit != false) {
			overrideContext.getResource('synch_unit').setId(XMPPlaylistManager.getInstance().SAConfiguration.overrideSyncUnit);
		} 
	}
};

/********************************************************************************
 **  qSlateNodeListener
 ** - shown if an error occurs in a video or if a video is expired
 *******************************************************************************/

function GenericSlateNodeListener( name, player ) {
	GenericSlateNodeListener.ctor.call( this, name, player );
}  

xmp.DERIVE_CLASS( xmp.baseplayer.listeners.DefaultSlateNodeListener, GenericSlateNodeListener );

GenericSlateNodeListener.prototype.handleComplete = function( node ) {	
	GenericSlateNodeListener.base.handleComplete.call( this, node );
	
};

/********************************************************************************
 ** VideoNodeListener
 ** - drives all video content nodes
 *******************************************************************************/

function VideoNodeListener( name, player ) {
	VideoNodeListener.ctor.call( this, name, player, false );		
}

xmp.DERIVE_CLASS( xmp.baseplayer.listeners.DefaultVideoNodeListener, VideoNodeListener );

VideoNodeListener.prototype.handleEnded = function( node ) {
	callControllerMethod('setEnabled',false);
	callControllerMethod('setTime',0);
	callControllerMethod('togglePlay',false);	
	XMPPlayer.getActivePlayer().callEnded();
}

VideoNodeListener.prototype.handleComplete = function( node ) {	
	if (XMPPlaylistManager.getInstance().SAConfiguration.videoDivId == 'cnnXMPhome') {
		this.getPlayer().advance();
	}
	VideoNodeListener.base.handleComplete.call( this, node );	

	callControllerMethod('setEnabled', true);
	callControllerMethod('setScrubberEnabled',true);
	callControllerMethod('setDuration', node.getPlayableData().getDataObject().trt);

	if (XMPPlaylistManager.getInstance().activePlaylist == 'saplaylist') {
		XMPPlaylistManager.getInstance().SAConfiguration.updateContentHandler(node.getPlayableData().getDataObject());
	}
	if ( node.getPlayableData().getDataObject().mediaType == 'audio' ) {
		if ( navigator.userAgent.toLowerCase().indexOf('mac') == -1 ) {
			$('cnnXMPaudio').style.display = 'block';
			$('cnnXMPvod').style.position = 'absolute';
			$('cnnXMPvod').style.left = '-800px';
			$('cnnXMPvod').style.top = '-800px';
		} 
		else {
			$('cnnXMPaudio').style.position = 'absolute';
			$('cnnXMPaudio').style.display = "block";
		}
	}
};

VideoNodeListener.prototype.handleRender = function( node ) {
	if ("Expired" == node.getPlayableData().getDataObject().isExpired) { 
		callControllerMethod('setEnabled',false);
		callControllerMethod('setTime',0);
		callControllerMethod('togglePlay',false);	
		XMPPlaylistManager.getInstance().isVideoError = true;
		this.getPlayer().advance();
	}
	else {
		this.getPlayer().getMediaPlayer().open( node );
	}
};

VideoNodeListener.prototype.handleError = function( node, err ) {
	callControllerMethod('setEnabled',false);
  callControllerMethod('setTime',0);
  callControllerMethod('togglePlay',false);
  XMPPlaylistManager.getInstance().isVideoError = true;
  XMPPlaylistManager.getInstance().errorObject = err;
	this.getPlayer().advance();
};
