mirror of
https://github.com/swc-project/swc.git
synced 2024-12-21 12:41:54 +03:00
3737 lines
165 KiB
JavaScript
3737 lines
165 KiB
JavaScript
!function() {
|
|
this.MooTools = {
|
|
version: "1.4.5",
|
|
build: "ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0"
|
|
};
|
|
var typeOf = this.typeOf = function(item) {
|
|
if (null == item) return "null";
|
|
if (null != item.$family) return item.$family();
|
|
if (item.nodeName) {
|
|
if (1 == item.nodeType) return "element";
|
|
if (3 == item.nodeType) return /\S/.test(item.nodeValue) ? "textnode" : "whitespace";
|
|
} else if ("number" == typeof item.length) {
|
|
if (item.callee) return "arguments";
|
|
if ("item" in item) return "collection";
|
|
}
|
|
return typeof item;
|
|
}, instanceOf = this.instanceOf = function(item, object) {
|
|
if (null == item) return !1;
|
|
for(var constructor = item.$constructor || item.constructor; constructor;){
|
|
if (constructor === object) return !0;
|
|
constructor = constructor.parent;
|
|
}
|
|
return !!item.hasOwnProperty && item instanceof object;
|
|
}, Function = this.Function, enumerables = !0;
|
|
for(var i1 in {
|
|
toString: 1
|
|
})enumerables = null;
|
|
enumerables && (enumerables = [
|
|
"hasOwnProperty",
|
|
"valueOf",
|
|
"isPrototypeOf",
|
|
"propertyIsEnumerable",
|
|
"toLocaleString",
|
|
"toString",
|
|
"constructor"
|
|
]), Function.prototype.overloadSetter = function(usePlural) {
|
|
var self = this;
|
|
return function(a, b) {
|
|
if (null == a) return this;
|
|
if (usePlural || "string" != typeof a) {
|
|
for(var k in a)self.call(this, k, a[k]);
|
|
if (enumerables) for(var i = enumerables.length; i--;)k = enumerables[i], a.hasOwnProperty(k) && self.call(this, k, a[k]);
|
|
} else self.call(this, a, b);
|
|
return this;
|
|
};
|
|
}, Function.prototype.overloadGetter = function(usePlural) {
|
|
var self = this;
|
|
return function(a) {
|
|
var args, result;
|
|
if ("string" != typeof a ? args = a : arguments.length > 1 ? args = arguments : usePlural && (args = [
|
|
a
|
|
]), args) {
|
|
result = {};
|
|
for(var i = 0; i < args.length; i++)result[args[i]] = self.call(this, args[i]);
|
|
} else result = self.call(this, a);
|
|
return result;
|
|
};
|
|
}, Function.prototype.extend = (function(key, value) {
|
|
this[key] = value;
|
|
}).overloadSetter(), Function.prototype.implement = (function(key, value) {
|
|
this.prototype[key] = value;
|
|
}).overloadSetter();
|
|
var slice = Array.prototype.slice;
|
|
Function.from = function(item) {
|
|
return "function" == typeOf(item) ? item : function() {
|
|
return item;
|
|
};
|
|
}, Array.from = function(item) {
|
|
return null == item ? [] : Type.isEnumerable(item) && "string" != typeof item ? "array" == typeOf(item) ? item : slice.call(item) : [
|
|
item
|
|
];
|
|
}, Number.from = function(item) {
|
|
var number = parseFloat(item);
|
|
return isFinite(number) ? number : null;
|
|
}, String.from = function(item) {
|
|
return item + "";
|
|
}, Function.implement({
|
|
hide: function() {
|
|
return this.$hidden = !0, this;
|
|
},
|
|
protect: function() {
|
|
return this.$protected = !0, this;
|
|
}
|
|
});
|
|
var Type = this.Type = function(name, object) {
|
|
if (name) {
|
|
var lower = name.toLowerCase(), typeCheck = function(item) {
|
|
return typeOf(item) == lower;
|
|
};
|
|
Type["is" + name] = typeCheck, null != object && (object.prototype.$family = (function() {
|
|
return lower;
|
|
}).hide(), object.type = typeCheck);
|
|
}
|
|
return null == object ? null : (object.extend(this), object.$constructor = Type, object.prototype.$constructor = object, object);
|
|
}, toString = Object.prototype.toString;
|
|
Type.isEnumerable = function(item) {
|
|
return null != item && "number" == typeof item.length && "[object Function]" != toString.call(item);
|
|
};
|
|
var hooks1 = {}, hooksOf = function(object) {
|
|
var type = typeOf(object.prototype);
|
|
return hooks1[type] || (hooks1[type] = []);
|
|
}, implement = function(name, method) {
|
|
if (!method || !method.$hidden) {
|
|
for(var hooks = hooksOf(this), i = 0; i < hooks.length; i++){
|
|
var hook = hooks[i];
|
|
"type" == typeOf(hook) ? implement.call(hook, name, method) : hook.call(this, name, method);
|
|
}
|
|
var previous = this.prototype[name];
|
|
null != previous && previous.$protected || (this.prototype[name] = method), null == this[name] && "function" == typeOf(method) && extend.call(this, name, function(item) {
|
|
return method.apply(item, slice.call(arguments, 1));
|
|
});
|
|
}
|
|
}, extend = function(name, method) {
|
|
if (!method || !method.$hidden) {
|
|
var previous = this[name];
|
|
null != previous && previous.$protected || (this[name] = method);
|
|
}
|
|
};
|
|
Type.implement({
|
|
implement: implement.overloadSetter(),
|
|
extend: extend.overloadSetter(),
|
|
alias: (function(name, existing) {
|
|
implement.call(this, name, this.prototype[existing]);
|
|
}).overloadSetter(),
|
|
mirror: function(hook) {
|
|
return hooksOf(this).push(hook), this;
|
|
}
|
|
}), new Type("Type", Type);
|
|
var force = function(name, object, methods) {
|
|
var isType = object != Object, prototype = object.prototype;
|
|
isType && (object = new Type(name, object));
|
|
for(var i2 = 0, l1 = methods.length; i2 < l1; i2++){
|
|
var key = methods[i2], generic = object[key], proto = prototype[key];
|
|
generic && generic.protect(), isType && proto && object.implement(key, proto.protect());
|
|
}
|
|
if (isType) {
|
|
var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]);
|
|
object.forEachMethod = function(fn) {
|
|
if (!methodsEnumerable) for(var i = 0, l = methods.length; i < l; i++)fn.call(prototype, prototype[methods[i]], methods[i]);
|
|
for(var key in prototype)fn.call(prototype, prototype[key], key);
|
|
};
|
|
}
|
|
return force;
|
|
};
|
|
force("String", String, [
|
|
"charAt",
|
|
"charCodeAt",
|
|
"concat",
|
|
"indexOf",
|
|
"lastIndexOf",
|
|
"match",
|
|
"quote",
|
|
"replace",
|
|
"search",
|
|
"slice",
|
|
"split",
|
|
"substr",
|
|
"substring",
|
|
"trim",
|
|
"toLowerCase",
|
|
"toUpperCase"
|
|
])("Array", Array, [
|
|
"pop",
|
|
"push",
|
|
"reverse",
|
|
"shift",
|
|
"sort",
|
|
"splice",
|
|
"unshift",
|
|
"concat",
|
|
"join",
|
|
"slice",
|
|
"indexOf",
|
|
"lastIndexOf",
|
|
"filter",
|
|
"forEach",
|
|
"every",
|
|
"map",
|
|
"some",
|
|
"reduce",
|
|
"reduceRight"
|
|
])("Number", Number, [
|
|
"toExponential",
|
|
"toFixed",
|
|
"toLocaleString",
|
|
"toPrecision"
|
|
])("Function", Function, [
|
|
"apply",
|
|
"call",
|
|
"bind"
|
|
])("RegExp", RegExp, [
|
|
"exec",
|
|
"test"
|
|
])("Object", Object, [
|
|
"create",
|
|
"defineProperty",
|
|
"defineProperties",
|
|
"keys",
|
|
"getPrototypeOf",
|
|
"getOwnPropertyDescriptor",
|
|
"getOwnPropertyNames",
|
|
"preventExtensions",
|
|
"isExtensible",
|
|
"seal",
|
|
"isSealed",
|
|
"freeze",
|
|
"isFrozen"
|
|
])("Date", Date, [
|
|
"now"
|
|
]), Object.extend = extend.overloadSetter(), Date.extend("now", function() {
|
|
return +new Date;
|
|
}), new Type("Boolean", Boolean), Number.prototype.$family = (function() {
|
|
return isFinite(this) ? "number" : "null";
|
|
}).hide(), Number.extend("random", function(min, max) {
|
|
return Math.floor(Math.random() * (max - min + 1) + min);
|
|
});
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
Object.extend("forEach", function(object, fn, bind) {
|
|
for(var key in object)hasOwnProperty.call(object, key) && fn.call(bind, object[key], key, object);
|
|
}), Object.each = Object.forEach, Array.implement({
|
|
forEach: function(fn, bind) {
|
|
for(var i = 0, l = this.length; i < l; i++)i in this && fn.call(bind, this[i], i, this);
|
|
},
|
|
each: function(fn, bind) {
|
|
return Array.forEach(this, fn, bind), this;
|
|
}
|
|
});
|
|
var cloneOf = function(item) {
|
|
switch(typeOf(item)){
|
|
case "array":
|
|
return item.clone();
|
|
case "object":
|
|
return Object.clone(item);
|
|
default:
|
|
return item;
|
|
}
|
|
};
|
|
Array.implement("clone", function() {
|
|
for(var i = this.length, clone = new Array(i); i--;)clone[i] = cloneOf(this[i]);
|
|
return clone;
|
|
});
|
|
var mergeOne = function(source, key, current) {
|
|
switch(typeOf(current)){
|
|
case "object":
|
|
"object" == typeOf(source[key]) ? Object.merge(source[key], current) : source[key] = Object.clone(current);
|
|
break;
|
|
case "array":
|
|
source[key] = current.clone();
|
|
break;
|
|
default:
|
|
source[key] = current;
|
|
}
|
|
return source;
|
|
};
|
|
Object.extend({
|
|
merge: function(source, k, v) {
|
|
if ("string" == typeOf(k)) return mergeOne(source, k, v);
|
|
for(var i = 1, l = arguments.length; i < l; i++){
|
|
var object = arguments[i];
|
|
for(var key in object)mergeOne(source, key, object[key]);
|
|
}
|
|
return source;
|
|
},
|
|
clone: function(object) {
|
|
var clone = {};
|
|
for(var key in object)clone[key] = cloneOf(object[key]);
|
|
return clone;
|
|
},
|
|
append: function(original) {
|
|
for(var i = 1, l = arguments.length; i < l; i++){
|
|
var extended = arguments[i] || {};
|
|
for(var key in extended)original[key] = extended[key];
|
|
}
|
|
return original;
|
|
}
|
|
}), [
|
|
"Object",
|
|
"WhiteSpace",
|
|
"TextNode",
|
|
"Collection",
|
|
"Arguments"
|
|
].each(function(name) {
|
|
new Type(name);
|
|
});
|
|
var UID = Date.now();
|
|
String.extend("uniqueID", function() {
|
|
return (UID++).toString(36);
|
|
});
|
|
var Hash = this.Hash = new Type("Hash", function(object) {
|
|
for(var key in "hash" == typeOf(object) && (object = Object.clone(object.getClean())), object)this[key] = object[key];
|
|
return this;
|
|
});
|
|
Hash.implement({
|
|
forEach: function(fn, bind) {
|
|
Object.forEach(this, fn, bind);
|
|
},
|
|
getClean: function() {
|
|
var clean = {};
|
|
for(var key in this)this.hasOwnProperty(key) && (clean[key] = this[key]);
|
|
return clean;
|
|
},
|
|
getLength: function() {
|
|
var length = 0;
|
|
for(var key in this)this.hasOwnProperty(key) && length++;
|
|
return length;
|
|
}
|
|
}), Hash.alias("each", "forEach"), Object.type = Type.isObject;
|
|
var Native = this.Native = function(properties) {
|
|
return new Type(properties.name, properties.initialize);
|
|
};
|
|
Native.type = Type.type, Native.implement = function(objects, methods) {
|
|
for(var i = 0; i < objects.length; i++)objects[i].implement(methods);
|
|
return Native;
|
|
};
|
|
var arrayType = Array.type;
|
|
Array.type = function(item) {
|
|
return instanceOf(item, Array) || arrayType(item);
|
|
}, this.$A = function(item) {
|
|
return Array.from(item).slice();
|
|
}, this.$arguments = function(i) {
|
|
return function() {
|
|
return arguments[i];
|
|
};
|
|
}, this.$chk = function(obj) {
|
|
return !!(obj || 0 === obj);
|
|
}, this.$clear = function(timer) {
|
|
return clearTimeout(timer), clearInterval(timer), null;
|
|
}, this.$defined = function(obj) {
|
|
return null != obj;
|
|
}, this.$each = function(iterable, fn, bind) {
|
|
var type = typeOf(iterable);
|
|
("arguments" == type || "collection" == type || "array" == type || "elements" == type ? Array : Object).each(iterable, fn, bind);
|
|
}, this.$empty = function() {}, this.$extend = function(original, extended) {
|
|
return Object.append(original, extended);
|
|
}, this.$H = function(object) {
|
|
return new Hash(object);
|
|
}, this.$merge = function() {
|
|
var args = Array.slice(arguments);
|
|
return args.unshift({}), Object.merge.apply(null, args);
|
|
}, this.$lambda = Function.from, this.$mixin = Object.merge, this.$random = Number.random, this.$splat = Array.from, this.$time = Date.now, this.$type = function(object) {
|
|
var type = typeOf(object);
|
|
return "elements" == type ? "array" : "null" != type && type;
|
|
}, this.$unlink = function(object) {
|
|
switch(typeOf(object)){
|
|
case "object":
|
|
return Object.clone(object);
|
|
case "array":
|
|
return Array.clone(object);
|
|
case "hash":
|
|
return new Hash(object);
|
|
default:
|
|
return object;
|
|
}
|
|
};
|
|
}(), Array.implement({
|
|
every: function(fn, bind) {
|
|
for(var i = 0, l = this.length >>> 0; i < l; i++)if (i in this && !fn.call(bind, this[i], i, this)) return !1;
|
|
return !0;
|
|
},
|
|
filter: function(fn, bind) {
|
|
for(var value, results = [], i = 0, l = this.length >>> 0; i < l; i++)i in this && (value = this[i], fn.call(bind, value, i, this) && results.push(value));
|
|
return results;
|
|
},
|
|
indexOf: function(item, from) {
|
|
for(var length = this.length >>> 0, i = from < 0 ? Math.max(0, length + from) : from || 0; i < length; i++)if (this[i] === item) return i;
|
|
return -1;
|
|
},
|
|
map: function(fn, bind) {
|
|
for(var length = this.length >>> 0, results = Array(length), i = 0; i < length; i++)i in this && (results[i] = fn.call(bind, this[i], i, this));
|
|
return results;
|
|
},
|
|
some: function(fn, bind) {
|
|
for(var i = 0, l = this.length >>> 0; i < l; i++)if (i in this && fn.call(bind, this[i], i, this)) return !0;
|
|
return !1;
|
|
},
|
|
clean: function() {
|
|
return this.filter(function(item) {
|
|
return null != item;
|
|
});
|
|
},
|
|
invoke: function(methodName) {
|
|
var args = Array.slice(arguments, 1);
|
|
return this.map(function(item) {
|
|
return item[methodName].apply(item, args);
|
|
});
|
|
},
|
|
associate: function(keys) {
|
|
for(var obj = {}, length = Math.min(this.length, keys.length), i = 0; i < length; i++)obj[keys[i]] = this[i];
|
|
return obj;
|
|
},
|
|
link: function(object) {
|
|
for(var result = {}, i = 0, l = this.length; i < l; i++)for(var key in object)if (object[key](this[i])) {
|
|
result[key] = this[i], delete object[key];
|
|
break;
|
|
}
|
|
return result;
|
|
},
|
|
contains: function(item, from) {
|
|
return -1 != this.indexOf(item, from);
|
|
},
|
|
append: function(array) {
|
|
return this.push.apply(this, array), this;
|
|
},
|
|
getLast: function() {
|
|
return this.length ? this[this.length - 1] : null;
|
|
},
|
|
getRandom: function() {
|
|
return this.length ? this[Number.random(0, this.length - 1)] : null;
|
|
},
|
|
include: function(item) {
|
|
return this.contains(item) || this.push(item), this;
|
|
},
|
|
combine: function(array) {
|
|
for(var i = 0, l = array.length; i < l; i++)this.include(array[i]);
|
|
return this;
|
|
},
|
|
erase: function(item) {
|
|
for(var i = this.length; i--;)this[i] === item && this.splice(i, 1);
|
|
return this;
|
|
},
|
|
empty: function() {
|
|
return this.length = 0, this;
|
|
},
|
|
flatten: function() {
|
|
for(var array = [], i = 0, l = this.length; i < l; i++){
|
|
var type = typeOf(this[i]);
|
|
"null" != type && (array = array.concat("array" == type || "collection" == type || "arguments" == type || instanceOf(this[i], Array) ? Array.flatten(this[i]) : this[i]));
|
|
}
|
|
return array;
|
|
},
|
|
pick: function() {
|
|
for(var i = 0, l = this.length; i < l; i++)if (null != this[i]) return this[i];
|
|
return null;
|
|
},
|
|
hexToRgb: function(array) {
|
|
if (3 != this.length) return null;
|
|
var rgb = this.map(function(value) {
|
|
return 1 == value.length && (value += value), value.toInt(16);
|
|
});
|
|
return array ? rgb : "rgb(" + rgb + ")";
|
|
},
|
|
rgbToHex: function(array) {
|
|
if (this.length < 3) return null;
|
|
if (4 == this.length && 0 == this[3] && !array) return "transparent";
|
|
for(var hex = [], i = 0; i < 3; i++){
|
|
var bit = (this[i] - 0).toString(16);
|
|
hex.push(1 == bit.length ? "0" + bit : bit);
|
|
}
|
|
return array ? hex : "#" + hex.join("");
|
|
}
|
|
}), Array.alias("extend", "append");
|
|
var fireEvent, $pick = function() {
|
|
return Array.from(arguments).pick();
|
|
};
|
|
String.implement({
|
|
test: function(regex, params) {
|
|
return ("regexp" == typeOf(regex) ? regex : new RegExp("" + regex, params)).test(this);
|
|
},
|
|
contains: function(string, separator) {
|
|
return separator ? (separator + this + separator).indexOf(separator + string + separator) > -1 : String(this).indexOf(string) > -1;
|
|
},
|
|
trim: function() {
|
|
return String(this).replace(/^\s+|\s+$/g, "");
|
|
},
|
|
clean: function() {
|
|
return String(this).replace(/\s+/g, " ").trim();
|
|
},
|
|
camelCase: function() {
|
|
return String(this).replace(/-\D/g, function(match) {
|
|
return match.charAt(1).toUpperCase();
|
|
});
|
|
},
|
|
hyphenate: function() {
|
|
return String(this).replace(/[A-Z]/g, function(match) {
|
|
return "-" + match.charAt(0).toLowerCase();
|
|
});
|
|
},
|
|
capitalize: function() {
|
|
return String(this).replace(/\b[a-z]/g, function(match) {
|
|
return match.toUpperCase();
|
|
});
|
|
},
|
|
escapeRegExp: function() {
|
|
return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1");
|
|
},
|
|
toInt: function(base) {
|
|
return parseInt(this, base || 10);
|
|
},
|
|
toFloat: function() {
|
|
return parseFloat(this);
|
|
},
|
|
hexToRgb: function(array) {
|
|
var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
|
|
return hex ? hex.slice(1).hexToRgb(array) : null;
|
|
},
|
|
rgbToHex: function(array) {
|
|
var rgb = String(this).match(/\d{1,3}/g);
|
|
return rgb ? rgb.rgbToHex(array) : null;
|
|
},
|
|
substitute: function(object, regexp) {
|
|
return String(this).replace(regexp || /\\?\{([^{}]+)\}/g, function(match, name) {
|
|
return "\\" == match.charAt(0) ? match.slice(1) : null != object[name] ? object[name] : "";
|
|
});
|
|
}
|
|
}), Number.implement({
|
|
limit: function(min, max) {
|
|
return Math.min(max, Math.max(min, this));
|
|
},
|
|
round: function(precision) {
|
|
return precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0), Math.round(this * precision) / precision;
|
|
},
|
|
times: function(fn, bind) {
|
|
for(var i = 0; i < this; i++)fn.call(bind, i, this);
|
|
},
|
|
toFloat: function() {
|
|
return parseFloat(this);
|
|
},
|
|
toInt: function(base) {
|
|
return parseInt(this, base || 10);
|
|
}
|
|
}), Number.alias("each", "times"), (function(math) {
|
|
var methods = {};
|
|
math.each(function(name) {
|
|
Number[name] || (methods[name] = function() {
|
|
return Math[name].apply(null, [
|
|
this
|
|
].concat(Array.from(arguments)));
|
|
});
|
|
}), Number.implement(methods);
|
|
})([
|
|
"abs",
|
|
"acos",
|
|
"asin",
|
|
"atan",
|
|
"atan2",
|
|
"ceil",
|
|
"cos",
|
|
"exp",
|
|
"floor",
|
|
"log",
|
|
"max",
|
|
"min",
|
|
"pow",
|
|
"sin",
|
|
"sqrt",
|
|
"tan"
|
|
]), Function.extend({
|
|
attempt: function() {
|
|
for(var i = 0, l = arguments.length; i < l; i++)try {
|
|
return arguments[i]();
|
|
} catch (e) {}
|
|
return null;
|
|
}
|
|
}), Function.implement({
|
|
attempt: function(args, bind) {
|
|
try {
|
|
return this.apply(bind, Array.from(args));
|
|
} catch (e) {}
|
|
return null;
|
|
},
|
|
bind: function(that) {
|
|
var self = this, args = arguments.length > 1 ? Array.slice(arguments, 1) : null, F = function() {}, bound = function() {
|
|
var context = that, length = arguments.length;
|
|
this instanceof bound && (F.prototype = self.prototype, context = new F);
|
|
var result = args || length ? self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments) : self.call(context);
|
|
return context == that ? result : context;
|
|
};
|
|
return bound;
|
|
},
|
|
pass: function(args, bind) {
|
|
var self = this;
|
|
return null != args && (args = Array.from(args)), function() {
|
|
return self.apply(bind, args || arguments);
|
|
};
|
|
},
|
|
delay: function(delay, bind, args) {
|
|
return setTimeout(this.pass(null == args ? [] : args, bind), delay);
|
|
},
|
|
periodical: function(periodical, bind, args) {
|
|
return setInterval(this.pass(null == args ? [] : args, bind), periodical);
|
|
}
|
|
}), delete Function.prototype.bind, Function.implement({
|
|
create: function(options) {
|
|
var self = this;
|
|
return options = options || {}, function(event) {
|
|
var args = options.arguments;
|
|
args = null != args ? Array.from(args) : Array.slice(arguments, options.event ? 1 : 0), options.event && (args = [
|
|
event || window.event
|
|
].extend(args));
|
|
var returns = function() {
|
|
return self.apply(options.bind || null, args);
|
|
};
|
|
return options.delay ? setTimeout(returns, options.delay) : options.periodical ? setInterval(returns, options.periodical) : options.attempt ? Function.attempt(returns) : returns();
|
|
};
|
|
},
|
|
bind: function(bind, args) {
|
|
var self = this;
|
|
return null != args && (args = Array.from(args)), function() {
|
|
return self.apply(bind, args || arguments);
|
|
};
|
|
},
|
|
bindWithEvent: function(bind, args) {
|
|
var self = this;
|
|
return null != args && (args = Array.from(args)), function(event) {
|
|
return self.apply(bind, null == args ? arguments : [
|
|
event
|
|
].concat(args));
|
|
};
|
|
},
|
|
run: function(args, bind) {
|
|
return this.apply(bind, Array.from(args));
|
|
}
|
|
}), Object.create == Function.prototype.create && (Object.create = null);
|
|
var $try = Function.attempt;
|
|
!function() {
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
Object.extend({
|
|
subset: function(object, keys) {
|
|
for(var results = {}, i = 0, l = keys.length; i < l; i++){
|
|
var k = keys[i];
|
|
k in object && (results[k] = object[k]);
|
|
}
|
|
return results;
|
|
},
|
|
map: function(object, fn, bind) {
|
|
var results = {};
|
|
for(var key in object)hasOwnProperty.call(object, key) && (results[key] = fn.call(bind, object[key], key, object));
|
|
return results;
|
|
},
|
|
filter: function(object, fn, bind) {
|
|
var results = {};
|
|
for(var key in object){
|
|
var value = object[key];
|
|
hasOwnProperty.call(object, key) && fn.call(bind, value, key, object) && (results[key] = value);
|
|
}
|
|
return results;
|
|
},
|
|
every: function(object, fn, bind) {
|
|
for(var key in object)if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return !1;
|
|
return !0;
|
|
},
|
|
some: function(object, fn, bind) {
|
|
for(var key in object)if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return !0;
|
|
return !1;
|
|
},
|
|
keys: function(object) {
|
|
var keys = [];
|
|
for(var key in object)hasOwnProperty.call(object, key) && keys.push(key);
|
|
return keys;
|
|
},
|
|
values: function(object) {
|
|
var values = [];
|
|
for(var key in object)hasOwnProperty.call(object, key) && values.push(object[key]);
|
|
return values;
|
|
},
|
|
getLength: function(object) {
|
|
return Object.keys(object).length;
|
|
},
|
|
keyOf: function(object, value) {
|
|
for(var key in object)if (hasOwnProperty.call(object, key) && object[key] === value) return key;
|
|
return null;
|
|
},
|
|
contains: function(object, value) {
|
|
return null != Object.keyOf(object, value);
|
|
},
|
|
toQueryString: function(object, base) {
|
|
var queryString = [];
|
|
return Object.each(object, function(value, key) {
|
|
switch(base && (key = base + "[" + key + "]"), typeOf(value)){
|
|
case "object":
|
|
result = Object.toQueryString(value, key);
|
|
break;
|
|
case "array":
|
|
var result, qs = {};
|
|
value.each(function(val, i) {
|
|
qs[i] = val;
|
|
}), result = Object.toQueryString(qs, key);
|
|
break;
|
|
default:
|
|
result = key + "=" + encodeURIComponent(value);
|
|
}
|
|
null != value && queryString.push(result);
|
|
}), queryString.join("&");
|
|
}
|
|
});
|
|
}(), Hash.implement({
|
|
has: Object.prototype.hasOwnProperty,
|
|
keyOf: function(value) {
|
|
return Object.keyOf(this, value);
|
|
},
|
|
hasValue: function(value) {
|
|
return Object.contains(this, value);
|
|
},
|
|
extend: function(properties) {
|
|
return Hash.each(properties || {}, function(value, key) {
|
|
Hash.set(this, key, value);
|
|
}, this), this;
|
|
},
|
|
combine: function(properties) {
|
|
return Hash.each(properties || {}, function(value, key) {
|
|
Hash.include(this, key, value);
|
|
}, this), this;
|
|
},
|
|
erase: function(key) {
|
|
return this.hasOwnProperty(key) && delete this[key], this;
|
|
},
|
|
get: function(key) {
|
|
return this.hasOwnProperty(key) ? this[key] : null;
|
|
},
|
|
set: function(key, value) {
|
|
return (!this[key] || this.hasOwnProperty(key)) && (this[key] = value), this;
|
|
},
|
|
empty: function() {
|
|
return Hash.each(this, function(value, key) {
|
|
delete this[key];
|
|
}, this), this;
|
|
},
|
|
include: function(key, value) {
|
|
return null == this[key] && (this[key] = value), this;
|
|
},
|
|
map: function(fn, bind) {
|
|
return new Hash(Object.map(this, fn, bind));
|
|
},
|
|
filter: function(fn, bind) {
|
|
return new Hash(Object.filter(this, fn, bind));
|
|
},
|
|
every: function(fn, bind) {
|
|
return Object.every(this, fn, bind);
|
|
},
|
|
some: function(fn, bind) {
|
|
return Object.some(this, fn, bind);
|
|
},
|
|
getKeys: function() {
|
|
return Object.keys(this);
|
|
},
|
|
getValues: function() {
|
|
return Object.values(this);
|
|
},
|
|
toQueryString: function(base) {
|
|
return Object.toQueryString(this, base);
|
|
}
|
|
}), Hash.extend = Object.append, Hash.alias({
|
|
indexOf: "keyOf",
|
|
contains: "hasValue"
|
|
}), (function() {
|
|
var XMLHTTP, MSXML2, MSXML, document = this.document, window = document.window = this, ua = navigator.userAgent.toLowerCase(), platform = navigator.platform.toLowerCase(), UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [
|
|
null,
|
|
"unknown",
|
|
0
|
|
], mode = "ie" == UA[1] && document.documentMode, Browser = this.Browser = {
|
|
extend: Function.prototype.extend,
|
|
name: "version" == UA[1] ? UA[3] : UA[1],
|
|
version: mode || parseFloat("opera" == UA[1] && UA[4] ? UA[4] : UA[2]),
|
|
Platform: {
|
|
name: ua.match(/ip(?:ad|od|hone)/) ? "ios" : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || [
|
|
"other"
|
|
])[0]
|
|
},
|
|
Features: {
|
|
xpath: !!document.evaluate,
|
|
air: !!window.runtime,
|
|
query: !!document.querySelector,
|
|
json: !!window.JSON
|
|
},
|
|
Plugins: {}
|
|
};
|
|
Browser[Browser.name] = !0, Browser[Browser.name + parseInt(Browser.version, 10)] = !0, Browser.Platform[Browser.Platform.name] = !0, XMLHTTP = function() {
|
|
return new XMLHttpRequest();
|
|
}, MSXML2 = function() {
|
|
return new ActiveXObject("MSXML2.XMLHTTP");
|
|
}, MSXML = function() {
|
|
return new ActiveXObject("Microsoft.XMLHTTP");
|
|
}, Browser.Request = Function.attempt(function() {
|
|
return XMLHTTP(), XMLHTTP;
|
|
}, function() {
|
|
return MSXML2(), MSXML2;
|
|
}, function() {
|
|
return MSXML(), MSXML;
|
|
}), Browser.Features.xhr = !!Browser.Request;
|
|
var version1 = (Function.attempt(function() {
|
|
return navigator.plugins["Shockwave Flash"].description;
|
|
}, function() {
|
|
return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");
|
|
}) || "0 r0").match(/\d+/g);
|
|
if (Browser.Plugins.Flash = {
|
|
version: Number(version1[0] || "0." + version1[1]) || 0,
|
|
build: Number(version1[2]) || 0
|
|
}, Browser.exec = function(text) {
|
|
if (!text) return text;
|
|
if (window.execScript) window.execScript(text);
|
|
else {
|
|
var script = document.createElement("script");
|
|
script.setAttribute("type", "text/javascript"), script.text = text, document.head.appendChild(script), document.head.removeChild(script);
|
|
}
|
|
return text;
|
|
}, String.implement("stripScripts", function(exec) {
|
|
var scripts = "", text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code) {
|
|
return scripts += code + "\n", "";
|
|
});
|
|
return !0 === exec ? Browser.exec(scripts) : "function" == typeOf(exec) && exec(scripts, text), text;
|
|
}), Browser.extend({
|
|
Document: this.Document,
|
|
Window: this.Window,
|
|
Element: this.Element,
|
|
Event: this.Event
|
|
}), this.Window = this.$constructor = new Type("Window", function() {}), this.$family = Function.from("window").hide(), Window.mirror(function(name, method) {
|
|
window[name] = method;
|
|
}), this.Document = document.$constructor = new Type("Document", function() {}), document.$family = Function.from("document").hide(), Document.mirror(function(name, method) {
|
|
document[name] = method;
|
|
}), document.html = document.documentElement, document.head || (document.head = document.getElementsByTagName("head")[0]), document.execCommand) try {
|
|
document.execCommand("BackgroundImageCache", !1, !0);
|
|
} catch (e) {}
|
|
if (this.attachEvent && !this.addEventListener) {
|
|
var unloadEvent = function() {
|
|
this.detachEvent("onunload", unloadEvent), document.head = document.html = document.window = null;
|
|
};
|
|
this.attachEvent("onunload", unloadEvent);
|
|
}
|
|
var arrayFrom = Array.from;
|
|
try {
|
|
arrayFrom(document.html.childNodes);
|
|
} catch (e1) {
|
|
Array.from = function(item) {
|
|
if ("string" != typeof item && Type.isEnumerable(item) && "array" != typeOf(item)) {
|
|
for(var i = item.length, array = new Array(i); i--;)array[i] = item[i];
|
|
return array;
|
|
}
|
|
return arrayFrom(item);
|
|
};
|
|
var prototype = Array.prototype, slice = prototype.slice;
|
|
[
|
|
"pop",
|
|
"push",
|
|
"reverse",
|
|
"shift",
|
|
"sort",
|
|
"splice",
|
|
"unshift",
|
|
"concat",
|
|
"join",
|
|
"slice"
|
|
].each(function(name) {
|
|
var method = prototype[name];
|
|
Array[name] = function(item) {
|
|
return method.apply(Array.from(item), slice.call(arguments, 1));
|
|
};
|
|
});
|
|
}
|
|
Browser.Platform.ios && (Browser.Platform.ipod = !0), Browser.Engine = {};
|
|
var setEngine = function(name, version) {
|
|
Browser.Engine.name = name, Browser.Engine[name + version] = !0, Browser.Engine.version = version;
|
|
};
|
|
if (Browser.ie) switch(Browser.Engine.trident = !0, Browser.version){
|
|
case 6:
|
|
setEngine("trident", 4);
|
|
break;
|
|
case 7:
|
|
setEngine("trident", 5);
|
|
break;
|
|
case 8:
|
|
setEngine("trident", 6);
|
|
}
|
|
if (Browser.firefox && (Browser.Engine.gecko = !0, setEngine("gecko", Browser.version >= 3 ? 19 : 18)), Browser.safari || Browser.chrome) switch(Browser.Engine.webkit = !0, Browser.version){
|
|
case 2:
|
|
setEngine("webkit", 419);
|
|
break;
|
|
case 3:
|
|
setEngine("webkit", 420);
|
|
break;
|
|
case 4:
|
|
setEngine("webkit", 525);
|
|
}
|
|
if (Browser.opera && (Browser.Engine.presto = !0, setEngine("presto", Browser.version >= 9.6 ? 960 : Browser.version >= 9.5 ? 950 : 925)), "unknown" == Browser.name) switch((ua.match(/(?:webkit|khtml|gecko)/) || [])[0]){
|
|
case "webkit":
|
|
case "khtml":
|
|
Browser.Engine.webkit = !0;
|
|
break;
|
|
case "gecko":
|
|
Browser.Engine.gecko = !0;
|
|
}
|
|
this.$exec = Browser.exec;
|
|
})(), (function() {
|
|
var _keys = {}, DOMEvent = this.DOMEvent = new Type("DOMEvent", function(event, win) {
|
|
if (win || (win = window), (event = event || win.event).$extended) return event;
|
|
this.event = event, this.$extended = !0, this.shift = event.shiftKey, this.control = event.ctrlKey, this.alt = event.altKey, this.meta = event.metaKey;
|
|
for(var type = this.type = event.type, target = event.target || event.srcElement; target && 3 == target.nodeType;)target = target.parentNode;
|
|
if (this.target = document.id(target), 0 == type.indexOf("key")) {
|
|
var code = this.code = event.which || event.keyCode;
|
|
this.key = _keys[code] || Object.keyOf(Event.Keys, code), "keydown" == type && (code > 111 && code < 124 ? this.key = "f" + (code - 111) : code > 95 && code < 106 && (this.key = code - 96)), null == this.key && (this.key = String.fromCharCode(code).toLowerCase());
|
|
} else if ("click" == type || "dblclick" == type || "contextmenu" == type || "DOMMouseScroll" == type || 0 == type.indexOf("mouse")) {
|
|
var doc = win.document;
|
|
if (doc = doc.compatMode && "CSS1Compat" != doc.compatMode ? doc.body : doc.html, this.page = {
|
|
x: null != event.pageX ? event.pageX : event.clientX + doc.scrollLeft,
|
|
y: null != event.pageY ? event.pageY : event.clientY + doc.scrollTop
|
|
}, this.client = {
|
|
x: null != event.pageX ? event.pageX - win.pageXOffset : event.clientX,
|
|
y: null != event.pageY ? event.pageY - win.pageYOffset : event.clientY
|
|
}, ("DOMMouseScroll" == type || "mousewheel" == type) && (this.wheel = event.wheelDelta ? event.wheelDelta / 120 : -(event.detail || 0) / 3), this.rightClick = 3 == event.which || 2 == event.button, "mouseover" == type || "mouseout" == type) {
|
|
for(var related = event.relatedTarget || event[("mouseover" == type ? "from" : "to") + "Element"]; related && 3 == related.nodeType;)related = related.parentNode;
|
|
this.relatedTarget = document.id(related);
|
|
}
|
|
} else if (0 == type.indexOf("touch") || 0 == type.indexOf("gesture")) {
|
|
this.rotation = event.rotation, this.scale = event.scale, this.targetTouches = event.targetTouches, this.changedTouches = event.changedTouches;
|
|
var touches = this.touches = event.touches;
|
|
if (touches && touches[0]) {
|
|
var touch = touches[0];
|
|
this.page = {
|
|
x: touch.pageX,
|
|
y: touch.pageY
|
|
}, this.client = {
|
|
x: touch.clientX,
|
|
y: touch.clientY
|
|
};
|
|
}
|
|
}
|
|
this.client || (this.client = {}), this.page || (this.page = {});
|
|
});
|
|
DOMEvent.implement({
|
|
stop: function() {
|
|
return this.preventDefault().stopPropagation();
|
|
},
|
|
stopPropagation: function() {
|
|
return this.event.stopPropagation ? this.event.stopPropagation() : this.event.cancelBubble = !0, this;
|
|
},
|
|
preventDefault: function() {
|
|
return this.event.preventDefault ? this.event.preventDefault() : this.event.returnValue = !1, this;
|
|
}
|
|
}), DOMEvent.defineKey = function(code, key) {
|
|
return _keys[code] = key, this;
|
|
}, DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(!0), DOMEvent.defineKeys({
|
|
"38": "up",
|
|
"40": "down",
|
|
"37": "left",
|
|
"39": "right",
|
|
"27": "esc",
|
|
"32": "space",
|
|
"8": "backspace",
|
|
"9": "tab",
|
|
"46": "delete",
|
|
"13": "enter"
|
|
});
|
|
})();
|
|
var Event = DOMEvent;
|
|
Event.Keys = {}, Event.Keys = new Hash(Event.Keys), (function() {
|
|
var Class = this.Class = new Type("Class", function(params) {
|
|
instanceOf(params, Function) && (params = {
|
|
initialize: params
|
|
});
|
|
var newClass = (function() {
|
|
if (reset(this), newClass.$prototyping) return this;
|
|
this.$caller = null;
|
|
var value = this.initialize ? this.initialize.apply(this, arguments) : this;
|
|
return this.$caller = this.caller = null, value;
|
|
}).extend(this).implement(params);
|
|
return newClass.$constructor = Class, newClass.prototype.$constructor = newClass, newClass.prototype.parent = parent1, newClass;
|
|
}), parent1 = function() {
|
|
if (!this.$caller) throw new Error("The method \"parent\" cannot be called.");
|
|
var name = this.$caller.$name, parent = this.$caller.$owner.parent, previous = parent ? parent.prototype[name] : null;
|
|
if (!previous) throw new Error("The method \"" + name + "\" has no parent.");
|
|
return previous.apply(this, arguments);
|
|
}, reset = function(object) {
|
|
for(var key in object){
|
|
var value = object[key];
|
|
switch(typeOf(value)){
|
|
case "object":
|
|
var F = function() {};
|
|
F.prototype = value, object[key] = reset(new F);
|
|
break;
|
|
case "array":
|
|
object[key] = value.clone();
|
|
break;
|
|
}
|
|
}
|
|
return object;
|
|
}, wrap = function(self, key, method) {
|
|
method.$origin && (method = method.$origin);
|
|
var wrapper = (function() {
|
|
if (method.$protected && null == this.$caller) throw new Error("The method \"" + key + "\" cannot be called.");
|
|
var caller = this.caller, current = this.$caller;
|
|
this.caller = current, this.$caller = wrapper;
|
|
var result = method.apply(this, arguments);
|
|
return this.$caller = current, this.caller = caller, result;
|
|
}).extend({
|
|
$owner: self,
|
|
$origin: method,
|
|
$name: key
|
|
});
|
|
return wrapper;
|
|
}, implement = function(key, value, retain) {
|
|
if (Class.Mutators.hasOwnProperty(key) && null == (value = Class.Mutators[key].call(this, value))) return this;
|
|
if ("function" == typeOf(value)) {
|
|
if (value.$hidden) return this;
|
|
this.prototype[key] = retain ? value : wrap(this, key, value);
|
|
} else Object.merge(this.prototype, key, value);
|
|
return this;
|
|
}, getInstance = function(klass) {
|
|
klass.$prototyping = !0;
|
|
var proto = new klass;
|
|
return delete klass.$prototyping, proto;
|
|
};
|
|
Class.implement("implement", implement.overloadSetter()), Class.Mutators = {
|
|
Extends: function(parent) {
|
|
this.parent = parent, this.prototype = getInstance(parent);
|
|
},
|
|
Implements: function(items) {
|
|
Array.from(items).each(function(item) {
|
|
var instance = new item;
|
|
for(var key in instance)implement.call(this, key, instance[key], !0);
|
|
}, this);
|
|
}
|
|
};
|
|
})(), (function() {
|
|
this.Chain = new Class({
|
|
$chain: [],
|
|
chain: function() {
|
|
return this.$chain.append(Array.flatten(arguments)), this;
|
|
},
|
|
callChain: function() {
|
|
return !!this.$chain.length && this.$chain.shift().apply(this, arguments);
|
|
},
|
|
clearChain: function() {
|
|
return this.$chain.empty(), this;
|
|
}
|
|
});
|
|
var removeOn = function(string) {
|
|
return string.replace(/^on([A-Z])/, function(full, first) {
|
|
return first.toLowerCase();
|
|
});
|
|
};
|
|
this.Events = new Class({
|
|
$events: {},
|
|
addEvent: function(type, fn, internal) {
|
|
return type = removeOn(type), fn == $empty || (this.$events[type] = (this.$events[type] || []).include(fn), internal && (fn.internal = !0)), this;
|
|
},
|
|
addEvents: function(events) {
|
|
for(var type in events)this.addEvent(type, events[type]);
|
|
return this;
|
|
},
|
|
fireEvent: function(type, args, delay) {
|
|
type = removeOn(type);
|
|
var events = this.$events[type];
|
|
return events && (args = Array.from(args), events.each(function(fn) {
|
|
delay ? fn.delay(delay, this, args) : fn.apply(this, args);
|
|
}, this)), this;
|
|
},
|
|
removeEvent: function(type, fn) {
|
|
type = removeOn(type);
|
|
var events = this.$events[type];
|
|
if (events && !fn.internal) {
|
|
var index = events.indexOf(fn);
|
|
-1 != index && delete events[index];
|
|
}
|
|
return this;
|
|
},
|
|
removeEvents: function(events) {
|
|
var type;
|
|
if ("object" == typeOf(events)) {
|
|
for(type in events)this.removeEvent(type, events[type]);
|
|
return this;
|
|
}
|
|
for(type in events && (events = removeOn(events)), this.$events)if (!events || events == type) for(var fns = this.$events[type], i = fns.length; i--;)i in fns && this.removeEvent(type, fns[i]);
|
|
return this;
|
|
}
|
|
}), this.Options = new Class({
|
|
setOptions: function() {
|
|
var options = this.options = Object.merge.apply(null, [
|
|
{},
|
|
this.options
|
|
].append(arguments));
|
|
if (this.addEvent) for(var option in options)"function" == typeOf(options[option]) && /^on[A-Z]/.test(option) && (this.addEvent(option, options[option]), delete options[option]);
|
|
return this;
|
|
}
|
|
});
|
|
})(), (function() {
|
|
var parsed, separatorIndex, combinatorIndex, reversed, cache = {}, reverseCache = {}, reUnescape = /\\/g, parse = function(expression, isReversed) {
|
|
if (null == expression) return null;
|
|
if (!0 === expression.Slick) return expression;
|
|
expression = ("" + expression).replace(/^\s+|\s+$/g, "");
|
|
var currentCache = (reversed = !!isReversed) ? reverseCache : cache;
|
|
if (currentCache[expression]) return currentCache[expression];
|
|
for(parsed = {
|
|
Slick: !0,
|
|
expressions: [],
|
|
raw: expression,
|
|
reverse: function() {
|
|
return parse(this.raw, !0);
|
|
}
|
|
}, separatorIndex = -1; expression != (expression = expression.replace(regexp1, parser)););
|
|
return parsed.length = parsed.expressions.length, currentCache[parsed.raw] = reversed ? reverse(parsed) : parsed;
|
|
}, reverseCombinator = function(combinator) {
|
|
return "!" === combinator ? " " : " " === combinator ? "!" : /^!/.test(combinator) ? combinator.replace(/^!/, "") : "!" + combinator;
|
|
}, reverse = function(expression) {
|
|
for(var expressions = expression.expressions, i = 0; i < expressions.length; i++){
|
|
for(var exp = expressions[i], last = {
|
|
parts: [],
|
|
tag: "*",
|
|
combinator: reverseCombinator(exp[0].combinator)
|
|
}, j = 0; j < exp.length; j++){
|
|
var cexp = exp[j];
|
|
cexp.reverseCombinator || (cexp.reverseCombinator = " "), cexp.combinator = cexp.reverseCombinator, delete cexp.reverseCombinator;
|
|
}
|
|
exp.reverse().push(last);
|
|
}
|
|
return expression;
|
|
}, escapeRegExp = function(string) {
|
|
return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match) {
|
|
return "\\" + match;
|
|
});
|
|
}, regexp1 = new RegExp("^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(/<combinator>/, "[" + escapeRegExp(">+~`!@$%^&={}\\;</") + "]").replace(/<unicode>/g, "(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(/<unicode1>/g, "(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])"));
|
|
function parser(rawMatch, separator, combinator, combinatorChildren, tagName, id, className, attributeKey, attributeOperator, attributeQuote, attributeValue, pseudoMarker, pseudoClass, pseudoQuote, pseudoClassQuotedValue, pseudoClassValue) {
|
|
if ((separator || -1 === separatorIndex) && (parsed.expressions[++separatorIndex] = [], combinatorIndex = -1, separator)) return "";
|
|
if (combinator || combinatorChildren || -1 === combinatorIndex) {
|
|
combinator = combinator || " ";
|
|
var test, regexp, currentSeparator = parsed.expressions[separatorIndex];
|
|
reversed && currentSeparator[combinatorIndex] && (currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator)), currentSeparator[++combinatorIndex] = {
|
|
combinator: combinator,
|
|
tag: "*"
|
|
};
|
|
}
|
|
var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];
|
|
if (tagName) currentParsed.tag = tagName.replace(reUnescape, "");
|
|
else if (id) currentParsed.id = id.replace(reUnescape, "");
|
|
else if (className) className = className.replace(reUnescape, ""), currentParsed.classList || (currentParsed.classList = []), currentParsed.classes || (currentParsed.classes = []), currentParsed.classList.push(className), currentParsed.classes.push({
|
|
value: className,
|
|
regexp: new RegExp("(^|\\s)" + escapeRegExp(className) + "(\\s|$)")
|
|
});
|
|
else if (pseudoClass) pseudoClassValue = (pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue) ? pseudoClassValue.replace(reUnescape, "") : null, currentParsed.pseudos || (currentParsed.pseudos = []), currentParsed.pseudos.push({
|
|
key: pseudoClass.replace(reUnescape, ""),
|
|
value: pseudoClassValue,
|
|
type: 1 == pseudoMarker.length ? "class" : "element"
|
|
});
|
|
else if (attributeKey) {
|
|
switch(attributeKey = attributeKey.replace(reUnescape, ""), attributeValue = (attributeValue || "").replace(reUnescape, ""), attributeOperator){
|
|
case "^=":
|
|
regexp = new RegExp("^" + escapeRegExp(attributeValue));
|
|
break;
|
|
case "$=":
|
|
regexp = new RegExp(escapeRegExp(attributeValue) + "$");
|
|
break;
|
|
case "~=":
|
|
regexp = new RegExp("(^|\\s)" + escapeRegExp(attributeValue) + "(\\s|$)");
|
|
break;
|
|
case "|=":
|
|
regexp = new RegExp("^" + escapeRegExp(attributeValue) + "(-|$)");
|
|
break;
|
|
case "=":
|
|
test = function(value) {
|
|
return attributeValue == value;
|
|
};
|
|
break;
|
|
case "*=":
|
|
test = function(value) {
|
|
return value && value.indexOf(attributeValue) > -1;
|
|
};
|
|
break;
|
|
case "!=":
|
|
test = function(value) {
|
|
return attributeValue != value;
|
|
};
|
|
break;
|
|
default:
|
|
test = function(value) {
|
|
return !!value;
|
|
};
|
|
}
|
|
"" == attributeValue && /^[*$^]=$/.test(attributeOperator) && (test = function() {
|
|
return !1;
|
|
}), test || (test = function(value) {
|
|
return value && regexp.test(value);
|
|
}), currentParsed.attributes || (currentParsed.attributes = []), currentParsed.attributes.push({
|
|
key: attributeKey,
|
|
operator: attributeOperator,
|
|
value: attributeValue,
|
|
test: test
|
|
});
|
|
}
|
|
return "";
|
|
}
|
|
var Slick = this.Slick || {};
|
|
Slick.parse = function(expression) {
|
|
return parse(expression);
|
|
}, Slick.escapeRegExp = escapeRegExp, this.Slick || (this.Slick = Slick);
|
|
}).apply("undefined" != typeof exports ? exports : this), (function() {
|
|
var local = {}, featuresCache = {}, toString = Object.prototype.toString;
|
|
local.isNativeCode = function(fn) {
|
|
return /\{\s*\[native code\]\s*\}/.test("" + fn);
|
|
}, local.isXML = function(document) {
|
|
return !!document.xmlVersion || !!document.xml || "[object XMLDocument]" == toString.call(document) || 9 == document.nodeType && "HTML" != document.documentElement.nodeName;
|
|
}, local.setDocument = function(document) {
|
|
var nodeType = document.nodeType;
|
|
if (9 == nodeType) ;
|
|
else if (nodeType) document = document.ownerDocument;
|
|
else {
|
|
if (!document.navigator) return;
|
|
document = document.document;
|
|
}
|
|
if (this.document !== document) {
|
|
this.document = document;
|
|
var feature, root = document.documentElement, rootUid = this.getUIDXML(root), features = featuresCache[rootUid];
|
|
if (features) {
|
|
for(feature in features)this[feature] = features[feature];
|
|
return;
|
|
}
|
|
(features = featuresCache[rootUid] = {}).root = root, features.isXMLDocument = this.isXML(document), features.brokenStarGEBTN = features.starSelectsClosedQSA = features.idGetsName = features.brokenMixedCaseQSA = features.brokenGEBCN = features.brokenCheckedQSA = features.brokenEmptyAttributeQSA = features.isHTMLDocument = features.nativeMatchesSelector = !1;
|
|
var starSelectsClosed, starSelectsComments, brokenSecondClassNameGEBCN, cachedGetElementsByClassName, brokenFormAttributeGetter, selected, id = "slick_uniqueid", testNode = document.createElement("div"), testRoot = document.body || document.getElementsByTagName("body")[0] || root;
|
|
testRoot.appendChild(testNode);
|
|
try {
|
|
testNode.innerHTML = "<a id=\"" + id + "\"></a>", features.isHTMLDocument = !!document.getElementById(id);
|
|
} catch (e) {}
|
|
if (features.isHTMLDocument) {
|
|
testNode.style.display = "none", testNode.appendChild(document.createComment("")), starSelectsComments = testNode.getElementsByTagName("*").length > 1;
|
|
try {
|
|
testNode.innerHTML = "foo</foo>", starSelectsClosed = (selected = testNode.getElementsByTagName("*")) && !!selected.length && "/" == selected[0].nodeName.charAt(0);
|
|
} catch (e) {}
|
|
features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
|
|
try {
|
|
testNode.innerHTML = "<a name=\"" + id + "\"></a><b id=\"" + id + "\"></b>", features.idGetsName = document.getElementById(id) === testNode.firstChild;
|
|
} catch (e2) {}
|
|
if (testNode.getElementsByClassName) {
|
|
try {
|
|
testNode.innerHTML = "<a class=\"f\"></a><a class=\"b\"></a>", testNode.getElementsByClassName("b").length, testNode.firstChild.className = "b", cachedGetElementsByClassName = 2 != testNode.getElementsByClassName("b").length;
|
|
} catch (e) {}
|
|
try {
|
|
testNode.innerHTML = "<a class=\"a\"></a><a class=\"f b a\"></a>", brokenSecondClassNameGEBCN = 2 != testNode.getElementsByClassName("a").length;
|
|
} catch (e3) {}
|
|
features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
|
|
}
|
|
if (testNode.querySelectorAll) {
|
|
try {
|
|
testNode.innerHTML = "foo</foo>", selected = testNode.querySelectorAll("*"), features.starSelectsClosedQSA = selected && !!selected.length && "/" == selected[0].nodeName.charAt(0);
|
|
} catch (e) {}
|
|
try {
|
|
testNode.innerHTML = "<a class=\"MiX\"></a>", features.brokenMixedCaseQSA = !testNode.querySelectorAll(".MiX").length;
|
|
} catch (e4) {}
|
|
try {
|
|
testNode.innerHTML = "<select><option selected=\"selected\">a</option></select>", features.brokenCheckedQSA = 0 == testNode.querySelectorAll(":checked").length;
|
|
} catch (e5) {}
|
|
try {
|
|
testNode.innerHTML = "<a class=\"\"></a>", features.brokenEmptyAttributeQSA = 0 != testNode.querySelectorAll("[class*=\"\"]").length;
|
|
} catch (e6) {}
|
|
}
|
|
try {
|
|
testNode.innerHTML = "<form action=\"s\"><input id=\"action\"/></form>", brokenFormAttributeGetter = "s" != testNode.firstChild.getAttribute("action");
|
|
} catch (e7) {}
|
|
if (features.nativeMatchesSelector = root.matchesSelector || root.mozMatchesSelector || root.webkitMatchesSelector, features.nativeMatchesSelector) try {
|
|
features.nativeMatchesSelector.call(root, ":slick"), features.nativeMatchesSelector = null;
|
|
} catch (e8) {}
|
|
}
|
|
try {
|
|
root.slick_expando = 1, delete root.slick_expando, features.getUID = this.getUIDHTML;
|
|
} catch (e9) {
|
|
features.getUID = this.getUIDXML;
|
|
}
|
|
testRoot.removeChild(testNode), testNode = selected = testRoot = null, features.getAttribute = features.isHTMLDocument && brokenFormAttributeGetter ? function(node, name) {
|
|
var method = this.attributeGetters[name];
|
|
if (method) return method.call(node);
|
|
var attributeNode = node.getAttributeNode(name);
|
|
return attributeNode ? attributeNode.nodeValue : null;
|
|
} : function(node, name) {
|
|
var method = this.attributeGetters[name];
|
|
return method ? method.call(node) : node.getAttribute(name);
|
|
}, features.hasAttribute = root && this.isNativeCode(root.hasAttribute) ? function(node, attribute) {
|
|
return node.hasAttribute(attribute);
|
|
} : function(node, attribute) {
|
|
return !!((node = node.getAttributeNode(attribute)) && (node.specified || node.nodeValue));
|
|
};
|
|
var nativeRootContains = root && this.isNativeCode(root.contains), nativeDocumentContains = document && this.isNativeCode(document.contains);
|
|
for(feature in features.contains = nativeRootContains && nativeDocumentContains ? function(context, node) {
|
|
return context.contains(node);
|
|
} : nativeRootContains && !nativeDocumentContains ? function(context, node) {
|
|
return context === node || (context === document ? document.documentElement : context).contains(node);
|
|
} : root && root.compareDocumentPosition ? function(context, node) {
|
|
return context === node || !!(16 & context.compareDocumentPosition(node));
|
|
} : function(context, node) {
|
|
if (node) do if (node === context) return !0;
|
|
while (node = node.parentNode)
|
|
return !1;
|
|
}, features.documentSorter = root.compareDocumentPosition ? function(a, b) {
|
|
return a.compareDocumentPosition && b.compareDocumentPosition ? 4 & a.compareDocumentPosition(b) ? -1 : a === b ? 0 : 1 : 0;
|
|
} : "sourceIndex" in root ? function(a, b) {
|
|
return a.sourceIndex && b.sourceIndex ? a.sourceIndex - b.sourceIndex : 0;
|
|
} : document.createRange ? function(a, b) {
|
|
if (!a.ownerDocument || !b.ownerDocument) return 0;
|
|
var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
|
|
return aRange.setStart(a, 0), aRange.setEnd(a, 0), bRange.setStart(b, 0), bRange.setEnd(b, 0), aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
|
|
} : null, root = null, features)this[feature] = features[feature];
|
|
}
|
|
};
|
|
var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/, reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/, qsaFailExpCache = {};
|
|
local.search = function(context, expression, append, first) {
|
|
var found = this.found = first ? null : append || [];
|
|
if (!context) return found;
|
|
if (context.navigator) context = context.document;
|
|
else if (!context.nodeType) return found;
|
|
var parsed, i, uniques = this.uniques = {}, hasOthers = !!(append && append.length), contextIsDocument = 9 == context.nodeType;
|
|
if (this.document !== (contextIsDocument ? context : context.ownerDocument) && this.setDocument(context), hasOthers) for(i = found.length; i--;)uniques[this.getUID(found[i])] = !0;
|
|
if ("string" == typeof expression) {
|
|
var simpleSelector = expression.match(reSimpleSelector);
|
|
simpleSelectors: if (simpleSelector) {
|
|
var node, nodes, symbol = simpleSelector[1], name = simpleSelector[2];
|
|
if (symbol) {
|
|
if ("#" == symbol) {
|
|
if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
|
|
if (!(node = context.getElementById(name))) return found;
|
|
if (this.idGetsName && node.getAttributeNode("id").nodeValue != name) break simpleSelectors;
|
|
if (first) return node || null;
|
|
hasOthers && uniques[this.getUID(node)] || found.push(node);
|
|
} else if ("." == symbol) {
|
|
if (!this.isHTMLDocument || (!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll) break simpleSelectors;
|
|
if (context.getElementsByClassName && !this.brokenGEBCN) {
|
|
if (nodes = context.getElementsByClassName(name), first) return nodes[0] || null;
|
|
for(i = 0; node = nodes[i++];)hasOthers && uniques[this.getUID(node)] || found.push(node);
|
|
} else {
|
|
var matchClass = new RegExp("(^|\\s)" + Slick.escapeRegExp(name) + "(\\s|$)");
|
|
for(i = 0, nodes = context.getElementsByTagName("*"); node = nodes[i++];)if ((className = node.className) && matchClass.test(className)) {
|
|
if (first) return node;
|
|
hasOthers && uniques[this.getUID(node)] || found.push(node);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if ("*" == name && this.brokenStarGEBTN) break simpleSelectors;
|
|
if (nodes = context.getElementsByTagName(name), first) return nodes[0] || null;
|
|
for(i = 0; node = nodes[i++];)hasOthers && uniques[this.getUID(node)] || found.push(node);
|
|
}
|
|
return hasOthers && this.sort(found), first ? null : found;
|
|
}
|
|
querySelector: if (context.querySelectorAll) {
|
|
if (!this.isHTMLDocument || qsaFailExpCache[expression] || this.brokenMixedCaseQSA || this.brokenCheckedQSA && expression.indexOf(":checked") > -1 || this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression) || !contextIsDocument && expression.indexOf(",") > -1 || Slick.disableQSA) break querySelector;
|
|
var _expression = expression, _context = context;
|
|
if (!contextIsDocument) {
|
|
var currentId = _context.getAttribute("id"), slickid = "slickid__";
|
|
_context.setAttribute("id", slickid), _expression = "#" + slickid + " " + _expression, context = _context.parentNode;
|
|
}
|
|
try {
|
|
if (first) return context.querySelector(_expression) || null;
|
|
nodes = context.querySelectorAll(_expression);
|
|
} catch (e) {
|
|
qsaFailExpCache[expression] = 1;
|
|
break querySelector;
|
|
} finally{
|
|
contextIsDocument || (currentId ? _context.setAttribute("id", currentId) : _context.removeAttribute("id"), context = _context);
|
|
}
|
|
if (this.starSelectsClosedQSA) for(i = 0; node = nodes[i++];)node.nodeName > "@" && !(hasOthers && uniques[this.getUID(node)]) && found.push(node);
|
|
else for(i = 0; node = nodes[i++];)hasOthers && uniques[this.getUID(node)] || found.push(node);
|
|
return hasOthers && this.sort(found), found;
|
|
}
|
|
if (!(parsed = this.Slick.parse(expression)).length) return found;
|
|
} else if (null == expression) return found;
|
|
else if (expression.Slick) parsed = expression;
|
|
else if (this.contains(context.documentElement || context, expression)) return found ? found.push(expression) : found = expression, found;
|
|
else return found;
|
|
this.posNTH = {}, this.posNTHLast = {}, this.posNTHType = {}, this.posNTHTypeLast = {}, this.push = !hasOthers && (first || 1 == parsed.length && 1 == parsed.expressions[0].length) ? this.pushArray : this.pushUID, null == found && (found = []);
|
|
var j, m, n, combinator, tag, id, classList, classes, attributes, pseudos, currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;
|
|
search: for(i = 0; currentExpression = expressions[i]; i++)for(j = 0; currentBit = currentExpression[j]; j++){
|
|
if (!this[combinator = "combinator:" + currentBit.combinator]) continue search;
|
|
if (tag = this.isXMLDocument ? currentBit.tag : currentBit.tag.toUpperCase(), id = currentBit.id, classList = currentBit.classList, classes = currentBit.classes, attributes = currentBit.attributes, pseudos = currentBit.pseudos, lastBit = j === currentExpression.length - 1, this.bitUniques = {}, lastBit ? (this.uniques = uniques, this.found = found) : (this.uniques = {}, this.found = []), 0 === j) {
|
|
if (this[combinator](context, tag, id, classes, attributes, pseudos, classList), first && lastBit && found.length) break search;
|
|
} else if (first && lastBit) {
|
|
for(m = 0, n = currentItems.length; m < n; m++)if (this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList), found.length) break search;
|
|
} else for(m = 0, n = currentItems.length; m < n; m++)this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
|
|
currentItems = this.found;
|
|
}
|
|
return (hasOthers || parsed.expressions.length > 1) && this.sort(found), first ? found[0] || null : found;
|
|
}, local.uidx = 1, local.uidk = "slick-uniqueid", local.getUIDXML = function(node) {
|
|
var uid = node.getAttribute(this.uidk);
|
|
return uid || (uid = this.uidx++, node.setAttribute(this.uidk, uid)), uid;
|
|
}, local.getUIDHTML = function(node) {
|
|
return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
|
|
}, local.sort = function(results) {
|
|
return this.documentSorter && results.sort(this.documentSorter), results;
|
|
}, local.cacheNTH = {}, local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/, local.parseNTHArgument = function(argument) {
|
|
var parsed = argument.match(this.matchNTH);
|
|
if (!parsed) return !1;
|
|
var special = parsed[2] || !1, a = parsed[1] || 1;
|
|
"-" == a && (a = -1);
|
|
var b = +parsed[3] || 0;
|
|
return parsed = "n" == special ? {
|
|
a: a,
|
|
b: b
|
|
} : "odd" == special ? {
|
|
a: 2,
|
|
b: 1
|
|
} : "even" == special ? {
|
|
a: 2,
|
|
b: 0
|
|
} : {
|
|
a: 0,
|
|
b: a
|
|
}, this.cacheNTH[argument] = parsed;
|
|
}, local.createNTHPseudo = function(child, sibling, positions, ofType) {
|
|
return function(node, argument) {
|
|
var uid = this.getUID(node);
|
|
if (!this[positions][uid]) {
|
|
var parent = node.parentNode;
|
|
if (!parent) return !1;
|
|
var el = parent[child], count = 1;
|
|
if (ofType) {
|
|
var nodeName = node.nodeName;
|
|
do {
|
|
if (el.nodeName != nodeName) continue;
|
|
this[positions][this.getUID(el)] = count++;
|
|
}while (el = el[sibling])
|
|
} else do {
|
|
if (1 != el.nodeType) continue;
|
|
this[positions][this.getUID(el)] = count++;
|
|
}while (el = el[sibling])
|
|
}
|
|
argument = argument || "n";
|
|
var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
|
|
if (!parsed) return !1;
|
|
var a = parsed.a, b = parsed.b, pos = this[positions][uid];
|
|
if (0 == a) return b == pos;
|
|
if (a > 0) {
|
|
if (pos < b) return !1;
|
|
} else if (b < pos) return !1;
|
|
return (pos - b) % a == 0;
|
|
};
|
|
}, local.pushArray = function(node, tag, id, classes, attributes, pseudos) {
|
|
this.matchSelector(node, tag, id, classes, attributes, pseudos) && this.found.push(node);
|
|
}, local.pushUID = function(node, tag, id, classes, attributes, pseudos) {
|
|
var uid = this.getUID(node);
|
|
!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos) && (this.uniques[uid] = !0, this.found.push(node));
|
|
}, local.matchNode = function(node, selector) {
|
|
if (this.isHTMLDocument && this.nativeMatchesSelector) try {
|
|
return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, "[$1=\"$2\"]"));
|
|
} catch (matchError) {}
|
|
var parsed = this.Slick.parse(selector);
|
|
if (!parsed) return !0;
|
|
var i, expressions = parsed.expressions, simpleExpCounter = 0;
|
|
for(i = 0; currentExpression = expressions[i]; i++)if (1 == currentExpression.length) {
|
|
var exp = currentExpression[0];
|
|
if (this.matchSelector(node, this.isXMLDocument ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return !0;
|
|
simpleExpCounter++;
|
|
}
|
|
if (simpleExpCounter == parsed.length) return !1;
|
|
var item, nodes = this.search(this.document, parsed);
|
|
for(i = 0; item = nodes[i++];)if (item === node) return !0;
|
|
return !1;
|
|
}, local.matchPseudo = function(node, name, argument) {
|
|
var pseudoName = "pseudo:" + name;
|
|
if (this[pseudoName]) return this[pseudoName](node, argument);
|
|
var attribute = this.getAttribute(node, name);
|
|
return argument ? argument == attribute : !!attribute;
|
|
}, local.matchSelector = function(node, tag, id, classes, attributes, pseudos) {
|
|
if (tag) {
|
|
var i, part, cls, nodeName = this.isXMLDocument ? node.nodeName : node.nodeName.toUpperCase();
|
|
if ("*" == tag) {
|
|
if (nodeName < "@") return !1;
|
|
} else if (nodeName != tag) return !1;
|
|
}
|
|
if (id && node.getAttribute("id") != id) return !1;
|
|
if (classes) {
|
|
for(i = classes.length; i--;)if (!((cls = this.getAttribute(node, "class")) && classes[i].regexp.test(cls))) return !1;
|
|
}
|
|
if (attributes) {
|
|
for(i = attributes.length; i--;)if ((part = attributes[i]).operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return !1;
|
|
}
|
|
if (pseudos) {
|
|
for(i = pseudos.length; i--;)if (part = pseudos[i], !this.matchPseudo(node, part.key, part.value)) return !1;
|
|
}
|
|
return !0;
|
|
};
|
|
var combinators = {
|
|
" ": function(node, tag, id, classes, attributes, pseudos, classList) {
|
|
var i, item, children;
|
|
if (this.isHTMLDocument) {
|
|
getById: if (id) {
|
|
if (!(item = this.document.getElementById(id)) && node.all || this.idGetsName && item && item.getAttributeNode("id").nodeValue != id) {
|
|
if (!(children = node.all[id])) return;
|
|
for(children[0] || (children = [
|
|
children
|
|
]), i = 0; item = children[i++];){
|
|
var idNode = item.getAttributeNode("id");
|
|
if (idNode && idNode.nodeValue == id) {
|
|
this.push(item, tag, null, classes, attributes, pseudos);
|
|
break;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
if (item) {
|
|
if (this.document !== node && !this.contains(node, item)) return;
|
|
} else {
|
|
if (this.contains(this.root, node)) return;
|
|
break getById;
|
|
}
|
|
this.push(item, tag, null, classes, attributes, pseudos);
|
|
return;
|
|
}
|
|
getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN) {
|
|
if (!((children = node.getElementsByClassName(classList.join(" "))) && children.length)) break getByClass;
|
|
for(i = 0; item = children[i++];)this.push(item, tag, id, null, attributes, pseudos);
|
|
return;
|
|
}
|
|
}
|
|
getByTag: {
|
|
if (!((children = node.getElementsByTagName(tag)) && children.length)) break getByTag;
|
|
for(this.brokenStarGEBTN || (tag = null), i = 0; item = children[i++];)this.push(item, tag, id, classes, attributes, pseudos);
|
|
}
|
|
},
|
|
">": function(node, tag, id, classes, attributes, pseudos) {
|
|
if (node = node.firstChild) do 1 == node.nodeType && this.push(node, tag, id, classes, attributes, pseudos);
|
|
while (node = node.nextSibling)
|
|
},
|
|
"+": function(node, tag, id, classes, attributes, pseudos) {
|
|
for(; node = node.nextSibling;)if (1 == node.nodeType) {
|
|
this.push(node, tag, id, classes, attributes, pseudos);
|
|
break;
|
|
}
|
|
},
|
|
"^": function(node, tag, id, classes, attributes, pseudos) {
|
|
(node = node.firstChild) && (1 == node.nodeType ? this.push(node, tag, id, classes, attributes, pseudos) : this["combinator:+"](node, tag, id, classes, attributes, pseudos));
|
|
},
|
|
"~": function(node, tag, id, classes, attributes, pseudos) {
|
|
for(; node = node.nextSibling;)if (1 == node.nodeType) {
|
|
var uid = this.getUID(node);
|
|
if (this.bitUniques[uid]) break;
|
|
this.bitUniques[uid] = !0, this.push(node, tag, id, classes, attributes, pseudos);
|
|
}
|
|
},
|
|
"++": function(node, tag, id, classes, attributes, pseudos) {
|
|
this["combinator:+"](node, tag, id, classes, attributes, pseudos), this["combinator:!+"](node, tag, id, classes, attributes, pseudos);
|
|
},
|
|
"~~": function(node, tag, id, classes, attributes, pseudos) {
|
|
this["combinator:~"](node, tag, id, classes, attributes, pseudos), this["combinator:!~"](node, tag, id, classes, attributes, pseudos);
|
|
},
|
|
"!": function(node, tag, id, classes, attributes, pseudos) {
|
|
for(; node = node.parentNode;)node !== this.document && this.push(node, tag, id, classes, attributes, pseudos);
|
|
},
|
|
"!>": function(node, tag, id, classes, attributes, pseudos) {
|
|
(node = node.parentNode) !== this.document && this.push(node, tag, id, classes, attributes, pseudos);
|
|
},
|
|
"!+": function(node, tag, id, classes, attributes, pseudos) {
|
|
for(; node = node.previousSibling;)if (1 == node.nodeType) {
|
|
this.push(node, tag, id, classes, attributes, pseudos);
|
|
break;
|
|
}
|
|
},
|
|
"!^": function(node, tag, id, classes, attributes, pseudos) {
|
|
(node = node.lastChild) && (1 == node.nodeType ? this.push(node, tag, id, classes, attributes, pseudos) : this["combinator:!+"](node, tag, id, classes, attributes, pseudos));
|
|
},
|
|
"!~": function(node, tag, id, classes, attributes, pseudos) {
|
|
for(; node = node.previousSibling;)if (1 == node.nodeType) {
|
|
var uid = this.getUID(node);
|
|
if (this.bitUniques[uid]) break;
|
|
this.bitUniques[uid] = !0, this.push(node, tag, id, classes, attributes, pseudos);
|
|
}
|
|
}
|
|
};
|
|
for(var c in combinators)local["combinator:" + c] = combinators[c];
|
|
var pseudos1 = {
|
|
empty: function(node) {
|
|
var child = node.firstChild;
|
|
return !(child && 1 == child.nodeType) && !(node.innerText || node.textContent || "").length;
|
|
},
|
|
not: function(node, expression) {
|
|
return !this.matchNode(node, expression);
|
|
},
|
|
contains: function(node, text) {
|
|
return (node.innerText || node.textContent || "").indexOf(text) > -1;
|
|
},
|
|
"first-child": function(node) {
|
|
for(; node = node.previousSibling;)if (1 == node.nodeType) return !1;
|
|
return !0;
|
|
},
|
|
"last-child": function(node) {
|
|
for(; node = node.nextSibling;)if (1 == node.nodeType) return !1;
|
|
return !0;
|
|
},
|
|
"only-child": function(node) {
|
|
for(var prev = node; prev = prev.previousSibling;)if (1 == prev.nodeType) return !1;
|
|
for(var next = node; next = next.nextSibling;)if (1 == next.nodeType) return !1;
|
|
return !0;
|
|
},
|
|
"nth-child": local.createNTHPseudo("firstChild", "nextSibling", "posNTH"),
|
|
"nth-last-child": local.createNTHPseudo("lastChild", "previousSibling", "posNTHLast"),
|
|
"nth-of-type": local.createNTHPseudo("firstChild", "nextSibling", "posNTHType", !0),
|
|
"nth-last-of-type": local.createNTHPseudo("lastChild", "previousSibling", "posNTHTypeLast", !0),
|
|
index: function(node, index) {
|
|
return this["pseudo:nth-child"](node, "" + (index + 1));
|
|
},
|
|
even: function(node) {
|
|
return this["pseudo:nth-child"](node, "2n");
|
|
},
|
|
odd: function(node) {
|
|
return this["pseudo:nth-child"](node, "2n+1");
|
|
},
|
|
"first-of-type": function(node) {
|
|
for(var nodeName = node.nodeName; node = node.previousSibling;)if (node.nodeName == nodeName) return !1;
|
|
return !0;
|
|
},
|
|
"last-of-type": function(node) {
|
|
for(var nodeName = node.nodeName; node = node.nextSibling;)if (node.nodeName == nodeName) return !1;
|
|
return !0;
|
|
},
|
|
"only-of-type": function(node) {
|
|
for(var prev = node, nodeName = node.nodeName; prev = prev.previousSibling;)if (prev.nodeName == nodeName) return !1;
|
|
for(var next = node; next = next.nextSibling;)if (next.nodeName == nodeName) return !1;
|
|
return !0;
|
|
},
|
|
enabled: function(node) {
|
|
return !node.disabled;
|
|
},
|
|
disabled: function(node) {
|
|
return node.disabled;
|
|
},
|
|
checked: function(node) {
|
|
return node.checked || node.selected;
|
|
},
|
|
focus: function(node) {
|
|
return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, "tabindex"));
|
|
},
|
|
root: function(node) {
|
|
return node === this.root;
|
|
},
|
|
selected: function(node) {
|
|
return node.selected;
|
|
}
|
|
};
|
|
for(var p in pseudos1)local["pseudo:" + p] = pseudos1[p];
|
|
var attributeGetters = local.attributeGetters = {
|
|
"for": function() {
|
|
return "htmlFor" in this ? this.htmlFor : this.getAttribute("for");
|
|
},
|
|
href: function() {
|
|
return "href" in this ? this.getAttribute("href", 2) : this.getAttribute("href");
|
|
},
|
|
style: function() {
|
|
return this.style ? this.style.cssText : this.getAttribute("style");
|
|
},
|
|
tabindex: function() {
|
|
var attributeNode = this.getAttributeNode("tabindex");
|
|
return attributeNode && attributeNode.specified ? attributeNode.nodeValue : null;
|
|
},
|
|
type: function() {
|
|
return this.getAttribute("type");
|
|
},
|
|
maxlength: function() {
|
|
var attributeNode = this.getAttributeNode("maxLength");
|
|
return attributeNode && attributeNode.specified ? attributeNode.nodeValue : null;
|
|
}
|
|
};
|
|
attributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength;
|
|
var Slick = local.Slick = this.Slick || {};
|
|
Slick.version = "1.1.7", Slick.search = function(context, expression, append) {
|
|
return local.search(context, expression, append);
|
|
}, Slick.find = function(context, expression) {
|
|
return local.search(context, expression, null, !0);
|
|
}, Slick.contains = function(container, node) {
|
|
return local.setDocument(container), local.contains(container, node);
|
|
}, Slick.getAttribute = function(node, name) {
|
|
return local.setDocument(node), local.getAttribute(node, name);
|
|
}, Slick.hasAttribute = function(node, name) {
|
|
return local.setDocument(node), local.hasAttribute(node, name);
|
|
}, Slick.match = function(node, selector) {
|
|
return !!node && !!selector && (!selector || selector === node || (local.setDocument(node), local.matchNode(node, selector)));
|
|
}, Slick.defineAttributeGetter = function(name, fn) {
|
|
return local.attributeGetters[name] = fn, this;
|
|
}, Slick.lookupAttributeGetter = function(name) {
|
|
return local.attributeGetters[name];
|
|
}, Slick.definePseudo = function(name, fn) {
|
|
return local["pseudo:" + name] = function(node, argument) {
|
|
return fn.call(node, argument);
|
|
}, this;
|
|
}, Slick.lookupPseudo = function(name) {
|
|
var pseudo = local["pseudo:" + name];
|
|
return pseudo ? function(argument) {
|
|
return pseudo.call(this, argument);
|
|
} : null;
|
|
}, Slick.override = function(regexp, fn) {
|
|
return local.override(regexp, fn), this;
|
|
}, Slick.isXML = local.isXML, Slick.uidOf = function(node) {
|
|
return local.getUIDHTML(node);
|
|
}, this.Slick || (this.Slick = Slick);
|
|
}).apply("undefined" != typeof exports ? exports : this);
|
|
var Element = function(tag, props) {
|
|
var konstructor = Element.Constructors[tag];
|
|
if (konstructor) return konstructor(props);
|
|
if ("string" != typeof tag) return document.id(tag).set(props);
|
|
if (props || (props = {}), !/^[\w-]+$/.test(tag)) {
|
|
var parsed = Slick.parse(tag).expressions[0][0];
|
|
tag = "*" == parsed.tag ? "div" : parsed.tag, parsed.id && null == props.id && (props.id = parsed.id);
|
|
var attributes = parsed.attributes;
|
|
if (attributes) for(var attr, i = 0, l = attributes.length; i < l; i++)null != props[(attr = attributes[i]).key] || (null != attr.value && "=" == attr.operator ? props[attr.key] = attr.value : attr.value || attr.operator || (props[attr.key] = !0));
|
|
parsed.classList && null == props.class && (props.class = parsed.classList.join(" "));
|
|
}
|
|
return document.newElement(tag, props);
|
|
};
|
|
Browser.Element && (Element.prototype = Browser.Element.prototype, fireEvent = Element.prototype.fireEvent, Element.prototype._fireEvent = function(type, event) {
|
|
return fireEvent.call(this, type, event);
|
|
}), new Type("Element", Element).mirror(function(name) {
|
|
if (!Array.prototype[name]) {
|
|
var obj = {};
|
|
obj[name] = function() {
|
|
for(var results = [], args = arguments, elements = !0, i = 0, l = this.length; i < l; i++){
|
|
var element = this[i], result = results[i] = element[name].apply(element, args);
|
|
elements = elements && "element" == typeOf(result);
|
|
}
|
|
return elements ? new Elements(results) : results;
|
|
}, Elements.implement(obj);
|
|
}
|
|
}), Browser.Element || (Element.parent = Object, Element.Prototype = {
|
|
"$constructor": Element,
|
|
"$family": Function.from("element").hide()
|
|
}, Element.mirror(function(name, method) {
|
|
Element.Prototype[name] = method;
|
|
})), Element.Constructors = {}, Element.Constructors = new Hash;
|
|
var IFrame = new Type("IFrame", function() {
|
|
var iframe, params = Array.link(arguments, {
|
|
properties: Type.isObject,
|
|
iframe: function(obj) {
|
|
return null != obj;
|
|
}
|
|
}), props = params.properties || {};
|
|
params.iframe && (iframe = document.id(params.iframe));
|
|
var onload = props.onload || function() {};
|
|
delete props.onload, props.id = props.name = [
|
|
props.id,
|
|
props.name,
|
|
iframe ? iframe.id || iframe.name : "IFrame_" + String.uniqueID()
|
|
].pick(), iframe = new Element(iframe || "iframe", props);
|
|
var onLoad = function() {
|
|
onload.call(iframe.contentWindow);
|
|
};
|
|
return window.frames[props.id] ? onLoad() : iframe.addListener("load", onLoad), iframe;
|
|
}), Elements = this.Elements = function(nodes) {
|
|
if (nodes && nodes.length) for(var node, uniques = {}, i = 0; node = nodes[i++];){
|
|
var uid = Slick.uidOf(node);
|
|
uniques[uid] || (uniques[uid] = !0, this.push(node));
|
|
}
|
|
};
|
|
Elements.prototype = {
|
|
length: 0
|
|
}, Elements.parent = Array, new Type("Elements", Elements).implement({
|
|
filter: (function(filter, bind) {
|
|
return filter ? new Elements(Array.filter(this, "string" == typeOf(filter) ? function(item) {
|
|
return item.match(filter);
|
|
} : filter, bind)) : this;
|
|
}).protect(),
|
|
push: (function() {
|
|
for(var length = this.length, i = 0, l = arguments.length; i < l; i++){
|
|
var item = document.id(arguments[i]);
|
|
item && (this[length++] = item);
|
|
}
|
|
return this.length = length;
|
|
}).protect(),
|
|
unshift: (function() {
|
|
for(var items = [], i = 0, l = arguments.length; i < l; i++){
|
|
var item = document.id(arguments[i]);
|
|
item && items.push(item);
|
|
}
|
|
return Array.prototype.unshift.apply(this, items);
|
|
}).protect(),
|
|
concat: (function() {
|
|
for(var newElements = new Elements(this), i = 0, l = arguments.length; i < l; i++){
|
|
var item = arguments[i];
|
|
Type.isEnumerable(item) ? newElements.append(item) : newElements.push(item);
|
|
}
|
|
return newElements;
|
|
}).protect(),
|
|
append: (function(collection) {
|
|
for(var i = 0, l = collection.length; i < l; i++)this.push(collection[i]);
|
|
return this;
|
|
}).protect(),
|
|
empty: (function() {
|
|
for(; this.length;)delete this[--this.length];
|
|
return this;
|
|
}).protect()
|
|
}), Elements.alias("extend", "append"), (function() {
|
|
var createElementAcceptsHTML, splice = Array.prototype.splice, object = {
|
|
"0": 0,
|
|
"1": 1,
|
|
length: 2
|
|
};
|
|
splice.call(object, 1, 1), 1 == object[1] && Elements.implement("splice", (function() {
|
|
for(var length = this.length, result = splice.apply(this, arguments); length >= this.length;)delete this[length--];
|
|
return result;
|
|
}).protect()), Array.forEachMethod(function(method, name) {
|
|
Elements.implement(name, method);
|
|
}), Array.mirror(Elements);
|
|
try {
|
|
createElementAcceptsHTML = "x" == document.createElement("<input name=x>").name;
|
|
} catch (e) {}
|
|
var escapeQuotes = function(html) {
|
|
return ("" + html).replace(/&/g, "&").replace(/"/g, """);
|
|
};
|
|
Document.implement({
|
|
newElement: function(tag, props) {
|
|
return props && null != props.checked && (props.defaultChecked = props.checked), createElementAcceptsHTML && props && (tag = "<" + tag, props.name && (tag += " name=\"" + escapeQuotes(props.name) + "\""), props.type && (tag += " type=\"" + escapeQuotes(props.type) + "\""), tag += ">", delete props.name, delete props.type), this.id(this.createElement(tag)).set(props);
|
|
}
|
|
});
|
|
})(), (function() {
|
|
Slick.uidOf(window), Slick.uidOf(document), Document.implement({
|
|
newTextNode: function(text) {
|
|
return this.createTextNode(text);
|
|
},
|
|
getDocument: function() {
|
|
return this;
|
|
},
|
|
getWindow: function() {
|
|
return this.window;
|
|
},
|
|
id: ((types = {
|
|
string: function(id, nocash, doc) {
|
|
return (id = Slick.find(doc, "#" + id.replace(/(\W)/g, "\\$1"))) ? types.element(id, nocash) : null;
|
|
},
|
|
element: function(el, nocash) {
|
|
if (Slick.uidOf(el), !nocash && !el.$family && !/^(?:object|embed)$/i.test(el.tagName)) {
|
|
var fireEvent1 = el.fireEvent;
|
|
el._fireEvent = function(type, event) {
|
|
return fireEvent1(type, event);
|
|
}, Object.append(el, Element.Prototype);
|
|
}
|
|
return el;
|
|
},
|
|
object: function(obj, nocash, doc) {
|
|
return obj.toElement ? types.element(obj.toElement(doc), nocash) : null;
|
|
}
|
|
}).textnode = types.whitespace = types.window = types.document = function(zero) {
|
|
return zero;
|
|
}, function(el, nocash, doc) {
|
|
if (el && el.$family && el.uniqueNumber) return el;
|
|
var type = typeOf(el);
|
|
return types[type] ? types[type](el, nocash, doc || document) : null;
|
|
})
|
|
}), null == window.$ && Window.implement("$", function(el, nc) {
|
|
return document.id(el, nc, this.document);
|
|
}), Window.implement({
|
|
getDocument: function() {
|
|
return this.document;
|
|
},
|
|
getWindow: function() {
|
|
return this;
|
|
}
|
|
}), [
|
|
Document,
|
|
Element
|
|
].invoke("implement", {
|
|
getElements: function(expression) {
|
|
return Slick.search(this, expression, new Elements);
|
|
},
|
|
getElement: function(expression) {
|
|
return document.id(Slick.find(this, expression));
|
|
}
|
|
});
|
|
var set, translations, types, search, find, match, pseudos, addSlickPseudos, contains = {
|
|
contains: function(element) {
|
|
return Slick.contains(this, element);
|
|
}
|
|
};
|
|
document.contains || Document.implement(contains), document.createElement("div").contains || Element.implement(contains), Element.implement("hasChild", function(element) {
|
|
return this !== element && this.contains(element);
|
|
}), search = Slick.search, find = Slick.find, match = Slick.match, this.Selectors = {}, pseudos = this.Selectors.Pseudo = new Hash(), addSlickPseudos = function() {
|
|
for(var name in pseudos)pseudos.hasOwnProperty(name) && (Slick.definePseudo(name, pseudos[name]), delete pseudos[name]);
|
|
}, Slick.search = function(context, expression, append) {
|
|
return addSlickPseudos(), search.call(this, context, expression, append);
|
|
}, Slick.find = function(context, expression) {
|
|
return addSlickPseudos(), find.call(this, context, expression);
|
|
}, Slick.match = function(node, selector) {
|
|
return addSlickPseudos(), match.call(this, node, selector);
|
|
};
|
|
var injectCombinator = function(expression, combinator) {
|
|
if (!expression) return combinator;
|
|
for(var expressions = (expression = Object.clone(Slick.parse(expression))).expressions, i = expressions.length; i--;)expressions[i][0].combinator = combinator;
|
|
return expression;
|
|
};
|
|
Object.forEach({
|
|
getNext: "~",
|
|
getPrevious: "!~",
|
|
getParent: "!"
|
|
}, function(combinator, method) {
|
|
Element.implement(method, function(expression) {
|
|
return this.getElement(injectCombinator(expression, combinator));
|
|
});
|
|
}), Object.forEach({
|
|
getAllNext: "~",
|
|
getAllPrevious: "!~",
|
|
getSiblings: "~~",
|
|
getChildren: ">",
|
|
getParents: "!"
|
|
}, function(combinator, method) {
|
|
Element.implement(method, function(expression) {
|
|
return this.getElements(injectCombinator(expression, combinator));
|
|
});
|
|
}), Element.implement({
|
|
getFirst: function(expression) {
|
|
return document.id(Slick.search(this, injectCombinator(expression, ">"))[0]);
|
|
},
|
|
getLast: function(expression) {
|
|
return document.id(Slick.search(this, injectCombinator(expression, ">")).getLast());
|
|
},
|
|
getWindow: function() {
|
|
return this.ownerDocument.window;
|
|
},
|
|
getDocument: function() {
|
|
return this.ownerDocument;
|
|
},
|
|
getElementById: function(id) {
|
|
return document.id(Slick.find(this, "#" + ("" + id).replace(/(\W)/g, "\\$1")));
|
|
},
|
|
match: function(expression) {
|
|
return !expression || Slick.match(this, expression);
|
|
}
|
|
}), null == window.$$ && Window.implement("$$", function(selector) {
|
|
var elements = new Elements;
|
|
if (1 == arguments.length && "string" == typeof selector) return Slick.search(this.document, selector, elements);
|
|
for(var args = Array.flatten(arguments), i = 0, l = args.length; i < l; i++){
|
|
var item = args[i];
|
|
switch(typeOf(item)){
|
|
case "element":
|
|
elements.push(item);
|
|
break;
|
|
case "string":
|
|
Slick.search(this.document, item, elements);
|
|
}
|
|
}
|
|
return elements;
|
|
}), null == window.$$ && Window.implement("$$", function(selector) {
|
|
if (1 == arguments.length) {
|
|
if ("string" == typeof selector) return Slick.search(this.document, selector, new Elements);
|
|
if (Type.isEnumerable(selector)) return new Elements(selector);
|
|
}
|
|
return new Elements(arguments);
|
|
});
|
|
var inserters = {
|
|
before: function(context, element) {
|
|
var parent = element.parentNode;
|
|
parent && parent.insertBefore(context, element);
|
|
},
|
|
after: function(context, element) {
|
|
var parent = element.parentNode;
|
|
parent && parent.insertBefore(context, element.nextSibling);
|
|
},
|
|
bottom: function(context, element) {
|
|
element.appendChild(context);
|
|
},
|
|
top: function(context, element) {
|
|
element.insertBefore(context, element.firstChild);
|
|
}
|
|
};
|
|
inserters.inside = inserters.bottom, Object.each(inserters, function(inserter, where) {
|
|
where = where.capitalize();
|
|
var methods = {};
|
|
methods["inject" + where] = function(el) {
|
|
return inserter(this, document.id(el, !0)), this;
|
|
}, methods["grab" + where] = function(el) {
|
|
return inserter(document.id(el, !0), this), this;
|
|
}, Element.implement(methods);
|
|
});
|
|
var propertyGetters = {}, propertySetters = {}, properties = {};
|
|
Array.forEach([
|
|
"type",
|
|
"value",
|
|
"defaultValue",
|
|
"accessKey",
|
|
"cellPadding",
|
|
"cellSpacing",
|
|
"colSpan",
|
|
"frameBorder",
|
|
"rowSpan",
|
|
"tabIndex",
|
|
"useMap"
|
|
], function(property) {
|
|
properties[property.toLowerCase()] = property;
|
|
}), properties.html = "innerHTML", properties.text = null == document.createElement("div").textContent ? "innerText" : "textContent", Object.forEach(properties, function(real, key) {
|
|
propertySetters[key] = function(node, value) {
|
|
node[real] = value;
|
|
}, propertyGetters[key] = function(node) {
|
|
return node[real];
|
|
};
|
|
});
|
|
var bools = [
|
|
"compact",
|
|
"nowrap",
|
|
"ismap",
|
|
"declare",
|
|
"noshade",
|
|
"checked",
|
|
"disabled",
|
|
"readOnly",
|
|
"multiple",
|
|
"selected",
|
|
"noresize",
|
|
"defer",
|
|
"defaultChecked",
|
|
"autofocus",
|
|
"controls",
|
|
"autoplay",
|
|
"loop"
|
|
], booleans = {};
|
|
Array.forEach(bools, function(bool) {
|
|
var lower = bool.toLowerCase();
|
|
booleans[lower] = bool, propertySetters[lower] = function(node, value) {
|
|
node[bool] = !!value;
|
|
}, propertyGetters[lower] = function(node) {
|
|
return !!node[bool];
|
|
};
|
|
}), Object.append(propertySetters, {
|
|
"class": function(node, value) {
|
|
"className" in node ? node.className = value || "" : node.setAttribute("class", value);
|
|
},
|
|
"for": function(node, value) {
|
|
"htmlFor" in node ? node.htmlFor = value : node.setAttribute("for", value);
|
|
},
|
|
style: function(node, value) {
|
|
node.style ? node.style.cssText = value : node.setAttribute("style", value);
|
|
},
|
|
value: function(node, value) {
|
|
node.value = null != value ? value : "";
|
|
}
|
|
}), propertyGetters.class = function(node) {
|
|
return "className" in node ? node.className || null : node.getAttribute("class");
|
|
};
|
|
var el1 = document.createElement("button");
|
|
try {
|
|
el1.type = "button";
|
|
} catch (e) {}
|
|
"button" != el1.type && (propertySetters.type = function(node, value) {
|
|
node.setAttribute("type", value);
|
|
}), el1 = null;
|
|
var div, input = document.createElement("input");
|
|
input.value = "t", input.type = "submit", "t" != input.value && (propertySetters.type = function(node, type) {
|
|
var value = node.value;
|
|
node.type = type, node.value = value;
|
|
}), input = null;
|
|
var pollutesGetAttribute = ((div = document.createElement("div")).random = "attribute", "attribute" == div.getAttribute("random"));
|
|
Element.implement({
|
|
setProperty: function(name, value) {
|
|
var setter = propertySetters[name.toLowerCase()];
|
|
if (setter) setter(this, value);
|
|
else {
|
|
if (pollutesGetAttribute) var attributeWhiteList = this.retrieve("$attributeWhiteList", {});
|
|
null == value ? (this.removeAttribute(name), pollutesGetAttribute && delete attributeWhiteList[name]) : (this.setAttribute(name, "" + value), pollutesGetAttribute && (attributeWhiteList[name] = !0));
|
|
}
|
|
return this;
|
|
},
|
|
setProperties: function(attributes) {
|
|
for(var attribute in attributes)this.setProperty(attribute, attributes[attribute]);
|
|
return this;
|
|
},
|
|
getProperty: function(name) {
|
|
var getter = propertyGetters[name.toLowerCase()];
|
|
if (getter) return getter(this);
|
|
if (pollutesGetAttribute) {
|
|
var attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve("$attributeWhiteList", {});
|
|
if (!attr) return null;
|
|
if (attr.expando && !attributeWhiteList[name]) {
|
|
var outer = this.outerHTML;
|
|
if (0 > outer.substr(0, outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name)) return null;
|
|
attributeWhiteList[name] = !0;
|
|
}
|
|
}
|
|
var result = Slick.getAttribute(this, name);
|
|
return result || Slick.hasAttribute(this, name) ? result : null;
|
|
},
|
|
getProperties: function() {
|
|
var args = Array.from(arguments);
|
|
return args.map(this.getProperty, this).associate(args);
|
|
},
|
|
removeProperty: function(name) {
|
|
return this.setProperty(name, null);
|
|
},
|
|
removeProperties: function() {
|
|
return Array.each(arguments, this.removeProperty, this), this;
|
|
},
|
|
set: (function(prop, value) {
|
|
var property = Element.Properties[prop];
|
|
property && property.set ? property.set.call(this, value) : this.setProperty(prop, value);
|
|
}).overloadSetter(),
|
|
get: (function(prop) {
|
|
var property = Element.Properties[prop];
|
|
return property && property.get ? property.get.apply(this) : this.getProperty(prop);
|
|
}).overloadGetter(),
|
|
erase: function(prop) {
|
|
var property = Element.Properties[prop];
|
|
return property && property.erase ? property.erase.apply(this) : this.removeProperty(prop), this;
|
|
},
|
|
hasClass: function(className) {
|
|
return this.className.clean().contains(className, " ");
|
|
},
|
|
addClass: function(className) {
|
|
return this.hasClass(className) || (this.className = (this.className + " " + className).clean()), this;
|
|
},
|
|
removeClass: function(className) {
|
|
return this.className = this.className.replace(new RegExp("(^|\\s)" + className + "(?:\\s|$)"), "$1"), this;
|
|
},
|
|
toggleClass: function(className, force) {
|
|
return null == force && (force = !this.hasClass(className)), force ? this.addClass(className) : this.removeClass(className);
|
|
},
|
|
adopt: function() {
|
|
var fragment, parent = this, elements = Array.flatten(arguments), length = elements.length;
|
|
length > 1 && (parent = fragment = document.createDocumentFragment());
|
|
for(var i = 0; i < length; i++){
|
|
var element = document.id(elements[i], !0);
|
|
element && parent.appendChild(element);
|
|
}
|
|
return fragment && this.appendChild(fragment), this;
|
|
},
|
|
appendText: function(text, where) {
|
|
return this.grab(this.getDocument().newTextNode(text), where);
|
|
},
|
|
grab: function(el, where) {
|
|
return inserters[where || "bottom"](document.id(el, !0), this), this;
|
|
},
|
|
inject: function(el, where) {
|
|
return inserters[where || "bottom"](this, document.id(el, !0)), this;
|
|
},
|
|
replaces: function(el) {
|
|
return (el = document.id(el, !0)).parentNode.replaceChild(this, el), this;
|
|
},
|
|
wraps: function(el, where) {
|
|
return el = document.id(el, !0), this.replaces(el).grab(el, where);
|
|
},
|
|
getSelected: function() {
|
|
return this.selectedIndex, new Elements(Array.from(this.options).filter(function(option) {
|
|
return option.selected;
|
|
}));
|
|
},
|
|
toQueryString: function() {
|
|
var queryString = [];
|
|
return this.getElements("input, select, textarea").each(function(el) {
|
|
var type = el.type;
|
|
if (el.name && !el.disabled && "submit" != type && "reset" != type && "file" != type && "image" != type) {
|
|
var value = "select" == el.get("tag") ? el.getSelected().map(function(opt) {
|
|
return document.id(opt).get("value");
|
|
}) : "radio" != type && "checkbox" != type || el.checked ? el.get("value") : null;
|
|
Array.from(value).each(function(val) {
|
|
void 0 !== val && queryString.push(encodeURIComponent(el.name) + "=" + encodeURIComponent(val));
|
|
});
|
|
}
|
|
}), queryString.join("&");
|
|
}
|
|
});
|
|
var collected = {}, storage1 = {}, get = function(uid) {
|
|
return storage1[uid] || (storage1[uid] = {});
|
|
}, clean = function(item) {
|
|
var uid = item.uniqueNumber;
|
|
return item.removeEvents && item.removeEvents(), item.clearAttributes && item.clearAttributes(), null != uid && (delete collected[uid], delete storage1[uid]), item;
|
|
}, formProps = {
|
|
input: "checked",
|
|
option: "selected",
|
|
textarea: "value"
|
|
};
|
|
Element.implement({
|
|
destroy: function() {
|
|
var children = clean(this).getElementsByTagName("*");
|
|
return Array.each(children, clean), Element.dispose(this), null;
|
|
},
|
|
empty: function() {
|
|
return Array.from(this.childNodes).each(Element.dispose), this;
|
|
},
|
|
dispose: function() {
|
|
return this.parentNode ? this.parentNode.removeChild(this) : this;
|
|
},
|
|
clone: function(contents, keepid) {
|
|
contents = !1 !== contents;
|
|
var i, clone = this.cloneNode(contents), ce = [
|
|
clone
|
|
], te = [
|
|
this
|
|
];
|
|
for(contents && (ce.append(Array.from(clone.getElementsByTagName("*"))), te.append(Array.from(this.getElementsByTagName("*")))), i = ce.length; i--;){
|
|
var node = ce[i], element = te[i];
|
|
if (keepid || node.removeAttribute("id"), node.clearAttributes && (node.clearAttributes(), node.mergeAttributes(element), node.removeAttribute("uniqueNumber"), node.options)) for(var no = node.options, eo = element.options, j = no.length; j--;)no[j].selected = eo[j].selected;
|
|
var prop = formProps[element.tagName.toLowerCase()];
|
|
prop && element[prop] && (node[prop] = element[prop]);
|
|
}
|
|
if (Browser.ie) {
|
|
var co = clone.getElementsByTagName("object"), to = this.getElementsByTagName("object");
|
|
for(i = co.length; i--;)co[i].outerHTML = to[i].outerHTML;
|
|
}
|
|
return document.id(clone);
|
|
}
|
|
}), [
|
|
Element,
|
|
Window,
|
|
Document
|
|
].invoke("implement", {
|
|
addListener: function(type, fn) {
|
|
if ("unload" == type) {
|
|
var old = fn, self = this;
|
|
fn = function() {
|
|
self.removeListener("unload", fn), old();
|
|
};
|
|
} else collected[Slick.uidOf(this)] = this;
|
|
return this.addEventListener ? this.addEventListener(type, fn, !!arguments[2]) : this.attachEvent("on" + type, fn), this;
|
|
},
|
|
removeListener: function(type, fn) {
|
|
return this.removeEventListener ? this.removeEventListener(type, fn, !!arguments[2]) : this.detachEvent("on" + type, fn), this;
|
|
},
|
|
retrieve: function(property, dflt) {
|
|
var storage = get(Slick.uidOf(this)), prop = storage[property];
|
|
return null != dflt && null == prop && (prop = storage[property] = dflt), null != prop ? prop : null;
|
|
},
|
|
store: function(property, value) {
|
|
return get(Slick.uidOf(this))[property] = value, this;
|
|
},
|
|
eliminate: function(property) {
|
|
return delete get(Slick.uidOf(this))[property], this;
|
|
}
|
|
}), window.attachEvent && !window.addEventListener && window.addListener("unload", function() {
|
|
Object.each(collected, clean), window.CollectGarbage && CollectGarbage();
|
|
}), Element.Properties = {}, Element.Properties = new Hash, Element.Properties.style = {
|
|
set: function(style) {
|
|
this.style.cssText = style;
|
|
},
|
|
get: function() {
|
|
return this.style.cssText;
|
|
},
|
|
erase: function() {
|
|
this.style.cssText = "";
|
|
}
|
|
}, Element.Properties.tag = {
|
|
get: function() {
|
|
return this.tagName.toLowerCase();
|
|
}
|
|
}, Element.Properties.html = {
|
|
set: function(html) {
|
|
null == html ? html = "" : "array" == typeOf(html) && (html = html.join("")), this.innerHTML = html;
|
|
},
|
|
erase: function() {
|
|
this.innerHTML = "";
|
|
}
|
|
};
|
|
var div1 = document.createElement("div");
|
|
div1.innerHTML = "<nav></nav>";
|
|
var supportsHTML5Elements = 1 == div1.childNodes.length;
|
|
if (!supportsHTML5Elements) for(var tags = "abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "), fragment1 = document.createDocumentFragment(), l2 = tags.length; l2--;)fragment1.createElement(tags[l2]);
|
|
div1 = null;
|
|
var supportsTableInnerHTML = Function.attempt(function() {
|
|
return document.createElement("table").innerHTML = "<tr><td></td></tr>", !0;
|
|
}), tr = document.createElement("tr"), html1 = "<td></td>";
|
|
tr.innerHTML = html1;
|
|
var supportsTRInnerHTML = tr.innerHTML == html1;
|
|
tr = null, supportsTableInnerHTML && supportsTRInnerHTML && supportsHTML5Elements || (Element.Properties.html.set = (set = Element.Properties.html.set, (translations = {
|
|
table: [
|
|
1,
|
|
"<table>",
|
|
"</table>"
|
|
],
|
|
select: [
|
|
1,
|
|
"<select>",
|
|
"</select>"
|
|
],
|
|
tbody: [
|
|
2,
|
|
"<table><tbody>",
|
|
"</tbody></table>"
|
|
],
|
|
tr: [
|
|
3,
|
|
"<table><tbody><tr>",
|
|
"</tr></tbody></table>"
|
|
]
|
|
}).thead = translations.tfoot = translations.tbody, function(html) {
|
|
var wrap = translations[this.get("tag")];
|
|
if (wrap || supportsHTML5Elements || (wrap = [
|
|
0,
|
|
"",
|
|
""
|
|
]), !wrap) return set.call(this, html);
|
|
var level = wrap[0], wrapper = document.createElement("div"), target = wrapper;
|
|
for(supportsHTML5Elements || fragment1.appendChild(wrapper), wrapper.innerHTML = [
|
|
wrap[1],
|
|
html,
|
|
wrap[2]
|
|
].flatten().join(""); level--;)target = target.firstChild;
|
|
this.empty().adopt(target.childNodes), supportsHTML5Elements || fragment1.removeChild(wrapper), wrapper = null;
|
|
}));
|
|
var testForm = document.createElement("form");
|
|
testForm.innerHTML = "<select><option>s</option></select>", "s" != testForm.firstChild.value && (Element.Properties.value = {
|
|
set: function(value) {
|
|
if ("select" != this.get("tag")) return this.setProperty("value", value);
|
|
for(var options = this.getElements("option"), i = 0; i < options.length; i++){
|
|
var option = options[i], attr = option.getAttributeNode("value");
|
|
if ((attr && attr.specified ? option.value : option.get("text")) == value) return option.selected = !0;
|
|
}
|
|
},
|
|
get: function() {
|
|
var option = this, tag = option.get("tag");
|
|
if ("select" != tag && "option" != tag) return this.getProperty("value");
|
|
if ("select" == tag && !(option = option.getSelected()[0])) return "";
|
|
var attr = option.getAttributeNode("value");
|
|
return attr && attr.specified ? option.value : option.get("text");
|
|
}
|
|
}), testForm = null, document.createElement("div").getAttributeNode("id") && (Element.Properties.id = {
|
|
set: function(id) {
|
|
this.id = this.getAttributeNode("id").value = id;
|
|
},
|
|
get: function() {
|
|
return this.id || null;
|
|
},
|
|
erase: function() {
|
|
this.id = this.getAttributeNode("id").value = "";
|
|
}
|
|
});
|
|
})(), (function() {
|
|
var html = document.html, el = document.createElement("div");
|
|
el.style.color = "red", el.style.color = null;
|
|
var doesNotRemoveStyles = "red" == el.style.color;
|
|
el = null, Element.Properties.styles = {
|
|
set: function(styles) {
|
|
this.setStyles(styles);
|
|
}
|
|
};
|
|
var hasOpacity = null != html.style.opacity, hasFilter = null != html.style.filter, reAlpha = /alpha\(opacity=([\d.]+)\)/i, setVisibility = function(element, opacity) {
|
|
element.store("$opacity", opacity), element.style.visibility = opacity > 0 || null == opacity ? "visible" : "hidden";
|
|
}, setOpacity = hasOpacity ? function(element, opacity) {
|
|
element.style.opacity = opacity;
|
|
} : hasFilter ? function(element, opacity) {
|
|
var style = element.style;
|
|
element.currentStyle && element.currentStyle.hasLayout || (style.zoom = 1), opacity = null == opacity || 1 == opacity ? "" : "alpha(opacity=" + (100 * opacity).limit(0, 100).round() + ")";
|
|
var filter = style.filter || element.getComputedStyle("filter") || "";
|
|
style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity, style.filter || style.removeAttribute("filter");
|
|
} : setVisibility, getOpacity = hasOpacity ? function(element) {
|
|
var opacity = element.style.opacity || element.getComputedStyle("opacity");
|
|
return "" == opacity ? 1 : opacity.toFloat();
|
|
} : hasFilter ? function(element) {
|
|
var opacity, filter = element.style.filter || element.getComputedStyle("filter");
|
|
return filter && (opacity = filter.match(reAlpha)), null == opacity || null == filter ? 1 : opacity[1] / 100;
|
|
} : function(element) {
|
|
var opacity = element.retrieve("$opacity");
|
|
return null == opacity && (opacity = "hidden" == element.style.visibility ? 0 : 1), opacity;
|
|
}, floatName = null == html.style.cssFloat ? "styleFloat" : "cssFloat";
|
|
Element.implement({
|
|
getComputedStyle: function(property) {
|
|
if (this.currentStyle) return this.currentStyle[property.camelCase()];
|
|
var defaultView = Element.getDocument(this).defaultView, computed = defaultView ? defaultView.getComputedStyle(this, null) : null;
|
|
return computed ? computed.getPropertyValue(property == floatName ? "float" : property.hyphenate()) : null;
|
|
},
|
|
setStyle: function(property, value) {
|
|
if ("opacity" == property) return null != value && (value = parseFloat(value)), setOpacity(this, value), this;
|
|
if (property = ("float" == property ? floatName : property).camelCase(), "string" != typeOf(value)) {
|
|
var map = (Element.Styles[property] || "@").split(" ");
|
|
value = Array.from(value).map(function(val, i) {
|
|
return map[i] ? "number" == typeOf(val) ? map[i].replace("@", Math.round(val)) : val : "";
|
|
}).join(" ");
|
|
} else value == String(Number(value)) && (value = Math.round(value));
|
|
return this.style[property] = value, ("" == value || null == value) && doesNotRemoveStyles && this.style.removeAttribute && this.style.removeAttribute(property), this;
|
|
},
|
|
getStyle: function(property) {
|
|
if ("opacity" == property) return getOpacity(this);
|
|
property = ("float" == property ? floatName : property).camelCase();
|
|
var result = this.style[property];
|
|
if (!result || "zIndex" == property) {
|
|
for(var style in result = [], Element.ShortStyles)if (property == style) {
|
|
for(var s in Element.ShortStyles[style])result.push(this.getStyle(s));
|
|
return result.join(" ");
|
|
}
|
|
result = this.getComputedStyle(property);
|
|
}
|
|
if (result) {
|
|
var color = (result = String(result)).match(/rgba?\([\d\s,]+\)/);
|
|
color && (result = result.replace(color[0], color[0].rgbToHex()));
|
|
}
|
|
if (Browser.opera || Browser.ie) {
|
|
if (/^(height|width)$/.test(property) && !/px$/.test(result)) {
|
|
var values = "width" == property ? [
|
|
"left",
|
|
"right"
|
|
] : [
|
|
"top",
|
|
"bottom"
|
|
], size = 0;
|
|
return values.each(function(value) {
|
|
size += this.getStyle("border-" + value + "-width").toInt() + this.getStyle("padding-" + value).toInt();
|
|
}, this), this["offset" + property.capitalize()] - size + "px";
|
|
}
|
|
if (Browser.ie && /^border(.+)Width|margin|padding/.test(property) && isNaN(parseFloat(result))) return "0px";
|
|
}
|
|
return result;
|
|
},
|
|
setStyles: function(styles) {
|
|
for(var style in styles)this.setStyle(style, styles[style]);
|
|
return this;
|
|
},
|
|
getStyles: function() {
|
|
var result = {};
|
|
return Array.flatten(arguments).each(function(key) {
|
|
result[key] = this.getStyle(key);
|
|
}, this), result;
|
|
}
|
|
}), Element.Styles = {
|
|
left: "@px",
|
|
top: "@px",
|
|
bottom: "@px",
|
|
right: "@px",
|
|
width: "@px",
|
|
height: "@px",
|
|
maxWidth: "@px",
|
|
maxHeight: "@px",
|
|
minWidth: "@px",
|
|
minHeight: "@px",
|
|
backgroundColor: "rgb(@, @, @)",
|
|
backgroundPosition: "@px @px",
|
|
color: "rgb(@, @, @)",
|
|
fontSize: "@px",
|
|
letterSpacing: "@px",
|
|
lineHeight: "@px",
|
|
clip: "rect(@px @px @px @px)",
|
|
margin: "@px @px @px @px",
|
|
padding: "@px @px @px @px",
|
|
border: "@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",
|
|
borderWidth: "@px @px @px @px",
|
|
borderStyle: "@ @ @ @",
|
|
borderColor: "rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",
|
|
zIndex: "@",
|
|
zoom: "@",
|
|
fontWeight: "@",
|
|
textIndent: "@px",
|
|
opacity: "@"
|
|
}, Element.implement({
|
|
setOpacity: function(value) {
|
|
return setOpacity(this, value), this;
|
|
},
|
|
getOpacity: function() {
|
|
return getOpacity(this);
|
|
}
|
|
}), Element.Properties.opacity = {
|
|
set: function(opacity) {
|
|
setOpacity(this, opacity), setVisibility(this, opacity);
|
|
},
|
|
get: function() {
|
|
return getOpacity(this);
|
|
}
|
|
}, Element.Styles = new Hash(Element.Styles), Element.ShortStyles = {
|
|
margin: {},
|
|
padding: {},
|
|
border: {},
|
|
borderWidth: {},
|
|
borderStyle: {},
|
|
borderColor: {}
|
|
}, [
|
|
"Top",
|
|
"Right",
|
|
"Bottom",
|
|
"Left"
|
|
].each(function(direction) {
|
|
var Short = Element.ShortStyles, All = Element.Styles;
|
|
[
|
|
"margin",
|
|
"padding"
|
|
].each(function(style) {
|
|
var sd = style + direction;
|
|
Short[style][sd] = All[sd] = "@px";
|
|
});
|
|
var bd = "border" + direction;
|
|
Short.border[bd] = All[bd] = "@px @ rgb(@, @, @)";
|
|
var bdw = bd + "Width", bds = bd + "Style", bdc = bd + "Color";
|
|
Short[bd] = {}, Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = "@px", Short.borderStyle[bds] = Short[bd][bds] = All[bds] = "@", Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = "rgb(@, @, @)";
|
|
});
|
|
})(), (function() {
|
|
if (Element.Properties.events = {
|
|
set: function(events) {
|
|
this.addEvents(events);
|
|
}
|
|
}, [
|
|
Element,
|
|
Window,
|
|
Document
|
|
].invoke("implement", {
|
|
addEvent: function(type, fn) {
|
|
var events = this.retrieve("events", {});
|
|
if (events[type] || (events[type] = {
|
|
keys: [],
|
|
values: []
|
|
}), events[type].keys.contains(fn)) return this;
|
|
events[type].keys.push(fn);
|
|
var realType = type, custom = Element.Events[type], condition = fn, self = this;
|
|
custom && (custom.onAdd && custom.onAdd.call(this, fn, type), custom.condition && (condition = function(event) {
|
|
return !custom.condition.call(this, event, type) || fn.call(this, event);
|
|
}), custom.base && (realType = Function.from(custom.base).call(this, type)));
|
|
var defn = function() {
|
|
return fn.call(self);
|
|
}, nativeEvent = Element.NativeEvents[realType];
|
|
return nativeEvent && (2 == nativeEvent && (defn = function(event) {
|
|
event = new DOMEvent(event, self.getWindow()), !1 === condition.call(self, event) && event.stop();
|
|
}), this.addListener(realType, defn, arguments[2])), events[type].values.push(defn), this;
|
|
},
|
|
removeEvent: function(type, fn) {
|
|
var events = this.retrieve("events");
|
|
if (!events || !events[type]) return this;
|
|
var list = events[type], index = list.keys.indexOf(fn);
|
|
if (-1 == index) return this;
|
|
var value = list.values[index];
|
|
delete list.keys[index], delete list.values[index];
|
|
var custom = Element.Events[type];
|
|
return custom && (custom.onRemove && custom.onRemove.call(this, fn, type), custom.base && (type = Function.from(custom.base).call(this, type))), Element.NativeEvents[type] ? this.removeListener(type, value, arguments[2]) : this;
|
|
},
|
|
addEvents: function(events) {
|
|
for(var event in events)this.addEvent(event, events[event]);
|
|
return this;
|
|
},
|
|
removeEvents: function(events) {
|
|
if ("object" == typeOf(events)) {
|
|
for(type in events)this.removeEvent(type, events[type]);
|
|
return this;
|
|
}
|
|
var type, attached = this.retrieve("events");
|
|
if (!attached) return this;
|
|
if (events) attached[events] && (attached[events].keys.each(function(fn) {
|
|
this.removeEvent(events, fn);
|
|
}, this), delete attached[events]);
|
|
else {
|
|
for(type in attached)this.removeEvents(type);
|
|
this.eliminate("events");
|
|
}
|
|
return this;
|
|
},
|
|
fireEvent: function(type, args, delay) {
|
|
var events = this.retrieve("events");
|
|
return events && events[type] && (args = Array.from(args), events[type].keys.each(function(fn) {
|
|
delay ? fn.delay(delay, this, args) : fn.apply(this, args);
|
|
}, this)), this;
|
|
},
|
|
cloneEvents: function(from, type) {
|
|
var events = (from = document.id(from)).retrieve("events");
|
|
if (!events) return this;
|
|
if (type) events[type] && events[type].keys.each(function(fn) {
|
|
this.addEvent(type, fn);
|
|
}, this);
|
|
else for(var eventType in events)this.cloneEvents(from, eventType);
|
|
return this;
|
|
}
|
|
}), Element.NativeEvents = {
|
|
click: 2,
|
|
dblclick: 2,
|
|
mouseup: 2,
|
|
mousedown: 2,
|
|
contextmenu: 2,
|
|
mousewheel: 2,
|
|
DOMMouseScroll: 2,
|
|
mouseover: 2,
|
|
mouseout: 2,
|
|
mousemove: 2,
|
|
selectstart: 2,
|
|
selectend: 2,
|
|
keydown: 2,
|
|
keypress: 2,
|
|
keyup: 2,
|
|
orientationchange: 2,
|
|
touchstart: 2,
|
|
touchmove: 2,
|
|
touchend: 2,
|
|
touchcancel: 2,
|
|
gesturestart: 2,
|
|
gesturechange: 2,
|
|
gestureend: 2,
|
|
focus: 2,
|
|
blur: 2,
|
|
change: 2,
|
|
reset: 2,
|
|
select: 2,
|
|
submit: 2,
|
|
paste: 2,
|
|
input: 2,
|
|
load: 2,
|
|
unload: 1,
|
|
beforeunload: 2,
|
|
resize: 1,
|
|
move: 1,
|
|
DOMContentLoaded: 1,
|
|
readystatechange: 1,
|
|
error: 1,
|
|
abort: 1,
|
|
scroll: 1
|
|
}, Element.Events = {
|
|
mousewheel: {
|
|
base: Browser.firefox ? "DOMMouseScroll" : "mousewheel"
|
|
}
|
|
}, "onmouseenter" in document.documentElement) Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2;
|
|
else {
|
|
var check = function(event) {
|
|
var related = event.relatedTarget;
|
|
return null == related || !!related && related != this && "xul" != related.prefix && "document" != typeOf(this) && !this.contains(related);
|
|
};
|
|
Element.Events.mouseenter = {
|
|
base: "mouseover",
|
|
condition: check
|
|
}, Element.Events.mouseleave = {
|
|
base: "mouseout",
|
|
condition: check
|
|
};
|
|
}
|
|
window.addEventListener || (Element.NativeEvents.propertychange = 2, Element.Events.change = {
|
|
base: function() {
|
|
var type = this.type;
|
|
return "input" == this.get("tag") && ("radio" == type || "checkbox" == type) ? "propertychange" : "change";
|
|
},
|
|
condition: function(event) {
|
|
return "radio" != this.type || "checked" == event.event.propertyName && this.checked;
|
|
}
|
|
}), Element.Events = new Hash(Element.Events);
|
|
})(), (function() {
|
|
var eventListenerSupport = !!window.addEventListener;
|
|
Element.NativeEvents.focusin = Element.NativeEvents.focusout = 2;
|
|
var bubbleUp = function(self, match, fn, event, target) {
|
|
for(; target && target != self;){
|
|
if (match(target, event)) return fn.call(target, event, target);
|
|
target = document.id(target.parentNode);
|
|
}
|
|
}, map = {
|
|
mouseenter: {
|
|
base: "mouseover"
|
|
},
|
|
mouseleave: {
|
|
base: "mouseout"
|
|
},
|
|
focus: {
|
|
base: "focus" + (eventListenerSupport ? "" : "in"),
|
|
capture: !0
|
|
},
|
|
blur: {
|
|
base: eventListenerSupport ? "blur" : "focusout",
|
|
capture: !0
|
|
}
|
|
}, _key = "$delegation:", formObserver = function(type) {
|
|
return {
|
|
base: "focusin",
|
|
remove: function(self, uid) {
|
|
var list = self.retrieve(_key + type + "listeners", {})[uid];
|
|
if (list && list.forms) for(var i = list.forms.length; i--;)list.forms[i].removeEvent(type, list.fns[i]);
|
|
},
|
|
listen: function(self, match, fn, event1, target, uid) {
|
|
var form = "form" == target.get("tag") ? target : event1.target.getParent("form");
|
|
if (form) {
|
|
var listeners = self.retrieve(_key + type + "listeners", {}), listener = listeners[uid] || {
|
|
forms: [],
|
|
fns: []
|
|
}, forms = listener.forms, fns = listener.fns;
|
|
if (-1 == forms.indexOf(form)) {
|
|
forms.push(form);
|
|
var _fn = function(event) {
|
|
bubbleUp(self, match, fn, event, target);
|
|
};
|
|
form.addEvent(type, _fn), fns.push(_fn), listeners[uid] = listener, self.store(_key + type + "listeners", listeners);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}, inputObserver = function(type) {
|
|
return {
|
|
base: "focusin",
|
|
listen: function(self, match, fn, event2, target) {
|
|
var events = {
|
|
blur: function() {
|
|
this.removeEvents(events);
|
|
}
|
|
};
|
|
events[type] = function(event) {
|
|
bubbleUp(self, match, fn, event, target);
|
|
}, event2.target.addEvents(events);
|
|
}
|
|
};
|
|
};
|
|
eventListenerSupport || Object.append(map, {
|
|
submit: formObserver("submit"),
|
|
reset: formObserver("reset"),
|
|
change: inputObserver("change"),
|
|
select: inputObserver("select")
|
|
});
|
|
var proto = Element.prototype, addEvent = proto.addEvent, removeEvent = proto.removeEvent, relay = function(old, method) {
|
|
return function(type, fn, useCapture) {
|
|
if (-1 == type.indexOf(":relay")) return old.call(this, type, fn, useCapture);
|
|
var parsed = Slick.parse(type).expressions[0][0];
|
|
if ("relay" != parsed.pseudos[0].key) return old.call(this, type, fn, useCapture);
|
|
var newType = parsed.tag;
|
|
return parsed.pseudos.slice(1).each(function(pseudo) {
|
|
newType += ":" + pseudo.key + (pseudo.value ? "(" + pseudo.value + ")" : "");
|
|
}), old.call(this, type, fn), method.call(this, newType, parsed.pseudos[0].value, fn);
|
|
};
|
|
}, delegation = {
|
|
addEvent: function(type, match, fn) {
|
|
var storage = this.retrieve("$delegates", {}), stored = storage[type];
|
|
if (stored) {
|
|
for(var _uid in stored)if (stored[_uid].fn == fn && stored[_uid].match == match) return this;
|
|
}
|
|
var _type = type, _match = match, _fn = fn, _map = map[type] || {};
|
|
type = _map.base || _type, match = function(target) {
|
|
return Slick.match(target, _match);
|
|
};
|
|
var elementEvent = Element.Events[_type];
|
|
if (elementEvent && elementEvent.condition) {
|
|
var __match = match, condition = elementEvent.condition;
|
|
match = function(target, event) {
|
|
return __match(target, event) && condition.call(target, event, type);
|
|
};
|
|
}
|
|
var self = this, uid = String.uniqueID(), delegator = _map.listen ? function(event, target) {
|
|
!target && event && event.target && (target = event.target), target && _map.listen(self, match, fn, event, target, uid);
|
|
} : function(event, target) {
|
|
!target && event && event.target && (target = event.target), target && bubbleUp(self, match, fn, event, target);
|
|
};
|
|
return stored || (stored = {}), stored[uid] = {
|
|
match: _match,
|
|
fn: _fn,
|
|
delegator: delegator
|
|
}, storage[_type] = stored, addEvent.call(this, type, delegator, _map.capture);
|
|
},
|
|
removeEvent: function(type, match, fn, _uid) {
|
|
var __uid, s, storage = this.retrieve("$delegates", {}), stored = storage[type];
|
|
if (!stored) return this;
|
|
if (_uid) {
|
|
var _type = type, delegator = stored[_uid].delegator, _map = map[type] || {};
|
|
return type = _map.base || _type, _map.remove && _map.remove(this, _uid), delete stored[_uid], storage[_type] = stored, removeEvent.call(this, type, delegator);
|
|
}
|
|
if (fn) {
|
|
for(__uid in stored)if ((s = stored[__uid]).match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid);
|
|
} else for(__uid in stored)(s = stored[__uid]).match == match && delegation.removeEvent.call(this, type, match, s.fn, __uid);
|
|
return this;
|
|
}
|
|
};
|
|
[
|
|
Element,
|
|
Window,
|
|
Document
|
|
].invoke("implement", {
|
|
addEvent: relay(addEvent, delegation.addEvent),
|
|
removeEvent: relay(removeEvent, delegation.removeEvent)
|
|
});
|
|
})(), (function() {
|
|
var element1 = document.createElement("div"), child = document.createElement("div");
|
|
element1.style.height = "0", element1.appendChild(child);
|
|
var brokenOffsetParent = child.offsetParent === element1;
|
|
element1 = child = null;
|
|
var isOffset = function(el) {
|
|
return "static" != styleString(el, "position") || isBody(el);
|
|
}, isOffsetStatic = function(el) {
|
|
return isOffset(el) || /^(?:table|td|th)$/i.test(el.tagName);
|
|
};
|
|
Element.implement({
|
|
scrollTo: function(x, y) {
|
|
return isBody(this) ? this.getWindow().scrollTo(x, y) : (this.scrollLeft = x, this.scrollTop = y), this;
|
|
},
|
|
getSize: function() {
|
|
return isBody(this) ? this.getWindow().getSize() : {
|
|
x: this.offsetWidth,
|
|
y: this.offsetHeight
|
|
};
|
|
},
|
|
getScrollSize: function() {
|
|
return isBody(this) ? this.getWindow().getScrollSize() : {
|
|
x: this.scrollWidth,
|
|
y: this.scrollHeight
|
|
};
|
|
},
|
|
getScroll: function() {
|
|
return isBody(this) ? this.getWindow().getScroll() : {
|
|
x: this.scrollLeft,
|
|
y: this.scrollTop
|
|
};
|
|
},
|
|
getScrolls: function() {
|
|
for(var element = this.parentNode, position = {
|
|
x: 0,
|
|
y: 0
|
|
}; element && !isBody(element);)position.x += element.scrollLeft, position.y += element.scrollTop, element = element.parentNode;
|
|
return position;
|
|
},
|
|
getOffsetParent: brokenOffsetParent ? function() {
|
|
var element = this;
|
|
if (isBody(element) || "fixed" == styleString(element, "position")) return null;
|
|
for(var isOffsetCheck = "static" == styleString(element, "position") ? isOffsetStatic : isOffset; element = element.parentNode;)if (isOffsetCheck(element)) return element;
|
|
return null;
|
|
} : function() {
|
|
var element = this;
|
|
if (isBody(element) || "fixed" == styleString(element, "position")) return null;
|
|
try {
|
|
return element.offsetParent;
|
|
} catch (e) {}
|
|
return null;
|
|
},
|
|
getOffsets: function() {
|
|
if (this.getBoundingClientRect && !Browser.Platform.ios) {
|
|
var bound = this.getBoundingClientRect(), html = document.id(this.getDocument().documentElement), htmlScroll = html.getScroll(), elemScrolls = this.getScrolls(), isFixed = "fixed" == styleString(this, "position");
|
|
return {
|
|
x: bound.left.toInt() + elemScrolls.x + (isFixed ? 0 : htmlScroll.x) - html.clientLeft,
|
|
y: bound.top.toInt() + elemScrolls.y + (isFixed ? 0 : htmlScroll.y) - html.clientTop
|
|
};
|
|
}
|
|
var element = this, position = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
if (isBody(this)) return position;
|
|
for(; element && !isBody(element);){
|
|
if (position.x += element.offsetLeft, position.y += element.offsetTop, Browser.firefox) {
|
|
borderBox(element) || (position.x += leftBorder(element), position.y += topBorder(element));
|
|
var parent = element.parentNode;
|
|
parent && "visible" != styleString(parent, "overflow") && (position.x += leftBorder(parent), position.y += topBorder(parent));
|
|
} else element != this && Browser.safari && (position.x += leftBorder(element), position.y += topBorder(element));
|
|
element = element.offsetParent;
|
|
}
|
|
return Browser.firefox && !borderBox(this) && (position.x -= leftBorder(this), position.y -= topBorder(this)), position;
|
|
},
|
|
getPosition: function(relative) {
|
|
var offset = this.getOffsets(), scroll = this.getScrolls(), position = {
|
|
x: offset.x - scroll.x,
|
|
y: offset.y - scroll.y
|
|
};
|
|
if (relative && (relative = document.id(relative))) {
|
|
var relativePosition = relative.getPosition();
|
|
return {
|
|
x: position.x - relativePosition.x - leftBorder(relative),
|
|
y: position.y - relativePosition.y - topBorder(relative)
|
|
};
|
|
}
|
|
return position;
|
|
},
|
|
getCoordinates: function(element) {
|
|
if (isBody(this)) return this.getWindow().getCoordinates();
|
|
var position = this.getPosition(element), size = this.getSize(), obj = {
|
|
left: position.x,
|
|
top: position.y,
|
|
width: size.x,
|
|
height: size.y
|
|
};
|
|
return obj.right = obj.left + obj.width, obj.bottom = obj.top + obj.height, obj;
|
|
},
|
|
computePosition: function(obj) {
|
|
return {
|
|
left: obj.x - styleNumber(this, "margin-left"),
|
|
top: obj.y - styleNumber(this, "margin-top")
|
|
};
|
|
},
|
|
setPosition: function(obj) {
|
|
return this.setStyles(this.computePosition(obj));
|
|
}
|
|
}), [
|
|
Document,
|
|
Window
|
|
].invoke("implement", {
|
|
getSize: function() {
|
|
var doc = getCompatElement(this);
|
|
return {
|
|
x: doc.clientWidth,
|
|
y: doc.clientHeight
|
|
};
|
|
},
|
|
getScroll: function() {
|
|
var win = this.getWindow(), doc = getCompatElement(this);
|
|
return {
|
|
x: win.pageXOffset || doc.scrollLeft,
|
|
y: win.pageYOffset || doc.scrollTop
|
|
};
|
|
},
|
|
getScrollSize: function() {
|
|
var doc = getCompatElement(this), min = this.getSize(), body = this.getDocument().body;
|
|
return {
|
|
x: Math.max(doc.scrollWidth, body.scrollWidth, min.x),
|
|
y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)
|
|
};
|
|
},
|
|
getPosition: function() {
|
|
return {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
},
|
|
getCoordinates: function() {
|
|
var size = this.getSize();
|
|
return {
|
|
top: 0,
|
|
left: 0,
|
|
bottom: size.y,
|
|
right: size.x,
|
|
height: size.y,
|
|
width: size.x
|
|
};
|
|
}
|
|
});
|
|
var styleString = Element.getComputedStyle;
|
|
function styleNumber(element, style) {
|
|
return styleString(element, style).toInt() || 0;
|
|
}
|
|
function borderBox(element) {
|
|
return "border-box" == styleString(element, "-moz-box-sizing");
|
|
}
|
|
function topBorder(element) {
|
|
return styleNumber(element, "border-top-width");
|
|
}
|
|
function leftBorder(element) {
|
|
return styleNumber(element, "border-left-width");
|
|
}
|
|
function isBody(element) {
|
|
return /^(?:body|html)$/i.test(element.tagName);
|
|
}
|
|
function getCompatElement(element) {
|
|
var doc = element.getDocument();
|
|
return doc.compatMode && "CSS1Compat" != doc.compatMode ? doc.body : doc.html;
|
|
}
|
|
})(), Element.alias({
|
|
position: "setPosition"
|
|
}), [
|
|
Window,
|
|
Document,
|
|
Element
|
|
].invoke("implement", {
|
|
getHeight: function() {
|
|
return this.getSize().y;
|
|
},
|
|
getWidth: function() {
|
|
return this.getSize().x;
|
|
},
|
|
getScrollTop: function() {
|
|
return this.getScroll().y;
|
|
},
|
|
getScrollLeft: function() {
|
|
return this.getScroll().x;
|
|
},
|
|
getScrollHeight: function() {
|
|
return this.getScrollSize().y;
|
|
},
|
|
getScrollWidth: function() {
|
|
return this.getScrollSize().x;
|
|
},
|
|
getTop: function() {
|
|
return this.getPosition().y;
|
|
},
|
|
getLeft: function() {
|
|
return this.getPosition().x;
|
|
}
|
|
}), (function() {
|
|
var Fx = this.Fx = new Class({
|
|
Implements: [
|
|
Chain,
|
|
Events,
|
|
Options
|
|
],
|
|
options: {
|
|
fps: 60,
|
|
unit: !1,
|
|
duration: 500,
|
|
frames: null,
|
|
frameSkip: !0,
|
|
link: "ignore"
|
|
},
|
|
initialize: function(options) {
|
|
this.subject = this.subject || this, this.setOptions(options);
|
|
},
|
|
getTransition: function() {
|
|
return function(p) {
|
|
return -(Math.cos(Math.PI * p) - 1) / 2;
|
|
};
|
|
},
|
|
step: function(now) {
|
|
if (this.options.frameSkip) {
|
|
var frames = (null != this.time ? now - this.time : 0) / this.frameInterval;
|
|
this.time = now, this.frame += frames;
|
|
} else this.frame++;
|
|
if (this.frame < this.frames) {
|
|
var delta = this.transition(this.frame / this.frames);
|
|
this.set(this.compute(this.from, this.to, delta));
|
|
} else this.frame = this.frames, this.set(this.compute(this.from, this.to, 1)), this.stop();
|
|
},
|
|
set: function(now) {
|
|
return now;
|
|
},
|
|
compute: function(from, to, delta) {
|
|
return Fx.compute(from, to, delta);
|
|
},
|
|
check: function() {
|
|
if (!this.isRunning()) return !0;
|
|
switch(this.options.link){
|
|
case "cancel":
|
|
return this.cancel(), !0;
|
|
case "chain":
|
|
return this.chain(this.caller.pass(arguments, this)), !1;
|
|
}
|
|
return !1;
|
|
},
|
|
start: function(from, to) {
|
|
if (!this.check(from, to)) return this;
|
|
this.from = from, this.to = to, this.frame = this.options.frameSkip ? 0 : -1, this.time = null, this.transition = this.getTransition();
|
|
var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;
|
|
return this.duration = Fx.Durations[duration] || duration.toInt(), this.frameInterval = 1000 / fps, this.frames = frames || Math.round(this.duration / this.frameInterval), this.fireEvent("start", this.subject), pushInstance.call(this, fps), this;
|
|
},
|
|
stop: function() {
|
|
return this.isRunning() && (this.time = null, pullInstance.call(this, this.options.fps), this.frames == this.frame ? (this.fireEvent("complete", this.subject), this.callChain() || this.fireEvent("chainComplete", this.subject)) : this.fireEvent("stop", this.subject)), this;
|
|
},
|
|
cancel: function() {
|
|
return this.isRunning() && (this.time = null, pullInstance.call(this, this.options.fps), this.frame = this.frames, this.fireEvent("cancel", this.subject).clearChain()), this;
|
|
},
|
|
pause: function() {
|
|
return this.isRunning() && (this.time = null, pullInstance.call(this, this.options.fps)), this;
|
|
},
|
|
resume: function() {
|
|
return this.frame < this.frames && !this.isRunning() && pushInstance.call(this, this.options.fps), this;
|
|
},
|
|
isRunning: function() {
|
|
var list = instances[this.options.fps];
|
|
return list && list.contains(this);
|
|
}
|
|
});
|
|
Fx.compute = function(from, to, delta) {
|
|
return (to - from) * delta + from;
|
|
}, Fx.Durations = {
|
|
"short": 250,
|
|
normal: 500,
|
|
"long": 1000
|
|
};
|
|
var instances = {}, timers = {}, loop = function() {
|
|
for(var now = Date.now(), i = this.length; i--;){
|
|
var instance = this[i];
|
|
instance && instance.step(now);
|
|
}
|
|
}, pushInstance = function(fps) {
|
|
var list = instances[fps] || (instances[fps] = []);
|
|
list.push(this), timers[fps] || (timers[fps] = loop.periodical(Math.round(1000 / fps), list));
|
|
}, pullInstance = function(fps) {
|
|
var list = instances[fps];
|
|
list && (list.erase(this), !list.length && timers[fps] && (delete instances[fps], timers[fps] = clearInterval(timers[fps])));
|
|
};
|
|
})(), Fx.CSS = new Class({
|
|
Extends: Fx,
|
|
prepare: function(element, property, values) {
|
|
var from = (values = Array.from(values))[0], to = values[1];
|
|
if (null == to) {
|
|
to = from, from = element.getStyle(property);
|
|
var unit = this.options.unit;
|
|
if (unit && from.slice(-unit.length) != unit && 0 != parseFloat(from)) {
|
|
element.setStyle(property, to + unit);
|
|
var value = element.getComputedStyle(property);
|
|
if (!/px$/.test(value) && null == (value = element.style[("pixel-" + property).camelCase()])) {
|
|
var left = element.style.left;
|
|
element.style.left = to + unit, value = element.style.pixelLeft, element.style.left = left;
|
|
}
|
|
from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0), element.setStyle(property, from + unit);
|
|
}
|
|
}
|
|
return {
|
|
from: this.parse(from),
|
|
to: this.parse(to)
|
|
};
|
|
},
|
|
parse: function(value) {
|
|
return (value = "string" == typeof (value = Function.from(value)()) ? value.split(" ") : Array.from(value)).map(function(val) {
|
|
val = String(val);
|
|
var found = !1;
|
|
return Object.each(Fx.CSS.Parsers, function(parser, key) {
|
|
if (!found) {
|
|
var parsed = parser.parse(val);
|
|
(parsed || 0 === parsed) && (found = {
|
|
value: parsed,
|
|
parser: parser
|
|
});
|
|
}
|
|
}), found = found || {
|
|
value: val,
|
|
parser: Fx.CSS.Parsers.String
|
|
};
|
|
});
|
|
},
|
|
compute: function(from, to, delta) {
|
|
var computed = [];
|
|
return Math.min(from.length, to.length).times(function(i) {
|
|
computed.push({
|
|
value: from[i].parser.compute(from[i].value, to[i].value, delta),
|
|
parser: from[i].parser
|
|
});
|
|
}), computed.$family = Function.from("fx:css:value"), computed;
|
|
},
|
|
serve: function(value, unit) {
|
|
"fx:css:value" != typeOf(value) && (value = this.parse(value));
|
|
var returned = [];
|
|
return value.each(function(bit) {
|
|
returned = returned.concat(bit.parser.serve(bit.value, unit));
|
|
}), returned;
|
|
},
|
|
render: function(element, property, value, unit) {
|
|
element.setStyle(property, this.serve(value, unit));
|
|
},
|
|
search: function(selector) {
|
|
if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
|
|
var to = {}, selectorTest = new RegExp("^" + selector.escapeRegExp() + "$");
|
|
return Array.each(document.styleSheets, function(sheet, j) {
|
|
var href = sheet.href;
|
|
if (!(href && href.contains("://")) || href.contains(document.domain)) {
|
|
var rules = sheet.rules || sheet.cssRules;
|
|
Array.each(rules, function(rule, i) {
|
|
if (rule.style) {
|
|
var selectorText = rule.selectorText ? rule.selectorText.replace(/^\w+/, function(m) {
|
|
return m.toLowerCase();
|
|
}) : null;
|
|
selectorText && selectorTest.test(selectorText) && Object.each(Element.Styles, function(value, style) {
|
|
!rule.style[style] || Element.ShortStyles[style] || (value = String(rule.style[style]), to[style] = /^rgb/.test(value) ? value.rgbToHex() : value);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}), Fx.CSS.Cache[selector] = to;
|
|
}
|
|
}), Fx.CSS.Cache = {}, Fx.CSS.Parsers = {
|
|
Color: {
|
|
parse: function(value) {
|
|
return value.match(/^#[0-9a-f]{3,6}$/i) ? value.hexToRgb(!0) : !!(value = value.match(/(\d+),\s*(\d+),\s*(\d+)/)) && [
|
|
value[1],
|
|
value[2],
|
|
value[3]
|
|
];
|
|
},
|
|
compute: function(from, to, delta) {
|
|
return from.map(function(value, i) {
|
|
return Math.round(Fx.compute(from[i], to[i], delta));
|
|
});
|
|
},
|
|
serve: function(value) {
|
|
return value.map(Number);
|
|
}
|
|
},
|
|
Number: {
|
|
parse: parseFloat,
|
|
compute: Fx.compute,
|
|
serve: function(value, unit) {
|
|
return unit ? value + unit : value;
|
|
}
|
|
},
|
|
String: {
|
|
parse: Function.from(!1),
|
|
compute: function(zero, one) {
|
|
return one;
|
|
},
|
|
serve: function(zero) {
|
|
return zero;
|
|
}
|
|
}
|
|
}, Fx.CSS.Parsers = new Hash(Fx.CSS.Parsers), Fx.Tween = new Class({
|
|
Extends: Fx.CSS,
|
|
initialize: function(element, options) {
|
|
this.element = this.subject = document.id(element), this.parent(options);
|
|
},
|
|
set: function(property, now) {
|
|
return 1 == arguments.length && (now = property, property = this.property || this.options.property), this.render(this.element, property, now, this.options.unit), this;
|
|
},
|
|
start: function(property, from, to) {
|
|
if (!this.check(property, from, to)) return this;
|
|
var args = Array.flatten(arguments);
|
|
this.property = this.options.property || args.shift();
|
|
var parsed = this.prepare(this.element, this.property, args);
|
|
return this.parent(parsed.from, parsed.to);
|
|
}
|
|
}), Element.Properties.tween = {
|
|
set: function(options) {
|
|
return this.get("tween").cancel().setOptions(options), this;
|
|
},
|
|
get: function() {
|
|
var tween = this.retrieve("tween");
|
|
return tween || (tween = new Fx.Tween(this, {
|
|
link: "cancel"
|
|
}), this.store("tween", tween)), tween;
|
|
}
|
|
}, Element.implement({
|
|
tween: function(property, from, to) {
|
|
return this.get("tween").start(property, from, to), this;
|
|
},
|
|
fade: function(how) {
|
|
var method, toggle, fade = this.get("tween"), args = [
|
|
"opacity"
|
|
].append(arguments);
|
|
switch(null == args[1] && (args[1] = "toggle"), args[1]){
|
|
case "in":
|
|
method = "start", args[1] = 1;
|
|
break;
|
|
case "out":
|
|
method = "start", args[1] = 0;
|
|
break;
|
|
case "show":
|
|
method = "set", args[1] = 1;
|
|
break;
|
|
case "hide":
|
|
method = "set", args[1] = 0;
|
|
break;
|
|
case "toggle":
|
|
var flag = this.retrieve("fade:flag", 1 == this.getStyle("opacity"));
|
|
method = "start", args[1] = flag ? 0 : 1, this.store("fade:flag", !flag), toggle = !0;
|
|
break;
|
|
default:
|
|
method = "start";
|
|
}
|
|
toggle || this.eliminate("fade:flag"), fade[method].apply(fade, args);
|
|
var to = args[args.length - 1];
|
|
return "set" == method || 0 != to ? this.setStyle("visibility", 0 == to ? "hidden" : "visible") : fade.chain(function() {
|
|
this.element.setStyle("visibility", "hidden"), this.callChain();
|
|
}), this;
|
|
},
|
|
highlight: function(start, end) {
|
|
end || (end = "transparent" == (end = this.retrieve("highlight:original", this.getStyle("background-color"))) ? "#fff" : end);
|
|
var tween = this.get("tween");
|
|
return tween.start("background-color", start || "#ffff88", end).chain((function() {
|
|
this.setStyle("background-color", this.retrieve("highlight:original")), tween.callChain();
|
|
}).bind(this)), this;
|
|
}
|
|
}), Fx.Morph = new Class({
|
|
Extends: Fx.CSS,
|
|
initialize: function(element, options) {
|
|
this.element = this.subject = document.id(element), this.parent(options);
|
|
},
|
|
set: function(now) {
|
|
for(var p in "string" == typeof now && (now = this.search(now)), now)this.render(this.element, p, now[p], this.options.unit);
|
|
return this;
|
|
},
|
|
compute: function(from, to, delta) {
|
|
var now = {};
|
|
for(var p in from)now[p] = this.parent(from[p], to[p], delta);
|
|
return now;
|
|
},
|
|
start: function(properties) {
|
|
if (!this.check(properties)) return this;
|
|
"string" == typeof properties && (properties = this.search(properties));
|
|
var from = {}, to = {};
|
|
for(var p in properties){
|
|
var parsed = this.prepare(this.element, p, properties[p]);
|
|
from[p] = parsed.from, to[p] = parsed.to;
|
|
}
|
|
return this.parent(from, to);
|
|
}
|
|
}), Element.Properties.morph = {
|
|
set: function(options) {
|
|
return this.get("morph").cancel().setOptions(options), this;
|
|
},
|
|
get: function() {
|
|
var morph = this.retrieve("morph");
|
|
return morph || (morph = new Fx.Morph(this, {
|
|
link: "cancel"
|
|
}), this.store("morph", morph)), morph;
|
|
}
|
|
}, Element.implement({
|
|
morph: function(props) {
|
|
return this.get("morph").start(props), this;
|
|
}
|
|
}), Fx.implement({
|
|
getTransition: function() {
|
|
var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
|
|
if ("string" == typeof trans) {
|
|
var data = trans.split(":");
|
|
trans = (trans = Fx.Transitions)[data[0]] || trans[data[0].capitalize()], data[1] && (trans = trans["ease" + data[1].capitalize() + (data[2] ? data[2].capitalize() : "")]);
|
|
}
|
|
return trans;
|
|
}
|
|
}), Fx.Transition = function(transition, params) {
|
|
params = Array.from(params);
|
|
var easeIn = function(pos) {
|
|
return transition(pos, params);
|
|
};
|
|
return Object.append(easeIn, {
|
|
easeIn: easeIn,
|
|
easeOut: function(pos) {
|
|
return 1 - transition(1 - pos, params);
|
|
},
|
|
easeInOut: function(pos) {
|
|
return (pos <= 0.5 ? transition(2 * pos, params) : 2 - transition(2 * (1 - pos), params)) / 2;
|
|
}
|
|
});
|
|
}, Fx.Transitions = {
|
|
linear: function(zero) {
|
|
return zero;
|
|
}
|
|
}, Fx.Transitions = new Hash(Fx.Transitions), Fx.Transitions.extend = function(transitions) {
|
|
for(var transition in transitions)Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
|
|
}, Fx.Transitions.extend({
|
|
Pow: function(p, x) {
|
|
return Math.pow(p, x && x[0] || 6);
|
|
},
|
|
Expo: function(p) {
|
|
return Math.pow(2, 8 * (p - 1));
|
|
},
|
|
Circ: function(p) {
|
|
return 1 - Math.sin(Math.acos(p));
|
|
},
|
|
Sine: function(p) {
|
|
return 1 - Math.cos(p * Math.PI / 2);
|
|
},
|
|
Back: function(p, x) {
|
|
return Math.pow(p, 2) * (((x = x && x[0] || 1.618) + 1) * p - x);
|
|
},
|
|
Bounce: function(p) {
|
|
for(var value, a = 0, b = 1;; a += b, b /= 2)if (p >= (7 - 4 * a) / 11) {
|
|
value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
|
|
break;
|
|
}
|
|
return value;
|
|
},
|
|
Elastic: function(p, x) {
|
|
return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
|
|
}
|
|
}), [
|
|
"Quad",
|
|
"Cubic",
|
|
"Quart",
|
|
"Quint"
|
|
].each(function(transition, i) {
|
|
Fx.Transitions[transition] = new Fx.Transition(function(p) {
|
|
return Math.pow(p, i + 2);
|
|
});
|
|
}), (function() {
|
|
var empty = function() {}, progressSupport = "onprogress" in new Browser.Request, Request = this.Request = new Class({
|
|
Implements: [
|
|
Chain,
|
|
Events,
|
|
Options
|
|
],
|
|
options: {
|
|
url: "",
|
|
data: "",
|
|
headers: {
|
|
"X-Requested-With": "XMLHttpRequest",
|
|
Accept: "text/javascript, text/html, application/xml, text/xml, */*"
|
|
},
|
|
async: !0,
|
|
format: !1,
|
|
method: "post",
|
|
link: "ignore",
|
|
isSuccess: null,
|
|
emulation: !0,
|
|
urlEncoded: !0,
|
|
encoding: "utf-8",
|
|
evalScripts: !1,
|
|
evalResponse: !1,
|
|
timeout: 0,
|
|
noCache: !1
|
|
},
|
|
initialize: function(options) {
|
|
this.xhr = new Browser.Request(), this.setOptions(options), this.headers = this.options.headers;
|
|
},
|
|
onStateChange: function() {
|
|
var xhr = this.xhr;
|
|
4 == xhr.readyState && this.running && (this.running = !1, this.status = 0, Function.attempt((function() {
|
|
var status = xhr.status;
|
|
this.status = 1223 == status ? 204 : status;
|
|
}).bind(this)), xhr.onreadystatechange = empty, progressSupport && (xhr.onprogress = xhr.onloadstart = empty), clearTimeout(this.timer), this.response = {
|
|
text: this.xhr.responseText || "",
|
|
xml: this.xhr.responseXML
|
|
}, this.options.isSuccess.call(this, this.status) ? this.success(this.response.text, this.response.xml) : this.failure());
|
|
},
|
|
isSuccess: function() {
|
|
var status = this.status;
|
|
return status >= 200 && status < 300;
|
|
},
|
|
isRunning: function() {
|
|
return !!this.running;
|
|
},
|
|
processScripts: function(text) {
|
|
return this.options.evalResponse || /(ecma|java)script/.test(this.getHeader("Content-type")) ? Browser.exec(text) : text.stripScripts(this.options.evalScripts);
|
|
},
|
|
success: function(text, xml) {
|
|
this.onSuccess(this.processScripts(text), xml);
|
|
},
|
|
onSuccess: function() {
|
|
this.fireEvent("complete", arguments).fireEvent("success", arguments).callChain();
|
|
},
|
|
failure: function() {
|
|
this.onFailure();
|
|
},
|
|
onFailure: function() {
|
|
this.fireEvent("complete").fireEvent("failure", this.xhr);
|
|
},
|
|
loadstart: function(event) {
|
|
this.fireEvent("loadstart", [
|
|
event,
|
|
this.xhr
|
|
]);
|
|
},
|
|
progress: function(event) {
|
|
this.fireEvent("progress", [
|
|
event,
|
|
this.xhr
|
|
]);
|
|
},
|
|
timeout: function() {
|
|
this.fireEvent("timeout", this.xhr);
|
|
},
|
|
setHeader: function(name, value) {
|
|
return this.headers[name] = value, this;
|
|
},
|
|
getHeader: function(name) {
|
|
return Function.attempt((function() {
|
|
return this.xhr.getResponseHeader(name);
|
|
}).bind(this));
|
|
},
|
|
check: function() {
|
|
if (!this.running) return !0;
|
|
switch(this.options.link){
|
|
case "cancel":
|
|
return this.cancel(), !0;
|
|
case "chain":
|
|
return this.chain(this.caller.pass(arguments, this)), !1;
|
|
}
|
|
return !1;
|
|
},
|
|
send: function(options) {
|
|
if (!this.check(options)) return this;
|
|
this.options.isSuccess = this.options.isSuccess || this.isSuccess, this.running = !0;
|
|
var type = typeOf(options);
|
|
("string" == type || "element" == type) && (options = {
|
|
data: options
|
|
});
|
|
var old = this.options, data = (options = Object.append({
|
|
data: old.data,
|
|
url: old.url,
|
|
method: old.method
|
|
}, options)).data, url = String(options.url), method = options.method.toLowerCase();
|
|
switch(typeOf(data)){
|
|
case "element":
|
|
data = document.id(data).toQueryString();
|
|
break;
|
|
case "object":
|
|
case "hash":
|
|
data = Object.toQueryString(data);
|
|
}
|
|
if (this.options.format) {
|
|
var format = "format=" + this.options.format;
|
|
data = data ? format + "&" + data : format;
|
|
}
|
|
if (this.options.emulation && ![
|
|
"get",
|
|
"post"
|
|
].contains(method)) {
|
|
var _method = "_method=" + method;
|
|
data = data ? _method + "&" + data : _method, method = "post";
|
|
}
|
|
if (this.options.urlEncoded && [
|
|
"post",
|
|
"put"
|
|
].contains(method)) {
|
|
var encoding = this.options.encoding ? "; charset=" + this.options.encoding : "";
|
|
this.headers["Content-type"] = "application/x-www-form-urlencoded" + encoding;
|
|
}
|
|
url || (url = document.location.pathname);
|
|
var trimPosition = url.lastIndexOf("/");
|
|
trimPosition > -1 && (trimPosition = url.indexOf("#")) > -1 && (url = url.substr(0, trimPosition)), this.options.noCache && (url += (url.contains("?") ? "&" : "?") + String.uniqueID()), data && "get" == method && (url += (url.contains("?") ? "&" : "?") + data, data = null);
|
|
var xhr = this.xhr;
|
|
return progressSupport && (xhr.onloadstart = this.loadstart.bind(this), xhr.onprogress = this.progress.bind(this)), xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password), this.options.user && "withCredentials" in xhr && (xhr.withCredentials = !0), xhr.onreadystatechange = this.onStateChange.bind(this), Object.each(this.headers, function(value, key) {
|
|
try {
|
|
xhr.setRequestHeader(key, value);
|
|
} catch (e) {
|
|
this.fireEvent("exception", [
|
|
key,
|
|
value
|
|
]);
|
|
}
|
|
}, this), this.fireEvent("request"), xhr.send(data), this.options.async ? this.options.timeout && (this.timer = this.timeout.delay(this.options.timeout, this)) : this.onStateChange(), this;
|
|
},
|
|
cancel: function() {
|
|
if (!this.running) return this;
|
|
this.running = !1;
|
|
var xhr = this.xhr;
|
|
return xhr.abort(), clearTimeout(this.timer), xhr.onreadystatechange = empty, progressSupport && (xhr.onprogress = xhr.onloadstart = empty), this.xhr = new Browser.Request(), this.fireEvent("cancel"), this;
|
|
}
|
|
}), methods = {};
|
|
[
|
|
"get",
|
|
"post",
|
|
"put",
|
|
"delete",
|
|
"GET",
|
|
"POST",
|
|
"PUT",
|
|
"DELETE"
|
|
].each(function(method) {
|
|
methods[method] = function(data) {
|
|
var object = {
|
|
method: method
|
|
};
|
|
return null != data && (object.data = data), this.send(object);
|
|
};
|
|
}), Request.implement(methods), Element.Properties.send = {
|
|
set: function(options) {
|
|
return this.get("send").cancel().setOptions(options), this;
|
|
},
|
|
get: function() {
|
|
var send = this.retrieve("send");
|
|
return send || (send = new Request({
|
|
data: this,
|
|
link: "cancel",
|
|
method: this.get("method") || "post",
|
|
url: this.get("action")
|
|
}), this.store("send", send)), send;
|
|
}
|
|
}, Element.implement({
|
|
send: function(url) {
|
|
var sender = this.get("send");
|
|
return sender.send({
|
|
data: this,
|
|
url: url || sender.options.url
|
|
}), this;
|
|
}
|
|
});
|
|
})(), Request.HTML = new Class({
|
|
Extends: Request,
|
|
options: {
|
|
update: !1,
|
|
append: !1,
|
|
evalScripts: !0,
|
|
filter: !1,
|
|
headers: {
|
|
Accept: "text/html, application/xml, text/xml, */*"
|
|
}
|
|
},
|
|
success: function(text) {
|
|
var options = this.options, response = this.response;
|
|
response.html = text.stripScripts(function(script) {
|
|
response.javascript = script;
|
|
});
|
|
var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
|
|
match && (response.html = match[1]);
|
|
var temp = new Element("div").set("html", response.html);
|
|
if (response.tree = temp.childNodes, response.elements = temp.getElements(options.filter || "*"), options.filter && (response.tree = response.elements), options.update) {
|
|
var update = document.id(options.update).empty();
|
|
options.filter ? update.adopt(response.elements) : update.set("html", response.html);
|
|
} else if (options.append) {
|
|
var append = document.id(options.append);
|
|
options.filter ? response.elements.reverse().inject(append) : append.adopt(temp.getChildren());
|
|
}
|
|
options.evalScripts && Browser.exec(response.javascript), this.onSuccess(response.tree, response.elements, response.html, response.javascript);
|
|
}
|
|
}), Element.Properties.load = {
|
|
set: function(options) {
|
|
return this.get("load").cancel().setOptions(options), this;
|
|
},
|
|
get: function() {
|
|
var load = this.retrieve("load");
|
|
return load || (load = new Request.HTML({
|
|
data: this,
|
|
link: "cancel",
|
|
update: this,
|
|
method: "get"
|
|
}), this.store("load", load)), load;
|
|
}
|
|
}, Element.implement({
|
|
load: function() {
|
|
return this.get("load").send(Array.link(arguments, {
|
|
data: Type.isObject,
|
|
url: Type.isString
|
|
})), this;
|
|
}
|
|
}), "undefined" == typeof JSON && (this.JSON = {}), JSON = new Hash({
|
|
stringify: JSON.stringify,
|
|
parse: JSON.parse
|
|
}), (function() {
|
|
var special = {
|
|
"\b": "\\b",
|
|
"\t": "\\t",
|
|
"\n": "\\n",
|
|
"\f": "\\f",
|
|
"\r": "\\r",
|
|
"\"": "\\\"",
|
|
"\\": "\\\\"
|
|
}, escape = function(chr) {
|
|
return special[chr] || "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4);
|
|
};
|
|
JSON.validate = function(string) {
|
|
return string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""), /^[\],:{}\s]*$/.test(string);
|
|
}, JSON.encode = JSON.stringify ? function(obj) {
|
|
return JSON.stringify(obj);
|
|
} : function(obj) {
|
|
switch(obj && obj.toJSON && (obj = obj.toJSON()), typeOf(obj)){
|
|
case "string":
|
|
return "\"" + obj.replace(/[\x00-\x1f\\"]/g, escape) + "\"";
|
|
case "array":
|
|
return "[" + obj.map(JSON.encode).clean() + "]";
|
|
case "object":
|
|
case "hash":
|
|
var string = [];
|
|
return Object.each(obj, function(value, key) {
|
|
var json = JSON.encode(value);
|
|
json && string.push(JSON.encode(key) + ":" + json);
|
|
}), "{" + string + "}";
|
|
case "number":
|
|
case "boolean":
|
|
return "" + obj;
|
|
case "null":
|
|
return "null";
|
|
}
|
|
return null;
|
|
}, JSON.decode = function(string, secure) {
|
|
if (!string || "string" != typeOf(string)) return null;
|
|
if (secure || JSON.secure) {
|
|
if (JSON.parse) return JSON.parse(string);
|
|
if (!JSON.validate(string)) throw new Error("JSON could not decode the input; security is enabled and the value is not secure.");
|
|
}
|
|
return eval("(" + string + ")");
|
|
};
|
|
})(), Request.JSON = new Class({
|
|
Extends: Request,
|
|
options: {
|
|
secure: !0
|
|
},
|
|
initialize: function(options) {
|
|
this.parent(options), Object.append(this.headers, {
|
|
Accept: "application/json",
|
|
"X-Request": "JSON"
|
|
});
|
|
},
|
|
success: function(text) {
|
|
var json;
|
|
try {
|
|
json = this.response.json = JSON.decode(text, this.options.secure);
|
|
} catch (error) {
|
|
this.fireEvent("error", [
|
|
text,
|
|
error
|
|
]);
|
|
return;
|
|
}
|
|
null == json ? this.onFailure() : this.onSuccess(json, text);
|
|
}
|
|
});
|
|
var Cookie = new Class({
|
|
Implements: Options,
|
|
options: {
|
|
path: "/",
|
|
domain: !1,
|
|
duration: !1,
|
|
secure: !1,
|
|
document: document,
|
|
encode: !0
|
|
},
|
|
initialize: function(key, options) {
|
|
this.key = key, this.setOptions(options);
|
|
},
|
|
write: function(value) {
|
|
if (this.options.encode && (value = encodeURIComponent(value)), this.options.domain && (value += "; domain=" + this.options.domain), this.options.path && (value += "; path=" + this.options.path), this.options.duration) {
|
|
var date = new Date();
|
|
date.setTime(date.getTime() + 86400000 * this.options.duration), value += "; expires=" + date.toGMTString();
|
|
}
|
|
return this.options.secure && (value += "; secure"), this.options.document.cookie = this.key + "=" + value, this;
|
|
},
|
|
read: function() {
|
|
var value = this.options.document.cookie.match("(?:^|;)\\s*" + this.key.escapeRegExp() + "=([^;]*)");
|
|
return value ? decodeURIComponent(value[1]) : null;
|
|
},
|
|
dispose: function() {
|
|
return new Cookie(this.key, Object.merge({}, this.options, {
|
|
duration: -1
|
|
})).write(""), this;
|
|
}
|
|
});
|
|
Cookie.write = function(key, value, options) {
|
|
return new Cookie(key, options).write(value);
|
|
}, Cookie.read = function(key) {
|
|
return new Cookie(key).read();
|
|
}, Cookie.dispose = function(key, options) {
|
|
return new Cookie(key, options).dispose();
|
|
}, (function(window, document) {
|
|
var ready, loaded, shouldPoll, timer, checks = [], testElement = document.createElement("div"), domready = function() {
|
|
clearTimeout(timer), ready || (Browser.loaded = ready = !0, document.removeListener("DOMContentLoaded", domready).removeListener("readystatechange", check), document.fireEvent("domready"), window.fireEvent("domready"));
|
|
}, check = function() {
|
|
for(var i = checks.length; i--;)if (checks[i]()) return domready(), !0;
|
|
return !1;
|
|
}, poll = function() {
|
|
clearTimeout(timer), check() || (timer = setTimeout(poll, 10));
|
|
};
|
|
document.addListener("DOMContentLoaded", domready);
|
|
var doScrollWorks = function() {
|
|
try {
|
|
return testElement.doScroll(), !0;
|
|
} catch (e) {}
|
|
return !1;
|
|
};
|
|
testElement.doScroll && !doScrollWorks() && (checks.push(doScrollWorks), shouldPoll = !0), document.readyState && checks.push(function() {
|
|
var state = document.readyState;
|
|
return "loaded" == state || "complete" == state;
|
|
}), "onreadystatechange" in document ? document.addListener("readystatechange", check) : shouldPoll = !0, shouldPoll && poll(), Element.Events.domready = {
|
|
onAdd: function(fn) {
|
|
ready && fn.call(this);
|
|
}
|
|
}, Element.Events.load = {
|
|
base: "load",
|
|
onAdd: function(fn) {
|
|
loaded && this == window && fn.call(this);
|
|
},
|
|
condition: function() {
|
|
return this == window && (domready(), delete Element.Events.load), !0;
|
|
}
|
|
}, window.addEvent("load", function() {
|
|
loaded = !0;
|
|
});
|
|
})(window, document), (function() {
|
|
var Swiff = this.Swiff = new Class({
|
|
Implements: Options,
|
|
options: {
|
|
id: null,
|
|
height: 1,
|
|
width: 1,
|
|
container: null,
|
|
properties: {},
|
|
params: {
|
|
quality: "high",
|
|
allowScriptAccess: "always",
|
|
wMode: "window",
|
|
swLiveConnect: !0
|
|
},
|
|
callBacks: {},
|
|
vars: {}
|
|
},
|
|
toElement: function() {
|
|
return this.object;
|
|
},
|
|
initialize: function(path, options) {
|
|
this.instance = "Swiff_" + String.uniqueID(), this.setOptions(options), options = this.options;
|
|
var id = this.id = options.id || this.instance, container = document.id(options.container);
|
|
Swiff.CallBacks[this.instance] = {};
|
|
var params = options.params, vars = options.vars, callBacks = options.callBacks, properties = Object.append({
|
|
height: options.height,
|
|
width: options.width
|
|
}, options.properties), self = this;
|
|
for(var callBack in callBacks)Swiff.CallBacks[this.instance][callBack] = (function(option) {
|
|
return function() {
|
|
return option.apply(self.object, arguments);
|
|
};
|
|
})(callBacks[callBack]), vars[callBack] = "Swiff.CallBacks." + this.instance + "." + callBack;
|
|
params.flashVars = Object.toQueryString(vars), Browser.ie ? (properties.classid = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", params.movie = path) : properties.type = "application/x-shockwave-flash", properties.data = path;
|
|
var build = "<object id=\"" + id + "\"";
|
|
for(var property in properties)build += " " + property + "=\"" + properties[property] + "\"";
|
|
for(var param in build += ">", params)params[param] && (build += "<param name=\"" + param + "\" value=\"" + params[param] + "\" />");
|
|
build += "</object>", this.object = (container ? container.empty() : new Element("div")).set("html", build).firstChild;
|
|
},
|
|
replaces: function(element) {
|
|
return (element = document.id(element, !0)).parentNode.replaceChild(this.toElement(), element), this;
|
|
},
|
|
inject: function(element) {
|
|
return document.id(element, !0).appendChild(this.toElement()), this;
|
|
},
|
|
remote: function() {
|
|
return Swiff.remote.apply(Swiff, [
|
|
this.toElement()
|
|
].append(arguments));
|
|
}
|
|
});
|
|
Swiff.CallBacks = {}, Swiff.remote = function(obj, fn) {
|
|
var rs = obj.CallFunction("<invoke name=\"" + fn + "\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments, 2) + "</invoke>");
|
|
return eval(rs);
|
|
};
|
|
})();
|