/admin/thirdparty/history-js/vendor/mootools.js
JavaScript | 2494 lines | 1769 code | 446 blank | 279 comment | 599 complexity | 328c2d38f957374cd771d19143c1a06f MD5 | raw file
Possible License(s): BSD-3-Clause, MIT, CC-BY-3.0, GPL-2.0, AGPL-1.0, LGPL-2.1
Large files files are truncated, but you can click here to view the full file
- /*
- ---
- MooTools: the javascript framework
- web build:
- - http://mootools.net/core/76bf47062d6c1983d66ce47ad66aa0e0
- packager build:
- - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff
- /*
- ---
- name: Core
- description: The heart of MooTools.
- license: MIT-style license.
- copyright: Copyright (c) 2006-2010 [Valerio Proietti](http://mad4milk.net/).
- authors: The MooTools production team (http://mootools.net/developers/)
- inspiration:
- - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
- - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
- provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
- ...
- */
- (function(){
- this.MooTools = {
- version: '1.4.0',
- build: 'a15e35b4dbd12e8d86d9b50aa67a27e8e0071ea3'
- };
- // typeOf, instanceOf
- var typeOf = this.typeOf = function(item){
- if (item == null) return 'null';
- if (item.$family) return item.$family();
- if (item.nodeName){
- if (item.nodeType == 1) return 'element';
- if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
- } else if (typeof item.length == 'number'){
- if (item.callee) return 'arguments';
- if ('item' in item) return 'collection';
- }
- return typeof item;
- };
- var instanceOf = this.instanceOf = function(item, object){
- if (item == null) return false;
- var constructor = item.$constructor || item.constructor;
- while (constructor){
- if (constructor === object) return true;
- constructor = constructor.parent;
- }
- return item instanceof object;
- };
- // Function overloading
- var Function = this.Function;
- var enumerables = true;
- for (var i in {toString: 1}) enumerables = null;
- if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
- Function.prototype.overloadSetter = function(usePlural){
- var self = this;
- return function(a, b){
- if (a == null) return this;
- if (usePlural || typeof a != 'string'){
- for (var k in a) self.call(this, k, a[k]);
- if (enumerables) for (var i = enumerables.length; i--;){
- k = enumerables[i];
- if (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 (usePlural || typeof a != 'string') args = a;
- else if (arguments.length > 1) args = arguments;
- if (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();
- // From
- var slice = Array.prototype.slice;
- Function.from = function(item){
- return (typeOf(item) == 'function') ? item : function(){
- return item;
- };
- };
- Array.from = function(item){
- if (item == null) return [];
- return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
- };
- Number.from = function(item){
- var number = parseFloat(item);
- return isFinite(number) ? number : null;
- };
- String.from = function(item){
- return item + '';
- };
- // hide, protect
- Function.implement({
- hide: function(){
- this.$hidden = true;
- return this;
- },
- protect: function(){
- this.$protected = true;
- return this;
- }
- });
- // Type
- var Type = this.Type = function(name, object){
- if (name){
- var lower = name.toLowerCase();
- var typeCheck = function(item){
- return (typeOf(item) == lower);
- };
- Type['is' + name] = typeCheck;
- if (object != null){
- object.prototype.$family = (function(){
- return lower;
- }).hide();
-
- }
- }
- if (object == null) return null;
- object.extend(this);
- object.$constructor = Type;
- object.prototype.$constructor = object;
- return object;
- };
- var toString = Object.prototype.toString;
- Type.isEnumerable = function(item){
- return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
- };
- var hooks = {};
- var hooksOf = function(object){
- var type = typeOf(object.prototype);
- return hooks[type] || (hooks[type] = []);
- };
- var implement = function(name, method){
- if (method && method.$hidden) return;
- var hooks = hooksOf(this);
- for (var i = 0; i < hooks.length; i++){
- var hook = hooks[i];
- if (typeOf(hook) == 'type') implement.call(hook, name, method);
- else hook.call(this, name, method);
- }
- var previous = this.prototype[name];
- if (previous == null || !previous.$protected) this.prototype[name] = method;
- if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
- return method.apply(item, slice.call(arguments, 1));
- });
- };
- var extend = function(name, method){
- if (method && method.$hidden) return;
- var previous = this[name];
- if (previous == null || !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){
- hooksOf(this).push(hook);
- return this;
- }
- });
- new Type('Type', Type);
- // Default Types
- var force = function(name, object, methods){
- var isType = (object != Object),
- prototype = object.prototype;
- if (isType) object = new Type(name, object);
- for (var i = 0, l = methods.length; i < l; i++){
- var key = methods[i],
- generic = object[key],
- proto = prototype[key];
- if (generic) generic.protect();
- if (isType && proto){
- delete prototype[key];
- prototype[key] = proto.protect();
- }
- }
- if (isType) object.implement(prototype);
- 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);
- // fixes NaN returning as Number
- Number.prototype.$family = function(){
- return isFinite(this) ? 'number' : 'null';
- }.hide();
- // Number.random
- Number.extend('random', function(min, max){
- return Math.floor(Math.random() * (max - min + 1) + min);
- });
- // forEach, each
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- Object.extend('forEach', function(object, fn, bind){
- for (var key in object){
- if (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++){
- if (i in this) fn.call(bind, this[i], i, this);
- }
- },
- each: function(fn, bind){
- Array.forEach(this, fn, bind);
- return this;
- }
- });
- // Array & Object cloning, Object merging and appending
- 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(){
- var i = this.length, clone = new Array(i);
- while (i--) clone[i] = cloneOf(this[i]);
- return clone;
- });
- var mergeOne = function(source, key, current){
- switch (typeOf(current)){
- case 'object':
- if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
- else 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 (typeOf(k) == 'string') 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-less types
- ['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
- new Type(name);
- });
- // Unique ID
- var UID = Date.now();
- String.extend('uniqueID', function(){
- return (UID++).toString(36);
- });
- })();
- /*
- ---
- name: Array
- description: Contains Array Prototypes like each, contains, and erase.
- license: MIT-style license.
- requires: Type
- provides: Array
- ...
- */
- Array.implement({
- /*<!ES5>*/
- 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 false;
- }
- return true;
- },
- filter: function(fn, bind){
- var results = [];
- for (var i = 0, l = this.length >>> 0; i < l; i++){
- if ((i in this) && fn.call(bind, this[i], i, this)) results.push(this[i]);
- }
- return results;
- },
- indexOf: function(item, from){
- var length = this.length >>> 0;
- for (var 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){
- var length = this.length >>> 0, results = Array(length);
- for (var i = 0; i < length; i++){
- if (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 true;
- }
- return false;
- },
- /*</!ES5>*/
- clean: function(){
- return this.filter(function(item){
- return item != null;
- });
- },
- invoke: function(methodName){
- var args = Array.slice(arguments, 1);
- return this.map(function(item){
- return item[methodName].apply(item, args);
- });
- },
- associate: function(keys){
- var obj = {}, length = Math.min(this.length, keys.length);
- for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
- return obj;
- },
- link: function(object){
- var result = {};
- for (var 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 this.indexOf(item, from) != -1;
- },
- append: function(array){
- this.push.apply(this, array);
- return 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){
- if (!this.contains(item)) this.push(item);
- return 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--;){
- if (this[i] === item) this.splice(i, 1);
- }
- return this;
- },
- empty: function(){
- this.length = 0;
- return this;
- },
- flatten: function(){
- var array = [];
- for (var i = 0, l = this.length; i < l; i++){
- var type = typeOf(this[i]);
- if (type == 'null') continue;
- array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || 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 (this[i] != null) return this[i];
- }
- return null;
- },
- hexToRgb: function(array){
- if (this.length != 3) return null;
- var rgb = this.map(function(value){
- if (value.length == 1) value += value;
- return value.toInt(16);
- });
- return (array) ? rgb : 'rgb(' + rgb + ')';
- },
- rgbToHex: function(array){
- if (this.length < 3) return null;
- if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
- var hex = [];
- for (var i = 0; i < 3; i++){
- var bit = (this[i] - 0).toString(16);
- hex.push((bit.length == 1) ? '0' + bit : bit);
- }
- return (array) ? hex : '#' + hex.join('');
- }
- });
- /*
- ---
- name: String
- description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
- license: MIT-style license.
- requires: Type
- provides: String
- ...
- */
- String.implement({
- test: function(regex, params){
- return ((typeOf(regex) == 'regexp') ? 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){
- if (match.charAt(0) == '\\') return match.slice(1);
- return (object[name] != null) ? object[name] : '';
- });
- }
- });
- /*
- ---
- name: Number
- description: Contains Number Prototypes like limit, round, times, and ceil.
- license: MIT-style license.
- requires: Type
- provides: Number
- ...
- */
- Number.implement({
- limit: function(min, max){
- return Math.min(max, Math.max(min, this));
- },
- round: function(precision){
- precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
- return 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){
- if (!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']);
- /*
- ---
- name: Function
- description: Contains Function Prototypes like create, bind, pass, and delay.
- license: MIT-style license.
- requires: Type
- provides: Function
- ...
- */
- 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;
- },
- /*<!ES5-bind>*/
- bind: function(that){
- var self = this,
- args = arguments.length > 1 ? Array.slice(arguments, 1) : null,
- F = function(){};
- var bound = function(){
- var context = that, length = arguments.length;
- if (this instanceof bound){
- F.prototype = self.prototype;
- context = new F;
- }
- var result = (!args && !length)
- ? self.call(context)
- : self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);
- return context == that ? result : context;
- };
- return bound;
- },
- /*</!ES5-bind>*/
- pass: function(args, bind){
- var self = this;
- if (args != null) args = Array.from(args);
- return function(){
- return self.apply(bind, args || arguments);
- };
- },
- delay: function(delay, bind, args){
- return setTimeout(this.pass((args == null ? [] : args), bind), delay);
- },
- periodical: function(periodical, bind, args){
- return setInterval(this.pass((args == null ? [] : args), bind), periodical);
- }
- });
- /*
- ---
- name: Object
- description: Object generic methods
- license: MIT-style license.
- requires: Type
- provides: [Object, Hash]
- ...
- */
- (function(){
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- Object.extend({
- subset: function(object, keys){
- var results = {};
- for (var i = 0, l = keys.length; i < l; i++){
- var k = keys[i];
- if (k in object) results[k] = object[k];
- }
- return results;
- },
- map: function(object, fn, bind){
- var results = {};
- for (var key in object){
- if (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];
- if (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 false;
- }
- return true;
- },
- some: function(object, fn, bind){
- for (var key in object){
- if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;
- }
- return false;
- },
- keys: function(object){
- var keys = [];
- for (var key in object){
- if (hasOwnProperty.call(object, key)) keys.push(key);
- }
- return keys;
- },
- values: function(object){
- var values = [];
- for (var key in object){
- if (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 Object.keyOf(object, value) != null;
- },
- toQueryString: function(object, base){
- var queryString = [];
- Object.each(object, function(value, key){
- if (base) key = base + '[' + key + ']';
- var result;
- switch (typeOf(value)){
- case 'object': result = Object.toQueryString(value, key); break;
- case 'array':
- var qs = {};
- value.each(function(val, i){
- qs[i] = val;
- });
- result = Object.toQueryString(qs, key);
- break;
- default: result = key + '=' + encodeURIComponent(value);
- }
- if (value != null) queryString.push(result);
- });
- return queryString.join('&');
- }
- });
- })();
- /*
- ---
- name: Browser
- description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
- license: MIT-style license.
- requires: [Array, Function, Number, String]
- provides: [Browser, Window, Document]
- ...
- */
- (function(){
- var document = this.document;
- var window = document.window = this;
- var UID = 1;
- this.$uid = (window.ActiveXObject) ? function(item){
- return (item.uid || (item.uid = [UID++]))[0];
- } : function(item){
- return item.uid || (item.uid = UID++);
- };
- $uid(window);
- $uid(document);
- var 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 = UA[1] == 'ie' && document.documentMode;
- var Browser = this.Browser = {
- extend: Function.prototype.extend,
- name: (UA[1] == 'version') ? UA[3] : UA[1],
- version: mode || parseFloat((UA[1] == 'opera' && 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] = true;
- Browser[Browser.name + parseInt(Browser.version, 10)] = true;
- Browser.Platform[Browser.Platform.name] = true;
- // Request
- Browser.Request = (function(){
- var XMLHTTP = function(){
- return new XMLHttpRequest();
- };
- var MSXML2 = function(){
- return new ActiveXObject('MSXML2.XMLHTTP');
- };
- var MSXML = function(){
- return new ActiveXObject('Microsoft.XMLHTTP');
- };
- return Function.attempt(function(){
- XMLHTTP();
- return XMLHTTP;
- }, function(){
- MSXML2();
- return MSXML2;
- }, function(){
- MSXML();
- return MSXML;
- });
- })();
- Browser.Features.xhr = !!(Browser.Request);
- // Flash detection
- var version = (Function.attempt(function(){
- return navigator.plugins['Shockwave Flash'].description;
- }, function(){
- return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
- }) || '0 r0').match(/\d+/g);
- Browser.Plugins.Flash = {
- version: Number(version[0] || '0.' + version[1]) || 0,
- build: Number(version[2]) || 0
- };
- // String scripts
- 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 = '';
- var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
- scripts += code + '\n';
- return '';
- });
- if (exec === true) Browser.exec(scripts);
- else if (typeOf(exec) == 'function') exec(scripts, text);
- return text;
- });
- // Window, Document
- 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;
- if (!document.head) document.head = document.getElementsByTagName('head')[0];
- if (document.execCommand) try {
- document.execCommand("BackgroundImageCache", false, true);
- } catch (e){}
- /*<ltIE9>*/
- if (this.attachEvent && !this.addEventListener){
- var unloadEvent = function(){
- this.detachEvent('onunload', unloadEvent);
- document.head = document.html = document.window = null;
- };
- this.attachEvent('onunload', unloadEvent);
- }
- // IE fails on collections and <select>.options (refers to <select>)
- var arrayFrom = Array.from;
- try {
- arrayFrom(document.html.childNodes);
- } catch(e){
- Array.from = function(item){
- if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){
- var i = item.length, array = new Array(i);
- while (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));
- };
- });
- }
- /*</ltIE9>*/
- })();
- /*
- ---
- name: Event
- description: Contains the Event Type, to make the event object cross-browser.
- license: MIT-style license.
- requires: [Window, Document, Array, Function, String, Object]
- provides: Event
- ...
- */
- (function() {
- var _keys = {};
- var DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){
- if (!win) win = window;
- event = event || win.event;
- if (event.$extended) return event;
- this.event = event;
- this.$extended = true;
- this.shift = event.shiftKey;
- this.control = event.ctrlKey;
- this.alt = event.altKey;
- this.meta = event.metaKey;
- var type = this.type = event.type;
- var target = event.target || event.srcElement;
- while (target && target.nodeType == 3) target = target.parentNode;
- this.target = document.id(target);
- if (type.indexOf('key') == 0){
- var code = this.code = (event.which || event.keyCode);
- this.key = _keys[code];
- if (type == 'keydown'){
- if (code > 111 && code < 124) this.key = 'f' + (code - 111);
- else if (code > 95 && code < 106) this.key = code - 96;
- }
- if (this.key == null) this.key = String.fromCharCode(code).toLowerCase();
- } else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type.indexOf('mouse') == 0){
- var doc = win.document;
- doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
- this.page = {
- x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
- y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
- };
- this.client = {
- x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
- y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
- };
- if (type == 'DOMMouseScroll' || type == 'mousewheel')
- this.wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
- this.rightClick = (event.which == 3 || event.button == 2);
- if (type == 'mouseover' || type == 'mouseout'){
- var related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
- while (related && related.nodeType == 3) related = related.parentNode;
- this.relatedTarget = document.id(related);
- }
- } else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){
- 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};
- }
- }
- if (!this.client) this.client = {};
- if (!this.page) this.page = {};
- });
- DOMEvent.implement({
- stop: function(){
- return this.preventDefault().stopPropagation();
- },
- stopPropagation: function(){
- if (this.event.stopPropagation) this.event.stopPropagation();
- else this.event.cancelBubble = true;
- return this;
- },
- preventDefault: function(){
- if (this.event.preventDefault) this.event.preventDefault();
- else this.event.returnValue = false;
- return this;
- }
- });
- DOMEvent.defineKey = function(code, key){
- _keys[code] = key;
- return this;
- };
- DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true);
- DOMEvent.defineKeys({
- '38': 'up', '40': 'down', '37': 'left', '39': 'right',
- '27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab',
- '46': 'delete', '13': 'enter'
- });
- })();
- /*
- ---
- name: Class
- description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
- license: MIT-style license.
- requires: [Array, String, Function, Number]
- provides: Class
- ...
- */
- (function(){
- var Class = this.Class = new Type('Class', function(params){
- if (instanceOf(params, Function)) params = {initialize: params};
- var newClass = function(){
- reset(this);
- if (newClass.$prototyping) return this;
- this.$caller = null;
- var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
- this.$caller = this.caller = null;
- return value;
- }.extend(this).implement(params);
- newClass.$constructor = Class;
- newClass.prototype.$constructor = newClass;
- newClass.prototype.parent = parent;
- return newClass;
- });
- var parent = 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);
- };
- var 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;
- };
- var wrap = function(self, key, method){
- if (method.$origin) method = method.$origin;
- var wrapper = function(){
- if (method.$protected && this.$caller == null) 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);
- this.$caller = current; this.caller = caller;
- return result;
- }.extend({$owner: self, $origin: method, $name: key});
- return wrapper;
- };
- var implement = function(key, value, retain){
- if (Class.Mutators.hasOwnProperty(key)){
- value = Class.Mutators[key].call(this, value);
- if (value == null) return this;
- }
- if (typeOf(value) == 'function'){
- if (value.$hidden) return this;
- this.prototype[key] = (retain) ? value : wrap(this, key, value);
- } else {
- Object.merge(this.prototype, key, value);
- }
- return this;
- };
- var getInstance = function(klass){
- klass.$prototyping = true;
- var proto = new klass;
- delete klass.$prototyping;
- return 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], true);
- }, this);
- }
- };
- })();
- /*
- ---
- name: Class.Extras
- description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
- license: MIT-style license.
- requires: Class
- provides: [Class.Extras, Chain, Events, Options]
- ...
- */
- (function(){
- this.Chain = new Class({
- $chain: [],
- chain: function(){
- this.$chain.append(Array.flatten(arguments));
- return this;
- },
- callChain: function(){
- return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
- },
- clearChain: function(){
- this.$chain.empty();
- return 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){
- type = removeOn(type);
-
- this.$events[type] = (this.$events[type] || []).include(fn);
- if (internal) fn.internal = true;
- return 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];
- if (!events) return this;
- args = Array.from(args);
- events.each(function(fn){
- if (delay) fn.delay(delay, this, args);
- else fn.apply(this, args);
- }, this);
- return this;
- },
- removeEvent: function(type, fn){
- type = removeOn(type);
- var events = this.$events[type];
- if (events && !fn.internal){
- var index = events.indexOf(fn);
- if (index != -1) delete events[index];
- }
- return this;
- },
- removeEvents: function(events){
- var type;
- if (typeOf(events) == 'object'){
- for (type in events) this.removeEvent(type, events[type]);
- return this;
- }
- if (events) events = removeOn(events);
- for (type in this.$events){
- if (events && events != type) continue;
- var fns = this.$events[type];
- for (var i = fns.length; i--;) if (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){
- if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
- this.addEvent(option, options[option]);
- delete options[option];
- }
- return this;
- }
- });
- })();
- /*
- ---
- name: Slick.Parser
- description: Standalone CSS3 Selector parser
- provides: Slick.Parser
- ...
- */
- ;(function(){
- var parsed,
- separatorIndex,
- combinatorIndex,
- reversed,
- cache = {},
- reverseCache = {},
- reUnescape = /\\/g;
- var parse = function(expression, isReversed){
- if (expression == null) return null;
- if (expression.Slick === true) return expression;
- expression = ('' + expression).replace(/^\s+|\s+$/g, '');
- reversed = !!isReversed;
- var currentCache = (reversed) ? reverseCache : cache;
- if (currentCache[expression]) return currentCache[expression];
- parsed = {
- Slick: true,
- expressions: [],
- raw: expression,
- reverse: function(){
- return parse(this.raw, true);
- }
- };
- separatorIndex = -1;
- while (expression != (expression = expression.replace(regexp, parser)));
- parsed.length = parsed.expressions.length;
- return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
- };
- var reverseCombinator = function(combinator){
- if (combinator === '!') return ' ';
- else if (combinator === ' ') return '!';
- else if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');
- else return '!' + combinator;
- };
- var reverse = function(expression){
- var expressions = expression.expressions;
- for (var i = 0; i < expressions.length; i++){
- var exp = expressions[i];
- var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};
- for (var j = 0; j < exp.length; j++){
- var cexp = exp[j];
- if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
- cexp.combinator = cexp.reverseCombinator;
- delete cexp.reverseCombinator;
- }
- exp.reverse().push(last);
- }
- return expression;
- };
- var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License
- return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
- return '\\' + match;
- });
- };
- var regexp = new RegExp(
- /*
- #!/usr/bin/env ruby
- puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
- __END__
- "(?x)^(?:\
- \\s* ( , ) \\s* # Separator \n\
- | \\s* ( <combinator>+ ) \\s* # Combinator \n\
- | ( \\s+ ) # CombinatorChildren \n\
- | ( <unicode>+ | \\* ) # Tag \n\
- | \\# ( <unicode>+ ) # ID \n\
- | \\. ( <unicode>+ ) # ClassName \n\
- | # Attribute \n\
- \\[ \
- \\s* (<unicode1>+) (?: \
- \\s* ([*^$!~|]?=) (?: \
- \\s* (?:\
- ([\"']?)(.*?)\\9 \
- )\
- ) \
- )? \\s* \
- \\](?!\\]) \n\
- | :+ ( <unicode>+ )(?:\
- \\( (?:\
- (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
- ) \\)\
- )?\
- )"
- */
- "^(?:\\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 || separatorIndex === -1){
- parsed.expressions[++separatorIndex] = [];
- combinatorIndex = -1;
- if (separator) return '';
- }
- if (combinator || combinatorChildren || combinatorIndex === -1){
- combinator = combinator || ' ';
- var currentSeparator = parsed.expressions[separatorIndex];
- if (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, '');
- if (!currentParsed.classList) currentParsed.classList = [];
- if (!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 || pseudoClassQuotedValue;
- pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;
- if (!currentParsed.pseudos) currentParsed.pseudos = [];
- currentParsed.pseudos.push({
- key: pseudoClass.replace(reUnescape, ''),
- value: pseudoClassValue,
- type: pseudoMarker.length == 1 ? 'class' : 'element'
- });
- } else if (attributeKey){
- attributeKey = attributeKey.replace(reUnescape, '');
- attributeValue = (attributeValue || '').replace(reUnescape, '');
- var test, regexp;
- switch (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;
- };
- }
- if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){
- return false;
- };
- if (!test) test = function(value){
- return value && regexp.test(value);
- };
- if (!currentParsed.attributes) currentParsed.attributes = [];
- currentParsed.attributes.push({
- key: attributeKey,
- operator: attributeOperator,
- value: attributeValue,
- test: test
- });
- }
- return '';
- };
- // Slick NS
- var Slick = (this.Slick || {});
- Slick.parse = function(expression){
- return parse(expression);
- };
- Slick.escapeRegExp = escapeRegExp;
- if (!this.Slick) this.Slick = Slick;
- }).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
- /*
- ---
- name: Slick.Finder
- description: The new, superfast css selector engine.
- provides: Slick.Finder
- requires: Slick.Parser
- ...
- */
- ;(function(){
- var local = {},
- featuresCache = {},
- toString = Object.prototype.toString;
- // Feature / Bug detection
- local.isNativeCode = function(fn){
- return (/\{\s*\[native code\]\s*\}/).test('' + fn);
- };
- local.isXML = function(document){
- return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||
- (document.nodeType == 9 && document.documentElement.nodeName != 'HTML');
- };
- local.setDocument = function(document){
- // convert elements / window arguments to document. if document cannot be extrapolated, the function returns.
- var nodeType = document.nodeType;
- if (nodeType == 9); // document
- else if (nodeType) document = document.ownerDocument; // node
- else if (document.navigator) document = document.document; // window
- else return;
- // check if it's the old document
- if (this.document === document) return;
- this.document = document;
- // check if we have done feature detection on this document before
- var root = document.documentElement,
- rootUid = this.getUIDXML(root),
- features = featuresCache[rootUid],
- feature;
- if (features){
- for (feature in features){
- this[feature] = features[feature];
- }
- return;
- }
- features = featuresCache[rootUid] = {};
- features.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
- = false;
- var starSelectsClosed, starSelectsComments,
- brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
- brokenFormAttributeGetter;
- var selected, id = 'slick_uniqueid';
- var testNode = document.createElement('div');
- var testRoot = document.body || document.getElementsByTagName('body')[0] || root;
- testRoot.appendChild(testNode);
- // on non-HTML documents innerHTML and getElementsById doesnt work properly
- try {
- testNode.innerHTML = '<a id="'+id+'"></a>';
- features.isHTMLDocument = !!document.getElementById(id);
- } catch(e){};
- if (features.isHTMLDocument){
- testNode.style.display = 'none';
- // IE returns comment nodes for getElementsByTagName('*') for some documents
- testNode.appendChild(document.createComment(''));
- starSelectsComments = (testNode.getElementsByTagName('*').length > 1);
- // IE returns closed nodes (EG:"</foo>") for getElementsByTagName('*') for some documents
- try {
- testNode.innerHTML = 'foo</foo>';
- selected = testNode.getElementsByTagName('*');
- starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
- } catch(e){};
- features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
- // IE returns elements with the name instead of just id for getElementsById for some documents
- try {
- testNode.innerHTML = '<a name="'+ id +'"></a><b id="'+ id +'"></b>';
- features.idGetsName = document.getElementById(id) === testNode.firstChild;
- } catch(e){};
- if (testNode.getElementsByClassName){
- // Safari 3.2 getElementsByClassName caches results
- try {
- testNode.innerHTML = '<a class="f"></a><a class="b"></a>';
- testNode.getElementsByClassName('b').length;
- testNode.firstChild.className = 'b';
- cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);
- } catch(e){};
- // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one
- try {
- testNode.innerHTML = '<a class="a"></a><a class="f b a"></a>';
- brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);
- } catch(e){};
- features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
- }
- if (testNode.querySelectorAll){
- // IE 8 returns closed nodes (EG:"</foo>") for querySelectorAll('*') for some documents
- try {
- testNode.innerHTML = 'foo</foo>';
- selected = testNode.querySelectorAll('*');
- features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
- } catch(e){};
- // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
- try {
- testNode.innerHTML = '<a class="MiX"></a>';
- features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;
- } catch(e){};
- // Webkit and Opera dont return selected options on querySelectorAll
- try {
- testNode.innerHTML = '<select><option selected="selected">a</option></select>';
- features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);
- } catch(e){};
- // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll
- try {
- testNode.innerHTML = '<a class=""></a>';
- features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0);
- } catch(e){};
- }
- // IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input
- try {
- testNode.innerHTML = '<form action="s"><input id="action"/></form>';
- brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');
- } catch(e){};
- // native matchesSelector function
- features.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;
- if (features.nativeMatchesSelector) try {
- // if matchesSelector trows errors on incorrect sintaxes we can use it
- features.nativeMatchesSelector.call(root, ':slick');
- features.nativeMatchesSelector = null;
- } catch(e){};
- }
- try {
- root.slick_expando = 1;
- delete root.slick_expando;
- features.getUID = this.getUIDHTML;
- } catch(e) {
- features.getUID = this.getUIDXML;
- }
- testRoot.removeChild(testNode);
- testNode = selected = testRoot = null;
- // getAttribute
- 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);
- };
- // hasAttribute
- features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {
- return node.hasAttribute(attribute);
- } : function(node, attribute) {
- node = node.getAttributeNode(attribute);
- return !!(node && (node.specified || node.nodeValue));
- };
- // contains
- // FIXME: Add specs: local.contains should be different for xml and html documents?
- features.contains = (root && this.isNativeCode(root.contains)) ? function(context, node){
- return context.contains(node);
- } : (root && root.compareDocumentPosition) ? function(context, node){
- return context === node || !!(context.compareDocumentPosition(node) & 16);
- } : function(context, node){
- if (node) do {
- if (node === context) return true;
- } while ((node = node.parentNode));
- return false;
- };
- // document order sorting
- // credits to Sizzle (http://sizzlejs.com/)
- features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
- if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
- return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
- } : ('sourceIndex' in root) ? function(a, b){
- if (!a.sourceIndex || !b.sourceIndex) return 0;
- return a.sourceIndex - b.sourceIndex;
- } : (document.createRange) ? function(a, b){
- if (!a.ownerDocument || !b.ownerDocument) return 0;
- var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
- aRange.setStart(a, 0);
- aRange.setEnd(a, 0);
- bRange.setStart(b, 0);
- bRange.setEnd(b, 0);
- return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
- } : null ;
- root = null;
- for (feature in features){
- this[feature] = features[feature];
- }
- };
- // Main Method
- var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
- reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
- qsaFailExpCache = {};
- local.search = function(context, expression, append, first){
- var found = this.found = (first) ? null : (append || []);
- if (!context) return found;
- else if (context.navigator) context = context.document; // Convert the node from a window to a document
- else if (!context.nodeType) return found;
- // setup
- var parsed, i,
- uniques = this.uniques = {},
- hasOthers = !!(append && append.length),
- contextIsDocument = (context.nodeType == 9);
- if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);
- // avoid duplicating items already in the append array
- if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;
- // expression checks
- if (typeof expression == 'string'){ // expression is a string
- /*<simple-selectors-override>*/
- var simpleSelector = expression.match(reSimpleSelector);
- simpleSelectors: if (simpleSelector) {
- var symbol = simpleSelector[1],
- name = simpleSelector[2],
- node, nodes;
- if (!symbol){
- if (name == '*' && this.brokenStarGEBTN) break simpleSelectors;
- nodes = context.getElementsByTagName(name);
- if (first) return nodes[0] || null;
- for (i = 0; node = nodes[i++];){
- if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
- }
- } else if (symbol == '#'){
- if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
- node = context.getElementById(name);
- if (!node) return found;
- if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;
- if (first) return node || null;
- if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
- } else if (symbol == '.'){
- if (!this.i…
Large files files are truncated, but you can click here to view the full file