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

function callControllerMethod(p_method, p_arg) 
{
	try {
		var returnVal;
		if (CNNPlaylistManager.getInstance().activePlaylist == 'saplaylist') {
			returnVal = CNNPlaylistManager.getInstance().SAConfiguration.controlsHandler(p_method, p_arg);
		} else {
			var controller = (navigator.appName.indexOf("Microsoft") != -1) ? window["mediacontrols"] : document["mediacontrols"];
			returnVal = controller[p_method](p_arg);
		}
			if(typeof(returnVal) != "undefined") return returnVal;
	} catch(err) {
		// catch error and ignore, usually caused by xmp loading before controller plugin
	}
}

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 CNNPlayer(options, parameters) {
	initAdServerCookies('cnn.com');
  var cnnIsIntl = (location.hostname.indexOf('edition.') > -1) ? true : false;
  var cnnIsIntlUS = (location.hostname.indexOf('us.') > -1) ? true : false;
  var sm = xmp.util.SettingsManager.getInstance();
  if (cnnIsIntl) {
          sm.init(cnnXmpPrimaryJsonObjIntl); // cnnXmpPrimaryJsonObj defined in primary.js
  } else if (cnnIsIntlUS) {
          sm.init(cnnXmpPrimaryJsonObjIntlUS);
  } else {
          sm.init(cnnXmpPrimaryJsonObj);
  }

	var categoryFilterArray = [/*'AjaxRequestManager', 'VideoContentMetaFileLoader'*/]; // allows filtering out of categories with too many messages.
	
	g_logListener = new SampleXmpLogListener(xmp.util.LogLevels.NONE, categoryFilterArray);

	var parameters = [ ];
	
	CNNPlayer.ctor.call( this, CNN_PLAYER, options, parameters );	
	g_logListener.setCallbackObject(this.player);
}

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

CNNPlayer.create = function() {
	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() { }
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.replacePlaylist = function(currentJsonListArray, jsonListArray) {
	this.getMediaPlayer().stop();
	for (var i = 0; i < currentJsonListArray; i++) {
		this.removeFromPlayList(currentJsonListArray[i]);
	}
	// get current playlist
	// iterate through and remove
	// iterate through and add new playlist
	// write append callbacks
}


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.FLASH_VIEWPORT ) {
		return this.createFlashViewport( type, name, parameters, settings );
	}
	else if ( type === xmp.DHTML_VIEWPORT ) {
		return this.createDHTMLViewport( type, name, parameters, settings );
	}
	return null;
};

CNNPlayer.prototype.handleDestroyViewport = function( type, name ) {
	var viewport = ( (navigator.appName.indexOf(xmp.MICROSOFT_BROWSER) !== -1   || 
	                  navigator.appName.indexOf(xmp.OPERA_BROWSER) !== -1    )   ? 
	                  window[name] : document[name]                          );
	if ( viewport ) {
		var parent = ( (navigator.appName.indexOf(xmp.MICROSOFT_BROWSER) !== -1    || 
						navigator.appName.indexOf(xmp.OPERA_BROWSER) !== -1    )    ? 
						viewport.parentElement : viewport.parentNode           );
		parent.removeChild( viewport );	
	}
};

/*
CNNPlayer.prototype.handlePlugInError = function( e, info ) 
{
	if (info.plugIn.displayName.indexOf('Flash') < 0) {
		CNNPlaylistManager.getInstance().isVideoError = true;
		this.pluginError = info.plugIn;
		callControllerMethod('setEnabled',false);
		callControllerMethod('setTime',0);
		callControllerMethod('togglePlay',false);	
	}
};
*/

CNNPlayer.prototype.handleFatalException = function( err ) {
	// Show message.

	CNNPlaylistManager.getInstance().errorObject = err;

	// Plugin not found or wrong version.
//	if ( err.name === "PlugInNotFoundError" || err.name === "InvalidPlugInVersionError" )
//	{		
		// Open download page.
//		window.open( err.plugIn.downloadUrl );	
//	}
};

CNNPlayer.prototype.createFlashViewport = function( type, name, parameters, settings ) {
	var viewport = new SWFObject( xmp.getSWFRoot() + "TestFlashViewport.swf", name, "574", "324", 8, "#FFFFFF" );
	for ( var i = 0; i < parameters.length; i++ ) {
		viewport.addParam( parameters[i].name, parameters[i].value );	
	}
	for ( i = 0; i < settings.length; i++ ) {
		viewport.addVariable( settings[i].name, settings[i].value );
	}
	viewport.addVariable( xmp.FLASH_NATIVE_PLAYER_COMPONENT, xmp.getSWFRoot() + "FlashMediaPlayer.swf" );
	if (CNNPlaylistManager.getInstance().activePlaylist != 'saplaylist')
		viewport.write( document.getElementById("cnnVPFlashLargeContainer").id );	
	else
		viewport.write( document.getElementById(CNNPlaylistManager.getInstance().SAConfiguration.videoDivId).id );	
	flash_container = ( (navigator.appName.indexOf(xmp.MICROSOFT_BROWSER) !== -1   || 
	                     navigator.appName.indexOf(xmp.OPERA_BROWSER) !== -1    )   ? 
	                     window[name] : document[name]                          );
	flash_container.style.cssText = "position: absolute";
	return flash_container;
};

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 );
	viewport.setAttribute( xmp.FLASH_NATIVE_PLAYER_COMPONENT, xmp.getSWFRoot() + "FlashMediaPlayer.swf" );	
	if (CNNPlaylistManager.getInstance().activePlaylist != 'saplaylist')
		var sample_container = document.getElementById( "cnnVPFlashLargeContainer" );
	else
		var sample_container = document.getElementById( CNNPlaylistManager.getInstance().SAConfiguration.videoDivId );
	if (CNNPlaylistManager.getInstance().activePlaylist == 'mosplaylist' || CNNPlaylistManager.getInstance().activePlaylist == 'bvpplaylist') {
		if (this.isSmall) {
			viewport.style.width = '287px';
			viewport.style.height = '161px';
		} else {
			viewport.style.width  = "574px";
			viewport.style.height = "324px";	
		}
	} else if (CNNPlaylistManager.getInstance().activePlaylist == 'hottplaylist') {
		viewport.style.width  = "384px";
		viewport.style.height = "216px";	
	} else if (CNNPlaylistManager.getInstance().activePlaylist == 't1playlist') {
		viewport.style.width  = "256px";
		viewport.style.height = "144px";	
	} else if (CNNPlaylistManager.getInstance().activePlaylist == 'saplaylist') {
		viewport.style.width = CNNPlaylistManager.getInstance().SAConfiguration.slateSize[0]+"px";
		viewport.style.height = CNNPlaylistManager.getInstance().SAConfiguration.slateSize[1]+"px";
	}

	viewport.style.position = xmp.ABSOLUTE_POSITION;
	viewport.style.backgroundColor = "#000000";	
										
	if ( navigator.appName.indexOf(xmp.MICROSOFT_BROWSER) !== -1 )
	{
		sample_container.insertAdjacentElement( "afterBegin", viewport );
	}
	else
	{
		sample_container.insertBefore( viewport, null );						
	}		
	return viewport;
};


CNNPlayer.prototype.handleRegisterNodeListeners = function() {
	var listeners = [ {object: new EndOverlayNodeListener(this), nodes: ["EndOverlay"]},
		              {object: new AdNodeListener(this), nodes: ["PreRoll", "PostRoll", "Promo", "SponsoredAd", "HouseAd", "AdInsertNotForSale"]},
		              {object: new ImageNodeListener(this), nodes: ["Image"]},
		              {object: new PromoNodeListener(this), nodes: ["Promo"]},
				{object: new VideoNodeListener(this), nodes: ["Content"]},
		              {object: new NextUpSlateNodeListener(this), nodes: ["NextUpSlate"]},
		              {object: new StartSlateNodeListener(this), nodes: ["StartSlate"]},
		              {object: new EndSlateNodeListener(this), nodes: ["EndSlate"]},
		              {object: new ErrorSlateNodeListener(this), nodes: ["ErrorSlate"]} ];
	for ( var i = 0; i < listeners.length; i++ )
	{
		this.registerNodeListener( listeners[i].object, listeners[i].nodes );	
	}						   
};


