4373 lines
128 KiB
JavaScript
4373 lines
128 KiB
JavaScript
var Prototype = {
|
|
Version: "1.6.0.2",
|
|
Browser: {
|
|
IE: !!(window.attachEvent && !window.opera),
|
|
Opera: !!window.opera,
|
|
WebKit: navigator.userAgent.indexOf("AppleWebKit/") > -1,
|
|
Gecko: navigator.userAgent.indexOf("Gecko") > -1 && navigator.userAgent.indexOf("KHTML") == -1,
|
|
MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
|
|
},
|
|
BrowserFeatures: {
|
|
XPath: !!document.evaluate,
|
|
ElementExtensions: !!window.HTMLElement,
|
|
SpecificElementExtensions: document.createElement("div").__proto__ && document.createElement("div").__proto__ !== document.createElement("form").__proto__
|
|
},
|
|
ScriptFragment: "<script[^>]*>([\\S\\s]*?)<\/script>",
|
|
JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
|
|
emptyFunction: function() {},
|
|
K: function(A) {
|
|
return A
|
|
}
|
|
};
|
|
if (Prototype.Browser.MobileSafari) {
|
|
Prototype.BrowserFeatures.SpecificElementExtensions = false
|
|
}
|
|
var Class = {
|
|
create: function() {
|
|
var E = null,
|
|
D = $A(arguments);
|
|
if (Object.isFunction(D[0])) {
|
|
E = D.shift()
|
|
}
|
|
|
|
function A() {
|
|
this.initialize.apply(this, arguments)
|
|
}
|
|
Object.extend(A, Class.Methods);
|
|
A.superclass = E;
|
|
A.subclasses = [];
|
|
if (E) {
|
|
var B = function() {};
|
|
B.prototype = E.prototype;
|
|
A.prototype = new B;
|
|
E.subclasses.push(A)
|
|
}
|
|
for (var C = 0; C < D.length; C++) {
|
|
A.addMethods(D[C])
|
|
}
|
|
if (!A.prototype.initialize) {
|
|
A.prototype.initialize = Prototype.emptyFunction
|
|
}
|
|
A.prototype.constructor = A;
|
|
return A
|
|
}
|
|
};
|
|
Class.Methods = {
|
|
addMethods: function(G) {
|
|
var C = this.superclass && this.superclass.prototype;
|
|
var B = Object.keys(G);
|
|
if (!Object.keys({
|
|
toString: true
|
|
}).length) {
|
|
B.push("toString", "valueOf")
|
|
}
|
|
for (var A = 0, D = B.length; A < D; A++) {
|
|
var F = B[A],
|
|
E = G[F];
|
|
if (C && Object.isFunction(E) && E.argumentNames().first() == "$super") {
|
|
var H = E,
|
|
E = Object.extend((function(I) {
|
|
return function() {
|
|
return C[I].apply(this, arguments)
|
|
}
|
|
})(F).wrap(H), {
|
|
valueOf: function() {
|
|
return H
|
|
},
|
|
toString: function() {
|
|
return H.toString()
|
|
}
|
|
})
|
|
}
|
|
this.prototype[F] = E
|
|
}
|
|
return this
|
|
}
|
|
};
|
|
var Abstract = {};
|
|
Object.extend = function(A, C) {
|
|
for (var B in C) {
|
|
A[B] = C[B]
|
|
}
|
|
return A
|
|
};
|
|
Object.extend(Object, {
|
|
inspect: function(A) {
|
|
try {
|
|
if (Object.isUndefined(A)) {
|
|
return "undefined"
|
|
}
|
|
if (A === null) {
|
|
return "null"
|
|
}
|
|
return A.inspect ? A.inspect() : String(A)
|
|
} catch (B) {
|
|
if (B instanceof RangeError) {
|
|
return "..."
|
|
}
|
|
throw B
|
|
}
|
|
},
|
|
toJSON: function(A) {
|
|
var C = typeof A;
|
|
switch (C) {
|
|
case "undefined":
|
|
case "function":
|
|
case "unknown":
|
|
return;
|
|
case "boolean":
|
|
return A.toString()
|
|
}
|
|
if (A === null) {
|
|
return "null"
|
|
}
|
|
if (A.toJSON) {
|
|
return A.toJSON()
|
|
}
|
|
if (Object.isElement(A)) {
|
|
return
|
|
}
|
|
var B = [];
|
|
for (var E in A) {
|
|
var D = Object.toJSON(A[E]);
|
|
if (!Object.isUndefined(D)) {
|
|
B.push(E.toJSON() + ": " + D)
|
|
}
|
|
}
|
|
return "{" + B.join(", ") + "}"
|
|
},
|
|
toQueryString: function(A) {
|
|
return $H(A).toQueryString()
|
|
},
|
|
toHTML: function(A) {
|
|
return A && A.toHTML ? A.toHTML() : String.interpret(A)
|
|
},
|
|
keys: function(A) {
|
|
var B = [];
|
|
for (var C in A) {
|
|
B.push(C)
|
|
}
|
|
return B
|
|
},
|
|
values: function(B) {
|
|
var A = [];
|
|
for (var C in B) {
|
|
A.push(B[C])
|
|
}
|
|
return A
|
|
},
|
|
clone: function(A) {
|
|
return Object.extend({}, A)
|
|
},
|
|
isElement: function(A) {
|
|
return A && A.nodeType == 1
|
|
},
|
|
isArray: function(A) {
|
|
return A != null && typeof A == "object" && "splice" in A && "join" in A
|
|
},
|
|
isHash: function(A) {
|
|
return A instanceof Hash
|
|
},
|
|
isFunction: function(A) {
|
|
return typeof A == "function"
|
|
},
|
|
isString: function(A) {
|
|
return typeof A == "string"
|
|
},
|
|
isNumber: function(A) {
|
|
return typeof A == "number"
|
|
},
|
|
isUndefined: function(A) {
|
|
return typeof A == "undefined"
|
|
}
|
|
});
|
|
Object.extend(Function.prototype, {
|
|
argumentNames: function() {
|
|
var A = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
|
|
return A.length == 1 && !A[0] ? [] : A
|
|
},
|
|
bind: function() {
|
|
if (arguments.length < 2 && Object.isUndefined(arguments[0])) {
|
|
return this
|
|
}
|
|
var A = this,
|
|
C = $A(arguments),
|
|
B = C.shift();
|
|
return function() {
|
|
return A.apply(B, C.concat($A(arguments)))
|
|
}
|
|
},
|
|
bindAsEventListener: function() {
|
|
var A = this,
|
|
C = $A(arguments),
|
|
B = C.shift();
|
|
return function(D) {
|
|
return A.apply(B, [D || window.event].concat(C))
|
|
}
|
|
},
|
|
curry: function() {
|
|
if (!arguments.length) {
|
|
return this
|
|
}
|
|
var A = this,
|
|
B = $A(arguments);
|
|
return function() {
|
|
return A.apply(this, B.concat($A(arguments)))
|
|
}
|
|
},
|
|
delay: function() {
|
|
var A = this,
|
|
B = $A(arguments),
|
|
C = B.shift() * 1000;
|
|
return window.setTimeout(function() {
|
|
return A.apply(A, B)
|
|
}, C)
|
|
},
|
|
wrap: function(B) {
|
|
var A = this;
|
|
return function() {
|
|
return B.apply(this, [A.bind(this)].concat($A(arguments)))
|
|
}
|
|
},
|
|
methodize: function() {
|
|
if (this._methodized) {
|
|
return this._methodized
|
|
}
|
|
var A = this;
|
|
return this._methodized = function() {
|
|
return A.apply(null, [this].concat($A(arguments)))
|
|
}
|
|
}
|
|
});
|
|
Function.prototype.defer = Function.prototype.delay.curry(0.01);
|
|
Date.prototype.toJSON = function() {
|
|
return '"' + this.getUTCFullYear() + "-" + (this.getUTCMonth() + 1).toPaddedString(2) + "-" + this.getUTCDate().toPaddedString(2) + "T" + this.getUTCHours().toPaddedString(2) + ":" + this.getUTCMinutes().toPaddedString(2) + ":" + this.getUTCSeconds().toPaddedString(2) + 'Z"'
|
|
};
|
|
var Try = {
|
|
these: function() {
|
|
var C;
|
|
for (var B = 0, D = arguments.length; B < D; B++) {
|
|
var A = arguments[B];
|
|
try {
|
|
C = A();
|
|
break
|
|
} catch (E) {}
|
|
}
|
|
return C
|
|
}
|
|
};
|
|
RegExp.prototype.match = RegExp.prototype.test;
|
|
RegExp.escape = function(A) {
|
|
return String(A).replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1")
|
|
};
|
|
var PeriodicalExecuter = Class.create({
|
|
initialize: function(B, A) {
|
|
this.callback = B;
|
|
this.frequency = A;
|
|
this.currentlyExecuting = false;
|
|
this.registerCallback()
|
|
},
|
|
registerCallback: function() {
|
|
this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000)
|
|
},
|
|
execute: function() {
|
|
this.callback(this)
|
|
},
|
|
stop: function() {
|
|
if (!this.timer) {
|
|
return
|
|
}
|
|
clearInterval(this.timer);
|
|
this.timer = null
|
|
},
|
|
onTimerEvent: function() {
|
|
if (!this.currentlyExecuting) {
|
|
try {
|
|
this.currentlyExecuting = true;
|
|
this.execute()
|
|
} finally {
|
|
this.currentlyExecuting = false
|
|
}
|
|
}
|
|
}
|
|
});
|
|
Object.extend(String, {
|
|
interpret: function(A) {
|
|
return A == null ? "" : String(A)
|
|
},
|
|
specialChar: {
|
|
"\b": "\\b",
|
|
"\t": "\\t",
|
|
"\n": "\\n",
|
|
"\f": "\\f",
|
|
"\r": "\\r",
|
|
"\\": "\\\\"
|
|
}
|
|
});
|
|
Object.extend(String.prototype, {
|
|
gsub: function(E, C) {
|
|
var A = "",
|
|
D = this,
|
|
B;
|
|
C = arguments.callee.prepareReplacement(C);
|
|
while (D.length > 0) {
|
|
if (B = D.match(E)) {
|
|
A += D.slice(0, B.index);
|
|
A += String.interpret(C(B));
|
|
D = D.slice(B.index + B[0].length)
|
|
} else {
|
|
A += D, D = ""
|
|
}
|
|
}
|
|
return A
|
|
},
|
|
sub: function(C, A, B) {
|
|
A = this.gsub.prepareReplacement(A);
|
|
B = Object.isUndefined(B) ? 1 : B;
|
|
return this.gsub(C, function(D) {
|
|
if (--B < 0) {
|
|
return D[0]
|
|
}
|
|
return A(D)
|
|
})
|
|
},
|
|
scan: function(B, A) {
|
|
this.gsub(B, A);
|
|
return String(this)
|
|
},
|
|
truncate: function(B, A) {
|
|
B = B || 30;
|
|
A = Object.isUndefined(A) ? "..." : A;
|
|
return this.length > B ? this.slice(0, B - A.length) + A : String(this)
|
|
},
|
|
strip: function() {
|
|
return this.replace(/^\s+/, "").replace(/\s+$/, "")
|
|
},
|
|
stripTags: function() {
|
|
return this.replace(/<\/?[^>]+>/gi, "")
|
|
},
|
|
stripScripts: function() {
|
|
return this.replace(new RegExp(Prototype.ScriptFragment, "img"), "")
|
|
},
|
|
extractScripts: function() {
|
|
var B = new RegExp(Prototype.ScriptFragment, "img");
|
|
var A = new RegExp(Prototype.ScriptFragment, "im");
|
|
return (this.match(B) || []).map(function(C) {
|
|
return (C.match(A) || ["", ""])[1]
|
|
})
|
|
},
|
|
evalScripts: function() {
|
|
return this.extractScripts().map(function(script) {
|
|
return eval(script)
|
|
})
|
|
},
|
|
escapeHTML: function() {
|
|
var A = arguments.callee;
|
|
A.text.data = this;
|
|
return A.div.innerHTML
|
|
},
|
|
unescapeHTML: function() {
|
|
var A = new Element("div");
|
|
A.innerHTML = this.stripTags();
|
|
return A.childNodes[0] ? (A.childNodes.length > 1 ? $A(A.childNodes).inject("", function(B, C) {
|
|
return B + C.nodeValue
|
|
}) : A.childNodes[0].nodeValue) : ""
|
|
},
|
|
toQueryParams: function(B) {
|
|
var A = this.strip().match(/([^?#]*)(#.*)?$/);
|
|
if (!A) {
|
|
return {}
|
|
}
|
|
return A[1].split(B || "&").inject({}, function(E, F) {
|
|
if ((F = F.split("="))[0]) {
|
|
var C = decodeURIComponent(F.shift());
|
|
var D = F.length > 1 ? F.join("=") : F[0];
|
|
if (D != undefined) {
|
|
D = decodeURIComponent(D)
|
|
}
|
|
if (C in E) {
|
|
if (!Object.isArray(E[C])) {
|
|
E[C] = [E[C]]
|
|
}
|
|
E[C].push(D)
|
|
} else {
|
|
E[C] = D
|
|
}
|
|
}
|
|
return E
|
|
})
|
|
},
|
|
toArray: function() {
|
|
return this.split("")
|
|
},
|
|
succ: function() {
|
|
return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1)
|
|
},
|
|
times: function(A) {
|
|
return A < 1 ? "" : new Array(A + 1).join(this)
|
|
},
|
|
camelize: function() {
|
|
var D = this.split("-"),
|
|
A = D.length;
|
|
if (A == 1) {
|
|
return D[0]
|
|
}
|
|
var C = this.charAt(0) == "-" ? D[0].charAt(0).toUpperCase() + D[0].substring(1) : D[0];
|
|
for (var B = 1; B < A; B++) {
|
|
C += D[B].charAt(0).toUpperCase() + D[B].substring(1)
|
|
}
|
|
return C
|
|
},
|
|
capitalize: function() {
|
|
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase()
|
|
},
|
|
underscore: function() {
|
|
return this.gsub(/::/, "/").gsub(/([A-Z]+)([A-Z][a-z])/, "#{1}_#{2}").gsub(/([a-z\d])([A-Z])/, "#{1}_#{2}").gsub(/-/, "_").toLowerCase()
|
|
},
|
|
dasherize: function() {
|
|
return this.gsub(/_/, "-")
|
|
},
|
|
inspect: function(B) {
|
|
var A = this.gsub(/[\x00-\x1f\\]/, function(C) {
|
|
var D = String.specialChar[C[0]];
|
|
return D ? D : "\\u00" + C[0].charCodeAt().toPaddedString(2, 16)
|
|
});
|
|
if (B) {
|
|
return '"' + A.replace(/"/g, '\\"') + '"'
|
|
}
|
|
return "'" + A.replace(/'/g, "\\'") + "'"
|
|
},
|
|
toJSON: function() {
|
|
return this.inspect(true)
|
|
},
|
|
unfilterJSON: function(A) {
|
|
return this.sub(A || Prototype.JSONFilter, "#{1}")
|
|
},
|
|
isJSON: function() {
|
|
var A = this;
|
|
if (A.blank()) {
|
|
return false
|
|
}
|
|
A = this.replace(/\\./g, "@").replace(/"[^"\\\n\r]*"/g, "");
|
|
return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(A)
|
|
},
|
|
evalJSON: function(sanitize) {
|
|
var json = this.unfilterJSON();
|
|
try {
|
|
if (!sanitize || json.isJSON()) {
|
|
return eval("(" + json + ")")
|
|
}
|
|
} catch (e) {}
|
|
throw new SyntaxError("Badly formed JSON string: " + this.inspect())
|
|
},
|
|
include: function(A) {
|
|
return this.indexOf(A) > -1
|
|
},
|
|
startsWith: function(A) {
|
|
return this.indexOf(A) === 0
|
|
},
|
|
endsWith: function(A) {
|
|
var B = this.length - A.length;
|
|
return B >= 0 && this.lastIndexOf(A) === B
|
|
},
|
|
empty: function() {
|
|
return this == ""
|
|
},
|
|
blank: function() {
|
|
return /^\s*$/.test(this)
|
|
},
|
|
interpolate: function(A, B) {
|
|
return new Template(this, B).evaluate(A)
|
|
}
|
|
});
|
|
if (Prototype.Browser.WebKit || Prototype.Browser.IE) {
|
|
Object.extend(String.prototype, {
|
|
escapeHTML: function() {
|
|
return this.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")
|
|
},
|
|
unescapeHTML: function() {
|
|
return this.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")
|
|
}
|
|
})
|
|
}
|
|
String.prototype.gsub.prepareReplacement = function(B) {
|
|
if (Object.isFunction(B)) {
|
|
return B
|
|
}
|
|
var A = new Template(B);
|
|
return function(C) {
|
|
return A.evaluate(C)
|
|
}
|
|
};
|
|
String.prototype.parseQuery = String.prototype.toQueryParams;
|
|
Object.extend(String.prototype.escapeHTML, {
|
|
div: document.createElement("div"),
|
|
text: document.createTextNode("")
|
|
});
|
|
with(String.prototype.escapeHTML) {
|
|
div.appendChild(text)
|
|
}
|
|
var Template = Class.create({
|
|
initialize: function(A, B) {
|
|
this.template = A.toString();
|
|
this.pattern = B || Template.Pattern
|
|
},
|
|
evaluate: function(A) {
|
|
if (Object.isFunction(A.toTemplateReplacements)) {
|
|
A = A.toTemplateReplacements()
|
|
}
|
|
return this.template.gsub(this.pattern, function(D) {
|
|
if (A == null) {
|
|
return ""
|
|
}
|
|
var F = D[1] || "";
|
|
if (F == "\\") {
|
|
return D[2]
|
|
}
|
|
var B = A,
|
|
G = D[3];
|
|
var E = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
|
|
D = E.exec(G);
|
|
if (D == null) {
|
|
return F
|
|
}
|
|
while (D != null) {
|
|
var C = D[1].startsWith("[") ? D[2].gsub("\\\\]", "]") : D[1];
|
|
B = B[C];
|
|
if (null == B || "" == D[3]) {
|
|
break
|
|
}
|
|
G = G.substring("[" == D[3] ? D[1].length : D[0].length);
|
|
D = E.exec(G)
|
|
}
|
|
return F + String.interpret(B)
|
|
})
|
|
}
|
|
});
|
|
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
|
|
var $break = {};
|
|
var Enumerable = {
|
|
each: function(C, B) {
|
|
var A = 0;
|
|
C = C.bind(B);
|
|
try {
|
|
this._each(function(E) {
|
|
C(E, A++)
|
|
})
|
|
} catch (D) {
|
|
if (D != $break) {
|
|
throw D
|
|
}
|
|
}
|
|
return this
|
|
},
|
|
eachSlice: function(D, C, B) {
|
|
C = C ? C.bind(B) : Prototype.K;
|
|
var A = -D,
|
|
E = [],
|
|
F = this.toArray();
|
|
while ((A += D) < F.length) {
|
|
E.push(F.slice(A, A + D))
|
|
}
|
|
return E.collect(C, B)
|
|
},
|
|
all: function(C, B) {
|
|
C = C ? C.bind(B) : Prototype.K;
|
|
var A = true;
|
|
this.each(function(E, D) {
|
|
A = A && !!C(E, D);
|
|
if (!A) {
|
|
throw $break
|
|
}
|
|
});
|
|
return A
|
|
},
|
|
any: function(C, B) {
|
|
C = C ? C.bind(B) : Prototype.K;
|
|
var A = false;
|
|
this.each(function(E, D) {
|
|
if (A = !!C(E, D)) {
|
|
throw $break
|
|
}
|
|
});
|
|
return A
|
|
},
|
|
collect: function(C, B) {
|
|
C = C ? C.bind(B) : Prototype.K;
|
|
var A = [];
|
|
this.each(function(E, D) {
|
|
A.push(C(E, D))
|
|
});
|
|
return A
|
|
},
|
|
detect: function(C, B) {
|
|
C = C.bind(B);
|
|
var A;
|
|
this.each(function(E, D) {
|
|
if (C(E, D)) {
|
|
A = E;
|
|
throw $break
|
|
}
|
|
});
|
|
return A
|
|
},
|
|
findAll: function(C, B) {
|
|
C = C.bind(B);
|
|
var A = [];
|
|
this.each(function(E, D) {
|
|
if (C(E, D)) {
|
|
A.push(E)
|
|
}
|
|
});
|
|
return A
|
|
},
|
|
grep: function(D, C, B) {
|
|
C = C ? C.bind(B) : Prototype.K;
|
|
var A = [];
|
|
if (Object.isString(D)) {
|
|
D = new RegExp(D)
|
|
}
|
|
this.each(function(F, E) {
|
|
if (D.match(F)) {
|
|
A.push(C(F, E))
|
|
}
|
|
});
|
|
return A
|
|
},
|
|
include: function(A) {
|
|
if (Object.isFunction(this.indexOf)) {
|
|
if (this.indexOf(A) != -1) {
|
|
return true
|
|
}
|
|
}
|
|
var B = false;
|
|
this.each(function(C) {
|
|
if (C == A) {
|
|
B = true;
|
|
throw $break
|
|
}
|
|
});
|
|
return B
|
|
},
|
|
inGroupsOf: function(B, A) {
|
|
A = Object.isUndefined(A) ? null : A;
|
|
return this.eachSlice(B, function(C) {
|
|
while (C.length < B) {
|
|
C.push(A)
|
|
}
|
|
return C
|
|
})
|
|
},
|
|
inject: function(A, C, B) {
|
|
C = C.bind(B);
|
|
this.each(function(E, D) {
|
|
A = C(A, E, D)
|
|
});
|
|
return A
|
|
},
|
|
invoke: function(B) {
|
|
var A = $A(arguments).slice(1);
|
|
return this.map(function(C) {
|
|
return C[B].apply(C, A)
|
|
})
|
|
},
|
|
max: function(C, B) {
|
|
C = C ? C.bind(B) : Prototype.K;
|
|
var A;
|
|
this.each(function(E, D) {
|
|
E = C(E, D);
|
|
if (A == null || E >= A) {
|
|
A = E
|
|
}
|
|
});
|
|
return A
|
|
},
|
|
min: function(C, B) {
|
|
C = C ? C.bind(B) : Prototype.K;
|
|
var A;
|
|
this.each(function(E, D) {
|
|
E = C(E, D);
|
|
if (A == null || E < A) {
|
|
A = E
|
|
}
|
|
});
|
|
return A
|
|
},
|
|
partition: function(D, B) {
|
|
D = D ? D.bind(B) : Prototype.K;
|
|
var C = [],
|
|
A = [];
|
|
this.each(function(F, E) {
|
|
(D(F, E) ? C : A).push(F)
|
|
});
|
|
return [C, A]
|
|
},
|
|
pluck: function(B) {
|
|
var A = [];
|
|
this.each(function(C) {
|
|
A.push(C[B])
|
|
});
|
|
return A
|
|
},
|
|
reject: function(C, B) {
|
|
C = C.bind(B);
|
|
var A = [];
|
|
this.each(function(E, D) {
|
|
if (!C(E, D)) {
|
|
A.push(E)
|
|
}
|
|
});
|
|
return A
|
|
},
|
|
sortBy: function(B, A) {
|
|
B = B.bind(A);
|
|
return this.map(function(D, C) {
|
|
return {
|
|
value: D,
|
|
criteria: B(D, C)
|
|
}
|
|
}).sort(function(F, E) {
|
|
var D = F.criteria,
|
|
C = E.criteria;
|
|
return D < C ? -1 : D > C ? 1 : 0
|
|
}).pluck("value")
|
|
},
|
|
toArray: function() {
|
|
return this.map()
|
|
},
|
|
zip: function() {
|
|
var B = Prototype.K,
|
|
A = $A(arguments);
|
|
if (Object.isFunction(A.last())) {
|
|
B = A.pop()
|
|
}
|
|
var C = [this].concat(A).map($A);
|
|
return this.map(function(E, D) {
|
|
return B(C.pluck(D))
|
|
})
|
|
},
|
|
size: function() {
|
|
return this.toArray().length
|
|
},
|
|
inspect: function() {
|
|
return "#<Enumerable:" + this.toArray().inspect() + ">"
|
|
}
|
|
};
|
|
Object.extend(Enumerable, {
|
|
map: Enumerable.collect,
|
|
find: Enumerable.detect,
|
|
select: Enumerable.findAll,
|
|
filter: Enumerable.findAll,
|
|
member: Enumerable.include,
|
|
entries: Enumerable.toArray,
|
|
every: Enumerable.all,
|
|
some: Enumerable.any
|
|
});
|
|
|
|
function $A(C) {
|
|
if (!C) {
|
|
return []
|
|
}
|
|
if (C.toArray) {
|
|
return C.toArray()
|
|
}
|
|
var B = C.length || 0,
|
|
A = new Array(B);
|
|
while (B--) {
|
|
A[B] = C[B]
|
|
}
|
|
return A
|
|
}
|
|
if (Prototype.Browser.WebKit) {
|
|
$A = function(C) {
|
|
if (!C) {
|
|
return []
|
|
}
|
|
if (!(Object.isFunction(C) && C == "[object NodeList]") && C.toArray) {
|
|
return C.toArray()
|
|
}
|
|
var B = C.length || 0,
|
|
A = new Array(B);
|
|
while (B--) {
|
|
A[B] = C[B]
|
|
}
|
|
return A
|
|
}
|
|
}
|
|
Array.from = $A;
|
|
Object.extend(Array.prototype, Enumerable);
|
|
if (!Array.prototype._reverse) {
|
|
Array.prototype._reverse = Array.prototype.reverse
|
|
}
|
|
Object.extend(Array.prototype, {
|
|
_each: function(B) {
|
|
for (var A = 0, C = this.length; A < C; A++) {
|
|
B(this[A])
|
|
}
|
|
},
|
|
clear: function() {
|
|
this.length = 0;
|
|
return this
|
|
},
|
|
first: function() {
|
|
return this[0]
|
|
},
|
|
last: function() {
|
|
return this[this.length - 1]
|
|
},
|
|
compact: function() {
|
|
return this.select(function(A) {
|
|
return A != null
|
|
})
|
|
},
|
|
flatten: function() {
|
|
return this.inject([], function(B, A) {
|
|
return B.concat(Object.isArray(A) ? A.flatten() : [A])
|
|
})
|
|
},
|
|
without: function() {
|
|
var A = $A(arguments);
|
|
return this.select(function(B) {
|
|
return !A.include(B)
|
|
})
|
|
},
|
|
reverse: function(A) {
|
|
return (A !== false ? this : this.toArray())._reverse()
|
|
},
|
|
reduce: function() {
|
|
return this.length > 1 ? this : this[0]
|
|
},
|
|
uniq: function(A) {
|
|
return this.inject([], function(D, C, B) {
|
|
if (0 == B || (A ? D.last() != C : !D.include(C))) {
|
|
D.push(C)
|
|
}
|
|
return D
|
|
})
|
|
},
|
|
intersect: function(A) {
|
|
return this.uniq().findAll(function(B) {
|
|
return A.detect(function(C) {
|
|
return B === C
|
|
})
|
|
})
|
|
},
|
|
clone: function() {
|
|
return [].concat(this)
|
|
},
|
|
size: function() {
|
|
return this.length
|
|
},
|
|
inspect: function() {
|
|
return "[" + this.map(Object.inspect).join(", ") + "]"
|
|
},
|
|
toJSON: function() {
|
|
var A = [];
|
|
this.each(function(B) {
|
|
var C = Object.toJSON(B);
|
|
if (!Object.isUndefined(C)) {
|
|
A.push(C)
|
|
}
|
|
});
|
|
return "[" + A.join(", ") + "]"
|
|
}
|
|
});
|
|
if (Object.isFunction(Array.prototype.forEach)) {
|
|
Array.prototype._each = Array.prototype.forEach
|
|
}
|
|
if (!Array.prototype.indexOf) {
|
|
Array.prototype.indexOf = function(C, A) {
|
|
A || (A = 0);
|
|
var B = this.length;
|
|
if (A < 0) {
|
|
A = B + A
|
|
}
|
|
for (; A < B; A++) {
|
|
if (this[A] === C) {
|
|
return A
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
}
|
|
if (!Array.prototype.lastIndexOf) {
|
|
Array.prototype.lastIndexOf = function(B, A) {
|
|
A = isNaN(A) ? this.length : (A < 0 ? this.length + A : A) + 1;
|
|
var C = this.slice(0, A).reverse().indexOf(B);
|
|
return (C < 0) ? C : A - C - 1
|
|
}
|
|
}
|
|
Array.prototype.toArray = Array.prototype.clone;
|
|
|
|
function $w(A) {
|
|
if (!Object.isString(A)) {
|
|
return []
|
|
}
|
|
A = A.strip();
|
|
return A ? A.split(/\s+/) : []
|
|
}
|
|
if (Prototype.Browser.Opera) {
|
|
Array.prototype.concat = function() {
|
|
var E = [];
|
|
for (var B = 0, C = this.length; B < C; B++) {
|
|
E.push(this[B])
|
|
}
|
|
for (var B = 0, C = arguments.length; B < C; B++) {
|
|
if (Object.isArray(arguments[B])) {
|
|
for (var A = 0, D = arguments[B].length; A < D; A++) {
|
|
E.push(arguments[B][A])
|
|
}
|
|
} else {
|
|
E.push(arguments[B])
|
|
}
|
|
}
|
|
return E
|
|
}
|
|
}
|
|
Object.extend(Number.prototype, {
|
|
toColorPart: function() {
|
|
return this.toPaddedString(2, 16)
|
|
},
|
|
succ: function() {
|
|
return this + 1
|
|
},
|
|
times: function(A) {
|
|
$R(0, this, true).each(A);
|
|
return this
|
|
},
|
|
toPaddedString: function(C, B) {
|
|
var A = this.toString(B || 10);
|
|
return "0".times(C - A.length) + A
|
|
},
|
|
toJSON: function() {
|
|
return isFinite(this) ? this.toString() : "null"
|
|
}
|
|
});
|
|
$w("abs round ceil floor").each(function(A) {
|
|
Number.prototype[A] = Math[A].methodize()
|
|
});
|
|
|
|
function $H(A) {
|
|
return new Hash(A)
|
|
}
|
|
var Hash = Class.create(Enumerable, (function() {
|
|
function A(B, C) {
|
|
if (Object.isUndefined(C)) {
|
|
return B
|
|
}
|
|
return B + "=" + encodeURIComponent(String.interpret(C))
|
|
}
|
|
return {
|
|
initialize: function(B) {
|
|
this._object = Object.isHash(B) ? B.toObject() : Object.clone(B)
|
|
},
|
|
_each: function(C) {
|
|
for (var B in this._object) {
|
|
var D = this._object[B],
|
|
E = [B, D];
|
|
E.key = B;
|
|
E.value = D;
|
|
C(E)
|
|
}
|
|
},
|
|
set: function(B, C) {
|
|
return this._object[B] = C
|
|
},
|
|
get: function(B) {
|
|
return this._object[B]
|
|
},
|
|
unset: function(B) {
|
|
var C = this._object[B];
|
|
delete this._object[B];
|
|
return C
|
|
},
|
|
toObject: function() {
|
|
return Object.clone(this._object)
|
|
},
|
|
keys: function() {
|
|
return this.pluck("key")
|
|
},
|
|
values: function() {
|
|
return this.pluck("value")
|
|
},
|
|
index: function(C) {
|
|
var B = this.detect(function(D) {
|
|
return D.value === C
|
|
});
|
|
return B && B.key
|
|
},
|
|
merge: function(B) {
|
|
return this.clone().update(B)
|
|
},
|
|
update: function(B) {
|
|
return new Hash(B).inject(this, function(C, D) {
|
|
C.set(D.key, D.value);
|
|
return C
|
|
})
|
|
},
|
|
toQueryString: function() {
|
|
return this.map(function(D) {
|
|
var C = encodeURIComponent(D.key),
|
|
B = D.value;
|
|
if (B && typeof B == "object") {
|
|
if (Object.isArray(B)) {
|
|
return B.map(A.curry(C)).join("&")
|
|
}
|
|
}
|
|
return A(C, B)
|
|
}).join("&")
|
|
},
|
|
inspect: function() {
|
|
return "#<Hash:{" + this.map(function(B) {
|
|
return B.map(Object.inspect).join(": ")
|
|
}).join(", ") + "}>"
|
|
},
|
|
toJSON: function() {
|
|
return Object.toJSON(this.toObject())
|
|
},
|
|
clone: function() {
|
|
return new Hash(this)
|
|
}
|
|
}
|
|
})());
|
|
Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
|
|
Hash.from = $H;
|
|
var ObjectRange = Class.create(Enumerable, {
|
|
initialize: function(C, A, B) {
|
|
this.start = C;
|
|
this.end = A;
|
|
this.exclusive = B
|
|
},
|
|
_each: function(A) {
|
|
var B = this.start;
|
|
while (this.include(B)) {
|
|
A(B);
|
|
B = B.succ()
|
|
}
|
|
},
|
|
include: function(A) {
|
|
if (A < this.start) {
|
|
return false
|
|
}
|
|
if (this.exclusive) {
|
|
return A < this.end
|
|
}
|
|
return A <= this.end
|
|
}
|
|
});
|
|
var $R = function(C, A, B) {
|
|
return new ObjectRange(C, A, B)
|
|
};
|
|
var Ajax = {
|
|
getTransport: function() {
|
|
return Try.these(function() {
|
|
return new XMLHttpRequest()
|
|
}, function() {
|
|
return new ActiveXObject("Msxml2.XMLHTTP")
|
|
}, function() {
|
|
return new ActiveXObject("Microsoft.XMLHTTP")
|
|
}) || false
|
|
},
|
|
activeRequestCount: 0
|
|
};
|
|
Ajax.Responders = {
|
|
responders: [],
|
|
_each: function(A) {
|
|
this.responders._each(A)
|
|
},
|
|
register: function(A) {
|
|
if (!this.include(A)) {
|
|
this.responders.push(A)
|
|
}
|
|
},
|
|
unregister: function(A) {
|
|
this.responders = this.responders.without(A)
|
|
},
|
|
dispatch: function(D, B, C, A) {
|
|
this.each(function(E) {
|
|
if (Object.isFunction(E[D])) {
|
|
try {
|
|
E[D].apply(E, [B, C, A])
|
|
} catch (F) {}
|
|
}
|
|
})
|
|
}
|
|
};
|
|
Object.extend(Ajax.Responders, Enumerable);
|
|
Ajax.Responders.register({
|
|
onCreate: function() {
|
|
Ajax.activeRequestCount++
|
|
},
|
|
onComplete: function() {
|
|
Ajax.activeRequestCount--
|
|
}
|
|
});
|
|
Ajax.Base = Class.create({
|
|
initialize: function(A) {
|
|
this.options = {
|
|
method: "post",
|
|
asynchronous: true,
|
|
contentType: "application/x-www-form-urlencoded",
|
|
encoding: "UTF-8",
|
|
parameters: "",
|
|
evalJSON: true,
|
|
evalJS: true
|
|
};
|
|
Object.extend(this.options, A || {});
|
|
this.options.method = this.options.method.toLowerCase();
|
|
if (Object.isString(this.options.parameters)) {
|
|
this.options.parameters = this.options.parameters.toQueryParams()
|
|
} else {
|
|
if (Object.isHash(this.options.parameters)) {
|
|
this.options.parameters = this.options.parameters.toObject()
|
|
}
|
|
}
|
|
}
|
|
});
|
|
Ajax.Request = Class.create(Ajax.Base, {
|
|
_complete: false,
|
|
initialize: function($super, B, A) {
|
|
$super(A);
|
|
this.transport = Ajax.getTransport();
|
|
this.request(B)
|
|
},
|
|
request: function(B) {
|
|
this.url = B;
|
|
this.method = this.options.method;
|
|
var D = Object.clone(this.options.parameters);
|
|
if (!["get", "post"].include(this.method)) {
|
|
D._method = this.method;
|
|
this.method = "post"
|
|
}
|
|
this.parameters = D;
|
|
if (D = Object.toQueryString(D)) {
|
|
if (this.method == "get") {
|
|
this.url += (this.url.include("?") ? "&" : "?") + D
|
|
} else {
|
|
if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
|
|
D += "&_="
|
|
}
|
|
}
|
|
}
|
|
try {
|
|
var A = new Ajax.Response(this);
|
|
if (this.options.onCreate) {
|
|
this.options.onCreate(A)
|
|
}
|
|
Ajax.Responders.dispatch("onCreate", this, A);
|
|
this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous);
|
|
if (this.options.asynchronous) {
|
|
this.respondToReadyState.bind(this).defer(1)
|
|
}
|
|
this.transport.onreadystatechange = this.onStateChange.bind(this);
|
|
this.setRequestHeaders();
|
|
this.body = this.method == "post" ? (this.options.postBody || D) : null;
|
|
this.transport.send(this.body);
|
|
if (!this.options.asynchronous && this.transport.overrideMimeType) {
|
|
this.onStateChange()
|
|
}
|
|
} catch (C) {
|
|
this.dispatchException(C)
|
|
}
|
|
},
|
|
onStateChange: function() {
|
|
var A = this.transport.readyState;
|
|
if (A > 1 && !((A == 4) && this._complete)) {
|
|
this.respondToReadyState(this.transport.readyState)
|
|
}
|
|
},
|
|
setRequestHeaders: function() {
|
|
var E = {
|
|
"X-Requested-With": "XMLHttpRequest",
|
|
"X-Prototype-Version": Prototype.Version,
|
|
Accept: "text/javascript, text/html, application/xml, text/xml, */*"
|
|
};
|
|
if (this.method == "post") {
|
|
E["Content-type"] = this.options.contentType + (this.options.encoding ? "; charset=" + this.options.encoding : "");
|
|
if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0, 2005])[1] < 2005) {
|
|
E.Connection = "close"
|
|
}
|
|
}
|
|
if (typeof this.options.requestHeaders == "object") {
|
|
var C = this.options.requestHeaders;
|
|
if (Object.isFunction(C.push)) {
|
|
for (var B = 0, D = C.length; B < D; B += 2) {
|
|
E[C[B]] = C[B + 1]
|
|
}
|
|
} else {
|
|
$H(C).each(function(F) {
|
|
E[F.key] = F.value
|
|
})
|
|
}
|
|
}
|
|
for (var A in E) {
|
|
this.transport.setRequestHeader(A, E[A])
|
|
}
|
|
},
|
|
success: function() {
|
|
var A = this.getStatus();
|
|
return !A || (A >= 200 && A < 300)
|
|
},
|
|
getStatus: function() {
|
|
try {
|
|
return this.transport.status || 0
|
|
} catch (A) {
|
|
return 0
|
|
}
|
|
},
|
|
respondToReadyState: function(A) {
|
|
var C = Ajax.Request.Events[A],
|
|
B = new Ajax.Response(this);
|
|
if (C == "Complete") {
|
|
try {
|
|
this._complete = true;
|
|
(this.options["on" + B.status] || this.options["on" + (this.success() ? "Success" : "Failure")] || Prototype.emptyFunction)(B, B.headerJSON)
|
|
} catch (D) {
|
|
this.dispatchException(D)
|
|
}
|
|
var E = B.getHeader("Content-type");
|
|
if (this.options.evalJS == "force" || (this.options.evalJS && this.isSameOrigin() && E && E.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) {
|
|
this.evalResponse()
|
|
}
|
|
}
|
|
try {
|
|
(this.options["on" + C] || Prototype.emptyFunction)(B, B.headerJSON);
|
|
Ajax.Responders.dispatch("on" + C, this, B, B.headerJSON)
|
|
} catch (D) {
|
|
this.dispatchException(D)
|
|
}
|
|
if (C == "Complete") {
|
|
this.transport.onreadystatechange = Prototype.emptyFunction
|
|
}
|
|
},
|
|
isSameOrigin: function() {
|
|
var A = this.url.match(/^\s*https?:\/\/[^\/]*/);
|
|
return !A || (A[0] == "#{protocol}//#{domain}#{port}".interpolate({
|
|
protocol: location.protocol,
|
|
domain: document.domain,
|
|
port: location.port ? ":" + location.port : ""
|
|
}))
|
|
},
|
|
getHeader: function(A) {
|
|
try {
|
|
return this.transport.getResponseHeader(A) || null
|
|
} catch (B) {
|
|
return null
|
|
}
|
|
},
|
|
evalResponse: function() {
|
|
try {
|
|
return eval((this.transport.responseText || "").unfilterJSON())
|
|
} catch (e) {
|
|
this.dispatchException(e)
|
|
}
|
|
},
|
|
dispatchException: function(A) {
|
|
(this.options.onException || Prototype.emptyFunction)(this, A);
|
|
Ajax.Responders.dispatch("onException", this, A)
|
|
}
|
|
});
|
|
Ajax.Request.Events = ["Uninitialized", "Loading", "Loaded", "Interactive", "Complete"];
|
|
Ajax.Response = Class.create({
|
|
initialize: function(C) {
|
|
this.request = C;
|
|
var D = this.transport = C.transport,
|
|
A = this.readyState = D.readyState;
|
|
if ((A > 2 && !Prototype.Browser.IE) || A == 4) {
|
|
this.status = this.getStatus();
|
|
this.statusText = this.getStatusText();
|
|
this.responseText = String.interpret(D.responseText);
|
|
this.headerJSON = this._getHeaderJSON()
|
|
}
|
|
if (A == 4) {
|
|
var B = D.responseXML;
|
|
this.responseXML = Object.isUndefined(B) ? null : B;
|
|
this.responseJSON = this._getResponseJSON()
|
|
}
|
|
},
|
|
status: 0,
|
|
statusText: "",
|
|
getStatus: Ajax.Request.prototype.getStatus,
|
|
getStatusText: function() {
|
|
try {
|
|
return this.transport.statusText || ""
|
|
} catch (A) {
|
|
return ""
|
|
}
|
|
},
|
|
getHeader: Ajax.Request.prototype.getHeader,
|
|
getAllHeaders: function() {
|
|
try {
|
|
return this.getAllResponseHeaders()
|
|
} catch (A) {
|
|
return null
|
|
}
|
|
},
|
|
getResponseHeader: function(A) {
|
|
return this.transport.getResponseHeader(A)
|
|
},
|
|
getAllResponseHeaders: function() {
|
|
return this.transport.getAllResponseHeaders()
|
|
},
|
|
_getHeaderJSON: function() {
|
|
var A = this.getHeader("X-JSON");
|
|
if (!A) {
|
|
return null
|
|
}
|
|
A = decodeURIComponent(escape(A));
|
|
try {
|
|
return A.evalJSON(this.request.options.sanitizeJSON || !this.request.isSameOrigin())
|
|
} catch (B) {
|
|
this.request.dispatchException(B)
|
|
}
|
|
},
|
|
_getResponseJSON: function() {
|
|
var A = this.request.options;
|
|
if (!A.evalJSON || (A.evalJSON != "force" && !(this.getHeader("Content-type") || "").include("application/json")) || this.responseText.blank()) {
|
|
return null
|
|
}
|
|
try {
|
|
return this.responseText.evalJSON(A.sanitizeJSON || !this.request.isSameOrigin())
|
|
} catch (B) {
|
|
this.request.dispatchException(B)
|
|
}
|
|
}
|
|
});
|
|
Ajax.Updater = Class.create(Ajax.Request, {
|
|
initialize: function($super, A, C, B) {
|
|
this.container = {
|
|
success: (A.success || A),
|
|
failure: (A.failure || (A.success ? null : A))
|
|
};
|
|
B = Object.clone(B);
|
|
var D = B.onComplete;
|
|
B.onComplete = (function(E, F) {
|
|
this.updateContent(E.responseText);
|
|
if (Object.isFunction(D)) {
|
|
D(E, F)
|
|
}
|
|
}).bind(this);
|
|
$super(C, B)
|
|
},
|
|
updateContent: function(D) {
|
|
var C = this.container[this.success() ? "success" : "failure"],
|
|
A = this.options;
|
|
if (!A.evalScripts) {
|
|
D = D.stripScripts()
|
|
}
|
|
if (C = $(C)) {
|
|
if (A.insertion) {
|
|
if (Object.isString(A.insertion)) {
|
|
var B = {};
|
|
B[A.insertion] = D;
|
|
C.insert(B)
|
|
} else {
|
|
A.insertion(C, D)
|
|
}
|
|
} else {
|
|
C.update(D)
|
|
}
|
|
}
|
|
}
|
|
});
|
|
Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
|
|
initialize: function($super, A, C, B) {
|
|
$super(B);
|
|
this.onComplete = this.options.onComplete;
|
|
this.frequency = (this.options.frequency || 2);
|
|
this.decay = (this.options.decay || 1);
|
|
this.updater = {};
|
|
this.container = A;
|
|
this.url = C;
|
|
this.start()
|
|
},
|
|
start: function() {
|
|
this.options.onComplete = this.updateComplete.bind(this);
|
|
this.onTimerEvent()
|
|
},
|
|
stop: function() {
|
|
this.updater.options.onComplete = undefined;
|
|
clearTimeout(this.timer);
|
|
(this.onComplete || Prototype.emptyFunction).apply(this, arguments)
|
|
},
|
|
updateComplete: function(A) {
|
|
if (this.options.decay) {
|
|
this.decay = (A.responseText == this.lastText ? this.decay * this.options.decay : 1);
|
|
this.lastText = A.responseText
|
|
}
|
|
this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency)
|
|
},
|
|
onTimerEvent: function() {
|
|
this.updater = new Ajax.Updater(this.container, this.url, this.options)
|
|
}
|
|
});
|
|
|
|
function $(B) {
|
|
if (arguments.length > 1) {
|
|
for (var A = 0, D = [], C = arguments.length; A < C; A++) {
|
|
D.push($(arguments[A]))
|
|
}
|
|
return D
|
|
}
|
|
if (Object.isString(B)) {
|
|
B = document.getElementById(B)
|
|
}
|
|
return Element.extend(B)
|
|
}
|
|
if (Prototype.BrowserFeatures.XPath) {
|
|
document._getElementsByXPath = function(F, A) {
|
|
var C = [];
|
|
var E = document.evaluate(F, $(A) || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
|
|
for (var B = 0, D = E.snapshotLength; B < D; B++) {
|
|
C.push(Element.extend(E.snapshotItem(B)))
|
|
}
|
|
return C
|
|
}
|
|
}
|
|
if (!window.Node) {
|
|
var Node = {}
|
|
}
|
|
if (!Node.ELEMENT_NODE) {
|
|
Object.extend(Node, {
|
|
ELEMENT_NODE: 1,
|
|
ATTRIBUTE_NODE: 2,
|
|
TEXT_NODE: 3,
|
|
CDATA_SECTION_NODE: 4,
|
|
ENTITY_REFERENCE_NODE: 5,
|
|
ENTITY_NODE: 6,
|
|
PROCESSING_INSTRUCTION_NODE: 7,
|
|
COMMENT_NODE: 8,
|
|
DOCUMENT_NODE: 9,
|
|
DOCUMENT_TYPE_NODE: 10,
|
|
DOCUMENT_FRAGMENT_NODE: 11,
|
|
NOTATION_NODE: 12
|
|
})
|
|
}(function() {
|
|
var A = this.Element;
|
|
this.Element = function(D, C) {
|
|
C = C || {};
|
|
D = D.toLowerCase();
|
|
var B = Element.cache;
|
|
if (Prototype.Browser.IE && C.name) {
|
|
D = "<" + D + ' name="' + C.name + '">';
|
|
delete C.name;
|
|
return Element.writeAttribute(document.createElement(D), C)
|
|
}
|
|
if (!B[D]) {
|
|
B[D] = Element.extend(document.createElement(D))
|
|
}
|
|
return Element.writeAttribute(B[D].cloneNode(false), C)
|
|
};
|
|
Object.extend(this.Element, A || {})
|
|
}).call(window);
|
|
Element.cache = {};
|
|
Element.Methods = {
|
|
visible: function(A) {
|
|
return $(A).style.display != "none"
|
|
},
|
|
toggle: function(A) {
|
|
A = $(A);
|
|
Element[Element.visible(A) ? "hide" : "show"](A);
|
|
return A
|
|
},
|
|
hide: function(A) {
|
|
$(A).style.display = "none";
|
|
return A
|
|
},
|
|
show: function(A) {
|
|
$(A).style.display = "";
|
|
return A
|
|
},
|
|
remove: function(A) {
|
|
A = $(A);
|
|
A.parentNode.removeChild(A);
|
|
return A
|
|
},
|
|
update: function(A, B) {
|
|
A = $(A);
|
|
if (B && B.toElement) {
|
|
B = B.toElement()
|
|
}
|
|
if (Object.isElement(B)) {
|
|
return A.update().insert(B)
|
|
}
|
|
B = Object.toHTML(B);
|
|
A.innerHTML = B.stripScripts();
|
|
B.evalScripts.bind(B).defer();
|
|
return A
|
|
},
|
|
replace: function(B, C) {
|
|
B = $(B);
|
|
if (C && C.toElement) {
|
|
C = C.toElement()
|
|
} else {
|
|
if (!Object.isElement(C)) {
|
|
C = Object.toHTML(C);
|
|
var A = B.ownerDocument.createRange();
|
|
A.selectNode(B);
|
|
C.evalScripts.bind(C).defer();
|
|
C = A.createContextualFragment(C.stripScripts())
|
|
}
|
|
}
|
|
B.parentNode.replaceChild(C, B);
|
|
return B
|
|
},
|
|
insert: function(C, E) {
|
|
C = $(C);
|
|
if (Object.isString(E) || Object.isNumber(E) || Object.isElement(E) || (E && (E.toElement || E.toHTML))) {
|
|
E = {
|
|
bottom: E
|
|
}
|
|
}
|
|
var D, F, B, G;
|
|
for (var A in E) {
|
|
D = E[A];
|
|
A = A.toLowerCase();
|
|
F = Element._insertionTranslations[A];
|
|
if (D && D.toElement) {
|
|
D = D.toElement()
|
|
}
|
|
if (Object.isElement(D)) {
|
|
F(C, D);
|
|
continue
|
|
}
|
|
D = Object.toHTML(D);
|
|
B = ((A == "before" || A == "after") ? C.parentNode : C).tagName.toUpperCase();
|
|
G = Element._getContentFromAnonymousElement(B, D.stripScripts());
|
|
if (A == "top" || A == "after") {
|
|
G.reverse()
|
|
}
|
|
G.each(F.curry(C));
|
|
D.evalScripts.bind(D).defer()
|
|
}
|
|
return C
|
|
},
|
|
wrap: function(B, C, A) {
|
|
B = $(B);
|
|
if (Object.isElement(C)) {
|
|
$(C).writeAttribute(A || {})
|
|
} else {
|
|
if (Object.isString(C)) {
|
|
C = new Element(C, A)
|
|
} else {
|
|
C = new Element("div", C)
|
|
}
|
|
}
|
|
if (B.parentNode) {
|
|
B.parentNode.replaceChild(C, B)
|
|
}
|
|
C.appendChild(B);
|
|
return C
|
|
},
|
|
inspect: function(B) {
|
|
B = $(B);
|
|
var A = "<" + B.tagName.toLowerCase();
|
|
$H({
|
|
id: "id",
|
|
className: "class"
|
|
}).each(function(F) {
|
|
var E = F.first(),
|
|
C = F.last();
|
|
var D = (B[E] || "").toString();
|
|
if (D) {
|
|
A += " " + C + "=" + D.inspect(true)
|
|
}
|
|
});
|
|
return A + ">"
|
|
},
|
|
recursivelyCollect: function(A, C) {
|
|
A = $(A);
|
|
var B = [];
|
|
while (A = A[C]) {
|
|
if (A.nodeType == 1) {
|
|
B.push(Element.extend(A))
|
|
}
|
|
}
|
|
return B
|
|
},
|
|
ancestors: function(A) {
|
|
return $(A).recursivelyCollect("parentNode")
|
|
},
|
|
descendants: function(A) {
|
|
return $(A).select("*")
|
|
},
|
|
firstDescendant: function(A) {
|
|
A = $(A).firstChild;
|
|
while (A && A.nodeType != 1) {
|
|
A = A.nextSibling
|
|
}
|
|
return $(A)
|
|
},
|
|
immediateDescendants: function(A) {
|
|
if (!(A = $(A).firstChild)) {
|
|
return []
|
|
}
|
|
while (A && A.nodeType != 1) {
|
|
A = A.nextSibling
|
|
}
|
|
if (A) {
|
|
return [A].concat($(A).nextSiblings())
|
|
}
|
|
return []
|
|
},
|
|
previousSiblings: function(A) {
|
|
return $(A).recursivelyCollect("previousSibling")
|
|
},
|
|
nextSiblings: function(A) {
|
|
return $(A).recursivelyCollect("nextSibling")
|
|
},
|
|
siblings: function(A) {
|
|
A = $(A);
|
|
return A.previousSiblings().reverse().concat(A.nextSiblings())
|
|
},
|
|
match: function(B, A) {
|
|
if (Object.isString(A)) {
|
|
A = new Selector(A)
|
|
}
|
|
return A.match($(B))
|
|
},
|
|
up: function(B, D, A) {
|
|
B = $(B);
|
|
if (arguments.length == 1) {
|
|
return $(B.parentNode)
|
|
}
|
|
var C = B.ancestors();
|
|
return Object.isNumber(D) ? C[D] : Selector.findElement(C, D, A)
|
|
},
|
|
down: function(B, C, A) {
|
|
B = $(B);
|
|
if (arguments.length == 1) {
|
|
return B.firstDescendant()
|
|
}
|
|
return Object.isNumber(C) ? B.descendants()[C] : B.select(C)[A || 0]
|
|
},
|
|
previous: function(B, D, A) {
|
|
B = $(B);
|
|
if (arguments.length == 1) {
|
|
return $(Selector.handlers.previousElementSibling(B))
|
|
}
|
|
var C = B.previousSiblings();
|
|
return Object.isNumber(D) ? C[D] : Selector.findElement(C, D, A)
|
|
},
|
|
next: function(C, D, B) {
|
|
C = $(C);
|
|
if (arguments.length == 1) {
|
|
return $(Selector.handlers.nextElementSibling(C))
|
|
}
|
|
var A = C.nextSiblings();
|
|
return Object.isNumber(D) ? A[D] : Selector.findElement(A, D, B)
|
|
},
|
|
select: function() {
|
|
var A = $A(arguments),
|
|
B = $(A.shift());
|
|
return Selector.findChildElements(B, A)
|
|
},
|
|
adjacent: function() {
|
|
var A = $A(arguments),
|
|
B = $(A.shift());
|
|
return Selector.findChildElements(B.parentNode, A).without(B)
|
|
},
|
|
identify: function(B) {
|
|
B = $(B);
|
|
var C = B.readAttribute("id"),
|
|
A = arguments.callee;
|
|
if (C) {
|
|
return C
|
|
}
|
|
do {
|
|
C = "anonymous_element_" + A.counter++
|
|
} while ($(C));
|
|
B.writeAttribute("id", C);
|
|
return C
|
|
},
|
|
readAttribute: function(C, A) {
|
|
C = $(C);
|
|
if (Prototype.Browser.IE) {
|
|
var B = Element._attributeTranslations.read;
|
|
if (B.values[A]) {
|
|
return B.values[A](C, A)
|
|
}
|
|
if (B.names[A]) {
|
|
A = B.names[A]
|
|
}
|
|
if (A.include(":")) {
|
|
return (!C.attributes || !C.attributes[A]) ? null : C.attributes[A].value
|
|
}
|
|
}
|
|
return C.getAttribute(A)
|
|
},
|
|
writeAttribute: function(E, C, F) {
|
|
E = $(E);
|
|
var B = {},
|
|
D = Element._attributeTranslations.write;
|
|
if (typeof C == "object") {
|
|
B = C
|
|
} else {
|
|
B[C] = Object.isUndefined(F) ? true : F
|
|
}
|
|
for (var A in B) {
|
|
C = D.names[A] || A;
|
|
F = B[A];
|
|
if (D.values[A]) {
|
|
C = D.values[A](E, F)
|
|
}
|
|
if (F === false || F === null) {
|
|
E.removeAttribute(C)
|
|
} else {
|
|
if (F === true) {
|
|
E.setAttribute(C, C)
|
|
} else {
|
|
E.setAttribute(C, F)
|
|
}
|
|
}
|
|
}
|
|
return E
|
|
},
|
|
getHeight: function(A) {
|
|
return $(A).getDimensions().height
|
|
},
|
|
getWidth: function(A) {
|
|
return $(A).getDimensions().width
|
|
},
|
|
classNames: function(A) {
|
|
return new Element.ClassNames(A)
|
|
},
|
|
hasClassName: function(A, B) {
|
|
if (!(A = $(A))) {
|
|
return
|
|
}
|
|
var C = A.className;
|
|
return (C.length > 0 && (C == B || new RegExp("(^|\\s)" + B + "(\\s|$)").test(C)))
|
|
},
|
|
addClassName: function(A, B) {
|
|
if (!(A = $(A))) {
|
|
return
|
|
}
|
|
if (!A.hasClassName(B)) {
|
|
A.className += (A.className ? " " : "") + B
|
|
}
|
|
return A
|
|
},
|
|
removeClassName: function(A, B) {
|
|
if (!(A = $(A))) {
|
|
return
|
|
}
|
|
A.className = A.className.replace(new RegExp("(^|\\s+)" + B + "(\\s+|$)"), " ").strip();
|
|
return A
|
|
},
|
|
toggleClassName: function(A, B) {
|
|
if (!(A = $(A))) {
|
|
return
|
|
}
|
|
return A[A.hasClassName(B) ? "removeClassName" : "addClassName"](B)
|
|
},
|
|
cleanWhitespace: function(B) {
|
|
B = $(B);
|
|
var C = B.firstChild;
|
|
while (C) {
|
|
var A = C.nextSibling;
|
|
if (C.nodeType == 3 && !/\S/.test(C.nodeValue)) {
|
|
B.removeChild(C)
|
|
}
|
|
C = A
|
|
}
|
|
return B
|
|
},
|
|
empty: function(A) {
|
|
return $(A).innerHTML.blank()
|
|
},
|
|
descendantOf: function(D, C) {
|
|
D = $(D), C = $(C);
|
|
var F = C;
|
|
if (D.compareDocumentPosition) {
|
|
return (D.compareDocumentPosition(C) & 8) === 8
|
|
}
|
|
if (D.sourceIndex && !Prototype.Browser.Opera) {
|
|
var E = D.sourceIndex,
|
|
B = C.sourceIndex,
|
|
A = C.nextSibling;
|
|
if (!A) {
|
|
do {
|
|
C = C.parentNode
|
|
} while (!(A = C.nextSibling) && C.parentNode)
|
|
}
|
|
if (A && A.sourceIndex) {
|
|
return (E > B && E < A.sourceIndex)
|
|
}
|
|
}
|
|
while (D = D.parentNode) {
|
|
if (D == F) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
},
|
|
scrollTo: function(A) {
|
|
A = $(A);
|
|
var B = A.cumulativeOffset();
|
|
window.scrollTo(B[0], B[1]);
|
|
return A
|
|
},
|
|
getStyle: function(B, C) {
|
|
B = $(B);
|
|
C = C == "float" ? "cssFloat" : C.camelize();
|
|
var D = B.style[C];
|
|
if (!D) {
|
|
var A = document.defaultView.getComputedStyle(B, null);
|
|
D = A ? A[C] : null
|
|
}
|
|
if (C == "opacity") {
|
|
return D ? parseFloat(D) : 1
|
|
}
|
|
return D == "auto" ? null : D
|
|
},
|
|
getOpacity: function(A) {
|
|
return $(A).getStyle("opacity")
|
|
},
|
|
setStyle: function(B, C) {
|
|
B = $(B);
|
|
var E = B.style,
|
|
A;
|
|
if (Object.isString(C)) {
|
|
B.style.cssText += ";" + C;
|
|
return C.include("opacity") ? B.setOpacity(C.match(/opacity:\s*(\d?\.?\d*)/)[1]) : B
|
|
}
|
|
for (var D in C) {
|
|
if (D == "opacity") {
|
|
B.setOpacity(C[D])
|
|
} else {
|
|
E[(D == "float" || D == "cssFloat") ? (Object.isUndefined(E.styleFloat) ? "cssFloat" : "styleFloat") : D] = C[D]
|
|
}
|
|
}
|
|
return B
|
|
},
|
|
setOpacity: function(A, B) {
|
|
A = $(A);
|
|
A.style.opacity = (B == 1 || B === "") ? "" : (B < 0.00001) ? 0 : B;
|
|
return A
|
|
},
|
|
getDimensions: function(C) {
|
|
C = $(C);
|
|
var G = $(C).getStyle("display");
|
|
if (G != "none" && G != null) {
|
|
return {
|
|
width: C.offsetWidth,
|
|
height: C.offsetHeight
|
|
}
|
|
}
|
|
var B = C.style;
|
|
var F = B.visibility;
|
|
var D = B.position;
|
|
var A = B.display;
|
|
B.visibility = "hidden";
|
|
B.position = "absolute";
|
|
B.display = "block";
|
|
var H = C.clientWidth;
|
|
var E = C.clientHeight;
|
|
B.display = A;
|
|
B.position = D;
|
|
B.visibility = F;
|
|
return {
|
|
width: H,
|
|
height: E
|
|
}
|
|
},
|
|
makePositioned: function(A) {
|
|
A = $(A);
|
|
var B = Element.getStyle(A, "position");
|
|
if (B == "static" || !B) {
|
|
A._madePositioned = true;
|
|
A.style.position = "relative";
|
|
if (window.opera) {
|
|
A.style.top = 0;
|
|
A.style.left = 0
|
|
}
|
|
}
|
|
return A
|
|
},
|
|
undoPositioned: function(A) {
|
|
A = $(A);
|
|
if (A._madePositioned) {
|
|
A._madePositioned = undefined;
|
|
A.style.position = A.style.top = A.style.left = A.style.bottom = A.style.right = ""
|
|
}
|
|
return A
|
|
},
|
|
makeClipping: function(A) {
|
|
A = $(A);
|
|
if (A._overflow) {
|
|
return A
|
|
}
|
|
A._overflow = Element.getStyle(A, "overflow") || "auto";
|
|
if (A._overflow !== "hidden") {
|
|
A.style.overflow = "hidden"
|
|
}
|
|
return A
|
|
},
|
|
undoClipping: function(A) {
|
|
A = $(A);
|
|
if (!A._overflow) {
|
|
return A
|
|
}
|
|
A.style.overflow = A._overflow == "auto" ? "" : A._overflow;
|
|
A._overflow = null;
|
|
return A
|
|
},
|
|
cumulativeOffset: function(B) {
|
|
var A = 0,
|
|
C = 0;
|
|
do {
|
|
A += B.offsetTop || 0;
|
|
C += B.offsetLeft || 0;
|
|
B = B.offsetParent
|
|
} while (B);
|
|
return Element._returnOffset(C, A)
|
|
},
|
|
positionedOffset: function(B) {
|
|
var A = 0,
|
|
D = 0;
|
|
do {
|
|
A += B.offsetTop || 0;
|
|
D += B.offsetLeft || 0;
|
|
B = B.offsetParent;
|
|
if (B) {
|
|
if (B.tagName == "BODY") {
|
|
break
|
|
}
|
|
var C = Element.getStyle(B, "position");
|
|
if (C !== "static") {
|
|
break
|
|
}
|
|
}
|
|
} while (B);
|
|
return Element._returnOffset(D, A)
|
|
},
|
|
absolutize: function(B) {
|
|
B = $(B);
|
|
if (B.getStyle("position") == "absolute") {
|
|
return
|
|
}
|
|
var D = B.positionedOffset();
|
|
var F = D[1];
|
|
var E = D[0];
|
|
var C = B.clientWidth;
|
|
var A = B.clientHeight;
|
|
B._originalLeft = E - parseFloat(B.style.left || 0);
|
|
B._originalTop = F - parseFloat(B.style.top || 0);
|
|
B._originalWidth = B.style.width;
|
|
B._originalHeight = B.style.height;
|
|
B.style.position = "absolute";
|
|
B.style.top = F + "px";
|
|
B.style.left = E + "px";
|
|
B.style.width = C + "px";
|
|
B.style.height = A + "px";
|
|
return B
|
|
},
|
|
relativize: function(A) {
|
|
A = $(A);
|
|
if (A.getStyle("position") == "relative") {
|
|
return
|
|
}
|
|
A.style.position = "relative";
|
|
var C = parseFloat(A.style.top || 0) - (A._originalTop || 0);
|
|
var B = parseFloat(A.style.left || 0) - (A._originalLeft || 0);
|
|
A.style.top = C + "px";
|
|
A.style.left = B + "px";
|
|
A.style.height = A._originalHeight;
|
|
A.style.width = A._originalWidth;
|
|
return A
|
|
},
|
|
cumulativeScrollOffset: function(B) {
|
|
var A = 0,
|
|
C = 0;
|
|
do {
|
|
A += B.scrollTop || 0;
|
|
C += B.scrollLeft || 0;
|
|
B = B.parentNode
|
|
} while (B);
|
|
return Element._returnOffset(C, A)
|
|
},
|
|
getOffsetParent: function(A) {
|
|
if (A.offsetParent) {
|
|
return $(A.offsetParent)
|
|
}
|
|
if (A == document.body) {
|
|
return $(A)
|
|
}
|
|
while ((A = A.parentNode) && A != document.body) {
|
|
if (Element.getStyle(A, "position") != "static") {
|
|
return $(A)
|
|
}
|
|
}
|
|
return $(document.body)
|
|
},
|
|
viewportOffset: function(D) {
|
|
var A = 0,
|
|
C = 0;
|
|
var B = D;
|
|
do {
|
|
A += B.offsetTop || 0;
|
|
C += B.offsetLeft || 0;
|
|
if (B.offsetParent == document.body && Element.getStyle(B, "position") == "absolute") {
|
|
break
|
|
}
|
|
} while (B = B.offsetParent);
|
|
B = D;
|
|
do {
|
|
if (!Prototype.Browser.Opera || B.tagName == "BODY") {
|
|
A -= B.scrollTop || 0;
|
|
C -= B.scrollLeft || 0
|
|
}
|
|
} while (B = B.parentNode);
|
|
return Element._returnOffset(C, A)
|
|
},
|
|
clonePosition: function(B, D) {
|
|
var A = Object.extend({
|
|
setLeft: true,
|
|
setTop: true,
|
|
setWidth: true,
|
|
setHeight: true,
|
|
offsetTop: 0,
|
|
offsetLeft: 0
|
|
}, arguments[2] || {});
|
|
D = $(D);
|
|
var E = D.viewportOffset();
|
|
B = $(B);
|
|
var F = [0, 0];
|
|
var C = null;
|
|
if (Element.getStyle(B, "position") == "absolute") {
|
|
C = B.getOffsetParent();
|
|
F = C.viewportOffset()
|
|
}
|
|
if (C == document.body) {
|
|
F[0] -= document.body.offsetLeft;
|
|
F[1] -= document.body.offsetTop
|
|
}
|
|
if (A.setLeft) {
|
|
B.style.left = (E[0] - F[0] + A.offsetLeft) + "px"
|
|
}
|
|
if (A.setTop) {
|
|
B.style.top = (E[1] - F[1] + A.offsetTop) + "px"
|
|
}
|
|
if (A.setWidth) {
|
|
B.style.width = D.offsetWidth + "px"
|
|
}
|
|
if (A.setHeight) {
|
|
B.style.height = D.offsetHeight + "px"
|
|
}
|
|
return B
|
|
}
|
|
};
|
|
Element.Methods.identify.counter = 1;
|
|
Object.extend(Element.Methods, {
|
|
getElementsBySelector: Element.Methods.select,
|
|
childElements: Element.Methods.immediateDescendants
|
|
});
|
|
Element._attributeTranslations = {
|
|
write: {
|
|
names: {
|
|
className: "class",
|
|
htmlFor: "for"
|
|
},
|
|
values: {}
|
|
}
|
|
};
|
|
if (Prototype.Browser.Opera) {
|
|
Element.Methods.getStyle = Element.Methods.getStyle.wrap(function(D, B, C) {
|
|
switch (C) {
|
|
case "left":
|
|
case "top":
|
|
case "right":
|
|
case "bottom":
|
|
if (D(B, "position") === "static") {
|
|
return null
|
|
}
|
|
case "height":
|
|
case "width":
|
|
if (!Element.visible(B)) {
|
|
return null
|
|
}
|
|
var E = parseInt(D(B, C), 10);
|
|
if (E !== B["offset" + C.capitalize()]) {
|
|
return E + "px"
|
|
}
|
|
var A;
|
|
if (C === "height") {
|
|
A = ["border-top-width", "padding-top", "padding-bottom", "border-bottom-width"]
|
|
} else {
|
|
A = ["border-left-width", "padding-left", "padding-right", "border-right-width"]
|
|
}
|
|
return A.inject(E, function(F, G) {
|
|
var H = D(B, G);
|
|
return H === null ? F : F - parseInt(H, 10)
|
|
}) + "px";
|
|
default:
|
|
return D(B, C)
|
|
}
|
|
});
|
|
Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(function(C, A, B) {
|
|
if (B === "title") {
|
|
return A.title
|
|
}
|
|
return C(A, B)
|
|
})
|
|
} else {
|
|
if (Prototype.Browser.IE) {
|
|
Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(function(C, B) {
|
|
B = $(B);
|
|
var A = B.getStyle("position");
|
|
if (A !== "static") {
|
|
return C(B)
|
|
}
|
|
B.setStyle({
|
|
position: "relative"
|
|
});
|
|
var D = C(B);
|
|
B.setStyle({
|
|
position: A
|
|
});
|
|
return D
|
|
});
|
|
$w("positionedOffset viewportOffset").each(function(A) {
|
|
Element.Methods[A] = Element.Methods[A].wrap(function(E, C) {
|
|
C = $(C);
|
|
var B = C.getStyle("position");
|
|
if (B !== "static") {
|
|
return E(C)
|
|
}
|
|
var D = C.getOffsetParent();
|
|
if (D && D.getStyle("position") === "fixed") {
|
|
D.setStyle({
|
|
zoom: 1
|
|
})
|
|
}
|
|
C.setStyle({
|
|
position: "relative"
|
|
});
|
|
var F = E(C);
|
|
C.setStyle({
|
|
position: B
|
|
});
|
|
return F
|
|
})
|
|
});
|
|
Element.Methods.getStyle = function(A, B) {
|
|
A = $(A);
|
|
B = (B == "float" || B == "cssFloat") ? "styleFloat" : B.camelize();
|
|
var C = A.style[B];
|
|
if (!C && A.currentStyle) {
|
|
C = A.currentStyle[B]
|
|
}
|
|
if (B == "opacity") {
|
|
if (C = (A.getStyle("filter") || "").match(/alpha\(opacity=(.*)\)/)) {
|
|
if (C[1]) {
|
|
return parseFloat(C[1]) / 100
|
|
}
|
|
}
|
|
return 1
|
|
}
|
|
if (C == "auto") {
|
|
if ((B == "width" || B == "height") && (A.getStyle("display") != "none")) {
|
|
return A["offset" + B.capitalize()] + "px"
|
|
}
|
|
return null
|
|
}
|
|
return C
|
|
};
|
|
Element.Methods.setOpacity = function(B, E) {
|
|
function F(G) {
|
|
return G.replace(/alpha\([^\)]*\)/gi, "")
|
|
}
|
|
B = $(B);
|
|
var A = B.currentStyle;
|
|
if ((A && !A.hasLayout) || (!A && B.style.zoom == "normal")) {
|
|
B.style.zoom = 1
|
|
}
|
|
var D = B.getStyle("filter"),
|
|
C = B.style;
|
|
if (E == 1 || E === "") {
|
|
(D = F(D)) ? C.filter = D: C.removeAttribute("filter");
|
|
return B
|
|
} else {
|
|
if (E < 0.00001) {
|
|
E = 0
|
|
}
|
|
}
|
|
C.filter = F(D) + "alpha(opacity=" + (E * 100) + ")";
|
|
return B
|
|
};
|
|
Element._attributeTranslations = {
|
|
read: {
|
|
names: {
|
|
"class": "className",
|
|
"for": "htmlFor"
|
|
},
|
|
values: {
|
|
_getAttr: function(A, B) {
|
|
return A.getAttribute(B, 2)
|
|
},
|
|
_getAttrNode: function(A, C) {
|
|
var B = A.getAttributeNode(C);
|
|
return B ? B.value : ""
|
|
},
|
|
_getEv: function(A, B) {
|
|
B = A.getAttribute(B);
|
|
return B ? B.toString().slice(23, -2) : null
|
|
},
|
|
_flag: function(A, B) {
|
|
return $(A).hasAttribute(B) ? B : null
|
|
},
|
|
style: function(A) {
|
|
return A.style.cssText.toLowerCase()
|
|
},
|
|
title: function(A) {
|
|
return A.title
|
|
}
|
|
}
|
|
}
|
|
};
|
|
Element._attributeTranslations.write = {
|
|
names: Object.extend({
|
|
cellpadding: "cellPadding",
|
|
cellspacing: "cellSpacing"
|
|
}, Element._attributeTranslations.read.names),
|
|
values: {
|
|
checked: function(A, B) {
|
|
A.checked = !!B
|
|
},
|
|
style: function(A, B) {
|
|
A.style.cssText = B ? B : ""
|
|
}
|
|
}
|
|
};
|
|
Element._attributeTranslations.has = {};
|
|
$w("colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc").each(function(A) {
|
|
Element._attributeTranslations.write.names[A.toLowerCase()] = A;
|
|
Element._attributeTranslations.has[A.toLowerCase()] = A
|
|
});
|
|
(function(A) {
|
|
Object.extend(A, {
|
|
href: A._getAttr,
|
|
src: A._getAttr,
|
|
type: A._getAttr,
|
|
action: A._getAttrNode,
|
|
disabled: A._flag,
|
|
checked: A._flag,
|
|
readonly: A._flag,
|
|
multiple: A._flag,
|
|
onload: A._getEv,
|
|
onunload: A._getEv,
|
|
onclick: A._getEv,
|
|
ondblclick: A._getEv,
|
|
onmousedown: A._getEv,
|
|
onmouseup: A._getEv,
|
|
onmouseover: A._getEv,
|
|
onmousemove: A._getEv,
|
|
onmouseout: A._getEv,
|
|
onfocus: A._getEv,
|
|
onblur: A._getEv,
|
|
onkeypress: A._getEv,
|
|
onkeydown: A._getEv,
|
|
onkeyup: A._getEv,
|
|
onsubmit: A._getEv,
|
|
onreset: A._getEv,
|
|
onselect: A._getEv,
|
|
onchange: A._getEv
|
|
})
|
|
})(Element._attributeTranslations.read.values)
|
|
} else {
|
|
if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
|
|
Element.Methods.setOpacity = function(A, B) {
|
|
A = $(A);
|
|
A.style.opacity = (B == 1) ? 0.999999 : (B === "") ? "" : (B < 0.00001) ? 0 : B;
|
|
return A
|
|
}
|
|
} else {
|
|
if (Prototype.Browser.WebKit) {
|
|
Element.Methods.setOpacity = function(A, B) {
|
|
A = $(A);
|
|
A.style.opacity = (B == 1 || B === "") ? "" : (B < 0.00001) ? 0 : B;
|
|
if (B == 1) {
|
|
if (A.tagName == "IMG" && A.width) {
|
|
A.width++;
|
|
A.width--
|
|
} else {
|
|
try {
|
|
var D = document.createTextNode(" ");
|
|
A.appendChild(D);
|
|
A.removeChild(D)
|
|
} catch (C) {}
|
|
}
|
|
}
|
|
return A
|
|
};
|
|
Element.Methods.cumulativeOffset = function(B) {
|
|
var A = 0,
|
|
C = 0;
|
|
do {
|
|
A += B.offsetTop || 0;
|
|
C += B.offsetLeft || 0;
|
|
if (B.offsetParent == document.body) {
|
|
if (Element.getStyle(B, "position") == "absolute") {
|
|
break
|
|
}
|
|
}
|
|
B = B.offsetParent
|
|
} while (B);
|
|
return Element._returnOffset(C, A)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (Prototype.Browser.IE || Prototype.Browser.Opera) {
|
|
Element.Methods.update = function(B, C) {
|
|
B = $(B);
|
|
if (C && C.toElement) {
|
|
C = C.toElement()
|
|
}
|
|
if (Object.isElement(C)) {
|
|
return B.update().insert(C)
|
|
}
|
|
C = Object.toHTML(C);
|
|
var A = B.tagName.toUpperCase();
|
|
if (A in Element._insertionTranslations.tags) {
|
|
$A(B.childNodes).each(function(D) {
|
|
B.removeChild(D)
|
|
});
|
|
Element._getContentFromAnonymousElement(A, C.stripScripts()).each(function(D) {
|
|
B.appendChild(D)
|
|
})
|
|
} else {
|
|
B.innerHTML = C.stripScripts()
|
|
}
|
|
C.evalScripts.bind(C).defer();
|
|
return B
|
|
}
|
|
}
|
|
if ("outerHTML" in document.createElement("div")) {
|
|
Element.Methods.replace = function(C, E) {
|
|
C = $(C);
|
|
if (E && E.toElement) {
|
|
E = E.toElement()
|
|
}
|
|
if (Object.isElement(E)) {
|
|
C.parentNode.replaceChild(E, C);
|
|
return C
|
|
}
|
|
E = Object.toHTML(E);
|
|
var D = C.parentNode,
|
|
B = D.tagName.toUpperCase();
|
|
if (Element._insertionTranslations.tags[B]) {
|
|
var F = C.next();
|
|
var A = Element._getContentFromAnonymousElement(B, E.stripScripts());
|
|
D.removeChild(C);
|
|
if (F) {
|
|
A.each(function(G) {
|
|
D.insertBefore(G, F)
|
|
})
|
|
} else {
|
|
A.each(function(G) {
|
|
D.appendChild(G)
|
|
})
|
|
}
|
|
} else {
|
|
C.outerHTML = E.stripScripts()
|
|
}
|
|
E.evalScripts.bind(E).defer();
|
|
return C
|
|
}
|
|
}
|
|
Element._returnOffset = function(B, C) {
|
|
var A = [B, C];
|
|
A.left = B;
|
|
A.top = C;
|
|
return A
|
|
};
|
|
Element._getContentFromAnonymousElement = function(C, B) {
|
|
var D = new Element("div"),
|
|
A = Element._insertionTranslations.tags[C];
|
|
if (A) {
|
|
D.innerHTML = A[0] + B + A[1];
|
|
A[2].times(function() {
|
|
D = D.firstChild
|
|
})
|
|
} else {
|
|
D.innerHTML = B
|
|
}
|
|
return $A(D.childNodes)
|
|
};
|
|
Element._insertionTranslations = {
|
|
before: function(A, B) {
|
|
A.parentNode.insertBefore(B, A)
|
|
},
|
|
top: function(A, B) {
|
|
A.insertBefore(B, A.firstChild)
|
|
},
|
|
bottom: function(A, B) {
|
|
A.appendChild(B)
|
|
},
|
|
after: function(A, B) {
|
|
A.parentNode.insertBefore(B, A.nextSibling)
|
|
},
|
|
tags: {
|
|
TABLE: ["<table>", "</table>", 1],
|
|
TBODY: ["<table><tbody>", "</tbody></table>", 2],
|
|
TR: ["<table><tbody><tr>", "</tr></tbody></table>", 3],
|
|
TD: ["<table><tbody><tr><td>", "</td></tr></tbody></table>", 4],
|
|
SELECT: ["<select>", "</select>", 1]
|
|
}
|
|
};
|
|
(function() {
|
|
Object.extend(this.tags, {
|
|
THEAD: this.tags.TBODY,
|
|
TFOOT: this.tags.TBODY,
|
|
TH: this.tags.TD
|
|
})
|
|
}).call(Element._insertionTranslations);
|
|
Element.Methods.Simulated = {
|
|
hasAttribute: function(A, C) {
|
|
C = Element._attributeTranslations.has[C] || C;
|
|
var B = $(A).getAttributeNode(C);
|
|
return B && B.specified
|
|
}
|
|
};
|
|
Element.Methods.ByTag = {};
|
|
Object.extend(Element, Element.Methods);
|
|
if (!Prototype.BrowserFeatures.ElementExtensions && document.createElement("div").__proto__) {
|
|
window.HTMLElement = {};
|
|
window.HTMLElement.prototype = document.createElement("div").__proto__;
|
|
Prototype.BrowserFeatures.ElementExtensions = true
|
|
}
|
|
Element.extend = (function() {
|
|
if (Prototype.BrowserFeatures.SpecificElementExtensions) {
|
|
return Prototype.K
|
|
}
|
|
var A = {},
|
|
B = Element.Methods.ByTag;
|
|
var C = Object.extend(function(F) {
|
|
if (!F || F._extendedByPrototype || F.nodeType != 1 || F == window) {
|
|
return F
|
|
}
|
|
var D = Object.clone(A),
|
|
E = F.tagName,
|
|
H, G;
|
|
if (B[E]) {
|
|
Object.extend(D, B[E])
|
|
}
|
|
for (H in D) {
|
|
G = D[H];
|
|
if (Object.isFunction(G) && !(H in F)) {
|
|
F[H] = G.methodize()
|
|
}
|
|
}
|
|
F._extendedByPrototype = Prototype.emptyFunction;
|
|
return F
|
|
}, {
|
|
refresh: function() {
|
|
if (!Prototype.BrowserFeatures.ElementExtensions) {
|
|
Object.extend(A, Element.Methods);
|
|
Object.extend(A, Element.Methods.Simulated)
|
|
}
|
|
}
|
|
});
|
|
C.refresh();
|
|
return C
|
|
})();
|
|
Element.hasAttribute = function(A, B) {
|
|
if (A.hasAttribute) {
|
|
return A.hasAttribute(B)
|
|
}
|
|
return Element.Methods.Simulated.hasAttribute(A, B)
|
|
};
|
|
Element.addMethods = function(C) {
|
|
var I = Prototype.BrowserFeatures,
|
|
D = Element.Methods.ByTag;
|
|
if (!C) {
|
|
Object.extend(Form, Form.Methods);
|
|
Object.extend(Form.Element, Form.Element.Methods);
|
|
Object.extend(Element.Methods.ByTag, {
|
|
FORM: Object.clone(Form.Methods),
|
|
INPUT: Object.clone(Form.Element.Methods),
|
|
SELECT: Object.clone(Form.Element.Methods),
|
|
TEXTAREA: Object.clone(Form.Element.Methods)
|
|
})
|
|
}
|
|
if (arguments.length == 2) {
|
|
var B = C;
|
|
C = arguments[1]
|
|
}
|
|
if (!B) {
|
|
Object.extend(Element.Methods, C || {})
|
|
} else {
|
|
if (Object.isArray(B)) {
|
|
B.each(H)
|
|
} else {
|
|
H(B)
|
|
}
|
|
}
|
|
|
|
function H(F) {
|
|
F = F.toUpperCase();
|
|
if (!Element.Methods.ByTag[F]) {
|
|
Element.Methods.ByTag[F] = {}
|
|
}
|
|
Object.extend(Element.Methods.ByTag[F], C)
|
|
}
|
|
|
|
function A(L, K, F) {
|
|
F = F || false;
|
|
for (var N in L) {
|
|
var M = L[N];
|
|
if (!Object.isFunction(M)) {
|
|
continue
|
|
}
|
|
if (!F || !(N in K)) {
|
|
K[N] = M.methodize()
|
|
}
|
|
}
|
|
}
|
|
|
|
function E(L) {
|
|
var F;
|
|
var K = {
|
|
OPTGROUP: "OptGroup",
|
|
TEXTAREA: "TextArea",
|
|
P: "Paragraph",
|
|
FIELDSET: "FieldSet",
|
|
UL: "UList",
|
|
OL: "OList",
|
|
DL: "DList",
|
|
DIR: "Directory",
|
|
H1: "Heading",
|
|
H2: "Heading",
|
|
H3: "Heading",
|
|
H4: "Heading",
|
|
H5: "Heading",
|
|
H6: "Heading",
|
|
Q: "Quote",
|
|
INS: "Mod",
|
|
DEL: "Mod",
|
|
A: "Anchor",
|
|
IMG: "Image",
|
|
CAPTION: "TableCaption",
|
|
COL: "TableCol",
|
|
COLGROUP: "TableCol",
|
|
THEAD: "TableSection",
|
|
TFOOT: "TableSection",
|
|
TBODY: "TableSection",
|
|
TR: "TableRow",
|
|
TH: "TableCell",
|
|
TD: "TableCell",
|
|
FRAMESET: "FrameSet",
|
|
IFRAME: "IFrame"
|
|
};
|
|
if (K[L]) {
|
|
F = "HTML" + K[L] + "Element"
|
|
}
|
|
if (window[F]) {
|
|
return window[F]
|
|
}
|
|
F = "HTML" + L + "Element";
|
|
if (window[F]) {
|
|
return window[F]
|
|
}
|
|
F = "HTML" + L.capitalize() + "Element";
|
|
if (window[F]) {
|
|
return window[F]
|
|
}
|
|
window[F] = {};
|
|
window[F].prototype = document.createElement(L).__proto__;
|
|
return window[F]
|
|
}
|
|
if (I.ElementExtensions) {
|
|
A(Element.Methods, HTMLElement.prototype);
|
|
A(Element.Methods.Simulated, HTMLElement.prototype, true)
|
|
}
|
|
if (I.SpecificElementExtensions) {
|
|
for (var J in Element.Methods.ByTag) {
|
|
var G = E(J);
|
|
if (Object.isUndefined(G)) {
|
|
continue
|
|
}
|
|
A(D[J], G.prototype)
|
|
}
|
|
}
|
|
Object.extend(Element, Element.Methods);
|
|
delete Element.ByTag;
|
|
if (Element.extend.refresh) {
|
|
Element.extend.refresh()
|
|
}
|
|
Element.cache = {}
|
|
};
|
|
document.viewport = {
|
|
getDimensions: function() {
|
|
var A = {};
|
|
var C = Prototype.Browser;
|
|
$w("width height").each(function(E) {
|
|
var B = E.capitalize();
|
|
A[E] = (C.WebKit && !document.evaluate) ? self["inner" + B] : (C.Opera) ? document.body["client" + B] : document.documentElement["client" + B]
|
|
});
|
|
return A
|
|
},
|
|
getWidth: function() {
|
|
return this.getDimensions().width
|
|
},
|
|
getHeight: function() {
|
|
return this.getDimensions().height
|
|
},
|
|
getScrollOffsets: function() {
|
|
return Element._returnOffset(window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop)
|
|
}
|
|
};
|
|
var Selector = Class.create({
|
|
initialize: function(A) {
|
|
this.expression = A.strip();
|
|
this.compileMatcher()
|
|
},
|
|
shouldUseXPath: function() {
|
|
if (!Prototype.BrowserFeatures.XPath) {
|
|
return false
|
|
}
|
|
var A = this.expression;
|
|
if (Prototype.Browser.WebKit && (A.include("-of-type") || A.include(":empty"))) {
|
|
return false
|
|
}
|
|
if ((/(\[[\w-]*?:|:checked)/).test(this.expression)) {
|
|
return false
|
|
}
|
|
return true
|
|
},
|
|
compileMatcher: function() {
|
|
if (this.shouldUseXPath()) {
|
|
return this.compileXPathMatcher()
|
|
}
|
|
var e = this.expression,
|
|
ps = Selector.patterns,
|
|
h = Selector.handlers,
|
|
c = Selector.criteria,
|
|
le, p, m;
|
|
if (Selector._cache[e]) {
|
|
this.matcher = Selector._cache[e];
|
|
return
|
|
}
|
|
this.matcher = ["this.matcher = function(root) {", "var r = root, h = Selector.handlers, c = false, n;"];
|
|
while (e && le != e && (/\S/).test(e)) {
|
|
le = e;
|
|
for (var i in ps) {
|
|
p = ps[i];
|
|
if (m = e.match(p)) {
|
|
this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : new Template(c[i]).evaluate(m));
|
|
e = e.replace(m[0], "");
|
|
break
|
|
}
|
|
}
|
|
}
|
|
this.matcher.push("return h.unique(n);\n}");
|
|
eval(this.matcher.join("\n"));
|
|
Selector._cache[this.expression] = this.matcher
|
|
},
|
|
compileXPathMatcher: function() {
|
|
var E = this.expression,
|
|
F = Selector.patterns,
|
|
B = Selector.xpath,
|
|
D, A;
|
|
if (Selector._cache[E]) {
|
|
this.xpath = Selector._cache[E];
|
|
return
|
|
}
|
|
this.matcher = [".//*"];
|
|
while (E && D != E && (/\S/).test(E)) {
|
|
D = E;
|
|
for (var C in F) {
|
|
if (A = E.match(F[C])) {
|
|
this.matcher.push(Object.isFunction(B[C]) ? B[C](A) : new Template(B[C]).evaluate(A));
|
|
E = E.replace(A[0], "");
|
|
break
|
|
}
|
|
}
|
|
}
|
|
this.xpath = this.matcher.join("");
|
|
Selector._cache[this.expression] = this.xpath
|
|
},
|
|
findElements: function(A) {
|
|
A = A || document;
|
|
if (this.xpath) {
|
|
return document._getElementsByXPath(this.xpath, A)
|
|
}
|
|
return this.matcher(A)
|
|
},
|
|
match: function(H) {
|
|
this.tokens = [];
|
|
var L = this.expression,
|
|
A = Selector.patterns,
|
|
E = Selector.assertions;
|
|
var B, D, F;
|
|
while (L && B !== L && (/\S/).test(L)) {
|
|
B = L;
|
|
for (var I in A) {
|
|
D = A[I];
|
|
if (F = L.match(D)) {
|
|
if (E[I]) {
|
|
this.tokens.push([I, Object.clone(F)]);
|
|
L = L.replace(F[0], "")
|
|
} else {
|
|
return this.findElements(document).include(H)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var K = true,
|
|
C, J;
|
|
for (var I = 0, G; G = this.tokens[I]; I++) {
|
|
C = G[0], J = G[1];
|
|
if (!Selector.assertions[C](H, J)) {
|
|
K = false;
|
|
break
|
|
}
|
|
}
|
|
return K
|
|
},
|
|
toString: function() {
|
|
return this.expression
|
|
},
|
|
inspect: function() {
|
|
return "#<Selector:" + this.expression.inspect() + ">"
|
|
}
|
|
});
|
|
Object.extend(Selector, {
|
|
_cache: {},
|
|
xpath: {
|
|
descendant: "//*",
|
|
child: "/*",
|
|
adjacent: "/following-sibling::*[1]",
|
|
laterSibling: "/following-sibling::*",
|
|
tagName: function(A) {
|
|
if (A[1] == "*") {
|
|
return ""
|
|
}
|
|
return "[local-name()='" + A[1].toLowerCase() + "' or local-name()='" + A[1].toUpperCase() + "']"
|
|
},
|
|
className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
|
|
id: "[@id='#{1}']",
|
|
attrPresence: function(A) {
|
|
A[1] = A[1].toLowerCase();
|
|
return new Template("[@#{1}]").evaluate(A)
|
|
},
|
|
attr: function(A) {
|
|
A[1] = A[1].toLowerCase();
|
|
A[3] = A[5] || A[6];
|
|
return new Template(Selector.xpath.operators[A[2]]).evaluate(A)
|
|
},
|
|
pseudo: function(A) {
|
|
var B = Selector.xpath.pseudos[A[1]];
|
|
if (!B) {
|
|
return ""
|
|
}
|
|
if (Object.isFunction(B)) {
|
|
return B(A)
|
|
}
|
|
return new Template(Selector.xpath.pseudos[A[1]]).evaluate(A)
|
|
},
|
|
operators: {
|
|
"=": "[@#{1}='#{3}']",
|
|
"!=": "[@#{1}!='#{3}']",
|
|
"^=": "[starts-with(@#{1}, '#{3}')]",
|
|
"$=": "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
|
|
"*=": "[contains(@#{1}, '#{3}')]",
|
|
"~=": "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
|
|
"|=": "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
|
|
},
|
|
pseudos: {
|
|
"first-child": "[not(preceding-sibling::*)]",
|
|
"last-child": "[not(following-sibling::*)]",
|
|
"only-child": "[not(preceding-sibling::* or following-sibling::*)]",
|
|
empty: "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
|
|
checked: "[@checked]",
|
|
disabled: "[@disabled]",
|
|
enabled: "[not(@disabled)]",
|
|
not: function(B) {
|
|
var H = B[6],
|
|
G = Selector.patterns,
|
|
A = Selector.xpath,
|
|
E, C;
|
|
var F = [];
|
|
while (H && E != H && (/\S/).test(H)) {
|
|
E = H;
|
|
for (var D in G) {
|
|
if (B = H.match(G[D])) {
|
|
C = Object.isFunction(A[D]) ? A[D](B) : new Template(A[D]).evaluate(B);
|
|
F.push("(" + C.substring(1, C.length - 1) + ")");
|
|
H = H.replace(B[0], "");
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return "[not(" + F.join(" and ") + ")]"
|
|
},
|
|
"nth-child": function(A) {
|
|
return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", A)
|
|
},
|
|
"nth-last-child": function(A) {
|
|
return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", A)
|
|
},
|
|
"nth-of-type": function(A) {
|
|
return Selector.xpath.pseudos.nth("position() ", A)
|
|
},
|
|
"nth-last-of-type": function(A) {
|
|
return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", A)
|
|
},
|
|
"first-of-type": function(A) {
|
|
A[6] = "1";
|
|
return Selector.xpath.pseudos["nth-of-type"](A)
|
|
},
|
|
"last-of-type": function(A) {
|
|
A[6] = "1";
|
|
return Selector.xpath.pseudos["nth-last-of-type"](A)
|
|
},
|
|
"only-of-type": function(A) {
|
|
var B = Selector.xpath.pseudos;
|
|
return B["first-of-type"](A) + B["last-of-type"](A)
|
|
},
|
|
nth: function(E, C) {
|
|
var F, G = C[6],
|
|
B;
|
|
if (G == "even") {
|
|
G = "2n+0"
|
|
}
|
|
if (G == "odd") {
|
|
G = "2n+1"
|
|
}
|
|
if (F = G.match(/^(\d+)$/)) {
|
|
return "[" + E + "= " + F[1] + "]"
|
|
}
|
|
if (F = G.match(/^(-?\d*)?n(([+-])(\d+))?/)) {
|
|
if (F[1] == "-") {
|
|
F[1] = -1
|
|
}
|
|
var D = F[1] ? Number(F[1]) : 1;
|
|
var A = F[2] ? Number(F[2]) : 0;
|
|
B = "[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]";
|
|
return new Template(B).evaluate({
|
|
fragment: E,
|
|
a: D,
|
|
b: A
|
|
})
|
|
}
|
|
}
|
|
}
|
|
},
|
|
criteria: {
|
|
tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
|
|
className: 'n = h.className(n, r, "#{1}", c); c = false;',
|
|
id: 'n = h.id(n, r, "#{1}", c); c = false;',
|
|
attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
|
|
attr: function(A) {
|
|
A[3] = (A[5] || A[6]);
|
|
return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(A)
|
|
},
|
|
pseudo: function(A) {
|
|
if (A[6]) {
|
|
A[6] = A[6].replace(/"/g, '\\"')
|
|
}
|
|
return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(A)
|
|
},
|
|
descendant: 'c = "descendant";',
|
|
child: 'c = "child";',
|
|
adjacent: 'c = "adjacent";',
|
|
laterSibling: 'c = "laterSibling";'
|
|
},
|
|
patterns: {
|
|
laterSibling: /^\s*~\s*/,
|
|
child: /^\s*>\s*/,
|
|
adjacent: /^\s*\+\s*/,
|
|
descendant: /^\s/,
|
|
tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
|
|
id: /^#([\w\-\*]+)(\b|$)/,
|
|
className: /^\.([\w\-\*]+)(\b|$)/,
|
|
pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
|
|
attrPresence: /^\[([\w]+)\]/,
|
|
attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
|
|
},
|
|
assertions: {
|
|
tagName: function(A, B) {
|
|
return B[1].toUpperCase() == A.tagName.toUpperCase()
|
|
},
|
|
className: function(A, B) {
|
|
return Element.hasClassName(A, B[1])
|
|
},
|
|
id: function(A, B) {
|
|
return A.id === B[1]
|
|
},
|
|
attrPresence: function(A, B) {
|
|
return Element.hasAttribute(A, B[1])
|
|
},
|
|
attr: function(B, C) {
|
|
var A = Element.readAttribute(B, C[1]);
|
|
return A && Selector.operators[C[2]](A, C[5] || C[6])
|
|
}
|
|
},
|
|
handlers: {
|
|
concat: function(B, A) {
|
|
for (var C = 0, D; D = A[C]; C++) {
|
|
B.push(D)
|
|
}
|
|
return B
|
|
},
|
|
mark: function(A) {
|
|
var D = Prototype.emptyFunction;
|
|
for (var B = 0, C; C = A[B]; B++) {
|
|
C._countedByPrototype = D
|
|
}
|
|
return A
|
|
},
|
|
unmark: function(A) {
|
|
for (var B = 0, C; C = A[B]; B++) {
|
|
C._countedByPrototype = undefined
|
|
}
|
|
return A
|
|
},
|
|
index: function(A, D, G) {
|
|
A._countedByPrototype = Prototype.emptyFunction;
|
|
if (D) {
|
|
for (var B = A.childNodes, E = B.length - 1, C = 1; E >= 0; E--) {
|
|
var F = B[E];
|
|
if (F.nodeType == 1 && (!G || F._countedByPrototype)) {
|
|
F.nodeIndex = C++
|
|
}
|
|
}
|
|
} else {
|
|
for (var E = 0, C = 1, B = A.childNodes; F = B[E]; E++) {
|
|
if (F.nodeType == 1 && (!G || F._countedByPrototype)) {
|
|
F.nodeIndex = C++
|
|
}
|
|
}
|
|
}
|
|
},
|
|
unique: function(B) {
|
|
if (B.length == 0) {
|
|
return B
|
|
}
|
|
var D = [],
|
|
E;
|
|
for (var C = 0, A = B.length; C < A; C++) {
|
|
if (!(E = B[C])._countedByPrototype) {
|
|
E._countedByPrototype = Prototype.emptyFunction;
|
|
D.push(Element.extend(E))
|
|
}
|
|
}
|
|
return Selector.handlers.unmark(D)
|
|
},
|
|
descendant: function(A) {
|
|
var D = Selector.handlers;
|
|
for (var C = 0, B = [], E; E = A[C]; C++) {
|
|
D.concat(B, E.getElementsByTagName("*"))
|
|
}
|
|
return B
|
|
},
|
|
child: function(A) {
|
|
var E = Selector.handlers;
|
|
for (var D = 0, C = [], F; F = A[D]; D++) {
|
|
for (var B = 0, G; G = F.childNodes[B]; B++) {
|
|
if (G.nodeType == 1 && G.tagName != "!") {
|
|
C.push(G)
|
|
}
|
|
}
|
|
}
|
|
return C
|
|
},
|
|
adjacent: function(A) {
|
|
for (var C = 0, B = [], E; E = A[C]; C++) {
|
|
var D = this.nextElementSibling(E);
|
|
if (D) {
|
|
B.push(D)
|
|
}
|
|
}
|
|
return B
|
|
},
|
|
laterSibling: function(A) {
|
|
var D = Selector.handlers;
|
|
for (var C = 0, B = [], E; E = A[C]; C++) {
|
|
D.concat(B, Element.nextSiblings(E))
|
|
}
|
|
return B
|
|
},
|
|
nextElementSibling: function(A) {
|
|
while (A = A.nextSibling) {
|
|
if (A.nodeType == 1) {
|
|
return A
|
|
}
|
|
}
|
|
return null
|
|
},
|
|
previousElementSibling: function(A) {
|
|
while (A = A.previousSibling) {
|
|
if (A.nodeType == 1) {
|
|
return A
|
|
}
|
|
}
|
|
return null
|
|
},
|
|
tagName: function(A, H, C, B) {
|
|
var I = C.toUpperCase();
|
|
var E = [],
|
|
G = Selector.handlers;
|
|
if (A) {
|
|
if (B) {
|
|
if (B == "descendant") {
|
|
for (var F = 0, D; D = A[F]; F++) {
|
|
G.concat(E, D.getElementsByTagName(C))
|
|
}
|
|
return E
|
|
} else {
|
|
A = this[B](A)
|
|
}
|
|
if (C == "*") {
|
|
return A
|
|
}
|
|
}
|
|
for (var F = 0, D; D = A[F]; F++) {
|
|
if (D.tagName.toUpperCase() === I) {
|
|
E.push(D)
|
|
}
|
|
}
|
|
return E
|
|
} else {
|
|
return H.getElementsByTagName(C)
|
|
}
|
|
},
|
|
id: function(B, A, H, F) {
|
|
var G = $(H),
|
|
D = Selector.handlers;
|
|
if (!G) {
|
|
return []
|
|
}
|
|
if (!B && A == document) {
|
|
return [G]
|
|
}
|
|
if (B) {
|
|
if (F) {
|
|
if (F == "child") {
|
|
for (var C = 0, E; E = B[C]; C++) {
|
|
if (G.parentNode == E) {
|
|
return [G]
|
|
}
|
|
}
|
|
} else {
|
|
if (F == "descendant") {
|
|
for (var C = 0, E; E = B[C]; C++) {
|
|
if (Element.descendantOf(G, E)) {
|
|
return [G]
|
|
}
|
|
}
|
|
} else {
|
|
if (F == "adjacent") {
|
|
for (var C = 0, E; E = B[C]; C++) {
|
|
if (Selector.handlers.previousElementSibling(G) == E) {
|
|
return [G]
|
|
}
|
|
}
|
|
} else {
|
|
B = D[F](B)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (var C = 0, E; E = B[C]; C++) {
|
|
if (E == G) {
|
|
return [G]
|
|
}
|
|
}
|
|
return []
|
|
}
|
|
return (G && Element.descendantOf(G, A)) ? [G] : []
|
|
},
|
|
className: function(B, A, C, D) {
|
|
if (B && D) {
|
|
B = this[D](B)
|
|
}
|
|
return Selector.handlers.byClassName(B, A, C)
|
|
},
|
|
byClassName: function(C, B, F) {
|
|
if (!C) {
|
|
C = Selector.handlers.descendant([B])
|
|
}
|
|
var H = " " + F + " ";
|
|
for (var E = 0, D = [], G, A; G = C[E]; E++) {
|
|
A = G.className;
|
|
if (A.length == 0) {
|
|
continue
|
|
}
|
|
if (A == F || (" " + A + " ").include(H)) {
|
|
D.push(G)
|
|
}
|
|
}
|
|
return D
|
|
},
|
|
attrPresence: function(C, B, A, G) {
|
|
if (!C) {
|
|
C = B.getElementsByTagName("*")
|
|
}
|
|
if (C && G) {
|
|
C = this[G](C)
|
|
}
|
|
var E = [];
|
|
for (var D = 0, F; F = C[D]; D++) {
|
|
if (Element.hasAttribute(F, A)) {
|
|
E.push(F)
|
|
}
|
|
}
|
|
return E
|
|
},
|
|
attr: function(A, I, H, J, C, B) {
|
|
if (!A) {
|
|
A = I.getElementsByTagName("*")
|
|
}
|
|
if (A && B) {
|
|
A = this[B](A)
|
|
}
|
|
var K = Selector.operators[C],
|
|
F = [];
|
|
for (var E = 0, D; D = A[E]; E++) {
|
|
var G = Element.readAttribute(D, H);
|
|
if (G === null) {
|
|
continue
|
|
}
|
|
if (K(G, J)) {
|
|
F.push(D)
|
|
}
|
|
}
|
|
return F
|
|
},
|
|
pseudo: function(B, C, E, A, D) {
|
|
if (B && D) {
|
|
B = this[D](B)
|
|
}
|
|
if (!B) {
|
|
B = A.getElementsByTagName("*")
|
|
}
|
|
return Selector.pseudos[C](B, E, A)
|
|
}
|
|
},
|
|
pseudos: {
|
|
"first-child": function(B, F, A) {
|
|
for (var D = 0, C = [], E; E = B[D]; D++) {
|
|
if (Selector.handlers.previousElementSibling(E)) {
|
|
continue
|
|
}
|
|
C.push(E)
|
|
}
|
|
return C
|
|
},
|
|
"last-child": function(B, F, A) {
|
|
for (var D = 0, C = [], E; E = B[D]; D++) {
|
|
if (Selector.handlers.nextElementSibling(E)) {
|
|
continue
|
|
}
|
|
C.push(E)
|
|
}
|
|
return C
|
|
},
|
|
"only-child": function(B, G, A) {
|
|
var E = Selector.handlers;
|
|
for (var D = 0, C = [], F; F = B[D]; D++) {
|
|
if (!E.previousElementSibling(F) && !E.nextElementSibling(F)) {
|
|
C.push(F)
|
|
}
|
|
}
|
|
return C
|
|
},
|
|
"nth-child": function(B, C, A) {
|
|
return Selector.pseudos.nth(B, C, A)
|
|
},
|
|
"nth-last-child": function(B, C, A) {
|
|
return Selector.pseudos.nth(B, C, A, true)
|
|
},
|
|
"nth-of-type": function(B, C, A) {
|
|
return Selector.pseudos.nth(B, C, A, false, true)
|
|
},
|
|
"nth-last-of-type": function(B, C, A) {
|
|
return Selector.pseudos.nth(B, C, A, true, true)
|
|
},
|
|
"first-of-type": function(B, C, A) {
|
|
return Selector.pseudos.nth(B, "1", A, false, true)
|
|
},
|
|
"last-of-type": function(B, C, A) {
|
|
return Selector.pseudos.nth(B, "1", A, true, true)
|
|
},
|
|
"only-of-type": function(B, D, A) {
|
|
var C = Selector.pseudos;
|
|
return C["last-of-type"](C["first-of-type"](B, D, A), D, A)
|
|
},
|
|
getIndices: function(B, A, C) {
|
|
if (B == 0) {
|
|
return A > 0 ? [A] : []
|
|
}
|
|
return $R(1, C).inject([], function(D, E) {
|
|
if (0 == (E - A) % B && (E - A) / B >= 0) {
|
|
D.push(E)
|
|
}
|
|
return D
|
|
})
|
|
},
|
|
nth: function(A, L, N, K, C) {
|
|
if (A.length == 0) {
|
|
return []
|
|
}
|
|
if (L == "even") {
|
|
L = "2n+0"
|
|
}
|
|
if (L == "odd") {
|
|
L = "2n+1"
|
|
}
|
|
var J = Selector.handlers,
|
|
I = [],
|
|
B = [],
|
|
E;
|
|
J.mark(A);
|
|
for (var H = 0, D; D = A[H]; H++) {
|
|
if (!D.parentNode._countedByPrototype) {
|
|
J.index(D.parentNode, K, C);
|
|
B.push(D.parentNode)
|
|
}
|
|
}
|
|
if (L.match(/^\d+$/)) {
|
|
L = Number(L);
|
|
for (var H = 0, D; D = A[H]; H++) {
|
|
if (D.nodeIndex == L) {
|
|
I.push(D)
|
|
}
|
|
}
|
|
} else {
|
|
if (E = L.match(/^(-?\d*)?n(([+-])(\d+))?/)) {
|
|
if (E[1] == "-") {
|
|
E[1] = -1
|
|
}
|
|
var O = E[1] ? Number(E[1]) : 1;
|
|
var M = E[2] ? Number(E[2]) : 0;
|
|
var P = Selector.pseudos.getIndices(O, M, A.length);
|
|
for (var H = 0, D, F = P.length; D = A[H]; H++) {
|
|
for (var G = 0; G < F; G++) {
|
|
if (D.nodeIndex == P[G]) {
|
|
I.push(D)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
J.unmark(A);
|
|
J.unmark(B);
|
|
return I
|
|
},
|
|
empty: function(B, F, A) {
|
|
for (var D = 0, C = [], E; E = B[D]; D++) {
|
|
if (E.tagName == "!" || (E.firstChild && !E.innerHTML.match(/^\s*$/))) {
|
|
continue
|
|
}
|
|
C.push(E)
|
|
}
|
|
return C
|
|
},
|
|
not: function(A, D, I) {
|
|
var G = Selector.handlers,
|
|
J, C;
|
|
var H = new Selector(D).findElements(I);
|
|
G.mark(H);
|
|
for (var F = 0, E = [], B; B = A[F]; F++) {
|
|
if (!B._countedByPrototype) {
|
|
E.push(B)
|
|
}
|
|
}
|
|
G.unmark(H);
|
|
return E
|
|
},
|
|
enabled: function(B, F, A) {
|
|
for (var D = 0, C = [], E; E = B[D]; D++) {
|
|
if (!E.disabled) {
|
|
C.push(E)
|
|
}
|
|
}
|
|
return C
|
|
},
|
|
disabled: function(B, F, A) {
|
|
for (var D = 0, C = [], E; E = B[D]; D++) {
|
|
if (E.disabled) {
|
|
C.push(E)
|
|
}
|
|
}
|
|
return C
|
|
},
|
|
checked: function(B, F, A) {
|
|
for (var D = 0, C = [], E; E = B[D]; D++) {
|
|
if (E.checked) {
|
|
C.push(E)
|
|
}
|
|
}
|
|
return C
|
|
}
|
|
},
|
|
operators: {
|
|
"=": function(B, A) {
|
|
return B == A
|
|
},
|
|
"!=": function(B, A) {
|
|
return B != A
|
|
},
|
|
"^=": function(B, A) {
|
|
return B.startsWith(A)
|
|
},
|
|
"$=": function(B, A) {
|
|
return B.endsWith(A)
|
|
},
|
|
"*=": function(B, A) {
|
|
return B.include(A)
|
|
},
|
|
"~=": function(B, A) {
|
|
return (" " + B + " ").include(" " + A + " ")
|
|
},
|
|
"|=": function(B, A) {
|
|
return ("-" + B.toUpperCase() + "-").include("-" + A.toUpperCase() + "-")
|
|
}
|
|
},
|
|
split: function(B) {
|
|
var A = [];
|
|
B.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(C) {
|
|
A.push(C[1].strip())
|
|
});
|
|
return A
|
|
},
|
|
matchElements: function(F, G) {
|
|
var E = $$(G),
|
|
D = Selector.handlers;
|
|
D.mark(E);
|
|
for (var C = 0, B = [], A; A = F[C]; C++) {
|
|
if (A._countedByPrototype) {
|
|
B.push(A)
|
|
}
|
|
}
|
|
D.unmark(E);
|
|
return B
|
|
},
|
|
findElement: function(B, C, A) {
|
|
if (Object.isNumber(C)) {
|
|
A = C;
|
|
C = false
|
|
}
|
|
return Selector.matchElements(B, C || "*")[A || 0]
|
|
},
|
|
findChildElements: function(E, G) {
|
|
G = Selector.split(G.join(","));
|
|
var D = [],
|
|
F = Selector.handlers;
|
|
for (var C = 0, B = G.length, A; C < B; C++) {
|
|
A = new Selector(G[C].strip());
|
|
F.concat(D, A.findElements(E))
|
|
}
|
|
return (B > 1) ? F.unique(D) : D
|
|
}
|
|
});
|
|
if (Prototype.Browser.IE) {
|
|
Object.extend(Selector.handlers, {
|
|
concat: function(B, A) {
|
|
for (var C = 0, D; D = A[C]; C++) {
|
|
if (D.tagName !== "!") {
|
|
B.push(D)
|
|
}
|
|
}
|
|
return B
|
|
},
|
|
unmark: function(A) {
|
|
for (var B = 0, C; C = A[B]; B++) {
|
|
C.removeAttribute("_countedByPrototype")
|
|
}
|
|
return A
|
|
}
|
|
})
|
|
}
|
|
|
|
function $$() {
|
|
return Selector.findChildElements(document, $A(arguments))
|
|
}
|
|
var Form = {
|
|
reset: function(A) {
|
|
$(A).reset();
|
|
return A
|
|
},
|
|
serializeElements: function(G, B) {
|
|
if (typeof B != "object") {
|
|
B = {
|
|
hash: !!B
|
|
}
|
|
} else {
|
|
if (Object.isUndefined(B.hash)) {
|
|
B.hash = true
|
|
}
|
|
}
|
|
var C, F, A = false,
|
|
E = B.submit;
|
|
var D = G.inject({}, function(H, I) {
|
|
if (!I.disabled && I.name) {
|
|
C = I.name;
|
|
F = $(I).getValue();
|
|
if (F != null && (I.type != "submit" || (!A && E !== false && (!E || C == E) && (A = true)))) {
|
|
if (C in H) {
|
|
if (!Object.isArray(H[C])) {
|
|
H[C] = [H[C]]
|
|
}
|
|
H[C].push(F)
|
|
} else {
|
|
H[C] = F
|
|
}
|
|
}
|
|
}
|
|
return H
|
|
});
|
|
return B.hash ? D : Object.toQueryString(D)
|
|
}
|
|
};
|
|
Form.Methods = {
|
|
serialize: function(B, A) {
|
|
return Form.serializeElements(Form.getElements(B), A)
|
|
},
|
|
getElements: function(A) {
|
|
return $A($(A).getElementsByTagName("*")).inject([], function(B, C) {
|
|
if (Form.Element.Serializers[C.tagName.toLowerCase()]) {
|
|
B.push(Element.extend(C))
|
|
}
|
|
return B
|
|
})
|
|
},
|
|
getInputs: function(G, C, D) {
|
|
G = $(G);
|
|
var A = G.getElementsByTagName("input");
|
|
if (!C && !D) {
|
|
return $A(A).map(Element.extend)
|
|
}
|
|
for (var E = 0, H = [], F = A.length; E < F; E++) {
|
|
var B = A[E];
|
|
if ((C && B.type != C) || (D && B.name != D)) {
|
|
continue
|
|
}
|
|
H.push(Element.extend(B))
|
|
}
|
|
return H
|
|
},
|
|
disable: function(A) {
|
|
A = $(A);
|
|
Form.getElements(A).invoke("disable");
|
|
return A
|
|
},
|
|
enable: function(A) {
|
|
A = $(A);
|
|
Form.getElements(A).invoke("enable");
|
|
return A
|
|
},
|
|
findFirstElement: function(B) {
|
|
var C = $(B).getElements().findAll(function(D) {
|
|
return "hidden" != D.type && !D.disabled
|
|
});
|
|
var A = C.findAll(function(D) {
|
|
return D.hasAttribute("tabIndex") && D.tabIndex >= 0
|
|
}).sortBy(function(D) {
|
|
return D.tabIndex
|
|
}).first();
|
|
return A ? A : C.find(function(D) {
|
|
return ["input", "select", "textarea"].include(D.tagName.toLowerCase())
|
|
})
|
|
},
|
|
focusFirstElement: function(A) {
|
|
A = $(A);
|
|
A.findFirstElement().activate();
|
|
return A
|
|
},
|
|
request: function(B, A) {
|
|
B = $(B), A = Object.clone(A || {});
|
|
var D = A.parameters,
|
|
C = B.readAttribute("action") || "";
|
|
if (C.blank()) {
|
|
C = window.location.href
|
|
}
|
|
A.parameters = B.serialize(true);
|
|
if (D) {
|
|
if (Object.isString(D)) {
|
|
D = D.toQueryParams()
|
|
}
|
|
Object.extend(A.parameters, D)
|
|
}
|
|
if (B.hasAttribute("method") && !A.method) {
|
|
A.method = B.method
|
|
}
|
|
return new Ajax.Request(C, A)
|
|
}
|
|
};
|
|
Form.Element = {
|
|
focus: function(A) {
|
|
$(A).focus();
|
|
return A
|
|
},
|
|
select: function(A) {
|
|
$(A).select();
|
|
return A
|
|
}
|
|
};
|
|
Form.Element.Methods = {
|
|
serialize: function(A) {
|
|
A = $(A);
|
|
if (!A.disabled && A.name) {
|
|
var B = A.getValue();
|
|
if (B != undefined) {
|
|
var C = {};
|
|
C[A.name] = B;
|
|
return Object.toQueryString(C)
|
|
}
|
|
}
|
|
return ""
|
|
},
|
|
getValue: function(A) {
|
|
A = $(A);
|
|
var B = A.tagName.toLowerCase();
|
|
return Form.Element.Serializers[B](A)
|
|
},
|
|
setValue: function(A, B) {
|
|
A = $(A);
|
|
var C = A.tagName.toLowerCase();
|
|
Form.Element.Serializers[C](A, B);
|
|
return A
|
|
},
|
|
clear: function(A) {
|
|
$(A).value = "";
|
|
return A
|
|
},
|
|
present: function(A) {
|
|
return $(A).value != ""
|
|
},
|
|
activate: function(A) {
|
|
A = $(A);
|
|
try {
|
|
A.focus();
|
|
if (A.select && (A.tagName.toLowerCase() != "input" || !["button", "reset", "submit"].include(A.type))) {
|
|
A.select()
|
|
}
|
|
} catch (B) {}
|
|
return A
|
|
},
|
|
disable: function(A) {
|
|
A = $(A);
|
|
A.blur();
|
|
A.disabled = true;
|
|
return A
|
|
},
|
|
enable: function(A) {
|
|
A = $(A);
|
|
A.disabled = false;
|
|
return A
|
|
}
|
|
};
|
|
var Field = Form.Element;
|
|
var $F = Form.Element.Methods.getValue;
|
|
Form.Element.Serializers = {
|
|
input: function(A, B) {
|
|
switch (A.type.toLowerCase()) {
|
|
case "checkbox":
|
|
case "radio":
|
|
return Form.Element.Serializers.inputSelector(A, B);
|
|
default:
|
|
return Form.Element.Serializers.textarea(A, B)
|
|
}
|
|
},
|
|
inputSelector: function(A, B) {
|
|
if (Object.isUndefined(B)) {
|
|
return A.checked ? A.value : null
|
|
} else {
|
|
A.checked = !!B
|
|
}
|
|
},
|
|
textarea: function(A, B) {
|
|
if (Object.isUndefined(B)) {
|
|
return A.value
|
|
} else {
|
|
A.value = B
|
|
}
|
|
},
|
|
select: function(D, A) {
|
|
if (Object.isUndefined(A)) {
|
|
return this[D.type == "select-one" ? "selectOne" : "selectMany"](D)
|
|
} else {
|
|
var C, F, G = !Object.isArray(A);
|
|
for (var B = 0, E = D.length; B < E; B++) {
|
|
C = D.options[B];
|
|
F = this.optionValue(C);
|
|
if (G) {
|
|
if (F == A) {
|
|
C.selected = true;
|
|
return
|
|
}
|
|
} else {
|
|
C.selected = A.include(F)
|
|
}
|
|
}
|
|
}
|
|
},
|
|
selectOne: function(B) {
|
|
var A = B.selectedIndex;
|
|
return A >= 0 ? this.optionValue(B.options[A]) : null
|
|
},
|
|
selectMany: function(D) {
|
|
var A, E = D.length;
|
|
if (!E) {
|
|
return null
|
|
}
|
|
for (var C = 0, A = []; C < E; C++) {
|
|
var B = D.options[C];
|
|
if (B.selected) {
|
|
A.push(this.optionValue(B))
|
|
}
|
|
}
|
|
return A
|
|
},
|
|
optionValue: function(A) {
|
|
return Element.extend(A).hasAttribute("value") ? A.value : A.text
|
|
}
|
|
};
|
|
Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
|
|
initialize: function($super, A, B, C) {
|
|
$super(C, B);
|
|
this.element = $(A);
|
|
this.lastValue = this.getValue()
|
|
},
|
|
execute: function() {
|
|
var A = this.getValue();
|
|
if (Object.isString(this.lastValue) && Object.isString(A) ? this.lastValue != A : String(this.lastValue) != String(A)) {
|
|
this.callback(this.element, A);
|
|
this.lastValue = A
|
|
}
|
|
}
|
|
});
|
|
Form.Element.Observer = Class.create(Abstract.TimedObserver, {
|
|
getValue: function() {
|
|
return Form.Element.getValue(this.element)
|
|
}
|
|
});
|
|
Form.Observer = Class.create(Abstract.TimedObserver, {
|
|
getValue: function() {
|
|
return Form.serialize(this.element)
|
|
}
|
|
});
|
|
Abstract.EventObserver = Class.create({
|
|
initialize: function(A, B) {
|
|
this.element = $(A);
|
|
this.callback = B;
|
|
this.lastValue = this.getValue();
|
|
if (this.element.tagName.toLowerCase() == "form") {
|
|
this.registerFormCallbacks()
|
|
} else {
|
|
this.registerCallback(this.element)
|
|
}
|
|
},
|
|
onElementEvent: function() {
|
|
var A = this.getValue();
|
|
if (this.lastValue != A) {
|
|
this.callback(this.element, A);
|
|
this.lastValue = A
|
|
}
|
|
},
|
|
registerFormCallbacks: function() {
|
|
Form.getElements(this.element).each(this.registerCallback, this)
|
|
},
|
|
registerCallback: function(A) {
|
|
if (A.type) {
|
|
switch (A.type.toLowerCase()) {
|
|
case "checkbox":
|
|
case "radio":
|
|
Event.observe(A, "click", this.onElementEvent.bind(this));
|
|
break;
|
|
default:
|
|
Event.observe(A, "change", this.onElementEvent.bind(this));
|
|
break
|
|
}
|
|
}
|
|
}
|
|
});
|
|
Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
|
|
getValue: function() {
|
|
return Form.Element.getValue(this.element)
|
|
}
|
|
});
|
|
Form.EventObserver = Class.create(Abstract.EventObserver, {
|
|
getValue: function() {
|
|
return Form.serialize(this.element)
|
|
}
|
|
});
|
|
if (!window.Event) {
|
|
var Event = {}
|
|
}
|
|
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,
|
|
cache: {},
|
|
relatedTarget: function(B) {
|
|
var A;
|
|
switch (B.type) {
|
|
case "mouseover":
|
|
A = B.fromElement;
|
|
break;
|
|
case "mouseout":
|
|
A = B.toElement;
|
|
break;
|
|
default:
|
|
return null
|
|
}
|
|
return Element.extend(A)
|
|
}
|
|
});
|
|
Event.Methods = (function() {
|
|
var A;
|
|
if (Prototype.Browser.IE) {
|
|
var B = {
|
|
0: 1,
|
|
1: 4,
|
|
2: 2
|
|
};
|
|
A = function(D, C) {
|
|
return D.button == B[C]
|
|
}
|
|
} else {
|
|
if (Prototype.Browser.WebKit) {
|
|
A = function(D, C) {
|
|
switch (C) {
|
|
case 0:
|
|
return D.which == 1 && !D.metaKey;
|
|
case 1:
|
|
return D.which == 1 && D.metaKey;
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
} else {
|
|
A = function(D, C) {
|
|
return D.which ? (D.which === C + 1) : (D.button === C)
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
isLeftClick: function(C) {
|
|
return A(C, 0)
|
|
},
|
|
isMiddleClick: function(C) {
|
|
return A(C, 1)
|
|
},
|
|
isRightClick: function(C) {
|
|
return A(C, 2)
|
|
},
|
|
element: function(D) {
|
|
var C = Event.extend(D).target;
|
|
return Element.extend(C.nodeType == Node.TEXT_NODE ? C.parentNode : C)
|
|
},
|
|
findElement: function(D, F) {
|
|
var C = Event.element(D);
|
|
if (!F) {
|
|
return C
|
|
}
|
|
var E = [C].concat(C.ancestors());
|
|
return Selector.findElement(E, F, 0)
|
|
},
|
|
pointer: function(C) {
|
|
return {
|
|
x: C.pageX || (C.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)),
|
|
y: C.pageY || (C.clientY + (document.documentElement.scrollTop || document.body.scrollTop))
|
|
}
|
|
},
|
|
pointerX: function(C) {
|
|
return Event.pointer(C).x
|
|
},
|
|
pointerY: function(C) {
|
|
return Event.pointer(C).y
|
|
},
|
|
stop: function(C) {
|
|
Event.extend(C);
|
|
C.preventDefault();
|
|
C.stopPropagation();
|
|
C.stopped = true
|
|
}
|
|
}
|
|
})();
|
|
Event.extend = (function() {
|
|
var A = Object.keys(Event.Methods).inject({}, function(B, C) {
|
|
B[C] = Event.Methods[C].methodize();
|
|
return B
|
|
});
|
|
if (Prototype.Browser.IE) {
|
|
Object.extend(A, {
|
|
stopPropagation: function() {
|
|
this.cancelBubble = true
|
|
},
|
|
preventDefault: function() {
|
|
this.returnValue = false
|
|
},
|
|
inspect: function() {
|
|
return "[object Event]"
|
|
}
|
|
});
|
|
return function(B) {
|
|
if (!B) {
|
|
return false
|
|
}
|
|
if (B._extendedByPrototype) {
|
|
return B
|
|
}
|
|
B._extendedByPrototype = Prototype.emptyFunction;
|
|
var C = Event.pointer(B);
|
|
Object.extend(B, {
|
|
target: B.srcElement,
|
|
relatedTarget: Event.relatedTarget(B),
|
|
pageX: C.x,
|
|
pageY: C.y
|
|
});
|
|
return Object.extend(B, A)
|
|
}
|
|
} else {
|
|
Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
|
|
Object.extend(Event.prototype, A);
|
|
return Prototype.K
|
|
}
|
|
})();
|
|
Object.extend(Event, (function() {
|
|
var B = Event.cache;
|
|
|
|
function C(J) {
|
|
if (J._prototypeEventID) {
|
|
return J._prototypeEventID[0]
|
|
}
|
|
arguments.callee.id = arguments.callee.id || 1;
|
|
return J._prototypeEventID = [++arguments.callee.id]
|
|
}
|
|
|
|
function G(J) {
|
|
if (J && J.include(":")) {
|
|
return "dataavailable"
|
|
}
|
|
return J
|
|
}
|
|
|
|
function A(J) {
|
|
return B[J] = B[J] || {}
|
|
}
|
|
|
|
function F(L, J) {
|
|
var K = A(L);
|
|
return K[J] = K[J] || []
|
|
}
|
|
|
|
function H(K, J, L) {
|
|
var O = C(K);
|
|
var N = F(O, J);
|
|
if (N.pluck("handler").include(L)) {
|
|
return false
|
|
}
|
|
var M = function(P) {
|
|
if (!Event || !Event.extend || (P.eventName && P.eventName != J)) {
|
|
return false
|
|
}
|
|
Event.extend(P);
|
|
L.call(K, P)
|
|
};
|
|
M.handler = L;
|
|
N.push(M);
|
|
return M
|
|
}
|
|
|
|
function I(M, J, K) {
|
|
var L = F(M, J);
|
|
return L.find(function(N) {
|
|
return N.handler == K
|
|
})
|
|
}
|
|
|
|
function D(M, J, K) {
|
|
var L = A(M);
|
|
if (!L[J]) {
|
|
return false
|
|
}
|
|
L[J] = L[J].without(I(M, J, K))
|
|
}
|
|
|
|
function E() {
|
|
for (var K in B) {
|
|
for (var J in B[K]) {
|
|
B[K][J] = null
|
|
}
|
|
}
|
|
}
|
|
if (window.attachEvent) {
|
|
window.attachEvent("onunload", E)
|
|
}
|
|
return {
|
|
observe: function(L, J, M) {
|
|
L = $(L);
|
|
var K = G(J);
|
|
var N = H(L, J, M);
|
|
if (!N) {
|
|
return L
|
|
}
|
|
if (L.addEventListener) {
|
|
L.addEventListener(K, N, false)
|
|
} else {
|
|
L.attachEvent("on" + K, N)
|
|
}
|
|
return L
|
|
},
|
|
stopObserving: function(L, J, M) {
|
|
L = $(L);
|
|
var O = C(L),
|
|
K = G(J);
|
|
if (!M && J) {
|
|
F(O, J).each(function(P) {
|
|
L.stopObserving(J, P.handler)
|
|
});
|
|
return L
|
|
} else {
|
|
if (!J) {
|
|
Object.keys(A(O)).each(function(P) {
|
|
L.stopObserving(P)
|
|
});
|
|
return L
|
|
}
|
|
}
|
|
var N = I(O, J, M);
|
|
if (!N) {
|
|
return L
|
|
}
|
|
if (L.removeEventListener) {
|
|
L.removeEventListener(K, N, false)
|
|
} else {
|
|
L.detachEvent("on" + K, N)
|
|
}
|
|
D(O, J, M);
|
|
return L
|
|
},
|
|
fire: function(L, K, J) {
|
|
L = $(L);
|
|
if (L == document && document.createEvent && !L.dispatchEvent) {
|
|
L = document.documentElement
|
|
}
|
|
var M;
|
|
if (document.createEvent) {
|
|
M = document.createEvent("HTMLEvents");
|
|
M.initEvent("dataavailable", true, true)
|
|
} else {
|
|
M = document.createEventObject();
|
|
M.eventType = "ondataavailable"
|
|
}
|
|
M.eventName = K;
|
|
M.memo = J || {};
|
|
if (document.createEvent) {
|
|
L.dispatchEvent(M)
|
|
} else {
|
|
L.fireEvent(M.eventType, M)
|
|
}
|
|
return Event.extend(M)
|
|
}
|
|
}
|
|
})());
|
|
Object.extend(Event, Event.Methods);
|
|
Element.addMethods({
|
|
fire: Event.fire,
|
|
observe: Event.observe,
|
|
stopObserving: Event.stopObserving
|
|
});
|
|
Object.extend(document, {
|
|
fire: Element.Methods.fire.methodize(),
|
|
observe: Element.Methods.observe.methodize(),
|
|
stopObserving: Element.Methods.stopObserving.methodize(),
|
|
loaded: false
|
|
});
|
|
(function() {
|
|
var B;
|
|
|
|
function A() {
|
|
if (document.loaded) {
|
|
return
|
|
}
|
|
if (B) {
|
|
window.clearInterval(B)
|
|
}
|
|
document.fire("dom:loaded");
|
|
document.loaded = true
|
|
}
|
|
if (document.addEventListener) {
|
|
if (Prototype.Browser.WebKit) {
|
|
B = window.setInterval(function() {
|
|
if (/loaded|complete/.test(document.readyState)) {
|
|
A()
|
|
}
|
|
}, 0);
|
|
Event.observe(window, "load", A)
|
|
} else {
|
|
document.addEventListener("DOMContentLoaded", A, false)
|
|
}
|
|
} else {
|
|
document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
|
|
$("__onDOMContentLoaded").onreadystatechange = function() {
|
|
if (this.readyState == "complete") {
|
|
this.onreadystatechange = null;
|
|
A()
|
|
}
|
|
}
|
|
}
|
|
})();
|
|
Hash.toQueryString = Object.toQueryString;
|
|
var Toggle = {
|
|
display: Element.toggle
|
|
};
|
|
Element.Methods.childOf = Element.Methods.descendantOf;
|
|
var Insertion = {
|
|
Before: function(A, B) {
|
|
return Element.insert(A, {
|
|
before: B
|
|
})
|
|
},
|
|
Top: function(A, B) {
|
|
return Element.insert(A, {
|
|
top: B
|
|
})
|
|
},
|
|
Bottom: function(A, B) {
|
|
return Element.insert(A, {
|
|
bottom: B
|
|
})
|
|
},
|
|
After: function(A, B) {
|
|
return Element.insert(A, {
|
|
after: B
|
|
})
|
|
}
|
|
};
|
|
var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
|
|
var Position = {
|
|
includeScrollOffsets: false,
|
|
prepare: function() {
|
|
this.deltaX = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
|
|
this.deltaY = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
|
|
},
|
|
within: function(B, A, C) {
|
|
if (this.includeScrollOffsets) {
|
|
return this.withinIncludingScrolloffsets(B, A, C)
|
|
}
|
|
this.xcomp = A;
|
|
this.ycomp = C;
|
|
this.offset = Element.cumulativeOffset(B);
|
|
return (C >= this.offset[1] && C < this.offset[1] + B.offsetHeight && A >= this.offset[0] && A < this.offset[0] + B.offsetWidth)
|
|
},
|
|
withinIncludingScrolloffsets: function(B, A, D) {
|
|
var C = Element.cumulativeScrollOffset(B);
|
|
this.xcomp = A + C[0] - this.deltaX;
|
|
this.ycomp = D + C[1] - this.deltaY;
|
|
this.offset = Element.cumulativeOffset(B);
|
|
return (this.ycomp >= this.offset[1] && this.ycomp < this.offset[1] + B.offsetHeight && this.xcomp >= this.offset[0] && this.xcomp < this.offset[0] + B.offsetWidth)
|
|
},
|
|
overlap: function(B, A) {
|
|
if (!B) {
|
|
return 0
|
|
}
|
|
if (B == "vertical") {
|
|
return ((this.offset[1] + A.offsetHeight) - this.ycomp) / A.offsetHeight
|
|
}
|
|
if (B == "horizontal") {
|
|
return ((this.offset[0] + A.offsetWidth) - this.xcomp) / A.offsetWidth
|
|
}
|
|
},
|
|
cumulativeOffset: Element.Methods.cumulativeOffset,
|
|
positionedOffset: Element.Methods.positionedOffset,
|
|
absolutize: function(A) {
|
|
Position.prepare();
|
|
return Element.absolutize(A)
|
|
},
|
|
relativize: function(A) {
|
|
Position.prepare();
|
|
return Element.relativize(A)
|
|
},
|
|
realOffset: Element.Methods.cumulativeScrollOffset,
|
|
offsetParent: Element.Methods.getOffsetParent,
|
|
page: Element.Methods.viewportOffset,
|
|
clone: function(B, C, A) {
|
|
A = A || {};
|
|
return Element.clonePosition(C, B, A)
|
|
}
|
|
};
|
|
if (!document.getElementsByClassName) {
|
|
document.getElementsByClassName = function(B) {
|
|
function A(C) {
|
|
return C.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + C + " ')]"
|
|
}
|
|
B.getElementsByClassName = Prototype.BrowserFeatures.XPath ? function(C, E) {
|
|
E = E.toString().strip();
|
|
var D = /\s/.test(E) ? $w(E).map(A).join("") : A(E);
|
|
return D ? document._getElementsByXPath(".//*" + D, C) : []
|
|
} : function(E, F) {
|
|
F = F.toString().strip();
|
|
var G = [],
|
|
H = (/\s/.test(F) ? $w(F) : null);
|
|
if (!H && !F) {
|
|
return G
|
|
}
|
|
var C = $(E).getElementsByTagName("*");
|
|
F = " " + F + " ";
|
|
for (var D = 0, J, I; J = C[D]; D++) {
|
|
if (J.className && (I = " " + J.className + " ") && (I.include(F) || (H && H.all(function(K) {
|
|
return !K.toString().blank() && I.include(" " + K + " ")
|
|
})))) {
|
|
G.push(Element.extend(J))
|
|
}
|
|
}
|
|
return G
|
|
};
|
|
return function(D, C) {
|
|
return $(C || document.body).getElementsByClassName(D)
|
|
}
|
|
}(Element.Methods)
|
|
}
|
|
Element.ClassNames = Class.create();
|
|
Element.ClassNames.prototype = {
|
|
initialize: function(A) {
|
|
this.element = $(A)
|
|
},
|
|
_each: function(A) {
|
|
this.element.className.split(/\s+/).select(function(B) {
|
|
return B.length > 0
|
|
})._each(A)
|
|
},
|
|
set: function(A) {
|
|
this.element.className = A
|
|
},
|
|
add: function(A) {
|
|
if (this.include(A)) {
|
|
return
|
|
}
|
|
this.set($A(this).concat(A).join(" "))
|
|
},
|
|
remove: function(A) {
|
|
if (!this.include(A)) {
|
|
return
|
|
}
|
|
this.set($A(this).without(A).join(" "))
|
|
},
|
|
toString: function() {
|
|
return $A(this).join(" ")
|
|
}
|
|
};
|
|
Object.extend(Element.ClassNames.prototype, Enumerable);
|
|
Element.addMethods();
|
|
var HabboView = {
|
|
_callbacks: [],
|
|
add: function(A) {
|
|
HabboView._callbacks.push(A)
|
|
},
|
|
run: function() {
|
|
if (HabboView._callbacks) {
|
|
HabboView._callbacks.each(function(A) {
|
|
A()
|
|
})
|
|
}
|
|
}
|
|
};
|
|
var Rounder = function() {
|
|
var C = function(J) {
|
|
var I, K;
|
|
I = document.createElement("div");
|
|
I.className = "bt";
|
|
K = document.createElement("div");
|
|
I.appendChild(K);
|
|
J.insertBefore(I, J.firstChild)
|
|
};
|
|
var H = function(J) {
|
|
var I, K;
|
|
I = document.createElement("div");
|
|
I.className = "bb";
|
|
K = document.createElement("div");
|
|
I.appendChild(K);
|
|
J.appendChild(I)
|
|
};
|
|
var G = function(J, I, U, a, Z, T) {
|
|
var W, V;
|
|
var X = document.createElement("div");
|
|
X.style.backgroundColor = I;
|
|
var S = 0;
|
|
for (W = 1; W <= Z; W++) {
|
|
var N, O, M, L;
|
|
O = Math.sqrt(1 - D(1 - W / Z)) * a;
|
|
var K = a - Math.ceil(O);
|
|
var R = Math.floor(S);
|
|
var Y = a - K - R;
|
|
var Q = document.createElement("div");
|
|
var P = X;
|
|
Q.style.margin = "0px " + K + "px";
|
|
Q.style.height = "1px";
|
|
Q.style.overflow = "hidden";
|
|
for (V = 1; V <= Y; V++) {
|
|
if (V == 1) {
|
|
if (V == Y) {
|
|
N = ((O + S) * 0.5) - R
|
|
} else {
|
|
N = 0
|
|
}
|
|
} else {
|
|
if (V == Y) {
|
|
M = Math.sqrt(1 - D((a - K - V + 1) / a)) * Z;
|
|
N = 1 - (1 - (M - (Z - W))) * (1 - (S - R)) * 0.5
|
|
} else {
|
|
L = Math.sqrt(1 - D((a - K - V) / a)) * Z;
|
|
M = Math.sqrt(1 - D((a - K - V + 1) / a)) * Z;
|
|
N = ((M + L) * 0.5) - (Z - W)
|
|
}
|
|
}
|
|
Q.style.backgroundColor = F(I, U, N);
|
|
if (T) {
|
|
P.appendChild(Q)
|
|
} else {
|
|
P.insertBefore(Q, P.firstChild)
|
|
}
|
|
P = Q;
|
|
Q = document.createElement("div");
|
|
Q.style.height = "1px";
|
|
Q.style.overflow = "hidden";
|
|
Q.style.margin = "0px 1px"
|
|
}
|
|
Q.style.backgroundColor = U;
|
|
if (T) {
|
|
P.appendChild(Q)
|
|
} else {
|
|
P.insertBefore(Q, P.firstChild)
|
|
}
|
|
S = O
|
|
}
|
|
if (T) {
|
|
J.insertBefore(X, J.firstChild)
|
|
} else {
|
|
J.appendChild(X)
|
|
}
|
|
};
|
|
var F = function(L, J, M) {
|
|
var K = [parseInt("0x" + L.substring(1, 3)), parseInt("0x" + L.substring(3, 5)), parseInt("0x" + L.substring(5, 7))];
|
|
var I = [parseInt("0x" + J.substring(1, 3)), parseInt("0x" + J.substring(3, 5)), parseInt("0x" + J.substring(5, 7))];
|
|
return "#" + ("0" + Math.round(K[0] + (I[0] - K[0]) * M).toString(16)).slice(-2).toString(16) + ("0" + Math.round(K[1] + (I[1] - K[1]) * M).toString(16)).slice(-2).toString(16) + ("0" + Math.round(K[2] + (I[2] - K[2]) * M).toString(16)).slice(-2).toString(16)
|
|
};
|
|
var E = function(J) {
|
|
var L;
|
|
try {
|
|
var K = document.defaultView.getComputedStyle(J, null);
|
|
L = K.getPropertyValue("background-color")
|
|
} catch (I) {
|
|
if (J.currentStyle) {
|
|
L = J.currentStyle.getAttribute("backgroundColor")
|
|
}
|
|
}
|
|
if ((L.indexOf("rgba") > -1 || L == "transparent") && J.parentNode) {
|
|
if (J.parentNode != document) {
|
|
L = E(J.parentNode)
|
|
} else {
|
|
L = "#FFFFFF"
|
|
}
|
|
}
|
|
if (L.indexOf("rgb") > -1 && L.indexOf("rgba") == -1) {
|
|
L = A(L)
|
|
}
|
|
if (L.length == 4) {
|
|
L = "#" + L.substring(1, 1) + L.substring(1, 1) + L.substring(2, 1) + L.substring(2, 1) + L.substring(3, 1) + L.substring(3, 1)
|
|
}
|
|
return L
|
|
};
|
|
var A = function(L) {
|
|
var J = "";
|
|
var K = /([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;
|
|
var M = K.exec(L);
|
|
for (var I = 1; I < 4; I++) {
|
|
J += ("0" + parseInt(M[I]).toString(16)).slice(-2)
|
|
}
|
|
return "#" + J
|
|
};
|
|
var D = function(I) {
|
|
return I * I
|
|
};
|
|
var B = function(M, N) {
|
|
var P = new RegExp("(^|\\s)" + N + "(\\s|$)");
|
|
var O = M.className;
|
|
var I = document.createElement("div");
|
|
I.className = M.className.replace(P, "$1cb$2");
|
|
if (M.getAttribute("id")) {
|
|
var L = M.id;
|
|
M.removeAttribute("id");
|
|
I.setAttribute("id", "");
|
|
I.id = L
|
|
}
|
|
M.className = "i3";
|
|
M.parentNode.replaceChild(I, M);
|
|
var K = document.createElement("div");
|
|
K.className = "i1";
|
|
I.appendChild(K);
|
|
var J = document.createElement("div");
|
|
J.className = "i2";
|
|
K.appendChild(J);
|
|
J.appendChild(M);
|
|
C(I);
|
|
if (O.indexOf("toponly") == -1) {
|
|
H(I)
|
|
}
|
|
M.select(".title").each(function(Q) {
|
|
if ((!Q.parentNode.className || Q.parentNode.className != "rounded-container") && !Q.parentNode.className.includes("no-rounding")) {
|
|
Rounder.addCorners(Q, 4, 4, "rounded-container")
|
|
}
|
|
})
|
|
};
|
|
return {
|
|
init: function(I) {
|
|
$$(".rounded").each(function(J) {
|
|
Rounder.addCorners(J, 8, 8)
|
|
});
|
|
if (!I) {
|
|
I = "cbb"
|
|
}
|
|
if (!document.getElementById || !document.createElement || !document.appendChild) {
|
|
return false
|
|
}
|
|
$$("." + I).reverse(false).each(function(J) {
|
|
B(J, I)
|
|
})
|
|
},
|
|
addCorners: function(N, L, K, O) {
|
|
var M = E(N);
|
|
var J = E(N.parentNode);
|
|
var I = document.createElement("div");
|
|
I.className = O || "rounded-container";
|
|
var P = N.cloneNode(true);
|
|
$(P).removeClassName("rounded");
|
|
$(P).addClassName("rounded-done");
|
|
I.appendChild(P);
|
|
N.parentNode.replaceChild(I, N);
|
|
G(I, J, M, L, K, true);
|
|
G(I, J, M, L, K, false)
|
|
},
|
|
round: function(I) {
|
|
if (!$(I)) {
|
|
return
|
|
}
|
|
if ($(I).hasClassName("cbb")) {
|
|
B(I, "cbb")
|
|
}
|
|
}
|
|
}
|
|
}();
|
|
HabboView.add(function() {
|
|
Rounder.init()
|
|
}); |