if("onOutletEvent" in window) {
	window._onOutletEvent = window.onOutletEvent;
}

window.onOutletEvent = function(e) {
	if("_onOutletEvent" in window) {
		_onOutletEvent(e);
	}
};

/**
 * @author Ash White (ash.white@nbcuni.com)
 * @param {String} type The name of the event
 * @param {Object} data The data payload for the event
 */
var OutletEvent = function(type, data) {
	this.type = type;
	this.data = data || {};
};

/**
 * @author Ash White (ash.white@nbcuni.com)
 * @param {String} name The name of the extension
 */
var OutletExtension = function(name) {
	var typeToListenerDict = {};
	
	this.name = name;
	
	this.init = function() {
		onOutletEvent({
			type: "extensionLoaded",
			data: {
				outletExtensionDescription: {
					id: this.name
				}
			}
		});
	};
	
	this.addEventListener = function(type, listener) {
		typeToListenerDict[type] = typeToListenerDict[type] || [];
		var listeners = typeToListenerDict[type];
		listeners.push(listener);
	};
	
	this.removeEventListener = function(type, listener) {
		var listeners = typeToListenerDict[type];
		if(listeners && (listeners.indexOf(listener) > -1)) {
			listeners.splice(listeners.indexOf(listener), 1);
		}
	};
	
	this.dispatchEvent = function(event) {
		// event.extensionId = this.extensionDescription.id;
		var listeners = (typeToListenerDict[event.type]) || [];
		for(var i=0;i<listeners.length;i++){
			listeners[i](event);
		};
	};
};

/**
 * @author Ash White (ash.white@nbcuni.com)
 */
var OutletIMPL = function() {
	/*
		PRIVATE STUFF
	*/
	var embeddedPlayer = new OutletExtension("embeddedPlayer");
	embeddedPlayer.playClipId = function(video_id) {
		kaPlayVideo(video_id);
	};
	embeddedPlayer.playVideo = function(video_id) {
		kaPlayVideo(video_id);
	};
	
	var adEngine = new OutletExtension("adEngine");
	
	var contentMetadata = new OutletExtension("contentMetadata");
	contentMetadata.metadata	=	{};
	contentMetadata.config		=	{};
	contentMetadata.getCurrentClipPrimitive = function() {
		return this.metadata;
	};
	contentMetadata.getCurrentVideoAsset = function() {
		return this.metadata.properties;
	};
	
	var playlist = new OutletExtension("playlist");
	playlist.currentPlaylist = [];
	playlist.getListJS = function() {
		return playlist.currentPlaylist;
	};
	
	var extensionNameToObjectHash = {
		embeddedPlayer: embeddedPlayer,
		adEngine: adEngine,
		contentMetadata: contentMetadata,
		contentMetadataDAOID: contentMetadata,
		playlist: playlist
	};
	
	/*
		PUBLIC STUFF
	*/
	return {
		/**
		 * Get the faux Outlet extension that corresponds to the given name
		 * 
		 * @param {String} name The name of the Outlet extension
		 * @return The faux Outlet extension that corresponds to the given name
		 */
		getOutletExtension: function(name) {
			return extensionNameToObjectHash[name] || null;
		}
	};
};

var Outlet = new OutletIMPL();


/*
* startup facade
* provides onOutletEvent functionality
* 
*/
//KickApps API
//create page-level reference for player
var kickapps_player;
function kaLoadedCallback(loadedSWF){
	//document.getElementById('output').innerHTML = "Loaded swf: "+ loadedSWF;
	kickapps_player = navigator.appName.indexOf("Microsoft") != -1 ? window[loadedSWF] : document[loadedSWF];
	
	Outlet.getOutletExtension("embeddedPlayer").init();
	Outlet.getOutletExtension("adEngine").init();
	Outlet.getOutletExtension("contentMetadata").init();
	Outlet.getOutletExtension("playlist").init();
	
	onOutletEvent({type:"outletInited"});
}

function kaPlayVideo(video_id)
{
	try {
		DPSVPlayer.players[0].playClipID(video_id);
	} catch(e) {
		if(!kickapps_player) alert("FAIL! kickapps_player not defined");
		kickapps_player.playVideo(video_id);
	}
}


function kaEventCallback(id, evt){
	if (evt.data=="selectedItem"){
	}
}


function vcmsDataChange(metadata)
{
	var contentMetadata = Outlet.getOutletExtension("contentMetadata");
	contentMetadata.metadata = metadata;

	var embeddedPlayer = Outlet.getOutletExtension("embeddedPlayer");
	embeddedPlayer.dispatchEvent(new OutletEvent("CONTENT_METADATA.clip_info_update", { metadata: metadata }));
}

function vcmsClipsLoaded(clips) {
	var clipsString = unescape(clips.substring(9,clips.length-3));
	
	var playlist = Outlet.getOutletExtension("playlist");
	playlist.currentPlaylist = eval(clipsString);
	
	// if(playlist.currentPlaylist.length > 1) {
		var data = {
			content: []
		};
		
		//> convert metadata to format Outlet expects
		for(var i = 0; playlist.currentPlaylist[i]; i++) {
			var clipMetadata = playlist.currentPlaylist[i];
			data.content.push({
				description: clipMetadata.description,
				guid_id: clipMetadata.guid,
				link: clipMetadata.clipid,
				title: clipMetadata.headline,
				media: {
					player: clipMetadata.guid,
					thumbnail: {
						url: "http://video.nbcuni.com/" + clipMetadata.imageUrl,
						width: 80,
						height: 45
					}
				}
			});
		}
		
		playlist.dispatchEvent(new OutletEvent("PlaylistEvents.READY", data));
	// }
}

function dpsvpPlaybackEnd(e) {
	Outlet.getOutletExtension("embeddedPlayer").dispatchEvent(new OutletEvent("Player.end"), {});
}

function dpsvpOnAssetUpdate(assetParam)
{
	var	translatedAsset				=	eval(assetParam);

	var contentMetadata 			=	Outlet.getOutletExtension("contentMetadata");
	contentMetadata.metadata		=	translatedAsset.vcmsdata;

	var embeddedPlayer = Outlet.getOutletExtension("embeddedPlayer");
	embeddedPlayer.dispatchEvent(new OutletEvent("CONTENT_METADATA.clip_info_update", { metadata: translatedAsset.vcmsdata.properties }));
}

function dpsvpOnPlaylistUpdate(listParam)
{
	var	translatedPlaylist			=	eval(listParam);

	var playlist = Outlet.getOutletExtension("playlist");
	playlist.currentPlaylist 		=	translatedPlaylist;
	playlist.dispatchEvent(new OutletEvent("PlaylistEvents.READY", translatedPlaylist));
}

function dpsvpOnConfigUpdate(configParam)
{
	var	translatedConfig			=	eval(configParam);

	var contentMetadata 			=	Outlet.getOutletExtension("contentMetadata");
	contentMetadata.config			=	translatedConfig.vcmsdata;

	var embeddedPlayer = Outlet.getOutletExtension("embeddedPlayer");
	embeddedPlayer.dispatchEvent(new OutletEvent("CONTENT_METADATA.config_metadata_update", { metadata: translatedConfig.vcmsdata}));
}

function onAdEvent(e)
{
	if(e && e.type) {
		var adEngine = Outlet.getOutletExtension("adEngine");
		adEngine.dispatchEvent(new OutletEvent(e.type, e.data));
	}
}
