IBookAuthor: A Skeleton Widget
--D. Thiebaut 13:38, 27 January 2013 (EST)
Contents
Reference
The main reference for creating Dashboard widgets is Apple's own page on the subject, titled About HTML Widget Creation. This page, in some ways, is the true definition of a skeleton widget.
Hierarchy
./skeleton.wdgt
./skeleton.wdgt/Default.png
./skeleton.wdgt/Default@2x.png
./skeleton.wdgt/Icon.png
./skeleton.wdgt/Images
./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
Files
Parts/parts.js
/*
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 dashcodePartSupport = {
"imageBgParts": {}
};
if (!window.dashcode) {
dashcode = new Object()
}
dashcode.setupParts = function () {
if (dashcode.setupParts.called) {
return
}
dashcode.setupParts.called = true;
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() {
var D = this;
if (D.constructor !== Set) {
D = new Set()
}
var B = arguments;
if (1 == B.length && B[0] instanceof Array) {
B = B[0]
}
var C;
var A = B.length;
for (C = 0; C < A; ++C) {
D[B[C]] = true
}
return D
}
Set.union = function (C, B) {
var A = Object.clone(C);
if (!B) {
return A
}
var D;
for (D in B) {
A[D] = true
}
return A
};
Set.intersect = function (C, B) {
var A = new Set();
var D;
for (D in C) {
if (D in B) {
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() {
B.apply(B, C)
}
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"
}
};