diff --git a/component.json b/component.json
index a9e969e..1bf5e3d 100644
--- a/component.json
+++ b/component.json
@@ -1,6 +1,6 @@
{
"name": "postal.js",
- "version": "0.7.3",
+ "version": "0.8.0",
"main": ["lib/standard/postal.min.js", "lib/standard/postal.js"],
"dependencies": {
"underscore": "~1.3.0"
diff --git a/example/amd/js/examples.js b/example/amd/js/examples.js
index 8e9fc13..c7291cb 100644
--- a/example/amd/js/examples.js
+++ b/example/amd/js/examples.js
@@ -1,13 +1,13 @@
define( ['postal', 'postaldiags'], function ( postal, diags ) {
- // The world's simplest subscription
- var channel = postal.channel( "Name.Changed" );
+ // This gets you a handle to the default postal channel...
+ var channel = postal.channel();
// subscribe
- var subscription = channel.subscribe( function ( data ) {
+ var subscription = channel.subscribe( "Name.Changed", function ( data ) {
$( "#example1" ).html( "Name: " + data.name );
} );
// And someone publishes a first name change:
- channel.publish( { name : "Dr. Who" } );
+ channel.publish( "Name.Changed", { name : "Dr. Who" } );
subscription.unsubscribe();
@@ -15,14 +15,11 @@ 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 ) {
- $( '
' + data.type + " Changed: " + data.value + '
' ).appendTo( "#example2" );
- } );
- postal.channel( "Name.Changed" )
- .publish( { type : "Name", value : "John Smith" } );
- postal.channel( "Location.Changed" )
- .publish( { type : "Location", value : "Early 20th Century England" } );
+ var chgSubscription = channel.subscribe( "#.Changed", function ( data ) {
+ $( '
' + data.type + " Changed: " + data.value + '
' ).appendTo( "#example2" );
+ } );
+ channel.publish( "Name.Changed", { type : "Name", value : "John Smith" } );
+ channel.publish( "Location.Changed", { type : "Location", value : "Early 20th Century England" } );
chgSubscription.unsubscribe();
@@ -30,120 +27,85 @@ 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 ) {
- $( '
' + data.type + " Changed: " + data.value + '
' ).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" } );
+ var starSubscription = channel.subscribe( "DrWho.*.Changed", function ( data ) {
+ $( '
' + data.type + " Changed: " + data.value + '
' ).appendTo( "#example3" );
+ } );
+ channel.publish( "DrWho.NinthDoctor.Companion.Changed", { type : "Companion Name", value : "Rose" } );
+ channel.publish( "DrWho.TenthDoctor.Companion.Changed", { type : "Companion Name", value : "Martha" } );
+ channel.publish( "DrWho.Eleventh.Companion.Changed", { type : "Companion Name", value : "Amy" } );
+ channel.publish( "DrWho.Location.Changed", { type : "Location", value : "The Library" } );
+ channel.publish( "TheMaster.DrumBeat.Changed", { type : "DrumBeat", value : "This won't trigger any subscriptions" } );
+ channel.publish( "Changed", { type : "Useless", value : "This won't trigger any subscriptions either" } );
starSubscription.unsubscribe();
// Applying distinctUntilChanged to a subscription
- var dupChannel = postal.channel( "WeepingAngel.*" ),
- dupSubscription = dupChannel.subscribe(
- function ( data ) {
- $( '
' + data.value + '
' ).appendTo( "#example4" );
- } ).distinctUntilChanged();
- 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" } );
- postal.channel( "WeepingAngel.DontBlink" )
- .publish( { value : "Don't Blink" } );
- postal.channel( "WeepingAngel.DontBlink" )
- .publish( { value : "Don't Blink" } );
+ var dupSubscription = channel.subscribe( "WeepingAngel.*",
+ function ( data ) {
+ $( '
' + data.value + '
' ).appendTo( "#example4" );
+ } ).distinctUntilChanged();
+ channel.publish( "WeepingAngel.DontBlink", { value : "Don't Blink" } );
+ channel.publish( "WeepingAngel.DontBlink", { value : "Don't Blink" } );
+ channel.publish( "WeepingAngel.DontEvenBlink", { value : "Don't Even Blink" } );
+ channel.publish( "WeepingAngel.DontBlink", { value : "Don't Close Your Eyes" } );
+ channel.publish( "WeepingAngel.DontBlink", { value : "Don't Blink" } );
+ channel.publish( "WeepingAngel.DontBlink", { value : "Don't Blink" } );
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 daSubscription = channel.subscribe( "Donna.Noble.*",
+ function ( data ) {
+ $( '
' + data.value + '
' ).appendTo( "#example5" );
+ } ).disposeAfter( 2 );
+ channel.publish( "Donna.Noble.ScreamingAgain", { value : "Donna Noble has left the library." } );
+ channel.publish( "Donna.Noble.ScreamingAgain", { value : "Donna Noble has left the library." } );
+ channel.publish( "Donna.Noble.ScreamingAgain", { value : "Donna Noble has left the library." } );
+ channel.publish( "Donna.Noble.ScreamingAgain", { value : "Donna Noble has left the library." } );
+ channel.publish( "Donna.Noble.ScreamingAgain", { 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(
+ wcSubscription = channel.subscribe( "Tardis.Depart",
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!" } );
+ channel.publish( "Tardis.Depart", { value : "Time for time travel....fantastic!" } );
+ channel.publish( "Tardis.Depart", { value : "Time for time travel....fantastic!" } );
drIsInTheTardis = true;
- postal.channel( "Tardis.Depart" )
- .publish( { value : "Time for time travel....fantastic!" } );
+ channel.publish( "Tardis.Depart", { 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 ) {
- $( '
' + data.value + '
' ).appendTo( this );
- } ).withContext( $( "#example7" ) );
- postal.channel( "Dalek.Meet.CyberMen" )
- .publish( { value : "Exterminate!" } );
- postal.channel( "Dalek.Meet.CyberMen" )
- .publish( { value : "Delete!" } );
+ var ctxSubscription = channel.subscribe( "Dalek.Meet.CyberMen",
+ function ( data ) {
+ $( '
' + data.value + '
' ).appendTo( this );
+ } ).withContext( $( "#example7" ) );
+ channel.publish( "Dalek.Meet.CyberMen", { value : "Exterminate!" } );
+ channel.publish( "Dalek.Meet.CyberMen", { value : "Delete!" } );
ctxSubscription.unsubscribe();
// Using withDelay() to delay the subscription evaluation
- var wdChannel = postal.channel( "He.Will.Knock.Four.Times" ),
- wdSubscription = wdChannel.subscribe(
- function ( data ) {
- $( '
' ).appendTo( $( "#example8" ) );
+ } ).withDelay( 5000 );
+ channel.publish( "He.Will.Knock.Four.Times", { value : "Knock!" } );
+ channel.publish( "He.Will.Knock.Four.Times", { value : "Knock!" } );
+ channel.publish( "He.Will.Knock.Four.Times", { value : "Knock!" } );
+ channel.publish( "He.Will.Knock.Four.Times", { value : "Knock!" } );
wdSubscription.unsubscribe();
// Using distinct() to ignore duplicate messages
- var revealChannel = postal.channel('detect.cylon'),
- revealSubscription = revealChannel.subscribe(function (who) {
- $('').text(who.name).appendTo($('#example9'));
- }).distinct();
- postal.channel('detect.cylon').publish({name: 'Boomer'});
- postal.channel('detect.cylon').publish({name: 'Saul Tigh'});
- postal.channel('detect.cylon').publish({name: 'William Adama'});
- postal.channel('detect.cylon').publish({name: 'Helo'});
- //ignored!
- postal.channel('detect.cylon').publish({name: 'Boomer'});
- postal.channel('detect.cylon').publish({name: 'Felix Gaeta'});
- //ignored!
- postal.channel('detect.cylon').publish({name: 'William Adama'});
+ var revealSubscription = channel.subscribe( 'detect.cylon',function ( who ) {
+ $( '' ).text( who.name ).appendTo( $( '#example9' ) );
+ } ).distinct();
+ channel.publish( 'detect.cylon', {name : 'Boomer'} );
+ channel.publish( 'detect.cylon', {name : 'Saul Tigh'} );
+ channel.publish( 'detect.cylon', {name : 'William Adama'} );
+ channel.publish( 'detect.cylon', {name : 'Helo'} );
+ channel.publish( 'detect.cylon', {name : 'Boomer'} ); //ignored!
+ channel.publish( 'detect.cylon', {name : 'Felix Gaeta'} );
+ channel.publish( 'detect.cylon', {name : 'William Adama'} );//ignored!
} );
\ No newline at end of file
diff --git a/example/amd/js/libs/postal/postal.js b/example/amd/js/libs/postal/postal.js
index 82deed7..84c2659 100644
--- a/example/amd/js/libs/postal/postal.js
+++ b/example/amd/js/libs/postal/postal.js
@@ -54,44 +54,22 @@
return isDistinct;
};
};
- var ChannelDefinition = function ( channelName, defaultTopic ) {
+ var ChannelDefinition = function ( channelName ) {
this.channel = channelName || DEFAULT_CHANNEL;
- this._topic = defaultTopic || "";
};
ChannelDefinition.prototype = {
subscribe : function () {
- var len = arguments.length;
- 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] );
- }
+ return arguments.length === 1 ?
+ new SubscriptionDefinition( this.channel, arguments[0].topic, arguments[0].callback ) :
+ new SubscriptionDefinition( this.channel, arguments[0], arguments[1] );
},
- publish : function ( obj ) {
- var _obj = obj || {};
- var envelope = {
- channel : this.channel,
- topic : this._topic,
- data : _obj
- };
- // If this is an envelope....
- if ( _obj.topic && _obj.data ) {
- envelope = _obj;
- envelope.channel = envelope.channel || this.channel;
- }
- envelope.timeStamp = new Date();
+ publish : function () {
+ var envelope = arguments.length === 1 ? arguments[0] : { topic: arguments[0], data: arguments[1] };
+ envelope.channel = this.channel;
postal.configuration.bus.publish( envelope );
return envelope;
- },
-
- topic : function ( topic ) {
- if ( topic === this._topic ) {
- return this;
- }
- return new ChannelDefinition( this.channel, topic );
}
};
@@ -302,6 +280,7 @@
},
publish : function ( envelope ) {
+ envelope.timeStamp = new Date();
_.each( this.wireTaps, function ( tap ) {
tap( envelope.data, envelope );
} );
@@ -371,55 +350,7 @@
}
};
- var publishPicker = {
- "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 };
- postal.configuration.bus.publish( envelope );
- return envelope;
- }
- },
- channelPicker = {
- "1" : function ( chn ) {
- var channel = chn, topic, options = {};
- if ( Object.prototype.toString.call( channel ) === "[object String]" ) {
- channel = DEFAULT_CHANNEL;
- topic = chn;
- }
- else {
- channel = chn.channel || DEFAULT_CHANNEL;
- topic = chn.topic;
- options = chn.options || options;
- }
- return new postal.channelTypes[ options.type || "local" ]( channel, topic );
- },
- "2" : function ( chn, tpc ) {
- var channel = chn, topic = tpc, options = {};
- if ( Object.prototype.toString.call( tpc ) === "[object Object]" ) {
- channel = DEFAULT_CHANNEL;
- topic = chn;
- options = tpc;
- }
- return new postal.channelTypes[ options.type || "local" ]( channel, topic );
- },
- "3" : function ( channel, topic, options ) {
- return new postal.channelTypes[ options.type || "local" ]( channel, topic );
- }
- },
- sessionInfo = {};
+ var sessionInfo = {};
// save some setup time, albeit tiny
localBus.subscriptions[SYSTEM_CHANNEL] = {};
@@ -434,29 +365,22 @@
SYSTEM_CHANNEL : SYSTEM_CHANNEL
},
- channelTypes : {
- local : ChannelDefinition
- },
+ ChannelDefinition : ChannelDefinition,
- channel : function () {
- var len = arguments.length;
- if ( channelPicker[len] ) {
- return channelPicker[len].apply( this, arguments );
- }
+ SubscriptionDefinition: SubscriptionDefinition,
+
+ channel : function ( channelName ) {
+ return new ChannelDefinition( channelName );
},
subscribe : function ( options ) {
- var callback = options.callback,
- topic = options.topic,
- channel = options.channel || DEFAULT_CHANNEL;
- return new SubscriptionDefinition( channel, topic, callback );
+ return new SubscriptionDefinition( options.channel || DEFAULT_CHANNEL, options.topic, options.callback );
},
- publish : function () {
- var len = arguments.length;
- if ( publishPicker[len] ) {
- return publishPicker[len].apply( this, arguments );
- }
+ publish : function ( envelope ) {
+ envelope.channel = envelope.channel || DEFAULT_CHANNEL;
+ postal.configuration.bus.publish( envelope );
+ return envelope;
},
addWireTap : function ( callback ) {
diff --git a/example/amd/js/libs/postal/postal.min.js b/example/amd/js/libs/postal/postal.min.js
index 33f3940..d54f028 100644
--- a/example/amd/js/libs/postal/postal.min.js
+++ b/example/amd/js/libs/postal/postal.min.js
@@ -4,4 +4,4 @@
License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
Version 0.7.3
*/
-(function(e,t){typeof define=="function"&&define.amd?define(["underscore"],function(n){return t(n,e)}):t(e._,e)})(this,function(e,t,n){var r="/",i=50,s=0,o="postal",u=function(){},a=function(){var t;return function(n){var r=!1;return e.isString(n)?(r=n===t,t=n):(r=e.isEqual(n,t),t=e.clone(n)),!r}},f=function(){var t=[];return function(n){var r=!e.any(t,function(t){return e.isObject(n)||e.isArray(n)?e.isEqual(n,t):n===t});return r&&t.push(n),r}},l=function(e,t){this.channel=e||r,this._topic=t||""};l.prototype={subscribe:function(){var e=arguments.length;if(e===1)return new c(this.channel,this._topic,arguments[0]);if(e===2)return new c(this.channel,arguments[0],arguments[1])},publish:function(e){var t=e||{},n={channel:this.channel,topic:this._topic,data:t};return t.topic&&t.data&&(n=t,n.channel=n.channel||this.channel),n.timeStamp=new Date,g.configuration.bus.publish(n),n},topic:function(e){return e===this._topic?this:new l(this.channel,e)}};var c=function(e,t,n){this.channel=e,this.topic=t,this.callback=n,this.priority=i,this.constraints=new Array(0),this.maxCalls=s,this.onHandled=u,this.context=null,g.configuration.bus.publish({channel:o,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:e,topic:t}}),g.configuration.bus.subscribe(this)};c.prototype={unsubscribe:function(){g.configuration.bus.unsubscribe(this),g.configuration.bus.publish({channel:o,topic:"subscription.removed",timeStamp:new Date,data:{event:"subscription.removed",channel:this.channel,topic:this.topic}})},defer:function(){var e=this.callback;return this.callback=function(t){setTimeout(e,0,t)},this},disposeAfter:function(t){if(e.isNaN(t)||t<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var n=this.onHandled,r=e.after(t,e.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){n.apply(this.context,arguments),r()},this},distinctUntilChanged:function(){return this.withConstraint(new a),this},distinct:function(){return this.withConstraint(new f),this},once:function(){this.disposeAfter(1)},withConstraint:function(t){if(!e.isFunction(t))throw"Predicate constraint must be a function";return this.constraints.push(t),this},withConstraints:function(t){var n=this;return e.isArray(t)&&e.each(t,function(e){n.withConstraint(e)}),n},withContext:function(e){return this.context=e,this},withDebounce:function(t){if(e.isNaN(t))throw"Milliseconds must be a number";var n=this.callback;return this.callback=e.debounce(n,t),this},withDelay:function(t){if(e.isNaN(t))throw"Milliseconds must be a number";var n=this.callback;return this.callback=function(e){setTimeout(function(){n(e)},t)},this},withPriority:function(t){if(e.isNaN(t))throw"Priority must be a number";return this.priority=t,g.configuration.bus.changePriority(this),this},withThrottle:function(t){if(e.isNaN(t))throw"Milliseconds must be a number";var n=this.callback;return this.callback=e.throttle(n,t),this},subscribe:function(e){return this.callback=e,this}};var h={cache:{},compare:function(e,t){if(this.cache[t]&&this.cache[t][e])return!0;var n=("^"+e.replace(/\./g,"\\.").replace(/\*/g,"[A-Z,a-z,0-9]*").replace(/#/g,".*")+"$").replace("\\..*$","(\\..*)*$").replace("^.*\\.","^(.*\\.)*"),r=new RegExp(n),i=r.test(t);return i&&(this.cache[t]||(this.cache[t]={}),this.cache[t][e]=!0),i},reset:function(){this.cache={}}},p={addWireTap:function(e){var t=this;return t.wireTaps.push(e),function(){var n=t.wireTaps.indexOf(e);n!==-1&&t.wireTaps.splice(n,1)}},changePriority:function(t){var n,r;if(this.subscriptions[t.channel]&&this.subscriptions[t.channel][t.topic]){this.subscriptions[t.channel][t.topic]=e.without(this.subscriptions[t.channel][t.topic],t),n=this.subscriptions[t.channel][t.topic].length-1;for(;n>=0;n--)if(this.subscriptions[t.channel][t.topic][n].priority<=t.priority){this.subscriptions[t.channel][t.topic].splice(n+1,0,t),r=!0;break}r||this.subscriptions[t.channel][t.topic].unshift(t)}},publish:function(t){e.each(this.wireTaps,function(e){e(t.data,t)}),this.subscriptions[t.channel]&&e.each(this.subscriptions[t.channel],function(n){e.each(e.clone(n),function(n){g.configuration.resolver.compare(n.topic,t.topic)&&e.all(n.constraints,function(e){return e.call(n.context,t.data,t)})&&typeof n.callback=="function"&&(n.callback.call(n.context,t.data,t),n.onHandled())})})},reset:function(){this.subscriptions&&(e.each(this.subscriptions,function(t){e.each(t,function(e){while(e.length)e.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(e){var t,n,r,i=this.subscriptions[e.channel],s;return i||(i=this.subscriptions[e.channel]={}),s=this.subscriptions[e.channel][e.topic],s||(s=this.subscriptions[e.channel][e.topic]=new Array(0)),s.push(e),e},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(e){if(this.subscriptions[e.channel][e.topic]){var t=this.subscriptions[e.channel][e.topic].length,n=0;for(;n=0;n--)if(this.subscriptions[t.channel][t.topic][n].priority<=t.priority){this.subscriptions[t.channel][t.topic].splice(n+1,0,t),r=!0;break}r||this.subscriptions[t.channel][t.topic].unshift(t)}},publish:function(t){t.timeStamp=new Date,e.each(this.wireTaps,function(e){e(t.data,t)}),this.subscriptions[t.channel]&&e.each(this.subscriptions[t.channel],function(n){e.each(e.clone(n),function(n){v.configuration.resolver.compare(n.topic,t.topic)&&e.all(n.constraints,function(e){return e.call(n.context,t.data,t)})&&typeof n.callback=="function"&&(n.callback.call(n.context,t.data,t),n.onHandled())})})},reset:function(){this.subscriptions&&(e.each(this.subscriptions,function(t){e.each(t,function(e){while(e.length)e.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(e){var t,n,r,i=this.subscriptions[e.channel],s;return i||(i=this.subscriptions[e.channel]={}),s=this.subscriptions[e.channel][e.topic],s||(s=this.subscriptions[e.channel][e.topic]=new Array(0)),s.push(e),e},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(e){if(this.subscriptions[e.channel][e.topic]){var t=this.subscriptions[e.channel][e.topic].length,n=0;for(;n
-
-
-
- Twitter Hash Tag Stats Demo
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/example/node/client/js/infrastructure/app.js b/example/node/client/js/infrastructure/app.js
deleted file mode 100644
index 6bc83fa..0000000
--- a/example/node/client/js/infrastructure/app.js
+++ /dev/null
@@ -1,55 +0,0 @@
-define( [
- 'jquery',
- 'backbone',
- 'bus',
- 'infrastructure/router',
- 'infrastructure/view-manager',
- 'views/container',
- 'views/menu',
- 'views/tweet-count',
- 'views/mention-count',
- 'views/mentioner-count',
- 'views/hash-tag-count',
- 'views/profanity-percentage',
- 'views/search-requests',
- 'views/wiretap',
-], function ( $, Backbone, bus, Router, ViewManager, ContainerView, MenuView, TweetCountView,
- MentionCountView, MentionerCountView, HashTagCountView, ProfanityPercentage,
- SearchRequestView, WiretapView ) {
- var app = {
- bus : bus,
- router : new Router()
- };
-
- // Set up UI concerns
- app.viewManager = new ViewManager();
- 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 },
- { name : "wiretap", ctor : WiretapView }
- ] );
- app.viewManager.defineUIs( [
- { name : "homeUI", dependencies : [ "container", "menu", "tweetCount", "mentionCount", "mentionerCount", "hashTagCount", "profanityPercentage" ] },
- { name : "searchRequestUI", dependencies : [ "container", "menu", "searchRequests" ] },
- { name : "wireTapLogUI", dependencies : [ "container", "menu", "wiretap" ] }
- ] );
-
- $( function () {
- Backbone.history.start( {
- pushState : true,
- root : $( "base" ).attr( "href" )
- } );
- } );
-
- return app;
-} );
\ No newline at end of file
diff --git a/example/node/client/js/infrastructure/bus.js b/example/node/client/js/infrastructure/bus.js
deleted file mode 100644
index afb50a7..0000000
--- a/example/node/client/js/infrastructure/bus.js
+++ /dev/null
@@ -1,11 +0,0 @@
-define( [
- 'postal'
-], function ( postal ) {
- return {
- router : postal.channel( "router", "*" ),
- viewManager : postal.channel( "viewmanager", "*" ),
- data : postal.channel( "data", "*" ),
- app : postal.channel( "statsApp", "*", { type : "websocket" } ),
- stats : postal.channel( "stats", "*", { type : "websocket" } )
- }
-} );
\ 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
deleted file mode 100644
index 2a56270..0000000
--- a/example/node/client/js/infrastructure/postal.socket-client.js
+++ /dev/null
@@ -1,298 +0,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 ) {
- if ( typeof define === "function" && define.amd ) {
- // AMD. Register as an anonymous module.
- 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 ) {
-
- /*
- 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 socketNamespace,
- 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 ) {
- self.handle( evnt, data );
- } );
- } );
- },
-
- states : {
- uninitialized : {
- tryConnect : function () {
- this.transition( "initializing" );
- }
- },
- initializing : {
- _onEnter : function () {
- socketNamespace = io.connect( postalSocket.config.url, { "auto connect" : false } );
- this.wireUpSocketEvents();
- this.transition( "probing" )
- },
- socketTransmit : function () {
- this.deferUntilTransition( "online" );
- }
- },
- probing : {
- _onEnter : function () {
- clearTimeout( this.retryFn );
- if ( !socketNamespace.socket.connecting && !socketNamespace.socket.reconnecting ) {
- socketNamespace.socket.connect();
- }
- else {
- this.transition( "settingSessionInfo" );
- }
- },
- connect : function () {
- this.transition( "settingSessionInfo" );
- },
- connect_failed : function () {
- this.transition( "disconnected" );
- },
- maxAttempts : function () {
- this.transition( "offline" );
- },
- "postal.socket.remote" : function () {
- this.deferUntilTransition( "online" );
- },
- reconnect : function () {
- this.transition( "settingSessionInfo" );
- },
- reconnect_failed : function () {
- this.transition( "disconnected" );
- },
- socketTransmit : function () {
- this.deferUntilTransition( "online" );
- }
- },
- settingSessionInfo : {
- _onEnter : function () {
- var self = this;
- postal.utils.setSessionId( socketNamespace.socket.sessionid, function ( session ) {
- self.session = session;
- self.transition( "identifying" );
- } );
- }
- },
- identifying : {
- _onEnter : function () {
- var self = this;
- self.retryFn = setTimeout( function () {
- self.handle( "timeout.identifying" );
- }, postalSocket.config.reconnectInterval );
- self.handle( "client.identifier" );
- },
- "client.identifier" : function () {
- clearTimeout( this.retryFn );
- socketNamespace.emit( "postal.clientId", { id : this.session.id, lastId : this.session.lastId } );
- },
- connect_failed : function () {
- this.transition( "disconnected" );
- },
- disconnect : function () {
- this.transition( "probing" );
- },
- "postal.socket.identified" : function ( data ) {
- this.transition( "online" );
- },
- "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" );
- },
- reconnect_failed : function () {
- this.transition( "disconnected" );
- },
- 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 );
- }
- else {
- this.deferUntilTransition( "online" );
- }
- },
- "timeout.identifying" : function () {
- this.transition( "probing" );
- }
- },
- online : {
- disconnect : function () {
- this.transition( "probing" );
- },
- goOffline : function () {
- this.transition( "offline" );
- },
- "postal.socket.remote" : function ( envelope ) {
- postal.publish( 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 );
- }
- },
- offline : {
- _onEnter : function () {
- socketNamespace.socket.disconnect();
- },
- socketTransmit : function () {
- this.deferUntilTransition( "online" );
- },
- "tryConnect" : function () {
- this.transition( "probing" );
- }
- },
- disconnected : {
- _onEnter : function () {
- var self = this;
- self.retryFn = setTimeout( function () {
- self.transition( "probing" );
- }, postalSocket.config.reconnectInterval );
- },
- connecting : function () {
- this.transition( "probing" );
- },
- reconnecting : function () {
- this.transition( "probing" );
- },
- socketTransmit : function () {
- this.deferUntilTransition( "online" );
- }
- }
- }
- } );
- postal.subscribe( {
- channel : "postal",
- topic : "sessionId.changed",
- callback : function () {
- fsm.handle( "postal.session.changed" );
- }
- } );
- return {
- config : {
- url : window.location.origin,
- reconnectInterval : 4000
- },
- goOffline : function () {
- fsm.handle( "goOffline" );
- },
- goOnline : function () {
- fsm.handle( "tryConnect" );
- },
- manifest : [],
- publish : function ( envelope ) {
- fsm.handle( "socketTransmit", "postal.publish", envelope );
- },
- subscribe : function ( options ) {
- options.channel = options.channel || postal.configuration.DEFAULT_CHANNEL;
- options.topic = options.topic || "*";
- 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 ) {
- 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 );
- }
- }
- }
- })();
-
- postal.connections.socket.goOnline();
- 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.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 } );
- };
- postalSocket.subscribe( { channel : sub.channel, topic : sub.topic } );
- return sub;
- };
-
- channel.topic = function ( topic ) {
- if ( topic === channel._topic ) {
- return this;
- }
- return new SocketChannel( this.channel, topic );
- };
-
- return channel;
- };
-
-} ));
\ No newline at end of file
diff --git a/example/node/client/js/infrastructure/router.js b/example/node/client/js/infrastructure/router.js
deleted file mode 100644
index 82f3d49..0000000
--- a/example/node/client/js/infrastructure/router.js
+++ /dev/null
@@ -1,53 +0,0 @@
-define( [
- 'jquery',
- 'backbone',
- 'bus'
-], function ( $, Backbone, bus ) {
-
- return Backbone.Router.extend( {
- routes : {
- "" : "home",
- "requests" : "requests",
- "wiretap" : "wiretap",
- "*anything" : "redirect"
- },
-
- initialize : function () {
- var self = this;
- _.bindAll( self );
-
- $( document ).delegate( "a.ps-nav", "click", function ( e ) {
- e.preventDefault();
- 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
- }
- } );
- },
-
- home : function () {
- this.activateUI( "homeUI" );
- },
-
- requests : function () {
- this.activateUI( "searchRequestUI" );
- },
-
- wiretap : function () {
- this.activateUI( "wireTapLogUI" );
- },
-
- redirect : function () {
- this.navigate( "/", { trigger : true } );
- }
- } );
-} );
\ 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
deleted file mode 100644
index 2508575..0000000
--- a/example/node/client/js/infrastructure/view-manager.js
+++ /dev/null
@@ -1,121 +0,0 @@
-define( [
- 'underscore',
- 'bus'
-], 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
- };
-
- //----------------------------------------------------------------------------
- // registerView - registers a view with the manager, under the name provided.
- // The handle to the constructor function (second arg) is used to create an
- // instance of the view the first time getInstance is called. The rendered
- // and visible booleans are used by the ViewManager to track state of the view.
- // The getInstance call can take an options object. If options.forceNew = true,
- // 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 ) {
- this.views[name] = {
- rendered : false,
- visible : false,
- getInstance : (function () {
- var _instance;
- return function ( options ) {
- var _options = options || {};
- if ( !_instance || _options.forceNew ) {
- _instance = new viewCtor( _options.args || {} );
- }
- return _instance;
- }
- })()
- }
- };
-
- ViewManager.prototype.registerViews = function ( views ) {
- _.each( views, function ( view ) {
- this.registerView( view.name, view.ctor );
- }, this );
- };
-
- //----------------------------------------------------------------------------
- // defineUI - defines a UI configuration, which is effectively a named group
- // of views that need to be stood up, in order. The first argument is the UI
- // 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 ) {
- var self = this;
- self.UI[ name ] = {
- options : options || {},
- dependencies : dependencies,
- activate : function ( data ) {
- data = data || {};
- data.priorContext = self.priorContext;
- data.targetContext = name;
-
- 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 ) ) {
- memo.push( key );
- }
- return memo;
- }, [], this );
-
- _.each( shouldHide, function ( viewName ) {
- var instance = self.views[ viewName ].getInstance();
- 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 );
- self.views[viewName].rendered = true;
- }
- if ( !self.views[viewName].visible ) {
- if ( instance.show ) {
- instance.show( data );
- }
- self.views[viewName].visible = true;
- }
-
- if ( instance.update ) {
- instance.update( data );
- }
- } );
- self.priorContext = name;
- }
- };
- };
-
- 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 ) {
- var uis = _.isArray( uiName ) ? uiName : [ uiName ];
-
- if ( !this.views[ viewName ] ) {
- this.registerView( viewName, viewCtor );
- }
-
- _.each( uis, function ( ui ) {
- if ( this.UI[ ui ] ) {
- this.UI[ ui ].dependencies.push( viewName );
- }
- }, this );
- };
-
- return ViewManager;
-} );
\ No newline at end of file
diff --git a/example/node/client/js/lib/amplify.js b/example/node/client/js/lib/amplify.js
deleted file mode 100644
index 7394022..0000000
--- a/example/node/client/js/lib/amplify.js
+++ /dev/null
@@ -1,360 +0,0 @@
-/*!
- * AmplifyJS 1.0.0 - Core, Store, Request
- *
- * Copyright 2011 appendTo LLC. (http://appendto.com/team)
- * Dual licensed under the MIT or GPL licenses.
- * http://appendto.com/open-source-licenses
- *
- * 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 < g; h++ ) {
- f = e[h], i = f.callback.apply( f.context, b );
- if ( i === !1 ) {
- break
- }
- }
- return i !== !1
- }, subscribe : function ( a, b, c, e ) {
- arguments.length === 3 && typeof c == "number" && (e = c, c = b, b = null), arguments.length === 2 && (c = b, b = null), e = e || 10;
- var f = 0, g = a.split( /\s/ ), h = g.length, i;
- for ( ; f < h; f++ ) {
- a = g[f], i = !1, d[a] || (d[a] = []);
- var j = d[a].length - 1, k = {callback : c, context : b, priority : e};
- for ( ; j >= 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
deleted file mode 100644
index 8b5f909..0000000
--- a/example/node/client/js/lib/backbone.js
+++ /dev/null
@@ -1,710 +0,0 @@
-// Backbone.js 0.9.2
-
-// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// 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 < d; c++ ) {
- if ( !(e = a[c] = this._prepareModel( a[c], b )) ) {
- throw Error( "Can't add an invalid model to a collection" );
- }
- g = e.cid;
- h = e.id;
- j[g] || this._byCid[g] || h != null && (i[h] || this._byId[h]) ? l.push( c ) : j[g] = i[h] = e
- }
- for ( c = l.length; c--; ) {
- a.splice( l[c], 1 );
- }
- for ( c = 0, d = a.length; c < d; c++ ) {
- (e = a[c]).on( "all", this._onModelEvent, this ), this._byCid[e.cid] = e, e.id != null && (this._byId[e.id] = e);
- }
- this.length += d;
- z.apply( this.models, [b.at != null ? b.at : this.models.length, 0].concat( a ) );
- this.comparator && this.sort( {silent : true} );
- if ( b.silent ) {
- return this;
- }
- for ( c = 0, d = this.models.length; c < d; c++ ) {
- if ( j[(e = this.models[c]).cid] ) {
- b.index = c, e.trigger( "add", e, this, b );
- }
- }
- return this
- }, remove : function ( a, b ) {
- var c, d, e, g;
- b || (b = {});
- a = f.isArray( a ) ? a.slice() : [a];
- for ( c = 0, d = a.length; c < d; c++ ) {
- if ( g = this.getByCid( a[c] ) || this.get( a[c] ) ) {
- delete this._byId[g.id];
- delete this._byCid[g.cid];
- e = this.indexOf( g );
- this.models.splice( e, 1 );
- this.length--;
- if ( !b.silent ) {
- b.index = e, g.trigger( "remove", g, this, b );
- }
- this._removeReference( g )
- }
- }
- return this
- }, push : function ( a, b ) {
- a = this._prepareModel( a, b );
- this.add( a,
- b );
- return a
- }, pop : function ( a ) {
- var b = this.at( this.length - 1 );
- this.remove( b, a );
- return b
- }, unshift : function ( a, b ) {
- a = this._prepareModel( a, b );
- this.add( a, f.extend( {at : 0}, b ) );
- return a
- }, shift : function ( a ) {
- var b = this.at( 0 );
- this.remove( b, a );
- return b
- }, get : function ( a ) {
- return a == null ? void 0 : this._byId[a.id != null ? a.id : a]
- }, getByCid : function ( a ) {
- return a && this._byCid[a.cid || a]
- }, at : function ( a ) {
- return this.models[a]
- }, where : function ( a ) {
- return f.isEmpty( a ) ? [] : this.filter( function ( b ) {
- for ( var c in a ) {
- if ( a[c] !== b.get( c ) ) {
- return false;
- }
- }
- return true
- } )
- }, sort : function ( a ) {
- a || (a = {});
- if ( !this.comparator ) {
- throw Error( "Cannot sort a set without a comparator" );
- }
- var b = f.bind( this.comparator, this );
- this.comparator.length == 1 ? this.models = this.sortBy( b ) : this.models.sort( b );
- a.silent || this.trigger( "reset", this, a );
- return this
- }, pluck : function ( a ) {
- return f.map( this.models, function ( b ) {
- return b.get( a )
- } )
- }, reset : function ( a, b ) {
- a || (a = []);
- b || (b = {});
- for ( var c = 0, d = this.models.length; c < d; c++ ) {
- this._removeReference( this.models[c] );
- }
- this._reset();
- this.add( a, f.extend( {silent : true},
- b ) );
- b.silent || this.trigger( "reset", this, b );
- return this
- }, fetch : function ( a ) {
- a = a ? f.clone( a ) : {};
- if ( a.parse === void 0 ) {
- a.parse = true;
- }
- var b = this, c = a.success;
- a.success = function ( d, e, f ) {
- b[a.add ? "add" : "reset"]( b.parse( d, f ), a );
- c && c( b, d )
- };
- a.error = g.wrapError( a.error, b, a );
- return(this.sync || g.sync).call( this, "read", this, a )
- }, create : function ( a, b ) {
- var c = this, b = b ? f.clone( b ) : {}, a = this._prepareModel( a, b );
- if ( !a ) {
- return false;
- }
- b.wait || c.add( a, b );
- var d = b.success;
- b.success = function ( e, f ) {
- b.wait && c.add( e, b );
- d ? d( e, f ) : e.trigger( "sync",
- a, f, b )
- };
- a.save( null, b );
- return a
- }, parse : function ( a ) {
- return a
- }, chain : function () {
- return f( this.models ).chain()
- }, _reset : function () {
- this.length = 0;
- this.models = [];
- this._byId = {};
- this._byCid = {}
- }, _prepareModel : function ( a, b ) {
- b || (b = {});
- if ( a instanceof o ) {
- if ( !a.collection ) {
- a.collection = this
- }
- } else {
- var c;
- b.collection = this;
- a = new this.model( a, b );
- a._validate( a.attributes, b ) || (a = false)
- }
- return a
- }, _removeReference : function ( a ) {
- this == a.collection && delete a.collection;
- a.off( "all", this._onModelEvent, this )
- }, _onModelEvent : function ( a, b, c, d ) {
- (a == "add" || a == "remove") && c != this || (a == "destroy" && this.remove( b, d ), b && a === "change:" + b.idAttribute && (delete this._byId[b.previous( b.idAttribute )], this._byId[b.id] = b), this.trigger.apply( this, arguments ))
- }} );
- f.each( "forEach,each,map,reduce,reduceRight,find,detect,filter,select,reject,every,all,some,any,include,contains,invoke,max,min,sortBy,sortedIndex,toArray,size,first,initial,rest,last,without,indexOf,shuffle,lastIndexOf,isEmpty,groupBy".split( "," ), function ( a ) {
- r.prototype[a] = function () {
- return f[a].apply( f,
- [this.models].concat( f.toArray( arguments ) ) )
- }
- } );
- var u = g.Router = function ( a ) {
- a || (a = {});
- if ( a.routes ) {
- this.routes = a.routes;
- }
- this._bindRoutes();
- this.initialize.apply( this, arguments )
- }, A = /:\w+/g, B = /\*\w+/g, C = /[-[\]{}()+?.,\\^$|#\s]/g;
- f.extend( u.prototype, l, {initialize : function () {
- }, route : function ( a, b, c ) {
- g.history || (g.history = new m);
- f.isRegExp( a ) || (a = this._routeToRegExp( a ));
- c || (c = this[b]);
- g.history.route( a, f.bind( function ( d ) {
- d = this._extractParameters( a, d );
- c && c.apply( this, d );
- this.trigger.apply( this, ["route:" +
- b].concat( d ) );
- g.history.trigger( "route", this, b, d )
- }, this ) );
- return this
- }, navigate : function ( a, b ) {
- g.history.navigate( a, b )
- }, _bindRoutes : function () {
- if ( this.routes ) {
- var a = [], b;
- for ( b in this.routes ) {
- a.unshift( [b, this.routes[b]] );
- }
- b = 0;
- for ( var c = a.length; b < c; b++ ) {
- this.route( a[b][0], a[b][1], this[a[b][1]] )
- }
- }
- }, _routeToRegExp : function ( a ) {
- a = a.replace( C, "\\$&" ).replace( A, "([^/]+)" ).replace( B, "(.*?)" );
- return RegExp( "^" + a + "$" )
- }, _extractParameters : function ( a, b ) {
- return a.exec( b ).slice( 1 )
- }} );
- var m = g.History = function () {
- this.handlers =
- [];
- f.bindAll( this, "checkUrl" )
- }, s = /^[#\/]/, D = /msie [\w.]+/;
- m.started = false;
- f.extend( m.prototype, l, {interval : 50, getHash : function ( a ) {
- return(a = (a ? a.location : window.location).href.match( /#(.*)$/ )) ? a[1] : ""
- }, getFragment : function ( a, b ) {
- if ( a == null ) {
- if ( this._hasPushState || b ) {
- var a = window.location.pathname, c = window.location.search;
- c && (a += c)
- } else {
- a = this.getHash();
- }
- }
- a.indexOf( this.options.root ) || (a = a.substr( this.options.root.length ));
- return a.replace( s, "" )
- }, start : function ( a ) {
- if ( m.started ) {
- throw Error( "Backbone.history has already been started" );
- }
- m.started = true;
- this.options = f.extend( {}, {root : "/"}, this.options, a );
- this._wantsHashChange = this.options.hashChange !== false;
- this._wantsPushState = !!this.options.pushState;
- this._hasPushState = !(!this.options.pushState || !window.history || !window.history.pushState);
- var a = this.getFragment(), b = document.documentMode;
- if ( b = D.exec( navigator.userAgent.toLowerCase() ) && (!b || b <= 7) ) {
- this.iframe = i( '' ).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
deleted file mode 100644
index b02e9a5..0000000
--- a/example/node/client/js/lib/machina.js
+++ /dev/null
@@ -1,212 +0,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 ) {
- // AMD. Register as an anonymous module.
- define( ["underscore"], function ( _ ) {
- return factory( _, root, doc );
- } );
- } else {
- // Browser globals
- factory( root._, root, doc );
- }
-}( 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;
- };
- 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 );
- }
- 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() );
- }
- }
- } );
- 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.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.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.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.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.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] ) {
- this.eventListeners[eventName] = [];
- }
- this.eventListeners[eventName].push( callback );
- },
- off : function ( eventName, callback ) {
- if ( this.eventListeners[eventName] ) {
- this.eventListeners[eventName] = _.without( this.eventListeners[eventName], callback );
- }
- },
- 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 ) );
- } );
- }
- },
- eventListeners : {
- newFsm : []
- }
- };
-
- global.machina = machina;
- return machina;
-} ));
\ 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
deleted file mode 100644
index 168df84..0000000
--- a/example/node/client/js/lib/postal.diagnostics.js
+++ /dev/null
@@ -1,89 +0,0 @@
-// This is the amd module version of postal.diagnostics.js
-// If you need the standard lib version, go to http://github.com/ifandelse/postal.js
-define( [ "postal", "underscore" ], function ( postal, _, undefined ) {
-
- var filters = [],
- applyFilter = function ( filter, env ) {
- var match = 0, possible = 0;
- _.each( filter, function ( item, key ) {
- if ( env[key] ) {
- possible++;
- if ( _.isRegExp( item ) && item.test( env[key] ) ) {
- match++;
- }
- else if ( _.isObject( env[key] ) && !_.isArray( env[key] ) ) {
- if ( applyFilter( item, env[key] ) ) {
- match++;
- }
- }
- else {
- if ( _.isEqual( env[key], item ) ) {
- match++;
- }
- }
- }
- } );
- return match === possible;
- };
-
- // this returns a callback that, if invoked, removes the wireTap
- var wireTap = postal.addWireTap( function ( data, envelope ) {
- if ( !filters.length || _.any( filters, function ( filter ) {
- return applyFilter( filter, envelope );
- } ) ) {
- if ( !JSON ) {
- throw "This browser or environment does not provide JSON support";
- }
- try {
- console.log( JSON.stringify( envelope ) );
- }
- catch ( exception ) {
- try {
- var env = _.extend( {}, envelope );
- delete env.data;
- console.log( JSON.stringify( env ) + "\n\t" + "JSON.stringify Error: " + exception.message );
- }
- catch ( ex ) {
- console.log( "Unable to parse data to JSON: " + exception );
- }
- }
- }
- } );
-
- postal.diagnostics = postal.diagnostics || {};
-
- postal.diagnostics.console = {
- clearFilters : function () {
- filters = [];
- },
- removeFilter : function ( filter ) {
- filters = _.filter( filters, function ( item ) {
- return !_.isEqual( item, filter );
- } );
- },
- addFilter : function ( constraint ) {
- if ( !_.isArray( constraint ) ) {
- constraint = [ constraint ];
- }
- _.each( constraint, function ( item ) {
- if ( filters.length === 0 || !_.any( filters, function ( filter ) {
- return _.isEqual( filter, item );
- } ) ) {
- filters.push( item );
- }
- } );
-
- },
- getCurrentFilters : function () {
- return filters;
- },
- removeWireTap : function () {
- if ( wireTap ) {
- wireTap();
- }
- }
- };
-
-
-
-} );
\ No newline at end of file
diff --git a/example/node/client/js/lib/postal.js b/example/node/client/js/lib/postal.js
deleted file mode 100644
index 82deed7..0000000
--- a/example/node/client/js/lib/postal.js
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- postal
- Author: Jim Cowart (http://freshbrewedcode.com/jimcowart)
- License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
- Version 0.7.3
- */
-(function ( root, factory ) {
- if ( typeof define === "function" && define.amd ) {
- // AMD. Register as an anonymous module.
- define( ["underscore"], function ( _ ) {
- return factory( _, root );
- } );
- } else {
- // Browser globals
- factory( root._, root );
- }
-}( this, function ( _, global, undefined ) {
-
- var DEFAULT_CHANNEL = "/",
- DEFAULT_PRIORITY = 50,
- DEFAULT_DISPOSEAFTER = 0,
- SYSTEM_CHANNEL = "postal",
- NO_OP = function () {
- };
-
- var ConsecutiveDistinctPredicate = function () {
- var previous;
- return function ( data ) {
- var eq = false;
- if ( _.isString( data ) ) {
- eq = data === previous;
- previous = data;
- }
- else {
- eq = _.isEqual( data, previous );
- previous = _.clone( data );
- }
- return !eq;
- };
- };
- var DistinctPredicate = function () {
- var previous = [];
-
- return function (data) {
- var isDistinct = !_.any(previous, function (p) {
- if (_.isObject(data) || _.isArray(data)) {
- return _.isEqual(data, p);
- }
- return data === p;
- });
- if (isDistinct) {
- previous.push(data);
- }
- return isDistinct;
- };
- };
- var ChannelDefinition = function ( channelName, defaultTopic ) {
- this.channel = channelName || DEFAULT_CHANNEL;
- this._topic = defaultTopic || "";
- };
-
- ChannelDefinition.prototype = {
- subscribe : function () {
- var len = arguments.length;
- 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] );
- }
- },
-
- publish : function ( obj ) {
- var _obj = obj || {};
- var envelope = {
- channel : this.channel,
- topic : this._topic,
- data : _obj
- };
- // If this is an envelope....
- if ( _obj.topic && _obj.data ) {
- envelope = _obj;
- envelope.channel = envelope.channel || this.channel;
- }
- envelope.timeStamp = new Date();
- postal.configuration.bus.publish( envelope );
- return envelope;
- },
-
- topic : function ( topic ) {
- if ( topic === this._topic ) {
- return this;
- }
- return new ChannelDefinition( this.channel, topic );
- }
- };
-
- 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.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.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
- }
- } );
- },
-
- defer : function () {
- var fn = this.callback;
- this.callback = function ( data ) {
- setTimeout( fn, 0, data );
- };
- return this;
- },
-
- 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 ) );
-
- this.onHandled = function () {
- fn.apply( this.context, arguments );
- dispose();
- };
- return this;
- },
-
- distinctUntilChanged : function () {
- this.withConstraint( new ConsecutiveDistinctPredicate() );
- return this;
- },
-
- distinct : function () {
- this.withConstraint( new DistinctPredicate() );
- return this;
- },
-
- once: function() {
- this.disposeAfter(1);
- },
-
- withConstraint : function ( predicate ) {
- if ( !_.isFunction( predicate ) ) {
- throw "Predicate constraint must be a function";
- }
- this.constraints.push( predicate );
- return this;
- },
-
- withConstraints : function ( predicates ) {
- var self = this;
- if ( _.isArray( predicates ) ) {
- _.each( predicates, function ( predicate ) {
- self.withConstraint( predicate );
- } );
- }
- return self;
- },
-
- withContext : function ( context ) {
- this.context = context;
- return this;
- },
-
- withDebounce : function ( milliseconds ) {
- if ( _.isNaN( milliseconds ) ) {
- throw "Milliseconds must be a number";
- }
- var fn = this.callback;
- this.callback = _.debounce( fn, milliseconds );
- return this;
- },
-
- 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 );
- };
- return this;
- },
-
- withPriority : function ( priority ) {
- if ( _.isNaN( priority ) ) {
- throw "Priority must be a number";
- }
- this.priority = priority;
- postal.configuration.bus.changePriority( this );
- return this;
- },
-
- withThrottle : function ( milliseconds ) {
- if ( _.isNaN( milliseconds ) ) {
- throw "Milliseconds must be a number";
- }
- var fn = this.callback;
- this.callback = _.throttle( fn, milliseconds );
- return this;
- },
-
- subscribe : function ( callback ) {
- this.callback = callback;
- return this;
- }
- };
-
- var bindingsResolver = {
- cache : { },
-
- compare : function ( binding, topic ) {
- if ( this.cache[topic] && this.cache[topic][binding] ) {
- return true;
- }
- var pattern = ("^" + binding.replace( /\./g, "\\." ) // escape actual periods
- .replace( /\*/g, "[A-Z,a-z,0-9]*" ) // asterisks match any alpha-numeric 'word'
- .replace( /#/g, ".*" ) + "$") // hash matches 'n' # of words (+ optional on start/end of topic)
- .replace( "\\..*$", "(\\..*)*$" ) // fix end of topic matching on hash wildcards
- .replace( "^.*\\.", "^(.*\\.)*" ); // fix beginning of topic matching on hash wildcards
- var rgx = new RegExp( pattern );
- var result = rgx.test( topic );
- if ( result ) {
- if ( !this.cache[topic] ) {
- this.cache[topic] = {};
- }
- this.cache[topic][binding] = true;
- }
- return result;
- },
-
- reset : function () {
- this.cache = {};
- }
- };
-
- var localBus = {
-
- 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 );
- }
- };
- },
-
- changePriority : function ( subDef ) {
- var idx, found;
- if ( this.subscriptions[subDef.channel] && this.subscriptions[subDef.channel][subDef.topic] ) {
- this.subscriptions[subDef.channel][subDef.topic] = _.without( this.subscriptions[subDef.channel][subDef.topic], subDef );
- idx = this.subscriptions[subDef.channel][subDef.topic].length - 1;
- for ( ; idx >= 0; idx-- ) {
- if ( this.subscriptions[subDef.channel][subDef.topic][idx].priority <= subDef.priority ) {
- this.subscriptions[subDef.channel][subDef.topic].splice( idx + 1, 0, subDef );
- found = true;
- break;
- }
- }
- if ( !found ) {
- this.subscriptions[subDef.channel][subDef.topic].unshift( subDef );
- }
- }
- },
-
- publish : function ( envelope ) {
- _.each( this.wireTaps, function ( tap ) {
- tap( envelope.data, envelope );
- } );
-
- if ( this.subscriptions[envelope.channel] ) {
- _.each( this.subscriptions[envelope.channel], function ( topic ) {
- // TODO: research faster ways to handle this than _.clone
- _.each( _.clone( topic ), function ( subDef ) {
- if ( postal.configuration.resolver.compare( subDef.topic, envelope.topic ) ) {
- if ( _.all( subDef.constraints, function ( constraint ) {
- return constraint.call(subDef.context, envelope.data, envelope );
- } ) ) {
- if ( typeof subDef.callback === 'function' ) {
- subDef.callback.call( subDef.context, envelope.data, envelope );
- subDef.onHandled();
- }
- }
- }
- } );
- } );
- }
-
- },
-
- 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 ) {
- var idx, found, fn, channel = this.subscriptions[subDef.channel], subs;
-
- 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 );
- }
- subs.push( subDef );
- return subDef;
- },
-
- subscriptions : {},
-
- wireTaps : new Array( 0 ),
-
- 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 ) {
- this.subscriptions[config.channel][config.topic].splice( idx, 1 );
- break;
- }
- }
- }
- }
- };
-
- var publishPicker = {
- "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 };
- postal.configuration.bus.publish( envelope );
- return envelope;
- }
- },
- channelPicker = {
- "1" : function ( chn ) {
- var channel = chn, topic, options = {};
- if ( Object.prototype.toString.call( channel ) === "[object String]" ) {
- channel = DEFAULT_CHANNEL;
- topic = chn;
- }
- else {
- channel = chn.channel || DEFAULT_CHANNEL;
- topic = chn.topic;
- options = chn.options || options;
- }
- return new postal.channelTypes[ options.type || "local" ]( channel, topic );
- },
- "2" : function ( chn, tpc ) {
- var channel = chn, topic = tpc, options = {};
- if ( Object.prototype.toString.call( tpc ) === "[object Object]" ) {
- channel = DEFAULT_CHANNEL;
- topic = chn;
- options = tpc;
- }
- return new postal.channelTypes[ options.type || "local" ]( channel, topic );
- },
- "3" : function ( channel, topic, options ) {
- return new postal.channelTypes[ options.type || "local" ]( channel, topic );
- }
- },
- sessionInfo = {};
-
- // save some setup time, albeit tiny
- localBus.subscriptions[SYSTEM_CHANNEL] = {};
-
- var postal = {
- configuration : {
- bus : localBus,
- resolver : bindingsResolver,
- DEFAULT_CHANNEL : DEFAULT_CHANNEL,
- DEFAULT_PRIORITY : DEFAULT_PRIORITY,
- DEFAULT_DISPOSEAFTER : DEFAULT_DISPOSEAFTER,
- SYSTEM_CHANNEL : SYSTEM_CHANNEL
- },
-
- channelTypes : {
- local : ChannelDefinition
- },
-
- channel : function () {
- var len = arguments.length;
- if ( channelPicker[len] ) {
- return channelPicker[len].apply( this, arguments );
- }
- },
-
- subscribe : function ( options ) {
- var callback = options.callback,
- topic = options.topic,
- channel = options.channel || DEFAULT_CHANNEL;
- return new SubscriptionDefinition( channel, topic, callback );
- },
-
- publish : function () {
- var len = arguments.length;
- if ( publishPicker[len] ) {
- return publishPicker[len].apply( this, arguments );
- }
- },
-
- addWireTap : function ( callback ) {
- return this.configuration.bus.addWireTap( callback );
- },
-
- linkChannels : function ( sources, destinations ) {
- var result = [];
- if ( !_.isArray( sources ) ) {
- sources = [sources];
- }
- if ( !_.isArray( destinations ) ) {
- destinations = [destinations];
- }
- _.each( sources, function ( source ) {
- var sourceTopic = source.topic || "#";
- _.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 ) {
- var newEnv = _.clone( env );
- newEnv.topic = _.isFunction( destination.topic ) ? destination.topic( env.topic ) : destination.topic || env.topic;
- newEnv.channel = destChannel;
- newEnv.data = data;
- postal.publish( newEnv );
- }
- } )
- );
- } );
- } );
- return result;
- },
-
- utils : {
- getSubscribersFor : function () {
- var channel = arguments[ 0 ],
- tpc = arguments[ 1 ],
- result = [];
- if ( arguments.length === 1 ) {
- if ( Object.prototype.toString.call( channel ) === "[object String]" ) {
- channel = postal.configuration.DEFAULT_CHANNEL;
- tpc = arguments[ 0 ];
- }
- else {
- channel = arguments[ 0 ].channel || postal.configuration.DEFAULT_CHANNEL;
- tpc = arguments[ 0 ].topic;
- }
- }
- if ( postal.configuration.bus.subscriptions[ channel ] &&
- postal.configuration.bus.subscriptions[ channel ].hasOwnProperty( tpc ) ) {
- result = postal.configuration.bus.subscriptions[ channel ][ tpc ];
- }
- return result;
- },
-
- reset : function () {
- postal.configuration.bus.reset();
- postal.configuration.resolver.reset();
- }
- }
- };
-
- global.postal = postal;
- return postal;
-} ));
\ No newline at end of file
diff --git a/example/node/client/js/lib/postal.min.js b/example/node/client/js/lib/postal.min.js
deleted file mode 100644
index 33f3940..0000000
--- a/example/node/client/js/lib/postal.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- postal
- Author: Jim Cowart (http://freshbrewedcode.com/jimcowart)
- License: Dual licensed MIT (http://www.opensource.org/licenses/mit-license) & GPL (http://www.opensource.org/licenses/gpl-license)
- Version 0.7.3
- */
-(function(e,t){typeof define=="function"&&define.amd?define(["underscore"],function(n){return t(n,e)}):t(e._,e)})(this,function(e,t,n){var r="/",i=50,s=0,o="postal",u=function(){},a=function(){var t;return function(n){var r=!1;return e.isString(n)?(r=n===t,t=n):(r=e.isEqual(n,t),t=e.clone(n)),!r}},f=function(){var t=[];return function(n){var r=!e.any(t,function(t){return e.isObject(n)||e.isArray(n)?e.isEqual(n,t):n===t});return r&&t.push(n),r}},l=function(e,t){this.channel=e||r,this._topic=t||""};l.prototype={subscribe:function(){var e=arguments.length;if(e===1)return new c(this.channel,this._topic,arguments[0]);if(e===2)return new c(this.channel,arguments[0],arguments[1])},publish:function(e){var t=e||{},n={channel:this.channel,topic:this._topic,data:t};return t.topic&&t.data&&(n=t,n.channel=n.channel||this.channel),n.timeStamp=new Date,g.configuration.bus.publish(n),n},topic:function(e){return e===this._topic?this:new l(this.channel,e)}};var c=function(e,t,n){this.channel=e,this.topic=t,this.callback=n,this.priority=i,this.constraints=new Array(0),this.maxCalls=s,this.onHandled=u,this.context=null,g.configuration.bus.publish({channel:o,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:e,topic:t}}),g.configuration.bus.subscribe(this)};c.prototype={unsubscribe:function(){g.configuration.bus.unsubscribe(this),g.configuration.bus.publish({channel:o,topic:"subscription.removed",timeStamp:new Date,data:{event:"subscription.removed",channel:this.channel,topic:this.topic}})},defer:function(){var e=this.callback;return this.callback=function(t){setTimeout(e,0,t)},this},disposeAfter:function(t){if(e.isNaN(t)||t<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var n=this.onHandled,r=e.after(t,e.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){n.apply(this.context,arguments),r()},this},distinctUntilChanged:function(){return this.withConstraint(new a),this},distinct:function(){return this.withConstraint(new f),this},once:function(){this.disposeAfter(1)},withConstraint:function(t){if(!e.isFunction(t))throw"Predicate constraint must be a function";return this.constraints.push(t),this},withConstraints:function(t){var n=this;return e.isArray(t)&&e.each(t,function(e){n.withConstraint(e)}),n},withContext:function(e){return this.context=e,this},withDebounce:function(t){if(e.isNaN(t))throw"Milliseconds must be a number";var n=this.callback;return this.callback=e.debounce(n,t),this},withDelay:function(t){if(e.isNaN(t))throw"Milliseconds must be a number";var n=this.callback;return this.callback=function(e){setTimeout(function(){n(e)},t)},this},withPriority:function(t){if(e.isNaN(t))throw"Priority must be a number";return this.priority=t,g.configuration.bus.changePriority(this),this},withThrottle:function(t){if(e.isNaN(t))throw"Milliseconds must be a number";var n=this.callback;return this.callback=e.throttle(n,t),this},subscribe:function(e){return this.callback=e,this}};var h={cache:{},compare:function(e,t){if(this.cache[t]&&this.cache[t][e])return!0;var n=("^"+e.replace(/\./g,"\\.").replace(/\*/g,"[A-Z,a-z,0-9]*").replace(/#/g,".*")+"$").replace("\\..*$","(\\..*)*$").replace("^.*\\.","^(.*\\.)*"),r=new RegExp(n),i=r.test(t);return i&&(this.cache[t]||(this.cache[t]={}),this.cache[t][e]=!0),i},reset:function(){this.cache={}}},p={addWireTap:function(e){var t=this;return t.wireTaps.push(e),function(){var n=t.wireTaps.indexOf(e);n!==-1&&t.wireTaps.splice(n,1)}},changePriority:function(t){var n,r;if(this.subscriptions[t.channel]&&this.subscriptions[t.channel][t.topic]){this.subscriptions[t.channel][t.topic]=e.without(this.subscriptions[t.channel][t.topic],t),n=this.subscriptions[t.channel][t.topic].length-1;for(;n>=0;n--)if(this.subscriptions[t.channel][t.topic][n].priority<=t.priority){this.subscriptions[t.channel][t.topic].splice(n+1,0,t),r=!0;break}r||this.subscriptions[t.channel][t.topic].unshift(t)}},publish:function(t){e.each(this.wireTaps,function(e){e(t.data,t)}),this.subscriptions[t.channel]&&e.each(this.subscriptions[t.channel],function(n){e.each(e.clone(n),function(n){g.configuration.resolver.compare(n.topic,t.topic)&&e.all(n.constraints,function(e){return e.call(n.context,t.data,t)})&&typeof n.callback=="function"&&(n.callback.call(n.context,t.data,t),n.onHandled())})})},reset:function(){this.subscriptions&&(e.each(this.subscriptions,function(t){e.each(t,function(e){while(e.length)e.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(e){var t,n,r,i=this.subscriptions[e.channel],s;return i||(i=this.subscriptions[e.channel]={}),s=this.subscriptions[e.channel][e.topic],s||(s=this.subscriptions[e.channel][e.topic]=new Array(0)),s.push(e),e},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(e){if(this.subscriptions[e.channel][e.topic]){var t=this.subscriptions[e.channel][e.topic].length,n=0;for(;n 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
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Wed Mar 21 12:46:34 2012 -0700
- */
-(function ( window, undefined ) {
-
-// Use the correct document accordingly with window argument (sandbox)
- var document = window.document,
- navigator = window.navigator,
- location = window.location;
- var jQuery = (function () {
-
-// Define a local copy of jQuery
- var jQuery = function ( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
- },
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- // A central reference to the root jQuery(document)
- rootjQuery,
-
- // A simple way to check for HTML strings or ID strings
- // Prioritize #id over to avoid XSS via location.hash (#9521)
- quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
- // Check if a string has a non-whitespace character in it
- rnotwhite = /\S/,
-
- // Used for trimming whitespace
- trimLeft = /^\s+/,
- trimRight = /\s+$/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
- // Useragent RegExp
- rwebkit = /(webkit)[ \/]([\w.]+)/,
- ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
- rmsie = /(msie) ([\w.]+)/,
- rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
-
- // Matches dashed string for camelizing
- rdashAlpha = /-([a-z]|[0-9])/ig,
- rmsPrefix = /^-ms-/,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function ( all, letter ) {
- return ( letter + "" ).toUpperCase();
- },
-
- // Keep a UserAgent string for use with jQuery.browser
- userAgent = navigator.userAgent,
-
- // For matching the engine and version of the browser
- browserMatch,
-
- // The deferred used on DOM ready
- readyList,
-
- // The ready event handler
- DOMContentLoaded,
-
- // Save a reference to some core methods
- toString = Object.prototype.toString,
- hasOwn = Object.prototype.hasOwnProperty,
- push = Array.prototype.push,
- slice = Array.prototype.slice,
- trim = String.prototype.trim,
- indexOf = Array.prototype.indexOf,
-
- // [[Class]] -> type pairs
- class2type = {};
-
- jQuery.fn = jQuery.prototype = {
- constructor : jQuery,
- init : function ( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
-
- // Handle $(""), $(null), or $(undefined)
- if ( !selector ) {
- return this;
- }
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
- // The body element only exists once, optimize finding it
- if ( selector === "body" && !context && document.body ) {
- this.context = document;
- this[0] = document.body;
- this.selector = selector;
- this.length = 1;
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- // Are we dealing with HTML string or an ID?
- if ( selector.charAt( 0 ) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = quickExpr.exec( selector );
- }
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
- doc = ( context ? context.ownerDocument || context : document );
-
- // If a single string is passed in and it's a single tag
- // just do a createElement and skip the rest
- ret = rsingleTag.exec( selector );
-
- if ( ret ) {
- if ( jQuery.isPlainObject( context ) ) {
- selector = [ document.createElement( ret[1] ) ];
- jQuery.fn.attr.call( selector, context, true );
-
- } else {
- selector = [ doc.createElement( ret[1] ) ];
- }
-
- } else {
- ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = ( ret.cacheable ? jQuery.clone( ret.fragment ) : ret.fragment ).childNodes;
- }
-
- return jQuery.merge( this, selector );
-
- // HANDLE: $("#id")
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector : "",
-
- // The current version of jQuery being used
- jquery : "1.7.2",
-
- // The default length of a jQuery object is 0
- length : 0,
-
- // The number of elements contained in the matched element set
- size : function () {
- return this.length;
- },
-
- toArray : function () {
- return slice.call( this, 0 );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get : function ( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack : function ( elems, name, selector ) {
- // Build a new jQuery matched element set
- var ret = this.constructor();
-
- if ( jQuery.isArray( elems ) ) {
- push.apply( ret, elems );
-
- } else {
- jQuery.merge( ret, elems );
- }
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" ) {
- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each : function ( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready : function ( fn ) {
- // Attach the listeners
- jQuery.bindReady();
-
- // Add the callback
- readyList.add( fn );
-
- return this;
- },
-
- eq : function ( i ) {
- i = +i;
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, i + 1 );
- },
-
- first : function () {
- return this.eq( 0 );
- },
-
- last : function () {
- return this.eq( -1 );
- },
-
- slice : function () {
- return this.pushStack( slice.apply( this, arguments ),
- "slice", slice.call( arguments ).join( "," ) );
- },
-
- map : function ( callback ) {
- return this.pushStack( jQuery.map( this, function ( elem, i ) {
- return callback.call( elem, i, elem );
- } ) );
- },
-
- end : function () {
- return this.prevObject || this.constructor( null );
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push : push,
- sort : [].sort,
- splice : [].splice
- };
-
-// Give the init function the jQuery prototype for later instantiation
- jQuery.fn.init.prototype = jQuery.fn;
-
- jQuery.extend = jQuery.fn.extend = function () {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject( copy ) || (copyIsArray = jQuery.isArray( copy )) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray( src ) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject( src ) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
- };
-
- jQuery.extend( {
- noConflict : function ( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady : false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait : 1,
-
- // Hold (or release) the ready event
- holdReady : function ( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready : function ( wait ) {
- // Either a released hold or an DOMready/load event and not yet ready
- if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.fireWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger( "ready" ).off( "ready" );
- }
- }
- },
-
- bindReady : function () {
- if ( readyList ) {
- return;
- }
-
- readyList = jQuery.Callbacks( "once memory" );
-
- // Catch cases where $(document).ready() is called after the
- // browser event has already occurred.
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Mozilla, Opera and webkit nightlies currently support this event
- if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
-
- // If IE event model is used
- } else if ( document.attachEvent ) {
- // ensure firing before onload,
- // maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var toplevel = false;
-
- try {
- toplevel = window.frameElement == null;
- } catch ( e ) {
- }
-
- if ( document.documentElement.doScroll && toplevel ) {
- doScrollCheck();
- }
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction : function ( obj ) {
- return jQuery.type( obj ) === "function";
- },
-
- isArray : Array.isArray || function ( obj ) {
- return jQuery.type( obj ) === "array";
- },
-
- 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;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
- break;
- }
- }
- }
- }
-
- return object;
- },
-
- // Use native String.trim function wherever possible
- trim : trim ?
- function ( text ) {
- return text == null ?
- "" :
- trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function ( text ) {
- return text == null ?
- "" :
- text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
- },
-
- // results is for internal usage only
- makeArray : function ( array, results ) {
- var ret = results || [];
-
- if ( array != null ) {
- // The window, strings (and functions) also have 'length'
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- var type = jQuery.type( array );
-
- if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
- push.call( ret, array );
- } else {
- jQuery.merge( ret, array );
- }
- }
-
- return ret;
- },
-
- inArray : function ( elem, array, i ) {
- var len;
-
- if ( array ) {
- if ( indexOf ) {
- return indexOf.call( array, elem, i );
- }
-
- len = array.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
- for ( ; i < len; i++ ) {
- // Skip accessing in sparse arrays
- if ( i in array && array[ i ] === elem ) {
- return i;
- }
- }
- }
-
- return -1;
- },
-
- merge : function ( first, second ) {
- var i = first.length,
- j = 0;
-
- if ( typeof second.length === "number" ) {
- for ( var l = second.length; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep : function ( elems, callback, inv ) {
- var ret = [], retVal;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map : function ( elems, callback, arg ) {
- var value, key, ret = [],
- i = 0,
- length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length - 1 ] ) || length === 0 || jQuery.isArray( elems ) );
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return ret.concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid : 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy : function ( fn, context ) {
- if ( typeof context === "string" ) {
- var tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- var args = slice.call( arguments, 2 ),
- proxy = function () {
- return fn.apply( context, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Mutifunctional method to get and set values to a collection
- // The value/s can optionally be executed if it's a function
- access : function ( elems, 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;
- }
- }
- }
- }
- }
- 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;
- };
-
-
- 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;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject( cache[ id ] ) ) {
- return;
- }
- }
-
- // Browsers that fail expando deletion also refuse to delete expandos on
- // the window, but it will allow it on all other JS objects; other browsers
- // don't care
- // Ensure that `cache` is not a window object #10080
- if ( jQuery.support.deleteExpando || !cache.setInterval ) {
- delete cache[ id ];
- } else {
- cache[ id ] = null;
- }
-
- // We destroyed the cache and need to eliminate the expando on the node to avoid
- // false lookups in the cache for entries that no longer exist
- if ( isNode ) {
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( jQuery.support.deleteExpando ) {
- delete elem[ internalKey ];
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( internalKey );
- } else {
- elem[ internalKey ] = null;
- }
- }
- },
-
- // For internal use only.
- _data : function ( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData : function ( elem ) {
- if ( elem.nodeName ) {
- var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- if ( match ) {
- return !(match === true || elem.getAttribute( "classid" ) !== match);
- }
- }
-
- return true;
- }
- } );
-
- jQuery.fn.extend( {
- data : function ( key, value ) {
- var parts, 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 ] );
- }
- }
- 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 );
- }
- }
- }
- }
-
- 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;
-
-// Hook for boolean attributes
- boolHook = {
- get : function ( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
- name.toLowerCase() :
- undefined;
- },
- set : function ( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
- };
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
- if ( !getSetAttribute ) {
-
- fixSpecified = {
- name : true,
- id : true,
- 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;
- }
- }
- } );
- } );
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- get : nodeHook.get,
- set : function ( elem, value, name ) {
- if ( value === "" ) {
- value = "false";
- }
- nodeHook.set( elem, value, name );
- }
- };
- }
-
-
-// Some attributes require a special call on IE
- if ( !jQuery.support.hrefNormalized ) {
- jQuery.each( [ "href", "src", "width", "height" ], function ( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- get : function ( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
- }
- } );
- } );
- }
-
- if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get : function ( elem ) {
- // Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
- },
- set : function ( elem, value ) {
- return ( elem.style.cssText = "" + value );
- }
- };
- }
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
- if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
- get : function ( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- }
- } );
- }
-
-// IE6/7 call enctype encoding
- if ( !jQuery.support.enctype ) {
- jQuery.propFix.enctype = "encoding";
- }
-
-// Radios and checkboxes getter/setter
- if ( !jQuery.support.checkOn ) {
- jQuery.each( [ "radio", "checkbox" ], function () {
- jQuery.valHooks[ this ] = {
- get : function ( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute( "value" ) === null ? "on" : elem.value;
- }
- };
- } );
- }
- jQuery.each( [ "radio", "checkbox" ], function () {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
- set : function ( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) >= 0 );
- }
- }
- } );
- } );
-
-
- var rformElems = /^(?:textarea|input|select)$/i,
- rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
- rhoverHack = /(?:^|\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;
- };
- // 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;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- eventPath = [
- [ elem, special.bindType || type ]
- ];
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
- old = null;
- for ( ; cur; cur = cur.parentNode ) {
- eventPath.push( [ cur, bubbleType ] );
- old = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( old && old === elem.ownerDocument ) {
- eventPath.push( [ old.defaultView || old.parentWindow || window, bubbleType ] );
- }
- }
-
- // Fire handlers on the event path
- for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
- cur = eventPath[i][0];
- event.type = eventPath[i][1];
-
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
- // Note that this is a bare JS function and not a jQuery handler
- handle = ontype && cur[ ontype ];
- if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
- event.preventDefault();
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
- // Don't do default actions on window, that's where global variables be (#6170)
- // IE<9 dies on focus/blur to hidden element (#1486)
- if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
-
- if ( old ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- elem[ type ]();
- jQuery.event.triggered = undefined;
-
- if ( old ) {
- elem[ ontype ] = old;
- }
- }
- }
- }
-
- return event.result;
- },
-
- dispatch : function ( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event || window.event );
-
- var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
- delegateCount = handlers.delegateCount,
- args = [].slice.call( arguments, 0 ),
- run_all = !event.exclusive && !event.namespace,
- 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.removeEvent = document.removeEventListener ?
- function ( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function ( elem, type, handle ) {
- if ( elem.detachEvent ) {
- elem.detachEvent( "on" + type, handle );
- }
- };
-
- jQuery.Event = function ( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !(this instanceof jQuery.Event) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
- };
-
- function returnFalse() {
- return false;
- }
-
- function returnTrue() {
- return true;
- }
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
- jQuery.Event.prototype = {
- preventDefault : function () {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
-
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // otherwise set the returnValue property of the original event to false (IE)
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation : function () {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
- // if stopPropagation exists run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation : function () {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented : returnFalse,
- isPropagationStopped : returnFalse,
- isImmediatePropagationStopped : returnFalse
- };
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
- jQuery.each( {
- mouseenter : "mouseover",
- mouseleave : "mouseout"
- }, function ( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType : fix,
- bindType : fix,
-
- handle : function ( event ) {
- var target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj,
- selector = handleObj.selector,
- ret;
-
- // For mousenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
- } );
-
-// IE submit delegation
- if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup : function () {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function ( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !form._submit_attached ) {
- jQuery.event.add( form, "submit._submit", function ( event ) {
- 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;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each( function () {
- jQuery.event.remove( this, types, fn, selector );
- } );
- },
-
- bind : function ( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind : function ( types, fn ) {
- return this.off( types, null, fn );
- },
-
- live : function ( types, data, fn ) {
- jQuery( this.context ).on( types, this.selector, data, fn );
- return this;
- },
- die : function ( types, fn ) {
- jQuery( this.context ).off( types, this.selector || "**", fn );
- return this;
- },
-
- delegate : function ( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate : function ( selector, types, fn ) {
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length == 1 ? this.off( selector, "**" ) : this.off( types, selector, fn );
- },
-
- trigger : function ( type, data ) {
- return this.each( function () {
- jQuery.event.trigger( type, data, this );
- } );
- },
- triggerHandler : function ( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle : function ( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function ( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover : function ( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
- } );
-
- jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu").split( " " ), function ( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function ( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
- }
-
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
-
- if ( jQuery.attrFn ) {
- jQuery.attrFn[ name ] = true;
- }
-
- if ( rkeyEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
- }
-
- if ( rmouseEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
- }
- } );
-
-
- /*!
- * Sizzle CSS Selector Engine
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
- (function () {
-
- var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
- expando = "sizcache" + (Math.random() + '').replace( '.', '' ),
- done = 0,
- toString = Object.prototype.toString,
- hasDuplicate = false,
- baseHasDuplicate = true,
- rBackslash = /\\/g,
- rReturn = /\r\n/g,
- rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-// Thus far that includes Google Chrome.
- [0, 0].sort( function () {
- baseHasDuplicate = false;
- return 0;
- } );
-
- var Sizzle = function ( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
-
- var origContext = context;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
- return [];
- }
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var m, set, checkSet, extra, ret, cur, pop, i,
- prune = true,
- contextXML = Sizzle.isXML( context ),
- parts = [],
- soFar = selector;
-
- // Reset the position of the chunker regexp (start from head)
- do {
- chunker.exec( "" );
- m = chunker.exec( soFar );
-
- if ( m ) {
- soFar = m[3];
-
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = m[3];
- break;
- }
- }
- } while ( m );
-
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context, seed );
-
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- selector = parts.shift();
-
- if ( Expr.relative[ selector ] ) {
- selector += parts.shift();
- }
-
- set = posProcess( selector, set, seed );
- }
- }
-
- } else {
- // Take a shortcut and set the context if the root selector is an ID
- // (but not if it'll be faster if the inner selector is an ID)
- if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
- Expr.match.ID.test( parts[0] ) && !Expr.match.ID.test( parts[parts.length - 1] ) ) {
-
- ret = Sizzle.find( parts.shift(), context, contextXML );
- context = ret.expr ?
- Sizzle.filter( ret.expr, ret.set )[0] :
- ret.set[0];
- }
-
- if ( context ) {
- ret = seed ?
- { expr : parts.pop(), set : makeArray( seed ) } :
- Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
- set = ret.expr ?
- Sizzle.filter( ret.expr, ret.set ) :
- ret.set;
-
- if ( parts.length > 0 ) {
- checkSet = makeArray( set );
-
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- cur = parts.pop();
- pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop, contextXML );
- }
-
- } else {
- checkSet = parts = [];
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- Sizzle.error( cur || selector );
- }
-
- if ( toString.call( checkSet ) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
-
- } else if ( context && context.nodeType === 1 ) {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains( context, checkSet[i] )) ) {
- results.push( set[i] );
- }
- }
-
- } else {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
-
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, origContext, results, seed );
- Sizzle.uniqueSort( results );
- }
-
- return results;
- };
-
- Sizzle.uniqueSort = function ( results ) {
- if ( sortOrder ) {
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( var i = 1; i < results.length; i++ ) {
- if ( results[i] === results[ i - 1 ] ) {
- results.splice( i--, 1 );
- }
- }
- }
- }
-
- return results;
- };
-
- Sizzle.matches = function ( expr, set ) {
- return Sizzle( expr, null, null, set );
- };
-
- Sizzle.matchesSelector = function ( node, expr ) {
- return Sizzle( expr, null, null, [node] ).length > 0;
- };
-
- Sizzle.find = function ( expr, context, isXML ) {
- var set, i, len, match, type, left;
-
- if ( !expr ) {
- return [];
- }
-
- for ( i = 0, len = Expr.order.length; i < len; i++ ) {
- type = Expr.order[i];
-
- if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- left = match[1];
- match.splice( 1, 1 );
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace( rBackslash, "" );
- set = Expr.find[ type ]( match, context, isXML );
-
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( "*" ) :
- [];
- }
-
- return { set : set, expr : expr };
- };
-
- Sizzle.filter = function ( expr, set, inplace, not ) {
- var match, anyFound,
- type, found, item, filter, left,
- i, pass,
- old = expr,
- result = [],
- curLoop = set,
- isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
- while ( expr && set.length ) {
- for ( type in Expr.filter ) {
- if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
- filter = Expr.filter[ type ];
- left = match[1];
-
- anyFound = false;
-
- match.splice( 1, 1 );
-
- if ( left.substr( left.length - 1 ) === "\\" ) {
- continue;
- }
-
- if ( curLoop === result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
- if ( !match ) {
- anyFound = found = true;
-
- } else if ( match === true ) {
- continue;
- }
- }
-
- if ( match ) {
- for ( i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- pass = not ^ found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
-
- } else {
- curLoop[i] = false;
- }
-
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- // Improper expression
- if ( expr === old ) {
- if ( anyFound == null ) {
- Sizzle.error( expr );
-
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
- };
-
- Sizzle.error = function ( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
- };
-
- /**
- * Utility function for retreiving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
- var getText = Sizzle.getText = function ( elem ) {
- var i, node,
- nodeType = elem.nodeType,
- ret = "";
-
- if ( nodeType ) {
- if ( nodeType === 1 || nodeType === 9 || 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 ( inplace ) {
- curLoop[i] = false;
- }
- }
- }
-
- return false;
- },
-
- ID : function ( match ) {
- return match[1].replace( rBackslash, "" );
- },
-
- TAG : function ( match, curLoop ) {
- return match[1].replace( rBackslash, "" ).toLowerCase();
- },
-
- CHILD : function ( match ) {
- if ( match[1] === "nth" ) {
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- match[2] = match[2].replace( /^\+|\s*/g, '' );
-
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
- match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2] );
-
- // calculate the numbers (first)n+(last) including if they are negative
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
- else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // TODO: Move to normal caching system
- match[0] = done++;
-
- return match;
- },
-
- ATTR : function ( match, curLoop, inplace, result, not, isXML ) {
- var name = match[1] = match[1].replace( rBackslash, "" );
-
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- // Handle if an un-quoted value was used
- match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
-
- PSEUDO : function ( match, curLoop, inplace, result, not ) {
- if ( match[1] === "not" ) {
- // If we're dealing with a complex expression, or a simple one
- if ( ( chunker.exec( match[3] ) || "" ).length > 1 || /^\w/.test( match[3] ) ) {
- match[3] = Sizzle( match[3], null, null, curLoop );
-
- } else {
- var ret = Sizzle.filter( match[3], curLoop, inplace, true ^ not );
-
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
-
- return false;
- }
-
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
-
- return match;
- },
-
- POS : function ( match ) {
- match.unshift( true );
-
- return match;
- }
- },
-
- filters : {
- enabled : function ( elem ) {
- return elem.disabled === false && elem.type !== "hidden";
- },
-
- disabled : function ( elem ) {
- return elem.disabled === true;
- },
-
- checked : function ( elem ) {
- return elem.checked === true;
- },
-
- selected : function ( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- parent : function ( elem ) {
- return !!elem.firstChild;
- },
-
- empty : function ( elem ) {
- return !elem.firstChild;
- },
-
- has : function ( elem, i, match ) {
- return !!Sizzle( match[3], elem ).length;
- },
-
- header : function ( elem ) {
- return (/h\d/i).test( elem.nodeName );
- },
-
- text : function ( elem ) {
- var attr = elem.getAttribute( "type" ), type = elem.type;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
- },
-
- radio : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
- },
-
- checkbox : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
- },
-
- file : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
- },
-
- password : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
- },
-
- submit : function ( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "submit" === elem.type;
- },
-
- image : function ( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
- },
-
- reset : function ( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "reset" === elem.type;
- },
-
- button : function ( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && "button" === elem.type || name === "button";
- },
-
- input : function ( elem ) {
- return (/input|select|textarea|button/i).test( elem.nodeName );
- },
-
- focus : function ( elem ) {
- return elem === elem.ownerDocument.activeElement;
- }
- },
- setFilters : {
- first : function ( elem, i ) {
- return i === 0;
- },
-
- last : function ( elem, i, match, array ) {
- return i === array.length - 1;
- },
-
- even : function ( elem, i ) {
- return i % 2 === 0;
- },
-
- odd : function ( elem, i ) {
- return i % 2 === 1;
- },
-
- lt : function ( elem, i, match ) {
- return i < match[3] - 0;
- },
-
- gt : function ( elem, i, match ) {
- return i > match[3] - 0;
- },
-
- nth : function ( elem, i, match ) {
- return match[3] - 0 === i;
- },
-
- eq : function ( elem, i, match ) {
- return match[3] - 0 === i;
- }
- },
- filter : {
- PSEUDO : function ( elem, match, i, array ) {
- var name = match[1],
- filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
-
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || getText( [ elem ] ) || "").indexOf( match[3] ) >= 0;
-
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var j = 0, l = not.length; j < l; j++ ) {
- if ( not[j] === elem ) {
- return false;
- }
- }
-
- return true;
-
- } else {
- Sizzle.error( name );
- }
- },
-
- CHILD : function ( elem, match ) {
- var first, last,
- doneName, parent, cache,
- count, diff,
- type = match[1],
- node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- /* 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 );
- }
- }
- }
- };
-
- 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;
-
- var makeArray = function ( array, results ) {
- array = Array.prototype.slice.call( array, 0 );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
- };
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
- try {
- Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
- } catch ( e ) {
- makeArray = function ( array, results ) {
- var i = 0,
- ret = results || [];
-
- if ( toString.call( array ) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
-
- } else {
- if ( typeof array.length === "number" ) {
- for ( var l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
-
- } else {
- for ( ; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
- }
-
- var sortOrder, siblingCheck;
-
- if ( document.documentElement.compareDocumentPosition ) {
- sortOrder = function ( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
- return a.compareDocumentPosition ? -1 : 1;
- }
-
- return a.compareDocumentPosition( b ) & 4 ? -1 : 1;
- };
-
- } else {
- sortOrder = function ( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
- siblingCheck = function ( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
- };
- }
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
- (function () {
- // We're going to inject a fake input element with a specified name
- var form = document.createElement( "div" ),
- id = "script" + (new Date()).getTime(),
- root = document.documentElement;
-
- form.innerHTML = "";
-
- // Inject it into the root element, check its status, and remove it quickly
- root.insertBefore( form, root.firstChild );
-
- // The workaround has to do additional checks after a getElementById
- // Which slows things down for other browsers (hence the branching)
- if ( document.getElementById( id ) ) {
- Expr.find.ID = function ( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById( match[1] );
-
- return m ?
- m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode( "id" ).nodeValue === match[1] ?
- [m] :
- undefined :
- [];
- }
- };
-
- Expr.filter.ID = function ( elem, match ) {
- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode( "id" );
-
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
-
- // release memory in IE
- root = form = null;
- })();
-
- (function () {
- // Check to see if the browser returns only elements
- // when doing getElementsByTagName("*")
-
- // Create a fake element
- var div = document.createElement( "div" );
- div.appendChild( document.createComment( "" ) );
-
- // Make sure no comments are found
- if ( div.getElementsByTagName( "*" ).length > 0 ) {
- Expr.find.TAG = function ( match, context ) {
- var results = context.getElementsByTagName( match[1] );
-
- // Filter out possible comments
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-
- // Check to see if an attribute returns normalized href attributes
- div.innerHTML = "";
-
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute( "href" ) !== "#" ) {
-
- Expr.attrHandle.href = function ( elem ) {
- return elem.getAttribute( "href", 2 );
- };
- }
-
- // release memory in IE
- div = null;
- })();
-
- if ( document.querySelectorAll ) {
- (function () {
- var oldSizzle = Sizzle,
- div = document.createElement( "div" ),
- id = "__sizzle__";
-
- div.innerHTML = "";
-
- // Safari can't handle uppercase or unicode characters when
- // in quirks mode.
- if ( div.querySelectorAll && div.querySelectorAll( ".TEST" ).length === 0 ) {
- return;
- }
-
- Sizzle = function ( query, context, extra, seed ) {
- context = context || document;
-
- // Only use querySelectorAll on non-XML documents
- // (ID selectors don't work in non-HTML documents)
- if ( !seed && !Sizzle.isXML( context ) ) {
- // See if we find a selector to speed up
- var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-
- if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
- // Speed-up: Sizzle("TAG")
- if ( match[1] ) {
- return makeArray( context.getElementsByTagName( query ), extra );
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
- return makeArray( context.getElementsByClassName( match[2] ), extra );
- }
- }
-
- if ( context.nodeType === 9 ) {
- // Speed-up: Sizzle("body")
- // The body element only exists once, optimize finding it
- if ( query === "body" && context.body ) {
- return makeArray( [ context.body ], extra );
-
- // Speed-up: Sizzle("#ID")
- } else if ( match && match[3] ) {
- var elem = context.getElementById( match[3] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id === match[3] ) {
- return makeArray( [ elem ], extra );
- }
-
- } else {
- return makeArray( [], extra );
- }
- }
-
- try {
- return makeArray( context.querySelectorAll( query ), extra );
- } catch ( qsaError ) {
- }
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- var oldContext = context,
- old = context.getAttribute( "id" ),
- nid = old || id,
- hasParent = context.parentNode,
- relativeHierarchySelector = /^\s*[+~]/.test( query );
-
- if ( !old ) {
- context.setAttribute( "id", nid );
- } else {
- nid = nid.replace( /'/g, "\\$&" );
- }
- if ( relativeHierarchySelector && hasParent ) {
- context = context.parentNode;
- }
-
- try {
- if ( !relativeHierarchySelector || hasParent ) {
- return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
- }
-
- } catch ( pseudoError ) {
- } finally {
- if ( !old ) {
- oldContext.removeAttribute( "id" );
- }
- }
- }
- }
-
- return oldSizzle( query, context, extra, seed );
- };
-
- for ( var prop in oldSizzle ) {
- Sizzle[ prop ] = oldSizzle[ prop ];
- }
-
- // release memory in IE
- div = null;
- })();
- }
-
- (function () {
- var html = document.documentElement,
- matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
- if ( matches ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9 fails this)
- var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
- pseudoWorks = false;
-
- try {
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( document.documentElement, "[test!='']:sizzle" );
-
- } catch ( pseudoError ) {
- pseudoWorks = true;
- }
-
- Sizzle.matchesSelector = function ( node, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace( /\=\s*([^'"\]]*)\s*\]/g, "='$1']" );
-
- if ( !Sizzle.isXML( node ) ) {
- try {
- if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
- var ret = matches.call( node, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || !disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9, so check for that
- node.document && node.document.nodeType !== 11 ) {
- return ret;
- }
- }
- } catch ( e ) {
- }
- }
-
- return Sizzle( expr, null, null, [node] ).length > 0;
- };
- }
- })();
-
- (function () {
- var div = document.createElement( "div" );
-
- div.innerHTML = "";
-
- // Opera can't find a second classname (in 9.6)
- // Also, make sure that getElementsByClassName actually exists
- if ( !div.getElementsByClassName || div.getElementsByClassName( "e" ).length === 0 ) {
- return;
- }
-
- // Safari caches class attributes, doesn't catch changes (in 3.2)
- div.lastChild.className = "e";
-
- if ( div.getElementsByClassName( "e" ).length === 1 ) {
- return;
- }
-
- Expr.order.splice( 1, 0, "CLASS" );
- Expr.find.CLASS = function ( match, context, isXML ) {
- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
- return context.getElementsByClassName( match[1] );
- }
- };
-
- // release memory in IE
- div = null;
- })();
-
- function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem[ expando ] === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 && !isXML ) {
- elem[ expando ] = doneName;
- elem.sizset = i;
- }
-
- if ( elem.nodeName.toLowerCase() === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
- }
-
- function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem[ expando ] === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem[ expando ] = doneName;
- elem.sizset = i;
- }
-
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
- }
-
- if ( document.documentElement.contains ) {
- Sizzle.contains = function ( a, b ) {
- return a !== b && (a.contains ? a.contains( b ) : true);
- };
-
- } else if ( document.documentElement.compareDocumentPosition ) {
- Sizzle.contains = function ( a, b ) {
- return !!(a.compareDocumentPosition( b ) & 16);
- };
-
- } else {
- Sizzle.contains = function () {
- return false;
- };
- }
-
- Sizzle.isXML = function ( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
- return documentElement ? documentElement.nodeName !== "HTML" : false;
- };
-
- var posProcess = function ( selector, context, seed ) {
- var match,
- tmpSet = [],
- later = "",
- root = context.nodeType ? [context] : context;
-
- // Position selectors must be done after the filter
- // And so must :not(positional) so we move all PSEUDOs to the end
- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.PSEUDO, "" );
- }
-
- selector = Expr.relative[selector] ? selector + "*" : selector;
-
- for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet, seed );
- }
-
- return Sizzle.filter( later, tmpSet );
- };
-
-// EXPOSE
-// Override sizzle attribute retrieval
- Sizzle.attr = jQuery.attr;
- Sizzle.selectors.attrMap = {};
- jQuery.find = Sizzle;
- jQuery.expr = Sizzle.selectors;
- jQuery.expr[":"] = jQuery.expr.filters;
- jQuery.unique = Sizzle.uniqueSort;
- jQuery.text = Sizzle.getText;
- jQuery.isXMLDoc = Sizzle.isXML;
- jQuery.contains = Sizzle.contains;
-
-
- })();
-
-
- var runtil = /Until$/,
- rparentsprev = /^(?:parents|prevUntil|prevAll)/,
- // Note: This RegExp should be improved, or likely pulled from Sizzle
- rmultiselector = /,/,
- isSimple = /^.[^:#\[\.,]*$/,
- slice = Array.prototype.slice,
- POS = jQuery.expr.match.globalPOS,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children : true,
- contents : true,
- next : true,
- prev : true
- };
-
- jQuery.fn.extend( {
- find : function ( selector ) {
- var self = this,
- i, l;
-
- if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter( function () {
- for ( i = 0, l = self.length; i < l; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- } );
- }
-
- var ret = this.pushStack( "", "find", selector ),
- length, n, r;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice( n--, 1 );
- break;
- }
- }
- }
- }
- }
-
- return ret;
- },
-
- has : function ( target ) {
- var targets = jQuery( target );
- return this.filter( function () {
- for ( var i = 0, l = targets.length; i < l; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- } );
- },
-
- not : function ( selector ) {
- return this.pushStack( winnow( this, selector, false ), "not", selector );
- },
-
- filter : function ( selector ) {
- return this.pushStack( winnow( this, selector, true ), "filter", selector );
- },
-
- is : function ( selector ) {
- return !!selector && (
- typeof selector === "string" ?
- // If this is a positional selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- POS.test( selector ) ?
- jQuery( selector, this.context ).index( this[0] ) >= 0 :
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
- },
-
- closest : function ( selectors, context ) {
- var ret = [], i, l, cur = this[0];
-
- // Array (deprecated as of jQuery 1.7)
- if ( jQuery.isArray( selectors ) ) {
- var level = 1;
-
- while ( cur && cur.ownerDocument && cur !== context ) {
- for ( i = 0; i < selectors.length; i++ ) {
-
- if ( jQuery( cur ).is( selectors[ i ] ) ) {
- ret.push( { selector : selectors[ i ], elem : cur, level : level } );
- }
- }
-
- cur = cur.parentNode;
- level++;
- }
-
- return ret;
- }
-
- // String
- var pos = POS.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- cur = this[i];
-
- while ( cur ) {
- if ( pos ? pos.index( cur ) > -1 : jQuery.find.matchesSelector( cur, selectors ) ) {
- ret.push( cur );
- break;
-
- } else {
- cur = cur.parentNode;
- if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
- break;
- }
- }
- }
- }
-
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index : function ( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
- }
-
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[0], jQuery( elem ) );
- }
-
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add : function ( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
- },
-
- andSelf : function () {
- return this.add( this.prevObject );
- }
- } );
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
- function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
- }
-
- jQuery.each( {
- parent : function ( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents : function ( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil : function ( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next : function ( elem ) {
- return jQuery.nth( elem, 2, "nextSibling" );
- },
- prev : function ( elem ) {
- return jQuery.nth( elem, 2, "previousSibling" );
- },
- nextAll : function ( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll : function ( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil : function ( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil : function ( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings : function ( elem ) {
- return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
- },
- children : function ( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents : function ( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.makeArray( elem.childNodes );
- }
- }, function ( name, fn ) {
- jQuery.fn[ name ] = function ( until, selector ) {
- var ret = jQuery.map( this, fn, until );
-
- if ( !runtil.test( name ) ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
- if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
-
- return this.pushStack( ret, name, slice.call( arguments ).join( "," ) );
- };
- } );
-
- jQuery.extend( {
- filter : function ( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 ?
- jQuery.find.matchesSelector( elems[0], expr ) ? [ elems[0] ] : [] :
- jQuery.find.matches( expr, elems );
- },
-
- dir : function ( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- nth : function ( cur, result, dir, elem ) {
- result = result || 1;
- var num = 0;
-
- for ( ; cur; cur = cur[dir] ) {
- if ( cur.nodeType === 1 && ++num === result ) {
- break;
- }
- }
-
- return cur;
- },
-
- sibling : function ( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
- } );
-
-// Implement the identical functionality for filter and not
- function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep( elements, function ( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
- } );
-
- } else if ( qualifier.nodeType ) {
- return jQuery.grep( elements, function ( elem, i ) {
- return ( elem === qualifier ) === keep;
- } );
-
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep( elements, function ( elem ) {
- return elem.nodeType === 1;
- } );
-
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter( qualifier, filtered, !keep );
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
- }
- }
-
- return jQuery.grep( elements, function ( elem, i ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
- } );
- }
-
-
- function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
- }
-
- var nodeNames = "abbr|article|aside|audio|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, "