/********************************************************************************
 ** BaseNodeListener 
 ** - Superclass for other listeners
 *******************************************************************************/

// Declare find player.
var findPlayer = xmp.baseplayer.BasePlayer.findPlayer;

function CNNPlayerListener( name, player ) {
	CNNPlayerListener.ctor.call( this, name, player );
}

// Derive "CNNPlayerListener" from "AbstractNodeListener".
xmp.DERIVE_CLASS( xmp.baseplayer.listeners.DefaultPlayerListener, CNNPlayerListener );

CNNPlayerListener.prototype.setStatus = function( node, status, details ) {
	CNNPlayerListener.base.setStatus.call(this, node, status, details);
};

CNNPlayerListener.prototype.handleEnded = function( node ) {
	callControllerMethod('setEnabled',false);
	callControllerMethod('setEmailEnabled',true);
	callControllerMethod('setTime',0);
	if (CNNPlaylistManager.getInstance().controller == null && node.getNodeTypeId() != "GenericSlate") {
		callControllerMethod('togglePlay',false);	
	}
};
CNNPlayerListener.prototype.handleBuffering = function( node, buffStateObj ) {
	callControllerMethod('setLoadedPercent',(0.01*buffStateObj.percent));
};
CNNPlayerListener.prototype.handleTimelineChange = function( node, position, duration ) {
	if (node.getNodeTypeId() != "GenericSlate") {
		if (CNNPlayer.getActivePlayer().isScrubbing == false) {
			if (CNNPlaylistManager.getInstance().controller == null) { callControllerMethod('togglePlay',true); }
			callControllerMethod('setTime',position);
		}
	}
};
CNNPlayerListener.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;
};
CNNPlayerListener.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 = xmp.baseplayer.BasePlayer.createCategoryLogger( 'AdNodeListener' );
}

xmp.DERIVE_CLASS( xmp.baseplayer.listeners.DefaultAdNodeListener, AdNodeListener );

AdNodeListener.prototype.handlePlay = function( node ) {
	callControllerMethod('setScrubberEnabled',false);
	callControllerMethod('turnOffSharing',false);
};

AdNodeListener.prototype.handleRenderAd = function(node, resource, renderer) {
		this.getPlayer().renderAdResource(node, resource, renderer);
};

AdNodeListener.prototype.handleComplete = function( node ) {	
	AdNodeListener.base.handleComplete.call( this, node );	

	if (flipBool) {
  this.getPlayer().renderAds(node, 'external');
	} else {
		flipBool = true;
	}

	callControllerMethod('setEnabled',true);
	callControllerMethod('setScrubberEnabled',false);
	callControllerMethod('setDuration', node.getPlayableData().getDataObject().trt);

	if (CNNPlaylistManager.getInstance().activePlaylist == 'saplaylist') {
		CNNPlaylistManager.getInstance().SAConfiguration.updateContentHandler(this.getPlayer()._findNextContentNode().getPlayableData().getDataObject());
	}
};

var flipBool = false;

AdNodeListener.prototype.handleOverrideAdResources = function(node, overrideContext) {
	var contextName = overrideContext.expandString('${player.context_name}');
	var nodeTypeId = node.getNodeTypeId();
	if (flipBool) {
		overrideContext.removeAllResources();
		
		var syncArray = new Array();
		for (var i = 0; i < CNNPlaylistManager.getInstance().SAConfiguration.adList.length; i++) {
			if (CNNPlaylistManager.getInstance().SAConfiguration.adList[i].divName == null) {
				overrideContext.addNewResource(CNNPlaylistManager.getInstance().SAConfiguration.adList[i].adName, 'primary');
			} else {
				syncArray[syncArray.length] = 'synch_unit' + (syncArray.length + 1);
				overrideContext.addNewResource(CNNPlaylistManager.getInstance().SAConfiguration.adList[i].adName, ('synch_unit'+(syncArray.length)));
			}
		}
		syncArray[syncArray.length] = 'primary';
		overrideContext.setNodeAssociatedResourceBundleTypes(syncArray);

	}
};

/********************************************************************************
 **  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 ) {	
	// atlas integration
	CNNPlaylistManager.getInstance().killAtlas();

	GenericSlateNodeListener.base.handleComplete.call( this, node );
	
	if (node.getMetadata('slateType', xmp.NO_DEFAULT_VALUE ) == 'startSlate') {
		this.getPlayer().renderAds(node, 'external');
	}
};

GenericSlateNodeListener.prototype.handleRenderAd = function(node, resource, renderer) {
	if (node.getMetadata('slateType', xmp.NO_DEFAULT_VALUE ) == 'startSlate') {
		this.getPlayer().renderAdResource(node, resource, renderer);
	}
};

GenericSlateNodeListener.prototype.handleOverrideAdResources = function(node, overrideContext) {
	if (node.getMetadata('slateType', xmp.NO_DEFAULT_VALUE ) == 'startSlate') {

		var syncArray = new Array();
		for (var i = 0; i < CNNPlaylistManager.getInstance().SAConfiguration.adList.length; i++) {
			if (CNNPlaylistManager.getInstance().SAConfiguration.adList[i].divName == null) {
				overrideContext.addNewResource(CNNPlaylistManager.getInstance().SAConfiguration.adList[i].adName, 'primary');
			} else {
				syncArray[syncArray.length] = 'synch_unit' + (syncArray.length + 1);
				overrideContext.addNewResource(CNNPlaylistManager.getInstance().SAConfiguration.adList[i].adName, ('synch_unit'+(syncArray.length)));
			}
		}
		overrideContext.setNodeAssociatedResourceBundleTypes(syncArray);

		// Find the first PreRoll, refer to the ad resources in it.
		var lookAheadArray = this.getPlayer().getLookAheadNodeArray();
		for (var i=0; i<lookAheadArray.length; i++) {
			var testNode = lookAheadArray[i];
			if (testNode.getNodeTypeName() === 'PreRoll') {
				overrideContext.copyMetaResourceBundleRefTo(testNode,['primary']);
				break;
			}
		}
	}
};

/********************************************************************************
 ** 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);
	if (CNNPlaylistManager.getInstance().controller == null) { callControllerMethod('togglePlay',false); }
	CNNPlayer.getActivePlayer().callEnded();
}

VideoNodeListener.prototype.handleComplete = function( node ) {	
	// atlas integration
	CNNPlaylistManager.getInstance().killAtlas();

	VideoNodeListener.base.handleComplete.call( this, node );	

	callControllerMethod('newVideo', true);
	callControllerMethod('setEnabled', true);
	callControllerMethod('setScrubberEnabled',true);
	callControllerMethod('setDuration', node.getPlayableData().getDataObject().trt);

	if (CNNPlaylistManager.getInstance().activePlaylist == 'saplaylist') {
		CNNPlaylistManager.getInstance().SAConfiguration.updateContentHandler(node.getPlayableData().getDataObject());
	}
};

VideoNodeListener.prototype.handleRender = function( node ) {
	if ("Expired" == node.getPlayableData().getDataObject().isExpired || false == node.getPlayableData().getDataObject().isEmbeddable) { 
		callControllerMethod('setEnabled',false);
		callControllerMethod('setTime',0);
		if (CNNPlaylistManager.getInstance().controller == null) { callControllerMethod('togglePlay',false); }
		CNNPlaylistManager.getInstance().isVideoError = true;
		this.getPlayer().advance();
	} else {
		callControllerMethod('videoStarted', true);
		this.getPlayer().open( node );
	}
};

VideoNodeListener.prototype.handleError = function( node, err ) {
	callControllerMethod('setEnabled',false);
	callControllerMethod('setTime',0);
	if (CNNPlaylistManager.getInstance().controller == null) { 
		callControllerMethod('togglePlay',false); 
	}
	CNNPlaylistManager.getInstance().isVideoError = true;
	CNNPlaylistManager.getInstance().errorObject = err;
	this.getPlayer().advance();
};
