var XMP_PLAYER = "XMP_PLAYER";
var findPlayer = xmp.baseplayer.BasePlayer.findPlayer;
var playerInstances = new Array();
var currentPlayer = '';

function callControllerMethod(p_method, p_arg) 
{
	var returnVal;
	if (XMPPlaylistManager.getInstance().controller != null) {
		// we're using the DHTML control structure
		var cntl = XMPPlaylistManager.getInstance().controller;
		returnVal = cntl.handleXMPEvent(p_method, p_arg);
	} 
	else {
		try {
			if ( XMPPlaylistManager.getInstance().activePlaylist == 'saplaylist' ) {
				XMPPlaylistManager.getActivePlayer()._logger.warn("***************** "+p_method+" -- "+p_arg);
				returnVal = XMPPlaylistManager.getInstance().SAConfiguration.controlsHandler(p_method, p_arg);
			}
		} 
		catch(err) {
			// catch error and ignore, usually caused by xmp loading before controller plugin
		}
	}
	
	if ( typeof(returnVal) != "undefined" ) return returnVal;
}

function initAdServerCookies(docDomain)
{
	if (xmp.util.Cookie.canUse()) // can the user read/write cookie values?
	{
		var cnnAdCookieIsSet = xmp.util.Cookie.read('adDEon');
		if (!cnnAdCookieIsSet)
		{
			var imgSrc = 'http://gdyn.' + docDomain + '/1.1/1.gif';
			window.top.document.images['cookieCrumb'].src = imgSrc;
		}
	}		
}

function XMPPlayer(options, parameters) {
	initAdServerCookies('cnn.com');
	var categoryFilterArray = [/*'AjaxRequestManager', 'VideoContentMetaFileLoader'*/]; // allows filtering out of categories with too many messages.
	var parameters = [ ];
	XMPPlayer.ctor.call( this, XMP_PLAYER, options, parameters );	
}

xmp.DERIVE_CLASS( xmp.baseplayer.BasePlayer, XMPPlayer );

XMPPlayer.create = function() {
	xmp.util.LogConfigurator.configure();

  var cnnIsIntl = (location.hostname.indexOf('edition.') > -1) ? true : false;
  var cnnIsIntlUS = (location.hostname.indexOf('us.') > -1) ? true : false;

	/* 
	 * Build Map is where variables are defined	
	 */
	var buildMap = {};
	buildMap['ad_pattern'] = XMPPlaylistManager.getInstance().SAConfiguration.adPattern;
	buildMap['slate_size'] = XMPPlaylistManager.getInstance().slateSize;
	buildMap['omniture_trigger_command'] = XMPPlaylistManager.getInstance().SAConfiguration.omnitureTriggerCommand;
	buildMap['omniture_account'] = XMPPlaylistManager.getInstance().SAConfiguration.omniture_account;
	buildMap['nielsen_trigger_command'] = XMPPlaylistManager.getInstance().SAConfiguration.nielsenTriggerCommand;
	buildMap['webstat_trigger_command'] = XMPPlaylistManager.getInstance().SAConfiguration.webstatTriggerCommand;

	xmp.baseplayer.BasePlayer.configure([xmpPrimaryJsonObj], buildMap);

	playerInstances[0] = new XMPPlayer({}, [ ]);
	playerInstances[0].bootStrap();
}
XMPPlayer.prototype.callEnded = function() {
	XMPPlaylistManager.endOfVideoContent();
}
XMPPlayer.getInstance = function(id, context) {
	if (playerInstances[0] == null) {
	}
	return playerInstances[0];
}
XMPPlayer.setActivePlayer = function(str) { currentPlayer = str; }
XMPPlayer.getActivePlayer = function() {
	return playerInstances[0];
}
XMPPlayer.playlistContentItemCB = function() { }
XMPPlayer.secondsIntoMinutes = function(val) {
	minutes = Math.floor(val / 60);
	if (minutes > 0) seconds = val - (minutes * 60);
	else seconds = val;
	return (minutes + ':' + XMPPlayer.tenify(seconds));
}
XMPPlayer.tenify = function(val) {
	if (val - 0 < 10)
		return ("0"+val);
	return val;
}

XMPPlayer.prototype.serializerFactory = null;
XMPPlayer.prototype.playlist = null;
XMPPlayer.prototype.isSmall = false;
XMPPlayer.prototype.isScrubbing = false;
XMPPlayer.prototype.pluginError = null;
XMPPlayer.prototype.pluginErrorWindow = null;

XMPPlayer.prototype.handleLogMessage = function(level, category, message)
{
};

XMPPlayer.prototype.handleBootstrapped = function(success) {
	XMPPlaylistManager.isBootStrapped(success);
}

XMPPlayer.prototype.handleEvent = function(controllerEvent) {
	if (controllerEvent == 'playPressed') { this.play(); }
	if (controllerEvent == 'pausePressed') { this.pause(); }
	if (controllerEvent == 'scrubStarted') { this.scrubStarted(); }
	if (controllerEvent == 'scrubComplete') { this.scrubComplete(); }
	if (controllerEvent == 'volumeChanged') { this.volumeChanged(); }
	if (controllerEvent == 'sharePressed') { XMPPlaylistManager.getInstance().emailVideo(); }
}
XMPPlayer.prototype.volumeChanged = function() {
	this.getMediaPlayer().setVolume( callControllerMethod('getVolume') );
}
XMPPlayer.prototype.pause = function() {
	callControllerMethod('setScrubberEnabled',false);
	this.getMediaPlayer().pause();
	callControllerMethod('togglePlay',false);
}
XMPPlayer.prototype.play = function() {
	this.getMediaPlayer().play();
	callControllerMethod('setScrubberEnabled',true);
	callControllerMethod('togglePlay',true);
}
XMPPlayer.prototype.scrubStarted = function() {
	this.isScrubbing = true;
	callControllerMethod('togglePlay',false);
}
XMPPlayer.prototype.scrubComplete = function() {
	this.isScrubbing = false;
	toVal = callControllerMethod('getTime');
	this.getMediaPlayer().seek(toVal);
	callControllerMethod('togglePlay',true);
}
XMPPlayer.prototype.setPlaylist = function(idList,finalCallback) {
	this.serializerFactory = xmp.baseplayer.MetaFileLoaderFactory.getInstance().create('videoContentMeta');
	this.playlist = this.serializerFactory.setIds(idList, (new xmp.util.Callback('contentItemCB', XMPPlayer.playlistContentItemCB, null)));	
	this.serializerFactory.setAllLoadedCallback(new xmp.util.Callback('allContentItemsCB', finalCallback, null));
	this.serializerFactory.load();
}
XMPPlayer.prototype.getPlaylist = function() {
	return this.playlist;
}
XMPPlayer.prototype.handleMediaPlayerReady = function() {
	var mediaPlayer = this.getMediaPlayer();
	callControllerMethod('setVolume',45);
	mediaPlayer.setVolume( 45 );
	mediaPlayer.setMute( false );
	mediaPlayer.setViewportConfig( xmp.FLASH_MIME_TYPE, xmp.DHTML_VIEWPORT );	
	mediaPlayer.setViewportConfig( xmp.WINDOWS_MEDIA_MIME_TYPE, xmp.DHTML_VIEWPORT );	
	mediaPlayer.setViewportConfig( xmp.IMAGE_MIME_TYPE, xmp.DHTML_VIEWPORT );	
	mediaPlayer.setViewportConfig( xmp.DHTML_MIME_TYPE, xmp.DHTML_VIEWPORT );	
};

XMPPlayer.prototype.handleCreateViewport = function( type, name, parameters, settings ) {
	if ( type === xmp.DHTML_VIEWPORT ) {
		return this.createDHTMLViewport( type, name, parameters, settings );
	}
	return null;
};

XMPPlayer.prototype.handleFatalException = function( err ) {
	XMPPlaylistManager.getInstance().errorObject = err;
};

XMPPlayer.prototype.createDHTMLViewport = function( type, name, parameters, settings )  {
	var viewport = document.createElement( "div" );
	viewport.setAttribute( xmp.ID_ATTRIBUTE, name );
	viewport.setAttribute( xmp.NAME_ATTRIBUTE, name );
// removed per Chad and 113007 XMP release
//	viewport.setAttribute( xmp.FLASH_NATIVE_PLAYER_COMPONENT, xmp.getSWFRoot() + "FlashMediaPlayer.swf" );	


	// define div id where the video needs to display
	if (XMPPlaylistManager.getInstance().activePlaylist != 'saplaylist')
		var sample_container = document.getElementById( "cnnVPFlashLargeContainer" );
	else {
		var sample_container = document.getElementById( XMPPlaylistManager.getInstance().SAConfiguration.videoDivId );
		viewport.style.width = XMPPlaylistManager.getInstance().SAConfiguration.slateSize[0]+"px";
		viewport.style.height = XMPPlaylistManager.getInstance().SAConfiguration.slateSize[1]+"px";
	}
// removed per Chad and 113007 XMP release
//	viewport.style.position = xmp.ABSOLUTE_POSITION;
	viewport.style.backgroundColor = "#000000";	
										
	xmp.insertDomChildBefore(sample_container, viewport);

	return viewport;
};


XMPPlayer.prototype.handleRegisterNodeListeners = function() {
	this._playerListener = new XMPPlayerListener('AllNodes', this);

	var listeners = [ {object: this._playerListener, nodes: ["*"]},
		              {object: new AdNodeListener('Ad', this), nodes: ["PreRoll", "PostRoll", "SponsoredAd", "HouseAd", "AdInsertNotForSale"]},
									{object: new VideoNodeListener('Video', this), nodes: ["Content"]},
		              {object: new GenericSlateNodeListener('GenericSlate', this), nodes: ["GenericSlate"]},
		              {object: new xmp.baseplayer.listeners.DefaultSlateNodeListener('Slate', this), nodes: ["CustomSlate"]}
		              ];
		              
	for ( var i = 0; i < listeners.length; i++ )
	{
		this.registerNodeListener( listeners[i].object, listeners[i].nodes );	
	}						   
};

XMPPlayer.prototype.renderAdResource = function(node, res, renderer)
{
	var resType = res.getType();
	var synchUnitLogger = new xmp.util.internals.CategoryLogger( 'loadSynchUnit' );
	if (res.isError())
	{
//		this._my_logger.warn('Error loading ' + resType + ': ' + res.getErrorMessage());
		return;
	}
	var data = res.getDataObject();
	var dataType = res.getDataType();
	var logData = (dataType === 'html') ? 'html' : data;

	synchUnitLogger.warn('Loading ' + resType + ' with tile ID: ' + res.getCompanionAdId() + ', url: ' + data);
	
	var adDivId = 'banner_ad_div';
	var adIFrameId = 'banner_ad_iframe';
	
	if (resType.indexOf('_sponsored_ad') !== -1)
	{
		adDivId = 'sponsored_ad_div';
		adIFrameId = 'sponsored_ad_iframe';
	}
	
	synchUnitLogger.warn('Right before create banner ad');
    this._createBannerAd(adDivId, adIFrameId, data, dataType);
};

XMPPlayer.prototype._createBannerAd = function( adDivId, adIFrameId, data, dataType )
{
	XMPPlaylistManager.getInstance().SAConfiguration.loadSynchAd(data,adIFrameId);
};


XMPPlayer.prototype._findNextContentNode = function( ) {	
	var lookAhead = this.getLookAheadNodeArray();	
	for ( var i = 0; i < lookAhead.length; i++ ) {
		var node = lookAhead[i];
		if ( node.isContentType() ) {
			return node;
		}
	}	
	return null;
};
XMPPlayer.prototype._findPreviousContentNode = function( ) {	
	var lookBehind = this.getLookBehindNodeArray();
	for ( var i = 0; i < lookBehind.length; i++ )
	{
		var node = lookBehind[i];
		if ( node.isContentType() ) {
			return node;
		}
	}
	return null;
};

XMPPlayer.generateXMPErrorMessage = function(errorObjectCode) {
	switch (errorObjectCode) {
		case xmp.XmpErrorCodes.FATAL_PLATFORM:
			return "The web browser you are using to view this video is not supported.";
		case xmp.XmpErrorCodes.FATAL_PLUGIN:
			return "A plugin required to play your video could not be located.";
		case xmp.XmpErrorCodes.FATAL_PLUGIN_INIT:
			return "The video timed out attempting to play.";
		case xmp.XmpErrorCodes.CRITICAL_UNSPECIFIED_AJAX_ERROR:
			return "The video system was not able to establish connectivity due to a Proxy/Firewall or network connectivity.";
		case xmp.XmpErrorCodes.CRITICAL_PLAYER_CONNECTION:
			return "The video system was not able to establish connectivity due to a Proxy/Firewall or network connectivity.";
		default:
			return "Unspecified Fatal Error";
	}
}

function StandAloneVideoConfiguration() {
	this.videoArray = new Array();
	this.vidString = 'SAVP';
	this.vidContext = 'SAVP';
	this.slateSize = new Array(384,216);
	this.videoDivId = null;
	this.startPoint = 0;
	this.loadSynchUnit = false;
	this.overrideVideoAd = true;
	this.playSponsoredAd = false;
	this.overridePostRoll = null;
	this.overridePreRoll = null;
	this.overrideSyncUnit = null;
	this.adPattern = '/.element/js/2.0/video/common/adPatterns/default.json';
	this.omnitureTriggerCommand = 'CNN.SpecialsOmnitureTriggerCommand';
	this.nielsenTriggerCommand = 'CNN.SpecialsNielsenTriggerCommand';
	
	this.genericSlateHandler = function(slateType) {
		switch(slateType) {
			case 'startSlate':
				var backgroundImage = XMPPlaylistManager.findImageSize(XMPPlayer.getActivePlayer()._findNextContentNode().getPlayableData().getDataObject().images, XMPPlaylistManager.getInstance().slateSize)
				this.updateContentHandler(XMPPlayer.getActivePlayer()._findNextContentNode().getPlayableData().getDataObject());
				return this.startSlateHandler(backgroundImage);
				break;				
			case 'errorSlate':
				return this.errorSlateHandler(XMPPlaylistManager.getInstance().errorObject);
				break;				
			case 'endSlate':
				var backgroundImage = XMPPlaylistManager.findImageSize(XMPPlayer.getActivePlayer()._findPreviousContentNode().getPlayableData().getDataObject().images, XMPPlaylistManager.getInstance().slateSize)
				return this.endSlateHandler(backgroundImage);
				break;
			case 'midSlate':
				var backgroundImage = XMPPlayer.getActivePlayer()._findNextContentNode().getPlayableData().getDataObject().images[0].resource;
				this.updateContentHandler(XMPPlayer.getActivePlayer()._findNextContentNode().getPlayableData().getDataObject());
				return this.midSlateHandler(backgroundImage);
				break;
			case 'homepageAdSlate' :
				return this.homepageAdSlateHandler();
			default: 	
				break;
		}
	}
	
	// handlers
	this.loadSynchAd = function(data,adId) {
		document.getElementById('cnnXMPvodFooter').innerHTML = data;	
	}
	this.bootErrorHandler = function() { }
	this.initHandler = function() { }
	this.controlsHandler = function() { }
	this.updateContentHandler = function() { }	
	this.errorSlateHandler = function() { }
	this.startSlateHandler = function() { }
	this.endSlateHandler = function() { }
}

