﻿if (!window.Silverlight) {
	window.Silverlight = {};
}

// Silverlight control instance counter for memory mgt
Silverlight._silverlightCount = 0;
Silverlight.fwlinkRoot = 'http://go2.microsoft.com/fwlink/?LinkID=';
Silverlight.onGetSilverlight = null;
Silverlight.onSilverlightInstalled = function() { window.location.reload(false); };

//////////////////////////////////////////////////////////////////
// isInstalled, checks to see if the correct version is installed
//////////////////////////////////////////////////////////////////
Silverlight.isInstalled = function(version) {
	var isVersionSupported = false;
	var container = null;

	try {
		var control = null;

		try {
			control = new ActiveXObject('AgControl.AgControl');
			if (version == null) {
				isVersionSupported = true;
			}
			else if (control.IsVersionSupported(version)) {
				isVersionSupported = true;
			}
			control = null;
		}
		catch (e) {
			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;
	}
	if (container) {
		document.body.removeChild(container);
	}

	return isVersionSupported;
}
Silverlight.WaitForInstallCompletion = function() {
	if (!Silverlight.isBrowserRestartRequired && Silverlight.onSilverlightInstalled) {
		try {
			navigator.plugins.refresh();
		}
		catch (e) {
		}
		if (Silverlight.isInstalled(null)) {
			Silverlight.onSilverlightInstalled();
		}
		else {
			setTimeout(Silverlight.WaitForInstallCompletion, 3000);
		}
	}
}
Silverlight.__startup = function() {
	Silverlight.isBrowserRestartRequired = Silverlight.isInstalled(null); //(!window.ActiveXObject || Silverlight.isInstalled(null));
	if (!Silverlight.isBrowserRestartRequired) {
		Silverlight.WaitForInstallCompletion();
	}
	if (window.removeEventListener) {
		window.removeEventListener('load', Silverlight.__startup, false);
	}
	else {
		window.detachEvent('onload', Silverlight.__startup);
	}
}

if (window.addEventListener) {
	window.addEventListener('load', Silverlight.__startup, false);
}
else {
	window.attachEvent('onload', Silverlight.__startup);
}

///////////////////////////////////////////////////////////////////////////////
// createObject();  Params:
// parentElement of type Element, the parent element of the Silverlight Control
// source of type String
// id of type string
// properties of type String, object literal notation { name:value, name:value, name:value},
//     current properties are: width, height, background, framerate, isWindowless, enableHtmlAccess, inplaceInstallPrompt:  all are of type string
// events of type String, object literal notation { name:value, name:value, name:value},
//     current events are onLoad onError, both are type string
// initParams of type Object or object literal notation { name:value, name:value, name:value}
// userContext of type Object
/////////////////////////////////////////////////////////////////////////////////

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
	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;
	}

}

///////////////////////////////////////////////////////////////////////////////
//
//  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="' + 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;
	}
}

///////////////////////////////////////////////////////////////////////////////////////////////
// Builds the HTML to prompt the user to download and install Silverlight
///////////////////////////////////////////////////////////////////////////////////////////////
Silverlight.buildPromptHTML = function(slPluginHelper) {
	var slPluginHTML = "";
	var urlRoot = Silverlight.fwlinkRoot;
	var shortVer = slPluginHelper.version;
	if (slPluginHelper.alt) {
		slPluginHTML = slPluginHelper.alt;
	}
	else {
		if (!shortVer) {
			shortVer = "";
		}
		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}', shortVer);
		slPluginHTML = slPluginHTML.replace('{2}', urlRoot + '108181');
	}

	return slPluginHTML;
}


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);
}


///////////////////////////////////////////////////////////////////////////////////////////////
/// Navigates to a url based on fwlinkid
///////////////////////////////////////////////////////////////////////////////////////////////
Silverlight.followFWLink = function(linkid) {
	top.location = Silverlight.fwlinkRoot + String(linkid);
}












///////////////////////////////////////////////////////////////////////////////////////////////
/// 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 handling function to be used when a custom error handler is
//  not present
//
///////////////////////////////////////////////////////////////////////////////

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);
}

///////////////////////////////////////////////////////////////////////////////////////////////
/// 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);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////
/// Releases event handler resources when the page is unloaded
///////////////////////////////////////////////////////////////////////////////////////////////
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;
}
