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("") + "" + nodeName + ">" : "/>");
}
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"}};