function NASCARPlayers() {
	if (NASCARPlayers.caller != NASCARPlayers.getInstance)
	{
		if((navigator.userAgent.indexOf('Safari')==-1) && (navigator.userAgent.indexOf('Opera')==-1))
		{
			throw new Error("There is no public constructor for NASCARPlayers.");
		}
	}
	this.config = new StandAloneVideoConfiguration();
}
NASCARPlayers.__instance__ = null;
NASCARPlayers.getInstance = function() {
	if ( this.__instance__ == null ) {
		this.__instance__ = new NASCARPlayers();
	}
	return this.__instance__;
}
NASCARPlayers.prototype.getPlayerConfig = function( playerName ) {
	switch( playerName ) {
		case 'playerPage':
			this.config.videoDivId 		= 'cnnXmpVideo';
			this.config.overrideVideoAd	= false;	
			this.config.adPattern		= '/.element/js/2.1/video/common/adPatterns/preroll.json';
			this.config.omniture_account = 'turnernascarcom';
			this.config.slateSize		= new Array(640,360);
			//this.config.slateSize		= new Array(464,240);
			this.config.omnitureTriggerCommand = 'Triggers.PopupPlayerOmnitureCommand';
			this.config.nielsenTriggerCommand = 'Triggers.PopupPlayerNielsenCommand';
			this.config.webstatTriggerCommand = 'Triggers.WebstatTriggerCommand';
			this.config.controlsHandler = function( p_method, p_arg ) {
				try {
					var controller = (navigator.appName.indexOf("Microsoft") != -1) ? window["nascarControls"] : document["nascarControls"];
					var returnVal = controller[p_method](p_arg);
					if( typeof returnVal != "undefined") {
						return returnVal;
					}
				}
				catch( error ) {
					// catch error and ignore, usually caused by XMP loading before controller plugin
					alert("Error with controls");
				}
			}
			this.config.bootErrorHandler = defaultBootErrorSlateHandler;
			this.config.errorSlateHandler = defaultErrorSlateHandler;
			this.config.startSlateHandler = defaultStartSlateHandler;
			this.config.endSlateHandler   = defaultEndSlateHandler;
			this.config.loadSynchUnit = true;
			break;
			
		case 'homepage':
			this.config.videoDivId 		= 'cnnXmpVideo';
			this.config.overrideVideoAd	= true;	
			this.config.overridePreRoll = '/nascar_adspaces/3.0/homepage/no.preroll_emb.ad'; //assetObj.ads[0];
			this.config.adPattern		= '/.element/js/2.1/video/common/adPatterns/homepage.json';
			this.config.omniture_account = 'turnernascarcom';
			this.config.slateSize		= new Array(640,360);
			this.config.controlsHandler = function( p_method, p_arg ) {
				try {
					var controller = (navigator.appName.indexOf("Microsoft") != -1) ? window["nascarControls"] : document["nascarControls"];
					var returnVal = controller[p_method](p_arg);
					if( typeof returnVal != "undefined") {
						return returnVal;
					}
				}
				catch( error ) {
					// catch error and ignore, usually caused by XMP loading before controller plugin
					alert("Error with controls");
				}
			}
			this.config.bootErrorHandler = defaultBootErrorSlateHandler;
			this.config.errorSlateHandler = defaultErrorSlateHandler;
			this.config.startSlateHandler = defaultHomepageStartSlateHandler;
			this.config.endSlateHandler   = defaultHomepageStartSlateHandler;
			break;
		
		case 'overridePopup':
			this.config.videoDivId 		= 'cnnXMPvod';
			this.config.overridePreRoll = videoOverridePreRoll;
			this.config.overrideSyncUnit = videoOverrideSyncUnit;
			this.config.adPattern		= '/.element/js/2.0/video/common/adPatterns/preroll.json';
			this.config.omniture_account = 'turnernascarcom';
			this.config.slateSize		= new Array(464,240);
			this.config.omnitureTriggerCommand = 'Triggers.PopupPlayerOmnitureCommand';
			this.config.nielsenTriggerCommand = 'Triggers.PopupPlayerNielsenCommand';
			this.config.webstatTriggerCommand = 'Triggers.WebstatTriggerCommand';
			this.config.controlsHandler	= function(m,a) {
				return ((navigator.appName.indexOf("Microsoft") != -1) ? window["XMPFlashControls"] : document["XMPFlashControls"])[m](a);
			}
			this.config.bootErrorHandler = defaultBootErrorSlateHandler;
			this.config.errorSlateHandler = defaultErrorSlateHandler;
			this.config.startSlateHandler = defaultStartSlateHandler;
			this.config.endSlateHandler   = defaultEndSlateHandler;
			this.config.loadSynchUnit = true;
			break;
			
		case "live":
			this.config.videoDivId 		= 'cnnXMPlive';
			this.config.overrideVideoAd	= false;
			this.config.adPattern		= '/.element/js/2.1/video/common/adPatterns/livePlayerNoMidSlate.json';
			this.config.omniture_account = 'turnernascarcom';
			this.config.slateSize		= new Array(464,240);
			this.config.omnitureTriggerCommand = 'Triggers.LivePlayerOmnitureCommand';
			this.config.nielsenTriggerCommand = 'Triggers.LivePlayerNielsenCommand';
			this.config.webstatTriggerCommand = 'Triggers.LiveWebstatTriggerCommand';
			this.config.controlsHandler	= function(m,a) {
				return ((navigator.appName.indexOf("Microsoft") != -1) ? window["XMPFlashControls"] : document["XMPFlashControls"])[m](a);
			}
			this.config.bootErrorHandler = defaultBootErrorSlateHandler;
			this.config.midSlateHandler   = defaultMidSlateHandler;
			this.config.errorSlateHandler = defaultErrorSlateHandler;
			this.config.startSlateHandler = defaultStartSlateHandler;
			this.config.endSlateHandler   = defaultEndSlateHandler;
			break;
	}
	
	if ( window.location.toString().indexOf('turner.com') != -1 ) {
		this.config.omniture_account = 'turnernascarcomdev';
	}
	
	return this.config;
}
NASCARPlayers.prototype.setVideoArray = function( arr ) {
	this.config.videoArray = arr;
}
NASCARPlayers.prototype.writeSideSyncIframe = function() {
	var tar = document.getElementById('sideSyncAdIframe');
	var doc = tar.contentDocument;
	var data = this.sideSyncAdData;

	if ( doc == undefined || doc == null ) 
		doc = tar.contentWindow.document;
	
	doc.open();
	doc.write(data);
	doc.close();
}