﻿function attachToTabPanel(tabContainer) {
	var childElements = getChildElements(tabContainer);
	var tabs = getChildElements(childElements[0]);

	for (var i = 0; tabs[i]; i++)
		attachToTab(tabContainer, tabs[i], i);

	selectTab(tabContainer, 0);
}

function attachToTab(tabContainer, tab, index) {
	tab.onclick = function () { selectTab(tabContainer, index); };
}

function selectTab(tabContainer, index) {
	var childElements = getChildElements(tabContainer);
	var tabs = getChildElements(childElements[0]);
	var panels = getChildElements(childElements[1]);
	var i;

	for (i = 0; tabs[i]; i++)
		tabs[i].className = (i == index ? "Selected" : "");

	for (i = 0; panels[i]; i++)
		panels[i].style.display = (i == index ? "block" : "none");
}

function getChildElements(element) {
	var index = 0;
	var elementArray = new Array(element.childNodes.length);

	for (var i = 0; element.childNodes[i]; i++)
		if (element.childNodes[i].nodeType == 1)
			elementArray[index++] = element.childNodes[i];

	elementArray.length = index;

	return elementArray;
}

function findAncestorNode(element, predicate) {
	while (element && predicate(element) === false)
		element = element.parentNode;

	return element;
}

function findDescendentNode(element, predicate) {
	for (var childNode = element.firstChild; childNode; childNode = childNode.nextSibling) {
		if (predicate(childNode))
			return childNode;

		var foundNode = window.findDescendentNode(childNode, predicate);

		if (foundNode != null)
			return foundNode;
	}

	return null;
}

function getElementText(element) {
	if (!element.firstChild)
		return null;

	return element.firstChild.nodeValue;
}

function setElementText(element, text) {
	window.clearElement(element);
	element.appendChild(element.ownerDocument.createTextNode(text));
}

function discardElement(element) {
	var leakBin = document.getElementById('leakBin');

	if (!leakBin)
		leakBin = window.addElement(document.body, "DIV", { id: "leakBin" }, "display: none;");

	leakBin.appendChild(element);
	window.clearElement(leakBin);
}

function clearElement(element) {
	if (element.innerHTML)
		element.innerHTML = "";
}

function addWindowLoadHandler(handler) {
	if (window.attachEvent)
		window.attachEvent("onload", handler);
	else
		window.addEventListener("load", handler, false);
}

function createTextBox(textRowCount, enterButtonID) {
	if (textRowCount == 1)
		return window.createElement("INPUT", { type: "text", onkeypress: function (event) { return handleKeyPressForSubmit(event, enterButtonID); } });
	else
		return window.createElement("TEXTAREA", { rows: textRowCount });
}

function showModalActivityBox(activityImageUrl, message, title, panelClassName) {
	var panel = window.createElement("DIV", { className: panelClassName || "ActivityBoxDialogContentPanel" });
	window.addElement(panel, "IMG", { src: activityImageUrl });
	window.addNonBreakingSpace(panel);
	window.addTextNode(panel, message);
	window.showModalDialog(panel, title);
}

function showModalMessageBox(message, title, closeText, closeCallback, panelClassName) {
	var paragraph = window.createElement("P", { className: panelClassName || "MessageBoxDialogContentPanel" }, null, message);
	window.showModalDialog(paragraph, title, closeText, closeCallback);
}

function showModalPrompt(message, buttonText, title, closeText, closeCallback, buttonCallback, panelClassName) {
	window.showModalButtonDialog([message], null, null, buttonText, title, closeText, closeCallback, buttonCallback, panelClassName || "PromptDialogContentPanel");
}

function showModalTextBox(beforeTexts, afterTexts, textRowCount, defaultText, buttonText, title, closeText, closeCallback, buttonCallback, panelClassName) {
	var textBox = window.createTextBox(textRowCount, "dialogButton");
	textBox.value = defaultText || "";

	var textBoxParagraph = window.createElement("P", null, null, textBox);

	window.showModalButtonDialog(beforeTexts, afterTexts, textBoxParagraph, buttonText, title, closeText, closeCallback, function () { buttonCallback(textBox.value.trim()); }, panelClassName);
	textBox.focus();
}

function showModalButtonDialog(beforeTexts, afterTexts, inputElement, buttonText, title, closeText, closeCallback, buttonCallback, panelClassName) {
	var panel = window.createElement("DIV", { className: panelClassName });

	for (var i in beforeTexts)
		this.addElement(panel, "P", null, null, beforeTexts[i]);

	if (inputElement)
		panel.appendChild(inputElement);

	for (var j in afterTexts)
		window.addElement(panel, "P", null, null, afterTexts[j]);

	var button = this.addElement(panel, "INPUT", { type: "button", id: "dialogButton", value: buttonText });
	button.onclick = function () { buttonCallback(); };

	window.showModalDialog(panel, title, closeText, closeCallback);
	button.focus();
}

function showModalPage(url, title, closeText, closeCallback, frameClassName) {
	var frame = window.createElement("IFRAME", { src: url, className: frameClassName });
	window.showModalDialog(frame, title, closeText, closeCallback);
}

function showModalDialog(content, title, closeText, closeCallback) {
	hideModalDialog();

	var modalDialog = window.addElement(document.body, "DIV", { id: "dialog", className: "ModalDialog" });
	var backgroundElement = window.addElement(modalDialog, "DIV", { className: "ModalDialogBackground" });
	var panelElement = window.addElement(modalDialog, "DIV", { className: "ModalDialogPanel" });
	var titleElement = window.addElement(panelElement, "DIV", { className: "ModalDialogTitle" }, null, title);
	var contentElement = window.addElement(panelElement, "DIV", { className: "ModalDialogContent" }, null, content);

	if (closeText) {
		var closeElement = window.addElement(panelElement, "A", { href: "#", className: "ModalDialogClose" }, null, closeText + " [X]");
		closeElement.onclick = function () { window.discardElement(modalDialog); if (closeCallback) closeCallback(); return false; };
	}

	var panelBounds = Sys.UI.DomElement.getBounds(panelElement);
	panelElement.style.left = Math.max(0, (window.document.documentElement.clientWidth / 2) - (panelBounds.width / 2)) + "px";
	panelElement.style.top = Math.max(0, (window.document.documentElement.clientHeight / 2) - (panelBounds.height / 2)) + "px";

	var dragOffset;

	panelElement.onmousedown = function (event) {
		var eventArgs = window.getEventArgs(event);
		var element = window.getElement(eventArgs);

		if (window.findAncestorNode(element, function (e) { return e == contentElement; }) == null) {
			var location = Sys.UI.DomElement.getLocation(panelElement);
			var mouseLocation = window.getMouseLocation(eventArgs);
			dragOffset = { x: location.x - mouseLocation.x, y: location.y - mouseLocation.y };
		}
	};

	panelElement.onmouseup = function (e) {
		dragOffset = null;
	};

	modalDialog.onmousemove = function (e) {
		if (dragOffset) {
			var ea = window.getEventArgs(e);
			var ml = window.getMouseLocation(ea);
			Sys.UI.DomElement.setLocation(panelElement, dragOffset.x + ml.x, dragOffset.y + ml.y);
		}
	};
}

function hideModalDialog() {
	var dialog = $get("dialog");

	if (dialog)
		window.discardElement(dialog);
}

function togglePopoutTextBox(popoutFromElement, label, textRowCount, buttonProc) {
	var textBox;

	var inputBuilderProc = function (panel) {
		textBox = window.createTextBox(textRowCount, "popoutButton");
		panel.appendChild(textBox);
	};

	var showProc = function () { textBox.focus(); };

	var outerButtonProc = function () { buttonProc(textBox.value.trim()); };

	window.togglePopoutInput(popoutFromElement, label, inputBuilderProc, showProc, outerButtonProc);
}

function togglePopoutDropDown(popoutFromElement, label, asyncPopulateProc, buttonProc) {
	var dropDown;

	var populateProcCallback = function (values) {
		for (var i in values)
			dropDown.add(new Option(values[i]));
	};

	var inputBuilderProc = function (panel) {
		dropDown = window.createElement("SELECT");
		dropDown.onkeypress = function (event) { return handleKeyPressForSubmit(event, "popoutButton"); };
		panel.appendChild(dropDown);

		asyncPopulateProc(populateProcCallback);
	};

	var showProc = function () { dropDown.focus(); };

	var outerButtonProc = function () { buttonProc(dropDown.options[dropDown.selectedIndex].value); };

	window.togglePopoutInput(popoutFromElement, label, inputBuilderProc, showProc, outerButtonProc);
}

function togglePopoutInput(popoutFromElement, label, inputBuilderProc, showProc, buttonProc) {
	var popoutPanel = $get("popout");

	if (popoutPanel != null) {
		window.discardElement(popoutPanel);
	} else {
		popoutPanel = window.addElement(document.body, "DIV", { id: "popout", className: "PopoutPanel" });

		if (label) {
			window.addTextNode(popoutPanel, label);
			window.addNonBreakingSpace(popoutPanel);
		}

		inputBuilderProc(popoutPanel);

		window.addNonBreakingSpace(popoutPanel);
		var button = window.addElement(popoutPanel, "INPUT", { type: "button", id: "popoutButton", value: ">" });

		button.onclick = function () {
			buttonProc();
			window.discardElement(popoutPanel);
		}

		var popoutFromElementBounds = Sys.UI.DomElement.getBounds(popoutFromElement);
		Sys.UI.DomElement.setLocation(popoutPanel, popoutFromElementBounds.x, popoutFromElementBounds.y + popoutFromElementBounds.height);

		var handler = function (event) {
			var element = window.getElement(window.getEventArgs(event));

			if (window.findAncestorNode(element, function (e) { return e == popoutPanel || e == popoutFromElement; }) == null) {
				$removeHandler(document.body, "mousedown", handler);
				window.discardElement(popoutPanel);
			}
		};

		$addHandler(document.body, "mousedown", handler);

		showProc();
	}
}

function addCell(row, properties, styles, content) {
	var cell = row.insertCell(-1);
	window.initializeElement(cell, properties, styles, content);
	return cell;
}

function createElement(tagName, properties, styles, content) {
	var element = document.createElement(tagName);
	window.initializeElement(element, properties, styles, content);
	return element;
}

function addElement(container, tagName, properties, styles, content) {
	var element = window.createElement(tagName, properties, styles, content);
	container.appendChild(element);
	return element;
}

function addRadioButtonPanel(container, labelText, groupName, value, checked, enabled) {
	var id = groupName + value;
	var panel = this.addElement(container, "DIV", null, "display: inline-block; margin: 0px;");
	this.addElement(panel, "INPUT", { id: id, type: "radio", value: value, name: groupName, checked: checked, disabled: !enabled });
	this.addNonBreakingSpace(panel);
	this.addElement(panel, "LABEL", { htmlFor: enabled ? id : null }, null, labelText);
	return panel;
}

function addCheckBoxPanel(container, labelText, checked, enabled) {
	var id = "cb" + Math.floor(Math.random() * 1000000000);
	var panel = this.addElement(container, "DIV", null, "display: inline-block; margin: 0px;");
	this.addElement(panel, "INPUT", { id: id, type: "checkbox", checked: checked, disabled: !enabled });
	this.addNonBreakingSpace(panel);
	this.addElement(panel, "LABEL", { htmlFor: enabled ? id : null }, null, labelText);
	return panel;
}

function initializeElement(element, properties, styles, content) {
	if (properties)
		for (var propertyName in properties)
			element[propertyName] = properties[propertyName];

	if (typeof styles == "string")
		element.style.cssText = styles;
	else if (styles)
		for (var styleName in styles)
			element.style[styleName] = styles[styleName];

	window.addContent(element, content);
}

function addContent(container, content) {
	if (typeof content == "string")
		window.setElementText(container, content);
	else if (content && content.length)
		for (var i = 0; content[i]; i++)
			window.addContent(container, content[i]);
	else if (content)
		container.appendChild(content);
}

function addTextNode(container, text) {
	var textNode = document.createTextNode(text);
	container.appendChild(textNode);
}

function addNonBreakingSpace(container) {
	window.addTextNode(container, "\u00a0");
}

function moveNodeUp(node) {
	var parentNode = node.parentNode;
	var nodeBefore = node.previousSibling
	parentNode.removeChild(node);
	parentNode.insertBefore(node, nodeBefore);
}

function moveNodeDown(node) {
	var parentNode = node.parentNode;
	var nodeAfterAfter = node.nextSibling.nextSibling;
	parentNode.removeChild(node);

	if (nodeAfterAfter)
		parentNode.insertBefore(node, nodeAfterAfter);
	else
		parentNode.appendChild(node);
}

function getCookieValue(name) {
	var cookieStrings = document.cookie.split(";");

	for (var i = 0; cookieStrings[i]; i++) {
		var cookieParts = cookieStrings[i].split("=");

		if (decodeURIComponent(cookieParts[0]).trim() == name)
			return decodeURIComponent(cookieParts[1]);
	}

	return null;
}

function setCookieValue(name, value, days) {
	var date = new Date();
	date.setDate(date.getDate() + days);
	var encodedValue = encodeURIComponent(value);
	document.cookie = String.format("{0}={1}; expires={2:F}", name, encodedValue, date);
}

function loadSettings() {
	var stringValue = window.getCookieValue("settings");

	if (stringValue == null)
		return new Object();

	return Sys.Serialization.JavaScriptSerializer.deserialize(stringValue);
}

function saveSettings(settings) {
	var stringValue = Sys.Serialization.JavaScriptSerializer.serialize(settings);
	window.setCookieValue("settings", stringValue, 3650);
}

function getDotNetMajorMinorVersion() {
	var version = 0.0;

	try {
		var matches = navigator.userAgent.match(/\.NET CLR [0-9.]+/g);

		for (var i = 0; matches[i]; i++) {
			var versionString = matches[i].match(/[0-9]\.[0-9]/);
			var versionInt = parseFloat(versionString);
			version = Math.max(versionInt, version);
		}
	} catch (ex) {
		// don't care
	}

	return version;
}

function getAbsoluteUrl(relativeUrl) {
	return window.location.href.slice(0, window.location.href.lastIndexOf("/") + 1) + relativeUrl;
}

function parseQueryString(queryString) {
	var map = new Object();

	if (queryString.length != 0) {
		if (queryString.charAt(0) == "?")
			queryString = queryString.slice(1);

		queryString = queryString.replace(/\+/g, ' ');

		var parts = queryString.split("&");

		for (var i = 0; parts[i]; i++) {
			var subParts = parts[i].split("=");
			var name = decodeURIComponent(subParts[0]);
			var value = decodeURIComponent(subParts[1]);
			map[name] = value;
		}
	}

	return map;
}

function getQueryString(map) {
	var queryString = new Sys.StringBuilder();
	var first = true;

	for (var key in map) {
		var value = map[key];
		var valueArray;

		if (value instanceof Array) {
			valueArray = value;
		} else {
			// watch out, in one JS version Array constructor with integer
			// will create that many elements
			valueArray = new Array();
			valueArray.push(value);
		}

		for (var i = 0; i < valueArray.length; i++) {
			queryString.append(first ? "?" : "&");
			queryString.append(encodeURIComponent(key));
			queryString.append("=");
			queryString.append(encodeURIComponent(valueArray[i]));
			first = false;
		}
	}

	return queryString.toString();
}

function launchDownload(url, downlevel) {
	if (downlevel)
		window.location.href = url;
	else
		window.addElement(document.body, "IFRAME", { src: url }, "display: none;");
}

function findListElement(array, predicate) {
	for (var i = 0; array[i]; i++)
		if (predicate(array[i]))
			return array[i];

	return null;
}

function filterList(array, predicate) {
	var newArray = new Array();

	for (var i = 0; array[i]; i++)
		if (predicate(array[i]))
			newArray.push(array[i]);

	return newArray;
}

function selectFromList(array, selector) {
	var resultArray = new Array();

	for (var i in array)
		resultArray[i] = selector(array[i]);

	return resultArray;
}

function coalesce(x, y) {
	return (x == null || x == undefined ? y : x);
}

function ClickOnceDirectLauncher() {
	this.name = ".NET ClickOnce Direct";

	if (window.clickOnceSupport != null)
		this.compatibility = 1.0;
	else if (window.getDotNetMajorMinorVersion() > 2.0)
		this.compatibility = 1.0;
	else if (window.navigator.mimeTypes["application/x-ms-application"] != null)
		this.compatibility = 1.0;
	else if (navigator.userAgent.match("Windows"))
		this.compatibility = 0.2;
	else
		this.compatibility = 0.0;

	this.efficiency = 1.0; // solid user experience, instant start

	this.launch = function (clientLaunchParameters) {
		var url = String.format("Bin/Elsinore.ScreenConnect.{0}Client.application{1}", clientLaunchParameters.y, window.getQueryString(clientLaunchParameters));
		var downlevel = window.navigator.userAgent.match("Chrome"); // Chrome plugin for ClickOnce will wack the tab without downlevel
		window.launchDownload(url, downlevel);
	};
}

function ClickOnceBootstrapLauncher() {
	this.name = ".NET ClickOnce Bootstrap";

	if (navigator.userAgent.match("Windows"))
		this.compatibility = 1.0;
	else
		this.compatibility = 0.0;

	if (getDotNetMajorMinorVersion() > 2.0)
		this.efficiency = 0.9; // solid user experience, not instant start
	else
		this.efficiency = 0.8; // solid user experience, not instant start, could have to install framework

	this.launch = function (clientLaunchParameters) {
		var urlParameters = new Object();
		urlParameters.ApplicationFile = String.format("Elsinore.ScreenConnect.{0}Client.application{1}", clientLaunchParameters.y, window.getQueryString(clientLaunchParameters));
		urlParameters.ApplicationUrl = getAbsoluteUrl("Bin");
		urlParameters.ApplicationName = clientLaunchParameters.a;
		urlParameters.OutputFileName = String.format("Elsinore.ScreenConnect.{0}Client.exe", clientLaunchParameters.y);
		urlParameters.PrerequisiteCode = "Microsoft.Net.Framework.2.0";
		window.launchDownload(String.format("Bootstrapper.axd{0}", getQueryString(urlParameters)));
	};
}

function WebStartLauncher() {
	this.name = "Java Web Start";

	this.compatibility = 0.0;

	if (window.ActiveXObject) {
		try {
			var obj = new ActiveXObject('JavaWebStart.isInstalled');

			if (obj != null)
				this.compatibility = 1.0;
		} catch (e) {
			// don't care
		}
	} else if (window.navigator.mimeTypes["application/x-java-jnlp-file"] != null || navigator.mimeTypes['application/x-java-applet;version=1.5'] != null) {
		this.compatibility = 1.0;
	}

	if (window.navigator.userAgent.match("Chrome"))
		this.efficiency = 0.6; // weaker user experience, not instant start, as of 7/2010 chrome required save then run
	else
		this.efficiency = 0.7; // weaker user experience, instant start

	this.launch = function (clientLaunchParameters) {
		var urlParameters = new Object();
		urlParameters.Title = String.format("{0} Guest Client", clientLaunchParameters.a);
		urlParameters.Vendor = "Elsinore Technologies Inc.";
		urlParameters.JavaVersion = "1.5+";
		urlParameters.OutputFileName = "Elsinore.ScreenConnect.Client.jnlp";
		urlParameters.Codebase = getAbsoluteUrl("Bin");
		urlParameters.JarFile = ["Elsinore.ScreenConnect.Client.jar", "Elsinore.ScreenConnect.Core.jar"];
		urlParameters.Argument = [clientLaunchParameters.a, clientLaunchParameters.h, clientLaunchParameters.p, clientLaunchParameters.s, clientLaunchParameters.k, clientLaunchParameters.y, clientLaunchParameters.t, clientLaunchParameters.e];

		if (clientLaunchParameters.n)
			urlParameters.Argument.push(clientLaunchParameters.n);

		var url = String.format("JavaWebStart.axd{0}", window.getQueryString(urlParameters));
		window.launchDownload(url);
	};
}

function AndroidLauncher() {
	this.name = "Java Android";

	if (navigator.userAgent.match("Android"))
		this.compatibility = 1.0;
	else
		this.compatibility = 0.0;

	this.efficiency = 1.0;

	this.launch = function (clientLaunchParameters) {
		window.launchMobileClient(clientLaunchParameters, "Launcher.AndroidPrompt", "AndroidConfirmVersion", "Launcher.AndroidInstallUrl");
	};
}

function iOSLauncher() {
	this.name = ".NET iOS";

	if (navigator.userAgent.match("iPhone") || navigator.userAgent.match("iPad") || navigator.userAgent.match("iPod") || navigator.userAgent.match("iOS"))
		this.compatibility = 1.0;
	else
		this.compatibility = 0.0;

	this.efficiency = 1.0;

	this.launch = function (clientLaunchParameters) {
		window.launchMobileClient(clientLaunchParameters, "Launcher.iOSPrompt", "iOSConfirmVersion", "Launcher.iOSInstallUrl");
	};
}

function getSortedLaunchers() {
	var launchers = new Array();
	launchers.push(new ClickOnceDirectLauncher());
	launchers.push(new ClickOnceBootstrapLauncher());
	launchers.push(new WebStartLauncher());
	launchers.push(new AndroidLauncher());
	launchers.push(new iOSLauncher());

	launchers = window.filterList(launchers, function (l) { return l.compatibility != 0.0; });
	launchers.sort(function (a, b) { var cd = b.compatibility - a.compatibility; return (cd != 0 ? cd : b.efficiency - a.efficiency); });

	return launchers;
}

function launchMobileClient(clientLaunchParameters, promptTextResourceKey, installedSettingsKey, installUrlResourceKey) {
	if (clientLaunchParameters.y == "Host") {
		var url;
		var settings = window.loadSettings();
		var alreadyInstalled = (settings[installedSettingsKey] == window.productVersion);

		if (alreadyInstalled || window.confirm(Resources[promptTextResourceKey])) {
			url = String.format("relay://{0}:{1}/{2}/{3}/{4}", clientLaunchParameters.h, clientLaunchParameters.p, clientLaunchParameters.s, window.encodeURIComponent(clientLaunchParameters.k), window.encodeURIComponent(clientLaunchParameters.n));

			if (!alreadyInstalled) {
				settings[installedSettingsKey] = window.productVersion;
				window.saveSettings(settings);
			}
		} else {
			url = Resources[installUrlResourceKey];
		}

		window.launchDownload(url, true);
	}
}

function rebuildTable(tableBodyID, tableRowIndex, dataArray, dataKeySelector, dataRowInitializer, dataRowUpdater, emptyRowBuilder) {
	var tableBody = $get(tableBodyID);

	if (dataArray == null || dataArray.length == 0) {
		if (emptyRowBuilder) {
			var emptyRow = tableBody.insertRow(0);
			tableRowIndex++;
			emptyRowBuilder(emptyRow);
		}
	} else {
		for (var i = 0; dataArray[i]; i++) {
			var dataKey = dataKeySelector(dataArray[i]);
			var dataRow = null;

			for (var j = tableRowIndex; tableBody.rows[j]; j++) {
				if (tableBody.rows[j].dataItem && dataKeySelector(tableBody.rows[j].dataItem) == dataKey) {
					dataRow = tableBody.rows[j];

					if (j != tableRowIndex) {
						tableBody.removeChild(dataRow);
						tableBody.insertBefore(dataRow, tableBody.rows[tableRowIndex]);
					}
				}
			}

			if (dataRow == null) {
				dataRow = tableBody.insertRow(tableRowIndex);
				dataRowInitializer(dataRow);
			}

			tableRowIndex++;

			dataRow.dataItem = dataArray[i];
			dataRowUpdater(dataRow, dataArray[i]);
		}
	}

	while (tableBody.rows[tableRowIndex])
		tableBody.deleteRow(tableRowIndex);
}

function getEventArgs(event) {
	return event || window.event;
}

function getElement(eventArgs) {
	return eventArgs.target ? eventArgs.target : eventArgs.srcElement;
}

function getMouseLocation(eventArgs) {
	if (eventArgs.pageX || eventArgs.pageY)
		return { x: eventArgs.pageX, y: eventArgs.pageY };

	return {
		x: eventArgs.clientX + document.body.scrollLeft - document.body.clientLeft,
		y: eventArgs.clientY + document.body.scrollTop - document.body.clientTop
	};
}

function getEventDataCommand(event) {
	var eventArgs = window.getEventArgs(event);
	var clickedElement = window.getElement(eventArgs);
	var dataElement = window.findAncestorNode(clickedElement, function (e) { return e.dataItem != undefined });
	var commandElement = window.findAncestorNode(clickedElement, function (e) { return e.commandName != undefined; });

	return {
		clickedElement: clickedElement,
		dataElement: dataElement,
		dataItem: (dataElement == null ? null : dataElement.dataItem),
		commandElement: commandElement,
		commandName: (commandElement == null ? null : commandElement.commandName)
	};
}

function getClickReturnValue(dataCommand) {
	return !(dataCommand && dataCommand.commandName && dataCommand.commandElement.tagName != "INPUT");
}

function getRandomChar(minCharCode, maxCharCode) {
	var charCode = minCharCode + Math.floor(Math.random() * (maxCharCode - minCharCode));
	return String.fromCharCode(charCode);
}

function isEnterKey(eventArgs) {
	return eventArgs && eventArgs.keyCode == 13;
}

function handleKeyPressForSubmit(event, buttonID) {
	var eventArgs = window.getEventArgs(event);

	if (window.isEnterKey(eventArgs)) {
		$get(buttonID).click();
		return false;
	}

	return true;
}

function cancelBubble(eventArgs) {
	if (eventArgs.stopPropagation)
		eventArgs.stopPropagation();
	else
		eventArgs.cancelBubble = true;
}

function isIE(minVersion, maxVersion) {
	var matches = navigator.userAgent.match(/\MSIE ([0-9.]+)/);

	if (matches == null)
		return false;
	else if (minVersion == 0 && maxVersion == 0)
		return true;

	var version = parseFloat(matches[1]);

	if (minVersion != 0 && version < minVersion)
		return false;
	else if (maxVersion != 0 && version > maxVersion)
		return false;

	return true;
}

function canBrowserAutoDownload() {
	return !window.isIE();
}

function addLinkButtonPanel(container, buttonDefinitions) {
	var panel = window.addElement(container, "DIV", { className: "LinkButtonPanel" });

	for (var i in buttonDefinitions) {
		var button = window.addElement(panel, "A", { href: "#", commandName: buttonDefinitions[i].commandName, title: buttonDefinitions[i].showText ? null : buttonDefinitions[i].text });

		if (buttonDefinitions[i].imageUrl)
			window.addElement(button, "IMG", { src: buttonDefinitions[i].imageUrl, alt: buttonDefinitions[i].text });

		if (buttonDefinitions[i].imageUrl && buttonDefinitions[i].text && buttonDefinitions[i].showText)
			window.addNonBreakingSpace(button);

		if (buttonDefinitions[i].text && buttonDefinitions[i].showText)
			window.addElement(button, "SPAN", null, null, buttonDefinitions[i].text);

		if (buttonDefinitions[i].showPopoutGlyph)
			window.addElement(button, "IMG", { src: "Images/Popout.png" });
	}

	return panel;
}

function ensureCssClass(element, className, hasOrNot) {
	if (hasOrNot && !Sys.UI.DomElement.containsCssClass(element, className))
		Sys.UI.DomElement.addCssClass(element, className);
	else if (!hasOrNot)
		Sys.UI.DomElement.removeCssClass(element, className);
}

function formatDuration(duration) {
	var days = Math.floor(duration / 86400); duration %= 86400;
	var hours = Math.floor(duration / 3600); duration %= 3600;
	var minutes = Math.floor(duration / 60); duration %= 60;
	var string = "";

	if (days != 0)
		string += days + "d ";

	if (hours != 0)
		string += hours + "h ";

	return string + minutes + "m";
}

function fadeToOpacity(element, toOpacity, stepDelay, stepAmount, initialDelay, lastOpacity) {
	window.clearTimeout(window.fadeTimeoutID);

	if (!lastOpacity && initialDelay) {
		window.fadeTimeoutID = window.setTimeout(function () { window.fadeToOpacity(element, toOpacity, stepDelay, stepAmount) }, initialDelay);
	} else {
		if (!lastOpacity)
			lastOpacity = (element.style.opacity != undefined && element.style.opacity.length != 0 ? parseFloat(element.style.opacity) : 1);

		if (lastOpacity != toOpacity) {
			var newOpacity = lastOpacity + (stepAmount * (lastOpacity > toOpacity ? -1 : 1));
			element.style.opacity = newOpacity;
			Sys.UI.DomElement.setVisible(element, newOpacity != 0);
			window.fadeTimeoutID = window.setTimeout(function () { window.fadeToOpacity(element, toOpacity, stepDelay, stepAmount, null, newOpacity) }, stepDelay);
		} else {
			window.fadeTimeoutID = null;
		}
	}
}

function combineObjects() {
	var newObject = new Object();

	window.findListElement(arguments, function (i) {
		for (var j in i)
			newObject[j] = i[j]
	});

	return newObject;
}

