|
|
Line 10: |
Line 10: |
| | | |
| <code><pre> | | <code><pre> |
− | ./skeleton.wdgt
| + | skeleton.wdgt |
− | ./skeleton.wdgt/Default.png
| + | skeleton.wdgt/Default.png |
− | ./skeleton.wdgt/Default@2x.png
| + | skeleton.wdgt/Default@2x.png |
− | ./skeleton.wdgt/Icon.png
| + | skeleton.wdgt/Info.plist |
− | ./skeleton.wdgt/Images
| + | skeleton.wdgt/main.html |
− | ./skeleton.wdgt/Info.plist
| |
− | ./skeleton.wdgt/main.css
| |
− | ./skeleton.wdgt/main.html
| |
− | ./skeleton.wdgt/main.js
| |
− | ./skeleton.wdgt/Parts
| |
− | ./skeleton.wdgt/Parts/parts.js
| |
− | ./skeleton.wdgt/version.plist
| |
| </pre></code> | | </pre></code> |
| | | |
| =Files= | | =Files= |
| | | |
− | ==Parts/parts.js== | + | ==PNG Files== |
− | <source lang="javascript">
| + | * Default.png<br />[[Image:iBookWidget_Default.png]] |
− | /*
| + | <br /> |
− | This file was generated by Dashcode and is covered by the
| + | * Default@2x.png<br />[[Image:iBookWidget_Default@2x.png]] |
− | license.txt included in the project. You may edit this file,
| + | <br /> |
− | however it is recommended to first turn off the Dashcode
| + | * main.html |
− | code generator otherwise the changes will be lost.
| + | <br /> |
− | */
| + | <code><pre> |
− | var dashcodePartSupport = {
| + | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
− | "imageBgParts": {}
| + | <html> |
− | };
| + | <head> |
− | if (!window.dashcode) {
| + | <meta http-equiv="content-type" content="text/html; charset=utf-8"> |
− | dashcode = new Object()
| + | <link rel="stylesheet" href="main.css"> |
− | }
| + | </head> |
− | dashcode.setupParts = function () {
| + | <body> |
− | if (dashcode.setupParts.called) {
| + | <center> <h1>Hello World!</h1></center> |
− | return
| + | </body> |
− | }
| + | </html> |
− | dashcode.setupParts.called = true;
| + | </pre></code> |
− | var H = [];
| |
− | if (window.dashcodeDataSources && !dashcode.inDesign) {
| |
− | for (var C in dashcodeDataSources) {
| |
− | var E = dashcodeDataSources[C];
| |
− | var A = dashcode.setupDataSource(C, E);
| |
− | if (A) {
| |
− | A.registerWithName(C)
| |
− | }
| |
− | }
| |
− | }
| |
− | for (
| |
− | var C in dashcodePartSpecs) {
| |
− | dashcode.preProcessBindings(dashcodePartSpecs[C])
| |
− | }
| |
− | if (!DC.Support.BorderImage) {
| |
− | var G = dashcodePartSupport.imageBgParts;
| |
− | for (var B in G) {
| |
− | var D = G[B];
| |
− | Element.set3PiecesBorderImage(document.getElementById(B), D[0], D[1], D[2])
| |
− | }
| |
− | }
| |
− | for (var C in dashcodePartSpecs) {
| |
− | var E = dashcodePartSpecs[C];
| |
− | var F = dashcode.setupPart(C, E.creationFunction, E.view, E);
| |
− | if (F && F.finishLoading) {
| |
− | H[H.length] = F
| |
− | }
| |
− | }
| |
− | for (var I = 0; I < H.length; I++) {
| |
− | H[I].finishLoading()
| |
− | }
| |
− | };
| |
− | dashcode.setupPart = function (elementOrId, creationFunction, viewClass, specDict, relativeController) {
| |
− | var object = null;
| |
− | var createFunc = window[creationFunction];
| |
− | var node = elementOrId;
| |
− | if (elementOrId.nodeType != 1) {
| |
− | node = document.getElementById(elementOrId)
| |
− | }
| |
− | if (!node) {
| |
− | return null
| |
− | }
| |
− | if (createFunc) {
| |
− | object = createFunc(node, specDict)
| |
− | } else {
| |
− | var viewClass = null;
| |
− | object = DC.View.fromNode(node);
| |
− | if (object) {
| |
− | return object
| |
− | }
| |
− | if (specDict.view) {
| |
− | viewClass = eval(specDict.view)
| |
− | }
| |
− | if (dashcode.inDesign) {
| |
− | dashcode.preProcessBindings(specDict)
| |
− | }
| |
− | if (!viewClass) {
| |
− | viewClass = DC.View.viewClassForNode(node, specDict.hasBindings) || DC.View
| |
− | }
| |
− | object = new(viewClass)(node, relativeController, specDict.propertyValues, specDict);
| |
− | node.object = object
| |
− | }
| |
− | return object
| |
− | };
| |
− | dashcode.setupDataSource = function (identifier, specDict) {
| |
− | var dsClass = null;
| |
− | var dataSource = null;
| |
− | try {
| |
− | dsClass = specDict.Class ? eval(specDict.Class) : null
| |
− | } catch (e) {}
| |
− | if (!dsClass) {
| |
− | console.error("Couldn't create data source " + identifier + ". Invalid class specified.");
| |
− | return null
| |
− | }
| |
− | var propertyValues = specDict.propertyValues;
| |
− | dataSource = new dsClass(propertyValues);
| |
− | return dataSource
| |
− | };
| |
− | dashcode.getDataSource = function (A) {
| |
− | return DC.dataModel.valueForKey(A)
| |
− | };
| |
− | dashcode.preProcessBindings = function (A) {
| |
− | if (A && A.propertyValues && !A.hasBindings) {
| |
− | for (p in A.propertyValues) {
| |
− | if (-1 !== p.search(/Binding$/)) {
| |
− | A.hasBindings = true;
| |
− | if (dashcode.inDesign) {
| |
− | delete A.propertyValues[p]
| |
− | } else {
| |
− | break
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− | };
| |
− | if (window.addEventListener) {
| |
− | window.addEventListener("load", dashcode.setupParts, false)
| |
− | } else {
| |
− | if (window.attachEvent) {
| |
− | window.attachEvent("load", dashcode.setupParts)
| |
− | }
| |
− | }
| |
− | dashcode.getLocalizedString = function (A) {
| |
− | try {
| |
− | A = localizedStrings[A] || A
| |
− | } catch (B) {}
| |
− | return A
| |
− | };
| |
− | dashcode.createInstancePreferenceKey = function (A) {
| |
− | return widget.identifier + "-" + A
| |
− | };
| |
− | dashcode.getElementHeight = function (B) {
| |
− | var A = B.offsetHeight;
| |
− | if (!A || A == 0) {
| |
− | A = dashcode.getElementSize(B).height
| |
− | }
| |
− | return A
| |
− | };
| |
− | dashcode.getElementWidth = function (B) {
| |
− | var A = B.offsetWidth;
| |
− | if (!A || A == 0) {
| |
− | A = dashcode.getElementSize(B).width
| |
− | }
| |
− | return A
| |
− | };
| |
− | dashcode.getElementSize = function (B) {
| |
− | var A = dashcode.getElementSizesWithAncestor([B], B);
| |
− | return A[0]
| |
− | };
| |
− | dashcode.getElementSizesWithAncestor = function (A, F) {
| |
− | if (A.length < 1) {
| |
− | return []
| |
− | }
| |
− | var B = new Array();
| |
− | var C = A[0].offsetWidth;
| |
− | if (!C || C == 0) {
| |
− | var G = F;
| |
− | while (G && (G != document)) {
| |
− | var I = Element.getStyles(G, "display");
| |
− | var H = (I) ? I : G.style.display;
| |
− | if ((I && H == "none") || (!I && H != "block")) {
| |
− | B.push({
| |
− | node: G,
| |
− | display: G.style.display
| |
− | });
| |
− | G.style.display = "block"
| |
− | }
| |
− | G = G.parentNode
| |
− | }
| |
− | }
| |
− | var J = new Array();
| |
− | for (var E = 0; E < A.length; E++) {
| |
− | J.push({
| |
− | width: A[E].offsetWidth,
| |
− | height: A[E].offsetHeight
| |
− | })
| |
− | }
| |
− | for (var E = 0; E < B.length; E++) {
| |
− | var D = B[E].node;
| |
− | D.style.display = B[E].display;
| |
− | if (D.getAttribute("style") == "") {
| |
− | D.removeAttribute("style")
| |
− | }
| |
− | }
| |
− | return J
| |
− | };
| |
− | dashcode.getElementDocumentOffset = function (B) {
| |
− | var C = B.offsetParent;
| |
− | var D = {
| |
− | x: B.offsetLeft,
| |
− | y: B.offsetTop
| |
− | };
| |
− | if (C) {
| |
− | var A = dashcode.getElementDocumentOffset(C);
| |
− | D.x += A.x;
| |
− | D.y += A.y
| |
− | }
| |
− | return D
| |
− | };
| |
− | dashcode.pointInElement = function (A, E, D) {
| |
− | var C = dashcode.getElementSize(D);
| |
− | var B = dashcode.getElementDocumentOffset(D);
| |
− | if (A >= B.x) {
| |
− | if (A > B.x + C.width) {
| |
− | return false
| |
− | }
| |
− | if (E >= B.y) {
| |
− | if (E > B.y + C.height) {
| |
− | return false
| |
− | }
| |
− | } else {
| |
− | return false
| |
− | }
| |
− | } else {
| |
− | return false
| |
− | }
| |
− | return true
| |
− | };
| |
− | dashcode.cloneTemplateElement = function (B, A, C) {
| |
− | return DC.View.cloneViewsForTreeNode(B, C, null)
| |
− | };
| |
− | dashcode.processClonedTemplateElement = function (D, C, B, F, E, A) {
| |
− | console.error("dashcode.processClonedTemplateElement is no longer available.")
| |
− | };
| |
− | var setupParts = dashcode.setupParts;
| |
− | var getLocalizedString = dashcode.getLocalizedString;
| |
− | var createInstancePreferenceKey = dashcode.createInstancePreferenceKey;
| |
− | var getElementHeight = dashcode.getElementHeight;
| |
− | var getElementWidth = dashcode.getElementWidth;
| |
− | var getElementSize = dashcode.getElementSize;
| |
− | if (!("querySelector" in document)) {
| |
− | document.write('<script apple-no-regeneration="yes" type="text/javascript" src="../Parts/core/external/sizzle_c.js"><\/script>')
| |
− | };
| |
− | if ("undefined" !== typeof (DC)) {
| |
− | throw new Error("Library module (DC) already defined")
| |
− | }
| |
− | var DC = {
| |
− | version: "@VERSION@",
| |
− | revision: "@REVISION@",
| |
− | generateUid: (function () {
| |
− | var A = 0;
| |
− | return function () {
| |
− | return ++A
| |
− | }
| |
− | })()
| |
− | };
| |
− | DC.Browser = {
| |
− | IE: !! (window.attachEvent && !window.opera) && (function () {
| |
− | var B = /MSIE (\d+)/;
| |
− | var A = B.exec(navigator.userAgent);
| |
− | return A && parseInt(A[1], 10)
| |
− | })(),
| |
− | Safari: navigator.userAgent.indexOf("AppleWebKit/") > -1,
| |
− | Safari2: (function () {
| |
− | var A = /AppleWebKit\/(\d+(?:\.\d+)?)/;
| |
− | var B = A.exec(navigator.userAgent);
| |
− | return (B && parseInt(B[1], 10) < 420)
| |
− | })(), | |
− | Mozilla: navigator.userAgent.indexOf("Gecko") > -1 && navigator.userAgent.indexOf("KHTML") == -1,
| |
− | MobileSafari: !! navigator.userAgent.match(/Apple.*Mobile.*Safari/)
| |
− | };
| |
− | DC.Support = {
| |
− | Properties: ("__defineGetter__" in Object.prototype),
| |
− | QuerySelector: ("querySelector" in document),
| |
− | Touches: !! document.createTouch,
| |
− | CSS3ColorModel: false,
| |
− | CSSTransitions: false,
| |
− | BorderImage: (function () {
| |
− | var A = document.createElement("div").style;
| |
− | A.cssText = "-webkit-border-image: inherit; -moz-border-image: inherit;";
| |
− | return (A.WebkitBorderImage == "inherit") || (A.MozBorderImage == "inherit")
| |
− | })()
| |
− | };
| |
− | if (DC.Support.Properties) {
| |
− | DC.Support.__defineGetter__("CSS3ColorModel", function () {
| |
− | delete this.CSS3ColorModel;
| |
− | var B = document.createElement("span");
| |
− | try {
| |
− | B.style.backgroundColor = "rgba(100,100,100,0.5)";
| |
− | return this.CSS3ColorModel = (B.style.length === 1)
| |
− | } catch (A) {}
| |
− | return (this.CSS3ColorModel = false)
| |
− | });
| |
− | DC.Support.__defineGetter__("CSSTransitions", function () {
| |
− | delete this.CSSTransitions;
| |
− | var B = document.createElement("span");
| |
− | try {
| |
− | B.style.setProperty("-webkit-transition-duration", "1ms", "");
| |
− | return this.CSSTransitions = (B.style.length === 1)
| |
− | } catch (A) {}
| |
− | return (this.CSSTransitions = false)
| |
− | }) | |
− | }
| |
− | DC.typeOf = function (B) {
| |
− | if (null === B) {
| |
− | return "null"
| |
− | }
| |
− | var A = typeof (B);
| |
− | if ("object" !== A && "function" !== A) {
| |
− | return A
| |
− | }
| |
− | return Object.prototype.toString.call(B).slice(8, -1).toLowerCase()
| |
− | };
| |
− | DC.compareValues = function (F, D) {
| |
− | var C = DC.typeOf(F);
| |
− | if (C !== DC.typeOf(D)) {
| |
− | var A = String(F);
| |
− | var E = String(D);
| |
− | return A.localeCompare(E)
| |
− | }
| |
− | switch (C) {
| |
− | case "null":
| |
− | return 0;
| |
− | case "boolean":
| |
− | case "number":
| |
− | var B = (F - D);
| |
− | if (0 === B) {
| |
− | return B
| |
− | }
| |
− | return (B < 0 ? -1 : 1);
| |
− | case "regexp":
| |
− | case "function":
| |
− | break;
| |
− | case "string":
| |
− | case "array":
| |
− | case "object":
| |
− | if (F.localeCompare) {
| |
− | return F.localeCompare(D)
| |
− | }
| |
− | if (F.compare) {
| |
− | return F.compare(D)
| |
− | }
| |
− | break;
| |
− | case "undefined":
| |
− | return true;
| |
− | default:
| |
− | throw new TypeError("Unknown type for comparison: " + C)
| |
− | }
| |
− | return String(F).localeCompare(String(D))
| |
− | };
| |
− | DC.defineError = function (B) {
| |
− | function A(C) {
| |
− | this.message = C;
| |
− | this.name = B
| |
− | }
| |
− | A.prototype = new Error;
| |
− | A.prototype.constructor = A;
| |
− | A.prototype.name = B;
| |
− | return A
| |
− | };
| |
− | var InvalidArgumentError = DC.defineError("InvalidArgumentError");
| |
− | if ("undefined" == typeof (window.console)) {
| |
− | window.console = {}
| |
− | }
| |
− | if ("undefined" == typeof (window.console.log)) {
| |
− | window.console.log = function () {}
| |
− | }
| |
− | if ("undefined" == typeof (window.console.error)) {
| |
− | window.console.error = function () {}
| |
− | };
| |
− | if ("undefined" !== typeof (window.Prototype)) {
| |
− | (function () {
| |
− | var A = ["indexOf", "lastIndexOf", "forEach", "filter", "map", "some", "every", "reduce", "reduceRight"];
| |
− | for (var B = 0; B < A.length; ++B) {
| |
− | delete Array.prototype[A[B]]
| |
− | }
| |
− | })()
| |
− | }
| |
− | Array.prototype.distinct = function () {
| |
− | var B = this.length;
| |
− | var A = new Array(B);
| |
− | var C;
| |
− | var E;
| |
− | var D = 0;
| |
− | for (C = 0; C < B; ++C) {
| |
− | E = this[C];
| |
− | if (-1 == A.indexOf(E)) {
| |
− | A[D++] = E
| |
− | }
| |
− | }
| |
− | A.length = D;
| |
− | return A
| |
− | };
| |
− | Array.prototype.compare = function (B) {
| |
− | var D = this.length - B.length;
| |
− | if (0 !== D) {
| |
− | return D
| |
− | }
| |
− | var E;
| |
− | var A;
| |
− | var C;
| |
− | for (E = 0, A = this.length; E < A; ++E) {
| |
− | C = DC.compareValues(this[E], B[E]);
| |
− | if (0 !== C) {
| |
− | return C
| |
− | }
| |
− | }
| |
− | return 0
| |
− | };
| |
− | Array.from = function (A, B) {
| |
− | return Array.prototype.slice.call(A, B || 0)
| |
− | };
| |
− | if (!Array.prototype.reduce) {
| |
− | Array.prototype.reduce = function (B) {
| |
− | var A = this.length;
| |
− | if (typeof B != "function") {
| |
− | throw new TypeError()
| |
− | }
| |
− | if (0 === A && 1 === arguments.length) {
| |
− | throw new TypeError()
| |
− | }
| |
− | var C = 0;
| |
− | if (arguments.length >= 2) {
| |
− | var D = arguments[1]
| |
− | } else {
| |
− | do {
| |
− | if (C in this) {
| |
− | D = this[C++];
| |
− | break
| |
− | }
| |
− | if (++C >= A) {
| |
− | throw new TypeError()
| |
− | }
| |
− | } while (true)
| |
− | }
| |
− | for (; C < A; C++) {
| |
− | if (C in this) {
| |
− | D = B.call(null, D, this[C], C, this)
| |
− | }
| |
− | }
| |
− | return D
| |
− | }
| |
− | }
| |
− | if (!Array.prototype.reduceRight) {
| |
− | Array.prototype.reduceRight = function (B) {
| |
− | var A = this.length;
| |
− | if (typeof B != "function") {
| |
− | throw new TypeError()
| |
− | }
| |
− | if (0 === A && 1 === arguments.length) {
| |
− | throw new TypeError()
| |
− | }
| |
− | var C = A - 1;
| |
− | if (arguments.length >= 2) {
| |
− | var D = arguments[1]
| |
− | } else {
| |
− | do {
| |
− | if (C in this) {
| |
− | D = this[C--];
| |
− | break
| |
− | }
| |
− | if (--C < 0) {
| |
− | throw new TypeError()
| |
− | }
| |
− | } while (true)
| |
− | }
| |
− | for (; C >= 0; C--) {
| |
− | if (C in this) {
| |
− | D = B.call(null, D, this[C], C, this)
| |
− | }
| |
− | }
| |
− | return D
| |
− | }
| |
− | }
| |
− | if (!Array.indexOf) {
| |
− | Array.indexOf = function (C, B, A) {
| |
− | return Array.prototype.indexOf.call(C, B, A)
| |
− | }
| |
− | }
| |
− | if (!Array.lastIndexOf) {
| |
− | Array.lastIndexOf = function (C, B, A) {
| |
− | return Array.prototype.lastIndexOf.call(C, B, A)
| |
− | }
| |
− | }
| |
− | if (!Array.forEach) {
| |
− | Array.forEach = function (C, A, B) {
| |
− | return Array.prototype.forEach.call(C, A, B)
| |
− | }
| |
− | }
| |
− | if (!Array.filter) {
| |
− | Array.filter = function (C, A, B) {
| |
− | return Array.prototype.filter.call(C, A, B)
| |
− | }
| |
− | }
| |
− | if (!Array.map) {
| |
− | Array.map = function (C, A, B) {
| |
− | return Array.prototype.map.call(C, A, B)
| |
− | }
| |
− | }
| |
− | if (!Array.some) {
| |
− | Array.some = function (C, A, B) {
| |
− | return Array.prototype.some.call(C, A, B)
| |
− | }
| |
− | }
| |
− | if (!Array.every) {
| |
− | Array.every = function (C, A, B) {
| |
− | return Array.prototype.every.call(C, A, B)
| |
− | }
| |
− | }
| |
− | if (!Array.reduce) {
| |
− | Array.reduce = function (B, A) {
| |
− | if (arguments.length > 2) {
| |
− | return Array.prototype.reduce.apply(B, A, arguments[2])
| |
− | } else {
| |
− | return Array.prototype.reduce.apply(B, A)
| |
− | }
| |
− | }
| |
− | }
| |
− | if (!Array.reduceRight) {
| |
− | Array.reduceRight = function (B, A) {
| |
− | if (arguments.length > 2) {
| |
− | return Array.prototype.reduceRight.apply(B, A, arguments[2])
| |
− | } else {
| |
− | return Array.prototype.reduceRight.apply(B, A)
| |
− | }
| |
− | }
| |
− | };
| |
| | | |
− | function Set() {
| + | <br /> |
− | var D = this;
| + | * Info.plist |
− | if (D.constructor !== Set) {
| + | <br /> |
− | D = new Set()
| + | <code><pre> |
− | }
| + | <?xml version="1.0" encoding="UTF-8"?> |
− | var B = arguments;
| + | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
− | if (1 == B.length && B[0] instanceof Array) {
| + | <plist version="1.0"> |
− | B = B[0]
| + | <dict> |
− | }
| + | <key>CFBundleDevelopmentRegion</key> |
− | var C;
| + | <string>English</string> |
− | var A = B.length;
| + | <key>CFBundleDisplayName</key> |
− | for (C = 0; C < A; ++C) {
| + | <string>skeleton2</string> |
− | D[B[C]] = true
| + | <key>CFBundleIdentifier</key> |
− | }
| + | <string>com.thiebaut.widget.Untitled</string> |
− | return D
| + | <key>CFBundleName</key> |
− | }
| + | <string>skeleton2</string> |
− | Set.union = function (C, B) {
| + | <key>CFBundleShortVersionString</key> |
− | var A = Object.clone(C);
| + | <string>1.0</string> |
− | if (!B) {
| + | <key>CFBundleVersion</key> |
− | return A
| + | <string>1.0</string> |
− | }
| + | <key>CloseBoxInsetX</key> |
− | var D;
| + | <integer>15</integer> |
− | for (D in B) {
| + | <key>CloseBoxInsetY</key> |
− | A[D] = true
| + | <integer>15</integer> |
− | }
| + | <key>Height</key> |
− | return A
| + | <integer>380</integer> |
− | };
| + | <key>MainHTML</key> |
− | Set.intersect = function (C, B) {
| + | <string>main.html</string> |
− | var A = new Set();
| + | <key>Width</key> |
− | var D;
| + | <integer>280</integer> |
− | for (D in C) {
| + | </dict> |
− | if (D in B) {
| + | </plist> |
− | A[D] = true
| |
− | }
| |
− | }
| |
− | return A
| |
− | };
| |
− | Set.add = function (B, A) {
| |
− | B[A] = true;
| |
− | return B
| |
− | };
| |
− | Set.remove = function (B, A) {
| |
− | delete B[A];
| |
− | return B
| |
− | };
| |
− | Set.toArray = function (C) {
| |
− | var B;
| |
− | var A = [];
| |
− | for (B in C) {
| |
− | A.push(B)
| |
− | }
| |
− | return A
| |
− | };
| |
− | Set.forEach = function (E, C, B) {
| |
− | var D;
| |
− | var A = 0;
| |
− | for (D in E) {
| |
− | C.call(B, D, A++)
| |
− | }
| |
− | };
| |
− | Set.join = function (D, B) {
| |
− | var C;
| |
− | var A = [];
| |
− | for (C in D) {
| |
− | A.push(C)
| |
− | }
| |
− | return A.join(B || "")
| |
− | };
| |
− | var $S = Set;
| |
− | var Class = (function () {
| |
− | function D(I, L) {
| |
− | var J;
| |
− | if (!I && !L) {
| |
− | return I
| |
− | }
| |
− | if (!I) {
| |
− | J = function () {
| |
− | return L.apply(this, arguments)
| |
− | }
| |
− | } else {
| |
− | var K = /this\.base/.test(I);
| |
− | if (!K && !L) {
| |
− | return I
| |
− | }
| |
− | if (!K) {
| |
− | J = function () {
| |
− | L.call(this);
| |
− | return I.apply(this, arguments)
| |
− | }
| |
− | } else {
| |
− | J = function () {
| |
− | var N = this.base;
| |
− | this.base = L || function () {};
| |
− | var M = I.apply(this, arguments);
| |
− | this.base = N;
| |
− | return M
| |
− | }
| |
− | }
| |
− | }
| |
− | J.valueOf = function () {
| |
− | return I
| |
− | };
| |
− | J.toString = function () {
| |
− | return String(I)
| |
− | };
| |
− | return J
| |
− | }
| |
− | function G(I, J) {
| |
− | var K = I.prototype.__factory__.apply(I, J);
| |
− | if ("function" !== typeof (K)) {
| |
− | throw new Error("Factory function doesn't return a function")
| |
− | }
| |
− | K.__factoryFn__ = true;
| |
− | return K
| |
− | }
| |
− | function F(K) {
| |
− | if (K.__createFactoryObjects) {
| |
− | K.__createFactoryObjects();
| |
− | return
| |
− | }
| |
− | var J;
| |
− | var I;
| |
− | for (J in K.__factories__) {
| |
− | I = K[J];
| |
− | if (!I.__factoryFn__) {
| |
− | continue
| |
− | }
| |
− | K[J] = I.call(K)
| |
− | }
| |
− | }
| |
− | function C(I, K) {
| |
− | if (I && !(I instanceof Function)) {
| |
− | throw new Error("Invalid constructor")
| |
− | }
| |
− | if (K && !(K instanceof Function)) {
| |
− | throw new Error("Invalid superclass")
| |
− | }
| |
− | K = K ? K.valueOf() : null;
| |
− | I = D(I, K);
| |
− | var J;
| |
− | if (I) {
| |
− | J = function () {
| |
− | if (!(this instanceof J)) {
| |
− | return G(J, arguments)
| |
− | }
| |
− | this.__uid = this.__uid || DC.generateUid();
| |
− | var L = I.apply(this, arguments);
| |
− | if (L) {
| |
− | return L
| |
− | }
| |
− | F(this);
| |
− | if (this.__postConstruct instanceof Function) {
| |
− | this.__postConstruct()
| |
− | }
| |
− | return this
| |
− | }
| |
− | } else {
| |
− | J = function () {
| |
− | if (!(this instanceof J)) {
| |
− | return G(J, arguments)
| |
− | }
| |
− | this.__uid = this.__uid || DC.generateUid();
| |
− | F(this);
| |
− | if (this.__postConstruct instanceof Function) {
| |
− | this.__postConstruct()
| |
− | }
| |
− | return this
| |
− | }
| |
− | }
| |
− | J.valueOf = function () {
| |
− | return I
| |
− | };
| |
− | J.toString = function () {
| |
− | return String(I || J)
| |
− | };
| |
− | return J
| |
− | }
| |
− | function B(J) {
| |
− | function I() {}
| |
− | I.prototype = J.prototype;
| |
− | return new I()
| |
− | }
| |
− | function E(L, J, K) {
| |
− | if (!L || !/this\.base/.test(L)) {
| |
− | return L
| |
− | }
| |
− | function I() {
| |
− | var N = this.base;
| |
− | this.base = K[J] || function () {};
| |
− | var M = L.apply(this, arguments);
| |
− | this.base = N;
| |
− | return M
| |
− | }
| |
− | I.valueOf = function () {
| |
− | return L
| |
− | };
| |
− | I.toString = function () {
| |
− | return String(L)
| |
− | };
| |
− | return I
| |
− | }
| |
− | function H(J, I, K, L) {
| |
− | if (K instanceof Function && L) {
| |
− | var M = K.valueOf();
| |
− | K = E(K, I, L);
| |
− | K.name = I;
| |
− | if (M.__factoryFn__) {
| |
− | J.__factories__[I] = K
| |
− | }
| |
− | }
| |
− | J[I] = K;
| |
− | return K
| |
− | }
| |
− | function A(J) {
| |
− | var I;
| |
− | for (I = J.superclass; I; I = I.superclass) {
| |
− | if ("__subclassCreated__" in I) {
| |
− | I.__subclassCreated__(J)
| |
− | }
| |
− | }
| |
− | }
| |
− | return {
| |
− | create: function (L, J) {
| |
− | var I;
| |
− | var K = {};
| |
− | switch (arguments.length) {
| |
− | case 0:
| |
− | throw new TypeError("Missing superclass and declaration arguments");
| |
− | case 1:
| |
− | J = L;
| |
− | L = undefined;
| |
− | break;
| |
− | default:
| |
− | K = B(L);
| |
− | break
| |
− | }
| |
− | if ("function" == typeof (J)) {
| |
− | J = J();
| |
− | if (!J) {
| |
− | throw new Error("Class declaration function did not return a prototype")
| |
− | }
| |
− | }
| |
− | if (J.hasOwnProperty("constructor")) {
| |
− | I = J.constructor;
| |
− | delete J.constructor
| |
− | }
| |
− | I = C(I, L);
| |
− | I.prototype = K;
| |
− | I.prototype.constructor = I;
| |
− | I.superclass = L;
| |
− | if (L) {
| |
− | K.__factories__ = Object.clone(L.prototype.__factories__)
| |
− | } else {
| |
− | K.__factories__ = {}
| |
− | }
| |
− | I.__class_id__ = DC.generateUid();
| |
− | K.__class_id__ = DC.generateUid();
| |
− | this.extend(I, J);
| |
− | A(I);
| |
− | return I
| |
− | },
| |
− | findPropertyName: function (L, I) {
| |
− | var J;
| |
− | for (var K in L) {
| |
− | J = L[K];
| |
− | if (J === I || ("function" === typeof (J) && J.valueOf() === I)) {
| |
− | return K
| |
− | }
| |
− | }
| |
− | return null
| |
− | },
| |
− | extend: (function () {
| |
− | if (DC.Support.Properties) {
| |
− | return function (I, J) {
| |
− | var N = I.prototype;
| |
− | var P = I.superclass && I.superclass.prototype;
| |
− | var K;
| |
− | for (var O in J) {
| |
− | var M = J.__lookupGetter__(O);
| |
− | var L = J.__lookupSetter__(O);
| |
− | if (M || L) {
| |
− | M && N.__defineGetter__(O, M);
| |
− | L && N.__defineSetter__(O, L)
| |
− | } else {
| |
− | H(N, O, J[O], P)
| |
− | }
| |
− | }
| |
− | return I
| |
− | }
| |
− | } else {
| |
− | return function (I, J) {
| |
− | var K = I.prototype;
| |
− | var M = I.superclass && I.superclass.prototype;
| |
− | for (var L in J) {
| |
− | H(K, L, J[L], M)
| |
− | }
| |
− | }
| |
− | }
| |
− | })()
| |
− | }
| |
− | })();
| |
− | if (!Function.prototype.bind) {
| |
− | Function.prototype.bind = function (C) {
| |
− | var A = this;
| |
− | if (!arguments.length) {
| |
− | return A
| |
− | }
| |
− | if (1 == arguments.length) {
| |
− | return function () {
| |
− | return A.apply(C, arguments)
| |
− | }
| |
− | }
| |
− | var B = Array.from(arguments, 1);
| |
− | return function () {
| |
− | return A.apply(C, B.concat(Array.from(arguments)))
| |
− | }
| |
− | }
| |
− | }
| |
− | if (!Function.prototype.bindAsEventListener) {
| |
− | Function.prototype.bindAsEventListener = function (C) {
| |
− | var A = this;
| |
− | if (1 == arguments.length) {
| |
− | return function (D) {
| |
− | return A.call(C, D || window.event)
| |
− | }
| |
− | }
| |
− | var B = Array.from(arguments);
| |
− | B.shift();
| |
− | return function (D) {
| |
− | return A.apply(C, [D || window.event].concat(B))
| |
− | }
| |
− | }
| |
− | }
| |
− | if (!Function.prototype.delay) {
| |
− | Function.prototype.delay = function (D) {
| |
− | var B = this;
| |
− | D = D || 10;
| |
− | if (arguments.length < 2) {
| |
− | function A() {
| |
− | B()
| |
− | }
| |
− | return window.setTimeout(A, D)
| |
− | }
| |
− | var C = Array.from(arguments, 1);
| |
| | | |
− | function E() {
| + | </pre></code> |
− | B.apply(B, C)
| + | <br /> |
− | }
| |
− | return window.setTimeout(E, D)
| |
− | }
| |
− | }
| |
− | if (!Function.prototype.bindAndDelay) {
| |
− | Function.prototype.bindAndDelay = function (F, D) {
| |
− | var B = this;
| |
− | F = F || B;
| |
− | D = D || 10;
| |
− | if (arguments.length < 3) {
| |
− | function A() {
| |
− | B.call(F)
| |
− | }
| |
− | return window.setTimeout(A, D)
| |
− | }
| |
− | var C = Array.from(arguments, 2);
| |
− | | |
− | function E() {
| |
− | B.apply(F, C)
| |
− | }
| |
− | return window.setTimeout(E, D)
| |
− | }
| |
− | }
| |
− | Function.prototype.sync = function () {
| |
− | var B = arguments.length ? this.bind.apply(this, arguments) : this;
| |
− | var A = {};
| |
− | var C = false;
| |
− | B.stop = function () {
| |
− | C = true
| |
− | };
| |
− | B.waitFor = function (D) {
| |
− | A[D] = true;
| |
− | return function () {
| |
− | A[D] = false;
| |
− | for (var E in A) {
| |
− | if (A[E]) {
| |
− | return
| |
− | }
| |
− | }
| |
− | if (C) {
| |
− | return
| |
− | }
| |
− | B()
| |
− | }
| |
− | };
| |
− | return B
| |
− | };
| |
− | Object.clone = function (B) {
| |
− | var A = (function () {});
| |
− | A.prototype = B;
| |
− | return new A()
| |
− | };
| |
− | Object.applyDefaults = function (C, B) {
| |
− | C = C || {};
| |
− | if (!B) {
| |
− | return C
| |
− | }
| |
− | for (var A in B) {
| |
− | if (A in C) {
| |
− | continue
| |
− | }
| |
− | C[A] = B[A]
| |
− | }
| |
− | return C
| |
− | };
| |
− | Object.extend = function (C, A) {
| |
− | C = C || {};
| |
− | for (var B in A) {
| |
− | C[B] = A[B]
| |
− | }
| |
− | return C
| |
− | };
| |
− | Object.merge = function (C, A) {
| |
− | var B = {};
| |
− | var D;
| |
− | for (D in C) {
| |
− | B[D] = C[D]
| |
− | }
| |
− | for (D in A) {
| |
− | if (D in B) {
| |
− | continue
| |
− | }
| |
− | B[D] = A[D]
| |
− | }
| |
− | return B
| |
− | };
| |
− | (function () {
| |
− | var B = Set("file", "submit", "image", "reset", "button");
| |
− | var D = {};
| |
− | | |
− | function E(I, H, J) {
| |
− | var G = I[H];
| |
− | var F = DC.typeOf(G);
| |
− | if ("string" === F) {
| |
− | I[H] = [G, J]
| |
− | } else {
| |
− | if ("array" === F) {
| |
− | G.push(J)
| |
− | } else {
| |
− | I[H] = J
| |
− | }
| |
− | }
| |
− | }
| |
− | function C(H) {
| |
− | var F = H.name;
| |
− | var G = (H.type || "").toLowerCase();
| |
− | if (H.disabled || G in B) {
| |
− | return
| |
− | }
| |
− | if ("radio" === G || "checkbox" === G) {
| |
− | if (H.checked) {
| |
− | E(this, F, H.value)
| |
− | }
| |
− | } else {
| |
− | if (H.multiple) {
| |
− | function I(J) {
| |
− | if (J.selected) {
| |
− | E(this, F, J.value)
| |
− | }
| |
− | }
| |
− | this[F] = [];
| |
− | Array.forEach(H.options, I, this)
| |
− | } else {
| |
− | E(this, F, H.value);
| |
− | if ("image" === G) {
| |
− | E(this, F + ".x", 0);
| |
− | E(this, F + ".y", 0)
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− | Object.fromForm = function (G) {
| |
− | var F = {};
| |
− | Array.forEach(G.elements, C, F);
| |
− | return F
| |
− | };
| |
− | | |
− | function A(H) {
| |
− | H = H.split("=");
| |
− | if (1 === H.length) {
| |
− | return
| |
− | }
| |
− | var F = decodeURIComponent(H[0].trim());
| |
− | var G = decodeURIComponent(H[1].trim()) || null;
| |
− | E(this, F, G)
| |
− | }
| |
− | Object.fromQueryString = function (G) {
| |
− | if ("?" == G.charAt(0)) {
| |
− | G = G.slice(1)
| |
− | }
| |
− | G = G.split(/\s*&\s*/);
| |
− | var F = {};
| |
− | G.forEach(A, F);
| |
− | return F
| |
− | };
| |
− | Object.toQueryString = function (K) {
| |
− | if (!K) {
| |
− | return ""
| |
− | }
| |
− | var H;
| |
− | var J;
| |
− | var F;
| |
− | var G = [];
| |
− | | |
− | function I(M) {
| |
− | if (null !== M && "undefined" !== typeof (M)) {
| |
− | M = encodeURIComponent(M)
| |
− | }
| |
− | var L = M + "";
| |
− | if (L.length) {
| |
− | G.push(H + "=" + L)
| |
− | } else {
| |
− | G.push(H)
| |
− | }
| |
− | }
| |
− | for (H in K) {
| |
− | J = K[H];
| |
− | F = DC.typeOf(J);
| |
− | if ("function" === F || J === D[H]) {
| |
− | continue
| |
− | }
| |
− | H = encodeURIComponent(H);
| |
− | if ("array" === F) {
| |
− | J.forEach(I)
| |
− | } else {
| |
− | I(J)
| |
− | }
| |
− | }
| |
− | return G.join("&")
| |
− | }
| |
− | })();
| |
− | RegExp.escape = function (A) {
| |
− | return A.replace(RegExp._escapeRegex, "\\$1")
| |
− | };
| |
− | RegExp.specialCharacters = ["/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\"];
| |
− | RegExp._escapeRegex = new RegExp("(\\" + RegExp.specialCharacters.join("|\\") + ")", "g");
| |
− | DC.strings = {
| |
− | "marker.input.multipleValues": "Multiple Values",
| |
− | "marker.input.placeholder": "",
| |
− | "marker.input.noSelection": "No Selection",
| |
− | "marker.text.multipleValues": "Multiple Values",
| |
− | "marker.text.placeholder": "",
| |
− | "marker.text.noSelection": "No Selection",
| |
− | "error.no_description": "An unspecified error occurred.",
| |
− | "error.invalid_value": "This value is not valid.",
| |
− | "error.invalid_number": "This value is not a valid number."
| |
− | };
| |
− | DC.localisedString = function (A) {
| |
− | return {
| |
− | toString: function () {
| |
− | if (A in DC.strings) {
| |
− | return DC.strings[A]
| |
− | }
| |
− | console.log("Localisation missing string for key: " + A);
| |
− | return A
| |
− | }
| |
− | }
| |
− | };
| |
− | var _ = DC.localisedString;
| |
− | DC.Error = Class.create({
| |
− | constructor: function (A) {
| |
− | Object.extend(this, A)
| |
− | },
| |
− | description: _("error.no_description"),
| |
− | recoverySuggestion: null
| |
− | });
| |
− | DC.KeyInfo = Class.create({
| |
− | constructor: function (D, B) {
| |
− | var A = DC.KVO.getPropertyMethodsForKeyOnObject(B, D);
| |
− | this.__uid = [B, DC.generateUid()].join("_");
| |
− | this.reader = A.getter;
| |
− | this.mutator = A.mutator;
| |
− | this.validator = A.validator;
| |
− | this.key = B;
| |
− | this.mutable = ((this.mutator || !this.reader) ? true : false);
| |
− | if (!this.reader && !this.mutator) {
| |
− | this.mutable = true
| |
− | }
| |
− | this.changeCount = 0;
| |
− | var C = A.value;
| |
− | if (!C) {
| |
− | return
| |
− | }
| |
− | var E = DC.typeOf(C);
| |
− | if (E in DC.KVO.typesOfKeyValuesToIgnore || !C._addParentLink) {
| |
− | return
| |
− | }
| |
− | C._addParentLink(D, this)
| |
− | },
| |
− | get: function (B) {
| |
− | if (this.reader) {
| |
− | return this.reader.call(B)
| |
− | }
| |
− | var A;
| |
− | if (this.key in B) {
| |
− | A = B[this.key]
| |
− | } else {
| |
− | A = null
| |
− | }
| |
− | if (A && A._addParentLink) {
| |
− | A._addParentLink(B, this)
| |
− | }
| |
− | return A
| |
− | },
| |
− | set: function (B, A) {
| |
− | if (this.mutator) {
| |
− | this.mutator.call(B, A)
| |
− | } else {
| |
− | B.willChangeValueForKey(this.key, this);
| |
− | B[this.key] = A;
| |
− | B.didChangeValueForKey(this.key, this)
| |
− | }
| |
− | },
| |
− | validate: function (B, A) {
| |
− | if (!this.validator) {
| |
− | return A
| |
− | }
| |
− | return this.validator.call(B, A)
| |
− | },
| |
− | unlinkParentLink: function () {
| |
− | if (!this.parentLink) {
| |
− | return
| |
− | }
| |
− | this.parentLink.observer = null;
| |
− | this.parentLink.callback = null;
| |
− | this.parentLink = null
| |
− | }
| |
− | });
| |
− | DC.ChangeType = {
| |
− | setting: 0,
| |
− | insertion: 1,
| |
− | deletion: 2,
| |
− | replacement: 3
| |
− | };
| |
− | DC.ChangeNotification = Class.create({
| |
− | constructor: function (D, A, E, C, B) {
| |
− | this.object = D;
| |
− | this.changeType = A;
| |
− | this.newValue = E;
| |
− | this.oldValue = C;
| |
− | this.indexes = B;
| |
− | this.objectKeyPath = []
| |
− | },
| |
− | toString: function () {
| |
− | var A = "[ChangeNotification changeType: ";
| |
− | switch (this.changeType) {
| |
− | case DC.ChangeType.setting:
| |
− | A += "setting";
| |
− | break;
| |
− | case DC.ChangeType.insertion:
| |
− | A += "insertion";
| |
− | break;
| |
− | case DC.ChangeType.deletion:
| |
− | A += "deletion";
| |
− | break;
| |
− | case DC.ChangeType.replacement:
| |
− | A += "replacement";
| |
− | break;
| |
− | default:
| |
− | A += "<<unknown>>";
| |
− | break
| |
− | }
| |
− | A += " newValue=" + this.newValue + " oldValue=" + this.oldValue + (this.indexes ? " indexes=" + this.indexes.join(", ") : "") + "]";
| |
− | return A
| |
− | }
| |
− | });
| |
− | DC.ObserverEntry = Class.create({
| |
− | constructor: function (A, C, B) {
| |
− | this.observer = A;
| |
− | this.callback = C;
| |
− | this.context = B
| |
− | },
| |
− | observeChangeForKeyPath: function (A, B) {
| |
− | if (!this.callback || !this.observer || -1 !== A.objectKeyPath.indexOf(this.observer)) {
| |
− | return
| |
− | }
| |
− | this.callback.call(this.observer, A, B, this.context)
| |
− | }
| |
− | });
| |
− | DC.KVO = Class.create({
| |
− | constructor: function () {},
| |
− | __factory__: function () {
| |
− | var B = Array.from(arguments);
| |
− | var A = this;
| |
− | | |
− | function C() {}
| |
− | return function () {
| |
− | C.prototype = A.prototype;
| |
− | var D = new C();
| |
− | A.prototype.constructor.apply(D, B);
| |
− | return D
| |
− | }
| |
− | },
| |
− | setValueForKeyPath: function (C, D) {
| |
− | if (!D || 0 === D.length) {
| |
− | throw new InvalidArgumentError("keyPath may not be empty")
| |
− | }
| |
− | if ("string" == typeof (D)) {
| |
− | D = D.split(".")
| |
− | }
| |
− | var B = D[0];
| |
− | if (1 == D.length) {
| |
− | this.setValueForKey(C, B);
| |
− | return
| |
− | }
| |
− | if ("@" == B.charAt(0)) {
| |
− | return
| |
− | }
| |
− | var A = this.valueForKey(B);
| |
− | if (!A) {
| |
− | return
| |
− | }
| |
− | A.setValueForKeyPath(C, D.slice(1))
| |
− | },
| |
− | setValueForKey: function (B, A) {
| |
− | if (!A || 0 === A.length) {
| |
− | throw new InvalidArgumentError("key may not be empty")
| |
− | }
| |
− | var C = this.infoForKey(A);
| |
− | if (!C || !C.mutable) {
| |
− | return
| |
− | }
| |
− | C.set(this, B)
| |
− | },
| |
− | valueForKeyPath: function (E) {
| |
− | if (!E || 0 === E.length) {
| |
− | throw new InvalidArgumentError("keyPath may not be empty")
| |
− | }
| |
− | if ("string" == typeof (E)) {
| |
− | E = E.split(".")
| |
− | }
| |
− | var D = E[0];
| |
− | if (1 == E.length) {
| |
− | return this.valueForKey(D)
| |
− | }
| |
− | if ("@" == D.charAt(0)) {
| |
− | var B = D.substr(1);
| |
− | var A = this.valueForKeyPath(E.slice(1));
| |
− | return DC.ArrayOperator[B](A)
| |
− | }
| |
− | var C = this.valueForKey(D);
| |
− | if ("undefined" === typeof (C) || null === C) {
| |
− | return undefined
| |
− | }
| |
− | return C.valueForKeyPath(E.slice(1))
| |
− | },
| |
− | valueForKey: function (A) {
| |
− | if (!A || 0 === A.length) {
| |
− | throw new InvalidArgumentError("the key is empty")
| |
− | }
| |
− | var B = this.infoForKey(A);
| |
− | if (!B) {
| |
− | return null
| |
− | }
| |
− | return B.get(this)
| |
− | },
| |
− | validateValueForKeyPath: function (C, D) {
| |
− | if (!D || 0 === D.length) {
| |
− | throw new InvalidArgumentError("keyPath may not be empty")
| |
− | }
| |
− | if ("string" == typeof (D)) {
| |
− | D = D.split(".")
| |
− | }
| |
− | var B = D[0];
| |
− | if (1 == D.length) {
| |
− | return this.validateValueForKey(C, B)
| |
− | }
| |
− | var A = this.valueForKey(B);
| |
− | if ("undefined" === typeof (A) || null === A) {
| |
− | return C
| |
− | }
| |
− | return A.validateValueForKeyPath(C, D.slice(1))
| |
− | },
| |
− | validateValueForKey: function (B, A) {
| |
− | if (!A || !A.length) {
| |
− | throw new InvalidArgumentError("missing key")
| |
− | }
| |
− | var C = this.infoForKey(A);
| |
− | return C.validate(this, B)
| |
− | },
| |
− | observeChildObjectChangeForKeyPath: function (D, C, A) {
| |
− | if (DC.KVO.kAllPropertiesKey != C) {
| |
− | C = A + "." + C
| |
− | } else {
| |
− | C = A
| |
− | }
| |
− | var B = Object.clone(D);
| |
− | B.object = this;
| |
− | this.notifyObserversOfChangeForKeyPath(B, C)
| |
− | },
| |
− | infoForKeyPath: function (D) {
| |
− | if (!D || 0 === D.length) {
| |
− | throw new InvalidArgumentError("keyPath is empty")
| |
− | }
| |
− | if ("string" == typeof (D)) {
| |
− | D = D.split(".")
| |
− | }
| |
− | var B = D[0];
| |
− | if (1 == D.length) {
| |
− | return this.infoForKey(B)
| |
− | } else {
| |
− | if ("@" == B.charAt(0)) {
| |
− | var C = new DC.KeyInfo(null, null);
| |
− | C.mutable = false;
| |
− | return C
| |
− | } else {
| |
− | var A = this.valueForKey(B);
| |
− | if (!A) {
| |
− | return undefined
| |
− | }
| |
− | if (!A.infoForKeyPath) {
| |
− | return undefined
| |
− | }
| |
− | return A.infoForKeyPath(D.slice(1))
| |
− | }
| |
− | }
| |
− | },
| |
− | infoForKey: function (A) {
| |
− | var B;
| |
− | if (!this.__keys) {
| |
− | this.__keys = {}
| |
− | }
| |
− | if (DC.KVO.kAllPropertiesKey == A) {
| |
− | return null
| |
− | }
| |
− | B = this.__keys[A];
| |
− | if (B) {
| |
− | return B
| |
− | }
| |
− | B = new DC.KeyInfo(this, A);
| |
− | this.__keys[A] = B;
| |
− | return B
| |
− | },
| |
− | setKeysTriggerChangeNotificationsForDependentKey: function (D, C) {
| |
− | if (!D || !D.length) {
| |
− | throw new InvalidArgumentError("keys array is not valid")
| |
− | }
| |
− | if (!C) {
| |
− | throw new InvalidArgumentError("dependentKey can not be null")
| |
− | }
| |
− | if (-1 !== C.indexOf(".")) {
| |
− | throw new InvalidArgumentError("dependentKey may not be a key path")
| |
− | }
| |
− | var B;
| |
− | var F;
| |
− | var A;
| |
− | var E;
| |
− | if ("string" === typeof (D)) {
| |
− | D = [D]
| |
− | }
| |
− | if (!this.__dependentKeys) {
| |
− | this.__dependentKeys = {}
| |
− | }
| |
− | for (A = 0; A < D.length; ++A) {
| |
− | B = D[A];
| |
− | if (!B) {
| |
− | throw new InvalidArgumentError("key at index " + A + " was null")
| |
− | }
| |
− | if (!(B in this.__dependentKeys)) {
| |
− | this.__dependentKeys[B] = []
| |
− | }
| |
− | DC.KVO.getPropertyMethodsForKeyOnObject(B, this);
| |
− | E = this.__dependentKeys[B];
| |
− | if (-1 == E.indexOf(C)) {
| |
− | E.push(C)
| |
− | }
| |
− | }
| |
− | },
| |
− | mutableKeys: function () {
| |
− | var D = [];
| |
− | var B;
| |
− | var A;
| |
− | var C;
| |
− | if ("__mutableKeys" in this && this.__mutableKeys.concat) {
| |
− | return this.__mutableKeys
| |
− | }
| |
− | var E = Set.union(DC.KVO.keysToIgnore, this.__keysToIgnore);
| |
− | for (B in this) {
| |
− | if (B in E || "__" === B.substr(0, 2)) {
| |
− | continue
| |
− | }
| |
− | A = this[B];
| |
− | if ("function" !== typeof (A)) {
| |
− | D.push(B);
| |
− | continue
| |
− | }
| |
− | if (1 !== A.length || "set" !== B.substr(0, 3)) {
| |
− | continue
| |
− | }
| |
− | C = B.charAt(3);
| |
− | if (C !== C.toUpperCase()) {
| |
− | continue
| |
− | }
| |
− | B = C.toLowerCase() + B.substr(4);
| |
− | if (-1 === D.indexOf(B)) {
| |
− | D.push(B)
| |
− | }
| |
− | }
| |
− | return D
| |
− | },
| |
− | initialiseKeyValueObserving: function () {
| |
− | this.__uid = this.__uid || DC.generateUid();
| |
− | this.__observers = {}
| |
− | },
| |
− | _addParentLink: function (D, E, C) {
| |
− | if (!this.hasOwnProperty("__observers")) {
| |
− | this.initialiseKeyValueObserving()
| |
− | }
| |
− | var B = this.__observers[DC.KVO.kAllPropertiesKey];
| |
− | if (!B) {
| |
− | B = this.__observers[DC.KVO.kAllPropertiesKey] = {}
| |
− | }
| |
− | C = C || E.__uid;
| |
− | if (C in B) {
| |
− | return
| |
− | }
| |
− | var A = new DC.ObserverEntry(D, D.observeChildObjectChangeForKeyPath, E ? E.key : "");
| |
− | B[C] = A;
| |
− | if (!E) {
| |
− | return
| |
− | }
| |
− | E.unlinkParentLink();
| |
− | E.parentLink = A
| |
− | },
| |
− | _removeParentLink: function (C, D, B) {
| |
− | if (!this.__observers) {
| |
− | return
| |
− | }
| |
− | var A = this.__observers[DC.KVO.kAllPropertiesKey];
| |
− | if (!A) {
| |
− | A = this.__observers[DC.KVO.kAllPropertiesKey] = {}
| |
− | }
| |
− | B = B || D.__uid;
| |
− | if (D && D.parentLink === A[B]) {
| |
− | D.unlinkParentLink()
| |
− | }
| |
− | delete A[B]
| |
− | },
| |
− | addObserverForKeyPath: function (A, E, D, B) {
| |
− | if (!D || 0 === D.length) {
| |
− | throw new InvalidArgumentError("keyPath is empty")
| |
− | }
| |
− | if (!A) {
| |
− | throw new InvalidArgumentError("Observer may not be null")
| |
− | }
| |
− | if (!E) {
| |
− | E = A.observeChangeForKeyPath
| |
− | }
| |
− | if ("string" === typeof (E)) {
| |
− | E = A[E]
| |
− | }
| |
− | if (!E) {
| |
− | throw new InvalidArgumentError("Missing callback method")
| |
− | }
| |
− | if (!this.hasOwnProperty("__observers")) {
| |
− | this.initialiseKeyValueObserving()
| |
− | }
| |
− | if (!this.__observers[D]) {
| |
− | this.infoForKeyPath(D);
| |
− | this.__observers[D] = []
| |
− | }
| |
− | var C = new DC.ObserverEntry(A, E, B);
| |
− | this.__observers[D].push(C)
| |
− | },
| |
− | removeObserverForKeyPath: function (C, F) {
| |
− | if (!F || 0 === F.length) {
| |
− | throw new InvalidArgumentError("keyPath may not be empty")
| |
− | }
| |
− | if (!C) {
| |
− | throw new InvalidArgumentError("Observer may not be null")
| |
− | }
| |
− | if (!this.__observers || !this.__observers[F]) {
| |
− | return
| |
− | }
| |
− | var E = this.__observers[F];
| |
− | var B = -1;
| |
− | var D;
| |
− | var A = E.length;
| |
− | for (B = 0; B < A; ++B) {
| |
− | D = E[B];
| |
− | if (D.observer == C) {
| |
− | E.splice(B, 1);
| |
− | return
| |
− | }
| |
− | }
| |
− | },
| |
− | willChangeValueForKey: function (A, C) {
| |
− | if (!A) {
| |
− | throw new InvalidArgumentError("key may not be null")
| |
− | }
| |
− | C = (C instanceof DC.KeyInfo) ? C : this.infoForKey(A);
| |
− | if (!C) {
| |
− | return
| |
− | }
| |
− | if (1 !== ++C.changeCount) {
| |
− | return
| |
− | }
| |
− | var B = (this.__dependentKeys && this.__dependentKeys[A]);
| |
− | if (B) {
| |
− | B.forEach(this.willChangeValueForKey, this)
| |
− | }
| |
− | C.previousValue = C.get(this)
| |
− | },
| |
− | forceChangeNotificationForKey: function (A, B) {
| |
− | if (!A) {
| |
− | throw new InvalidArgumentError("key may not be null")
| |
− | }
| |
− | B = (B instanceof DC.KeyInfo) ? B : this.infoForKey(A);
| |
− | if (!B) {
| |
− | return
| |
− | }
| |
− | if (0 !== B.changeCount) {
| |
− | return
| |
− | }
| |
− | B.changeCount = 1;
| |
− | this.didChangeValueForKey(A, B)
| |
− | },
| |
− | didChangeValueForKey: function (B, F) {
| |
− | if (!B) {
| |
− | throw new InvalidArgumentError("key may not be null")
| |
− | }
| |
− | F = (F instanceof DC.KeyInfo) ? F : this.infoForKey(B);
| |
− | if (!F) {
| |
− | return
| |
− | }
| |
− | if (0 !== --F.changeCount) {
| |
− | return
| |
− | }
| |
− | var C = F.get(this);
| |
− | var A = F.previousValue;
| |
− | F.previousValue = null;
| |
− | if (C !== A) {
| |
− | var E = new DC.ChangeNotification(this, DC.ChangeType.setting, C, A);
| |
− | this.notifyObserversOfChangeForKeyPath(E, B);
| |
− | if (A && A._removeParentLink) {
| |
− | A._removeParentLink(this, F)
| |
− | }
| |
− | if (C && C._addParentLink) {
| |
− | C._addParentLink(this, F)
| |
− | }
| |
− | }
| |
− | var D = (this.__dependentKeys && this.__dependentKeys[B]);
| |
− | if (D) {
| |
− | D.forEach(this.didChangeValueForKey, this)
| |
− | }
| |
− | },
| |
− | notifyObserversOfChangeForKeyPath: function (J, L) {
| |
− | if (!L) {
| |
− | throw new InvalidArgumentError("keyPath may not be null")
| |
− | }
| |
− | if (!this.__observers) {
| |
− | return
| |
− | }
| |
− | var G;
| |
− | var F;
| |
− | var H;
| |
− | F = this.__observers[DC.KVO.kAllPropertiesKey];
| |
− | if (F) {
| |
− | var E = Object.clone(J);
| |
− | var A = J.objectKeyPath.length;
| |
− | J.objectKeyPath.push(this);
| |
− | for (G in F) {
| |
− | var B = F[G];
| |
− | B.observeChangeForKeyPath(E, L)
| |
− | }
| |
− | J.objectKeyPath.length = A
| |
− | }
| |
− | if (DC.KVO.kAllPropertiesKey == L) {
| |
− | return
| |
− | }
| |
− | F = this.__observers[L];
| |
− | if (F && F.length) {
| |
− | H = F.length;
| |
− | for (G = 0; G < H; ++G) {
| |
− | F[G].observeChangeForKeyPath(J, L)
| |
− | }
| |
− | }
| |
− | var D = L + ".";
| |
− | var I = D.length;
| |
− | var K;
| |
− | var M;
| |
− | var P;
| |
− | var O;
| |
− | var C;
| |
− | var N = !(null === J.oldValue || "undefined" === typeof (J.oldValue));
| |
− | for (M in this.__observers) {
| |
− | if (M.substr(0, I) != D) {
| |
− | continue
| |
− | }
| |
− | F = this.__observers[M];
| |
− | if (!F || !F.length) {
| |
− | continue
| |
− | }
| |
− | K = M.substr(I);
| |
− | O = J.oldValue;
| |
− | if (O && O.valueForKeyPath) {
| |
− | O = O.valueForKeyPath(K)
| |
− | } else {
| |
− | O = null
| |
− | }
| |
− | C = J.newValue;
| |
− | if (C && C.valueForKeyPath) {
| |
− | C = C.valueForKeyPath(K)
| |
− | } else {
| |
− | C = null
| |
− | }
| |
− | if (N && O === C) {
| |
− | continue
| |
− | }
| |
− | P = new DC.ChangeNotification(J.object, J.changeType, C, O, J.indexes);
| |
− | H = F.length;
| |
− | for (G = 0; G < H; ++G) {
| |
− | F[G].observeChangeForKeyPath(P, M)
| |
− | }
| |
− | }
| |
− | }
| |
− | });
| |
− | DC.KVO.kAllPropertiesKey = "*";
| |
− | DC.KVO.keysToIgnore = $S("__keys", "__observers", "__keysToIgnore", "__dependentKeys", "__mutableKeys", "__factories__");
| |
− | DC.KVO.typesOfKeyValuesToIgnore = $S("string", "number", "boolean", "date", "regexp", "function");
| |
− | DC.KVO.getPropertyMethodsForKeyOnObject = (function () {
| |
− | function B(H, F) {
| |
− | F = F || "__kvo_prop_" + H;
| |
− | var G = {
| |
− | getter: function () {
| |
− | var I = null;
| |
− | if (F in this) {
| |
− | I = this[F]
| |
− | }
| |
− | var J = this.__keys ? this.__keys[H] : null;
| |
− | if (!J) {
| |
− | return I
| |
− | }
| |
− | if (I && I._addParentLink) {
| |
− | I._addParentLink(this, J)
| |
− | } else {
| |
− | J.unlinkParentLink()
| |
− | }
| |
− | return I
| |
− | },
| |
− | mutator: function (I) {
| |
− | this.willChangeValueForKey(H);
| |
− | if ("undefined" === typeof (I)) {
| |
− | I = null
| |
− | }
| |
− | this[F] = I;
| |
− | this.didChangeValueForKey(H);
| |
− | return I
| |
− | }
| |
− | };
| |
− | G.mutator.__key = H;
| |
− | G.getter.__key = H;
| |
− | return G
| |
− | }
| |
− | function C(H, G) {
| |
− | function F(J) {
| |
− | this.willChangeValueForKey(G);
| |
− | var I = H.call(this, J);
| |
− | this.didChangeValueForKey(G);
| |
− | return I
| |
− | }
| |
− | F.__key = G;
| |
− | F.valueOf = function () {
| |
− | return H
| |
− | };
| |
− | F.toString = function () {
| |
− | return String(H)
| |
− | };
| |
− | return F
| |
− | }
| |
− | function D(F, H) {
| |
− | function G() {
| |
− | var I = F.call(this);
| |
− | var J = this.__keys ? this.__keys[H] : null;
| |
− | if (!J) {
| |
− | return I
| |
− | }
| |
− | if (I && I._addParentLink) {
| |
− | I._addParentLink(this, J)
| |
− | } else {
| |
− | J.unlinkParentLink()
| |
− | }
| |
− | return I
| |
− | }
| |
− | G.__key = H;
| |
− | G.valueOf = function () {
| |
− | return F
| |
− | };
| |
− | G.toString = function () {
| |
− | return String(F)
| |
− | };
| |
− | return G
| |
− | }
| |
− | function E(T, K) {
| |
− | var M = K.constructor.prototype;
| |
− | var J = (M == K);
| |
− | var L = (M != Object.prototype && M != DC.KVO.prototype) ? M : K;
| |
− | var U = T.titleCase();
| |
− | var P = "get" + U;
| |
− | var Q = "set" + U;
| |
− | var I = "validate" + U;
| |
− | var O;
| |
− | var H;
| |
− | var S;
| |
− | var F = K[I];
| |
− | var N = ("undefined" !== typeof (O = K.__lookupGetter__(T)) && "undefined" !== typeof (H = K.__lookupSetter__(T)));
| |
− | if (!N) {
| |
− | P = (P in K) ? P : T;
| |
− | O = K[P];
| |
− | H = K[Q]
| |
− | }
| |
− | if ("function" !== typeof (O)) {
| |
− | var R = "__kvo_prop_" + T;
| |
− | var G = B(T, R);
| |
− | if (T in K) {
| |
− | S = K[R] = ("undefined" == typeof (O) ? null : O);
| |
− | delete K[T]
| |
− | }
| |
− | O = G.getter;
| |
− | H = G.mutator;
| |
− | N = true
| |
− | } else {
| |
− | if (O && !J) {
| |
− | S = O.valueOf().call(K)
| |
− | }
| |
− | if (O && T !== O.__key) {
| |
− | O = D(O, T)
| |
− | }
| |
− | if (H && T !== H.__key) {
| |
− | H = C(H, T)
| |
− | }
| |
− | }
| |
− | if (N) {
| |
− | L.__defineGetter__(T, O);
| |
− | L.__defineSetter__(T, H)
| |
− | } else {
| |
− | if (O) {
| |
− | if (K.hasOwnProperty(P)) {
| |
− | K[P] = O
| |
− | } else {
| |
− | L[P] = O
| |
− | }
| |
− | }
| |
− | if (H) {
| |
− | if (K.hasOwnProperty(Q)) {
| |
− | K[Q] = H
| |
− | } else {
| |
− | L[Q] = H
| |
− | }
| |
− | }
| |
− | }
| |
− | return {
| |
− | getter: O,
| |
− | mutator: H,
| |
− | validator: F,
| |
− | value: S
| |
− | }
| |
− | }
| |
− | function A(Q, J) {
| |
− | var L = J.constructor.prototype;
| |
− | var I = (L == J);
| |
− | var K = (L != Object.prototype && L != DC.KVO.prototype) ? L : J;
| |
− | var R = Q.titleCase();
| |
− | var O = "set" + R;
| |
− | var N = "get" + R;
| |
− | var H = "validate" + R;
| |
− | N = (N in J) ? N : Q;
| |
− | var M = J[N];
| |
− | var G = J[O];
| |
− | var F = J[H];
| |
− | var P;
| |
− | if ("function" !== typeof (M)) {
| |
− | if (Q in J) {
| |
− | P = M
| |
− | }
| |
− | M = null;
| |
− | G = null
| |
− | } else {
| |
− | if (M && !I) {
| |
− | P = M.valueOf().call(J)
| |
− | }
| |
− | if (M && Q !== M.__key) {
| |
− | M = D(M, Q)
| |
− | }
| |
− | if (G && Q !== G.__key) {
| |
− | G = C(G, Q)
| |
− | }
| |
− | }
| |
− | if (M) {
| |
− | if (J.hasOwnProperty(N)) {
| |
− | J[N] = M
| |
− | } else {
| |
− | K[N] = M
| |
− | }
| |
− | }
| |
− | if (G) {
| |
− | if (J.hasOwnProperty(O)) {
| |
− | J[O] = G
| |
− | } else {
| |
− | K[O] = G
| |
− | }
| |
− | }
| |
− | return {
| |
− | getter: M,
| |
− | mutator: G,
| |
− | validator: F,
| |
− | value: P
| |
− | }
| |
− | }
| |
− | if (DC.Support.Properties) {
| |
− | return E
| |
− | } else {
| |
− | return A
| |
− | }
| |
− | })();
| |
− | DC.KVO.adapt = function (B) {
| |
− | if (!B) {
| |
− | throw new InvalidArgumentError("Can't adapt a null object")
| |
− | }
| |
− | var A;
| |
− | for (A in DC.KVO.prototype) {
| |
− | if (A in B) {
| |
− | continue
| |
− | }
| |
− | B[A] = DC.KVO.prototype[A]
| |
− | }
| |
− | if ("keyDependencies" in B && !("__dependentKeys" in B)) {
| |
− | var C = B.keyDependencies;
| |
− | for (A in C) {
| |
− | B.setKeysTriggerChangeNotificationsForDependentKey(C[A], A)
| |
− | }
| |
− | }
| |
− | return B
| |
− | };
| |
− | DC.KVO.adaptTree = function (C) {
| |
− | DC.KVO.adapt(C);
| |
− | var B;
| |
− | var A;
| |
− | for (B in C) {
| |
− | if (B in DC.KVO.keysToIgnore) {
| |
− | continue
| |
− | }
| |
− | A = C[B];
| |
− | if (!A) {
| |
− | continue
| |
− | }
| |
− | if (DC.typeOf(A) in DC.KVO.typesOfKeyValuesToIgnore) {
| |
− | continue
| |
− | }
| |
− | DC.KVO.adaptTree(A)
| |
− | }
| |
− | return C
| |
− | };
| |
− | DC.KVO.__subclassCreated__ = function (A) {
| |
− | var D = A.superclass.prototype;
| |
− | var B = A.prototype;
| |
− | if (D.keyDependencies === B.keyDependencies) {
| |
− | return
| |
− | }
| |
− | var E = B.keyDependencies || {};
| |
− | for (var C in E) {
| |
− | B.setKeysTriggerChangeNotificationsForDependentKey(E[C], C)
| |
− | }
| |
− | };
| |
− | DC.Bindable = Class.create(DC.KVO, {
| |
− | constructor: function (A) {
| |
− | this.bindings = {};
| |
− | this.__parameters = A;
| |
− | this.__context = DC.dataModel
| |
− | },
| |
− | __createFactoryObjects: function () {
| |
− | var A = DC.dataModel;
| |
− | var C = this.__context;
| |
− | DC.dataModel = this.__context = this;
| |
− | var D;
| |
− | var B;
| |
− | for (D in this.__factories__) {
| |
− | B = this[D];
| |
− | if (!B.__factoryFn__) {
| |
− | continue
| |
− | }
| |
− | this[D] = B.call(this)
| |
− | }
| |
− | DC.dataModel = A;
| |
− | this.__context = C
| |
− | },
| |
− | exposedBindings: [],
| |
− | defaultPlaceholders: {},
| |
− | automaticallySetupBindings: true,
| |
− | __relativeSource: null,
| |
− | defaultPlaceholderForMarkerWithBinding: function (B, C) {
| |
− | var A = this.defaultPlaceholders[C];
| |
− | if (!A) {
| |
− | return null
| |
− | }
| |
− | return A[B] || null
| |
− | },
| |
− | __createObserverMethod: function (B, C) {
| |
− | function A(E) {
| |
− | if (DC.ChangeType.setting !== E.changeType) {
| |
− | throw new InvalidArgumentError('Received invalid change type for synthesized binding observer (name="' + B + '" keyPath="' + C + '")')
| |
− | }
| |
− | var D = E.newValue;
| |
− | this.setValueForKey(E.newValue, B)
| |
− | }
| |
− | return A
| |
− | },
| |
− | bindNameToKeyPath: function (B, G, A) {
| |
− | var D;
| |
− | var F;
| |
− | var E = {};
| |
− | if (!this.bindings) {
| |
− | this.bindings = {}
| |
− | }
| |
− | D = this["observe" + B.titleCase() + "Change"] || this.__createObserverMethod(B, G);
| |
− | if (this.bindings[B]) {
| |
− | this.bindings[B].unbind()
| |
− | }
| |
− | var C = this.__context;
| |
− | if ("object" === typeof (G)) {
| |
− | Object.extend(E, G);
| |
− | G = E.keypath
| |
− | }
| |
− | Object.extend(E, DC.Binding.bindingInfoFromString(G));
| |
− | if ("transformValue" in E) {
| |
− | E.transformer = {
| |
− | transformValue: E.transformValue,
| |
− | reverseTransformedValue: E.reverseTransformedValue || null
| |
− | };
| |
− | delete E.transformValue;
| |
− | delete E.reverseTransformedValue
| |
− | }
| |
− | if ("*." === E.keypath.substr(0, 2)) {
| |
− | if (A) {
| |
− | C = A
| |
− | } else {
| |
− | C = new DC.KVO()
| |
− | }
| |
− | E.keypath = E.keypath.substr(2)
| |
− | }
| |
− | E.name = B;
| |
− | E.object = C;
| |
− | E.observer = this;
| |
− | E.observerFn = D;
| |
− | F = new DC.Binding(E);
| |
− | F.bind();
| |
− | this.bindings[B] = F
| |
− | },
| |
− | __postConstruct: function () {
| |
− | if (!this.automaticallySetupBindings) {
| |
− | return
| |
− | }
| |
− | this.__initialising = true;
| |
− | this.__copyParameters(this.__parameters || {});
| |
− | this.setupBindings();
| |
− | this.updateBindings();
| |
− | this.createObservers();
| |
− | delete this.__initialising
| |
− | },
| |
− | __copyParameters: function (C) {
| |
− | var D;
| |
− | var A;
| |
− | var B = DC.KVO.adaptTree;
| |
− | for (D in C) {
| |
− | if (-1 !== D.search(/Binding$/)) {
| |
− | continue
| |
− | }
| |
− | A = C[D];
| |
− | if ("object" === DC.typeOf(A) && !("addObserverForKeyPath" in A)) {
| |
− | B(A)
| |
− | }
| |
− | this[D] = A
| |
− | }
| |
− | this.__parameters = C
| |
− | },
| |
− | bindingInfoForName: function (A) {
| |
− | if (!this.__parameters) {
| |
− | return null
| |
− | }
| |
− | return this.__parameters[A + "Binding"]
| |
− | },
| |
− | __createAutoObserver: function (C, B) {
| |
− | var A = DC.ChangeType.setting;
| |
− | return function (D) {
| |
− | if (this.bindings[B] || A == D.changeType) {
| |
− | return
| |
− | }
| |
− | C.apply(this, arguments)
| |
− | }
| |
− | },
| |
− | createObservers: function () {
| |
− | var E = this.exposedBindings;
| |
− | var A = E.length;
| |
− | var B;
| |
− | var D;
| |
− | var C;
| |
− | for (B = 0; B < A; ++B) {
| |
− | C = E[B];
| |
− | D = this["observe" + C.titleCase() + "Change"];
| |
− | if (!D) {
| |
− | continue
| |
− | }
| |
− | D = this.__createAutoObserver(D, C);
| |
− | this.addObserverForKeyPath(this, D, C, "__auto_observer__")
| |
− | }
| |
− | },
| |
− | setupBindings: function () {
| |
− | var D = this.exposedBindings;
| |
− | var B = D.length;
| |
− | var E;
| |
− | var A;
| |
− | var C;
| |
− | for (C = 0; C < B; ++C) {
| |
− | A = D[C];
| |
− | E = this.bindingInfoForName(A);
| |
− | if (!E) {
| |
− | continue
| |
− | }
| |
− | this.bindNameToKeyPath(A, E, this.__relativeSource)
| |
− | }
| |
− | },
| |
− | updateBindings: function () {
| |
− | var E = this.bindings;
| |
− | var D = this.exposedBindings;
| |
− | var B = D.length;
| |
− | var A;
| |
− | var C;
| |
− | for (C = 0; C < B; ++C) {
| |
− | A = E[D[C]];
| |
− | if (!A) {
| |
− | continue
| |
− | }
| |
− | A.update()
| |
− | }
| |
− | },
| |
− | unbind: function () {
| |
− | for (var A in this.bindings) {
| |
− | this.bindings[A].unbind()
| |
− | }
| |
− | }
| |
− | });
| |
− | DC.Bindable.__subclassCreated__ = function (C) {
| |
− | var E = C.superclass.prototype;
| |
− | var D = C.prototype;
| |
− | if (D.hasOwnProperty("defaultPlaceholders")) {
| |
− | var B = Object.clone(E.defaultPlaceholders);
| |
− | D.defaultPlaceholders = Object.extend(B, D.defaultPlaceholders)
| |
− | }
| |
− | if (E.exposedBindings === D.exposedBindings && !D.maskedBindings) {
| |
− | return
| |
− | }
| |
− | var A = (E.maskedBindings === D.maskedBindings) ? {} : $S(D.maskedBindings);
| |
− | | |
− | function F(H) {
| |
− | return !(H in A)
| |
− | }
| |
− | var G = E.exposedBindings.filter(F);
| |
− | if (E.exposedBindings !== D.exposedBindings) {
| |
− | G = G.concat(D.exposedBindings.filter(F))
| |
− | }
| |
− | D.exposedBindings = G
| |
− | };
| |
− | DC.SortDescriptor = Class.create({
| |
− | constructor: function (D, A, B) {
| |
− | this.keyPath = D;
| |
− | this.ascending = A;
| |
− | this.comparisonFn = B || this.defaultCompare;
| |
− | var C = typeof (this.comparisonFn);
| |
− | if ("string" != C && "function" != C) {
| |
− | throw new InvalidArgumentError("comparisonFn must be either the name of a method or a function reference")
| |
− | }
| |
− | },
| |
− | resolveComparisonFn: function (B) {
| |
− | var A = this.comparisonFn;
| |
− | if ("string" === typeof (A)) {
| |
− | A = B[A]
| |
− | }
| |
− | if ("function" !== typeof (A)) {
| |
− | throw new TypeError("comparisonFn does not resolve to a function")
| |
− | }
| |
− | return A
| |
− | },
| |
− | compareObjects: function (C, B) {
| |
− | if (!C.valueForKeyPath || !B.valueForKeyPath) {
| |
− | throw new InvalidArgumentError("Objects are not Key Value compliant")
| |
− | }
| |
− | var E = C.valueForKeyPath(this.keyPath);
| |
− | var D = B.valueForKeyPath(this.keyPath);
| |
− | var A = this.resolveComparisonFn(E);
| |
− | return A.call(E, D)
| |
− | },
| |
− | defaultCompare: function (A) {
| |
− | return DC.compareValues(this, A)
| |
− | },
| |
− | reversedSortDescriptor: function () {
| |
− | return new DC.SortDescriptor(this.keyPath, !this.ascending, this.comparisonFn)
| |
− | }
| |
− | });
| |
− | DC.ValueTransformer = Class.create({
| |
− | transformedValue: function (A) {
| |
− | return A
| |
− | },
| |
− | reverseTransformedValue: function (A) {
| |
− | return A
| |
− | },
| |
− | __factory__: function () {
| |
− | var B = Array.from(arguments);
| |
− | var A = this;
| |
− | | |
− | function C() {}
| |
− | return function () {
| |
− | C.prototype = A.prototype;
| |
− | var D = new C();
| |
− | A.prototype.constructor.apply(D, B);
| |
− | return D
| |
− | }
| |
− | }
| |
− | });
| |
− | DC.ValueTransformer.__subclassCreated__ = function (A) {
| |
− | var C = DC.ValueTransformer.prototype;
| |
− | var B = A.prototype;
| |
− | if (C.reverseTransformedValue == B.reverseTransformedValue) {
| |
− | A.prototype.reverseTransformedValue = null
| |
− | }
| |
− | };
| |
− | DC.transformer = {};
| |
− | DC.transformerInstances = {};
| |
− | DC.findTransformerWithName = function (transformerName) {
| |
− | var valueTransformer = DC.transformerInstances[transformerName.toLowerCase()];
| |
− | if (valueTransformer) {
| |
− | return valueTransformer
| |
− | }
| |
− | if (-1 === transformerName.indexOf(".")) {
| |
− | valueTransformer = DC.transformer[transformerName]
| |
− | }
| |
− | if (!valueTransformer) {
| |
− | try {
| |
− | valueTransformer = eval(transformerName)
| |
− | } catch (e) {}
| |
− | }
| |
− | if (!valueTransformer) {
| |
− | throw new InvalidArgumentError("The transformerName argument does not specify a valid ValueTransformer: " + transformerName)
| |
− | }
| |
− | if ("function" !== typeof (valueTransformer)) {
| |
− | return valueTransformer
| |
− | }
| |
− | if (valueTransformer.__factoryFn__) {
| |
− | valueTransformer = valueTransformer()
| |
− | } else {
| |
− | valueTransformer = new valueTransformer()
| |
− | }
| |
− | return valueTransformer
| |
− | };
| |
− | DC.registerTransformerWithName = function (B, A) {
| |
− | if (!B.transformedValue) {
| |
− | throw new InvalidArgumentError("The valueTransformer argument does not support the ValueTransformer method transformedValue")
| |
− | }
| |
− | A = A.toLowerCase();
| |
− | DC.transformerInstances[A] = B
| |
− | };
| |
− | DC.transformer.Not = Class.create(DC.ValueTransformer, {
| |
− | transformedValue: function (A) {
| |
− | return (A ? false : true)
| |
− | },
| |
− | reverseTransformedValue: function (A) {
| |
− | return !!A
| |
− | }
| |
− | });
| |
− | DC.registerTransformerWithName(new DC.transformer.Not(), "not");
| |
− | DC.transformer.Boolean = Class.create(DC.ValueTransformer, {
| |
− | constructor: function (A, B) {
| |
− | this.trueValue = A;
| |
− | this.falseValue = B
| |
− | },
| |
− | transformedValue: function (A) {
| |
− | return (A == this.trueValue)
| |
− | },
| |
− | reverseTransformedValue: function (A) {
| |
− | return (A ? this.trueValue : this.falseValue)
| |
− | }
| |
− | });
| |
− | DC.transformer.Matches = Class.create(DC.ValueTransformer, {
| |
− | constructor: function (A) {
| |
− | this.trueRegex = A
| |
− | },
| |
− | transformedValue: function (A) {
| |
− | return this.trueRegex.test(A)
| |
− | }
| |
− | });
| |
− | DC.transformer.Generic = Class.create(DC.ValueTransformer, {
| |
− | constructor: function (A, B) {
| |
− | this.modelValues = A;
| |
− | this.displayValues = B
| |
− | },
| |
− | transformedValue: function (B) {
| |
− | var A = this.modelValues.indexOf(B);
| |
− | var C;
| |
− | if (-1 == A) {
| |
− | return C
| |
− | } else {
| |
− | return this.displayValues[A]
| |
− | }
| |
− | },
| |
− | reverseTransformedValue: function (B) {
| |
− | var A = this.displayValues.indexOf(B);
| |
− | var C;
| |
− | if (-1 == A) {
| |
− | return C
| |
− | } else {
| |
− | return this.modelValues[A]
| |
− | }
| |
− | }
| |
− | });
| |
− | DC.transformer.Truncated = Class.create(DC.ValueTransformer, {
| |
− | constructor: function (A) {
| |
− | this.max = A || 50
| |
− | },
| |
− | ellipsis: String.fromCharCode(8230),
| |
− | transformedValue: function (C) {
| |
− | if (!C && 0 !== C) {
| |
− | return C
| |
− | }
| |
− | C = "" + C;
| |
− | var A = C.length;
| |
− | if (A <= this.max) {
| |
− | return C
| |
− | }
| |
− | var B = this.max / 2 - 2;
| |
− | return [C.substr(0, B), this.ellipsis, C.substr(A - B)].join(" ")
| |
− | }
| |
− | });
| |
− | DC.registerTransformerWithName(new DC.transformer.Truncated(50), "truncated");
| |
− | DC.transformer.StringsToObjects = Class.create(DC.ValueTransformer, {
| |
− | constructor: function (A) {
| |
− | this.key = A || "string"
| |
− | },
| |
− | transformedValue: function (B) {
| |
− | if (!B || !B.map) {
| |
− | return B
| |
− | }
| |
− | function A(C) {
| |
− | var D = new DC.KVO();
| |
− | D[this.key] = C;
| |
− | return D
| |
− | }
| |
− | return B.map(A, this)
| |
− | },
| |
− | reverseTransformedValue: function (B) {
| |
− | if (!B || !B.map) {
| |
− | return B
| |
− | }
| |
− | function A(C) {
| |
− | return C[this.key]
| |
− | }
| |
− | return B.map(A, this)
| |
− | }
| |
− | });
| |
− | DC.registerTransformerWithName(new DC.transformer.StringsToObjects("string"), "StringsToObjects");
| |
− | DC.transformer.FirstObject = Class.create(DC.ValueTransformer, {
| |
− | transformedValue: function (A) {
| |
− | if (DC.typeOf(A) == "array") {
| |
− | return A[0]
| |
− | }
| |
− | return A
| |
− | }
| |
− | });
| |
− | Object.extend(DC, {
| |
− | NoSelectionMarkerType: "noSelection",
| |
− | MultipleValuesMarkerType: "multipleValues",
| |
− | NullValueMarkerType: "nullValue"
| |
− | });
| |
− | DC.Binding = Class.create({
| |
− | constructor: function (A) {
| |
− | Object.extend(this, A);
| |
− | if ("string" === typeof (this.transformer)) {
| |
− | this.transformer = DC.findTransformerWithName(this.transformer)
| |
− | }
| |
− | if ("function" === typeof (this.transformer)) {
| |
− | if (this.transformer.__factoryFn__) {
| |
− | this.transformer = this.transformer()
| |
− | } else {
| |
− | this.transformer = new this.transformer()
| |
− | }
| |
− | }
| |
− | this.refresh()
| |
− | },
| |
− | bind: function () {
| |
− | this.object.addObserverForKeyPath(this, this.observeChangeForKeyPath, this.keypath)
| |
− | },
| |
− | unbind: function () {
| |
− | this.object.removeObserverForKeyPath(this, this.keypath)
| |
− | },
| |
− | refresh: function () {
| |
− | var A = this.object.valueForKeyPath(this.keypath);
| |
− | this.cachedOriginalValue = A;
| |
− | this.markerType = this.markerTypeFromValue(A);
| |
− | if (this.markerType) {
| |
− | if ((this.markerType + "Placeholder") in this) {
| |
− | A = this[this.markerType + "Placeholder"]
| |
− | } else {
| |
− | A = this.observer.defaultPlaceholderForMarkerWithBinding(this.markerType, this.name)
| |
− | }
| |
− | } else {
| |
− | A = this.transformedValue(A)
| |
− | }
| |
− | this.cachedValue = A
| |
− | },
| |
− | transformedValue: function (A) {
| |
− | if (!this.transformer) {
| |
− | return A
| |
− | }
| |
− | return this.transformer.transformedValue(A)
| |
− | },
| |
− | validateProposedValue: function (B) {
| |
− | if (this.transformer) {
| |
− | if (!this.transformer.reverseTransformedValue) {
| |
− | throw new Error("Can't validate a value when the transformer doesn't have a reverseTransformedValue method")
| |
− | }
| |
− | B = this.transformer.reverseTransformedValue(B)
| |
− | }
| |
− | var A = this.object.validateValueForKeyPath(B, this.keypath);
| |
− | if (A instanceof DC.Error) {
| |
− | return A
| |
− | }
| |
− | return this.transformedValue(A)
| |
− | },
| |
− | setValue: function (A) {
| |
− | if (this.cachedValue === A) {
| |
− | return
| |
− | }
| |
− | this.markerType = this.markerTypeFromValue(A);
| |
− | this.cachedValue = A;
| |
− | if (this.transformer) {
| |
− | if (!this.transformer.reverseTransformedValue) {
| |
− | return
| |
− | }
| |
− | A = this.transformer.reverseTransformedValue(A)
| |
− | }
| |
− | this.cachedOriginalValue = A;
| |
− | var B = this.updating;
| |
− | this.updating = true;
| |
− | this.object.setValueForKeyPath(A, this.keypath);
| |
− | this.updating = B
| |
− | },
| |
− | mutable: function () {
| |
− | if (this.transformer && !this.transformer.reverseTransformedValue) {
| |
− | return false
| |
− | }
| |
− | var A = this.object.infoForKeyPath(this.keypath);
| |
− | return A && A.mutable
| |
− | },
| |
− | value: function () {
| |
− | return this.cachedValue
| |
− | },
| |
− | update: function () {
| |
− | var B = this.value();
| |
− | var C = new DC.ChangeNotification(this.object, DC.ChangeType.setting, B);
| |
− | this.updating = true;
| |
− | try {
| |
− | this.observerFn.call(this.observer, C, this.keypath)
| |
− | } catch (A) {
| |
− | console.error('Exception while bindng "' + this.name + '" to keypath "' + this.keypath + ' ": ' + A)
| |
− | }
| |
− | this.updating = false
| |
− | },
| |
− | observerFn: function (C, A, B) {},
| |
− | markerTypeFromValue: function (A) {
| |
− | if (null === A || "undefined" === typeof (A) || "" === A) {
| |
− | return DC.NullValueMarkerType
| |
− | }
| |
− | if (DC.Markers.MultipleValues === A) {
| |
− | return DC.MultipleValuesMarkerType
| |
− | }
| |
− | if (DC.Markers.NoSelection === A) {
| |
− | return DC.NoSelectionMarkerType
| |
− | }
| |
− | return null
| |
− | },
| |
− | placeholderValue: function () {
| |
− | var A;
| |
− | if ((this.markerType + "Placeholder") in this) {
| |
− | A = this[this.markerType + "Placeholder"]
| |
− | } else {
| |
− | A = this.observer.defaultPlaceholderForMarkerWithBinding(this.markerType, this.name)
| |
− | }
| |
− | if ("function" === typeof (A)) {
| |
− | A = A.call(this.object)
| |
− | }
| |
− | return A
| |
− | },
| |
− | observeChangeForKeyPath: function (G, A, B) {
| |
− | if (this.updating && G.newValue === this.cachedOriginalValue) {
| |
− | return
| |
− | }
| |
− | this.cachedOriginalValue = G.newValue;
| |
− | var E = G.newValue;
| |
− | this.markerType = this.markerTypeFromValue(E);
| |
− | if (this.markerType) {
| |
− | E = this.placeholderValue()
| |
− | } else {
| |
− | E = this.transformedValue(E)
| |
− | }
| |
− | var C = Object.clone(G);
| |
− | C.newValue = E;
| |
− | if (DC.ChangeType.setting === G.changeType) {
| |
− | this.cachedValue = E
| |
− | }
| |
− | var F = this.updating;
| |
− | this.updating = true;
| |
− | try {
| |
− | this.observerFn.call(this.observer, C, A, B)
| |
− | } catch (D) {
| |
− | console.error('Exception while bindng "' + this.name + '" to keypath "' + this.keypath + ' ": ' + D)
| |
− | }
| |
− | this.updating = F
| |
− | }
| |
− | });
| |
− | DC.Binding.bindingRegex = /^(.*?)(?:\((.*)\))?$/;
| |
− | DC.Binding.compoundRegex = /^\s*([^&|].*?)\s*(\&\&|\|\|)\s*(\S.+)\s*$/;
| |
− | DC.Binding.bindingInfoFromString = function (B) {
| |
− | var A;
| |
− | var C;
| |
− | A = B.match(DC.Binding.bindingRegex);
| |
− | if (!A || A.length < 3) {
| |
− | throw new InvalidArgumentError("bindingString isn't in correct format")
| |
− | }
| |
− | var D = {
| |
− | keypath: A[1]
| |
− | };
| |
− | if (A[2]) {
| |
− | D.transformer = DC.findTransformerWithName(A[2])
| |
− | }
| |
− | return D
| |
− | };
| |
− | Class.extend(Array, {
| |
− | containsObject: function (A) {
| |
− | return -1 !== this.indexOf(A)
| |
− | },
| |
− | valueForKey: function (D) {
| |
− | if (!D || 0 === D.length) {
| |
− | throw new InvalidArgumentError("the key is empty")
| |
− | }
| |
− | if ("@count" == D) {
| |
− | return this.length
| |
− | }
| |
− | var E = new Array(this.length);
| |
− | var C;
| |
− | var A = this.length;
| |
− | var B;
| |
− | for (C = 0; C < A; ++C) {
| |
− | B = this[C];
| |
− | E[C] = B ? B.valueForKey(D) : null
| |
− | }
| |
− | return E
| |
− | },
| |
− | setValueForKey: function (D, C) {
| |
− | if (!C || 0 === C.length) {
| |
− | throw new InvalidArgumentError("key is empty")
| |
− | }
| |
− | var B;
| |
− | var A = this.length;
| |
− | for (B = 0; B < A; ++B) {
| |
− | this[B].setValueForKey(D, C)
| |
− | }
| |
− | },
| |
− | indexesOfObjects: function (E) {
| |
− | var D;
| |
− | var B = E.length;
| |
− | var A = [];
| |
− | var C;
| |
− | for (D = 0; D < B; ++D) {
| |
− | C = this.indexOf(E[D]);
| |
− | if (-1 === C) {
| |
− | continue
| |
− | }
| |
− | A.push(C)
| |
− | }
| |
− | return A
| |
− | },
| |
− | addObject: function (B) {
| |
− | var A = this.length;
| |
− | var C = new DC.ChangeNotification(this, DC.ChangeType.insertion, [B], null, [A]);
| |
− | this.push(B);
| |
− | this.observeElementAtIndex(A);
| |
− | this.notifyObserversOfChangeForKeyPath(C, DC.KVO.kAllPropertiesKey)
| |
− | },
| |
− | addObjects: function (G) {
| |
− | var B = G.length;
| |
− | var E = this.length;
| |
− | var C = [];
| |
− | var A = [];
| |
− | var F = new DC.ChangeNotification(this, DC.ChangeType.insertion, C, null, A);
| |
− | for (index = 0; index < B; ++index) {
| |
− | var D = G[index];
| |
− | this.push(D);
| |
− | this.observeElementAtIndex(E);
| |
− | C.push(D);
| |
− | A.push(E++)
| |
− | }
| |
− | this.notifyObserversOfChangeForKeyPath(F, DC.KVO.kAllPropertiesKey)
| |
− | },
| |
− | insertObjectAtIndex: function (B, A) {
| |
− | if (A < 0 || A > this.length) {
| |
− | throw new RangeError("index must be within the bounds of the array")
| |
− | }
| |
− | var C = new DC.ChangeNotification(this, DC.ChangeType.insertion, [B], null, [A]);
| |
− | this.splice(A, 0, B);
| |
− | this.observeElementAtIndex(A);
| |
− | this.notifyObserversOfChangeForKeyPath(C, DC.KVO.kAllPropertiesKey)
| |
− | },
| |
− | insertObjectsAtIndexes: function (E, C) {
| |
− | if (E.length !== C.length) {
| |
− | throw new InvalidArgumentError("length of objects and indexes parameters must be equal")
| |
− | }
| |
− | var A = E.length;
| |
− | var D;
| |
− | var B;
| |
− | for (D = 0; D < A; ++D) {
| |
− | B = C[D];
| |
− | this.splice(B, 0, E[D]);
| |
− | this.observeElementAtIndex(B)
| |
− | }
| |
− | var F = new DC.ChangeNotification(this, DC.ChangeType.insertion, E, null, C);
| |
− | this.notifyObserversOfChangeForKeyPath(F, DC.KVO.kAllPropertiesKey)
| |
− | },
| |
− | replaceObjectAtIndex: function (C, B) {
| |
− | var A = this[B];
| |
− | this[B] = C;
| |
− | var D = new DC.ChangeNotification(this, DC.ChangeType.replacement, [C], [A], [B]);
| |
− | this.notifyObserversOfChangeForKeyPath(D, DC.KVO.kAllPropertiesKey)
| |
− | },
| |
− | replaceObjectsAtIndexes: function (F, D) {
| |
− | var B = [];
| |
− | var A = F.length;
| |
− | var E;
| |
− | var C;
| |
− | for (E = 0; E < A; ++E) {
| |
− | C = D[E];
| |
− | B[E] = this[C];
| |
− | this.stopObservingElementAtIndex(C);
| |
− | this[C] = F[E];
| |
− | this.observeElementAtIndex(C)
| |
− | }
| |
− | var G = new DC.ChangeNotification(this, DC.ChangeType.replacement, F, null, D);
| |
− | this.notifyObserversOfChangeForKeyPath(G, DC.KVO.kAllPropertiesKey)
| |
− | },
| |
− | removeObject: function (B) {
| |
− | var A = this.indexOf(B);
| |
− | if (-1 === A) {
| |
− | return
| |
− | }
| |
− | this.removeObjectAtIndex(A)
| |
− | },
| |
− | removeObjects: function (D) {
| |
− | var A = D.length;
| |
− | var B;
| |
− | for (var C = 0; C < A; ++C) {
| |
− | B = this.indexOf(D[C]);
| |
− | if (-1 === B) {
| |
− | continue
| |
− | }
| |
− | this.removeObjectAtIndex(B)
| |
− | }
| |
− | },
| |
− | removeObjectsAtIndexes: function (D) {
| |
− | var C;
| |
− | var E = D.sort(function (I, H) {
| |
− | return H - I
| |
− | });
| |
− | var A = D.length;
| |
− | var B = [];
| |
− | for (C = 0; C < A; ++C) {
| |
− | var F = E[C];
| |
− | this.stopObservingElementAtIndex(F);
| |
− | B.push(this[F]);
| |
− | this.splice(F, 1)
| |
− | }
| |
− | var G = new DC.ChangeNotification(this, DC.ChangeType.deletion, null, B, E);
| |
− | this.notifyObserversOfChangeForKeyPath(G, DC.KVO.kAllPropertiesKey)
| |
− | },
| |
− | removeObjectAtIndex: function (B) {
| |
− | if (B < 0 || B >= this.length) {
| |
− | throw new RangeError("index must be within the bounds of the array")
| |
− | }
| |
− | this.stopObservingElementAtIndex(B);
| |
− | var A = this.splice(B, 1);
| |
− | var C = new DC.ChangeNotification(this, DC.ChangeType.deletion, null, A, [B]);
| |
− | this.notifyObserversOfChangeForKeyPath(C, DC.KVO.kAllPropertiesKey)
| |
− | },
| |
− | removeAllObjects: function () {
| |
− | var D;
| |
− | var C = [];
| |
− | var A = this.length;
| |
− | C.length = A;
| |
− | for (D = 0; D < A; ++D) {
| |
− | this.stopObservingElementAtIndex(D);
| |
− | C[D] = D
| |
− | }
| |
− | var B = this.splice(0, A);
| |
− | var E = new DC.ChangeNotification(this, DC.ChangeType.deletion, null, B, C);
| |
− | this.notifyObserversOfChangeForKeyPath(E, DC.KVO.kAllPropertiesKey)
| |
− | },
| |
− | objectsAtIndexes: function (C) {
| |
− | var D;
| |
− | var B = [];
| |
− | var A = C.length;
| |
− | B.length = C.length;
| |
− | for (D = 0; D < A; ++D) {
| |
− | B[D] = this[C[D]]
| |
− | }
| |
− | return B
| |
− | },
| |
− | observeChildObjectChangeForKeyPath: function (F, E, B) {
| |
− | var D = F.object;
| |
− | var C = this.indexOf(D);
| |
− | if (!this.__uid) {
| |
− | this.initialiseKeyValueObserving()
| |
− | }
| |
− | if (-1 === C) {
| |
− | D._removeParentLink(this, null, this.__uid);
| |
− | return
| |
− | }
| |
− | var A = new DC.ChangeNotification(D, DC.ChangeType.replacement, [F.newValue], [F.oldValue], [C]);
| |
− | this.notifyObserversOfChangeForKeyPath(A, E)
| |
− | },
| |
− | observeElementAtIndex: function (A) {
| |
− | var B = this[A];
| |
− | if (!B || !B._addParentLink) {
| |
− | return
| |
− | }
| |
− | if (!this.__uid) {
| |
− | this.initialiseKeyValueObserving()
| |
− | }
| |
− | B._addParentLink(this, null, this.__uid)
| |
− | },
| |
− | stopObservingElementAtIndex: function (A) {
| |
− | var B = this[A];
| |
− | if (!B || !B._removeParentLink) {
| |
− | return
| |
− | }
| |
− | if (!this.__uid) {
| |
− | this.initialiseKeyValueObserving()
| |
− | }
| |
− | B._removeParentLink(this, null, this.__uid)
| |
− | },
| |
− | initialiseKeyValueObserving: function () {
| |
− | var B;
| |
− | var A = this.length;
| |
− | this.__observers = {};
| |
− | this.__uid = this.__uid || DC.generateUid();
| |
− | for (B = 0; B < A; ++B) {
| |
− | this.observeElementAtIndex(B)
| |
− | }
| |
− | }
| |
− | });
| |
− | DC.KVO.adapt(Array.prototype);
| |
− | DC.ArrayOperator = {
| |
− | avg: function (A) {
| |
− | return this.sum(A) / A.length
| |
− | },
| |
− | count: function (A) {
| |
− | throw new InvalidArgumentError("@count operator must end the keyPath")
| |
− | },
| |
− | distinctUnionOfArrays: function (A) {
| |
− | return this.unionOfArrays(A).distinct()
| |
− | },
| |
− | distinctUnionOfObjects: function (A) {
| |
− | return A.distinct()
| |
− | },
| |
− | max: function (D) {
| |
− | var B = null;
| |
− | var E;
| |
− | var A;
| |
− | var C;
| |
− | for (E = 0, A = D.length; E < A; ++E) {
| |
− | C = D[E];
| |
− | if (null === B || C > B) {
| |
− | B = C
| |
− | }
| |
− | }
| |
− | return B
| |
− | },
| |
− | min: function (C) {
| |
− | var E = null;
| |
− | var D;
| |
− | var A;
| |
− | var B;
| |
− | for (D = 0, A = C.length; D < A; ++D) {
| |
− | B = C[D];
| |
− | if (null === E || B < E) {
| |
− | E = B
| |
− | }
| |
− | }
| |
− | return E
| |
− | },
| |
− | sum: function (B) {
| |
− | var D = 0;
| |
− | var A = B.length;
| |
− | var C;
| |
− | for (C = 0; C < A; ++C) {
| |
− | D += B[C]
| |
− | }
| |
− | return D
| |
− | },
| |
− | unionOfArrays: function (B) {
| |
− | var D = [];
| |
− | var A;
| |
− | var C;
| |
− | for (C = 0, A = B.length; C < A; ++C) {
| |
− | D = D.concat(B[C])
| |
− | }
| |
− | return D
| |
− | },
| |
− | unionOfObjects: function (A) {
| |
− | return A
| |
− | }
| |
− | };
| |
− | Object.extend(DC, {
| |
− | dataModel: new DC.KVO(),
| |
− | registerModelWithName: function (B, A) {
| |
− | DC.dataModel.setValueForKey(B, A)
| |
− | },
| |
− | unregisterModelWithName: function (A) {
| |
− | delete DC.dataModel[A]
| |
− | }
| |
− | });
| |
− | String.prototype.titleCase = function () {
| |
− | return this.charAt(0).toUpperCase() + this.substr(1)
| |
− | };
| |
− | String.prototype.trim = function () {
| |
− | var B = this.replace(/^\s+/, "");
| |
− | for (var A = B.length - 1; A > 0; --A) {
| |
− | if (/\S/.test(B.charAt(A))) {
| |
− | B = B.substring(0, A + 1);
| |
− | break
| |
− | }
| |
− | }
| |
− | return B
| |
− | };
| |
− | String.prototype.beginsWith = function (A) {
| |
− | return A === this.substring(0, A.length)
| |
− | };
| |
− | if (!String.prototype.localeCompare) {
| |
− | String.prototype.localeCompare = function (A) {
| |
− | if (this < A) {
| |
− | return -1
| |
− | } else {
| |
− | if (this > A) {
| |
− | return 1
| |
− | } else {
| |
− | return 0
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− | String.prototype.expand = function (C, A) {
| |
− | function B(F, D) {
| |
− | var E = C[D];
| |
− | if (null === E || "undefined" === typeof (E)) {
| |
− | return A
| |
− | }
| |
− | return E
| |
− | }
| |
− | return this.replace(/\$\{(\w+)\}/g, B)
| |
− | };
| |
− | var CancelledError = DC.defineError("CancelledError");
| |
− | var InvalidStateError = DC.defineError("InvalidStateError");
| |
− | (function () {
| |
− | var C = -1;
| |
− | var A = 0;
| |
− | var B = 1;
| |
− | DC.Deferred = Class.create({
| |
− | constructor: function (D) {
| |
− | this.canceller = D;
| |
− | this._result = null;
| |
− | this._status = C;
| |
− | this._callbacks = []
| |
− | },
| |
− | _fire: function (D) {
| |
− | while (this._callbacks.length) {
| |
− | this._status = (D instanceof Error) ? B : A;
| |
− | this._result = D;
| |
− | var E = this._callbacks.shift()[this._status];
| |
− | if (!E) {
| |
− | continue
| |
− | }
| |
− | D = E(D);
| |
− | if (D instanceof DC.Deferred) {
| |
− | var F = this;
| |
− | | |
− | function G(H) {
| |
− | F._fire(H);
| |
− | return H
| |
− | }
| |
− | D.addMethods(G, G);
| |
− | return
| |
− | }
| |
− | }
| |
− | this._status = (D instanceof Error) ? B : A;
| |
− | this._result = D
| |
− | },
| |
− | result: function () {
| |
− | return this._result
| |
− | },
| |
− | cancel: function () {
| |
− | if (C !== this._status) {
| |
− | throw new InvalidStateError("Can not cancel Deferred because it is already complete")
| |
− | }
| |
− | var D = (this.canceller && this.canceller());
| |
− | if (!(D instanceof Error)) {
| |
− | D = new CancelledError("Deferred operation cancelled")
| |
− | }
| |
− | this.failure(D)
| |
− | },
| |
− | addMethods: function (D, E) {
| |
− | this._callbacks.push([D, E]);
| |
− | if (C === this._status) {
| |
− | return this
| |
− | }
| |
− | this._fire(this._result);
| |
− | return this
| |
− | },
| |
− | addCallback: function (D) {
| |
− | return this.addMethods(D, null)
| |
− | },
| |
− | addErrorHandler: function (D) {
| |
− | return this.addMethods(null, D)
| |
− | },
| |
− | callback: function (D) {
| |
− | if (C !== this._status) {
| |
− | throw new InvalidStateError("Can not signal callback because Deferred is already complete: result=" + D)
| |
− | }
| |
− | this._fire(D)
| |
− | },
| |
− | failure: function (D) {
| |
− | if (C !== this._status) {
| |
− | throw new InvalidStateError("Can not signal failure because Deferred is already complete: error=" + D)
| |
− | }
| |
− | this._fire(D)
| |
− | }
| |
− | })
| |
− | })();
| |
− | window.XHR = (function () {
| |
− | var getTransport = function () {
| |
− | throw new Error("XMLHttpRequest not available.")
| |
− | };
| |
− | if (!DC.Browser.IE) {
| |
− | getTransport = function () {
| |
− | return new XMLHttpRequest()
| |
− | }
| |
− | } else {
| |
− | var progIdCandidates = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP", "Msxml2.XMLHTTP.4.0"];
| |
− | var len = progIdCandidates.length;
| |
− | var progId;
| |
− | var xhr;
| |
− | for (var i = 0; i < len; ++i) {
| |
− | try {
| |
− | progId = progIdCandidates[i];
| |
− | xhr = new ActiveXObject(progId);
| |
− | getTransport = function () {
| |
− | return new ActiveXObject(progId)
| |
− | };
| |
− | break
| |
− | } catch (e) {}
| |
− | }
| |
− | }
| |
− | function send(url, method, options) {
| |
− | var timeout;
| |
− | | |
− | function noop() {}
| |
− | function cancel() {
| |
− | xhr.onreadystatechange = noop;
| |
− | xhr.abort()
| |
− | }
| |
− | function readyStateChanged(xhrEvent) {
| |
− | if (4 !== xhr.readyState) {
| |
− | return
| |
− | }
| |
− | if (timeout) {
| |
− | clearTimeout(timeout)
| |
− | }
| |
− | if (xhrSent === false) {
| |
− | arguments.callee.delay(0);
| |
− | return
| |
− | }
| |
− | var status = xhr.status;
| |
− | var succeeded = (status >= 200 && status < 300) || 304 == status;
| |
− | if (0 === status || "undefined" === typeof (status)) {
| |
− | var protocol = window.location.protocol;
| |
− | succeeded = "file:" === protocol || "chrome:" === protocol
| |
− | }
| |
− | var result = xhr.responseText;
| |
− | var err;
| |
− | if (succeeded) {
| |
− | if ("HEAD" == method) {
| |
− | result = {};
| |
− | try {
| |
− | var headers = xhr.getAllResponseHeaders();
| |
− | if (headers) {
| |
− | headers = headers.split("\n");
| |
− | headers.forEach(function (header) {
| |
− | var match = header.match(/^([^:]+):(.+)$/m);
| |
− | var name = match[1].trim();
| |
− | result[name] = match[2].trim()
| |
− | })
| |
− | }
| |
− | } catch (e) {}
| |
− | } else {
| |
− | var contentType = options.responseContentType || xhr.getResponseHeader("Content-Type");
| |
− | if (contentType.match(/(?:application\/(?:x-)?json)|(?:text\/json)/)) {
| |
− | try {
| |
− | result = eval("(" + result + ")")
| |
− | } catch (e) {
| |
− | err = e;
| |
− | succeeded = false
| |
− | }
| |
− | }
| |
− | if (contentType.match(/(?:application|text)\/xml/)) {
| |
− | result = xhr.responseXML
| |
− | }
| |
− | }
| |
− | } else {
| |
− | err = new Error("XHR request failed");
| |
− | err.url = url;
| |
− | err.method = method;
| |
− | err.xhr = xhr;
| |
− | err.status = xhr.status;
| |
− | err.statusText = "Failed to load resource."
| |
− | }
| |
− | if (succeeded) {
| |
− | deferred.callback(result)
| |
− | } else {
| |
− | deferred.failure(err)
| |
− | }
| |
− | xhr.onreadystatechange = noop;
| |
− | xhr = null
| |
− | }
| |
− | var xhr = getTransport();
| |
− | var queryString = Object.toQueryString(options.parameters || {});
| |
− | var body = options.body || "";
| |
− | var async = !options.sync;
| |
− | var deferred = new DC.Deferred(cancel);
| |
− | var xhrSent = false;
| |
− | method = (method || "GET").toUpperCase();
| |
− | try {
| |
− | if ("GET" == method) {
| |
− | if (queryString && -1 === url.indexOf("?")) {
| |
− | url = url + "?" + queryString
| |
− | } else {
| |
− | if (queryString && -1 !== url.indexOf("?")) {
| |
− | url = url + "&" + queryString
| |
− | } else {
| |
− | if ("&" === url.slice(-1)) {
| |
− | url = url + queryString
| |
− | } else {
| |
− | url = url + queryString
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− | if (options.responseContentType && xhr.overrideMimeType) {
| |
− | xhr.overrideMimeType(options.responseContentType)
| |
− | }
| |
− | if (options.user) {
| |
− | xhr.open(method, url, async, options.user, options.password || "")
| |
− | } else {
| |
− | xhr.open(method, url, async)
| |
− | }
| |
− | var headers = options.headers || {};
| |
− | for (var h in headers) {
| |
− | xhr.setRequestHeader(h, headers[h])
| |
− | }
| |
− | if ("POST" == method) {
| |
− | xhr.setRequestHeader("Content-Type", options.contentType || "application/x-www-form-urlencoded");
| |
− | body = queryString
| |
− | }
| |
− | if (async) {
| |
− | xhr.onreadystatechange = readyStateChanged;
| |
− | timeout = setTimeout(function () {
| |
− | xhr.abort()
| |
− | }, 30000)
| |
− | }
| |
− | xhr.send(body);
| |
− | xhrSent = true;
| |
− | if (!async) {
| |
− | readyStateChanged()
| |
− | }
| |
− | } catch (e) {
| |
− | var err = new Error("XHR request failed");
| |
− | err.url = url;
| |
− | err.method = method;
| |
− | err.xhr = xhr;
| |
− | err.status = -1;
| |
− | err.statusText = "Failed to load resource.";
| |
− | deferred.failure(err)
| |
− | }
| |
− | return deferred
| |
− | }
| |
− | return {
| |
− | get: function (url, parameters, options) {
| |
− | return XHR.request("GET", url, parameters, options)
| |
− | },
| |
− | post: function (url, parameters, options) {
| |
− | return XHR.request("POST", url, parameters, options)
| |
− | },
| |
− | request: function (method, url, parameters, options) {
| |
− | method = method.toUpperCase();
| |
− | options = options || {};
| |
− | options.parameters = parameters;
| |
− | return send(url, method, options)
| |
− | }
| |
− | }
| |
− | })();
| |
− | DC.Controller = Class.create(DC.Bindable, {
| |
− | constructor: function (A) {
| |
− | this.base(A)
| |
− | },
| |
− | registerWithName: function (A) {
| |
− | if (!A) {
| |
− | return
| |
− | }
| |
− | this.name = A;
| |
− | DC.registerModelWithName(this, A)
| |
− | }
| |
− | });
| |
− | DC.Markers = {
| |
− | MultipleValues: "ThisIsAnUniqueStringThatRepresentsMultipleValues",
| |
− | NoSelection: "ThisIsAnUniqueStringThatRepresentsNoSelection"
| |
− | };
| |
− | DC.SelectionProxy = Class.create(DC.KVO, {
| |
− | constructor: function (A) {
| |
− | this.controller = A;
| |
− | this.mutable = true
| |
− | },
| |
− | infoForKey: function (B) {
| |
− | var A = this.controller.selectedObjects();
| |
− | var C = A.infoForKey(B);
| |
− | C.mutable &= this.mutable;
| |
− | return C
| |
− | },
| |
− | infoForKeyPath: function (C) {
| |
− | var A = this.controller.selectedObjects();
| |
− | var B = A.infoForKeyPath(C);
| |
− | B.mutable &= this.mutable;
| |
− | return B
| |
− | },
| |
− | translateValue: function (D) {
| |
− | if ("array" !== DC.typeOf(D)) {
| |
− | return D
| |
− | }
| |
− | if (1 === D.length) {
| |
− | return D[0]
| |
− | }
| |
− | var C;
| |
− | var A;
| |
− | var B = D[0];
| |
− | for (C = 1, A = D.length; C < A; ++C) {
| |
− | if (0 !== DC.compareValues(B, D[C])) {
| |
− | return DC.Markers.MultipleValues
| |
− | }
| |
− | }
| |
− | return B
| |
− | },
| |
− | valueForKey: function (C) {
| |
− | var B = this.controller.selectedObjects();
| |
− | if (0 === B.length) {
| |
− | return DC.Markers.NoSelection
| |
− | }
| |
− | var A = B.valueForKey(C);
| |
− | return this.translateValue(A)
| |
− | },
| |
− | validateValueForKeyPath: function (E, F) {
| |
− | var B = this.controller.selectedObjects();
| |
− | var A = B.length;
| |
− | var D;
| |
− | if (0 === A) {
| |
− | return E
| |
− | }
| |
− | var C;
| |
− | for (D = 0; D < A; ++D) {
| |
− | C = B[D].validateValueForKeyPath(E, F);
| |
− | if (C instanceof DC.Error) {
| |
− | return C
| |
− | }
| |
− | }
| |
− | return C
| |
− | },
| |
− | valueForKeyPath: function (C) {
| |
− | var B = this.controller.selectedObjects();
| |
− | if (0 === B.length) {
| |
− | return DC.Markers.NoSelection
| |
− | }
| |
− | var A = B.valueForKeyPath(C);
| |
− | return this.translateValue(A)
| |
− | },
| |
− | setValueForKey: function (D, C) {
| |
− | if (!this.mutable) {
| |
− | return
| |
− | }
| |
− | var B = this.controller.selectedObjects();
| |
− | var A = this.valueForKey(C);
| |
− | B.setValueForKey(D, C);
| |
− | var E = this.valueForKey(C);
| |
− | if (A === E) {
| |
− | return
| |
− | }
| |
− | var F = new DC.ChangeNotification(this, DC.ChangeType.setting, E, A);
| |
− | this.notifyObserversOfChangeForKeyPath(F, C)
| |
− | },
| |
− | setValueForKeyPath: function (C, F) {
| |
− | if (!this.mutable) {
| |
− | return
| |
− | }
| |
− | var B = this.controller.selectedObjects();
| |
− | var A = this.valueForKeyPath(F);
| |
− | B.setValueForKeyPath(C, F);
| |
− | var D = this.valueForKeyPath(F);
| |
− | if (A === D) {
| |
− | return
| |
− | }
| |
− | var E = new DC.ChangeNotification(this, DC.ChangeType.setting, D, A);
| |
− | this.notifyObserversOfChangeForKeyPath(E, F)
| |
− | }
| |
− | });
| |
− | DC.ObjectController = Class.create(DC.Controller, {
| |
− | constructor: function (A) {
| |
− | this.base(A);
| |
− | this.objectClass = DC.KVO;
| |
− | this.__content = null;
| |
− | this.__editable = true;
| |
− | this.__selectedObjects = [];
| |
− | this.__selection = new DC.SelectionProxy(this)
| |
− | },
| |
− | observeChildObjectChangeForKeyPath: function (F, E, B) {
| |
− | this.base(F, E, B);
| |
− | if ("selectedObjects" !== B) {
| |
− | return
| |
− | }
| |
− | var C = "selection." + E;
| |
− | var D = this.valueForKeyPath(C);
| |
− | var A = new DC.ChangeNotification(this, DC.ChangeType.setting, D, null);
| |
− | this.notifyObserversOfChangeForKeyPath(A, C)
| |
− | },
| |
− | keyDependencies: {},
| |
− | exposedBindings: ["editable", "content"],
| |
− | editable: function () {
| |
− | var A = this.__editable;
| |
− | if (this.bindings.content) {
| |
− | A &= this.bindings.content.mutable()
| |
− | }
| |
− | return A
| |
− | },
| |
− | setEditable: function (A) {
| |
− | if (this.bindings.content) {
| |
− | A &= this.bindings.content.mutable()
| |
− | }
| |
− | if (this.bindings.editable) {
| |
− | this.bingings.editable.setValue(A)
| |
− | }
| |
− | this.__editable = A
| |
− | },
| |
− | content: function () {
| |
− | return this.__content
| |
− | },
| |
− | setContent: function (A) {
| |
− | if (this.bindings.content) {
| |
− | this.bindings.content.setValue(A)
| |
− | }
| |
− | this.__content = A;
| |
− | this.willChangeValueForKey("selectedObjects");
| |
− | if (!A) {
| |
− | this.__selectedObjects = []
| |
− | } else {
| |
− | this.__selectedObjects = [A]
| |
− | }
| |
− | this.didChangeValueForKey("selectedObjects");
| |
− | this.forceChangeNotificationForKey("selection")
| |
− | },
| |
− | selectedObjects: function () {
| |
− | return this.__selectedObjects
| |
− | },
| |
− | selection: function () {
| |
− | return this.__selection
| |
− | }
| |
− | });
| |
− | DC.AjaxController = Class.create(DC.ObjectController, {
| |
− | flushContentBeforeQuery: false,
| |
− | fetchesInitially: true,
| |
− | constructor: function (A) {
| |
− | this.queryDelay = 0;
| |
− | this.url = "";
| |
− | this.method = "GET";
| |
− | this.base(A);
| |
− | if (this.parameters) {
| |
− | DC.KVO.adaptTree(this.parameters)
| |
− | } else {
| |
− | this.parameters = new DC.KVO()
| |
− | }
| |
− | this.addObserverForKeyPath(this, this.queryUpdated, "url");
| |
− | this.addObserverForKeyPath(this, this.queryUpdated, "method")
| |
− | },
| |
− | __postConstruct: function () {
| |
− | this.base();
| |
− | if (this.fetchesInitially && this.url && this.url.length && this.validateParameters()) {
| |
− | this.forceChangeNotificationForKey("url")
| |
− | }
| |
− | },
| |
− | validateParameters: function () {
| |
− | return true
| |
− | },
| |
− | fullURL: function () {
| |
− | var H = {};
| |
− | var E = this.parameters.mutableKeys();
| |
− | var A = E.length;
| |
− | var B = this.url;
| |
− | var D;
| |
− | var G;
| |
− | for (var C = 0; C < A; ++C) {
| |
− | G = E[C];
| |
− | if (this.parameters.hasOwnProperty(G)) {
| |
− | H[G] = this.parameters[G]
| |
− | }
| |
− | }
| |
− | D = Object.toQueryString(H);
| |
− | if (D) {
| |
− | var F = B.indexOf("?");
| |
− | if (F != (B.length - 1)) {
| |
− | B += "?"
| |
− | }
| |
− | B += D
| |
− | }
| |
− | return B
| |
− | },
| |
− | observeChildObjectChangeForKeyPath: function (C, B, A) {
| |
− | this.base(C, B, A);
| |
− | if ("parameters" === A) {
| |
− | this.queryUpdated(C, B, A)
| |
− | }
| |
− | },
| |
− | queryUpdated: function (C, B, A) {
| |
− | if (!this.parameters || !this.validateParameters()) {
| |
− | return
| |
− | }
| |
− | this.setValueForKey(true, "queryInProgress");
| |
− | if (this.__queryTimer) {
| |
− | window.clearTimeout(this.__queryTimer)
| |
− | }
| |
− | this.__queryTimer = this.performQuery.bindAndDelay(this, this.queryDelay)
| |
− | },
| |
− | performQuery: function () {
| |
− | var F = {};
| |
− | var E = this.parameters.mutableKeys();
| |
− | var A = E.length;
| |
− | var G;
| |
− | var C;
| |
− | var B = "application/json";
| |
− | for (var D = 0; D < A; ++D) {
| |
− | G = E[D];
| |
− | if (!this.parameters.hasOwnProperty(G)) {
| |
− | continue
| |
− | }
| |
− | C = this.parameters[G];
| |
− | if (null === C || "undefined" === typeof (C)) {
| |
− | continue
| |
− | }
| |
− | F[G] = C
| |
− | }
| |
− | if (this.dataModel && ("xml" == this.dataModel.dataType)) {
| |
− | B = "text/xml"
| |
− | }
| |
− | this.__request = XHR.get(this.url, F, {
| |
− | responseContentType: B
| |
− | });
| |
− | this.__request.addMethods(this.querySucceeded.bind(this), this.queryFailed.bind(this));
| |
− | if (this.flushContentBeforeQuery) {
| |
− | this.setContent(null)
| |
− | }
| |
− | },
| |
− | extractContent: function (A) {
| |
− | return A
| |
− | },
| |
− | querySucceeded: function (A) {
| |
− | var E = null;
| |
− | var C = "json";
| |
− | if (this.dataModel) {
| |
− | if ("xml" == this.dataModel.dataType) {
| |
− | C = "xml"
| |
− | }
| |
− | }
| |
− | if (C == "json") {
| |
− | DC.KVO.adaptTree(A);
| |
− | E = A
| |
− | } else {
| |
− | if (C == "xml" && A) {
| |
− | if (this.dataModel.model) {
| |
− | var B = this.dataModel.model;
| |
− | var D = A;
| |
− | for (var F = D.firstChild; F != null; F = F.nextSibling) {
| |
− | if ((F.nodeType == 1)) {
| |
− | D = F;
| |
− | break
| |
− | }
| |
− | }
| |
− | if (B && D) {
| |
− | E = new DC.ModeledXMLProxy(A, D, B)
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− | if (!E) {
| |
− | err = new Error("XHR request failed");
| |
− | err.url = this.url;
| |
− | err.method = this.method;
| |
− | err.status = 400;
| |
− | err.statusText = "Invalid feed.";
| |
− | this.queryFailed(err);
| |
− | return
| |
− | }
| |
− | this.setContent(this.extractContent(E));
| |
− | this.setValueForKey("", "statusCode");
| |
− | this.setValueForKey("", "errorMessage");
| |
− | this.setValueForKey(false, "queryInProgress")
| |
− | },
| |
− | queryFailed: function (A) {
| |
− | this.setValueForKey(-1, "statusCode");
| |
− | this.setValueForKey(A.statusText, "errorMessage");
| |
− | this.setContent(null);
| |
− | this.setValueForKey(false, "queryInProgress")
| |
− | }
| |
− | });
| |
− | DC.ModeledXMLProxy = Class.create(DC.KVO, {
| |
− | _xmlRoot: null,
| |
− | _xmlNode: null,
| |
− | constructor: function (A, C, B) {
| |
− | this._xmlRoot = A;
| |
− | this._xmlNode = C;
| |
− | this._xmlModel = B;
| |
− | this._valueCache = {};
| |
− | if (B) {
| |
− | if (DC.typeOf(B) == "array") {
| |
− | this._xmlModel = B[0]
| |
− | }
| |
− | }
| |
− | },
| |
− | _typeOfChild: function (A) {
| |
− | var B = "string";
| |
− | var C = false;
| |
− | if (!this._xmlModel) {
| |
− | return null
| |
− | }
| |
− | model = this._xmlModel[A];
| |
− | if (model == undefined) {
| |
− | if (A != "#content") {
| |
− | return {
| |
− | type: "string",
| |
− | toMany: false
| |
− | }
| |
− | } else {
| |
− | return null
| |
− | }
| |
− | }
| |
− | B = DC.typeOf(model);
| |
− | if (B == "array") {
| |
− | C = true;
| |
− | B = DC.typeOf(model[0])
| |
− | }
| |
− | if (B == "string" && model == "xhtml") {
| |
− | B = "xhtml"
| |
− | }
| |
− | return {
| |
− | type: B,
| |
− | toMany: C
| |
− | }
| |
− | },
| |
− | _valueOfNode: function (C, B) {
| |
− | var A = null;
| |
− | var D = null;
| |
− | if (B == "object") {
| |
− | return new DC.ModeledXMLProxy(self._xmlRoot, C, model)
| |
− | }
| |
− | for (var E = C.firstChild; E != null; E = E.nextSibling) {
| |
− | if (B == "xhtml") {
| |
− | if (E.nodeType == 1 && (E.namespaceURI == DC.ModeledXMLProxy.NS_XHTML)) {
| |
− | return E.outerHTML || E.xml || E.innerHTML
| |
− | }
| |
− | } else {
| |
− | if ((E.nodeType == 3) || (E.nodeType == 4)) {
| |
− | if (!(/[^\t\n\r ]/.test(E.data))) {
| |
− | continue
| |
− | }
| |
− | A = E.data
| |
− | }
| |
− | }
| |
− | }
| |
− | if (A) {
| |
− | if (B == "boolean") {
| |
− | if (A == "true" || A == "YES") {
| |
− | D = true
| |
− | } else {
| |
− | if (A == "false" || A == "NO") {
| |
− | D = false
| |
− | }
| |
− | }
| |
− | } else {
| |
− | if (B == "number") {
| |
− | D = Number(A);
| |
− | if (D == NaN) {
| |
− | D = A
| |
− | }
| |
− | } else {
| |
− | D = A
| |
− | }
| |
− | }
| |
− | }
| |
− | return D
| |
− | },
| |
− | _valueOfChild: function (H) {
| |
− | var I = this;
| |
− | var E = null;
| |
− | var F = null;
| |
− | var C = false;
| |
− | var B = function (M, L) {
| |
− | var K = new Array();
| |
− | for (var N = M.firstChild; N != null; N = N.nextSibling) {
| |
− | var J = N.nodeName;
| |
− | if (J == L) {
| |
− | K.push(N)
| |
− | }
| |
− | }
| |
− | return K.length ? K : undefined
| |
− | };
| |
− | var D = this._typeOfChild(H);
| |
− | if (!D) {
| |
− | return null
| |
− | }
| |
− | F = D.type;
| |
− | C = D.toMany;
| |
− | if (H == "#content") {
| |
− | return this._valueOfNode(this._xmlNode, F)
| |
− | }
| |
− | var A = B(this._xmlNode, H);
| |
− | var G = null;
| |
− | if (C) {
| |
− | G = new Array();
| |
− | if (A) {
| |
− | A.forEach(function (J) {
| |
− | G.push(I._valueOfNode(J, F))
| |
− | })
| |
− | }
| |
− | } else {
| |
− | if (A && A.length) {
| |
− | G = this._valueOfNode(A[0], F)
| |
− | }
| |
− | }
| |
− | return G
| |
− | },
| |
− | _rawValueForKey: function (A) {
| |
− | var B = null;
| |
− | if (0 == A.indexOf("$")) {
| |
− | B = this._xmlNode.getAttribute(A.substr(1))
| |
− | } else {
| |
− | if (0 == A.indexOf("#")) {
| |
− | B = this._valueOfChild(A)
| |
− | } else {
| |
− | B = this._valueOfChild(A)
| |
− | }
| |
− | }
| |
− | return B
| |
− | },
| |
− | toString: function () {
| |
− | if (this._typeOfChild("#content")) {
| |
− | return this.valueForKey("#content")
| |
− | }
| |
− | return "OBJECT"
| |
− | },
| |
− | valueForKey: function (A) {
| |
− | var B = this._valueCache[A];
| |
− | if (!A || 0 === A.length) {
| |
− | throw new InvalidArgumentError("the key is empty")
| |
− | }
| |
− | if (undefined === B) {
| |
− | var C;
| |
− | if (!this.__keys) {
| |
− | this.__keys = {}
| |
− | }
| |
− | this.__keys[A] = C = new DC.ModeledXMLKeyInfo(this, A);
| |
− | B = C.get(this)
| |
− | }
| |
− | if (!this._valueAccessedViaKeyPath && B && (B instanceof DC.ModeledXMLProxy)) {
| |
− | if (B._typeOfChild("#content")) {
| |
− | return B.valueForKey("#content")
| |
− | }
| |
− | }
| |
− | return B
| |
− | },
| |
− | valueForKeyPath: function (C) {
| |
− | if (!C || 0 === C.length) {
| |
− | throw new InvalidArgumentError("keyPath may not be empty")
| |
− | }
| |
− | if ("string" == typeof (C)) {
| |
− | C = C.split(".")
| |
− | }
| |
− | this._valueAccessedViaKeyPath = true;
| |
− | var A = C[0];
| |
− | var B = this.base(C);
| |
− | delete this._valueAccessedViaKeyPath;
| |
− | if (1 == C.length && B) {
| |
− | if (B instanceof DC.ModeledXMLProxy) {
| |
− | if (B._typeOfChild("#content")) {
| |
− | return B.valueForKey("#content")
| |
− | }
| |
− | }
| |
− | }
| |
− | return B
| |
− | }
| |
− | });
| |
− | DC.ModeledXMLProxy.NS_XHTML = "http://www.w3.org/1999/xhtml";
| |
− | DC.ModeledXMLKeyInfo = Class.create(DC.KeyInfo, {
| |
− | constructor: function (D, C) {
| |
− | var A = DC.KVO.getPropertyMethodsForKeyOnObject;
| |
− | var B = D._rawValueForKey(C);
| |
− | DC.KVO.getPropertyMethodsForKeyOnObject = function (E, F) {
| |
− | return {
| |
− | value: B,
| |
− | getter: function () {
| |
− | return this._valueCache[E]
| |
− | },
| |
− | mutator: function (G) {
| |
− | this.willChangeValueForKey(E);
| |
− | this._valueCache[E] = G;
| |
− | this.didChangeValueForKey(E)
| |
− | }
| |
− | }
| |
− | };
| |
− | this.base(D, C);
| |
− | D._valueCache[this.key] = B;
| |
− | DC.KVO.getPropertyMethodsForKeyOnObject = A
| |
− | }
| |
− | });
| |
− | (function () {
| |
− | var A = this.Element;
| |
− | this.Element = {};
| |
− | Object.extend(this.Element, A || {})
| |
− | }).call(window);
| |
− | Object.extend(Element, {
| |
− | uniqueId: function () {
| |
− | return "DC_id_" + Element.assignId.uniqueId++
| |
− | },
| |
− | assignId: function (A) {
| |
− | return A.id || (A.id = ("DC_id_" + Element.assignId.uniqueId++))
| |
− | },
| |
− | regexForClassName: function (B) {
| |
− | var A = arguments.callee;
| |
− | if (!A._lookup) {
| |
− | A._lookup = {}
| |
− | }
| |
− | if (B in A._lookup) {
| |
− | return A._lookup[B]
| |
− | }
| |
− | return (A._lookup[B] = new RegExp("(^|\\s)" + B + "(\\s|$)"))
| |
− | },
| |
− | hasClassName: function (A, B) {
| |
− | var C = A.className;
| |
− | if (!C) {
| |
− | return false
| |
− | }
| |
− | if (C == B) {
| |
− | return true
| |
− | }
| |
− | return Element.regexForClassName(B).test(C)
| |
− | },
| |
− | addClassName: function (A, B) {
| |
− | if (!B) {
| |
− | return
| |
− | }
| |
− | if (Element.hasClassName(A, B)) {
| |
− | return
| |
− | }
| |
− | A.className += " " + B
| |
− | },
| |
− | removeClassName: function (A, B) {
| |
− | if (!A || !B) {
| |
− | return
| |
− | }
| |
− | var C = Element.regexForClassName(B);
| |
− | A.className = A.className.replace(C, " ").trim()
| |
− | },
| |
− | replaceClassName: function (B, C, A) {
| |
− | if (!C) {
| |
− | return
| |
− | }
| |
− | if (!A) {
| |
− | Element.removeClassName(B, C);
| |
− | return
| |
− | }
| |
− | var D = Element.regexForClassName(C);
| |
− | B.className = B.className.replace(D, "$1" + A + "$2").trim()
| |
− | },
| |
− | toggleClassName: function (A, B) {
| |
− | if (!B) {
| |
− | return
| |
− | }
| |
− | var C = Element.regexForClassName(B);
| |
− | var D = A.className;
| |
− | if (C.test(D)) {
| |
− | A.className = D.replace(C, " ").trim()
| |
− | } else {
| |
− | A.className += " " + B
| |
− | }
| |
− | },
| |
− | updateClass: function (F, G, C) {
| |
− | var E = $S(F.className.split(" "));
| |
− | var H = Set.add;
| |
− | var B = Set.remove;
| |
− | var D;
| |
− | var A;
| |
− | if ("string" === typeof (G)) {
| |
− | H(E, G)
| |
− | } else {
| |
− | for (D = 0, A = G.length; D < A; ++D) {
| |
− | H(E, G[D])
| |
− | }
| |
− | }
| |
− | if ("string" === typeof (C)) {
| |
− | B(E, C)
| |
− | } else {
| |
− | for (D = 0, A = C.length; D < A; ++D) {
| |
− | B(E, C[D])
| |
− | }
| |
− | }
| |
− | F.className = Set.join(E, " ")
| |
− | },
| |
− | PROPERTIES: ["backgroundColor", "backgroundPosition", "borderTopColor", "borderRightColor", "borderBottomColor", "borderLeftColor", "borderTopWidth", "borderRightWidth", "borderBottomWidth", "borderLeftWidth", "color", "display", "fontSize", "letterSpacing", "lineHeight", "opacity", "width", "height", "top", "bottom", "left", "right", "marginTop", "marginRight", "marginBottom", "marginLeft", "paddingTop", "paddingRight", "paddingBottom", "paddingLeft"],
| |
− | getStyles: function (E, D) {
| |
− | var F = {};
| |
− | var B = window.getComputedStyle(E, null);
| |
− | if ("string" === typeof (D)) {
| |
− | return E.style[D] || B[D] || null
| |
− | }
| |
− | D = D || Element.PROPERTIES;
| |
− | var G;
| |
− | var A = D.length;
| |
− | for (var C = 0; C < A; ++C) {
| |
− | G = D[C];
| |
− | F[G] = E.style[G] || B[G] || null
| |
− | }
| |
− | return F
| |
− | },
| |
− | setStyle: function (A, B, C) {
| |
− | A.style[B] = C
| |
− | },
| |
− | setStyles: function (A, B) {
| |
− | var C = A.style;
| |
− | for (var D in B) {
| |
− | C[D] = B[D]
| |
− | }
| |
− | },
| |
− | getDimensions: function (E) {
| |
− | var G = Element.getStyle(E, "display");
| |
− | if (G && G != "none") {
| |
− | return {
| |
− | left: E.offsetLeft,
| |
− | top: E.offsetTop,
| |
− | width: E.offsetWidth,
| |
− | height: E.offsetHeight
| |
− | }
| |
− | }
| |
− | var B = E.style;
| |
− | var F = B.visibility;
| |
− | var C = B.position;
| |
− | var A = B.display;
| |
− | B.visibility = "hidden";
| |
− | B.position = "absolute";
| |
− | B.display = "block";
| |
− | var D = {
| |
− | width: E.offsetWidth,
| |
− | height: E.offsetHeight,
| |
− | left: E.offsetLeft,
| |
− | top: E.offsetTop
| |
− | };
| |
− | B.display = A;
| |
− | B.position = C;
| |
− | B.visibility = F;
| |
− | return D
| |
− | },
| |
− | set3PiecesBorderImage: function (G, B, E, J) {
| |
− | if (DC.Support.BorderImage) {
| |
− | G.style.borderWidth = B ? "0px " + J + "px 0px " + E + "px " : "0px";
| |
− | var K = B ? "url(" + B + ") 0 " + J + " 0 " + E + " repeat stretch" : "";
| |
− | G.style.webkitBorderImage = K;
| |
− | G.style.MozBorderImage = K
| |
− | } else {
| |
− | if (!B) {
| |
− | G.innerHTML = "";
| |
− | return
| |
− | }
| |
− | var A = document.createElement("div");
| |
− | var F = A.style;
| |
− | F.position = "absolute";
| |
− | F.top = "0px";
| |
− | F.bottom = "0px";
| |
− | var L = A.cloneNode(false);
| |
− | L.style.left = "0px";
| |
− | L.style.right = "0px";
| |
− | var C = A.cloneNode(false);
| |
− | var D = C.style;
| |
− | D.backgroundImage = "url(" + B + ")";
| |
− | D.backgroundRepeat = "no-repeat";
| |
− | var H = C.cloneNode(false);
| |
− | var I = H.style;
| |
− | D.left = "0px";
| |
− | D.width = E + "px";
| |
− | I.right = "0px";
| |
− | I.width = J + "px";
| |
− | I.backgroundPosition = "100% 0px";
| |
− | F.left = E + "px";
| |
− | F.right = J + "px";
| |
− | F.backgroundImage = "url(" + B.replace(/.png/, "__mid.png") + ")";
| |
− | F.backgroundRepeat = "repeat-x";
| |
− | if (G.firstChild) {
| |
− | G.insertBefore(L, G.firstChild)
| |
− | } else {
| |
− | G.appendChild(L)
| |
− | }
| |
− | L.appendChild(C);
| |
− | L.appendChild(A);
| |
− | L.appendChild(H)
| |
− | }
| |
− | },
| |
− | clone: function (A) {
| |
− | return A.cloneNode(true)
| |
− | },
| |
− | depthFirstTraversal: function (D, E, C) {
| |
− | if (!D || !E) {
| |
− | return
| |
− | }
| |
− | var A = D.nextSibling || D.parentNode;
| |
− | var B;
| |
− | C = C || E;
| |
− | while (D !== A) {
| |
− | if (1 === D.nodeType) {
| |
− | B = E.call(C, D);
| |
− | if (false !== B && D.firstChild) {
| |
− | D = D.firstChild;
| |
− | continue
| |
− | }
| |
− | }
| |
− | while (!D.nextSibling) {
| |
− | D = D.parentNode;
| |
− | if (D === A) {
| |
− | return
| |
− | }
| |
− | }
| |
− | D = D.nextSibling
| |
− | }
| |
− | },
| |
− | query: function (B, A) {
| |
− | if (1 == arguments.length) {
| |
− | A = B;
| |
− | B = document
| |
− | } else {
| |
− | if (B != document) {
| |
− | A = "#" + Element.assignId(B) + " " + A
| |
− | }
| |
− | }
| |
− | return B.querySelector(A)
| |
− | },
| |
− | queryAll: function (B, A) {
| |
− | if (1 == arguments.length) {
| |
− | A = B;
| |
− | B = document
| |
− | } else {
| |
− | if (B != document) {
| |
− | A = "#" + Element.assignId(B) + " " + A
| |
− | }
| |
− | }
| |
− | return Array.from(B.querySelectorAll(A))
| |
− | },
| |
− | match: function (B, A) {
| |
− | return Sizzle.matches(A, [B]).length == 1
| |
− | },
| |
− | getViewport: function () {
| |
− | var B = document.documentElement;
| |
− | var A = document.body;
| |
− | return {
| |
− | left: window.scrollLeft || B.scrollLeft || A.scrollLeft,
| |
− | top: window.scrollTop || B.scrollTop || A.scrollTop,
| |
− | width: window.innerWidth || B.clientWidth || A.clientWidth,
| |
− | height: window.innerHeight | B.clientHeight || A.clientHeight
| |
− | }
| |
− | },
| |
− | scrollParent: function (F) {
| |
− | var E;
| |
− | var C = Element.getStyles;
| |
− | var A = document.body;
| |
− | while (F && F != A) {
| |
− | E = C(F, ["overflow", "overflowX", "overflowY"]);
| |
− | for (var B in E) {
| |
− | var D = E[B];
| |
− | if ("auto" == D || "scroll" == D) {
| |
− | return F
| |
− | }
| |
− | }
| |
− | F = F.parentNode
| |
− | }
| |
− | return F
| |
− | },
| |
− | getRect: function (P, N) {
| |
− | if (!P) {
| |
− | return null
| |
− | }
| |
− | var R = document.documentElement;
| |
− | var M = document.body;
| |
− | var D = 0;
| |
− | var O = 0;
| |
− | if (P != document.body && P.getBoundingClientRect) {
| |
− | var L = P.getBoundingClientRect();
| |
− | L = {
| |
− | left: L.left,
| |
− | right: L.right,
| |
− | top: L.top,
| |
− | bottom: L.bottom
| |
− | };
| |
− | if ( !! N === false) {
| |
− | L.left += Math.max(R.scrollLeft, M.scrollLeft);
| |
− | L.right += Math.max(R.scrollLeft, M.scrollLeft);
| |
− | L.top += Math.max(R.scrollTop, M.scrollTop);
| |
− | L.bottom += Math.max(R.scrollTop, M.scrollTop)
| |
− | }
| |
− | L.left -= R.clientLeft;
| |
− | L.right -= R.clientLeft;
| |
− | L.top -= R.clientTop;
| |
− | L.bottom -= R.clientTop;
| |
− | L.width = L.right - L.left + 1;
| |
− | L.height = L.bottom - L.top + 1;
| |
− | return L
| |
− | }
| |
− | var J = P.parentNode;
| |
− | var F = P;
| |
− | var A = P.offsetParent;
| |
− | var K = DC.Browser.Mozilla;
| |
− | var Q = DC.Browser.Safari && !DC.Browser.Safari2;
| |
− | var B = DC.Browser.Safari2;
| |
− | var H = Element.getStyles;
| |
− | var G = Element.getDimensions(P);
| |
− | var C = ("fixed" === Element.getStyles(P, "position"));
| |
− | var I;
| |
− | D += P.offsetLeft;
| |
− | O += P.offsetTop;
| |
− | while (!C && A) {
| |
− | D += A.offsetLeft;
| |
− | O += A.offsetTop;
| |
− | if (K && !((/^t(able|d|h)$/i).test(A.tagName)) || Q) {
| |
− | I = H(A, ["borderLeftWidth", "borderTopWidth"]);
| |
− | D += parseInt(I.borderLeftWidth || 0, 10);
| |
− | O += parseInt(I.borderTopWidth || 0, 10)
| |
− | }
| |
− | if (!C) {
| |
− | C = ("fixed" === H(A, "position"))
| |
− | }
| |
− | if ("BODY" !== A.tagName) {
| |
− | F = A
| |
− | }
| |
− | A = A.offsetParent
| |
− | }
| |
− | var E = K ? ["display", "overflow", "borderLeftWidth", "borderTopWidth"] : ["display"];
| |
− | while (J && J.tagName && "BODY" !== J.tagName && "HTML" !== J.tagName) {
| |
− | I = H(J, E);
| |
− | if (!((/^inline|table.*$/i).test(I.display))) {
| |
− | D -= J.scrollLeft;
| |
− | O -= J.scrollTop
| |
− | }
| |
− | if (K && "visible" != I.overflow) {
| |
− | D += parseInt(I.borderLeftWidth || 0, 10);
| |
− | O += parseInt(I.borderTopWidth || 0, 10)
| |
− | }
| |
− | J = J.parentNode
| |
− | }
| |
− | var S = H(F, "position");
| |
− | if ((B && (C || S == "absolute")) || (K && S != "absolute")) {
| |
− | D -= M.offsetLeft;
| |
− | O -= M.offsetTop
| |
− | }
| |
− | if (N === true && !C) {
| |
− | D -= Math.max(R.scrollLeft, M.scrollLeft);
| |
− | O -= Math.max(R.scrollTop, M.scrollTop)
| |
− | }
| |
− | return {
| |
− | left: D,
| |
− | top: O,
| |
− | right: D + G.width - 1,
| |
− | bottom: O + G.height - 1,
| |
− | width: G.width,
| |
− | height: G.height
| |
− | }
| |
− | }
| |
− | });
| |
− | Element.getStyle = Element.getStyles;
| |
− | Element.assignId.uniqueId = 1;
| |
− | if (!DC.Support.QuerySelector) {
| |
− | Object.extend(Element, {
| |
− | query: function (B, A) {
| |
− | if (1 == arguments.length) {
| |
− | A = B;
| |
− | B = document
| |
− | }
| |
− | return (Sizzle(A, B)[0] || null)
| |
− | },
| |
− | queryAll: function (B, A) {
| |
− | if (1 == arguments.length) {
| |
− | A = B;
| |
− | B = document
| |
− | }
| |
− | return (Sizzle(A, B) || null)
| |
− | }
| |
− | })
| |
− | }
| |
− | if ("undefined" === typeof (document.documentElement.children)) {
| |
− | HTMLElement.prototype.__defineGetter__("children", function () {
| |
− | var B = [];
| |
− | var A = this.childNodes.length;
| |
− | var D;
| |
− | for (var C = 0; C < A; ++C) {
| |
− | D = this.childNodes[C];
| |
− | if (Node.ELEMENT_NODE !== D.nodeType) {
| |
− | continue
| |
− | }
| |
− | B.push(D)
| |
− | }
| |
− | return B
| |
− | })
| |
− | }
| |
− | if ("undefined" === typeof (document.documentElement.innerText)) {
| |
− | HTMLElement.prototype.__defineGetter__("innerText", function () {
| |
− | return this.textContent
| |
− | });
| |
− | HTMLElement.prototype.__defineSetter__("innerText", function (A) {
| |
− | this.textContent = A
| |
− | })
| |
− | };
| |
− | (function () {
| |
− | var A = this.Event;
| |
− | this.Event = {};
| |
− | Object.extend(this.Event, A || {})
| |
− | }).call(window);
| |
− | Object.extend(Event, {
| |
− | KEY_BACKSPACE: 8,
| |
− | KEY_TAB: 9,
| |
− | KEY_RETURN: 13,
| |
− | KEY_ESC: 27,
| |
− | KEY_LEFT: 37,
| |
− | KEY_UP: 38,
| |
− | KEY_RIGHT: 39,
| |
− | KEY_DOWN: 40,
| |
− | KEY_DELETE: 46,
| |
− | KEY_HOME: 36,
| |
− | KEY_END: 35,
| |
− | KEY_PAGEUP: 33,
| |
− | KEY_PAGEDOWN: 34,
| |
− | KEY_INSERT: 45,
| |
− | _domHasFinishedLoading: function () {
| |
− | if (arguments.callee.done) {
| |
− | return
| |
− | }
| |
− | arguments.callee.done = true;
| |
− | if (this._domLoadedTimer) {
| |
− | window.clearInterval(this._domLoadedTimer)
| |
− | }
| |
− | var C = Event._readyCallbacks;
| |
− | var A = C.length;
| |
− | var B;
| |
− | for (B = 0; B < A; ++B) {
| |
− | C[B]()
| |
− | }
| |
− | Event._readyCallbacks = null
| |
− | },
| |
− | observe: function (C, A, B) {
| |
− | if ("on" == A.slice(0, 2)) {
| |
− | A = A.slice(2)
| |
− | }
| |
− | C.addEventListener(A, B, false)
| |
− | },
| |
− | stopObserving: function (C, A, B) {
| |
− | if ("on" == A.slice(0, 2)) {
| |
− | A = A.slice(2)
| |
− | }
| |
− | C.removeEventListener(A, B, false)
| |
− | },
| |
− | stop: function (A) {
| |
− | A.preventDefault();
| |
− | A.stopPropagation()
| |
− | },
| |
− | preventDefault: function (A) {
| |
− | A.preventDefault()
| |
− | },
| |
− | onDomReady: function (A) {
| |
− | if (Event._domHasFinishedLoading.done) {
| |
− | window.setTimeout(A, 0);
| |
− | return
| |
− | }
| |
− | if (!Event._readyCallbacks) {
| |
− | document.addEventListener("DOMContentLoaded", Event._domHasFinishedLoading, false);
| |
− | | |
− | function B() {
| |
− | if ((/loaded|complete/).test(document.readyState)) {
| |
− | Event._domHasFinishedLoading()
| |
− | }
| |
− | }
| |
− | if (DC.Browser.Safari) {
| |
− | Event._domLoadedTimer = window.setInterval(B, 10)
| |
− | }
| |
− | Event.observe(window, "load", Event._domHasFinishedLoading);
| |
− | Event._readyCallbacks = []
| |
− | }
| |
− | Event._readyCallbacks.push(A)
| |
− | }
| |
− | });
| |
− | DC.PartFinder = (function () {
| |
− | function C(G, E) {
| |
− | var H = G.length;
| |
− | var D = Array.from(E);
| |
− | | |
− | function I() {
| |
− | G = [];
| |
− | D = null;
| |
− | H = 0
| |
− | }
| |
− | function M(P) {
| |
− | G.splice(P, 1);
| |
− | if (D) {
| |
− | D.splice(P, 1)
| |
− | }
| |
− | H = G.length
| |
− | }
| |
− | function F(P) {
| |
− | var R = Element.assignId(P);
| |
− | var Q = G.indexOf(R);
| |
− | if (-1 == Q) {
| |
− | return
| |
− | }
| |
− | G.splice(Q, 1);
| |
− | if (D) {
| |
− | D.splice(Q, 1)
| |
− | }
| |
− | H = G.length
| |
− | }
| |
− | function O(R, Q) {
| |
− | var P = Element.assignId(R);
| |
− | G.splice(Q, 0, P);
| |
− | if (D) {
| |
− | D.splice(Q, 0, R)
| |
− | }
| |
− | H = G.length
| |
− | }
| |
− | function N(P) {
| |
− | G.push(Element.assignId(P));
| |
− | H = G.length;
| |
− | if (D) {
| |
− | D.push(P)
| |
− | }
| |
− | }
| |
− | function K() {
| |
− | D = null
| |
− | }
| |
− | function J() {
| |
− | var R = [];
| |
− | var P;
| |
− | for (var Q = 0; Q < H; ++Q) {
| |
− | P = document.getElementById(G[Q]);
| |
− | if (!P) {
| |
− | continue
| |
− | }
| |
− | R.push(G[Q])
| |
− | }
| |
− | G = R;
| |
− | H = R.length;
| |
− | D = null
| |
− | }
| |
− | function L(R) {
| |
− | if (D) {
| |
− | if (1 == arguments.length) {
| |
− | return D[R]
| |
− | }
| |
− | return D
| |
− | }
| |
− | if (1 == arguments.length) {
| |
− | return document.getElementById(G[R])
| |
− | }
| |
− | var P = [];
| |
− | for (var Q = 0; Q < H; ++Q) {
| |
− | P[Q] = document.getElementById(G[Q])
| |
− | }
| |
− | D = P;
| |
− | window.setTimeout(K, 250);
| |
− | return P
| |
− | }
| |
− | if (E) {
| |
− | window.setTimeout(K, 250)
| |
− | }
| |
− | L.removePartAtIndex = M;
| |
− | L.removePart = F;
| |
− | L.insertPartAtIndex = O;
| |
− | L.add = N;
| |
− | L.removeAll = I;
| |
− | L.refresh = J;
| |
− | return L
| |
− | }
| |
− | function A(G, E) {
| |
− | var D = E;
| |
− | | |
− | function F() {
| |
− | D = null
| |
− | }
| |
− | function H() {
| |
− | if (D) {
| |
− | return D
| |
− | }
| |
− | D = document.getElementById(G);
| |
− | window.setTimeout(F, 250);
| |
− | return D
| |
− | }
| |
− | return H
| |
− | }
| |
− | function B(E, D) {
| |
− | var F = Element.queryAll(E, D);
| |
− | var G = Array.map(F, Element.assignId);
| |
− | return {
| |
− | nodes: F,
| |
− | ids: G
| |
− | }
| |
− | }
| |
− | return {
| |
− | singlePart: function (E, D) {
| |
− | function F() {
| |
− | var K = D;
| |
− | var G = typeof (K);
| |
− | if ("function" === G) {
| |
− | K = K()
| |
− | } else {
| |
− | if ("string" === G) {
| |
− | K = document.getElementById(K)
| |
− | } else {
| |
− | if (!K) {
| |
− | K = this.viewElement()
| |
− | }
| |
− | }
| |
− | }
| |
− | var H = B(K, E);
| |
− | var J = A(H.ids[0], H.nodes[0]);
| |
− | var I = Class.findPropertyName(this, arguments.callee);
| |
− | if (I) {
| |
− | this[I] = J
| |
− | }
| |
− | return H.nodes[0]
| |
− | }
| |
− | return F
| |
− | },
| |
− | multipleParts: function (E, D) {
| |
− | function F(I) {
| |
− | var L = D;
| |
− | var G = typeof (L);
| |
− | if ("function" === G) {
| |
− | L = L()
| |
− | } else {
| |
− | if ("string" === G) {
| |
− | L = document.getElementById(L)
| |
− | } else {
| |
− | if (!L) {
| |
− | L = this.viewElement()
| |
− | }
| |
− | }
| |
− | }
| |
− | var H = B(L, E);
| |
− | var K = C(H.ids, H.nodes);
| |
− | var J = Class.findPropertyName(this, arguments.callee);
| |
− | if (J) {
| |
− | this[J] = K
| |
− | }
| |
− | if (arguments.length) {
| |
− | return H.nodes[I]
| |
− | } else {
| |
− | return Array.from(H.nodes)
| |
− | }
| |
− | }
| |
− | return F
| |
− | }
| |
− | }
| |
− | })();
| |
− | var Part = DC.PartFinder.singlePart;
| |
− | var PartList = DC.PartFinder.multipleParts;
| |
− | DC.Style = {
| |
− | kSelectedClass: "selected",
| |
− | kDisabledClass: "disabled",
| |
− | kReadOnlyClass: "read-only",
| |
− | kMarkerClass: "nullValue",
| |
− | kFocusClass: "focused",
| |
− | kHoverClass: "hover",
| |
− | kAscendingClass: "asc",
| |
− | kDescendingClass: "desc",
| |
− | kActiveClass: "active",
| |
− | kUpdatingClass: "updating",
| |
− | kFadingClass: "invisible",
| |
− | kInvalidValueClass: "invalid",
| |
− | kInsertedClass: "inserted",
| |
− | kDeletedClass: "deleted",
| |
− | kReplacingClass: "replacing",
| |
− | kLoadingClass: "loading",
| |
− | kFirstClass: "first",
| |
− | kLastClass: "last"
| |
− | };
| |
− | DC.Style.__styles = (function () {
| |
− | var A = [];
| |
− | var B = DC.Style;
| |
− | for (var C in B) {
| |
− | A.push(B[C])
| |
− | }
| |
− | return A
| |
− | })();
| |
− | window.FIRST_RESPONDER = "__first_responder__";
| |
− | DC.Responder = Class.create(DC.Bindable, {
| |
− | sendActionToView: function (B, A) {
| |
− | if (FIRST_RESPONDER === A) {
| |
− | A = DC.page.firstResponder
| |
− | }
| |
− | var C = A || DC.page.firstResponder || this;
| |
− | while (C) {
| |
− | if (B in C) {
| |
− | C[B](this);
| |
− | return true
| |
− | }
| |
− | C = C.nextResponder()
| |
− | }
| |
− | return false
| |
− | },
| |
− | acceptsFirstResponder: function () {
| |
− | return false
| |
− | },
| |
− | becomeFirstResponder: function () {
| |
− | return true
| |
− | },
| |
− | resignFirstResponder: function () {
| |
− | return true
| |
− | },
| |
− | nextResponder: function () {
| |
− | return this.__nextResponder || null
| |
− | },
| |
− | setNextResponder: function (A) {
| |
− | this.__nextResponder = A
| |
− | },
| |
− | presentError: function (B) {
| |
− | this.willPresentError(B);
| |
− | if (!("field" in B)) {
| |
− | B.field = this
| |
− | }
| |
− | var A = this.nextResponder();
| |
− | if (A) {
| |
− | return A.presentError(B)
| |
− | }
| |
− | return false
| |
− | },
| |
− | clearAllErrors: function (B) {
| |
− | var A = this.nextResponder();
| |
− | if (A) {
| |
− | A.clearAllErrors(B || this)
| |
− | }
| |
− | },
| |
− | willPresentError: function (A) {},
| |
− | onmousedown: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onmousedown(A)
| |
− | }
| |
− | },
| |
− | onmouseup: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onmouseup(A)
| |
− | }
| |
− | },
| |
− | onmousedrag: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onmousedrag(A)
| |
− | }
| |
− | },
| |
− | onmouseenter: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onmouseenter(A)
| |
− | }
| |
− | },
| |
− | onmouseleave: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onmouseleave(A)
| |
− | }
| |
− | },
| |
− | onclick: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onclick(A)
| |
− | }
| |
− | },
| |
− | ondblclick: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.ondblclick(A)
| |
− | }
| |
− | },
| |
− | onkeydown: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onkeydown(A)
| |
− | }
| |
− | },
| |
− | onkeyup: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onkeyup(A)
| |
− | }
| |
− | },
| |
− | onkeypress: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onkeypress(A)
| |
− | }
| |
− | },
| |
− | ontouchstart: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.ontouchstart(A)
| |
− | }
| |
− | },
| |
− | ontouchmove: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.ontouchmove(A)
| |
− | }
| |
− | },
| |
− | ontouchend: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.ontouchend(A)
| |
− | }
| |
− | },
| |
− | onswipe: function (A) {
| |
− | var B = this.nextResponder();
| |
− | if (B) {
| |
− | B.onswipe(A)
| |
− | }
| |
− | }
| |
− | });
| |
− | DC.View = Class.create(DC.Responder, {
| |
− | exposedBindings: ["visible", "class", "enabled", "editable", "html", "text"],
| |
− | defaultPlaceholders: {
| |
− | text: {
| |
− | multipleValues: _("marker.text.multipleValues"),
| |
− | nullValue: _("marker.text.placeholder"),
| |
− | noSelection: _("marker.text.noSelection")
| |
− | },
| |
− | html: {
| |
− | multipleValues: _("marker.text.multipleValues"),
| |
− | nullValue: _("marker.text.placeholder"),
| |
− | noSelection: _("marker.text.noSelection")
| |
− | }
| |
− | },
| |
− | automaticallySetupBindings: false,
| |
− | formatter: null,
| |
− | target: null,
| |
− | action: null,
| |
− | sendActionOn: ["click"],
| |
− | animated: false,
| |
− | updateAnimationDuration: 0,
| |
− | updateAnimationDelay: 0,
| |
− | postUpdateAnimationDuration: 0,
| |
− | postUpdateAnimationDelay: 0,
| |
− | preUpdateAnimationDuration: 0,
| |
− | preUpdateAnimationDelay: 0,
| |
− | constructor: function (A, B, C) {
| |
− | this.base(C);
| |
− | if ("string" === typeof (A)) {
| |
− | this.id = A;
| |
− | this.__view = document.getElementById(A)
| |
− | } else {
| |
− | this.id = Element.assignId(A);
| |
− | this.__view = A
| |
− | }
| |
− | if ("object" === DC.typeOf(B) && !("addObserverForKeyPath" in B)) {
| |
− | DC.KVO.adaptTree(B)
| |
− | }
| |
− | this.__relativeSource = B;
| |
− | if (this.id in DC.View.viewLookup) {
| |
− | throw new Error("Two views share the same ID: " + this.id)
| |
− | }
| |
− | this.viewElement().object = this;
| |
− | this.__updating = null;
| |
− | DC.View.viewLookup[this.id] = this
| |
− | },
| |
− | __postConstruct: function () {
| |
− | var B = this;
| |
− | | |
− | function C() {
| |
− | if (DC.Browser.IE) {
| |
− | delete B.__view;
| |
− | delete B.__container
| |
− | }
| |
− | }
| |
− | C.delay(250);
| |
− | var A = this.viewElement();
| |
− | if (A) {
| |
− | this.__init()
| |
− | } else {
| |
− | Event.onDomReady(this.__init.bind(this))
| |
− | }
| |
− | },
| |
− | __init: function () {
| |
− | this.__initialising = true;
| |
− | var F = this.viewElement();
| |
− | if (!F) {
| |
− | throw new Error("Unable to locate node with ID: " + this.id)
| |
− | }
| |
− | this.viewElement = function () {
| |
− | return F
| |
− | };
| |
− | var G;
| |
− | var A;
| |
− | var B = F.getAttribute("__parametersId");
| |
− | var H = this.__parameters || DC.View.nodeParameters[B] || {};
| |
− | this.__copyParameters(H);
| |
− | if (this.innerHTML && "" === String(F.innerHTML).trim()) {
| |
− | F.innerHTML = this.innerHTML
| |
− | }
| |
− | var I = DC.dataModel;
| |
− | var C = this.__context;
| |
− | DC.dataModel = this.__context = this;
| |
− | var D = this.structure() || {};
| |
− | var E = {};
| |
− | for (A in D) {
| |
− | G = D[A];
| |
− | if (G && "function" == typeof (G) && (G = G.valueOf()).__factoryFn__) {
| |
− | E[A] = G;
| |
− | G.call(this, A, true)
| |
− | }
| |
− | }
| |
− | for (A in E) {
| |
− | E[A].call(this, A, false)
| |
− | }
| |
− | this.__context = C;
| |
− | DC.dataModel = I;
| |
− | this.setupBindings();
| |
− | this.init();
| |
− | this.initFromDOM();
| |
− | this.updateBindings();
| |
− | this.createObservers();
| |
− | delete this.__initialising;
| |
− | delete this.viewElement
| |
− | },
| |
− | teardown: function () {
| |
− | for (var A in this.bindings) {
| |
− | this.bindings[A].unbind()
| |
− | }
| |
− | if (this.viewElement()) {
| |
− | this.viewElement().object = null
| |
− | }
| |
− | if (!DC.Browser.IE) {
| |
− | delete this.__view;
| |
− | delete this.__container
| |
− | }
| |
− | delete DC.View.viewLookup[this.id]
| |
− | },
| |
− | __factory__: function (D, I, A) {
| |
− | var G = this;
| |
− | var F = Element.queryAll;
| |
− | var E = false;
| |
− | if ("string" !== typeof (D)) {
| |
− | A = I;
| |
− | I = D;
| |
− | D = null
| |
− | }
| |
− | I = I || {};
| |
− | var H = "parameters_" + DC.generateUid();
| |
− | DC.View.nodeParameters[H] = I;
| |
− | I.viewClass = G;
| |
− | | |
− | function C(K) {
| |
− | K.setAttribute("__parametersId", H);
| |
− | var J;
| |
− | if ("sortKey" in I) {
| |
− | K.setAttribute("sortKey", I.sortKey)
| |
− | }
| |
− | }
| |
− | function B(K) {
| |
− | if (!E) {
| |
− | C(K)
| |
− | }
| |
− | var L = this.__relativeSource || this;
| |
− | var J = DC.View.fromNode(K) || new G(K, L);
| |
− | DC.View.createViewsForNodeTree(K, L, this.__context)
| |
− | }
| |
− | return function (L, K) {
| |
− | if (L && 1 === L.nodeType) {
| |
− | return new G(L, K, I)
| |
− | }
| |
− | var M = A || (this ? this.viewElement() : document);
| |
− | var J = F(M, D || L);
| |
− | if (!J.length) {
| |
− | return null
| |
− | }
| |
− | if ("action" in I) {
| |
− | if (!I.target) {
| |
− | I.target = this
| |
− | }
| |
− | if (FIRST_RESPONDER !== I.target && "string" === typeof (I.action)) {
| |
− | I.action = (I.target)[I.action]
| |
− | }
| |
− | }
| |
− | Array.forEach(J, K ? C : B, this);
| |
− | E = true;
| |
− | return DC.View.fromNode(J[0])
| |
− | }
| |
− | },
| |
− | init: function () {},
| |
− | initFromDOM: function () {},
| |
− | structure: function () {
| |
− | return this.__structure__
| |
− | },
| |
− | viewElement: function () {
| |
− | return this.__view || document.getElementById(this.id)
| |
− | },
| |
− | container: function () {
| |
− | return this.__container || this.__view || document.getElementById(this.__containerId || this.id)
| |
− | },
| |
− | setContainer: function (A) {
| |
− | if (this.__view) {
| |
− | this.__container = A
| |
− | }
| |
− | this.__containerId = Element.assignId(A);
| |
− | return A
| |
− | },
| |
− | superview: function () {
| |
− | var B = this.viewElement();
| |
− | if (!B) {
| |
− | return null
| |
− | }
| |
− | var A = null;
| |
− | while (B && !A) {
| |
− | B = B.parentNode;
| |
− | if (!B) {
| |
− | return null
| |
− | }
| |
− | if (document == B) {
| |
− | return DC.page
| |
− | }
| |
− | A = DC.View.fromNode(B)
| |
− | }
| |
− | return A
| |
− | },
| |
− | isDescendantOf: function (B) {
| |
− | if (!B) {
| |
− | return false
| |
− | }
| |
− | var A = B.viewElement();
| |
− | var C = this.viewElement();
| |
− | while (C && C !== document.body) {
| |
− | if (C.id == A.id) {
| |
− | return true
| |
− | }
| |
− | C = C.parentNode
| |
− | }
| |
− | return false
| |
− | },
| |
− | nextResponder: function () {
| |
− | return this.__nextResponder || this.superview()
| |
− | },
| |
− | focus: function () {
| |
− | var A = this.viewElement();
| |
− | A.focus()
| |
− | },
| |
− | blur: function () {
| |
− | var A = this.viewElement();
| |
− | A.blur()
| |
− | },
| |
− | sendAction: function () {
| |
− | var B = DC.EventLoop.currentEvent;
| |
− | if (!this.action) {
| |
− | return
| |
− | }
| |
− | if (FIRST_RESPONDER !== this.target || "string" !== typeof (this.action)) {
| |
− | this.action.call(this.target || this.action, this, B);
| |
− | return
| |
− | }
| |
− | var A = DC.page.firstResponder || this;
| |
− | var C = this.action;
| |
− | while (A) {
| |
− | if (C in A) {
| |
− | A[C](this, B);
| |
− | return
| |
− | }
| |
− | A = A.nextResponder()
| |
− | }
| |
− | },
| |
− | onclick: function (A) {
| |
− | if (this.disabled) {
| |
− | Event.stop(A);
| |
− | return
| |
− | }
| |
− | if (this.action && this.sendActionOn.containsObject("click")) {
| |
− | this.sendAction();
| |
− | Event.stop(A)
| |
− | } else {
| |
− | this.base(A)
| |
− | }
| |
− | },
| |
− | addTrackingInfo: function (A) {
| |
− | DC.page.addTrackingInfo(this.id, A)
| |
− | },
| |
− | observeVisibleChange: function (F, E, B) {
| |
− | var A = this.viewElement();
| |
− | var D = DC.Style.kFadingClass;
| |
− | | |
− | function C() {
| |
− | A.style.display = "none";
| |
− | Element.removeClassName(A, D)
| |
− | }
| |
− | if (!this.animated) {
| |
− | A.style.display = (F.newValue ? "" : "none")
| |
− | } else {
| |
− | if (F.newValue) {
| |
− | if (A.style.display !== "") {
| |
− | Element.addClassName(A, D);
| |
− | A.style.display = ""
| |
− | }
| |
− | DC.Animator.removeClassName(A, D, {
| |
− | duration: this.updateAnimationDuration || 300
| |
− | })
| |
− | } else {
| |
− | DC.Animator.addClassName(A, D, {
| |
− | duration: this.updateAnimationDuration || 300,
| |
− | callback: C
| |
− | })
| |
− | }
| |
− | }
| |
− | },
| |
− | observeEnabledChange: function (B) {
| |
− | var A = this.viewElement();
| |
− | this.disabled = A.disabled = !B.newValue;
| |
− | if (A.disabled) {
| |
− | Element.addClassName(A, DC.Style.kDisabledClass)
| |
− | } else {
| |
− | Element.removeClassName(A, DC.Style.kDisabledClass)
| |
− | }
| |
− | },
| |
− | observeEditableChange: function (B) {
| |
− | var A = this.viewElement();
| |
− | A.readOnly = !B.newValue;
| |
− | if (A.readOnly) {
| |
− | Element.addClassName(A, DC.Style.kReadOnlyClass)
| |
− | } else {
| |
− | Element.removeClassName(A, DC.Style.kReadOnlyClass)
| |
− | }
| |
− | },
| |
− | observeClassChange: function (H, G, D) {
| |
− | var A = this.viewElement();
| |
− | var C = $S(A.className.split(" "));
| |
− | var F = $S((H.newValue || "").split(" "));
| |
− | | |
− | function E(I) {
| |
− | if (I in C) {
| |
− | Set.add(F, I)
| |
− | }
| |
− | }
| |
− | DC.Style.__styles.forEach(E);
| |
− | var B = Set.join(F, " ");
| |
− | if (this.animated) {
| |
− | DC.Animator.setClassName(A, B, {
| |
− | duration: 500
| |
− | })
| |
− | } else {
| |
− | A.className = B
| |
− | }
| |
− | },
| |
− | _beginUpdate: function (B, A) {
| |
− | if (B) {
| |
− | B.call(this)
| |
− | }
| |
− | },
| |
− | observeTextChange: function (G, F, C) {
| |
− | var B = this.viewElement();
| |
− | var A = this.bindings.text && this.bindings.text.markerType;
| |
− | var E = G.newValue;
| |
− | if (A) {
| |
− | if (null === E || "undefined" === typeof (E)) {
| |
− | E = ""
| |
− | }
| |
− | Element.addClassName(B, DC.Style.kMarkerClass)
| |
− | } else {
| |
− | Element.removeClassName(B, DC.Style.kMarkerClass);
| |
− | if (this.formatter) {
| |
− | E = this.formatter.stringFromValue(E)
| |
− | }
| |
− | }
| |
− | function D() {
| |
− | var H = document.createTextNode(E);
| |
− | B.innerHTML = "";
| |
− | B.appendChild(H)
| |
− | }
| |
− | this._beginUpdate(D)
| |
− | },
| |
− | observeHtmlChange: function (G, F, C) {
| |
− | var B = this.viewElement();
| |
− | var A = this.bindings.html && this.bindings.html.markerType;
| |
− | var E = G.newValue;
| |
− | if (A) {
| |
− | if (null === E || "undefined" === typeof (E)) {
| |
− | E = ""
| |
− | }
| |
− | Element.addClassName(B, DC.Style.kMarkerClass)
| |
− | } else {
| |
− | Element.removeClassName(B, DC.Style.kMarkerClass);
| |
− | if (this.formatter) {
| |
− | E = this.formatter.stringFromValue(E)
| |
− | }
| |
− | }
| |
− | function D() {
| |
− | B.innerHTML = E
| |
− | }
| |
− | this._beginUpdate(D)
| |
− | },
| |
− | removeChild: function (A) {
| |
− | if (!A) {
| |
− | return null
| |
− | }
| |
− | DC.View.teardownViewsForNodeTree(A);
| |
− | if (this.beforeRemoveElement) {
| |
− | this.beforeRemoveElement(A)
| |
− | }
| |
− | return A.parentNode.removeChild(A)
| |
− | },
| |
− | clonedFrom: function (A) {}
| |
− | });
| |
− | DC.View.nodeParameters = {};
| |
− | DC.View.viewLookup = {};
| |
− | DC.View.__subclassCreated__ = function (A) {
| |
− | var B = A.prototype;
| |
− | var C = A.superclass.prototype;
| |
− | if (B.__structure__ !== C.__structure__) {
| |
− | Object.applyDefaults(B.__structure__, C.__structure__)
| |
− | }
| |
− | };
| |
− | DC.View.viewClassForNode = function (B, A) {
| |
− | var C = B.getAttribute("__parametersId");
| |
− | if (!C) {
| |
− | return null
| |
− | }
| |
− | return DC.View.nodeParameters[C].viewClass
| |
− | };
| |
− | DC.View.createViewForNode = function (C, E, B) {
| |
− | var A = DC.View.fromNode(C);
| |
− | if (A) {
| |
− | return A
| |
− | }
| |
− | var D = DC.View.viewClassForNode(C, B);
| |
− | return new(D || DC.View)(C, E, B)
| |
− | };
| |
− | DC.View.fromNode = function (A) {
| |
− | var B = DC.View.viewLookup;
| |
− | var C = null;
| |
− | if (DC.typeOf(A) == "string") {
| |
− | C = A
| |
− | } else {
| |
− | if ("id" in A) {
| |
− | C = A.id
| |
− | }
| |
− | }
| |
− | if (!B || !C || !B[C]) {
| |
− | return null
| |
− | }
| |
− | return B[C]
| |
− | };
| |
− | DC.View.rebindNodeTreeWithRelativeSource = function (B, D, C) {
| |
− | function A(F) {
| |
− | var E = DC.View.fromNode(F);
| |
− | if (!E || (D && E.__relativeSource !== D)) {
| |
− | return
| |
− | }
| |
− | E.__relativeSource = C;
| |
− | E.setupBindings();
| |
− | E.updateBindings()
| |
− | }
| |
− | Element.depthFirstTraversal(B, A)
| |
− | };
| |
− | DC.View.unbindNodeTree = function (B) {
| |
− | function A(D) {
| |
− | var C = DC.View.fromNode(D);
| |
− | if (!C) {
| |
− | return
| |
− | }
| |
− | C.unbind()
| |
− | }
| |
− | Element.depthFirstTraversal(B, A)
| |
− | };
| |
− | DC.View.createViewsForNodeTree = function (E, C, D) {
| |
− | function B(F) {
| |
− | if (DC.View.fromNode(F)) {
| |
− | return
| |
− | }
| |
− | var G = DC.View.viewClassForNode(F);
| |
− | if (!G) {
| |
− | return
| |
− | }
| |
− | new(G)(F, C, DC.DashcodePart.PropertiesForNode(F))
| |
− | }
| |
− | var A = DC.dataModel;
| |
− | if (D) {
| |
− | DC.dataModel = D
| |
− | }
| |
− | Element.depthFirstTraversal(E || document.body, B);
| |
− | if (D) {
| |
− | DC.dataModel = A
| |
− | }
| |
− | };
| |
− | DC.View.teardownViewsForNodeTree = function (A) {
| |
− | function B(D) {
| |
− | var C = DC.View.fromNode(D);
| |
− | if (!C) {
| |
− | return
| |
− | }
| |
− | C.teardown()
| |
− | }
| |
− | Element.depthFirstTraversal(A || document.body, B)
| |
− | };
| |
− | DC.View.cloneViewsForTreeNode = function (D, A, C) {
| |
− | var F = {};
| |
− | var B = Element.clone(D);
| |
− | | |
− | function E(K) {
| |
− | var G = K.id;
| |
− | if (K == D && !G) {
| |
− | G = D.id
| |
− | }
| |
− | if (G) {
| |
− | F[G] = K
| |
− | }
| |
− | K.originalID = G;
| |
− | K.id = "";
| |
− | var H = DC.View.fromNode(G);
| |
− | var I = DC.View.viewClassForNode(K);
| |
− | var J = null;
| |
− | if (!I || K.object) {
| |
− | return true
| |
− | }
| |
− | J = new(I)(K, A, DC.DashcodePart.PropertiesForNode(K));
| |
− | if (H && J) {
| |
− | J.clonedFrom(H)
| |
− | }
| |
− | return true
| |
− | }
| |
− | Element.depthFirstTraversal(B, E);
| |
− | if (!B.object) {
| |
− | B.object = {}
| |
− | }
| |
− | B.object.templateElements = F;
| |
− | return B
| |
− | };
| |
− | DC.DashcodePart = Class.create(DC.View, {
| |
− | maskedBindings: ["html", "text"],
| |
− | constructor: function (A, C, D, B) {
| |
− | if (!B && (A.id || A.originalID) && dashcodePartSpecs) {
| |
− | B = dashcodePartSpecs[A.originalID ? A.originalID : A.id];
| |
− | if (B && !D && !dashcode.inDesign) {
| |
− | D = B.propertyValues
| |
− | }
| |
− | }
| |
− | if (A.object) {
| |
− | return
| |
− | }
| |
− | this.base(A, C, D);
| |
− | this._registerForDocumentInsertionNotifcationIfNeeded();
| |
− | this.partSetup(B)
| |
− | },
| |
− | partSetup: function (A) {},
| |
− | _sendLegacyOnClick: function (D, C, E) {
| |
− | var B = this;
| |
− | this._savedOnClick = C.onclick;
| |
− | C.onclick = function (F) {
| |
− | E(F);
| |
− | C.onclick = B._savedOnClick;
| |
− | delete B._savedOnClick
| |
− | };
| |
− | if (document.createEvent) {
| |
− | var A = document.createEvent("MouseEvents");
| |
− | A.initMouseEvent("click", false, false, window, 1, D ? D.screenX : 0, D ? D.screenY : 0, D ? D.clientX : 0, D ? D.clientY : 0, D ? D.ctrlKey : false, D ? D.altKey : false, D ? D.shiftKey : false, D ? D.metaKey : false, D ? D.button : 0, null);
| |
− | C.dispatchEvent(A)
| |
− | } else {
| |
− | C.onclick(D)
| |
− | }
| |
− | },
| |
− | _setOnClickAsAction: function (C, B) {
| |
− | var A = this;
| |
− | if (!B) {
| |
− | B = this.viewElement()
| |
− | }
| |
− | if (C) {
| |
− | this.action = function (D, E) {
| |
− | A._sendLegacyOnClick(E, B, C)
| |
− | }
| |
− | } else {
| |
− | this.action = null
| |
− | }
| |
− | },
| |
− | insertedIntoDocument: function () {},
| |
− | _registerForDocumentInsertionNotifcationIfNeeded: function () {
| |
− | var D = this.viewElement();
| |
− | var C = D;
| |
− | var A = D.ownerDocument;
| |
− | while (D.parentNode) {
| |
− | C = D;
| |
− | D = D.parentNode
| |
− | }
| |
− | if (D == A) {
| |
− | return false
| |
− | }
| |
− | var B = this;
| |
− | Event.observe(C, "DOMNodeInsertedIntoDocument", function (E) {
| |
− | B.insertedIntoDocument()
| |
− | })
| |
− | },
| |
− | observeEnabledChange: function (A) {
| |
− | if (this.__initialising && (null === A.newValue || "undefined" === A.newValue)) {
| |
− | this.bindings.enabled.setValue(!this.valueForKey("enabled"));
| |
− | return
| |
− | }
| |
− | this.setValueForKey(A.newValue, "enabled")
| |
− | }
| |
− | });
| |
− | DC.DashcodePart.PropertiesForNode = function (B) {
| |
− | if (dashcode.inDesign) {
| |
− | return undefined
| |
− | }
| |
− | if ((B.id || B.originalID) && dashcodePartSpecs) {
| |
− | var A = dashcodePartSpecs[B.originalID ? B.originalID : B.id];
| |
− | if (A) {
| |
− | return A.propertyValues
| |
− | }
| |
− | }
| |
− | return undefined
| |
− | };
| |
− | DC.DashcodePart.updateViewId = function (C, B) {
| |
− | var A = DC.View.fromNode(C);
| |
− | A.id = B;
| |
− | delete DC.View.viewLookup[C];
| |
− | DC.View.viewLookup[B] = A
| |
− | };
| |
− | DC.Text = Class.create(DC.DashcodePart, {
| |
− | exposedBindings: ["text", "html"],
| |
− | partSetup: function (A) {
| |
− | if (A.text) {
| |
− | var B = A.text;
| |
− | if (window.dashcode && dashcode.getLocalizedString) {
| |
− | B = dashcode.getLocalizedString(B)
| |
− | }
| |
− | this.viewElement().innerText = B
| |
− | }
| |
− | }
| |
− | });
| |
− | DC.DashcodeOverrides = {
| |
− | Original: {
| |
− | View: {
| |
− | createViewForNode: DC.View.createViewForNode,
| |
− | viewClassForNode: DC.View.viewClassForNode
| |
− | },
| |
− | Binding: {
| |
− | bindingFromString: DC.Binding.bindingFromString
| |
− | }
| |
− | },
| |
− | Replacement: {
| |
− | View: {
| |
− | createViewForNode: function (B, C, A) {
| |
− | return DC.DashcodeOverrides.Original.View.createViewForNode(B, C, A)
| |
− | },
| |
− | viewClassForNode: function (node, hasBindings) {
| |
− | var viewClass = undefined;
| |
− | if (node && (node.originalID || node.id)) {
| |
− | var spec = dashcodePartSpecs[node.originalID ? node.originalID : node.id];
| |
− | if (spec && spec.view) {
| |
− | try {
| |
− | viewClass = eval(spec.view)
| |
− | } catch (e) {}
| |
− | }
| |
− | if (spec && spec.hasBindings) {
| |
− | if (!hasBindings) {
| |
− | hasBindings = true
| |
− | }
| |
− | }
| |
− | }
| |
− | if (!viewClass) {
| |
− | viewClass = DC.DashcodeOverrides.Original.View.viewClassForNode(node, hasBindings)
| |
− | }
| |
− | return viewClass
| |
− | }
| |
− | },
| |
− | Binding: {
| |
− | bindingFromString: function (B, A) {
| |
− | if (DC.DashcodeOverrides.bindToContent && (A instanceof DC.ObjectController)) {
| |
− | if ((B.substr(0, 7) != "content")) {
| |
− | B = "content." + B
| |
− | }
| |
− | }
| |
− | return DC.DashcodeOverrides.Original.Binding.bindingFromString(B, A)
| |
− | }
| |
− | }
| |
− | }
| |
− | };
| |
− | DC.View.viewClassForNode = DC.DashcodeOverrides.Replacement.View.viewClassForNode;
| |
− | DC.Binding.bindingFromString = DC.DashcodeOverrides.Replacement.Binding.bindingFromString;
| |
− | DC.EventLoop = {
| |
− | currentEvent: null,
| |
− | getStart: function () {
| |
− | if (!this._start) {
| |
− | this._start = new Date().getTime()
| |
− | }
| |
− | return this._start
| |
− | },
| |
− | begin: function (A) {
| |
− | this._start = new Date().getTime();
| |
− | this.currentEvent = A
| |
− | },
| |
− | end: function () {
| |
− | this.currentEvent = null;
| |
− | this._start = null
| |
− | }
| |
− | };
| |
− | DC.Page = Class.create(DC.Responder, {
| |
− | focusedElement: null,
| |
− | constructor: function () {
| |
− | this.firstResponder = null;
| |
− | this.__hoverTrackingIds = {};
| |
− | this._onmousedragHandler = this._onmousedrag.bindAsEventListener(this);
| |
− | this._delegates = {
| |
− | click: []
| |
− | };
| |
− | this.onclick = this._fireDelegates
| |
− | },
| |
− | targetViewForEvent: function (C) {
| |
− | var B = C.target || C.srcElement;
| |
− | var A;
| |
− | var D = DC.View.fromNode;
| |
− | while (B && B != document && !(A = D(B))) {
| |
− | B = B.parentNode
| |
− | }
| |
− | if (!B || B == document) {
| |
− | return null
| |
− | }
| |
− | return A
| |
− | },
| |
− | makeFirstResponder: function (A) {
| |
− | if (this.firstResponder == A) {
| |
− | return true
| |
− | }
| |
− | if (this.firstResponder && !this.firstResponder.resignFirstResponder()) {
| |
− | return false
| |
− | }
| |
− | if (this.firstResponder) {
| |
− | Element.removeClassName(this.firstResponder.viewElement(), DC.Style.kFocusClass)
| |
− | }
| |
− | if (A && !A.becomeFirstResponder()) {
| |
− | return false
| |
− | }
| |
− | this.willChangeValueForKey("firstResponder");
| |
− | this.firstResponder = A;
| |
− | this.didChangeValueForKey("firstResponder");
| |
− | if (A) {
| |
− | A.focus();
| |
− | Element.addClassName(A.viewElement(), DC.Style.kFocusClass)
| |
− | }
| |
− | return true
| |
− | },
| |
− | addTrackingInfo: function (C, B) {
| |
− | if ("string" !== typeof (C)) {
| |
− | C = Element.assignId(C)
| |
− | }
| |
− | var A = this.__hoverTrackingIds[C];
| |
− | if (!A) {
| |
− | A = this.__hoverTrackingIds[C] = []
| |
− | }
| |
− | A.push(B)
| |
− | },
| |
− | superview: function () {
| |
− | return null
| |
− | },
| |
− | presentError: function (A) {
| |
− | function B() {
| |
− | var C = A.description;
| |
− | if (A.recoverySuggestion) {
| |
− | C += "\n" + A.recoverySuggestion
| |
− | }
| |
− | window.alert(C);
| |
− | DC.page.makeFirstResponder(A.field)
| |
− | }
| |
− | B.delay(0)
| |
− | },
| |
− | delegate: function (A, C, B) {
| |
− | if ("string" === typeof (C)) {
| |
− | this._delegates[C].push({
| |
− | sel: A,
| |
− | fn: B
| |
− | })
| |
− | } else {
| |
− | var D;
| |
− | for (D in C) {
| |
− | if (!(D in this._delegates)) {
| |
− | throw new Error("Invalid delegation event type: " + D)
| |
− | }
| |
− | this._delegates[D].push({
| |
− | sel: A,
| |
− | fn: C[D]
| |
− | })
| |
− | }
| |
− | }
| |
− | },
| |
− | superview: function () {
| |
− | return null
| |
− | },
| |
− | _fireDelegates: function (E) {
| |
− | var C = E.target || E.srcElement;
| |
− | var B = Element.match;
| |
− | var A = this._delegates[E.type] || [];
| |
− | | |
− | function D(F) {
| |
− | if (B(C, F.sel)) {
| |
− | F.fn(E)
| |
− | }
| |
− | }
| |
− | A.forEach(D)
| |
− | },
| |
− | _findFirstResponder: function (A) {
| |
− | while (A && !A.acceptsFirstResponder()) {
| |
− | A = A.superview()
| |
− | }
| |
− | if (!A) {
| |
− | return
| |
− | }
| |
− | this.makeFirstResponder(A)
| |
− | },
| |
− | _onmousedown: function (B) {
| |
− | var A = this.targetViewForEvent(B);
| |
− | if (A) {
| |
− | this._findFirstResponder(A);
| |
− | A.onmousedown(B);
| |
− | Event.observe(document, "mousemove", this._onmousedragHandler)
| |
− | }
| |
− | this._mousedownView = A
| |
− | },
| |
− | _onmouseup: function (A) {
| |
− | if (this._mousedownView) {
| |
− | this._mousedownView.onmouseup(A)
| |
− | }
| |
− | Event.stopObserving(document, "mousemove", this._onmousedragHandler)
| |
− | },
| |
− | _onmousedrag: function (A) {
| |
− | if (this._mousedownView) {
| |
− | this._mousedownView.onmousedrag(A)
| |
− | }
| |
− | },
| |
− | _onmouseover: function (A) {
| |
− | var E = this.__hoverTrackingIds || {};
| |
− | var L = this.__mouseOverIds || {};
| |
− | var C = {};
| |
− | var H = A.target || A.srcElement;
| |
− | var F = document.body;
| |
− | var I;
| |
− | var K;
| |
− | var B;
| |
− | var D;
| |
− | var G;
| |
− | var J;
| |
− | for (; H && H != F; H = H.parentNode) {
| |
− | B = H.id;
| |
− | if (!B || !(B in E)) {
| |
− | continue
| |
− | }
| |
− | C[B] = true;
| |
− | if (B in L) {
| |
− | continue
| |
− | }
| |
− | I = E[B];
| |
− | G = I.length;
| |
− | for (D = 0; D < G; ++D) {
| |
− | J = I[D];
| |
− | if (J.onmouseenter) {
| |
− | J.onmouseenter.call(J.owner, H, J.ownerInfo)
| |
− | }
| |
− | }
| |
− | }
| |
− | for (B in L) {
| |
− | if (B in C) {
| |
− | continue
| |
− | }
| |
− | H = document.getElementById(B);
| |
− | if (!H) {
| |
− | continue
| |
− | }
| |
− | I = E[B];
| |
− | G = I.length;
| |
− | for (D = 0; D < G; ++D) {
| |
− | J = I[D];
| |
− | if (J.onmouseleave) {
| |
− | J.onmouseleave.call(J.owner, H, J.ownerInfo)
| |
− | }
| |
− | }
| |
− | }
| |
− | this.__mouseOverIds = C
| |
− | },
| |
− | _onmouseout: function (A) {},
| |
− | _onclick: function (B) {
| |
− | if (DC.Browser.Mozilla && B.button === 2) {
| |
− | return
| |
− | }
| |
− | var A = this.targetViewForEvent(B);
| |
− | if (A) {
| |
− | A.onclick(B)
| |
− | } else {
| |
− | this._fireDelegates(B)
| |
− | }
| |
− | },
| |
− | _ondblclick: function (A) {
| |
− | if (this._mousedownView) {
| |
− | this._mousedownView.ondblclick(A)
| |
− | }
| |
− | },
| |
− | _onkeydown: function (A) {
| |
− | var B = this.firstResponder;
| |
− | if (B) {
| |
− | B.onkeydown(A)
| |
− | }
| |
− | },
| |
− | _onkeyup: function (A) {
| |
− | var B = this.firstResponder;
| |
− | if (B) {
| |
− | B.onkeyup(A)
| |
− | }
| |
− | },
| |
− | _onkeypress: function (A) {
| |
− | var B = this.firstResponder;
| |
− | if (B) {
| |
− | B.onkeypress(A)
| |
− | }
| |
− | },
| |
− | _onfocus: function (B) {
| |
− | var C = (B.target || B.srcElement) == window;
| |
− | if (DC.Browser.IE) {
| |
− | if (document.activeElement == this.focusedElement) {
| |
− | C = true
| |
− | }
| |
− | }
| |
− | if (C) {
| |
− | if (!this._documentFocused) {
| |
− | this.makeFirstResponder(this._previousFirstResponder || null);
| |
− | this._previousFirstResponder = null;
| |
− | this._documentFocused = true;
| |
− | if (!dashcode.inDesign && document.body) {
| |
− | Element.removeClassName(document.body, "DC_windowInactive")
| |
− | }
| |
− | }
| |
− | } else {
| |
− | var A = this.targetViewForEvent(B);
| |
− | if (A && A.acceptsFirstResponder()) {
| |
− | this.makeFirstResponder(A)
| |
− | } else {
| |
− | this.makeFirstResponder(null)
| |
− | }
| |
− | this.focusedElement = B.target || B.srcElement
| |
− | }
| |
− | },
| |
− | _onblur: function (B) {
| |
− | var C = (B.target || B.srcElement) == window;
| |
− | if (DC.Browser.IE) {
| |
− | if (document.activeElement == this.focusedElement) {
| |
− | C = true
| |
− | }
| |
− | }
| |
− | if (C) {
| |
− | this._documentFocused = false;
| |
− | this._previousFirstResponder = this.firstResponder;
| |
− | this.makeFirstResponder(null);
| |
− | if (!dashcode.inDesign && document.body) {
| |
− | Element.addClassName(document.body, "DC_windowInactive")
| |
− | }
| |
− | } else {
| |
− | var A = this.targetViewForEvent(B);
| |
− | this.focusedElement = null;
| |
− | if (A && A.acceptsFirstResponder()) {
| |
− | this.makeFirstResponder(null)
| |
− | }
| |
− | }
| |
− | },
| |
− | _ontouchstart: function (C) {
| |
− | var A = this.targetViewForEvent(C);
| |
− | if (A) {
| |
− | var B = this;
| |
− | A.ontouchstart(C);
| |
− | this._touchstartMouseDownDelay = window.setTimeout(function () {
| |
− | A.onmousedown(C);
| |
− | B._touchsentMD = true;
| |
− | delete B._touchstartMouseDownDelay
| |
− | }, 100)
| |
− | }
| |
− | this._touchstartView = A;
| |
− | this._touchmovedX = false;
| |
− | this._touchmovedY = false;
| |
− | this._touchsentMD = false;
| |
− | this._touchstartX = C.targetTouches[0].clientX;
| |
− | this._touchstartY = C.targetTouches[0].clientY
| |
− | },
| |
− | _ontouchmove: function (D) {
| |
− | var A = D.targetTouches[0].clientX;
| |
− | var E = D.targetTouches[0].clientY;
| |
− | var B = false;
| |
− | var C = false;
| |
− | if (!this._touchmovedX && Math.abs(this._touchstartX - A) > 5) {
| |
− | B = this._touchmovedX = true
| |
− | }
| |
− | if (!this._touchmovedY && Math.abs(this._touchstartY - E) > 5) {
| |
− | C = this._touchmovedY = true
| |
− | }
| |
− | if (this._touchstartView) {
| |
− | this._touchstartView.ontouchmove(D);
| |
− | if (this._touchstartMouseDownDelay) {
| |
− | window.clearTimeout(this._touchstartMouseDownDelay);
| |
− | delete this._touchstartMouseDownDelay
| |
− | }
| |
− | if (B || C) {
| |
− | if (this._touchsentMD) {
| |
− | this._touchstartView.onmouseup(D);
| |
− | this._touchsentMD = false
| |
− | }
| |
− | if (!this._touchmovedY && B) {
| |
− | this._touchstartView.onswipe(D)
| |
− | }
| |
− | }
| |
− | }
| |
− | },
| |
− | _ontouchend: function (A) {
| |
− | if (this._touchstartView) {
| |
− | this._touchstartView.ontouchend(A);
| |
− | if (this._touchstartMouseDownDelay) {
| |
− | var B = this._touchstartView;
| |
− | window.clearTimeout(this._touchstartMouseDownDelay);
| |
− | delete this._touchstartMouseDownDelay;
| |
− | this._touchstartView.onmousedown(A);
| |
− | this._touchsentMD = true;
| |
− | setTimeout(function () {
| |
− | B.onmouseup(A);
| |
− | B.onclick(A)
| |
− | }, 0)
| |
− | } else {
| |
− | if (this._touchsentMD) {
| |
− | this._touchstartView.onmouseup(A);
| |
− | if (!this._touchmovedX && !this._touchmovedY) {
| |
− | this._touchstartView.onclick(A)
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− | },
| |
− | _ontouchcancel: function (A) {
| |
− | if (this._touchstartView) {
| |
− | this._touchstartView.ontouchend(A);
| |
− | if (this._touchstartMouseDownDelay) {
| |
− | window.clearTimeout(this._touchstartMouseDownDelay);
| |
− | delete this._touchstartMouseDownDelay
| |
− | } else {
| |
− | if (this._touchsentMD) {
| |
− | this._touchstartView.onmouseup(A)
| |
− | }
| |
− | }
| |
− | }
| |
− | },
| |
− | _onunload: function () {
| |
− | var B;
| |
− | var A = DC.View.viewLookup;
| |
− | for (B in A) {
| |
− | A[B].teardown();
| |
− | delete A[B]
| |
− | }
| |
− | }
| |
− | });
| |
− | (function () {
| |
− | DC.page = new DC.Page();
| |
− | window._setTimeout = window.setTimeout;
| |
− | window.setTimeout = function (F, E) {
| |
− | if (!F) {
| |
− | return null
| |
− | }
| |
− | if ("string" === typeof (F)) {
| |
− | F = "DC.EventLoop.begin();do {" + F + "} while (false); DC.EventLoop.end();";
| |
− | return window._setTimeout(F, E)
| |
− | }
| |
− | var D = Array.from(arguments, 2);
| |
− | | |
− | function C() {
| |
− | DC.EventLoop.begin();
| |
− | var G = F.apply(this, D);
| |
− | DC.EventLoop.end();
| |
− | return G
| |
− | }
| |
− | return window._setTimeout(C, E)
| |
− | };
| |
− | window._setInterval = window.setInterval;
| |
− | window.setInterval = function (F, E) {
| |
− | if (!F) {
| |
− | return null
| |
− | }
| |
− | if ("string" === typeof (F)) {
| |
− | F = "DC.EventLoop.begin();do {" + F + "} while (false); DC.EventLoop.end();";
| |
− | return window._setInterval(F, E)
| |
− | }
| |
− | var D = Array.from(arguments, 2);
| |
− | | |
− | function C() {
| |
− | DC.EventLoop.begin();
| |
− | var G = F.apply(this, D);
| |
− | DC.EventLoop.end();
| |
− | return G
| |
− | }
| |
− | return window._setInterval(C, E)
| |
− | };
| |
− | var B = DC.page;
| |
− | var A;
| |
− | if (DC.Browser.IE) {
| |
− | A = function (C) {
| |
− | return function () {
| |
− | DC.EventLoop.begin(window.event);
| |
− | B[C](window.event);
| |
− | DC.EventLoop.end()
| |
− | }
| |
− | };
| |
− | document.attachEvent("onmouseover", A("_onmouseover"));
| |
− | document.attachEvent("onmouseout", A("_onmouseout"));
| |
− | document.attachEvent("onmousedown", A("_onmousedown"));
| |
− | document.attachEvent("onmouseup", A("_onmouseup"));
| |
− | document.attachEvent("onclick", A("_onclick"));
| |
− | document.attachEvent("ondblclick", A("_ondblclick"));
| |
− | document.attachEvent("onkeydown", A("_onkeydown"));
| |
− | document.attachEvent("onkeyup", A("_onkeyup"));
| |
− | document.attachEvent("onkeypress", A("_onkeypress"));
| |
− | document.attachEvent("onfocusin", A("_onfocus"));
| |
− | document.attachEvent("onfocusout", A("_onblur"));
| |
− | window.attachEvent("focus", A("_onfocus"));
| |
− | window.attachEvent("blur", A("_onblur"));
| |
− | window.attachEvent("onunload", A("_onunload"))
| |
− | } else {
| |
− | A = function (C) {
| |
− | return function (D) {
| |
− | DC.EventLoop.begin(D);
| |
− | B[C](D);
| |
− | DC.EventLoop.end()
| |
− | }
| |
− | };
| |
− | document.addEventListener("keydown", A("_onkeydown"), false);
| |
− | document.addEventListener("keyup", A("_onkeyup"), false);
| |
− | document.addEventListener("keypress", A("_onkeypress"), false);
| |
− | document.addEventListener("focus", A("_onfocus"), true);
| |
− | document.addEventListener("blur", A("_onblur"), true);
| |
− | window.addEventListener("focus", A("_onfocus"), false);
| |
− | window.addEventListener("blur", A("_onblur"), false);
| |
− | if (!DC.Browser.MobileSafari) {
| |
− | document.addEventListener("click", A("_onclick"), false);
| |
− | document.addEventListener("dblclick", A("_ondblclick"), false)
| |
− | }
| |
− | if (DC.Support.Touches) {
| |
− | document.addEventListener("touchstart", A("_ontouchstart"), true);
| |
− | document.addEventListener("touchmove", A("_ontouchmove"), true);
| |
− | document.addEventListener("touchend", A("_ontouchend"), true);
| |
− | document.addEventListener("touchcancel", A("_ontouchcancel"), true)
| |
− | } else {
| |
− | document.addEventListener("mouseover", A("_onmouseover"), false);
| |
− | document.addEventListener("mouseout", A("_onmouseout"), false);
| |
− | document.addEventListener("mousedown", A("_onmousedown"), false);
| |
− | document.addEventListener("mouseup", A("_onmouseup"), false)
| |
− | }
| |
− | }
| |
− | })();
| |
− | /*
| |
− | This file was generated by Dashcode and is covered by the
| |
− | license.txt included in the project. You may edit this file,
| |
− | however it is recommended to first turn off the Dashcode
| |
− | code generator otherwise the changes will be lost.
| |
− | */
| |
− | var dashcodePartSpecs = {
| |
− | "helloText": {
| |
− | "text": "Hello, World!",
| |
− | "view": "DC.Text"
| |
− | }
| |
− | };
| |
− | | |
− | /*
| |
− | This file was generated by Dashcode and is covered by the
| |
− | license.txt included in the project. You may edit this file,
| |
− | however it is recommended to first turn off the Dashcode
| |
− | code generator otherwise the changes will be lost.
| |
− | */
| |
− | var dashcodeDataSources = {
| |
− | "dataSource": {
| |
− | "Class": "DC.AjaxController"
| |
− | }
| |
− | };
| |
− | </source> | |