mirror of
https://github.com/swc-project/swc.git
synced 2024-12-22 13:11:31 +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, Browser.Request = (XMLHTTP = function() {
|
|
return new XMLHttpRequest();
|
|
}, MSXML2 = function() {
|
|
return new ActiveXObject('MSXML2.XMLHTTP');
|
|
}, MSXML = function() {
|
|
return new ActiveXObject('Microsoft.XMLHTTP');
|
|
}, 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, Element.prototype._fireEvent = (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 size = 0;
|
|
return ('width' == property ? [
|
|
'left',
|
|
'right'
|
|
] : [
|
|
'top',
|
|
'bottom'
|
|
]).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);
|
|
};
|
|
}();
|