﻿/////////////////////////////////////////////////////////////////
//
//  FlashBase.js    version 1.0.0
//
/////////////////////////////////////////////////////////////////

if (!window.FlashBase)
{
	window.FlashBase = {};
}

FlashBase = function()
{
	this._isIE = (navigator.appVersion.toLowerCase().indexOf("msie") != -1) ? true : false;
	this._isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1) ? true : false;
	this._isFF = (navigator.userAgent.toLowerCase().indexOf("firefox") != -1) ? true : false;
	this._isSafari = (navigator.userAgent.toLowerCase().indexOf("safari") != -1) ? true : false;
}

FlashBase.prototype =
{
	createObject: function(parentElement, id, properties, flashVars)
	{
		var mpProperties = properties;
		mpProperties.id = id;
		mpProperties.name = id;

		if (this._isIE)
		{
			slPluginHTML = this.buildIEHtml(mpProperties, flashVars);

		} else if (this._isOpera || this._isFF || this._isSafari)
		{
			slPluginHTML = this.buildHtml(mpProperties, flashVars);
		}
		else
		{
			slPluginHTML = Resources.FlashBase.BROWSERNOTSUPPORTED;
		}

		if (this.detectFlashVer(properties.version))
		{
			parentElement.innerHTML = slPluginHTML + parentElement.innerHTML;

		}
		else
		{
			parentElement.innerHTML = this.buildPromptHTML();
		}
	},
	///////////////////////////////////////////////////////////////////////////////////////////////
	//
	// buildPromptHTML
	//
	// Builds the HTML to prompt the user to download and install flash
	//
	///////////////////////////////////////////////////////////////////////////////////////////////
	buildPromptHTML: function()
	{
		var flashPluginHTML = "";
		var downloadUrl = "http://www.adobe.com/go/getflash/";

		flashPluginHTML = "<div style='color:gray;width:100%;text-align:center;'>{0}<br/><br/><a href='{1}' style='text-decoration: none;'>{2}</a></div>";
		flashPluginHTML = flashPluginHTML.replace('{0}', Resources.FlashBase.NO_PLUGIN);
		flashPluginHTML = flashPluginHTML.replace('{1}', downloadUrl);
		flashPluginHTML = flashPluginHTML.replace('{2}', Resources.FlashBase.GET_PLUGIN);

		return flashPluginHTML;
	},
	///////////////////////////////////////////////////////////////////////////////
	//
	//  buildHTML:
	//
	//  create HTML that instantiates the control for internet explorer
	//
	///////////////////////////////////////////////////////////////////////////////
	buildIEHtml: function(mpProperties, flashVars)
	{
		var htmlBuilder = [];

		htmlBuilder.push('<object type=\"application/x-shockwave-flash\" CLASSID="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"');

		if (mpProperties.id != null)
		{
			htmlBuilder.push(' id="' + mpProperties.id + '"');
		}
		if (mpProperties.name != null)
		{
			htmlBuilder.push(' name="' + mpProperties.id + '"');
		}
		if (mpProperties.width != null)
		{
			htmlBuilder.push(' width="' + mpProperties.width + '"');
		}
		if (mpProperties.height != null)
		{
			htmlBuilder.push(' height="' + mpProperties.height + '"');
		}

		delete mpProperties.id;
		delete mpProperties.name;

		var isFirst = true;
		
		for (var name in mpProperties)
		{
			if (mpProperties[name])
			{
				htmlBuilder.push('<param name="' + this.htmlAttributeEncode(name) + '" value="' + this.htmlAttributeEncode(mpProperties[name]) + '" />');
			}
		}
		var flashVarsBuilder = [];

		for (var name in flashVars)
		{
			if (isFirst)
				isFirst = false;
			else
				flashVarsBuilder.push('&');
				
			flashVarsBuilder.push(this.htmlAttributeEncode(name) + '=' +  this.htmlAttributeEncode(flashVars[name]));
		}

		//htmlBuilder.push('<param name="flashvars" value="' + flashVarsBuilder.join('') + '"');
		
		htmlBuilder.push(' >');
		htmlBuilder.push('<\/object>');

		return htmlBuilder.join('');
	},
	///////////////////////////////////////////////////////////////////////////////
	//
	//  buildHTML:
	//
	//  create HTML that instantiates the control for Firefox
	//
	///////////////////////////////////////////////////////////////////////////////
	buildHtml: function(mpProperties, flashVars)
	{
		var htmlBuilder = [];

		htmlBuilder.push('<embed type=\"application/x-shockwave-flash\"');

		for (var name in mpProperties)
		{
			if (mpProperties[name])
			{
				htmlBuilder.push(this.htmlAttributeEncode(name) + '="' + this.htmlAttributeEncode(mpProperties[name]) + '"');
			}
		}
		
		var flashVarsBuilder = [];

		var isFirst = true;

		for (var name in flashVars)
		{
			if (isFirst)
				isFirst = false;
			else
				flashVarsBuilder.push('&');

			flashVarsBuilder.push(this.htmlAttributeEncode(name) + '=' +  this.htmlAttributeEncode(flashVars[name]));
		}

		htmlBuilder.push('flashVars="' + flashVarsBuilder.join('') + '"');
		
		htmlBuilder.push('>');
		htmlBuilder.push('<\/embed>');
		return htmlBuilder.join('');
	},
	///////////////////////////////////////////////////////////////////////////////////////////////
	//
	// HtmlAttributeEncode:
	//
	// Encodes special characters in input strings as charcodes
	//
	///////////////////////////////////////////////////////////////////////////////////////////////
	htmlAttributeEncode: function(strInput)
	{
		var c;
		var retVal = '';

		if (strInput == null)
		{
			return null;
		}

		for (var cnt = 0; cnt < strInput.length; cnt++)
		{
			c = strInput.charCodeAt(cnt);

			if (((c > 96) && (c < 123)) ||
					  ((c > 64) && (c < 91)) ||
					  ((c > 43) && (c < 58) && (c != 47)) ||
					  (c == 95))
			{
				retVal = retVal + String.fromCharCode(c);
			}
			else
			{
				retVal = retVal + '&#' + c + ';';
			}
		}

		return retVal;
	},
	///////////////////////////////////////////////////////////////////////////////////////////////
	//
	// detectFlashVer:
	//
	// Detects is the correct flash version is installed on the client
	//
	///////////////////////////////////////////////////////////////////////////////////////////////
	detectFlashVer: function(flashVersion)
	{
		versionStr = this.getSwfVer();

		if (versionStr == -1)
		{
			return false;
		}
		else if (versionStr != 0)
		{
			if (this._isIE && !this._isOpera && !this._isFF && !this._isSafari)
			{
				// Given "WIN 2,0,0,11"
				tempArray = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
				tempString = tempArray[1]; 		// "2,0,0,11"
				versionArray = tempString.split(","); // ['2', '0', '0', '11']
			}
			else
			{
				versionArray = versionStr.split(".");
			}
			var versionMajor = versionArray[0];

			// is the major.revision >= requested major.revision AND the minor version >= requested minor
			if (versionMajor >= parseFloat(flashVersion))
			{
				return true;
			}
			return false;
		}
	},
	///////////////////////////////////////////////////////////////////////////////////////////////
	//
	// ControlVersion:
	//
	// Controls wish version of flash the client have installed (taken from marcomedia)
	//
	///////////////////////////////////////////////////////////////////////////////////////////////
	controlVersion: function()
	{
		var version;
		var axo;
		var e;

		// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry

		try
		{
			// version will be set for 7.X or greater players
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
			version = axo.GetVariable("$version");
		} catch (e)
		{
		}

		if (!version)
		{
			try
			{
				// version will be set for 6.X players only
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");

				// installed player is some revision of 6.0
				// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
				// so we have to be careful. 

				// default to the first public version
				version = "WIN 6,0,21,0";

				// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
				axo.AllowScriptAccess = "always";

				// safe to call for 6.0r47 or greater
				version = axo.GetVariable("$version");

			} catch (e)
			{
			}
		}

		if (!version)
		{
			try
			{
				// version will be set for 4.X or 5.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				version = axo.GetVariable("$version");
			} catch (e)
			{
			}
		}

		if (!version)
		{
			try
			{
				// version will be set for 3.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				version = "WIN 3,0,18,0";
			} catch (e)
			{
			}
		}

		if (!version)
		{
			try
			{
				// version will be set for 2.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
				version = "WIN 2,0,0,11";
			} catch (e)
			{
				version = -1;
			}
		}

		return version;
	},
	///////////////////////////////////////////////////////////////////////////////////////////////
	//
	// GetSwfVer:
	//
	// Controls wish version of flash the client have installed (taken from marcomedia)
	//
	///////////////////////////////////////////////////////////////////////////////////////////////
	getSwfVer: function()
	{
		// NS/Opera version >= 3 check for Flash plugin in plugin array
		var flashVer = -1;

		if (navigator.plugins != null && navigator.plugins.length > 0)
		{
			if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"])
			{
				var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
				var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
				var descArray = flashDescription.split(" ");
				var tempArrayMajor = descArray[2].split(".");
				var versionMajor = tempArrayMajor[0];
				var versionMinor = tempArrayMajor[1];
				var versionRevision = descArray[3];
				if (versionRevision == "")
				{
					versionRevision = descArray[4];
				}
				if (versionRevision[0] == "d")
				{
					versionRevision = versionRevision.substring(1);
				} else if (versionRevision[0] == "r")
				{
					versionRevision = versionRevision.substring(1);
					if (versionRevision.indexOf("d") > 0)
					{
						versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
					}
				}
				var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
			}
		}
		// MSN/WebTV 2.6 supports Flash 4
		else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
		// WebTV 2.5 supports Flash 3
		else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
		// older WebTV supports Flash 2
		else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
		else if (this._isIE && !this._isOpera && !this._isFF && !this._isSafari)
		{
			flashVer = this.controlVersion();
		}
		return flashVer;
	}
}




