﻿///////////////////////////////////////////////////////////////////////////////
//
//  Silverlight.js   			version 2.0.31030.0
//
//  This file is provided by Microsoft as a helper file for websites that
//  incorporate Silverlight Objects. This file is provided under the Microsoft
//  Public License available at 
//  http://code.msdn.microsoft.com/silverlightjs/Project/License.aspx.  
//  You may not use or distribute this file or the code in this file except as 
//  expressly permitted under that license.
// 
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////

if (!window.Silverlight) {
	window.Silverlight = {};
}

//////////////////////////////////////////////////////////////////
//
// _silverlightCount:
//
// Counter of globalized event handlers
//
//////////////////////////////////////////////////////////////////
Silverlight._silverlightCount = 0;

//////////////////////////////////////////////////////////////////
//
// __onSilverlightInstalledCalled:
//
// Prevents onSilverlightInstalled from being called multiple 
// times
//
//////////////////////////////////////////////////////////////////
Silverlight.__onSilverlightInstalledCalled = false;

//////////////////////////////////////////////////////////////////
//
// fwlinkRoot:
//
// Prefix for fwlink URL's
//
//////////////////////////////////////////////////////////////////
Silverlight.fwlinkRoot = 'http://go2.microsoft.com/fwlink/?LinkID=';

//////////////////////////////////////////////////////////////////
//
// __installationEventFired:
//
// Ensures that only one Installation State event is fired.
//
//////////////////////////////////////////////////////////////////
Silverlight.__installationEventFired = false;

//////////////////////////////////////////////////////////////////
//  
// onGetSilverlight:
//
// Called by Silverlight.GetSilverlight to notify the page that a user
// has requested the Silverlight installer
//
//////////////////////////////////////////////////////////////////
Silverlight.onGetSilverlight = null;

//////////////////////////////////////////////////////////////////
//
// onSilverlightInstalled:
//
// Called by Silverlight.WaitForInstallCompletion when the page detects
// that Silverlight has been installed. The event handler is not called
// in upgrade scenarios.
//
//////////////////////////////////////////////////////////////////
Silverlight.onSilverlightInstalled = function() { window.location.reload(false); };

//////////////////////////////////////////////////////////////////
//
// isInstalled:
//
// Checks to see if the correct version is installed
//
//////////////////////////////////////////////////////////////////
Silverlight.isInstalled = function(version) {
	if (version == undefined)
		version = null;

	var isVersionSupported = false;
	var container = null;

	try {
		var control = null;
		var tryNS = false;

		if (window.ActiveXObject) {
			try {
				control = new ActiveXObject('AgControl.AgControl');
				if (version === null) {
					isVersionSupported = true;
				}
				else if (control.IsVersionSupported(version)) {
					isVersionSupported = true;
				}
				control = null;
			}
			catch (e) {
				tryNS = true;
			}
		}
		else {
			tryNS = true;
		}
		if (tryNS) {
			var plugin = navigator.plugins["Silverlight Plug-In"];
			if (plugin) {
				if (version === null) {
					isVersionSupported = true;
				}
				else {
					var actualVer = plugin.description;
					if (actualVer === "1.0.30226.2")
						actualVer = "2.0.30226.2";
					var actualVerArray = actualVer.split(".");
					while (actualVerArray.length > 3) {
						actualVerArray.pop();
					}
					while (actualVerArray.length < 4) {
						actualVerArray.push(0);
					}
					var reqVerArray = version.split(".");
					while (reqVerArray.length > 4) {
						reqVerArray.pop();
					}

					var requiredVersionPart;
					var actualVersionPart;
					var index = 0;


					do {
						requiredVersionPart = parseInt(reqVerArray[index]);
						actualVersionPart = parseInt(actualVerArray[index]);
						index++;
					}
					while (index < reqVerArray.length && requiredVersionPart === actualVersionPart);

					if (requiredVersionPart <= actualVersionPart && !isNaN(requiredVersionPart)) {
						isVersionSupported = true;
					}
				}
			}
		}
	}
	catch (e) {
		isVersionSupported = false;
	}

	return isVersionSupported;
};
//////////////////////////////////////////////////////////////////
//
// WaitForInstallCompletion:
//
// Occasionally checks for Silverlight installation status. If it
// detects that Silverlight has been installed then it calls
// Silverlight.onSilverlightInstalled();. This is only supported
// if Silverlight was not previously installed on this computer.
//
//////////////////////////////////////////////////////////////////
Silverlight.WaitForInstallCompletion = function() {
	if (!Silverlight.isBrowserRestartRequired && Silverlight.onSilverlightInstalled) {
		try {
			navigator.plugins.refresh();
		}
		catch (e) {
		}
		if (Silverlight.isInstalled(null) && !Silverlight.__onSilverlightInstalledCalled) {
			Silverlight.onSilverlightInstalled();
			Silverlight.__onSilverlightInstalledCalled = true;
		}
		else {
			setTimeout(Silverlight.WaitForInstallCompletion, 3000);
		}
	}
};
//////////////////////////////////////////////////////////////////
//
// __startup:
//
// Performs startup tasks. 
//////////////////////////////////////////////////////////////////
Silverlight.__startup = function() {
	navigator.plugins.refresh();
	Silverlight.isBrowserRestartRequired = Silverlight.isInstalled(null);
	if (!Silverlight.isBrowserRestartRequired) {
		Silverlight.WaitForInstallCompletion();
		if (!Silverlight.__installationEventFired) {
			Silverlight.onInstallRequired();
			Silverlight.__installationEventFired = true;
		}
	}
	else if (window.navigator.mimeTypes) {
		var mimeSL2 = navigator.mimeTypes["application/x-silverlight-2"];
		var mimeSL2b2 = navigator.mimeTypes["application/x-silverlight-2-b2"];
		var mimeSL2b1 = navigator.mimeTypes["application/x-silverlight-2-b1"];
		var mimeHighestBeta = mimeSL2b1;
		if (mimeSL2b2)
			mimeHighestBeta = mimeSL2b2;

		if (!mimeSL2 && (mimeSL2b1 || mimeSL2b2)) {
			if (!Silverlight.__installationEventFired) {
				Silverlight.onUpgradeRequired();
				Silverlight.__installationEventFired = true;
			}
		}
		else if (mimeSL2 && mimeHighestBeta) {
			if (mimeSL2.enabledPlugin &&
                mimeHighestBeta.enabledPlugin) {
				if (mimeSL2.enabledPlugin.description !=
                    mimeHighestBeta.enabledPlugin.description) {
					if (!Silverlight.__installationEventFired) {
						Silverlight.onRestartRequired();
						Silverlight.__installationEventFired = true;
					}
				}
			}
		}
	}
	if (!Silverlight.disableAutoStartup) {
		if (window.removeEventListener) {
			window.removeEventListener('load', Silverlight.__startup, false);
		}
		else {
			window.detachEvent('onload', Silverlight.__startup);
		}
	}
};

///////////////////////////////////////////////////////////////////////////////
//
// This block wires up Silverlight.__startup to be executed once the page
// loads. This is the desired behavior for most sites. If, however, a site
// prefers to control the timing of the Silverlight.__startup call then it should
// put the following block of javascript into the webpage before this file is
// included:
//
//    <script type="text/javascript">
//        if (!window.Silverlight)
//        {
//            window.Silverlight = {};
//        }
//        Silverlight.disableAutoStartup = true;
//    </script> 
//
/////////////////////////////////////////////////////////////////////////////////

if (!Silverlight.disableAutoStartup) {
	if (window.addEventListener) {
		window.addEventListener('load', Silverlight.__startup, false);
	}
	else {
		window.attachEvent('onload', Silverlight.__startup);
	}
}

///////////////////////////////////////////////////////////////////////////////
// createObject:
//
// Inserts a Silverlight <object> tag or installation experience into the HTML
// DOM based on the current installed state of Silverlight. 
//
/////////////////////////////////////////////////////////////////////////////////

Silverlight.createObject = function(source, parentElement, id, properties, events, initParams, userContext) {
	var slPluginHelper = new Object();
	var slProperties = properties;
	var slEvents = events;

	slPluginHelper.version = slProperties.version;
	slProperties.source = source;
	slPluginHelper.alt = slProperties.alt;

	//rename properties to their tag property names. For bacwards compatibility
	//with Silverlight.js version 1.0
	if (initParams)
		slProperties.initParams = initParams;
	if (slProperties.isWindowless && !slProperties.windowless)
		slProperties.windowless = slProperties.isWindowless;
	if (slProperties.framerate && !slProperties.maxFramerate)
		slProperties.maxFramerate = slProperties.framerate;
	if (id && !slProperties.id)
		slProperties.id = id;

	// remove elements which are not to be added to the instantiation tag
	delete slProperties.ignoreBrowserVer;
	delete slProperties.inplaceInstallPrompt;
	delete slProperties.version;
	delete slProperties.isWindowless;
	delete slProperties.framerate;
	delete slProperties.data;
	delete slProperties.src;
	delete slProperties.alt;


	// detect that the correct version of Silverlight is installed, else display install

	if (Silverlight.isInstalled(slPluginHelper.version)) {
		//move unknown events to the slProperties array
		for (var name in slEvents) {
			if (slEvents[name]) {
				if (name == "onLoad" && typeof slEvents[name] == "function" && slEvents[name].length != 1) {
					var onLoadHandler = slEvents[name];
					slEvents[name] = function(sender) { return onLoadHandler(document.getElementById(id), userContext, sender) };
				}
				var handlerName = Silverlight.__getHandlerName(slEvents[name]);
				if (handlerName != null) {
					slProperties[name] = handlerName;
					slEvents[name] = null;
				}
				else {
					throw "typeof events." + name + " must be 'function' or 'string'";
				}
			}
		}
		slPluginHTML = Silverlight.buildHTML(slProperties);
	}
	//The control could not be instantiated. Show the installation prompt
	else {
		slPluginHTML = Silverlight.buildPromptHTML(slPluginHelper);
	}

	// insert or return the HTML
	if (parentElement) {
		parentElement.innerHTML = slPluginHTML;
	}
	else {
		return slPluginHTML;
	}

};

///////////////////////////////////////////////////////////////////////////////
//
//  buildHTML:
//
//  create HTML that instantiates the control
//
///////////////////////////////////////////////////////////////////////////////
Silverlight.buildHTML = function(slProperties) {
	var htmlBuilder = [];

	htmlBuilder.push('<object type=\"application/x-silverlight\" data="data:application/x-silverlight,"');
	if (slProperties.id != null) {
		htmlBuilder.push(' id="' + Silverlight.HtmlAttributeEncode(slProperties.id) + '"');
	}
	if (slProperties.width != null) {
		htmlBuilder.push(' width="' + slProperties.width + '"');
	}
	if (slProperties.height != null) {
		htmlBuilder.push(' height="' + slProperties.height + '"');
	}
	htmlBuilder.push(' >');

	delete slProperties.id;
	delete slProperties.width;
	delete slProperties.height;

	for (var name in slProperties) {
		if (slProperties[name]) {
			htmlBuilder.push('<param name="' + Silverlight.HtmlAttributeEncode(name) + '" value="' + Silverlight.HtmlAttributeEncode(slProperties[name]) + '" />');
		}
	}
	htmlBuilder.push('<\/object>');
	return htmlBuilder.join('');
};



//////////////////////////////////////////////////////////////////
//
// createObjectEx:
//
// takes a single parameter of all createObject 
// parameters enclosed in {}
//
//////////////////////////////////////////////////////////////////

Silverlight.createObjectEx = function(params) {
	var parameters = params;
	var html = Silverlight.createObject(parameters.source, parameters.parentElement, parameters.id, parameters.properties, parameters.events, parameters.initParams, parameters.context);
	if (parameters.parentElement == null) {
		return html;
	}
};

///////////////////////////////////////////////////////////////////////////////////////////////
//
// buildPromptHTML
//
// Builds the HTML to prompt the user to download and install Silverlight
//
///////////////////////////////////////////////////////////////////////////////////////////////
Silverlight.buildPromptHTML = function(slPluginHelper) {
	var slPluginHTML = "";
	var urlRoot = Silverlight.fwlinkRoot;
	var version = slPluginHelper.version;
	if (slPluginHelper.alt) {
		slPluginHTML = slPluginHelper.alt;
	}
	else {
		if (!version) {
			version = "";
		}
		slPluginHTML = "<a href='javascript:Silverlight.getSilverlight(\"{1}\");' style='text-decoration: none;'><img src='{2}' alt='Get Microsoft Silverlight' style='border-style: none'/></a>";
		slPluginHTML = slPluginHTML.replace('{1}', version);
		slPluginHTML = slPluginHTML.replace('{2}', urlRoot + '108181');
	}

	return slPluginHTML;
};

///////////////////////////////////////////////////////////////////////////////////////////////
//
// getSilverlight:
//
// Navigates the browser to the appropriate Silverlight installer
//
///////////////////////////////////////////////////////////////////////////////////////////////
Silverlight.getSilverlight = function(version) {
	if (Silverlight.onGetSilverlight) {
		Silverlight.onGetSilverlight();
	}

	var shortVer = "";
	var reqVerArray = String(version).split(".");
	if (reqVerArray.length > 1) {
		var majorNum = parseInt(reqVerArray[0]);
		if (isNaN(majorNum) || majorNum < 2) {
			shortVer = "1.0";
		}
		else {
			shortVer = reqVerArray[0] + '.' + reqVerArray[1];
		}
	}

	var verArg = "";

	if (shortVer.match(/^\d+\056\d+$/)) {
		verArg = "&v=" + shortVer;
	}

	Silverlight.followFWLink("114576" + verArg);
};


///////////////////////////////////////////////////////////////////////////////////////////////
//
// followFWLink:
//
// Navigates to a url based on fwlinkid
//
///////////////////////////////////////////////////////////////////////////////////////////////
Silverlight.followFWLink = function(linkid) {
	top.location = Silverlight.fwlinkRoot + String(linkid);
};

///////////////////////////////////////////////////////////////////////////////////////////////
//
// HtmlAttributeEncode:
//
// Encodes special characters in input strings as charcodes
//
///////////////////////////////////////////////////////////////////////////////////////////////
Silverlight.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;
};
///////////////////////////////////////////////////////////////////////////////
//
//  default_error_handler:
//
//  Default error handling function 
//
///////////////////////////////////////////////////////////////////////////////

Silverlight.default_error_handler = function(sender, args) {
	var iErrorCode;
	var errorType = args.ErrorType;

	iErrorCode = args.ErrorCode;

	var errMsg = "\nSilverlight error message     \n";

	errMsg += "ErrorCode: " + iErrorCode + "\n";


	errMsg += "ErrorType: " + errorType + "       \n";
	errMsg += "Message: " + args.ErrorMessage + "     \n";

	if (errorType == "ParserError") {
		errMsg += "XamlFile: " + args.xamlFile + "     \n";
		errMsg += "Line: " + args.lineNumber + "     \n";
		errMsg += "Position: " + args.charPosition + "     \n";
	}
	else if (errorType == "RuntimeError") {
		if (args.lineNumber != 0) {
			errMsg += "Line: " + args.lineNumber + "     \n";
			errMsg += "Position: " + args.charPosition + "     \n";
		}
		errMsg += "MethodName: " + args.methodName + "     \n";
	}
	alert(errMsg);
};

///////////////////////////////////////////////////////////////////////////////////////////////
//
// __cleanup:
//
// Releases event handler resources when the page is unloaded
//
///////////////////////////////////////////////////////////////////////////////////////////////
Silverlight.__cleanup = function() {
	for (var i = Silverlight._silverlightCount - 1; i >= 0; i--) {
		window['__slEvent' + i] = null;
	}
	Silverlight._silverlightCount = 0;
	if (window.removeEventListener) {
		window.removeEventListener('unload', Silverlight.__cleanup, false);
	}
	else {
		window.detachEvent('onunload', Silverlight.__cleanup);
	}
};

///////////////////////////////////////////////////////////////////////////////////////////////
//
// __getHandlerName:
//
// Generates named event handlers for delegates.
//
///////////////////////////////////////////////////////////////////////////////////////////////
Silverlight.__getHandlerName = function(handler) {
	var handlerName = "";
	if (typeof handler == "string") {
		handlerName = handler;
	}
	else if (typeof handler == "function") {
		if (Silverlight._silverlightCount == 0) {
			if (window.addEventListener) {
				window.addEventListener('onunload', Silverlight.__cleanup, false);
			}
			else {
				window.attachEvent('onunload', Silverlight.__cleanup);
			}
		}
		var count = Silverlight._silverlightCount++;
		handlerName = "__slEvent" + count;

		window[handlerName] = handler;
	}
	else {
		handlerName = null;
	}
	return handlerName;
};
//////////////////////////////////////////////////////////////////
//  
// onRequiredVersionAvailable:
//
// Called by version  verification control to notify the page that
// an appropriate build of Silverlight is available. The page 
// should respond by injecting the appropriate Silverlight control
//
//////////////////////////////////////////////////////////////////
Silverlight.onRequiredVersionAvailable = function() {

};
//////////////////////////////////////////////////////////////////
//  
// onRestartRequired:
//
// Called by version verification control to notify the page that
// an appropriate build of Silverlight is installed but not loaded. 
// The page should respond by injecting a clear and visible 
// "Thanks for installing. Please restart your browser and return
// to mysite.com" or equivalent into the browser DOM
//
//////////////////////////////////////////////////////////////////
Silverlight.onRestartRequired = function() {

};
//////////////////////////////////////////////////////////////////
//  
// onUpgradeRequired:
//
// Called by version verification control to notify the page that
// Silverlight must be upgraded. The page should respond by 
// injecting a clear, visible, and actionable upgrade message into
// the DOM. The message must inform the user that they need to 
// upgrade Silverlight to use the page. They are already somewhat
// familiar with the Silverlight product when they encounter this.
// Silverlight should be mentioned so the user expects to see that
// string in the installer UI. However, the Silverlight-powered
// application should be the focus of the solicitation. The user
// wants the app. Silverlight is a means to the app.
// 
// The upgrade solicitation will have a button that directs 
// the user to the Silverlight installer. Upon click the button
// should both kick off a download of the installer URL and replace
// the Upgrade text with "Thanks for downloading. When the upgarde
// is complete please restart your browser and return to 
// mysite.com" or equivalent.
//
// Note: For a more interesting upgrade UX we can use Silverlight
// 1.0-style XAML for this upgrade experience. Contact PiotrP for
// details.
//
//////////////////////////////////////////////////////////////////
Silverlight.onUpgradeRequired = function() {

};
//////////////////////////////////////////////////////////////////
//  
// onInstallRequired:
//
// Called by Silverlight.checkInstallStatus to notify the page
// that Silverlight has not been installed by this user.
// The page should respond by 
// injecting a clear, visible, and actionable upgrade message into
// the DOM. The message must inform the user that they need to 
// download and install components needed to use the page. 
// Silverlight should be mentioned so the user expects to see that
// string in the installer UI. However, the Silverlight-powered
// application should be the focus of the solicitation. The user
// wants the app. Silverlight is a means to the app.
// 
// The installation solicitation will have a button that directs 
// the user to the Silverlight installer. Upon click the button
// should both kick off a download of the installer URL and replace
// the Upgrade text with "Thanks for downloading. When installation
// is complete you may need to refresh the page to view this 
// content" or equivalent.
//
//////////////////////////////////////////////////////////////////
Silverlight.onInstallRequired = function() {

};

//////////////////////////////////////////////////////////////////
//  
// IsVersionAvailableOnError:
//
// This function should be called at the beginning of a web page's
// Silverlight error handler. It will determine if the required 
// version of Silverlight is installed and available in the 
// current process.
//
// During its execution the function will trigger one of the 
// Silverlight installation state events, if appropriate.
//
// Sender and Args should be passed through from  the calling
// onError handler's parameters. 
//
// The associated Sivlerlight <object> tag must have
// minRuntimeVersion set and should have autoUpgrade set to false.
//
//////////////////////////////////////////////////////////////////
Silverlight.IsVersionAvailableOnError = function(sender, args) {
	var retVal = false;
	try {
		if (args.ErrorCode == 8001 && !Silverlight.__installationEventFired) {
			Silverlight.onUpgradeRequired();
			Silverlight.__installationEventFired = true;
		}
		else if (args.ErrorCode == 8002 && !Silverlight.__installationEventFired) {
			Silverlight.onRestartRequired();
			Silverlight.__installationEventFired = true;
		}
		// this handles upgrades from 1.0. That control did not
		// understand the minRuntimeVerison parameter. It also
		// did not know how to parse XAP files, so would throw
		// Parse Error (5014). A Beta 2 control may throw 2106
		else if (args.ErrorCode == 5014 || args.ErrorCode == 2106) {
			if (Silverlight.__verifySilverlight2UpgradeSuccess(args.getHost())) {
				retVal = true;
			}
		}
		else {
			retVal = true;
		}
	}
	catch (e) {
	}
	return retVal;
};
//////////////////////////////////////////////////////////////////
//  
// IsVersionAvailableOnLoad:
//
// This function should be called at the beginning of a web page's
// Silverlight onLoad handler. It will determine if the required 
// version of Silverlight is installed and available in the 
// current process.
//
// During its execution the function will trigger one of the 
// Silverlight installation state events, if appropriate.
//
// Sender should be passed through from  the calling
// onError handler's parameters. 
//
// The associated Sivlerlight <object> tag must have
// minRuntimeVersion set and should have autoUpgrade set to false.
//
//////////////////////////////////////////////////////////////////
Silverlight.IsVersionAvailableOnLoad = function(sender) {
	var retVal = false;
	try {
		if (Silverlight.__verifySilverlight2UpgradeSuccess(sender.getHost())) {
			retVal = true;
		}
	}
	catch (e) {
	}
	return retVal;
};
//////////////////////////////////////////////////////////////////
//
// __verifySilverlight2UpgradeSuccess:
//
// This internal function helps identify installation state by
// taking advantage of behavioral differences between the
// 1.0 and 2.0 releases of Silverlight. 
//
//////////////////////////////////////////////////////////////////
Silverlight.__verifySilverlight2UpgradeSuccess = function(host) {
	var retVal = false;
	var version = "2.0.31005";
	var installationEvent = null;

	try {
		if (host.IsVersionSupported(version + ".99")) {
			installationEvent = Silverlight.onRequiredVersionAvailable;
			retVal = true;
		}
		else if (host.IsVersionSupported(version + ".0")) {
			installationEvent = Silverlight.onRestartRequired;
		}
		else {
			installationEvent = Silverlight.onUpgradeRequired;
		}

		if (installationEvent && !Silverlight.__installationEventFired) {
			installationEvent();
			Silverlight.__installationEventFired = true;
		}
	}
	catch (e) {
	}
	return retVal;
};