﻿var nbcURL = document.location.toString(); if(nbcURL === undefined){nbcURL = ""};
var NBC = {};
NBC.ScriptRoot = "";
if(nbcURL.indexOf("usanetwork.com") != -1 || nbcURL.indexOf("characterarcade.com") != -1){
    if(usa_baseUrl !== undefined){
        NBC.ScriptRoot = usa_baseUrl + "/videos/";
    }
}
if(nbcURL.indexOf("syfy.com") != -1){
    NBC.ScriptRoot = "/_utils/video/codebase/";
}
if(nbcURL.indexOf("bravotv.com") != -1) {
    NBC.ScriptRoot = "/_tp/";
}
if(nbcURL.indexOf("hemisphereinteractive") != -1){
    NBC.ScriptRoot = "";
}
NBC.ScriptCounter = 0;
NBC.EssentialScriptCount = 0;
NBC.Scripts = [];
NBC.Queue = [];
NBC.CycleLength = 100;
NBC.ProgressBuffer = 15;
NBC.ProgressScrubberDragging = false;
NBC.DebugMode = false;
NBC.HTML5 = false;
NBC.Pa = true;
NBC.SentFromEndCard = false;
NBC.AppearsToBeIE = false;
NBC.PlayerLoadAlreadyDetected = false;
NBC.FWCompanionText = "";
NBC.FWCompanionDiv = "thisisnotreal";
NBC.Inbound = {};
NBC.UseJR = false;
NBC.UsePlaylist = window.usePlaylist || false;
NBC.Playlist = [];
NBC.PlaylistStartId = "";
NBC.PlaylistIndex = 0;
NBC.PlaylistFeed = "";
NBC.PlaylistFeedRaw = "";
NBC.PlaylistThumbnails = [];
NBC.PlaylistWidget = null;
NBC.ReleaseEnded = false;
NBC.IsStandAlone;
NBC.StartVideoInFeed = false;
NBC.PlaylistStartIndex = 1;
NBC.PlaylistEndIndex = 500;
NBC.PlaylistPageSize = 500;
NBC.PlaylistTotalSize = 0;
NBC.PlaylistBasedOnGuid = true;
NBC.Embed = "";
NBC.CardBlockerHeight = "100%";
NBC.RatingsPath = "http://nbc.theplatcal.com/ratings/images/ratings/";
NBC.PlaylistFull = false;
NBC.PlaylistTraversals = 0;
NBC.PlaylistFields = "guid,title,description,:subtitle,thumbnails,:fullEpisode,:directLinkIdentifier,content,categories,:disallowSharing";
NBC.ShowUpperMetaAtStart = true;
NBC.Production = true;
try {
	NBC.IsStandAlone = (window.__usingRequireJs == undefined || !window.__usingRequireJs);
} catch(e) {
	NBC.IsStandAlone = true;
}
NBC.NoBravoHead = (window.head) ? false : true;

NBC.CheckReady = function() {
	//this.Debug("[CheckReady] " + NBC.SCRIPTS_READY +" " + NBC.PDK_READY + " " + NBC.PLAYER_BOUND);
	
	if (NBC.SCRIPTS_READY && NBC.PDK_READY && NBC.PLAYER_BOUND)
	{		
		$pdk.initialize();
		this.Debug("Ready");
	}
}

$pdk.Entrypoint.getInstance().addCallback(function() {
	NBC.PDK_READY = true;
	NBC.CheckReady();
});

NBC.ProcessQueue = function(){
	//------------------------------------------------------
	var task;
	if(this.Queue.length > 0){
		task = this.Queue.shift();
		if(task.data.delay > 0){
			//this.Debug("Not yet, " + task.type);
			task.data.delay -= this.CycleLength;
			this.Queue.push(task);
		} else {
			
			switch(task.type){
				case "cancel":
					for(var i = 0; i < this.Queue.length; i++){
						if(this.Queue[i].type == task.data){
							this.Debug("Cancelled a " + task.data + " (as dictated by " + task.sender + ")");
							this.Queue[i].type = task.data + "_cancelled";
						} else {
							//this.Debug("In cancelling " + task.data + " tasks, we found a " + this.Queue[i].type + " task (added by " + task.sender + ")");
						}
					}
					break;
				case "scriptadd":
					//this.Debug("We have a scriptadd task");
					if(this.Scripts[0].needsJQ){
						try{
							var waiting = this.IsEmpty(hs$);
							if(!waiting){
								this.AddScript(this.Scripts.shift(), null);
							}
						} catch(e){
							this.Debug("scriptadd task says: jQuery is required but is not yet available")
							this.Queue.push(task);
						}
					} else {
						this.AddScript(this.Scripts.shift(), null);
					}
					break;
				case "getfeeds":
					this.Debug("We have a getfeeds task");
					try{
						var waiting = this.IsEmpty(hs$);
						if(!waiting){
							this.GetFeeds();
						}
					} catch(e) {
						this.Debug(e);
						this.Queue.push(task);
					}
					break;
				case "lookforplayer":
					if(hs$("video").length > 0){
						this.HTML5 = true;
						this.BuildHTMLControls();
						this.PlayerLoaded();
					} else {
						if(hs$("#_tpplayerwidgetPdkSwfObject").length < 1){
							this.Queue.push(task);
						}
					}
					break;
				case "playerover":
					this.Debug("PlayerOver");
					//alert("PO from " + task.sender);
					var um = ".htmluppermetadata" +  this.Html5ClassAnnex;
					var cs = ".htmlcontrols" + this.Html5ClassAnnex;
					var bs = ".htmlbaseplate" + this.Html5ClassAnnex;
					var sm = (hs$(cs).height() + hs$(bs).height()) * -1;
					hs$(cs).animate({"top": sm}, "slow", function(){hs$(this).attr("rel","visible")});
					hs$(um).animate({"top": 80}, "slow", function(){hs$(this).attr("rel","visible")});
					break;
				case "playerout":
					this.Debug("PlayerOut");
					var um = ".htmluppermetadata" +  this.Html5ClassAnnex;
					var cs = ".htmlcontrols" + this.Html5ClassAnnex;
					var bs = ".htmlbaseplate" + this.Html5ClassAnnex;
					var sm = hs$(bs).height() * -1;
					if(this.IsEmpty(task.data.annex)){
						hs$(cs).animate({"top": sm}, "slow", function(){
							hs$(this).attr("rel","hidden");
						});
						hs$(um).animate({"top": 80}, "slow", function(){hs$(this).attr("rel","hidden")});
					} else {
						hs$(cs).animate({"top": sm}, "slow", function(){
							hs$(this).attr("rel","hidden" + task.data.annex);
						});
						hs$(um).animate({"top": 80}, "slow", function(){hs$(this).attr("rel","hidden" + task.data.annex)});
					}
					break;
				case "hidebaseplate":
					hs$(".htmlbaseplate" + this.Html5ClassAnnex).animate({"top":0}, "slow");
					if(this.HTML5){
						hs$(".htmlcontrolsprogresswrappermini").fadeIn("slow");
					}
					this.AddTask({"type": "playerover", "data": {}, "sender": "HideBasePlate"});
					break;
				case "showbaseplate":
					hs$(".htmlbaseplate" + this.Html5ClassAnnex).animate({"top": hs$(".htmlbaseplate" + this.Html5ClassAnnex).height() * -1}, "slow");
					if(this.HTML5){
						hs$(".htmlcontrolsprogresswrappermini").fadeOut("fast");
					}
					break;
				case "showendcard":
					if(this.UsePlaylist){
						if(this.Playlist.length > 0){
							this.AdvancePlaylistPosition();
							if(!this.IsEmpty(this.Playlist[this.PlaylistIndex])){
								this.Debug("Moving to position " + this.PlaylistIndex + " in playlist (" + this.Playlist[this.PlaylistIndex].title + ")");
								this.NowPlaying = this.Playlist[this.PlaylistIndex];
								this.ActivateMedia(true);
							} else {
								this.DebugWarn("WARNING: there was no video found at position " + this.PlaylistIndex + " of our playlist (which is " + this.Playlist.length + " long)");
							}
						} else {
							this.DebugWarn("WARNING: We're trying to use an empty playlist");
						}
					} else {
						this.ShowEndCard();
					}
					break;
				case "performflashcompletiontasks":
					tpController.dispatchEvent("OnPerformCompletionTasks", null);
					this.ToggleUrlLink("h");
					break;
				case "volumeclick":
					var v = task.data.target / 100;
					document.getElementsByTagName("VIDEO")[0].volume = v.toFixed(1);
					this.Debug("changed volume to " + v.toFixed(1));
					this.VolumeScrubberMouseMove({"volumeScrubberNewPosition": task.data.pos});
					break;
				case "initializevolumeslider":
					var lowOffset = 72;
					var highOffset = 79;
					if(this.PlayerSize == "small"){
						lowOffset = 52;
						highOffset = 59;
					}
					this.FullVolumeTrackWidth = Math.floor(hs$(".htmlcontrolsshare" + this.Html5ClassAnnex).offset().left - hs$(".htmlcontrolsspeaker" + this.Html5ClassAnnex).offset().left);
					hs$(".htmlcontrolsvolumetrackon" + this.Html5ClassAnnex).css("width", (this.FullVolumeTrackWidth - lowOffset) + "px");
					hs$(".htmlcontrolsvolumescrubber" + this.Html5ClassAnnex).css("left", (this.FullVolumeTrackWidth - highOffset) + "px");
					hs$(".htmlcontrolsvolume" + this.Html5ClassAnnex).css("width", (this.FullVolumeTrackWidth - lowOffset) + "px");
					break;
				case "getyoumayalsolike":
					if(!this.IsEmpty(this.NowPlaying)){
						this.GetYouMayAlsoLike();
					} else {
						this.Queue.push(task);
					}
					break;
				default:
					try{
						if(task.type.indexOf("_cancelled") != -1){
							//this.Debug("We have a cancelled task (" + task.type + ")")
						}
					}catch(e){}
					break;
			}
		}
	}
}

NBC.Interval = setInterval("NBC.ProcessQueue()", NBC.CycleLength);

NBC.AddTask = function(task){
	//------------------------------------------------------
	var alreadyInQueue = false;
	if(task.type != "cancel"){
		for(var i = 0; i < this.Queue.length; i++){
			if(this.Queue[i].type == task.type){		
				alreadyInQueue = true;
				break;
			}
		}
		if(!alreadyInQueue){
			this.Queue.push(task);
		}
	} else {
		this.Queue.unshift(task);
	}
}

NBC.IsEmpty = function(input){
	//------------------------------------------------------
	if(input === null || input === undefined || input === ""){
		return true;
	} else {
		return false;
	}
}

NBC.Debug = function(str){
	//------------------------------------------------------
	try{
		if(!this.Production){
			console.log(str);
		}
	} catch(e){}
}

NBC.DebugWarn = function(str){
	//------------------------------------------------------
	try{
		if(!this.Production){
			console.warn(str);
		}
	} catch(e){}
}

NBC.AddScript = function(s, callback){
	//------------------------------------------------------
	var src = s.src
	//this.Debug("Adding " + src);
	var h = document.getElementsByTagName("HEAD")[0];
	var s = document.createElement("SCRIPT");
	var id = "dynamic_script_" + this.GetScriptId();
	s.type = "text/javascript";
	s.language = "javascript";
	s.src = src;
	s.id = id;
	if(!this.IsEmpty(callback)){
		eval(callback);
	} else{
		if(!this.AppearsToBeIE){
			s.onload = function(){
				if(NBC.Scripts.length > 0){
					if (NBC.IsStandAlone) {
					try{
						if(typeof(NBCPARAMS) == "object"){
							if(!NBCPARAMS.Loaded){
								NBCPARAMS.Loaded = true;
								NBC.ParamsLoaded();
							}	
						}
					}catch(e){}
					}
					NBC.AddTask({"type": "scriptadd", "data": {}});
				} else {
					NBC.Debug("Scripts all done");
					if(NBC.IsStandAlone){
						NBC.Debug("Standalone is true");
						NBC.SCRIPTS_READY = true;
						NBC.StartBuild();
					}
				}
			}
		} else {
			s.onreadystatechange = function(){
				if(this.readyState == "loaded" || this.readyState == "complete"){
					if(NBC.Scripts.length > 0){
						if (NBC.IsStandAlone) {
						try{
							if(typeof(NBCPARAMS) == "object"){
								if(!NBCPARAMS.Loaded){
									NBCPARAMS.Loaded = true;
									NBC.ParamsLoaded();
								}	
							}
						}catch(e){}
					}
						NBC.AddTask({"type": "scriptadd", "data": {}});
					} else {
						if(NBC.IsStandAlone){
							NBC.SCRIPTS_READY = true;
							NBC.StartBuild();
					}
				}
			}
		}
	}
	}
	h.appendChild(s);
}

NBC.GetScriptId = function(){
	//------------------------------------------------------
	this.ScriptCounter++;
	return this.ScriptCounter.toString();
}

NBC.Init = function(){
	//------------------------------------------------------
	this.Debug("[Init]");
	
	if(this.IsStandAlone && this.NoBravoHead){
		this.PlayerSize = playerSize;
		this.Scripts.push({"src": this.ScriptRoot + "js/nbcParams.js", "needsJQ": false}); this.EssentialScriptCount++;
		this.Scripts.push({"src": this.ScriptRoot + "js/libs/jquery.event.drag-1.2.min.js", "needsJQ": true}); this.EssentialScriptCount++;
		this.Scripts.push({"src": this.ScriptRoot + "js/jquery.idle-timer.js", "needsJQ": true}); this.EssentialScriptCount++;
		this.Scripts.push({"src": this.ScriptRoot + "js/JSONRequest.js", "needsJQ": false}); this.EssentialScriptCount++;
		this.Scripts.push({"src": this.ScriptRoot + "js/dd.js", "needsJQ": false}); this.EssentialScriptCount++;
		this.AddTask({"type": "scriptadd", "data": {}});
	}
	
	if (!this.NoBravoHead) {
		this.SCRIPTS_READY = true;
	}
	
	this.ProcessQueryString();
	
	try{
		if(usePlaylist === true){
			this.UsePlaylist = true;
		}
	}catch(e){}
	
	for(var i = 0; i < this.Uparams.length; i++){
		var segment = this.Uparams[i];
		if(segment.substr(0,4) == "_vid"){
			this.Inbound.VID = segment;
		} else {
			if(segment.substr(0,5) == "_vcms"){
				this.Inbound.VID = segment;
			} else {
				if(!this.IsEmpty(segment)){
					switch(i){
						case 0:
							// Show name (Haven, The Glee Project etc)
							this.Inbound.ShowName = segment;
							break;
						case 1:
							// Category (Behind the Scenes, Full Episodes etc)
							this.Inbound.Category = segment;
							break;
						case 2:
							// Subcategory (Featurettes etc)
							this.Inbound.Subcategory = segment;
							break;
						case 3:
							// If we get here, it has to be the name of video
							if(this.IsEmpty(this.Inbound.VID)){
								this.Inbound.VID = segment;
							}
						default:
							break;
					}
				}
			}
		}
	}
	
	if(this.UsePlaylist){
		try{
			if(!this.IsEmpty(playlistStartId)){
				this.Inbound.VID = playlistStartId;
			}
		} catch(e){}
	}
	
	this.Debug("To start with the VID is: " + this.Inbound.VID);
	
	try{
		if(!this.IsEmpty(playlistStartId)){
			this.PlaylistStartId = playlistStartId;
			if(this.PlaylistStartId.indexOf("_vid") != -1){
				this.PlaylistStartId = this.PlaylistStartId.substring(4,this.PlaylistStartId.length);
				this.PlaylistBasedOnGuid = true;
			}
			if(this.PlaylistStartId.indexOf("_vcms") != -1){
				this.PlaylistStartId = this.PlaylistStartId.substring(5,this.PlaylistStartId.length);
				this.PlaylistBasedOnGuid = false;
			}
		}
	}catch(e){}
	
	this.Debug("PlaylistStartId is:" + this.PlaylistStartId);
	
	try{
		if(!this.IsEmpty(playlistFeed)){
			this.PlaylistFeed = playlistFeed;
		}
	}catch(e){}
	
	try{
		if(standaloneAutoPlay === true){
			this.StandaloneAutoPlay = true;
		}
	}catch(e){}
	
	try{
		if(autoPlay === true){
			this.StandaloneAutoPlay = true;
		}
	}catch(e){}
	
	if(this.IsEmpty(NBC.StandaloneAutoPlay)){
		// If we are empty by this point, it means:
			// -- standaloneAutoPlay was not set
			// -- autoPlay in the querystring was not set
			// -- autoPlay as an external variable was not set
		NBC.StandaloneAutoPlay = false;
	}
	
	if(this.UsePlaylist){
		if(this.IsEmpty(this.PlaylistFeed)){
			// Getting here implies that no feed has been manually set so were are going to look for a widget to get a playlist from
			if(!this.IsEmpty(window.BravoWidgets)){
				if(window.BravoWidgets.length > 0){
					for(var i = 0; i < window.BravoWidgets.length; i++){
						if(window.BravoWidgets[i].Config.playlistBased){
						   this.PlaylistWidget = window.BravoWidgets[i];
						   this.PlaylistFeed = window.BravoWidgets[i].Config.feedUrl + "?form=json&count=true&fields=" + this.PlaylistFields + "&startIndex=" + this.PlaylistStartIndex + "&endIndex=" + this.PlaylistEndIndex;
						   this.PlaylistFeedRaw = window.BravoWidgets[i].Config.feedUrl + "?form=json";
						   break;
					   }
					}
				}
			}
		} else {
			this.PlaylistFeedRaw = this.PlaylistFeed;
			this.PlaylistFeed = this.PlaylistFeed.replace("form=json", "form=json&count=true&fields=" + this.PlaylistFields + "&startIndex=" + this.PlaylistStartIndex + "&endIndex=" + this.PlaylistEndIndex);
			this.Debug(this.PlaylistFeed);
		}
	}
	
	if (!this.NoBravoHead) {
		this.PlayerSize = playerSize;
		this.ParamsLoaded();
		this.StartBuild();
	}
}

NBC.ParamsLoaded = function(){
	//------------------------------------------------------
	this.Debug("[ParamsLoaded]");
	for(var i = 0; i < NBCPARAMS.channels.length; i++){
		if(NBCPARAMS.channels[i].name == channel){
			for(var j in NBCPARAMS.channels[i]){
				//this.Debug(" -- " + j + ":" + NBCPARAMS.channels[i][j]);
			}
			this.MP = NBCPARAMS.channels[i];
			this.Feed = NBCPARAMS.channels[i].feed;
			this.BaseURL = NBCPARAMS.channels[i].baseurl;
			this.ShareURL = NBCPARAMS.channels[i].shareurl;
			this.Embed = NBCPARAMS.channels[i].embed;
			if(!this.IsEmpty(NBCPARAMS.channels[i].fwcompaniondiv)){
				this.FWCompanionDiv = NBCPARAMS.channels[i].fwcompaniondiv;
				this.FWCompanionText = NBCPARAMS.channels[i].fwcompaniontext;
			}
			break;
		}
	}
	if(this.IsEmpty(this.Feed)){
		this.Debug("WARNING: Feed (" + channel + ") not found");
	}
	for(var i = 0; i < NBCPARAMS.playerDimensions.length; i++){
		if(NBCPARAMS.playerDimensions[i].type == this.PlayerSize){
			var d = NBCPARAMS.playerDimensions[i].dimensions.split("x");
			this.PlayerWidth = d[0];
			this.PlayerHeight = d[1];
			break;
		}
	}
	if(this.IsEmpty(this.PlayerWidth)){
		// This is a dimension set not in the params
		var d = this.PlayerSize.split("x");
		this.PlayerWidth = d[0].substring(1,d[0].length);
		this.PlayerHeight = d[1];
	}
	this.Debug(this.PlayerWidth + " x " + this.PlayerHeight);
}

NBC.GetFeeds = function(){
	//------------------------------------------------------
	this.Debug("[GetFeeds]");
	var categoryFEP = this.Feed.replace("?form=json", "categories?form=json")
	var getParam;
	if(!this.IsEmpty(this.Inbound.VID)){
		if(this.Inbound.VID.substr(0,4) == "_vid"){
			getParam = "&byGuid=" + this.Inbound.VID.substring(4,this.Inbound.VID.length);
		} else {
			if(this.Inbound.VID.substr(0,5) == "_vcms"){
				//getParam = "&byCustomValue={vcmsIdentifier}{" + this.Inbound.VID.substring(5,this.Inbound.VID.length) + "}";
				getParam = "&byCustomValue={directLinkIdentifier}{" + this.Inbound.VID.substring(5,this.Inbound.VID.length) + "}";
			} else {
				this.Debug("Inbound.VID was:" + this.Inbound.VID);
				getParam = "&byTitle=" + this.Inbound.VID;
			}
		}
	}
	if(this.IsEmpty(getParam)){
		if (!this.IsEmpty(this.Inbound.ShowName)) {
			// Get the first video for this show
			var showNomenclature = "Shows";
			switch(channel){
				case "usa":
					showNomenclature = "Series";
				default:
					break;
			}
			getParam = "&q=categoryFullTitles:" + showNomenclature + "/" + this.LuceneSpaces(this.Inbound.ShowName) + "*";
		} else {
			// Get the first video in the overall site feed (NOTE: currently disabled)
			getParam = "&range=1-1&sort=added|desc";
		}
	}
	
	var mediaFeed = NBC.Feed + "&fields=title,guid,description,:subtitle,content,thumbnails,categories,:fullEpisode,:directLinkIdentifier,:disallowSharing" + getParam;
	
	if(NBCDD.i){
		mediaFeed += "&byContent=byAssetTypes%3DVideo%26byFormat%3DMPEG4";
	}
	
	if(!this.IsEmpty(this.Inbound.VID)){
		if(!this.AppearsToBeIE){
			hs$.ajax({
				url: mediaFeed,
				dataType: 'json',
				success: function(data){NBC.ParseMediaFeed(data)}
			});
			hs$.ajax({
				url: categoryFEP + "", // TO-DO: define fields
				dataType: 'json',
				success: function(data){NBC.ParseCategoriesFeed(data)}
			});
		} else {
			var fReq = new JSONRequest(mediaFeed, "NBC.ParseMediaFeed");
			fReq.send();
			var cReq = new JSONRequest(categoryFEP, "NBC.ParseCategoriesFeed");
			cReq.send();
		}
	}
}

NBC.ParseMediaFeed = function(data){
	//------------------------------------------------------
	this.Debug("[ParseMediaFeed]");
	var noEntries = false;
	if(!this.IsEmpty(data.entries)){
		if(data.entries.length > 0){
			this.NowPlaying = data.entries[0];
			this.Media = data.entries;
			if(!NBCDD.d){if(data.entries[0].pl1$fullEpisode){this.Pa = false;}}
			if(this.UsePlaylist){
				this.ActivateMedia(true);
			} else {
				this.ActivateMedia(false);
			}
		} else {
			this.Debug("Warning: zero-length media entries")		
			noEntries = true;
		}
	} else {
		this.Debug("Warning: no entries from media feed")
		noEntries = true;
	}
	if(noEntries){
		if(!this.UsePlaylist && this.IsStandAlone){
			tpController.setPlayerMessage("Sorry, we couldn't find that video.");
		}
	}
}

NBC.ActivateMedia = function(playNow){
	//------------------------------------------------------
	this.Debug("[ActivateMedia]");
	if(!this.IsEmpty(this.NowPlaying)){
		var m = NBC.NowPlaying;
		if(this.StandaloneAutoPlay){
			playNow = true;
		}
		if(playNow){
			m.playNow = "Y";
		} else {
			m.playNow = "N";
		}
		if(this.UsePlaylist){
			if(this.PlaylistBasedOnGuid){
				this.PlaylistStartId = m.guid;
			} else {
				//this.PlaylistStartId = m.pl1$vcmsIdentifier;
				this.PlaylistStartId = m.pl1$directLinkIdentifier;
			}
			//this.DeterminePlaylistIndex();
			this.HighlightWidgetIfExists();
		}
		this.ShareLink = this.ShareURL + this.NowPlaying.guid;
		if(hs$(".endcardblocker").is(":visible")){
			hs$(".endcardblocker").hide();
			}
		if(hs$(".emailblocker").is(":visible")){
			hs$(".emailblocker").hide();
		}
		if(this.Pa){
			if(this.HTML5){
				if(playNow){
					tpController.loadReleaseURL(this.GetDefaultVideoObject(this.NowPlaying, false) + "&manifest=m3u");
					tpController.clickPlayButton();
				} else {
					this.Debug("Loading release URL (1)", true);
					tpController.loadReleaseURL(this.GetDefaultVideoObject(this.NowPlaying, false) + "&manifest=m3u");
				}
				this.PopulateMetaData(m);
			} else {
				this.Debug("Loading release URL (2)", true);
				if(playNow){
					tpController.setReleaseURL(this.GetDefaultVideoObject(this.NowPlaying, false));
				} else {
					tpController.loadReleaseURL(this.GetDefaultVideoObject(this.NowPlaying, false));
				}
				this.PopulateMetaData(m);
			}
		} else {
			this.SetPlayerMessage(NBCPARAMS.messages.u);
		}
	} else {
		this.DebugWarn("WARNING: the NowPlaying object is empty");
	}
}

NBC.PopulateMetaData = function(m){
	//------------------------------------------------------
	this.Debug("[PopulateMetaData]");
	
	m.showUpperMetaAtStart = this.ShowUpperMetaAtStart;
	
	if(!this.IsEmpty(this.Embed)){
		if(this.Embed.indexOf("<VIDEO>") != -1){
			this.EmbedCode = this.Embed.replace("<VIDEO>","_vid" + m.guid);
		} else {
			var extantId = this.Embed.substr(this.Embed.lastIndexOf('/'),this.Embed.length);
			this.EmbedCode = this.Embed.replace(extantId,m.pl1$directLinkIdentifier);
		}
	}
	
	hs$(".emailvideotitle").html(this.NowPlaying.title);
	hs$(".urllinktext, .endcardlinktext").val('<iframe width="400" height="225" frameborder="0" scrolling="no" src="' + this.EmbedCode + '"></iframe>');
	hs$(".endcardvideotitle").html(this.NowPlaying.title);
	hs$(".endcardtext").val(window.location.toString());
	if(this.PlayerWidth < 545){
		hs$(".endcardembedtext").val('<iframe width="400" height="225" frameborder="0" scrolling="no" src="' + this.EmbedCode + '"></iframe>');
	}
	if(this.HTML5){
		var ftc = this.FriendlyTime(this.GetDefaultVideoObject(this.NowPlaying, true).plfile$duration,false);
		var duration = this.PadZero(ftc.h, false, true) + this.PadZero(ftc.m, true, true) + this.PadZero(ftc.s, true, false);
		hs$(".htmlbaseplatetitle").html(this.NowPlaying.title);
		hs$(".htmlbaseplatesubtitle").html(this.NowPlaying.pl1$subtitle);
		hs$(".htmlbaseplatedescription").html(this.NowPlaying.description);
		hs$(".htmlbaseplateduration").html(duration);
	} else {
		tpController.dispatchEvent("OnGetFeedData", m);
	}
	if(m.pl1$disallowSharing){
		hs$(".endcardlinktextwrap").hide();
		hs$(".endcardsocial").hide();
		hs$(".endcardseparator").hide();
		hs$(".htmlcontrolslink").hide();
		hs$(".htmlcontrolsemail").hide();
		hs$(".htmlcontrolsfacebook").hide();
		hs$(".htmlcontrolstwitter").hide();
		hs$(".htmlcontrolsshare").hide();
	}
}

NBC.ParseCategoriesFeed = function(data){
	//------------------------------------------------------
	this.Debug("[ParseCategoriesFeed]");
	if(!this.IsEmpty(data.entries)){
		if(data.entries.length > 0){
			this.Categories = data.entries;
			if(!this.IsEmpty(this.Media)){
				//NBC.Finish();
			}
		} else {
			this.Debug("Warning: zero-length categories entries")		
		}
	} else {
		this.Debug("Warning: no entries from categories feed")
	}
}

NBC.PlayerLoaded = function(){
	//------------------------------------------------------
	this.Debug("[PlayerLoaded]");
	if(!this.PlayerLoadAlreadyDetected){
		this.PlayerLoadAlreadyDetected = true;
		if(this.HTML5){
			hs$("#tpplayerwidget").mouseenter(function(evt){
				if(hs$('.htmlbaseplate' + NBC.Html5ClassAnnex).css("top") == "0px"){
					//NBC.Debug("Added an enter task");
					NBC.AddTask({"type": "cancel", "data": "playerout", "sender": "player over"});
					NBC.AddTask({"type":"playerover","data":{"delay":300}, "sender": "Player Loaded"});
				}
			});
			hs$("#tpplayerwidget").mouseleave(function(evt){
				if(hs$('.htmlbaseplate' + NBC.Html5ClassAnnex).css("top") == "0px"){
					//NBC.Debug("Added a leave task");
					NBC.AddTask({"type": "cancel", "data": "playerover", "sender": "player out"});
					NBC.AddTask({"type":"playerout","data":{"delay":300},"sender": "player out"});
				}
			});
		}
		
		if(this.IsStandAlone) {
			try{
				var playerCover = hs$('<a style="width:100%; height:100%; position:absolute; z-index:1000; top:0px; display:block; background-image:url(images/spacer.gif);" id="playercover" href="#"></a>');
				hs$("#tpplayerwidgetwrap").append(playerCover);
				hs$("#playercover").click(function(evt){evt.preventDefault(); NBC.OnMediaClick(evt);});
			} catch(e){}
			if(!this.UsePlaylist){
				this.AddTask({"type": "getfeeds", "data": {}});
			}
		}

		if(this.UsePlaylist){
			this.BuildPlaylist();
		}
		
		this.BuildEmailCard();
		
	}
}

NBC.StartBuild = function(){
//------------------------------------------------------
	this.Debug("[StartBuild]");
	if(NBC.StartBuildTimer){
		clearTimeout(NBC.StartBuildTimer);
		NBC.StartBuildTimer = null;
	}
	if(hs$("#tpplayerwidgetwrap").length == 0){
		NBC.StartBuildTimer = setTimeout(NBC.StartBuild, 50);
		return;
	} 
	if(window.location.toString().indexOf("glyn") != -1){
		NBC.DebugMode = true;
		var osd = hs$('<div class="osd" style="overflow:scroll; width:400px; height:800px; position:absolute; top:20px; left:1200px; border:1px solid #000; background-color:#fff; font:normal 10px Verdana; color:#222; padding:10px;"></div>')
		//hs$("body").eq(0).append(osd);
	}
	if(this.AppearsToBeIE){
		NBC.UseJR = true;
	}
	if(channel == "bravo"){
		NBC.UseJR = true;
	}

	hs$("#tpplayerwidgetwrap").addClass(NBC.PlayerSize.toLowerCase());
	hs$("#tpplayerwidgetwrap").addClass("tpplayer" + channel.toLowerCase());
	//alert(hs$("#tpplayerwidgetwrap").attr("class"));

	switch(channel){
		case "usa":
			NBC.RatingsPath = "http://www.usanetwork.com/videos/hub/latest/ratings/";
			break;
		case "syfy":
			NBC.RatingsPath = "http://www.syfy.com/_images/video/ratings/";
			break;
		case "bravo":
			NBC.RatingsPath = "http://www.bravotv.com/_tp/images/ratings/";
			break;
		case "oxygen":
			NBC.RatingsPath = "http://features.oxygen.com/videos/images/ratings/";
			break;
		default:
			break;
	}

	NBC.BuildPlayer();
	NBC.BuildUrlLink();
	if(NBC.PlayerSize != "small"){
		if(!NBC.HTML5){
			var ph = NBC.PlayerHeight - 41;
			if(_playerSize = "_400x225"){
				ph += 6;
			}
			NBC.CardBlockerHeight = ph.toString() + "px";
		}
	}
	if(NBC.PlayerSize != "small"){
		NBC.BuildEndCard();
		NBC.AddTask({"type": "getyoumayalsolike", "data": "", "sender": "Startbuild"});
	} else {
		NBC.BuildSmallEndCard();
	}
	NBC.SetUpPlayerEventListeners();
	//setTimeout("NBC.ShowShareCard()", 3000);
}

NBC.BuildHTMLControls = function(){
	//------------------------------------------------------
	this.Debug("[BuildHTMLControls]");
	this.Html5ClassAnnex = "";
	if(this.PlayerSize == "small"){
		this.Html5ClassAnnex = "small";
	}
	var gapOnLeft = 15;
	var widthOfRightSide;
	var widthOfNonTextLeft;
	if(this.PlayerSize != "small"){
		widthOfRightSide = 205;
		widthOfNonTextLeft = 67 + gapOnLeft;
	} else {
		widthOfRightSide = 305;
		widthOfNonTextLeft = 30 + gapOnLeft;
	}
	//var htmlDebug = hs$('<div class="htmldebug" style="position:absolute; left:700px; border:2px solid red; font:normal 11px Verdana; color:#000; text-align:center; padding:10px;"></div>'); hs$('body').eq(0).append(htmlDebug);
	var htmlUpperMetaData = hs$('<div class="htmluppermetadata' + this.Html5ClassAnnex + '" style="width:' + this.PlayerWidth + 'px;"></div>');
	var htmlUpperMetaDataBlack = hs$('<div class="htmluppermetadatablack' + this.Html5ClassAnnex + '" style="width:' + this.PlayerWidth + 'px;"></div>');
	var htmlBasePlate = hs$('<div class="htmlbaseplate' + this.Html5ClassAnnex + '" style="width:' + this.PlayerWidth + 'px;"></div>');
	var htmlBasePlateBlack = hs$('<div class="htmlbaseplateblack' + this.Html5ClassAnnex + '" style="width:' + this.PlayerWidth + 'px;"></div>'); htmlBasePlate.append(htmlBasePlateBlack);
	var bpInner = hs$('<div class="htmlbaseplateinner' + this.Html5ClassAnnex + '" style="width:' + Number(this.PlayerWidth - gapOnLeft) + 'px;"></div>'); htmlBasePlate.append(bpInner);
	var bpLeft = hs$('<div class="htmlbaseplateleft' + this.Html5ClassAnnex + '" style="width:' + Number(this.PlayerWidth - widthOfRightSide - gapOnLeft) + 'px;"></div>');  bpInner.append(bpLeft);
	var bpRight = hs$('<div class="htmlbaseplateright' + this.Html5ClassAnnex + '" style="width:' + widthOfRightSide + 'px;"></div>');  bpInner.append(bpRight);
	var bpPlay = hs$('<a href="#" class="htmlbaseplateplay' + this.Html5ClassAnnex + '"></a>'); bpLeft.append(bpPlay);
	var bpSeparatorOne = hs$('<div class="htmlbaseplateseparator' + this.Html5ClassAnnex + '"></div>'); bpLeft.append(bpSeparatorOne);
	var bpText = hs$('<div class="htmlbaseplatetext' + this.Html5ClassAnnex + '" style="width:' + Number(this.PlayerWidth - widthOfNonTextLeft - widthOfRightSide) + 'px"></div>'); bpLeft.append(bpText);
	var bpTitle = hs$('<div class="htmlbaseplatetitle"></div>'); bpText.append(bpTitle);
	var bpSubtitle = hs$('<div class="htmlbaseplatesubtitle"></div>'); bpText.append(bpSubtitle);
	var bpDescription = hs$('<div class="htmlbaseplatedescription"></div>'); bpText.append(bpDescription);
	var bpLogo = hs$('<div class="htmlbaseplatelogo' + this.Html5ClassAnnex + '"></div>'); bpRight.append(bpLogo);
	var bpSeparatorThree = hs$('<div class="htmlbaseplateseparator' + this.Html5ClassAnnex + ' htmlbaseplateseparatorright notforsmall"></div>'); bpRight.append(bpSeparatorThree);
	var bpDuration = hs$('<div class="htmlbaseplateduration' + this.Html5ClassAnnex + ' notforsmall"></div>'); bpRight.append(bpDuration);
	var bpSeparatorTwo = hs$('<div class="htmlbaseplateseparator' + this.Html5ClassAnnex + ' htmlbaseplateseparatorright"></div>'); bpRight.append(bpSeparatorTwo);
	hs$("#tpplayerwidgetwrap").append(htmlBasePlate);

	bpPlay.click(function(evt){
		evt.preventDefault();
		tpController.clickPlayButton();
	})

	var htmlControls = hs$('<div class="htmlcontrols' + this.Html5ClassAnnex + '" style="width:' + this.PlayerWidth + 'px;" rel="hidden"></div>');
	var hProgressWrapper = hs$('<div class="htmlcontrolsprogresswrapper' + this.Html5ClassAnnex + '"></div>'); htmlControls.append(hProgressWrapper);
	var hProgressWatched = hs$('<div class="htmlcontrolsprogresswatched' + this.Html5ClassAnnex + '"></div>'); hProgressWrapper.append(hProgressWatched);
	var hProgressScrubber = hs$('<div class="htmlcontrolsprogressscrubber' + this.Html5ClassAnnex + '"></div>'); hProgressWrapper.append(hProgressScrubber);
	var hProgressUnwatched = hs$('<div class="htmlcontrolsprogressunwatched' + this.Html5ClassAnnex + '" style="width:' + this.PlayerWidth + 'px;"></div>'); hProgressWrapper.append(hProgressUnwatched);
	var hBar = hs$('<div class="htmlcontrolsbar' + this.Html5ClassAnnex + '" style="width:' + this.PlayerWidth + 'px;"></div>'); htmlControls.append(hBar);
	var hPlay = hs$('<a href="#" class="htmlcontrolsplay' + this.Html5ClassAnnex + '"></a>'); hBar.append(hPlay);
	var hPause = hs$('<a href="#" class="htmlcontrolspause' + this.Html5ClassAnnex + '"></a>'); hBar.append(hPause);
	var hSeparatorOne = hs$('<a href="#" class="htmlcontrolsseparator' + this.Html5ClassAnnex + ' notforsmall"></a>'); hBar.append(hSeparatorOne);
	var hTimer = hs$('<div class="htmlcontrolstimer' + this.Html5ClassAnnex + ' notforsmall"><div class="htmlcontrolselapsed' + this.Html5ClassAnnex + '"></div><div>/</div><div class="htmlcontrolstotal' + this.Html5ClassAnnex + '"></div></div>'); hBar.append(hTimer);
	var hSeparatorTwo = hs$('<div class="htmlcontrolsseparator' + this.Html5ClassAnnex + '"></div>'); hBar.append(hSeparatorTwo);
	//var hSpeaker = hs$('<div class="htmlcontrolsspeaker' + this.Html5ClassAnnex + '"></div>'); hBar.append(hSpeaker);
	//var hMuted = hs$('<div class="htmlcontrolsmuted' + this.Html5ClassAnnex + '"></div>'); hBar.append(hMuted);
	//var hVolume = hs$('<div class="htmlcontrolsvolume' + this.Html5ClassAnnex + '"></div>'); hBar.append(hVolume);
	//var hVolumeTrackOn = hs$('<div class="htmlcontrolsvolumetrackon' + this.Html5ClassAnnex + '"></div>'); hVolume.append(hVolumeTrackOn);
	//var hVolumeScrubber = hs$('<div class="htmlcontrolsvolumescrubber' + this.Html5ClassAnnex + '"></div>'); hVolume.append(hVolumeScrubber);
	//var hVolumeTrackOff = hs$('<div class="htmlcontrolsvolumetrackoff' + this.Html5ClassAnnex + '"></div>'); hVolume.append(hVolumeTrackOff);
	var hLogo = hs$('<div class="htmlcontrolslogo' + this.Html5ClassAnnex + ' notforsmall"></div>'); hBar.append(hLogo);
	var hSeparatorFive = hs$('<div class="htmlcontrolsseparator' + this.Html5ClassAnnex + ' htmlcontrolsseparatorright notforsmall"></div>'); hBar.append(hSeparatorFive);
	var hFullScreen = hs$('<a href="#" class="htmlcontrolsfullscreen' + this.Html5ClassAnnex + '"></a>'); hBar.append(hFullScreen);
	var hSeparatorFour = hs$('<div class="htmlcontrolsseparator' + this.Html5ClassAnnex + ' htmlcontrolsseparatorright"></div>'); hBar.append(hSeparatorFour);
	var hLink = hs$('<a href="#" class="htmlcontrolslink' + this.Html5ClassAnnex + ' notforsmall"></a>'); hBar.append(hLink);
	var hEmail = hs$('<a href="#" class="htmlcontrolsemail' + this.Html5ClassAnnex + ' notforsmall"></a>'); hBar.append(hEmail);
	var hShare = hs$('<a href="#" class="htmlcontrolsshare' + this.Html5ClassAnnex + '"></a>'); hBar.append(hShare);
	if(this.PlayerWidth > 500){
		var hTwitter = hs$('<a href="#" class="htmlcontrolstwitter' + this.Html5ClassAnnex + '"></a>'); hBar.append(hTwitter);
		var hFacebook = hs$('<a href="#" class="htmlcontrolsfacebook' + this.Html5ClassAnnex + '"></a>'); hBar.append(hFacebook);
	}
	//var hSeparatorThree = hs$('<div class="htmlcontrolsseparator' + this.Html5ClassAnnex + ' htmlcontrolsseparatorright"></div>'); hBar.append(hSeparatorThree);
	hs$("#tpplayerwidgetwrap").append(htmlControls);
	
	hProgressWrapper.click(function(evt){
		evt.preventDefault();
		var hcol = hs$(".htmlcontrols").offset().left;
		var percentage = NBC.CalculatePercentage(evt.clientX - hcol, NBC.PlayerWidth);
		//alert(percentage + " (based on " + evt.clientX + ")");
		tpController.seekToPercentage(percentage);
	});
	
	htmlControls.mouseenter(function(evt){
		//NBC.Debug("cancelling leave");
		NBC.AddTask({"type": "cancel", "data": "playerout", "sender": "HTML controls out"});
	})

	hPlay.click(function(evt){
		evt.preventDefault();
		hs$(this).hide();
		hs$(".htmlcontrolspause" + NBC.Html5ClassAnnex).show();
		tpController.pause(false);
	})

	hPause.click(function(evt){
		evt.preventDefault();
		hs$(this).hide();
		hs$(".htmlcontrolsplay" + NBC.Html5ClassAnnex).show();
		tpController.pause(true);
	})

	/*
	htmlControls.mouseleave(function(evt){
		if(!NBC.QueueContains("playerout")){
		//NBC.Debug("Requesting leave");
		NBC.AddTask({"type":"playerout", "data":{"delay":300}});
		}
	})

	hVolume.click(function(evt){
		evt.preventDefault();
		var x = evt.pageX - hs$(".htmlcontrolsvolume" + NBC.Html5ClassAnnex).offset().left;
		var w = hs$('.htmlcontrolsvolume' + NBC.Html5ClassAnnex).width();
		var p = NBC.CalculatePercentage(x,w);
		NBC.AddTask({"type": "volumeclick", "data": {"delay":100, "target": p, "pos": x}});
	})
	
	hProgressScrubber.mousedown(function(evt){
		evt.preventDefault();
		if(!NBC.IsEmpty(NBC.CurrentChapter)){
			NBC.ProgressScrubberDragging = true;
			hs$(".htmlcontrols").mousemove(function(evt){
				NBC.ProgressScrubberMouseMove(evt,hs$(".htmlcontrolsprogressscrubber" + NBC.Html5ClassAnnex));
			});
		}
	});

	hVolumeScrubber.mousedown(function(evt){
		evt.preventDefault();
		hs$(".htmlcontrols" + NBC.Html5ClassAnnex).mousemove(function(evt){
			NBC.VolumeScrubberMouseMove(evt);
		});
	});

	hSpeaker.click(function(evt){
		evt.preventDefault();
		hs$(this).hide();
		hs$(".htmlcontrolsmuted" + NBC.Html5ClassAnnex).show();
		document.getElementsByTagName("VIDEO")[0].muted=true;
		tpController.mute(true);
	})

	hMuted.click(function(evt){
		evt.preventDefault();
		hs$(this).hide();
		hs$(".htmlcontrolsspeaker" + NBC.Html5ClassAnnex).show();
		document.getElementsByTagName("VIDEO")[0].muted=false;
		tpController.mute(false);
	})
	*/

	hShare.click(function(evt){
		evt.preventDefault();
		tpController.pause(true);
		hs$(".htmlcontrolspause" + NBC.Html5ClassAnnex).hide();
		hs$(".htmlcontrolsplay" + NBC.Html5ClassAnnex).show();
		if(NBC.PlayerSize != "small"){
			NBC.ShowShareCard();
		} else {
			NBC.ShowSmallShareCard();
		}
	})

	hEmail.click(function(evt){
		evt.preventDefault();
		tpController.pause(true);
		hs$(".htmlcontrolspause" + NBC.Html5ClassAnnex).hide();
		hs$(".htmlcontrolsplay" + NBC.Html5ClassAnnex).show();
		if(NBC.PlayerSize != "small"){
			NBC.ShowEmailCard();
		} else {
			NBC.ShowSmallEmailCard();
		}
	})

	if(this.PlayerWidth > 500){
		hFacebook.click(function(evt){
			evt.preventDefault();
			tpController.showFullScreen(false);
			NBC.ShareSocial('fb');
		})
	
		hTwitter.click(function(evt){
			evt.preventDefault();
			tpController.showFullScreen(false);
			NBC.ShareSocial('tw');
		})
	}

	hLink.click(function(evt){
		evt.preventDefault();
		NBC.HideCardsAndShowUrlLink();
	})

	hFullScreen.click(function(evt){
		evt.preventDefault();
		NBC.DoHtmlFullScreen(evt);
	})
	
	//hs$("body").mouseup(function(evt){NBC.ProgressScrubberMouseUp(evt);NBC.VolumeScrubberMouseUp(evt);});

	//this.AddTask({"type":"initializevolumeslider","data":{"delay":1000}});

	var hProgressWrapperMini = hs$('<div class="htmlcontrolsprogresswrappermini" style="' + this.PlayerWidth + 'px; top:' + Number(this.PlayerHeight - 5) + 'px;"></div>'); hs$('#tpplayerwidgetwrap').append(hProgressWrapperMini);
	var hProgressWatchedMini = hs$('<div class="htmlcontrolsprogresswatchedmini"></div>'); hProgressWrapperMini.append(hProgressWatchedMini);
	var hProgressScrubberMini = hs$('<div class="htmlcontrolsprogressscrubbermini"></div>'); hProgressWrapperMini.append(hProgressScrubberMini);
	var hProgressUnwatchedMini = hs$('<div class="htmlcontrolsprogressunwatchedmini" style="width:' + this.PlayerWidth + 'px;"></div>'); hProgressWrapperMini.append(hProgressUnwatchedMini);

}

/*
NBC.ProgressScrubberMouseMove = function(evt,sender){
	//------------------------------------------------------
	var wrapperDistanceFromLeft = hs$(".htmlcontrolsprogressscrubber" + NBC.Html5ClassAnnex).parent().offset().left;
	var areaAllowedWithin = NBC.PlayerWidth - (NBC.ProgressBuffer * 2);
	var leftBoundary = hs$(".htmlcontrolsprogresswrapper" + NBC.Html5ClassAnnex).offset().left;
	var rightBoundary = wrapperDistanceFromLeft + areaAllowedWithin + NBC.ProgressBuffer;
	var calc = Number((evt.clientX - wrapperDistanceFromLeft));
	if((calc + wrapperDistanceFromLeft > (leftBoundary)) && (calc + wrapperDistanceFromLeft < rightBoundary)){
		sender.css("left", Number(calc - NBC.ProgressBuffer) + "px");
	}
}

NBC.ProgressScrubberMouseUp = function(evt){
	//------------------------------------------------------
	this.Debug("[ProgressScrubberMouseUp]");
	if(this.ProgressScrubberDragging){
		this.ProgressScrubberDragging = false;
		hs$(".htmlcontrols" + NBC.Html5ClassAnnex).unbind("mousemove");
		var areaAllowedWithin = NBC.PlayerWidth - (this.ProgressBuffer * 2);
		var percentage = this.CalculatePercentage(Math.floor(hs$(".htmlcontrolsprogressscrubber" + this.Html5ClassAnnex).offset().left - hs$(".htmlcontrolsprogressscrubber" + this.Html5ClassAnnex).parent().offset().left), areaAllowedWithin);
		var seek = Math.floor((percentage / 100) * NBC.CurrentChapter.length);
		tpController.seekToPosition(seek);
	}
}

NBC.VolumeScrubberMouseMove = function(evt){
	//------------------------------------------------------
	var halfScrubber = Math.floor(hs$('.htmlcontrolsvolumescrubber' + this.Html5ClassAnnex).width() / 2);
	var calc;
	var moveWithin;
	if(!NBC.IsEmpty(evt.volumeScrubberNewPosition)){
		calc = evt.volumeScrubberNewPosition - halfScrubber;
	} else {
		calc = Math.floor((evt.clientX - hs$(".htmlcontrolsvolume" + this.Html5ClassAnnex).offset().left) - halfScrubber);
	}
	moveWithin = hs$(".htmlcontrolsvolume" + this.Html5ClassAnnex).width();
	if((calc > -3) && (calc < moveWithin - 1)){
		hs$('.htmlcontrolsvolumescrubber' + NBC.Html5ClassAnnex).css("left", Number(calc) + "px");
		hs$(".htmlcontrolsvolumetrackon" + NBC.Html5ClassAnnex).css("width",Number(calc) + "px");
	}
}

NBC.VolumeScrubberMouseUp = function(evt){
	//------------------------------------------------------
	NBC.Debug("[VolumeScrubberMouseUp]");
	hs$(".htmlcontrols" + this.Html5ClassAnnex).unbind("mousemove");
	var r = hs$(".htmlcontrolsvolumescrubber" + NBC.Html5ClassAnnex).css("left").replace("px","");
	r = Number(r);
	var l = Math.floor(r+2);
	var h = hs$(".htmlcontrolsvolume" + NBC.Html5ClassAnnex).width();
	var v = Number(NBC.CalculatePercentage(l,h)) / 100;
	document.getElementsByTagName("VIDEO")[0].volume = v.toFixed(1);
	NBC.Debug(v.toFixed(1) + " from " + l + "," + h);
}
*/

NBC.DoHtmlFullScreen = function(evt){
	//------------------------------------------------------
	NBC.Debug("[DoHtmlFullScreen]");
	var elem = document.getElementsByTagName("VIDEO")[0];
	if (elem.requestFullScreen) {
		NBC.Debug("requestFullScreen");
	  	elem.requestFullScreen();
	} else if (elem.mozRequestFullScreen) {
		NBC.Debug("mozRequestFullScreen");
	 	elem.mozRequestFullScreen();
	} else if (elem.webkitEnterFullScreen) {
		NBC.Debug("webkitEnterFullScreen");
		elem.webkitEnterFullScreen();
	}
}

NBC.BuildPlayer = function(){
	//------------------------------------------------------
	this.Debug("[BuildPlayer]");
	var freeWheelCompanion = hs$('<span id="300x250_1" class="_fwph"><form id="_fw_form_300x250_1" style="display:none"><input type="hidden" name="_fw_input_300x250_1" id="_fw_input_300x250_1" value="w=300&h=250&envp=g_js"></form><span id="_fw_container_300x250_1" class="_fwac">' + this.FWCompanionText + '</span></span>');
	var cr = "type=overlay|URL="+this.ScriptRoot+"pdk/swf/NBC_Control_Rack.swf|pm=base|w=" + this.PlayerWidth + "|h=" + this.PlayerHeight + "|priority=200|scale=true|channel=" + channel + "|sz=" + this.PlayerSize;
	var targetFreeWheelDiv = hs$('#' + this.FWCompanionDiv);
	if(this.DebugMode){
		cr += "|db=Y";
	} else {
		cr += "|db=N"
	}
	if(NBCDD.i){
		this.HTML5 = true;
	}
	var player = new Player("tpplayerwidget", this.PlayerWidth, this.PlayerHeight);
	NBC.player = player;
	player.backgroundColor = "0x000000";
	player.layoutUrl=this.ScriptRoot+"data/metaLayout_empty.xml";
	player.useDefaultPlayOverlay = false;
	player.backgroundColor = "0x000000";
	player.pageBackgroundColor = "0x000000";
	if(this.PlayerSize != "small"){
		player.frameColor="0x000000";
	}
	if(this.NoFreeWheel != "Y"){
		var freewheelString = (window._freewheelShowName == '' || window._freewheelShowName == undefined) ? 'tvn_cable_default' : window._freewheelShowName;
		player.plugin0="type=adcomponent|URL=http://adm.fwmrm.net/p/nbcu_live/ThePlatformPDKPlugin.swf|priority=1|networkId=169843|cb_profile=nbcu_live_as3|siteSectionNetworkId=169843|videoAssetNetworkId=169843|fw_server=http://29773.v.fwmrm.net/ad/p/1|siteSection="+freewheelString+"|autoplay=true|video_profile=adam_video|amLocation=http://adm.fwmrm.net/p/nbcu_live/AdManager.swf|extensionName=AnalyticsExtension|extensionUrl=http://adm.fwmrm.net/p/nbcu_live/AnalyticsExtension.swf";
	}
	if(!this.HTML5){
		player.skinUrl=this.ScriptRoot+"pdk/swf/skinFlat.swf";
		player.plugin1=cr;
		player.plugin2="type=overlay|URL="+this.ScriptRoot+"pdk/swf/ratingsPlugIn.swf|priority=4|path=" + this.RatingsPath + "|reminder=20|delay=10";
		player.plugin4="type=player|URL="+this.ScriptRoot+"pdk/swf/akamaiHD.swf|priority=5|hosts=" + channel + "hls-i.akamaihd.net";
		//http://secure-au.imrworldwide.com/novms/tp/3/ggtp380.swf
		player.plugin5="type=tracking|URL="+this.ScriptRoot+"pdk/swf/NBCUOmnitureTracking.swf|priority=2";

		switch(channel)
		{
			case "usa":
				player.plugin6="type=tracking|URL="+this.ScriptRoot+"pdk/swf/NBCUComScore.swf|c2=3000065|c4=3000065|priority=3";
				player.pluginNielsen="type=Tracking|URL="+this.ScriptRoot+"pdk/swf/ggtp380.swf|clientid=us-800148|vcid=c07|sfcode=us|enablecustomparse=nbc|category=0|subcategory=season|prod=vc,iag|adurlfield=fw:adurl|sid=2500011627|tfid=1362|adcategory=fw:category|adsubcategory=fw:subcategory|displayprefix=Season|displayfieldname=season";
				break;
			case "syfy":
				player.plugin6="type=tracking|URL="+this.ScriptRoot+"pdk/swf/NBCUComScore.swf|c2=3000060|c4=3000060|priority=3";
				player.pluginNielsen="type=Tracking|URL="+this.ScriptRoot+"pdk/swf/ggtp380.swf|clientid=us-800148|vcid=c06|sfcode=us|enablecustomparse=nbc|category=0|subcategory=season|prod=vc,iag|adurlfield=fw:adurl|sid=2500011627|tfid=1362|adcategory=fw:category|adsubcategory=fw:subcategory|displayprefix=Season|displayfieldname=season";
				break;
			case "bravo":
				player.plugin6="type=tracking|URL="+this.ScriptRoot+"pdk/swf/NBCUComScore.swf|c2=3000039|c4=3000039|priority=3";
				player.pluginNielsen="type=Tracking|URL="+this.ScriptRoot+"pdk/swf/ggtp380.swf|clientid=us-800148|vcid=c02|sfcode=us|enablecustomparse=nbc|category=0|subcategory=season|prod=vc,iag|adurlfield=fw:adurl|sid=2500011627|tfid=1362|adcategory=fw:category|adsubcategory=fw:subcategory|displayprefix=Season|displayfieldname=season";
				break;
			case "oxygen":
				player.plugin6="type=tracking|URL="+this.ScriptRoot+"pdk/swf/NBCUComScore.swf|c2=3000057|c4=3000057|priority=3";
				player.pluginNielsen="type=Tracking|URL="+this.ScriptRoot+"pdk/swf/ggtp380.swf|clientid=us-101150|vcid=b01|sfcode=us|enablecustomparse=nbc|category=0|subcategory=season|prod=vc,iag|adurlfield=fw:adurl|sid=2500011627|tfid=1362|adcategory=fw:category|adsubcategory=fw:subcategory|displayprefix=Season|displayfieldname=season";
				break;
			default:
				break;
		}
	} else {
		player.plugin3="type=overlay|URL=" + this.ScriptRoot + "pdk/js/plugins/tpRatingsPlugIn.js|priority=4|path=" + this.RatingsPath + "|reminder=20|delay=10";
		player.overrideNativeControls = true;
	}

	if(!NBC.Production){
		player.logLevel= "debug";
	}
	if(this.HTML5){
		player.runtime="HTML5";
	}
	player.bind("tpplayerwidget");
			
	if(channel != "bravo"){
		if (this.IsStandAlone) {
			if(targetFreeWheelDiv.length > 0){
				//targetFreeWheelDiv.append(freeWheelCompanion);
			} else {
				//hs$("#tpplayerwidgetwrap").parent().append(freeWheelCompanion);
			}
		}
	}
	this.AddTask({"type": "lookforplayer", "data": {}});

	NBC.PLAYER_BOUND = true;
	NBC.CheckReady();
}

NBC.BuildEmailCard = function(){
	//------------------------------------------------------
	this.Debug("[BuildEmailCard]");
	var s = "";
	if(this.PlayerSize == "small"){
		s = "small";
	}
	var emailBlocker = hs$('<div class="emailblocker' + s + '" style="height:' + this.CardBlockerHeight + ';"></div>');
	var emailDark = hs$('<div class="emaildark' + s + '"></div>'); emailBlocker.append(emailDark);
	var emailInner = hs$('<div class="emailinner' + s + '"></div>'); emailBlocker.append(emailInner);
	var heading = hs$('<div class="emailheading' + s + '"><span class="emailgenericheading">Email to a friend</span><span class="emailvideotitle"></span></div>'); emailInner.append(heading);

	var table = hs$('<table class="emailtable"></table>'); emailInner.append(table);
	var tbody = hs$('<tbody></tbody>'); table.append(tbody);
	var row1 = hs$('<tr class="emailrow1"></tr>'); tbody.append(row1);
	var fNameLabel = hs$('<td class="emaillabelcell"><label class="emailfriendnamelabel' + s + '">Friend&#39;s Name:</label></td>'); row1.append(fNameLabel);
	var fName = hs$('<td class="emailpr10"><input type="text" class="emailfriendname ' + s + '"/></td>'); row1.append(fName);
	var fEmailLabel = hs$('<td class="emaillabelcell"><label class="emailfriendemaillabel' + s + '">Friend&#39;s Email:</label></td>'); row1.append(fEmailLabel);
	var fEmail = hs$('<td><input type="text" class="emailfriendemail ' + s + '"/></td>'); row1.append(fEmail);

	var row2 = hs$('<tr class="emailrow2"></tr>'); tbody.append(row2);
	var yNameLabel = hs$('<td class="emaillabelcell"><label class="emailyournamelabel' + s + '">Your Name:</label></td>'); row2.append(yNameLabel);
	var yName = hs$('<td class="emailpr10"><input type="text" class="emailyourname ' + s + '"/></td>'); row2.append(yName);
	var yEmailLabel = hs$('<td class="emaillabelcell"><label class="emailyouremaillabel' + s + '">Your Email:</label></td>'); row2.append(yEmailLabel);
	var yEmail = hs$('<td><input type="text" class="emailyouremail ' + s + '"/></td>'); row2.append(yEmail);
	
	var row4 = hs$('<tr class="emailrow4"></tr>'); tbody.append(row4);
	var messageLabel = hs$('<td valign="top"><label class="emailmessagelabel' + s + '">Message:</label></td>'); row4.append(messageLabel);
	var message = hs$('<td colspan="3"><textarea cols="1" rows="1" class="emailmessage ' + s + '"></textarea></td>'); row4.append(message);
	
	var row5 = hs$('<tr class="emailrow5"><td></td></tr>'); tbody.append(row5);
	var row5col = hs$('<td colspan="3"></td>'); row5.append(row5col);
	var submit = hs$('<a href="#" class="emailsubmit' + s + '">Submit</a>'); row5col.append(submit);
	var cancel = hs$('<a href="#" class="emailcancel' + s + '">Cancel</a>'); row5col.append(cancel);

	hs$("#tpplayerwidgetwrap").append(emailBlocker);
	if(this.PlayerSize != "small"){
		submit.click(function(evt){evt.preventDefault();NBC.SendEmail();})
		cancel.click(function(evt){evt.preventDefault();NBC.HideEmailCard();})
	} else {
		submit.click(function(evt){evt.preventDefault();NBC.SendEmail();})
		cancel.click(function(evt){evt.preventDefault();NBC.HideSmallEmailCard();})
	}
}

NBC.ShowEmailCard = function(){
	//------------------------------------------------------
	this.Debug("[ShowEmailCard]");
	tpController.pause(true);
	tpController.showFullScreen(false);
	tpController.dispatchEvent("OnPreventRackHide","emailCard");
	hs$(".emailblocker").fadeIn("slow");
}

NBC.HideEmailCard = function(){
	//------------------------------------------------------
	this.Debug("[HideEmailCard]");
	hs$(".emailblocker").fadeOut("fast",function(){NBC.ClearEmailForm();});
	if(this.SentFromEndCard){
		this.SentFromEndCard = false;
		if(hs$(".endcardgenericheading").html().indexOf("watching") != -1){
			this.ShowShareCard();
		} else {
			this.ShowEndCard();
		}
	} else {
		tpController.dispatchEvent("OnReleaseRackHide","emailCard");
		if(this.HTML5){
			NBC.AddTask({"type":"playerover","data":{"delay":100}, "sender": "Hide Email Card"});
		}
	}
}

NBC.ShowSmallEmailCard = function(){
	//------------------------------------------------------
	this.Debug("[ShowSmallEmailCard]");
	tpController.pause(true);
	tpController.showFullScreen(false);
	hs$(".emailblockersmall").fadeIn("slow");
}

NBC.HideSmallEmailCard = function(){
	//------------------------------------------------------
	this.Debug("[HideSmallEmailCard]");
	hs$(".emailblockersmall").fadeOut("fast",function(){NBC.ClearEmailForm();});
	if(this.SentFromEndCard){
		this.SentFromEndCard = false;
	} else {
		if(this.HTML5){
			NBC.AddTask({"type":"playerover","data":{"delay":100}, "sender": "Hide Small Email Card"});
		}
	}
}

NBC.ClearEmailForm = function(){
	//------------------------------------------------------
	this.Debug("[ClearEmailForm]");
	hs$(".emailfriendname").val("");
	hs$(".emailfriendemail").val("");
	hs$(".emailyourname").val("");
	hs$(".emailyouremail").val("");
	hs$(".emailmessage").val("");
	tpController.dispatchEvent("OnCloseEmailForm",null);
}

NBC.BuildUrlLink = function(){
	//------------------------------------------------------
	this.Debug("[BuildUrlLink]");
	var urlLinkTop = this.PlayerHeight;
	var urlLinkTextLeft = "0px";
	var urlLinkTextTop = "0px";
	var urlWrapperColour = "";
	if(this.HTML5){
		urlLinkTop -= 82;
		//urlLinkTextLeft = "-1px";
		urlLinkTextTop = "-1px";
		urlWrapperColour = "";
	} else {
		urlLinkTop -= 74;
		urlLinkTextLeft = "1px";
		urlLinkTextTop = "3px";
		urlWrapperColour = " background-color:#000;";
	}
	var urlLinkTextWrapperWidth = this.PlayerWidth - 75;
	var urlLinkTextWidth = urlLinkTextWrapperWidth - 6;
	//var urlLink = hs$('<div class="urllink"></div>');
	//var urlLinkDark = hs$('<div class="urllinkdark"></div>'); urlLink.append(urlLinkDark);
	//var urlLinkHeader = hs$('<div class="urllinkheader">&lt; &gt;&nbsp;Embed</div>'); hs$("#tpplayerwidget").append(urlLinkHeader);
	var urlLinkInner = hs$('<div class="urllinkinner" style="top:' + urlLinkTop.toString() + 'px;"></div>'); hs$("#tpplayerwidget").append(urlLinkInner);
	var urlLinkText = hs$('<div class="urllinktextwrapper" style="width:' + urlLinkTextWrapperWidth + 'px;' + urlWrapperColour + '"><input type="text" class="urllinktext" style="width:' + urlLinkTextWidth + 'px; left:' + urlLinkTextLeft + '; top:' + urlLinkTextTop + ';"/></div>'); urlLinkInner.append(urlLinkText);
	//var urlLinkButtons = hs$('<div id="urlcopybuttonwrapper"><div id="urlcopybutton">Copy</div></div><a class="urlclosebutton" href="#">Close</a>'); urlLinkInner.append(urlLinkButtons);
	//hs$("#tpplayerwidget").append(urlLink);
	//hs$(".urlclosebutton").click(function(evt){evt.preventDefault();NBC.HideUrlLink();})
}

NBC.ToggleUrlLink = function(forcedAction){
	//------------------------------------------------------
	this.Debug("[ToggleUrlLink]");
	if(!this.IsEmpty(forcedAction)){
		if(forcedAction == "h"){
			hs$(".urllinkinner").fadeOut("slow");
			tpController.dispatchEvent("OnCloseUrlLink",null);
			tpController.dispatchEvent("OnReleaseRackHide","embedLink");
		} else {
			tpController.showFullScreen(false);
			hs$(".urllinkinner").fadeIn("slow");
			tpController.dispatchEvent("OnPreventRackHide","embedLink");
		}
	} else {
		if(!hs$(".urllinkinner").is(":visible")){
			tpController.showFullScreen(false);
			hs$(".urllinkinner").fadeIn("slow");
			tpController.dispatchEvent("OnPreventRackHide","embedLink");
		} else {
			hs$(".urllinkinner").fadeOut("slow");
			tpController.dispatchEvent("OnCloseUrlLink",null);
			tpController.dispatchEvent("OnReleaseRackHide","embedLink");
		}
	}
}

/*
NBC.HideUrlLink = function(){
	//------------------------------------------------------
	this.Debug("[HideUrlLink]");
	hs$(".urllinkinner").fadeOut("fast");
	tpController.dispatchEvent("OnCloseUrlLink",null);
	tpController.dispatchEvent("onReleaseRackHide","embedLink");
}
*/

NBC.BuildEndCard = function(){
	//------------------------------------------------------
	this.Debug("[BuildEndCard]");
	var endCardBlocker = hs$('<div class="endcardblocker" style="height:' + this.CardBlockerHeight + ';"></div>');
	var endCardDark = hs$('<div class="endcarddark"></div>'); endCardBlocker.append(endCardDark);
	var endCardSheath = hs$('<div class="endcardsheath"></div>'); endCardBlocker.append(endCardSheath);
	var endCardInner = hs$('<div class="endcardinner"></div>'); endCardSheath.append(endCardInner);
	var heading = hs$('<div class="endcardheading"><span class="endcardgenericheading">Replay</span><span class="endcardvideotitle"></span></div>'); endCardInner.append(heading);
	var replay = hs$('<a class="endcardreplay" href="#"></a>'); heading.append(replay);
	var social = hs$('<div class="endcardsocial"><div class="endcardsocialheading">Share this video:</div></div>'); endCardInner.append(social);
	var em = hs$('<a href="#" class="socialem social"></a>'); social.append(em);
	var fb = hs$('<a href="#" class="socialfb social"></a>'); social.append(fb);
	var tw = hs$('<a href="#" class="socialtw social"></a>'); social.append(tw);
	var su = hs$('<a href="#" class="socialsu social"></a>'); social.append(su);
	var tu = hs$('<a href="#" class="socialtu social"></a>'); social.append(tu);
	var dg = hs$('<a href="#" class="socialdg social"></a>'); social.append(dg);
	var rd = hs$('<a href="#" class="socialrd social"></a>'); social.append(rd);
	var p1 = hs$('<a href="#" class="socialp1 social"></a>'); social.append(p1);
	var p2 = hs$('<div class="socialp1wrap"><g:plusone annotation="none" href=""></g:plusone></div>'); social.append(p2);
	var linkTextLabel = ""; if(this.PlayerWidth < 545){linkTextLabel = '<p class="endcardlabel">Direct link:</p>'};
	var linkText = hs$(linkTextLabel + '<div class="endcardlinktextwrap"><div class="endcardlinktextsheath"><input type="text" class="endcardlinktext" value=" ' + window.location.toString() + '" /></div></div>'); endCardInner.append(linkText);
	var separator = hs$('<div class="endcardseparator"></div>'); endCardInner.append(separator);
	var ymalHeading = hs$('<div class="endcardymalheading">You may also like:</div>'); endCardInner.append(ymalHeading);
	var endCardClose = hs$('<div class="endcardclose"></div>'); endCardInner.append(endCardClose);
	var endCardCloseButton = hs$('<a href="#" class="endcardclosebutton"></a>'); endCardClose.append(endCardCloseButton);
	var embedText;
	if(this.PlayerWidth < 545){
		embedText = hs$('<div style="display:none;"><p class="endcardlabel">Embed code:</p><div class="endcardembedtextwrap"><div class="endcardembedtextsheath"><input type="text" class="endcardembedtext" value="" /></div></div></div>');
		endCardInner.append(embedText);
	}

	replay.click(function(evt){evt.preventDefault(); NBC.HideEndCard("RP", "Replay");})

	em.click(function(evt){evt.preventDefault(); NBC.ShareSocial('em');})
	fb.click(function(evt){evt.preventDefault(); NBC.ShareSocial('fb');})
	tw.click(function(evt){evt.preventDefault(); NBC.ShareSocial('tw');})
	su.click(function(evt){evt.preventDefault(); NBC.ShareSocial('su');})
	tu.click(function(evt){evt.preventDefault(); NBC.ShareSocial('tu');})
	dg.click(function(evt){evt.preventDefault(); NBC.ShareSocial('dg');})
	rd.click(function(evt){evt.preventDefault(); NBC.ShareSocial('rd');})
	p1.click(function(evt){evt.preventDefault(); NBC.ShareSocial('p1');})

	endCardCloseButton.click(function(evt){
		evt.preventDefault();
		if(NBC.PlayerSize != "small"){
			NBC.HideEndCard("CLOSE", "End Card Close");
		} else {
			NBC.HideSmallEndCard("CLOSE");
		}
	})

	if(!this.AppearsToBeIE){
    	var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    	po.src = 'https://apis.google.com/js/plusone.js';
    	var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
	}

	hs$("#tpplayerwidgetwrap").append(endCardBlocker);
}

NBC.BuildSmallEndCard = function(){
	//------------------------------------------------------
	this.Debug("[BuildSmallEndCard]");
	var endCardBlocker = hs$('<div class="endcardblockersmall"></div>');
	var endCardDark = hs$('<div class="endcarddarksmall"></div>'); endCardBlocker.append(endCardDark);
	var endCardSheath = hs$('<div class="endcardsheathsmall"></div>'); endCardBlocker.append(endCardSheath);
	var endCardInner = hs$('<div class="endcardinnersmall"></div>'); endCardSheath.append(endCardInner);
	var social = hs$('<div class="endcardsocialsmall"><div class="endcardsocialheadingsmall">Share this video:</div></div>'); endCardInner.append(social);
	var replay = hs$('<a class="endcardreplaysmall" href="#"></a>'); social.append(replay);
	var em = hs$('<a href="#" class="socialemsmall socialsmall"></a>'); social.append(em);
	var fb = hs$('<a href="#" class="socialfbsmall socialsmall"></a>'); social.append(fb);
	var tw = hs$('<a href="#" class="socialtwsmall socialsmall"></a>'); social.append(tw);
	var su = hs$('<a href="#" class="socialsusmall socialsmall"></a>'); social.append(su);
	var tu = hs$('<a href="#" class="socialtusmall socialsmall"></a>'); social.append(tu);
	var dg = hs$('<a href="#" class="socialdgsmall socialsmall"></a>'); social.append(dg);
	var rd = hs$('<a href="#" class="socialrdsmall socialsmall"></a>'); social.append(rd);
	var p1 = hs$('<a href="#" class="socialp1small socialsmall"></a>'); social.append(p1);
	var linkText = hs$('<input type="text" class="endcardlinktextsmall" value="' + window.location.toString() + '" />'); endCardInner.append(linkText);

	replay.click(function(evt){evt.preventDefault(); NBC.HideEndCard("RP", "Small End Card Replay");})

	em.click(function(evt){evt.preventDefault(); NBC.ShareSocial('em');})
	fb.click(function(evt){evt.preventDefault(); NBC.ShareSocial('fb');})
	tw.click(function(evt){evt.preventDefault(); NBC.ShareSocial('tw');})
	su.click(function(evt){evt.preventDefault(); NBC.ShareSocial('su');})
	tu.click(function(evt){evt.preventDefault(); NBC.ShareSocial('tu');})
	dg.click(function(evt){evt.preventDefault(); NBC.ShareSocial('dg');})
	rd.click(function(evt){evt.preventDefault(); NBC.ShareSocial('rd');})
	p1.click(function(evt){evt.preventDefault(); NBC.ShareSocial('p1');})

	hs$("#tpplayerwidgetwrap").append(endCardBlocker);
}

NBC.ShowEndCard = function(){
	//------------------------------------------------------
	this.Debug("[ShowEndCard]");
	if(this.PlayerSize != "small"){
		this.ToggleUrlLink("h");
		tpController.pause(true);
		tpController.showFullScreen(false);
		tpController.dispatchEvent("OnPreventRackHide","endCard");
		hs$(".endcardgenericheading").html("Replay");
		hs$(".endcardreplay").css({'background': 'url("'+this.ScriptRoot+'images/replay.png") no-repeat scroll 0 0 transparent', 'top': '0px'});
		hs$(".endcardreplay").unbind('click');
		hs$(".endcardreplay").click(function(evt){evt.preventDefault(); NBC.HideEndCard("RP", "End Card Replay");})
		if(!this.NowPlaying.pl1$fullEpisode){
			hs$(".endcardymalwrapper").show();
			if(hs$(".endcardymalheading").css("display") != "none"){
				hs$(".endcardymalheading").show();
				if(!m.pl1$disallowSharing){
					hs$(".endcardseparator").show();
				}
			}
		}
		hs$(".endcardblocker").fadeIn("slow");
	} else {
		this.ShowSmallEndCard();
	}
}

NBC.ShowSmallEndCard = function(){
	//------------------------------------------------------
	this.Debug("[ShowEndCard]");
	tpController.pause(true);
	tpController.showFullScreen(false);
	hs$(".endcardgenericheading").html("Replay");
	hs$(".endcardreplaysmall").css({'background': 'url("' + this.ScriptRoot + 'images/replay_small.png") no-repeat scroll 0 0 transparent', 'top': '-6px'});
	hs$(".endcardreplaysmall").unbind('click');
	hs$(".endcardreplaysmall").click(function(evt){evt.preventDefault(); NBC.HideSmallEndCard("RP");})
	hs$(".endcardymalwrappersmall").show();
	hs$(".endcardblockersmall").fadeIn("slow");
}

NBC.HideEndCard = function(r,s){
	//------------------------------------------------------
	this.Debug("[HideEndCard (" + r + ")]");
	tpController.dispatchEvent("OnReleaseRackHide","endCard");
	switch(r){
		case "RP":
			if(!this.HTML5){
			hs$(".endcardblocker").fadeOut("fast",function(){tpController.dispatchEvent("OnReplayRequest",null);});
			} else {
				hs$(".endcardblocker").fadeOut("fast",function(){tpController.clickPlayButton();});
			}
			break;
		case "UP":
			if(!this.HTML5){
				hs$(".endcardblocker").fadeOut("fast",function(){tpController.dispatchEvent("OnCloseShareCard",null);});
			} else {
				hs$(".endcardblocker").fadeOut("fast",function(){tpController.pause(false); hs$('.htmlcontrolsplay').hide(); hs$('.htmlcontrolspause').show();});
			}
			break;
		case "CLOSE":
			hs$(".endcardblocker").fadeOut("fast",function(){});
			break;
		case "SS":
			hs$(".endcardblocker").fadeOut("fast",function(){});
			break;
		case "PRV":
			hs$(".endcardblocker").fadeOut("fast",function(){});
			break;
		default:
			hs$(".endcardblocker").fadeOut("fast",function(){});
			if(this.HTML5){
				//NBC.AddTask({"type":"playerover","data":{"delay":1000}, "sender": "Hide End Card"});
			}
			break;
	}
}

NBC.HideCardsAndShowUrlLink = function(){
	//------------------------------------------------------
	this.Debug("[HideCardsAndShowUrlLink]");
	hs$(".endcardblocker").fadeOut("fast",function(){});
	hs$(".emailblocker").fadeOut("fast",function(){});
	this.ToggleUrlLink(null);
}

NBC.HideCardsAndShowEmailCard = function(){
	//------------------------------------------------------
	this.Debug("[HideCardsAndShowEmailCard]");
	hs$(".endcardblocker").fadeOut("fast",function(){});
	hs$(".urllinkinner").fadeOut("fast",function(){});
	this.SentFromEndCard = false;
	this.ShowEmailCard();
}

NBC.HideCardsAndShowShareCard = function(){
	//------------------------------------------------------
	this.Debug("[HideCardsAndShowShareCard]");
	hs$(".emailblocker").fadeOut("fast",function(){});
	hs$(".urllinkinner").fadeOut("fast",function(){});
	this.SentFromEndCard = false;
	this.ShowShareCard();
}

NBC.HideCards = function(){
	//------------------------------------------------------
	this.Debug("[HideCards]");
	hs$(".emailblocker").fadeOut("fast",function(){});
	hs$(".endcardblocker").fadeOut("fast",function(){});
	this.SentFromEndCard = false;
	if(!hs$(".urllinkinner").is(":visible")){
		tpController.dispatchEvent("OnReleaseRackHide","");
	}
}

NBC.HideSmallEndCard = function(r){
	//------------------------------------------------------
	this.Debug("[HideSmallEndCard (" + r + ")]");
	switch(r){
		case "RP":
			if(!this.HTML5){
			hs$(".endcardblockersmall").fadeOut("fast",function(){tpController.dispatchEvent("OnReplayRequest",null);});
			} else {
				hs$(".endcardblockersmall").fadeOut("fast",function(){tpController.clickPlayButton();});
			}
			break;
		case "UP":
			if(!this.HTML5){
			hs$(".endcardblockersmall").fadeOut("fast",function(){tpController.dispatchEvent("OnCloseShareCard",null);});
			} else {
				hs$(".endcardblockersmall").fadeOut("fast",function(){tpController.pause(false); hs$('.htmlcontrolsplaysmall').hide(); hs$('.htmlcontrolspausesmall').show();});
			}
			break;
		case "CLOSE":
			hs$(".endcardblockersmall").fadeOut("fast",function(){});
			break;
		case "SS":
			hs$(".endcardblockersmall").fadeOut("fast",function(){});
			break;
		case "PRV":
			hs$(".endcardblockersmall").fadeOut("fast",function(){});
			break;
		default:
			hs$(".endcardblockersmall").fadeOut("fast",function(){});
			if(this.HTML5){
				NBC.AddTask({"type":"playerover","data":{"delay":1000}, "sender": "Hide Small End Card"});
			}
			break;
	}
}

NBC.ShowShareCard = function(){
	//------------------------------------------------------
	this.Debug("[ShowShareCard]");
	tpController.pause(true);
	tpController.showFullScreen(false);
	tpController.dispatchEvent("OnPreventRackHide","shareCard");
	hs$(".endcardgenericheading").html("You are watching:");
	hs$(".endcardreplay").css({'background': 'url("'+this.ScriptRoot+'images/play.png") no-repeat scroll 0 0 transparent', 'top': '5px'});
	hs$(".endcardreplay").unbind('click');
	hs$(".endcardreplay").click(function(evt){evt.preventDefault(); NBC.HideEndCard("UP","Show Share Card");})
	hs$(".endcardymalheading").hide();
	hs$(".endcardymalwrapper").hide();
	hs$(".endcardseparator").hide();
	hs$(".endcardblocker").fadeIn("slow");
}

NBC.ShowSmallShareCard = function(){
	//------------------------------------------------------
	this.Debug("[ShowSmallShareCard]");
	tpController.pause(true);
	tpController.showFullScreen(false);
	hs$(".endcardreplaysmall").css({'background': 'url("'+this.ScriptRoot+'images/play_small.png") no-repeat scroll 0 0 transparent', 'top': '1px'});
	hs$(".endcardreplaysmall").unbind('click');
	hs$(".endcardreplaysmall").click(function(evt){evt.preventDefault(); NBC.HideSmallEndCard("UP");})
	hs$(".endcardblockersmall").fadeIn("slow");
}

NBC.ShareSocial = function(sm){
	//------------------------------------------------------
	this.Debug("[ShareSocial]");
	switch(sm){
		case "em":
			this.SentFromEndCard = true;
			if(this.PlayerSize != "small"){
				this.HideEndCard("SS", "Share Social");
				this.ShowEmailCard();
			} else {
				this.HideSmallEndCard("SS");
				this.ShowSmallEmailCard();
			}
			break;
		case "fb":
			window.open ("https://www.facebook.com/sharer/sharer.php?u=" + this.ShareLink + "&t=" + encodeURIComponent(this.NowPlaying.title),"sharefacebook");
			break;
		case "tw":
			window.open ("https://twitter.com/intent/tweet?text=" + encodeURIComponent(this.NowPlaying.title) + encodeURIComponent(" -- ") + encodeURIComponent(this.ShareLink),"sharetwitter");
			break;
		case "su":
			window.open ("http://www.stumbleupon.com/submit?url=" + this.ShareLink + "&title=" + encodeURIComponent(this.NowPlaying.title),"sharestumble");
			break;
		case "tu":
			//http://www.tumblr.com/share/link?url=http%3A%2F%2Fwww.tumblr.com%2Fexamples%2Fshare%2Fsharing-links-to-articles.html&name=Sharing%20links%20to%20articles&description=This%20example%20uses%20an%20advanced%20Tumblr%20Button%20in%20the%20article's%20footer%20to%20let%20Tumblr%20users%20easily%20share%20a%20beautifully%20formatted%20link%20to%20this%20article%20on%20their%20blogs.
			var tumblrLink = this.ShareLink.replace(this.BaseURL,"");
			window.open ("http://www.tumblr.com/share/link?url=" + tumblrLink + "&name=" + encodeURIComponent(this.NowPlaying.title) + "&description=" + encodeURIComponent(this.NowPlaying.description),"sharetumblr");
			break;
		case "dg":
			window.open ("http://digg.com/submit?phase=2&url=" + this.ShareLink + "&title=" + encodeURIComponent(this.NowPlaying.title),"sharedigg");
			break;
		case "rd":
			window.open ("http://reddit.com/submit?url=" + this.ShareLink + "&title=" + encodeURIComponent(this.NowPlaying.title),"sharereddit");
			break;
		case "p1":
			break;
		default:
			break;
	}
}

NBC.GetYouMayAlsoLike = function(){
	//------------------------------------------------------
	this.Debug("[GetYouMayAlsoLike]");
	var feedAnnex = "&startIndex=1&endIndex=12";
	if (this.IsStandAlone) {
		if(this.HTML5){
			feedAnnex += "&byContent=byAssetTypes%3DHTML5+Video%26byFormat%3DMPEG4";
		}
	}
	if(this.NowPlaying.pl1$fullEpisode){
		feedAnnex += "&byCustomValue={fullEpisode}{true}";
	} else {
		feedAnnex += "&byCustomValue={fullEpisode}{false}";
	}
	if(!this.AppearsToBeIE){
		hs$.ajax({
			url: NBC.Feed + feedAnnex, // TO-DO: define fields
			dataType: 'json',
			success: function(data){NBC.ParseYouMayAlsoLike(data)}
		});
	} else {
		var yReq = new JSONRequest(NBC.Feed + feedAnnex, "NBC.ParseYouMayAlsoLike");
		yReq.send();
	}
}

NBC.ParseYouMayAlsoLike = function(data){
	//------------------------------------------------------
	this.Debug("[ParseYouMayAlsoLike]");
	var ymal;
	if(this.PlayerSize != "small"){
		var wo = this.PlayerWidth - 60;
		var wi = this.PlayerWidth - 140;
		switch(this.PlayerSize){
			case "videoHub":
				wi -=35;
				break;
			case "_545x307":
				wi -=65;
				break;
			case "_525x296":
				wi -=54;
				break;
			case "_500x281":
				wi -=20;
				break;
			case "_400x225":
				wi -=101;
				break;
			default:
				break;
		}
		ymal = hs$('<div class="endcardymalwrapper" style="width:' + wo + 'px;"><div class="endcardymalitems" style="width:' + wi + 'px;"><div class="endcardymalitemsinner"></div></div></div>'); hs$('.endcardinner').append(ymal);
	} else {
		ymal = hs$('<div class="endcardymalwrappersmall"><div class="endcardymalitemssmall"><div class="endcardymalitemsinnersmall"></div></div></div>'); hs$('.endcardinnersmall').append(ymal);
	}
	if(!this.IsEmpty(data.entries)){
		this.YMAL = data.entries;
		if(data.entries.length > 0){
			hs$(".endcardymalitemsinner").empty();
			for(var i = 0; i < 8; i++){
				if(!this.IsEmpty(this.YMAL[i])){
					var release;
					if(this.PlayerSize != "small"){
						var rh = '';
						rh += '<div class="ymalitemwrap">';
						rh += '<a class="ymalitem" href="#" id="ymal-' + this.YMAL[i].guid + '" guid="' + this.YMAL[i].guid + '">';
						rh += '<span class="ymalplay"></span><img class="ymalthumb" src="' + this.GetDefaultThumbnail(this.YMAL[i]) + '" alt="" border="0" />';
						rh += '</a>';
						rh += '<a class="ymaltitle" href="#" guid="' + this.YMAL[i].guid + '">' + this.YMAL[i].title + '</a>';
						rh += '</div>'
						release = hs$(rh);
						hs$(".endcardymalitemsinner").append(release);
					} else {
						var rh = '';
						rh += '<div class="ymalitemwrap" title="' + this.YMAL[i].title + '">';
						rh += '<a class="ymalitem" href="#" id="ymal-' + this.YMAL[i].guid + '" guid="' + this.YMAL[i].guid + '">';
						rh += '<span class="ymalplay"></span>';
						rh += '<img class="ymalthumb" src="' + this.GetDefaultThumbnail(this.YMAL[i]) + '" alt="" border="0" />';
						rh += '</a>';
						rh += '</div>';
						rh += '';
						release = hs$(rh);
						hs$(".endcardymalitemsinnersmall").append(release);
					}
				}
			}
		}
	}

	if(this.PlayerSize != "small"){
		var l = this.PlayerWidth - 76;
		hs$('.endcardymalwrapper').append('<a class="ymalleft" href="#"></a>');
		hs$('.endcardymalwrapper').append('<a class="ymalright" style="left:' + l + 'px;" href="#"></a>');
		hs$(".ymalleft").click(function(evt){evt.preventDefault(); NBC.YMALleft();});
		hs$(".ymalright").click(function(evt){evt.preventDefault(); NBC.YMALright();});
	} else {
		hs$('.endcardymalwrappersmall').append('<div class="ymaltitlesmall">' + this.YMAL[1].title + '</div>');
		hs$('.endcardymalwrappersmall').append('<a class="ymalleftsmall" href="#"></a>');
		hs$('.endcardymalwrappersmall').append('<a class="ymalrightsmall" href="#"></a>');
		hs$(".ymalleftsmall").click(function(evt){evt.preventDefault(); NBC.YMALleft();});
		hs$(".ymalrightsmall").click(function(evt){evt.preventDefault(); NBC.YMALright();});
	}
	
	hs$(".ymalitem").click(function(evt){evt.preventDefault();NBC.PlayRelatedVideo(hs$(this))});
	hs$(".ymaltitle").click(function(evt){evt.preventDefault();NBC.PlayRelatedVideo(hs$(this))});
}

NBC.YMALleft = function(){
	//------------------------------------------------------
	this.Debug("[YMALleft]");
	hs$(".ymalleft").unbind("click");
	hs$(".ymalleft").click(function(evt){evt.preventDefault()});
	
	var target;
	if(this.PlayerSize != "small"){
		//hs$('.endcardlinktext').focus();
		target = hs$(".endcardymalitemsinner");
	} else {
		hs$('.endcardlinktextsmall').focus();
		target = hs$(".endcardymalitemsinnersmall");
	}
	target.animate({"left": "+=173", "duration": 1000}, function(){
		var detached = hs$(".ymalitemwrap").eq(hs$(".ymalitemwrap").length-1).detach();
		target.prepend(detached);
		if(NBC.PlayerSize == "small"){
			hs$('.ymaltitlesmall').html(hs$('.ymalitemwrap').eq(1).attr("title"));
		}
		target.css("left","-173px");
		hs$(".ymalleft").click(function(evt){evt.preventDefault(); NBC.YMALleft();});
	})
}

NBC.YMALright = function(){
	//------------------------------------------------------
	this.Debug("[YMALright]");
	hs$(".ymalright").unbind("click");
	hs$(".ymalright").click(function(evt){evt.preventDefault()});
	//hs$('.endcardlinktext').focus();
	var target;
	if(this.PlayerSize != "small"){
		//hs$('.endcardlinktext').focus();
		target = hs$(".endcardymalitemsinner");
	} else {
		hs$('.endcardlinktextsmall').focus();
		target = hs$(".endcardymalitemsinnersmall");
	}
	target.animate({"left": "-=173", "duration": 1000}, function(){
		var detached = hs$(".ymalitemwrap").eq(0).detach();
		target.append(detached);
		if(NBC.PlayerSize == "small"){
			hs$('.ymaltitlesmall').html(hs$('.ymalitemwrap').eq(1).attr("title"));
		}
		target.css("left","-173px");
		hs$(".ymalright").click(function(evt){evt.preventDefault(); NBC.YMALright();});
	})
}

NBC.PlayRelatedVideo = function(sender){
	//------------------------------------------------------
	this.Debug("[PlayRelatedVideo]");
	for(var i = 0; i < this.YMAL.length; i++){
		if(this.YMAL[i].guid == sender.attr("guid")){
			this.NowPlaying = this.YMAL[i];
			break;
		}
	}
	if(this.PlayerSize != "small"){
		this.HideEndCard("PRV", "Play related video");
	} else {
		this.HideSmallEndCard("PRV");
	}
	NBC.ActivateMedia(true);
}
NBC.GetDefaultThumbnail = function(m,a){
	//------------------------------------------------------
	var url;
	if(m.media$thumbnails.length == 1){
		url = m.media$thumbnails[0].plfile$url;
	} else {
		for(var i = 0; i < m.media$thumbnails.length; i++){
			if(m.media$thumbnails[i].plfile$contentType == "image" && m.media$thumbnails[i].plfile$isDefault){
				url = m.media$thumbnails[i].plfile$url;
			}
		}
	}
	if(this.IsEmpty(url)){
		for(var i = 0; i < m.media$thumbnails.length; i++){
			if(m.media$thumbnails[i].plfile$contentType == "image"){
				url = m.media$thumbnails[i].plfile$url;
			}
		}
	}
	if(this.IsEmpty(url)){
		this.Debug("Warning: could not find thumbnail for this video: " + m.title)
		url = "images/this-is-a-missing-image.png";
	}
	return url;
}

NBC.GetDefaultVideoObject = function(m,f){
	//------------------------------------------------------
	this.Debug("[GetDefaultVideoObject (f:" + f + ")]", true);
	var result;
	var acceptableFormats = ["FLV","MPEG4"];
	var selectedVideo = {"br": 0};
	if(this.HTML5){
		acceptableFormats = ["MPEG4"];
	}
	if(m.media$content.length == 1){
		this.Debug("Only one video object available, so will play that");
		if(f){
			selectedVideo.v = m.media$content[0];
			selectedVideo.f = m.media$content[0];
		} else {
			selectedVideo.v = m.media$content[0].plfile$url;
			selectedVideo.f = m.media$content[0];
		}
	} else {
		for(var i = 0; i < m.media$content.length; i++){
			if(m.media$content[i].plfile$contentType == "video" && m.media$content[i].plfile$isDefault){
				this.Debug("We have a default video");
				var formatApproved = this.ApproveFormat(m.media$content[i].plfile$format, acceptableFormats);
				if(formatApproved){
					if(f){
						selectedVideo.v = m.media$content[i];
						selectedVideo.f = m.media$content[i];
					} else {
						selectedVideo.v = m.media$content[i].plfile$url;
						selectedVideo.f = m.media$content[i];
					}
				}
			}
		}
	}
	if(this.IsEmpty(selectedVideo.v)){
		/*
		if(!f){
			this.Debug("We didn't find a default video, so we're going to select the MIDDLE bitrate one ");
		}
		*/
		var candidates = [];
		var middleIndex = 0;
		for(var i = 0; i < m.media$content.length; i++){
			candidates = this.PushToArrayBasedOnBitrate(candidates, m.media$content[i], acceptableFormats);
		}
		var cdb = "";
		for(var i = 0; i < candidates.length; i++){
			try{
				cdb += candidates[i].plfile$bitrate + " (" + candidates[i].plfile$format + ")\n";
			} catch(e) {
				this.Debug("Warning: we have a candidate problem");
			}
		}
		//alert(cdb);
		if(candidates.length > 1){
			middleIndex = Math.ceil((candidates.length - 1) / 2);
		} else {
			middleIndex = 0;
		}
		for(var i = 0; i < m.media$content.length; i++){
			if(m.media$content[i].plfile$contentType == "video"){
				if(f){
					// We want the full object
					selectedVideo.v = candidates[middleIndex];
					selectedVideo.f = candidates[middleIndex];
				} else {
					// We only want the URL
					try{
						selectedVideo.v = candidates[middleIndex].plfile$url;
					} catch(e) {
						this.Debug("Warning: we have a candidate problem");
					}
					selectedVideo.f = candidates[middleIndex];
				}
			}
		}
	}
	result = selectedVideo.v;
//	this.Debug("We've selected a video that has a format of  " + selectedVideo.f.plfile$format + " and a bitrate of " + selectedVideo.br);
//	for(var j in selectedVideo.f){
//		this.Debug(" . . . " + j + ":" + selectedVideo.f[j]);
//	}
	if(this.IsEmpty(result)){
		this.Debug("Warning: could not find a result for this video: " + m.title)
	}
	return result;
}

NBC.PushToArrayBasedOnBitrate = function(arr,obj,f){
	//------------------------------------------------------
	var formatApproved = this.ApproveFormat(obj.plfile$format, f);
	if(formatApproved){
		var added = false;
		if(arr.length == 0){
			arr.push(obj);
			added = true;
		} else {
			for(var i = 0; i < arr.length; i++){
				if(arr[i].plfile$bitrate < obj.plfile$bitrate){
					arr.splice(i,0,obj);
					added = true;
					break;
				}
			}
		}
		if(!added){
			arr.push(obj);
		}
	}
	return arr;
}

NBC.ApproveFormat = function(m,f){
	//------------------------------------------------------
	var approved = false;
	for(var i = 0; i < f.length; i++){
		if(m == f[i]){
			approved = true;
		}
	}
	return approved;
}

NBC.CalculatePercentage = function(s,l){
	//------------------------------------------------------
	return Math.round((s / l) * 100);
}

NBC.SetUpPlayerEventListeners = function(){
	//------------------------------------------------------
	this.Debug("[SetUpPlayerEventListeners]");
	this.Debug("NowPlaying object is: " + NBC.NowPlaying);
	tpController.addEventListener("OnMediaEnd", NBC.OnMediaEnd);
	tpController.addEventListener("OnMediaPlaying", NBC.OnMediaPlaying);
	tpController.addEventListener("OnReleaseStart", NBC.OnReleaseStart);
	tpController.addEventListener("OnReleaseEnd", NBC.OnReleaseEnd);
	tpController.addEventListener("OnMediaLoadStart", NBC.OnMediaLoadStart);
	hs$("#tpcontrolrack").mouseenter(function(evt){NBC.OnRackRollOver();});
	hs$("#tpcontrolrack").mouseleave(function(evt){NBC.OnRackRollOut();});
	hs$("#tpcontrolrack").click(function(evt){evt.preventDefault();});
	hs$("#tpcontrolplay").click(function(evt){evt.preventDefault();NBC.OnPlayButtonClick();});
	hs$("#playercover").click(function(evt){evt.preventDefault(); NBC.OnMediaClick(evt);});
}

NBC.OnMediaLoadStart = function(evt){
	//------------------------------------------------------
	NBC.Debug("[OnMediaLoadStart (" + evt.data.chapter + ")]");
	NBC.CurrentChapter = evt.data.chapter;
	if(NBC.HTML5){
		NBC.AddTask({"type":"cancel", "data": "playerout", "sender": "OnMediaLoadStart"});
		NBC.AddTask({"type":"cancel", "data": "showbaseplate", "sender": "OnMediaLoadStart"});
	}
	//NBC.AddTask({"type":"cancel", "data": "showendcard", "sender": "OnMediaLoadStart"});
	//NBC.AddTask({"type":"cancel", "data": "performflashcompletiontasks", "sender": "OnMediaLoadStart"});
}

NBC.OnReleaseStart = function(evt){
	//------------------------------------------------------
	NBC.Debug("[OnReleaseStart]");
	NBC.ReleaseEnded = false;
	NBC.AddTask({"type":"cancel", "data": "showendcard", "sender": "OnReleaseStart"});
	if(NBC.HTML5){
		NBC.AddTask({"type":"hidebaseplate", "data":{"delay": 500}});
	}

	try {
		setPageOmniture();
	} catch(e) {
		
	}
	tpController.clearPlayerMessage();
	hs$(".endcardblocker").css("height",NBC.CardBlockerHeight);
	hs$(".emailblocker").css("height",NBC.CardBlockerHeight);
	hs$("#playercover").remove();
}

NBC.OnReleaseEnd = function(evt){
	//------------------------------------------------------
	NBC.Debug("[OnReleaseEnd]");
	NBC.ReleaseEnded = true;
	if(NBC.HTML5){
		
	}
	NBC.AddTask({"type":"performflashcompletiontasks", "data": {"delay":1000}, "sender": "OnReleaseEnd"});
	NBC.AddTask({"type":"showendcard", "data": {"delay":1000}, "sender": "OnReleaseEnd"});
	hs$(".endcardblocker").css("height","100%");
	hs$(".emailblocker").css("height","100%");
}

NBC.OnMediaEnd = function(evt){
	//------------------------------------------------------
	NBC.Debug("[OnMediaEnd]");
	if(NBC.HTML5){
		NBC.AddTask({"type":"cancel", "data":"playerover", "sender": "OnMediaEnd"});
		NBC.AddTask({"type":"cancel", "data":"hidebaseplate", "sender": "OnMediaEnd"});
		NBC.AddTask({"type":"playerout", "data":{"delay":700}});
		NBC.AddTask({"type":"showbaseplate", "data":{"delay":700}});
		NBC.AddTask({"type":"showendcard", "data":{"delay":700}});
	}
	if(NBC.ReleaseEnded) {
		NBC.AddTask({"type":"showendcard", "data": {"delay":1000}, "sender": "OnMediaEnd"});
	}
}

NBC.OnMediaPlaying = function(evt){
	//------------------------------------------------------
	var pc  = Math.round((evt.data.currentTime / evt.data.duration) * 100);
	hs$("#counter").val(pc + "% through");
	//hs$('.htmldebug').html("PW:" + NBC.PlayerWidth + "; PB:" + NBC.ProgressBuffer + "; PC:" + pc);

	hs$(".htmlcontrolsprogresswatched" + NBC.Html5ClassAnnex).width(Math.round((NBC.PlayerWidth - (NBC.ProgressBuffer * 2)) * (pc / 100)) + NBC.ProgressBuffer + "px");
	if(NBC.HTML5){
		//if(!NBC.ProgressScrubberDragging){
			var newScrubberPos = hs$(".htmlcontrolsprogresswatched" + NBC.Html5ClassAnnex).width() + hs$(".htmlcontrolsprogressscrubber" + NBC.Html5ClassAnnex).parent().position().left;
			hs$(".htmlcontrolsprogressscrubber" + NBC.Html5ClassAnnex).css("left", Number(newScrubberPos - Math.floor(NBC.ProgressBuffer / 2)) + "px");
		//}
		hs$(".htmlcontrolsprogresswatchedmini").width(Math.round((NBC.PlayerWidth - (NBC.ProgressBuffer * 2)) * (pc / 100)) + NBC.ProgressBuffer + "px");
		newScrubberPos = hs$(".htmlcontrolsprogresswatchedmini").width() + hs$(".htmlcontrolsprogressscrubbermini").parent().position().left;
		hs$(".htmlcontrolsprogressscrubbermini").css("left", Number(newScrubberPos - Math.floor(hs$(".htmlcontrolsprogressscrubbermini").width()/2)) + "px");
		//NBC.Debug(newScrubberPos);
	}
	
	var ftc = NBC.FriendlyTime(evt.data.currentTime, true);
	var ftt = NBC.FriendlyTime(evt.data.duration, true);
	var elapsed = NBC.PadZero(ftc.h, false, true) + NBC.PadZero(ftc.m, true, true) + NBC.PadZero(ftc.s, true, false);
	var total = NBC.PadZero(ftt.h, false, true) + NBC.PadZero(ftt.m, true, true) + NBC.PadZero(ftt.s, true, false)
	var goodToShow = true;
	if(isNaN(evt.data.currentTime)){
		goodToShow = false;
	}
	if(isNaN(evt.data.duration)){
		goodToShow = false;
	}
	if(goodToShow){
		hs$(".htmlcontrolselapsed" + NBC.Html5ClassAnnex).html(elapsed);
		hs$(".htmlcontrolstotal" + NBC.Html5ClassAnnex).html(total);
	} else {
		hs$(".htmlcontrolselapsed" + NBC.Html5ClassAnnex).html('-- --');
		hs$(".htmlcontrolstotal" + NBC.Html5ClassAnnex).html('-- --');
	}
}

NBC.OnMediaClick = function(evt){
	//------------------------------------------------------
	this.Debug("[OnMediaClick]");
	tpController.clickPlayButton();
}

NBC.ControlRackRequestsNowPlaying = function(){
	//------------------------------------------------------
	this.Debug("[ControlRackRequestsNowPlaying]");
	tpController.dispatchEvent("OnReceiveNowPlaying", this.NowPlaying);
}

NBC.FriendlyTime = function(t,ms){
	//------------------------------------------------------
	//this.Debug("MS:" + t);
	if(ms){
		var hours = t / (1000*60*60);
		var minutes = (t % (1000*60*60)) / (1000*60);
		var seconds = ((t % (1000*60*60)) % (1000*60)) / 1000;
		return {"h": Math.floor(hours), "m": Math.floor(minutes), "s": Math.floor(seconds)}
	} else {
		var d = new Date(t*1000)
		var hours = d.getUTCHours();
		var minutes = d.getUTCMinutes();
		var seconds = d.getUTCSeconds();
		return {"h": Math.floor(hours), "m": Math.floor(minutes), "s": Math.floor(seconds)}
	}
}

NBC.PadZero = function(n,returnNothing,trailingColon){
	//------------------------------------------------------
	var s = n.toString();
	if(s.length == 1){
		s = "0" + s;
	}
	if(Number(s) == 0){
		if(!returnNothing){
			s = "";
		}
	}
	if((s != "") && trailingColon){
		s += ":";
	}
	return s;
}

NBC.ProcessQueryString = function(){
	//------------------------------------------------------
	this.Debug("[ProcessQueryString]");
	this.RawU = document.location.toString().substring(document.location.toString().indexOf("/videos/") + 8, document.location.toString().length);
	this.RawS = document.location.search.replace("?","");
	this.Sparams = this.RawS.split("&");
	this.Uparams = this.RawU.split("/");
	for(var i = 0; i < this.Sparams.length; i++){
		var qsPieces = this.Sparams[i].split("=");
		if(qsPieces.length == 2){
			switch(qsPieces[0]){
				case "nofw":
					this.NoFreeWheel = qsPieces[1];
					break;
				case "autoplay":
					if(qsPieces[1].toString() == "true"){
						this.StandaloneAutoPlay = true;
					}
					break;
				default:
					break;
			}
		}
	}
	try{
	if(!this.IsEmpty(_vid)){
		this.Inbound.VID = _vid.toString();
	}
	} catch (e){}
	try{
		if(!this.IsEmpty(_vcms)){
			this.Inbound.VID = _vcms.toString();
		}
	} catch (e){}
	if(this.IsEmpty(this.Inbound.VID)){
		try{
		if(!this.IsEmpty(_vtitle)){
			this.Inbound.VID = _vtitle;
		}
		} catch(e){}
	}
	
	if(this.IsEmpty(this.Inbound.VID)){
		if(this.IsStandalone){
			this.Debug("Warning: No initialization video has been specified");
		}
	} else {
		this.Debug("Our initialization video is: " + this.Inbound.VID);
	}
}

NBC.QueueContains = function(str){
	//------------------------------------------------------
	var contains = false;
	for(var i = 0; i < this.Queue.length; i++){
		if(this.Queue[i].type == str){
			contains = true;
			break;
		}
	}
	return contains;
}

if(navigator.userAgent.toString().indexOf("MSIE") != -1){
	NBC.AppearsToBeIE = true;
}

NBC.SetPlayerMessage = function(str){
	//------------------------------------------------------
	this.Debug("[SetPlayerMessage]");
	var m;
	if(hs$('.playermessage').length == 0){
		m = hs$('<div class="playermessage"><div class="playermessageinner"></div></div>');
		hs$('#tpplayerwidgetwrap').append(m);
	} else {
		m = hs$('.playermessage').eq(0);
	}
	m.css("width", this.PlayerWidth + "px");
	m.css("height", this.PlayerHeight + "px");
	hs$('.playermessageinner').html(str);
	hs$('.playermessageinner').css("top", Math.floor(this.PlayerHeight / 2) + "px");
	hs$('.playermessageinner').css("width", this.PlayerWidth + "px");
}

NBC.UserIdle = function(){
	//------------------------------------------------------
	this.Debug("[UserIdle]");
	if(hs$('.htmlcontrols' + this.Html5ClassAnnex).attr('rel') == "visible"){
		this.AddTask({"type": "playerout", "data":{"annex": "byinactivity"}});
}
}

NBC.UserActive = function(){
	//------------------------------------------------------
	this.Debug("[UserActive]");
	if(hs$('.htmlcontrols' + this.Html5ClassAnnex).attr('rel') == "hiddenbyinactivity"){
		this.AddTask({"type": "playerover", "data":{}, "sender": "User Active"});
}
}
NBC.LuceneSpaces = function(str){
	//------------------------------------------------------
	str = str.replace(/\s/g,"\\+").replace(/\&/, '%26');
	return str;
}

NBC.BuildPlaylist = function(){
	//------------------------------------------------------
	this.Debug("[BuildPlaylist (" + this.PlaylistStartIndex + " to " + this.PlaylistEndIndex + ")]");
	//if(!this.IsEmpty(this.PlaylistStartId)){
		if(!this.IsEmpty(this.PlaylistFeed)){
			if(!this.AppearsToBeIE){
				hs$.ajax({
					url: NBC.PlaylistFeed,
					dataType: 'json',
					success: function(data){NBC.ParsePlaylist(data)}
				});
			} else {
				var plReq = new JSONRequest(NBC.PlaylistFeed, "NBC.ParsePlaylist");
				plReq.send();
			}
		} else {
			this.DebugWarn("WARNING: a call to BuildPlaylist was made, but no playlist feed is defined");
		}
//	} else {
//		this.DebugWarn("WARNING: a call to BuildPlaylist was made, but no playlist start ID is defined");
//	}
}

NBC.DeterminePlaylistIndex = function(){
	//------------------------------------------------------
	this.Debug("[DeterminePlaylistIndex]");
	if(this.IsEmpty(this.PlaylistStartId)){
		this.Debug("No playlist start ID");
		this.StartVideoInFeed = true;
		this.PlaylistIndex = 0;
	} else {
		for(var i = 0; i < this.Playlist.length; i++){
			if(this.PlaylistBasedOnGuid){
				if(this.Playlist[i].guid == this.PlaylistStartId){
					this.PlaylistIndex = i;
					this.StartVideoInFeed = true;
					this.Debug("The playlist index is:" + this.PlaylistIndex);
				}
			} else {
				if(this.Playlist[i].pl1$directLinkIdentifier == this.PlaylistStartId){
					this.PlaylistIndex = i;
					this.StartVideoInFeed = true;
				}
			}
		}
	}
}

NBC.ParsePlaylist = function(data){
	//------------------------------------------------------
	this.Debug("[ParsePlaylist (" + this.PlaylistStartIndex + " to " + this.PlaylistEndIndex + " of " + data.totalResults + ")]");
	var playlistGood = true;
	if(this.PlaylistTraversals == 0){
		if(!this.IsEmpty(data.entries)){
			if(data.entries.length == 0){
				this.DebugWarn("WARNING: Your playlist is empty");
				playlistGood = false;
			}
		} else {
			this.DebugWarn("WARNING: There is a problem with your playlist");
			this.DebugWarn(data);
			playlistGood = false;
		}
	}
	if(playlistGood){
		this.PlaylistTraversals++;
		this.PlaylistTotalSize = data.totalResults;
		for(var i = 0; i < data.entries.length; i++){
			this.Playlist.push(data.entries[i]);
			if(this.StartVideoInFeed){
				this.Debug("Added " + data.entries[i].title);	
			}
		}
		
		if(!this.PlaylistFull){
			if(this.Playlist.length >= this.PlaylistTotalSize){
				this.PlaylistFull = true;
			} else {
				if(this.Playlist.length >= 3000){
					this.PlaylistFull = true;
				} else {
					this.PlaylistFull = false;
				}
			}
		}
		
		this.DeterminePlaylistIndex();
		
		if(!this.PlaylistFull){
			this.Debug("Playlist not full");
			if(this.StartVideoInFeed){
				this.Debug("*** PLAYLIST: We've found the video at position " + this.PlaylistIndex + " * * *");
				//this.Playlist = [];
				this.PlaylistStartIndex = this.PlaylistEndIndex + 1;
				this.PlaylistEndIndex = this.PlaylistStartIndex + 50;
				this.PlaylistFull = true;
				this.PlaylistIndex = 0;
			} else {
				this.Debug("*** PLAYLIST: We've not found the video");
				this.PlaylistStartIndex = this.PlaylistEndIndex + 1;
				this.PlaylistEndIndex += this.PlaylistPageSize;
			}
			if(this.StartVideoInFeed){
				this.PlaylistFeed = this.PlaylistFeedRaw.replace("form=json", "form=json&count=true&fields=" + this.PlaylistFields + "&startIndex=" + this.PlaylistStartIndex + "&endIndex=" + this.PlaylistEndIndex);
			} else {
				this.PlaylistFeed = this.PlaylistFeedRaw.replace("form=json", "form=json&count=true&fields=guid,:directLinkIdentifier,:disallowSharing&startIndex=" + this.PlaylistStartIndex + "&endIndex=" + this.PlaylistEndIndex);
			}
			if(this.PlaylistFull){
				this.Debug("*** FINAL PLAYLIST CALL (" + this.PlaylistStartIndex + " / " + this.PlaylistEndIndex + "):" + this.PlaylistFeed);
			} else {
				this.Debug(this.PlaylistFeed);
			}
			this.BuildPlaylist();
		} else {
			if(!this.StartVideoInFeed){
				// Could not find the video in the entire feed; play the first one
				this.Debug("Playlist has given up");
				this.StartVideoInFeed = true;
				this.PlaylistIndex = 0;
			} else {
				if(!this.PlaylistFinalized){
					this.Debug("*** PLAYLIST: We've (quickly) found the video at position " + this.PlaylistIndex + " * * *");
					//this.Playlist = [];
					this.PlaylistStartIndex = this.PlaylistEndIndex + 1;
					this.PlaylistEndIndex = this.PlaylistStartIndex + 50;
					this.PlaylistFull = true;
					this.PlaylistIndex = 0;
					this.PlaylistFeed = this.PlaylistFeedRaw.replace("form=json", "form=json&count=true&fields=" + this.PlaylistFields + "&startIndex=" + this.PlaylistStartIndex + "&endIndex=" + this.PlaylistEndIndex);
					this.Debug("*** FINAL (QUICK) PLAYLIST CALL (" + this.PlaylistStartIndex + " / " + this.PlaylistEndIndex + "):" + this.PlaylistFeed);
					this.PlaylistFinalized = true;
					this.BuildPlaylist();
				}
				else {
					this.NowPlaying = this.Playlist[this.PlaylistIndex];
					this.ActivateMedia(true);
				}
			}
		}
	} else {
		this.DebugWarn("We have stopped processing the playlist because there is something wrong with it.");
	}
}

NBC.AdvancePlaylistPosition = function(){
	//------------------------------------------------------
	this.Debug("[AdvancePlaylistPosition (from " + this.PlaylistIndex + " to " + Number(this.PlaylistIndex + 1) + ")]");
	this.PlaylistIndex++;
	if(this.IsEmpty(this.Playlist[this.PlaylistIndex])){
		this.Debug("Had to reset playlist because we ran out of videos (our playlist is " + this.Playlist.length + " long and we were looking at index " + this.PlaylistIndex + ")");
		this.PlaylistIndex = 0;
	}
}

NBC.HighlightWidgetIfExists = function(){
	//------------------------------------------------------
	this.Debug("[HighlightWidgetIfExists]");
	if(!this.IsEmpty(this.PlaylistWidget)){
       this.PlaylistWidget.highlightThumbnail(this.NowPlaying.guid);
	}
}

NBC.SendEmail = function(){
	//------------------------------------------------------
	this.Debug("[SendEmail]");
	var greenLight = true;
	var emailErrorMessage = "";
	
	if(greenLight){
		if(this.IsEmpty(hs$('.emailfriendname').val())){
			greenLight = false;
			emailErrorMessage = "Sorry, you must provide your friend's name.";
		}
	}
	
	if(greenLight){
		if(!this.IsValidEmail(hs$('.emailfriendemail').val())){
			greenLight = false;
			emailErrorMessage = "Sorry, your friend's email address doesn't appear to be correct.";
		}
	}
	
	if(greenLight){
		if(this.IsEmpty(hs$('.emailyourname').val())){
			greenLight = false;
			emailErrorMessage = "Sorry, you must provide your name.";
		}
	}
	
	if(greenLight){
		if(!this.IsValidEmail(hs$('.emailyouremail').val())){
			greenLight = false;
			emailErrorMessage = "Sorry, your email address doesn't appear to be correct.";
		}
	}
	
	if(greenLight){
		hs$.ajax({
			type: "POST",
			dataType: 'json',
			url: NBC.ScriptRoot + 'email/email.php',
			data: 	'friendsName=' + hs$('.emailfriendname').val() + 
					'&friendsEmail=' + hs$('.emailfriendemail').val() + 
					'&yourName=' + hs$('.emailyourname').val() + 
					'&yourEmail=' + hs$('.emailyouremail').val() + 
					'&message=' + hs$('.emailmessage').val() + 
					'&link=' + this.ShareURL + this.NowPlaying.guid,
			success: function (response) {
				if(response.success.toString() == '1'){
					if(NBC.PlayerSize != "small"){
						NBC.HideEmailCard();
					} else {
						NBC.HideSmallEmailCard();
					}
				} else {
					emailErrorMessage = "Sorry, a problem occurred and we could not send your email.\n\n";
					for(var i = 0; i < response.errors.length; i++){
						try{
							emailErrorMessage += response.errors[i].description + "\n";
						} catch(e){}
					}
					alert(emailErrorMessage);
				}
			}
		});
	} else {
		alert(emailErrorMessage);
	}
}

NBC.IsValidEmail = function(str){
	
	//------------------------------------------------------
	this.Debug("[IsValidEmail]");
	if(this.IsEmpty(str)){
		return false;
	}
    var emailRe = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
    if(!emailRe.test(str)){
        return false;
    } else {
        return true;
    }
}

if(NBC.IsStandAlone) {
	try{
		hs$(document).ready(function(){NBC.Init()});
	} catch(e) {
		// No jQuery
		NBC.Debug("In Standalone mode, need jQuery loaded");
		NBC.AddScript({"src": NBC.ScriptRoot+"js/jq.js", "needsJQ": false},"NBC.Init()");
	}
}
else {
    NBC.SCRIPTS_READY = true;
}

NBC.Ready = function(){
	
}
