0% found this document useful (0 votes)
16K views

On Data

This document defines several JavaScript functions and classes used to implement asynchronous communication between a client and server. It includes functions for initializing and configuring the client engine, analyzing the client environment, processing messages, and handling errors. Key classes defined are EchoAsyncMonitor for asynchronous polling, EchoClientAnalyzer for analyzing the client, and EchoClientEngine for initializing and processing messages.

Uploaded by

Alexmbfis
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16K views

On Data

This document defines several JavaScript functions and classes used to implement asynchronous communication between a client and server. It includes functions for initializing and configuring the client engine, analyzing the client environment, processing messages, and handling errors. Key classes defined are EchoAsyncMonitor for asynchronous polling, EchoClientAnalyzer for analyzing the client, and EchoClientEngine for initializing and processing messages.

Uploaded by

Alexmbfis
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 30

function EchoAsyncMonitor() { } EchoAsyncMonitor.timeInterval = 500; EchoAsyncMonitor.pollServiceRequest = "?serviceId=Echo.AsyncMonitor"; EchoAsyncMonitor.timeoutId = null; EchoAsyncMonitor.connect = function() { var conn = new EchoHttpConnection(EchoClientEngine.

baseServerUri + EchoAsyncMoni tor.pollServiceRequest, "GET"); conn.responseHandler = EchoAsyncMonitor.responseHandler; conn.invalidResponseHandler = EchoAsyncMonitor.invalidResponseHandler; conn.connect(); }; EchoAsyncMonitor.invalidResponseHandler = function() { alert("Invalid response from server to asynchronous polling connection."); }; EchoAsyncMonitor.start = function() { if (!EchoServerTransaction.active) { EchoAsyncMonitor.timeoutId = window.setTimeout("EchoAsyncMonitor.connect();", EchoAsyncMonitor.timeInterval); } }; EchoAsyncMonitor.stop = function() { if (EchoAsyncMonitor.timeoutId) { window.clearTimeout(EchoAsyncMonitor.timeoutId); EchoAsyncMonitor.timeoutId = null; } }; EchoAsyncMonitor.responseHandler = function(conn) { if ("true" == conn.getResponseXml().documentElement.getAttribute("request-sync") ) { EchoServerTransaction.connect(); } else { EchoAsyncMonitor.start(); } }; function EchoClientAnalyzer() { } EchoClientAnalyzer.analyze = function() { var messagePartElement = EchoClientMessage.getMessagePart("EchoClientAnalyzer"); EchoClientAnalyzer.setTextProperty(messagePartElement, "navigatorAppName", windo w.navigator.appName); EchoClientAnalyzer.setTextProperty(messagePartElement, "navigatorAppVersion", wi ndow.navigator.appVersion); EchoClientAnalyzer.setTextProperty(messagePartElement, "navigatorAppCodeName", w indow.navigator.appCodeName); EchoClientAnalyzer.setBooleanProperty(messagePartElement, "navigatorCookieEnable d", window.navigator.cookieEnabled); EchoClientAnalyzer.setBooleanProperty(messagePartElement, "navigatorJavaEnabled" , window.navigator.javaEnabled()); EchoClientAnalyzer.setTextProperty(messagePartElement, "navigatorLanguage", window.navigator.language ? window.navigator.language : window.navigator.userLan guage); EchoClientAnalyzer.setTextProperty(messagePartElement, "navigatorPlatform", wind ow.navigator.platform); EchoClientAnalyzer.setTextProperty(messagePartElement, "navigatorUserAgent", win dow.navigator.userAgent); if (window.screen) { EchoClientAnalyzer.setIntegerProperty(messagePartElement, "screenWidth", window. screen.width); EchoClientAnalyzer.setIntegerProperty(messagePartElement, "screenHeight", window .screen.height);

EchoClientAnalyzer.setIntegerProperty(messagePartElement, "screenColorDepth", wi ndow.screen.colorDepth); } EchoClientAnalyzer.setIntegerProperty(messagePartElement, "utcOffset", 0 - parse Int((new Date()).getTimezoneOffset())); }; EchoClientAnalyzer.setBooleanProperty = function(messagePartElement, propertyNam e, propertyValue) { propertyElement = messagePartElement.ownerDocument.createElement("property"); propertyElement.setAttribute("type", "boolean"); propertyElement.setAttribute("name", propertyName); propertyElement.setAttribute("value", propertyValue ? "true" : "false"); messagePartElement.appendChild(propertyElement); }; EchoClientAnalyzer.setIntegerProperty = function(messagePartElement, propertyNam e, propertyValue) { var intValue = parseInt(propertyValue); if (isNaN(intValue)) { return; } propertyElement = messagePartElement.ownerDocument.createElement("property"); propertyElement.setAttribute("type", "integer"); propertyElement.setAttribute("name", propertyName); propertyElement.setAttribute("value", intValue); messagePartElement.appendChild(propertyElement); }; EchoClientAnalyzer.setTextProperty = function(messagePartElement, propertyName, propertyValue) { propertyElement = messagePartElement.ownerDocument.createElement("property"); propertyElement.setAttribute("type", "text"); propertyElement.setAttribute("name", propertyName); propertyElement.setAttribute("value", propertyValue); messagePartElement.appendChild(propertyElement); }; function EchoClientConfiguration() { } EchoClientConfiguration.MessageProcessor = function() { }; EchoClientConfiguration.MessageProcessor.process = function(messagePartElement) { for (var i = 0; i < messagePartElement.childNodes.length; ++i) { if (messagePartElement.childNodes[i].nodeType == 1) { switch (messagePartElement.childNodes[i].tagName) { case "store": EchoClientConfiguration.MessageProcessor.processStore(messagePartElement.childNo des[i]); break; } } } }; EchoClientConfiguration.MessageProcessor.processStore = function(storeElement) { var propertyElements = storeElement.getElementsByTagName("property"); for (var i = 0; i < propertyElements.length; ++i) { var name = propertyElements[i].getAttribute("name"); var value = propertyElements[i].getAttribute("value"); EchoClientConfiguration.propertyMap[name] = value; } }; EchoClientConfiguration.propertyMap = new Array(); EchoClientConfiguration.propertyMap["defaultOutOfSyncErrorMessage"] = "A synchronization error has occurred. Click \"Ok\" to re-synchronize.";

EchoClientConfiguration.propertyMap["defaultServerErrorMessage"] = "An application error has occurred. Your session has been reset."; EchoClientConfiguration.propertyMap["defaultSessionExpirationMessage"] = "Your session has been reset due to inactivity."; function EchoClientEngine() { } EchoClientEngine.baseServerUri = null; EchoClientEngine.debugEnabled = true; EchoClientEngine.loadStatus = 2; EchoClientEngine.transactionId = ""; EchoClientEngine.configure = function() { if (EchoClientProperties.get("quirkCssPositioningOneSideOnly")) { EchoVirtualPosition.init(); document.documentElement.style.overflow = "hidden"; } }; EchoClientEngine.dispose = function() { EchoEventProcessor.dispose(); EchoDomPropertyStore.disposeAll(); }; EchoClientEngine.init = function(baseServerUri, debugEnabled) { EchoClientEngine.baseServerUri = baseServerUri; EchoClientEngine.debugEnabled = debugEnabled; if (EchoClientEngine.debugEnabled && window.location.search && window.location.search.toLowerCase().indexOf("debug") != -1) { EchoDebugManager.launch(); } EchoClientMessage.setInitialize(); EchoClientAnalyzer.analyze(); EchoServerTransaction.connect(); EchoDomUtil.addEventListener(window, "unload", EchoClientEngine.dispose); EchoClientEngine.incrementLoadStatus(); }; EchoClientEngine.processClientError = function(message, ex) { var errorText; if (ex instanceof Error) { errorText = "Error Name: " + ex.name + "\n" + "Error Message: " + ex.message; } else { errorText = "Error: " + ex; } alert("The following client application error has occurred:\n\n" + "---------------------------------\n" + message + "\n\n" + errorText + "\n" + "---------------------------------\n\n" + "Please contact your server administrator.\n\n"); }; EchoClientEngine.processSessionExpiration = function() { var message = EchoClientConfiguration.propertyMap["sessionExpirationMessage"]; var uri = EchoClientConfiguration.propertyMap["sessionExpirationUri"]; if (message || uri) { if (message) { alert(message); } if (uri) { window.location.href = uri; } else { window.location.reload(); }

} else { message = EchoClientConfiguration.propertyMap["defaultSessionExpirationMessage"] ; alert(message); window.location.reload(); } }; EchoClientEngine.processServerError = function() { var message = EchoClientConfiguration.propertyMap["serverErrorMessage"]; var uri = EchoClientConfiguration.propertyMap["serverErrorUri"]; if (message || uri) { if (message) { alert(message); } if (uri) { window.location.href = uri; } else { if (EchoServerMessage.transactionCount > 0) { window.location.reload(); } } } else { message = EchoClientConfiguration.propertyMap["defaultServerErrorMessage"]; alert(message); if (EchoServerMessage.transactionCount > 0) { window.location.reload(); } } }; EchoClientEngine.disableLoadStatus = function() { if (EchoClientEngine.loadStatus != -1) { EchoClientEngine.loadStatus = -1; EchoClientEngine.renderLoadStatus(); } }; EchoClientEngine.incrementLoadStatus = function() { if (EchoClientEngine.loadStatus != -1) { ++EchoClientEngine.loadStatus; EchoClientEngine.renderLoadStatus(); } }; EchoClientEngine.renderLoadStatus = function() { var loadStatusDivElement = document.getElementById("loadstatus"); if (!loadStatusDivElement) { return; } if (EchoClientEngine.loadStatus == -1) { loadStatusDivElement.parentNode.removeChild(loadStatusDivElement); } else { var text = ""; for (var i = 0; i < EchoClientEngine.loadStatus; ++i) { text += "|"; } loadStatusDivElement.removeChild(loadStatusDivElement.firstChild); loadStatusDivElement.appendChild(document.createTextNode(text)); } }; EchoClientEngine.updateTransactionId = function(newValue) { EchoClientEngine.transactionId = newValue; EchoClientMessage.messageDocument.documentElement.setAttribute("trans-id", EchoC

lientEngine.transactionId); }; EchoClientEngine.verifyInput = function(element, allowInputDuringTransaction) { if (!allowInputDuringTransaction && EchoServerTransaction.active) { return false; } if (!EchoModalManager.isElementInModalContext(element)) { return false; } if (EchoDomPropertyStore.getPropertyValue(element, "EchoClientEngine.inputDisabl ed")) { return false; } return true; }; function EchoClientMessage() { } EchoClientMessage.messageDocument = null; EchoClientMessage.createPropertyElement = function(componentId, propertyName) { var messagePartElement = EchoClientMessage.getMessagePart("EchoPropertyUpdate"); var propertyElements = messagePartElement.getElementsByTagName("property"); var propertyElement = null; for (var i = 0; i < propertyElements.length; ++i) { if (componentId == propertyElements[i].getAttribute("component-id") && propertyName == propertyElements[i].getAttribute("name")) { propertyElement = propertyElements[i]; break; } } if (!propertyElement) { propertyElement = messagePartElement.ownerDocument.createElement("property"); propertyElement.setAttribute("component-id", componentId); propertyElement.setAttribute("name", propertyName); messagePartElement.appendChild(propertyElement); } return propertyElement; }; EchoClientMessage.getMessagePart = function(processor) { var messagePartElements = EchoClientMessage.messageDocument.getElementsByTagName ("message-part"); for (var i = 0; i < messagePartElements.length; ++i) { if (messagePartElements[i].getAttribute("processor") == processor) { return messagePartElements[i]; } } var messagePartElement = EchoClientMessage.messageDocument.createElement("messag e-part"); messagePartElement.setAttribute("processor", processor); EchoClientMessage.messageDocument.documentElement.appendChild(messagePartElement ); return messagePartElement; }; EchoClientMessage.getPropertyValue = function(componentId, propertyName) { var messagePartElement = EchoClientMessage.getMessagePart("EchoPropertyUpdate"); var propertyElements = messagePartElement.getElementsByTagName("property"); for (var i = 0; i < propertyElements.length; ++i) { if (componentId == propertyElements[i].getAttribute("component-id") && propertyName == propertyElements[i].getAttribute("name")) { return propertyElements[i].getAttribute("value"); } }

return null; }; EchoClientMessage.removePropertyElement = function(componentId, propertyName) { var messagePartElement = EchoClientMessage.getMessagePart("EchoPropertyUpdate"); var propertyElements = messagePartElement.getElementsByTagName("property"); var propertyElement = null; for (var i = 0; i < propertyElements.length; ++i) { if (componentId == propertyElements[i].getAttribute("component-id") && propertyName == propertyElements[i].getAttribute("name")) { propertyElement = propertyElements[i]; break; } } if (propertyElement) { messagePartElement.removeChild(propertyElement); } }; EchoClientMessage.reset = function() { EchoClientMessage.messageDocument = null; EchoClientMessage.messageDocument = EchoDomUtil.createDocument("http://www.nextapp.com/products/echo2/climsg", "cl ient-message"); }; EchoClientMessage.setActionValue = function(componentId, actionName, actionValue ) { var messagePartElement = EchoClientMessage.getMessagePart("EchoAction"); var actionElement = messagePartElement.ownerDocument.createElement("action"); actionElement.setAttribute("component-id", componentId); actionElement.setAttribute("name", actionName); if (actionValue !== undefined) { actionElement.setAttribute("value", actionValue); } messagePartElement.appendChild(actionElement); EchoDebugManager.updateClientMessage(); return actionElement; }; EchoClientMessage.setPropertyValue = function(componentId, propertyName, newValu e) { var propertyElement = EchoClientMessage.createPropertyElement(componentId, prope rtyName); propertyElement.setAttribute("value", newValue); EchoDebugManager.updateClientMessage(); }; EchoClientMessage.setInitialize = function() { EchoClientMessage.messageDocument.documentElement.setAttribute("type", "initiali ze"); }; function EchoClientProperties() { } EchoClientProperties.propertyMap = new Array(); EchoClientProperties.MessageProcessor = function() { }; EchoClientProperties.MessageProcessor.process = function(messagePartElement) { for (var i = 0; i < messagePartElement.childNodes.length; ++i) { if (messagePartElement.childNodes[i].nodeType == 1) { switch (messagePartElement.childNodes[i].tagName) { case "store": EchoClientProperties.MessageProcessor.processStore(messagePartElement.childNodes [i]); break; } }

} }; EchoClientProperties.MessageProcessor.processStore = function(storeElement) { var propertyElements = storeElement.getElementsByTagName("property"); for (var i = 0; i < propertyElements.length; ++i) { var name = propertyElements[i].getAttribute("name"); var value = propertyElements[i].getAttribute("value"); if (value == "true") { value = true; } else if (value == "false") { value = false; } EchoClientProperties.propertyMap[name] = value; } EchoClientEngine.configure(); }; EchoClientProperties.get = function(name) { return EchoClientProperties.propertyMap[name]; }; EchoCollectionsMap = function() { this.removeCount = 0; this.garbageCollectionInterval = 250; this.associations = new Array(); }; EchoCollectionsMap.prototype.get = function(key) { return this.associations[key]; }; EchoCollectionsMap.prototype.put = function(key, value) { if (value === null) { this.remove(key); return; } this.associations[key] = value; }; EchoCollectionsMap.prototype.garbageCollect = function() { this.removeCount = 0; var newAssociations = new Array(); var i = 0; for (var key in this.associations) { newAssociations[key] = this.associations[key]; ++i; } this.associations = newAssociations; }; EchoCollectionsMap.prototype.remove = function(key) { delete this.associations[key]; ++this.removeCount; if (this.removeCount >= this.garbageCollectionInterval) { this.garbageCollect(); } }; function EchoCssUtil() { } EchoCssUtil.addRule = function(selectorText, style) { var ss = document.styleSheets[0]; if (ss.insertRule) { ss.insertRule(selectorText + " {" + style + "}", ss.cssRules.length); } else if (ss.addRule) { ss.addRule(selectorText, style); } };

EchoCssUtil.applyStyle = function(element, cssText) { var styleProperties = cssText.split(";"); var styleData = new Array(); for (var i = 0; i < styleProperties.length; ++i) { var separatorIndex = styleProperties[i].indexOf(":"); if (separatorIndex == -1) { continue; } var attributeName = styleProperties[i].substring(0, separatorIndex); var propertyName = EchoDomUtil.cssAttributeNameToPropertyName(attributeName); var propertyValue = styleProperties[i].substring(separatorIndex + 1); element.style[propertyName] = propertyValue; } }; EchoCssUtil.applyTemporaryStyle = function(element, cssStyleText) { if (!EchoDomPropertyStore.getPropertyValue(element, "EchoCssUtil.originalStyle") ) { if (EchoDomUtil.getCssText(element)) { EchoDomPropertyStore.setPropertyValue(element, "EchoCssUtil.originalStyle", Echo DomUtil.getCssText(element)); } else { EchoDomPropertyStore.setPropertyValue(element, "EchoCssUtil.originalStyle", "-") ; } } EchoCssUtil.applyStyle(element, cssStyleText); }; EchoCssUtil.removeRule = function(selectorText) { selectorText = selectorText.toLowerCase(); var ss = document.styleSheets[0]; var rules = ss.cssRules ? ss.cssRules : ss.rules; for (var i = 0; i < rules.length; ++i) { if (rules[i].type == 1 && rules[i].selectorText.toLowerCase() == selectorText) { if (ss.deleteRule) { ss.deleteRule(i); break; } else if (ss.removeRule) { ss.deleteRule(i); break; } else { alert("rem fail"); } } } }; EchoCssUtil.restoreOriginalStyle = function(element) { var originalStyle = EchoDomPropertyStore.getPropertyValue(element, "EchoCssUtil. originalStyle"); if (!originalStyle) { return; } EchoDomUtil.setCssText(element, originalStyle == "-" ? "" : originalStyle); EchoDomPropertyStore.setPropertyValue(element, "EchoCssUtil.originalStyle", null ); }; EchoCssUtil.Bounds = function(element) { this.left = 0; this.top = 0; this.width = element.offsetWidth; this.height = element.offsetHeight;

while (element != null) { if (element.scrollTop) { this.top -= element.scrollTop; } if (element.scrollLeft) { this.left -= element.scrollLeft; } this.left += element.offsetLeft; this.top += element.offsetTop; element = element.offsetParent; } }; EchoCssUtil.Bounds.prototype.toString = function() { return "(" + this.left + ", " + this.top + ") [" + this.width + "x" + this.heigh t + "]"; }; function EchoDebugManager() { } EchoDebugManager.debugWindow = null; EchoDebugManager.consoleWrite = function(message) { if (!EchoDebugManager.debugWindow || EchoDebugManager.debugWindow.closed) { return; } EchoDebugManager.debugWindow.EchoDebug.Console.write(message); }; EchoDebugManager.launch = function() { EchoDebugManager.debugWindow = window.open(EchoClientEngine.baseServerUri + "?se rviceId=Echo.Debug", "EchoDebug", "width=400,height=650,resizable=yes", true); }; EchoDebugManager.updateClientMessage = function() { if (!EchoDebugManager.debugWindow || EchoDebugManager.debugWindow.closed) { return; } EchoDebugManager.debugWindow.EchoDebug.Sync.displayClientMessage(EchoClientMessa ge.messageDocument); }; EchoDebugManager.updateServerMessage = function() { if (!EchoDebugManager.debugWindow || EchoDebugManager.debugWindow.closed) { return; } EchoDebugManager.debugWindow.EchoDebug.Sync.displayServerMessage(EchoServerMessa ge.messageDocument); }; function EchoDomPropertyStore() { } EchoDomPropertyStore.MessageProcessor = function() { }; EchoDomPropertyStore.MessageProcessor.process = function(messagePartElement) { for (var i = 0; i < messagePartElement.childNodes.length; ++i) { if (messagePartElement.childNodes[i].nodeType == 1) { switch (messagePartElement.childNodes[i].tagName) { case "store-property": EchoDomPropertyStore.MessageProcessor.processStoreProperty(messagePartElement.ch ildNodes[i]); break; } } } }; EchoDomPropertyStore.MessageProcessor.processStoreProperty = function(storePrope rtyElement) { var propertyName = storePropertyElement.getAttribute("name");

var propertyValue = storePropertyElement.getAttribute("value"); var items = storePropertyElement.getElementsByTagName("item"); for (var i = 0; i < items.length; ++i) { var elementId = items[i].getAttribute("eid"); EchoDomPropertyStore.setPropertyValue(elementId, propertyName, propertyValue); } }; EchoDomPropertyStore.dispose = function(element) { if (typeof element == "string") { element = document.getElementById(element); } if (!element) { throw new Error("Element not found."); } if (element.echoDomPropertyStore) { for (var elementProperty in element.echoDomPropertyStore) { delete element.echoDomPropertyStore[elementProperty]; } } element.echoDomPropertyStore = undefined; }; EchoDomPropertyStore.disposeAll = function() { EchoDomPropertyStore.disposeAllRecurse(document.documentElement); }; EchoDomPropertyStore.disposeAllRecurse = function(element) { if (element.echoDomPropertyStore) { for (var elementProperty in element.echoDomPropertyStore) { delete element.echoDomPropertyStore[elementProperty]; } } element.echoDomPropertyStore = undefined; for (var childElement = element.firstChild; childElement; childElement = childEl ement.nextSibling) { if (childElement.nodeType == 1) { EchoDomPropertyStore.disposeAllRecurse(childElement); } } }; EchoDomPropertyStore.getPropertyValue = function(element, propertyName) { if (typeof element == "string") { element = document.getElementById(element); } if (!element) { return null; } if (element.echoDomPropertyStore) { return element.echoDomPropertyStore[propertyName]; } else { return null; } }; EchoDomPropertyStore.setPropertyValue = function(element, propertyName, property Value) { if (typeof element == "string") { element = document.getElementById(element); } if (!element) { return; } if (!element.echoDomPropertyStore) {

element.echoDomPropertyStore = new Array(); } element.echoDomPropertyStore[propertyName] = propertyValue; }; function EchoDomUpdate() { } EchoDomUpdate.MessageProcessor = function() { }; EchoDomUpdate.MessageProcessor.process = function(messagePartElement) { for (var i = 0; i < messagePartElement.childNodes.length; ++i) { if (messagePartElement.childNodes[i].nodeType == 1) { switch (messagePartElement.childNodes[i].tagName) { case "dom-add": this.processAdd(messagePartElement.childNodes[i]); break; case "dom-remove": this.processRemove(messagePartElement.childNodes[i]); break; case "dom-remove-children": this.processRemoveChildren(messagePartElement.childNodes[i]); break; case "attribute-update": this.processAttributeUpdate(messagePartElement.childNodes[i]); break; case "style-update": this.processStyleUpdate(messagePartElement.childNodes[i]); break; case "stylesheet-add-rule": this.processStyleSheetAddRule(messagePartElement.childNodes[i]); break; case "stylesheet-remove-rule": this.processStyleSheetRemoveRule(messagePartElement.childNodes[i]); break; } } } }; EchoDomUpdate.MessageProcessor.processAdd = function(domAddElement) { var contentElements = domAddElement.getElementsByTagName("content"); for (var i = 0; i < contentElements.length; ++i) { var parentId = contentElements[i].getAttribute("parent-id"); var siblingId = contentElements[i].getAttribute("sibling-id"); var parentElement = document.getElementById(parentId); var siblingElement = null; if (siblingId) { siblingElement = document.getElementById(siblingId); if (!siblingElement) { throw new EchoDomUpdate.TargetNotFoundException("Add", "sibling", siblingId); } } if (!parentElement) { throw new EchoDomUpdate.TargetNotFoundException("Add", "parent", parentId); } for (var j = 0; j < contentElements[i].childNodes.length; ++j) { var importedNode = EchoDomUtil.importNode(parentElement.ownerDocument, contentEl ements[i].childNodes[j], true); var newElementId = importedNode.getAttribute("id"); if (!newElementId) { throw "Cannot add element without id attribute."; } if (document.getElementById(newElementId)) { throw "Element " + newElementId + " already exists in document; cannot add.";

} if (siblingElement) { parentElement.insertBefore(importedNode, siblingElement); } else { parentElement.appendChild(importedNode); } } } }; EchoDomUpdate.MessageProcessor.processAttributeUpdate = function(attributeUpdate Element) { var targetId = attributeUpdateElement.getAttribute("target-id"); var targetElement = document.getElementById(targetId); if (!targetElement) { throw new EchoDomUpdate.TargetNotFoundException("AttributeUpdate", "target", tar getId); } targetElement[attributeUpdateElement.getAttribute("name")] = attributeUpdateElem ent.getAttribute("value"); }; EchoDomUpdate.MessageProcessor.processRemove = function(domRemoveElement) { var targetId = domRemoveElement.getAttribute("target-id"); var targetElement = document.getElementById(targetId); if (!targetElement) { return; } targetElement.parentNode.removeChild(targetElement); }; EchoDomUpdate.MessageProcessor.processRemoveChildren = function(domRemoveElement ) { var targetId = domRemoveElement.getAttribute("target-id"); var targetElement = document.getElementById(targetId); if (!targetElement) { return; } var childNode = targetElement.firstChild; while (childNode) { var nextChildNode = childNode.nextSibling; targetElement.removeChild(childNode); childNode = nextChildNode; } }; EchoDomUpdate.MessageProcessor.processStyleSheetAddRule = function(addRuleElemen t) { var selectorText = addRuleElement.getAttribute("selector"); var style = addRuleElement.getAttribute("style"); EchoCssUtil.addRule(selectorText, style); }; EchoDomUpdate.MessageProcessor.processStyleSheetRemoveRule = function(removeRule Element) { var selectorText = removeRuleElement.getAttribute("selector"); EchoCssUtil.removeRule(selectorText); }; EchoDomUpdate.MessageProcessor.processStyleUpdate = function(styleUpdateElement) { var targetId = styleUpdateElement.getAttribute("target-id"); var targetElement = document.getElementById(targetId); if (!targetElement) { throw new EchoDomUpdate.TargetNotFoundException("StyleUpdate", "target", targetI d);

} targetElement.style[styleUpdateElement.getAttribute("name")] = styleUpdateElemen t.getAttribute("value"); }; EchoDomUpdate.TargetNotFoundException = function(updateType, targetType, targetI d) { this.targetId = targetId; this.targetType = targetType; this.updateType = updateType; }; EchoDomUpdate.TargetNotFoundException.prototype.toString = function() { return "Failed to perform \"" + this.updateType + "\": " + this.targetType + " e lement \"" + this.targetId + "\" not found."; }; function EchoDomUtil() { } EchoDomUtil.attributeToPropertyMap = null; EchoDomUtil.addEventListener = function(eventSource, eventType, eventListener, u seCapture) { if (eventSource.addEventListener) { eventSource.addEventListener(eventType, eventListener, useCapture); } else if (eventSource.attachEvent) { eventSource.attachEvent("on" + eventType, eventListener); } }; EchoDomUtil.initAttributeToPropertyMap = function() { var m = new Array(); m["accesskey"] = "accessKey"; m["cellpadding"] = "cellPadding"; m["cellspacing"] = "cellSpacing"; m["class"] = "className"; m["codebase"] = "codeBase"; m["codetype"] = "codeType"; m["colspan"] = "colSpan"; m["datetime"] = "dateTime"; m["frameborder"] = "frameBorder"; m["longdesc"] = "longDesc"; m["marginheight"] = "marginHeight"; m["marginwidth"] = "marginWidth"; m["maxlength"] = "maxLength"; m["noresize"] = "noResize"; m["noshade"] = "noShade"; m["nowrap"] = "noWrap"; m["readonly"] = "readOnly"; m["rowspan"] = "rowSpan"; m["tabindex"] = "tabIndex"; m["usemap"] = "useMap"; m["valign"] = "vAlign"; m["valueType"] = "valueType"; EchoDomUtil.attributeToPropertyMap = m; }; EchoDomUtil.createDocument = function(namespaceUri, qualifiedName) { if (document.implementation && document.implementation.createDocument) { var dom = document.implementation.createDocument(namespaceUri, qualifiedName, nu ll); if (!dom.documentElement) { dom.appendChild(dom.createElement(qualifiedName)); } return dom; } else if (window.ActiveXObject) { var createdDocument = new ActiveXObject("Microsoft.XMLDOM");

var documentElement = createdDocument.createElement(qualifiedName); createdDocument.appendChild(documentElement); return createdDocument; } else { throw "Unable to create new Document."; } }; EchoDomUtil.cssAttributeNameToPropertyName = function(attribute) { var segments = attribute.split("-"); var out = segments[0]; for (var i = 1; i < segments.length; ++i) { out += segments[i].substring(0, 1).toUpperCase(); out += segments[i].substring(1); } return out; }; EchoDomUtil.fixSafariAttrs = function(node) { if (node.nodeType == 1) { for (i = 0; i < node.attributes.length; ++i) { var attribute = node.attributes[i]; node.setAttribute(attribute.name, attribute.value.replace("\x26\x2338\x3B", "&") ); } } for (var childNode = node.firstChild; childNode; childNode = childNode.nextSibli ng) { EchoDomUtil.fixSafariAttrs(childNode); } }; EchoDomUtil.getComponentId = function(elementId) { if ("c_" != elementId.substring(0, 2)) { return null; } var extensionStart = elementId.indexOf("_", 2); if (extensionStart == -1) { return elementId; } else { return elementId.substring(0, extensionStart); } }; EchoDomUtil.getCssText = function(element) { if (EchoClientProperties.get("quirkOperaNoCssText")) { return element.getAttribute("style"); } else { return element.style.cssText; } } EchoDomUtil.getEventTarget = function(e) { return e.target ? e.target : e.srcElement; }; EchoDomUtil.importNode = function(targetDocument, sourceNode, importChildren) { if (targetDocument.importNode) { return targetDocument.importNode(sourceNode, importChildren); } else { return EchoDomUtil.importNodeImpl(targetDocument, sourceNode, importChildren); } }; EchoDomUtil.importNodeImpl = function(targetDocument, sourceNode, importChildren ) { var targetNode;

if (importChildren || !sourceNode.hasChildNodes()) { targetNode = EchoDomUtil.importNodeByInnerHtml(targetDocument, sourceNode, impor tChildren); if (targetNode != null) { return targetNode; } } targetNode = EchoDomUtil.importNodeByDom(targetDocument, sourceNode); if (importChildren && sourceNode.hasChildNodes()) { for (var sourceChildNode = sourceNode.firstChild; sourceChildNode; sourceChildNo de = sourceChildNode.nextSibling) { var targetChildNode = EchoDomUtil.importNodeImpl(targetDocument, sourceChildNode , true); if (targetChildNode) { targetNode.appendChild(targetChildNode); } } } return targetNode; }; EchoDomUtil.importNodeByDom = function(targetDocument, sourceNode) { var targetNode, i; switch (sourceNode.nodeType) { case 1: targetNode = targetDocument.createElement(sourceNode.nodeName); for (i = 0; i < sourceNode.attributes.length; ++i) { var attribute = sourceNode.attributes[i]; if ("style" == attribute.name) { targetNode.style.cssText = attribute.value; } else { if (EchoDomUtil.attributeToPropertyMap === null) { EchoDomUtil.initAttributeToPropertyMap(); } var propertyName = EchoDomUtil.attributeToPropertyMap[attribute.name]; if (propertyName) { targetNode[propertyName] = attribute.value; } else { targetNode[attribute.name] = attribute.value; } } } break; case 3: targetNode = targetDocument.createTextNode(sourceNode.nodeValue); break; } return targetNode; }; EchoDomUtil.importNodeByInnerHtml = function(targetDocument, sourceNode) { var targetNode; if (sourceNode.nodeName.match(/tr|tbody|table|thead|tfoot|colgroup/)) { return null; } var sourceHTML = ""; for (var sourceChildNode = sourceNode.firstChild; sourceChildNode; sourceChildNo de = sourceChildNode.nextSibling) { var childHTML = sourceChildNode.xml; if (childHTML == null) { return null; }

sourceHTML += childHTML; } targetNode = EchoDomUtil.importNodeByDom(targetDocument, sourceNode); var expr = new RegExp("<(?:(?!br|img|hr)([a-zA-Z]+))([^>]*)/>", "ig"); sourceHTML = sourceHTML.replace(expr, "<$1$2></$1>"); if (EchoStringUtil.trim(sourceHTML).length > 0) { targetNode.innerHTML = sourceHTML; } return targetNode; }; EchoDomUtil.isAncestorOf = function(ancestorNode, descendantNode) { var testNode = descendantNode; while (testNode !== null) { if (testNode == ancestorNode) { return true; } testNode = testNode.parentNode; } return false; }; EchoDomUtil.preventEventDefault = function(e) { if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } }; EchoDomUtil.removeEventListener = function(eventSource, eventType, eventListener , useCapture) { if (eventSource.removeEventListener) { eventSource.removeEventListener(eventType, eventListener, useCapture); } else if (eventSource.detachEvent) { eventSource.detachEvent("on" + eventType, eventListener); } }; EchoDomUtil.setCssText = function(element, cssText) { if (EchoClientProperties.get("quirkOperaNoCssText")) { if (cssText) { element.setAttribute("style", cssText); } else { element.removeAttribute("style"); } } else { element.style.cssText = cssText; } }; EchoDomUtil.stopPropagation = function(e) { if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } }; function EchoEventProcessor() { } EchoEventProcessor.EventHandlerData = function(handlerName, capture) { this.handlerName = handlerName; this.capture = capture; }; EchoEventProcessor.MessageProcessor = function() { }; EchoEventProcessor.MessageProcessor.process = function(messagePartElement) {

var i, j, k, eventTypes, handlers, addItems, removeItems, elementId; var adds = messagePartElement.getElementsByTagName("event-add"); var removes = messagePartElement.getElementsByTagName("event-remove"); for (i = 0; i < adds.length; ++i) { eventTypes = adds[i].getAttribute("type").split(","); handlers = adds[i].getAttribute("handler").split(","); if (handlers.length != eventTypes.length) { throw "Handler count and event type count do not match."; } addItems = adds[i].getElementsByTagName("item"); for (j = 0; j < addItems.length; ++j) { elementId = addItems[j].getAttribute("eid"); for (k = 0; k < eventTypes.length; ++k) { EchoEventProcessor.addHandler(elementId, eventTypes[k], handlers[k]); } } } for (i = 0; i < removes.length; ++i) { eventTypes = removes[i].getAttribute("type").split(","); removeItems = removes[i].getElementsByTagName("item"); for (j = 0; j < removeItems.length; ++j) { elementId = removeItems[j].getAttribute("eid"); for (k = 0; k < eventTypes.length; ++k) { EchoEventProcessor.removeHandler(elementId, eventTypes[k]); } } } }; EchoEventProcessor.eventTypeToHandlersMap = new EchoCollectionsMap(); EchoEventProcessor.addHandler = function(element, eventType, handler, capture) { var elementId; if (typeof element == "string") { elementId = element; element = document.getElementById(element); } else { elementId = element.id; } EchoDomUtil.addEventListener(element, eventType, EchoEventProcessor.processEvent , false); var elementIdToHandlerMap = EchoEventProcessor.eventTypeToHandlersMap.get(eventT ype); if (!elementIdToHandlerMap) { elementIdToHandlerMap = new EchoCollectionsMap(); EchoEventProcessor.eventTypeToHandlersMap.put(eventType, elementIdToHandlerMap); } var handlerData = new EchoEventProcessor.EventHandlerData(handler, capture); elementIdToHandlerMap.put(elementId, handlerData); }; EchoEventProcessor.dispose = function() { for (var eventType in EchoEventProcessor.eventTypeToHandlersMap.associations) { var elementIdToHandlerMap = EchoEventProcessor.eventTypeToHandlersMap.associatio ns[eventType]; for (var elementId in elementIdToHandlerMap.associations) { var element = document.getElementById(elementId); if (element) { EchoDomUtil.removeEventListener(element, eventType, EchoEventProcessor.processEv ent, false); } elementIdToHandlerMap.remove(elementId); }

EchoEventProcessor.eventTypeToHandlersMap.remove(eventType); } }; EchoEventProcessor.getHandler = function(eventType, elementId) { var handlerData = EchoEventProcessor.getHandlerData(eventType, elementId); return handlerData ? handlerData.handlerName : null; }; EchoEventProcessor.getHandlerData = function(eventType, elementId) { var elementIdToHandlerMap = EchoEventProcessor.eventTypeToHandlersMap.get(eventT ype); if (!elementIdToHandlerMap) { return null; } return elementIdToHandlerMap.get(elementId); }; EchoEventProcessor.getHandlerElementIds = function(eventType) { var elementIds = new Array(); var elementIdToHandlerMap = EchoEventProcessor.eventTypeToHandlersMap.get(eventT ype); if (elementIdToHandlerMap) { for (var elementId in elementIdToHandlerMap.associations) { elementIds.push(elementId); } } return elementIds; }; EchoEventProcessor.getHandlerEventTypes = function() { var handlerTypes = new Array(); for (var eventType in EchoEventProcessor.eventTypeToHandlersMap.associations) { handlerTypes.push(eventType); } return handlerTypes; }; EchoEventProcessor.processEvent = function(e) { e = e ? e : window.event; var eventType = e.type; if (!e.target && e.srcElement) { e.target = e.srcElement; } var targetElement = e.target; var handlerDatas = new Array(); var targetElements = new Array(); var hasCapturingHandlers = false; while (targetElement) { if (targetElement.nodeType == 1) { var handlerData = EchoEventProcessor.getHandlerData(eventType, targetElement.id) ; if (handlerData) { hasCapturingHandlers |= handlerData.capture; handlerDatas.push(handlerData); targetElements.push(targetElement); } } targetElement = targetElement.parentNode; } if (handlerDatas.length == 0) { return; } var propagate = true; if (hasCapturingHandlers) {

for (var i = handlerDatas.length - 1; i >=0; --i) { if (!handlerDatas[i].capture) { continue; } var handler; try { handler = eval(handlerDatas[i].handlerName); } catch (ex) { throw "Invalid handler: " + handlerDatas[i].handlerName + " (" + ex + ")"; } e.registeredTarget = targetElements[i]; propagate = handler(e); if (!propagate) { break; } } } if (propagate) { for (var i = 0; i < handlerDatas.length; ++i) { if (handlerDatas[i].capture) { continue; } var handler; try { handler = eval(handlerDatas[i].handlerName); } catch (ex) { throw "Invalid handler: " + handlerDatas[i].handlerName + " (" + ex + ")"; } e.registeredTarget = targetElements[i]; propagate = handler(e); if (!propagate) { break; } } } if (!propagate) { EchoDomUtil.stopPropagation(e); } }; EchoEventProcessor.removeHandler = function(element, eventType) { var elementId; if (typeof element == "string") { elementId = element; element = document.getElementById(element); } else { elementId = element.id; } if (element) { EchoDomUtil.removeEventListener(element, eventType, EchoEventProcessor.processEv ent, false); } var elementIdToHandlerMap = EchoEventProcessor.eventTypeToHandlersMap.get(eventT ype); if (!elementIdToHandlerMap) { return; } elementIdToHandlerMap.remove(elementId); }; function EchoFocusManager() { } EchoFocusManager.setFocusedState = function(componentId, focusState) {

if (focusState) { EchoClientMessage.messageDocument.documentElement.setAttribute("focus", componen tId); } else { var focusedComponentId = EchoClientMessage.messageDocument.documentElement.getAt tribute("focus"); if (!focusedComponentId || componentId == focusedComponentId) { EchoClientMessage.messageDocument.documentElement.setAttribute("focus", ""); } } EchoDebugManager.updateClientMessage(); }; function EchoHttpConnection(url, method, messageObject, contentType) { this.url = url; this.contentType = contentType; this.method = method; this.messageObject = messageObject; this.responseHandler = null; this.invalidResponseHandler = null; this.disposed = false; }; EchoHttpConnection.prototype.connect = function() { if (!this.responseHandler) { throw "EchoHttpConnection response handler not set."; } var usingActiveXObject = false; if (window.XMLHttpRequest) { this.xmlHttpRequest = new XMLHttpRequest(); } else if (window.ActiveXObject) { usingActiveXObject = true; this.xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } else { throw "Connect failed: Cannot create XMLHttpRequest."; } var instance = this; this.xmlHttpRequest.onreadystatechange = function() { if (!instance) { return; } try { instance.processReadyStateChange(); } finally { if (instance.disposed) { instance = null; } } }; this.xmlHttpRequest.open(this.method, this.url, true); if (this.contentType && (usingActiveXObject || this.xmlHttpRequest.setRequestHea der)) { this.xmlHttpRequest.setRequestHeader("Content-Type", this.contentType); } this.xmlHttpRequest.send(this.messageObject ? this.messageObject : null); }; EchoHttpConnection.prototype.dispose = function() { this.messageObject = null; this.responseHandler = null; this.invalidResponseHandler = null; this.xmlHttpRequest = null; this.disposed = true;

}; EchoHttpConnection.prototype.getResponseText = function() { return this.xmlHttpRequest ? this.xmlHttpRequest.responseText : null; }; EchoHttpConnection.prototype.getResponseXml = function() { return this.xmlHttpRequest ? this.xmlHttpRequest.responseXML : null; }; EchoHttpConnection.prototype.processReadyStateChange = function() { if (this.disposed) { return; } if (this.xmlHttpRequest.readyState == 4) { if (this.xmlHttpRequest.status == 200) { if (!this.responseHandler) { this.dispose(); throw "EchoHttpConnection response handler not set."; } this.responseHandler(this); this.dispose(); } else { if (this.invalidResponseHandler) { this.invalidResponseHandler(this); this.dispose(); } else { var statusValue = this.xmlHttpRequest.status; this.dispose(); throw "Invalid HTTP Response code (" + statusValue + ") and no handler set."; } } } }; EchoHttpConnection.nullMethod = function() { }; function EchoModalManager() { } EchoModalManager.modalElementId = null; EchoModalManager.isElementInModalContext = function(element) { if (typeof element == "string") { element = document.getElementById(element); } if (EchoModalManager.modalElementId) { var modalElement = document.getElementById(EchoModalManager.modalElementId); return EchoDomUtil.isAncestorOf(modalElement, element); } else { return true; } }; function EchoScriptLibraryManager() { } EchoScriptLibraryManager.STATE_REQUESTED = 1; EchoScriptLibraryManager.STATE_LOADED = 2; EchoScriptLibraryManager.STATE_INSTALLED = 3; EchoScriptLibraryManager.librarySourceMap = new Array(); EchoScriptLibraryManager.libraryLoadStateMap = new Array(); EchoScriptLibraryManager.getState = function(serviceId) { return EchoScriptLibraryManager.libraryLoadStateMap[serviceId]; }; EchoScriptLibraryManager.installLibrary = function(serviceId) { if (EchoScriptLibraryManager.getState(serviceId) == EchoScriptLibraryManager.STA TE_INSTALLED) { return; } try {

var source = EchoScriptLibraryManager.librarySourceMap[serviceId]; eval(source); EchoScriptLibraryManager.librarySourceMap[serviceId] = null; EchoScriptLibraryManager.libraryLoadStateMap[serviceId] = EchoScriptLibraryManag er.STATE_INSTALLED; } catch (ex) { EchoClientEngine.processClientError("Cannot load script module \"" + serviceId + "\"", ex); throw ex; } }; EchoScriptLibraryManager.loadLibrary = function(serviceId) { if (EchoScriptLibraryManager.getState(serviceId)) { return; } var conn = new EchoHttpConnection(EchoClientEngine.baseServerUri + "?serviceId=" + serviceId, "GET"); conn.serviceId = serviceId; conn.responseHandler = EchoScriptLibraryManager.responseHandler; conn.connect(); EchoScriptLibraryManager.libraryLoadStateMap[serviceId] = EchoScriptLibraryManag er.STATE_REQUESTED; }; EchoScriptLibraryManager.responseHandler = function(conn) { EchoScriptLibraryManager.librarySourceMap[conn.serviceId] = conn.getResponseText (); EchoScriptLibraryManager.libraryLoadStateMap[conn.serviceId] = EchoScriptLibrary Manager.STATE_LOADED; EchoClientEngine.incrementLoadStatus(); }; function EchoServerDelayMessage() { } EchoServerDelayMessage.MessageProcessor = function() { }; EchoServerDelayMessage.MessageProcessor.process = function(messagePartElement) { for (var i = 0; i < messagePartElement.childNodes.length; ++i) { if (messagePartElement.childNodes[i].nodeType == 1) { switch (messagePartElement.childNodes[i].tagName) { case "set-message": EchoServerDelayMessage.MessageProcessor.processSetDelayMessage(messagePartElemen t.childNodes[i]); break; } } } }; EchoServerDelayMessage.MessageProcessor.processSetDelayMessage = function(setDir ectiveElement) { var i; var serverDelayMessage = document.getElementById(EchoServerDelayMessage.MESSAGE_ ELEMENT_ID); if (serverDelayMessage) { serverDelayMessage.parentNode.removeChild(serverDelayMessage); } var contentElement = setDirectiveElement.getElementsByTagName("content")[0]; if (!contentElement) { return; } var bodyElement = document.getElementsByTagName("body")[0]; for (i = 0; i < contentElement.childNodes.length; ++i) { bodyElement.appendChild(EchoDomUtil.importNode(document, contentElement.childNod es[i], true));

} }; EchoServerDelayMessage.MESSAGE_ELEMENT_ID = "serverDelayMessage"; EchoServerDelayMessage.MESSAGE_ELEMENT_LONG_ID = "serverDelayMessageLong"; EchoServerDelayMessage.delayMessageTimeoutId = null; EchoServerDelayMessage.timeout = 750; EchoServerDelayMessage.activate = function() { var serverDelayMessage = document.getElementById(EchoServerDelayMessage.MESSAGE_ ELEMENT_ID); if (!serverDelayMessage) { return; } serverDelayMessage.style.visibility = "visible"; EchoServerDelayMessage.delayMessageTimeoutId = window.setTimeout("EchoServerDela yMessage.activateDelayMessage()", EchoServerDelayMessage.timeout); }; EchoServerDelayMessage.activateDelayMessage = function() { EchoServerDelayMessage.cancelDelayMessageTimeout(); var longMessage = document.getElementById(EchoServerDelayMessage.MESSAGE_ELEMENT _LONG_ID); if (!longMessage) { return; } longMessage.style.visibility = "visible"; }; EchoServerDelayMessage.cancelDelayMessageTimeout = function() { if (EchoServerDelayMessage.delayMessageTimeoutId) { window.clearTimeout(EchoServerDelayMessage.delayMessageTimeoutId); EchoServerDelayMessage.delayMessageTimeoutId = null; } }; EchoServerDelayMessage.deactivate = function() { EchoServerDelayMessage.cancelDelayMessageTimeout(); var serverDelayMessage = document.getElementById(EchoServerDelayMessage.MESSAGE_ ELEMENT_ID); var longMessage = document.getElementById(EchoServerDelayMessage.MESSAGE_ELEMENT _LONG_ID); if (serverDelayMessage) { serverDelayMessage.style.visibility = "hidden"; } if (longMessage) { longMessage.style.visibility = "hidden"; } }; function EchoServerMessage() { } EchoServerMessage.STATUS_INITIALIZED = 0; EchoServerMessage.STATUS_PROCESSING = 1; EchoServerMessage.STATUS_PROCESSING_COMPLETE = 2; EchoServerMessage.STATUS_PROCESSING_FAILED = 3; EchoServerMessage.transactionCount = 0; EchoServerMessage.messageDocument = null; EchoServerMessage.backgroundIntervalId = null; EchoServerMessage.enableFixSafariAttrs = false; EchoServerMessage.processingCompleteListener = null; EchoServerMessage.temporaryProperties = null; EchoServerMessage.status = EchoServerMessage.STATUS_INITIALIZED; EchoServerMessage.getTemporaryProperty = function(key) { if (!EchoServerMessage.temporaryProperties) {

return undefined; } else { return EchoServerMessage.temporaryProperties[key]; } }; EchoServerMessage.init = function(messageDocument, processingCompleteListener) { EchoServerMessage.temporaryProperties = null; EchoServerMessage.messageDocument = messageDocument; EchoServerMessage.backgroundIntervalId = null; EchoServerMessage.processingCompleteListener = processingCompleteListener; EchoDebugManager.updateServerMessage(); }; EchoServerMessage.isLibraryLoadComplete = function() { var complete = false; try { var librariesElement = EchoServerMessage.messageDocument.getElementsByTagName("l ibraries").item(0); var libraryElements = librariesElement.getElementsByTagName("library"); var returnValue = true; for (var i = 0; i < libraryElements.length; ++i) { var serviceId = libraryElements.item(i).getAttribute("service-id"); var libraryState = EchoScriptLibraryManager.getState(serviceId); if (libraryState != EchoScriptLibraryManager.STATE_LOADED && libraryState != EchoScriptLibraryManager.STATE_INSTALLED) { returnValue = false; break; } } complete = true; return returnValue; } finally { if (!complete) { EchoServerMessage.status = EchoServerMessage.STATUS_PROCESSING_FAILED; } } }; EchoServerMessage.loadLibraries = function() { var librariesElement = EchoServerMessage.messageDocument.getElementsByTagName("l ibraries").item(0); var headElement = document.getElementsByTagName("head").item(0); if (!librariesElement) { return; } var libraryElements = librariesElement.getElementsByTagName("library"); for (var i = 0; i < libraryElements.length; ++i) { var serviceId = libraryElements.item(i).getAttribute("service-id"); EchoScriptLibraryManager.loadLibrary(serviceId); } }; EchoServerMessage.installLibraries = function() { var librariesElement = EchoServerMessage.messageDocument.getElementsByTagName("l ibraries").item(0); var headElement = document.getElementsByTagName("head").item(0); if (!librariesElement) { return; } var libraryElements = librariesElement.getElementsByTagName("library"); for (var i = 0; i < libraryElements.length; ++i) { var serviceId = libraryElements.item(i).getAttribute("service-id"); EchoScriptLibraryManager.installLibrary(serviceId);

EchoClientEngine.incrementLoadStatus(); } }; EchoServerMessage.process = function() { EchoServerMessage.prepare(); EchoServerMessage.processPhase1(); }; EchoServerMessage.prepare = function() { EchoClientEngine.updateTransactionId(EchoServerMessage.messageDocument.documentE lement.getAttribute("trans-id")); if (EchoServerMessage.messageDocument.documentElement.getAttribute("xml-attr-tes t") == "x&#38;y") { EchoServerMessage.enableFixSafariAttrs = true; } if (EchoServerMessage.enableFixSafariAttrs) { EchoDomUtil.fixSafariAttrs(EchoServerMessage.messageDocument.documentElement); } }; EchoServerMessage.processAsyncConfig = function() { var timeInterval = parseInt(EchoServerMessage.messageDocument.documentElement.ge tAttribute("async-interval")); if (!isNaN(timeInterval)) { EchoAsyncMonitor.timeInterval = timeInterval; EchoAsyncMonitor.start(); } }; EchoServerMessage.processApplicationProperties = function() { EchoModalManager.modalElementId = EchoServerMessage.messageDocument.documentElem ent.getAttribute("modal-id"); if (EchoServerMessage.messageDocument.documentElement.getAttribute("root-layoutdirection")) { document.documentElement.style.direction = EchoServerMessage.messageDocument.documentElement.getAttribute("root-layout-di rection"); } }; EchoServerMessage.processMessageParts = function() { var complete = false; try { var messagePartElements = EchoServerMessage.messageDocument.getElementsByTagName ("message-part"); for (var i = 0; i < messagePartElements.length; ++i) { var messagePartElement = messagePartElements[i]; var processorName = messagePartElement.getAttribute("processor"); var processor = eval(processorName); if (!processor || !processor.process) { throw "Processor \"" + processorName + "\" not available."; } processor.process(messagePartElement); } complete = true; } finally { EchoServerMessage.status = complete ? EchoServerMessage.STATUS_PROCESSING_COMPLE TE : EchoServerMessage.STATUS_PROCESSING_FAILED; } }; EchoServerMessage.processPhase1 = function() { try { EchoServerMessage.status = EchoServerMessage.STATUS_PROCESSING;

EchoServerMessage.loadLibraries(); if (EchoServerMessage.isLibraryLoadComplete()) { EchoServerMessage.processPhase2(); } else { EchoServerMessage.backgroundIntervalId = window.setInterval("EchoServerMessage.w aitForLibraries();", 20); } } catch (ex) { EchoServerMessage.temporaryProperties = null; EchoClientEngine.processClientError("Cannot process ServerMessage (Phase 1)", ex ); throw ex; } }; EchoServerMessage.processPhase2 = function() { try { EchoServerMessage.installLibraries(); EchoClientEngine.disableLoadStatus(); EchoServerMessage.processMessageParts(); EchoServerMessage.processApplicationProperties(); if (EchoServerMessage.processingCompleteListener) { EchoServerMessage.processingCompleteListener(); } EchoServerMessage.processAsyncConfig(); } catch (ex) { EchoClientEngine.processClientError("Cannot process ServerMessage (Phase 2)", ex ); throw ex; } finally { EchoServerMessage.temporaryProperties = null; } EchoVirtualPosition.redraw(); ++EchoServerMessage.transactionCount; }; EchoServerMessage.setTemporaryProperty = function(key, value) { if (!EchoServerMessage.temporaryProperties) { EchoServerMessage.temporaryProperties = new Array(); } EchoServerMessage.temporaryProperties[key] = value; }; EchoServerMessage.waitForLibraries = function() { if (EchoServerMessage.isLibraryLoadComplete()) { window.clearInterval(EchoServerMessage.backgroundIntervalId); EchoServerMessage.backgroundIntervalId = null; EchoServerMessage.processPhase2(); } }; function EchoServerTransaction() { } EchoServerTransaction.active = false; EchoServerTransaction.synchronizeServiceRequest = "?serviceId=Echo.Synchronize"; EchoServerTransaction.connect = function() { if (EchoServerTransaction.active) { return false; } EchoServerDelayMessage.activate(); EchoAsyncMonitor.stop(); var conn = new EchoHttpConnection(EchoClientEngine.baseServerUri + EchoServerTra nsaction.synchronizeServiceRequest, "POST", EchoClientMessage.messageDocument, "text/xml"); conn.responseHandler = EchoServerTransaction.responseHandler;

conn.invalidResponseHandler = EchoServerTransaction.invalidResponseHandler; EchoServerTransaction.active = true; conn.connect(); EchoClientMessage.reset(); return true; }; EchoServerTransaction.invalidResponseHandler = function(conn) { EchoServerTransaction.postProcess(); if (conn.xmlHttpRequest.status == 500) { EchoClientEngine.processServerError(); } else if (conn.xmlHttpRequest.status == 400) { EchoClientEngine.processSessionExpiration(); } else { alert("Invalid/unknown response from server: " + conn.getResponseText()); } }; EchoServerTransaction.postProcess = function() { EchoServerDelayMessage.deactivate(); EchoServerTransaction.active = false; }; EchoServerTransaction.responseHandler = function(conn) { EchoServerMessage.init(conn.getResponseXml(), EchoServerTransaction.postProcess) ; EchoServerMessage.process(); }; function EchoStringUtil() {}; EchoStringUtil.trim = function(s) { var result = s.replace(/^\s+/g, ""); return result.replace(/\s+$/g, ""); }; EchoVirtualPosition = function() { }; EchoVirtualPosition.elementIdList = new Array(); EchoVirtualPosition.elementIdSet = new EchoCollectionsMap(); EchoVirtualPosition.enabled = false; EchoVirtualPosition.elementIdListSorted = true; EchoVirtualPosition.adjust = function(element) { if (EchoVirtualPosition.verifyPixelValue(element.style.top) && EchoVirtualPosition.verifyPixelValue(element.style.bottom) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.paddingTop) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.paddingBottom) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.marginTop) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.marginBottom) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.borderTopWidth) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.borderBottomWid th)) { var parentHeight = element.parentNode.offsetHeight; var topPixels = parseInt(element.style.top); var bottomPixels = parseInt(element.style.bottom); var paddingPixels = EchoVirtualPosition.toInteger(element.style.paddingTop) + EchoVirtualPosition.toInteger(element.style.paddingBottom); var marginPixels = EchoVirtualPosition.toInteger(element.style.marginTop) + EchoVirtualPosition.toInteger(element.style.marginBottom); var borderPixels = EchoVirtualPosition.toInteger(element.style.borderTopWidth) + EchoVirtualPosition.toInteger(element.style.borderBottomWidth); var calculatedHeight = parentHeight - topPixels - bottomPixels - paddingPixels marginPixels - borderPixels; if (calculatedHeight <= 0) { element.style.height = 0; } else { if (element.style.height != calculatedHeight + "px") {

element.style.height = calculatedHeight + "px"; } } } if (EchoVirtualPosition.verifyPixelValue(element.style.left) && EchoVirtualPosition.verifyPixelValue(element.style.right) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.paddingLeft) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.paddingRight) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.marginLeft) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.marginRight) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.borderLeftWidth ) && EchoVirtualPosition.verifyPixelOrUndefinedValue(element.style.borderRightWidt h)) { var parentWidth = element.parentNode.offsetWidth; var leftPixels = parseInt(element.style.left); var rightPixels = parseInt(element.style.right); var paddingPixels = EchoVirtualPosition.toInteger(element.style.paddingLeft) + EchoVirtualPosition.toInteger(element.style.paddingRight); var marginPixels = EchoVirtualPosition.toInteger(element.style.marginLeft) + EchoVirtualPosition.toInteger(element.style.marginRight); var borderPixels = EchoVirtualPosition.toInteger(element.style.borderLeftWidth) + EchoVirtualPosition.toInteger(element.style.borderRightWidth); var calculatedWidth = parentWidth - leftPixels - rightPixels - paddingPixels - m arginPixels - borderPixels; if (calculatedWidth <= 0) { element.style.width = 0; } else { if (element.style.width != calculatedWidth + "px") { element.style.width = calculatedWidth + "px"; } } } }; EchoVirtualPosition.init = function() { EchoVirtualPosition.enabled = true; EchoDomUtil.addEventListener(window, "resize", EchoVirtualPosition.resizeListene r, false); }; EchoVirtualPosition.redraw = function(element) { if (!EchoVirtualPosition.enabled) { return; } var removedIds = false; if (element != undefined) { EchoVirtualPosition.adjust(element); } else { if (!EchoVirtualPosition.elementIdListSorted) { EchoVirtualPosition.sort(); } for (var i = 0; i < EchoVirtualPosition.elementIdList.length; ++i) { element = document.getElementById(EchoVirtualPosition.elementIdList[i]); if (element) { EchoVirtualPosition.adjust(element); } else { EchoVirtualPosition.elementIdSet.remove(EchoVirtualPosition.elementIdList[i]); EchoVirtualPosition.elementIdList[i] = null; removedIds = true; } }

if (removedIds) { var updatedIdList = new Array(); for (var i = 0; i < EchoVirtualPosition.elementIdList.length; ++i) { if (EchoVirtualPosition.elementIdList[i] != null) { updatedIdList.push(EchoVirtualPosition.elementIdList[i]); } } EchoVirtualPosition.elementIdList = updatedIdList; } } }; EchoVirtualPosition.register = function(elementId) { if (!EchoVirtualPosition.enabled) { return; } EchoVirtualPosition.elementIdListSorted = false; EchoVirtualPosition.elementIdList.push(elementId); EchoVirtualPosition.elementIdSet.put(elementId, 1); }; EchoVirtualPosition.resizeListener = function(e) { e = e ? e : window.event; EchoVirtualPosition.redraw(); }; EchoVirtualPosition.sort = function() { var sortedList = new Array(); EchoVirtualPosition.sortImpl(document.documentElement, sortedList); EchoVirtualPosition.elementIdList = sortedList; EchoVirtualPosition.elementIdListSorted = true; }; EchoVirtualPosition.sortImpl = function(element, sortedList) { if (element.id && EchoVirtualPosition.elementIdSet.get(element.id)) { sortedList.push(element.id); } for (var child = element.firstChild; child; child = child.nextSibling) { if (child.nodeType == 1) { EchoVirtualPosition.sortImpl(child, sortedList); } } }; EchoVirtualPosition.toInteger = function(value) { value = parseInt(value); return isNaN(value) ? 0 : value; }; EchoVirtualPosition.verifyPixelValue = function(value) { if (value == null || value == "" || value == undefined) { return false; } var valueString = value.toString(); return valueString == "0" || valueString.indexOf("px") != -1; }; EchoVirtualPosition.verifyPixelOrUndefinedValue = function(value) { if (value == null || value == "" || value == undefined) { return true; } var valueString = value.toString(); return valueString == "0" || valueString.indexOf("px") != -1; }; EchoVirtualPosition.MessageProcessor = function() { }; EchoVirtualPosition.MessageProcessor.process = function(messagePartElement) { for (var i = 0; i < messagePartElement.childNodes.length; ++i) {

if (messagePartElement.childNodes[i].nodeType == 1) { switch (messagePartElement.childNodes[i].tagName) { case "register": EchoVirtualPosition.MessageProcessor.processRegister(messagePartElement.childNod es[i]); break; } } } }; EchoVirtualPosition.MessageProcessor.processRegister = function(registerElement) { var items = registerElement.getElementsByTagName("item"); for (var i = 0; i < items.length; ++i) { var elementId = items[i].getAttribute("eid"); EchoVirtualPosition.register(elementId); } }; function EchoWindowUpdate() { } EchoWindowUpdate.process = function(messagePartElement) { for (var i = 0; i < messagePartElement.childNodes.length; ++i) { if (messagePartElement.childNodes[i].nodeType == 1) { switch (messagePartElement.childNodes[i].tagName) { case "reload": EchoWindowUpdate.processReload(messagePartElement.childNodes[i]); break; case "set-focus": EchoWindowUpdate.processSetFocus(messagePartElement.childNodes[i]); break; case "set-title": EchoWindowUpdate.processSetTitle(messagePartElement.childNodes[i]); break; } } } }; EchoWindowUpdate.processReload = function(reloadElement) { var message = EchoClientConfiguration.propertyMap["defaultOutOfSyncErrorMessage" ] if (message) { alert(message); } window.location.reload(); }; EchoWindowUpdate.processSetFocus = function(setFocusElement) { EchoVirtualPosition.redraw(); var elementId = setFocusElement.getAttribute("element-id"); var element = document.getElementById(elementId); if (element && element.focus) { element.focus(); } }; EchoWindowUpdate.processSetTitle = function(setTitleElement) { document.title = setTitleElement.getAttribute("title"); }; EchoClientMessage.reset();

You might also like