var CNN_PLAYER = "CNN_PLAYER";
var findPlayer = xmp.baseplayer.BasePlayer.findPlayer;
var playerInstances = new Array();
var currentPlayer = '';


function callControllerMethod(p_method, p_arg) 
{
	var returnVal;
	if (CNNPlaylistManager.getInstance().controller != null) {
		// we're using the DHTML control structure
		var cntl = CNNPlaylistManager.getInstance().controller;
		returnVal = cntl.handleXMPEvent(p_method, p_arg);
	} 
	else {
		try {
			if ( CNNPlaylistManager.getInstance().activePlaylist == 'saplaylist' ) {
				returnVal = CNNPlaylistManager.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';
			document.images['cookieCrumb'].src = imgSrc;
		}
	}		
}

function CNNPlayer(options, parameters) {
	initAdServerCookies('cnn.com');
	var categoryFilterArray = [/*'AjaxRequestManager', 'VideoContentMetaFileLoader'*/]; // allows filtering out of categories with too many messages.
	var parameters = [ ];
	CNNPlayer.ctor.call( this, CNN_PLAYER, options, parameters );	
}

xmp.DERIVE_CLASS( xmp.baseplayer.BasePlayer, CNNPlayer );

CNNPlayer.create = function() {
	xmp.util.LogConfigurator.configure();

//  var cnnIsIntl = (location.hostname.indexOf('edition.') > -1) ? true : false;
//  var cnnIsIntlUS = (location.hostname.indexOf('us.') > -1) ? true : false;

  var cnnIsIntl = false;
  var cnnIsIntlUS = true;

	var buildMap = {};
	buildMap['ad_pattern'] = CNNPlaylistManager.getInstance().SAConfiguration.adPattern;
	buildMap['slate_size'] = CNNPlaylistManager.getInstance().slateSize;
	buildMap['omniture_trigger_command'] = CNNPlaylistManager.getInstance().SAConfiguration.omnitureTriggerCommand;
	buildMap['nielsen_trigger_command'] = CNNPlaylistManager.getInstance().SAConfiguration.nielsenTriggerCommand;

	if (cnnIsIntl) {
		buildMap['edition'] = 'edition';
		buildMap['omniture_account'] = 'cnnintl';
	} else if (cnnIsIntlUS) {
		buildMap['edition'] = 'us';
		buildMap['omniture_account'] = 'cnn2global';
	} else {
		buildMap['edition'] = 'www';
		buildMap['omniture_account'] = 'cnn2global';
	}		

	if (CNNPlaylistManager.getInstance().SAConfiguration.omnitureAccount != null) {
		buildMap['omniture_account'] = CNNPlaylistManager.getInstance().SAConfiguration.omnitureAccount;
	}

	xmp.baseplayer.BasePlayer.configure([cnnXmpPrimaryJsonObj], buildMap);

	playerInstances[0] = new CNNPlayer({}, [ ]);
	playerInstances[0].bootStrap();
}
CNNPlayer.prototype.callEnded = function() {
	CNNPlaylistManager.endOfVideoContent();
}
CNNPlayer.getInstance = function(id, context) {
	if (playerInstances[0] == null) {
	}
	return playerInstances[0];
}
CNNPlayer.setActivePlayer = function(str) { currentPlayer = str; }
CNNPlayer.getActivePlayer = function() {
	return playerInstances[0];
}
CNNPlayer.playlistContentItemCB = function(callback, playableData) {	
	if (playableData.isError()) { 
		str = '<div style="border: 1px solid #ca0002; margin: 70px auto 0; width: 250px;">';
		str += '<div style="padding:4px;color:#FFFFFF;background-color:#ca0002;font-weight:bold;">MALFORMED ERROR</div>';
		str += '<div style="color: #ca0002;background-color: #FFFFFF;padding: 5px;">The video you are attempting to embed does not exist.<br>Please check your URL and try again.</div>';
		str += '</div>';
		document.getElementById(CNNPlaylistManager.getInstance().SAConfiguration.videoDivId).innerHTML = '<div id="errorDiv" style="background-color: #dfdfdf; padding: 2px; text-align: center; height: 100%; color: #FFFFFF;">'+ str +'</div>';
		
	 }
}
CNNPlayer.secondsIntoMinutes = function(val) {
	minutes = Math.floor(val / 60);
	if (minutes > 0) seconds = val - (minutes * 60);
	else seconds = val;
	return (minutes + ':' + CNNPlayer.tenify(seconds));
}
CNNPlayer.tenify = function(val) {
	if (val - 0 < 10)
		return ("0"+val);
	return val;
}

CNNPlayer.prototype.serializerFactory = null;
CNNPlayer.prototype.playlist = null;
CNNPlayer.prototype.isSmall = false;
CNNPlayer.prototype.isScrubbing = false;
CNNPlayer.prototype.pluginError = null;
CNNPlayer.prototype.pluginErrorWindow = null;

CNNPlayer.prototype.handleLogMessage = function(level, category, message)
{
};

CNNPlayer.prototype.handleBootstrapped = function(success) {
	CNNPlaylistManager.isBootStrapped(success);
}

CNNPlayer.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') { CNNPlaylistManager.getInstance().emailVideo(); }
}
CNNPlayer.prototype.volumeChanged = function() {
	this.getMediaPlayer().setVolume( callControllerMethod('getVolume') );
}
CNNPlayer.prototype.pause = function() {
	callControllerMethod('setScrubberEnabled',false);
	this.getMediaPlayer().pause();
	callControllerMethod('togglePlay',false);
}
CNNPlayer.prototype.play = function() {
	this.getMediaPlayer().play();
	callControllerMethod('setScrubberEnabled',true);
	callControllerMethod('togglePlay',true);
}
CNNPlayer.prototype.scrubStarted = function() {
	this.isScrubbing = true;
	callControllerMethod('togglePlay',false);
}
CNNPlayer.prototype.scrubComplete = function() {
	this.isScrubbing = false;
	toVal = callControllerMethod('getTime');
	this.getMediaPlayer().seek(toVal);
	callControllerMethod('togglePlay',true);
}
CNNPlayer.prototype.setPlaylist = function(idList,finalCallback) {
	this.serializerFactory = xmp.baseplayer.MetaFileLoaderFactory.getInstance().create('videoContentMeta');
	this.playlist = this.serializerFactory.setIds(idList, (new xmp.util.Callback('contentItemCB', CNNPlayer.playlistContentItemCB, null)));	
	this.serializerFactory.setAllLoadedCallback(new xmp.util.Callback('allContentItemsCB', finalCallback, null));
	this.serializerFactory.load();
}
CNNPlayer.prototype.getPlaylist = function() {
	return this.playlist;
}
CNNPlayer.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 );	
};

CNNPlayer.prototype.handleCreateViewport = function( type, name, parameters, settings ) {
	if ( type === xmp.DHTML_VIEWPORT ) {
		return this.createDHTMLViewport( type, name, parameters, settings );
	}
	return null;
};

CNNPlayer.prototype.handleFatalException = function( err ) {
	CNNPlaylistManager.getInstance().errorObject = err;
};

CNNPlayer.prototype.createDHTMLViewport = function( type, name, parameters, settings )  {
	var viewport = document.createElement( "div" );
	viewport.setAttribute( xmp.ID_ATTRIBUTE, name );
	viewport.setAttribute( xmp.NAME_ATTRIBUTE, name );

	if (CNNPlaylistManager.getInstance().activePlaylist != 'saplaylist') {
		var sample_container = document.getElementById( "cnnVPFlashLargeContainer" );
	} else {
		var sample_container = document.getElementById( CNNPlaylistManager.getInstance().SAConfiguration.videoDivId );
	}
	viewport.style.width = CNNPlaylistManager.getInstance().SAConfiguration.slateSize[0]+'px';
	viewport.style.height = CNNPlaylistManager.getInstance().SAConfiguration.slateSize[1]+'px';

	viewport.style.backgroundColor = '#000000';	
										
	xmp.insertDomChildBefore(sample_container, viewport);

	// atlas integration
	CNNPlaylistManager.getInstance().viewport = sample_container;
	CNNPlaylistManager.getInstance().atlasSlateSize = new Array(viewport.style.width, viewport.style.height);

	return viewport;
};


CNNPlayer.prototype.handleRegisterNodeListeners = function() {
	this._playerListener = new CNNPlayerListener('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 );	
	}						   
};

CNNPlayer.prototype.loadSynchUnit = function(node) {
	var resType = node.getPlayableData().getRuntimeMetadata('synch_unit_type', 'synch_unit');
	var res = node.getMetaResource(resType);
	var synchUnitLogger = new xmp.util.internals.CategoryLogger( 'loadSynchUnit' );

	if ((!res) || (res.isError())) { return; }

	// data will be the full URL of the banner ad call to the ad server
	var data = res.getDataObject();
	var dataType = res.getDataType();
	var logData = (dataType === 'html') ? 'html' : data;
	if (res.getMetadata('played_' + resType, false)) {
		return;
	}
	res.setMetadata('played_' + resType, true);

	this._createBannerAd("banner_ad_iframe", data, dataType);
	this._playerListener.setStatus(node, xmp.SYNCH_UNIT);
};

CNNPlayer.prototype._createBannerAd = function( adId, data, dataType ) {
	var bannerDiv = document.getElementById('cnnVPAd');
	var innerHtml = '';

	// 'params.styles=fs' has been removed from primary.xml under 'Additional segvars' for this player context.
	if (dataType === 'url') {
		innerHtml = '<iframe hspace="0" vspace="0" marginHeight="0" marginWidth="0" src="' + data + '&page.allowcompete=yes&domId=' + adId + '" border="0" frameBorder="0" height="60" width="300" scrolling="no"  id="'+adId+'" style="position: absolute; visibility: visible;" ></iframe>';
		$('evpHeadline').innerHTML = '';
		$('evpDescription').innerHTML = '';
		$('evpBottom').innerHTML = '';
		$('evpTime').innerHTML = '';
	} else {
		innerHtml = data;
	}
	bannerDiv.innerHTML = innerHtml;
};

CNNPlayer.prototype.removeSynchUnit = function(node) {
	document.getElementById('cnnVPAd').innerHTML = '';
}

CNNPlayer.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;
};
CNNPlayer.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;
};

CNNPlayer.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/evp/adPatterns/default.json';
	this.omnitureAccount = null;
	this.omnitureTriggerCommand = 'CNN.SpecialsOmnitureTriggerCommand';
	this.nielsenTriggerCommand = 'CNN.SpecialsNielsenTriggerCommand';
	
	this.genericSlateHandler = function(slateType) {
		switch(slateType) {
			case 'startSlate':
				var backgroundImage = CNNPlaylistManager.findImageSize(CNNPlayer.getActivePlayer()._findNextContentNode().getPlayableData().getDataObject().images, CNNPlaylistManager.getInstance().slateSize)
				this.updateContentHandler(CNNPlayer.getActivePlayer()._findNextContentNode().getPlayableData().getDataObject());
				return this.startSlateHandler(backgroundImage);
				break;				
			case 'errorSlate':
				return this.errorSlateHandler(CNNPlaylistManager.getInstance().errorObject);
				break;				
			case 'endSlate':
				var backgroundImage = CNNPlaylistManager.findImageSize(CNNPlayer.getActivePlayer()._findPreviousContentNode().getPlayableData().getDataObject().images, CNNPlaylistManager.getInstance().slateSize)
				return this.endSlateHandler(backgroundImage);
				break;				
			default: 	
				break;
		}
	}
	
	// handlers
	this.loadSynchAd = function(data,adId) {
		document.getElementById('cnnXMPvodFooter').innerHTML = '<iframe hspace="0" vspace="0" src="' + data + '&page.allowComplete=yes&domId=bannerAd" border="0" frameBorder="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" height="0" width="0" name="bannerAd" id="bannerAd" style="position: absolute; visibility: hidden;"></iframe>';	
	}
	this.bootErrorHandler = function() { }
	this.initHandler = function() { }
	this.controlsHandler = function() { }
	this.updateContentHandler = function() { }	
	this.errorSlateHandler = function() { }
	this.startSlateHandler = function() { }
	this.endSlateHandler = function() { }
}
