var JSControl = Class.create({ initialize: function(element){ this.element = $(element); if (!this.element) return; this._id_ = Element.readAttribute(this.element, "id"); this.element.JSControl = this; }, ID: function(){ return this._id_; }, Value: function(){ return Element.getTextFast(this.element); }, SetValue: function(){ }, Title: function(){ return this.title_ || (this.element ? this.element.getAttribute("title") : null); }, SetAttribute: function(attrName, attrValue){ switch (attrName){ case "style": Element.setStyle(this.element, JSControl.parseStyle(attrValue)); break; case "title": this.title_ = attrValue; break; case "htmlid": default: break; } }, SetTabOrder: function(nTabBase){ this.element.tabIndex = nTabBase++; return nTabBase; }, onchange: function(args){ new AEvent("CHANGE", typeof args == "undefined" ? {} : {"args": args}, this); }, isChildControl: function(jscontrol){ return jscontrol.ID().startsWith(this.ID() + "."); }, getTypeset: function(){ if (typeof this.typeset_ == "undefined"){ var awnd = AControl.GetParentWindow(this.element); if (!awnd){ alert("JSControl::getTypeset[ID=" + this.ID() + "]:\nCannot find parent window!!!") return null; } if (awnd.___typeset___) return this.typeset_ = awnd.___typeset___; var types_include = []; var types_literal = []; for (var child = awnd.XML().documentElement.firstChild; child; child = child.nextSibling){ if (child.nodeType != Node.ELEMENT_NODE || Node.localName(child) != "types") continue; var from = child.getAttribute("from"); if (from) types_include.push(from); else types_literal.push(child); } var typeset = new AXML("st:typeset", STURI); var root = typeset.XML().documentElement; for (var child = AXML.getTypeSet(types_include).XML().documentElement.firstChild; // child; child = child.nextSibling) root.appendChild(ImportNode(root, child, true)); types_literal.each(function(node){ typeset.XML().documentElement.appendChild(ImportNode(root, node, true)); }); this.typeset_ = awnd.___typeset___ = typeset; } return this.typeset_; } }); JSControl.add_callbacks = function(arr){ arr.each(function(args){ Event.observe.apply(null, args); }); }; JSControl.remove_callbacks = function(arr){ arr.each(function(args){ Event.stopObserving.apply(null, args); }); }; JSControl.parseStyle = function(str){ var result = {}; String(str).replace(/\/\*[\S\s]*?\*\//g, "").split(";").each(function(record){ var matches = record.match(/^\s*([a-zA-Z-]+)\s*\:\s*([\S\s]+)\s*$/); if (!matches || matches.collect(Object.isUndefined).any()) return; result[String(matches[1]).camelize()] = matches[2]; }); return result; } Event.fire = function(element, eventType){ if (document.createEventObject){ var event = document.createEventObject(); return element.fireEvent('on' + eventType, event); }else{ var event = document.createEvent("HTMLEvents"); event.initEvent(eventType, true, true ); // eventType, bubbling, cancelable return !element.dispatchEvent(event); } } JSControl.struct2attrs = function(struct){ return Object.keys(struct).collect(function(key){ return key + "='" + AXML.EscapeEntities(struct[key]) + "'"; }).join(" "); } JSControl.TransformDOM = function(xmldom, xsldom, to_fragment){ if (typeof XSLTProcessor != "undefined"){ var processor = new XSLTProcessor(); processor.importStylesheet(xsldom); return to_fragment ? processor.transformToFragment(xmldom, document).xml : processor.transformToDocument(xmldom).xml; } if (!Object.isUndefined(ActiveXObject)) return xmldom.transformNode(xsldom); throw new Error("JSControl.TransformDOM: No XSLT engine found."); } JSControl.ParseXML = function(str){ if (typeof(ActiveXObject) != "undefined"){ var xmldoc = new ActiveXObject("MSXML2.DOMDocument.6.0"); xmldoc.async = "false"; xmldoc.loadXML(str); return xmldoc; } else if (window.DOMParser) { return (new DOMParser()).parseFromString(str, "text/xml"); } else { throw new Error("JSControl.ParseXML: Unable to parse XML document from string."); } } JSControl.TransformToDocument = function(xmldom, xsldom){ if (typeof XSLTProcessor != "undefined"){ var processor = new XSLTProcessor(); processor.importStylesheet(xsldom); return processor.transformToDocument(xmldom); } if (!Object.isUndefined(ActiveXObject)) return JSControl.ParseXML(xmldom.transformNode(xsldom)); throw new Error("JSControl.TransformToDocument: No XSLT engine found."); } JSControl.auxWindowClass = "AuxElementsOnly"; JSControl.TransformElement = function(attrs, types){ return JSControl.TransformElements([attrs], types); } JSControl.Unwrap = function(html){ return String(html).replace(/^\s*<[^>]+?>([\s\S]*?)<\/[^>]+>\s*$/, "$1"); } JSControl.TransformElementAndUnwrap = function(attrs, types){ return JSControl.TransformElementsAndUnwrap([attrs], types); } JSControl.createXML = function(desc){ if (typeof desc["htmlid"] == "undefined" && desc["id"]) desc["htmlid"] = desc["id"]; var nodeName = "ele"; var childNodes = []; var attrs = {}; for (var key in desc){ if (key == "nodeName") nodeName = desc[key]; else if (key == "childNodes") childNodes = desc[key]; else attrs[key] = desc[key]; } return "<" + nodeName + " " + JSControl.struct2attrs(attrs) + // (childNodes && childNodes.length > 0 ? ">" + $A(childNodes).collect(arguments.callee).join("") + "" : "/>"); } JSControl.TransformElements = function(descrs, types){ var wndattrs = { "xmlns": AIURI, "css-class": JSControl.auxWindowClass, "xmlns:st": STURI }; descrs = $A(descrs); var xml = "" + (Object.isArray(types) ? types.collect(function(from){ return ""; }).join("") : "") + descrs.collect(JSControl.createXML).join("") + "" + descrs.collect(function(attrs){ if (attrs["class"] == "DynamicAutosuggest") return ""; return attrs["id"] ? "" : ""; }).join("") + "" + ""; var doc = JSControl.ParseXML(xml); if (types instanceof AXML) for (var child = types.XML().documentElement.firstChild; child; child = child.nextSibling) doc.documentElement.appendChild(ImportNode(doc, child, true)); var result = GWindowManager.Transform(doc); return result.replace(/<\/?\s*(html|head|body)[^>]*>/gi, ""); } JSControl.TransformElementsAndUnwrap = function(descrs, types){ return JSControl.Unwrap(JSControl.TransformElements(descrs, types)); } JSControl.SelectNodes = function(node, xpathExpr, namespaces) { namespaces = namespaces || {}; if (typeof XPathEvaluator != "undefined") { var resolver = function(prefix){ return namespaces[prefix]; }; var evaluator = new XPathEvaluator(); var evalResult = evaluator.evaluate(xpathExpr, node, resolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); var result = new Array; if (evalResult){ for (var element = evalResult.iterateNext(); element; element = evalResult.iterateNext()) result.push(element); } return result; } else if (typeof ActiveXObject != "undefined") { AXML.registerNS(node, namespaces); node.ownerDocument.setProperty("SelectionLanguage", "XPath") return node.selectNodes(xpathExpr); } else { throw new Error("No XPath engine found. "); } }; JSControl.windowChangeEvents = ["WM_WINDOWCHANGE", "WM_CLEAR", "WM_PUSH", "WM_BACK", "WM_TABBAR", "WM_REDIRECT", "WM_LINKOPENER"]; JSControl.AddWindowChangeListener = function(object, handler) { JSControl.windowChangeEvents.each(function(eventType){ SubscribeOnEvent(eventType, "document", handler, object); }); } Node.localName = function(node){ if (!node) return ""; if (typeof node.localName != "undefined") return node.localName; var nodeName = String(node.nodeName); var lastColonIndex = nodeName.lastIndexOf(":"); return nodeName.substr(lastColonIndex + 1); } JSControl.copy_node_bruteforce = function(doc, node, deep){ var node_copy = null; if (node.namespaceURI && doc.createElementNS) node_copy = doc.createElementNS(node.namespaceURI, node.localName); else node_copy = doc.createElement(Node.localName(node)); if (!node_copy) return null; var attrs = node.attributes; for (var iii = 0; iii < attrs.length; ++iii){ node_copy.setAttribute(attrs[iii].name, attrs[iii].value); } if (deep){ for (var iii = 0; iii < node.childNodes.length; ++iii){ node_copy.appendChild(JSControl.copy_node_bruteforce(doc, node.childNodes[iii], deep)); } } return node_copy; } JSControl.ImportNode = function(doc, node, deep){ return (Object.isFunction(doc.importNode)) ? doc.importNode(node, deep) : JSControl.copy_node_bruteforce(doc, node, deep); } JSControl.PrintNode = function(node, params){ var params = params || {}; var features = { "location": "no", "status": "no" }; ["width", "height"].each(function(key){ if (Object.isNumber(params[key])) features[key] = String(params[key]) + "px"; else if (Object.isString(params[key])) features[key] = params[key]; }); var newwnd = window.open(null, null, $H(features).collect(function(pair){ return pair.key + "=" + pair.value; }).join(",")); newwnd.document.open(); newwnd.document.write("" + (params["title"] || "") + ""); newwnd.document.close(); Element.setStyle(newwnd.document.body, {"margin": "0px"}); newwnd.document.body.appendChild(JSControl.ImportNode(newwnd.document, node, true)); newwnd.print(); } JSControl.GetChildControls = function(container){ var result = new Array(); if (!container || container.nodeType != Node.ELEMENT_NODE) return result; for (var child = container.firstChild; child; child = child.nextSibling){ if (child.nodeType != Node.ELEMENT_NODE) continue; if (child.JSControl) result.push(child.JSControl); else result.push.apply(result, arguments.callee(child)); } return result; } JSControl.FindFirstFocusable = function(container){ if (!container || container.nodeType != Node.ELEMENT_NODE) return null; for (var child = container.firstChild; child; child = child.nextSibling){ if (child.nodeType != Node.ELEMENT_NODE) continue; if (child.getAttributeNode("tabIndex") && typeof child.tabIndex != "undefined" && child.tabIndex >= 0) return child; var focusable = arguments.callee(child); if (focusable) return focusable; } } JSControl.GetSID = function(){//session id var cookies = String(document.cookie).split(/;\s*/g); var nam = "_" + location.port + "_sid"; for (var iii = 0; iii < cookies.length; ++iii){ var pair = cookies[iii].split("="); if (2 == pair.length && pair[0] == nam) return pair[1]; } return ""; } var HandleStorage = Class.create({ initialize: function(element){ this.element = $(element); this.handles = {}; Element.descendants(this.element).each(function(child){ var hook = child.getAttribute("hook"); if (!hook) return; this.handles[hook] = child; }, this); }, GetHandle: function(hook){ return this.handles[hook]; }, GetHandles: function(){ return Object.values(this.handles); } }); Element.innerWidth = function(element){ if (!element) return 0; return element.innerWidth || element.offsetWidth - // ["paddingLeft", "paddingRight", "borderLeftWidth", "borderRightWidth"].inject(0, // function(acc, prop){ return acc + (parseInt(Element.getStyle(element, prop), 10) || 0); }); } var SimpleValue = Class.create(JSControl, { SetValue: function(val){ this.element.value = URLSerialize(this.value_ = val); }, Value: function(){ return this.value_; } }); var SWFControl = Class.create({ initialize: function(id, params){ for (var key in SWFControl.defaults_) if ("undefined" === typeof params[key]) params[key] = SWFControl.defaults_[key]; this.id_ = id; $(id).JSControl = this; if (!swfobject.hasFlashPlayerVersion(params.version)){ params.width = Math.max(params.width, 310); params.height = Math.max(params.height, 137); } swfobject.embedSWF(params.url, id, params.width, params.height, params.version, params["expressInstall"], {"id": this.ID()}, params.object, {}, this.embedded.bind(this)); }, embedded: function(event){ if (!event.success) return void LogE("Could not embed object " + event.id); event.ref.setAttribute("id", this.ID()); event.ref.JSControl = this; if (typeof this.visibility_ != "undefined") Element.setStyle(event.ref, {"display": this.visibility_ == "no" ? "none" : ""}); }, ID: function(){ return this.id_; }, SetAttribute: function(nam, val){ if ("visibility" == nam){ if (!["yes", "ro", "vo", "link", "no"].include(val)) return; if (typeof this.visibility_ == "undefined") this.visibility_ = "yes"; if (this.visibility_ == val) return; var elem = document.getElementById(this.ID()); if (elem) Element.setStyle(elem, {"display": val == "no" ? "none" : ""}); this.visibility_ = val; }else if (["id", "htmlid", "localid", "type", "class"].indexOf(nam) != -1) return; else{ if (this.flashready_){ var swfobject = this.getSWFObject(); if (swfobject && swfobject.SetAttribute) return void swfobject.SetAttribute(nam, val); } if (typeof this.attrs_ == "undefined") this.attrs_ = {}; this.attrs_[nam] = val; } }, getSWFObject: function(){ return window[this.id_] || document[this.id_]; }, FlashReady: function(){ this.flashready_ = true; var swfobject = this.getSWFObject(); if (!swfobject) return void LogE("SWFObject is NULL"); else if (swfobject.SetAttribute){ swfobject.SetAttribute("sid", JSControl.GetSID()); if (this.attrs_){ for (var key in this.attrs_) swfobject.SetAttribute(key, this.attrs_[key]); delete this.attrs_; } } }, SetValue: function(){}, Value: function(){ return null; }, SetTabOrder: function(tabbase){ return tabbase; }, GetSWF: function(){ return this.flashready_ ? this.getSWFObject() : null; } }); SWFControl.defaults_ = {"version": "9", "expressInstall": "/flash/expressInstall.swf", // "object": {"allowNetworking": "all", "wmode": "opaque"}};