
function DirectClass()
{	
	this.external = null;
	this.getExternal = function()
	{		
		if(this.external)
			return this.external;

		try {
			if(window.external.Version)
			{
				this.external = window.external;
				return this.external;
			}
		}
		catch(e) { }
		
		if(document.all)
		{
			try {
				this.external = new ActiveXObject("DirectPlayerAx.IEPlugin");
				
				try {
					this.external.ValidateSite();
				} catch(e2) {
					Outlet.log("Failed validate site: " + e2.message);
				}
			} catch (e1) {
				if(Outlet)
					Outlet.log("Failed to create DirectPlayerAx.IEPlugin: " + e1.message);
			}
		}
		else
		{	
			var thePlugin = document.getElementById("nbcDirectPlayer");
			if (thePlugin)
			{
				try {
					thePlugin.ValidateSite();
				} catch(e2) {
					Outlet.log("Failed validate site: " + e2.message);
				}
				
				this.external = thePlugin;
			}
			else
			{
				//alert("Plugin not installed correctly");
				if(Outlet)
					Outlet.log("Failed to get Firefox plug-in");
				debugger;
			}
			
		}

		return this.external;
	}
	
	this.isRunningInShell = function()
	{
		return (window.external && window.external.Version != undefined);
	}

	this.browserDetection = function()
	{
		var result = new Object();

		var data = navigator.userAgent;

		if (data.indexOf("MSIE") != -1)
			result.app = "MSIE";
		if (data.indexOf("Firefox") != -1)
			result.app = "Firefox";
		if (data.indexOf("Safari") != -1)
			result.app = "Safari";

		var index = data.indexOf(result.app);
		if (index == -1)
			return;

		// All other browsers we're concerned with, the version is AFTER the browser name...
		if (result.app != "Safari") {
			result.version = parseFloat(data.substring(index + (result.app.length + 1) ));
		} else {
			// why is safari such a pain?
			var startString = "Version/"
			var start = data.indexOf(startString);
			result.version = parseFloat(data.substring(start + startString.length, index));
		}
		return result;
	}

	this.OSDetection = function()
	{
		var os = null;
		if (navigator.userAgent.indexOf("OS X") != -1)
			os= "Mac";
		if (navigator.userAgent.indexOf("Win") != -1)
			os = "Windows";
		if (navigator.userAgent.indexOf("Windows NT 5.1") != -1)
			os = "WinXP";
		if (navigator.userAgent.indexOf("Windows NT 6.0") != -1)
			os = "Vista";

		return os;
	}
	
	this.setflashVersion = function(arrVersionNumbers)
	{
		var version = new Object();
			version["major"] = arrVersionNumbers[0] ? arrVersionNumbers[0] : 0;
			version["minor"] = arrVersionNumbers[1] ? arrVersionNumbers[1] : 0;
			version["rev"] = arrVersionNumbers[2] ? arrVersionNumbers[2] : 0;

		return version;
	}
	
	this.flashVersion = function()
	{
		var playerVersion = this.setflashVersion([0,0,0]);
		var versionNumbers = null;

		if (navigator.plugins && navigator.mimeTypes.length) {
			var plugin = navigator.plugins["Shockwave Flash"];

			if (plugin && plugin.description) {
				// pull version numbers out of description.
				versionNumbers = plugin.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split(".");

				playerVersion = this.setflashVersion(versionNumbers);
			}
		} else { // IE
			try {
				var axObj = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			} catch(e) {}

			if (axObj != null) {
				versionNumbers = axObj.GetVariable("$version").split(" ")[1].split(",");
				playerVersion = this.setflashVersion(versionNumbers);
			}
		}
		
		return playerVersion;
	}

	this.isBrowserSupported = function()
	{
		var browser = this.browserDetection();
		var os = this.OSDetection();

		if (os == "Windows" || os == "WinXP" || os == "Vista")
		{
			if ((browser.app == "MSIE" && browser.version >= 6) ||
				(browser.app == "Firefox" && browser.version >= 1.5) ||
				(browser.app == "Safari" && browser.version >= 3.1))
			{
				return true;
			} else {
				return false;
			}
		} else if (os == "Mac"){
			if ((browser.app == "Firefox" && browser.version >= 1.5) ||
				(browser.app == "Safari" && browser.version >= 3.1))
			{
				return true;
			} else {
				return false;
			}
		}
	}

	this.isPluginSupported = function()
	{
		var browser = this.browserDetection();
		var os = this.OSDetection();

		if (os == "WinXP" || os == "Vista")
		{
			if ((browser.app == "MSIE" && browser.version >= 6 && browser.version < 9) ||
				(browser.app == "Firefox" && browser.version >= 2 && browser.version <= 4))
			{
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	this.isPluginInstalled = function()
	{
		var browser = this.browserDetection();
		if (browser.app == "Firefox") {
			if (navigator.plugins && navigator.plugins.length) {
				for (var i = 0; i < navigator.plugins.length; i++) {
					if (navigator.plugins[i].name.substr(0, 10) == "NBC Direct") {
						return true;
					}
				}
				// didn't find it...
				return false;
			} else {
				return false;
			}
		} else if (browser.app == "MSIE") {
			try {
				var axObj = new ActiveXObject("DirectPlayerAx.IEPlugin");
				return true;
			} catch(e) {
				return false;
			}
		} else {
			return false;
		}
	}
	
	this.isInstalledForUser = function()
	{
		if(this.external)
			return this.external.IsInstalledForUser();
		else
		{
			return this.getExternal().IsInstalledForUser();
		}
	}

	this.checkFlashVersion = function()
	{
		var playerVersion = this.flashVersion();
		
		// check if reported version meets requirements
		if(playerVersion["major"] < 9)
			return false;
		if(playerVersion["major"] > 9)
			return true;
		if(playerVersion["major"] == 9 && playerVersion["minor"] > 0)
			return true;
		if (playerVersion["major"] == 9 && playerVersion["minor"] == 0 && playerVersion["rev"] >= 115) {
			return true;
		} else {
			return false;
		}
	}

	this.canRunRewind = function()
	{
		return this.isBrowserSupported() && this.checkFlashVersion();
	}

	this.canRunDirect = function()
	{
		return (this.isPluginInstalled() && this.isInstalledForUser() && this.isPluginSupported() && this.checkFlashVersion());
	}

	this._isPluginInstalledCache = null;
	this.isOnline = function()
	{
		if(this._isPluginInstalledCache == null)
			this._isPluginInstalledCache = this.isPluginInstalled();
		if(!this._isPluginInstalledCache)
			return true;
		return this.getExternal().IsInternetConnected;
	}
	
	
	this.appendFirefoxPlugin = function()
	{
		var plugin = document.createElement("object");
		plugin.setAttribute("id", "nbcDirectPlayer");
		plugin.setAttribute("type", "application/nbc-direct");
		plugin.setAttribute("width", "0");
		plugin.setAttribute("height", "0");		
		document.getElementsByTagName("body")[0].appendChild(plugin);	
	}
	
	if(this.browserDetection().app == "Firefox" && this.isPluginInstalled())
	{
		if(!document.body)
		{
			var pThis = this;
			document.addEventListener("DOMContentLoaded", function() {
				pThis.appendFirefoxPlugin();
			}, false);
		}
		else
			this.appendFirefoxPlugin();
	}

	this.logger = new LoggerClass();
	this.LOG_LEVEL_DEFAULT = 1;
	this.LOG_LEVEL_DEBUG = 2;
	this.LOG_LEVEL_VERBOSE = 3;
}
window.Direct = new DirectClass();

function LoggerClass()
{
	this.logDiv = null;
	this.log = function(str)
	{
		if(this.logDiv == null)
			this.init();
		$("#_logger_").prepend(str);
	}
	this.init = function()
	{
		this.logDiv = document.createElement("div");
		this.logDiv.id = "_logger_";
		this.logDiv = document.body.appendChild(_logDiv);
	}
}

