diff --git a/.bowerrc b/.bowerrc
new file mode 100644
index 0000000..966fb07
--- /dev/null
+++ b/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory": "bower"
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index be4c882..7871be5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,4 +13,5 @@ desktop.ini
.anvil
*node_modules
*npm-debug*
-report/
\ No newline at end of file
+report/
+bower/
\ No newline at end of file
diff --git a/.npmignore b/.npmignore
index 99a133d..cbc0b8c 100644
--- a/.npmignore
+++ b/.npmignore
@@ -12,4 +12,5 @@ header.js
.anvil
component.json
.npmignore
-classic-resolver*
\ No newline at end of file
+classic-resolver*
+bower*
\ No newline at end of file
diff --git a/README.md b/README.md
index 8d123b7..57a568c 100644
--- a/README.md
+++ b/README.md
@@ -130,6 +130,20 @@ There are four main ways you can extend Postal:
It's also possible to extend the monitoring of messages passing through Postal by adding a "wire tap". A wire tap is a callback that will get invoked for any published message (even if no actual subscriptions would bind to the message's topic). Wire taps should _not_ be used in lieu of an actual subscription - but instead should be used for diagnostics, logging, forwarding (to a websocket publisher or a local storage wrapper, for example) or other concerns that fall along those lines. This repository used to include a console logging wiretap called postal.diagnostics.js - you can now find it [here in it's own repo](https://github.com/postaljs/postal.diagnostics). This diagnostics wiretap can be configured with filters to limit the firehose of message data to specific channels/topics and more.
+## Build, Dependencies, etc.
+
+* postal depends on [underscore.js](http://underscorejs.org/)
+* postal uses [gulp.js](http://gulpjs.com/) for building, running tests and examples.
+ * To build
+ * run `npm install` (to install all deps)
+ * run `npm run build` - then check the lib folder for the output
+ * To run tests & examples
+ * To run node-based tests: `npm run test`
+ * To run browser-based tests & examples:
+ * run `npm start`
+ * navigate in your browser to
+
+
## Can I contribute?
Please - by all means! While I hope the API is relatively stable, I'm open to pull requests. (Hint - if you want a feature implemented, a pull request gives it a much higher probability of being included than simply asking me.) As I said, pull requests are most certainly welcome - but please include tests for your additions. Otherwise, it will disappear into the ether.
diff --git a/bower.json b/bower.json
index 36333d0..b76ff54 100755
--- a/bower.json
+++ b/bower.json
@@ -1,31 +1,42 @@
{
- "name": "postal.js",
- "description": "Client-side messaging library.",
- "homepage": "https://github.com/postaljs/postal.js",
- "keywords": [
- "pub/sub",
- "pub",
- "sub",
- "messaging",
- "message",
- "bus",
- "event",
- "eventing",
- "mediator",
- "broker",
- "envelope"
- ],
- "author": "Jim Cowart ",
- "repository": {
- "type": "git",
- "url": "git://github.com/postaljs/postal.js.git"
- },
- "version": "0.8.11",
- "main": [
- "lib/postal.min.js",
- "lib/postal.js"
- ],
- "dependencies": {
- "underscore": "~1.3.0"
- }
-}
\ No newline at end of file
+ "name": "postal.js",
+ "version": "0.8.11",
+ "description": "Pub/Sub library providing wildcard subscriptions, complex message handling, etc. Works server and client-side.",
+ "homepage": "https://github.com/postaljs/postal.js",
+ "keywords": [
+ "pub/sub",
+ "pub",
+ "sub",
+ "messaging",
+ "message",
+ "bus",
+ "event",
+ "eventing",
+ "mediator",
+ "broker",
+ "envelope"
+ ],
+ "author": "Jim Cowart ",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/postaljs/postal.js.git"
+ },
+ "main": [
+ "lib/postal.min.js",
+ "lib/postal.js"
+ ],
+ "dependencies": {
+ "underscore": "~1.5.2"
+ },
+ "devDependencies": {
+ "jquery": "~1.10.2",
+ "bootstrap": "~3.0.3",
+ "expect": "0.1.2",
+ "mocha": "~1.17.0",
+ "requirejs": "~2.1.10",
+ "postal.diagnostics": "~0.7.0"
+ },
+ "resolutions": {
+ "underscore": "~1.5.2"
+ }
+}
diff --git a/example/amd/index.html b/example/amd/index.html
index 1cd04b1..2ac0c52 100644
--- a/example/amd/index.html
+++ b/example/amd/index.html
@@ -4,7 +4,7 @@
Postal Examples (AMD/require.js Lib Format)
-
+
diff --git a/example/amd/js/libs/jquery/jquery-min.js b/example/amd/js/libs/jquery/jquery-min.js
deleted file mode 100644
index c80ae49..0000000
--- a/example/amd/js/libs/jquery/jquery-min.js
+++ /dev/null
@@ -1,3320 +0,0 @@
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function ( a, b ) {
- function cy( a ) {
- return f.isWindow( a ) ? a : a.nodeType === 9 ? a.defaultView || a.parentWindow : !1
- }
-
- function cv( a ) {
- if ( !ck[a] ) {
- var b = c.body, d = f( "<" + a + ">" ).appendTo( b ), e = d.css( "display" );
- d.remove();
- if ( e === "none" || e === "" ) {
- cl || (cl = c.createElement( "iframe" ), cl.frameBorder = cl.width = cl.height = 0), b.appendChild( cl );
- if ( !cm || !cl.createElement ) {
- cm = (cl.contentWindow || cl.contentDocument).document, cm.write( (c.compatMode === "CSS1Compat" ? "" : "") + "" ), cm.close();
- }
- d = cm.createElement( a ), cm.body.appendChild( d ), e = f.css( d, "display" ), b.removeChild( cl )
- }
- ck[a] = e
- }
- return ck[a]
- }
-
- function cu( a, b ) {
- var c = {};
- f.each( cq.concat.apply( [], cq.slice( 0, b ) ), function () {
- c[this] = a
- } );
- return c
- }
-
- function ct() {
- cr = b
- }
-
- function cs() {
- setTimeout( ct, 0 );
- return cr = f.now()
- }
-
- function cj() {
- try {
- return new a.ActiveXObject( "Microsoft.XMLHTTP" )
- } catch ( b ) {
- }
- }
-
- function ci() {
- try {
- return new a.XMLHttpRequest
- } catch ( b ) {
- }
- }
-
- function cc( a, c ) {
- a.dataFilter && (c = a.dataFilter( c, a.dataType ));
- var d = a.dataTypes, e = {}, g, h, i = d.length, j, k = d[0], l, m, n, o, p;
- for ( g = 1; g < i; g++ ) {
- if ( g === 1 ) {
- for ( h in a.converters ) {
- typeof h == "string" && (e[h.toLowerCase()] = a.converters[h]);
- }
- }
- l = k, k = d[g];
- if ( k === "*" ) {
- k = l;
- } else if ( l !== "*" && l !== k ) {
- m = l + " " + k, n = e[m] || e["* " + k];
- if ( !n ) {
- p = b;
- for ( o in e ) {
- j = o.split( " " );
- if ( j[0] === l || j[0] === "*" ) {
- p = e[j[1] + " " + k];
- if ( p ) {
- o = e[o], o === !0 ? n = p : p === !0 && (n = o);
- break
- }
- }
- }
- }
- !n && !p && f.error( "No conversion from " + m.replace( " ", " to " ) ), n !== !0 && (c = n ? n( c ) : p( o( c ) ))
- }
- }
- return c
- }
-
- function cb( a, c, d ) {
- var e = a.contents, f = a.dataTypes, g = a.responseFields, h, i, j, k;
- for ( i in g ) {
- i in d && (c[g[i]] = d[i]);
- }
- while ( f[0] === "*" ) {
- f.shift(), h === b && (h = a.mimeType || c.getResponseHeader( "content-type" ));
- }
- if ( h ) {
- for ( i in e ) {
- if ( e[i] && e[i].test( h ) ) {
- f.unshift( i );
- break
- }
- }
- }
- if ( f[0]in d ) {
- j = f[0];
- } else {
- for ( i in d ) {
- if ( !f[0] || a.converters[i + " " + f[0]] ) {
- j = i;
- break
- }
- k || (k = i)
- }
- j = j || k
- }
- if ( j ) {
- j !== f[0] && f.unshift( j );
- return d[j]
- }
- }
-
- function ca( a, b, c, d ) {
- if ( f.isArray( b ) ) {
- f.each( b, function ( b, e ) {
- c || bE.test( a ) ? d( a, e ) : ca( a + "[" + (typeof e == "object" || f.isArray( e ) ? b : "") + "]", e, c, d )
- } );
- } else if ( !c && b != null && typeof b == "object" ) {
- for ( var e in b ) {
- ca( a + "[" + e + "]", b[e], c, d );
- }
- } else {
- d( a, b )
- }
- }
-
- function b_( a, c ) {
- var d, e, g = f.ajaxSettings.flatOptions || {};
- for ( d in c ) {
- c[d] !== b && ((g[d] ? a : e || (e = {}))[d] = c[d]);
- }
- e && f.extend( !0, a, e )
- }
-
- function b$( a, c, d, e, f, g ) {
- f = f || c.dataTypes[0], g = g || {}, g[f] = !0;
- var h = a[f], i = 0, j = h ? h.length : 0, k = a === bT, l;
- for ( ; i < j && (k || !l); i++ ) {
- l = h[i]( c, d, e ), typeof l == "string" && (!k || g[l] ? l = b : (c.dataTypes.unshift( l ), l = b$( a, c, d, e, l, g )));
- }
- (k || !l) && !g["*"] && (l = b$( a, c, d, e, "*", g ));
- return l
- }
-
- function bZ( a ) {
- return function ( b, c ) {
- typeof b != "string" && (c = b, b = "*");
- if ( f.isFunction( c ) ) {
- var d = b.toLowerCase().split( bP ), e = 0, g = d.length, h, i, j;
- for ( ; e < g; e++ ) {
- h = d[e], j = /^\+/.test( h ), j && (h = h.substr( 1 ) || "*"), i = a[h] = a[h] || [], i[j ? "unshift" : "push"]( c )
- }
- }
- }
- }
-
- function bC( a, b, c ) {
- var d = b === "width" ? a.offsetWidth : a.offsetHeight, e = b === "width" ? bx : by, g = 0, h = e.length;
- if ( d > 0 ) {
- if ( c !== "border" ) {
- for ( ; g < h; g++ ) {
- c || (d -= parseFloat( f.css( a, "padding" + e[g] ) ) || 0), c === "margin" ? d += parseFloat( f.css( a, c + e[g] ) ) || 0 : d -= parseFloat( f.css( a, "border" + e[g] + "Width" ) ) || 0;
- }
- }
- return d + "px"
- }
- d = bz( a, b, b );
- if ( d < 0 || d == null ) {
- d = a.style[b] || 0;
- }
- d = parseFloat( d ) || 0;
- if ( c ) {
- for ( ; g < h; g++ ) {
- d += parseFloat( f.css( a, "padding" + e[g] ) ) || 0, c !== "padding" && (d += parseFloat( f.css( a, "border" + e[g] + "Width" ) ) || 0), c === "margin" && (d += parseFloat( f.css( a, c + e[g] ) ) || 0);
- }
- }
- return d + "px"
- }
-
- function bp( a, b ) {
- b.src ? f.ajax( {url : b.src, async : !1, dataType : "script"} ) : f.globalEval( (b.text || b.textContent || b.innerHTML || "").replace( bf, "/*$0*/" ) ), b.parentNode && b.parentNode.removeChild( b )
- }
-
- function bo( a ) {
- var b = c.createElement( "div" );
- bh.appendChild( b ), b.innerHTML = a.outerHTML;
- return b.firstChild
- }
-
- function bn( a ) {
- var b = (a.nodeName || "").toLowerCase();
- b === "input" ? bm( a ) : b !== "script" && typeof a.getElementsByTagName != "undefined" && f.grep( a.getElementsByTagName( "input" ), bm )
- }
-
- function bm( a ) {
- if ( a.type === "checkbox" || a.type === "radio" ) {
- a.defaultChecked = a.checked
- }
- }
-
- function bl( a ) {
- return typeof a.getElementsByTagName != "undefined" ? a.getElementsByTagName( "*" ) : typeof a.querySelectorAll != "undefined" ? a.querySelectorAll( "*" ) : []
- }
-
- function bk( a, b ) {
- var c;
- if ( b.nodeType === 1 ) {
- b.clearAttributes && b.clearAttributes(), b.mergeAttributes && b.mergeAttributes( a ), c = b.nodeName.toLowerCase();
- if ( c === "object" ) {
- b.outerHTML = a.outerHTML;
- } else if ( c !== "input" || a.type !== "checkbox" && a.type !== "radio" ) {
- if ( c === "option" ) {
- b.selected = a.defaultSelected;
- } else if ( c === "input" || c === "textarea" ) {
- b.defaultValue = a.defaultValue
- }
- } else {
- a.checked && (b.defaultChecked = b.checked = a.checked), b.value !== a.value && (b.value = a.value);
- }
- b.removeAttribute( f.expando )
- }
- }
-
- function bj( a, b ) {
- if ( b.nodeType === 1 && !!f.hasData( a ) ) {
- var c, d, e, g = f._data( a ), h = f._data( b, g ), i = g.events;
- if ( i ) {
- delete h.handle, h.events = {};
- for ( c in i ) {
- for ( d = 0, e = i[c].length; d < e; d++ ) {
- f.event.add( b, c + (i[c][d].namespace ? "." : "") + i[c][d].namespace, i[c][d], i[c][d].data )
- }
- }
- }
- h.data && (h.data = f.extend( {}, h.data ))
- }
- }
-
- function bi( a, b ) {
- return f.nodeName( a, "table" ) ? a.getElementsByTagName( "tbody" )[0] || a.appendChild( a.ownerDocument.createElement( "tbody" ) ) : a
- }
-
- function U( a ) {
- var b = V.split( "|" ), c = a.createDocumentFragment();
- if ( c.createElement ) {
- while ( b.length ) {
- c.createElement( b.pop() );
- }
- }
- return c
- }
-
- function T( a, b, c ) {
- b = b || 0;
- if ( f.isFunction( b ) ) {
- return f.grep( a, function ( a, d ) {
- var e = !!b.call( a, d, a );
- return e === c
- } );
- }
- if ( b.nodeType ) {
- return f.grep( a, function ( a, d ) {
- return a === b === c
- } );
- }
- if ( typeof b == "string" ) {
- var d = f.grep( a, function ( a ) {
- return a.nodeType === 1
- } );
- if ( O.test( b ) ) {
- return f.filter( b, d, !c );
- }
- b = f.filter( b, d )
- }
- return f.grep( a, function ( a, d ) {
- return f.inArray( a, b ) >= 0 === c
- } )
- }
-
- function S( a ) {
- return!a || !a.parentNode || a.parentNode.nodeType === 11
- }
-
- function K() {
- return!0
- }
-
- function J() {
- return!1
- }
-
- function n( a, b, c ) {
- var d = b + "defer", e = b + "queue", g = b + "mark", h = f._data( a, d );
- h && (c === "queue" || !f._data( a, e )) && (c === "mark" || !f._data( a, g )) && setTimeout( function () {
- !f._data( a, e ) && !f._data( a, g ) && (f.removeData( a, d, !0 ), h.fire())
- }, 0 )
- }
-
- function m( a ) {
- for ( var b in a ) {
- if ( b === "data" && f.isEmptyObject( a[b] ) ) {
- continue;
- }
- if ( b !== "toJSON" ) {
- return!1
- }
- }
- return!0
- }
-
- function l( a, c, d ) {
- if ( d === b && a.nodeType === 1 ) {
- var e = "data-" + c.replace( k, "-$1" ).toLowerCase();
- d = a.getAttribute( e );
- if ( typeof d == "string" ) {
- try {
- d = d === "true" ? !0 : d === "false" ? !1 : d === "null" ? null : f.isNumeric( d ) ? parseFloat( d ) : j.test( d ) ? f.parseJSON( d ) : d
- } catch ( g ) {
- }
- f.data( a, c, d )
- } else {
- d = b
- }
- }
- return d
- }
-
- function h( a ) {
- var b = g[a] = {}, c, d;
- a = a.split( /\s+/ );
- for ( c = 0, d = a.length; c < d; c++ ) {
- b[a[c]] = !0;
- }
- return b
- }
-
- var c = a.document, d = a.navigator, e = a.location, f = function () {
- function J() {
- if ( !e.isReady ) {
- try {
- c.documentElement.doScroll( "left" )
- } catch ( a ) {
- setTimeout( J, 1 );
- return
- }
- e.ready()
- }
- }
-
- var e = function ( a, b ) {
- return new e.fn.init( a, b, h )
- }, f = a.jQuery, g = a.$, h, i = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, j = /\S/, k = /^\s+/, l = /\s+$/, m = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, n = /^[\],:{}\s]*$/, o = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, p = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, q = /(?:^|:|,)(?:\s*\[)+/g, r = /(webkit)[ \/]([\w.]+)/, s = /(opera)(?:.*version)?[ \/]([\w.]+)/, t = /(msie) ([\w.]+)/, u = /(mozilla)(?:.*? rv:([\w.]+))?/, v = /-([a-z]|[0-9])/ig, w = /^-ms-/, x = function ( a, b ) {
- return(b + "").toUpperCase()
- }, y = d.userAgent, z, A, B, C = Object.prototype.toString, D = Object.prototype.hasOwnProperty, E = Array.prototype.push, F = Array.prototype.slice, G = String.prototype.trim, H = Array.prototype.indexOf, I = {};
- e.fn = e.prototype = {constructor : e, init : function ( a, d, f ) {
- var g, h, j, k;
- if ( !a ) {
- return this;
- }
- if ( a.nodeType ) {
- this.context = this[0] = a, this.length = 1;
- return this
- }
- if ( a === "body" && !d && c.body ) {
- this.context = c, this[0] = c.body, this.selector = a, this.length = 1;
- return this
- }
- if ( typeof a == "string" ) {
- a.charAt( 0 ) !== "<" || a.charAt( a.length - 1 ) !== ">" || a.length < 3 ? g = i.exec( a ) : g = [null, a, null];
- if ( g && (g[1] || !d) ) {
- if ( g[1] ) {
- d = d instanceof e ? d[0] : d, k = d ? d.ownerDocument || d : c, j = m.exec( a ), j ? e.isPlainObject( d ) ? (a = [c.createElement( j[1] )], e.fn.attr.call( a, d, !0 )) : a = [k.createElement( j[1] )] : (j = e.buildFragment( [g[1]], [k] ), a = (j.cacheable ? e.clone( j.fragment ) : j.fragment).childNodes);
- return e.merge( this, a )
- }
- h = c.getElementById( g[2] );
- if ( h && h.parentNode ) {
- if ( h.id !== g[2] ) {
- return f.find( a );
- }
- this.length = 1, this[0] = h
- }
- this.context = c, this.selector = a;
- return this
- }
- return!d || d.jquery ? (d || f).find( a ) : this.constructor( d ).find( a )
- }
- if ( e.isFunction( a ) ) {
- return f.ready( a );
- }
- a.selector !== b && (this.selector = a.selector, this.context = a.context);
- return e.makeArray( a, this )
- }, selector : "", jquery : "1.7.1", length : 0, size : function () {
- return this.length
- }, toArray : function () {
- return F.call( this, 0 )
- }, get : function ( a ) {
- return a == null ? this.toArray() : a < 0 ? this[this.length + a] : this[a]
- }, pushStack : function ( a, b, c ) {
- var d = this.constructor();
- e.isArray( a ) ? E.apply( d, a ) : e.merge( d, a ), d.prevObject = this, d.context = this.context, b === "find" ? d.selector = this.selector + (this.selector ? " " : "") + c : b && (d.selector = this.selector + "." + b + "(" + c + ")");
- return d
- }, each : function ( a, b ) {
- return e.each( this, a, b )
- }, ready : function ( a ) {
- e.bindReady(), A.add( a );
- return this
- }, eq : function ( a ) {
- a = +a;
- return a === -1 ? this.slice( a ) : this.slice( a, a + 1 )
- }, first : function () {
- return this.eq( 0 )
- }, last : function () {
- return this.eq( -1 )
- }, slice : function () {
- return this.pushStack( F.apply( this, arguments ), "slice", F.call( arguments ).join( "," ) )
- }, map : function ( a ) {
- return this.pushStack( e.map( this, function ( b, c ) {
- return a.call( b, c, b )
- } ) )
- }, end : function () {
- return this.prevObject || this.constructor( null )
- }, push : E, sort : [].sort, splice : [].splice}, e.fn.init.prototype = e.fn, e.extend = e.fn.extend = function () {
- var a, c, d, f, g, h, i = arguments[0] || {}, j = 1, k = arguments.length, l = !1;
- typeof i == "boolean" && (l = i, i = arguments[1] || {}, j = 2), typeof i != "object" && !e.isFunction( i ) && (i = {}), k === j && (i = this, --j);
- for ( ; j < k; j++ ) {
- if ( (a = arguments[j]) != null ) {
- for ( c in a ) {
- d = i[c], f = a[c];
- if ( i === f ) {
- continue;
- }
- l && f && (e.isPlainObject( f ) || (g = e.isArray( f ))) ? (g ? (g = !1, h = d && e.isArray( d ) ? d : []) : h = d && e.isPlainObject( d ) ? d : {}, i[c] = e.extend( l, h, f )) : f !== b && (i[c] = f)
- }
- }
- }
- return i
- }, e.extend( {noConflict : function ( b ) {
- a.$ === e && (a.$ = g), b && a.jQuery === e && (a.jQuery = f);
- return e
- }, isReady : !1, readyWait : 1, holdReady : function ( a ) {
- a ? e.readyWait++ : e.ready( !0 )
- }, ready : function ( a ) {
- if ( a === !0 && !--e.readyWait || a !== !0 && !e.isReady ) {
- if ( !c.body ) {
- return setTimeout( e.ready, 1 );
- }
- e.isReady = !0;
- if ( a !== !0 && --e.readyWait > 0 ) {
- return;
- }
- A.fireWith( c, [e] ), e.fn.trigger && e( c ).trigger( "ready" ).off( "ready" )
- }
- }, bindReady : function () {
- if ( !A ) {
- A = e.Callbacks( "once memory" );
- if ( c.readyState === "complete" ) {
- return setTimeout( e.ready, 1 );
- }
- if ( c.addEventListener ) {
- c.addEventListener( "DOMContentLoaded", B, !1 ), a.addEventListener( "load", e.ready, !1 );
- } else if ( c.attachEvent ) {
- c.attachEvent( "onreadystatechange", B ), a.attachEvent( "onload", e.ready );
- var b = !1;
- try {
- b = a.frameElement == null
- } catch ( d ) {
- }
- c.documentElement.doScroll && b && J()
- }
- }
- }, isFunction : function ( a ) {
- return e.type( a ) === "function"
- }, isArray : Array.isArray || function ( a ) {
- return e.type( a ) === "array"
- }, isWindow : function ( a ) {
- return a && typeof a == "object" && "setInterval"in a
- }, isNumeric : function ( a ) {
- return!isNaN( parseFloat( a ) ) && isFinite( a )
- }, type : function ( a ) {
- return a == null ? String( a ) : I[C.call( a )] || "object"
- }, isPlainObject : function ( a ) {
- if ( !a || e.type( a ) !== "object" || a.nodeType || e.isWindow( a ) ) {
- return!1;
- }
- try {
- if ( a.constructor && !D.call( a, "constructor" ) && !D.call( a.constructor.prototype, "isPrototypeOf" ) ) {
- return!1
- }
- } catch ( c ) {
- return!1
- }
- var d;
- for ( d in a ) {
- ;
- }
- return d === b || D.call( a, d )
- }, isEmptyObject : function ( a ) {
- for ( var b in a ) {
- return!1;
- }
- return!0
- }, error : function ( a ) {
- throw new Error( a )
- }, parseJSON : function ( b ) {
- if ( typeof b != "string" || !b ) {
- return null;
- }
- b = e.trim( b );
- if ( a.JSON && a.JSON.parse ) {
- return a.JSON.parse( b );
- }
- if ( n.test( b.replace( o, "@" ).replace( p, "]" ).replace( q, "" ) ) ) {
- return(new Function( "return " + b ))();
- }
- e.error( "Invalid JSON: " + b )
- }, parseXML : function ( c ) {
- var d, f;
- try {
- a.DOMParser ? (f = new DOMParser, d = f.parseFromString( c, "text/xml" )) : (d = new ActiveXObject( "Microsoft.XMLDOM" ), d.async = "false", d.loadXML( c ))
- } catch ( g ) {
- d = b
- }
- (!d || !d.documentElement || d.getElementsByTagName( "parsererror" ).length) && e.error( "Invalid XML: " + c );
- return d
- }, noop : function () {
- }, globalEval : function ( b ) {
- b && j.test( b ) && (a.execScript || function ( b ) {
- a.eval.call( a, b )
- })( b )
- }, camelCase : function ( a ) {
- return a.replace( w, "ms-" ).replace( v, x )
- }, nodeName : function ( a, b ) {
- return a.nodeName && a.nodeName.toUpperCase() === b.toUpperCase()
- }, each : function ( a, c, d ) {
- var f, g = 0, h = a.length, i = h === b || e.isFunction( a );
- if ( d ) {
- if ( i ) {
- for ( f in a ) {
- if ( c.apply( a[f], d ) === !1 ) {
- break
- }
- }
- } else {
- for ( ; g < h; ) {
- if ( c.apply( a[g++], d ) === !1 ) {
- break
- }
- }
- }
- } else if ( i ) {
- for ( f in a ) {
- if ( c.call( a[f], f, a[f] ) === !1 ) {
- break
- }
- }
- } else {
- for ( ; g < h; ) {
- if ( c.call( a[g], g, a[g++] ) === !1 ) {
- break;
- }
- }
- }
- return a
- }, trim : G ? function ( a ) {
- return a == null ? "" : G.call( a )
- } : function ( a ) {
- return a == null ? "" : (a + "").replace( k, "" ).replace( l, "" )
- }, makeArray : function ( a, b ) {
- var c = b || [];
- if ( a != null ) {
- var d = e.type( a );
- a.length == null || d === "string" || d === "function" || d === "regexp" || e.isWindow( a ) ? E.call( c, a ) : e.merge( c, a )
- }
- return c
- }, inArray : function ( a, b, c ) {
- var d;
- if ( b ) {
- if ( H ) {
- return H.call( b, a, c );
- }
- d = b.length, c = c ? c < 0 ? Math.max( 0, d + c ) : c : 0;
- for ( ; c < d; c++ ) {
- if ( c in b && b[c] === a ) {
- return c
- }
- }
- }
- return-1
- }, merge : function ( a, c ) {
- var d = a.length, e = 0;
- if ( typeof c.length == "number" ) {
- for ( var f = c.length; e < f; e++ ) {
- a[d++] = c[e];
- }
- } else {
- while ( c[e] !== b ) {
- a[d++] = c[e++];
- }
- }
- a.length = d;
- return a
- }, grep : function ( a, b, c ) {
- var d = [], e;
- c = !!c;
- for ( var f = 0, g = a.length; f < g; f++ ) {
- e = !!b( a[f], f ), c !== e && d.push( a[f] );
- }
- return d
- }, map : function ( a, c, d ) {
- var f, g, h = [], i = 0, j = a.length, k = a instanceof e || j !== b && typeof j == "number" && (j > 0 && a[0] && a[j - 1] || j === 0 || e.isArray( a ));
- if ( k ) {
- for ( ; i < j; i++ ) {
- f = c( a[i], i, d ), f != null && (h[h.length] = f);
- }
- } else {
- for ( g in a ) {
- f = c( a[g], g, d ), f != null && (h[h.length] = f);
- }
- }
- return h.concat.apply( [], h )
- }, guid : 1, proxy : function ( a, c ) {
- if ( typeof c == "string" ) {
- var d = a[c];
- c = a, a = d
- }
- if ( !e.isFunction( a ) ) {
- return b;
- }
- var f = F.call( arguments, 2 ), g = function () {
- return a.apply( c, f.concat( F.call( arguments ) ) )
- };
- g.guid = a.guid = a.guid || g.guid || e.guid++;
- return g
- }, access : function ( a, c, d, f, g, h ) {
- var i = a.length;
- if ( typeof c == "object" ) {
- for ( var j in c ) {
- e.access( a, j, c[j], f, g, d );
- }
- return a
- }
- if ( d !== b ) {
- f = !h && f && e.isFunction( d );
- for ( var k = 0; k < i; k++ ) {
- g( a[k], c, f ? d.call( a[k], k, g( a[k], c ) ) : d, h );
- }
- return a
- }
- return i ? g( a[0], c ) : b
- }, now : function () {
- return(new Date).getTime()
- }, uaMatch : function ( a ) {
- a = a.toLowerCase();
- var b = r.exec( a ) || s.exec( a ) || t.exec( a ) || a.indexOf( "compatible" ) < 0 && u.exec( a ) || [];
- return{browser : b[1] || "", version : b[2] || "0"}
- }, sub : function () {
- function a( b, c ) {
- return new a.fn.init( b, c )
- }
-
- e.extend( !0, a, this ), a.superclass = this, a.fn = a.prototype = this(), a.fn.constructor = a, a.sub = this.sub, a.fn.init = function ( d, f ) {
- f && f instanceof e && !(f instanceof a) && (f = a( f ));
- return e.fn.init.call( this, d, f, b )
- }, a.fn.init.prototype = a.fn;
- var b = a( c );
- return a
- }, browser : {}} ), e.each( "Boolean Number String Function Array Date RegExp Object".split( " " ), function ( a, b ) {
- I["[object " + b + "]"] = b.toLowerCase()
- } ), z = e.uaMatch( y ), z.browser && (e.browser[z.browser] = !0, e.browser.version = z.version), e.browser.webkit && (e.browser.safari = !0), j.test( " " ) && (k = /^[\s\xA0]+/, l = /[\s\xA0]+$/), h = e( c ), c.addEventListener ? B = function () {
- c.removeEventListener( "DOMContentLoaded", B, !1 ), e.ready()
- } : c.attachEvent && (B = function () {
- c.readyState === "complete" && (c.detachEvent( "onreadystatechange", B ), e.ready())
- });
- return e
- }(), g = {};
- f.Callbacks = function ( a ) {
- a = a ? g[a] || h( a ) : {};
- var c = [], d = [], e, i, j, k, l, m = function ( b ) {
- var d, e, g, h, i;
- for ( d = 0, e = b.length; d < e; d++ ) {
- g = b[d], h = f.type( g ), h === "array" ? m( g ) : h === "function" && (!a.unique || !o.has( g )) && c.push( g )
- }
- }, n = function ( b, f ) {
- f = f || [], e = !a.memory || [b, f], i = !0, l = j || 0, j = 0, k = c.length;
- for ( ; c && l < k; l++ ) {
- if ( c[l].apply( b, f ) === !1 && a.stopOnFalse ) {
- e = !0;
- break
- }
- }
- i = !1, c && (a.once ? e === !0 ? o.disable() : c = [] : d && d.length && (e = d.shift(), o.fireWith( e[0], e[1] )))
- }, o = {add : function () {
- if ( c ) {
- var a = c.length;
- m( arguments ), i ? k = c.length : e && e !== !0 && (j = a, n( e[0], e[1] ))
- }
- return this
- }, remove : function () {
- if ( c ) {
- var b = arguments, d = 0, e = b.length;
- for ( ; d < e; d++ ) {
- for ( var f = 0; f < c.length; f++ ) {
- if ( b[d] === c[f] ) {
- i && f <= k && (k--, f <= l && l--), c.splice( f--, 1 );
- if ( a.unique ) {
- break
- }
- }
- }
- }
- }
- return this
- }, has : function ( a ) {
- if ( c ) {
- var b = 0, d = c.length;
- for ( ; b < d; b++ ) {
- if ( a === c[b] ) {
- return!0
- }
- }
- }
- return!1
- }, empty : function () {
- c = [];
- return this
- }, disable : function () {
- c = d = e = b;
- return this
- }, disabled : function () {
- return!c
- }, lock : function () {
- d = b, (!e || e === !0) && o.disable();
- return this
- }, locked : function () {
- return!d
- }, fireWith : function ( b, c ) {
- d && (i ? a.once || d.push( [b, c] ) : (!a.once || !e) && n( b, c ));
- return this
- }, fire : function () {
- o.fireWith( this, arguments );
- return this
- }, fired : function () {
- return!!e
- }};
- return o
- };
- var i = [].slice;
- f.extend( {Deferred : function ( a ) {
- var b = f.Callbacks( "once memory" ), c = f.Callbacks( "once memory" ), d = f.Callbacks( "memory" ), e = "pending", g = {resolve : b, reject : c, notify : d}, h = {done : b.add, fail : c.add, progress : d.add, state : function () {
- return e
- }, isResolved : b.fired, isRejected : c.fired, then : function ( a, b, c ) {
- i.done( a ).fail( b ).progress( c );
- return this
- }, always : function () {
- i.done.apply( i, arguments ).fail.apply( i, arguments );
- return this
- }, pipe : function ( a, b, c ) {
- return f.Deferred(
- function ( d ) {
- f.each( {done : [a, "resolve"], fail : [b, "reject"], progress : [c, "notify"]}, function ( a, b ) {
- var c = b[0], e = b[1], g;
- f.isFunction( c ) ? i[a]( function () {
- g = c.apply( this, arguments ), g && f.isFunction( g.promise ) ? g.promise().then( d.resolve, d.reject, d.notify ) : d[e + "With"]( this === i ? d : this, [g] )
- } ) : i[a]( d[e] )
- } )
- } ).promise()
- }, promise : function ( a ) {
- if ( a == null ) {
- a = h;
- } else {
- for ( var b in h ) {
- a[b] = h[b];
- }
- }
- return a
- }}, i = h.promise( {} ), j;
- for ( j in g ) {
- i[j] = g[j].fire, i[j + "With"] = g[j].fireWith;
- }
- i.done(
- function () {
- e = "resolved"
- }, c.disable, d.lock ).fail( function () {
- e = "rejected"
- }, b.disable, d.lock ), a && a.call( i, i );
- return i
- }, when : function ( a ) {
- function m( a ) {
- return function ( b ) {
- e[a] = arguments.length > 1 ? i.call( arguments, 0 ) : b, j.notifyWith( k, e )
- }
- }
-
- function l( a ) {
- return function ( c ) {
- b[a] = arguments.length > 1 ? i.call( arguments, 0 ) : c, --g || j.resolveWith( j, b )
- }
- }
-
- var b = i.call( arguments, 0 ), c = 0, d = b.length, e = Array( d ), g = d, h = d, j = d <= 1 && a && f.isFunction( a.promise ) ? a : f.Deferred(), k = j.promise();
- if ( d > 1 ) {
- for ( ; c < d; c++ ) {
- b[c] && b[c].promise && f.isFunction( b[c].promise ) ? b[c].promise().then( l( c ), j.reject, m( c ) ) : --g;
- }
- g || j.resolveWith( j, b )
- } else {
- j !== a && j.resolveWith( j, d ? [a] : [] );
- }
- return k
- }} ), f.support = function () {
- var b, d, e, g, h, i, j, k, l, m, n, o, p, q = c.createElement( "div" ), r = c.documentElement;
- q.setAttribute( "className", "t" ), q.innerHTML = "
a", d = q.getElementsByTagName( "*" ), e = q.getElementsByTagName( "a" )[0];
- if ( !d || !d.length || !e ) {
- return{};
- }
- g = c.createElement( "select" ), h = g.appendChild( c.createElement( "option" ) ), i = q.getElementsByTagName( "input" )[0], b = {leadingWhitespace : q.firstChild.nodeType === 3, tbody : !q.getElementsByTagName( "tbody" ).length, htmlSerialize : !!q.getElementsByTagName( "link" ).length, style : /top/.test( e.getAttribute( "style" ) ), hrefNormalized : e.getAttribute( "href" ) === "/a", opacity : /^0.55/.test( e.style.opacity ), cssFloat : !!e.style.cssFloat, checkOn : i.value === "on", optSelected : h.selected, getSetAttribute : q.className !== "t", enctype : !!c.createElement( "form" ).enctype, html5Clone : c.createElement( "nav" ).cloneNode( !0 ).outerHTML !== "<:nav>", submitBubbles : !0, changeBubbles : !0, focusinBubbles : !1, deleteExpando : !0, noCloneEvent : !0, inlineBlockNeedsLayout : !1, shrinkWrapBlocks : !1, reliableMarginRight : !0}, i.checked = !0, b.noCloneChecked = i.cloneNode( !0 ).checked, g.disabled = !0, b.optDisabled = !h.disabled;
- try {
- delete q.test
- } catch ( s ) {
- b.deleteExpando = !1
- }
- !q.addEventListener && q.attachEvent && q.fireEvent && (q.attachEvent( "onclick", function () {
- b.noCloneEvent = !1
- } ), q.cloneNode( !0 ).fireEvent( "onclick" )), i = c.createElement( "input" ), i.value = "t", i.setAttribute( "type", "radio" ), b.radioValue = i.value === "t", i.setAttribute( "checked", "checked" ), q.appendChild( i ), k = c.createDocumentFragment(), k.appendChild( q.lastChild ), b.checkClone = k.cloneNode( !0 ).cloneNode( !0 ).lastChild.checked, b.appendChecked = i.checked, k.removeChild( i ), k.appendChild( q ), q.innerHTML = "", a.getComputedStyle && (j = c.createElement( "div" ), j.style.width = "0", j.style.marginRight = "0", q.style.width = "2px", q.appendChild( j ), b.reliableMarginRight = (parseInt( (a.getComputedStyle( j, null ) || {marginRight : 0}).marginRight, 10 ) || 0) === 0);
- if ( q.attachEvent ) {
- for ( o in{submit : 1, change : 1, focusin : 1} ) {
- n = "on" + o, p = n in q, p || (q.setAttribute( n, "return;" ), p = typeof q[n] == "function"), b[o + "Bubbles"] = p;
- }
- }
- k.removeChild( q ), k = g = h = j = q = i = null, f( function () {
- var a, d, e, g, h, i, j, k, m, n, o, r = c.getElementsByTagName( "body" )[0];
- !r || (j = 1, k = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;", m = "visibility:hidden;border:0;", n = "style='" + k + "border:5px solid #000;padding:0;'", o = "
" + "
" + "
", a = c.createElement( "div" ), a.style.cssText = m + "width:0;height:0;position:static;top:0;margin-top:" + j + "px", r.insertBefore( a, r.firstChild ), q = c.createElement( "div" ), a.appendChild( q ), q.innerHTML = "
t
", l = q.getElementsByTagName( "td" ), p = l[0].offsetHeight === 0, l[0].style.display = "", l[1].style.display = "none", b.reliableHiddenOffsets = p && l[0].offsetHeight === 0, q.innerHTML = "", q.style.width = q.style.paddingLeft = "1px", f.boxModel = b.boxModel = q.offsetWidth === 2, typeof q.style.zoom != "undefined" && (q.style.display = "inline", q.style.zoom = 1, b.inlineBlockNeedsLayout = q.offsetWidth === 2, q.style.display = "", q.innerHTML = "", b.shrinkWrapBlocks = q.offsetWidth !== 2), q.style.cssText = k + m, q.innerHTML = o, d = q.firstChild, e = d.firstChild, h = d.nextSibling.firstChild.firstChild, i = {doesNotAddBorder : e.offsetTop !== 5, doesAddBorderForTableAndCells : h.offsetTop === 5}, e.style.position = "fixed", e.style.top = "20px", i.fixedPosition = e.offsetTop === 20 || e.offsetTop === 15, e.style.position = e.style.top = "", d.style.overflow = "hidden", d.style.position = "relative", i.subtractsBorderForOverflowNotVisible = e.offsetTop === -5, i.doesNotIncludeMarginInBodyOffset = r.offsetTop !== j, r.removeChild( a ), q = a = null, f.extend( b, i ))
- } );
- return b
- }();
- var j = /^(?:\{.*\}|\[.*\])$/, k = /([A-Z])/g;
- f.extend( {cache : {}, uuid : 0, expando : "jQuery" + (f.fn.jquery + Math.random()).replace( /\D/g, "" ), noData : {embed : !0, object : "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", applet : !0}, hasData : function ( a ) {
- a = a.nodeType ? f.cache[a[f.expando]] : a[f.expando];
- return!!a && !m( a )
- }, data : function ( a, c, d, e ) {
- if ( !!f.acceptData( a ) ) {
- var g, h, i, j = f.expando, k = typeof c == "string", l = a.nodeType, m = l ? f.cache : a, n = l ? a[j] : a[j] && j, o = c === "events";
- if ( (!n || !m[n] || !o && !e && !m[n].data) && k && d === b ) {
- return;
- }
- n || (l ? a[j] = n = ++f.uuid : n = j), m[n] || (m[n] = {}, l || (m[n].toJSON = f.noop));
- if ( typeof c == "object" || typeof c == "function" ) {
- e ? m[n] = f.extend( m[n], c ) : m[n].data = f.extend( m[n].data, c );
- }
- g = h = m[n], e || (h.data || (h.data = {}), h = h.data), d !== b && (h[f.camelCase( c )] = d);
- if ( o && !h[c] ) {
- return g.events;
- }
- k ? (i = h[c], i == null && (i = h[f.camelCase( c )])) : i = h;
- return i
- }
- }, removeData : function ( a, b, c ) {
- if ( !!f.acceptData( a ) ) {
- var d, e, g, h = f.expando, i = a.nodeType, j = i ? f.cache : a, k = i ? a[h] : h;
- if ( !j[k] ) {
- return;
- }
- if ( b ) {
- d = c ? j[k] : j[k].data;
- if ( d ) {
- f.isArray( b ) || (b in d ? b = [b] : (b = f.camelCase( b ), b in d ? b = [b] : b = b.split( " " )));
- for ( e = 0, g = b.length; e < g; e++ ) {
- delete d[b[e]];
- }
- if ( !(c ? m : f.isEmptyObject)( d ) ) {
- return
- }
- }
- }
- if ( !c ) {
- delete j[k].data;
- if ( !m( j[k] ) ) {
- return
- }
- }
- f.support.deleteExpando || !j.setInterval ? delete j[k] : j[k] = null, i && (f.support.deleteExpando ? delete a[h] : a.removeAttribute ? a.removeAttribute( h ) : a[h] = null)
- }
- }, _data : function ( a, b, c ) {
- return f.data( a, b, c, !0 )
- }, acceptData : function ( a ) {
- if ( a.nodeName ) {
- var b = f.noData[a.nodeName.toLowerCase()];
- if ( b ) {
- return b !== !0 && a.getAttribute( "classid" ) === b
- }
- }
- return!0
- }} ), f.fn.extend( {data : function ( a, c ) {
- var d, e, g, h = null;
- if ( typeof a == "undefined" ) {
- if ( this.length ) {
- h = f.data( this[0] );
- if ( this[0].nodeType === 1 && !f._data( this[0], "parsedAttrs" ) ) {
- e = this[0].attributes;
- for ( var i = 0, j = e.length; i < j; i++ ) {
- g = e[i].name, g.indexOf( "data-" ) === 0 && (g = f.camelCase( g.substring( 5 ) ), l( this[0], g, h[g] ));
- }
- f._data( this[0], "parsedAttrs", !0 )
- }
- }
- return h
- }
- if ( typeof a == "object" ) {
- return this.each( function () {
- f.data( this, a )
- } );
- }
- d = a.split( "." ), d[1] = d[1] ? "." + d[1] : "";
- if ( c === b ) {
- h = this.triggerHandler( "getData" + d[1] + "!", [d[0]] ), h === b && this.length && (h = f.data( this[0], a ), h = l( this[0], a, h ));
- return h === b && d[1] ? this.data( d[0] ) : h
- }
- return this.each( function () {
- var b = f( this ), e = [d[0], c];
- b.triggerHandler( "setData" + d[1] + "!", e ), f.data( this, a, c ), b.triggerHandler( "changeData" + d[1] + "!", e )
- } )
- }, removeData : function ( a ) {
- return this.each( function () {
- f.removeData( this, a )
- } )
- }} ), f.extend( {_mark : function ( a, b ) {
- a && (b = (b || "fx") + "mark", f._data( a, b, (f._data( a, b ) || 0) + 1 ))
- }, _unmark : function ( a, b, c ) {
- a !== !0 && (c = b, b = a, a = !1);
- if ( b ) {
- c = c || "fx";
- var d = c + "mark", e = a ? 0 : (f._data( b, d ) || 1) - 1;
- e ? f._data( b, d, e ) : (f.removeData( b, d, !0 ), n( b, c, "mark" ))
- }
- }, queue : function ( a, b, c ) {
- var d;
- if ( a ) {
- b = (b || "fx") + "queue", d = f._data( a, b ), c && (!d || f.isArray( c ) ? d = f._data( a, b, f.makeArray( c ) ) : d.push( c ));
- return d || []
- }
- }, dequeue : function ( a, b ) {
- b = b || "fx";
- var c = f.queue( a, b ), d = c.shift(), e = {};
- d === "inprogress" && (d = c.shift()), d && (b === "fx" && c.unshift( "inprogress" ), f._data( a, b + ".run", e ), d.call( a, function () {
- f.dequeue( a, b )
- }, e )), c.length || (f.removeData( a, b + "queue " + b + ".run", !0 ), n( a, b, "queue" ))
- }} ), f.fn.extend( {queue : function ( a, c ) {
- typeof a != "string" && (c = a, a = "fx");
- if ( c === b ) {
- return f.queue( this[0], a );
- }
- return this.each( function () {
- var b = f.queue( this, a, c );
- a === "fx" && b[0] !== "inprogress" && f.dequeue( this, a )
- } )
- }, dequeue : function ( a ) {
- return this.each( function () {
- f.dequeue( this, a )
- } )
- }, delay : function ( a, b ) {
- a = f.fx ? f.fx.speeds[a] || a : a, b = b || "fx";
- return this.queue( b, function ( b, c ) {
- var d = setTimeout( b, a );
- c.stop = function () {
- clearTimeout( d )
- }
- } )
- }, clearQueue : function ( a ) {
- return this.queue( a || "fx", [] )
- }, promise : function ( a, c ) {
- function m() {
- --h || d.resolveWith( e, [e] )
- }
-
- typeof a != "string" && (c = a, a = b), a = a || "fx";
- var d = f.Deferred(), e = this, g = e.length, h = 1, i = a + "defer", j = a + "queue", k = a + "mark", l;
- while ( g-- ) {
- if ( l = f.data( e[g], i, b, !0 ) || (f.data( e[g], j, b, !0 ) || f.data( e[g], k, b, !0 )) && f.data( e[g], i, f.Callbacks( "once memory" ), !0 ) ) {
- h++, l.add( m );
- }
- }
- m();
- return d.promise()
- }} );
- var o = /[\n\t\r]/g, p = /\s+/, q = /\r/g, r = /^(?:button|input)$/i, s = /^(?:button|input|object|select|textarea)$/i, t = /^a(?:rea)?$/i, u = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, v = f.support.getSetAttribute, w, x, y;
- f.fn.extend( {attr : function ( a, b ) {
- return f.access( this, a, b, !0, f.attr )
- }, removeAttr : function ( a ) {
- return this.each( function () {
- f.removeAttr( this, a )
- } )
- }, prop : function ( a, b ) {
- return f.access( this, a, b, !0, f.prop )
- }, removeProp : function ( a ) {
- a = f.propFix[a] || a;
- return this.each( function () {
- try {
- this[a] = b, delete this[a]
- } catch ( c ) {
- }
- } )
- }, addClass : function ( a ) {
- var b, c, d, e, g, h, i;
- if ( f.isFunction( a ) ) {
- return this.each( function ( b ) {
- f( this ).addClass( a.call( this, b, this.className ) )
- } );
- }
- if ( a && typeof a == "string" ) {
- b = a.split( p );
- for ( c = 0, d = this.length; c < d; c++ ) {
- e = this[c];
- if ( e.nodeType === 1 ) {
- if ( !e.className && b.length === 1 ) {
- e.className = a;
- } else {
- g = " " + e.className + " ";
- for ( h = 0, i = b.length; h < i; h++ ) {
- ~g.indexOf( " " + b[h] + " " ) || (g += b[h] + " ");
- }
- e.className = f.trim( g )
- }
- }
- }
- }
- return this
- }, removeClass : function ( a ) {
- var c, d, e, g, h, i, j;
- if ( f.isFunction( a ) ) {
- return this.each( function ( b ) {
- f( this ).removeClass( a.call( this, b, this.className ) )
- } );
- }
- if ( a && typeof a == "string" || a === b ) {
- c = (a || "").split( p );
- for ( d = 0, e = this.length; d < e; d++ ) {
- g = this[d];
- if ( g.nodeType === 1 && g.className ) {
- if ( a ) {
- h = (" " + g.className + " ").replace( o, " " );
- for ( i = 0, j = c.length; i < j; i++ ) {
- h = h.replace( " " + c[i] + " ", " " );
- }
- g.className = f.trim( h )
- } else {
- g.className = ""
- }
- }
- }
- }
- return this
- }, toggleClass : function ( a, b ) {
- var c = typeof a, d = typeof b == "boolean";
- if ( f.isFunction( a ) ) {
- return this.each( function ( c ) {
- f( this ).toggleClass( a.call( this, c, this.className, b ), b )
- } );
- }
- return this.each( function () {
- if ( c === "string" ) {
- var e, g = 0, h = f( this ), i = b, j = a.split( p );
- while ( e = j[g++] ) {
- i = d ? i : !h.hasClass( e ), h[i ? "addClass" : "removeClass"]( e )
- }
- } else if ( c === "undefined" || c === "boolean" ) {
- this.className && f._data( this, "__className__", this.className ), this.className = this.className || a === !1 ? "" : f._data( this, "__className__" ) || ""
- }
- } )
- }, hasClass : function ( a ) {
- var b = " " + a + " ", c = 0, d = this.length;
- for ( ; c < d; c++ ) {
- if ( this[c].nodeType === 1 && (" " + this[c].className + " ").replace( o, " " ).indexOf( b ) > -1 ) {
- return!0;
- }
- }
- return!1
- }, val : function ( a ) {
- var c, d, e, g = this[0];
- {
- if ( !!arguments.length ) {
- e = f.isFunction( a );
- return this.each( function ( d ) {
- var g = f( this ), h;
- if ( this.nodeType === 1 ) {
- e ? h = a.call( this, d, g.val() ) : h = a, h == null ? h = "" : typeof h == "number" ? h += "" : f.isArray( h ) && (h = f.map( h, function ( a ) {
- return a == null ? "" : a + ""
- } )), c = f.valHooks[this.nodeName.toLowerCase()] || f.valHooks[this.type];
- if ( !c || !("set"in c) || c.set( this, h, "value" ) === b ) {
- this.value = h
- }
- }
- } )
- }
- if ( g ) {
- c = f.valHooks[g.nodeName.toLowerCase()] || f.valHooks[g.type];
- if ( c && "get"in c && (d = c.get( g, "value" )) !== b ) {
- return d;
- }
- d = g.value;
- return typeof d == "string" ? d.replace( q, "" ) : d == null ? "" : d
- }
- }
- }} ), f.extend( {valHooks : {option : {get : function ( a ) {
- var b = a.attributes.value;
- return!b || b.specified ? a.value : a.text
- }}, select : {get : function ( a ) {
- var b, c, d, e, g = a.selectedIndex, h = [], i = a.options, j = a.type === "select-one";
- if ( g < 0 ) {
- return null;
- }
- c = j ? g : 0, d = j ? g + 1 : i.length;
- for ( ; c < d; c++ ) {
- e = i[c];
- if ( e.selected && (f.support.optDisabled ? !e.disabled : e.getAttribute( "disabled" ) === null) && (!e.parentNode.disabled || !f.nodeName( e.parentNode, "optgroup" )) ) {
- b = f( e ).val();
- if ( j ) {
- return b;
- }
- h.push( b )
- }
- }
- if ( j && !h.length && i.length ) {
- return f( i[g] ).val();
- }
- return h
- }, set : function ( a, b ) {
- var c = f.makeArray( b );
- f( a ).find( "option" ).each( function () {
- this.selected = f.inArray( f( this ).val(), c ) >= 0
- } ), c.length || (a.selectedIndex = -1);
- return c
- }}}, attrFn : {val : !0, css : !0, html : !0, text : !0, data : !0, width : !0, height : !0, offset : !0}, attr : function ( a, c, d, e ) {
- var g, h, i, j = a.nodeType;
- if ( !!a && j !== 3 && j !== 8 && j !== 2 ) {
- if ( e && c in f.attrFn ) {
- return f( a )[c]( d );
- }
- if ( typeof a.getAttribute == "undefined" ) {
- return f.prop( a, c, d );
- }
- i = j !== 1 || !f.isXMLDoc( a ), i && (c = c.toLowerCase(), h = f.attrHooks[c] || (u.test( c ) ? x : w));
- if ( d !== b ) {
- if ( d === null ) {
- f.removeAttr( a, c );
- return
- }
- if ( h && "set"in h && i && (g = h.set( a, d, c )) !== b ) {
- return g;
- }
- a.setAttribute( c, "" + d );
- return d
- }
- if ( h && "get"in h && i && (g = h.get( a, c )) !== null ) {
- return g;
- }
- g = a.getAttribute( c );
- return g === null ? b : g
- }
- }, removeAttr : function ( a, b ) {
- var c, d, e, g, h = 0;
- if ( b && a.nodeType === 1 ) {
- d = b.toLowerCase().split( p ), g = d.length;
- for ( ; h < g; h++ ) {
- e = d[h], e && (c = f.propFix[e] || e, f.attr( a, e, "" ), a.removeAttribute( v ? e : c ), u.test( e ) && c in a && (a[c] = !1))
- }
- }
- }, attrHooks : {type : {set : function ( a, b ) {
- if ( r.test( a.nodeName ) && a.parentNode ) {
- f.error( "type property can't be changed" );
- } else if ( !f.support.radioValue && b === "radio" && f.nodeName( a, "input" ) ) {
- var c = a.value;
- a.setAttribute( "type", b ), c && (a.value = c);
- return b
- }
- }}, value : {get : function ( a, b ) {
- if ( w && f.nodeName( a, "button" ) ) {
- return w.get( a, b );
- }
- return b in a ? a.value : null
- }, set : function ( a, b, c ) {
- if ( w && f.nodeName( a, "button" ) ) {
- return w.set( a, b, c );
- }
- a.value = b
- }}}, propFix : {tabindex : "tabIndex", readonly : "readOnly", "for" : "htmlFor", "class" : "className", maxlength : "maxLength", cellspacing : "cellSpacing", cellpadding : "cellPadding", rowspan : "rowSpan", colspan : "colSpan", usemap : "useMap", frameborder : "frameBorder", contenteditable : "contentEditable"}, prop : function ( a, c, d ) {
- var e, g, h, i = a.nodeType;
- if ( !!a && i !== 3 && i !== 8 && i !== 2 ) {
- h = i !== 1 || !f.isXMLDoc( a ), h && (c = f.propFix[c] || c, g = f.propHooks[c]);
- return d !== b ? g && "set"in g && (e = g.set( a, d, c )) !== b ? e : a[c] = d : g && "get"in g && (e = g.get( a, c )) !== null ? e : a[c]
- }
- }, propHooks : {tabIndex : {get : function ( a ) {
- var c = a.getAttributeNode( "tabindex" );
- return c && c.specified ? parseInt( c.value, 10 ) : s.test( a.nodeName ) || t.test( a.nodeName ) && a.href ? 0 : b
- }}}} ), f.attrHooks.tabindex = f.propHooks.tabIndex, x = {get : function ( a, c ) {
- var d, e = f.prop( a, c );
- return e === !0 || typeof e != "boolean" && (d = a.getAttributeNode( c )) && d.nodeValue !== !1 ? c.toLowerCase() : b
- }, set : function ( a, b, c ) {
- var d;
- b === !1 ? f.removeAttr( a, c ) : (d = f.propFix[c] || c, d in a && (a[d] = !0), a.setAttribute( c, c.toLowerCase() ));
- return c
- }}, v || (y = {name : !0, id : !0}, w = f.valHooks.button = {get : function ( a, c ) {
- var d;
- d = a.getAttributeNode( c );
- return d && (y[c] ? d.nodeValue !== "" : d.specified) ? d.nodeValue : b
- }, set : function ( a, b, d ) {
- var e = a.getAttributeNode( d );
- e || (e = c.createAttribute( d ), a.setAttributeNode( e ));
- return e.nodeValue = b + ""
- }}, f.attrHooks.tabindex.set = w.set, f.each( ["width", "height"], function ( a, b ) {
- f.attrHooks[b] = f.extend( f.attrHooks[b], {set : function ( a, c ) {
- if ( c === "" ) {
- a.setAttribute( b, "auto" );
- return c
- }
- }} )
- } ), f.attrHooks.contenteditable = {get : w.get, set : function ( a, b, c ) {
- b === "" && (b = "false"), w.set( a, b, c )
- }}), f.support.hrefNormalized || f.each( ["href", "src", "width", "height"], function ( a, c ) {
- f.attrHooks[c] = f.extend( f.attrHooks[c], {get : function ( a ) {
- var d = a.getAttribute( c, 2 );
- return d === null ? b : d
- }} )
- } ), f.support.style || (f.attrHooks.style = {get : function ( a ) {
- return a.style.cssText.toLowerCase() || b
- }, set : function ( a, b ) {
- return a.style.cssText = "" + b
- }}), f.support.optSelected || (f.propHooks.selected = f.extend( f.propHooks.selected, {get : function ( a ) {
- var b = a.parentNode;
- b && (b.selectedIndex, b.parentNode && b.parentNode.selectedIndex);
- return null
- }} )), f.support.enctype || (f.propFix.enctype = "encoding"), f.support.checkOn || f.each( ["radio", "checkbox"], function () {
- f.valHooks[this] = {get : function ( a ) {
- return a.getAttribute( "value" ) === null ? "on" : a.value
- }}
- } ), f.each( ["radio", "checkbox"], function () {
- f.valHooks[this] = f.extend( f.valHooks[this], {set : function ( a, b ) {
- if ( f.isArray( b ) ) {
- return a.checked = f.inArray( f( a ).val(), b ) >= 0
- }
- }} )
- } );
- var z = /^(?:textarea|input|select)$/i, A = /^([^\.]*)?(?:\.(.+))?$/, B = /\bhover(\.\S+)?\b/, C = /^key/, D = /^(?:mouse|contextmenu)|click/, E = /^(?:focusinfocus|focusoutblur)$/, F = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, G = function ( a ) {
- var b = F.exec( a );
- b && (b[1] = (b[1] || "").toLowerCase(), b[3] = b[3] && new RegExp( "(?:^|\\s)" + b[3] + "(?:\\s|$)" ));
- return b
- }, H = function ( a, b ) {
- var c = a.attributes || {};
- return(!b[1] || a.nodeName.toLowerCase() === b[1]) && (!b[2] || (c.id || {}).value === b[2]) && (!b[3] || b[3].test( (c["class"] || {}).value ))
- }, I = function ( a ) {
- return f.event.special.hover ? a : a.replace( B, "mouseenter$1 mouseleave$1" )
- };
- f.event = {add : function ( a, c, d, e, g ) {
- var h, i, j, k, l, m, n, o, p, q, r, s;
- if ( !(a.nodeType === 3 || a.nodeType === 8 || !c || !d || !(h = f._data( a ))) ) {
- d.handler && (p = d, d = p.handler), d.guid || (d.guid = f.guid++), j = h.events, j || (h.events = j = {}), i = h.handle, i || (h.handle = i = function ( a ) {
- return typeof f != "undefined" && (!a || f.event.triggered !== a.type) ? f.event.dispatch.apply( i.elem, arguments ) : b
- }, i.elem = a), c = f.trim( I( c ) ).split( " " );
- for ( k = 0; k < c.length; k++ ) {
- l = A.exec( c[k] ) || [], m = l[1], n = (l[2] || "").split( "." ).sort(), s = f.event.special[m] || {}, m = (g ? s.delegateType : s.bindType) || m, s = f.event.special[m] || {}, o = f.extend( {type : m, origType : l[1], data : e, handler : d, guid : d.guid, selector : g, quick : G( g ), namespace : n.join( "." )}, p ), r = j[m];
- if ( !r ) {
- r = j[m] = [], r.delegateCount = 0;
- if ( !s.setup || s.setup.call( a, e, n, i ) === !1 ) {
- a.addEventListener ? a.addEventListener( m, i, !1 ) : a.attachEvent && a.attachEvent( "on" + m, i )
- }
- }
- s.add && (s.add.call( a, o ), o.handler.guid || (o.handler.guid = d.guid)), g ? r.splice( r.delegateCount++, 0, o ) : r.push( o ), f.event.global[m] = !0
- }
- a = null
- }
- }, global : {}, remove : function ( a, b, c, d, e ) {
- var g = f.hasData( a ) && f._data( a ), h, i, j, k, l, m, n, o, p, q, r, s;
- if ( !!g && !!(o = g.events) ) {
- b = f.trim( I( b || "" ) ).split( " " );
- for ( h = 0; h < b.length; h++ ) {
- i = A.exec( b[h] ) || [], j = k = i[1], l = i[2];
- if ( !j ) {
- for ( j in o ) {
- f.event.remove( a, j + b[h], c, d, !0 );
- }
- continue
- }
- p = f.event.special[j] || {}, j = (d ? p.delegateType : p.bindType) || j, r = o[j] || [], m = r.length, l = l ? new RegExp( "(^|\\.)" + l.split( "." ).sort().join( "\\.(?:.*\\.)?" ) + "(\\.|$)" ) : null;
- for ( n = 0; n < r.length; n++ ) {
- s = r[n], (e || k === s.origType) && (!c || c.guid === s.guid) && (!l || l.test( s.namespace )) && (!d || d === s.selector || d === "**" && s.selector) && (r.splice( n--, 1 ), s.selector && r.delegateCount--, p.remove && p.remove.call( a, s ));
- }
- r.length === 0 && m !== r.length && ((!p.teardown || p.teardown.call( a, l ) === !1) && f.removeEvent( a, j, g.handle ), delete o[j])
- }
- f.isEmptyObject( o ) && (q = g.handle, q && (q.elem = null), f.removeData( a, ["events", "handle"], !0 ))
- }
- }, customEvent : {getData : !0, setData : !0, changeData : !0}, trigger : function ( c, d, e, g ) {
- if ( !e || e.nodeType !== 3 && e.nodeType !== 8 ) {
- var h = c.type || c, i = [], j, k, l, m, n, o, p, q, r, s;
- if ( E.test( h + f.event.triggered ) ) {
- return;
- }
- h.indexOf( "!" ) >= 0 && (h = h.slice( 0, -1 ), k = !0), h.indexOf( "." ) >= 0 && (i = h.split( "." ), h = i.shift(), i.sort());
- if ( (!e || f.event.customEvent[h]) && !f.event.global[h] ) {
- return;
- }
- c = typeof c == "object" ? c[f.expando] ? c : new f.Event( h, c ) : new f.Event( h ), c.type = h, c.isTrigger = !0, c.exclusive = k, c.namespace = i.join( "." ), c.namespace_re = c.namespace ? new RegExp( "(^|\\.)" + i.join( "\\.(?:.*\\.)?" ) + "(\\.|$)" ) : null, o = h.indexOf( ":" ) < 0 ? "on" + h : "";
- if ( !e ) {
- j = f.cache;
- for ( l in j ) {
- j[l].events && j[l].events[h] && f.event.trigger( c, d, j[l].handle.elem, !0 );
- }
- return
- }
- c.result = b, c.target || (c.target = e), d = d != null ? f.makeArray( d ) : [], d.unshift( c ), p = f.event.special[h] || {};
- if ( p.trigger && p.trigger.apply( e, d ) === !1 ) {
- return;
- }
- r = [
- [e, p.bindType || h]
- ];
- if ( !g && !p.noBubble && !f.isWindow( e ) ) {
- s = p.delegateType || h, m = E.test( s + h ) ? e : e.parentNode, n = null;
- for ( ; m; m = m.parentNode ) {
- r.push( [m, s] ), n = m;
- }
- n && n === e.ownerDocument && r.push( [n.defaultView || n.parentWindow || a, s] )
- }
- for ( l = 0; l < r.length && !c.isPropagationStopped(); l++ ) {
- m = r[l][0], c.type = r[l][1], q = (f._data( m, "events" ) || {})[c.type] && f._data( m, "handle" ), q && q.apply( m, d ), q = o && m[o], q && f.acceptData( m ) && q.apply( m, d ) === !1 && c.preventDefault();
- }
- c.type = h, !g && !c.isDefaultPrevented() && (!p._default || p._default.apply( e.ownerDocument, d ) === !1) && (h !== "click" || !f.nodeName( e, "a" )) && f.acceptData( e ) && o && e[h] && (h !== "focus" && h !== "blur" || c.target.offsetWidth !== 0) && !f.isWindow( e ) && (n = e[o], n && (e[o] = null), f.event.triggered = h, e[h](), f.event.triggered = b, n && (e[o] = n));
- return c.result
- }
- }, dispatch : function ( c ) {
- c = f.event.fix( c || a.event );
- var d = (f._data( this, "events" ) || {})[c.type] || [], e = d.delegateCount, g = [].slice.call( arguments, 0 ), h = !c.exclusive && !c.namespace, i = [], j, k, l, m, n, o, p, q, r, s, t;
- g[0] = c, c.delegateTarget = this;
- if ( e && !c.target.disabled && (!c.button || c.type !== "click") ) {
- m = f( this ), m.context = this.ownerDocument || this;
- for ( l = c.target; l != this; l = l.parentNode || this ) {
- o = {}, q = [], m[0] = l;
- for ( j = 0; j < e; j++ ) {
- r = d[j], s = r.selector, o[s] === b && (o[s] = r.quick ? H( l, r.quick ) : m.is( s )), o[s] && q.push( r );
- }
- q.length && i.push( {elem : l, matches : q} )
- }
- }
- d.length > e && i.push( {elem : this, matches : d.slice( e )} );
- for ( j = 0; j < i.length && !c.isPropagationStopped(); j++ ) {
- p = i[j], c.currentTarget = p.elem;
- for ( k = 0; k < p.matches.length && !c.isImmediatePropagationStopped(); k++ ) {
- r = p.matches[k];
- if ( h || !c.namespace && !r.namespace || c.namespace_re && c.namespace_re.test( r.namespace ) ) {
- c.data = r.data, c.handleObj = r, n = ((f.event.special[r.origType] || {}).handle || r.handler).apply( p.elem, g ), n !== b && (c.result = n, n === !1 && (c.preventDefault(), c.stopPropagation()))
- }
- }
- }
- return c.result
- }, props : "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split( " " ), fixHooks : {}, keyHooks : {props : "char charCode key keyCode".split( " " ), filter : function ( a, b ) {
- a.which == null && (a.which = b.charCode != null ? b.charCode : b.keyCode);
- return a
- }}, mouseHooks : {props : "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split( " " ), filter : function ( a, d ) {
- var e, f, g, h = d.button, i = d.fromElement;
- a.pageX == null && d.clientX != null && (e = a.target.ownerDocument || c, f = e.documentElement, g = e.body, a.pageX = d.clientX + (f && f.scrollLeft || g && g.scrollLeft || 0) - (f && f.clientLeft || g && g.clientLeft || 0), a.pageY = d.clientY + (f && f.scrollTop || g && g.scrollTop || 0) - (f && f.clientTop || g && g.clientTop || 0)), !a.relatedTarget && i && (a.relatedTarget = i === a.target ? d.toElement : i), !a.which && h !== b && (a.which = h & 1 ? 1 : h & 2 ? 3 : h & 4 ? 2 : 0);
- return a
- }}, fix : function ( a ) {
- if ( a[f.expando] ) {
- return a;
- }
- var d, e, g = a, h = f.event.fixHooks[a.type] || {}, i = h.props ? this.props.concat( h.props ) : this.props;
- a = f.Event( g );
- for ( d = i.length; d; ) {
- e = i[--d], a[e] = g[e];
- }
- a.target || (a.target = g.srcElement || c), a.target.nodeType === 3 && (a.target = a.target.parentNode), a.metaKey === b && (a.metaKey = a.ctrlKey);
- return h.filter ? h.filter( a, g ) : a
- }, special : {ready : {setup : f.bindReady}, load : {noBubble : !0}, focus : {delegateType : "focusin"}, blur : {delegateType : "focusout"}, beforeunload : {setup : function ( a, b, c ) {
- f.isWindow( this ) && (this.onbeforeunload = c)
- }, teardown : function ( a, b ) {
- this.onbeforeunload === b && (this.onbeforeunload = null)
- }}}, simulate : function ( a, b, c, d ) {
- var e = f.extend( new f.Event, c, {type : a, isSimulated : !0, originalEvent : {}} );
- d ? f.event.trigger( e, null, b ) : f.event.dispatch.call( b, e ), e.isDefaultPrevented() && c.preventDefault()
- }}, f.event.handle = f.event.dispatch, f.removeEvent = c.removeEventListener ? function ( a, b, c ) {
- a.removeEventListener && a.removeEventListener( b, c, !1 )
- } : function ( a, b, c ) {
- a.detachEvent && a.detachEvent( "on" + b, c )
- }, f.Event = function ( a, b ) {
- if ( !(this instanceof f.Event) ) {
- return new f.Event( a, b );
- }
- a && a.type ? (this.originalEvent = a, this.type = a.type, this.isDefaultPrevented = a.defaultPrevented || a.returnValue === !1 || a.getPreventDefault && a.getPreventDefault() ? K : J) : this.type = a, b && f.extend( this, b ), this.timeStamp = a && a.timeStamp || f.now(), this[f.expando] = !0
- }, f.Event.prototype = {preventDefault : function () {
- this.isDefaultPrevented = K;
- var a = this.originalEvent;
- !a || (a.preventDefault ? a.preventDefault() : a.returnValue = !1)
- }, stopPropagation : function () {
- this.isPropagationStopped = K;
- var a = this.originalEvent;
- !a || (a.stopPropagation && a.stopPropagation(), a.cancelBubble = !0)
- }, stopImmediatePropagation : function () {
- this.isImmediatePropagationStopped = K, this.stopPropagation()
- }, isDefaultPrevented : J, isPropagationStopped : J, isImmediatePropagationStopped : J}, f.each( {mouseenter : "mouseover", mouseleave : "mouseout"}, function ( a, b ) {
- f.event.special[a] = {delegateType : b, bindType : b, handle : function ( a ) {
- var c = this, d = a.relatedTarget, e = a.handleObj, g = e.selector, h;
- if ( !d || d !== c && !f.contains( c, d ) ) {
- a.type = e.origType, h = e.handler.apply( this, arguments ), a.type = b;
- }
- return h
- }}
- } ), f.support.submitBubbles || (f.event.special.submit = {setup : function () {
- if ( f.nodeName( this, "form" ) ) {
- return!1;
- }
- f.event.add( this, "click._submit keypress._submit", function ( a ) {
- var c = a.target, d = f.nodeName( c, "input" ) || f.nodeName( c, "button" ) ? c.form : b;
- d && !d._submit_attached && (f.event.add( d, "submit._submit", function ( a ) {
- this.parentNode && !a.isTrigger && f.event.simulate( "submit", this.parentNode, a, !0 )
- } ), d._submit_attached = !0)
- } )
- }, teardown : function () {
- if ( f.nodeName( this, "form" ) ) {
- return!1;
- }
- f.event.remove( this, "._submit" )
- }}), f.support.changeBubbles || (f.event.special.change = {setup : function () {
- if ( z.test( this.nodeName ) ) {
- if ( this.type === "checkbox" || this.type === "radio" ) {
- f.event.add( this, "propertychange._change", function ( a ) {
- a.originalEvent.propertyName === "checked" && (this._just_changed = !0)
- } ), f.event.add( this, "click._change", function ( a ) {
- this._just_changed && !a.isTrigger && (this._just_changed = !1, f.event.simulate( "change", this, a, !0 ))
- } );
- }
- return!1
- }
- f.event.add( this, "beforeactivate._change", function ( a ) {
- var b = a.target;
- z.test( b.nodeName ) && !b._change_attached && (f.event.add( b, "change._change", function ( a ) {
- this.parentNode && !a.isSimulated && !a.isTrigger && f.event.simulate( "change", this.parentNode, a, !0 )
- } ), b._change_attached = !0)
- } )
- }, handle : function ( a ) {
- var b = a.target;
- if ( this !== b || a.isSimulated || a.isTrigger || b.type !== "radio" && b.type !== "checkbox" ) {
- return a.handleObj.handler.apply( this, arguments )
- }
- }, teardown : function () {
- f.event.remove( this, "._change" );
- return z.test( this.nodeName )
- }}), f.support.focusinBubbles || f.each( {focus : "focusin", blur : "focusout"}, function ( a, b ) {
- var d = 0, e = function ( a ) {
- f.event.simulate( b, a.target, f.event.fix( a ), !0 )
- };
- f.event.special[b] = {setup : function () {
- d++ === 0 && c.addEventListener( a, e, !0 )
- }, teardown : function () {
- --d === 0 && c.removeEventListener( a, e, !0 )
- }}
- } ), f.fn.extend( {on : function ( a, c, d, e, g ) {
- var h, i;
- if ( typeof a == "object" ) {
- typeof c != "string" && (d = c, c = b);
- for ( i in a ) {
- this.on( i, c, d, a[i], g );
- }
- return this
- }
- d == null && e == null ? (e = c, d = c = b) : e == null && (typeof c == "string" ? (e = d, d = b) : (e = d, d = c, c = b));
- if ( e === !1 ) {
- e = J;
- } else if ( !e ) {
- return this;
- }
- g === 1 && (h = e, e = function ( a ) {
- f().off( a );
- return h.apply( this, arguments )
- }, e.guid = h.guid || (h.guid = f.guid++));
- return this.each( function () {
- f.event.add( this, a, e, d, c )
- } )
- }, one : function ( a, b, c, d ) {
- return this.on.call( this, a, b, c, d, 1 )
- }, off : function ( a, c, d ) {
- if ( a && a.preventDefault && a.handleObj ) {
- var e = a.handleObj;
- f( a.delegateTarget ).off( e.namespace ? e.type + "." + e.namespace : e.type, e.selector, e.handler );
- return this
- }
- if ( typeof a == "object" ) {
- for ( var g in a ) {
- this.off( g, c, a[g] );
- }
- return this
- }
- if ( c === !1 || typeof c == "function" ) {
- d = c, c = b;
- }
- d === !1 && (d = J);
- return this.each( function () {
- f.event.remove( this, a, d, c )
- } )
- }, bind : function ( a, b, c ) {
- return this.on( a, null, b, c )
- }, unbind : function ( a, b ) {
- return this.off( a, null, b )
- }, live : function ( a, b, c ) {
- f( this.context ).on( a, this.selector, b, c );
- return this
- }, die : function ( a, b ) {
- f( this.context ).off( a, this.selector || "**", b );
- return this
- }, delegate : function ( a, b, c, d ) {
- return this.on( b, a, c, d )
- }, undelegate : function ( a, b, c ) {
- return arguments.length == 1 ? this.off( a, "**" ) : this.off( b, a, c )
- }, trigger : function ( a, b ) {
- return this.each( function () {
- f.event.trigger( a, b, this )
- } )
- }, triggerHandler : function ( a, b ) {
- if ( this[0] ) {
- return f.event.trigger( a, b, this[0], !0 )
- }
- }, toggle : function ( a ) {
- var b = arguments, c = a.guid || f.guid++, d = 0, e = function ( c ) {
- var e = (f._data( this, "lastToggle" + a.guid ) || 0) % d;
- f._data( this, "lastToggle" + a.guid, e + 1 ), c.preventDefault();
- return b[e].apply( this, arguments ) || !1
- };
- e.guid = c;
- while ( d < b.length ) {
- b[d++].guid = c;
- }
- return this.click( e )
- }, hover : function ( a, b ) {
- return this.mouseenter( a ).mouseleave( b || a )
- }} ), f.each( "blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split( " " ), function ( a, b ) {
- f.fn[b] = function ( a, c ) {
- c == null && (c = a, a = null);
- return arguments.length > 0 ? this.on( b, null, a, c ) : this.trigger( b )
- }, f.attrFn && (f.attrFn[b] = !0), C.test( b ) && (f.event.fixHooks[b] = f.event.keyHooks), D.test( b ) && (f.event.fixHooks[b] = f.event.mouseHooks)
- } ), function () {
- function x( a, b, c, e, f, g ) {
- for ( var h = 0, i = e.length; h < i; h++ ) {
- var j = e[h];
- if ( j ) {
- var k = !1;
- j = j[a];
- while ( j ) {
- if ( j[d] === c ) {
- k = e[j.sizset];
- break
- }
- if ( j.nodeType === 1 ) {
- g || (j[d] = c, j.sizset = h);
- if ( typeof b != "string" ) {
- if ( j === b ) {
- k = !0;
- break
- }
- } else if ( m.filter( b, [j] ).length > 0 ) {
- k = j;
- break
- }
- }
- j = j[a]
- }
- e[h] = k
- }
- }
- }
-
- function w( a, b, c, e, f, g ) {
- for ( var h = 0, i = e.length; h < i; h++ ) {
- var j = e[h];
- if ( j ) {
- var k = !1;
- j = j[a];
- while ( j ) {
- if ( j[d] === c ) {
- k = e[j.sizset];
- break
- }
- j.nodeType === 1 && !g && (j[d] = c, j.sizset = h);
- if ( j.nodeName.toLowerCase() === b ) {
- k = j;
- break
- }
- j = j[a]
- }
- e[h] = k
- }
- }
- }
-
- var a = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, d = "sizcache" + (Math.random() + "").replace( ".", "" ), e = 0, g = Object.prototype.toString, h = !1, i = !0, j = /\\/g, k = /\r\n/g, l = /\W/;
- [0, 0].sort( function () {
- i = !1;
- return 0
- } );
- var m = function ( b, d, e, f ) {
- e = e || [], d = d || c;
- var h = d;
- if ( d.nodeType !== 1 && d.nodeType !== 9 ) {
- return[];
- }
- if ( !b || typeof b != "string" ) {
- return e;
- }
- var i, j, k, l, n, q, r, t, u = !0, v = m.isXML( d ), w = [], x = b;
- do {
- a.exec( "" ), i = a.exec( x );
- if ( i ) {
- x = i[3], w.push( i[1] );
- if ( i[2] ) {
- l = i[3];
- break
- }
- }
- } while ( i );
- if ( w.length > 1 && p.exec( b ) ) {
- if ( w.length === 2 && o.relative[w[0]] ) {
- j = y( w[0] + w[1], d, f );
- } else {
- j = o.relative[w[0]] ? [d] : m( w.shift(), d );
- while ( w.length ) {
- b = w.shift(), o.relative[b] && (b += w.shift()), j = y( b, j, f )
- }
- }
- } else {
- !f && w.length > 1 && d.nodeType === 9 && !v && o.match.ID.test( w[0] ) && !o.match.ID.test( w[w.length - 1] ) && (n = m.find( w.shift(), d, v ), d = n.expr ? m.filter( n.expr, n.set )[0] : n.set[0]);
- if ( d ) {
- n = f ? {expr : w.pop(), set : s( f )} : m.find( w.pop(), w.length === 1 && (w[0] === "~" || w[0] === "+") && d.parentNode ? d.parentNode : d, v ), j = n.expr ? m.filter( n.expr, n.set ) : n.set, w.length > 0 ? k = s( j ) : u = !1;
- while ( w.length ) {
- q = w.pop(), r = q, o.relative[q] ? r = w.pop() : q = "", r == null && (r = d), o.relative[q]( k, r, v )
- }
- } else {
- k = w = []
- }
- }
- k || (k = j), k || m.error( q || b );
- if ( g.call( k ) === "[object Array]" ) {
- if ( !u ) {
- e.push.apply( e, k );
- } else if ( d && d.nodeType === 1 ) {
- for ( t = 0; k[t] != null; t++ ) {
- k[t] && (k[t] === !0 || k[t].nodeType === 1 && m.contains( d, k[t] )) && e.push( j[t] );
- }
- } else {
- for ( t = 0; k[t] != null; t++ ) {
- k[t] && k[t].nodeType === 1 && e.push( j[t] );
- }
- }
- } else {
- s( k, e );
- }
- l && (m( l, h, e, f ), m.uniqueSort( e ));
- return e
- };
- m.uniqueSort = function ( a ) {
- if ( u ) {
- h = i, a.sort( u );
- if ( h ) {
- for ( var b = 1; b < a.length; b++ ) {
- a[b] === a[b - 1] && a.splice( b--, 1 )
- }
- }
- }
- return a
- }, m.matches = function ( a, b ) {
- return m( a, null, null, b )
- }, m.matchesSelector = function ( a, b ) {
- return m( b, null, null, [a] ).length > 0
- }, m.find = function ( a, b, c ) {
- var d, e, f, g, h, i;
- if ( !a ) {
- return[];
- }
- for ( e = 0, f = o.order.length; e < f; e++ ) {
- h = o.order[e];
- if ( g = o.leftMatch[h].exec( a ) ) {
- i = g[1], g.splice( 1, 1 );
- if ( i.substr( i.length - 1 ) !== "\\" ) {
- g[1] = (g[1] || "").replace( j, "" ), d = o.find[h]( g, b, c );
- if ( d != null ) {
- a = a.replace( o.match[h], "" );
- break
- }
- }
- }
- }
- d || (d = typeof b.getElementsByTagName != "undefined" ? b.getElementsByTagName( "*" ) : []);
- return{set : d, expr : a}
- }, m.filter = function ( a, c, d, e ) {
- var f, g, h, i, j, k, l, n, p, q = a, r = [], s = c, t = c && c[0] && m.isXML( c[0] );
- while ( a && c.length ) {
- for ( h in o.filter ) {
- if ( (f = o.leftMatch[h].exec( a )) != null && f[2] ) {
- k = o.filter[h], l = f[1], g = !1, f.splice( 1, 1 );
- if ( l.substr( l.length - 1 ) === "\\" ) {
- continue;
- }
- s === r && (r = []);
- if ( o.preFilter[h] ) {
- f = o.preFilter[h]( f, s, d, r, e, t );
- if ( !f ) {
- g = i = !0;
- } else if ( f === !0 ) {
- continue
- }
- }
- if ( f ) {
- for ( n = 0; (j = s[n]) != null; n++ ) {
- j && (i = k( j, f, n, s ), p = e ^ i, d && i != null ? p ? g = !0 : s[n] = !1 : p && (r.push( j ), g = !0));
- }
- }
- if ( i !== b ) {
- d || (s = r), a = a.replace( o.match[h], "" );
- if ( !g ) {
- return[];
- }
- break
- }
- }
- }
- if ( a === q ) {
- if ( g == null ) {
- m.error( a );
- } else {
- break;
- }
- }
- q = a
- }
- return s
- }, m.error = function ( a ) {
- throw new Error( "Syntax error, unrecognized expression: " + a )
- };
- var n = m.getText = function ( a ) {
- var b, c, d = a.nodeType, e = "";
- if ( d ) {
- if ( d === 1 || d === 9 ) {
- if ( typeof a.textContent == "string" ) {
- return a.textContent;
- }
- if ( typeof a.innerText == "string" ) {
- return a.innerText.replace( k, "" );
- }
- for ( a = a.firstChild; a; a = a.nextSibling ) {
- e += n( a )
- }
- } else if ( d === 3 || d === 4 ) {
- return a.nodeValue
- }
- } else {
- for ( b = 0; c = a[b]; b++ ) {
- c.nodeType !== 8 && (e += n( c ));
- }
- }
- return e
- }, o = m.selectors = {order : ["ID", "NAME", "TAG"], match : {ID : /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS : /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME : /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR : /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG : /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD : /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS : /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO : /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/}, leftMatch : {}, attrMap : {"class" : "className", "for" : "htmlFor"}, attrHandle : {href : function ( a ) {
- return a.getAttribute( "href" )
- }, type : function ( a ) {
- return a.getAttribute( "type" )
- }}, relative : {"+" : function ( a, b ) {
- var c = typeof b == "string", d = c && !l.test( b ), e = c && !d;
- d && (b = b.toLowerCase());
- for ( var f = 0, g = a.length, h; f < g; f++ ) {
- if ( h = a[f] ) {
- while ( (h = h.previousSibling) && h.nodeType !== 1 ) {
- ;
- }
- a[f] = e || h && h.nodeName.toLowerCase() === b ? h || !1 : h === b
- }
- }
- e && m.filter( b, a, !0 )
- }, ">" : function ( a, b ) {
- var c, d = typeof b == "string", e = 0, f = a.length;
- if ( d && !l.test( b ) ) {
- b = b.toLowerCase();
- for ( ; e < f; e++ ) {
- c = a[e];
- if ( c ) {
- var g = c.parentNode;
- a[e] = g.nodeName.toLowerCase() === b ? g : !1
- }
- }
- } else {
- for ( ; e < f; e++ ) {
- c = a[e], c && (a[e] = d ? c.parentNode : c.parentNode === b);
- }
- d && m.filter( b, a, !0 )
- }
- }, "" : function ( a, b, c ) {
- var d, f = e++, g = x;
- typeof b == "string" && !l.test( b ) && (b = b.toLowerCase(), d = b, g = w), g( "parentNode", b, f, a, d, c )
- }, "~" : function ( a, b, c ) {
- var d, f = e++, g = x;
- typeof b == "string" && !l.test( b ) && (b = b.toLowerCase(), d = b, g = w), g( "previousSibling", b, f, a, d, c )
- }}, find : {ID : function ( a, b, c ) {
- if ( typeof b.getElementById != "undefined" && !c ) {
- var d = b.getElementById( a[1] );
- return d && d.parentNode ? [d] : []
- }
- }, NAME : function ( a, b ) {
- if ( typeof b.getElementsByName != "undefined" ) {
- var c = [], d = b.getElementsByName( a[1] );
- for ( var e = 0, f = d.length; e < f; e++ ) {
- d[e].getAttribute( "name" ) === a[1] && c.push( d[e] );
- }
- return c.length === 0 ? null : c
- }
- }, TAG : function ( a, b ) {
- if ( typeof b.getElementsByTagName != "undefined" ) {
- return b.getElementsByTagName( a[1] )
- }
- }}, preFilter : {CLASS : function ( a, b, c, d, e, f ) {
- a = " " + a[1].replace( j, "" ) + " ";
- if ( f ) {
- return a;
- }
- for ( var g = 0, h; (h = b[g]) != null; g++ ) {
- h && (e ^ (h.className && (" " + h.className + " ").replace( /[\t\n\r]/g, " " ).indexOf( a ) >= 0) ? c || d.push( h ) : c && (b[g] = !1));
- }
- return!1
- }, ID : function ( a ) {
- return a[1].replace( j, "" )
- }, TAG : function ( a, b ) {
- return a[1].replace( j, "" ).toLowerCase()
- }, CHILD : function ( a ) {
- if ( a[1] === "nth" ) {
- a[2] || m.error( a[0] ), a[2] = a[2].replace( /^\+|\s*/g, "" );
- var b = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( a[2] === "even" && "2n" || a[2] === "odd" && "2n+1" || !/\D/.test( a[2] ) && "0n+" + a[2] || a[2] );
- a[2] = b[1] + (b[2] || 1) - 0, a[3] = b[3] - 0
- } else {
- a[2] && m.error( a[0] );
- }
- a[0] = e++;
- return a
- }, ATTR : function ( a, b, c, d, e, f ) {
- var g = a[1] = a[1].replace( j, "" );
- !f && o.attrMap[g] && (a[1] = o.attrMap[g]), a[4] = (a[4] || a[5] || "").replace( j, "" ), a[2] === "~=" && (a[4] = " " + a[4] + " ");
- return a
- }, PSEUDO : function ( b, c, d, e, f ) {
- if ( b[1] === "not" ) {
- if ( (a.exec( b[3] ) || "").length > 1 || /^\w/.test( b[3] ) ) {
- b[3] = m( b[3], null, null, c );
- } else {
- var g = m.filter( b[3], c, d, !0 ^ f );
- d || e.push.apply( e, g );
- return!1
- }
- } else if ( o.match.POS.test( b[0] ) || o.match.CHILD.test( b[0] ) ) {
- return!0;
- }
- return b
- }, POS : function ( a ) {
- a.unshift( !0 );
- return a
- }}, filters : {enabled : function ( a ) {
- return a.disabled === !1 && a.type !== "hidden"
- }, disabled : function ( a ) {
- return a.disabled === !0
- }, checked : function ( a ) {
- return a.checked === !0
- }, selected : function ( a ) {
- a.parentNode && a.parentNode.selectedIndex;
- return a.selected === !0
- }, parent : function ( a ) {
- return!!a.firstChild
- }, empty : function ( a ) {
- return!a.firstChild
- }, has : function ( a, b, c ) {
- return!!m( c[3], a ).length
- }, header : function ( a ) {
- return/h\d/i.test( a.nodeName )
- }, text : function ( a ) {
- var b = a.getAttribute( "type" ), c = a.type;
- return a.nodeName.toLowerCase() === "input" && "text" === c && (b === c || b === null)
- }, radio : function ( a ) {
- return a.nodeName.toLowerCase() === "input" && "radio" === a.type
- }, checkbox : function ( a ) {
- return a.nodeName.toLowerCase() === "input" && "checkbox" === a.type
- }, file : function ( a ) {
- return a.nodeName.toLowerCase() === "input" && "file" === a.type
- }, password : function ( a ) {
- return a.nodeName.toLowerCase() === "input" && "password" === a.type
- }, submit : function ( a ) {
- var b = a.nodeName.toLowerCase();
- return(b === "input" || b === "button") && "submit" === a.type
- }, image : function ( a ) {
- return a.nodeName.toLowerCase() === "input" && "image" === a.type
- }, reset : function ( a ) {
- var b = a.nodeName.toLowerCase();
- return(b === "input" || b === "button") && "reset" === a.type
- }, button : function ( a ) {
- var b = a.nodeName.toLowerCase();
- return b === "input" && "button" === a.type || b === "button"
- }, input : function ( a ) {
- return/input|select|textarea|button/i.test( a.nodeName )
- }, focus : function ( a ) {
- return a === a.ownerDocument.activeElement
- }}, setFilters : {first : function ( a, b ) {
- return b === 0
- }, last : function ( a, b, c, d ) {
- return b === d.length - 1
- }, even : function ( a, b ) {
- return b % 2 === 0
- }, odd : function ( a, b ) {
- return b % 2 === 1
- }, lt : function ( a, b, c ) {
- return b < c[3] - 0
- }, gt : function ( a, b, c ) {
- return b > c[3] - 0
- }, nth : function ( a, b, c ) {
- return c[3] - 0 === b
- }, eq : function ( a, b, c ) {
- return c[3] - 0 === b
- }}, filter : {PSEUDO : function ( a, b, c, d ) {
- var e = b[1], f = o.filters[e];
- if ( f ) {
- return f( a, c, b, d );
- }
- if ( e === "contains" ) {
- return(a.textContent || a.innerText || n( [a] ) || "").indexOf( b[3] ) >= 0;
- }
- if ( e === "not" ) {
- var g = b[3];
- for ( var h = 0, i = g.length; h < i; h++ ) {
- if ( g[h] === a ) {
- return!1;
- }
- }
- return!0
- }
- m.error( e )
- }, CHILD : function ( a, b ) {
- var c, e, f, g, h, i, j, k = b[1], l = a;
- switch ( k ) {
- case"only":
- case"first":
- while ( l = l.previousSibling ) {
- if ( l.nodeType === 1 ) {
- return!1;
- }
- }
- if ( k === "first" ) {
- return!0;
- }
- l = a;
- case"last":
- while ( l = l.nextSibling ) {
- if ( l.nodeType === 1 ) {
- return!1;
- }
- }
- return!0;
- case"nth":
- c = b[2], e = b[3];
- if ( c === 1 && e === 0 ) {
- return!0;
- }
- f = b[0], g = a.parentNode;
- if ( g && (g[d] !== f || !a.nodeIndex) ) {
- i = 0;
- for ( l = g.firstChild; l; l = l.nextSibling ) {
- l.nodeType === 1 && (l.nodeIndex = ++i);
- }
- g[d] = f
- }
- j = a.nodeIndex - e;
- return c === 0 ? j === 0 : j % c === 0 && j / c >= 0
- }
- }, ID : function ( a, b ) {
- return a.nodeType === 1 && a.getAttribute( "id" ) === b
- }, TAG : function ( a, b ) {
- return b === "*" && a.nodeType === 1 || !!a.nodeName && a.nodeName.toLowerCase() === b
- }, CLASS : function ( a, b ) {
- return(" " + (a.className || a.getAttribute( "class" )) + " ").indexOf( b ) > -1
- }, ATTR : function ( a, b ) {
- var c = b[1], d = m.attr ? m.attr( a, c ) : o.attrHandle[c] ? o.attrHandle[c]( a ) : a[c] != null ? a[c] : a.getAttribute( c ), e = d + "", f = b[2], g = b[4];
- return d == null ? f === "!=" : !f && m.attr ? d != null : f === "=" ? e === g : f === "*=" ? e.indexOf( g ) >= 0 : f === "~=" ? (" " + e + " ").indexOf( g ) >= 0 : g ? f === "!=" ? e !== g : f === "^=" ? e.indexOf( g ) === 0 : f === "$=" ? e.substr( e.length - g.length ) === g : f === "|=" ? e === g || e.substr( 0, g.length + 1 ) === g + "-" : !1 : e && d !== !1
- }, POS : function ( a, b, c, d ) {
- var e = b[2], f = o.setFilters[e];
- if ( f ) {
- return f( a, c, b, d )
- }
- }}}, p = o.match.POS, q = function ( a, b ) {
- return"\\" + (b - 0 + 1)
- };
- for ( var r in o.match ) {
- o.match[r] = new RegExp( o.match[r].source + /(?![^\[]*\])(?![^\(]*\))/.source ), o.leftMatch[r] = new RegExp( /(^(?:.|\r|\n)*?)/.source + o.match[r].source.replace( /\\(\d+)/g, q ) );
- }
- var s = function ( a, b ) {
- a = Array.prototype.slice.call( a, 0 );
- if ( b ) {
- b.push.apply( b, a );
- return b
- }
- return a
- };
- try {
- Array.prototype.slice.call( c.documentElement.childNodes, 0 )[0].nodeType
- } catch ( t ) {
- s = function ( a, b ) {
- var c = 0, d = b || [];
- if ( g.call( a ) === "[object Array]" ) {
- Array.prototype.push.apply( d, a );
- } else if ( typeof a.length == "number" ) {
- for ( var e = a.length; c < e; c++ ) {
- d.push( a[c] );
- }
- } else {
- for ( ; a[c]; c++ ) {
- d.push( a[c] );
- }
- }
- return d
- }
- }
- var u, v;
- c.documentElement.compareDocumentPosition ? u = function ( a, b ) {
- if ( a === b ) {
- h = !0;
- return 0
- }
- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
- return a.compareDocumentPosition ? -1 : 1;
- }
- return a.compareDocumentPosition( b ) & 4 ? -1 : 1
- } : (u = function ( a, b ) {
- if ( a === b ) {
- h = !0;
- return 0
- }
- if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
- var c, d, e = [], f = [], g = a.parentNode, i = b.parentNode, j = g;
- if ( g === i ) {
- return v( a, b );
- }
- if ( !g ) {
- return-1;
- }
- if ( !i ) {
- return 1;
- }
- while ( j ) {
- e.unshift( j ), j = j.parentNode;
- }
- j = i;
- while ( j ) {
- f.unshift( j ), j = j.parentNode;
- }
- c = e.length, d = f.length;
- for ( var k = 0; k < c && k < d; k++ ) {
- if ( e[k] !== f[k] ) {
- return v( e[k], f[k] );
- }
- }
- return k === c ? v( a, f[k], -1 ) : v( e[k], b, 1 )
- }, v = function ( a, b, c ) {
- if ( a === b ) {
- return c;
- }
- var d = a.nextSibling;
- while ( d ) {
- if ( d === b ) {
- return-1;
- }
- d = d.nextSibling
- }
- return 1
- }), function () {
- var a = c.createElement( "div" ), d = "script" + (new Date).getTime(), e = c.documentElement;
- a.innerHTML = "", e.insertBefore( a, e.firstChild ), c.getElementById( d ) && (o.find.ID = function ( a, c, d ) {
- if ( typeof c.getElementById != "undefined" && !d ) {
- var e = c.getElementById( a[1] );
- return e ? e.id === a[1] || typeof e.getAttributeNode != "undefined" && e.getAttributeNode( "id" ).nodeValue === a[1] ? [e] : b : []
- }
- }, o.filter.ID = function ( a, b ) {
- var c = typeof a.getAttributeNode != "undefined" && a.getAttributeNode( "id" );
- return a.nodeType === 1 && c && c.nodeValue === b
- }), e.removeChild( a ), e = a = null
- }(), function () {
- var a = c.createElement( "div" );
- a.appendChild( c.createComment( "" ) ), a.getElementsByTagName( "*" ).length > 0 && (o.find.TAG = function ( a, b ) {
- var c = b.getElementsByTagName( a[1] );
- if ( a[1] === "*" ) {
- var d = [];
- for ( var e = 0; c[e]; e++ ) {
- c[e].nodeType === 1 && d.push( c[e] );
- }
- c = d
- }
- return c
- }), a.innerHTML = "", a.firstChild && typeof a.firstChild.getAttribute != "undefined" && a.firstChild.getAttribute( "href" ) !== "#" && (o.attrHandle.href = function ( a ) {
- return a.getAttribute( "href", 2 )
- }), a = null
- }(), c.querySelectorAll && function () {
- var a = m, b = c.createElement( "div" ), d = "__sizzle__";
- b.innerHTML = "";
- if ( !b.querySelectorAll || b.querySelectorAll( ".TEST" ).length !== 0 ) {
- m = function ( b, e, f, g ) {
- e = e || c;
- if ( !g && !m.isXML( e ) ) {
- var h = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( b );
- if ( h && (e.nodeType === 1 || e.nodeType === 9) ) {
- if ( h[1] ) {
- return s( e.getElementsByTagName( b ), f );
- }
- if ( h[2] && o.find.CLASS && e.getElementsByClassName ) {
- return s( e.getElementsByClassName( h[2] ), f )
- }
- }
- if ( e.nodeType === 9 ) {
- if ( b === "body" && e.body ) {
- return s( [e.body], f );
- }
- if ( h && h[3] ) {
- var i = e.getElementById( h[3] );
- if ( !i || !i.parentNode ) {
- return s( [], f );
- }
- if ( i.id === h[3] ) {
- return s( [i], f )
- }
- }
- try {
- return s( e.querySelectorAll( b ), f )
- } catch ( j ) {
- }
- } else if ( e.nodeType === 1 && e.nodeName.toLowerCase() !== "object" ) {
- var k = e, l = e.getAttribute( "id" ), n = l || d, p = e.parentNode, q = /^\s*[+~]/.test( b );
- l ? n = n.replace( /'/g, "\\$&" ) : e.setAttribute( "id", n ), q && p && (e = e.parentNode);
- try {
- if ( !q || p ) {
- return s( e.querySelectorAll( "[id='" + n + "'] " + b ), f )
- }
- } catch ( r ) {
- } finally {
- l || k.removeAttribute( "id" )
- }
- }
- }
- return a( b, e, f, g )
- };
- for ( var e in a ) {
- m[e] = a[e];
- }
- b = null
- }
- }(), function () {
- var a = c.documentElement, b = a.matchesSelector || a.mozMatchesSelector || a.webkitMatchesSelector || a.msMatchesSelector;
- if ( b ) {
- var d = !b.call( c.createElement( "div" ), "div" ), e = !1;
- try {
- b.call( c.documentElement, "[test!='']:sizzle" )
- } catch ( f ) {
- e = !0
- }
- m.matchesSelector = function ( a, c ) {
- c = c.replace( /\=\s*([^'"\]]*)\s*\]/g, "='$1']" );
- if ( !m.isXML( a ) ) {
- try {
- if ( e || !o.match.PSEUDO.test( c ) && !/!=/.test( c ) ) {
- var f = b.call( a, c );
- if ( f || !d || a.document && a.document.nodeType !== 11 ) {
- return f
- }
- }
- } catch ( g ) {
- }
- }
- return m( c, null, null, [a] ).length > 0
- }
- }
- }(), function () {
- var a = c.createElement( "div" );
- a.innerHTML = "";
- if ( !!a.getElementsByClassName && a.getElementsByClassName( "e" ).length !== 0 ) {
- a.lastChild.className = "e";
- if ( a.getElementsByClassName( "e" ).length === 1 ) {
- return;
- }
- o.order.splice( 1, 0, "CLASS" ), o.find.CLASS = function ( a, b, c ) {
- if ( typeof b.getElementsByClassName != "undefined" && !c ) {
- return b.getElementsByClassName( a[1] )
- }
- }, a = null
- }
- }(), c.documentElement.contains ? m.contains = function ( a, b ) {
- return a !== b && (a.contains ? a.contains( b ) : !0)
- } : c.documentElement.compareDocumentPosition ? m.contains = function ( a, b ) {
- return!!(a.compareDocumentPosition( b ) & 16)
- } : m.contains = function () {
- return!1
- }, m.isXML = function ( a ) {
- var b = (a ? a.ownerDocument || a : 0).documentElement;
- return b ? b.nodeName !== "HTML" : !1
- };
- var y = function ( a, b, c ) {
- var d, e = [], f = "", g = b.nodeType ? [b] : b;
- while ( d = o.match.PSEUDO.exec( a ) ) {
- f += d[0], a = a.replace( o.match.PSEUDO, "" );
- }
- a = o.relative[a] ? a + "*" : a;
- for ( var h = 0, i = g.length; h < i; h++ ) {
- m( a, g[h], e, c );
- }
- return m.filter( f, e )
- };
- m.attr = f.attr, m.selectors.attrMap = {}, f.find = m, f.expr = m.selectors, f.expr[":"] = f.expr.filters, f.unique = m.uniqueSort, f.text = m.getText, f.isXMLDoc = m.isXML, f.contains = m.contains
- }();
- var L = /Until$/, M = /^(?:parents|prevUntil|prevAll)/, N = /,/, O = /^.[^:#\[\.,]*$/, P = Array.prototype.slice, Q = f.expr.match.POS, R = {children : !0, contents : !0, next : !0, prev : !0};
- f.fn.extend( {find : function ( a ) {
- var b = this, c, d;
- if ( typeof a != "string" ) {
- return f( a ).filter( function () {
- for ( c = 0, d = b.length; c < d; c++ ) {
- if ( f.contains( b[c], this ) ) {
- return!0
- }
- }
- } );
- }
- var e = this.pushStack( "", "find", a ), g, h, i;
- for ( c = 0, d = this.length; c < d; c++ ) {
- g = e.length, f.find( a, this[c], e );
- if ( c > 0 ) {
- for ( h = g; h < e.length; h++ ) {
- for ( i = 0; i < g; i++ ) {
- if ( e[i] === e[h] ) {
- e.splice( h--, 1 );
- break
- }
- }
- }
- }
- }
- return e
- }, has : function ( a ) {
- var b = f( a );
- return this.filter( function () {
- for ( var a = 0, c = b.length; a < c; a++ ) {
- if ( f.contains( this, b[a] ) ) {
- return!0
- }
- }
- } )
- }, not : function ( a ) {
- return this.pushStack( T( this, a, !1 ), "not", a )
- }, filter : function ( a ) {
- return this.pushStack( T( this, a, !0 ), "filter", a )
- }, is : function ( a ) {
- return!!a && (typeof a == "string" ? Q.test( a ) ? f( a, this.context ).index( this[0] ) >= 0 : f.filter( a, this ).length > 0 : this.filter( a ).length > 0)
- }, closest : function ( a, b ) {
- var c = [], d, e, g = this[0];
- if ( f.isArray( a ) ) {
- var h = 1;
- while ( g && g.ownerDocument && g !== b ) {
- for ( d = 0; d < a.length; d++ ) {
- f( g ).is( a[d] ) && c.push( {selector : a[d], elem : g, level : h} );
- }
- g = g.parentNode, h++
- }
- return c
- }
- var i = Q.test( a ) || typeof a != "string" ? f( a, b || this.context ) : 0;
- for ( d = 0, e = this.length; d < e; d++ ) {
- g = this[d];
- while ( g ) {
- if ( i ? i.index( g ) > -1 : f.find.matchesSelector( g, a ) ) {
- c.push( g );
- break
- }
- g = g.parentNode;
- if ( !g || !g.ownerDocument || g === b || g.nodeType === 11 ) {
- break
- }
- }
- }
- c = c.length > 1 ? f.unique( c ) : c;
- return this.pushStack( c, "closest", a )
- }, index : function ( a ) {
- if ( !a ) {
- return this[0] && this[0].parentNode ? this.prevAll().length : -1;
- }
- if ( typeof a == "string" ) {
- return f.inArray( this[0], f( a ) );
- }
- return f.inArray( a.jquery ? a[0] : a, this )
- }, add : function ( a, b ) {
- var c = typeof a == "string" ? f( a, b ) : f.makeArray( a && a.nodeType ? [a] : a ), d = f.merge( this.get(), c );
- return this.pushStack( S( c[0] ) || S( d[0] ) ? d : f.unique( d ) )
- }, andSelf : function () {
- return this.add( this.prevObject )
- }} ), f.each( {parent : function ( a ) {
- var b = a.parentNode;
- return b && b.nodeType !== 11 ? b : null
- }, parents : function ( a ) {
- return f.dir( a, "parentNode" )
- }, parentsUntil : function ( a, b, c ) {
- return f.dir( a, "parentNode", c )
- }, next : function ( a ) {
- return f.nth( a, 2, "nextSibling" )
- }, prev : function ( a ) {
- return f.nth( a, 2, "previousSibling" )
- }, nextAll : function ( a ) {
- return f.dir( a, "nextSibling" )
- }, prevAll : function ( a ) {
- return f.dir( a, "previousSibling" )
- }, nextUntil : function ( a, b, c ) {
- return f.dir( a, "nextSibling", c )
- }, prevUntil : function ( a, b, c ) {
- return f.dir( a, "previousSibling", c )
- }, siblings : function ( a ) {
- return f.sibling( a.parentNode.firstChild, a )
- }, children : function ( a ) {
- return f.sibling( a.firstChild )
- }, contents : function ( a ) {
- return f.nodeName( a, "iframe" ) ? a.contentDocument || a.contentWindow.document : f.makeArray( a.childNodes )
- }}, function ( a, b ) {
- f.fn[a] = function ( c, d ) {
- var e = f.map( this, b, c );
- L.test( a ) || (d = c), d && typeof d == "string" && (e = f.filter( d, e )), e = this.length > 1 && !R[a] ? f.unique( e ) : e, (this.length > 1 || N.test( d )) && M.test( a ) && (e = e.reverse());
- return this.pushStack( e, a, P.call( arguments ).join( "," ) )
- }
- } ), f.extend( {filter : function ( a, b, c ) {
- c && (a = ":not(" + a + ")");
- return b.length === 1 ? f.find.matchesSelector( b[0], a ) ? [b[0]] : [] : f.find.matches( a, b )
- }, dir : function ( a, c, d ) {
- var e = [], g = a[c];
- while ( g && g.nodeType !== 9 && (d === b || g.nodeType !== 1 || !f( g ).is( d )) ) {
- g.nodeType === 1 && e.push( g ), g = g[c];
- }
- return e
- }, nth : function ( a, b, c, d ) {
- b = b || 1;
- var e = 0;
- for ( ; a; a = a[c] ) {
- if ( a.nodeType === 1 && ++e === b ) {
- break;
- }
- }
- return a
- }, sibling : function ( a, b ) {
- var c = [];
- for ( ; a; a = a.nextSibling ) {
- a.nodeType === 1 && a !== b && c.push( a );
- }
- return c
- }} );
- var V = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", W = / jQuery\d+="(?:\d+|null)"/g, X = /^\s+/, Y = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, Z = /<([\w:]+)/, $ = /", ""], legend : [1, ""], thead : [1, "
"]), f.fn.extend( {text : function ( a ) {
- if ( f.isFunction( a ) ) {
- return this.each( function ( b ) {
- var c = f( this );
- c.text( a.call( this, b, c.text() ) )
- } );
- }
- if ( typeof a != "object" && a !== b ) {
- return this.empty().append( (this[0] && this[0].ownerDocument || c).createTextNode( a ) );
- }
- return f.text( this )
- }, wrapAll : function ( a ) {
- if ( f.isFunction( a ) ) {
- return this.each( function ( b ) {
- f( this ).wrapAll( a.call( this, b ) )
- } );
- }
- if ( this[0] ) {
- var b = f( a, this[0].ownerDocument ).eq( 0 ).clone( !0 );
- this[0].parentNode && b.insertBefore( this[0] ), b.map(
- function () {
- var a = this;
- while ( a.firstChild && a.firstChild.nodeType === 1 ) {
- a = a.firstChild;
- }
- return a
- } ).append( this )
- }
- return this
- }, wrapInner : function ( a ) {
- if ( f.isFunction( a ) ) {
- return this.each( function ( b ) {
- f( this ).wrapInner( a.call( this, b ) )
- } );
- }
- return this.each( function () {
- var b = f( this ), c = b.contents();
- c.length ? c.wrapAll( a ) : b.append( a )
- } )
- }, wrap : function ( a ) {
- var b = f.isFunction( a );
- return this.each( function ( c ) {
- f( this ).wrapAll( b ? a.call( this, c ) : a )
- } )
- }, unwrap : function () {
- return this.parent().each(
- function () {
- f.nodeName( this, "body" ) || f( this ).replaceWith( this.childNodes )
- } ).end()
- }, append : function () {
- return this.domManip( arguments, !0, function ( a ) {
- this.nodeType === 1 && this.appendChild( a )
- } )
- }, prepend : function () {
- return this.domManip( arguments, !0, function ( a ) {
- this.nodeType === 1 && this.insertBefore( a, this.firstChild )
- } )
- }, before : function () {
- if ( this[0] && this[0].parentNode ) {
- return this.domManip( arguments, !1, function ( a ) {
- this.parentNode.insertBefore( a, this )
- } );
- }
- if ( arguments.length ) {
- var a = f.clean( arguments );
- a.push.apply( a, this.toArray() );
- return this.pushStack( a, "before", arguments )
- }
- }, after : function () {
- if ( this[0] && this[0].parentNode ) {
- return this.domManip( arguments, !1, function ( a ) {
- this.parentNode.insertBefore( a, this.nextSibling )
- } );
- }
- if ( arguments.length ) {
- var a = this.pushStack( this, "after", arguments );
- a.push.apply( a, f.clean( arguments ) );
- return a
- }
- }, remove : function ( a, b ) {
- for ( var c = 0, d; (d = this[c]) != null; c++ ) {
- if ( !a || f.filter( a, [d] ).length ) {
- !b && d.nodeType === 1 && (f.cleanData( d.getElementsByTagName( "*" ) ), f.cleanData( [d] )), d.parentNode && d.parentNode.removeChild( d );
- }
- }
- return this
- }, empty : function () {
- for ( var a = 0, b; (b = this[a]) != null; a++ ) {
- b.nodeType === 1 && f.cleanData( b.getElementsByTagName( "*" ) );
- while ( b.firstChild ) {
- b.removeChild( b.firstChild )
- }
- }
- return this
- }, clone : function ( a, b ) {
- a = a == null ? !1 : a, b = b == null ? a : b;
- return this.map( function () {
- return f.clone( this, a, b )
- } )
- }, html : function ( a ) {
- if ( a === b ) {
- return this[0] && this[0].nodeType === 1 ? this[0].innerHTML.replace( W, "" ) : null;
- }
- if ( typeof a == "string" && !ba.test( a ) && (f.support.leadingWhitespace || !X.test( a )) && !bg[(Z.exec( a ) || ["", ""])[1].toLowerCase()] ) {
- a = a.replace( Y, "<$1>$2>" );
- try {
- for ( var c = 0, d = this.length; c < d; c++ ) {
- this[c].nodeType === 1 && (f.cleanData( this[c].getElementsByTagName( "*" ) ), this[c].innerHTML = a)
- }
- } catch ( e ) {
- this.empty().append( a )
- }
- } else {
- f.isFunction( a ) ? this.each( function ( b ) {
- var c = f( this );
- c.html( a.call( this, b, c.html() ) )
- } ) : this.empty().append( a );
- }
- return this
- }, replaceWith : function ( a ) {
- if ( this[0] && this[0].parentNode ) {
- if ( f.isFunction( a ) ) {
- return this.each( function ( b ) {
- var c = f( this ), d = c.html();
- c.replaceWith( a.call( this, b, d ) )
- } );
- }
- typeof a != "string" && (a = f( a ).detach());
- return this.each( function () {
- var b = this.nextSibling, c = this.parentNode;
- f( this ).remove(), b ? f( b ).before( a ) : f( c ).append( a )
- } )
- }
- return this.length ? this.pushStack( f( f.isFunction( a ) ? a() : a ), "replaceWith", a ) : this
- }, detach : function ( a ) {
- return this.remove( a, !0 )
- }, domManip : function ( a, c, d ) {
- var e, g, h, i, j = a[0], k = [];
- if ( !f.support.checkClone && arguments.length === 3 && typeof j == "string" && bd.test( j ) ) {
- return this.each( function () {
- f( this ).domManip( a, c, d, !0 )
- } );
- }
- if ( f.isFunction( j ) ) {
- return this.each( function ( e ) {
- var g = f( this );
- a[0] = j.call( this, e, c ? g.html() : b ), g.domManip( a, c, d )
- } );
- }
- if ( this[0] ) {
- i = j && j.parentNode, f.support.parentNode && i && i.nodeType === 11 && i.childNodes.length === this.length ? e = {fragment : i} : e = f.buildFragment( a, this, k ), h = e.fragment, h.childNodes.length === 1 ? g = h = h.firstChild : g = h.firstChild;
- if ( g ) {
- c = c && f.nodeName( g, "tr" );
- for ( var l = 0, m = this.length, n = m - 1; l < m; l++ ) {
- d.call( c ? bi( this[l], g ) : this[l], e.cacheable || m > 1 && l < n ? f.clone( h, !0, !0 ) : h )
- }
- }
- k.length && f.each( k, bp )
- }
- return this
- }} ), f.buildFragment = function ( a, b, d ) {
- var e, g, h, i, j = a[0];
- b && b[0] && (i = b[0].ownerDocument || b[0]), i.createDocumentFragment || (i = c), a.length === 1 && typeof j == "string" && j.length < 512 && i === c && j.charAt( 0 ) === "<" && !bb.test( j ) && (f.support.checkClone || !bd.test( j )) && (f.support.html5Clone || !bc.test( j )) && (g = !0, h = f.fragments[j], h && h !== 1 && (e = h)), e || (e = i.createDocumentFragment(), f.clean( a, i, e, d )), g && (f.fragments[j] = h ? e : 1);
- return{fragment : e, cacheable : g}
- }, f.fragments = {}, f.each( {appendTo : "append", prependTo : "prepend", insertBefore : "before", insertAfter : "after", replaceAll : "replaceWith"}, function ( a, b ) {
- f.fn[a] = function ( c ) {
- var d = [], e = f( c ), g = this.length === 1 && this[0].parentNode;
- if ( g && g.nodeType === 11 && g.childNodes.length === 1 && e.length === 1 ) {
- e[b]( this[0] );
- return this
- }
- for ( var h = 0, i = e.length; h < i; h++ ) {
- var j = (h > 0 ? this.clone( !0 ) : this).get();
- f( e[h] )[b]( j ), d = d.concat( j )
- }
- return this.pushStack( d, a, e.selector )
- }
- } ), f.extend( {clone : function ( a, b, c ) {
- var d, e, g, h = f.support.html5Clone || !bc.test( "<" + a.nodeName ) ? a.cloneNode( !0 ) : bo( a );
- if ( (!f.support.noCloneEvent || !f.support.noCloneChecked) && (a.nodeType === 1 || a.nodeType === 11) && !f.isXMLDoc( a ) ) {
- bk( a, h ), d = bl( a ), e = bl( h );
- for ( g = 0; d[g]; ++g ) {
- e[g] && bk( d[g], e[g] )
- }
- }
- if ( b ) {
- bj( a, h );
- if ( c ) {
- d = bl( a ), e = bl( h );
- for ( g = 0; d[g]; ++g ) {
- bj( d[g], e[g] )
- }
- }
- }
- d = e = null;
- return h
- }, clean : function ( a, b, d, e ) {
- var g;
- b = b || c, typeof b.createElement == "undefined" && (b = b.ownerDocument || b[0] && b[0].ownerDocument || c);
- var h = [], i;
- for ( var j = 0, k; (k = a[j]) != null; j++ ) {
- typeof k == "number" && (k += "");
- if ( !k ) {
- continue;
- }
- if ( typeof k == "string" ) {
- if ( !_.test( k ) ) {
- k = b.createTextNode( k );
- } else {
- k = k.replace( Y, "<$1>$2>" );
- var l = (Z.exec( k ) || ["", ""])[1].toLowerCase(), m = bg[l] || bg._default, n = m[0], o = b.createElement( "div" );
- b === c ? bh.appendChild( o ) : U( b ).appendChild( o ), o.innerHTML = m[1] + k + m[2];
- while ( n-- ) {
- o = o.lastChild;
- }
- if ( !f.support.tbody ) {
- var p = $.test( k ), q = l === "table" && !p ? o.firstChild && o.firstChild.childNodes : m[1] === "
" && !p ? o.childNodes : [];
- for ( i = q.length - 1; i >= 0; --i ) {
- f.nodeName( q[i], "tbody" ) && !q[i].childNodes.length && q[i].parentNode.removeChild( q[i] )
- }
- }
- !f.support.leadingWhitespace && X.test( k ) && o.insertBefore( b.createTextNode( X.exec( k )[0] ), o.firstChild ), k = o.childNodes
- }
- }
- var r;
- if ( !f.support.appendChecked ) {
- if ( k[0] && typeof (r = k.length) == "number" ) {
- for ( i = 0; i < r; i++ ) {
- bn( k[i] );
- }
- } else {
- bn( k );
- }
- }
- k.nodeType ? h.push( k ) : h = f.merge( h, k )
- }
- if ( d ) {
- g = function ( a ) {
- return!a.type || be.test( a.type )
- };
- for ( j = 0; h[j]; j++ ) {
- if ( e && f.nodeName( h[j], "script" ) && (!h[j].type || h[j].type.toLowerCase() === "text/javascript") ) {
- e.push( h[j].parentNode ? h[j].parentNode.removeChild( h[j] ) : h[j] );
- } else {
- if ( h[j].nodeType === 1 ) {
- var s = f.grep( h[j].getElementsByTagName( "script" ), g );
- h.splice.apply( h, [j + 1, 0].concat( s ) )
- }
- d.appendChild( h[j] )
- }
- }
- }
- return h
- }, cleanData : function ( a ) {
- var b, c, d = f.cache, e = f.event.special, g = f.support.deleteExpando;
- for ( var h = 0, i; (i = a[h]) != null; h++ ) {
- if ( i.nodeName && f.noData[i.nodeName.toLowerCase()] ) {
- continue;
- }
- c = i[f.expando];
- if ( c ) {
- b = d[c];
- if ( b && b.events ) {
- for ( var j in b.events ) {
- e[j] ? f.event.remove( i, j ) : f.removeEvent( i, j, b.handle );
- }
- b.handle && (b.handle.elem = null)
- }
- g ? delete i[f.expando] : i.removeAttribute && i.removeAttribute( f.expando ), delete d[c]
- }
- }
- }} );
- var bq = /alpha\([^)]*\)/i, br = /opacity=([^)]*)/, bs = /([A-Z]|^ms)/g, bt = /^-?\d+(?:px)?$/i, bu = /^-?\d/, bv = /^([\-+])=([\-+.\de]+)/, bw = {position : "absolute", visibility : "hidden", display : "block"}, bx = ["Left", "Right"], by = ["Top", "Bottom"], bz, bA, bB;
- f.fn.css = function ( a, c ) {
- if ( arguments.length === 2 && c === b ) {
- return this;
- }
- return f.access( this, a, c, !0, function ( a, c, d ) {
- return d !== b ? f.style( a, c, d ) : f.css( a, c )
- } )
- }, f.extend( {cssHooks : {opacity : {get : function ( a, b ) {
- if ( b ) {
- var c = bz( a, "opacity", "opacity" );
- return c === "" ? "1" : c
- }
- return a.style.opacity
- }}}, cssNumber : {fillOpacity : !0, fontWeight : !0, lineHeight : !0, opacity : !0, orphans : !0, widows : !0, zIndex : !0, zoom : !0}, cssProps : {"float" : f.support.cssFloat ? "cssFloat" : "styleFloat"}, style : function ( a, c, d, e ) {
- if ( !!a && a.nodeType !== 3 && a.nodeType !== 8 && !!a.style ) {
- var g, h, i = f.camelCase( c ), j = a.style, k = f.cssHooks[i];
- c = f.cssProps[i] || i;
- if ( d === b ) {
- if ( k && "get"in k && (g = k.get( a, !1, e )) !== b ) {
- return g;
- }
- return j[c]
- }
- h = typeof d, h === "string" && (g = bv.exec( d )) && (d = +(g[1] + 1) * +g[2] + parseFloat( f.css( a, c ) ), h = "number");
- if ( d == null || h === "number" && isNaN( d ) ) {
- return;
- }
- h === "number" && !f.cssNumber[i] && (d += "px");
- if ( !k || !("set"in k) || (d = k.set( a, d )) !== b ) {
- try {
- j[c] = d
- } catch ( l ) {
- }
- }
- }
- }, css : function ( a, c, d ) {
- var e, g;
- c = f.camelCase( c ), g = f.cssHooks[c], c = f.cssProps[c] || c, c === "cssFloat" && (c = "float");
- if ( g && "get"in g && (e = g.get( a, !0, d )) !== b ) {
- return e;
- }
- if ( bz ) {
- return bz( a, c )
- }
- }, swap : function ( a, b, c ) {
- var d = {};
- for ( var e in b ) {
- d[e] = a.style[e], a.style[e] = b[e];
- }
- c.call( a );
- for ( e in b ) {
- a.style[e] = d[e]
- }
- }} ), f.curCSS = f.css, f.each( ["height", "width"], function ( a, b ) {
- f.cssHooks[b] = {get : function ( a, c, d ) {
- var e;
- if ( c ) {
- if ( a.offsetWidth !== 0 ) {
- return bC( a, b, d );
- }
- f.swap( a, bw, function () {
- e = bC( a, b, d )
- } );
- return e
- }
- }, set : function ( a, b ) {
- if ( !bt.test( b ) ) {
- return b;
- }
- b = parseFloat( b );
- if ( b >= 0 ) {
- return b + "px"
- }
- }}
- } ), f.support.opacity || (f.cssHooks.opacity = {get : function ( a, b ) {
- return br.test( (b && a.currentStyle ? a.currentStyle.filter : a.style.filter) || "" ) ? parseFloat( RegExp.$1 ) / 100 + "" : b ? "1" : ""
- }, set : function ( a, b ) {
- var c = a.style, d = a.currentStyle, e = f.isNumeric( b ) ? "alpha(opacity=" + b * 100 + ")" : "", g = d && d.filter || c.filter || "";
- c.zoom = 1;
- if ( b >= 1 && f.trim( g.replace( bq, "" ) ) === "" ) {
- c.removeAttribute( "filter" );
- if ( d && !d.filter ) {
- return
- }
- }
- c.filter = bq.test( g ) ? g.replace( bq, e ) : g + " " + e
- }}), f( function () {
- f.support.reliableMarginRight || (f.cssHooks.marginRight = {get : function ( a, b ) {
- var c;
- f.swap( a, {display : "inline-block"}, function () {
- b ? c = bz( a, "margin-right", "marginRight" ) : c = a.style.marginRight
- } );
- return c
- }})
- } ), c.defaultView && c.defaultView.getComputedStyle && (bA = function ( a, b ) {
- var c, d, e;
- b = b.replace( bs, "-$1" ).toLowerCase(), (d = a.ownerDocument.defaultView) && (e = d.getComputedStyle( a, null )) && (c = e.getPropertyValue( b ), c === "" && !f.contains( a.ownerDocument.documentElement, a ) && (c = f.style( a, b )));
- return c
- }), c.documentElement.currentStyle && (bB = function ( a, b ) {
- var c, d, e, f = a.currentStyle && a.currentStyle[b], g = a.style;
- f === null && g && (e = g[b]) && (f = e), !bt.test( f ) && bu.test( f ) && (c = g.left, d = a.runtimeStyle && a.runtimeStyle.left, d && (a.runtimeStyle.left = a.currentStyle.left), g.left = b === "fontSize" ? "1em" : f || 0, f = g.pixelLeft + "px", g.left = c, d && (a.runtimeStyle.left = d));
- return f === "" ? "auto" : f
- }), bz = bA || bB, f.expr && f.expr.filters && (f.expr.filters.hidden = function ( a ) {
- var b = a.offsetWidth, c = a.offsetHeight;
- return b === 0 && c === 0 || !f.support.reliableHiddenOffsets && (a.style && a.style.display || f.css( a, "display" )) === "none"
- }, f.expr.filters.visible = function ( a ) {
- return!f.expr.filters.hidden( a )
- });
- var bD = /%20/g, bE = /\[\]$/, bF = /\r?\n/g, bG = /#.*$/, bH = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, bI = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, bJ = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, bK = /^(?:GET|HEAD)$/, bL = /^\/\//, bM = /\?/, bN = /
-
-
-
+
+
+
+
diff --git a/example/standard/js/jquery-1.7.1.js b/example/standard/js/jquery-1.7.1.js
deleted file mode 100644
index ff54c7c..0000000
--- a/example/standard/js/jquery-1.7.1.js
+++ /dev/null
@@ -1,9262 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.7.1
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Mon Nov 21 21:11:03 2011 -0500
- */
-(function ( window, undefined ) {
-
-// Use the correct document accordingly with window argument (sandbox)
- var document = window.document,
- navigator = window.navigator,
- location = window.location;
- var jQuery = (function () {
-
-// Define a local copy of jQuery
- var jQuery = function ( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
- },
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- // A central reference to the root jQuery(document)
- rootjQuery,
-
- // A simple way to check for HTML strings or ID strings
- // Prioritize #id over to avoid XSS via location.hash (#9521)
- quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
- // Check if a string has a non-whitespace character in it
- rnotwhite = /\S/,
-
- // Used for trimming whitespace
- trimLeft = /^\s+/,
- trimRight = /\s+$/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
- // Useragent RegExp
- rwebkit = /(webkit)[ \/]([\w.]+)/,
- ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
- rmsie = /(msie) ([\w.]+)/,
- rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
-
- // Matches dashed string for camelizing
- rdashAlpha = /-([a-z]|[0-9])/ig,
- rmsPrefix = /^-ms-/,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function ( all, letter ) {
- return ( letter + "" ).toUpperCase();
- },
-
- // Keep a UserAgent string for use with jQuery.browser
- userAgent = navigator.userAgent,
-
- // For matching the engine and version of the browser
- browserMatch,
-
- // The deferred used on DOM ready
- readyList,
-
- // The ready event handler
- DOMContentLoaded,
-
- // Save a reference to some core methods
- toString = Object.prototype.toString,
- hasOwn = Object.prototype.hasOwnProperty,
- push = Array.prototype.push,
- slice = Array.prototype.slice,
- trim = String.prototype.trim,
- indexOf = Array.prototype.indexOf,
-
- // [[Class]] -> type pairs
- class2type = {};
-
- jQuery.fn = jQuery.prototype = {
- constructor : jQuery,
- init : function ( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
-
- // Handle $(""), $(null), or $(undefined)
- if ( !selector ) {
- return this;
- }
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
- // The body element only exists once, optimize finding it
- if ( selector === "body" && !context && document.body ) {
- this.context = document;
- this[0] = document.body;
- this.selector = selector;
- this.length = 1;
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- // Are we dealing with HTML string or an ID?
- if ( selector.charAt( 0 ) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = quickExpr.exec( selector );
- }
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
- doc = ( context ? context.ownerDocument || context : document );
-
- // If a single string is passed in and it's a single tag
- // just do a createElement and skip the rest
- ret = rsingleTag.exec( selector );
-
- if ( ret ) {
- if ( jQuery.isPlainObject( context ) ) {
- selector = [ document.createElement( ret[1] ) ];
- jQuery.fn.attr.call( selector, context, true );
-
- } else {
- selector = [ doc.createElement( ret[1] ) ];
- }
-
- } else {
- ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = ( ret.cacheable ? jQuery.clone( ret.fragment ) : ret.fragment ).childNodes;
- }
-
- return jQuery.merge( this, selector );
-
- // HANDLE: $("#id")
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector : "",
-
- // The current version of jQuery being used
- jquery : "1.7.1",
-
- // The default length of a jQuery object is 0
- length : 0,
-
- // The number of elements contained in the matched element set
- size : function () {
- return this.length;
- },
-
- toArray : function () {
- return slice.call( this, 0 );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get : function ( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack : function ( elems, name, selector ) {
- // Build a new jQuery matched element set
- var ret = this.constructor();
-
- if ( jQuery.isArray( elems ) ) {
- push.apply( ret, elems );
-
- } else {
- jQuery.merge( ret, elems );
- }
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" ) {
- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each : function ( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready : function ( fn ) {
- // Attach the listeners
- jQuery.bindReady();
-
- // Add the callback
- readyList.add( fn );
-
- return this;
- },
-
- eq : function ( i ) {
- i = +i;
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, i + 1 );
- },
-
- first : function () {
- return this.eq( 0 );
- },
-
- last : function () {
- return this.eq( -1 );
- },
-
- slice : function () {
- return this.pushStack( slice.apply( this, arguments ),
- "slice", slice.call( arguments ).join( "," ) );
- },
-
- map : function ( callback ) {
- return this.pushStack( jQuery.map( this, function ( elem, i ) {
- return callback.call( elem, i, elem );
- } ) );
- },
-
- end : function () {
- return this.prevObject || this.constructor( null );
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push : push,
- sort : [].sort,
- splice : [].splice
- };
-
-// Give the init function the jQuery prototype for later instantiation
- jQuery.fn.init.prototype = jQuery.fn;
-
- jQuery.extend = jQuery.fn.extend = function () {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject( copy ) || (copyIsArray = jQuery.isArray( copy )) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray( src ) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject( src ) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
- };
-
- jQuery.extend( {
- noConflict : function ( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady : false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait : 1,
-
- // Hold (or release) the ready event
- holdReady : function ( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready : function ( wait ) {
- // Either a released hold or an DOMready/load event and not yet ready
- if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.fireWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger( "ready" ).off( "ready" );
- }
- }
- },
-
- bindReady : function () {
- if ( readyList ) {
- return;
- }
-
- readyList = jQuery.Callbacks( "once memory" );
-
- // Catch cases where $(document).ready() is called after the
- // browser event has already occurred.
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Mozilla, Opera and webkit nightlies currently support this event
- if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
-
- // If IE event model is used
- } else if ( document.attachEvent ) {
- // ensure firing before onload,
- // maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var toplevel = false;
-
- try {
- toplevel = window.frameElement == null;
- } catch ( e ) {
- }
-
- if ( document.documentElement.doScroll && toplevel ) {
- doScrollCheck();
- }
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction : function ( obj ) {
- return jQuery.type( obj ) === "function";
- },
-
- isArray : Array.isArray || function ( obj ) {
- return jQuery.type( obj ) === "array";
- },
-
- // A crude way of determining if an object is a window
- isWindow : function ( obj ) {
- return obj && typeof obj === "object" && "setInterval" in obj;
- },
-
- isNumeric : function ( obj ) {
- return !isNaN( parseFloat( obj ) ) && isFinite( obj );
- },
-
- type : function ( obj ) {
- return obj == null ?
- String( obj ) :
- class2type[ toString.call( obj ) ] || "object";
- },
-
- isPlainObject : function ( obj ) {
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- try {
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !hasOwn.call( obj, "constructor" ) &&
- !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
- return false;
- }
- } catch ( e ) {
- // IE8,9 Will throw exceptions on certain host objects #9897
- return false;
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
-
- var key;
- for ( key in obj ) {
- }
-
- return key === undefined || hasOwn.call( obj, key );
- },
-
- isEmptyObject : function ( obj ) {
- for ( var name in obj ) {
- return false;
- }
- return true;
- },
-
- error : function ( msg ) {
- throw new Error( msg );
- },
-
- parseJSON : function ( data ) {
- if ( typeof data !== "string" || !data ) {
- return null;
- }
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "" ) ) ) {
-
- return ( new Function( "return " + data ) )();
-
- }
- jQuery.error( "Invalid JSON: " + data );
- },
-
- // Cross-browser xml parsing
- parseXML : function ( data ) {
- var xml, tmp;
- try {
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data, "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
- } catch ( e ) {
- xml = undefined;
- }
- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
- },
-
- noop : function () {
- },
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval : function ( data ) {
- if ( data && rnotwhite.test( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function ( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Microsoft forgot to hump their vendor prefix (#9572)
- camelCase : function ( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
- },
-
- nodeName : function ( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
- },
-
- // args is for internal usage only
- each : function ( object, callback, args ) {
- var name, i = 0,
- length = object.length,
- isObj = length === undefined || jQuery.isFunction( object );
-
- if ( args ) {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.apply( object[ name ], args ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.apply( object[ i++ ], args ) === false ) {
- break;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
- break;
- }
- }
- }
- }
-
- return object;
- },
-
- // Use native String.trim function wherever possible
- trim : trim ?
- function ( text ) {
- return text == null ?
- "" :
- trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function ( text ) {
- return text == null ?
- "" :
- text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
- },
-
- // results is for internal usage only
- makeArray : function ( array, results ) {
- var ret = results || [];
-
- if ( array != null ) {
- // The window, strings (and functions) also have 'length'
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- var type = jQuery.type( array );
-
- if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
- push.call( ret, array );
- } else {
- jQuery.merge( ret, array );
- }
- }
-
- return ret;
- },
-
- inArray : function ( elem, array, i ) {
- var len;
-
- if ( array ) {
- if ( indexOf ) {
- return indexOf.call( array, elem, i );
- }
-
- len = array.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
- for ( ; i < len; i++ ) {
- // Skip accessing in sparse arrays
- if ( i in array && array[ i ] === elem ) {
- return i;
- }
- }
- }
-
- return -1;
- },
-
- merge : function ( first, second ) {
- var i = first.length,
- j = 0;
-
- if ( typeof second.length === "number" ) {
- for ( var l = second.length; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep : function ( elems, callback, inv ) {
- var ret = [], retVal;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map : function ( elems, callback, arg ) {
- var value, key, ret = [],
- i = 0,
- length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length - 1 ] ) || length === 0 || jQuery.isArray( elems ) );
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return ret.concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid : 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy : function ( fn, context ) {
- if ( typeof context === "string" ) {
- var tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- var args = slice.call( arguments, 2 ),
- proxy = function () {
- return fn.apply( context, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Mutifunctional method to get and set values to a collection
- // The value/s can optionally be executed if it's a function
- access : function ( elems, key, value, exec, fn, pass ) {
- var length = elems.length;
-
- // Setting many attributes
- if ( typeof key === "object" ) {
- for ( var k in key ) {
- jQuery.access( elems, k, key[k], exec, fn, value );
- }
- return elems;
- }
-
- // Setting one attribute
- if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = !pass && exec && jQuery.isFunction( value );
-
- for ( var i = 0; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
- }
-
- return elems;
- }
-
- // Getting an attribute
- return length ? fn( elems[0], key ) : undefined;
- },
-
- now : function () {
- return ( new Date() ).getTime();
- },
-
- // Use of jQuery.browser is frowned upon.
- // More details: http://docs.jquery.com/Utilities/jQuery.browser
- uaMatch : function ( ua ) {
- ua = ua.toLowerCase();
-
- var match = rwebkit.exec( ua ) ||
- ropera.exec( ua ) ||
- rmsie.exec( ua ) ||
- ua.indexOf( "compatible" ) < 0 && rmozilla.exec( ua ) ||
- [];
-
- return { browser : match[1] || "", version : match[2] || "0" };
- },
-
- sub : function () {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
-
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub( document );
- return jQuerySub;
- },
-
- browser : {}
- } );
-
-// Populate the class2type map
- jQuery.each( "Boolean Number String Function Array Date RegExp Object".split( " " ), function ( i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
- } );
-
- browserMatch = jQuery.uaMatch( userAgent );
- if ( browserMatch.browser ) {
- jQuery.browser[ browserMatch.browser ] = true;
- jQuery.browser.version = browserMatch.version;
- }
-
-// Deprecated, use jQuery.browser.webkit instead
- if ( jQuery.browser.webkit ) {
- jQuery.browser.safari = true;
- }
-
-// IE doesn't match non-breaking spaces with \s
- if ( rnotwhite.test( "\xA0" ) ) {
- trimLeft = /^[\s\xA0]+/;
- trimRight = /[\s\xA0]+$/;
- }
-
-// All jQuery objects should point back to these
- rootjQuery = jQuery( document );
-
-// Cleanup functions for the document ready method
- if ( document.addEventListener ) {
- DOMContentLoaded = function () {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- };
-
- } else if ( document.attachEvent ) {
- DOMContentLoaded = function () {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( document.readyState === "complete" ) {
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
- jQuery.ready();
- }
- };
- }
-
-// The DOM ready check for Internet Explorer
- function doScrollCheck() {
- if ( jQuery.isReady ) {
- return;
- }
-
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll( "left" );
- } catch ( e ) {
- setTimeout( doScrollCheck, 1 );
- return;
- }
-
- // and execute any waiting functions
- jQuery.ready();
- }
-
- return jQuery;
-
- })();
-
-
-// String to Object flags format cache
- var flagsCache = {};
-
-// Convert String-formatted flags into Object-formatted ones and store in cache
- function createFlags( flags ) {
- var object = flagsCache[ flags ] = {},
- i, length;
- flags = flags.split( /\s+/ );
- for ( i = 0, length = flags.length; i < length; i++ ) {
- object[ flags[i] ] = true;
- }
- return object;
- }
-
- /*
- * Create a callback list using the following parameters:
- *
- * flags: an optional list of space-separated flags that will change how
- * the callback list behaves
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible flags:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
- jQuery.Callbacks = function ( flags ) {
-
- // Convert flags from String-formatted to Object-formatted
- // (we check in cache first)
- flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
-
- var // Actual callback list
- list = [],
- // Stack of fire calls for repeatable lists
- stack = [],
- // Last fire value (for non-forgettable lists)
- memory,
- // Flag to know if list is currently firing
- firing,
- // First callback to fire (used internally by add and fireWith)
- firingStart,
- // End of the loop when firing
- firingLength,
- // Index of currently firing callback (modified by remove if needed)
- firingIndex,
- // Add one or several callbacks to the list
- add = function ( args ) {
- var i,
- length,
- elem,
- type,
- actual;
- for ( i = 0, length = args.length; i < length; i++ ) {
- elem = args[ i ];
- type = jQuery.type( elem );
- if ( type === "array" ) {
- // Inspect recursively
- add( elem );
- } else if ( type === "function" ) {
- // Add if not in unique mode and callback is not in
- if ( !flags.unique || !self.has( elem ) ) {
- list.push( elem );
- }
- }
- }
- },
- // Fire callbacks
- fire = function ( context, args ) {
- args = args || [];
- memory = !flags.memory || [ context, args ];
- firing = true;
- firingIndex = firingStart || 0;
- firingStart = 0;
- firingLength = list.length;
- for ( ; list && firingIndex < firingLength; firingIndex++ ) {
- if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
- memory = true; // Mark as halted
- break;
- }
- }
- firing = false;
- if ( list ) {
- if ( !flags.once ) {
- if ( stack && stack.length ) {
- memory = stack.shift();
- self.fireWith( memory[ 0 ], memory[ 1 ] );
- }
- } else if ( memory === true ) {
- self.disable();
- } else {
- list = [];
- }
- }
- },
- // Actual Callbacks object
- self = {
- // Add a callback or a collection of callbacks to the list
- add : function () {
- if ( list ) {
- var length = list.length;
- add( arguments );
- // Do we need to add the callbacks to the
- // current firing batch?
- if ( firing ) {
- firingLength = list.length;
- // With memory, if we're not firing then
- // we should call right away, unless previous
- // firing was halted (stopOnFalse)
- } else if ( memory && memory !== true ) {
- firingStart = length;
- fire( memory[ 0 ], memory[ 1 ] );
- }
- }
- return this;
- },
- // Remove a callback from the list
- remove : function () {
- if ( list ) {
- var args = arguments,
- argIndex = 0,
- argLength = args.length;
- for ( ; argIndex < argLength; argIndex++ ) {
- for ( var i = 0; i < list.length; i++ ) {
- if ( args[ argIndex ] === list[ i ] ) {
- // Handle firingIndex and firingLength
- if ( firing ) {
- if ( i <= firingLength ) {
- firingLength--;
- if ( i <= firingIndex ) {
- firingIndex--;
- }
- }
- }
- // Remove the element
- list.splice( i--, 1 );
- // If we have some unicity property then
- // we only need to do this once
- if ( flags.unique ) {
- break;
- }
- }
- }
- }
- }
- return this;
- },
- // Control if a given callback is in the list
- has : function ( fn ) {
- if ( list ) {
- var i = 0,
- length = list.length;
- for ( ; i < length; i++ ) {
- if ( fn === list[ i ] ) {
- return true;
- }
- }
- }
- return false;
- },
- // Remove all callbacks from the list
- empty : function () {
- list = [];
- return this;
- },
- // Have the list do nothing anymore
- disable : function () {
- list = stack = memory = undefined;
- return this;
- },
- // Is it disabled?
- disabled : function () {
- return !list;
- },
- // Lock the list in its current state
- lock : function () {
- stack = undefined;
- if ( !memory || memory === true ) {
- self.disable();
- }
- return this;
- },
- // Is it locked?
- locked : function () {
- return !stack;
- },
- // Call all callbacks with the given context and arguments
- fireWith : function ( context, args ) {
- if ( stack ) {
- if ( firing ) {
- if ( !flags.once ) {
- stack.push( [ context, args ] );
- }
- } else if ( !( flags.once && memory ) ) {
- fire( context, args );
- }
- }
- return this;
- },
- // Call all the callbacks with the given arguments
- fire : function () {
- self.fireWith( this, arguments );
- return this;
- },
- // To know if the callbacks have already been called at least once
- fired : function () {
- return !!memory;
- }
- };
-
- return self;
- };
-
-
- var // Static reference to slice
- sliceDeferred = [].slice;
-
- jQuery.extend( {
-
- Deferred : function ( func ) {
- var doneList = jQuery.Callbacks( "once memory" ),
- failList = jQuery.Callbacks( "once memory" ),
- progressList = jQuery.Callbacks( "memory" ),
- state = "pending",
- lists = {
- resolve : doneList,
- reject : failList,
- notify : progressList
- },
- promise = {
- done : doneList.add,
- fail : failList.add,
- progress : progressList.add,
-
- state : function () {
- return state;
- },
-
- // Deprecated
- isResolved : doneList.fired,
- isRejected : failList.fired,
-
- then : function ( doneCallbacks, failCallbacks, progressCallbacks ) {
- deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
- return this;
- },
- always : function () {
- deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
- return this;
- },
- pipe : function ( fnDone, fnFail, fnProgress ) {
- return jQuery.Deferred(
- function ( newDefer ) {
- jQuery.each( {
- done : [ fnDone, "resolve" ],
- fail : [ fnFail, "reject" ],
- progress : [ fnProgress, "notify" ]
- }, function ( handler, data ) {
- var fn = data[ 0 ],
- action = data[ 1 ],
- returned;
- if ( jQuery.isFunction( fn ) ) {
- deferred[ handler ]( function () {
- returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
- } else {
- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
- }
- } );
- } else {
- deferred[ handler ]( newDefer[ action ] );
- }
- } );
- } ).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise : function ( obj ) {
- if ( obj == null ) {
- obj = promise;
- } else {
- for ( var key in promise ) {
- obj[ key ] = promise[ key ];
- }
- }
- return obj;
- }
- },
- deferred = promise.promise( {} ),
- key;
-
- for ( key in lists ) {
- deferred[ key ] = lists[ key ].fire;
- deferred[ key + "With" ] = lists[ key ].fireWith;
- }
-
- // Handle state
- deferred.done(
- function () {
- state = "resolved";
- }, failList.disable, progressList.lock ).fail( function () {
- state = "rejected";
- }, doneList.disable, progressList.lock );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when : function ( firstParam ) {
- var args = sliceDeferred.call( arguments, 0 ),
- i = 0,
- length = args.length,
- pValues = new Array( length ),
- count = length,
- pCount = length,
- deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
- firstParam :
- jQuery.Deferred(),
- promise = deferred.promise();
-
- function resolveFunc( i ) {
- return function ( value ) {
- args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- if ( !( --count ) ) {
- deferred.resolveWith( deferred, args );
- }
- };
- }
-
- function progressFunc( i ) {
- return function ( value ) {
- pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- deferred.notifyWith( promise, pValues );
- };
- }
-
- if ( length > 1 ) {
- for ( ; i < length; i++ ) {
- if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
- args[ i ].promise().then( resolveFunc( i ), deferred.reject, progressFunc( i ) );
- } else {
- --count;
- }
- }
- if ( !count ) {
- deferred.resolveWith( deferred, args );
- }
- } else if ( deferred !== firstParam ) {
- deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
- }
- return promise;
- }
- } );
-
-
- jQuery.support = (function () {
-
- var support,
- all,
- a,
- select,
- opt,
- input,
- marginDiv,
- fragment,
- tds,
- events,
- eventName,
- i,
- isSupported,
- div = document.createElement( "div" ),
- documentElement = document.documentElement;
-
- // Preliminary tests
- div.setAttribute( "className", "t" );
- div.innerHTML = "
a";
-
- all = div.getElementsByTagName( "*" );
- a = div.getElementsByTagName( "a" )[ 0 ];
-
- // Can't get basic test support
- if ( !all || !all.length || !a ) {
- return {};
- }
-
- // First batch of supports tests
- select = document.createElement( "select" );
- opt = select.appendChild( document.createElement( "option" ) );
- input = div.getElementsByTagName( "input" )[ 0 ];
-
- support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace : ( div.firstChild.nodeType === 3 ),
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody : !div.getElementsByTagName( "tbody" ).length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize : !!div.getElementsByTagName( "link" ).length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- style : /top/.test( a.getAttribute( "style" ) ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized : ( a.getAttribute( "href" ) === "/a" ),
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- opacity : /^0.55/.test( a.style.opacity ),
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat : !!a.style.cssFloat,
-
- // Make sure that if no value is specified for a checkbox
- // that it defaults to "on".
- // (WebKit defaults to "" instead)
- checkOn : ( input.value === "on" ),
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- optSelected : opt.selected,
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- getSetAttribute : div.className !== "t",
-
- // Tests for enctype support on a form(#6743)
- enctype : !!document.createElement( "form" ).enctype,
-
- // Makes sure cloning an html5 element does not cause problems
- // Where outerHTML is undefined, this still works
- html5Clone : document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>",
-
- // Will be defined later
- submitBubbles : true,
- changeBubbles : true,
- focusinBubbles : false,
- deleteExpando : true,
- noCloneEvent : true,
- inlineBlockNeedsLayout : false,
- shrinkWrapBlocks : false,
- reliableMarginRight : true
- };
-
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Test to see if it's possible to delete an expando from an element
- // Fails in Internet Explorer
- try {
- delete div.test;
- } catch ( e ) {
- support.deleteExpando = false;
- }
-
- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
- div.attachEvent( "onclick", function () {
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- support.noCloneEvent = false;
- } );
- div.cloneNode( true ).fireEvent( "onclick" );
- }
-
- // Check if a radio maintains its value
- // after being appended to the DOM
- input = document.createElement( "input" );
- input.value = "t";
- input.setAttribute( "type", "radio" );
- support.radioValue = input.value === "t";
-
- input.setAttribute( "checked", "checked" );
- div.appendChild( input );
- fragment = document.createDocumentFragment();
- fragment.appendChild( div.lastChild );
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
-
- fragment.removeChild( input );
- fragment.appendChild( div );
-
- div.innerHTML = "";
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. For more
- // info see bug #3333
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- if ( window.getComputedStyle ) {
- marginDiv = document.createElement( "div" );
- marginDiv.style.width = "0";
- marginDiv.style.marginRight = "0";
- div.style.width = "2px";
- div.appendChild( marginDiv );
- support.reliableMarginRight =
- ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight : 0 } ).marginRight, 10 ) || 0 ) === 0;
- }
-
- // Technique from Juriy Zaytsev
- // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
- // We only care about the case where non-standard event systems
- // are used, namely in IE. Short-circuiting here helps us to
- // avoid an eval call (in setAttribute) which can cause CSP
- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
- if ( div.attachEvent ) {
- for ( i in {
- submit : 1,
- change : 1,
- focusin : 1
- } ) {
- eventName = "on" + i;
- isSupported = ( eventName in div );
- if ( !isSupported ) {
- div.setAttribute( eventName, "return;" );
- isSupported = ( typeof div[ eventName ] === "function" );
- }
- support[ i + "Bubbles" ] = isSupported;
- }
- }
-
- fragment.removeChild( div );
-
- // Null elements to avoid leaks in IE
- fragment = select = opt = marginDiv = div = input = null;
-
- // Run tests that need a body at doc ready
- jQuery( function () {
- var container, outer, inner, table, td, offsetSupport,
- conMarginTop, ptlm, vb, style, html,
- body = document.getElementsByTagName( "body" )[0];
-
- if ( !body ) {
- // Return for frameset docs that don't have a body
- return;
- }
-
- conMarginTop = 1;
- ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
- vb = "visibility:hidden;border:0;";
- style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
- html = "
" +
- "
" +
- "
";
-
- container = document.createElement( "div" );
- container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
- body.insertBefore( container, body.firstChild );
-
- // Construct the test element
- div = document.createElement( "div" );
- container.appendChild( div );
-
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
- div.innerHTML = "
t
";
- tds = div.getElementsByTagName( "td" );
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Check if empty table cells still have offsetWidth/Height
- // (IE <= 8 fail this test)
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
- // Figure out if the W3C box model works as expected
- div.innerHTML = "";
- div.style.width = div.style.paddingLeft = "1px";
- jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
-
- if ( typeof div.style.zoom !== "undefined" ) {
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- // (IE < 8 does this)
- div.style.display = "inline";
- div.style.zoom = 1;
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "";
- div.innerHTML = "";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
- }
-
- div.style.cssText = ptlm + vb;
- div.innerHTML = html;
-
- outer = div.firstChild;
- inner = outer.firstChild;
- td = outer.nextSibling.firstChild.firstChild;
-
- offsetSupport = {
- doesNotAddBorder : ( inner.offsetTop !== 5 ),
- doesAddBorderForTableAndCells : ( td.offsetTop === 5 )
- };
-
- inner.style.position = "fixed";
- inner.style.top = "20px";
-
- // safari subtracts parent border width here which is 5px
- offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
- inner.style.position = inner.style.top = "";
-
- outer.style.overflow = "hidden";
- outer.style.position = "relative";
-
- offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
- offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
-
- body.removeChild( container );
- div = container = null;
-
- jQuery.extend( support, offsetSupport );
- } );
-
- return support;
- })();
-
-
- var rbrace = /^(?:\{.*\}|\[.*\])$/,
- rmultiDash = /([A-Z])/g;
-
- jQuery.extend( {
- cache : {},
-
- // Please use with caution
- uuid : 0,
-
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando : "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData : {
- "embed" : true,
- // Ban all objects except for Flash (which handle expandos)
- "object" : "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
- "applet" : true
- },
-
- hasData : function ( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data : function ( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var privateCache, thisCache, ret,
- internalKey = jQuery.expando,
- getByName = typeof name === "string",
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
- isEvents = name === "events";
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
- return;
- }
-
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- elem[ internalKey ] = id = ++jQuery.uuid;
- } else {
- id = internalKey;
- }
- }
-
- if ( !cache[ id ] ) {
- cache[ id ] = {};
-
- // Avoids exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
- } else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
- }
- }
-
- privateCache = thisCache = cache[ id ];
-
- // jQuery data() is stored in a separate object inside the object's internal data
- // cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
- }
-
- thisCache = thisCache.data;
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // Users should not attempt to inspect the internal events object using jQuery.data,
- // it is undocumented and subject to change. But does anyone listen? No.
- if ( isEvents && !thisCache[ name ] ) {
- return privateCache.events;
- }
-
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( getByName ) {
-
- // First Try to find as-is property data
- ret = thisCache[ name ];
-
- // Test for null|undefined property data
- if ( ret == null ) {
-
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
- }
- } else {
- ret = thisCache;
- }
-
- return ret;
- },
-
- removeData : function ( elem, name, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, i, l,
-
- // Reference to internal data cache key
- internalKey = jQuery.expando,
-
- isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
-
- // See jQuery.data for more information
- id = isNode ? elem[ internalKey ] : internalKey;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
-
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
- if ( thisCache ) {
-
- // Support array or space separated string names for data keys
- if ( !jQuery.isArray( name ) ) {
-
- // try the string as a key before any manipulation
- if ( name in thisCache ) {
- name = [ name ];
- } else {
-
- // split the camel cased version by spaces unless a key with the spaces exists
- name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split( " " );
- }
- }
- }
-
- for ( i = 0, l = name.length; i < l; i++ ) {
- delete thisCache[ name[i] ];
- }
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject( cache[ id ] ) ) {
- return;
- }
- }
-
- // Browsers that fail expando deletion also refuse to delete expandos on
- // the window, but it will allow it on all other JS objects; other browsers
- // don't care
- // Ensure that `cache` is not a window object #10080
- if ( jQuery.support.deleteExpando || !cache.setInterval ) {
- delete cache[ id ];
- } else {
- cache[ id ] = null;
- }
-
- // We destroyed the cache and need to eliminate the expando on the node to avoid
- // false lookups in the cache for entries that no longer exist
- if ( isNode ) {
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( jQuery.support.deleteExpando ) {
- delete elem[ internalKey ];
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( internalKey );
- } else {
- elem[ internalKey ] = null;
- }
- }
- },
-
- // For internal use only.
- _data : function ( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData : function ( elem ) {
- if ( elem.nodeName ) {
- var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- if ( match ) {
- return !(match === true || elem.getAttribute( "classid" ) !== match);
- }
- }
-
- return true;
- }
- } );
-
- jQuery.fn.extend( {
- data : function ( key, value ) {
- var parts, attr, name,
- data = null;
-
- if ( typeof key === "undefined" ) {
- if ( this.length ) {
- data = jQuery.data( this[0] );
-
- if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
- attr = this[0].attributes;
- for ( var i = 0, l = attr.length; i < l; i++ ) {
- name = attr[i].name;
-
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.substring( 5 ) );
-
- dataAttr( this[0], name, data[ name ] );
- }
- }
- jQuery._data( this[0], "parsedAttrs", true );
- }
- }
-
- return data;
-
- } else if ( typeof key === "object" ) {
- return this.each( function () {
- jQuery.data( this, key );
- } );
- }
-
- parts = key.split( "." );
- parts[1] = parts[1] ? "." + parts[1] : "";
-
- if ( value === undefined ) {
- data = this.triggerHandler( "getData" + parts[1] + "!", [parts[0]] );
-
- // Try to fetch any internally stored data first
- if ( data === undefined && this.length ) {
- data = jQuery.data( this[0], key );
- data = dataAttr( this[0], key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
-
- } else {
- return this.each( function () {
- var self = jQuery( this ),
- args = [ parts[0], value ];
-
- self.triggerHandler( "setData" + parts[1] + "!", args );
- jQuery.data( this, key, value );
- self.triggerHandler( "changeData" + parts[1] + "!", args );
- } );
- }
- },
-
- removeData : function ( key ) {
- return this.each( function () {
- jQuery.removeData( this, key );
- } );
- }
- } );
-
- function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
-
- var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- jQuery.isNumeric( data ) ? parseFloat( data ) :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch ( e ) {
- }
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
- }
-
-// checks a cache object for emptiness
- function isEmptyDataObject( obj ) {
- for ( var name in obj ) {
-
- // if the public data object is empty, the private is still empty
- if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
- continue;
- }
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
- }
-
-
- function handleQueueMarkDefer( elem, type, src ) {
- var deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- defer = jQuery._data( elem, deferDataKey );
- if ( defer &&
- ( src === "queue" || !jQuery._data( elem, queueDataKey ) ) &&
- ( src === "mark" || !jQuery._data( elem, markDataKey ) ) ) {
- // Give room for hard-coded callbacks to fire first
- // and eventually mark/queue something else on the element
- setTimeout( function () {
- if ( !jQuery._data( elem, queueDataKey ) &&
- !jQuery._data( elem, markDataKey ) ) {
- jQuery.removeData( elem, deferDataKey, true );
- defer.fire();
- }
- }, 0 );
- }
- }
-
- jQuery.extend( {
-
- _mark : function ( elem, type ) {
- if ( elem ) {
- type = ( type || "fx" ) + "mark";
- jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
- }
- },
-
- _unmark : function ( force, elem, type ) {
- if ( force !== true ) {
- type = elem;
- elem = force;
- force = false;
- }
- if ( elem ) {
- type = type || "fx";
- var key = type + "mark",
- count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
- if ( count ) {
- jQuery._data( elem, key, count );
- } else {
- jQuery.removeData( elem, key, true );
- handleQueueMarkDefer( elem, type, "mark" );
- }
- }
- },
-
- queue : function ( elem, type, data ) {
- var q;
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- q = jQuery._data( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !q || jQuery.isArray( data ) ) {
- q = jQuery._data( elem, type, jQuery.makeArray( data ) );
- } else {
- q.push( data );
- }
- }
- return q || [];
- }
- },
-
- dequeue : function ( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- fn = queue.shift(),
- hooks = {};
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- }
-
- if ( fn ) {
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- jQuery._data( elem, type + ".run", hooks );
- fn.call( elem, function () {
- jQuery.dequeue( elem, type );
- }, hooks );
- }
-
- if ( !queue.length ) {
- jQuery.removeData( elem, type + "queue " + type + ".run", true );
- handleQueueMarkDefer( elem, type, "queue" );
- }
- }
- } );
-
- jQuery.fn.extend( {
- queue : function ( type, data ) {
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- }
-
- if ( data === undefined ) {
- return jQuery.queue( this[0], type );
- }
- return this.each( function () {
- var queue = jQuery.queue( this, type, data );
-
- if ( type === "fx" && queue[0] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- } );
- },
- dequeue : function ( type ) {
- return this.each( function () {
- jQuery.dequeue( this, type );
- } );
- },
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay : function ( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function ( next, hooks ) {
- var timeout = setTimeout( next, time );
- hooks.stop = function () {
- clearTimeout( timeout );
- };
- } );
- },
- clearQueue : function ( type ) {
- return this.queue( type || "fx", [] );
- },
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise : function ( type, object ) {
- if ( typeof type !== "string" ) {
- object = type;
- type = undefined;
- }
- type = type || "fx";
- var defer = jQuery.Deferred(),
- elements = this,
- i = elements.length,
- count = 1,
- deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- tmp;
-
- function resolve() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- }
-
- while ( i-- ) {
- if ( ( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
- ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
- jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
- jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) ) ) {
- count++;
- tmp.add( resolve );
- }
- }
- resolve();
- return defer.promise();
- }
- } );
-
-
- var rclass = /[\n\t\r]/g,
- rspace = /\s+/,
- rreturn = /\r/g,
- rtype = /^(?:button|input)$/i,
- rfocusable = /^(?:button|input|object|select|textarea)$/i,
- rclickable = /^a(?:rea)?$/i,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- getSetAttribute = jQuery.support.getSetAttribute,
- nodeHook, boolHook, fixSpecified;
-
- jQuery.fn.extend( {
- attr : function ( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.attr );
- },
-
- removeAttr : function ( name ) {
- return this.each( function () {
- jQuery.removeAttr( this, name );
- } );
- },
-
- prop : function ( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.prop );
- },
-
- removeProp : function ( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each( function () {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch ( e ) {
- }
- } );
- },
-
- addClass : function ( value ) {
- var classNames, i, l, elem,
- setClass, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function ( j ) {
- jQuery( this ).addClass( value.call( this, j, this.className ) );
- } );
- }
-
- if ( value && typeof value === "string" ) {
- classNames = value.split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 ) {
- if ( !elem.className && classNames.length === 1 ) {
- elem.className = value;
-
- } else {
- setClass = " " + elem.className + " ";
-
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
- setClass += classNames[ c ] + " ";
- }
- }
- elem.className = jQuery.trim( setClass );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass : function ( value ) {
- var classNames, i, l, elem, className, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function ( j ) {
- jQuery( this ).removeClass( value.call( this, j, this.className ) );
- } );
- }
-
- if ( (value && typeof value === "string") || value === undefined ) {
- classNames = ( value || "" ).split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 && elem.className ) {
- if ( value ) {
- className = (" " + elem.className + " ").replace( rclass, " " );
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- className = className.replace( " " + classNames[ c ] + " ", " " );
- }
- elem.className = jQuery.trim( className );
-
- } else {
- elem.className = "";
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass : function ( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function ( i ) {
- jQuery( this ).toggleClass( value.call( this, i, this.className, stateVal ), stateVal );
- } );
- }
-
- return this.each( function () {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- state = stateVal,
- classNames = value.split( rspace );
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space seperated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
- }
-
- } else if ( type === "undefined" || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // toggle whole className
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- } );
- },
-
- hasClass : function ( selector ) {
- var className = " " + selector + " ",
- i = 0,
- l = this.length;
- for ( ; i < l; i++ ) {
- if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace( rclass, " " ).indexOf( className ) > -1 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val : function ( value ) {
- var hooks, ret, isFunction,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
- // handle most common string cases
- ret.replace( rreturn, "" ) :
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return;
- }
-
- isFunction = jQuery.isFunction( value );
-
- return this.each( function ( i ) {
- var self = jQuery( this ), val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, self.val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map( val, function ( value ) {
- return value == null ? "" : value + "";
- } );
- }
-
- hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- } );
- }
- } );
-
- jQuery.extend( {
- valHooks : {
- option : {
- get : function ( elem ) {
- // attributes.value is undefined in Blackberry 4.7 but
- // uses .value. See #6932
- var val = elem.attributes.value;
- return !val || val.specified ? elem.value : elem.text;
- }
- },
- select : {
- get : function ( elem ) {
- var value, i, max, option,
- index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type === "select-one";
-
- // Nothing was selected
- if ( index < 0 ) {
- return null;
- }
-
- // Loop through all the selected options
- i = one ? index : 0;
- max = one ? index + 1 : options.length;
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // Don't return options that are disabled or in a disabled optgroup
- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null) &&
- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
-
- return values;
- },
-
- set : function ( elem, value ) {
- var values = jQuery.makeArray( value );
-
- jQuery( elem ).find( "option" ).each( function () {
- this.selected = jQuery.inArray( jQuery( this ).val(), values ) >= 0;
- } );
-
- if ( !values.length ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- attrFn : {
- val : true,
- css : true,
- html : true,
- text : true,
- data : true,
- width : true,
- height : true,
- offset : true
- },
-
- attr : function ( elem, name, value, pass ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- if ( pass && name in jQuery.attrFn ) {
- return jQuery( elem )[ name ]( value );
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- return jQuery.prop( elem, name, value );
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- // All attributes are lowercase
- // Grab necessary hook if one is defined
- if ( notxml ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
-
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, "" + value );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
-
- ret = elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret === null ?
- undefined :
- ret;
- }
- },
-
- removeAttr : function ( elem, value ) {
- var propName, attrNames, name, l,
- i = 0;
-
- if ( value && elem.nodeType === 1 ) {
- attrNames = value.toLowerCase().split( rspace );
- l = attrNames.length;
-
- for ( ; i < l; i++ ) {
- name = attrNames[ i ];
-
- if ( name ) {
- propName = jQuery.propFix[ name ] || name;
-
- // See #9699 for explanation of this approach (setting first, then removal)
- jQuery.attr( elem, name, "" );
- elem.removeAttribute( getSetAttribute ? name : propName );
-
- // Set corresponding property to false for boolean attributes
- if ( rboolean.test( name ) && propName in elem ) {
- elem[ propName ] = false;
- }
- }
- }
- }
- },
-
- attrHooks : {
- type : {
- set : function ( elem, value ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
- jQuery.error( "type property can't be changed" );
- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName( elem, "input" ) ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to it's default in case type is set after value
- // This is for element creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- },
- // Use the value property for back compat
- // Use the nodeHook for button elements in IE6/7 (#1954)
- value : {
- get : function ( elem, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.get( elem, name );
- }
- return name in elem ?
- elem.value :
- null;
- },
- set : function ( elem, value, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.set( elem, value, name );
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
- }
- },
-
- propFix : {
- tabindex : "tabIndex",
- readonly : "readOnly",
- "for" : "htmlFor",
- "class" : "className",
- maxlength : "maxLength",
- cellspacing : "cellSpacing",
- cellpadding : "cellPadding",
- rowspan : "rowSpan",
- colspan : "colSpan",
- usemap : "useMap",
- frameborder : "frameBorder",
- contenteditable : "contentEditable"
- },
-
- prop : function ( elem, name, value ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- return ( elem[ name ] = value );
- }
-
- } else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- return elem[ name ];
- }
- }
- },
-
- propHooks : {
- tabIndex : {
- get : function ( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- var attributeNode = elem.getAttributeNode( "tabindex" );
-
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- undefined;
- }
- }
- }
- } );
-
-// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
- jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
-
-// Hook for boolean attributes
- boolHook = {
- get : function ( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
- name.toLowerCase() :
- undefined;
- },
- set : function ( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
- };
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
- if ( !getSetAttribute ) {
-
- fixSpecified = {
- name : true,
- id : true
- };
-
- // Use this for any attribute in IE6/7
- // This fixes almost every IE6/7 issue
- nodeHook = jQuery.valHooks.button = {
- get : function ( elem, name ) {
- var ret;
- ret = elem.getAttributeNode( name );
- return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
- ret.nodeValue :
- undefined;
- },
- set : function ( elem, value, name ) {
- // Set the existing or create a new attribute node
- var ret = elem.getAttributeNode( name );
- if ( !ret ) {
- ret = document.createAttribute( name );
- elem.setAttributeNode( ret );
- }
- return ( ret.nodeValue = value + "" );
- }
- };
-
- // Apply the nodeHook to tabindex
- jQuery.attrHooks.tabindex.set = nodeHook.set;
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each( [ "width", "height" ], function ( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- set : function ( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- } );
- } );
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- get : nodeHook.get,
- set : function ( elem, value, name ) {
- if ( value === "" ) {
- value = "false";
- }
- nodeHook.set( elem, value, name );
- }
- };
- }
-
-
-// Some attributes require a special call on IE
- if ( !jQuery.support.hrefNormalized ) {
- jQuery.each( [ "href", "src", "width", "height" ], function ( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- get : function ( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
- }
- } );
- } );
- }
-
- if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get : function ( elem ) {
- // Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
- },
- set : function ( elem, value ) {
- return ( elem.style.cssText = "" + value );
- }
- };
- }
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
- if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
- get : function ( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- }
- } );
- }
-
-// IE6/7 call enctype encoding
- if ( !jQuery.support.enctype ) {
- jQuery.propFix.enctype = "encoding";
- }
-
-// Radios and checkboxes getter/setter
- if ( !jQuery.support.checkOn ) {
- jQuery.each( [ "radio", "checkbox" ], function () {
- jQuery.valHooks[ this ] = {
- get : function ( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute( "value" ) === null ? "on" : elem.value;
- }
- };
- } );
- }
- jQuery.each( [ "radio", "checkbox" ], function () {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
- set : function ( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) >= 0 );
- }
- }
- } );
- } );
-
-
- var rformElems = /^(?:textarea|input|select)$/i,
- rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
- rhoverHack = /\bhover(\.\S+)?\b/,
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|contextmenu)|click/,
- rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
- rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
- quickParse = function ( selector ) {
- var quick = rquickIs.exec( selector );
- if ( quick ) {
- // 0 1 2 3
- // [ _, tag, id, class ]
- quick[1] = ( quick[1] || "" ).toLowerCase();
- quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
- }
- return quick;
- },
- quickIs = function ( elem, m ) {
- var attrs = elem.attributes || {};
- return (
- (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
- (!m[2] || (attrs.id || {}).value === m[2]) &&
- (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
- );
- },
- hoverHack = function ( events ) {
- return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
- };
-
- /*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
- jQuery.event = {
-
- add : function ( elem, types, handler, data, selector ) {
-
- var elemData, eventHandle, events,
- t, tns, type, namespaces, handleObj,
- handleObjIn, quick, handlers, special;
-
- // Don't attach events to noData or text/comment nodes (allow plain objects tho)
- if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- events = elemData.events;
- if ( !events ) {
- elemData.events = events = {};
- }
- eventHandle = elemData.handle;
- if ( !eventHandle ) {
- elemData.handle = eventHandle = function ( e ) {
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
- undefined;
- };
- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
- eventHandle.elem = elem;
- }
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- types = jQuery.trim( hoverHack( types ) ).split( " " );
- for ( t = 0; t < types.length; t++ ) {
-
- tns = rtypenamespace.exec( types[t] ) || [];
- type = tns[1];
- namespaces = ( tns[2] || "" ).split( "." ).sort();
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend( {
- type : type,
- origType : tns[1],
- data : data,
- handler : handler,
- guid : handler.guid,
- selector : selector,
- quick : quickParse( selector ),
- namespace : namespaces.join( "." )
- }, handleObjIn );
-
- // Init the event handler queue if we're the first
- handlers = events[ type ];
- if ( !handlers ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener/attachEvent if the special events handler returns false
- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- global : {},
-
- // Detach an event or set of events from an element
- remove : function ( elem, types, handler, selector, mappedTypes ) {
-
- var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
- t, tns, type, origType, namespaces, origCount,
- j, events, special, handle, eventType, handleObj;
-
- if ( !elemData || !(events = elemData.events) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = jQuery.trim( hoverHack( types || "" ) ).split( " " );
- for ( t = 0; t < types.length; t++ ) {
- tns = rtypenamespace.exec( types[t] ) || [];
- type = origType = tns[1];
- namespaces = tns[2];
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- for ( type in events ) {
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
- }
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector ? special.delegateType : special.bindType ) || type;
- eventType = events[ type ] || [];
- origCount = eventType.length;
- namespaces = namespaces ? new RegExp( "(^|\\.)" + namespaces.split( "." ).sort().join( "\\.(?:.*\\.)?" ) + "(\\.|$)" ) : null;
-
- // Remove matching events
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
- eventType.splice( j--, 1 );
-
- if ( handleObj.selector ) {
- eventType.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( eventType.length === 0 && origCount !== eventType.length ) {
- if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- handle = elemData.handle;
- if ( handle ) {
- handle.elem = null;
- }
-
- // removeData also checks for emptiness and clears the expando if empty
- // so use it instead of delete
- jQuery.removeData( elem, [ "events", "handle" ], true );
- }
- },
-
- // Events that are safe to short-circuit if no handlers are attached.
- // Native DOM events should not be added, they may have inline handlers.
- customEvent : {
- "getData" : true,
- "setData" : true,
- "changeData" : true
- },
-
- trigger : function ( event, data, elem, onlyHandlers ) {
- // Don't do events on text and comment nodes
- if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
- return;
- }
-
- // Event object or event type
- var type = event.type || event,
- namespaces = [],
- cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
-
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
- return;
- }
-
- if ( type.indexOf( "!" ) >= 0 ) {
- // Exclusive events trigger only for the exact event (no namespaces)
- type = type.slice( 0, -1 );
- exclusive = true;
- }
-
- if ( type.indexOf( "." ) >= 0 ) {
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split( "." );
- type = namespaces.shift();
- namespaces.sort();
- }
-
- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
- // No jQuery handlers for this event type, and it can't have inline handlers
- return;
- }
-
- // Caller can pass in an Event, Object, or just an event type string
- event = typeof event === "object" ?
- // jQuery.Event object
- event[ jQuery.expando ] ? event :
- // Object literal
- new jQuery.Event( type, event ) :
- // Just the event type (string)
- new jQuery.Event( type );
-
- event.type = type;
- event.isTrigger = true;
- event.exclusive = exclusive;
- event.namespace = namespaces.join( "." );
- event.namespace_re = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.)?" ) + "(\\.|$)" ) : null;
- ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
- // Handle a global trigger
- if ( !elem ) {
-
- // TODO: Stop taunting the data cache; remove global events and always attach to document
- cache = jQuery.cache;
- for ( i in cache ) {
- if ( cache[ i ].events && cache[ i ].events[ type ] ) {
- jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
- }
- }
- return;
- }
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data != null ? jQuery.makeArray( data ) : [];
- data.unshift( event );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- eventPath = [
- [ elem, special.bindType || type ]
- ];
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
- old = null;
- for ( ; cur; cur = cur.parentNode ) {
- eventPath.push( [ cur, bubbleType ] );
- old = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( old && old === elem.ownerDocument ) {
- eventPath.push( [ old.defaultView || old.parentWindow || window, bubbleType ] );
- }
- }
-
- // Fire handlers on the event path
- for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
- cur = eventPath[i][0];
- event.type = eventPath[i][1];
-
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
- // Note that this is a bare JS function and not a jQuery handler
- handle = ontype && cur[ ontype ];
- if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
- event.preventDefault();
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
- // Don't do default actions on window, that's where global variables be (#6170)
- // IE<9 dies on focus/blur to hidden element (#1486)
- if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
-
- if ( old ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- elem[ type ]();
- jQuery.event.triggered = undefined;
-
- if ( old ) {
- elem[ ontype ] = old;
- }
- }
- }
- }
-
- return event.result;
- },
-
- dispatch : function ( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event || window.event );
-
- var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
- delegateCount = handlers.delegateCount,
- args = [].slice.call( arguments, 0 ),
- run_all = !event.exclusive && !event.namespace,
- handlerQueue = [],
- i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[0] = event;
- event.delegateTarget = this;
-
- // Determine handlers that should run if there are delegated events
- // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
- if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
-
- // Pregenerate a single jQuery object for reuse with .is()
- jqcur = jQuery( this );
- jqcur.context = this.ownerDocument || this;
-
- for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
- selMatch = {};
- matches = [];
- jqcur[0] = cur;
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
- sel = handleObj.selector;
-
- if ( selMatch[ sel ] === undefined ) {
- selMatch[ sel ] = (
- handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
- );
- }
- if ( selMatch[ sel ] ) {
- matches.push( handleObj );
- }
- }
- if ( matches.length ) {
- handlerQueue.push( { elem : cur, matches : matches } );
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- if ( handlers.length > delegateCount ) {
- handlerQueue.push( { elem : this, matches : handlers.slice( delegateCount ) } );
- }
-
- // Run delegates first; they may want to stop propagation beneath us
- for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
- matched = handlerQueue[ i ];
- event.currentTarget = matched.elem;
-
- for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
- handleObj = matched.matches[ j ];
-
- // Triggered event must either 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
- if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
- .apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- return event.result;
- },
-
- // Includes some event props shared by KeyEvent and MouseEvent
- // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
- props : "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split( " " ),
-
- fixHooks : {},
-
- keyHooks : {
- props : "char charCode key keyCode".split( " " ),
- filter : function ( event, original ) {
-
- // Add which for key events
- if ( event.which == null ) {
- event.which = original.charCode != null ? original.charCode : original.keyCode;
- }
-
- return event;
- }
- },
-
- mouseHooks : {
- props : "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split( " " ),
- filter : function ( event, original ) {
- var eventDoc, doc, body,
- button = original.button,
- fromElement = original.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && original.clientX != null ) {
- eventDoc = event.target.ownerDocument || document;
- doc = eventDoc.documentElement;
- body = eventDoc.body;
-
- event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
- event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && fromElement ) {
- event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && button !== undefined ) {
- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
- }
-
- return event;
- }
- },
-
- fix : function ( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop,
- originalEvent = event,
- fixHook = jQuery.event.fixHooks[ event.type ] || {},
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = jQuery.Event( originalEvent );
-
- for ( i = copy.length; i; ) {
- prop = copy[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
- if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
- }
-
- // Target should not be a text node (#504, Safari)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
- if ( event.metaKey === undefined ) {
- event.metaKey = event.ctrlKey;
- }
-
- return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
- },
-
- special : {
- ready : {
- // Make sure the ready event is setup
- setup : jQuery.bindReady
- },
-
- load : {
- // Prevent triggered image.load events from bubbling to window.load
- noBubble : true
- },
-
- focus : {
- delegateType : "focusin"
- },
- blur : {
- delegateType : "focusout"
- },
-
- beforeunload : {
- setup : function ( data, namespaces, eventHandle ) {
- // We only want to do this special case on windows
- if ( jQuery.isWindow( this ) ) {
- this.onbeforeunload = eventHandle;
- }
- },
-
- teardown : function ( namespaces, eventHandle ) {
- if ( this.onbeforeunload === eventHandle ) {
- this.onbeforeunload = null;
- }
- }
- }
- },
-
- simulate : function ( type, elem, event, bubble ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- { type : type,
- isSimulated : true,
- originalEvent : {}
- }
- );
- if ( bubble ) {
- jQuery.event.trigger( e, null, elem );
- } else {
- jQuery.event.dispatch.call( elem, e );
- }
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
- }
- };
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
- jQuery.event.handle = jQuery.event.dispatch;
-
- jQuery.removeEvent = document.removeEventListener ?
- function ( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function ( elem, type, handle ) {
- if ( elem.detachEvent ) {
- elem.detachEvent( "on" + type, handle );
- }
- };
-
- jQuery.Event = function ( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !(this instanceof jQuery.Event) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
- };
-
- function returnFalse() {
- return false;
- }
-
- function returnTrue() {
- return true;
- }
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
- jQuery.Event.prototype = {
- preventDefault : function () {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
-
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // otherwise set the returnValue property of the original event to false (IE)
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation : function () {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
- // if stopPropagation exists run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation : function () {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented : returnFalse,
- isPropagationStopped : returnFalse,
- isImmediatePropagationStopped : returnFalse
- };
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
- jQuery.each( {
- mouseenter : "mouseover",
- mouseleave : "mouseout"
- }, function ( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType : fix,
- bindType : fix,
-
- handle : function ( event ) {
- var target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj,
- selector = handleObj.selector,
- ret;
-
- // For mousenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
- } );
-
-// IE submit delegation
- if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup : function () {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function ( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !form._submit_attached ) {
- jQuery.event.add( form, "submit._submit", function ( event ) {
- // If form was submitted by the user, bubble the event up the tree
- if ( this.parentNode && !event.isTrigger ) {
- jQuery.event.simulate( "submit", this.parentNode, event, true );
- }
- } );
- form._submit_attached = true;
- }
- } );
- // return undefined since we don't need an event listener
- },
-
- teardown : function () {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
- jQuery.event.remove( this, "._submit" );
- }
- };
- }
-
-// IE change delegation and checkbox/radio fix
- if ( !jQuery.support.changeBubbles ) {
-
- jQuery.event.special.change = {
-
- setup : function () {
-
- if ( rformElems.test( this.nodeName ) ) {
- // IE doesn't fire change on a check/radio until blur; trigger it on click
- // after a propertychange. Eat the blur-change in special.change.handle.
- // This still fires onchange a second time for check/radio after blur.
- if ( this.type === "checkbox" || this.type === "radio" ) {
- jQuery.event.add( this, "propertychange._change", function ( event ) {
- if ( event.originalEvent.propertyName === "checked" ) {
- this._just_changed = true;
- }
- } );
- jQuery.event.add( this, "click._change", function ( event ) {
- if ( this._just_changed && !event.isTrigger ) {
- this._just_changed = false;
- jQuery.event.simulate( "change", this, event, true );
- }
- } );
- }
- return false;
- }
- // Delegated event; lazy-add a change handler on descendant inputs
- jQuery.event.add( this, "beforeactivate._change", function ( e ) {
- var elem = e.target;
-
- if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
- jQuery.event.add( elem, "change._change", function ( event ) {
- if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
- jQuery.event.simulate( "change", this.parentNode, event, true );
- }
- } );
- elem._change_attached = true;
- }
- } );
- },
-
- handle : function ( event ) {
- var elem = event.target;
-
- // Swallow native change events from checkbox/radio, we already triggered them above
- if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
- return event.handleObj.handler.apply( this, arguments );
- }
- },
-
- teardown : function () {
- jQuery.event.remove( this, "._change" );
-
- return rformElems.test( this.nodeName );
- }
- };
- }
-
-// Create "bubbling" focus and blur events
- if ( !jQuery.support.focusinBubbles ) {
- jQuery.each( { focus : "focusin", blur : "focusout" }, function ( orig, fix ) {
-
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0,
- handler = function ( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
- };
-
- jQuery.event.special[ fix ] = {
- setup : function () {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
- }
- },
- teardown : function () {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
- }
- }
- };
- } );
- }
-
- jQuery.fn.extend( {
-
- on : function ( types, selector, data, fn, /*INTERNAL*/ one ) {
- var origFn, type;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) {
- // ( types-Object, data )
- data = selector;
- selector = undefined;
- }
- for ( type in types ) {
- this.on( type, selector, data, types[ type ], one );
- }
- return this;
- }
-
- if ( data == null && fn == null ) {
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return this;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function ( event ) {
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return this.each( function () {
- jQuery.event.add( this, types, fn, data, selector );
- } );
- },
- one : function ( types, selector, data, fn ) {
- return this.on.call( this, types, selector, data, fn, 1 );
- },
- off : function ( types, selector, fn ) {
- if ( types && types.preventDefault && types.handleObj ) {
- // ( event ) dispatched jQuery.Event
- var handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace ? handleObj.type + "." + handleObj.namespace : handleObj.type,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
- // ( types-object [, selector] )
- for ( var type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each( function () {
- jQuery.event.remove( this, types, fn, selector );
- } );
- },
-
- bind : function ( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind : function ( types, fn ) {
- return this.off( types, null, fn );
- },
-
- live : function ( types, data, fn ) {
- jQuery( this.context ).on( types, this.selector, data, fn );
- return this;
- },
- die : function ( types, fn ) {
- jQuery( this.context ).off( types, this.selector || "**", fn );
- return this;
- },
-
- delegate : function ( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate : function ( selector, types, fn ) {
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length == 1 ? this.off( selector, "**" ) : this.off( types, selector, fn );
- },
-
- trigger : function ( type, data ) {
- return this.each( function () {
- jQuery.event.trigger( type, data, this );
- } );
- },
- triggerHandler : function ( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle : function ( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function ( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover : function ( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
- } );
-
- jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu").split( " " ), function ( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function ( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
- }
-
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
-
- if ( jQuery.attrFn ) {
- jQuery.attrFn[ name ] = true;
- }
-
- if ( rkeyEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
- }
-
- if ( rmouseEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
- }
- } );
-
-
- /*!
- * Sizzle CSS Selector Engine
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
- (function () {
-
- var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
- expando = "sizcache" + (Math.random() + '').replace( '.', '' ),
- done = 0,
- toString = Object.prototype.toString,
- hasDuplicate = false,
- baseHasDuplicate = true,
- rBackslash = /\\/g,
- rReturn = /\r\n/g,
- rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-// Thus far that includes Google Chrome.
- [0, 0].sort( function () {
- baseHasDuplicate = false;
- return 0;
- } );
-
- var Sizzle = function ( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
-
- var origContext = context;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
- return [];
- }
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var m, set, checkSet, extra, ret, cur, pop, i,
- prune = true,
- contextXML = Sizzle.isXML( context ),
- parts = [],
- soFar = selector;
-
- // Reset the position of the chunker regexp (start from head)
- do {
- chunker.exec( "" );
- m = chunker.exec( soFar );
-
- if ( m ) {
- soFar = m[3];
-
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = m[3];
- break;
- }
- }
- } while ( m );
-
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context, seed );
-
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- selector = parts.shift();
-
- if ( Expr.relative[ selector ] ) {
- selector += parts.shift();
- }
-
- set = posProcess( selector, set, seed );
- }
- }
-
- } else {
- // Take a shortcut and set the context if the root selector is an ID
- // (but not if it'll be faster if the inner selector is an ID)
- if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
- Expr.match.ID.test( parts[0] ) && !Expr.match.ID.test( parts[parts.length - 1] ) ) {
-
- ret = Sizzle.find( parts.shift(), context, contextXML );
- context = ret.expr ?
- Sizzle.filter( ret.expr, ret.set )[0] :
- ret.set[0];
- }
-
- if ( context ) {
- ret = seed ?
- { expr : parts.pop(), set : makeArray( seed ) } :
- Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
- set = ret.expr ?
- Sizzle.filter( ret.expr, ret.set ) :
- ret.set;
-
- if ( parts.length > 0 ) {
- checkSet = makeArray( set );
-
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- cur = parts.pop();
- pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop, contextXML );
- }
-
- } else {
- checkSet = parts = [];
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- Sizzle.error( cur || selector );
- }
-
- if ( toString.call( checkSet ) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
-
- } else if ( context && context.nodeType === 1 ) {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains( context, checkSet[i] )) ) {
- results.push( set[i] );
- }
- }
-
- } else {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
-
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, origContext, results, seed );
- Sizzle.uniqueSort( results );
- }
-
- return results;
- };
-
- Sizzle.uniqueSort = function ( results ) {
- if ( sortOrder ) {
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( var i = 1; i < results.length; i++ ) {
- if ( results[i] === results[ i - 1 ] ) {
- results.splice( i--, 1 );
- }
- }
- }
- }
-
- return results;
- };
-
- Sizzle.matches = function ( expr, set ) {
- return Sizzle( expr, null, null, set );
- };
-
- Sizzle.matchesSelector = function ( node, expr ) {
- return Sizzle( expr, null, null, [node] ).length > 0;
- };
-
- Sizzle.find = function ( expr, context, isXML ) {
- var set, i, len, match, type, left;
-
- if ( !expr ) {
- return [];
- }
-
- for ( i = 0, len = Expr.order.length; i < len; i++ ) {
- type = Expr.order[i];
-
- if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- left = match[1];
- match.splice( 1, 1 );
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace( rBackslash, "" );
- set = Expr.find[ type ]( match, context, isXML );
-
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( "*" ) :
- [];
- }
-
- return { set : set, expr : expr };
- };
-
- Sizzle.filter = function ( expr, set, inplace, not ) {
- var match, anyFound,
- type, found, item, filter, left,
- i, pass,
- old = expr,
- result = [],
- curLoop = set,
- isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
- while ( expr && set.length ) {
- for ( type in Expr.filter ) {
- if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
- filter = Expr.filter[ type ];
- left = match[1];
-
- anyFound = false;
-
- match.splice( 1, 1 );
-
- if ( left.substr( left.length - 1 ) === "\\" ) {
- continue;
- }
-
- if ( curLoop === result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
- if ( !match ) {
- anyFound = found = true;
-
- } else if ( match === true ) {
- continue;
- }
- }
-
- if ( match ) {
- for ( i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- pass = not ^ found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
-
- } else {
- curLoop[i] = false;
- }
-
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- // Improper expression
- if ( expr === old ) {
- if ( anyFound == null ) {
- Sizzle.error( expr );
-
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
- };
-
- Sizzle.error = function ( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
- };
-
- /**
- * Utility function for retreiving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
- var getText = Sizzle.getText = function ( elem ) {
- var i, node,
- nodeType = elem.nodeType,
- ret = "";
-
- if ( nodeType ) {
- if ( nodeType === 1 || nodeType === 9 ) {
- // Use textContent || innerText for elements
- if ( typeof elem.textContent === 'string' ) {
- return elem.textContent;
- } else if ( typeof elem.innerText === 'string' ) {
- // Replace IE's carriage returns
- return elem.innerText.replace( rReturn, '' );
- } else {
- // Traverse it's children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
- } else {
-
- // If no nodeType, this is expected to be an array
- for ( i = 0; (node = elem[i]); i++ ) {
- // Do not traverse comment nodes
- if ( node.nodeType !== 8 ) {
- ret += getText( node );
- }
- }
- }
- return ret;
- };
-
- var Expr = Sizzle.selectors = {
- order : [ "ID", "NAME", "TAG" ],
-
- match : {
- ID : /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- CLASS : /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- NAME : /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
- ATTR : /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
- TAG : /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
- CHILD : /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
- POS : /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
- PSEUDO : /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
- },
-
- leftMatch : {},
-
- attrMap : {
- "class" : "className",
- "for" : "htmlFor"
- },
-
- attrHandle : {
- href : function ( elem ) {
- return elem.getAttribute( "href" );
- },
- type : function ( elem ) {
- return elem.getAttribute( "type" );
- }
- },
-
- relative : {
- "+" : function ( checkSet, part ) {
- var isPartStr = typeof part === "string",
- isTag = isPartStr && !rNonWord.test( part ),
- isPartStrNotTag = isPartStr && !isTag;
-
- if ( isTag ) {
- part = part.toLowerCase();
- }
-
- for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
- if ( (elem = checkSet[i]) ) {
- while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {
- }
-
- checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
- elem || false :
- elem === part;
- }
- }
-
- if ( isPartStrNotTag ) {
- Sizzle.filter( part, checkSet, true );
- }
- },
-
- ">" : function ( checkSet, part ) {
- var elem,
- isPartStr = typeof part === "string",
- i = 0,
- l = checkSet.length;
-
- if ( isPartStr && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
-
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- var parent = elem.parentNode;
- checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
- }
- }
-
- } else {
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- checkSet[i] = isPartStr ?
- elem.parentNode :
- elem.parentNode === part;
- }
- }
-
- if ( isPartStr ) {
- Sizzle.filter( part, checkSet, true );
- }
- }
- },
-
- "" : function ( checkSet, part, isXML ) {
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
- },
-
- "~" : function ( checkSet, part, isXML ) {
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
- }
- },
-
- find : {
- ID : function ( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById( match[1] );
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- },
-
- NAME : function ( match, context ) {
- if ( typeof context.getElementsByName !== "undefined" ) {
- var ret = [],
- results = context.getElementsByName( match[1] );
-
- for ( var i = 0, l = results.length; i < l; i++ ) {
- if ( results[i].getAttribute( "name" ) === match[1] ) {
- ret.push( results[i] );
- }
- }
-
- return ret.length === 0 ? null : ret;
- }
- },
-
- TAG : function ( match, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( match[1] );
- }
- }
- },
- preFilter : {
- CLASS : function ( match, curLoop, inplace, result, not, isXML ) {
- match = " " + match[1].replace( rBackslash, "" ) + " ";
-
- if ( isXML ) {
- return match;
- }
-
- for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
- if ( elem ) {
- if ( not ^ (elem.className && (" " + elem.className + " ").replace( /[\t\n\r]/g, " " ).indexOf( match ) >= 0) ) {
- if ( !inplace ) {
- result.push( elem );
- }
-
- } else if ( inplace ) {
- curLoop[i] = false;
- }
- }
- }
-
- return false;
- },
-
- ID : function ( match ) {
- return match[1].replace( rBackslash, "" );
- },
-
- TAG : function ( match, curLoop ) {
- return match[1].replace( rBackslash, "" ).toLowerCase();
- },
-
- CHILD : function ( match ) {
- if ( match[1] === "nth" ) {
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- match[2] = match[2].replace( /^\+|\s*/g, '' );
-
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
- match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2] );
-
- // calculate the numbers (first)n+(last) including if they are negative
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
- else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // TODO: Move to normal caching system
- match[0] = done++;
-
- return match;
- },
-
- ATTR : function ( match, curLoop, inplace, result, not, isXML ) {
- var name = match[1] = match[1].replace( rBackslash, "" );
-
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- // Handle if an un-quoted value was used
- match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
-
- PSEUDO : function ( match, curLoop, inplace, result, not ) {
- if ( match[1] === "not" ) {
- // If we're dealing with a complex expression, or a simple one
- if ( ( chunker.exec( match[3] ) || "" ).length > 1 || /^\w/.test( match[3] ) ) {
- match[3] = Sizzle( match[3], null, null, curLoop );
-
- } else {
- var ret = Sizzle.filter( match[3], curLoop, inplace, true ^ not );
-
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
-
- return false;
- }
-
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
-
- return match;
- },
-
- POS : function ( match ) {
- match.unshift( true );
-
- return match;
- }
- },
-
- filters : {
- enabled : function ( elem ) {
- return elem.disabled === false && elem.type !== "hidden";
- },
-
- disabled : function ( elem ) {
- return elem.disabled === true;
- },
-
- checked : function ( elem ) {
- return elem.checked === true;
- },
-
- selected : function ( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- parent : function ( elem ) {
- return !!elem.firstChild;
- },
-
- empty : function ( elem ) {
- return !elem.firstChild;
- },
-
- has : function ( elem, i, match ) {
- return !!Sizzle( match[3], elem ).length;
- },
-
- header : function ( elem ) {
- return (/h\d/i).test( elem.nodeName );
- },
-
- text : function ( elem ) {
- var attr = elem.getAttribute( "type" ), type = elem.type;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
- },
-
- radio : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
- },
-
- checkbox : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
- },
-
- file : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
- },
-
- password : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
- },
-
- submit : function ( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "submit" === elem.type;
- },
-
- image : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
- },
-
- reset : function ( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "reset" === elem.type;
- },
-
- button : function ( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && "button" === elem.type || name === "button";
- },
-
- input : function ( elem ) {
- return (/input|select|textarea|button/i).test( elem.nodeName );
- },
-
- focus : function ( elem ) {
- return elem === elem.ownerDocument.activeElement;
- }
- },
- setFilters : {
- first : function ( elem, i ) {
- return i === 0;
- },
-
- last : function ( elem, i, match, array ) {
- return i === array.length - 1;
- },
-
- even : function ( elem, i ) {
- return i % 2 === 0;
- },
-
- odd : function ( elem, i ) {
- return i % 2 === 1;
- },
-
- lt : function ( elem, i, match ) {
- return i < match[3] - 0;
- },
-
- gt : function ( elem, i, match ) {
- return i > match[3] - 0;
- },
-
- nth : function ( elem, i, match ) {
- return match[3] - 0 === i;
- },
-
- eq : function ( elem, i, match ) {
- return match[3] - 0 === i;
- }
- },
- filter : {
- PSEUDO : function ( elem, match, i, array ) {
- var name = match[1],
- filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
-
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || getText( [ elem ] ) || "").indexOf( match[3] ) >= 0;
-
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var j = 0, l = not.length; j < l; j++ ) {
- if ( not[j] === elem ) {
- return false;
- }
- }
-
- return true;
-
- } else {
- Sizzle.error( name );
- }
- },
-
- CHILD : function ( elem, match ) {
- var first, last,
- doneName, parent, cache,
- count, diff,
- type = match[1],
- node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- return true;
-
- case "nth":
- first = match[2];
- last = match[3];
-
- if ( first === 1 && last === 0 ) {
- return true;
- }
-
- doneName = match[0];
- parent = elem.parentNode;
-
- if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
- count = 0;
-
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.nodeIndex = ++count;
- }
- }
-
- parent[ expando ] = doneName;
- }
-
- diff = elem.nodeIndex - last;
-
- if ( first === 0 ) {
- return diff === 0;
-
- } else {
- return ( diff % first === 0 && diff / first >= 0 );
- }
- }
- },
-
- ID : function ( elem, match ) {
- return elem.nodeType === 1 && elem.getAttribute( "id" ) === match;
- },
-
- TAG : function ( elem, match ) {
- return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
- },
-
- CLASS : function ( elem, match ) {
- return (" " + (elem.className || elem.getAttribute( "class" )) + " ")
- .indexOf( match ) > -1;
- },
-
- ATTR : function ( elem, match ) {
- var name = match[1],
- result = Sizzle.attr ?
- Sizzle.attr( elem, name ) :
- Expr.attrHandle[ name ] ?
- Expr.attrHandle[ name ]( elem ) :
- elem[ name ] != null ?
- elem[ name ] :
- elem.getAttribute( name ),
- value = result + "",
- type = match[2],
- check = match[4];
-
- return result == null ?
- type === "!=" :
- !type && Sizzle.attr ?
- result != null :
- type === "=" ?
- value === check :
- type === "*=" ?
- value.indexOf( check ) >= 0 :
- type === "~=" ?
- (" " + value + " ").indexOf( check ) >= 0 :
- !check ?
- value && result !== false :
- type === "!=" ?
- value !== check :
- type === "^=" ?
- value.indexOf( check ) === 0 :
- type === "$=" ?
- value.substr( value.length - check.length ) === check :
- type === "|=" ?
- value === check || value.substr( 0, check.length + 1 ) === check + "-" :
- false;
- },
-
- POS : function ( elem, match, i, array ) {
- var name = match[2],
- filter = Expr.setFilters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- }
- }
- }
- };
-
- var origPOS = Expr.match.POS,
- fescape = function ( all, num ) {
- return "\\" + (num - 0 + 1);
- };
-
- for ( var type in Expr.match ) {
- Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
- Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace( /\\(\d+)/g, fescape ) );
- }
-
- var makeArray = function ( array, results ) {
- array = Array.prototype.slice.call( array, 0 );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
- };
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
- try {
- Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
- } catch ( e ) {
- makeArray = function ( array, results ) {
- var i = 0,
- ret = results || [];
-
- if ( toString.call( array ) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
-
- } else {
- if ( typeof array.length === "number" ) {
- for ( var l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
-
- } else {
- for ( ; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
- }
-
- var sortOrder, siblingCheck;
-
- if ( document.documentElement.compareDocumentPosition ) {
- sortOrder = function ( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
- return a.compareDocumentPosition ? -1 : 1;
- }
-
- return a.compareDocumentPosition( b ) & 4 ? -1 : 1;
- };
-
- } else {
- sortOrder = function ( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
- siblingCheck = function ( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
- };
- }
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
- (function () {
- // We're going to inject a fake input element with a specified name
- var form = document.createElement( "div" ),
- id = "script" + (new Date()).getTime(),
- root = document.documentElement;
-
- form.innerHTML = "";
-
- // Inject it into the root element, check its status, and remove it quickly
- root.insertBefore( form, root.firstChild );
-
- // The workaround has to do additional checks after a getElementById
- // Which slows things down for other browsers (hence the branching)
- if ( document.getElementById( id ) ) {
- Expr.find.ID = function ( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById( match[1] );
-
- return m ?
- m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode( "id" ).nodeValue === match[1] ?
- [m] :
- undefined :
- [];
- }
- };
-
- Expr.filter.ID = function ( elem, match ) {
- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode( "id" );
-
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
-
- // release memory in IE
- root = form = null;
- })();
-
- (function () {
- // Check to see if the browser returns only elements
- // when doing getElementsByTagName("*")
-
- // Create a fake element
- var div = document.createElement( "div" );
- div.appendChild( document.createComment( "" ) );
-
- // Make sure no comments are found
- if ( div.getElementsByTagName( "*" ).length > 0 ) {
- Expr.find.TAG = function ( match, context ) {
- var results = context.getElementsByTagName( match[1] );
-
- // Filter out possible comments
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-
- // Check to see if an attribute returns normalized href attributes
- div.innerHTML = "";
-
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute( "href" ) !== "#" ) {
-
- Expr.attrHandle.href = function ( elem ) {
- return elem.getAttribute( "href", 2 );
- };
- }
-
- // release memory in IE
- div = null;
- })();
-
- if ( document.querySelectorAll ) {
- (function () {
- var oldSizzle = Sizzle,
- div = document.createElement( "div" ),
- id = "__sizzle__";
-
- div.innerHTML = "";
-
- // Safari can't handle uppercase or unicode characters when
- // in quirks mode.
- if ( div.querySelectorAll && div.querySelectorAll( ".TEST" ).length === 0 ) {
- return;
- }
-
- Sizzle = function ( query, context, extra, seed ) {
- context = context || document;
-
- // Only use querySelectorAll on non-XML documents
- // (ID selectors don't work in non-HTML documents)
- if ( !seed && !Sizzle.isXML( context ) ) {
- // See if we find a selector to speed up
- var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-
- if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
- // Speed-up: Sizzle("TAG")
- if ( match[1] ) {
- return makeArray( context.getElementsByTagName( query ), extra );
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
- return makeArray( context.getElementsByClassName( match[2] ), extra );
- }
- }
-
- if ( context.nodeType === 9 ) {
- // Speed-up: Sizzle("body")
- // The body element only exists once, optimize finding it
- if ( query === "body" && context.body ) {
- return makeArray( [ context.body ], extra );
-
- // Speed-up: Sizzle("#ID")
- } else if ( match && match[3] ) {
- var elem = context.getElementById( match[3] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id === match[3] ) {
- return makeArray( [ elem ], extra );
- }
-
- } else {
- return makeArray( [], extra );
- }
- }
-
- try {
- return makeArray( context.querySelectorAll( query ), extra );
- } catch ( qsaError ) {
- }
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- var oldContext = context,
- old = context.getAttribute( "id" ),
- nid = old || id,
- hasParent = context.parentNode,
- relativeHierarchySelector = /^\s*[+~]/.test( query );
-
- if ( !old ) {
- context.setAttribute( "id", nid );
- } else {
- nid = nid.replace( /'/g, "\\$&" );
- }
- if ( relativeHierarchySelector && hasParent ) {
- context = context.parentNode;
- }
-
- try {
- if ( !relativeHierarchySelector || hasParent ) {
- return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
- }
-
- } catch ( pseudoError ) {
- } finally {
- if ( !old ) {
- oldContext.removeAttribute( "id" );
- }
- }
- }
- }
-
- return oldSizzle( query, context, extra, seed );
- };
-
- for ( var prop in oldSizzle ) {
- Sizzle[ prop ] = oldSizzle[ prop ];
- }
-
- // release memory in IE
- div = null;
- })();
- }
-
- (function () {
- var html = document.documentElement,
- matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
- if ( matches ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9 fails this)
- var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
- pseudoWorks = false;
-
- try {
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( document.documentElement, "[test!='']:sizzle" );
-
- } catch ( pseudoError ) {
- pseudoWorks = true;
- }
-
- Sizzle.matchesSelector = function ( node, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace( /\=\s*([^'"\]]*)\s*\]/g, "='$1']" );
-
- if ( !Sizzle.isXML( node ) ) {
- try {
- if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
- var ret = matches.call( node, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || !disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9, so check for that
- node.document && node.document.nodeType !== 11 ) {
- return ret;
- }
- }
- } catch ( e ) {
- }
- }
-
- return Sizzle( expr, null, null, [node] ).length > 0;
- };
- }
- })();
-
- (function () {
- var div = document.createElement( "div" );
-
- div.innerHTML = "";
-
- // Opera can't find a second classname (in 9.6)
- // Also, make sure that getElementsByClassName actually exists
- if ( !div.getElementsByClassName || div.getElementsByClassName( "e" ).length === 0 ) {
- return;
- }
-
- // Safari caches class attributes, doesn't catch changes (in 3.2)
- div.lastChild.className = "e";
-
- if ( div.getElementsByClassName( "e" ).length === 1 ) {
- return;
- }
-
- Expr.order.splice( 1, 0, "CLASS" );
- Expr.find.CLASS = function ( match, context, isXML ) {
- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
- return context.getElementsByClassName( match[1] );
- }
- };
-
- // release memory in IE
- div = null;
- })();
-
- function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem[ expando ] === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 && !isXML ) {
- elem[ expando ] = doneName;
- elem.sizset = i;
- }
-
- if ( elem.nodeName.toLowerCase() === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
- }
-
- function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem[ expando ] === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem[ expando ] = doneName;
- elem.sizset = i;
- }
-
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
- }
-
- if ( document.documentElement.contains ) {
- Sizzle.contains = function ( a, b ) {
- return a !== b && (a.contains ? a.contains( b ) : true);
- };
-
- } else if ( document.documentElement.compareDocumentPosition ) {
- Sizzle.contains = function ( a, b ) {
- return !!(a.compareDocumentPosition( b ) & 16);
- };
-
- } else {
- Sizzle.contains = function () {
- return false;
- };
- }
-
- Sizzle.isXML = function ( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
- return documentElement ? documentElement.nodeName !== "HTML" : false;
- };
-
- var posProcess = function ( selector, context, seed ) {
- var match,
- tmpSet = [],
- later = "",
- root = context.nodeType ? [context] : context;
-
- // Position selectors must be done after the filter
- // And so must :not(positional) so we move all PSEUDOs to the end
- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.PSEUDO, "" );
- }
-
- selector = Expr.relative[selector] ? selector + "*" : selector;
-
- for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet, seed );
- }
-
- return Sizzle.filter( later, tmpSet );
- };
-
-// EXPOSE
-// Override sizzle attribute retrieval
- Sizzle.attr = jQuery.attr;
- Sizzle.selectors.attrMap = {};
- jQuery.find = Sizzle;
- jQuery.expr = Sizzle.selectors;
- jQuery.expr[":"] = jQuery.expr.filters;
- jQuery.unique = Sizzle.uniqueSort;
- jQuery.text = Sizzle.getText;
- jQuery.isXMLDoc = Sizzle.isXML;
- jQuery.contains = Sizzle.contains;
-
-
- })();
-
-
- var runtil = /Until$/,
- rparentsprev = /^(?:parents|prevUntil|prevAll)/,
- // Note: This RegExp should be improved, or likely pulled from Sizzle
- rmultiselector = /,/,
- isSimple = /^.[^:#\[\.,]*$/,
- slice = Array.prototype.slice,
- POS = jQuery.expr.match.POS,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children : true,
- contents : true,
- next : true,
- prev : true
- };
-
- jQuery.fn.extend( {
- find : function ( selector ) {
- var self = this,
- i, l;
-
- if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter( function () {
- for ( i = 0, l = self.length; i < l; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- } );
- }
-
- var ret = this.pushStack( "", "find", selector ),
- length, n, r;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice( n--, 1 );
- break;
- }
- }
- }
- }
- }
-
- return ret;
- },
-
- has : function ( target ) {
- var targets = jQuery( target );
- return this.filter( function () {
- for ( var i = 0, l = targets.length; i < l; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- } );
- },
-
- not : function ( selector ) {
- return this.pushStack( winnow( this, selector, false ), "not", selector );
- },
-
- filter : function ( selector ) {
- return this.pushStack( winnow( this, selector, true ), "filter", selector );
- },
-
- is : function ( selector ) {
- return !!selector && (
- typeof selector === "string" ?
- // If this is a positional selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- POS.test( selector ) ?
- jQuery( selector, this.context ).index( this[0] ) >= 0 :
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
- },
-
- closest : function ( selectors, context ) {
- var ret = [], i, l, cur = this[0];
-
- // Array (deprecated as of jQuery 1.7)
- if ( jQuery.isArray( selectors ) ) {
- var level = 1;
-
- while ( cur && cur.ownerDocument && cur !== context ) {
- for ( i = 0; i < selectors.length; i++ ) {
-
- if ( jQuery( cur ).is( selectors[ i ] ) ) {
- ret.push( { selector : selectors[ i ], elem : cur, level : level } );
- }
- }
-
- cur = cur.parentNode;
- level++;
- }
-
- return ret;
- }
-
- // String
- var pos = POS.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- cur = this[i];
-
- while ( cur ) {
- if ( pos ? pos.index( cur ) > -1 : jQuery.find.matchesSelector( cur, selectors ) ) {
- ret.push( cur );
- break;
-
- } else {
- cur = cur.parentNode;
- if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
- break;
- }
- }
- }
- }
-
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index : function ( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
- }
-
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[0], jQuery( elem ) );
- }
-
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add : function ( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
- },
-
- andSelf : function () {
- return this.add( this.prevObject );
- }
- } );
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
- function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
- }
-
- jQuery.each( {
- parent : function ( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents : function ( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil : function ( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next : function ( elem ) {
- return jQuery.nth( elem, 2, "nextSibling" );
- },
- prev : function ( elem ) {
- return jQuery.nth( elem, 2, "previousSibling" );
- },
- nextAll : function ( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll : function ( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil : function ( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil : function ( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings : function ( elem ) {
- return jQuery.sibling( elem.parentNode.firstChild, elem );
- },
- children : function ( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents : function ( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.makeArray( elem.childNodes );
- }
- }, function ( name, fn ) {
- jQuery.fn[ name ] = function ( until, selector ) {
- var ret = jQuery.map( this, fn, until );
-
- if ( !runtil.test( name ) ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
- if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
-
- return this.pushStack( ret, name, slice.call( arguments ).join( "," ) );
- };
- } );
-
- jQuery.extend( {
- filter : function ( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 ?
- jQuery.find.matchesSelector( elems[0], expr ) ? [ elems[0] ] : [] :
- jQuery.find.matches( expr, elems );
- },
-
- dir : function ( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- nth : function ( cur, result, dir, elem ) {
- result = result || 1;
- var num = 0;
-
- for ( ; cur; cur = cur[dir] ) {
- if ( cur.nodeType === 1 && ++num === result ) {
- break;
- }
- }
-
- return cur;
- },
-
- sibling : function ( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
- } );
-
-// Implement the identical functionality for filter and not
- function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep( elements, function ( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
- } );
-
- } else if ( qualifier.nodeType ) {
- return jQuery.grep( elements, function ( elem, i ) {
- return ( elem === qualifier ) === keep;
- } );
-
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep( elements, function ( elem ) {
- return elem.nodeType === 1;
- } );
-
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter( qualifier, filtered, !keep );
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
- }
- }
-
- return jQuery.grep( elements, function ( elem, i ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
- } );
- }
-
-
- function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
- }
-
- var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
- "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
- rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
- rtagName = /<([\w:]+)/,
- rtbody = /", "" ],
- legend : [ 1, "" ],
- thead : [ 1, "
", "
" ],
- tr : [ 2, "
", "
" ],
- td : [ 3, "
", "
" ],
- col : [ 2, "
", "
" ],
- area : [ 1, "" ],
- _default : [ 0, "", "" ]
- },
- safeFragment = createSafeFragment( document );
-
- wrapMap.optgroup = wrapMap.option;
- wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
- wrapMap.th = wrapMap.td;
-
-// IE can't serialize and
-
+
+
diff --git a/lib/postal.js b/lib/postal.js
index 275067c..98328c9 100644
--- a/lib/postal.js
+++ b/lib/postal.js
@@ -210,12 +210,13 @@
return this;
},
- withThrottle: function (milliseconds) {
+ withThrottle: function (milliseconds, options) {
+ options = options || {};
if (_.isNaN(milliseconds)) {
throw "Milliseconds must be a number";
}
var fn = this.callback;
- this.callback = _.throttle(fn, milliseconds);
+ this.callback = _.throttle(fn, milliseconds, options);
return this;
},
diff --git a/lib/postal.min.js b/lib/postal.min.js
index 88db6ab..406da7e 100644
--- a/lib/postal.min.js
+++ b/lib/postal.min.js
@@ -5,4 +5,4 @@
* Url: http://github.com/postaljs/postal.js
* License(s): MIT, GPL
*/
-(function(t,n){"object"==typeof module&&module.exports?module.exports=function(t){return t=t||require("underscore"),n(t)}:"function"==typeof define&&define.amd?define(["underscore"],function(i){return n(i,t)}):t.postal=n(t._,t)})(this,function(t,n){var i,s=function(){var n;return function(i){var s=!1;return t.isString(i)?(s=i===n,n=i):(s=t.isEqual(i,n),n=t.clone(i)),!s}},e=function(){var n=[];return function(i){var s=!t.any(n,function(n){return t.isObject(i)||t.isArray(i)?t.isEqual(i,n):i===n});return s&&n.push(i),s}},c=function(t){this.channel=t||i.configuration.DEFAULT_CHANNEL};c.prototype.subscribe=function(){return 1===arguments.length?new r(this.channel,arguments[0].topic,arguments[0].callback):new r(this.channel,arguments[0],arguments[1])},c.prototype.publish=function(){var t=1===arguments.length?"[object String]"===Object.prototype.toString.call(arguments[0])?{topic:arguments[0]}:arguments[0]:{topic:arguments[0],data:arguments[1]};return t.channel=this.channel,i.configuration.bus.publish(t)};var r=function(t,n,s){if(3!==arguments.length)throw new Error("You must provide a channel, topic and callback when creating a SubscriptionDefinition instance.");if(0===n.length)throw new Error("Topics cannot be empty");this.channel=t,this.topic=n,this.callback=s,this.constraints=[],this.context=null,i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:t,topic:n}}),i.configuration.bus.subscribe(this)};r.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.configuration.bus.unsubscribe(this),i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:this.channel,topic:this.topic}}))},defer:function(){var t=this,n=this.callback;return this.callback=function(i,s){setTimeout(function(){n.call(t.context,i,s)},0)},this},disposeAfter:function(n){if(t.isNaN(n)||0>=n)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var i=this,s=this.callback,e=t.after(n,t.bind(function(){this.unsubscribe()},this));return this.callback=function(){s.apply(i.context,arguments),e()},this},distinctUntilChanged:function(){return this.withConstraint(new s),this},distinct:function(){return this.withConstraint(new e),this},once:function(){return this.disposeAfter(1),this},withConstraint:function(n){if(!t.isFunction(n))throw"Predicate constraint must be a function";return this.constraints.push(n),this},withConstraints:function(n){var i=this;return t.isArray(n)&&t.each(n,function(t){i.withConstraint(t)}),i},withContext:function(t){return this.context=t,this},withDebounce:function(n,i){if(t.isNaN(n))throw"Milliseconds must be a number";var s=this.callback;return this.callback=t.debounce(s,n,!!i),this},withDelay:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";var i=this,s=this.callback;return this.callback=function(t,e){setTimeout(function(){s.call(i.context,t,e)},n)},this},withThrottle:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";var i=this.callback;return this.callback=t.throttle(i,n),this},subscribe:function(t){return this.callback=t,this}};var o={cache:{},regex:{},compare:function(n,i){var s,e,c,r=this.cache[i]&&this.cache[i][n];return"undefined"!=typeof r?r:((e=this.regex[n])||(s="^"+t.map(n.split("."),function(t){var n="";return c&&(n="#"!==c?"\\.\\b":"\\b"),n+="#"===t?"[\\s\\S]*":"*"===t?"[^.]+":t,c=t,n}).join("")+"$",e=this.regex[n]=new RegExp(s)),this.cache[i]=this.cache[i]||{},this.cache[i][n]=r=e.test(i),r)},reset:function(){this.cache={},this.regex={}}},a=function(n,s){!n.inactive&&i.configuration.resolver.compare(n.topic,s.topic)&&t.all(n.constraints,function(t){return t.call(n.context,s.data,s)})&&"function"==typeof n.callback&&n.callback.call(n.context,s.data,s)},u=0,h=[],l=function(){for(;h.length;)f.unsubscribe(h.shift())},f={addWireTap:function(t){var n=this;return n.wireTaps.push(t),function(){var i=n.wireTaps.indexOf(t);-1!==i&&n.wireTaps.splice(i,1)}},publish:function(n){return++u,n.timeStamp=new Date,t.each(this.wireTaps,function(t){t(n.data,n)}),this.subscriptions[n.channel]&&t.each(this.subscriptions[n.channel],function(t){for(var i,s=0,e=t.length;e>s;)(i=t[s++])&&a(i,n)}),0===--u&&l(),n},reset:function(){this.subscriptions&&(t.each(this.subscriptions,function(n){t.each(n,function(t){for(;t.length;)t.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(t){var n,i=this.subscriptions[t.channel];return i||(i=this.subscriptions[t.channel]={}),n=this.subscriptions[t.channel][t.topic],n||(n=this.subscriptions[t.channel][t.topic]=[]),n.push(t),t},subscriptions:{},wireTaps:[],unsubscribe:function(t){if(u)return void h.push(t);if(this.subscriptions[t.channel][t.topic])for(var n=this.subscriptions[t.channel][t.topic].length,i=0;n>i;){if(this.subscriptions[t.channel][t.topic][i]===t){this.subscriptions[t.channel][t.topic].splice(i,1);break}i+=1}}};if(i={configuration:{bus:f,resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},ChannelDefinition:c,SubscriptionDefinition:r,channel:function(t){return new c(t)},subscribe:function(t){return new r(t.channel||i.configuration.DEFAULT_CHANNEL,t.topic,t.callback)},publish:function(t){return t.channel=t.channel||i.configuration.DEFAULT_CHANNEL,i.configuration.bus.publish(t)},addWireTap:function(t){return this.configuration.bus.addWireTap(t)},linkChannels:function(n,s){var e=[];return n=t.isArray(n)?n:[n],s=t.isArray(s)?s:[s],t.each(n,function(n){var c=n.topic||"#";t.each(s,function(s){var r=s.channel||i.configuration.DEFAULT_CHANNEL;e.push(i.subscribe({channel:n.channel||i.configuration.DEFAULT_CHANNEL,topic:c,callback:function(n,e){var c=t.clone(e);c.topic=t.isFunction(s.topic)?s.topic(e.topic):s.topic||e.topic,c.channel=r,c.data=n,i.publish(c)}}))})}),e},utils:{getSubscribersFor:function(){var t=arguments[0],n=arguments[1];return 1===arguments.length&&(t=arguments[0].channel||i.configuration.DEFAULT_CHANNEL,n=arguments[0].topic),i.configuration.bus.subscriptions[t]&&Object.prototype.hasOwnProperty.call(i.configuration.bus.subscriptions[t],n)?i.configuration.bus.subscriptions[t][n]:[]},reset:function(){i.configuration.bus.reset(),i.configuration.resolver.reset()}}},f.subscriptions[i.configuration.SYSTEM_CHANNEL]={},n&&Object.prototype.hasOwnProperty.call(n,"__postalReady__")&&t.isArray(n.__postalReady__))for(;n.__postalReady__.length;)n.__postalReady__.shift().onReady(i);return i});
\ No newline at end of file
+(function(t,n){"object"==typeof module&&module.exports?module.exports=function(t){return t=t||require("underscore"),n(t)}:"function"==typeof define&&define.amd?define(["underscore"],function(i){return n(i,t)}):t.postal=n(t._,t)})(this,function(t,n){var i,s=function(){var n;return function(i){var s=!1;return t.isString(i)?(s=i===n,n=i):(s=t.isEqual(i,n),n=t.clone(i)),!s}},e=function(){var n=[];return function(i){var s=!t.any(n,function(n){return t.isObject(i)||t.isArray(i)?t.isEqual(i,n):i===n});return s&&n.push(i),s}},c=function(t){this.channel=t||i.configuration.DEFAULT_CHANNEL};c.prototype.subscribe=function(){return 1===arguments.length?new r(this.channel,arguments[0].topic,arguments[0].callback):new r(this.channel,arguments[0],arguments[1])},c.prototype.publish=function(){var t=1===arguments.length?"[object String]"===Object.prototype.toString.call(arguments[0])?{topic:arguments[0]}:arguments[0]:{topic:arguments[0],data:arguments[1]};return t.channel=this.channel,i.configuration.bus.publish(t)};var r=function(t,n,s){if(3!==arguments.length)throw new Error("You must provide a channel, topic and callback when creating a SubscriptionDefinition instance.");if(0===n.length)throw new Error("Topics cannot be empty");this.channel=t,this.topic=n,this.callback=s,this.constraints=[],this.context=null,i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:t,topic:n}}),i.configuration.bus.subscribe(this)};r.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.configuration.bus.unsubscribe(this),i.configuration.bus.publish({channel:i.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:this.channel,topic:this.topic}}))},defer:function(){var t=this,n=this.callback;return this.callback=function(i,s){setTimeout(function(){n.call(t.context,i,s)},0)},this},disposeAfter:function(n){if(t.isNaN(n)||0>=n)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var i=this,s=this.callback,e=t.after(n,t.bind(function(){this.unsubscribe()},this));return this.callback=function(){s.apply(i.context,arguments),e()},this},distinctUntilChanged:function(){return this.withConstraint(new s),this},distinct:function(){return this.withConstraint(new e),this},once:function(){return this.disposeAfter(1),this},withConstraint:function(n){if(!t.isFunction(n))throw"Predicate constraint must be a function";return this.constraints.push(n),this},withConstraints:function(n){var i=this;return t.isArray(n)&&t.each(n,function(t){i.withConstraint(t)}),i},withContext:function(t){return this.context=t,this},withDebounce:function(n,i){if(t.isNaN(n))throw"Milliseconds must be a number";var s=this.callback;return this.callback=t.debounce(s,n,!!i),this},withDelay:function(n){if(t.isNaN(n))throw"Milliseconds must be a number";var i=this,s=this.callback;return this.callback=function(t,e){setTimeout(function(){s.call(i.context,t,e)},n)},this},withThrottle:function(n,i){if(i=i||{},t.isNaN(n))throw"Milliseconds must be a number";var s=this.callback;return this.callback=t.throttle(s,n,i),this},subscribe:function(t){return this.callback=t,this}};var o={cache:{},regex:{},compare:function(n,i){var s,e,c,r=this.cache[i]&&this.cache[i][n];return"undefined"!=typeof r?r:((e=this.regex[n])||(s="^"+t.map(n.split("."),function(t){var n="";return c&&(n="#"!==c?"\\.\\b":"\\b"),n+="#"===t?"[\\s\\S]*":"*"===t?"[^.]+":t,c=t,n}).join("")+"$",e=this.regex[n]=new RegExp(s)),this.cache[i]=this.cache[i]||{},this.cache[i][n]=r=e.test(i),r)},reset:function(){this.cache={},this.regex={}}},a=function(n,s){!n.inactive&&i.configuration.resolver.compare(n.topic,s.topic)&&t.all(n.constraints,function(t){return t.call(n.context,s.data,s)})&&"function"==typeof n.callback&&n.callback.call(n.context,s.data,s)},u=0,h=[],l=function(){for(;h.length;)f.unsubscribe(h.shift())},f={addWireTap:function(t){var n=this;return n.wireTaps.push(t),function(){var i=n.wireTaps.indexOf(t);-1!==i&&n.wireTaps.splice(i,1)}},publish:function(n){return++u,n.timeStamp=new Date,t.each(this.wireTaps,function(t){t(n.data,n)}),this.subscriptions[n.channel]&&t.each(this.subscriptions[n.channel],function(t){for(var i,s=0,e=t.length;e>s;)(i=t[s++])&&a(i,n)}),0===--u&&l(),n},reset:function(){this.subscriptions&&(t.each(this.subscriptions,function(n){t.each(n,function(t){for(;t.length;)t.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(t){var n,i=this.subscriptions[t.channel];return i||(i=this.subscriptions[t.channel]={}),n=this.subscriptions[t.channel][t.topic],n||(n=this.subscriptions[t.channel][t.topic]=[]),n.push(t),t},subscriptions:{},wireTaps:[],unsubscribe:function(t){if(u)return void h.push(t);if(this.subscriptions[t.channel][t.topic])for(var n=this.subscriptions[t.channel][t.topic].length,i=0;n>i;){if(this.subscriptions[t.channel][t.topic][i]===t){this.subscriptions[t.channel][t.topic].splice(i,1);break}i+=1}}};if(i={configuration:{bus:f,resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},ChannelDefinition:c,SubscriptionDefinition:r,channel:function(t){return new c(t)},subscribe:function(t){return new r(t.channel||i.configuration.DEFAULT_CHANNEL,t.topic,t.callback)},publish:function(t){return t.channel=t.channel||i.configuration.DEFAULT_CHANNEL,i.configuration.bus.publish(t)},addWireTap:function(t){return this.configuration.bus.addWireTap(t)},linkChannels:function(n,s){var e=[];return n=t.isArray(n)?n:[n],s=t.isArray(s)?s:[s],t.each(n,function(n){var c=n.topic||"#";t.each(s,function(s){var r=s.channel||i.configuration.DEFAULT_CHANNEL;e.push(i.subscribe({channel:n.channel||i.configuration.DEFAULT_CHANNEL,topic:c,callback:function(n,e){var c=t.clone(e);c.topic=t.isFunction(s.topic)?s.topic(e.topic):s.topic||e.topic,c.channel=r,c.data=n,i.publish(c)}}))})}),e},utils:{getSubscribersFor:function(){var t=arguments[0],n=arguments[1];return 1===arguments.length&&(t=arguments[0].channel||i.configuration.DEFAULT_CHANNEL,n=arguments[0].topic),i.configuration.bus.subscriptions[t]&&Object.prototype.hasOwnProperty.call(i.configuration.bus.subscriptions[t],n)?i.configuration.bus.subscriptions[t][n]:[]},reset:function(){i.configuration.bus.reset(),i.configuration.resolver.reset()}}},f.subscriptions[i.configuration.SYSTEM_CHANNEL]={},n&&Object.prototype.hasOwnProperty.call(n,"__postalReady__")&&t.isArray(n.__postalReady__))for(;n.__postalReady__.length;)n.__postalReady__.shift().onReady(i);return i});
\ No newline at end of file
diff --git a/package.json b/package.json
index 0ce220a..e2b31f6 100755
--- a/package.json
+++ b/package.json
@@ -1,106 +1,113 @@
{
- "name": "postal",
- "description": "Pub/Sub library providing wildcard subscriptions, complex message handling, etc. Works server and client-side.",
- "version": "0.8.11",
- "homepage": "http://github.com/postaljs/postal.js",
- "repository": {
- "type": "git",
- "url": "git://github.com/postaljs/postal.js.git"
- },
- "author": "Jim Cowart (http://freshbrewedcode.com/jimcowart)",
- "contributors": [
- {
- "name": "Jim Cowart",
- "email": "WhyNotJustComment@OnMyBlog.com",
- "url": "http://freshbrewedcode.com/jimcowart"
+ "name": "postal",
+ "description": "Pub/Sub library providing wildcard subscriptions, complex message handling, etc. Works server and client-side.",
+ "version": "0.8.11",
+ "homepage": "http://github.com/postaljs/postal.js",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/postaljs/postal.js.git"
},
- {
- "name": "Alex Robson",
- "email": "WhyNotJustComment@OnMyBlog.com",
- "url": "http://freshbrewedcode.com/alexrobson"
+ "author": "Jim Cowart (http://freshbrewedcode.com/jimcowart)",
+ "contributors": [
+ {
+ "name": "Jim Cowart",
+ "email": "WhyNotJustComment@OnMyBlog.com",
+ "url": "http://freshbrewedcode.com/jimcowart"
+ },
+ {
+ "name": "Alex Robson",
+ "email": "WhyNotJustComment@OnMyBlog.com",
+ "url": "http://freshbrewedcode.com/alexrobson"
+ },
+ {
+ "name": "Nicholas Cloud",
+ "email": "WhyNotJustComment@OnMyBlog.com",
+ "url": "http://nicholascloud.com"
+ },
+ {
+ "name": "Doug Neiner",
+ "email": "WhyNotJustComment@OnMyBlog.com",
+ "url": "http://dougneiner.com"
+ },
+ {
+ "name": "Jonathan Creamer",
+ "email": "WhyNotJustComment@OnMyBlog.com",
+ "url": "http://freshbrewedcode.com/jonathancreamer"
+ },
+ {
+ "name": "Elijah Manor",
+ "email": "WhyNotJustComment@OnMyBlog.com",
+ "url": "http://www.elijahmanor.com"
+ },
+ {
+ "name": "Ger Hobbelt",
+ "email": "ger@hobbelt.com",
+ "url": "http://hebbut.net/"
+ },
+ {
+ "name": "Christian Haas",
+ "url": "http://github.com/dertseha"
+ }
+ ],
+ "keywords": [
+ "pub/sub",
+ "pub",
+ "sub",
+ "messaging",
+ "message",
+ "bus",
+ "event",
+ "mediator",
+ "broker",
+ "envelope"
+ ],
+ "bugs": {
+ "email": "PleaseJustUseTheIssuesPage@github.com",
+ "url": "http://github.com/postaljs/postal.js/issues"
},
- {
- "name": "Nicholas Cloud",
- "email": "WhyNotJustComment@OnMyBlog.com",
- "url": "http://nicholascloud.com"
+ "directories": {
+ "lib": "lib"
},
- {
- "name": "Doug Neiner",
- "email": "WhyNotJustComment@OnMyBlog.com",
- "url": "http://dougneiner.com"
+ "main": "lib/postal.js",
+ "engines": {
+ "node": ">=0.4.0"
},
- {
- "name": "Jonathan Creamer",
- "email": "WhyNotJustComment@OnMyBlog.com",
- "url": "http://freshbrewedcode.com/jonathancreamer"
+ "dependencies": {
+ "underscore": "~1.5.2"
},
- {
- "name": "Elijah Manor",
- "email": "WhyNotJustComment@OnMyBlog.com",
- "url": "http://www.elijahmanor.com"
+ "bundleDependencies": [
+ "underscore"
+ ],
+ "devDependencies": {
+ "bower": "~1.2.8",
+ "gulp-util": "~2.2.9",
+ "gulp": "~3.3.1",
+ "gulp-imports": "~0.0.1",
+ "gulp-header": "~1.0.2",
+ "gulp-hint-not": "~0.0.3",
+ "gulp-uglify": "~0.1.0",
+ "gulp-rename": "~0.2.1",
+ "gulp-plato": "~0.1.0",
+ "gulp-beautify": "~1.0.3",
+ "tiny-lr": "0.0.5",
+ "express": "~3.4.7",
+ "gulp-rimraf": "0.0.8",
+ "open": "~0.0.4",
+ "expect.js": "~0.2.0"
},
- {
- "name": "Ger Hobbelt",
- "email": "ger@hobbelt.com",
- "url": "http://hebbut.net/"
- },
- {
- "name": "Christian Haas",
- "url": "http://github.com/dertseha"
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/mit-license.php"
+ },
+ {
+ "type": "GPL",
+ "url": "http://www.opensource.org/licenses/gpl-3.0.html"
+ }
+ ],
+ "scripts": {
+ "test": "mocha ./spec/*.js",
+ "build": "gulp",
+ "start": "gulp server"
}
- ],
- "keywords": [
- "pub/sub",
- "pub",
- "sub",
- "messaging",
- "message",
- "bus",
- "event",
- "mediator",
- "broker",
- "envelope"
- ],
- "bugs": {
- "email": "PleaseJustUseTheIssuesPage@github.com",
- "url": "http://github.com/postaljs/postal.js/issues"
- },
- "directories": {
- "lib": "lib"
- },
- "main": "lib/postal.js",
- "engines": {
- "node": ">=0.4.0"
- },
- "dependencies": {
- "underscore": ">=1.1.7"
- },
- "bundleDependencies": [
- "underscore"
- ],
- "devDependencies": {
- "gulp-util": "~2.2.9",
- "gulp": "~3.3.1",
- "gulp-imports": "~0.0.1",
- "gulp-header": "~1.0.2",
- "gulp-hint-not": "~0.0.3",
- "gulp-uglify": "~0.1.0",
- "gulp-rename": "~0.2.1",
- "gulp-plato": "~0.1.0",
- "gulp-beautify": "~1.0.3",
- "tiny-lr": "0.0.5",
- "express": "~3.4.7",
- "gulp-rimraf": "0.0.8",
- "open": "~0.0.4"
- },
- "licenses": [
- {
- "type": "MIT",
- "url": "http://www.opensource.org/licenses/mit-license.php"
- },
- {
- "type": "GPL",
- "url": "http://www.opensource.org/licenses/gpl-3.0.html"
- }
- ]
}
diff --git a/spec/bindingsResolver.spec.js b/spec/bindingsResolver.spec.js
index 37aa6d4..7db8733 100644
--- a/spec/bindingsResolver.spec.js
+++ b/spec/bindingsResolver.spec.js
@@ -1,5 +1,7 @@
/* global describe, postal, it, after, before, expect */
(function(){
+ var postal = typeof window === "undefined" ? require("../lib/postal.js")() : window.postal;
+ var expect = typeof window === "undefined" ? require("expect.js") : window.expect;
var bindingsResolver = postal.configuration.resolver;
describe( "amqpBindingsResolver", function () {
describe( "When calling compare", function () {
diff --git a/spec/channelDefinition.spec.js b/spec/channelDefinition.spec.js
index 4220e5f..1a1a4aa 100644
--- a/spec/channelDefinition.spec.js
+++ b/spec/channelDefinition.spec.js
@@ -1,5 +1,7 @@
/* global describe, postal, it, after, before, expect */
(function(){
+ var postal = typeof window === "undefined" ? require("../lib/postal.js")() : window.postal;
+ var expect = typeof window === "undefined" ? require("expect.js") : window.expect;
var ChannelDefinition = postal.ChannelDefinition;
describe( "channel definition", function () {
describe( "When using global channel api", function () {
diff --git a/spec/index.html b/spec/index.html
index 8b82eca..d69f864 100644
--- a/spec/index.html
+++ b/spec/index.html
@@ -1,15 +1,15 @@
-
+
-
-
-
-
+
+
+
+
diff --git a/spec/linkedChannels.spec.js b/spec/linkedChannels.spec.js
index 782a9c4..7617e64 100644
--- a/spec/linkedChannels.spec.js
+++ b/spec/linkedChannels.spec.js
@@ -1,5 +1,7 @@
/* global describe, postal, it, after, before, expect */
(function() {
+ var postal = typeof window === "undefined" ? require("../lib/postal.js")() : window.postal;
+ var expect = typeof window === "undefined" ? require("expect.js") : window.expect;
var subscription;
describe("linked channels", function () {
describe( "When binding channel - one source to one destination", function () {
diff --git a/spec/postaljs.spec.js b/spec/postaljs.spec.js
index 1fe5ecb..7b75bf5 100644
--- a/spec/postaljs.spec.js
+++ b/spec/postaljs.spec.js
@@ -1,5 +1,8 @@
/* global describe, postal, it, after, before, expect */
(function() {
+ var postal = typeof window === "undefined" ? require("../lib/postal.js")() : window.postal;
+ var expect = typeof window === "undefined" ? require("expect.js") : window.expect;
+ var _ = typeof window === "undefined" ? require("underscore") : window._;
var subscription;
var sub;
var channel;
@@ -15,9 +18,9 @@
topic : "subscription.created",
callback : function ( data, envelope ) {
if ( data.event &&
- data.event == "subscription.created" &&
- data.channel == "MyChannel" &&
- data.topic == "MyTopic" ) {
+ data.event === "subscription.created" &&
+ data.channel === "MyChannel" &&
+ data.topic === "MyTopic" ) {
caughtSubscribeEvent = true;
}
}
@@ -235,7 +238,7 @@
expect( results[0] ).to.be( 6 );
expect( results.length ).to.be( 1 );
done();
- }, 2400 );
+ }, 1900 );
} );
} );
describe( "When subscribing with defer", function () {
@@ -450,8 +453,8 @@
}
setTimeout( function () {
expect( results[0] ).to.be( 1 );
- expect( results[1] ).to.be( 800 );
- expect( results.length ).to.be( 2 );
+ expect( results[2] ).to.be( 800 );
+ expect( results.length ).to.be( 3 );
done();
}, 1500 );
} );
diff --git a/spec/subscriptionDefinition.spec.js b/spec/subscriptionDefinition.spec.js
index 78e68ff..b725582 100644
--- a/spec/subscriptionDefinition.spec.js
+++ b/spec/subscriptionDefinition.spec.js
@@ -1,5 +1,7 @@
/* global describe, postal, it, after, before, expect */
(function() {
+ var postal = typeof window === "undefined" ? require("../lib/postal.js")() : window.postal;
+ var expect = typeof window === "undefined" ? require("expect.js") : window.expect;
var NO_OP = function () {};
var SubscriptionDefinition = postal.SubscriptionDefinition;
describe( "SubscriptionDefinition", function () {
@@ -85,7 +87,7 @@
return true;
} );
- postal.publish( { channel : "TestChannel", topic : "TestTopic", data : "Oh, hai"} )
+ postal.publish( { channel : "TestChannel", topic : "TestTopic", data : "Oh, hai"} );
it( "Should set context", function () {
expect( sDefd.context ).to.be( obj );
@@ -146,17 +148,16 @@
} );
describe( "When throttling the callback", function () {
- var results = [],
- sDefe = new SubscriptionDefinition( "ThrottleTest", "TestTopic", function ( data ) {
- results.push( data );
- } ).withThrottle( 500 );
- var timeout1, timeout2;
it( "should have only invoked throttled callback twice", function ( done ) {
- sDefe.callback( 1 ); // starts the two second clock on debounce
+ var results = [], timeout1, timeout2;
+ var sDefe = new SubscriptionDefinition( "ThrottleTest", "TestTopic", function ( data ) {
+ results.push( data );
+ } ).withThrottle( 1200, { leading: true } );
+ sDefe.callback( 1 ); // starts the clock on throttle
timeout1 = setTimeout( function () {
- sDefe.callback( 800 );
- }, 900 ); // should invoke callback
+ sDefe.callback( 700 );
+ }, 700 ); // should invoke callback
for ( var i = 0; i < 20; i++ ) {
(function ( x ) {
sDefe.callback( x );
@@ -164,13 +165,16 @@
}
timeout2 = setTimeout( function () {
expect( results[0] ).to.be( 1 );
- expect( results[1] ).to.be( 800 );
expect( results.length ).to.be( 2 );
done();
}, 1500 );
} );
it( "Should keep the context intact", function( done ) {
+ var results = [], timeout1, timeout2;
+ var sDefe = new SubscriptionDefinition( "ThrottleTest", "TestTopic", function ( data ) {
+ results.push( data );
+ } ).withThrottle( 1000, { leading: true } );
var context = {
key : 'abcd'
};
@@ -231,7 +235,7 @@
expect( results[0] ).to.be( 6 );
expect( results.length ).to.be( 1 );
done();
- }, 2300 );
+ }, 1800 );
} );
it( "Should keep the context intact", function ( done ) {
diff --git a/spec/utils.spec.js b/spec/utils.spec.js
index 7b694ea..262ee1b 100644
--- a/spec/utils.spec.js
+++ b/spec/utils.spec.js
@@ -1,5 +1,8 @@
/* global describe, postal, it, after, before, expect */
(function() {
+ var postal = typeof window === "undefined" ? require("../lib/postal.js")() : window.postal;
+ var expect = typeof window === "undefined" ? require("expect.js") : window.expect;
+ var _ = typeof window === "undefined" ? require("underscore") : window._;
var NO_OP = function() {};
var subscription;
var sub;
diff --git a/src/SubscriptionDefinition.js b/src/SubscriptionDefinition.js
index 7d1e04b..920795c 100644
--- a/src/SubscriptionDefinition.js
+++ b/src/SubscriptionDefinition.js
@@ -130,12 +130,13 @@ SubscriptionDefinition.prototype = {
return this;
},
- withThrottle : function ( milliseconds ) {
+ withThrottle : function ( milliseconds, options ) {
+ options = options || { };
if ( _.isNaN( milliseconds ) ) {
throw "Milliseconds must be a number";
}
var fn = this.callback;
- this.callback = _.throttle( fn, milliseconds );
+ this.callback = _.throttle( fn, milliseconds, options );
return this;
},