- Postal Examples (AMD/require.js Lib Format)
-
-
+ Postal Examples (AMD/require.js Lib Format)
+
+
-
- Example 1 - The World's Simplest Subscription
-
-
+
+ Example 1 - The World's Simplest Subscription
+
+
-
- Example 2 - Subscribing with the "#" wildcard character
-
-
+
+ Example 2 - Subscribing with the "#" wildcard character
+
+
-
- Example 3 - Subscribing with the "*" wildcard character
-
-
+
+ Example 3 - Subscribing with the "*" wildcard character
+
+
-
- Example 4 - using ignoreDuplicates()
-
-
+
+ Example 4 - using ignoreDuplicates()
+
+
-
- Example 5 - using disposeAfter(X)
-
-
+
+ Example 5 - using disposeAfter(X)
+
+
-
- Example 6 - using withConstraint() to apply a predicate to subscription callback
-
-
+
+ Example 6 - using withConstraint() to apply a predicate to subscription callback
+
+
-
- Example 7 - using withContext to set the "this" context
-
-
+
+ Example 7 - using withContext to set the "this" context
+
+
-
- Example 8 - using withDelay to delay evaluation of subscription
-
-
+
+ Example 8 - using withDelay to delay evaluation of subscription
+
+
\ No newline at end of file
diff --git a/example/amd/js/examples.js b/example/amd/js/examples.js
index f333a02..d6884e9 100644
--- a/example/amd/js/examples.js
+++ b/example/amd/js/examples.js
@@ -1,11 +1,13 @@
-define(['postal', 'postaldiags'], function(postal, diags){
+define( ['postal', 'postaldiags'], function ( postal, diags ) {
// The world's simplest subscription
- var channel = postal.channel("Name.Changed");
+ var channel = postal.channel( "Name.Changed" );
// subscribe
- var subscription = channel.subscribe(function(data) { $("#example1").html("Name: " + data.name); });
+ var subscription = channel.subscribe( function ( data ) {
+ $( "#example1" ).html( "Name: " + data.name );
+ } );
// And someone publishes a first name change:
- channel.publish({ name: "Dr. Who" });
+ channel.publish( { name : "Dr. Who" } );
subscription.unsubscribe();
@@ -13,14 +15,14 @@ define(['postal', 'postaldiags'], function(postal, diags){
// The # symbol represents "one word" in a topic (i.e - the text between two periods of a topic).
// By subscribing to "#.Changed", the binding will match
// Name.Changed & Location.Changed but *not* for Changed.Companion
- var hashChannel = postal.channel("#.Changed"),
- chgSubscription = hashChannel.subscribe(function(data) {
- $('
' ).appendTo( "#example2" );
+ } );
+ postal.channel( "Name.Changed" )
+ .publish( { type : "Name", value : "John Smith" } );
+ postal.channel( "Location.Changed" )
+ .publish( { type : "Location", value : "Early 20th Century England" } );
chgSubscription.unsubscribe();
@@ -28,94 +30,101 @@ define(['postal', 'postaldiags'], function(postal, diags){
// The * symbol represents any number of characters/words in a topic string.
// By subscribing to "DrWho.*.Changed", the binding will match
// DrWho.NinthDoctor.Companion.Changed & DrWho.Location.Changed but *not* Changed
- var starChannel = postal.channel("DrWho.*.Changed"),
- starSubscription = starChannel.subscribe(function(data) {
- $('
' ).appendTo( "#example3" );
+ } );
+ postal.channel( "DrWho.NinthDoctor.Companion.Changed" )
+ .publish( { type : "Companion Name", value : "Rose" } );
+ postal.channel( "DrWho.TenthDoctor.Companion.Changed" )
+ .publish( { type : "Companion Name", value : "Martha" } );
+ postal.channel( "DrWho.Eleventh.Companion.Changed" )
+ .publish( { type : "Companion Name", value : "Amy" } );
+ postal.channel( "DrWho.Location.Changed" )
+ .publish( { type : "Location", value : "The Library" } );
+ postal.channel( "TheMaster.DrumBeat.Changed" )
+ .publish( { type : "DrumBeat", value : "This won't trigger any subscriptions" } );
+ postal.channel( "Changed" )
+ .publish( { type : "Useless", value : "This won't trigger any subscriptions either" } );
starSubscription.unsubscribe();
// Applying ignoreDuplicates to a subscription
- var dupChannel = postal.channel("WeepingAngel.*"),
- dupSubscription = dupChannel.subscribe(function(data) {
- $('
' + data.value + '
').appendTo("#example4");
- }).ignoreDuplicates();
- postal.channel("WeepingAngel.DontBlink")
- .publish({ value:"Don't Blink" });
- postal.channel("WeepingAngel.DontBlink")
- .publish({ value:"Don't Blink" });
- postal.channel("WeepingAngel.DontEvenBlink")
- .publish({ value:"Don't Even Blink" });
- postal.channel("WeepingAngel.DontBlink")
- .publish({ value:"Don't Close Your Eyes" });
+ var dupChannel = postal.channel( "WeepingAngel.*" ),
+ dupSubscription = dupChannel.subscribe(
+ function ( data ) {
+ $( '
' + data.value + '
' ).appendTo( "#example4" );
+ } ).ignoreDuplicates();
+ postal.channel( "WeepingAngel.DontBlink" )
+ .publish( { value : "Don't Blink" } );
+ postal.channel( "WeepingAngel.DontBlink" )
+ .publish( { value : "Don't Blink" } );
+ postal.channel( "WeepingAngel.DontEvenBlink" )
+ .publish( { value : "Don't Even Blink" } );
+ postal.channel( "WeepingAngel.DontBlink" )
+ .publish( { value : "Don't Close Your Eyes" } );
dupSubscription.unsubscribe();
// Using disposeAfter(X) to remove subscription automagically after X number of receives
- var daChannel = postal.channel("Donna.Noble.*"),
- daSubscription = daChannel.subscribe(function(data) {
- $('
' + data.value + '
').appendTo("#example5");
- }).disposeAfter(2);
- postal.channel("Donna.Noble.ScreamingAgain")
- .publish({ value:"Donna Noble has left the library." });
- postal.channel("Donna.Noble.ScreamingAgain")
- .publish({ value:"Donna Noble has left the library." });
- postal.channel("Donna.Noble.ScreamingAgain")
- .publish({ value:"Donna Noble has left the library." });
- postal.channel("Donna.Noble.ScreamingAgain")
- .publish({ value:"Donna Noble has left the library." });
- postal.channel("Donna.Noble.ScreamingAgain")
- .publish({ value:"Donna Noble has left the library." });
+ var daChannel = postal.channel( "Donna.Noble.*" ),
+ daSubscription = daChannel.subscribe(
+ function ( data ) {
+ $( '
' + data.value + '
' ).appendTo( "#example5" );
+ } ).disposeAfter( 2 );
+ postal.channel( "Donna.Noble.ScreamingAgain" )
+ .publish( { value : "Donna Noble has left the library." } );
+ postal.channel( "Donna.Noble.ScreamingAgain" )
+ .publish( { value : "Donna Noble has left the library." } );
+ postal.channel( "Donna.Noble.ScreamingAgain" )
+ .publish( { value : "Donna Noble has left the library." } );
+ postal.channel( "Donna.Noble.ScreamingAgain" )
+ .publish( { value : "Donna Noble has left the library." } );
+ postal.channel( "Donna.Noble.ScreamingAgain" )
+ .publish( { value : "Donna Noble has left the library." } );
daSubscription.unsubscribe();
// Using withConstraint to apply a predicate to the subscription
var drIsInTheTardis = false,
- wcChannel = postal.channel("Tardis.Depart"),
- wcSubscription = wcChannel.subscribe(function(data) {
- $('
' + data.value + '
').appendTo("#example6");
- }).withConstraint(function() { return drIsInTheTardis; } );
- postal.channel("Tardis.Depart")
- .publish({ value:"Time for time travel....fantastic!" });
- postal.channel("Tardis.Depart")
- .publish({ value:"Time for time travel....fantastic!" });
+ wcChannel = postal.channel( "Tardis.Depart" ),
+ wcSubscription = wcChannel.subscribe(
+ function ( data ) {
+ $( '
' + data.value + '
' ).appendTo( "#example6" );
+ } ).withConstraint( function () {
+ return drIsInTheTardis;
+ } );
+ postal.channel( "Tardis.Depart" )
+ .publish( { value : "Time for time travel....fantastic!" } );
+ postal.channel( "Tardis.Depart" )
+ .publish( { value : "Time for time travel....fantastic!" } );
drIsInTheTardis = true;
- postal.channel("Tardis.Depart")
- .publish({ value:"Time for time travel....fantastic!" });
+ postal.channel( "Tardis.Depart" )
+ .publish( { value : "Time for time travel....fantastic!" } );
wcSubscription.unsubscribe();
// Using withContext to set the "this" context
- var ctxChannel = postal.channel("Dalek.Meet.CyberMen"),
- ctxSubscription = ctxChannel.subscribe(function(data) {
- $('
"&&!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=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/node/client/js/infrastructure/app.js b/example/node/client/js/infrastructure/app.js
index 69159ec..91eb029 100644
--- a/example/node/client/js/infrastructure/app.js
+++ b/example/node/client/js/infrastructure/app.js
@@ -1,4 +1,4 @@
-define([
+define( [
'jquery',
'backbone',
'bus',
@@ -12,41 +12,40 @@ define([
'views/hash-tag-count',
'views/profanity-percentage',
'views/search-requests'
-], function( $, Backbone, bus, Router, ViewManager, ContainerView, MenuView, TweetCountView, MentionCountView,
- MentionerCountView, HashTagCountView, ProfanityPercentage, SearchRequestView ) {
+], function ( $, Backbone, bus, Router, ViewManager, ContainerView, MenuView, TweetCountView, MentionCountView, MentionerCountView, HashTagCountView, ProfanityPercentage, SearchRequestView ) {
var app = {
- bus: bus,
- router: new Router()
+ bus : bus,
+ router : new Router()
};
// Set up UI concerns
app.viewManager = new ViewManager();
- app.bus.viewManager.subscribe( "ui.show", function( data, env ) {
+ app.bus.viewManager.subscribe( "ui.show", function ( data, env ) {
app.viewManager.UI[ data.name ].activate( data.context );
- });
+ } );
- app.viewManager.registerViews([
- { name: "container", ctor: ContainerView },
- { name: "menu", ctor: MenuView },
- { name: "tweetCount", ctor: TweetCountView },
- { name: "mentionCount", ctor: MentionCountView },
- { name: "mentionerCount", ctor: MentionerCountView },
- { name: "hashTagCount", ctor: HashTagCountView },
- { name: "profanityPercentage", ctor: ProfanityPercentage },
- { name: "searchRequests", ctor: SearchRequestView }
- ]);
- app.viewManager.defineUIs([
- { name: "homeUI", dependencies: [ "container", "menu", "tweetCount", "mentionCount", "mentionerCount", "hashTagCount", "profanityPercentage" ] },
- { name: "searchRequestUI", dependencies: [ "container", "menu", "searchRequests" ] },
- { name: "wireTapLogUI", dependencies: [ "menu" ], options: { noHide: true } }
- ]);
+ app.viewManager.registerViews( [
+ { name : "container", ctor : ContainerView },
+ { name : "menu", ctor : MenuView },
+ { name : "tweetCount", ctor : TweetCountView },
+ { name : "mentionCount", ctor : MentionCountView },
+ { name : "mentionerCount", ctor : MentionerCountView },
+ { name : "hashTagCount", ctor : HashTagCountView },
+ { name : "profanityPercentage", ctor : ProfanityPercentage },
+ { name : "searchRequests", ctor : SearchRequestView }
+ ] );
+ app.viewManager.defineUIs( [
+ { name : "homeUI", dependencies : [ "container", "menu", "tweetCount", "mentionCount", "mentionerCount", "hashTagCount", "profanityPercentage" ] },
+ { name : "searchRequestUI", dependencies : [ "container", "menu", "searchRequests" ] },
+ { name : "wireTapLogUI", dependencies : [ "menu" ], options : { noHide : true } }
+ ] );
- $(function() {
- Backbone.history.start({
- pushState: true,
- root: $( "base" ).attr( "href" )
- });
- });
+ $( function () {
+ Backbone.history.start( {
+ pushState : true,
+ root : $( "base" ).attr( "href" )
+ } );
+ } );
return app;
-});
\ No newline at end of file
+} );
\ No newline at end of file
diff --git a/example/node/client/js/infrastructure/bus.js b/example/node/client/js/infrastructure/bus.js
index 1e5ecdf..afb50a7 100644
--- a/example/node/client/js/infrastructure/bus.js
+++ b/example/node/client/js/infrastructure/bus.js
@@ -1,11 +1,11 @@
-define([
+define( [
'postal'
], function ( postal ) {
return {
- router : postal.channel( "router", "*" ),
+ router : postal.channel( "router", "*" ),
viewManager : postal.channel( "viewmanager", "*" ),
- data : postal.channel( "data", "*" ),
- app : postal.channel( "statsApp", "*", { type: "websocket" } ),
- stats : postal.channel( "stats", "*", { type: "websocket" } )
+ data : postal.channel( "data", "*" ),
+ app : postal.channel( "statsApp", "*", { type : "websocket" } ),
+ stats : postal.channel( "stats", "*", { type : "websocket" } )
}
-});
\ No newline at end of file
+} );
\ No newline at end of file
diff --git a/example/node/client/js/infrastructure/postal.socket-client.js b/example/node/client/js/infrastructure/postal.socket-client.js
index d3b1c07..2a56270 100644
--- a/example/node/client/js/infrastructure/postal.socket-client.js
+++ b/example/node/client/js/infrastructure/postal.socket-client.js
@@ -1,315 +1,298 @@
-/*
- postal.socket
- Author: Jim Cowart
- License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
- Version 0.1.0
-*/
+/*
+ postal.socket
+ Author: Jim Cowart
+ License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
+ Version 0.1.0
+ */
-(function( root, doc, factory ) {
+(function ( root, doc, factory ) {
if ( typeof define === "function" && define.amd ) {
// AMD. Register as an anonymous module.
- define( [ "underscore", "machina", "postal" ], function( _, machina, postal ) {
+ define( [ "underscore", "machina", "postal" ], function ( _, machina, postal ) {
return factory( _, machina, postal, root, doc );
- });
+ } );
} else {
// Browser globals
factory( root._, root.machina, root.postal, root, doc );
}
-}(this, document, function( _, machina, postal, global, document, undefined ) {
+}( this, document, function ( _, machina, postal, global, document, undefined ) {
/*
- adding a socket namespace to postal
- which provides the following members:
- 1.) config - provides values used to manage the socket connection
- 2.) goOffline() - tells the manager to close the connection intentionally
- 3.) goOnline() - tells the manager to try to connect.
- 4.) manifest - an array of objects describing the subscriptions that have been
- set up on the remote end.
- 5.) publish() - takes a valid postal envelope and pushes it through the socket
- to be published to the server instance of postal.
- 6.) socketMgr - the FSM managing the socket connection
- 7.) socketNamespace - exposed currently for debugging only
- 8.) subscribe() - passes an object through the socket to the server
- which contains data necessary to set up a remote subscription. The
- options passed to the socket would look similar to this:
- {
- "channel":"SomeChannel",
- "topic":"my.topic",
- "correlationId":"2073383865318591267"
- }
- The "correlationId" is used on the remote side to apply a constraint to
- the subscription, enabling just this specific client to be targeted on
- and otherwise public channel.
- 9.) unsubscribe() - passes an object through the socket to the server
- which contains data necessary to remove a remote subscription. The options
- passed would look similar to the example above in #8.
+ adding a socket namespace to postal
+ which provides the following members:
+ 1.) config - provides values used to manage the socket connection
+ 2.) goOffline() - tells the manager to close the connection intentionally
+ 3.) goOnline() - tells the manager to try to connect.
+ 4.) manifest - an array of objects describing the subscriptions that have been
+ set up on the remote end.
+ 5.) publish() - takes a valid postal envelope and pushes it through the socket
+ to be published to the server instance of postal.
+ 6.) socketMgr - the FSM managing the socket connection
+ 7.) socketNamespace - exposed currently for debugging only
+ 8.) subscribe() - passes an object through the socket to the server
+ which contains data necessary to set up a remote subscription. The
+ options passed to the socket would look similar to this:
+ {
+ "channel":"SomeChannel",
+ "topic":"my.topic",
+ "correlationId":"2073383865318591267"
+ }
+ The "correlationId" is used on the remote side to apply a constraint to
+ the subscription, enabling just this specific client to be targeted on
+ and otherwise public channel.
+ 9.) unsubscribe() - passes an object through the socket to the server
+ which contains data necessary to remove a remote subscription. The options
+ passed would look similar to the example above in #8.
*/
postal.connections = postal.connections || {};
-
- var postalSocket = postal.connections.socket = (function(){
+
+ var postalSocket = postal.connections.socket = (function () {
var socketNamespace,
- fsm = new machina.Fsm({
- retryFn: undefined,
-
- session: undefined,
-
- wireUpSocketEvents: function() {
+ fsm = new machina.Fsm( {
+ retryFn : undefined,
+
+ session : undefined,
+
+ wireUpSocketEvents : function () {
var self = this;
- _.each([ "connect", "connecting", "connect_failed", "disconnect", "reconnect", "reconnect_failed",
- "reconnecting", "postal.socket.remote", "postal.socket.identified", "postal.socket.migration" ],
- function( evnt ) {
- socketNamespace.on( evnt, function( data ) {
+ _.each( [ "connect", "connecting", "connect_failed", "disconnect", "reconnect", "reconnect_failed",
+ "reconnecting", "postal.socket.remote", "postal.socket.identified", "postal.socket.migration" ],
+ function ( evnt ) {
+ socketNamespace.on( evnt, function ( data ) {
self.handle( evnt, data );
- });
- });
+ } );
+ } );
},
-
- states: {
- uninitialized: {
- tryConnect: function() {
- this.transition("initializing");
+
+ states : {
+ uninitialized : {
+ tryConnect : function () {
+ this.transition( "initializing" );
}
},
- initializing: {
- _onEnter: function() {
- socketNamespace = io.connect(postalSocket.config.url, { "auto connect": false });
+ initializing : {
+ _onEnter : function () {
+ socketNamespace = io.connect( postalSocket.config.url, { "auto connect" : false } );
this.wireUpSocketEvents();
- this.transition("probing")
+ this.transition( "probing" )
},
- socketTransmit: function() {
- this.deferUntilTransition("online");
+ socketTransmit : function () {
+ this.deferUntilTransition( "online" );
}
},
- probing: {
- _onEnter: function() {
- clearTimeout(this.retryFn);
- if(!socketNamespace.socket.connecting && !socketNamespace.socket.reconnecting) {
+ probing : {
+ _onEnter : function () {
+ clearTimeout( this.retryFn );
+ if ( !socketNamespace.socket.connecting && !socketNamespace.socket.reconnecting ) {
socketNamespace.socket.connect();
}
else {
- this.transition("settingSessionInfo");
+ this.transition( "settingSessionInfo" );
}
},
- connect: function(){
- this.transition("settingSessionInfo");
+ connect : function () {
+ this.transition( "settingSessionInfo" );
},
- connect_failed: function() {
- this.transition("disconnected");
+ connect_failed : function () {
+ this.transition( "disconnected" );
},
- maxAttempts: function() {
- this.transition("offline");
+ maxAttempts : function () {
+ this.transition( "offline" );
},
- "postal.socket.remote" : function() {
- this.deferUntilTransition("online");
+ "postal.socket.remote" : function () {
+ this.deferUntilTransition( "online" );
},
- reconnect: function(){
- this.transition("settingSessionInfo");
+ reconnect : function () {
+ this.transition( "settingSessionInfo" );
},
- reconnect_failed: function() {
- this.transition("disconnected");
+ reconnect_failed : function () {
+ this.transition( "disconnected" );
},
- socketTransmit: function() {
- this.deferUntilTransition("online");
+ socketTransmit : function () {
+ this.deferUntilTransition( "online" );
}
},
- settingSessionInfo: {
- _onEnter: function() {
+ settingSessionInfo : {
+ _onEnter : function () {
var self = this;
- postal.utils.getSessionId( function( session ) {
- if( !session || !session.id ) {
- self.handle("useFallbackSessionId" );
- } else {
- self.session = session;
- self.transition("identifying");
- }
- });
- },
- useFallbackSessionId : function () {
- var self = this;
- postal.utils.setSessionId( socketNamespace.socket.sessionid , function( session ) {
+ postal.utils.setSessionId( socketNamespace.socket.sessionid, function ( session ) {
self.session = session;
- self.transition("identifying");
- });
+ self.transition( "identifying" );
+ } );
}
},
- identifying: {
- _onEnter: function() {
+ identifying : {
+ _onEnter : function () {
var self = this;
- self.retryFn = setTimeout(function() {
+ self.retryFn = setTimeout( function () {
self.handle( "timeout.identifying" );
- },postalSocket.config.reconnectInterval );
+ }, postalSocket.config.reconnectInterval );
self.handle( "client.identifier" );
},
- "client.identifier" : function() {
+ "client.identifier" : function () {
clearTimeout( this.retryFn );
- socketNamespace.emit( "postal.clientId", { sessionId: this.session.id, lastSessionId: this.session.lastId } );
+ socketNamespace.emit( "postal.clientId", { id : this.session.id, lastId : this.session.lastId } );
},
- "postal.session.changed" : function() {
- socketNamespace.socket.disconnect();
+ connect_failed : function () {
+ this.transition( "disconnected" );
},
- connect_failed: function() {
- this.transition("disconnected");
+ disconnect : function () {
+ this.transition( "probing" );
},
- disconnect: function() {
- this.transition("probing");
+ "postal.socket.identified" : function ( data ) {
+ this.transition( "online" );
},
- "postal.socket.identified" : function( data ) {
- this.transition("online");
- },
- "postal.socket.migration" : function() {
- _.each(postal.socket.manifest, function( sub ) {
+ "postal.socket.migration" : function () {
+ _.each( postal.connections.socket.manifest, function ( sub ) {
fsm.handle( "socketTransmit", "postal.subscribe", sub );
- });
+ } );
socketNamespace.emit( "postal.migrationComplete", {} );
},
- "postal.socket.remote" : function() {
- this.deferUntilTransition("online");
+ "postal.socket.remote" : function () {
+ this.deferUntilTransition( "online" );
},
- reconnect_failed: function() {
- this.transition("disconnected");
+ reconnect_failed : function () {
+ this.transition( "disconnected" );
},
- socketTransmit: function( evntName, envelope ) {
- if( evntName === "postal.subscribe" ){
+ socketTransmit : function ( evntName, envelope ) {
+ if ( evntName === "postal.subscribe" ) {
// we risk mutating the message here, so extend
// and add the correlationId to the extended copy
var socketEnv = _.extend( {}, envelope );
socketEnv.correlationId = this.session.id;
- socketNamespace.emit(evntName, socketEnv);
+ socketNamespace.emit( evntName, socketEnv );
}
else {
- this.deferUntilTransition("online");
+ this.deferUntilTransition( "online" );
}
},
- "timeout.identifying" : function() {
- this.transition("probing");
+ "timeout.identifying" : function () {
+ this.transition( "probing" );
}
},
- online: {
- disconnect: function() {
- this.transition("probing");
+ online : {
+ disconnect : function () {
+ this.transition( "probing" );
},
- "postal.session.changed" : function() {
- socketNamespace.socket.disconnect();
+ goOffline : function () {
+ this.transition( "offline" );
},
- goOffline: function() {
- this.transition("offline");
- },
- "postal.socket.remote" : function( envelope ) {
+ "postal.socket.remote" : function ( envelope ) {
postal.publish( envelope );
},
- socketTransmit: function( evntName, envelope ) {
+ socketTransmit : function ( evntName, envelope ) {
// we risk mutating the message here, so extend
// and add the correlationId to the extended copy
var socketEnv = _.extend( {}, envelope );
socketEnv.correlationId = this.session.id;
- socketNamespace.emit(evntName, socketEnv);
+ socketNamespace.emit( evntName, socketEnv );
}
},
- offline: {
- _onEnter: function() {
+ offline : {
+ _onEnter : function () {
socketNamespace.socket.disconnect();
},
- socketTransmit: function() {
- this.deferUntilTransition("online");
+ socketTransmit : function () {
+ this.deferUntilTransition( "online" );
},
- "tryConnect": function() {
- this.transition("probing");
+ "tryConnect" : function () {
+ this.transition( "probing" );
}
},
- disconnected: {
- _onEnter: function() {
+ disconnected : {
+ _onEnter : function () {
var self = this;
- self.retryFn = setTimeout(function() {
- self.transition("probing");
- },postalSocket.config.reconnectInterval);
+ self.retryFn = setTimeout( function () {
+ self.transition( "probing" );
+ }, postalSocket.config.reconnectInterval );
},
- connecting: function() {
- this.transition("probing");
+ connecting : function () {
+ this.transition( "probing" );
},
- reconnecting: function() {
- this.transition("probing");
+ reconnecting : function () {
+ this.transition( "probing" );
},
- socketTransmit: function() {
- this.deferUntilTransition("online");
+ socketTransmit : function () {
+ this.deferUntilTransition( "online" );
}
}
}
- });
- postal.subscribe({
- channel: "postal",
- topic: "sessionId.changed",
- callback: function() {
- fsm.handle("postal.session.changed");
+ } );
+ postal.subscribe( {
+ channel : "postal",
+ topic : "sessionId.changed",
+ callback : function () {
+ fsm.handle( "postal.session.changed" );
}
- });
+ } );
return {
config : {
- url: window.location.origin,
- reconnectInterval: 4000
+ url : window.location.origin,
+ reconnectInterval : 4000
},
- goOffline: function() {
+ goOffline : function () {
fsm.handle( "goOffline" );
},
- goOnline: function() {
+ goOnline : function () {
fsm.handle( "tryConnect" );
},
- manifest: [],
- publish: function( envelope ) {
+ manifest : [],
+ publish : function ( envelope ) {
fsm.handle( "socketTransmit", "postal.publish", envelope );
},
- subscribe: function( options ) {
+ subscribe : function ( options ) {
options.channel = options.channel || postal.configuration.DEFAULT_CHANNEL;
options.topic = options.topic || "*";
- if( !_.any( this.manifest, function( item ){
+ if ( !_.any( this.manifest, function ( item ) {
return item.channel === options.channel && item.topic === options.topic;
- })) {
+ } ) ) {
this.manifest.push( options );
fsm.handle( "socketTransmit", "postal.subscribe", options );
}
},
- socketMgr: fsm,
- socketNamespace: socketNamespace,
- unsubscribe: function( options ) {
+ socketMgr : fsm,
+ socketNamespace : socketNamespace,
+ unsubscribe : function ( options ) {
options.channel = options.channel || postal.configuration.DEFAULT_CHANNEL;
options.topic = options.topic || "*";
- if( !postal.getSubscribersFor( options.channel, options.topic ).length ) {
- fsm.handle( "socketTransmit", "postal.unsubscribe", options);
+ if ( !postal.getSubscribersFor( options.channel, options.topic ).length ) {
+ fsm.handle( "socketTransmit", "postal.unsubscribe", options );
}
}
}
})();
-
+
postal.connections.socket.goOnline();
- var SocketChannel = postal.channelTypes.websocket = function( channelName, defaultTopic ) {
+ var SocketChannel = postal.channelTypes.websocket = function ( channelName, defaultTopic ) {
var channel = postal.channel( channelName, defaultTopic ),
localSubscribe = channel.subscribe,
localPublish = channel.publish,
localTopic = channel.topic;
-
- channel.publish = function() {
- postalSocket.publish( localPublish.apply( channel, arguments) );
+
+ channel.publish = function () {
+ postalSocket.publish( localPublish.apply( channel, arguments ) );
};
-
- channel.subscribe = function() {
- var sub = localSubscribe.apply( channel, arguments),
+
+ channel.subscribe = function () {
+ var sub = localSubscribe.apply( channel, arguments ),
origUnsubscribe;
origUnsubscribe = sub.unsubscribe;
- sub.unsubscribe = function() {
- origUnsubscribe.call(sub);
- postalSocket.unsubscribe({ channel: sub.channel, topic: sub.topic });
+ sub.unsubscribe = function () {
+ origUnsubscribe.call( sub );
+ postalSocket.unsubscribe( { channel : sub.channel, topic : sub.topic } );
};
- postalSocket.subscribe({ channel: sub.channel, topic: sub.topic });
+ postalSocket.subscribe( { channel : sub.channel, topic : sub.topic } );
return sub;
};
-
- channel.topic = function( topic ) {
- if(topic === channel._topic) {
+
+ channel.topic = function ( topic ) {
+ if ( topic === channel._topic ) {
return this;
}
- return new SocketChannel(this.channel, topic);
+ return new SocketChannel( this.channel, topic );
};
-
+
return channel;
};
-}));
\ No newline at end of file
+} ));
\ No newline at end of file
diff --git a/example/node/client/js/infrastructure/router.js b/example/node/client/js/infrastructure/router.js
index b2f35d0..efc8256 100644
--- a/example/node/client/js/infrastructure/router.js
+++ b/example/node/client/js/infrastructure/router.js
@@ -1,52 +1,52 @@
-define([
+define( [
'jquery',
'backbone',
'bus'
-], function( $, Backbone, bus ){
+], function ( $, Backbone, bus ) {
- return Backbone.Router.extend({
- routes: {
- "" : "home",
- "requests" : "requests",
- "wiretap" : "wiretap",
+ return Backbone.Router.extend( {
+ routes : {
+ "" : "home",
+ "requests" : "requests",
+ "wiretap" : "wiretap",
"*anything" : "redirect"
},
- initialize: function() {
+ initialize : function () {
var self = this;
_.bindAll( self );
- $( document ).delegate( "a.ps-nav", "click", function( e ){
+ $( document ).delegate( "a.ps-nav", "click", function ( e ) {
e.preventDefault();
- self.navigate( $( this ).attr( 'href' ), { trigger: true });
- });
+ self.navigate( $( this ).attr( 'href' ), { trigger : true } );
+ } );
bus.router.publish( "initialized" );
},
- activateUI: function( uiName, context ) {
- bus.viewManager.publish({
- topic: "ui.show",
- data: {
- name: uiName,
- context: context
+ activateUI : function ( uiName, context ) {
+ bus.viewManager.publish( {
+ topic : "ui.show",
+ data : {
+ name : uiName,
+ context : context
}
- });
+ } );
},
- home: function() {
+ home : function () {
this.activateUI( "homeUI" );
},
- requests: function() {
+ requests : function () {
this.activateUI( "searchRequestUI" );
},
- wiretap: function() {
+ wiretap : function () {
this.activateUI( "wireTapLogUI" );
},
- redirect: function() {
- this.navigate( "/", { trigger: true });
+ redirect : function () {
+ this.navigate( "/", { trigger : true } );
}
- });
-});
\ No newline at end of file
+ } );
+} );
\ No newline at end of file
diff --git a/example/node/client/js/infrastructure/view-manager.js b/example/node/client/js/infrastructure/view-manager.js
index 4adf9d7..2508575 100644
--- a/example/node/client/js/infrastructure/view-manager.js
+++ b/example/node/client/js/infrastructure/view-manager.js
@@ -1,8 +1,8 @@
-define([
+define( [
'underscore',
'bus'
-], function( _, bus ){
- var ViewManager = function() {
+], function ( _, bus ) {
+ var ViewManager = function () {
this.views = {}; // holds the views that are registered with the manager
this.UI = {}; // holds the UI configurations that are defined
this.priorContext = undefined; // holds the name of the last UI configuration
@@ -17,16 +17,16 @@ define([
// then the ViewManager will create a new instance of the view. If options.args
// exists, it will be passed into the constructor function of the view.
//----------------------------------------------------------------------------
- ViewManager.prototype.registerView = function(name, viewCtor) {
+ ViewManager.prototype.registerView = function ( name, viewCtor ) {
this.views[name] = {
- rendered: false,
- visible: false,
- getInstance: (function(){
+ rendered : false,
+ visible : false,
+ getInstance : (function () {
var _instance;
- return function(options){
+ return function ( options ) {
var _options = options || {};
- if(!_instance || _options.forceNew) {
- _instance = new viewCtor(_options.args || {});
+ if ( !_instance || _options.forceNew ) {
+ _instance = new viewCtor( _options.args || {} );
}
return _instance;
}
@@ -34,8 +34,8 @@ define([
}
};
- ViewManager.prototype.registerViews = function(views) {
- _.each( views, function( view ){
+ ViewManager.prototype.registerViews = function ( views ) {
+ _.each( views, function ( view ) {
this.registerView( view.name, view.ctor );
}, this );
};
@@ -46,76 +46,76 @@ define([
// name, second arg is the array of view names (in the order they need to be
// instantiated/rendered/shown)
//----------------------------------------------------------------------------
- ViewManager.prototype.defineUI = function( name, dependencies, options ) {
+ ViewManager.prototype.defineUI = function ( name, dependencies, options ) {
var self = this;
self.UI[ name ] = {
- options: options || {},
- dependencies: dependencies,
- activate: function( data ) {
+ options : options || {},
+ dependencies : dependencies,
+ activate : function ( data ) {
data = data || {};
data.priorContext = self.priorContext;
data.targetContext = name;
- if( !this.options.noHide ) {
+ if ( !this.options.noHide ) {
// hide anything visible that's not in the dependencies for this UI configuration
- var shouldHide = _.reduce( self.views, function( memo, val, key ){
- if( val.visible && !_.include( this.dependencies, key ) ){
+ var shouldHide = _.reduce( self.views, function ( memo, val, key ) {
+ if ( val.visible && !_.include( this.dependencies, key ) ) {
memo.push( key );
}
return memo;
}, [], this );
- _.each( shouldHide, function( viewName ){
+ _.each( shouldHide, function ( viewName ) {
var instance = self.views[ viewName ].getInstance();
- if( instance.hide ) {
+ if ( instance.hide ) {
instance.hide();
}
self.views[ viewName ].visible = false;
- });
+ } );
}
// set up, render & show the dependencies for this UI configuration
- _.each(this.dependencies, function(viewName){
- var instance = self.views[viewName].getInstance(data);
- if(!self.views[viewName].rendered) {
- instance.render(data);
+ _.each( this.dependencies, function ( viewName ) {
+ var instance = self.views[viewName].getInstance( data );
+ if ( !self.views[viewName].rendered ) {
+ instance.render( data );
self.views[viewName].rendered = true;
}
- if(!self.views[viewName].visible) {
- if(instance.show) {
- instance.show(data);
+ if ( !self.views[viewName].visible ) {
+ if ( instance.show ) {
+ instance.show( data );
}
self.views[viewName].visible = true;
}
- if(instance.update) {
- instance.update(data);
+ if ( instance.update ) {
+ instance.update( data );
}
- });
+ } );
self.priorContext = name;
}
};
};
- ViewManager.prototype.defineUIs = function( uis ) {
- _.each( uis, function( ui ){
+ ViewManager.prototype.defineUIs = function ( uis ) {
+ _.each( uis, function ( ui ) {
this.defineUI( ui.name, ui.dependencies, ui.options );
}, this );
};
- ViewManager.prototype.addViewToUI = function( uiName, viewName, viewCtor ) {
+ ViewManager.prototype.addViewToUI = function ( uiName, viewName, viewCtor ) {
var uis = _.isArray( uiName ) ? uiName : [ uiName ];
- if( !this.views[ viewName ] ) {
+ if ( !this.views[ viewName ] ) {
this.registerView( viewName, viewCtor );
}
- _.each( uis, function( ui ) {
- if( this.UI[ ui ] ) {
+ _.each( uis, function ( ui ) {
+ if ( this.UI[ ui ] ) {
this.UI[ ui ].dependencies.push( viewName );
}
}, this );
};
return ViewManager;
-});
\ No newline at end of file
+} );
\ No newline at end of file
diff --git a/example/node/client/js/lib/amplify.js b/example/node/client/js/lib/amplify.js
index 715e483..7394022 100644
--- a/example/node/client/js/lib/amplify.js
+++ b/example/node/client/js/lib/amplify.js
@@ -7,4 +7,354 @@
*
* http://amplifyjs.com
*/
-(function(a,b,c){typeof define=="function"&&define.amd?define(["jquery"],function(d){return c(d,a,b)}):c(a.jQuery,a,b)})(this,document,function(a,b,c,d){return function(a,b){var c=[].slice,d={},e=a.amplify={publish:function(a){var b=c.call(arguments,1),e,f,g,h=0,i;if(!d[a])return!0;e=d[a].slice();for(g=e.length;h=0;j--)if(d[a][j].priority<=e){d[a].splice(j+1,0,k),i=!0;break}i||d[a].unshift(k)}return c},unsubscribe:function(a,b){if(!d[a])return;var c=d[a].length,e=0;for(;e= 0; j-- ) {
+ if ( d[a][j].priority <= e ) {
+ d[a].splice( j + 1, 0, k ), i = !0;
+ break
+ }
+ }
+ i || d[a].unshift( k )
+ }
+ return c
+ }, unsubscribe : function ( a, b ) {
+ if ( !d[a] ) {
+ return;
+ }
+ var c = d[a].length, e = 0;
+ for ( ; e < c; e++ ) {
+ if ( d[a][e].callback === b ) {
+ d[a].splice( e, 1 );
+ break
+ }
+ }
+ }}
+ }( this ), function ( a, b ) {
+ function f( a, c ) {
+ d.addType( a, function ( f, g, h ) {
+ var i, j, k, l, m = g, n = (new Date).getTime();
+ if ( !f ) {
+ m = {}, l = [], k = 0;
+ try {
+ f = c.length;
+ while ( f = c.key( k++ ) ) {
+ e.test( f ) && (j = JSON.parse( c.getItem( f ) ), j.expires && j.expires <= n ? l.push( f ) : m[f.replace( e, "" )] = j.data);
+ }
+ while ( f = l.pop() ) {
+ c.removeItem( f )
+ }
+ } catch ( o ) {
+ }
+ return m
+ }
+ f = "__amplify__" + f;
+ if ( g === b ) {
+ i = c.getItem( f ), j = i ? JSON.parse( i ) : {expires : -1};
+ if ( !(j.expires && j.expires <= n) ) {
+ return j.data;
+ }
+ c.removeItem( f )
+ } else if ( g === null ) {
+ c.removeItem( f );
+ } else {
+ j = JSON.stringify( {data : g, expires : h.expires ? n + h.expires : null} );
+ try {
+ c.setItem( f, j )
+ } catch ( o ) {
+ d[a]();
+ try {
+ c.setItem( f, j )
+ } catch ( o ) {
+ throw d.error()
+ }
+ }
+ }
+ return m
+ } )
+ }
+
+ var d = a.store = function ( a, b, c, e ) {
+ var e = d.type;
+ return c && c.type && c.type in d.types && (e = c.type), d.types[e]( a, b, c || {} )
+ };
+ d.types = {}, d.type = null, d.addType = function ( a, b ) {
+ d.type || (d.type = a), d.types[a] = b, d[a] = function ( b, c, e ) {
+ return e = e || {}, e.type = a, d( b, c, e )
+ }
+ }, d.error = function () {
+ return"amplify.store quota exceeded"
+ };
+ var e = /^__amplify__/;
+ for ( var g in{localStorage : 1, sessionStorage : 1} ) {
+ try {
+ window[g].getItem && f( g, window[g] )
+ } catch ( h ) {
+ }
+ }
+ if ( !d.types.localStorage && window.globalStorage ) {
+ try {
+ f( "globalStorage", window.globalStorage[window.location.hostname] ), d.type === "sessionStorage" && (d.type = "globalStorage")
+ } catch ( h ) {
+ }
+ }
+ (function () {
+ if ( d.types.localStorage ) {
+ return;
+ }
+ var a = c.createElement( "div" ), e = "amplify";
+ a.style.display = "none", c.getElementsByTagName( "head" )[0].appendChild( a );
+ try {
+ a.addBehavior( "#default#userdata" ), a.load( e )
+ } catch ( f ) {
+ a.parentNode.removeChild( a );
+ return
+ }
+ d.addType( "userData", function ( c, f, g ) {
+ a.load( e );
+ var h, i, j, k, l, m = f, n = (new Date).getTime();
+ if ( !c ) {
+ m = {}, l = [], k = 0;
+ while ( h = a.XMLDocument.documentElement.attributes[k++] ) {
+ i = JSON.parse( h.value ), i.expires && i.expires <= n ? l.push( h.name ) : m[h.name] = i.data;
+ }
+ while ( c = l.pop() ) {
+ a.removeAttribute( c );
+ }
+ return a.save( e ), m
+ }
+ c = c.replace( /[^-._0-9A-Za-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u37f-\u1fff\u200c-\u200d\u203f\u2040\u2070-\u218f]/g, "-" ), c = c.replace( /^-/, "_-" );
+ if ( f === b ) {
+ h = a.getAttribute( c ), i = h ? JSON.parse( h ) : {expires : -1};
+ if ( !(i.expires && i.expires <= n) ) {
+ return i.data;
+ }
+ a.removeAttribute( c )
+ } else {
+ f === null ? a.removeAttribute( c ) : (j = a.getAttribute( c ), i = JSON.stringify( {data : f, expires : g.expires ? n + g.expires : null} ), a.setAttribute( c, i ));
+ }
+ try {
+ a.save( e )
+ } catch ( o ) {
+ j === null ? a.removeAttribute( c ) : a.setAttribute( c, j ), d.userData();
+ try {
+ a.setAttribute( c, i ), a.save( e )
+ } catch ( o ) {
+ throw j === null ? a.removeAttribute( c ) : a.setAttribute( c, j ), d.error()
+ }
+ }
+ return m
+ } )
+ })(), function () {
+ function e( a ) {
+ return a === b ? b : JSON.parse( JSON.stringify( a ) )
+ }
+
+ var a = {}, c = {};
+ d.addType( "memory", function ( d, f, g ) {
+ return d ? f === b ? e( a[d] ) : (c[d] && (clearTimeout( c[d] ), delete c[d]), f === null ? (delete a[d], null) : (a[d] = f, g.expires && (c[d] = setTimeout( function () {
+ delete a[d], delete c[d]
+ }, g.expires )), f)) : e( a )
+ } )
+ }()
+ }( this.amplify = this.amplify || {} ), function ( a, b ) {
+ function c() {
+ }
+
+ function d( a ) {
+ return{}.toString.call( a ) === "[object Function]"
+ }
+
+ function e( a ) {
+ var b = !1;
+ return setTimeout( function () {
+ b = !0
+ }, 1 ), function () {
+ var c = this, d = arguments;
+ b ? a.apply( c, d ) : setTimeout( function () {
+ a.apply( c, d )
+ }, 1 )
+ }
+ }
+
+ a.request = function ( b, f, g ) {
+ var h = b || {};
+ typeof h == "string" && (d( f ) && (g = f, f = {}), h = {resourceId : b, data : f || {}, success : g});
+ var i = {abort : c}, j = a.request.resources[h.resourceId], k = h.success || c, l = h.error || c;
+ h.success = e( function ( b, c ) {
+ c = c || "success", a.publish( "request.success", h, b, c ), a.publish( "request.complete", h, b, c ), k( b, c )
+ } ), h.error = e( function ( b, c ) {
+ c = c || "error", a.publish( "request.error", h, b, c ), a.publish( "request.complete", h, b, c ), l( b, c )
+ } );
+ if ( !j ) {
+ throw h.resourceId ? "amplify.request: unknown resourceId: " + h.resourceId : "amplify.request: no resourceId provided";
+ }
+ if ( !a.publish( "request.before", h ) ) {
+ h.error( null, "abort" );
+ return
+ }
+ return a.request.resources[h.resourceId]( h, i ), i
+ }, a.request.types = {}, a.request.resources = {}, a.request.define = function ( b, c, d ) {
+ if ( typeof c == "string" ) {
+ if ( !(c in a.request.types) ) {
+ throw"amplify.request.define: unknown type: " + c;
+ }
+ d.resourceId = b, a.request.resources[b] = a.request.types[c]( d )
+ } else {
+ a.request.resources[b] = c
+ }
+ }
+ }( amplify ), function ( a, b, c ) {
+ var d = ["status", "statusText", "responseText", "responseXML", "readyState"], e = /\{([^\}]+)\}/g;
+ a.request.types.ajax = function ( e ) {
+ return e = b.extend( {type : "GET"}, e ), function ( f, g ) {
+ function n( a, e ) {
+ b.each( d, function ( a, b ) {
+ try {
+ m[b] = h[b]
+ } catch ( c ) {
+ }
+ } ), /OK$/.test( m.statusText ) && (m.statusText = "success"), a === c && (a = null), l && (e = "abort"), /timeout|error|abort/.test( e ) ? m.error( a, e ) : m.success( a, e ), n = b.noop
+ }
+
+ var h, i = e.url, j = g.abort, k = b.extend( !0, {}, e, {data : f.data} ), l = !1, m = {readyState : 0, setRequestHeader : function ( a, b ) {
+ return h.setRequestHeader( a, b )
+ }, getAllResponseHeaders : function () {
+ return h.getAllResponseHeaders()
+ }, getResponseHeader : function ( a ) {
+ return h.getResponseHeader( a )
+ }, overrideMimeType : function ( a ) {
+ return h.overrideMideType( a )
+ }, abort : function () {
+ l = !0;
+ try {
+ h.abort()
+ } catch ( a ) {
+ }
+ n( null, "abort" )
+ }, success : function ( a, b ) {
+ f.success( a, b )
+ }, error : function ( a, b ) {
+ f.error( a, b )
+ }};
+ a.publish( "request.ajax.preprocess", e, f, k, m ), b.extend( k, {success : function ( a, b ) {
+ n( a, b )
+ }, error : function ( a, b ) {
+ n( null, b )
+ }, beforeSend : function ( b, c ) {
+ h = b, k = c;
+ var d = e.beforeSend ? e.beforeSend.call( this, m, k ) : !0;
+ return d && a.publish( "request.before.ajax", e, f, k, m )
+ }} ), b.ajax( k ), g.abort = function () {
+ m.abort(), j.call( this )
+ }
+ }
+ }, a.subscribe( "request.ajax.preprocess", function ( a, c, d ) {
+ var f = [], g = d.data;
+ if ( typeof g == "string" ) {
+ return;
+ }
+ g = b.extend( !0, {}, a.data, g ), d.url = d.url.replace( e, function ( a, b ) {
+ if ( b in g ) {
+ return f.push( b ), g[b]
+ }
+ } ), b.each( f, function ( a, b ) {
+ delete g[b]
+ } ), d.data = g
+ } ), a.subscribe( "request.ajax.preprocess", function ( a, c, d ) {
+ var e = d.data, f = a.dataMap;
+ if ( !f || typeof e == "string" ) {
+ return;
+ }
+ b.isFunction( f ) ? d.data = f( e ) : (b.each( a.dataMap, function ( a, b ) {
+ a in e && (e[b] = e[a], delete e[a])
+ } ), d.data = e)
+ } );
+ var f = a.request.cache = {_key : function ( a, b, c ) {
+ function g() {
+ return c.charCodeAt( e++ ) << 24 | c.charCodeAt( e++ ) << 16 | c.charCodeAt( e++ ) << 8 | c.charCodeAt( e++ ) << 0
+ }
+
+ c = b + c;
+ var d = c.length, e = 0, f = g();
+ while ( e < d ) {
+ f ^= g();
+ }
+ return"request-" + a + "-" + f
+ }, _default : function () {
+ var a = {};
+ return function ( b, c, d, e ) {
+ var g = f._key( c.resourceId, d.url, d.data ), h = b.cache;
+ if ( g in a ) {
+ return e.success( a[g] ), !1;
+ }
+ var i = e.success;
+ e.success = function ( b ) {
+ a[g] = b, typeof h == "number" && setTimeout( function () {
+ delete a[g]
+ }, h ), i.apply( this, arguments )
+ }
+ }
+ }()};
+ a.store && (b.each( a.store.types, function ( b ) {
+ f[b] = function ( c, d, e, g ) {
+ var h = f._key( d.resourceId, e.url, e.data ), i = a.store[b]( h );
+ if ( i ) {
+ return e.success( i ), !1;
+ }
+ var j = g.success;
+ g.success = function ( d ) {
+ a.store[b]( h, d, {expires : c.cache.expires} ), j.apply( this, arguments )
+ }
+ }
+ } ), f.persist = f[a.store.type]), a.subscribe( "request.before.ajax", function ( a ) {
+ var b = a.cache;
+ if ( b ) {
+ return b = b.type || b, f[b in f ? b : "_default"].apply( this, arguments )
+ }
+ } ), a.request.decoders = {jsend : function ( a, b, c, d, e ) {
+ a.status === "success" ? d( a.data ) : a.status === "fail" ? e( a.data, "fail" ) : a.status === "error" && (delete a.status, e( a, "error" ))
+ }}, a.subscribe( "request.before.ajax", function ( c, d, e, f ) {
+ function j( a, b ) {
+ g( a, b )
+ }
+
+ function k( a, b ) {
+ h( a, b )
+ }
+
+ var g = f.success, h = f.error, i = b.isFunction( c.decoder ) ? c.decoder : c.decoder in a.request.decoders ? a.request.decoders[c.decoder] : a.request.decoders._default;
+ if ( !i ) {
+ return;
+ }
+ f.success = function ( a, b ) {
+ i( a, b, f, j, k )
+ }, f.error = function ( a, b ) {
+ i( a, b, f, j, k )
+ }
+ } )
+ }( amplify, jQuery ), amplify
+} )
\ No newline at end of file
diff --git a/example/node/client/js/lib/backbone.js b/example/node/client/js/lib/backbone.js
index ffd4b7e..8b5f909 100644
--- a/example/node/client/js/lib/backbone.js
+++ b/example/node/client/js/lib/backbone.js
@@ -4,36 +4,707 @@
// Backbone may be freely distributed under the MIT license.
// For all details and documentation:
// http://backbonejs.org
-(function(h,g){typeof exports!=="undefined"?g(h,exports,require("underscore")):typeof define==="function"&&define.amd?define(["underscore","jquery","exports"],function(f,i,p){h.Backbone=g(h,p,f,i)}):h.Backbone=g(h,{},h._,h.jQuery||h.Zepto||h.ender)})(this,function(h,g,f,i){var p=h.Backbone,y=Array.prototype.slice,z=Array.prototype.splice;g.VERSION="0.9.2";g.setDomLibrary=function(a){i=a};g.noConflict=function(){h.Backbone=p;return g};g.emulateHTTP=false;g.emulateJSON=false;var q=/\s+/,l=g.Events=
-{on:function(a,b,c){var d,e,f,g,j;if(!b)return this;a=a.split(q);for(d=this._callbacks||(this._callbacks={});e=a.shift();)f=(j=d[e])?j.tail:{},f.next=g={},f.context=c,f.callback=b,d[e]={tail:g,next:j?j.next:f};return this},off:function(a,b,c){var d,e,k,g,j,h;if(e=this._callbacks){if(!a&&!b&&!c)return delete this._callbacks,this;for(a=a?a.split(q):f.keys(e);d=a.shift();)if(k=e[d],delete e[d],k&&(b||c))for(g=k.tail;(k=k.next)!==g;)if(j=k.callback,h=k.context,b&&j!==b||c&&h!==c)this.on(d,j,h);return this}},
-trigger:function(a){var b,c,d,e,f,g;if(!(d=this._callbacks))return this;f=d.all;a=a.split(q);for(g=y.call(arguments,1);b=a.shift();){if(c=d[b])for(e=c.tail;(c=c.next)!==e;)c.callback.apply(c.context||this,g);if(c=f){e=c.tail;for(b=[b].concat(g);(c=c.next)!==e;)c.callback.apply(c.context||this,b)}}return this}};l.bind=l.on;l.unbind=l.off;var o=g.Model=function(a,b){var c;a||(a={});b&&b.parse&&(a=this.parse(a));if(c=n(this,"defaults"))a=f.extend({},c,a);if(b&&b.collection)this.collection=b.collection;
-this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");this.changed={};this._silent={};this._pending={};this.set(a,{silent:true});this.changed={};this._silent={};this._pending={};this._previousAttributes=f.clone(this.attributes);this.initialize.apply(this,arguments)};f.extend(o.prototype,l,{changed:null,_silent:null,_pending:null,idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;
-if(b=this._escapedAttributes[a])return b;b=this.get(a);return this._escapedAttributes[a]=f.escape(b==null?"":""+b)},has:function(a){return this.get(a)!=null},set:function(a,b,c){var d,e;f.isObject(a)||a==null?(d=a,c=b):(d={},d[a]=b);c||(c={});if(!d)return this;if(d instanceof o)d=d.attributes;if(c.unset)for(e in d)d[e]=void 0;if(!this._validate(d,c))return false;if(this.idAttribute in d)this.id=d[this.idAttribute];var b=c.changes={},g=this.attributes,h=this._escapedAttributes,j=this._previousAttributes||
-{};for(e in d){a=d[e];if(!f.isEqual(g[e],a)||c.unset&&f.has(g,e))delete h[e],(c.silent?this._silent:b)[e]=true;c.unset?delete g[e]:g[e]=a;!f.isEqual(j[e],a)||f.has(g,e)!=f.has(j,e)?(this.changed[e]=a,c.silent||(this._pending[e]=true)):(delete this.changed[e],delete this._pending[e])}c.silent||this.change(c);return this},unset:function(a,b){(b||(b={})).unset=true;return this.set(a,null,b)},clear:function(a){(a||(a={})).unset=true;return this.set(f.clone(this.attributes),a)},fetch:function(a){var a=
-a?f.clone(a):{},b=this,c=a.success;a.success=function(d,e,f){if(!b.set(b.parse(d,f),a))return false;c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},save:function(a,b,c){var d,e;f.isObject(a)||a==null?(d=a,c=b):(d={},d[a]=b);c=c?f.clone(c):{};if(c.wait){if(!this._validate(d,c))return false;e=f.clone(this.attributes)}a=f.extend({},c,{silent:true});if(d&&!this.set(d,c.wait?a:c))return false;var k=this,h=c.success;c.success=function(a,b,e){b=k.parse(a,e);
-c.wait&&(delete c.wait,b=f.extend(d||{},b));if(!k.set(b,c))return false;h?h(k,a):k.trigger("sync",k,a,c)};c.error=g.wrapError(c.error,k,c);b=this.isNew()?"create":"update";b=(this.sync||g.sync).call(this,b,this,c);c.wait&&this.set(e,a);return b},destroy:function(a){var a=a?f.clone(a):{},b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};if(this.isNew())return d(),false;a.success=function(e){a.wait&&d();c?c(b,e):b.trigger("sync",b,e,a)};a.error=g.wrapError(a.error,b,a);var e=(this.sync||
-g.sync).call(this,"delete",this,a);a.wait||d();return e},url:function(){var a=n(this,"urlRoot")||n(this.collection,"url")||t();return this.isNew()?a:a+(a.charAt(a.length-1)=="/"?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return this.id==null},change:function(a){a||(a={});var b=this._changing;this._changing=true;for(var c in this._silent)this._pending[c]=true;var d=f.extend({},a.changes,this._silent);
-this._silent={};for(c in d)this.trigger("change:"+c,this,this.get(c),a);if(b)return this;for(;!f.isEmpty(this._pending);){this._pending={};this.trigger("change",this,a);for(c in this.changed)!this._pending[c]&&!this._silent[c]&&delete this.changed[c];this._previousAttributes=f.clone(this.attributes)}this._changing=false;return this},hasChanged:function(a){return!arguments.length?!f.isEmpty(this.changed):f.has(this.changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this.changed):
-false;var b,c=false,d=this._previousAttributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return!arguments.length||!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},isValid:function(){return!this.validate(this.attributes)},_validate:function(a,b){if(b.silent||!this.validate)return true;var a=f.extend({},this.attributes,a),c=this.validate(a,b);if(!c)return true;b&&b.error?
-b.error(this,c,b):this.trigger("error",this,c,b);return false}});var r=g.Collection=function(a,b){b||(b={});if(b.model)this.model=b.model;if(b.comparator)this.comparator=b.comparator;this._reset();this.initialize.apply(this,arguments);a&&this.reset(a,{silent:true,parse:b.parse})};f.extend(r.prototype,l,{model:o,initialize:function(){},toJSON:function(a){return this.map(function(b){return b.toJSON(a)})},add:function(a,b){var c,d,e,g,h,j={},i={},l=[];b||(b={});a=f.isArray(a)?a.slice():[a];for(c=0,d=
-a.length;c').hide().appendTo("body")[0].contentWindow,this.navigate(a);if(this._hasPushState)i(window).bind("popstate",
-this.checkUrl);else if(this._wantsHashChange&&"onhashchange"in window&&!b)i(window).bind("hashchange",this.checkUrl);else if(this._wantsHashChange)this._checkUrlInterval=setInterval(this.checkUrl,this.interval);this.fragment=a;a=window.location;b=a.pathname==this.options.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,true),window.location.replace(this.options.root+"#"+this.fragment),true;else if(this._wantsPushState&&this._hasPushState&&
-b&&a.hash)this.fragment=this.getHash().replace(s,""),window.history.replaceState({},document.title,a.protocol+"//"+a.host+this.options.root+this.fragment);if(!this.options.silent)return this.loadUrl()},stop:function(){i(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);m.started=false},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a==this.fragment&&this.iframe&&(a=this.getFragment(this.getHash(this.iframe)));
-if(a==this.fragment)return false;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(a){var b=this.fragment=this.getFragment(a);return f.any(this.handlers,function(a){if(a.route.test(b))return a.callback(b),true})},navigate:function(a,b){if(!m.started)return false;if(!b||b===true)b={trigger:b};var c=(a||"").replace(s,"");if(this.fragment!=c)this._hasPushState?(c.indexOf(this.options.root)!=0&&(c=this.options.root+c),this.fragment=c,window.history[b.replace?
-"replaceState":"pushState"]({},document.title,c)):this._wantsHashChange?(this.fragment=c,this._updateHash(window.location,c,b.replace),this.iframe&&c!=this.getFragment(this.getHash(this.iframe))&&(b.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,c,b.replace))):window.location.assign(this.options.root+a),b.trigger&&this.loadUrl(a)},_updateHash:function(a,b,c){c?a.replace(a.toString().replace(/(javascript:|#).*$/,"")+"#"+b):a.hash=b}});var v=g.View=function(a){this.cid=
-f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()},E=/^(\S+)\s*(.*)$/,w="model,collection,el,id,attributes,className,tagName".split(",");f.extend(v.prototype,l,{tagName:"div",$:function(a){return this.$el.find(a)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();return this},make:function(a,b,c){a=document.createElement(a);b&&i(a).attr(b);c!=null&&i(a).html(c);return a},setElement:function(a,
-b){this.$el&&this.undelegateEvents();this.$el=a instanceof i?a:i(a);this.el=this.$el[0];b!==false&&this.delegateEvents();return this},delegateEvents:function(a){if(a||(a=n(this,"events"))){this.undelegateEvents();for(var b in a){var c=a[b];f.isFunction(c)||(c=this[a[b]]);if(!c)throw Error('Method "'+a[b]+'" does not exist');var d=b.match(E),e=d[1],d=d[2],c=f.bind(c,this);e+=".delegateEvents"+this.cid;d===""?this.$el.bind(e,c):this.$el.delegate(d,e,c)}}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+
-this.cid)},_configure:function(a){this.options&&(a=f.extend({},this.options,a));for(var b=0,c=w.length;b' ).hide().appendTo( "body" )[0].contentWindow, this.navigate( a );
+ }
+ if ( this._hasPushState ) {
+ i( window ).bind( "popstate",
+ this.checkUrl );
+ } else if ( this._wantsHashChange && "onhashchange"in window && !b ) {
+ i( window ).bind( "hashchange", this.checkUrl );
+ } else if ( this._wantsHashChange ) {
+ this._checkUrlInterval = setInterval( this.checkUrl, this.interval );
+ }
+ this.fragment = a;
+ a = window.location;
+ b = a.pathname == this.options.root;
+ if ( this._wantsHashChange && this._wantsPushState && !this._hasPushState && !b ) {
+ return this.fragment = this.getFragment( null, true ), window.location.replace( this.options.root + "#" + this.fragment ), true;
+ } else if ( this._wantsPushState && this._hasPushState &&
+ b && a.hash ) {
+ this.fragment = this.getHash().replace( s, "" ), window.history.replaceState( {}, document.title, a.protocol + "//" + a.host + this.options.root + this.fragment );
+ }
+ if ( !this.options.silent ) {
+ return this.loadUrl()
+ }
+ }, stop : function () {
+ i( window ).unbind( "popstate", this.checkUrl ).unbind( "hashchange", this.checkUrl );
+ clearInterval( this._checkUrlInterval );
+ m.started = false
+ }, route : function ( a, b ) {
+ this.handlers.unshift( {route : a, callback : b} )
+ }, checkUrl : function () {
+ var a = this.getFragment();
+ a == this.fragment && this.iframe && (a = this.getFragment( this.getHash( this.iframe ) ));
+ if ( a == this.fragment ) {
+ return false;
+ }
+ this.iframe && this.navigate( a );
+ this.loadUrl() || this.loadUrl( this.getHash() )
+ }, loadUrl : function ( a ) {
+ var b = this.fragment = this.getFragment( a );
+ return f.any( this.handlers, function ( a ) {
+ if ( a.route.test( b ) ) {
+ return a.callback( b ), true
+ }
+ } )
+ }, navigate : function ( a, b ) {
+ if ( !m.started ) {
+ return false;
+ }
+ if ( !b || b === true ) {
+ b = {trigger : b};
+ }
+ var c = (a || "").replace( s, "" );
+ if ( this.fragment != c ) {
+ this._hasPushState ? (c.indexOf( this.options.root ) != 0 && (c = this.options.root + c), this.fragment = c, window.history[b.replace ?
+ "replaceState" : "pushState"]( {}, document.title, c )) : this._wantsHashChange ? (this.fragment = c, this._updateHash( window.location, c, b.replace ), this.iframe && c != this.getFragment( this.getHash( this.iframe ) ) && (b.replace || this.iframe.document.open().close(), this._updateHash( this.iframe.location, c, b.replace ))) : window.location.assign( this.options.root + a ), b.trigger && this.loadUrl( a )
+ }
+ }, _updateHash : function ( a, b, c ) {
+ c ? a.replace( a.toString().replace( /(javascript:|#).*$/, "" ) + "#" + b ) : a.hash = b
+ }} );
+ var v = g.View = function ( a ) {
+ this.cid =
+ f.uniqueId( "view" );
+ this._configure( a || {} );
+ this._ensureElement();
+ this.initialize.apply( this, arguments );
+ this.delegateEvents()
+ }, E = /^(\S+)\s*(.*)$/, w = "model,collection,el,id,attributes,className,tagName".split( "," );
+ f.extend( v.prototype, l, {tagName : "div", $ : function ( a ) {
+ return this.$el.find( a )
+ }, initialize : function () {
+ }, render : function () {
+ return this
+ }, remove : function () {
+ this.$el.remove();
+ return this
+ }, make : function ( a, b, c ) {
+ a = document.createElement( a );
+ b && i( a ).attr( b );
+ c != null && i( a ).html( c );
+ return a
+ }, setElement : function ( a, b ) {
+ this.$el && this.undelegateEvents();
+ this.$el = a instanceof i ? a : i( a );
+ this.el = this.$el[0];
+ b !== false && this.delegateEvents();
+ return this
+ }, delegateEvents : function ( a ) {
+ if ( a || (a = n( this, "events" )) ) {
+ this.undelegateEvents();
+ for ( var b in a ) {
+ var c = a[b];
+ f.isFunction( c ) || (c = this[a[b]]);
+ if ( !c ) {
+ throw Error( 'Method "' + a[b] + '" does not exist' );
+ }
+ var d = b.match( E ), e = d[1], d = d[2], c = f.bind( c, this );
+ e += ".delegateEvents" + this.cid;
+ d === "" ? this.$el.bind( e, c ) : this.$el.delegate( d, e, c )
+ }
+ }
+ }, undelegateEvents : function () {
+ this.$el.unbind( ".delegateEvents" +
+ this.cid )
+ }, _configure : function ( a ) {
+ this.options && (a = f.extend( {}, this.options, a ));
+ for ( var b = 0, c = w.length; b < c; b++ ) {
+ var d = w[b];
+ a[d] && (this[d] = a[d])
+ }
+ this.options = a
+ }, _ensureElement : function () {
+ if ( this.el ) {
+ this.setElement( this.el, false );
+ } else {
+ var a = n( this, "attributes" ) || {};
+ if ( this.id ) {
+ a.id = this.id;
+ }
+ if ( this.className ) {
+ a["class"] = this.className;
+ }
+ this.setElement( this.make( this.tagName, a ), false )
+ }
+ }} );
+ o.extend = r.extend = u.extend = v.extend = function ( a, b ) {
+ var c = F( this, a, b );
+ c.extend = this.extend;
+ return c
+ };
+ var G = {create : "POST",
+ update : "PUT", "delete" : "DELETE", read : "GET"};
+ g.sync = function ( a, b, c ) {
+ var d = G[a];
+ c || (c = {});
+ var e = {type : d, dataType : "json"};
+ if ( !c.url ) {
+ e.url = n( b, "url" ) || t();
+ }
+ if ( !c.data && b && (a == "create" || a == "update") ) {
+ e.contentType = "application/json", e.data = JSON.stringify( b.toJSON() );
+ }
+ if ( g.emulateJSON ) {
+ e.contentType = "application/x-www-form-urlencoded", e.data = e.data ? {model : e.data} : {};
+ }
+ if ( g.emulateHTTP && (d === "PUT" || d === "DELETE") ) {
+ if ( g.emulateJSON ) {
+ e.data._method = d;
+ }
+ e.type = "POST";
+ e.beforeSend = function ( a ) {
+ a.setRequestHeader( "X-HTTP-Method-Override",
+ d )
+ }
+ }
+ if ( e.type !== "GET" && !g.emulateJSON ) {
+ e.processData = false;
+ }
+ return i.ajax( f.extend( e, c ) )
+ };
+ g.wrapError = function ( a, b, c ) {
+ return function ( d, e ) {
+ e = d === b ? e : d;
+ a ? a( b, e, c ) : b.trigger( "error", b, e, c )
+ }
+ };
+ var x = function () {
+ }, F = function ( a, b, c ) {
+ var d;
+ d = b && b.hasOwnProperty( "constructor" ) ? b.constructor : function () {
+ a.apply( this, arguments )
+ };
+ f.extend( d, a );
+ x.prototype = a.prototype;
+ d.prototype = new x;
+ b && f.extend( d.prototype, b );
+ c && f.extend( d, c );
+ d.prototype.constructor = d;
+ d.__super__ = a.prototype;
+ return d
+ }, n = function ( a, b ) {
+ return!a ||
+ !a[b] ? null : f.isFunction( a[b] ) ? a[b]() : a[b]
+ }, t = function () {
+ throw Error( 'A "url" property or function must be specified' );
+ };
+ return g
+} );
diff --git a/example/node/client/js/lib/machina.js b/example/node/client/js/lib/machina.js
index 8a0c221..b02e9a5 100644
--- a/example/node/client/js/lib/machina.js
+++ b/example/node/client/js/lib/machina.js
@@ -1,212 +1,212 @@
-/*
- machina.js
- Author: Jim Cowart
- License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
- Version 0.1.0
-*/
+/*
+ machina.js
+ Author: Jim Cowart
+ License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
+ Version 0.1.0
+ */
-(function(root, doc, factory) {
- if (typeof define === "function" && define.amd) {
+(function ( root, doc, factory ) {
+ if ( typeof define === "function" && define.amd ) {
// AMD. Register as an anonymous module.
- define(["underscore"], function(_) {
- return factory(_, root, doc);
- });
+ define( ["underscore"], function ( _ ) {
+ return factory( _, root, doc );
+ } );
} else {
// Browser globals
- factory(root._, root, doc);
+ factory( root._, root, doc );
}
-}(this, document, function(_, global, document, undefined) {
+}( this, document, function ( _, global, document, undefined ) {
var slice = [].slice,
- NEXT_TRANSITION = "transition",
- NEXT_HANDLER = "handler",
- transformEventListToObject = function(eventList){
- var obj = {};
- _.each(eventList, function(evntName) {
- obj[evntName] = [];
- });
- return obj;
- },
- parseEventListeners = function(evnts) {
- var obj = evnts;
- if(_.isArray(evnts)) {
- obj = transformEventListToObject(evnts);
- }
- return obj;
- };
+ NEXT_TRANSITION = "transition",
+ NEXT_HANDLER = "handler",
+ transformEventListToObject = function ( eventList ) {
+ var obj = {};
+ _.each( eventList, function ( evntName ) {
+ obj[evntName] = [];
+ } );
+ return obj;
+ },
+ parseEventListeners = function ( evnts ) {
+ var obj = evnts;
+ if ( _.isArray( evnts ) ) {
+ obj = transformEventListToObject( evnts );
+ }
+ return obj;
+ };
var utils = {
- makeFsmNamespace: (function(){
- var machinaCount = 0;
- return function() {
- return "fsm." + machinaCount++;
- };
- })(),
- getDefaultOptions: function() {
- return {
- initialState: "uninitialized",
- eventListeners: {
- "*" : []
- },
- states: {},
- eventQueue: [],
- namespace: utils.makeFsmNamespace()
- };
- }
-};
- var Fsm = function(options) {
- var opt, initialState, defaults = utils.getDefaultOptions();
- if(options) {
- if(options.eventListeners) {
- options.eventListeners = parseEventListeners(options.eventListeners);
+ makeFsmNamespace : (function () {
+ var machinaCount = 0;
+ return function () {
+ return "fsm." + machinaCount++;
+ };
+ })(),
+ getDefaultOptions : function () {
+ return {
+ initialState : "uninitialized",
+ eventListeners : {
+ "*" : []
+ },
+ states : {},
+ eventQueue : [],
+ namespace : utils.makeFsmNamespace()
+ };
}
- if(options.messaging) {
- options.messaging = _.extend({}, defaults.messaging, options.messaging);
- }
- }
- opt = _.extend(defaults , options || {});
- initialState = opt.initialState;
- delete opt.initialState;
- _.extend(this,opt);
-
- this.state = undefined;
- this._priorAction = "";
- this._currentAction = "";
- if(initialState) {
- this.transition(initialState);
- }
- machina.fireEvent("newFsm", this);
-};
-
-Fsm.prototype.fireEvent = function(eventName) {
- var args = arguments;
- _.each(this.eventListeners["*"], function(callback) {
- try {
- callback.apply(this,slice.call(args, 0));
- } catch(exception) {
- if(console && typeof console.log !== "undefined") {
- console.log(exception.toString());
+ };
+ var Fsm = function ( options ) {
+ var opt, initialState, defaults = utils.getDefaultOptions();
+ if ( options ) {
+ if ( options.eventListeners ) {
+ options.eventListeners = parseEventListeners( options.eventListeners );
+ }
+ if ( options.messaging ) {
+ options.messaging = _.extend( {}, defaults.messaging, options.messaging );
}
}
- });
- if(this.eventListeners[eventName]) {
- _.each(this.eventListeners[eventName], function(callback) {
- try {
- callback.apply(this,slice.call(args, 1));
- } catch(exception) {
- if(console && typeof console.log !== "undefined") {
- console.log(exception.toString());
- }
- }
- });
- }
-};
+ opt = _.extend( defaults, options || {} );
+ initialState = opt.initialState;
+ delete opt.initialState;
+ _.extend( this, opt );
-Fsm.prototype.handle = function(msgType) {
- // vars to avoid a "this." fest
- var states = this.states, current = this.state, args = slice.call(arguments,0), handlerName;
- this.currentActionArgs = args;
- if(states[current] && (states[current][msgType] || states[current]["*"])) {
- handlerName = states[current][msgType] ? msgType : "*";
- this._currentAction = current + "." + handlerName;
- this.fireEvent.apply(this, ["Handling"].concat(args));
- states[current][handlerName].apply(this, args.slice(1));
- this.fireEvent.apply(this, ["Handled"].concat(args));
- this._priorAction = this._currentAction;
- this._currentAction = "";
- this.processQueue(NEXT_HANDLER);
- }
- else {
- this.fireEvent.apply(this, ["NoHandler"].concat(args));
- }
- this.currentActionArgs = undefined;
-};
+ this.state = undefined;
+ this._priorAction = "";
+ this._currentAction = "";
+ if ( initialState ) {
+ this.transition( initialState );
+ }
+ machina.fireEvent( "newFsm", this );
+ };
-Fsm.prototype.transition = function(newState) {
- if(this.states[newState]){
- var oldState = this.state;
- this.state = newState;
- if(this.states[newState]._onEnter) {
- this.states[newState]._onEnter.call( this );
- }
- this.fireEvent.apply(this, ["Transitioned", oldState, this.state ]);
- this.processQueue(NEXT_TRANSITION);
- return;
- }
- this.fireEvent.apply(this, ["InvalidState", this.state, newState ]);
-};
+ Fsm.prototype.fireEvent = function ( eventName ) {
+ var args = arguments;
+ _.each( this.eventListeners["*"], function ( callback ) {
+ try {
+ callback.apply( this, slice.call( args, 0 ) );
+ } catch ( exception ) {
+ if ( console && typeof console.log !== "undefined" ) {
+ console.log( exception.toString() );
+ }
+ }
+ } );
+ if ( this.eventListeners[eventName] ) {
+ _.each( this.eventListeners[eventName], function ( callback ) {
+ try {
+ callback.apply( this, slice.call( args, 1 ) );
+ } catch ( exception ) {
+ if ( console && typeof console.log !== "undefined" ) {
+ console.log( exception.toString() );
+ }
+ }
+ } );
+ }
+ };
-Fsm.prototype.processQueue = function(type) {
- var filterFn = type === NEXT_TRANSITION ?
- function(item){
- return item.type === NEXT_TRANSITION && ((!item.untilState) || (item.untilState === this.state));
- } :
- function(item) {
- return item.type === NEXT_HANDLER;
- },
- toProcess = _.filter(this.eventQueue, filterFn, this);
- this.eventQueue = _.difference(this.eventQueue, toProcess);
- _.each(toProcess, function(item, index){
- this.handle.apply(this, item.args);
- }, this);
-};
+ Fsm.prototype.handle = function ( msgType ) {
+ // vars to avoid a "this." fest
+ var states = this.states, current = this.state, args = slice.call( arguments, 0 ), handlerName;
+ this.currentActionArgs = args;
+ if ( states[current] && (states[current][msgType] || states[current]["*"]) ) {
+ handlerName = states[current][msgType] ? msgType : "*";
+ this._currentAction = current + "." + handlerName;
+ this.fireEvent.apply( this, ["Handling"].concat( args ) );
+ states[current][handlerName].apply( this, args.slice( 1 ) );
+ this.fireEvent.apply( this, ["Handled"].concat( args ) );
+ this._priorAction = this._currentAction;
+ this._currentAction = "";
+ this.processQueue( NEXT_HANDLER );
+ }
+ else {
+ this.fireEvent.apply( this, ["NoHandler"].concat( args ) );
+ }
+ this.currentActionArgs = undefined;
+ };
-Fsm.prototype.deferUntilTransition = function(stateName) {
- if(this.currentActionArgs) {
- var queued = { type: NEXT_TRANSITION, untilState: stateName, args: this.currentActionArgs };
- this.eventQueue.push(queued);
- this.fireEvent.apply(this, [ "Deferred", this.state, queued ]);
- }
-};
+ Fsm.prototype.transition = function ( newState ) {
+ if ( this.states[newState] ) {
+ var oldState = this.state;
+ this.state = newState;
+ if ( this.states[newState]._onEnter ) {
+ this.states[newState]._onEnter.call( this );
+ }
+ this.fireEvent.apply( this, ["Transitioned", oldState, this.state ] );
+ this.processQueue( NEXT_TRANSITION );
+ return;
+ }
+ this.fireEvent.apply( this, ["InvalidState", this.state, newState ] );
+ };
-Fsm.prototype.deferUntilNextHandler = function() {
- if(this.currentActionArgs) {
- var queued = { type: NEXT_TRANSITION, args: this.currentActionArgs };
- this.eventQueue.push(queued);
- this.fireEvent.apply(this, [ "Deferred", this.state, queued ]);
- }
-};
+ Fsm.prototype.processQueue = function ( type ) {
+ var filterFn = type === NEXT_TRANSITION ?
+ function ( item ) {
+ return item.type === NEXT_TRANSITION && ((!item.untilState) || (item.untilState === this.state));
+ } :
+ function ( item ) {
+ return item.type === NEXT_HANDLER;
+ },
+ toProcess = _.filter( this.eventQueue, filterFn, this );
+ this.eventQueue = _.difference( this.eventQueue, toProcess );
+ _.each( toProcess, function ( item, index ) {
+ this.handle.apply( this, item.args );
+ }, this );
+ };
-Fsm.prototype.on = function(eventName, callback) {
- if(!this.eventListeners[eventName]) {
- this.eventListeners[eventName] = [];
- }
- this.eventListeners[eventName].push(callback);
-};
+ Fsm.prototype.deferUntilTransition = function ( stateName ) {
+ if ( this.currentActionArgs ) {
+ var queued = { type : NEXT_TRANSITION, untilState : stateName, args : this.currentActionArgs };
+ this.eventQueue.push( queued );
+ this.fireEvent.apply( this, [ "Deferred", this.state, queued ] );
+ }
+ };
-Fsm.prototype.off = function(eventName, callback) {
- if(this.eventListeners[eventName]){
- this.eventListeners[eventName] = _.without(this.eventListeners[eventName], callback);
- }
-};
+ Fsm.prototype.deferUntilNextHandler = function () {
+ if ( this.currentActionArgs ) {
+ var queued = { type : NEXT_TRANSITION, args : this.currentActionArgs };
+ this.eventQueue.push( queued );
+ this.fireEvent.apply( this, [ "Deferred", this.state, queued ] );
+ }
+ };
+
+ Fsm.prototype.on = function ( eventName, callback ) {
+ if ( !this.eventListeners[eventName] ) {
+ this.eventListeners[eventName] = [];
+ }
+ this.eventListeners[eventName].push( callback );
+ };
+
+ Fsm.prototype.off = function ( eventName, callback ) {
+ if ( this.eventListeners[eventName] ) {
+ this.eventListeners[eventName] = _.without( this.eventListeners[eventName], callback );
+ }
+ };
var machina = {
- Fsm: Fsm,
- bus: undefined,
- utils: utils,
- on: function(eventName, callback) {
- if(!this.eventListeners[eventName]) {
+ Fsm : Fsm,
+ bus : undefined,
+ utils : utils,
+ on : function ( eventName, callback ) {
+ if ( !this.eventListeners[eventName] ) {
this.eventListeners[eventName] = [];
}
- this.eventListeners[eventName].push(callback);
+ this.eventListeners[eventName].push( callback );
},
- off: function(eventName, callback) {
- if(this.eventListeners[eventName]){
- this.eventListeners[eventName] = _.without(this.eventListeners[eventName], callback);
+ off : function ( eventName, callback ) {
+ if ( this.eventListeners[eventName] ) {
+ this.eventListeners[eventName] = _.without( this.eventListeners[eventName], callback );
}
},
- fireEvent: function(eventName) {
+ fireEvent : function ( eventName ) {
var i = 0, len, args = arguments, listeners = this.eventListeners[eventName];
- if(listeners && listeners.length) {
- _.each(listeners, function(callback) {
- callback.apply(null,slice.call(args, 1));
- });
+ if ( listeners && listeners.length ) {
+ _.each( listeners, function ( callback ) {
+ callback.apply( null, slice.call( args, 1 ) );
+ } );
}
},
- eventListeners: {
+ eventListeners : {
newFsm : []
}
};
global.machina = machina;
return machina;
-}));
\ No newline at end of file
+} ));
\ No newline at end of file
diff --git a/example/node/client/js/lib/postal.diagnostics.js b/example/node/client/js/lib/postal.diagnostics.js
index e65e89b..754a85b 100644
--- a/example/node/client/js/lib/postal.diagnostics.js
+++ b/example/node/client/js/lib/postal.diagnostics.js
@@ -47,7 +47,9 @@ define( [ "postal", "underscore" ], function ( postal, _, undefined ) {
}
} );
- postal.diagnostics = {
+ postal.diagnostics = postal.diagnostics || {};
+
+ postal.diagnostics.console = {
clearFilters : function () {
filters = [];
},
@@ -60,13 +62,13 @@ define( [ "postal", "underscore" ], function ( postal, _, undefined ) {
if ( !_.isArray( constraint ) ) {
constraint = [ constraint ];
}
- _.each( constraint, function( item ){
+ _.each( constraint, function ( item ) {
if ( filters.length === 0 || !_.any( filters, function ( filter ) {
return _.isEqual( filter, item );
} ) ) {
filters.push( item );
}
- });
+ } );
},
getCurrentFilters : function () {
diff --git a/example/node/client/js/lib/postal.js b/example/node/client/js/lib/postal.js
index 8ef6b5f..8c36cc0 100644
--- a/example/node/client/js/lib/postal.js
+++ b/example/node/client/js/lib/postal.js
@@ -1,225 +1,228 @@
/*
- postal.js
- Author: Jim Cowart
- License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
- Version 0.6.0
+ postal.js
+ Author: Jim Cowart
+ License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
+ Version 0.6.0
*/
// This is the amd-module version of postal.js
// If you need the standard lib style version, go to http://github.com/ifandelse/postal.js
-define(["underscore"], function(_, undefined) {
+define( ["underscore"], function ( _, undefined ) {
var DEFAULT_CHANNEL = "/",
DEFAULT_PRIORITY = 50,
DEFAULT_DISPOSEAFTER = 0,
SYSTEM_CHANNEL = "postal",
- NO_OP = function() { };
+ NO_OP = function () {
+ };
-var DistinctPredicate = function() {
+var DistinctPredicate = function () {
var previous;
- return function(data) {
+ return function ( data ) {
var eq = false;
- if(_.isString(data)) {
+ if ( _.isString( data ) ) {
eq = data === previous;
previous = data;
}
else {
- eq = _.isEqual(data, previous);
- previous = _.clone(data);
+ eq = _.isEqual( data, previous );
+ previous = _.clone( data );
}
return !eq;
};
};
-var ChannelDefinition = function(channelName, defaultTopic) {
+var ChannelDefinition = function ( channelName, defaultTopic ) {
this.channel = channelName || DEFAULT_CHANNEL;
this._topic = defaultTopic || "";
};
ChannelDefinition.prototype = {
- subscribe: function() {
+ subscribe : function () {
var len = arguments.length;
- if(len === 1) {
- return new SubscriptionDefinition(this.channel, this._topic, arguments[0]);
+ if ( len === 1 ) {
+ return new SubscriptionDefinition( this.channel, this._topic, arguments[0] );
}
- else if (len === 2) {
- return new SubscriptionDefinition(this.channel, arguments[0], arguments[1]);
+ else if ( len === 2 ) {
+ return new SubscriptionDefinition( this.channel, arguments[0], arguments[1] );
}
},
- publish: function(obj) {
+ publish : function ( obj ) {
var envelope = {
- channel: this.channel,
- topic: this._topic,
- data: obj || {}
+ channel : this.channel,
+ topic : this._topic,
+ data : obj || {}
};
// If this is an envelope....
- if( obj.topic && obj.data ) {
+ if ( obj.topic && obj.data ) {
envelope = obj;
envelope.channel = envelope.channel || this.channel;
}
envelope.timeStamp = new Date();
- postal.configuration.bus.publish(envelope);
+ postal.configuration.bus.publish( envelope );
return envelope;
},
- topic: function(topic) {
- if(topic === this._topic) {
+ topic : function ( topic ) {
+ if ( topic === this._topic ) {
return this;
}
- return new ChannelDefinition(this.channel, topic);
+ return new ChannelDefinition( this.channel, topic );
}
};
-var SubscriptionDefinition = function(channel, topic, callback) {
+var SubscriptionDefinition = function ( channel, topic, callback ) {
this.channel = channel;
this.topic = topic;
this.callback = callback;
this.priority = DEFAULT_PRIORITY;
- this.constraints = new Array(0);
+ this.constraints = new Array( 0 );
this.maxCalls = DEFAULT_DISPOSEAFTER;
this.onHandled = NO_OP;
this.context = null;
- postal.configuration.bus.publish({
- channel: SYSTEM_CHANNEL,
- topic: "subscription.created",
- timeStamp: new Date(),
- data: {
- event: "subscription.created",
- channel: channel,
- topic: topic
+ postal.configuration.bus.publish( {
+ channel : SYSTEM_CHANNEL,
+ topic : "subscription.created",
+ timeStamp : new Date(),
+ data : {
+ event : "subscription.created",
+ channel : channel,
+ topic : topic
}
- });
+ } );
- postal.configuration.bus.subscribe(this);
+ postal.configuration.bus.subscribe( this );
};
SubscriptionDefinition.prototype = {
- unsubscribe: function() {
- postal.configuration.bus.unsubscribe(this);
- postal.configuration.bus.publish({
- channel: SYSTEM_CHANNEL,
- topic: "subscription.removed",
- timeStamp: new Date(),
- data: {
- event: "subscription.removed",
- channel: this.channel,
- topic: this.topic
+ unsubscribe : function () {
+ postal.configuration.bus.unsubscribe( this );
+ postal.configuration.bus.publish( {
+ channel : SYSTEM_CHANNEL,
+ topic : "subscription.removed",
+ timeStamp : new Date(),
+ data : {
+ event : "subscription.removed",
+ channel : this.channel,
+ topic : this.topic
}
- });
+ } );
},
- defer: function() {
+ defer : function () {
var fn = this.callback;
- this.callback = function(data) {
- setTimeout(fn,0,data);
+ this.callback = function ( data ) {
+ setTimeout( fn, 0, data );
};
return this;
},
- disposeAfter: function(maxCalls) {
- if(_.isNaN(maxCalls) || maxCalls <= 0) {
+ disposeAfter : function ( maxCalls ) {
+ if ( _.isNaN( maxCalls ) || maxCalls <= 0 ) {
throw "The value provided to disposeAfter (maxCalls) must be a number greater than zero.";
}
var fn = this.onHandled;
- var dispose = _.after(maxCalls, _.bind(function() {
- this.unsubscribe(this);
- }, this));
+ var dispose = _.after( maxCalls, _.bind( function () {
+ this.unsubscribe( this );
+ }, this ) );
- this.onHandled = function() {
- fn.apply(this.context, arguments);
+ this.onHandled = function () {
+ fn.apply( this.context, arguments );
dispose();
};
return this;
},
- ignoreDuplicates: function() {
- this.withConstraint(new DistinctPredicate());
+ ignoreDuplicates : function () {
+ this.withConstraint( new DistinctPredicate() );
return this;
},
- withConstraint: function(predicate) {
- if(! _.isFunction(predicate)) {
+ withConstraint : function ( predicate ) {
+ if ( !_.isFunction( predicate ) ) {
throw "Predicate constraint must be a function";
}
- this.constraints.push(predicate);
+ this.constraints.push( predicate );
return this;
},
- withConstraints: function(predicates) {
+ withConstraints : function ( predicates ) {
var self = this;
- if(_.isArray(predicates)) {
- _.each(predicates, function(predicate) { self.withConstraint(predicate); } );
+ if ( _.isArray( predicates ) ) {
+ _.each( predicates, function ( predicate ) {
+ self.withConstraint( predicate );
+ } );
}
return self;
},
- withContext: function(context) {
+ withContext : function ( context ) {
this.context = context;
return this;
},
- withDebounce: function(milliseconds) {
- if(_.isNaN(milliseconds)) {
+ withDebounce : function ( milliseconds ) {
+ if ( _.isNaN( milliseconds ) ) {
throw "Milliseconds must be a number";
}
var fn = this.callback;
- this.callback = _.debounce(fn, milliseconds);
+ this.callback = _.debounce( fn, milliseconds );
return this;
},
- withDelay: function(milliseconds) {
- if(_.isNaN(milliseconds)) {
+ withDelay : function ( milliseconds ) {
+ if ( _.isNaN( milliseconds ) ) {
throw "Milliseconds must be a number";
}
var fn = this.callback;
- this.callback = function(data) {
- setTimeout(function(){
- fn(data);
- }, milliseconds);
+ this.callback = function ( data ) {
+ setTimeout( function () {
+ fn( data );
+ }, milliseconds );
};
return this;
},
- withPriority: function(priority) {
- if(_.isNaN(priority)) {
+ withPriority : function ( priority ) {
+ if ( _.isNaN( priority ) ) {
throw "Priority must be a number";
}
this.priority = priority;
return this;
},
- withThrottle: function(milliseconds) {
- if(_.isNaN(milliseconds)) {
+ withThrottle : function ( milliseconds ) {
+ if ( _.isNaN( milliseconds ) ) {
throw "Milliseconds must be a number";
}
var fn = this.callback;
- this.callback = _.throttle(fn, milliseconds);
+ this.callback = _.throttle( fn, milliseconds );
return this;
},
- subscribe: function(callback) {
+ subscribe : function ( callback ) {
this.callback = callback;
return this;
}
};
var bindingsResolver = {
- cache: { },
+ cache : { },
- compare: function(binding, topic) {
- if(this.cache[topic] && this.cache[topic][binding]) {
+ compare : function ( binding, topic ) {
+ if ( this.cache[topic] && this.cache[topic][binding] ) {
return true;
}
// binding.replace(/\./g,"\\.") // escape actual periods
// .replace(/\*/g, ".*") // asterisks match any value
// .replace(/#/g, "[A-Z,a-z,0-9]*"); // hash matches any alpha-numeric 'word'
- var rgx = new RegExp("^" + binding.replace(/\./g,"\\.").replace(/\*/g, ".*").replace(/#/g, "[A-Z,a-z,0-9]*") + "$"),
- result = rgx.test(topic);
- if(result) {
- if(!this.cache[topic]) {
+ var rgx = new RegExp( "^" + binding.replace( /\./g, "\\." ).replace( /\*/g, ".*" ).replace( /#/g, "[A-Z,a-z,0-9]*" ) + "$" ),
+ result = rgx.test( topic );
+ if ( result ) {
+ if ( !this.cache[topic] ) {
this.cache[topic] = {};
}
this.cache[topic][binding] = true;
@@ -227,91 +230,93 @@ var bindingsResolver = {
return result;
},
- reset: function() {
+ reset : function () {
this.cache = {};
}
};
var localBus = {
- addWireTap: function(callback) {
+ addWireTap : function ( callback ) {
var self = this;
- self.wireTaps.push(callback);
- return function() {
- var idx = self.wireTaps.indexOf(callback);
- if(idx !== -1) {
- self.wireTaps.splice(idx,1);
+ self.wireTaps.push( callback );
+ return function () {
+ var idx = self.wireTaps.indexOf( callback );
+ if ( idx !== -1 ) {
+ self.wireTaps.splice( idx, 1 );
}
};
},
- publish: function(envelope) {
- _.each(this.wireTaps,function(tap) {
- tap(envelope.data, envelope);
- });
+ publish : function ( envelope ) {
+ _.each( this.wireTaps, function ( tap ) {
+ tap( envelope.data, envelope );
+ } );
- _.each(this.subscriptions[envelope.channel], function(topic) {
- _.each(topic, function(subDef){
- if(postal.configuration.resolver.compare(subDef.topic, envelope.topic)) {
- if(_.all(subDef.constraints, function(constraint) { return constraint(envelope.data,envelope); })) {
- if(typeof subDef.callback === 'function') {
- subDef.callback.apply(subDef.context, [envelope.data, envelope]);
+ _.each( this.subscriptions[envelope.channel], function ( topic ) {
+ _.each( topic, function ( subDef ) {
+ if ( postal.configuration.resolver.compare( subDef.topic, envelope.topic ) ) {
+ if ( _.all( subDef.constraints, function ( constraint ) {
+ return constraint( envelope.data, envelope );
+ } ) ) {
+ if ( typeof subDef.callback === 'function' ) {
+ subDef.callback.apply( subDef.context, [envelope.data, envelope] );
subDef.onHandled();
}
}
}
- });
- });
+ } );
+ } );
},
- reset: function() {
- if( this.subscriptions ) {
- _.each( this.subscriptions , function( channel ){
- _.each( channel, function( topic ){
- while( topic.length ) {
+ reset : function () {
+ if ( this.subscriptions ) {
+ _.each( this.subscriptions, function ( channel ) {
+ _.each( channel, function ( topic ) {
+ while ( topic.length ) {
topic.pop().unsubscribe();
}
- });
- });
+ } );
+ } );
this.subscriptions = {};
}
},
- subscribe: function(subDef) {
+ subscribe : function ( subDef ) {
var idx, found, fn, channel = this.subscriptions[subDef.channel], subs;
- if(!channel) {
+ if ( !channel ) {
channel = this.subscriptions[subDef.channel] = {};
}
subs = this.subscriptions[subDef.channel][subDef.topic];
- if(!subs) {
- subs = this.subscriptions[subDef.channel][subDef.topic] = new Array(0);
+ if ( !subs ) {
+ subs = this.subscriptions[subDef.channel][subDef.topic] = new Array( 0 );
}
idx = subs.length - 1;
- for(; idx >= 0; idx--) {
- if(subs[idx].priority <= subDef.priority) {
- subs.splice(idx + 1, 0, subDef);
+ for ( ; idx >= 0; idx-- ) {
+ if ( subs[idx].priority <= subDef.priority ) {
+ subs.splice( idx + 1, 0, subDef );
found = true;
break;
}
}
- if(!found) {
- subs.unshift(subDef);
+ if ( !found ) {
+ subs.unshift( subDef );
}
return subDef;
},
- subscriptions: {},
+ subscriptions : {},
- wireTaps: new Array(0),
+ wireTaps : new Array( 0 ),
- unsubscribe: function(config) {
- if(this.subscriptions[config.channel][config.topic]) {
+ unsubscribe : function ( config ) {
+ if ( this.subscriptions[config.channel][config.topic] ) {
var len = this.subscriptions[config.channel][config.topic].length,
idx = 0;
for ( ; idx < len; idx++ ) {
- if (this.subscriptions[config.channel][config.topic][idx] === config) {
+ if ( this.subscriptions[config.channel][config.topic][idx] === config ) {
this.subscriptions[config.channel][config.topic].splice( idx, 1 );
break;
}
@@ -321,50 +326,50 @@ var localBus = {
};
var publishPicker = {
- "1" : function(envelope) {
- if(!envelope) {
- throw new Error("publishing from the 'global' postal.publish call requires a valid envelope.");
+ "1" : function ( envelope ) {
+ if ( !envelope ) {
+ throw new Error( "publishing from the 'global' postal.publish call requires a valid envelope." );
}
envelope.channel = envelope.channel || DEFAULT_CHANNEL;
envelope.timeStamp = new Date();
- postal.configuration.bus.publish(envelope);
- return envelope;
- },
- "2" : function(topic, data) {
- var envelope = { channel: DEFAULT_CHANNEL, topic: topic, timeStamp: new Date(), data: data };
postal.configuration.bus.publish( envelope );
return envelope;
},
- "3" : function(channel, topic, data) {
- var envelope = { channel: channel, topic: topic, timeStamp: new Date(), data: data };
+ "2" : function ( topic, data ) {
+ var envelope = { channel : DEFAULT_CHANNEL, topic : topic, timeStamp : new Date(), data : data };
+ postal.configuration.bus.publish( envelope );
+ return envelope;
+ },
+ "3" : function ( channel, topic, data ) {
+ var envelope = { channel : channel, topic : topic, timeStamp : new Date(), data : data };
postal.configuration.bus.publish( envelope );
return envelope;
}
},
channelPicker = {
- "1" : function( chn ) {
+ "1" : function ( chn ) {
var channel = chn, topic, options = {};
- if( Object.prototype.toString.call( channel ) === "[object String]" ) {
+ if ( Object.prototype.toString.call( channel ) === "[object String]" ) {
channel = DEFAULT_CHANNEL;
- topic = chn;
+ topic = chn;
}
else {
channel = chn.channel || DEFAULT_CHANNEL;
- topic = chn.topic;
+ topic = chn.topic;
options = chn.options || options;
}
return new postal.channelTypes[ options.type || "local" ]( channel, topic );
},
- "2" : function( chn, tpc ) {
+ "2" : function ( chn, tpc ) {
var channel = chn, topic = tpc, options = {};
- if( Object.prototype.toString.call( tpc ) === "[object Object]" ) {
+ if ( Object.prototype.toString.call( tpc ) === "[object Object]" ) {
channel = DEFAULT_CHANNEL;
- topic = chn;
+ topic = chn;
options = tpc;
}
return new postal.channelTypes[ options.type || "local" ]( channel, topic );
},
- "3" : function( channel, topic, options ) {
+ "3" : function ( channel, topic, options ) {
return new postal.channelTypes[ options.type || "local" ]( channel, topic );
}
},
@@ -374,110 +379,110 @@ var publishPicker = {
localBus.subscriptions[SYSTEM_CHANNEL] = {};
var postal = {
- configuration: {
- bus: localBus,
- resolver: bindingsResolver,
- getSessionIdAction: function( callback ) {
+ configuration : {
+ bus : localBus,
+ resolver : bindingsResolver,
+ getSessionIdAction : function ( callback ) {
callback( sessionInfo );
},
- setSessionIdAction: function( info, callback ) {
+ setSessionIdAction : function ( info, callback ) {
sessionInfo = info;
callback( sessionInfo );
},
- DEFAULT_CHANNEL: DEFAULT_CHANNEL,
- DEFAULT_PRIORITY: DEFAULT_PRIORITY,
- DEFAULT_DISPOSEAFTER: DEFAULT_DISPOSEAFTER,
- SYSTEM_CHANNEL: SYSTEM_CHANNEL
+ DEFAULT_CHANNEL : DEFAULT_CHANNEL,
+ DEFAULT_PRIORITY : DEFAULT_PRIORITY,
+ DEFAULT_DISPOSEAFTER : DEFAULT_DISPOSEAFTER,
+ SYSTEM_CHANNEL : SYSTEM_CHANNEL
},
- channelTypes: {
- local: ChannelDefinition
+ channelTypes : {
+ local : ChannelDefinition
},
- channel: function() {
+ channel : function () {
var len = arguments.length;
- if(channelPicker[len]) {
- return channelPicker[len].apply(this, arguments);
+ if ( channelPicker[len] ) {
+ return channelPicker[len].apply( this, arguments );
}
},
- subscribe: function(options) {
+ subscribe : function ( options ) {
var callback = options.callback,
topic = options.topic,
channel = options.channel || DEFAULT_CHANNEL;
- return new SubscriptionDefinition(channel, topic, callback);
+ return new SubscriptionDefinition( channel, topic, callback );
},
- publish: function() {
+ publish : function () {
var len = arguments.length;
- if(publishPicker[len]) {
- return publishPicker[len].apply(this, arguments);
+ if ( publishPicker[len] ) {
+ return publishPicker[len].apply( this, arguments );
}
},
- addWireTap: function(callback) {
- return this.configuration.bus.addWireTap(callback);
+ addWireTap : function ( callback ) {
+ return this.configuration.bus.addWireTap( callback );
},
- linkChannels: function(sources, destinations) {
+ linkChannels : function ( sources, destinations ) {
var result = [];
- if(!_.isArray(sources)) {
+ if ( !_.isArray( sources ) ) {
sources = [sources];
}
- if(!_.isArray(destinations)) {
+ if ( !_.isArray( destinations ) ) {
destinations = [destinations];
}
- _.each(sources, function(source){
+ _.each( sources, function ( source ) {
var sourceTopic = source.topic || "*";
- _.each(destinations, function(destination) {
+ _.each( destinations, function ( destination ) {
var destChannel = destination.channel || DEFAULT_CHANNEL;
result.push(
- postal.subscribe({
- channel: source.channel || DEFAULT_CHANNEL,
- topic: source.topic || "*",
- callback : function(data, env) {
+ postal.subscribe( {
+ channel : source.channel || DEFAULT_CHANNEL,
+ topic : source.topic || "*",
+ callback : function ( data, env ) {
var newEnv = env;
- newEnv.topic = _.isFunction(destination.topic) ? destination.topic(env.topic) : destination.topic || env.topic;
+ newEnv.topic = _.isFunction( destination.topic ) ? destination.topic( env.topic ) : destination.topic || env.topic;
newEnv.channel = destChannel;
newEnv.data = data;
- postal.publish(newEnv);
+ postal.publish( newEnv );
}
- })
+ } )
);
- });
- });
+ } );
+ } );
return result;
},
- utils: {
- getSessionId: function( callback ) {
+ utils : {
+ getSessionId : function ( callback ) {
postal.configuration.getSessionIdAction.call( this, callback );
},
- setSessionId: function( value, callback ) {
- postal.utils.getSessionId( function( info ) {
+ setSessionId : function ( value, callback ) {
+ postal.utils.getSessionId( function ( info ) {
// get the session info to move id to last id
info.lastId = info.id;
info.id = value;
// invoke the callback the user provided to handle storing session
- postal.configuration.setSessionIdAction( info, function( session ) {
+ postal.configuration.setSessionIdAction( info, function ( session ) {
callback( session );
// publish postal event msg about the change
- postal.publish({
- channel: SYSTEM_CHANNEL,
- topic: "sessionId.changed",
- data: session
- });
+ postal.publish( {
+ channel : SYSTEM_CHANNEL,
+ topic : "sessionId.changed",
+ data : session
+ } );
} );
- });
+ } );
},
- getSubscribersFor: function() {
+ getSubscribersFor : function () {
var channel = arguments[ 0 ],
tpc = arguments[ 1 ],
result = [];
- if( arguments.length === 1 ) {
- if( Object.prototype.toString.call( channel ) === "[object String]" ) {
+ if ( arguments.length === 1 ) {
+ if ( Object.prototype.toString.call( channel ) === "[object String]" ) {
channel = postal.configuration.DEFAULT_CHANNEL;
tpc = arguments[ 0 ];
}
@@ -486,14 +491,14 @@ var postal = {
tpc = arguments[ 0 ].topic;
}
}
- if( postal.configuration.bus.subscriptions[ channel ] &&
- postal.configuration.bus.subscriptions[ channel ].hasOwnProperty( tpc )) {
+ if ( postal.configuration.bus.subscriptions[ channel ] &&
+ postal.configuration.bus.subscriptions[ channel ].hasOwnProperty( tpc ) ) {
result = postal.configuration.bus.subscriptions[ channel ][ tpc ];
}
return result;
},
- reset: function() {
+ reset : function () {
postal.configuration.bus.reset();
postal.configuration.resolver.reset();
}
@@ -501,4 +506,4 @@ var postal = {
};
return postal;
-});
\ No newline at end of file
+} );
\ No newline at end of file
diff --git a/example/node/client/js/lib/require-jquery.js b/example/node/client/js/lib/require-jquery.js
index 60ca9df..d06b8cf 100644
--- a/example/node/client/js/lib/require-jquery.js
+++ b/example/node/client/js/lib/require-jquery.js
@@ -8,2048 +8,2048 @@
var requirejs, require, define;
(function () {
- //Change this version number for each release.
- var version = "1.0.7",
- commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
- cjsRequireRegExp = /require\(\s*["']([^'"\s]+)["']\s*\)/g,
- currDirRegExp = /^\.\//,
- jsSuffixRegExp = /\.js$/,
- ostring = Object.prototype.toString,
- ap = Array.prototype,
- aps = ap.slice,
- apsp = ap.splice,
- isBrowser = !!(typeof window !== "undefined" && navigator && document),
- isWebWorker = !isBrowser && typeof importScripts !== "undefined",
- //PS3 indicates loaded and complete, but need to wait for complete
- //specifically. Sequence is "loading", "loaded", execution,
- // then "complete". The UA check is unfortunate, but not sure how
- //to feature test w/o causing perf issues.
- readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?
- /^complete$/ : /^(complete|loaded)$/,
- defContextName = "_",
- //Oh the tragedy, detecting opera. See the usage of isOpera for reason.
- isOpera = typeof opera !== "undefined" && opera.toString() === "[object Opera]",
- empty = {},
- contexts = {},
- globalDefQueue = [],
- interactiveScript = null,
- checkLoadedDepth = 0,
- useInteractive = false,
- reservedDependencies = {
- require: true,
- module: true,
- exports: true
- },
- req, cfg = {}, currentlyAddingScript, s, head, baseElement, scripts, script,
- src, subPath, mainScript, dataMain, globalI, ctx, jQueryCheck, checkLoadedTimeoutId;
-
- function isFunction(it) {
- return ostring.call(it) === "[object Function]";
- }
-
- function isArray(it) {
- return ostring.call(it) === "[object Array]";
- }
-
- /**
- * Simple function to mix in properties from source into target,
- * but only if target does not already have a property of the same name.
- * This is not robust in IE for transferring methods that match
- * Object.prototype names, but the uses of mixin here seem unlikely to
- * trigger a problem related to that.
- */
- function mixin(target, source, force) {
- for (var prop in source) {
- if (!(prop in empty) && (!(prop in target) || force)) {
- target[prop] = source[prop];
- }
- }
- return req;
- }
-
- /**
- * Constructs an error with a pointer to an URL with more information.
- * @param {String} id the error ID that maps to an ID on a web page.
- * @param {String} message human readable error.
- * @param {Error} [err] the original error, if there is one.
- *
- * @returns {Error}
- */
- function makeError(id, msg, err) {
- var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id);
- if (err) {
- e.originalError = err;
- }
- return e;
- }
-
- /**
- * Used to set up package paths from a packagePaths or packages config object.
- * @param {Object} pkgs the object to store the new package config
- * @param {Array} currentPackages an array of packages to configure
- * @param {String} [dir] a prefix dir to use.
- */
- function configurePackageDir(pkgs, currentPackages, dir) {
- var i, location, pkgObj;
-
- for (i = 0; (pkgObj = currentPackages[i]); i++) {
- pkgObj = typeof pkgObj === "string" ? { name: pkgObj } : pkgObj;
- location = pkgObj.location;
-
- //Add dir to the path, but avoid paths that start with a slash
- //or have a colon (indicates a protocol)
- if (dir && (!location || (location.indexOf("/") !== 0 && location.indexOf(":") === -1))) {
- location = dir + "/" + (location || pkgObj.name);
- }
-
- //Create a brand new object on pkgs, since currentPackages can
- //be passed in again, and config.pkgs is the internal transformed
- //state for all package configs.
- pkgs[pkgObj.name] = {
- name: pkgObj.name,
- location: location || pkgObj.name,
- //Remove leading dot in main, so main paths are normalized,
- //and remove any trailing .js, since different package
- //envs have different conventions: some use a module name,
- //some use a file name.
- main: (pkgObj.main || "main")
- .replace(currDirRegExp, '')
- .replace(jsSuffixRegExp, '')
- };
- }
- }
-
- /**
- * jQuery 1.4.3-1.5.x use a readyWait/ready() pairing to hold DOM
- * ready callbacks, but jQuery 1.6 supports a holdReady() API instead.
- * At some point remove the readyWait/ready() support and just stick
- * with using holdReady.
- */
- function jQueryHoldReady($, shouldHold) {
- if ($.holdReady) {
- $.holdReady(shouldHold);
- } else if (shouldHold) {
- $.readyWait += 1;
- } else {
- $.ready(true);
- }
- }
-
- if (typeof define !== "undefined") {
- //If a define is already in play via another AMD loader,
- //do not overwrite.
- return;
- }
-
- if (typeof requirejs !== "undefined") {
- if (isFunction(requirejs)) {
- //Do not overwrite and existing requirejs instance.
- return;
- } else {
- cfg = requirejs;
- requirejs = undefined;
- }
- }
-
- //Allow for a require config object
- if (typeof require !== "undefined" && !isFunction(require)) {
- //assume it is a config object.
- cfg = require;
- require = undefined;
- }
-
- /**
- * Creates a new context for use in require and define calls.
- * Handle most of the heavy lifting. Do not want to use an object
- * with prototype here to avoid using "this" in require, in case it
- * needs to be used in more super secure envs that do not want this.
- * Also there should not be that many contexts in the page. Usually just
- * one for the default context, but could be extra for multiversion cases
- * or if a package needs a special context for a dependency that conflicts
- * with the standard context.
- */
- function newContext(contextName) {
- var context, resume,
- config = {
- waitSeconds: 7,
- baseUrl: "./",
- paths: {},
- pkgs: {},
- catchError: {}
- },
- defQueue = [],
- specified = {
- "require": true,
- "exports": true,
- "module": true
- },
- urlMap = {},
- defined = {},
- loaded = {},
- waiting = {},
- waitAry = [],
- urlFetched = {},
- managerCounter = 0,
- managerCallbacks = {},
- plugins = {},
- //Used to indicate which modules in a build scenario
- //need to be full executed.
- needFullExec = {},
- fullExec = {},
- resumeDepth = 0;
-
- /**
- * Trims the . and .. from an array of path segments.
- * It will keep a leading path segment if a .. will become
- * the first path segment, to help with module name lookups,
- * which act like paths, but can be remapped. But the end result,
- * all paths that use this function should look normalized.
- * NOTE: this method MODIFIES the input array.
- * @param {Array} ary the array of path segments.
- */
- function trimDots(ary) {
- var i, part;
- for (i = 0; (part = ary[i]); i++) {
- if (part === ".") {
- ary.splice(i, 1);
- i -= 1;
- } else if (part === "..") {
- if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {
- //End of the line. Keep at least one non-dot
- //path segment at the front so it can be mapped
- //correctly to disk. Otherwise, there is likely
- //no path mapping for a path starting with '..'.
- //This can still fail, but catches the most reasonable
- //uses of ..
- break;
- } else if (i > 0) {
- ary.splice(i - 1, 2);
- i -= 2;
- }
- }
- }
- }
-
- /**
- * Given a relative module name, like ./something, normalize it to
- * a real name that can be mapped to a path.
- * @param {String} name the relative name
- * @param {String} baseName a real name that the name arg is relative
- * to.
- * @returns {String} normalized name
- */
- function normalize(name, baseName) {
- var pkgName, pkgConfig;
-
- //Adjust any relative paths.
- if (name && name.charAt(0) === ".") {
- //If have a base name, try to normalize against it,
- //otherwise, assume it is a top-level require that will
- //be relative to baseUrl in the end.
- if (baseName) {
- if (config.pkgs[baseName]) {
- //If the baseName is a package name, then just treat it as one
- //name to concat the name with.
- baseName = [baseName];
- } else {
- //Convert baseName to array, and lop off the last part,
- //so that . matches that "directory" and not name of the baseName's
- //module. For instance, baseName of "one/two/three", maps to
- //"one/two/three.js", but we want the directory, "one/two" for
- //this normalization.
- baseName = baseName.split("/");
- baseName = baseName.slice(0, baseName.length - 1);
- }
-
- name = baseName.concat(name.split("/"));
- trimDots(name);
-
- //Some use of packages may use a . path to reference the
- //"main" module name, so normalize for that.
- pkgConfig = config.pkgs[(pkgName = name[0])];
- name = name.join("/");
- if (pkgConfig && name === pkgName + '/' + pkgConfig.main) {
- name = pkgName;
- }
- } else if (name.indexOf("./") === 0) {
- // No baseName, so this is ID is resolved relative
- // to baseUrl, pull off the leading dot.
- name = name.substring(2);
- }
- }
- return name;
- }
-
- /**
- * Creates a module mapping that includes plugin prefix, module
- * name, and path. If parentModuleMap is provided it will
- * also normalize the name via require.normalize()
- *
- * @param {String} name the module name
- * @param {String} [parentModuleMap] parent module map
- * for the module name, used to resolve relative names.
- *
- * @returns {Object}
- */
- function makeModuleMap(name, parentModuleMap) {
- var index = name ? name.indexOf("!") : -1,
- prefix = null,
- parentName = parentModuleMap ? parentModuleMap.name : null,
- originalName = name,
- normalizedName, url, pluginModule;
-
- if (index !== -1) {
- prefix = name.substring(0, index);
- name = name.substring(index + 1, name.length);
- }
-
- if (prefix) {
- prefix = normalize(prefix, parentName);
- }
-
- //Account for relative paths if there is a base name.
- if (name) {
- if (prefix) {
- pluginModule = defined[prefix];
- if (pluginModule && pluginModule.normalize) {
- //Plugin is loaded, use its normalize method.
- normalizedName = pluginModule.normalize(name, function (name) {
- return normalize(name, parentName);
- });
- } else {
- normalizedName = normalize(name, parentName);
- }
- } else {
- //A regular module.
- normalizedName = normalize(name, parentName);
-
- url = urlMap[normalizedName];
- if (!url) {
- //Calculate url for the module, if it has a name.
- //Use name here since nameToUrl also calls normalize,
- //and for relative names that are outside the baseUrl
- //this causes havoc. Was thinking of just removing
- //parentModuleMap to avoid extra normalization, but
- //normalize() still does a dot removal because of
- //issue #142, so just pass in name here and redo
- //the normalization. Paths outside baseUrl are just
- //messy to support.
- url = context.nameToUrl(name, null, parentModuleMap);
-
- //Store the URL mapping for later.
- urlMap[normalizedName] = url;
- }
- }
- }
-
- return {
- prefix: prefix,
- name: normalizedName,
- parentMap: parentModuleMap,
- url: url,
- originalName: originalName,
- fullName: prefix ? prefix + "!" + (normalizedName || '') : normalizedName
- };
- }
-
- /**
- * Determine if priority loading is done. If so clear the priorityWait
- */
- function isPriorityDone() {
- var priorityDone = true,
- priorityWait = config.priorityWait,
- priorityName, i;
- if (priorityWait) {
- for (i = 0; (priorityName = priorityWait[i]); i++) {
- if (!loaded[priorityName]) {
- priorityDone = false;
- break;
- }
- }
- if (priorityDone) {
- delete config.priorityWait;
- }
- }
- return priorityDone;
- }
-
- function makeContextModuleFunc(func, relModuleMap, enableBuildCallback) {
- return function () {
- //A version of a require function that passes a moduleName
- //value for items that may need to
- //look up paths relative to the moduleName
- var args = aps.call(arguments, 0), lastArg;
- if (enableBuildCallback &&
- isFunction((lastArg = args[args.length - 1]))) {
- lastArg.__requireJsBuild = true;
- }
- args.push(relModuleMap);
- return func.apply(null, args);
- };
- }
-
- /**
- * Helper function that creates a require function object to give to
- * modules that ask for it as a dependency. It needs to be specific
- * per module because of the implication of path mappings that may
- * need to be relative to the module name.
- */
- function makeRequire(relModuleMap, enableBuildCallback, altRequire) {
- var modRequire = makeContextModuleFunc(altRequire || context.require, relModuleMap, enableBuildCallback);
-
- mixin(modRequire, {
- nameToUrl: makeContextModuleFunc(context.nameToUrl, relModuleMap),
- toUrl: makeContextModuleFunc(context.toUrl, relModuleMap),
- defined: makeContextModuleFunc(context.requireDefined, relModuleMap),
- specified: makeContextModuleFunc(context.requireSpecified, relModuleMap),
- isBrowser: req.isBrowser
- });
- return modRequire;
- }
-
- /*
- * Queues a dependency for checking after the loader is out of a
- * "paused" state, for example while a script file is being loaded
- * in the browser, where it may have many modules defined in it.
- */
- function queueDependency(manager) {
- context.paused.push(manager);
- }
-
- function execManager(manager) {
- var i, ret, err, errFile, errModuleTree,
- cb = manager.callback,
- map = manager.map,
- fullName = map.fullName,
- args = manager.deps,
- listeners = manager.listeners,
- cjsModule;
-
- //Call the callback to define the module, if necessary.
- if (cb && isFunction(cb)) {
- if (config.catchError.define) {
- try {
- ret = req.execCb(fullName, manager.callback, args, defined[fullName]);
- } catch (e) {
- err = e;
- }
- } else {
- ret = req.execCb(fullName, manager.callback, args, defined[fullName]);
- }
-
- if (fullName) {
- //If setting exports via "module" is in play,
- //favor that over return value and exports. After that,
- //favor a non-undefined return value over exports use.
- cjsModule = manager.cjsModule;
- if (cjsModule &&
- cjsModule.exports !== undefined &&
- //Make sure it is not already the exports value
- cjsModule.exports !== defined[fullName]) {
- ret = defined[fullName] = manager.cjsModule.exports;
- } else if (ret === undefined && manager.usingExports) {
- //exports already set the defined value.
- ret = defined[fullName];
- } else {
- //Use the return value from the function.
- defined[fullName] = ret;
- //If this module needed full execution in a build
- //environment, mark that now.
- if (needFullExec[fullName]) {
- fullExec[fullName] = true;
- }
- }
- }
- } else if (fullName) {
- //May just be an object definition for the module. Only
- //worry about defining if have a module name.
- ret = defined[fullName] = cb;
-
- //If this module needed full execution in a build
- //environment, mark that now.
- if (needFullExec[fullName]) {
- fullExec[fullName] = true;
- }
- }
-
- //Clean up waiting. Do this before error calls, and before
- //calling back listeners, so that bookkeeping is correct
- //in the event of an error and error is reported in correct order,
- //since the listeners will likely have errors if the
- //onError function does not throw.
- if (waiting[manager.id]) {
- delete waiting[manager.id];
- manager.isDone = true;
- context.waitCount -= 1;
- if (context.waitCount === 0) {
- //Clear the wait array used for cycles.
- waitAry = [];
- }
- }
-
- //Do not need to track manager callback now that it is defined.
- delete managerCallbacks[fullName];
-
- //Allow instrumentation like the optimizer to know the order
- //of modules executed and their dependencies.
- if (req.onResourceLoad && !manager.placeholder) {
- req.onResourceLoad(context, map, manager.depArray);
- }
-
- if (err) {
- errFile = (fullName ? makeModuleMap(fullName).url : '') ||
- err.fileName || err.sourceURL;
- errModuleTree = err.moduleTree;
- err = makeError('defineerror', 'Error evaluating ' +
- 'module "' + fullName + '" at location "' +
- errFile + '":\n' +
- err + '\nfileName:' + errFile +
- '\nlineNumber: ' + (err.lineNumber || err.line), err);
- err.moduleName = fullName;
- err.moduleTree = errModuleTree;
- return req.onError(err);
- }
-
- //Let listeners know of this manager's value.
- for (i = 0; (cb = listeners[i]); i++) {
- cb(ret);
- }
-
- return undefined;
- }
-
- /**
- * Helper that creates a callack function that is called when a dependency
- * is ready, and sets the i-th dependency for the manager as the
- * value passed to the callback generated by this function.
- */
- function makeArgCallback(manager, i) {
- return function (value) {
- //Only do the work if it has not been done
- //already for a dependency. Cycle breaking
- //logic in forceExec could mean this function
- //is called more than once for a given dependency.
- if (!manager.depDone[i]) {
- manager.depDone[i] = true;
- manager.deps[i] = value;
- manager.depCount -= 1;
- if (!manager.depCount) {
- //All done, execute!
- execManager(manager);
- }
- }
- };
- }
-
- function callPlugin(pluginName, depManager) {
- var map = depManager.map,
- fullName = map.fullName,
- name = map.name,
- plugin = plugins[pluginName] ||
- (plugins[pluginName] = defined[pluginName]),
- load;
-
- //No need to continue if the manager is already
- //in the process of loading.
- if (depManager.loading) {
- return;
- }
- depManager.loading = true;
-
- load = function (ret) {
- depManager.callback = function () {
- return ret;
- };
- execManager(depManager);
-
- loaded[depManager.id] = true;
-
- //The loading of this plugin
- //might have placed other things
- //in the paused queue. In particular,
- //a loader plugin that depends on
- //a different plugin loaded resource.
- resume();
- };
-
- //Allow plugins to load other code without having to know the
- //context or how to "complete" the load.
- load.fromText = function (moduleName, text) {
- /*jslint evil: true */
- var hasInteractive = useInteractive;
-
- //Indicate a the module is in process of loading.
- loaded[moduleName] = false;
- context.scriptCount += 1;
-
- //Indicate this is not a "real" module, so do not track it
- //for builds, it does not map to a real file.
- context.fake[moduleName] = true;
-
- //Turn off interactive script matching for IE for any define
- //calls in the text, then turn it back on at the end.
- if (hasInteractive) {
- useInteractive = false;
- }
-
- req.exec(text);
-
- if (hasInteractive) {
- useInteractive = true;
- }
-
- //Support anonymous modules.
- context.completeLoad(moduleName);
- };
-
- //No need to continue if the plugin value has already been
- //defined by a build.
- if (fullName in defined) {
- load(defined[fullName]);
- } else {
- //Use parentName here since the plugin's name is not reliable,
- //could be some weird string with no path that actually wants to
- //reference the parentName's path.
- plugin.load(name, makeRequire(map.parentMap, true, function (deps, cb) {
- var moduleDeps = [],
- i, dep, depMap;
- //Convert deps to full names and hold on to them
- //for reference later, when figuring out if they
- //are blocked by a circular dependency.
- for (i = 0; (dep = deps[i]); i++) {
- depMap = makeModuleMap(dep, map.parentMap);
- deps[i] = depMap.fullName;
- if (!depMap.prefix) {
- moduleDeps.push(deps[i]);
- }
- }
- depManager.moduleDeps = (depManager.moduleDeps || []).concat(moduleDeps);
- return context.require(deps, cb);
- }), load, config);
- }
- }
-
- /**
- * Adds the manager to the waiting queue. Only fully
- * resolved items should be in the waiting queue.
- */
- function addWait(manager) {
- if (!waiting[manager.id]) {
- waiting[manager.id] = manager;
- waitAry.push(manager);
- context.waitCount += 1;
- }
- }
-
- /**
- * Function added to every manager object. Created out here
- * to avoid new function creation for each manager instance.
- */
- function managerAdd(cb) {
- this.listeners.push(cb);
- }
-
- function getManager(map, shouldQueue) {
- var fullName = map.fullName,
- prefix = map.prefix,
- plugin = prefix ? plugins[prefix] ||
- (plugins[prefix] = defined[prefix]) : null,
- manager, created, pluginManager, prefixMap;
-
- if (fullName) {
- manager = managerCallbacks[fullName];
- }
-
- if (!manager) {
- created = true;
- manager = {
- //ID is just the full name, but if it is a plugin resource
- //for a plugin that has not been loaded,
- //then add an ID counter to it.
- id: (prefix && !plugin ?
- (managerCounter++) + '__p@:' : '') +
- (fullName || '__r@' + (managerCounter++)),
- map: map,
- depCount: 0,
- depDone: [],
- depCallbacks: [],
- deps: [],
- listeners: [],
- add: managerAdd
- };
-
- specified[manager.id] = true;
-
- //Only track the manager/reuse it if this is a non-plugin
- //resource. Also only track plugin resources once
- //the plugin has been loaded, and so the fullName is the
- //true normalized value.
- if (fullName && (!prefix || plugins[prefix])) {
- managerCallbacks[fullName] = manager;
- }
- }
-
- //If there is a plugin needed, but it is not loaded,
- //first load the plugin, then continue on.
- if (prefix && !plugin) {
- prefixMap = makeModuleMap(prefix);
-
- //Clear out defined and urlFetched if the plugin was previously
- //loaded/defined, but not as full module (as in a build
- //situation). However, only do this work if the plugin is in
- //defined but does not have a module export value.
- if (prefix in defined && !defined[prefix]) {
- delete defined[prefix];
- delete urlFetched[prefixMap.url];
- }
-
- pluginManager = getManager(prefixMap, true);
- pluginManager.add(function (plugin) {
- //Create a new manager for the normalized
- //resource ID and have it call this manager when
- //done.
- var newMap = makeModuleMap(map.originalName, map.parentMap),
- normalizedManager = getManager(newMap, true);
-
- //Indicate this manager is a placeholder for the real,
- //normalized thing. Important for when trying to map
- //modules and dependencies, for instance, in a build.
- manager.placeholder = true;
-
- normalizedManager.add(function (resource) {
- manager.callback = function () {
- return resource;
- };
- execManager(manager);
- });
- });
- } else if (created && shouldQueue) {
- //Indicate the resource is not loaded yet if it is to be
- //queued.
- loaded[manager.id] = false;
- queueDependency(manager);
- addWait(manager);
- }
-
- return manager;
- }
-
- function main(inName, depArray, callback, relModuleMap) {
- var moduleMap = makeModuleMap(inName, relModuleMap),
- name = moduleMap.name,
- fullName = moduleMap.fullName,
- manager = getManager(moduleMap),
- id = manager.id,
- deps = manager.deps,
- i, depArg, depName, depPrefix, cjsMod;
-
- if (fullName) {
- //If module already defined for context, or already loaded,
- //then leave. Also leave if jQuery is registering but it does
- //not match the desired version number in the config.
- if (fullName in defined || loaded[id] === true ||
- (fullName === "jquery" && config.jQuery &&
- config.jQuery !== callback().fn.jquery)) {
- return;
- }
-
- //Set specified/loaded here for modules that are also loaded
- //as part of a layer, where onScriptLoad is not fired
- //for those cases. Do this after the inline define and
- //dependency tracing is done.
- specified[id] = true;
- loaded[id] = true;
-
- //If module is jQuery set up delaying its dom ready listeners.
- if (fullName === "jquery" && callback) {
- jQueryCheck(callback());
- }
- }
-
- //Attach real depArray and callback to the manager. Do this
- //only if the module has not been defined already, so do this after
- //the fullName checks above. IE can call main() more than once
- //for a module.
- manager.depArray = depArray;
- manager.callback = callback;
-
- //Add the dependencies to the deps field, and register for callbacks
- //on the dependencies.
- for (i = 0; i < depArray.length; i++) {
- depArg = depArray[i];
- //There could be cases like in IE, where a trailing comma will
- //introduce a null dependency, so only treat a real dependency
- //value as a dependency.
- if (depArg) {
- //Split the dependency name into plugin and name parts
- depArg = makeModuleMap(depArg, (name ? moduleMap : relModuleMap));
- depName = depArg.fullName;
- depPrefix = depArg.prefix;
-
- //Fix the name in depArray to be just the name, since
- //that is how it will be called back later.
- depArray[i] = depName;
-
- //Fast path CommonJS standard dependencies.
- if (depName === "require") {
- deps[i] = makeRequire(moduleMap);
- } else if (depName === "exports") {
- //CommonJS module spec 1.1
- deps[i] = defined[fullName] = {};
- manager.usingExports = true;
- } else if (depName === "module") {
- //CommonJS module spec 1.1
- manager.cjsModule = cjsMod = deps[i] = {
- id: name,
- uri: name ? context.nameToUrl(name, null, relModuleMap) : undefined,
- exports: defined[fullName]
- };
- } else if (depName in defined && !(depName in waiting) &&
- (!(fullName in needFullExec) ||
- (fullName in needFullExec && fullExec[depName]))) {
- //Module already defined, and not in a build situation
- //where the module is a something that needs full
- //execution and this dependency has not been fully
- //executed. See r.js's requirePatch.js for more info
- //on fullExec.
- deps[i] = defined[depName];
- } else {
- //Mark this dependency as needing full exec if
- //the current module needs full exec.
- if (fullName in needFullExec) {
- needFullExec[depName] = true;
- //Reset state so fully executed code will get
- //picked up correctly.
- delete defined[depName];
- urlFetched[depArg.url] = false;
- }
-
- //Either a resource that is not loaded yet, or a plugin
- //resource for either a plugin that has not
- //loaded yet.
- manager.depCount += 1;
- manager.depCallbacks[i] = makeArgCallback(manager, i);
- getManager(depArg, true).add(manager.depCallbacks[i]);
- }
- }
- }
-
- //Do not bother tracking the manager if it is all done.
- if (!manager.depCount) {
- //All done, execute!
- execManager(manager);
- } else {
- addWait(manager);
- }
- }
-
- /**
- * Convenience method to call main for a define call that was put on
- * hold in the defQueue.
- */
- function callDefMain(args) {
- main.apply(null, args);
- }
-
- /**
- * jQuery 1.4.3+ supports ways to hold off calling
- * calling jQuery ready callbacks until all scripts are loaded. Be sure
- * to track it if the capability exists.. Also, since jQuery 1.4.3 does
- * not register as a module, need to do some global inference checking.
- * Even if it does register as a module, not guaranteed to be the precise
- * name of the global. If a jQuery is tracked for this context, then go
- * ahead and register it as a module too, if not already in process.
- */
- jQueryCheck = function (jqCandidate) {
- if (!context.jQuery) {
- var $ = jqCandidate || (typeof jQuery !== "undefined" ? jQuery : null);
-
- if ($) {
- //If a specific version of jQuery is wanted, make sure to only
- //use this jQuery if it matches.
- if (config.jQuery && $.fn.jquery !== config.jQuery) {
- return;
- }
-
- if ("holdReady" in $ || "readyWait" in $) {
- context.jQuery = $;
-
- //Manually create a "jquery" module entry if not one already
- //or in process. Note this could trigger an attempt at
- //a second jQuery registration, but does no harm since
- //the first one wins, and it is the same value anyway.
- callDefMain(["jquery", [], function () {
- return jQuery;
- }]);
-
- //Ask jQuery to hold DOM ready callbacks.
- if (context.scriptCount) {
- jQueryHoldReady($, true);
- context.jQueryIncremented = true;
- }
- }
- }
- }
- };
-
- function findCycle(manager, traced) {
- var fullName = manager.map.fullName,
- depArray = manager.depArray,
- fullyLoaded = true,
- i, depName, depManager, result;
-
- if (manager.isDone || !fullName || !loaded[fullName]) {
- return result;
- }
-
- //Found the cycle.
- if (traced[fullName]) {
- return manager;
- }
-
- traced[fullName] = true;
-
- //Trace through the dependencies.
- if (depArray) {
- for (i = 0; i < depArray.length; i++) {
- //Some array members may be null, like if a trailing comma
- //IE, so do the explicit [i] access and check if it has a value.
- depName = depArray[i];
- if (!loaded[depName] && !reservedDependencies[depName]) {
- fullyLoaded = false;
- break;
- }
- depManager = waiting[depName];
- if (depManager && !depManager.isDone && loaded[depName]) {
- result = findCycle(depManager, traced);
- if (result) {
- break;
- }
- }
- }
- if (!fullyLoaded) {
- //Discard the cycle that was found, since it cannot
- //be forced yet. Also clear this module from traced.
- result = undefined;
- delete traced[fullName];
- }
- }
-
- return result;
- }
-
- function forceExec(manager, traced) {
- var fullName = manager.map.fullName,
- depArray = manager.depArray,
- i, depName, depManager, prefix, prefixManager, value;
-
-
- if (manager.isDone || !fullName || !loaded[fullName]) {
- return undefined;
- }
-
- if (fullName) {
- if (traced[fullName]) {
- return defined[fullName];
- }
-
- traced[fullName] = true;
- }
-
- //Trace through the dependencies.
- if (depArray) {
- for (i = 0; i < depArray.length; i++) {
- //Some array members may be null, like if a trailing comma
- //IE, so do the explicit [i] access and check if it has a value.
- depName = depArray[i];
- if (depName) {
- //First, make sure if it is a plugin resource that the
- //plugin is not blocked.
- prefix = makeModuleMap(depName).prefix;
- if (prefix && (prefixManager = waiting[prefix])) {
- forceExec(prefixManager, traced);
- }
- depManager = waiting[depName];
- if (depManager && !depManager.isDone && loaded[depName]) {
- value = forceExec(depManager, traced);
- manager.depCallbacks[i](value);
- }
- }
- }
- }
-
- return defined[fullName];
- }
-
- /**
- * Checks if all modules for a context are loaded, and if so, evaluates the
- * new ones in right dependency order.
- *
- * @private
- */
- function checkLoaded() {
- var waitInterval = config.waitSeconds * 1000,
- //It is possible to disable the wait interval by using waitSeconds of 0.
- expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),
- noLoads = "", hasLoadedProp = false, stillLoading = false,
- cycleDeps = [],
- i, prop, err, manager, cycleManager, moduleDeps;
-
- //If there are items still in the paused queue processing wait.
- //This is particularly important in the sync case where each paused
- //item is processed right away but there may be more waiting.
- if (context.pausedCount > 0) {
- return undefined;
- }
-
- //Determine if priority loading is done. If so clear the priority. If
- //not, then do not check
- if (config.priorityWait) {
- if (isPriorityDone()) {
- //Call resume, since it could have
- //some waiting dependencies to trace.
- resume();
- } else {
- return undefined;
- }
- }
-
- //See if anything is still in flight.
- for (prop in loaded) {
- if (!(prop in empty)) {
- hasLoadedProp = true;
- if (!loaded[prop]) {
- if (expired) {
- noLoads += prop + " ";
- } else {
- stillLoading = true;
- if (prop.indexOf('!') === -1) {
- //No reason to keep looking for unfinished
- //loading. If the only stillLoading is a
- //plugin resource though, keep going,
- //because it may be that a plugin resource
- //is waiting on a non-plugin cycle.
- cycleDeps = [];
- break;
- } else {
- moduleDeps = managerCallbacks[prop] && managerCallbacks[prop].moduleDeps;
- if (moduleDeps) {
- cycleDeps.push.apply(cycleDeps, moduleDeps);
- }
- }
- }
- }
- }
- }
-
- //Check for exit conditions.
- if (!hasLoadedProp && !context.waitCount) {
- //If the loaded object had no items, then the rest of
- //the work below does not need to be done.
- return undefined;
- }
- if (expired && noLoads) {
- //If wait time expired, throw error of unloaded modules.
- err = makeError("timeout", "Load timeout for modules: " + noLoads);
- err.requireType = "timeout";
- err.requireModules = noLoads;
- err.contextName = context.contextName;
- return req.onError(err);
- }
-
- //If still loading but a plugin is waiting on a regular module cycle
- //break the cycle.
- if (stillLoading && cycleDeps.length) {
- for (i = 0; (manager = waiting[cycleDeps[i]]); i++) {
- if ((cycleManager = findCycle(manager, {}))) {
- forceExec(cycleManager, {});
- break;
- }
- }
-
- }
-
- //If still waiting on loads, and the waiting load is something
- //other than a plugin resource, or there are still outstanding
- //scripts, then just try back later.
- if (!expired && (stillLoading || context.scriptCount)) {
- //Something is still waiting to load. Wait for it, but only
- //if a timeout is not already in effect.
- if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {
- checkLoadedTimeoutId = setTimeout(function () {
- checkLoadedTimeoutId = 0;
- checkLoaded();
- }, 50);
- }
- return undefined;
- }
-
- //If still have items in the waiting cue, but all modules have
- //been loaded, then it means there are some circular dependencies
- //that need to be broken.
- //However, as a waiting thing is fired, then it can add items to
- //the waiting cue, and those items should not be fired yet, so
- //make sure to redo the checkLoaded call after breaking a single
- //cycle, if nothing else loaded then this logic will pick it up
- //again.
- if (context.waitCount) {
- //Cycle through the waitAry, and call items in sequence.
- for (i = 0; (manager = waitAry[i]); i++) {
- forceExec(manager, {});
- }
-
- //If anything got placed in the paused queue, run it down.
- if (context.paused.length) {
- resume();
- }
-
- //Only allow this recursion to a certain depth. Only
- //triggered by errors in calling a module in which its
- //modules waiting on it cannot finish loading, or some circular
- //dependencies that then may add more dependencies.
- //The value of 5 is a bit arbitrary. Hopefully just one extra
- //pass, or two for the case of circular dependencies generating
- //more work that gets resolved in the sync node case.
- if (checkLoadedDepth < 5) {
- checkLoadedDepth += 1;
- checkLoaded();
- }
- }
-
- checkLoadedDepth = 0;
-
- //Check for DOM ready, and nothing is waiting across contexts.
- req.checkReadyState();
-
- return undefined;
- }
-
- /**
- * Resumes tracing of dependencies and then checks if everything is loaded.
- */
- resume = function () {
- var manager, map, url, i, p, args, fullName;
-
- //Any defined modules in the global queue, intake them now.
- context.takeGlobalQueue();
-
- resumeDepth += 1;
-
- if (context.scriptCount <= 0) {
- //Synchronous envs will push the number below zero with the
- //decrement above, be sure to set it back to zero for good measure.
- //require() calls that also do not end up loading scripts could
- //push the number negative too.
- context.scriptCount = 0;
- }
-
- //Make sure any remaining defQueue items get properly processed.
- while (defQueue.length) {
- args = defQueue.shift();
- if (args[0] === null) {
- return req.onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
- } else {
- callDefMain(args);
- }
- }
-
- //Skip the resume of paused dependencies
- //if current context is in priority wait.
- if (!config.priorityWait || isPriorityDone()) {
- while (context.paused.length) {
- p = context.paused;
- context.pausedCount += p.length;
- //Reset paused list
- context.paused = [];
-
- for (i = 0; (manager = p[i]); i++) {
- map = manager.map;
- url = map.url;
- fullName = map.fullName;
-
- //If the manager is for a plugin managed resource,
- //ask the plugin to load it now.
- if (map.prefix) {
- callPlugin(map.prefix, manager);
- } else {
- //Regular dependency.
- if (!urlFetched[url] && !loaded[fullName]) {
- req.load(context, fullName, url);
-
- //Mark the URL as fetched, but only if it is
- //not an empty: URL, used by the optimizer.
- //In that case we need to be sure to call
- //load() for each module that is mapped to
- //empty: so that dependencies are satisfied
- //correctly.
- if (url.indexOf('empty:') !== 0) {
- urlFetched[url] = true;
- }
- }
- }
- }
-
- //Move the start time for timeout forward.
- context.startTime = (new Date()).getTime();
- context.pausedCount -= p.length;
- }
- }
-
- //Only check if loaded when resume depth is 1. It is likely that
- //it is only greater than 1 in sync environments where a factory
- //function also then calls the callback-style require. In those
- //cases, the checkLoaded should not occur until the resume
- //depth is back at the top level.
- if (resumeDepth === 1) {
- checkLoaded();
- }
-
- resumeDepth -= 1;
-
- return undefined;
- };
-
- //Define the context object. Many of these fields are on here
- //just to make debugging easier.
- context = {
- contextName: contextName,
- config: config,
- defQueue: defQueue,
- waiting: waiting,
- waitCount: 0,
- specified: specified,
- loaded: loaded,
- urlMap: urlMap,
- urlFetched: urlFetched,
- scriptCount: 0,
- defined: defined,
- paused: [],
- pausedCount: 0,
- plugins: plugins,
- needFullExec: needFullExec,
- fake: {},
- fullExec: fullExec,
- managerCallbacks: managerCallbacks,
- makeModuleMap: makeModuleMap,
- normalize: normalize,
- /**
- * Set a configuration for the context.
- * @param {Object} cfg config object to integrate.
- */
- configure: function (cfg) {
- var paths, prop, packages, pkgs, packagePaths, requireWait;
-
- //Make sure the baseUrl ends in a slash.
- if (cfg.baseUrl) {
- if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== "/") {
- cfg.baseUrl += "/";
- }
- }
-
- //Save off the paths and packages since they require special processing,
- //they are additive.
- paths = config.paths;
- packages = config.packages;
- pkgs = config.pkgs;
-
- //Mix in the config values, favoring the new values over
- //existing ones in context.config.
- mixin(config, cfg, true);
-
- //Adjust paths if necessary.
- if (cfg.paths) {
- for (prop in cfg.paths) {
- if (!(prop in empty)) {
- paths[prop] = cfg.paths[prop];
- }
- }
- config.paths = paths;
- }
-
- packagePaths = cfg.packagePaths;
- if (packagePaths || cfg.packages) {
- //Convert packagePaths into a packages config.
- if (packagePaths) {
- for (prop in packagePaths) {
- if (!(prop in empty)) {
- configurePackageDir(pkgs, packagePaths[prop], prop);
- }
- }
- }
-
- //Adjust packages if necessary.
- if (cfg.packages) {
- configurePackageDir(pkgs, cfg.packages);
- }
-
- //Done with modifications, assing packages back to context config
- config.pkgs = pkgs;
- }
-
- //If priority loading is in effect, trigger the loads now
- if (cfg.priority) {
- //Hold on to requireWait value, and reset it after done
- requireWait = context.requireWait;
-
- //Allow tracing some require calls to allow the fetching
- //of the priority config.
- context.requireWait = false;
- //But first, call resume to register any defined modules that may
- //be in a data-main built file before the priority config
- //call.
- resume();
-
- context.require(cfg.priority);
-
- //Trigger a resume right away, for the case when
- //the script with the priority load is done as part
- //of a data-main call. In that case the normal resume
- //call will not happen because the scriptCount will be
- //at 1, since the script for data-main is being processed.
- resume();
-
- //Restore previous state.
- context.requireWait = requireWait;
- config.priorityWait = cfg.priority;
- }
-
- //If a deps array or a config callback is specified, then call
- //require with those args. This is useful when require is defined as a
- //config object before require.js is loaded.
- if (cfg.deps || cfg.callback) {
- context.require(cfg.deps || [], cfg.callback);
- }
- },
-
- requireDefined: function (moduleName, relModuleMap) {
- return makeModuleMap(moduleName, relModuleMap).fullName in defined;
- },
-
- requireSpecified: function (moduleName, relModuleMap) {
- return makeModuleMap(moduleName, relModuleMap).fullName in specified;
- },
-
- require: function (deps, callback, relModuleMap) {
- var moduleName, fullName, moduleMap;
- if (typeof deps === "string") {
- if (isFunction(callback)) {
- //Invalid call
- return req.onError(makeError("requireargs", "Invalid require call"));
- }
-
- //Synchronous access to one module. If require.get is
- //available (as in the Node adapter), prefer that.
- //In this case deps is the moduleName and callback is
- //the relModuleMap
- if (req.get) {
- return req.get(context, deps, callback);
- }
-
- //Just return the module wanted. In this scenario, the
- //second arg (if passed) is just the relModuleMap.
- moduleName = deps;
- relModuleMap = callback;
-
- //Normalize module name, if it contains . or ..
- moduleMap = makeModuleMap(moduleName, relModuleMap);
- fullName = moduleMap.fullName;
-
- if (!(fullName in defined)) {
- return req.onError(makeError("notloaded", "Module name '" +
- moduleMap.fullName +
- "' has not been loaded yet for context: " +
- contextName));
- }
- return defined[fullName];
- }
-
- //Call main but only if there are dependencies or
- //a callback to call.
- if (deps && deps.length || callback) {
- main(null, deps, callback, relModuleMap);
- }
-
- //If the require call does not trigger anything new to load,
- //then resume the dependency processing.
- if (!context.requireWait) {
- while (!context.scriptCount && context.paused.length) {
- resume();
- }
- }
- return context.require;
- },
-
- /**
- * Internal method to transfer globalQueue items to this context's
- * defQueue.
- */
- takeGlobalQueue: function () {
- //Push all the globalDefQueue items into the context's defQueue
- if (globalDefQueue.length) {
- //Array splice in the values since the context code has a
- //local var ref to defQueue, so cannot just reassign the one
- //on context.
- apsp.apply(context.defQueue,
- [context.defQueue.length - 1, 0].concat(globalDefQueue));
- globalDefQueue = [];
- }
- },
-
- /**
- * Internal method used by environment adapters to complete a load event.
- * A load event could be a script load or just a load pass from a synchronous
- * load call.
- * @param {String} moduleName the name of the module to potentially complete.
- */
- completeLoad: function (moduleName) {
- var args;
-
- context.takeGlobalQueue();
-
- while (defQueue.length) {
- args = defQueue.shift();
-
- if (args[0] === null) {
- args[0] = moduleName;
- break;
- } else if (args[0] === moduleName) {
- //Found matching define call for this script!
- break;
- } else {
- //Some other named define call, most likely the result
- //of a build layer that included many define calls.
- callDefMain(args);
- args = null;
- }
- }
- if (args) {
- callDefMain(args);
- } else {
- //A script that does not call define(), so just simulate
- //the call for it. Special exception for jQuery dynamic load.
- callDefMain([moduleName, [],
- moduleName === "jquery" && typeof jQuery !== "undefined" ?
- function () {
- return jQuery;
- } : null]);
- }
-
- //Doing this scriptCount decrement branching because sync envs
- //need to decrement after resume, otherwise it looks like
- //loading is complete after the first dependency is fetched.
- //For browsers, it works fine to decrement after, but it means
- //the checkLoaded setTimeout 50 ms cost is taken. To avoid
- //that cost, decrement beforehand.
- if (req.isAsync) {
- context.scriptCount -= 1;
- }
- resume();
- if (!req.isAsync) {
- context.scriptCount -= 1;
- }
- },
-
- /**
- * Converts a module name + .extension into an URL path.
- * *Requires* the use of a module name. It does not support using
- * plain URLs like nameToUrl.
- */
- toUrl: function (moduleNamePlusExt, relModuleMap) {
- var index = moduleNamePlusExt.lastIndexOf("."),
- ext = null;
-
- if (index !== -1) {
- ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);
- moduleNamePlusExt = moduleNamePlusExt.substring(0, index);
- }
-
- return context.nameToUrl(moduleNamePlusExt, ext, relModuleMap);
- },
-
- /**
- * Converts a module name to a file path. Supports cases where
- * moduleName may actually be just an URL.
- */
- nameToUrl: function (moduleName, ext, relModuleMap) {
- var paths, pkgs, pkg, pkgPath, syms, i, parentModule, url,
- config = context.config;
-
- //Normalize module name if have a base relative module name to work from.
- moduleName = normalize(moduleName, relModuleMap && relModuleMap.fullName);
-
- //If a colon is in the URL, it indicates a protocol is used and it is just
- //an URL to a file, or if it starts with a slash or ends with .js, it is just a plain file.
- //The slash is important for protocol-less URLs as well as full paths.
- if (req.jsExtRegExp.test(moduleName)) {
- //Just a plain path, not module name lookup, so just return it.
- //Add extension if it is included. This is a bit wonky, only non-.js things pass
- //an extension, this method probably needs to be reworked.
- url = moduleName + (ext ? ext : "");
- } else {
- //A module that needs to be converted to a path.
- paths = config.paths;
- pkgs = config.pkgs;
-
- syms = moduleName.split("/");
- //For each module name segment, see if there is a path
- //registered for it. Start with most specific name
- //and work up from it.
- for (i = syms.length; i > 0; i--) {
- parentModule = syms.slice(0, i).join("/");
- if (paths[parentModule]) {
- syms.splice(0, i, paths[parentModule]);
- break;
- } else if ((pkg = pkgs[parentModule])) {
- //If module name is just the package name, then looking
- //for the main module.
- if (moduleName === pkg.name) {
- pkgPath = pkg.location + '/' + pkg.main;
- } else {
- pkgPath = pkg.location;
- }
- syms.splice(0, i, pkgPath);
- break;
- }
- }
-
- //Join the path parts together, then figure out if baseUrl is needed.
- url = syms.join("/") + (ext || ".js");
- url = (url.charAt(0) === '/' || url.match(/^\w+:/) ? "" : config.baseUrl) + url;
- }
-
- return config.urlArgs ? url +
- ((url.indexOf('?') === -1 ? '?' : '&') +
- config.urlArgs) : url;
- }
- };
-
- //Make these visible on the context so can be called at the very
- //end of the file to bootstrap
- context.jQueryCheck = jQueryCheck;
- context.resume = resume;
-
- return context;
- }
-
- /**
- * Main entry point.
- *
- * If the only argument to require is a string, then the module that
- * is represented by that string is fetched for the appropriate context.
- *
- * If the first argument is an array, then it will be treated as an array
- * of dependency string names to fetch. An optional function callback can
- * be specified to execute when all of those dependencies are available.
- *
- * Make a local req variable to help Caja compliance (it assumes things
- * on a require that are not standardized), and to give a short
- * name for minification/local scope use.
- */
- req = requirejs = function (deps, callback) {
-
- //Find the right context, use default
- var contextName = defContextName,
- context, config;
-
- // Determine if have config object in the call.
- if (!isArray(deps) && typeof deps !== "string") {
- // deps is a config object
- config = deps;
- if (isArray(callback)) {
- // Adjust args if there are dependencies
- deps = callback;
- callback = arguments[2];
- } else {
- deps = [];
- }
- }
-
- if (config && config.context) {
- contextName = config.context;
- }
-
- context = contexts[contextName] ||
- (contexts[contextName] = newContext(contextName));
-
- if (config) {
- context.configure(config);
- }
-
- return context.require(deps, callback);
- };
-
- /**
- * Support require.config() to make it easier to cooperate with other
- * AMD loaders on globally agreed names.
- */
- req.config = function (config) {
- return req(config);
- };
-
- /**
- * Export require as a global, but only if it does not already exist.
- */
- if (!require) {
- require = req;
- }
-
- /**
- * Global require.toUrl(), to match global require, mostly useful
- * for debugging/work in the global space.
- */
- req.toUrl = function (moduleNamePlusExt) {
- return contexts[defContextName].toUrl(moduleNamePlusExt);
- };
-
- req.version = version;
-
- //Used to filter out dependencies that are already paths.
- req.jsExtRegExp = /^\/|:|\?|\.js$/;
- s = req.s = {
- contexts: contexts,
- //Stores a list of URLs that should not get async script tag treatment.
- skipAsync: {}
- };
-
- req.isAsync = req.isBrowser = isBrowser;
- if (isBrowser) {
- head = s.head = document.getElementsByTagName("head")[0];
- //If BASE tag is in play, using appendChild is a problem for IE6.
- //When that browser dies, this can be removed. Details in this jQuery bug:
- //http://dev.jquery.com/ticket/2709
- baseElement = document.getElementsByTagName("base")[0];
- if (baseElement) {
- head = s.head = baseElement.parentNode;
- }
- }
-
- /**
- * Any errors that require explicitly generates will be passed to this
- * function. Intercept/override it if you want custom error handling.
- * @param {Error} err the error object.
- */
- req.onError = function (err) {
- throw err;
- };
-
- /**
- * Does the request to load a module for the browser case.
- * Make this a separate function to allow other environments
- * to override it.
- *
- * @param {Object} context the require context to find state.
- * @param {String} moduleName the name of the module.
- * @param {Object} url the URL to the module.
- */
- req.load = function (context, moduleName, url) {
- req.resourcesReady(false);
-
- context.scriptCount += 1;
- req.attach(url, context, moduleName);
-
- //If tracking a jQuery, then make sure its ready callbacks
- //are put on hold to prevent its ready callbacks from
- //triggering too soon.
- if (context.jQuery && !context.jQueryIncremented) {
- jQueryHoldReady(context.jQuery, true);
- context.jQueryIncremented = true;
- }
- };
-
- function getInteractiveScript() {
- var scripts, i, script;
- if (interactiveScript && interactiveScript.readyState === 'interactive') {
- return interactiveScript;
- }
-
- scripts = document.getElementsByTagName('script');
- for (i = scripts.length - 1; i > -1 && (script = scripts[i]); i--) {
- if (script.readyState === 'interactive') {
- return (interactiveScript = script);
- }
- }
-
- return null;
- }
-
- /**
- * The function that handles definitions of modules. Differs from
- * require() in that a string for the module should be the first argument,
- * and the function to execute after dependencies are loaded should
- * return a value to define the module corresponding to the first argument's
- * name.
- */
- define = function (name, deps, callback) {
- var node, context;
-
- //Allow for anonymous functions
- if (typeof name !== 'string') {
- //Adjust args appropriately
- callback = deps;
- deps = name;
- name = null;
- }
-
- //This module may not have dependencies
- if (!isArray(deps)) {
- callback = deps;
- deps = [];
- }
-
- //If no name, and callback is a function, then figure out if it a
- //CommonJS thing with dependencies.
- if (!deps.length && isFunction(callback)) {
- //Remove comments from the callback string,
- //look for require calls, and pull them into the dependencies,
- //but only if there are function args.
- if (callback.length) {
- callback
- .toString()
- .replace(commentRegExp, "")
- .replace(cjsRequireRegExp, function (match, dep) {
- deps.push(dep);
- });
-
- //May be a CommonJS thing even without require calls, but still
- //could use exports, and module. Avoid doing exports and module
- //work though if it just needs require.
- //REQUIRES the function to expect the CommonJS variables in the
- //order listed below.
- deps = (callback.length === 1 ? ["require"] : ["require", "exports", "module"]).concat(deps);
- }
- }
-
- //If in IE 6-8 and hit an anonymous define() call, do the interactive
- //work.
- if (useInteractive) {
- node = currentlyAddingScript || getInteractiveScript();
- if (node) {
- if (!name) {
- name = node.getAttribute("data-requiremodule");
- }
- context = contexts[node.getAttribute("data-requirecontext")];
- }
- }
-
- //Always save off evaluating the def call until the script onload handler.
- //This allows multiple modules to be in a file without prematurely
- //tracing dependencies, and allows for anonymous module support,
- //where the module name is not known until the script onload event
- //occurs. If no context, use the global queue, and get it processed
- //in the onscript load callback.
- (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);
-
- return undefined;
- };
-
- define.amd = {
- multiversion: true,
- plugins: true,
- jQuery: true
- };
-
- /**
- * Executes the text. Normally just uses eval, but can be modified
- * to use a more environment specific call.
- * @param {String} text the text to execute/evaluate.
- */
- req.exec = function (text) {
- return eval(text);
- };
-
- /**
- * Executes a module callack function. Broken out as a separate function
- * solely to allow the build system to sequence the files in the built
- * layer in the right sequence.
- *
- * @private
- */
- req.execCb = function (name, callback, args, exports) {
- return callback.apply(exports, args);
- };
-
-
- /**
- * Adds a node to the DOM. Public function since used by the order plugin.
- * This method should not normally be called by outside code.
- */
- req.addScriptToDom = function (node) {
- //For some cache cases in IE 6-8, the script executes before the end
- //of the appendChild execution, so to tie an anonymous define
- //call to the module name (which is stored on the node), hold on
- //to a reference to this node, but clear after the DOM insertion.
- currentlyAddingScript = node;
- if (baseElement) {
- head.insertBefore(node, baseElement);
- } else {
- head.appendChild(node);
- }
- currentlyAddingScript = null;
- };
-
- /**
- * callback for script loads, used to check status of loading.
- *
- * @param {Event} evt the event from the browser for the script
- * that was loaded.
- *
- * @private
- */
- req.onScriptLoad = function (evt) {
- //Using currentTarget instead of target for Firefox 2.0's sake. Not
- //all old browsers will be supported, but this one was easy enough
- //to support and still makes sense.
- var node = evt.currentTarget || evt.srcElement, contextName, moduleName,
- context;
-
- if (evt.type === "load" || (node && readyRegExp.test(node.readyState))) {
- //Reset interactive script so a script node is not held onto for
- //to long.
- interactiveScript = null;
-
- //Pull out the name of the module and the context.
- contextName = node.getAttribute("data-requirecontext");
- moduleName = node.getAttribute("data-requiremodule");
- context = contexts[contextName];
-
- contexts[contextName].completeLoad(moduleName);
-
- //Clean up script binding. Favor detachEvent because of IE9
- //issue, see attachEvent/addEventListener comment elsewhere
- //in this file.
- if (node.detachEvent && !isOpera) {
- //Probably IE. If not it will throw an error, which will be
- //useful to know.
- node.detachEvent("onreadystatechange", req.onScriptLoad);
- } else {
- node.removeEventListener("load", req.onScriptLoad, false);
- }
- }
- };
-
- /**
- * Attaches the script represented by the URL to the current
- * environment. Right now only supports browser loading,
- * but can be redefined in other environments to do the right thing.
- * @param {String} url the url of the script to attach.
- * @param {Object} context the context that wants the script.
- * @param {moduleName} the name of the module that is associated with the script.
- * @param {Function} [callback] optional callback, defaults to require.onScriptLoad
- * @param {String} [type] optional type, defaults to text/javascript
- * @param {Function} [fetchOnlyFunction] optional function to indicate the script node
- * should be set up to fetch the script but do not attach it to the DOM
- * so that it can later be attached to execute it. This is a way for the
- * order plugin to support ordered loading in IE. Once the script is fetched,
- * but not executed, the fetchOnlyFunction will be called.
- */
- req.attach = function (url, context, moduleName, callback, type, fetchOnlyFunction) {
- var node;
- if (isBrowser) {
- //In the browser so use a script tag
- callback = callback || req.onScriptLoad;
- node = context && context.config && context.config.xhtml ?
- document.createElementNS("http://www.w3.org/1999/xhtml", "html:script") :
- document.createElement("script");
- node.type = type || (context && context.config.scriptType) ||
- "text/javascript";
- node.charset = "utf-8";
- //Use async so Gecko does not block on executing the script if something
- //like a long-polling comet tag is being run first. Gecko likes
- //to evaluate scripts in DOM order, even for dynamic scripts.
- //It will fetch them async, but only evaluate the contents in DOM
- //order, so a long-polling script tag can delay execution of scripts
- //after it. But telling Gecko we expect async gets us the behavior
- //we want -- execute it whenever it is finished downloading. Only
- //Helps Firefox 3.6+
- //Allow some URLs to not be fetched async. Mostly helps the order!
- //plugin
- node.async = !s.skipAsync[url];
-
- if (context) {
- node.setAttribute("data-requirecontext", context.contextName);
- }
- node.setAttribute("data-requiremodule", moduleName);
-
- //Set up load listener. Test attachEvent first because IE9 has
- //a subtle issue in its addEventListener and script onload firings
- //that do not match the behavior of all other browsers with
- //addEventListener support, which fire the onload event for a
- //script right after the script execution. See:
- //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution
- //UNFORTUNATELY Opera implements attachEvent but does not follow the script
- //script execution mode.
- if (node.attachEvent && !isOpera) {
- //Probably IE. IE (at least 6-8) do not fire
- //script onload right after executing the script, so
- //we cannot tie the anonymous define call to a name.
- //However, IE reports the script as being in "interactive"
- //readyState at the time of the define call.
- useInteractive = true;
-
-
- if (fetchOnlyFunction) {
- //Need to use old school onreadystate here since
- //when the event fires and the node is not attached
- //to the DOM, the evt.srcElement is null, so use
- //a closure to remember the node.
- node.onreadystatechange = function (evt) {
- //Script loaded but not executed.
- //Clear loaded handler, set the real one that
- //waits for script execution.
- if (node.readyState === 'loaded') {
- node.onreadystatechange = null;
- node.attachEvent("onreadystatechange", callback);
- fetchOnlyFunction(node);
- }
- };
- } else {
- node.attachEvent("onreadystatechange", callback);
- }
- } else {
- node.addEventListener("load", callback, false);
- }
- node.src = url;
-
- //Fetch only means waiting to attach to DOM after loaded.
- if (!fetchOnlyFunction) {
- req.addScriptToDom(node);
- }
-
- return node;
- } else if (isWebWorker) {
- //In a web worker, use importScripts. This is not a very
- //efficient use of importScripts, importScripts will block until
- //its script is downloaded and evaluated. However, if web workers
- //are in play, the expectation that a build has been done so that
- //only one script needs to be loaded anyway. This may need to be
- //reevaluated if other use cases become common.
- importScripts(url);
-
- //Account for anonymous modules
- context.completeLoad(moduleName);
- }
- return null;
- };
-
- //Look for a data-main script attribute, which could also adjust the baseUrl.
- if (isBrowser) {
- //Figure out baseUrl. Get it from the script tag with require.js in it.
- scripts = document.getElementsByTagName("script");
-
- for (globalI = scripts.length - 1; globalI > -1 && (script = scripts[globalI]); globalI--) {
- //Set the "head" where we can append children by
- //using the script's parent.
- if (!head) {
- head = script.parentNode;
- }
-
- //Look for a data-main attribute to set main script for the page
- //to load. If it is there, the path to data main becomes the
- //baseUrl, if it is not already set.
- if ((dataMain = script.getAttribute('data-main'))) {
- if (!cfg.baseUrl) {
- //Pull off the directory of data-main for use as the
- //baseUrl.
- src = dataMain.split('/');
- mainScript = src.pop();
- subPath = src.length ? src.join('/') + '/' : './';
-
- //Set final config.
- cfg.baseUrl = subPath;
- //Strip off any trailing .js since dataMain is now
- //like a module name.
- dataMain = mainScript.replace(jsSuffixRegExp, '');
- }
-
- //Put the data-main script in the files to load.
- cfg.deps = cfg.deps ? cfg.deps.concat(dataMain) : [dataMain];
-
- break;
- }
- }
- }
-
- //See if there is nothing waiting across contexts, and if not, trigger
- //resourcesReady.
- req.checkReadyState = function () {
- var contexts = s.contexts, prop;
- for (prop in contexts) {
- if (!(prop in empty)) {
- if (contexts[prop].waitCount) {
- return;
- }
- }
- }
- req.resourcesReady(true);
- };
-
- /**
- * Internal function that is triggered whenever all scripts/resources
- * have been loaded by the loader. Can be overridden by other, for
- * instance the domReady plugin, which wants to know when all resources
- * are loaded.
- */
- req.resourcesReady = function (isReady) {
- var contexts, context, prop;
-
- //First, set the public variable indicating that resources are loading.
- req.resourcesDone = isReady;
-
- if (req.resourcesDone) {
- //If jQuery with DOM ready delayed, release it now.
- contexts = s.contexts;
- for (prop in contexts) {
- if (!(prop in empty)) {
- context = contexts[prop];
- if (context.jQueryIncremented) {
- jQueryHoldReady(context.jQuery, false);
- context.jQueryIncremented = false;
- }
- }
- }
- }
- };
-
- //FF < 3.6 readyState fix. Needed so that domReady plugin
- //works well in that environment, since require.js is normally
- //loaded via an HTML script tag so it will be there before window load,
- //where the domReady plugin is more likely to be loaded after window load.
- req.pageLoaded = function () {
- if (document.readyState !== "complete") {
- document.readyState = "complete";
- }
- };
- if (isBrowser) {
- if (document.addEventListener) {
- if (!document.readyState) {
- document.readyState = "loading";
- window.addEventListener("load", req.pageLoaded, false);
- }
- }
- }
-
- //Set up default context. If require was a configuration object, use that as base config.
- req(cfg);
-
- //If modules are built into require.js, then need to make sure dependencies are
- //traced. Use a setTimeout in the browser world, to allow all the modules to register
- //themselves. In a non-browser env, assume that modules are not built into require.js,
- //which seems odd to do on the server.
- if (req.isAsync && typeof setTimeout !== "undefined") {
- ctx = s.contexts[(cfg.context || defContextName)];
- //Indicate that the script that includes require() is still loading,
- //so that require()'d dependencies are not traced until the end of the
- //file is parsed (approximated via the setTimeout call).
- ctx.requireWait = true;
- setTimeout(function () {
- ctx.requireWait = false;
-
- if (!ctx.scriptCount) {
- ctx.resume();
- }
- req.checkReadyState();
- }, 0);
- }
+ //Change this version number for each release.
+ var version = "1.0.7",
+ commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
+ cjsRequireRegExp = /require\(\s*["']([^'"\s]+)["']\s*\)/g,
+ currDirRegExp = /^\.\//,
+ jsSuffixRegExp = /\.js$/,
+ ostring = Object.prototype.toString,
+ ap = Array.prototype,
+ aps = ap.slice,
+ apsp = ap.splice,
+ isBrowser = !!(typeof window !== "undefined" && navigator && document),
+ isWebWorker = !isBrowser && typeof importScripts !== "undefined",
+ //PS3 indicates loaded and complete, but need to wait for complete
+ //specifically. Sequence is "loading", "loaded", execution,
+ // then "complete". The UA check is unfortunate, but not sure how
+ //to feature test w/o causing perf issues.
+ readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?
+ /^complete$/ : /^(complete|loaded)$/,
+ defContextName = "_",
+ //Oh the tragedy, detecting opera. See the usage of isOpera for reason.
+ isOpera = typeof opera !== "undefined" && opera.toString() === "[object Opera]",
+ empty = {},
+ contexts = {},
+ globalDefQueue = [],
+ interactiveScript = null,
+ checkLoadedDepth = 0,
+ useInteractive = false,
+ reservedDependencies = {
+ require : true,
+ module : true,
+ exports : true
+ },
+ req, cfg = {}, currentlyAddingScript, s, head, baseElement, scripts, script,
+ src, subPath, mainScript, dataMain, globalI, ctx, jQueryCheck, checkLoadedTimeoutId;
+
+ function isFunction( it ) {
+ return ostring.call( it ) === "[object Function]";
+ }
+
+ function isArray( it ) {
+ return ostring.call( it ) === "[object Array]";
+ }
+
+ /**
+ * Simple function to mix in properties from source into target,
+ * but only if target does not already have a property of the same name.
+ * This is not robust in IE for transferring methods that match
+ * Object.prototype names, but the uses of mixin here seem unlikely to
+ * trigger a problem related to that.
+ */
+ function mixin( target, source, force ) {
+ for ( var prop in source ) {
+ if ( !(prop in empty) && (!(prop in target) || force) ) {
+ target[prop] = source[prop];
+ }
+ }
+ return req;
+ }
+
+ /**
+ * Constructs an error with a pointer to an URL with more information.
+ * @param {String} id the error ID that maps to an ID on a web page.
+ * @param {String} message human readable error.
+ * @param {Error} [err] the original error, if there is one.
+ *
+ * @returns {Error}
+ */
+ function makeError( id, msg, err ) {
+ var e = new Error( msg + '\nhttp://requirejs.org/docs/errors.html#' + id );
+ if ( err ) {
+ e.originalError = err;
+ }
+ return e;
+ }
+
+ /**
+ * Used to set up package paths from a packagePaths or packages config object.
+ * @param {Object} pkgs the object to store the new package config
+ * @param {Array} currentPackages an array of packages to configure
+ * @param {String} [dir] a prefix dir to use.
+ */
+ function configurePackageDir( pkgs, currentPackages, dir ) {
+ var i, location, pkgObj;
+
+ for ( i = 0; (pkgObj = currentPackages[i]); i++ ) {
+ pkgObj = typeof pkgObj === "string" ? { name : pkgObj } : pkgObj;
+ location = pkgObj.location;
+
+ //Add dir to the path, but avoid paths that start with a slash
+ //or have a colon (indicates a protocol)
+ if ( dir && (!location || (location.indexOf( "/" ) !== 0 && location.indexOf( ":" ) === -1)) ) {
+ location = dir + "/" + (location || pkgObj.name);
+ }
+
+ //Create a brand new object on pkgs, since currentPackages can
+ //be passed in again, and config.pkgs is the internal transformed
+ //state for all package configs.
+ pkgs[pkgObj.name] = {
+ name : pkgObj.name,
+ location : location || pkgObj.name,
+ //Remove leading dot in main, so main paths are normalized,
+ //and remove any trailing .js, since different package
+ //envs have different conventions: some use a module name,
+ //some use a file name.
+ main : (pkgObj.main || "main")
+ .replace( currDirRegExp, '' )
+ .replace( jsSuffixRegExp, '' )
+ };
+ }
+ }
+
+ /**
+ * jQuery 1.4.3-1.5.x use a readyWait/ready() pairing to hold DOM
+ * ready callbacks, but jQuery 1.6 supports a holdReady() API instead.
+ * At some point remove the readyWait/ready() support and just stick
+ * with using holdReady.
+ */
+ function jQueryHoldReady( $, shouldHold ) {
+ if ( $.holdReady ) {
+ $.holdReady( shouldHold );
+ } else if ( shouldHold ) {
+ $.readyWait += 1;
+ } else {
+ $.ready( true );
+ }
+ }
+
+ if ( typeof define !== "undefined" ) {
+ //If a define is already in play via another AMD loader,
+ //do not overwrite.
+ return;
+ }
+
+ if ( typeof requirejs !== "undefined" ) {
+ if ( isFunction( requirejs ) ) {
+ //Do not overwrite and existing requirejs instance.
+ return;
+ } else {
+ cfg = requirejs;
+ requirejs = undefined;
+ }
+ }
+
+ //Allow for a require config object
+ if ( typeof require !== "undefined" && !isFunction( require ) ) {
+ //assume it is a config object.
+ cfg = require;
+ require = undefined;
+ }
+
+ /**
+ * Creates a new context for use in require and define calls.
+ * Handle most of the heavy lifting. Do not want to use an object
+ * with prototype here to avoid using "this" in require, in case it
+ * needs to be used in more super secure envs that do not want this.
+ * Also there should not be that many contexts in the page. Usually just
+ * one for the default context, but could be extra for multiversion cases
+ * or if a package needs a special context for a dependency that conflicts
+ * with the standard context.
+ */
+ function newContext( contextName ) {
+ var context, resume,
+ config = {
+ waitSeconds : 7,
+ baseUrl : "./",
+ paths : {},
+ pkgs : {},
+ catchError : {}
+ },
+ defQueue = [],
+ specified = {
+ "require" : true,
+ "exports" : true,
+ "module" : true
+ },
+ urlMap = {},
+ defined = {},
+ loaded = {},
+ waiting = {},
+ waitAry = [],
+ urlFetched = {},
+ managerCounter = 0,
+ managerCallbacks = {},
+ plugins = {},
+ //Used to indicate which modules in a build scenario
+ //need to be full executed.
+ needFullExec = {},
+ fullExec = {},
+ resumeDepth = 0;
+
+ /**
+ * Trims the . and .. from an array of path segments.
+ * It will keep a leading path segment if a .. will become
+ * the first path segment, to help with module name lookups,
+ * which act like paths, but can be remapped. But the end result,
+ * all paths that use this function should look normalized.
+ * NOTE: this method MODIFIES the input array.
+ * @param {Array} ary the array of path segments.
+ */
+ function trimDots( ary ) {
+ var i, part;
+ for ( i = 0; (part = ary[i]); i++ ) {
+ if ( part === "." ) {
+ ary.splice( i, 1 );
+ i -= 1;
+ } else if ( part === ".." ) {
+ if ( i === 1 && (ary[2] === '..' || ary[0] === '..') ) {
+ //End of the line. Keep at least one non-dot
+ //path segment at the front so it can be mapped
+ //correctly to disk. Otherwise, there is likely
+ //no path mapping for a path starting with '..'.
+ //This can still fail, but catches the most reasonable
+ //uses of ..
+ break;
+ } else if ( i > 0 ) {
+ ary.splice( i - 1, 2 );
+ i -= 2;
+ }
+ }
+ }
+ }
+
+ /**
+ * Given a relative module name, like ./something, normalize it to
+ * a real name that can be mapped to a path.
+ * @param {String} name the relative name
+ * @param {String} baseName a real name that the name arg is relative
+ * to.
+ * @returns {String} normalized name
+ */
+ function normalize( name, baseName ) {
+ var pkgName, pkgConfig;
+
+ //Adjust any relative paths.
+ if ( name && name.charAt( 0 ) === "." ) {
+ //If have a base name, try to normalize against it,
+ //otherwise, assume it is a top-level require that will
+ //be relative to baseUrl in the end.
+ if ( baseName ) {
+ if ( config.pkgs[baseName] ) {
+ //If the baseName is a package name, then just treat it as one
+ //name to concat the name with.
+ baseName = [baseName];
+ } else {
+ //Convert baseName to array, and lop off the last part,
+ //so that . matches that "directory" and not name of the baseName's
+ //module. For instance, baseName of "one/two/three", maps to
+ //"one/two/three.js", but we want the directory, "one/two" for
+ //this normalization.
+ baseName = baseName.split( "/" );
+ baseName = baseName.slice( 0, baseName.length - 1 );
+ }
+
+ name = baseName.concat( name.split( "/" ) );
+ trimDots( name );
+
+ //Some use of packages may use a . path to reference the
+ //"main" module name, so normalize for that.
+ pkgConfig = config.pkgs[(pkgName = name[0])];
+ name = name.join( "/" );
+ if ( pkgConfig && name === pkgName + '/' + pkgConfig.main ) {
+ name = pkgName;
+ }
+ } else if ( name.indexOf( "./" ) === 0 ) {
+ // No baseName, so this is ID is resolved relative
+ // to baseUrl, pull off the leading dot.
+ name = name.substring( 2 );
+ }
+ }
+ return name;
+ }
+
+ /**
+ * Creates a module mapping that includes plugin prefix, module
+ * name, and path. If parentModuleMap is provided it will
+ * also normalize the name via require.normalize()
+ *
+ * @param {String} name the module name
+ * @param {String} [parentModuleMap] parent module map
+ * for the module name, used to resolve relative names.
+ *
+ * @returns {Object}
+ */
+ function makeModuleMap( name, parentModuleMap ) {
+ var index = name ? name.indexOf( "!" ) : -1,
+ prefix = null,
+ parentName = parentModuleMap ? parentModuleMap.name : null,
+ originalName = name,
+ normalizedName, url, pluginModule;
+
+ if ( index !== -1 ) {
+ prefix = name.substring( 0, index );
+ name = name.substring( index + 1, name.length );
+ }
+
+ if ( prefix ) {
+ prefix = normalize( prefix, parentName );
+ }
+
+ //Account for relative paths if there is a base name.
+ if ( name ) {
+ if ( prefix ) {
+ pluginModule = defined[prefix];
+ if ( pluginModule && pluginModule.normalize ) {
+ //Plugin is loaded, use its normalize method.
+ normalizedName = pluginModule.normalize( name, function ( name ) {
+ return normalize( name, parentName );
+ } );
+ } else {
+ normalizedName = normalize( name, parentName );
+ }
+ } else {
+ //A regular module.
+ normalizedName = normalize( name, parentName );
+
+ url = urlMap[normalizedName];
+ if ( !url ) {
+ //Calculate url for the module, if it has a name.
+ //Use name here since nameToUrl also calls normalize,
+ //and for relative names that are outside the baseUrl
+ //this causes havoc. Was thinking of just removing
+ //parentModuleMap to avoid extra normalization, but
+ //normalize() still does a dot removal because of
+ //issue #142, so just pass in name here and redo
+ //the normalization. Paths outside baseUrl are just
+ //messy to support.
+ url = context.nameToUrl( name, null, parentModuleMap );
+
+ //Store the URL mapping for later.
+ urlMap[normalizedName] = url;
+ }
+ }
+ }
+
+ return {
+ prefix : prefix,
+ name : normalizedName,
+ parentMap : parentModuleMap,
+ url : url,
+ originalName : originalName,
+ fullName : prefix ? prefix + "!" + (normalizedName || '') : normalizedName
+ };
+ }
+
+ /**
+ * Determine if priority loading is done. If so clear the priorityWait
+ */
+ function isPriorityDone() {
+ var priorityDone = true,
+ priorityWait = config.priorityWait,
+ priorityName, i;
+ if ( priorityWait ) {
+ for ( i = 0; (priorityName = priorityWait[i]); i++ ) {
+ if ( !loaded[priorityName] ) {
+ priorityDone = false;
+ break;
+ }
+ }
+ if ( priorityDone ) {
+ delete config.priorityWait;
+ }
+ }
+ return priorityDone;
+ }
+
+ function makeContextModuleFunc( func, relModuleMap, enableBuildCallback ) {
+ return function () {
+ //A version of a require function that passes a moduleName
+ //value for items that may need to
+ //look up paths relative to the moduleName
+ var args = aps.call( arguments, 0 ), lastArg;
+ if ( enableBuildCallback &&
+ isFunction( (lastArg = args[args.length - 1]) ) ) {
+ lastArg.__requireJsBuild = true;
+ }
+ args.push( relModuleMap );
+ return func.apply( null, args );
+ };
+ }
+
+ /**
+ * Helper function that creates a require function object to give to
+ * modules that ask for it as a dependency. It needs to be specific
+ * per module because of the implication of path mappings that may
+ * need to be relative to the module name.
+ */
+ function makeRequire( relModuleMap, enableBuildCallback, altRequire ) {
+ var modRequire = makeContextModuleFunc( altRequire || context.require, relModuleMap, enableBuildCallback );
+
+ mixin( modRequire, {
+ nameToUrl : makeContextModuleFunc( context.nameToUrl, relModuleMap ),
+ toUrl : makeContextModuleFunc( context.toUrl, relModuleMap ),
+ defined : makeContextModuleFunc( context.requireDefined, relModuleMap ),
+ specified : makeContextModuleFunc( context.requireSpecified, relModuleMap ),
+ isBrowser : req.isBrowser
+ } );
+ return modRequire;
+ }
+
+ /*
+ * Queues a dependency for checking after the loader is out of a
+ * "paused" state, for example while a script file is being loaded
+ * in the browser, where it may have many modules defined in it.
+ */
+ function queueDependency( manager ) {
+ context.paused.push( manager );
+ }
+
+ function execManager( manager ) {
+ var i, ret, err, errFile, errModuleTree,
+ cb = manager.callback,
+ map = manager.map,
+ fullName = map.fullName,
+ args = manager.deps,
+ listeners = manager.listeners,
+ cjsModule;
+
+ //Call the callback to define the module, if necessary.
+ if ( cb && isFunction( cb ) ) {
+ if ( config.catchError.define ) {
+ try {
+ ret = req.execCb( fullName, manager.callback, args, defined[fullName] );
+ } catch ( e ) {
+ err = e;
+ }
+ } else {
+ ret = req.execCb( fullName, manager.callback, args, defined[fullName] );
+ }
+
+ if ( fullName ) {
+ //If setting exports via "module" is in play,
+ //favor that over return value and exports. After that,
+ //favor a non-undefined return value over exports use.
+ cjsModule = manager.cjsModule;
+ if ( cjsModule &&
+ cjsModule.exports !== undefined &&
+ //Make sure it is not already the exports value
+ cjsModule.exports !== defined[fullName] ) {
+ ret = defined[fullName] = manager.cjsModule.exports;
+ } else if ( ret === undefined && manager.usingExports ) {
+ //exports already set the defined value.
+ ret = defined[fullName];
+ } else {
+ //Use the return value from the function.
+ defined[fullName] = ret;
+ //If this module needed full execution in a build
+ //environment, mark that now.
+ if ( needFullExec[fullName] ) {
+ fullExec[fullName] = true;
+ }
+ }
+ }
+ } else if ( fullName ) {
+ //May just be an object definition for the module. Only
+ //worry about defining if have a module name.
+ ret = defined[fullName] = cb;
+
+ //If this module needed full execution in a build
+ //environment, mark that now.
+ if ( needFullExec[fullName] ) {
+ fullExec[fullName] = true;
+ }
+ }
+
+ //Clean up waiting. Do this before error calls, and before
+ //calling back listeners, so that bookkeeping is correct
+ //in the event of an error and error is reported in correct order,
+ //since the listeners will likely have errors if the
+ //onError function does not throw.
+ if ( waiting[manager.id] ) {
+ delete waiting[manager.id];
+ manager.isDone = true;
+ context.waitCount -= 1;
+ if ( context.waitCount === 0 ) {
+ //Clear the wait array used for cycles.
+ waitAry = [];
+ }
+ }
+
+ //Do not need to track manager callback now that it is defined.
+ delete managerCallbacks[fullName];
+
+ //Allow instrumentation like the optimizer to know the order
+ //of modules executed and their dependencies.
+ if ( req.onResourceLoad && !manager.placeholder ) {
+ req.onResourceLoad( context, map, manager.depArray );
+ }
+
+ if ( err ) {
+ errFile = (fullName ? makeModuleMap( fullName ).url : '') ||
+ err.fileName || err.sourceURL;
+ errModuleTree = err.moduleTree;
+ err = makeError( 'defineerror', 'Error evaluating ' +
+ 'module "' + fullName + '" at location "' +
+ errFile + '":\n' +
+ err + '\nfileName:' + errFile +
+ '\nlineNumber: ' + (err.lineNumber || err.line), err );
+ err.moduleName = fullName;
+ err.moduleTree = errModuleTree;
+ return req.onError( err );
+ }
+
+ //Let listeners know of this manager's value.
+ for ( i = 0; (cb = listeners[i]); i++ ) {
+ cb( ret );
+ }
+
+ return undefined;
+ }
+
+ /**
+ * Helper that creates a callack function that is called when a dependency
+ * is ready, and sets the i-th dependency for the manager as the
+ * value passed to the callback generated by this function.
+ */
+ function makeArgCallback( manager, i ) {
+ return function ( value ) {
+ //Only do the work if it has not been done
+ //already for a dependency. Cycle breaking
+ //logic in forceExec could mean this function
+ //is called more than once for a given dependency.
+ if ( !manager.depDone[i] ) {
+ manager.depDone[i] = true;
+ manager.deps[i] = value;
+ manager.depCount -= 1;
+ if ( !manager.depCount ) {
+ //All done, execute!
+ execManager( manager );
+ }
+ }
+ };
+ }
+
+ function callPlugin( pluginName, depManager ) {
+ var map = depManager.map,
+ fullName = map.fullName,
+ name = map.name,
+ plugin = plugins[pluginName] ||
+ (plugins[pluginName] = defined[pluginName]),
+ load;
+
+ //No need to continue if the manager is already
+ //in the process of loading.
+ if ( depManager.loading ) {
+ return;
+ }
+ depManager.loading = true;
+
+ load = function ( ret ) {
+ depManager.callback = function () {
+ return ret;
+ };
+ execManager( depManager );
+
+ loaded[depManager.id] = true;
+
+ //The loading of this plugin
+ //might have placed other things
+ //in the paused queue. In particular,
+ //a loader plugin that depends on
+ //a different plugin loaded resource.
+ resume();
+ };
+
+ //Allow plugins to load other code without having to know the
+ //context or how to "complete" the load.
+ load.fromText = function ( moduleName, text ) {
+ /*jslint evil: true */
+ var hasInteractive = useInteractive;
+
+ //Indicate a the module is in process of loading.
+ loaded[moduleName] = false;
+ context.scriptCount += 1;
+
+ //Indicate this is not a "real" module, so do not track it
+ //for builds, it does not map to a real file.
+ context.fake[moduleName] = true;
+
+ //Turn off interactive script matching for IE for any define
+ //calls in the text, then turn it back on at the end.
+ if ( hasInteractive ) {
+ useInteractive = false;
+ }
+
+ req.exec( text );
+
+ if ( hasInteractive ) {
+ useInteractive = true;
+ }
+
+ //Support anonymous modules.
+ context.completeLoad( moduleName );
+ };
+
+ //No need to continue if the plugin value has already been
+ //defined by a build.
+ if ( fullName in defined ) {
+ load( defined[fullName] );
+ } else {
+ //Use parentName here since the plugin's name is not reliable,
+ //could be some weird string with no path that actually wants to
+ //reference the parentName's path.
+ plugin.load( name, makeRequire( map.parentMap, true, function ( deps, cb ) {
+ var moduleDeps = [],
+ i, dep, depMap;
+ //Convert deps to full names and hold on to them
+ //for reference later, when figuring out if they
+ //are blocked by a circular dependency.
+ for ( i = 0; (dep = deps[i]); i++ ) {
+ depMap = makeModuleMap( dep, map.parentMap );
+ deps[i] = depMap.fullName;
+ if ( !depMap.prefix ) {
+ moduleDeps.push( deps[i] );
+ }
+ }
+ depManager.moduleDeps = (depManager.moduleDeps || []).concat( moduleDeps );
+ return context.require( deps, cb );
+ } ), load, config );
+ }
+ }
+
+ /**
+ * Adds the manager to the waiting queue. Only fully
+ * resolved items should be in the waiting queue.
+ */
+ function addWait( manager ) {
+ if ( !waiting[manager.id] ) {
+ waiting[manager.id] = manager;
+ waitAry.push( manager );
+ context.waitCount += 1;
+ }
+ }
+
+ /**
+ * Function added to every manager object. Created out here
+ * to avoid new function creation for each manager instance.
+ */
+ function managerAdd( cb ) {
+ this.listeners.push( cb );
+ }
+
+ function getManager( map, shouldQueue ) {
+ var fullName = map.fullName,
+ prefix = map.prefix,
+ plugin = prefix ? plugins[prefix] ||
+ (plugins[prefix] = defined[prefix]) : null,
+ manager, created, pluginManager, prefixMap;
+
+ if ( fullName ) {
+ manager = managerCallbacks[fullName];
+ }
+
+ if ( !manager ) {
+ created = true;
+ manager = {
+ //ID is just the full name, but if it is a plugin resource
+ //for a plugin that has not been loaded,
+ //then add an ID counter to it.
+ id : (prefix && !plugin ?
+ (managerCounter++) + '__p@:' : '') +
+ (fullName || '__r@' + (managerCounter++)),
+ map : map,
+ depCount : 0,
+ depDone : [],
+ depCallbacks : [],
+ deps : [],
+ listeners : [],
+ add : managerAdd
+ };
+
+ specified[manager.id] = true;
+
+ //Only track the manager/reuse it if this is a non-plugin
+ //resource. Also only track plugin resources once
+ //the plugin has been loaded, and so the fullName is the
+ //true normalized value.
+ if ( fullName && (!prefix || plugins[prefix]) ) {
+ managerCallbacks[fullName] = manager;
+ }
+ }
+
+ //If there is a plugin needed, but it is not loaded,
+ //first load the plugin, then continue on.
+ if ( prefix && !plugin ) {
+ prefixMap = makeModuleMap( prefix );
+
+ //Clear out defined and urlFetched if the plugin was previously
+ //loaded/defined, but not as full module (as in a build
+ //situation). However, only do this work if the plugin is in
+ //defined but does not have a module export value.
+ if ( prefix in defined && !defined[prefix] ) {
+ delete defined[prefix];
+ delete urlFetched[prefixMap.url];
+ }
+
+ pluginManager = getManager( prefixMap, true );
+ pluginManager.add( function ( plugin ) {
+ //Create a new manager for the normalized
+ //resource ID and have it call this manager when
+ //done.
+ var newMap = makeModuleMap( map.originalName, map.parentMap ),
+ normalizedManager = getManager( newMap, true );
+
+ //Indicate this manager is a placeholder for the real,
+ //normalized thing. Important for when trying to map
+ //modules and dependencies, for instance, in a build.
+ manager.placeholder = true;
+
+ normalizedManager.add( function ( resource ) {
+ manager.callback = function () {
+ return resource;
+ };
+ execManager( manager );
+ } );
+ } );
+ } else if ( created && shouldQueue ) {
+ //Indicate the resource is not loaded yet if it is to be
+ //queued.
+ loaded[manager.id] = false;
+ queueDependency( manager );
+ addWait( manager );
+ }
+
+ return manager;
+ }
+
+ function main( inName, depArray, callback, relModuleMap ) {
+ var moduleMap = makeModuleMap( inName, relModuleMap ),
+ name = moduleMap.name,
+ fullName = moduleMap.fullName,
+ manager = getManager( moduleMap ),
+ id = manager.id,
+ deps = manager.deps,
+ i, depArg, depName, depPrefix, cjsMod;
+
+ if ( fullName ) {
+ //If module already defined for context, or already loaded,
+ //then leave. Also leave if jQuery is registering but it does
+ //not match the desired version number in the config.
+ if ( fullName in defined || loaded[id] === true ||
+ (fullName === "jquery" && config.jQuery &&
+ config.jQuery !== callback().fn.jquery) ) {
+ return;
+ }
+
+ //Set specified/loaded here for modules that are also loaded
+ //as part of a layer, where onScriptLoad is not fired
+ //for those cases. Do this after the inline define and
+ //dependency tracing is done.
+ specified[id] = true;
+ loaded[id] = true;
+
+ //If module is jQuery set up delaying its dom ready listeners.
+ if ( fullName === "jquery" && callback ) {
+ jQueryCheck( callback() );
+ }
+ }
+
+ //Attach real depArray and callback to the manager. Do this
+ //only if the module has not been defined already, so do this after
+ //the fullName checks above. IE can call main() more than once
+ //for a module.
+ manager.depArray = depArray;
+ manager.callback = callback;
+
+ //Add the dependencies to the deps field, and register for callbacks
+ //on the dependencies.
+ for ( i = 0; i < depArray.length; i++ ) {
+ depArg = depArray[i];
+ //There could be cases like in IE, where a trailing comma will
+ //introduce a null dependency, so only treat a real dependency
+ //value as a dependency.
+ if ( depArg ) {
+ //Split the dependency name into plugin and name parts
+ depArg = makeModuleMap( depArg, (name ? moduleMap : relModuleMap) );
+ depName = depArg.fullName;
+ depPrefix = depArg.prefix;
+
+ //Fix the name in depArray to be just the name, since
+ //that is how it will be called back later.
+ depArray[i] = depName;
+
+ //Fast path CommonJS standard dependencies.
+ if ( depName === "require" ) {
+ deps[i] = makeRequire( moduleMap );
+ } else if ( depName === "exports" ) {
+ //CommonJS module spec 1.1
+ deps[i] = defined[fullName] = {};
+ manager.usingExports = true;
+ } else if ( depName === "module" ) {
+ //CommonJS module spec 1.1
+ manager.cjsModule = cjsMod = deps[i] = {
+ id : name,
+ uri : name ? context.nameToUrl( name, null, relModuleMap ) : undefined,
+ exports : defined[fullName]
+ };
+ } else if ( depName in defined && !(depName in waiting) &&
+ (!(fullName in needFullExec) ||
+ (fullName in needFullExec && fullExec[depName])) ) {
+ //Module already defined, and not in a build situation
+ //where the module is a something that needs full
+ //execution and this dependency has not been fully
+ //executed. See r.js's requirePatch.js for more info
+ //on fullExec.
+ deps[i] = defined[depName];
+ } else {
+ //Mark this dependency as needing full exec if
+ //the current module needs full exec.
+ if ( fullName in needFullExec ) {
+ needFullExec[depName] = true;
+ //Reset state so fully executed code will get
+ //picked up correctly.
+ delete defined[depName];
+ urlFetched[depArg.url] = false;
+ }
+
+ //Either a resource that is not loaded yet, or a plugin
+ //resource for either a plugin that has not
+ //loaded yet.
+ manager.depCount += 1;
+ manager.depCallbacks[i] = makeArgCallback( manager, i );
+ getManager( depArg, true ).add( manager.depCallbacks[i] );
+ }
+ }
+ }
+
+ //Do not bother tracking the manager if it is all done.
+ if ( !manager.depCount ) {
+ //All done, execute!
+ execManager( manager );
+ } else {
+ addWait( manager );
+ }
+ }
+
+ /**
+ * Convenience method to call main for a define call that was put on
+ * hold in the defQueue.
+ */
+ function callDefMain( args ) {
+ main.apply( null, args );
+ }
+
+ /**
+ * jQuery 1.4.3+ supports ways to hold off calling
+ * calling jQuery ready callbacks until all scripts are loaded. Be sure
+ * to track it if the capability exists.. Also, since jQuery 1.4.3 does
+ * not register as a module, need to do some global inference checking.
+ * Even if it does register as a module, not guaranteed to be the precise
+ * name of the global. If a jQuery is tracked for this context, then go
+ * ahead and register it as a module too, if not already in process.
+ */
+ jQueryCheck = function ( jqCandidate ) {
+ if ( !context.jQuery ) {
+ var $ = jqCandidate || (typeof jQuery !== "undefined" ? jQuery : null);
+
+ if ( $ ) {
+ //If a specific version of jQuery is wanted, make sure to only
+ //use this jQuery if it matches.
+ if ( config.jQuery && $.fn.jquery !== config.jQuery ) {
+ return;
+ }
+
+ if ( "holdReady" in $ || "readyWait" in $ ) {
+ context.jQuery = $;
+
+ //Manually create a "jquery" module entry if not one already
+ //or in process. Note this could trigger an attempt at
+ //a second jQuery registration, but does no harm since
+ //the first one wins, and it is the same value anyway.
+ callDefMain( ["jquery", [], function () {
+ return jQuery;
+ }] );
+
+ //Ask jQuery to hold DOM ready callbacks.
+ if ( context.scriptCount ) {
+ jQueryHoldReady( $, true );
+ context.jQueryIncremented = true;
+ }
+ }
+ }
+ }
+ };
+
+ function findCycle( manager, traced ) {
+ var fullName = manager.map.fullName,
+ depArray = manager.depArray,
+ fullyLoaded = true,
+ i, depName, depManager, result;
+
+ if ( manager.isDone || !fullName || !loaded[fullName] ) {
+ return result;
+ }
+
+ //Found the cycle.
+ if ( traced[fullName] ) {
+ return manager;
+ }
+
+ traced[fullName] = true;
+
+ //Trace through the dependencies.
+ if ( depArray ) {
+ for ( i = 0; i < depArray.length; i++ ) {
+ //Some array members may be null, like if a trailing comma
+ //IE, so do the explicit [i] access and check if it has a value.
+ depName = depArray[i];
+ if ( !loaded[depName] && !reservedDependencies[depName] ) {
+ fullyLoaded = false;
+ break;
+ }
+ depManager = waiting[depName];
+ if ( depManager && !depManager.isDone && loaded[depName] ) {
+ result = findCycle( depManager, traced );
+ if ( result ) {
+ break;
+ }
+ }
+ }
+ if ( !fullyLoaded ) {
+ //Discard the cycle that was found, since it cannot
+ //be forced yet. Also clear this module from traced.
+ result = undefined;
+ delete traced[fullName];
+ }
+ }
+
+ return result;
+ }
+
+ function forceExec( manager, traced ) {
+ var fullName = manager.map.fullName,
+ depArray = manager.depArray,
+ i, depName, depManager, prefix, prefixManager, value;
+
+
+ if ( manager.isDone || !fullName || !loaded[fullName] ) {
+ return undefined;
+ }
+
+ if ( fullName ) {
+ if ( traced[fullName] ) {
+ return defined[fullName];
+ }
+
+ traced[fullName] = true;
+ }
+
+ //Trace through the dependencies.
+ if ( depArray ) {
+ for ( i = 0; i < depArray.length; i++ ) {
+ //Some array members may be null, like if a trailing comma
+ //IE, so do the explicit [i] access and check if it has a value.
+ depName = depArray[i];
+ if ( depName ) {
+ //First, make sure if it is a plugin resource that the
+ //plugin is not blocked.
+ prefix = makeModuleMap( depName ).prefix;
+ if ( prefix && (prefixManager = waiting[prefix]) ) {
+ forceExec( prefixManager, traced );
+ }
+ depManager = waiting[depName];
+ if ( depManager && !depManager.isDone && loaded[depName] ) {
+ value = forceExec( depManager, traced );
+ manager.depCallbacks[i]( value );
+ }
+ }
+ }
+ }
+
+ return defined[fullName];
+ }
+
+ /**
+ * Checks if all modules for a context are loaded, and if so, evaluates the
+ * new ones in right dependency order.
+ *
+ * @private
+ */
+ function checkLoaded() {
+ var waitInterval = config.waitSeconds * 1000,
+ //It is possible to disable the wait interval by using waitSeconds of 0.
+ expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),
+ noLoads = "", hasLoadedProp = false, stillLoading = false,
+ cycleDeps = [],
+ i, prop, err, manager, cycleManager, moduleDeps;
+
+ //If there are items still in the paused queue processing wait.
+ //This is particularly important in the sync case where each paused
+ //item is processed right away but there may be more waiting.
+ if ( context.pausedCount > 0 ) {
+ return undefined;
+ }
+
+ //Determine if priority loading is done. If so clear the priority. If
+ //not, then do not check
+ if ( config.priorityWait ) {
+ if ( isPriorityDone() ) {
+ //Call resume, since it could have
+ //some waiting dependencies to trace.
+ resume();
+ } else {
+ return undefined;
+ }
+ }
+
+ //See if anything is still in flight.
+ for ( prop in loaded ) {
+ if ( !(prop in empty) ) {
+ hasLoadedProp = true;
+ if ( !loaded[prop] ) {
+ if ( expired ) {
+ noLoads += prop + " ";
+ } else {
+ stillLoading = true;
+ if ( prop.indexOf( '!' ) === -1 ) {
+ //No reason to keep looking for unfinished
+ //loading. If the only stillLoading is a
+ //plugin resource though, keep going,
+ //because it may be that a plugin resource
+ //is waiting on a non-plugin cycle.
+ cycleDeps = [];
+ break;
+ } else {
+ moduleDeps = managerCallbacks[prop] && managerCallbacks[prop].moduleDeps;
+ if ( moduleDeps ) {
+ cycleDeps.push.apply( cycleDeps, moduleDeps );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //Check for exit conditions.
+ if ( !hasLoadedProp && !context.waitCount ) {
+ //If the loaded object had no items, then the rest of
+ //the work below does not need to be done.
+ return undefined;
+ }
+ if ( expired && noLoads ) {
+ //If wait time expired, throw error of unloaded modules.
+ err = makeError( "timeout", "Load timeout for modules: " + noLoads );
+ err.requireType = "timeout";
+ err.requireModules = noLoads;
+ err.contextName = context.contextName;
+ return req.onError( err );
+ }
+
+ //If still loading but a plugin is waiting on a regular module cycle
+ //break the cycle.
+ if ( stillLoading && cycleDeps.length ) {
+ for ( i = 0; (manager = waiting[cycleDeps[i]]); i++ ) {
+ if ( (cycleManager = findCycle( manager, {} )) ) {
+ forceExec( cycleManager, {} );
+ break;
+ }
+ }
+
+ }
+
+ //If still waiting on loads, and the waiting load is something
+ //other than a plugin resource, or there are still outstanding
+ //scripts, then just try back later.
+ if ( !expired && (stillLoading || context.scriptCount) ) {
+ //Something is still waiting to load. Wait for it, but only
+ //if a timeout is not already in effect.
+ if ( (isBrowser || isWebWorker) && !checkLoadedTimeoutId ) {
+ checkLoadedTimeoutId = setTimeout( function () {
+ checkLoadedTimeoutId = 0;
+ checkLoaded();
+ }, 50 );
+ }
+ return undefined;
+ }
+
+ //If still have items in the waiting cue, but all modules have
+ //been loaded, then it means there are some circular dependencies
+ //that need to be broken.
+ //However, as a waiting thing is fired, then it can add items to
+ //the waiting cue, and those items should not be fired yet, so
+ //make sure to redo the checkLoaded call after breaking a single
+ //cycle, if nothing else loaded then this logic will pick it up
+ //again.
+ if ( context.waitCount ) {
+ //Cycle through the waitAry, and call items in sequence.
+ for ( i = 0; (manager = waitAry[i]); i++ ) {
+ forceExec( manager, {} );
+ }
+
+ //If anything got placed in the paused queue, run it down.
+ if ( context.paused.length ) {
+ resume();
+ }
+
+ //Only allow this recursion to a certain depth. Only
+ //triggered by errors in calling a module in which its
+ //modules waiting on it cannot finish loading, or some circular
+ //dependencies that then may add more dependencies.
+ //The value of 5 is a bit arbitrary. Hopefully just one extra
+ //pass, or two for the case of circular dependencies generating
+ //more work that gets resolved in the sync node case.
+ if ( checkLoadedDepth < 5 ) {
+ checkLoadedDepth += 1;
+ checkLoaded();
+ }
+ }
+
+ checkLoadedDepth = 0;
+
+ //Check for DOM ready, and nothing is waiting across contexts.
+ req.checkReadyState();
+
+ return undefined;
+ }
+
+ /**
+ * Resumes tracing of dependencies and then checks if everything is loaded.
+ */
+ resume = function () {
+ var manager, map, url, i, p, args, fullName;
+
+ //Any defined modules in the global queue, intake them now.
+ context.takeGlobalQueue();
+
+ resumeDepth += 1;
+
+ if ( context.scriptCount <= 0 ) {
+ //Synchronous envs will push the number below zero with the
+ //decrement above, be sure to set it back to zero for good measure.
+ //require() calls that also do not end up loading scripts could
+ //push the number negative too.
+ context.scriptCount = 0;
+ }
+
+ //Make sure any remaining defQueue items get properly processed.
+ while ( defQueue.length ) {
+ args = defQueue.shift();
+ if ( args[0] === null ) {
+ return req.onError( makeError( 'mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1] ) );
+ } else {
+ callDefMain( args );
+ }
+ }
+
+ //Skip the resume of paused dependencies
+ //if current context is in priority wait.
+ if ( !config.priorityWait || isPriorityDone() ) {
+ while ( context.paused.length ) {
+ p = context.paused;
+ context.pausedCount += p.length;
+ //Reset paused list
+ context.paused = [];
+
+ for ( i = 0; (manager = p[i]); i++ ) {
+ map = manager.map;
+ url = map.url;
+ fullName = map.fullName;
+
+ //If the manager is for a plugin managed resource,
+ //ask the plugin to load it now.
+ if ( map.prefix ) {
+ callPlugin( map.prefix, manager );
+ } else {
+ //Regular dependency.
+ if ( !urlFetched[url] && !loaded[fullName] ) {
+ req.load( context, fullName, url );
+
+ //Mark the URL as fetched, but only if it is
+ //not an empty: URL, used by the optimizer.
+ //In that case we need to be sure to call
+ //load() for each module that is mapped to
+ //empty: so that dependencies are satisfied
+ //correctly.
+ if ( url.indexOf( 'empty:' ) !== 0 ) {
+ urlFetched[url] = true;
+ }
+ }
+ }
+ }
+
+ //Move the start time for timeout forward.
+ context.startTime = (new Date()).getTime();
+ context.pausedCount -= p.length;
+ }
+ }
+
+ //Only check if loaded when resume depth is 1. It is likely that
+ //it is only greater than 1 in sync environments where a factory
+ //function also then calls the callback-style require. In those
+ //cases, the checkLoaded should not occur until the resume
+ //depth is back at the top level.
+ if ( resumeDepth === 1 ) {
+ checkLoaded();
+ }
+
+ resumeDepth -= 1;
+
+ return undefined;
+ };
+
+ //Define the context object. Many of these fields are on here
+ //just to make debugging easier.
+ context = {
+ contextName : contextName,
+ config : config,
+ defQueue : defQueue,
+ waiting : waiting,
+ waitCount : 0,
+ specified : specified,
+ loaded : loaded,
+ urlMap : urlMap,
+ urlFetched : urlFetched,
+ scriptCount : 0,
+ defined : defined,
+ paused : [],
+ pausedCount : 0,
+ plugins : plugins,
+ needFullExec : needFullExec,
+ fake : {},
+ fullExec : fullExec,
+ managerCallbacks : managerCallbacks,
+ makeModuleMap : makeModuleMap,
+ normalize : normalize,
+ /**
+ * Set a configuration for the context.
+ * @param {Object} cfg config object to integrate.
+ */
+ configure : function ( cfg ) {
+ var paths, prop, packages, pkgs, packagePaths, requireWait;
+
+ //Make sure the baseUrl ends in a slash.
+ if ( cfg.baseUrl ) {
+ if ( cfg.baseUrl.charAt( cfg.baseUrl.length - 1 ) !== "/" ) {
+ cfg.baseUrl += "/";
+ }
+ }
+
+ //Save off the paths and packages since they require special processing,
+ //they are additive.
+ paths = config.paths;
+ packages = config.packages;
+ pkgs = config.pkgs;
+
+ //Mix in the config values, favoring the new values over
+ //existing ones in context.config.
+ mixin( config, cfg, true );
+
+ //Adjust paths if necessary.
+ if ( cfg.paths ) {
+ for ( prop in cfg.paths ) {
+ if ( !(prop in empty) ) {
+ paths[prop] = cfg.paths[prop];
+ }
+ }
+ config.paths = paths;
+ }
+
+ packagePaths = cfg.packagePaths;
+ if ( packagePaths || cfg.packages ) {
+ //Convert packagePaths into a packages config.
+ if ( packagePaths ) {
+ for ( prop in packagePaths ) {
+ if ( !(prop in empty) ) {
+ configurePackageDir( pkgs, packagePaths[prop], prop );
+ }
+ }
+ }
+
+ //Adjust packages if necessary.
+ if ( cfg.packages ) {
+ configurePackageDir( pkgs, cfg.packages );
+ }
+
+ //Done with modifications, assing packages back to context config
+ config.pkgs = pkgs;
+ }
+
+ //If priority loading is in effect, trigger the loads now
+ if ( cfg.priority ) {
+ //Hold on to requireWait value, and reset it after done
+ requireWait = context.requireWait;
+
+ //Allow tracing some require calls to allow the fetching
+ //of the priority config.
+ context.requireWait = false;
+ //But first, call resume to register any defined modules that may
+ //be in a data-main built file before the priority config
+ //call.
+ resume();
+
+ context.require( cfg.priority );
+
+ //Trigger a resume right away, for the case when
+ //the script with the priority load is done as part
+ //of a data-main call. In that case the normal resume
+ //call will not happen because the scriptCount will be
+ //at 1, since the script for data-main is being processed.
+ resume();
+
+ //Restore previous state.
+ context.requireWait = requireWait;
+ config.priorityWait = cfg.priority;
+ }
+
+ //If a deps array or a config callback is specified, then call
+ //require with those args. This is useful when require is defined as a
+ //config object before require.js is loaded.
+ if ( cfg.deps || cfg.callback ) {
+ context.require( cfg.deps || [], cfg.callback );
+ }
+ },
+
+ requireDefined : function ( moduleName, relModuleMap ) {
+ return makeModuleMap( moduleName, relModuleMap ).fullName in defined;
+ },
+
+ requireSpecified : function ( moduleName, relModuleMap ) {
+ return makeModuleMap( moduleName, relModuleMap ).fullName in specified;
+ },
+
+ require : function ( deps, callback, relModuleMap ) {
+ var moduleName, fullName, moduleMap;
+ if ( typeof deps === "string" ) {
+ if ( isFunction( callback ) ) {
+ //Invalid call
+ return req.onError( makeError( "requireargs", "Invalid require call" ) );
+ }
+
+ //Synchronous access to one module. If require.get is
+ //available (as in the Node adapter), prefer that.
+ //In this case deps is the moduleName and callback is
+ //the relModuleMap
+ if ( req.get ) {
+ return req.get( context, deps, callback );
+ }
+
+ //Just return the module wanted. In this scenario, the
+ //second arg (if passed) is just the relModuleMap.
+ moduleName = deps;
+ relModuleMap = callback;
+
+ //Normalize module name, if it contains . or ..
+ moduleMap = makeModuleMap( moduleName, relModuleMap );
+ fullName = moduleMap.fullName;
+
+ if ( !(fullName in defined) ) {
+ return req.onError( makeError( "notloaded", "Module name '" +
+ moduleMap.fullName +
+ "' has not been loaded yet for context: " +
+ contextName ) );
+ }
+ return defined[fullName];
+ }
+
+ //Call main but only if there are dependencies or
+ //a callback to call.
+ if ( deps && deps.length || callback ) {
+ main( null, deps, callback, relModuleMap );
+ }
+
+ //If the require call does not trigger anything new to load,
+ //then resume the dependency processing.
+ if ( !context.requireWait ) {
+ while ( !context.scriptCount && context.paused.length ) {
+ resume();
+ }
+ }
+ return context.require;
+ },
+
+ /**
+ * Internal method to transfer globalQueue items to this context's
+ * defQueue.
+ */
+ takeGlobalQueue : function () {
+ //Push all the globalDefQueue items into the context's defQueue
+ if ( globalDefQueue.length ) {
+ //Array splice in the values since the context code has a
+ //local var ref to defQueue, so cannot just reassign the one
+ //on context.
+ apsp.apply( context.defQueue,
+ [context.defQueue.length - 1, 0].concat( globalDefQueue ) );
+ globalDefQueue = [];
+ }
+ },
+
+ /**
+ * Internal method used by environment adapters to complete a load event.
+ * A load event could be a script load or just a load pass from a synchronous
+ * load call.
+ * @param {String} moduleName the name of the module to potentially complete.
+ */
+ completeLoad : function ( moduleName ) {
+ var args;
+
+ context.takeGlobalQueue();
+
+ while ( defQueue.length ) {
+ args = defQueue.shift();
+
+ if ( args[0] === null ) {
+ args[0] = moduleName;
+ break;
+ } else if ( args[0] === moduleName ) {
+ //Found matching define call for this script!
+ break;
+ } else {
+ //Some other named define call, most likely the result
+ //of a build layer that included many define calls.
+ callDefMain( args );
+ args = null;
+ }
+ }
+ if ( args ) {
+ callDefMain( args );
+ } else {
+ //A script that does not call define(), so just simulate
+ //the call for it. Special exception for jQuery dynamic load.
+ callDefMain( [moduleName, [],
+ moduleName === "jquery" && typeof jQuery !== "undefined" ?
+ function () {
+ return jQuery;
+ } : null] );
+ }
+
+ //Doing this scriptCount decrement branching because sync envs
+ //need to decrement after resume, otherwise it looks like
+ //loading is complete after the first dependency is fetched.
+ //For browsers, it works fine to decrement after, but it means
+ //the checkLoaded setTimeout 50 ms cost is taken. To avoid
+ //that cost, decrement beforehand.
+ if ( req.isAsync ) {
+ context.scriptCount -= 1;
+ }
+ resume();
+ if ( !req.isAsync ) {
+ context.scriptCount -= 1;
+ }
+ },
+
+ /**
+ * Converts a module name + .extension into an URL path.
+ * *Requires* the use of a module name. It does not support using
+ * plain URLs like nameToUrl.
+ */
+ toUrl : function ( moduleNamePlusExt, relModuleMap ) {
+ var index = moduleNamePlusExt.lastIndexOf( "." ),
+ ext = null;
+
+ if ( index !== -1 ) {
+ ext = moduleNamePlusExt.substring( index, moduleNamePlusExt.length );
+ moduleNamePlusExt = moduleNamePlusExt.substring( 0, index );
+ }
+
+ return context.nameToUrl( moduleNamePlusExt, ext, relModuleMap );
+ },
+
+ /**
+ * Converts a module name to a file path. Supports cases where
+ * moduleName may actually be just an URL.
+ */
+ nameToUrl : function ( moduleName, ext, relModuleMap ) {
+ var paths, pkgs, pkg, pkgPath, syms, i, parentModule, url,
+ config = context.config;
+
+ //Normalize module name if have a base relative module name to work from.
+ moduleName = normalize( moduleName, relModuleMap && relModuleMap.fullName );
+
+ //If a colon is in the URL, it indicates a protocol is used and it is just
+ //an URL to a file, or if it starts with a slash or ends with .js, it is just a plain file.
+ //The slash is important for protocol-less URLs as well as full paths.
+ if ( req.jsExtRegExp.test( moduleName ) ) {
+ //Just a plain path, not module name lookup, so just return it.
+ //Add extension if it is included. This is a bit wonky, only non-.js things pass
+ //an extension, this method probably needs to be reworked.
+ url = moduleName + (ext ? ext : "");
+ } else {
+ //A module that needs to be converted to a path.
+ paths = config.paths;
+ pkgs = config.pkgs;
+
+ syms = moduleName.split( "/" );
+ //For each module name segment, see if there is a path
+ //registered for it. Start with most specific name
+ //and work up from it.
+ for ( i = syms.length; i > 0; i-- ) {
+ parentModule = syms.slice( 0, i ).join( "/" );
+ if ( paths[parentModule] ) {
+ syms.splice( 0, i, paths[parentModule] );
+ break;
+ } else if ( (pkg = pkgs[parentModule]) ) {
+ //If module name is just the package name, then looking
+ //for the main module.
+ if ( moduleName === pkg.name ) {
+ pkgPath = pkg.location + '/' + pkg.main;
+ } else {
+ pkgPath = pkg.location;
+ }
+ syms.splice( 0, i, pkgPath );
+ break;
+ }
+ }
+
+ //Join the path parts together, then figure out if baseUrl is needed.
+ url = syms.join( "/" ) + (ext || ".js");
+ url = (url.charAt( 0 ) === '/' || url.match( /^\w+:/ ) ? "" : config.baseUrl) + url;
+ }
+
+ return config.urlArgs ? url +
+ ((url.indexOf( '?' ) === -1 ? '?' : '&') +
+ config.urlArgs) : url;
+ }
+ };
+
+ //Make these visible on the context so can be called at the very
+ //end of the file to bootstrap
+ context.jQueryCheck = jQueryCheck;
+ context.resume = resume;
+
+ return context;
+ }
+
+ /**
+ * Main entry point.
+ *
+ * If the only argument to require is a string, then the module that
+ * is represented by that string is fetched for the appropriate context.
+ *
+ * If the first argument is an array, then it will be treated as an array
+ * of dependency string names to fetch. An optional function callback can
+ * be specified to execute when all of those dependencies are available.
+ *
+ * Make a local req variable to help Caja compliance (it assumes things
+ * on a require that are not standardized), and to give a short
+ * name for minification/local scope use.
+ */
+ req = requirejs = function ( deps, callback ) {
+
+ //Find the right context, use default
+ var contextName = defContextName,
+ context, config;
+
+ // Determine if have config object in the call.
+ if ( !isArray( deps ) && typeof deps !== "string" ) {
+ // deps is a config object
+ config = deps;
+ if ( isArray( callback ) ) {
+ // Adjust args if there are dependencies
+ deps = callback;
+ callback = arguments[2];
+ } else {
+ deps = [];
+ }
+ }
+
+ if ( config && config.context ) {
+ contextName = config.context;
+ }
+
+ context = contexts[contextName] ||
+ (contexts[contextName] = newContext( contextName ));
+
+ if ( config ) {
+ context.configure( config );
+ }
+
+ return context.require( deps, callback );
+ };
+
+ /**
+ * Support require.config() to make it easier to cooperate with other
+ * AMD loaders on globally agreed names.
+ */
+ req.config = function ( config ) {
+ return req( config );
+ };
+
+ /**
+ * Export require as a global, but only if it does not already exist.
+ */
+ if ( !require ) {
+ require = req;
+ }
+
+ /**
+ * Global require.toUrl(), to match global require, mostly useful
+ * for debugging/work in the global space.
+ */
+ req.toUrl = function ( moduleNamePlusExt ) {
+ return contexts[defContextName].toUrl( moduleNamePlusExt );
+ };
+
+ req.version = version;
+
+ //Used to filter out dependencies that are already paths.
+ req.jsExtRegExp = /^\/|:|\?|\.js$/;
+ s = req.s = {
+ contexts : contexts,
+ //Stores a list of URLs that should not get async script tag treatment.
+ skipAsync : {}
+ };
+
+ req.isAsync = req.isBrowser = isBrowser;
+ if ( isBrowser ) {
+ head = s.head = document.getElementsByTagName( "head" )[0];
+ //If BASE tag is in play, using appendChild is a problem for IE6.
+ //When that browser dies, this can be removed. Details in this jQuery bug:
+ //http://dev.jquery.com/ticket/2709
+ baseElement = document.getElementsByTagName( "base" )[0];
+ if ( baseElement ) {
+ head = s.head = baseElement.parentNode;
+ }
+ }
+
+ /**
+ * Any errors that require explicitly generates will be passed to this
+ * function. Intercept/override it if you want custom error handling.
+ * @param {Error} err the error object.
+ */
+ req.onError = function ( err ) {
+ throw err;
+ };
+
+ /**
+ * Does the request to load a module for the browser case.
+ * Make this a separate function to allow other environments
+ * to override it.
+ *
+ * @param {Object} context the require context to find state.
+ * @param {String} moduleName the name of the module.
+ * @param {Object} url the URL to the module.
+ */
+ req.load = function ( context, moduleName, url ) {
+ req.resourcesReady( false );
+
+ context.scriptCount += 1;
+ req.attach( url, context, moduleName );
+
+ //If tracking a jQuery, then make sure its ready callbacks
+ //are put on hold to prevent its ready callbacks from
+ //triggering too soon.
+ if ( context.jQuery && !context.jQueryIncremented ) {
+ jQueryHoldReady( context.jQuery, true );
+ context.jQueryIncremented = true;
+ }
+ };
+
+ function getInteractiveScript() {
+ var scripts, i, script;
+ if ( interactiveScript && interactiveScript.readyState === 'interactive' ) {
+ return interactiveScript;
+ }
+
+ scripts = document.getElementsByTagName( 'script' );
+ for ( i = scripts.length - 1; i > -1 && (script = scripts[i]); i-- ) {
+ if ( script.readyState === 'interactive' ) {
+ return (interactiveScript = script);
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * The function that handles definitions of modules. Differs from
+ * require() in that a string for the module should be the first argument,
+ * and the function to execute after dependencies are loaded should
+ * return a value to define the module corresponding to the first argument's
+ * name.
+ */
+ define = function ( name, deps, callback ) {
+ var node, context;
+
+ //Allow for anonymous functions
+ if ( typeof name !== 'string' ) {
+ //Adjust args appropriately
+ callback = deps;
+ deps = name;
+ name = null;
+ }
+
+ //This module may not have dependencies
+ if ( !isArray( deps ) ) {
+ callback = deps;
+ deps = [];
+ }
+
+ //If no name, and callback is a function, then figure out if it a
+ //CommonJS thing with dependencies.
+ if ( !deps.length && isFunction( callback ) ) {
+ //Remove comments from the callback string,
+ //look for require calls, and pull them into the dependencies,
+ //but only if there are function args.
+ if ( callback.length ) {
+ callback
+ .toString()
+ .replace( commentRegExp, "" )
+ .replace( cjsRequireRegExp, function ( match, dep ) {
+ deps.push( dep );
+ } );
+
+ //May be a CommonJS thing even without require calls, but still
+ //could use exports, and module. Avoid doing exports and module
+ //work though if it just needs require.
+ //REQUIRES the function to expect the CommonJS variables in the
+ //order listed below.
+ deps = (callback.length === 1 ? ["require"] : ["require", "exports", "module"]).concat( deps );
+ }
+ }
+
+ //If in IE 6-8 and hit an anonymous define() call, do the interactive
+ //work.
+ if ( useInteractive ) {
+ node = currentlyAddingScript || getInteractiveScript();
+ if ( node ) {
+ if ( !name ) {
+ name = node.getAttribute( "data-requiremodule" );
+ }
+ context = contexts[node.getAttribute( "data-requirecontext" )];
+ }
+ }
+
+ //Always save off evaluating the def call until the script onload handler.
+ //This allows multiple modules to be in a file without prematurely
+ //tracing dependencies, and allows for anonymous module support,
+ //where the module name is not known until the script onload event
+ //occurs. If no context, use the global queue, and get it processed
+ //in the onscript load callback.
+ (context ? context.defQueue : globalDefQueue).push( [name, deps, callback] );
+
+ return undefined;
+ };
+
+ define.amd = {
+ multiversion : true,
+ plugins : true,
+ jQuery : true
+ };
+
+ /**
+ * Executes the text. Normally just uses eval, but can be modified
+ * to use a more environment specific call.
+ * @param {String} text the text to execute/evaluate.
+ */
+ req.exec = function ( text ) {
+ return eval( text );
+ };
+
+ /**
+ * Executes a module callack function. Broken out as a separate function
+ * solely to allow the build system to sequence the files in the built
+ * layer in the right sequence.
+ *
+ * @private
+ */
+ req.execCb = function ( name, callback, args, exports ) {
+ return callback.apply( exports, args );
+ };
+
+
+ /**
+ * Adds a node to the DOM. Public function since used by the order plugin.
+ * This method should not normally be called by outside code.
+ */
+ req.addScriptToDom = function ( node ) {
+ //For some cache cases in IE 6-8, the script executes before the end
+ //of the appendChild execution, so to tie an anonymous define
+ //call to the module name (which is stored on the node), hold on
+ //to a reference to this node, but clear after the DOM insertion.
+ currentlyAddingScript = node;
+ if ( baseElement ) {
+ head.insertBefore( node, baseElement );
+ } else {
+ head.appendChild( node );
+ }
+ currentlyAddingScript = null;
+ };
+
+ /**
+ * callback for script loads, used to check status of loading.
+ *
+ * @param {Event} evt the event from the browser for the script
+ * that was loaded.
+ *
+ * @private
+ */
+ req.onScriptLoad = function ( evt ) {
+ //Using currentTarget instead of target for Firefox 2.0's sake. Not
+ //all old browsers will be supported, but this one was easy enough
+ //to support and still makes sense.
+ var node = evt.currentTarget || evt.srcElement, contextName, moduleName,
+ context;
+
+ if ( evt.type === "load" || (node && readyRegExp.test( node.readyState )) ) {
+ //Reset interactive script so a script node is not held onto for
+ //to long.
+ interactiveScript = null;
+
+ //Pull out the name of the module and the context.
+ contextName = node.getAttribute( "data-requirecontext" );
+ moduleName = node.getAttribute( "data-requiremodule" );
+ context = contexts[contextName];
+
+ contexts[contextName].completeLoad( moduleName );
+
+ //Clean up script binding. Favor detachEvent because of IE9
+ //issue, see attachEvent/addEventListener comment elsewhere
+ //in this file.
+ if ( node.detachEvent && !isOpera ) {
+ //Probably IE. If not it will throw an error, which will be
+ //useful to know.
+ node.detachEvent( "onreadystatechange", req.onScriptLoad );
+ } else {
+ node.removeEventListener( "load", req.onScriptLoad, false );
+ }
+ }
+ };
+
+ /**
+ * Attaches the script represented by the URL to the current
+ * environment. Right now only supports browser loading,
+ * but can be redefined in other environments to do the right thing.
+ * @param {String} url the url of the script to attach.
+ * @param {Object} context the context that wants the script.
+ * @param {moduleName} the name of the module that is associated with the script.
+ * @param {Function} [callback] optional callback, defaults to require.onScriptLoad
+ * @param {String} [type] optional type, defaults to text/javascript
+ * @param {Function} [fetchOnlyFunction] optional function to indicate the script node
+ * should be set up to fetch the script but do not attach it to the DOM
+ * so that it can later be attached to execute it. This is a way for the
+ * order plugin to support ordered loading in IE. Once the script is fetched,
+ * but not executed, the fetchOnlyFunction will be called.
+ */
+ req.attach = function ( url, context, moduleName, callback, type, fetchOnlyFunction ) {
+ var node;
+ if ( isBrowser ) {
+ //In the browser so use a script tag
+ callback = callback || req.onScriptLoad;
+ node = context && context.config && context.config.xhtml ?
+ document.createElementNS( "http://www.w3.org/1999/xhtml", "html:script" ) :
+ document.createElement( "script" );
+ node.type = type || (context && context.config.scriptType) ||
+ "text/javascript";
+ node.charset = "utf-8";
+ //Use async so Gecko does not block on executing the script if something
+ //like a long-polling comet tag is being run first. Gecko likes
+ //to evaluate scripts in DOM order, even for dynamic scripts.
+ //It will fetch them async, but only evaluate the contents in DOM
+ //order, so a long-polling script tag can delay execution of scripts
+ //after it. But telling Gecko we expect async gets us the behavior
+ //we want -- execute it whenever it is finished downloading. Only
+ //Helps Firefox 3.6+
+ //Allow some URLs to not be fetched async. Mostly helps the order!
+ //plugin
+ node.async = !s.skipAsync[url];
+
+ if ( context ) {
+ node.setAttribute( "data-requirecontext", context.contextName );
+ }
+ node.setAttribute( "data-requiremodule", moduleName );
+
+ //Set up load listener. Test attachEvent first because IE9 has
+ //a subtle issue in its addEventListener and script onload firings
+ //that do not match the behavior of all other browsers with
+ //addEventListener support, which fire the onload event for a
+ //script right after the script execution. See:
+ //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution
+ //UNFORTUNATELY Opera implements attachEvent but does not follow the script
+ //script execution mode.
+ if ( node.attachEvent && !isOpera ) {
+ //Probably IE. IE (at least 6-8) do not fire
+ //script onload right after executing the script, so
+ //we cannot tie the anonymous define call to a name.
+ //However, IE reports the script as being in "interactive"
+ //readyState at the time of the define call.
+ useInteractive = true;
+
+
+ if ( fetchOnlyFunction ) {
+ //Need to use old school onreadystate here since
+ //when the event fires and the node is not attached
+ //to the DOM, the evt.srcElement is null, so use
+ //a closure to remember the node.
+ node.onreadystatechange = function ( evt ) {
+ //Script loaded but not executed.
+ //Clear loaded handler, set the real one that
+ //waits for script execution.
+ if ( node.readyState === 'loaded' ) {
+ node.onreadystatechange = null;
+ node.attachEvent( "onreadystatechange", callback );
+ fetchOnlyFunction( node );
+ }
+ };
+ } else {
+ node.attachEvent( "onreadystatechange", callback );
+ }
+ } else {
+ node.addEventListener( "load", callback, false );
+ }
+ node.src = url;
+
+ //Fetch only means waiting to attach to DOM after loaded.
+ if ( !fetchOnlyFunction ) {
+ req.addScriptToDom( node );
+ }
+
+ return node;
+ } else if ( isWebWorker ) {
+ //In a web worker, use importScripts. This is not a very
+ //efficient use of importScripts, importScripts will block until
+ //its script is downloaded and evaluated. However, if web workers
+ //are in play, the expectation that a build has been done so that
+ //only one script needs to be loaded anyway. This may need to be
+ //reevaluated if other use cases become common.
+ importScripts( url );
+
+ //Account for anonymous modules
+ context.completeLoad( moduleName );
+ }
+ return null;
+ };
+
+ //Look for a data-main script attribute, which could also adjust the baseUrl.
+ if ( isBrowser ) {
+ //Figure out baseUrl. Get it from the script tag with require.js in it.
+ scripts = document.getElementsByTagName( "script" );
+
+ for ( globalI = scripts.length - 1; globalI > -1 && (script = scripts[globalI]); globalI-- ) {
+ //Set the "head" where we can append children by
+ //using the script's parent.
+ if ( !head ) {
+ head = script.parentNode;
+ }
+
+ //Look for a data-main attribute to set main script for the page
+ //to load. If it is there, the path to data main becomes the
+ //baseUrl, if it is not already set.
+ if ( (dataMain = script.getAttribute( 'data-main' )) ) {
+ if ( !cfg.baseUrl ) {
+ //Pull off the directory of data-main for use as the
+ //baseUrl.
+ src = dataMain.split( '/' );
+ mainScript = src.pop();
+ subPath = src.length ? src.join( '/' ) + '/' : './';
+
+ //Set final config.
+ cfg.baseUrl = subPath;
+ //Strip off any trailing .js since dataMain is now
+ //like a module name.
+ dataMain = mainScript.replace( jsSuffixRegExp, '' );
+ }
+
+ //Put the data-main script in the files to load.
+ cfg.deps = cfg.deps ? cfg.deps.concat( dataMain ) : [dataMain];
+
+ break;
+ }
+ }
+ }
+
+ //See if there is nothing waiting across contexts, and if not, trigger
+ //resourcesReady.
+ req.checkReadyState = function () {
+ var contexts = s.contexts, prop;
+ for ( prop in contexts ) {
+ if ( !(prop in empty) ) {
+ if ( contexts[prop].waitCount ) {
+ return;
+ }
+ }
+ }
+ req.resourcesReady( true );
+ };
+
+ /**
+ * Internal function that is triggered whenever all scripts/resources
+ * have been loaded by the loader. Can be overridden by other, for
+ * instance the domReady plugin, which wants to know when all resources
+ * are loaded.
+ */
+ req.resourcesReady = function ( isReady ) {
+ var contexts, context, prop;
+
+ //First, set the public variable indicating that resources are loading.
+ req.resourcesDone = isReady;
+
+ if ( req.resourcesDone ) {
+ //If jQuery with DOM ready delayed, release it now.
+ contexts = s.contexts;
+ for ( prop in contexts ) {
+ if ( !(prop in empty) ) {
+ context = contexts[prop];
+ if ( context.jQueryIncremented ) {
+ jQueryHoldReady( context.jQuery, false );
+ context.jQueryIncremented = false;
+ }
+ }
+ }
+ }
+ };
+
+ //FF < 3.6 readyState fix. Needed so that domReady plugin
+ //works well in that environment, since require.js is normally
+ //loaded via an HTML script tag so it will be there before window load,
+ //where the domReady plugin is more likely to be loaded after window load.
+ req.pageLoaded = function () {
+ if ( document.readyState !== "complete" ) {
+ document.readyState = "complete";
+ }
+ };
+ if ( isBrowser ) {
+ if ( document.addEventListener ) {
+ if ( !document.readyState ) {
+ document.readyState = "loading";
+ window.addEventListener( "load", req.pageLoaded, false );
+ }
+ }
+ }
+
+ //Set up default context. If require was a configuration object, use that as base config.
+ req( cfg );
+
+ //If modules are built into require.js, then need to make sure dependencies are
+ //traced. Use a setTimeout in the browser world, to allow all the modules to register
+ //themselves. In a non-browser env, assume that modules are not built into require.js,
+ //which seems odd to do on the server.
+ if ( req.isAsync && typeof setTimeout !== "undefined" ) {
+ ctx = s.contexts[(cfg.context || defContextName)];
+ //Indicate that the script that includes require() is still loading,
+ //so that require()'d dependencies are not traced until the end of the
+ //file is parsed (approximated via the setTimeout call).
+ ctx.requireWait = true;
+ setTimeout( function () {
+ ctx.requireWait = false;
+
+ if ( !ctx.scriptCount ) {
+ ctx.resume();
+ }
+ req.checkReadyState();
+ }, 0 );
+ }
}());
/*!
* jQuery JavaScript Library v1.7.2
@@ -2066,6800 +2066,6837 @@ var requirejs, require, define;
*
* Date: Wed Mar 21 12:46:34 2012 -0700
*/
-(function( window, undefined ) {
+(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() {
+ 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 );
- },
+ 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 jQuery in case of overwrite
+ _jQuery = window.jQuery,
- // Map over the $ in case of overwrite
- _$ = window.$,
+ // Map over the $ in case of overwrite
+ _$ = window.$,
- // A central reference to the root jQuery(document)
- rootjQuery,
+ // 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\-]*)$)/,
+ // 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/,
+ // Check if a string has a non-whitespace character in it
+ rnotwhite = /\S/,
- // Used for trimming whitespace
- trimLeft = /^\s+/,
- trimRight = /\s+$/,
+ // Used for trimming whitespace
+ trimLeft = /^\s+/,
+ trimRight = /\s+$/,
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+ // 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,
+ // 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.]+))?/,
+ // 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-/,
+ // 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();
- },
+ // 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,
+ // Keep a UserAgent string for use with jQuery.browser
+ userAgent = navigator.userAgent,
- // For matching the engine and version of the browser
- browserMatch,
+ // For matching the engine and version of the browser
+ browserMatch,
- // The deferred used on DOM ready
- readyList,
+ // The deferred used on DOM ready
+ readyList,
- // The ready event handler
- DOMContentLoaded,
+ // 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,
+ // 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 = {};
+ // [[Class]] -> type pairs
+ class2type = {};
-jQuery.fn = jQuery.prototype = {
- constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
+ 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;
+ // Handle $(""), $(null), or $(undefined)
+ if ( !selector ) {
return this;
}
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
+ // Handle $(DOMElement)
+ if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+ }
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
+ // 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: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
+ // 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 ];
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
+ } else {
+ match = quickExpr.exec( selector );
+ }
- return jQuery.makeArray( selector, this );
- },
+ // Verify a match, and that no context was specified for #id
+ if ( match && (match[1] || !context) ) {
- // Start with an empty selector
- selector: "",
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+ doc = ( context ? context.ownerDocument || context : document );
- // The current version of jQuery being used
- jquery: "1.7.2",
+ // 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 );
- // The default length of a jQuery object is 0
- length: 0,
+ if ( ret ) {
+ if ( jQuery.isPlainObject( context ) ) {
+ selector = [ document.createElement( ret[1] ) ];
+ jQuery.fn.attr.call( selector, context, true );
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
+ } else {
+ selector = [ doc.createElement( ret[1] ) ];
+ }
- toArray: function() {
- return slice.call( this, 0 );
- },
+ } else {
+ ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+ selector = ( ret.cacheable ? jQuery.clone( ret.fragment ) : ret.fragment ).childNodes;
+ }
- // 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 jQuery.merge( this, selector );
- // Return a 'clean' array
- this.toArray() :
+ // HANDLE: $("#id")
+ } else {
+ elem = document.getElementById( match[2] );
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
+ // 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 );
+ }
- // 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();
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
- if ( jQuery.isArray( elems ) ) {
- push.apply( ret, elems );
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
- } else {
- jQuery.merge( ret, elems );
- }
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
- ret.context = this.context;
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return rootjQuery.ready( selector );
+ }
- if ( name === "find" ) {
- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
- // Return the newly-formed element set
- return ret;
- },
+ return jQuery.makeArray( selector, this );
+ },
- // 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 );
- },
+ // Start with an empty selector
+ selector : "",
- ready: function( fn ) {
- // Attach the listeners
- jQuery.bindReady();
+ // The current version of jQuery being used
+ jquery : "1.7.2",
- // Add the callback
- readyList.add( fn );
+ // The default length of a jQuery object is 0
+ length : 0,
- return this;
- },
+ // The number of elements contained in the matched element set
+ size : function () {
+ return this.length;
+ },
- eq: function( i ) {
- i = +i;
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, i + 1 );
- },
+ toArray : function () {
+ return slice.call( this, 0 );
+ },
- first: function() {
- return this.eq( 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 ?
- last: function() {
- return this.eq( -1 );
- },
+ // Return a 'clean' array
+ this.toArray() :
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ),
- "slice", slice.call(arguments).join(",") );
- },
+ // Return just the object
+ ( num < 0 ? this[ this.length + num ] : this[ num ] );
+ },
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
+ // 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();
- end: function() {
- return this.prevObject || this.constructor(null);
- },
+ if ( jQuery.isArray( elems ) ) {
+ push.apply( ret, elems );
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: [].sort,
- splice: [].splice
-};
+ } 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.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;
+ 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 );
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
}
- // 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;
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+ target = {};
}
- // 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";
- },
-
- isWindow: function( obj ) {
- return obj != null && obj == obj.window;
- },
-
- 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 ) {
- if ( typeof data !== "string" || !data ) {
- return null;
- }
- 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;
- }
- }
+ // extend jQuery itself if only one argument is passed
+ if ( length === i ) {
+ target = this;
+ --i;
}
- // 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 );
+ // 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 ];
- 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, fn, key, value, chainable, emptyGet, pass ) {
- var exec,
- bulk = key == null,
- i = 0,
- length = elems.length;
-
- // Sets many values
- if ( key && typeof key === "object" ) {
- for ( i in key ) {
- jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
- }
- chainable = 1;
-
- // Sets one value
- } else if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = pass === undefined && jQuery.isFunction( value );
-
- if ( bulk ) {
- // Bulk operations only iterate when executing function values
- if ( exec ) {
- exec = fn;
- fn = function( elem, key, value ) {
- return exec.call( jQuery( elem ), value );
- };
-
- // Otherwise they run against the entire set
- } else {
- fn.call( elems, value );
- fn = null;
- }
- }
-
- if ( fn ) {
- for (; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
- }
- }
-
- chainable = 1;
- }
-
- return chainable ?
- elems :
-
- // Gets
- bulk ?
- fn.call( elems ) :
- length ? fn( elems[0], key ) : emptyGet;
- },
-
- 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 was already fired
- fired,
- // 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 ];
- fired = true;
- 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;
- }
- }
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
}
- }
- }
- 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 !!fired;
- }
- };
- return self;
-};
+ // 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 : [];
-
-
-
-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 ] );
+ clone = src && jQuery.isPlainObject( src ) ? src : {};
}
- });
- }).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 ];
+
+ // 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 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,
- 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,
- pixelMargin: true
- };
-
- // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
- jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
-
- // 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");
-
- // #11217 - WebKit loses check when the name is after the checked attribute
- input.setAttribute( "name", "t" );
-
- 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 );
-
- // 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 = div = input = null;
-
- // Run tests that need a body at doc ready
- jQuery(function() {
- var container, outer, inner, table, td, offsetSupport,
- marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
- paddingMarginBorderVisibility, paddingMarginBorder,
- body = document.getElementsByTagName("body")[0];
-
- if ( !body ) {
- // Return for frameset docs that don't have a body
- return;
- }
-
- conMarginTop = 1;
- paddingMarginBorder = "padding:0;margin:0;border:";
- positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
- paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
- style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
- html = "
" +
- "
" +
- "
";
-
- container = document.createElement("div");
- container.style.cssText = paddingMarginBorderVisibility + "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 );
-
- // 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 ) {
- div.innerHTML = "";
- 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;
- }
-
- 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.innerHTML = "";
- div.style.width = div.style.padding = "1px";
- div.style.border = 0;
- div.style.overflow = "hidden";
- div.style.display = "inline";
- div.style.zoom = 1;
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "block";
- div.style.overflow = "visible";
- div.innerHTML = "";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
- }
-
- div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
- div.innerHTML = html;
-
- outer = div.firstChild;
- inner = outer.firstChild;
- td = outer.nextSibling.firstChild.firstChild;
-
- offsetSupport = {
- doesNotAddBorder: ( inner.offsetTop !== 5 ),
- doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+ // Return the modified object
+ return target;
};
- inner.style.position = "fixed";
- inner.style.top = "20px";
+ jQuery.extend( {
+ noConflict : function ( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
- // safari subtracts parent border width here which is 5px
- offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
- inner.style.position = inner.style.top = "";
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
- outer.style.overflow = "hidden";
- outer.style.position = "relative";
+ return jQuery;
+ },
- offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
- offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady : false,
- if ( window.getComputedStyle ) {
- div.style.marginTop = "1%";
- support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
- }
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait : 1,
- if ( typeof container.style.zoom !== "undefined" ) {
- container.style.zoom = 1;
- }
+ // Hold (or release) the ready event
+ holdReady : function ( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
- body.removeChild( container );
- marginDiv = div = container = null;
+ // 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 );
+ }
- jQuery.extend( support, offsetSupport );
- });
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
- return support;
-})();
+ // 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 ] );
-
-
-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( " " );
- }
+ // Trigger any bound ready events
+ if ( jQuery.fn.trigger ) {
+ jQuery( document ).trigger( "ready" ).off( "ready" );
}
}
+ },
- 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 ) ) {
+ bindReady : function () {
+ if ( readyList ) {
return;
}
- }
- }
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
+ readyList = jQuery.Callbacks( "once memory" );
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject(cache[ id ]) ) {
- return;
- }
- }
+ // 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 );
+ }
- // 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;
- }
+ // Mozilla, Opera and webkit nightlies currently support this event
+ if ( document.addEventListener ) {
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- // 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;
- }
- }
- },
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", jQuery.ready, false );
- // For internal use only.
- _data: function( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
+ // 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 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() ];
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", jQuery.ready );
- if ( match ) {
- return !(match === true || elem.getAttribute("classid") !== match);
- }
- }
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var toplevel = false;
- return true;
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ) {
- var parts, part, attr, name, l,
- elem = this[0],
- i = 0,
- data = null;
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = jQuery.data( elem );
-
- if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
- attr = elem.attributes;
- for ( l = attr.length; i < l; i++ ) {
- name = attr[i].name;
-
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.substring(5) );
-
- dataAttr( elem, name, data[ name ] );
- }
+ try {
+ toplevel = window.frameElement == null;
+ } catch ( e ) {
}
- jQuery._data( elem, "parsedAttrs", true );
- }
- }
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each(function() {
- jQuery.data( this, key );
- });
- }
-
- parts = key.split( ".", 2 );
- parts[1] = parts[1] ? "." + parts[1] : "";
- part = parts[1] + "!";
-
- return jQuery.access( this, function( value ) {
-
- if ( value === undefined ) {
- data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
- // Try to fetch any internally stored data first
- if ( data === undefined && elem ) {
- data = jQuery.data( elem, key );
- data = dataAttr( elem, key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
- }
-
- parts[1] = value;
- this.each(function() {
- var self = jQuery( this );
-
- self.triggerHandler( "setData" + part, parts );
- jQuery.data( this, key, value );
- self.triggerHandler( "changeData" + part, parts );
- });
- }, null, value, arguments.length > 1, null, false );
- },
-
- 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 ) ? +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 ) {
- var setter = 2;
-
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- setter--;
- }
-
- if ( arguments.length < setter ) {
- return jQuery.queue( this[0], type );
- }
-
- return data === undefined ?
- this :
- 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( object );
- }
-});
-
-
-
-
-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, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- 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 );
+ if ( document.documentElement.doScroll && toplevel ) {
+ doScrollCheck();
}
}
- }
- }
+ },
- return this;
- },
+ // 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";
+ },
- removeClass: function( value ) {
- var classNames, i, l, elem, className, c, cl;
+ isArray : Array.isArray || function ( obj ) {
+ return jQuery.type( obj ) === "array";
+ },
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).removeClass( value.call(this, j, this.className) );
- });
- }
+ isWindow : function ( obj ) {
+ return obj != null && obj == obj.window;
+ },
- if ( (value && typeof value === "string") || value === undefined ) {
- classNames = ( value || "" ).split( rspace );
+ isNumeric : function ( obj ) {
+ return !isNaN( parseFloat( obj ) ) && isFinite( obj );
+ },
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
+ type : function ( obj ) {
+ return obj == null ?
+ String( obj ) :
+ class2type[ toString.call( obj ) ] || "object";
+ },
- 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 );
+ 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;
+ }
- } else {
- elem.className = "";
+ try {
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !hasOwn.call( obj, "constructor" ) &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
}
- }
- }
- }
-
- 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 );
+ } catch ( e ) {
+ // IE8,9 Will throw exceptions on certain host objects #9897
+ return false;
}
- } else if ( type === "undefined" || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
+ // 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 ) {
}
- // toggle whole className
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
+ return key === undefined || hasOwn.call( obj, key );
+ },
- 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 ) {
+ isEmptyObject : function ( obj ) {
+ for ( var name in obj ) {
+ return false;
+ }
return true;
- }
- }
+ },
- return false;
- },
+ error : function ( msg ) {
+ throw new Error( msg );
+ },
- val: function( value ) {
- var hooks, ret, isFunction,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- 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.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // 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 ) {
+ parseJSON : function ( data ) {
+ if ( typeof data !== "string" || !data ) {
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 ];
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
- // 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 );
- }
+ // Attempt to parse using the native JSON parser first
+ if ( window.JSON && window.JSON.parse ) {
+ return window.JSON.parse( data );
}
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
+ // 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 values;
+ return ( new Function( "return " + data ) )();
+
+ }
+ jQuery.error( "Invalid JSON: " + data );
},
- 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;
+ // Cross-browser xml parsing
+ parseXML : function ( data ) {
+ if ( typeof data !== "string" || !data ) {
+ return null;
}
- return values;
- }
- }
- },
+ 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;
+ },
- attrFn: {
- val: true,
- css: true,
- html: true,
- text: true,
- data: true,
- width: true,
- height: true,
- offset: true
- },
+ noop : function () {
+ },
- attr: function( elem, name, value, pass ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
+ // 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 );
+ }
+ },
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
+ // 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 );
+ },
- if ( pass && name in jQuery.attrFn ) {
- return jQuery( elem )[ name ]( value );
- }
+ nodeName : function ( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+ },
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- return jQuery.prop( elem, name, value );
- }
+ // args is for internal usage only
+ each : function ( object, callback, args ) {
+ var name, i = 0,
+ length = object.length,
+ isObj = length === undefined || jQuery.isFunction( object );
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+ 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;
+ }
+ }
+ }
- // 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 );
- }
+ // 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;
+ }
+ }
+ }
+ }
- if ( value !== undefined ) {
+ return object;
+ },
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
+ // 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 );
+ }
+ }
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
return ret;
+ },
- } else {
- elem.setAttribute( name, "" + value );
- return value;
+ 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, fn, key, value, chainable, emptyGet, pass ) {
+ var exec,
+ bulk = key == null,
+ i = 0,
+ length = elems.length;
+
+ // Sets many values
+ if ( key && typeof key === "object" ) {
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+ }
+ chainable = 1;
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ // Optionally, function values get executed if exec is true
+ exec = pass === undefined && jQuery.isFunction( value );
+
+ if ( bulk ) {
+ // Bulk operations only iterate when executing function values
+ if ( exec ) {
+ exec = fn;
+ fn = function ( elem, key, value ) {
+ return exec.call( jQuery( elem ), value );
+ };
+
+ // Otherwise they run against the entire set
+ } else {
+ fn.call( elems, value );
+ fn = null;
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < length; i++ ) {
+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+ }
+ }
+
+ chainable = 1;
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ length ? fn( elems[0], key ) : emptyGet;
+ },
+
+ 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;
}
- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
+ 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;
+ }
- } else {
-
- ret = elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret === null ?
- undefined :
- ret;
+ // and execute any waiting functions
+ jQuery.ready();
}
- },
- removeAttr: function( elem, value ) {
- var propName, attrNames, name, l, isBool,
- i = 0;
+ return jQuery;
- 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;
- isBool = rboolean.test( name );
+// String to Object flags format cache
+ var flagsCache = {};
- // See #9699 for explanation of this approach (setting first, then removal)
- // Do not do this for boolean attributes (see #10870)
- if ( !isBool ) {
- jQuery.attr( elem, name, "" );
+// 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 was already fired
+ fired,
+ // 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 );
+ }
}
- elem.removeAttribute( getSetAttribute ? name : propName );
+ }
+ },
+ // Fire callbacks
+ fire = function ( context, args ) {
+ args = args || [];
+ memory = !flags.memory || [ context, args ];
+ fired = true;
+ 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 !!fired;
+ }
+ };
- // Set corresponding property to false for boolean attributes
- if ( isBool && propName in elem ) {
- elem[ propName ] = false;
+ 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,
+ 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,
+ pixelMargin : true
+ };
+
+ // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
+ jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
+
+ // 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" );
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ input.setAttribute( "name", "t" );
+
+ 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 );
+
+ // 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 = div = input = null;
+
+ // Run tests that need a body at doc ready
+ jQuery( function () {
+ var container, outer, inner, table, td, offsetSupport,
+ marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
+ paddingMarginBorderVisibility, paddingMarginBorder,
+ body = document.getElementsByTagName( "body" )[0];
+
+ if ( !body ) {
+ // Return for frameset docs that don't have a body
+ return;
+ }
+
+ conMarginTop = 1;
+ paddingMarginBorder = "padding:0;margin:0;border:";
+ positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
+ paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
+ style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
+ html = "
" +
+ "
" +
+ "
";
+
+ container = document.createElement( "div" );
+ container.style.cssText = paddingMarginBorderVisibility + "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 );
+
+ // 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 ) {
+ div.innerHTML = "";
+ 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;
+ }
+
+ 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.innerHTML = "";
+ div.style.width = div.style.padding = "1px";
+ div.style.border = 0;
+ div.style.overflow = "hidden";
+ div.style.display = "inline";
+ div.style.zoom = 1;
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+ // Check if elements with layout shrink-wrap their children
+ // (IE 6 does this)
+ div.style.display = "block";
+ div.style.overflow = "visible";
+ div.innerHTML = "";
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+ }
+
+ div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
+ 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 );
+
+ if ( window.getComputedStyle ) {
+ div.style.marginTop = "1%";
+ support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop : 0 } ).marginTop !== "1%";
+ }
+
+ if ( typeof container.style.zoom !== "undefined" ) {
+ container.style.zoom = 1;
+ }
+
+ body.removeChild( container );
+ marginDiv = 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;
}
}
}
- }
- },
- 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;
+ // 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;
}
}
},
- // 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 );
+
+ // 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 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;
}
+
+ return true;
}
- },
+ } );
- 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"
- },
+ jQuery.fn.extend( {
+ data : function ( key, value ) {
+ var parts, part, attr, name, l,
+ elem = this[0],
+ i = 0,
+ data = null;
- prop: function( elem, name, value ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = jQuery.data( elem );
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
+ if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+ attr = elem.attributes;
+ for ( l = attr.length; i < l; i++ ) {
+ name = attr[i].name;
+
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.substring( 5 ) );
+
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ jQuery._data( elem, "parsedAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function () {
+ jQuery.data( this, key );
+ } );
+ }
+
+ parts = key.split( ".", 2 );
+ parts[1] = parts[1] ? "." + parts[1] : "";
+ part = parts[1] + "!";
+
+ return jQuery.access( this, function ( value ) {
+
+ if ( value === undefined ) {
+ data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+ // Try to fetch any internally stored data first
+ if ( data === undefined && elem ) {
+ data = jQuery.data( elem, key );
+ data = dataAttr( elem, key, data );
+ }
+
+ return data === undefined && parts[1] ?
+ this.data( parts[0] ) :
+ data;
+ }
+
+ parts[1] = value;
+ this.each( function () {
+ var self = jQuery( this );
+
+ self.triggerHandler( "setData" + part, parts );
+ jQuery.data( this, key, value );
+ self.triggerHandler( "changeData" + part, parts );
+ } );
+ }, null, value, arguments.length > 1, null, false );
+ },
+
+ removeData : function ( key ) {
+ return this.each( function () {
+ jQuery.removeData( this, key );
+ } );
}
+ } );
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+ 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 ) {
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ jQuery.isNumeric( data ) ? +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 {
- return ( elem[ name ] = value );
- }
-
- } else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- return elem[ name ];
+ data = undefined;
}
}
- },
- 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 data;
+ }
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- undefined;
+// 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 ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ 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( object );
+ }
+ } );
+
+
+ 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, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr : function ( name ) {
+ return this.each( function () {
+ jQuery.removeAttr( this, name );
+ } );
+ },
+
+ prop : function ( name, value ) {
+ return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ 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.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ 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.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // 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, isBool,
+ 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;
+ isBool = rboolean.test( name );
+
+ // See #9699 for explanation of this approach (setting first, then removal)
+ // Do not do this for boolean attributes (see #10870)
+ if ( !isBool ) {
+ jQuery.attr( elem, name, "" );
+ }
+ elem.removeAttribute( getSetAttribute ? name : propName );
+
+ // Set corresponding property to false for boolean attributes
+ if ( isBool && 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;
+ 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;
- }
+ 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() );
+ elem.setAttribute( name, name.toLowerCase() );
+ }
+ return name;
}
- return name;
- }
-};
+ };
// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
+ if ( !getSetAttribute ) {
- fixSpecified = {
- name: true,
- id: true,
- coords: true
- };
+ fixSpecified = {
+ name : true,
+ id : true,
+ coords : 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;
+ // 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 + "" );
}
- });
- });
+ };
- // 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";
+ // 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 );
}
- 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.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 );
- }
- };
-}
+ 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 ( !jQuery.support.optSelected ) {
+ jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+ get : function ( elem ) {
+ var parent = elem.parentNode;
- if ( parent ) {
- parent.selectedIndex;
+ if ( parent ) {
+ parent.selectedIndex;
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
+ // Make sure that it also works with optgroups, see #5701
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
}
+ return null;
}
- return null;
- }
- });
-}
+ } );
+ }
// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
- jQuery.propFix.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 = /(?:^|\s)hover(\.\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;
- selector = handleObjIn.selector;
- }
-
- // 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;
+ 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;
+ }
};
- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
- eventHandle.elem = elem;
- }
+ } );
+ }
+ 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 );
+ }
+ }
+ } );
+ } );
- // 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();
+ var rformElems = /^(?:textarea|input|select)$/i,
+ rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+ rhoverHack = /(?:^|\s)hover(\.\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" );
+ };
- // If event changes its type, use the special event handlers for the changed type
+ /*
+ * 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;
+ selector = handleObjIn.selector;
+ }
+
+ // 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 : selector && 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;
+ }
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
+ // 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 ) ) {
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
+ 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;
+ }
- // 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: selector && quickParse( selector ),
- namespace: namespaces.join(".")
- }, handleObjIn );
+ // 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 ] );
+ }
+ }
- // Init the event handler queue if we're the first
- handlers = events[ type ];
- if ( !handlers ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
+ // Fire handlers on the event path
+ for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
- // 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 );
+ cur = eventPath[i][0];
+ event.type = eventPath[i][1];
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
+ 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;
+ }
}
}
}
- if ( special.add ) {
- special.add.call( elem, handleObj );
+ return event.result;
+ },
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
+ 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,
+ special = jQuery.event.special[ event.type ] || {},
+ 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;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers that should run if there are delegated events
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && !(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 ) {
+
+ // Don't process events on disabled elements (#6911, #8165)
+ if ( cur.disabled !== true ) {
+ 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 to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
+ // 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();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ 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 {
- handlers.push( handleObj );
+ jQuery.event.dispatch.call( elem, e );
}
-
- // 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 ) {
+ if ( e.isDefaultPrevented() ) {
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,
- special = jQuery.event.special[ event.type ] || {},
- 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;
-
- // Call the preDispatch hook for the mapped type, and let it bail if desired
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
- return;
- }
-
- // Determine handlers that should run if there are delegated events
- // Avoid non-left-click bubbling in Firefox (#3861)
- if ( delegateCount && !(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 ) {
-
- // Don't process events on disabled elements (#6911, #8165)
- if ( cur.disabled !== true ) {
- 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();
- }
- }
- }
- }
- }
-
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
- }
-
- 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.event.handle = jQuery.event.dispatch;
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
+ 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 );
}
- } :
- function( elem, type, handle ) {
- if ( elem.detachEvent ) {
- elem.detachEvent( "on" + type, handle );
+
+ // 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;
};
-jQuery.Event = function( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !(this instanceof jQuery.Event) ) {
- return new jQuery.Event( src, props );
+ function returnFalse() {
+ return false;
}
- // 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;
+ function returnTrue() {
+ return true;
}
- // 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;
+ jQuery.Event.prototype = {
+ preventDefault : function () {
+ this.isDefaultPrevented = returnTrue;
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
+ var e = this.originalEvent;
+ if ( !e ) {
+ return;
+ }
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
+ // 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;
+ // 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
-};
+ 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,
+ 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;
+ 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 ) {
- event._submit_bubble = true;
- });
- form._submit_attached = true;
- }
- });
- // return undefined since we don't need an event listener
- },
-
- postDispatch: function( event ) {
- // If form was submitted by the user, bubble the event up the tree
- if ( event._submit_bubble ) {
- delete event._submit_bubble;
- if ( this.parentNode && !event.isTrigger ) {
- jQuery.event.simulate( "submit", this.parentNode, event, true );
- }
- }
- },
-
- 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 );
+ // 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;
}
};
- });
-}
+ } );
-jQuery.fn.extend({
+// IE submit delegation
+ if ( !jQuery.support.submitBubbles ) {
- on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
- var origFn, type;
+ jQuery.event.special.submit = {
+ setup : function () {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
+ return false;
+ }
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) { // && selector != null
- // ( types-Object, data )
- data = data || selector;
+ // 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 ) {
+ event._submit_bubble = true;
+ } );
+ form._submit_attached = true;
+ }
+ } );
+ // return undefined since we don't need an event listener
+ },
+
+ postDispatch : function ( event ) {
+ // If form was submitted by the user, bubble the event up the tree
+ if ( event._submit_bubble ) {
+ delete event._submit_bubble;
+ if ( this.parentNode && !event.isTrigger ) {
+ jQuery.event.simulate( "submit", this.parentNode, event, true );
+ }
+ }
+ },
+
+ 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" ) { // && selector != null
+ // ( types-Object, data )
+ 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( 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.origType + "." + handleObj.namespace : handleObj.origType,
+ 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;
}
- for ( type in types ) {
- this.on( type, selector, data, types[ type ], one );
+ if ( fn === false ) {
+ fn = returnFalse;
}
- return this;
- }
+ return this.each( function () {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ },
- if ( data == null && fn == null ) {
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
- // ( types, selector, fn )
+ 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 = undefined;
- } else {
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
+ data = null;
}
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return this;
+
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+
+ if ( jQuery.attrFn ) {
+ jQuery.attrFn[ name ] = true;
}
- 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( 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.origType + "." + handleObj.namespace : handleObj.origType,
- 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;
+ if ( rkeyEvent.test( name ) ) {
+ jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
}
- 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;
+ if ( rmouseEvent.test( name ) ) {
+ jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
}
-
- 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 () {
-/*!
- * 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/;
+ 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;
-});
+ [0, 0].sort( function () {
+ baseHasDuplicate = false;
+ return 0;
+ } );
-var Sizzle = function( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
+ var Sizzle = function ( selector, context, results, seed ) {
+ results = results || [];
+ context = context || document;
- var origContext = context;
+ 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;
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+ return [];
}
- }
- } while ( m );
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context, seed );
+ var m, set, checkSet, extra, ret, cur, pop, i,
+ prune = true,
+ contextXML = Sizzle.isXML( context ),
+ parts = [],
+ soFar = selector;
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
+ // Reset the position of the chunker regexp (start from head)
+ do {
+ chunker.exec( "" );
+ m = chunker.exec( soFar );
- while ( parts.length ) {
- selector = parts.shift();
+ if ( m ) {
+ soFar = m[3];
- if ( Expr.relative[ selector ] ) {
- selector += parts.shift();
+ parts.push( m[1] );
+
+ if ( m[2] ) {
+ extra = m[3];
+ break;
+ }
}
+ } while ( m );
- set = posProcess( selector, set, seed );
- }
- }
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
- } 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]) ) {
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+ set = posProcess( parts[0] + parts[1], context, seed );
- 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();
- }
+ set = Expr.relative[ parts[0] ] ?
+ [ context ] :
+ Sizzle( parts.shift(), context );
- if ( pop == null ) {
- pop = context;
- }
+ while ( parts.length ) {
+ selector = parts.shift();
- Expr.relative[ cur ]( checkSet, pop, contextXML );
- }
+ if ( Expr.relative[ selector ] ) {
+ selector += parts.shift();
+ }
- } 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;
+ set = posProcess( selector, set, seed );
}
}
- if ( match ) {
- for ( i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- pass = not ^ found;
+ } 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] ) ) {
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
+ ret = Sizzle.find( parts.shift(), context, contextXML );
+ context = ret.expr ?
+ Sizzle.filter( ret.expr, ret.set )[0] :
+ ret.set[0];
+ }
- } else {
- curLoop[i] = false;
- }
+ 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 );
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
+ 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 ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
+ if ( match ) {
+ for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+ if ( item ) {
+ found = filter( item, match, i, curLoop );
+ pass = not ^ found;
- expr = expr.replace( Expr.match[ type ], "" );
+ if ( inplace && found != null ) {
+ if ( pass ) {
+ anyFound = true;
- if ( !anyFound ) {
- return [];
- }
+ } else {
+ curLoop[i] = false;
+ }
- 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 || nodeType === 11 ) {
- // 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 ( pass ) {
+ result.push( item );
+ anyFound = true;
+ }
+ }
+ }
}
- } else if ( inplace ) {
- curLoop[i] = false;
+ 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 || nodeType === 11 ) {
+ // 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;
+ };
- return false;
- },
+ var Expr = Sizzle.selectors = {
+ order : [ "ID", "NAME", "TAG" ],
- ID: function( match ) {
- return match[1].replace( rBackslash, "" );
- },
+ 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\))?/
+ },
- TAG: function( match, curLoop ) {
- return match[1].replace( rBackslash, "" ).toLowerCase();
- },
+ leftMatch : {},
- CHILD: function( match ) {
- if ( match[1] === "nth" ) {
- if ( !match[2] ) {
- Sizzle.error( match[0] );
+ attrMap : {
+ "class" : "className",
+ "for" : "htmlFor"
+ },
+
+ attrHandle : {
+ href : function ( elem ) {
+ return elem.getAttribute( "href" );
+ },
+ type : function ( elem ) {
+ return elem.getAttribute( "type" );
}
+ },
- match[2] = match[2].replace(/^\+|\s*/g, '');
+ relative : {
+ "+" : function ( checkSet, part ) {
+ var isPartStr = typeof part === "string",
+ isTag = isPartStr && !rNonWord.test( part ),
+ isPartStrNotTag = isPartStr && !isTag;
- // 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]);
+ if ( isTag ) {
+ part = part.toLowerCase();
+ }
- // 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] );
- }
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+ if ( (elem = checkSet[i]) ) {
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {
+ }
- // TODO: Move to normal caching system
- match[0] = done++;
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+ elem || false :
+ elem === part;
+ }
+ }
- return match;
- },
+ if ( isPartStrNotTag ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ },
- ATTR: function( match, curLoop, inplace, result, not, isXML ) {
- var name = match[1] = match[1].replace( rBackslash, "" );
+ ">" : function ( checkSet, part ) {
+ var elem,
+ isPartStr = typeof part === "string",
+ i = 0,
+ l = checkSet.length;
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
+ if ( isPartStr && !rNonWord.test( part ) ) {
+ part = part.toLowerCase();
- // Handle if an un-quoted value was used
- match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
+ if ( elem ) {
+ var parent = elem.parentNode;
+ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+ }
+ }
- return match;
- },
+ } else {
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
- 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);
+ if ( elem ) {
+ checkSet[i] = isPartStr ?
+ elem.parentNode :
+ elem.parentNode === part;
+ }
+ }
- } else {
- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+ if ( isPartStr ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ }
+ },
- if ( !inplace ) {
- result.push.apply( result, ret );
+ "" : 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;
- }
+ },
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
+ ID : function ( match ) {
+ return match[1].replace( rBackslash, "" );
+ },
- return match;
- },
+ TAG : function ( match, curLoop ) {
+ return match[1].replace( rBackslash, "" ).toLowerCase();
+ },
- POS: function( match ) {
- match.unshift( true );
+ CHILD : function ( match ) {
+ if ( match[1] === "nth" ) {
+ if ( !match[2] ) {
+ Sizzle.error( match[0] );
+ }
- return match;
- }
- },
+ match[2] = match[2].replace( /^\+|\s*/g, '' );
- filters: {
- enabled: function( elem ) {
- return elem.disabled === false && elem.type !== "hidden";
- },
+ // 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] );
- 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;
+ // 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] );
}
- }
- return true;
+ // TODO: Move to normal caching system
+ match[0] = done++;
- } else {
- Sizzle.error( name );
- }
- },
+ return match;
+ },
- CHILD: function( elem, match ) {
- var first, last,
- doneName, parent, cache,
- count, diff,
- type = match[1],
- node = elem;
+ 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 );
+ }
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
return false;
}
- }
- if ( type === "first" ) {
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
return true;
}
- node = elem;
+ return match;
+ },
- /* falls through */
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
+ 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 true;
+ return elem.selected === true;
+ },
- case "nth":
- first = match[2];
- last = match[3];
+ parent : function ( elem ) {
+ return !!elem.firstChild;
+ },
- if ( first === 1 && last === 0 ) {
- return true;
- }
+ empty : function ( elem ) {
+ return !elem.firstChild;
+ },
- doneName = match[0];
- parent = elem.parentNode;
+ has : function ( elem, i, match ) {
+ return !!Sizzle( match[3], elem ).length;
+ },
- if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
- count = 0;
+ header : function ( elem ) {
+ return (/h\d/i).test( elem.nodeName );
+ },
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.nodeIndex = ++count;
+ 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;
}
}
- parent[ expando ] = doneName;
- }
-
- diff = elem.nodeIndex - last;
-
- if ( first === 0 ) {
- return diff === 0;
+ return true;
} else {
- return ( diff % first === 0 && diff / first >= 0 );
+ 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;
+
+ /* falls through */
+ 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 );
+ }
+ }
}
- },
+ };
- ID: function( elem, match ) {
- return elem.nodeType === 1 && elem.getAttribute("id") === match;
- },
+ var origPOS = Expr.match.POS,
+ fescape = function ( all, num ) {
+ return "\\" + (num - 0 + 1);
+ };
- 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 );
- }
+ 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 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) );
-}
// Expose origPOS
// "global" as in regardless of relation to brackets/parens
-Expr.match.globalPOS = origPOS;
+ Expr.match.globalPOS = origPOS;
-var makeArray = function( array, results ) {
- array = Array.prototype.slice.call( array, 0 );
+ var makeArray = function ( array, results ) {
+ array = Array.prototype.slice.call( array, 0 );
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
+ if ( results ) {
+ results.push.apply( results, array );
+ return results;
+ }
- return array;
-};
+ 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;
+ 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 || [];
+ } catch ( e ) {
+ makeArray = function ( array, results ) {
+ var i = 0,
+ ret = results || [];
- if ( toString.call(array) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
+ 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 {
- if ( typeof array.length === "number" ) {
- for ( var l = array.length; i < l; i++ ) {
- ret.push( array[i] );
+ 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;
}
- } else {
- for ( ; array[i]; i++ ) {
- ret.push( array[i] );
+ 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;
+ };
}
- 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;
+ (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 = "";
+ form.innerHTML = "";
- // Inject it into the root element, check its status, and remove it quickly
- root.insertBefore( form, root.firstChild );
+ // 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]);
+ // 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] );
+ return m ?
+ m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode( "id" ).nodeValue === match[1] ?
+ [m] :
+ undefined :
+ [];
}
- }
+ };
- results = tmp;
+ Expr.filter.ID = function ( elem, match ) {
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode( "id" );
+
+ return elem.nodeType === 1 && node && node.nodeValue === match;
+ };
}
- return results;
- };
- }
+ root.removeChild( form );
- // Check to see if an attribute returns normalized href attributes
- div.innerHTML = "";
+ // release memory in IE
+ root = form = null;
+ })();
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute("href") !== "#" ) {
+ (function () {
+ // Check to see if the browser returns only elements
+ // when doing getElementsByTagName("*")
- Expr.attrHandle.href = function( elem ) {
- return elem.getAttribute( "href", 2 );
- };
- }
+ // Create a fake element
+ var div = document.createElement( "div" );
+ div.appendChild( document.createComment( "" ) );
- // release memory in IE
- div = null;
-})();
+ // Make sure no comments are found
+ if ( div.getElementsByTagName( "*" ).length > 0 ) {
+ Expr.find.TAG = function ( match, context ) {
+ var results = context.getElementsByTagName( match[1] );
-if ( document.querySelectorAll ) {
- (function(){
- var oldSizzle = Sizzle,
- div = document.createElement("div"),
- id = "__sizzle__";
+ // Filter out possible comments
+ if ( match[1] === "*" ) {
+ var tmp = [];
- div.innerHTML = "";
+ for ( var i = 0; results[i]; i++ ) {
+ if ( results[i].nodeType === 1 ) {
+ tmp.push( results[i] );
+ }
+ }
- // 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 );
+ 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;
}
- 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 );
+ Sizzle = function ( query, context, extra, seed ) {
+ context = context || document;
- // Speed-up: Sizzle("#ID")
- } else if ( match && match[3] ) {
- var elem = context.getElementById( match[3] );
+ // 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 );
- // 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 );
+ 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 );
+ }
}
- } 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" );
+ }
+ }
}
}
- try {
- return makeArray( context.querySelectorAll(query), extra );
- } catch(qsaError) {}
+ return oldSizzle( query, context, extra, seed );
+ };
- // 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" );
- }
- }
+ for ( var prop in oldSizzle ) {
+ Sizzle[ prop ] = oldSizzle[ prop ];
}
- }
- return oldSizzle(query, context, extra, seed);
- };
-
- for ( var prop in oldSizzle ) {
- Sizzle[ prop ] = oldSizzle[ prop ];
+ // release memory in IE
+ div = null;
+ })();
}
- // release memory in IE
- div = null;
- })();
-}
+ (function () {
+ var html = document.documentElement,
+ matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-(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;
- 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 );
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( document.documentElement, "[test!='']:sizzle" );
- // 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 ( 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 ) {
}
}
- } 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;
}
- return Sizzle(expr, null, null, [node]).length > 0;
- };
- }
-})();
+ // Safari caches class attributes, doesn't catch changes (in 3.2)
+ div.lastChild.className = "e";
-(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];
+ if ( div.getElementsByClassName( "e" ).length === 1 ) {
+ return;
}
- 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;
+ Expr.order.splice( 1, 0, "CLASS" );
+ Expr.find.CLASS = function ( match, context, isXML ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+ return context.getElementsByClassName( match[1] );
}
+ };
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem[ expando ] = doneName;
- elem.sizset = i;
- }
+ // release memory in IE
+ div = null;
+ })();
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
+ 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;
}
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
+ if ( elem.nodeType === 1 && !isXML ) {
+ elem[ expando ] = doneName;
+ elem.sizset = i;
+ }
- elem = elem[dir];
+ 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, "" );
}
- checkSet[i] = match;
- }
- }
-}
+ selector = Expr.relative[selector] ? selector + "*" : selector;
-if ( document.documentElement.contains ) {
- Sizzle.contains = function( a, b ) {
- return a !== b && (a.contains ? a.contains(b) : true);
- };
+ for ( var i = 0, l = root.length; i < l; i++ ) {
+ Sizzle( selector, root[i], tmpSet, seed );
+ }
-} 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 );
-};
+ 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;
+ 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)/,
+ 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.globalPOS,
+ rmultiselector = /,/,
+ isSimple = /^.[^:#\[\.,]*$/,
+ slice = Array.prototype.slice,
+ POS = jQuery.expr.match.globalPOS,
// methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
+ guaranteedUnique = {
+ children : true,
+ contents : true,
+ next : true,
+ prev : true
+ };
-jQuery.fn.extend({
- find: function( selector ) {
- var self = this,
- i, l;
+ 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 ) ) {
+ 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;
}
}
- });
- }
+ } );
+ },
- var ret = this.pushStack( "", "find", selector ),
- length, n, r;
+ not : function ( selector ) {
+ return this.pushStack( winnow( this, selector, false ), "not", selector );
+ },
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
+ filter : function ( selector ) {
+ return this.pushStack( winnow( this, selector, true ), "filter", selector );
+ },
- 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);
+ 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;
}
}
}
}
- }
- return ret;
- },
+ ret = ret.length > 1 ? jQuery.unique( ret ) : 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;
- }
- }
- });
- },
+ return this.pushStack( ret, "closest", selectors );
+ },
- not: function( selector ) {
- return this.pushStack( winnow(this, selector, false), "not", selector);
- },
+ // Determine the position of an element within
+ // the matched set of elements
+ index : function ( elem ) {
- 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++;
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
}
- 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;
- }
- }
+ // 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 );
}
-
- 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 isDisconnected( node ) {
+ return !node || !node.parentNode || node.parentNode.nodeType === 11;
}
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until );
- if ( !runtil.test( name ) ) {
- selector = until;
+ 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 ( 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 );
+ if ( !runtil.test( name ) ) {
+ selector = until;
}
- 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;
+ if ( selector && typeof selector === "string" ) {
+ ret = jQuery.filter( selector, ret );
}
- }
- return cur;
- },
+ ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
+ if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+ ret = ret.reverse();
}
- }
- return r;
- }
-});
+ 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 ) {
+ 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;
+ // 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;
- });
+ 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 ( 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;
- });
+ } 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 );
+ 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;
+ } );
}
- return jQuery.grep(elements, function( elem, i ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
- });
-}
+ function createSafeFragment( document ) {
+ var list = nodeNames.split( "|" ),
+ safeFrag = document.createDocumentFragment();
-
-
-function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
+ if ( safeFrag.createElement ) {
+ while ( list.length ) {
+ safeFrag.createElement(
+ list.pop()
+ );
+ }
}
+ return safeFrag;
}
- return safeFrag;
-}
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|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 = /]", "i"),
+ var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|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 = /]", "i" ),
// checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptType = /\/(java|ecma)script/i,
- rcleanScript = /^\s*", "" ],
- legend: [ 1, "" ],
- thead: [ 1, "