upjs-rails 0.7.8 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/dist/up.js +198 -33
- data/dist/up.min.js +2 -2
- data/lib/assets/javascripts/up/bus.js.coffee +24 -6
- data/lib/assets/javascripts/up/flow.js.coffee +1 -0
- data/lib/assets/javascripts/up/proxy.js.coffee +152 -28
- data/lib/assets/javascripts/up/util.js.coffee +7 -0
- data/lib/upjs/rails/version.rb +1 -1
- data/spec_app/Gemfile.lock +1 -1
- data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +140 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72b273956002a422a8bad50da6af92fcb218590a
|
4
|
+
data.tar.gz: 22e16af9e0e7bc146ad50760233948b0d5a6bed2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a96eb49d26da0fc7fdcdd91f13ea4c7ba84ef6cb0881457ec741c3162bd4596045bef046ffb876b43a8495ad9616de0abab307c8a6dcdf373674c91703f6b3e7
|
7
|
+
data.tar.gz: e0aacbd0455d1f1095b4b2f6ffbb2fd6449257a368f182ad26d9347af7ec28879f61b399f03efade3fb259223c5581fea5ec8f5a54590839d3fec2edc88c2b19
|
data/dist/up.js
CHANGED
@@ -25,7 +25,7 @@ If you use them in your own code, you will get hurt.
|
|
25
25
|
var slice = [].slice;
|
26
26
|
|
27
27
|
up.util = (function() {
|
28
|
-
var $createElementFromSelector, ANIMATION_PROMISE_KEY, CONSOLE_PLACEHOLDERS, ajax, castsToFalse, castsToTrue, clientSize, compact, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, debug, detect, each, error, escapePressed, extend, findWithSelf, finishCssAnimate, forceCompositing, get, ifGiven, isArray, isBlank, isDeferred, isDefined, isElement, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, keys, last, locationFromXhr, measure, merge, methodFromXhr, nextFrame, normalizeMethod, normalizeUrl, nullJquery, only, option, options, prependGhost, presence, presentAttr, resolvableWhen, resolvedDeferred, resolvedPromise, select, setMissingAttrs, stringifyConsoleArgs, temporaryCss, times, toArray, trim, unwrap, warn;
|
28
|
+
var $createElementFromSelector, ANIMATION_PROMISE_KEY, CONSOLE_PLACEHOLDERS, ajax, castsToFalse, castsToTrue, clientSize, compact, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, debug, detect, each, error, escapePressed, extend, findWithSelf, finishCssAnimate, forceCompositing, get, ifGiven, isArray, isBlank, isDeferred, isDefined, isElement, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, keys, last, locationFromXhr, measure, merge, methodFromXhr, nextFrame, normalizeMethod, normalizeUrl, nullJquery, only, option, options, prependGhost, presence, presentAttr, remove, resolvableWhen, resolvedDeferred, resolvedPromise, select, setMissingAttrs, stringifyConsoleArgs, temporaryCss, times, toArray, trim, unwrap, warn;
|
29
29
|
get = function(url, options) {
|
30
30
|
options = options || {};
|
31
31
|
options.url = url;
|
@@ -709,6 +709,14 @@ If you use them in your own code, you will get hurt.
|
|
709
709
|
}
|
710
710
|
return results;
|
711
711
|
};
|
712
|
+
remove = function(array, element) {
|
713
|
+
var index;
|
714
|
+
index = array.indexOf(element);
|
715
|
+
if (index >= 0) {
|
716
|
+
array.splice(index, 1);
|
717
|
+
return element;
|
718
|
+
}
|
719
|
+
};
|
712
720
|
return {
|
713
721
|
presentAttr: presentAttr,
|
714
722
|
createElement: createElement,
|
@@ -778,7 +786,8 @@ If you use them in your own code, you will get hurt.
|
|
778
786
|
resolvedPromise: resolvedPromise,
|
779
787
|
resolvedDeferred: resolvedDeferred,
|
780
788
|
resolvableWhen: resolvableWhen,
|
781
|
-
setMissingAttrs: setMissingAttrs
|
789
|
+
setMissingAttrs: setMissingAttrs,
|
790
|
+
remove: remove
|
782
791
|
};
|
783
792
|
})();
|
784
793
|
|
@@ -932,8 +941,8 @@ We need to work on this page:
|
|
932
941
|
|
933
942
|
- Decide whether to refactor this into document events
|
934
943
|
- Decide whether `fragment:enter` and `fragment:leave` would be better names
|
944
|
+
- Decide if we wouldn't rather document events in the respective module (e.g. proxy).
|
935
945
|
|
936
|
-
|
937
946
|
@class up.bus
|
938
947
|
*/
|
939
948
|
|
@@ -941,7 +950,7 @@ We need to work on this page:
|
|
941
950
|
var slice = [].slice;
|
942
951
|
|
943
952
|
up.bus = (function() {
|
944
|
-
var callbacksByEvent, callbacksFor, defaultCallbacksByEvent, emit, listen, reset, snapshot, u;
|
953
|
+
var callbacksByEvent, callbacksFor, defaultCallbacksByEvent, emit, listen, reset, snapshot, stopListen, u;
|
945
954
|
u = up.util;
|
946
955
|
callbacksByEvent = {};
|
947
956
|
defaultCallbacksByEvent = {};
|
@@ -983,13 +992,43 @@ We need to work on this page:
|
|
983
992
|
event is triggered.
|
984
993
|
|
985
994
|
@method up.bus.on
|
986
|
-
@param {String}
|
987
|
-
|
995
|
+
@param {String} eventNames
|
996
|
+
A space-separated list of event names to match.
|
988
997
|
@param {Function} handler
|
989
998
|
The event handler to be called with the event arguments.
|
999
|
+
@return {Function}
|
1000
|
+
A function that unregisters the given handlers
|
1001
|
+
*/
|
1002
|
+
listen = function(eventNames, handler) {
|
1003
|
+
var eventName, i, len, ref;
|
1004
|
+
ref = eventNames.split(' ');
|
1005
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
1006
|
+
eventName = ref[i];
|
1007
|
+
callbacksFor(eventName).push(handler);
|
1008
|
+
}
|
1009
|
+
return function() {
|
1010
|
+
return stopListen(eventNames, handler);
|
1011
|
+
};
|
1012
|
+
};
|
1013
|
+
|
1014
|
+
/**
|
1015
|
+
Unregisters the given handler from the given events.
|
1016
|
+
|
1017
|
+
@method up.bus.off
|
1018
|
+
@param {String} eventNames
|
1019
|
+
A space-separated list of event names .
|
1020
|
+
@param {Function} handler
|
1021
|
+
The event handler that should stop listening.
|
990
1022
|
*/
|
991
|
-
|
992
|
-
|
1023
|
+
stopListen = function(eventNames, handler) {
|
1024
|
+
var eventName, i, len, ref, results;
|
1025
|
+
ref = eventNames.split(' ');
|
1026
|
+
results = [];
|
1027
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
1028
|
+
eventName = ref[i];
|
1029
|
+
results.push(u.remove(callbacksFor(eventName), handler));
|
1030
|
+
}
|
1031
|
+
return results;
|
993
1032
|
};
|
994
1033
|
|
995
1034
|
/**
|
@@ -1028,6 +1067,7 @@ We need to work on this page:
|
|
1028
1067
|
listen('framework:reset', reset);
|
1029
1068
|
return {
|
1030
1069
|
on: listen,
|
1070
|
+
off: stopListen,
|
1031
1071
|
emit: emit
|
1032
1072
|
};
|
1033
1073
|
})();
|
@@ -1244,7 +1284,8 @@ We need to work on this page:
|
|
1244
1284
|
url: url,
|
1245
1285
|
method: options.method,
|
1246
1286
|
selector: selector,
|
1247
|
-
cache: options.cache
|
1287
|
+
cache: options.cache,
|
1288
|
+
preload: options.preload
|
1248
1289
|
};
|
1249
1290
|
promise = up.proxy.ajax(request);
|
1250
1291
|
promise.done(function(html, textStatus, xhr) {
|
@@ -2621,7 +2662,7 @@ Caching and preloading
|
|
2621
2662
|
|
2622
2663
|
All HTTP requests go through the Up.js proxy.
|
2623
2664
|
It caches a [limited](/up.proxy#up.proxy.defaults) number of server responses
|
2624
|
-
|
2665
|
+
for a [limited](/up.proxy#up.proxy.defaults) amount of time,
|
2625
2666
|
making requests to these URLs return insantly.
|
2626
2667
|
|
2627
2668
|
The cache is cleared whenever the user makes a non-`GET` request
|
@@ -2630,19 +2671,78 @@ The cache is cleared whenever the user makes a non-`GET` request
|
|
2630
2671
|
The proxy can also used to speed up reaction times by preloading
|
2631
2672
|
links when the user hovers over the click area (or puts the mouse/finger
|
2632
2673
|
down before releasing). This way the
|
2633
|
-
response will already be cached when the user performs the click.
|
2674
|
+
response will already be cached when the user performs the click.
|
2675
|
+
|
2676
|
+
Spinners
|
2677
|
+
---------
|
2678
|
+
|
2679
|
+
You can listen to [framework events](/up.bus) to implement a spinner
|
2680
|
+
(progress indicator) that appears during a long-running request,
|
2681
|
+
and disappears once the response has been received:
|
2682
|
+
|
2683
|
+
<div class="spinner">Please wait!</div>
|
2684
|
+
|
2685
|
+
Here is the Javascript to make it alive:
|
2686
|
+
|
2687
|
+
up.compiler('.spinner', function($element) {
|
2688
|
+
|
2689
|
+
show = function() { $element.show() };
|
2690
|
+
hide = function() { $element.hide() };
|
2691
|
+
|
2692
|
+
up.bus.on('proxy:busy', show);
|
2693
|
+
up.bus.on('proxy:idle', hide);
|
2694
|
+
|
2695
|
+
return function() {
|
2696
|
+
up.bus.off('proxy:busy', show);
|
2697
|
+
up.bus.off('proxy:idle', hide);
|
2698
|
+
};
|
2699
|
+
|
2700
|
+
});
|
2701
|
+
|
2702
|
+
The `proxy:busy` event will be emitted after a delay of 300 ms
|
2703
|
+
to prevent the spinner from flickering on and off.
|
2704
|
+
You can change (or remove) this delay like this:
|
2705
|
+
|
2706
|
+
up.proxy.defaults({ busyDelay: 150 });
|
2634
2707
|
|
2635
2708
|
@class up.proxy
|
2636
2709
|
*/
|
2637
2710
|
|
2638
2711
|
(function() {
|
2639
2712
|
up.proxy = (function() {
|
2640
|
-
var $waitingLink, SAFE_HTTP_METHODS, ajax, alias, cache, cacheKey,
|
2641
|
-
|
2713
|
+
var $waitingLink, FACTORY_CONFIG, SAFE_HTTP_METHODS, ajax, alias, busy, busyDelayTimer, busyEventEmitted, cache, cacheKey, cancelBusyDelay, cancelPreloadDelay, checkPreload, clear, config, defaults, get, idle, isFresh, isIdempotent, load, loadEnded, loadStarted, normalizeRequest, pendingCount, preload, preloadDelayTimer, remove, reset, set, startPreloadDelay, timestamp, trim, u;
|
2714
|
+
u = up.util;
|
2715
|
+
cache = void 0;
|
2716
|
+
$waitingLink = void 0;
|
2717
|
+
preloadDelayTimer = void 0;
|
2718
|
+
busyDelayTimer = void 0;
|
2719
|
+
pendingCount = void 0;
|
2720
|
+
config = void 0;
|
2721
|
+
busyEventEmitted = void 0;
|
2722
|
+
FACTORY_CONFIG = {
|
2723
|
+
busyDelay: 300,
|
2642
2724
|
preloadDelay: 75,
|
2643
2725
|
cacheSize: 70,
|
2644
2726
|
cacheExpiry: 1000 * 60 * 5
|
2645
2727
|
};
|
2728
|
+
cancelPreloadDelay = function() {
|
2729
|
+
clearTimeout(preloadDelayTimer);
|
2730
|
+
return preloadDelayTimer = null;
|
2731
|
+
};
|
2732
|
+
cancelBusyDelay = function() {
|
2733
|
+
clearTimeout(busyDelayTimer);
|
2734
|
+
return busyDelayTimer = null;
|
2735
|
+
};
|
2736
|
+
reset = function() {
|
2737
|
+
cache = {};
|
2738
|
+
$waitingLink = null;
|
2739
|
+
cancelPreloadDelay();
|
2740
|
+
cancelBusyDelay();
|
2741
|
+
pendingCount = 0;
|
2742
|
+
config = u.copy(FACTORY_CONFIG);
|
2743
|
+
return busyEventEmitted = false;
|
2744
|
+
};
|
2745
|
+
reset();
|
2646
2746
|
|
2647
2747
|
/**
|
2648
2748
|
@method up.proxy.defaults
|
@@ -2655,14 +2755,13 @@ response will already be cached when the user performs the click.
|
|
2655
2755
|
@param {Number} [options.cacheExpiry=300000]
|
2656
2756
|
The number of milliseconds until a cache entry expires.
|
2657
2757
|
Defaults to 5 minutes.
|
2758
|
+
@param {Number} [options.busyDelay=300]
|
2759
|
+
How long the proxy waits until emitting the `proxy:busy` [event](/up.bus).
|
2760
|
+
Use this to prevent flickering of spinners.
|
2658
2761
|
*/
|
2659
2762
|
defaults = function(options) {
|
2660
2763
|
return u.extend(config, options);
|
2661
2764
|
};
|
2662
|
-
cache = {};
|
2663
|
-
u = up.util;
|
2664
|
-
$waitingLink = null;
|
2665
|
-
delayTimer = null;
|
2666
2765
|
cacheKey = function(request) {
|
2667
2766
|
normalizeRequest(request);
|
2668
2767
|
return [request.url, request.method, request.data, request.selector].join('|');
|
@@ -2718,6 +2817,11 @@ response will already be cached when the user performs the click.
|
|
2718
2817
|
Only requests with a method of `GET`, `OPTIONS` and `HEAD`
|
2719
2818
|
are considered to be read-only.
|
2720
2819
|
|
2820
|
+
If a network connection is attempted, the proxy will emit
|
2821
|
+
a `proxy:load` event with the `request` as its argument.
|
2822
|
+
Once the response is received, a `proxy:receive` event will
|
2823
|
+
be emitted.
|
2824
|
+
|
2721
2825
|
@method up.proxy.ajax
|
2722
2826
|
@param {String} request.url
|
2723
2827
|
@param {String} [request.method='GET']
|
@@ -2727,22 +2831,89 @@ response will already be cached when the user performs the click.
|
|
2727
2831
|
If set to `false` a network connection will always be attempted.
|
2728
2832
|
*/
|
2729
2833
|
ajax = function(options) {
|
2730
|
-
var forceCache, ignoreCache, promise, request;
|
2834
|
+
var forceCache, ignoreCache, pending, promise, request;
|
2731
2835
|
forceCache = u.castsToTrue(options.cache);
|
2732
2836
|
ignoreCache = u.castsToFalse(options.cache);
|
2733
2837
|
request = u.only(options, 'url', 'method', 'data', 'selector', '_normalized');
|
2838
|
+
pending = true;
|
2734
2839
|
if (!isIdempotent(request) && !forceCache) {
|
2735
2840
|
clear();
|
2736
|
-
promise =
|
2841
|
+
promise = load(request);
|
2737
2842
|
} else if ((promise = get(request)) && !ignoreCache) {
|
2738
|
-
promise;
|
2843
|
+
pending = promise.state() === 'pending';
|
2739
2844
|
} else {
|
2740
|
-
promise =
|
2845
|
+
promise = load(request);
|
2741
2846
|
set(request, promise);
|
2742
2847
|
}
|
2848
|
+
if (pending && !options.preload) {
|
2849
|
+
loadStarted();
|
2850
|
+
promise.then(loadEnded);
|
2851
|
+
}
|
2743
2852
|
return promise;
|
2744
2853
|
};
|
2745
2854
|
SAFE_HTTP_METHODS = ['GET', 'OPTIONS', 'HEAD'];
|
2855
|
+
|
2856
|
+
/**
|
2857
|
+
Returns `true` if the proxy is not currently waiting
|
2858
|
+
for a request to finish. Returns `false` otherwise.
|
2859
|
+
|
2860
|
+
The proxy will also emit an `proxy:idle` [event](/up.bus) if it
|
2861
|
+
used to busy, but is now idle.
|
2862
|
+
|
2863
|
+
@method up.proxy.idle
|
2864
|
+
@return {Boolean} Whether the proxy is idle
|
2865
|
+
*/
|
2866
|
+
idle = function() {
|
2867
|
+
return pendingCount === 0;
|
2868
|
+
};
|
2869
|
+
|
2870
|
+
/**
|
2871
|
+
Returns `true` if the proxy is currently waiting
|
2872
|
+
for a request to finish. Returns `false` otherwise.
|
2873
|
+
|
2874
|
+
The proxy will also emit an `proxy:busy` [event](/up.bus) if it
|
2875
|
+
used to idle, but is now busy.
|
2876
|
+
|
2877
|
+
@method up.proxy.busy
|
2878
|
+
@return {Boolean} Whether the proxy is busy
|
2879
|
+
*/
|
2880
|
+
busy = function() {
|
2881
|
+
return pendingCount > 0;
|
2882
|
+
};
|
2883
|
+
loadStarted = function() {
|
2884
|
+
var emission, wasIdle;
|
2885
|
+
wasIdle = idle();
|
2886
|
+
pendingCount += 1;
|
2887
|
+
if (wasIdle) {
|
2888
|
+
emission = function() {
|
2889
|
+
if (busy()) {
|
2890
|
+
up.bus.emit('proxy:busy');
|
2891
|
+
return busyEventEmitted = true;
|
2892
|
+
}
|
2893
|
+
};
|
2894
|
+
if (config.busyDelay > 0) {
|
2895
|
+
return busyDelayTimer = setTimeout(emission, config.busyDelay);
|
2896
|
+
} else {
|
2897
|
+
return emission();
|
2898
|
+
}
|
2899
|
+
}
|
2900
|
+
};
|
2901
|
+
loadEnded = function() {
|
2902
|
+
pendingCount -= 1;
|
2903
|
+
if (idle() && busyEventEmitted) {
|
2904
|
+
up.bus.emit('proxy:idle');
|
2905
|
+
return busyEventEmitted = false;
|
2906
|
+
}
|
2907
|
+
};
|
2908
|
+
load = function(request) {
|
2909
|
+
var promise;
|
2910
|
+
up.bus.emit('proxy:load', request);
|
2911
|
+
promise = u.ajax(request);
|
2912
|
+
promise.then(function() {
|
2913
|
+
return up.bus.emit('proxy:receive', request);
|
2914
|
+
});
|
2915
|
+
return promise;
|
2916
|
+
};
|
2746
2917
|
isIdempotent = function(request) {
|
2747
2918
|
normalizeRequest(request);
|
2748
2919
|
return u.contains(SAFE_HTTP_METHODS, request.method);
|
@@ -2810,19 +2981,15 @@ response will already be cached when the user performs the click.
|
|
2810
2981
|
delay = parseInt(u.presentAttr($link, 'up-delay')) || config.preloadDelay;
|
2811
2982
|
if (!$link.is($waitingLink)) {
|
2812
2983
|
$waitingLink = $link;
|
2813
|
-
|
2984
|
+
cancelPreloadDelay();
|
2814
2985
|
curriedPreload = function() {
|
2815
2986
|
return preload($link);
|
2816
2987
|
};
|
2817
|
-
return
|
2988
|
+
return startPreloadDelay(curriedPreload, delay);
|
2818
2989
|
}
|
2819
2990
|
};
|
2820
|
-
|
2821
|
-
return
|
2822
|
-
};
|
2823
|
-
cancelDelay = function() {
|
2824
|
-
clearTimeout(delayTimer);
|
2825
|
-
return delayTimer = null;
|
2991
|
+
startPreloadDelay = function(block, delay) {
|
2992
|
+
return preloadDelayTimer = setTimeout(block, delay);
|
2826
2993
|
};
|
2827
2994
|
|
2828
2995
|
/**
|
@@ -2847,10 +3014,6 @@ response will already be cached when the user performs the click.
|
|
2847
3014
|
return u.resolvedPromise();
|
2848
3015
|
}
|
2849
3016
|
};
|
2850
|
-
reset = function() {
|
2851
|
-
cancelDelay();
|
2852
|
-
return cache = {};
|
2853
|
-
};
|
2854
3017
|
up.bus.on('framework:reset', reset);
|
2855
3018
|
|
2856
3019
|
/**
|
@@ -2880,6 +3043,8 @@ response will already be cached when the user performs the click.
|
|
2880
3043
|
alias: alias,
|
2881
3044
|
clear: clear,
|
2882
3045
|
remove: remove,
|
3046
|
+
idle: idle,
|
3047
|
+
busy: busy,
|
2883
3048
|
defaults: defaults
|
2884
3049
|
};
|
2885
3050
|
})();
|
data/dist/up.min.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
(function(){window.up={}}).call(this),function(){var t=[].slice;up.util=function(){var n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g,y,b,w,k,C,x,T,E,S,P,A,D,U,F,M,O,j,z,L,I,N,H,W,q,G,X,J,R,K,V,B,_,Q,Z,Y,tn,nn,en,rn,on,un,an,sn,ln,cn,pn,fn,dn,mn,hn,vn,gn,yn,bn,wn,kn;return E=function(t,n){return n=n||{},n.url=t,o(n)},o=function(t){return t.selector&&(t.headers={"X-Up-Selector":t.selector}),$.ajax(t)},q=function(t,n){return(""===n||"80"===n)&&"http:"===t||"443"===n&&"https:"===t},nn=function(t,n){var e,r,o;return e=null,G(t)?(e=$("<a>").attr({href:t}).get(0),A(e.hostname)&&(e.href=e.href)):e=wn(t),r=e.protocol+"//"+e.hostname,q(e.protocol,e.port)||(r+=":"+e.port),o=e.pathname,"/"!==o[0]&&(o="/"+o),(null!=n?n.stripTrailingSlash:void 0)===!0&&(o=o.replace(/\/$/,"")),r+=o,(null!=n?n.hash:void 0)===!0&&(r+=e.hash),(null!=n?n.search:void 0)!==!1&&(r+=e.search),r},tn=function(t){return t?t.toUpperCase():"GET"},n=function(t){var n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v;for(h=t.split(/[ >]/),r=null,c=p=0,d=h.length;d>p;c=++p){for(i=h[c],u=i.match(/(^|\.|\#)[A-Za-z0-9\-_]+/g),v="div",o=[],l=null,f=0,m=u.length;m>f;f++)switch(a=u[f],a[0]){case".":o.push(a.substr(1));break;case"#":l=a.substr(1);break;default:v=a}s="<"+v,o.length&&(s+=' class="'+o.join(" ")+'"'),l&&(s+=' id="'+l+'"'),s+=">",n=$(s),e&&n.appendTo(e),0===c&&(r=n),e=n}return r},f=function(t,n){var e;return e=document.createElement(t),H(n)&&(e.innerHTML=n),e},v=function(){var n,e;return e=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],e="[UP] "+e,console.debug.apply(console,[e].concat(t.call(n)))},kn=function(){var n,e;return e=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],e="[UP] "+e,console.warn.apply(console,[e].concat(t.call(n)))},b=function(){var n,e,r;throw e=1<=arguments.length?t.call(arguments,0):[],e[0]="[UP] "+e[0],console.error.apply(console,e),r=hn(e),n=sn($(".up-error"))||$('<div class="up-error"></div>').prependTo("body"),n.addClass("up-error"),n.text(r),new Error(r)},r=/\%[odisf]/g,hn=function(t){var n,e,o;return o=t[0],n=0,e=30,o.replace(r,function(){var r,o;return n+=1,r=t[n],o=typeof r,"string"===o?(r=r.replace(/\s+/g," "),r.length>e&&(r=r.substr(0,e)+"\u2026"),'"'+r+'"'):"number"===o?r.toString():"("+o+")"})},m=function(t){var n,e,r,o,u,i,a;for(v("Creating selector from element %o",t),e=(n=t.attr("class"))?n.split(" "):[],r=t.attr("id"),a=t.prop("tagName").toLowerCase(),r&&(a+="#"+r),o=0,i=e.length;i>o;o++)u=e[o],a+="."+u;return a},d=function(t){var n,e,r,o,u,i,a,s,l,c,p,d;return l=function(t){return"<"+t+"(?: [^>]*)?>"},i=function(t){return"</"+t+">"},n="(?:.|\\n)*?",u=function(t){return"("+t+")"},d=new RegExp(l("head")+n+l("title")+u(n)+i("title")+n+i("body"),"i"),o=new RegExp(l("body")+u(n)+i("body"),"i"),(r=t.match(o))?(s=document.createElement("html"),e=f("body",r[1]),s.appendChild(e),(p=t.match(d))&&(a=f("head"),s.appendChild(a),c=f("title",p[1]),a.appendChild(c)),s):f("div",t)},k=$.extend,bn=$.trim,K=Object.keys||function(t){var n,e,r,o;for(o=[],n=0,r=t.length;r>n;n++)e=t[n],t.hasOwnProperty(e)&&o.push(e);return o},y=function(t,n){var e,r,o,u,i;for(i=[],e=o=0,u=t.length;u>o;e=++o)r=t[e],i.push(n(r,e));return i},gn=function(t,n){var e,r,o,u;for(u=[],e=r=0,o=t-1;o>=0?o>=r:r>=o;e=o>=0?++r:--r)u.push(n(e));return u},I=function(t){return null===t},X=function(t){return void 0===t},U=function(t){return!X(t)},L=function(t){return X(t)||I(t)},O=function(t){return!L(t)},A=function(t){return L(t)||N(t)&&0===K(t).length||0===t.length},sn=function(t,n){return null==n&&(n=H),n(t)?t:null},H=function(t){return!A(t)},M=function(t){return"function"==typeof t},G=function(t){return"string"==typeof t},j=function(t){return"object"==typeof t&&!!t},N=function(t){return j(t)||"function"==typeof t},F=function(t){return!(!t||1!==t.nodeType)},z=function(t){return t instanceof jQuery},W=function(t){return N(t)&&M(t.then)},D=function(t){return W(t)&&M(t.resolve)},S=function(t){return O(t)?t:void 0},P=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},yn=function(t){return Array.prototype.slice.call(t)},c=function(t){return P(t)?t.slice():k({},t)},wn=function(t){return z(t)?t.get(0):t},Q=function(t,n){return k(c(t),n)},un=function(t,n){var e,r,o,u;if(o=t?c(t):{},n)for(r in n)e=n[r],u=o[r],O(u)?N(e)&&N(u)&&(o[r]=un(u,e)):o[r]=e;return o},on=function(){var n,e,r,o,u,i;for(e=1<=arguments.length?t.call(arguments,0):[],u=null,r=0,o=e.length;o>r;r++)if(n=e[r],i=n,M(i)&&(i=i()),O(i)){u=i;break}return u},g=function(t,n){var e,r,o,u;for(u=null,r=0,o=t.length;o>r;r++)if(e=t[r],n(e)){u=e;break}return u},s=function(t){return dn(t,O)},dn=function(t,n){var e;return e=[],y(t,function(t){return n(t)?e.push(t):void 0}),e},ln=function(){var n,e,r,o;return n=arguments[0],r=2<=arguments.length?t.call(arguments,1):[],o=function(){var t,o,u;for(u=[],t=0,o=r.length;o>t;t++)e=r[t],u.push(n.attr(e));return u}(),g(o,H)},Y=function(t){return setTimeout(t,0)},V=function(t){return t[t.length-1]},a=function(){var t;return t=document.documentElement,{width:t.clientWidth,height:t.clientHeight}},vn=function(t,n,e){var r,o;return o=t.css(K(n)),t.css(n),r=function(){return t.css(o)},e?(e(),r()):r},T=function(t){var n,e;return e=t.css(["transform","-webkit-transform"]),A(e)?(n=function(){return t.css(e)},t.css({transform:"translateZ(0)","-webkit-transform":"translateZ(0)"})):n=function(){},n},h=function(t,n,r){var o,u,i,a,s,l;return o=$(t),up.browser.canCssAnimation()?(r=un(r,{duration:300,delay:0,easing:"ease"}),u=$.Deferred(),a={"transition-property":K(n).join(", "),"transition-duration":r.duration+"ms","transition-delay":r.delay+"ms","transition-timing-function":r.easing},s=T(o),l=vn(o,a),o.css(n),u.then(s),u.then(l),o.data(e,u),u.then(function(){return o.removeData(e)}),i=setTimeout(function(){return u.resolve()},r.duration+r.delay),u.then(function(){return clearTimeout(i)}),u):(o.css(n),fn())},e="up-animation-promise",x=function(t){return $(t).each(function(){var t;return(t=$(this).data(e))?t.resolve():void 0})},_=function(t,n){var e,r,o;return r=(null!=n?n.relative:void 0)?t.position():t.offset(),e={left:r.left,top:r.top},(null!=n?n.inner:void 0)?(e.width=t.width(),e.height=t.height()):(e.width=t.outerWidth(),e.height=t.outerHeight()),(null!=n?n.full:void 0)&&(o=a(),e.right=o.width-(e.left+e.width),e.bottom=o.height-(e.top+e.height)),e},p=function(t,n){var e,r,o,u,i;for(u=t.get(0).attributes,i=[],r=0,o=u.length;o>r;r++)e=u[r],i.push(e.specified?n.attr(e.name,e.value):void 0);return i},an=function(t){var n,e;return e=_(t,{relative:!0,inner:!0}),n=t.clone(),n.find("script").remove(),n.css({right:"",bottom:"",position:"absolute"}),n.css(e),n.addClass("up-ghost"),n.insertBefore(t)},C=function(t,n){return t.find(n).addBack(n)},w=function(t){return 27===t.keyCode},l=function(t,n){return t.indexOf(n)>=0},i=function(t){return"true"===String(t)},u=function(t){return"false"===String(t)},B=function(t){return t.getResponseHeader("X-Up-Location")},Z=function(t){return t.getResponseHeader("X-Up-Method")},rn=function(){var n,e,r,o,u,i;for(i=arguments[0],o=2<=arguments.length?t.call(arguments,1):[],n={},e=0,u=o.length;u>e;e++)r=o[e],i.hasOwnProperty(r)&&(n[r]=i[r]);return n},J=function(t){return!(t.metaKey||t.shiftKey||t.ctrlKey)},R=function(t){var n;return n=X(t.button)||0===t.button,n&&J(t)},pn=function(){var t;return t=$.Deferred(),t.resolve(),t},fn=function(){return pn().promise()},en=function(){return{is:function(){return!1},attr:function(){},find:function(){return[]}}},cn=function(){var n,e;return n=1<=arguments.length?t.call(arguments,0):[],e=$.when.apply($,n),e.resolve=function(){return y(n,function(t){return"function"==typeof t.resolve?t.resolve():void 0})},e},mn=function(t,n){var e,r,o;r=[];for(e in n)o=n[e],r.push(L(t.attr(e))?t.attr(e,o):void 0);return r},{presentAttr:ln,createElement:f,normalizeUrl:nn,normalizeMethod:tn,createElementFromHtml:d,$createElementFromSelector:n,createSelectorFromElement:m,get:E,ajax:o,extend:k,copy:c,merge:Q,options:un,option:on,error:b,debug:v,warn:kn,each:y,times:gn,detect:g,select:dn,compact:s,last:V,isNull:I,isDefined:U,isUndefined:X,isGiven:O,isMissing:L,isPresent:H,isBlank:A,presence:sn,isObject:N,isFunction:M,isString:G,isElement:F,isJQuery:z,isPromise:W,isDeferred:D,isHash:j,ifGiven:S,isUnmodifiedKeyEvent:J,isUnmodifiedMouseEvent:R,nullJquery:en,unwrap:wn,nextFrame:Y,measure:_,temporaryCss:vn,cssAnimate:h,finishCssAnimate:x,forceCompositing:T,prependGhost:an,escapePressed:w,copyAttributes:p,findWithSelf:C,contains:l,isArray:P,toArray:yn,castsToTrue:i,castsToFalse:u,locationFromXhr:B,methodFromXhr:Z,clientSize:a,only:rn,trim:bn,keys:K,resolvedPromise:fn,resolvedDeferred:pn,resolvableWhen:cn,setMissingAttrs:mn}}()}.call(this),function(){var t=[].slice;up.browser=function(){var n,e,r,o,u,i,a,s,l,c;return l=up.util,a=function(t,n){var e,r,o,u,i,a;return null==n&&(n={}),i=l.option(n.method,"get").toLowerCase(),"get"===i?location.href=t:$.rails?(a=n.target,o=$.rails.csrfToken(),r=$.rails.csrfParam(),e=$("<form method='post' action='"+t+"'></form>"),u="<input name='_method' value='"+i+"' type='hidden' />",l.isDefined(r)&&l.isDefined(o)&&(u+="<input name='"+r+"' value='"+o+"' type='hidden' />"),a&&e.attr("target",a),e.hide().append(u).appendTo("body"),e.submit()):error("Can't fake a "+i.toUpperCase()+" request without Rails UJS")},c=function(){return location.href},o=function(){var t,n,e,r,o,u,i,a,s;return window.console||(window.console={}),s=function(){},(t=window.console).log||(t.log=s),(n=window.console).info||(n.info=s),(e=window.console).error||(e.error=s),(r=window.console).debug||(r.debug=s),(o=window.console).warn||(o.warn=s),(u=window.console).group||(u.group=s),(i=window.console).groupCollapsed||(i.groupCollapsed=s),(a=window.console).groupEnd||(a.groupEnd=s)},s=function(n){var e,r;return e=void 0,r=!1,function(){var o;return o=1<=arguments.length?t.call(arguments,0):[],r?e:(r=!0,e=n.apply(null,o))}},r=s(function(){return l.isDefined(history.pushState)}),n=s(function(){return"transition"in document.documentElement.style}),e=s(function(){return"oninput"in document.createElement("input")}),u=function(){var t,n,e,r,o;return o=$.fn.jquery,r=o.split("."),n=parseInt(r[0]),e=parseInt(r[1]),t=n>=2||1===n&&e>=9,t||l.error("jQuery %o found, but Up.js requires 1.9+",o)},i=s(function(){return l.isDefined(document.addEventListener)}),{url:c,ensureConsoleExists:o,loadPage:a,canPushState:r,canCssAnimation:n,canInputEvent:e,isSupported:i,ensureRecentJquery:u}}()}.call(this),function(){var t=[].slice;up.bus=function(){var n,e,r,o,u,i,a,s;return s=up.util,n={},r={},e=function(t){return n[t]||(n[t]=[])},a=function(){var t,e,o;r={},o=[];for(e in n)t=n[e],o.push(r[e]=s.copy(t));return o},i=function(){return n=s.copy(r)},u=function(t,n){return e(t).push(n)},o=function(){var n,r,o;return o=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],s.debug("Emitting event %o with args %o",o,n),r=e(o),s.each(r,function(t){return t.apply(null,n)})},u("framework:ready",a),u("framework:reset",i),{on:u,emit:o}}()}.call(this),function(){up.viewport=function(){var t,n,e,r,o,u,i;return i=up.util,n={duration:0,view:"body",easing:"swing"},e=function(t){return i.extend(n,t)},t="up-scroll-promise",u=function(e,o,u){var a,s,l,c,p;return a=$(e),u=i.options(u),l=i.option(u.duration,n.duration),c=i.option(u.easing,n.easing),r(a),l>0?(s=$.Deferred(),a.data(t,s),s.then(function(){return a.removeData(t),a.finish()}),p={scrollTop:o},a.animate(p,{duration:l,easing:c,complete:function(){return s.resolve()}}),s):(a.scrollTop(o),i.resolvedDeferred())},r=function(n){return $(n).each(function(){var n;return(n=$(this).data(t))?n.resolve():void 0})},o=function(t,e){var r,o,a,s,l,c,p,f,d,m,h;return e=i.options(e),m=i.option(e.view,n.view),f=i.option(e.padding,n.padding),r=$(t),o=$(m),h=o.height(),d=o.scrollTop(),c=d,p=d+h,l=r.position().top,a=c>l-f,s=l>p-f,a||s?(d=l-f,d=Math.max(d,0),d=Math.min(d,h-1),u(o,d,e)):i.resolvedDeferred()},{reveal:o,scroll:u,finishScrolling:r,defaults:e}}(),up.scroll=up.viewport.scroll,up.reveal=up.viewport.reveal}.call(this),function(){up.flow=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g,y;return y=up.util,h=function(t,n){var e;return e=$(t),y.isPresent(n)&&(n=y.normalizeUrl(n)),e.attr("up-source",n)},v=function(t){var n;return n=$(t).closest("[up-source]"),y.presence(n.attr("up-source"))||up.browser.url()},f=function(t,n,e){var r,o,u;return e=y.options(e),u=y.presence(t)?t:y.createSelectorFromElement($(t)),up.browser.canPushState()||y.castsToFalse(e.history)?(o={url:n,method:e.method,selector:u,cache:e.cache},r=up.proxy.ajax(o),r.done(function(t,r,a){var s,l;return(s=y.locationFromXhr(a))&&(y.debug("Location from server: %o",s),l={url:s,method:y.methodFromXhr(a),selector:u},up.proxy.alias(o,l),n=s),(y.isMissing(e.history)||y.castsToTrue(e.history))&&(e.history=n),(y.isMissing(e.source)||y.castsToTrue(e.source))&&(e.source=n),e.preload?void 0:i(u,t,e)}),r.fail(y.error),r):(e.preload||up.browser.loadPage(n,y.only(e,"method")),y.resolvedPromise())},i=function(t,n,e){var o,u,i,a,p,f,d,m;for(e=y.options(e,{historyMethod:"push"}),y.castsToFalse(e.history)&&(e.history=null),y.castsToFalse(e.scroll)&&(e.scroll=null),e.source=y.option(e.source,e.history),f=l(n),e.title||(e.title=f.title()),p=s(t,e),d=[],i=0,a=p.length;a>i;i++)m=p[i],u=r(m.selector),o=f.find(m.selector),d.push(c(u,e).then(function(){return g(u,o,m.pseudoClass,m.transition,e)}));return d},r=function(t){return o(".up-popup "+t)||o(".up-modal "+t)||o(t)||u(t)},u=function(t){var n;return n="Could not find selector %o in current body HTML","#"===n[0]&&(n+=" (avoid using IDs)"),y.error(n,t)},l=function(t){var n;return n=y.createElementFromHtml(t),{title:function(){var t;return null!=(t=n.querySelector("title"))?t.textContent:void 0},find:function(e){var r;return(r=n.querySelector(e))?$(r):y.error("Could not find selector %o in response %o",e,t)}}},c=function(t,n){return up.motion.finish(t),m(t,n.scroll)},m=function(t,n){return n?up.reveal(t,{view:n}):y.resolvedDeferred()},e=function(n,e){return"function"==typeof e.insert&&e.insert(n),e.history&&(e.title&&(document.title=e.title),up.history[e.historyMethod](e.history)),h(n,e.source),t(n),up.ready(n)},g=function(t,r,o,u,i){var a,s;return u||(u="none"),o?(s="before"===o?"prepend":"append",a=r.children(),t[s](r.contents()),y.copyAttributes(r,t),e(a,i),up.animate(r,u,i)):n(t,{animation:function(){return r.insertBefore(t),e(r,i),t.is("body")&&"none"!==u&&y.error("Cannot apply transitions to body-elements (%o)",u),up.morph(t,r,u,i)}})},s=function(t,n){var e,r,o,u,i,a,s,l,c,p,f;for(p=n.transition||n.animation||"none",e=/\ *,\ */,r=t.split(e),y.isPresent(p)&&(f=p.split(e)),a=[],o=u=0,i=r.length;i>u;o=++u)s=r[o],l=s.match(/^(.+?)(?:\:(before|after))?$/),c=f[o]||y.last(f),a.push({selector:l[1],pseudoClass:l[2],transition:c});return a},t=function(t){var n,e;return e="[autofocus]:last",n=y.findWithSelf(t,e),n.length&&n.get(0)!==document.activeElement?n.focus():void 0},a=function(t){var n;return n=".up-ghost, .up-destroying",0===t.closest(n).length},o=function(t){var n,e,r,o,u,i;for(o=$(t).get(),e=null,u=0,i=o.length;i>u;u++)if(r=o[u],n=$(r),a(n)){e=n;break}return e},n=function(t,n){var e,r,o;return e=$(t),n=y.options(n,{animation:"none"}),r=up.motion.animateOptions(n),e.addClass("up-destroying"),y.isPresent(n.url)&&up.history.push(n.url),y.isPresent(n.title)&&(document.title=n.title),up.bus.emit("fragment:destroy",e),o=y.presence(n.animation,y.isPromise)||up.motion.animate(e,n.animation,r),o.then(function(){return e.remove()})},p=function(t,n){var e;return n=y.options(n,{cache:!1}),e=n.url||v(t),f(t,e,n)},d=function(){return up.bus.emit("framework:reset")},up.bus.on("app:ready",function(){return h(document.body,up.browser.url())}),{replace:f,reload:p,destroy:n,implant:i,reset:d,first:o}}(),up.replace=up.flow.replace,up.reload=up.flow.reload,up.destroy=up.flow.destroy,up.reset=up.flow.reset,up.first=up.flow.first}.call(this),function(){var t=[].slice;up.magic=function(){var n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g;return g=up.util,n="up-destroyable",e="up-destroyer",f=[],l=null,p=function(t,n,e){var r,o;if(up.browser.isSupported())return r=[t,n,function(t){return e.apply(this,[t,$(this),a(this)])}],f.push(r),(o=$(document)).on.apply(o,r)},i=[],s=null,u=function(){var n,e,r;return r=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],up.browser.isSupported()?(u=n.pop(),e=g.options(n[0],{batch:!1}),i.push({selector:r,callback:u,batch:e.batch})):void 0},r=function(t,r,o){var u;return g.debug("Applying compiler %o on %o",t.selector,o),u=t.callback.apply(o,[r,a(r)]),g.isFunction(u)?(r.addClass(n),r.data(e,u)):void 0},o=function(t){var n,e,o,a;for(g.debug("Compiling fragment %o",t),a=[],e=0,o=i.length;o>e;e++)u=i[e],n=g.findWithSelf(t,u.selector),a.push(n.length?u.batch?r(u,n,n.get()):n.each(function(){return r(u,$(this),this)}):void 0);return a},c=function(t){return g.findWithSelf(t,"."+n).each(function(){var t,n;return t=$(this),(n=t.data(e))()})},a=function(t){var n,e;return n=$(t),e=n.attr("up-data"),g.isString(e)&&""!==g.trim(e)?JSON.parse(e):{}},v=function(){return l=g.copy(f),s=g.copy(i)},h=function(){var t,n,e,r;for(n=0,e=f.length;e>n;n++)t=f[n],g.contains(l,t)||(r=$(document)).off.apply(r,t);return f=g.copy(l),i=g.copy(s)},m=function(t){var n;return n=$(t),up.bus.emit("fragment:ready",n),n},d=function(t){return p("keydown","body",function(n){return g.escapePressed(n)?t(n):void 0})},up.bus.on("app:ready",function(){return m(document.body)}),up.bus.on("fragment:ready",o),up.bus.on("fragment:destroy",c),up.bus.on("framework:ready",v),up.bus.on("framework:reset",h),{compiler:u,on:p,ready:m,onEscape:d,data:a}}(),up.compiler=up.magic.compiler,up.on=up.magic.on,up.ready=up.magic.ready,up.awaken=function(){var n;return n=1<=arguments.length?t.call(arguments,0):[],up.util.warn("up.awaken has been renamed to up.compiler and will be removed in a future version"),up.compiler.apply(up,n)}}.call(this),function(){up.history=function(){var t,n,e,r,o,u;return u=up.util,t=function(t){return u.normalizeUrl(t,{hash:!0})===u.normalizeUrl(up.browser.url(),{hash:!0})},o=function(e,r){return r=u.options(r,{force:!1}),r.force||!t(e)?n("replace",e):void 0},r=function(e){return t(e)?void 0:n("push",e)},n=function(t,n){return up.browser.canPushState()?(t+="State",window.history[t]({fromUp:!0},"",n)):u.error("This browser doesn't support history.pushState")},e=function(t){var n;return n=t.originalEvent.state,(null!=n?n.fromUp:void 0)?(u.debug("Restoring state %o (now on "+up.browser.url()+")",n),up.visit(up.browser.url(),{historyMethod:"replace"})):u.debug("Discarding unknown state %o",n)},up.browser.canPushState()&&setTimeout(function(){return $(window).on("popstate",e),o(up.browser.url(),{force:!0})},200),{push:r,replace:o}}()}.call(this),function(){up.motion=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g,y,b,w,k;return w=up.util,o={},a={},b={},s={},i={duration:300,delay:0,easing:"ease"},l=function(t){return w.extend(i,t)},n=function(t,r,o){var i;return i=$(t),p(i),o=e(o),w.isFunction(r)?u(r(i,o),r):w.isString(r)?n(i,c(r),o):w.isHash(r)?w.cssAnimate(i,r,o):w.error("Unknown animation type %o",r)},e=function(t,n){var e;return null==n&&(n=null),t=w.options(t),e={},e.easing=w.option(t.easing,null!=n?n.attr("up-easing"):void 0,i.easing),e.duration=Number(w.option(t.duration,null!=n?n.attr("up-duration"):void 0,i.duration)),e.delay=Number(w.option(t.delay,null!=n?n.attr("up-delay"):void 0,i.delay)),e},c=function(t){return o[t]||w.error("Unknown animation %o",r)},t="up-ghosting-promise",k=function(n,e,r){var o,u,i,a;return u=null,o=null,w.temporaryCss(e,{display:"none"},function(){return u=w.prependGhost(n).addClass("up-destroying")}),w.temporaryCss(n,{display:"none"},function(){return o=w.prependGhost(e)}),n.css({visibility:"hidden"}),a=w.temporaryCss(e,{display:"none"}),i=r(u,o),n.data(t,i),e.data(t,i),i.then(function(){return n.removeData(t),e.removeData(t),u.remove(),o.remove(),n.css({display:"none"}),a()}),i},p=function(t){return $(t).each(function(){var t;return t=$(this),w.finishCssAnimate(t),f(t)})},f=function(n){var e;return(e=n.data(t))?(w.debug("Canceling existing ghosting on %o",n),"function"==typeof e.resolve?e.resolve():void 0):void 0},u=function(t,n){return w.isDeferred(t)?t:w.error("Did not return a promise with .then and .resolve methods: %o",n)},d=function(t,r,i,a){var s,l,c,f,h;return up.browser.canCssAnimation()?(a=e(a),l=$(t),s=$(r),p(l),p(s),"none"===i?m():(h=w.presence(i,w.isFunction)||b[i])?k(l,s,function(t,n){return u(h(t,n,a),i)}):(c=o[i])?(l.hide(),n(s,c,a)):w.isString(i)&&i.indexOf("/")>=0?(f=i.split("/"),h=function(t,e,r){return v(n(t,f[0],r),n(e,f[1],r))},d(l,s,h,a)):w.error("Unknown transition %o",i)):w.resolvedDeferred()},y=function(t,n){return b[t]=n},r=function(t,n){return o[t]=n},g=function(){return a=w.copy(o),s=w.copy(b)},h=function(){return o=w.copy(a),b=w.copy(s)},v=w.resolvableWhen,m=w.resolvedDeferred,r("none",m),r("fade-in",function(t,e){return t.css({opacity:0}),n(t,{opacity:1},e)}),r("fade-out",function(t,e){return t.css({opacity:1}),n(t,{opacity:0},e)}),r("move-to-top",function(t,e){var r,o;return r=w.measure(t),o=r.top+r.height,t.css({"margin-top":"0px"}),n(t,{"margin-top":"-"+o+"px"},e)}),r("move-from-top",function(t,e){var r,o;return r=w.measure(t),o=r.top+r.height,t.css({"margin-top":"-"+o+"px"}),n(t,{"margin-top":"0px"},e)}),r("move-to-bottom",function(t,e){var r,o;return r=w.measure(t),o=w.clientSize().height-r.top,t.css({"margin-top":"0px"}),n(t,{"margin-top":o+"px"},e)}),r("move-from-bottom",function(t,e){var r,o;return r=w.measure(t),o=w.clientSize().height-r.top,t.css({"margin-top":o+"px"}),n(t,{"margin-top":"0px"},e)}),r("move-to-left",function(t,e){var r,o;return r=w.measure(t),o=r.left+r.width,t.css({"margin-left":"0px"}),n(t,{"margin-left":"-"+o+"px"},e)}),r("move-from-left",function(t,e){var r,o;return r=w.measure(t),o=r.left+r.width,t.css({"margin-left":"-"+o+"px"}),n(t,{"margin-left":"0px"},e)}),r("move-to-right",function(t,e){var r,o;return r=w.measure(t),o=w.clientSize().width-r.left,t.css({"margin-left":"0px"}),n(t,{"margin-left":o+"px"},e)}),r("move-from-right",function(t,e){var r,o;return r=w.measure(t),o=w.clientSize().width-r.left,t.css({"margin-left":o+"px"}),n(t,{"margin-left":"0px"},e)}),r("roll-down",function(t,e){var r,o;return r=t.height(),o=w.temporaryCss(t,{height:"0px",overflow:"hidden"}),n(t,{height:r+"px"},e).then(o)}),y("none",m),y("move-left",function(t,e,r){return v(n(t,"move-to-left",r),n(e,"move-from-right",r))}),y("move-right",function(t,e,r){return v(n(t,"move-to-right",r),n(e,"move-from-left",r))}),y("move-up",function(t,e,r){return v(n(t,"move-to-top",r),n(e,"move-from-bottom",r))}),y("move-down",function(t,e,r){return v(n(t,"move-to-bottom",r),n(e,"move-from-top",r))}),y("cross-fade",function(t,e,r){return v(n(t,"fade-out",r),n(e,"fade-in",r))}),up.bus.on("framework:ready",g),up.bus.on("framework:reset",h),{morph:d,animate:n,animateOptions:e,finish:p,transition:y,animation:r,defaults:l,none:m,when:v}}(),up.transition=up.motion.transition,up.animation=up.motion.animation,up.morph=up.motion.morph,up.animate=up.motion.animate}.call(this),function(){up.proxy=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g,y,b,w,k,C,x;return l={preloadDelay:75,cacheSize:70,cacheExpiry:3e5},c=function(t){return x.extend(l,t)},o={},x=up.util,t=null,p=null,u=function(t){return h(t),[t.url,t.method,t.data,t.selector].join("|")},C=function(){var t,n,e;return t=x.keys(o),t.length>l.cacheSize&&(n=null,e=null,x.each(t,function(t){var r,u;return r=o[t],u=r.timestamp,!e||e>u?(n=t,e=u):void 0}),n)?delete o[n]:void 0},k=function(){return(new Date).valueOf()},h=function(t){return t._normalized||(t.method=x.normalizeMethod(t.method),t.url&&(t.url=x.normalizeUrl(t.url)),t.selector||(t.selector="body"),t._normalized=!0),t},r=function(t,n){var e;return x.debug("Aliasing %o to %o",t,n),(e=f(t))?b(n,e):void 0},e=function(t){var n,e,r,o;return n=x.castsToTrue(t.cache),e=x.castsToFalse(t.cache),o=x.only(t,"url","method","data","selector","_normalized"),m(o)||n?(r=f(o))&&!e||(r=x.ajax(o),b(o,r)):(s(),r=x.ajax(o)),r},n=["GET","OPTIONS","HEAD"],m=function(t){return h(t),x.contains(n,t.method)},d=function(t){var n;return n=k()-t.timestamp,n<l.cacheExpiry},f=function(t){var n,e;return n=u(t),(e=o[n])?d(e)?(x.debug("Cache hit for %o (%o)",t.url,t),e):(x.debug("Discarding stale cache entry for %o (%o)",t.url,t),void g(t)):void x.debug("Cache miss for %o (%o)",t.url,t)},b=function(t,n){var e;return C(),e=u(t),n.timestamp=k(),o[e]=n,n},g=function(t){var n;return n=u(t),delete o[n]},s=function(){return o={}},a=function(n){var e,r;return r=parseInt(x.presentAttr(n,"up-delay"))||l.preloadDelay,n.is(t)?void 0:(t=n,i(),e=function(){return v(n)},w(e,r))},w=function(t,n){return p=setTimeout(t,n)},i=function(){return clearTimeout(p),p=null},v=function(t,n){var e,r;return e=$(t),n=x.options(n),r=up.link.followMethod(e,n),m({method:r})?(x.debug("Preloading %o",e),n.preload=!0,up.link.follow(e,n)):(x.debug("Won't preload %o due to unsafe method %o",e,r),x.resolvedPromise())},y=function(){return i(),o={}},up.bus.on("framework:reset",y),up.on("mouseover mousedown touchstart","[up-preload]",function(t,n){return up.link.childClicked(t,n)?void 0:a(n)}),{preload:v,ajax:e,get:f,set:b,alias:r,clear:s,remove:g,defaults:c}}()}.call(this),function(){up.link=function(){var childClicked,follow,followMethod,shouldProcessLinkEvent,u,visit;return u=up.util,visit=function(t,n){return u.debug("Visiting "+t),up.replace("body",t,n)},follow=function(t,n){var e,r,o;return e=$(t),n=u.options(n),o=u.option(e.attr("up-href"),e.attr("href")),r=u.option(n.target,e.attr("up-target"),"body"),n.transition=u.option(n.transition,e.attr("up-transition"),e.attr("up-animation")),n.history=u.option(n.history,e.attr("up-history")),n.scroll=u.option(n.scroll,e.attr("up-scroll"),"body"),n.cache=u.option(n.cache,e.attr("up-cache")),n.method=followMethod(e,n),n=u.merge(n,up.motion.animateOptions(n,e)),up.replace(r,o,n)},followMethod=function(t,n){return n=u.options(n),u.option(n.method,t.attr("up-method"),t.attr("data-method"),"get").toUpperCase()},up.on("click","a[up-target], [up-href][up-target]",function(t,n){return shouldProcessLinkEvent(t,n)?n.is("[up-instant]")?t.preventDefault():(t.preventDefault(),follow(n)):void 0}),up.on("mousedown","a[up-instant], [up-href][up-instant]",function(t,n){return shouldProcessLinkEvent(t,n)?(t.preventDefault(),follow(n)):void 0}),childClicked=function(t,n){var e,r;return e=$(t.target),r=e.closest("a, [up-href]"),r.length&&n.find(r).length},shouldProcessLinkEvent=function(t,n){return u.isUnmodifiedMouseEvent(t)&&!childClicked(t,n)},up.on("click","a[up-follow], [up-href][up-follow]",function(t,n){return shouldProcessLinkEvent(t,n)?n.is("[up-instant]")?t.preventDefault():(t.preventDefault(),follow(n)):void 0}),up.compiler("[up-expand]",function(t){var n,e,r,o,i,a,s,l;for(o=t.find("a, [up-href]").get(0),o||u.error("No link to expand within %o",t),l=/^up-/,a={},a["up-href"]=$(o).attr("href"),s=o.attributes,e=0,r=s.length;r>e;e++)n=s[e],i=n.name,i.match(l)&&(a[i]=n.value);return u.isGiven(a["up-target"])||(a["up-follow"]=""),u.setMissingAttrs(t,a),t.removeAttr("up-expand")}),up.compiler("[up-dash]",function(t){var n,e;return e=t.attr("up-dash"),n={"up-preload":"true","up-instant":"true"},u.isBlank(e)||u.castsToTrue(e)?n["up-follow"]="":n["up-target"]=e,u.setMissingAttrs(t,n),t.removeAttr("up-dash")}),{knife:eval("undefined"!=typeof Knife&&null!==Knife?Knife.point:void 0),visit:visit,follow:follow,childClicked:childClicked,followMethod:followMethod}}(),up.visit=up.link.visit,up.follow=up.link.follow}.call(this),function(){up.form=function(){var observe,submit,u;return u=up.util,submit=function(t,n){var e,r,o,i,a,s,l,c,p,f,d,m;return e=$(t).closest("form"),n=u.options(n),c=u.option(n.target,e.attr("up-target"),"body"),o=u.option(n.failTarget,e.attr("up-fail-target"),function(){return u.createSelectorFromElement(e)}),a=u.option(n.history,e.attr("up-history"),!0),p=u.option(n.transition,e.attr("up-transition")),i=u.option(n.failTransition,e.attr("up-fail-transition"),p),s=u.option(n.method,e.attr("up-method"),e.attr("data-method"),e.attr("method"),"post").toUpperCase(),r=up.motion.animateOptions(n,e),m=u.option(n.cache,e.attr("up-cache")),d=u.option(n.url,e.attr("action"),up.browser.url()),e.addClass("up-active"),up.browser.canPushState()||u.castsToFalse(a)?(l={url:d,method:s,data:e.serialize(),selector:c,cache:m},f=function(t){var n;return d=a?u.castsToFalse(a)?!1:u.isString(a)?a:(n=u.locationFromXhr(t))?n:"GET"===l.type?l.url+"?"+l.data:void 0:void 0,u.option(d,!1)},up.proxy.ajax(l).always(function(){return e.removeClass("up-active")}).done(function(t,n,e){var o;return o=u.merge(r,{history:f(e),transition:p}),up.flow.implant(c,t,o)}).fail(function(t){var n,e;return e=t.responseText,n=u.merge(r,{transition:i}),up.flow.implant(o,e,n)})):void e.get(0).submit()},observe=function(fieldOrSelector,options){var $field,callback,callbackPromise,callbackTimer,changeEvents,check,clearTimer,codeOnChange,delay,knownValue,nextCallback,runNextCallback;return $field=$(fieldOrSelector),options=u.options(options),delay=u.option($field.attr("up-delay"),options.delay,0),delay=parseInt(delay),knownValue=null,callback=null,callbackTimer=null,(codeOnChange=$field.attr("up-observe"))?callback=function(value,$field){return eval(codeOnChange)}:options.change?callback=options.change:u.error("up.observe: No change callback given"),callbackPromise=u.resolvedPromise(),nextCallback=null,runNextCallback=function(){var t;return nextCallback?(t=nextCallback(),nextCallback=null,t):void 0},check=function(){var t,n;return n=$field.val(),t=u.isNull(knownValue),knownValue===n||(knownValue=n,t)?void 0:(clearTimer(),nextCallback=function(){return callback.apply($field.get(0),[n,$field])},callbackTimer=setTimeout(function(){return callbackPromise.then(function(){var t;return t=runNextCallback(),callbackPromise=u.isPromise(t)?t:u.resolvedPromise()})},delay))},clearTimer=function(){return clearTimeout(callbackTimer)},changeEvents=up.browser.canInputEvent()?"input change":"input change keypress paste cut click propertychange",$field.on(changeEvents,check),check(),clearTimer},up.on("submit","form[up-target]",function(t,n){return t.preventDefault(),submit(n)}),up.compiler("[up-observe]",function(t){return observe(t)}),{submit:submit,observe:observe}}(),up.submit=up.form.submit,up.observe=up.form.observe}.call(this),function(){up.popup=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m;return d=up.util,u=void 0,e={openAnimation:"fade-in",closeAnimation:"fade-out",position:"bottom-right"},i=function(t){return d.extend(e,t)},p=function(t,n,e){var r,o;return o=d.measure(t,{full:!0}),r=function(){switch(e){case"bottom-right":return{right:o.right,top:o.top+o.height};case"bottom-left":return{left:o.left,top:o.bottom+o.height};case"top-right":return{right:o.right,bottom:o.top};case"top-left":return{left:o.left,bottom:o.top};default:return d.error("Unknown position %o",e)}}(),n.attr("up-position",e),n.css(r),s(n)},s=function(t){var n,e,r,o,u,i,a;if(e=d.measure(t,{full:!0}),r=null,o=null,e.right<0&&(r=-e.right),e.bottom<0&&(o=-e.bottom),e.left<0&&(r=e.left),e.top<0&&(o=e.top),r&&((u=parseInt(t.css("left")))?t.css("left",u-r):(i=parseInt(t.css("right")))&&t.css("right",i+r)),o){if(a=parseInt(t.css("top")))return t.css("top",a-o);if(n=parseInt(t.css("bottom")))return t.css("bottom",n+o)}},c=function(){var t;return t=$(".up-popup"),t.attr("up-previous-url",up.browser.url()),t.attr("up-previous-title",document.title)},a=function(){var t;return t=$(".up-popup"),t.removeAttr("up-previous-url"),t.removeAttr("up-previous-title")},o=function(t,n,e){var r,o;return o=d.$createElementFromSelector(".up-popup"),e&&o.attr("up-sticky",""),r=d.$createElementFromSelector(n),r.appendTo(o),o.appendTo(document.body),c(),o.hide(),o},m=function(t,n,e,r,o){return n.show(),p(t,n,e),up.animate(n,r,o)},l=function(t,r){var u,i,a,s,l,c,p,f,h;return u=$(t),r=d.options(r),h=d.option(r.url,u.attr("href")),p=d.option(r.target,u.attr("up-popup"),"body"),c=d.option(r.position,u.attr("up-position"),e.position),s=d.option(r.animation,u.attr("up-animation"),e.openAnimation),f=d.option(r.sticky,u.is("[up-sticky]")),l=up.browser.canPushState()?d.option(r.history,u.attr("up-history"),!1):!1,a=up.motion.animateOptions(r,u),n(),i=o(u,p,f),up.replace(p,h,{history:l,insert:function(){return m(u,i,c,s,a)}})},f=function(){return u},n=function(t){var n;return n=$(".up-popup"),n.length?(t=d.options(t,{animation:e.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),u=void 0,up.destroy(n,t)):void 0},t=function(){return $(".up-popup").is("[up-sticky]")?void 0:(a(),n())},r=function(t){var n;return n=$(t),n.closest(".up-popup").length>0},up.on("click","a[up-popup]",function(t,e){return t.preventDefault(),e.is(".up-current")?n():l(e)
|
2
|
-
}),up.on("click","body",function(t){var e;return e=$(t.target),e.closest(".up-popup").length||e.closest("[up-popup]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){var e;return r(n)?(e=n.attr("up-source"))?u=e:void 0:t()}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,e){return e.closest(".up-popup")?n():void 0}),up.bus.on("framework:reset",n),{open:l,close:n,source:f,defaults:i,contains:r}}()}.call(this),function(){var t=[].slice;up.modal=function(){var n,e,r,o,u,i,a,s,l,c,p,f,d,m;return d=up.util,i=void 0,r={width:"auto",height:"auto",openAnimation:"fade-in",closeAnimation:"fade-out",closeLabel:"X",template:function(t){return'<div class="up-modal">\n <div class="up-modal-dialog">\n <div class="up-modal-close" up-close>'+t.closeLabel+'</div>\n <div class="up-modal-content"></div>\n </div>\n</div>'}},a=function(t){return d.extend(r,t)},f=function(){var t;return t=r.template,d.isFunction(t)?t(r):t},c=function(){var t;return t=$(".up-modal"),t.attr("up-previous-url",up.browser.url()),t.attr("up-previous-title",document.title)},s=function(){var t;return t=$(".up-modal"),t.removeAttr("up-previous-url"),t.removeAttr("up-previous-title")},u=function(t,n,e,r){var o,u,i,a;return i=$(f()),r&&i.attr("up-sticky",""),i.attr("up-previous-url",up.browser.url()),i.attr("up-previous-title",document.title),u=i.find(".up-modal-dialog"),d.isPresent(n)&&u.css("width",n),d.isPresent(e)&&u.css("height",e),o=u.find(".up-modal-content"),a=d.$createElementFromSelector(t),a.appendTo(o),i.appendTo(document.body),c(),i.hide(),i},m=function(t,n,e){return t.show(),up.animate(t,n,e)},l=function(){var n,o,i,a,s,l,c,p,f,h,v,g;return s=1<=arguments.length?t.call(arguments,0):[],!d.isObject(s[0])||d.isElement(s[0])||d.isJQuery(s[0])?(n=$(s[0]),p=s[1]):(n=d.nullJquery(),p=s[0]),p=d.options(p),v=d.option(p.url,n.attr("up-href"),n.attr("href")),f=d.option(p.target,n.attr("up-modal"),"body"),g=d.option(p.width,n.attr("up-width"),r.width),l=d.option(p.height,n.attr("up-height"),r.height),a=d.option(p.animation,n.attr("up-animation"),r.openAnimation),h=d.option(p.sticky,n.is("[up-sticky]")),c=up.browser.canPushState()?d.option(p.history,n.attr("up-history"),!0):!1,i=up.motion.animateOptions(p,n),e(),o=u(f,g,l,h),up.replace(f,v,{history:c,insert:function(){return m(o,a,i)}})},p=function(){return i},e=function(t){var n;return n=$(".up-modal"),n.length?(t=d.options(t,{animation:r.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),i=void 0,up.destroy(n,t)):void 0},n=function(){return $(".up-modal").is("[up-sticky]")?void 0:(s(),e())},o=function(t){var n;return n=$(t),n.closest(".up-modal").length>0},up.on("click","a[up-modal]",function(t,n){return t.preventDefault(),n.is(".up-current")?e():l(n)}),up.on("click","body",function(t){var n;return n=$(t.target),n.closest(".up-modal-dialog").length||n.closest("[up-modal]").length?void 0:e()}),up.bus.on("fragment:ready",function(t){var e;if(o(t)){if(e=t.attr("up-source"))return i=e}else if(!up.popup.contains(t))return n()}),up.magic.onEscape(function(){return e()}),up.on("click","[up-close]",function(t,n){return n.closest(".up-modal")?e():void 0}),up.bus.on("framework:reset",e),{open:l,close:e,source:p,defaults:a,contains:o}}()}.call(this),function(){up.tooltip=function(){var t,n,e,r,o;return o=up.util,r=function(t,n,e){var r,u,i;return u=o.measure(t),i=o.measure(n),r=function(){switch(e){case"top":return{left:u.left+.5*(u.width-i.width),top:u.top-i.height};case"bottom":return{left:u.left+.5*(u.width-i.width),top:u.top+u.height};default:return o.error("Unknown position %o",e)}}(),n.attr("up-position",e),n.css(r)},n=function(t){return o.$createElementFromSelector(".up-tooltip").html(t).appendTo(document.body)},e=function(e,u){var i,a,s,l,c,p;return null==u&&(u={}),i=$(e),c=o.option(u.html,i.attr("up-tooltip"),i.attr("title")),p=o.option(u.position,i.attr("up-position"),"top"),l=o.option(u.animation,i.attr("up-animation"),"fade-in"),s=up.motion.animateOptions(u,i),t(),a=n(c),r(i,a,p),up.animate(a,l,s)},t=function(t){var n;return n=$(".up-tooltip"),n.length?(t=o.options(t,{animation:"fade-out"}),t=o.merge(t,up.motion.animateOptions(t)),up.destroy(n,t)):void 0},up.compiler("[up-tooltip]",function(n){return n.on("mouseover",function(){return e(n)}),n.on("mouseout",function(){return t()})}),up.on("click","body",function(){return t()}),up.bus.on("framework:reset",t),up.magic.onEscape(function(){return t()}),{open:e,close:t}}()}.call(this),function(){up.navigation=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m;return f=up.util,t="up-active",n="up-current",e=["a","[up-href]","[up-alias]"],o=e.join(", "),u=function(){var t,n,r;for(r=[],t=0,n=e.length;n>t;t++)p=e[t],r.push(p+"[up-instant]");return r}().join(", "),r="."+t,s=function(t){return f.isPresent(t)?f.normalizeUrl(t,{search:!1,stripTrailingSlash:!0}):void 0},c=function(t){var n,e,r,o,u,i,a,l;for(i=[],u=["href","up-href"],r=0,o=u.length;o>r;r++)e=u[r],(a=f.presentAttr(t,e))&&i.push(a);return(n=f.presentAttr(t,"up-alias"))&&(l=n.split(" "),i=i.concat(l)),i.map(s)},m=function(t){var n,e,r,o;return t=f.compact(t),r=function(t){return"*"===t.substr(-1)?e(t.slice(0,-1)):n(t)},n=function(n){return f.contains(t,n)},e=function(n){return f.detect(t,function(t){return 0===t.indexOf(n)})},o=function(t){return f.detect(t,r)},{matchesAny:o}},a=function(){var t;return t=m([s(up.browser.url()),s(up.modal.source()),s(up.popup.source())]),f.each($(o),function(e){var r,o;return r=$(e),o=c(r),t.matchesAny(o)?r.addClass(n):r.removeClass(n)})},l=function(n){return d(),n=i(n),n.addClass(t)},i=function(t){return f.presence(t.parents(o))||t},d=function(){return $(r).removeClass(t)},up.on("click",o,function(t,n){return f.isUnmodifiedMouseEvent(t)&&!n.is("[up-instant]")?l(n):void 0}),up.on("mousedown",u,function(t,n){return f.isUnmodifiedMouseEvent(t)?l(n):void 0}),up.bus.on("fragment:ready",function(){return d(),a()}),up.bus.on("fragment:destroy",function(t){return t.is(".up-modal, .up-popup")?a():void 0})}()}.call(this),function(){up.slot=function(){var t,n,e;return e=up.util,n=function(t){return""!==e.trim(t.html())},t=function(t){return e.findWithSelf(t,"[up-slot]").each(function(){var t;return t=$(this),n(t)?void 0:t.hide()})},up.bus.on("fragment:ready",t)}()}.call(this),function(){up.browser.ensureRecentJquery(),up.browser.isSupported()&&(up.browser.ensureConsoleExists(),up.bus.emit("framework:ready"),$(document).on("ready",function(){return up.bus.emit("app:ready")}))}.call(this);
|
1
|
+
(function(){window.up={}}).call(this),function(){var t=[].slice;up.util=function(){var n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g,y,b,w,k,x,C,T,E,S,P,A,D,U,F,O,M,j,z,L,I,N,H,W,q,G,X,J,R,K,V,B,_,Q,Z,Y,tn,nn,en,rn,on,un,an,sn,ln,cn,pn,fn,dn,mn,hn,vn,gn,yn,bn,wn,kn,$n;return E=function(t,n){return n=n||{},n.url=t,o(n)},o=function(t){return t.selector&&(t.headers={"X-Up-Selector":t.selector}),$.ajax(t)},q=function(t,n){return(""===n||"80"===n)&&"http:"===t||"443"===n&&"https:"===t},nn=function(t,n){var e,r,o;return e=null,G(t)?(e=$("<a>").attr({href:t}).get(0),A(e.hostname)&&(e.href=e.href)):e=kn(t),r=e.protocol+"//"+e.hostname,q(e.protocol,e.port)||(r+=":"+e.port),o=e.pathname,"/"!==o[0]&&(o="/"+o),(null!=n?n.stripTrailingSlash:void 0)===!0&&(o=o.replace(/\/$/,"")),r+=o,(null!=n?n.hash:void 0)===!0&&(r+=e.hash),(null!=n?n.search:void 0)!==!1&&(r+=e.search),r},tn=function(t){return t?t.toUpperCase():"GET"},n=function(t){var n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v;for(h=t.split(/[ >]/),r=null,c=p=0,d=h.length;d>p;c=++p){for(i=h[c],u=i.match(/(^|\.|\#)[A-Za-z0-9\-_]+/g),v="div",o=[],l=null,f=0,m=u.length;m>f;f++)switch(a=u[f],a[0]){case".":o.push(a.substr(1));break;case"#":l=a.substr(1);break;default:v=a}s="<"+v,o.length&&(s+=' class="'+o.join(" ")+'"'),l&&(s+=' id="'+l+'"'),s+=">",n=$(s),e&&n.appendTo(e),0===c&&(r=n),e=n}return r},f=function(t,n){var e;return e=document.createElement(t),H(n)&&(e.innerHTML=n),e},v=function(){var n,e;return e=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],e="[UP] "+e,console.debug.apply(console,[e].concat(t.call(n)))},$n=function(){var n,e;return e=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],e="[UP] "+e,console.warn.apply(console,[e].concat(t.call(n)))},b=function(){var n,e,r;throw e=1<=arguments.length?t.call(arguments,0):[],e[0]="[UP] "+e[0],console.error.apply(console,e),r=vn(e),n=sn($(".up-error"))||$('<div class="up-error"></div>').prependTo("body"),n.addClass("up-error"),n.text(r),new Error(r)},r=/\%[odisf]/g,vn=function(t){var n,e,o;return o=t[0],n=0,e=30,o.replace(r,function(){var r,o;return n+=1,r=t[n],o=typeof r,"string"===o?(r=r.replace(/\s+/g," "),r.length>e&&(r=r.substr(0,e)+"\u2026"),'"'+r+'"'):"number"===o?r.toString():"("+o+")"})},m=function(t){var n,e,r,o,u,i,a;for(v("Creating selector from element %o",t),e=(n=t.attr("class"))?n.split(" "):[],r=t.attr("id"),a=t.prop("tagName").toLowerCase(),r&&(a+="#"+r),o=0,i=e.length;i>o;o++)u=e[o],a+="."+u;return a},d=function(t){var n,e,r,o,u,i,a,s,l,c,p,d;return l=function(t){return"<"+t+"(?: [^>]*)?>"},i=function(t){return"</"+t+">"},n="(?:.|\\n)*?",u=function(t){return"("+t+")"},d=new RegExp(l("head")+n+l("title")+u(n)+i("title")+n+i("body"),"i"),o=new RegExp(l("body")+u(n)+i("body"),"i"),(r=t.match(o))?(s=document.createElement("html"),e=f("body",r[1]),s.appendChild(e),(p=t.match(d))&&(a=f("head"),s.appendChild(a),c=f("title",p[1]),a.appendChild(c)),s):f("div",t)},k=$.extend,wn=$.trim,K=Object.keys||function(t){var n,e,r,o;for(o=[],n=0,r=t.length;r>n;n++)e=t[n],t.hasOwnProperty(e)&&o.push(e);return o},y=function(t,n){var e,r,o,u,i;for(i=[],e=o=0,u=t.length;u>o;e=++o)r=t[e],i.push(n(r,e));return i},yn=function(t,n){var e,r,o,u;for(u=[],e=r=0,o=t-1;o>=0?o>=r:r>=o;e=o>=0?++r:--r)u.push(n(e));return u},I=function(t){return null===t},X=function(t){return void 0===t},U=function(t){return!X(t)},L=function(t){return X(t)||I(t)},M=function(t){return!L(t)},A=function(t){return L(t)||N(t)&&0===K(t).length||0===t.length},sn=function(t,n){return null==n&&(n=H),n(t)?t:null},H=function(t){return!A(t)},O=function(t){return"function"==typeof t},G=function(t){return"string"==typeof t},j=function(t){return"object"==typeof t&&!!t},N=function(t){return j(t)||"function"==typeof t},F=function(t){return!(!t||1!==t.nodeType)},z=function(t){return t instanceof jQuery},W=function(t){return N(t)&&O(t.then)},D=function(t){return W(t)&&O(t.resolve)},S=function(t){return M(t)?t:void 0},P=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},bn=function(t){return Array.prototype.slice.call(t)},c=function(t){return P(t)?t.slice():k({},t)},kn=function(t){return z(t)?t.get(0):t},Q=function(t,n){return k(c(t),n)},un=function(t,n){var e,r,o,u;if(o=t?c(t):{},n)for(r in n)e=n[r],u=o[r],M(u)?N(e)&&N(u)&&(o[r]=un(u,e)):o[r]=e;return o},on=function(){var n,e,r,o,u,i;for(e=1<=arguments.length?t.call(arguments,0):[],u=null,r=0,o=e.length;o>r;r++)if(n=e[r],i=n,O(i)&&(i=i()),M(i)){u=i;break}return u},g=function(t,n){var e,r,o,u;for(u=null,r=0,o=t.length;o>r;r++)if(e=t[r],n(e)){u=e;break}return u},s=function(t){return mn(t,M)},mn=function(t,n){var e;return e=[],y(t,function(t){return n(t)?e.push(t):void 0}),e},ln=function(){var n,e,r,o;return n=arguments[0],r=2<=arguments.length?t.call(arguments,1):[],o=function(){var t,o,u;for(u=[],t=0,o=r.length;o>t;t++)e=r[t],u.push(n.attr(e));return u}(),g(o,H)},Y=function(t){return setTimeout(t,0)},V=function(t){return t[t.length-1]},a=function(){var t;return t=document.documentElement,{width:t.clientWidth,height:t.clientHeight}},gn=function(t,n,e){var r,o;return o=t.css(K(n)),t.css(n),r=function(){return t.css(o)},e?(e(),r()):r},T=function(t){var n,e;return e=t.css(["transform","-webkit-transform"]),A(e)?(n=function(){return t.css(e)},t.css({transform:"translateZ(0)","-webkit-transform":"translateZ(0)"})):n=function(){},n},h=function(t,n,r){var o,u,i,a,s,l;return o=$(t),up.browser.canCssAnimation()?(r=un(r,{duration:300,delay:0,easing:"ease"}),u=$.Deferred(),a={"transition-property":K(n).join(", "),"transition-duration":r.duration+"ms","transition-delay":r.delay+"ms","transition-timing-function":r.easing},s=T(o),l=gn(o,a),o.css(n),u.then(s),u.then(l),o.data(e,u),u.then(function(){return o.removeData(e)}),i=setTimeout(function(){return u.resolve()},r.duration+r.delay),u.then(function(){return clearTimeout(i)}),u):(o.css(n),dn())},e="up-animation-promise",C=function(t){return $(t).each(function(){var t;return(t=$(this).data(e))?t.resolve():void 0})},_=function(t,n){var e,r,o;return r=(null!=n?n.relative:void 0)?t.position():t.offset(),e={left:r.left,top:r.top},(null!=n?n.inner:void 0)?(e.width=t.width(),e.height=t.height()):(e.width=t.outerWidth(),e.height=t.outerHeight()),(null!=n?n.full:void 0)&&(o=a(),e.right=o.width-(e.left+e.width),e.bottom=o.height-(e.top+e.height)),e},p=function(t,n){var e,r,o,u,i;for(u=t.get(0).attributes,i=[],r=0,o=u.length;o>r;r++)e=u[r],i.push(e.specified?n.attr(e.name,e.value):void 0);return i},an=function(t){var n,e;return e=_(t,{relative:!0,inner:!0}),n=t.clone(),n.find("script").remove(),n.css({right:"",bottom:"",position:"absolute"}),n.css(e),n.addClass("up-ghost"),n.insertBefore(t)},x=function(t,n){return t.find(n).addBack(n)},w=function(t){return 27===t.keyCode},l=function(t,n){return t.indexOf(n)>=0},i=function(t){return"true"===String(t)},u=function(t){return"false"===String(t)},B=function(t){return t.getResponseHeader("X-Up-Location")},Z=function(t){return t.getResponseHeader("X-Up-Method")},rn=function(){var n,e,r,o,u,i;for(i=arguments[0],o=2<=arguments.length?t.call(arguments,1):[],n={},e=0,u=o.length;u>e;e++)r=o[e],i.hasOwnProperty(r)&&(n[r]=i[r]);return n},J=function(t){return!(t.metaKey||t.shiftKey||t.ctrlKey)},R=function(t){var n;return n=X(t.button)||0===t.button,n&&J(t)},fn=function(){var t;return t=$.Deferred(),t.resolve(),t},dn=function(){return fn().promise()},en=function(){return{is:function(){return!1},attr:function(){},find:function(){return[]}}},pn=function(){var n,e;return n=1<=arguments.length?t.call(arguments,0):[],e=$.when.apply($,n),e.resolve=function(){return y(n,function(t){return"function"==typeof t.resolve?t.resolve():void 0})},e},hn=function(t,n){var e,r,o;r=[];for(e in n)o=n[e],r.push(L(t.attr(e))?t.attr(e,o):void 0);return r},cn=function(t,n){var e;return e=t.indexOf(n),e>=0?(t.splice(e,1),n):void 0},{presentAttr:ln,createElement:f,normalizeUrl:nn,normalizeMethod:tn,createElementFromHtml:d,$createElementFromSelector:n,createSelectorFromElement:m,get:E,ajax:o,extend:k,copy:c,merge:Q,options:un,option:on,error:b,debug:v,warn:$n,each:y,times:yn,detect:g,select:mn,compact:s,last:V,isNull:I,isDefined:U,isUndefined:X,isGiven:M,isMissing:L,isPresent:H,isBlank:A,presence:sn,isObject:N,isFunction:O,isString:G,isElement:F,isJQuery:z,isPromise:W,isDeferred:D,isHash:j,ifGiven:S,isUnmodifiedKeyEvent:J,isUnmodifiedMouseEvent:R,nullJquery:en,unwrap:kn,nextFrame:Y,measure:_,temporaryCss:gn,cssAnimate:h,finishCssAnimate:C,forceCompositing:T,prependGhost:an,escapePressed:w,copyAttributes:p,findWithSelf:x,contains:l,isArray:P,toArray:bn,castsToTrue:i,castsToFalse:u,locationFromXhr:B,methodFromXhr:Z,clientSize:a,only:rn,trim:wn,keys:K,resolvedPromise:dn,resolvedDeferred:fn,resolvableWhen:pn,setMissingAttrs:hn,remove:cn}}()}.call(this),function(){var t=[].slice;up.browser=function(){var n,e,r,o,u,i,a,s,l,c;return l=up.util,a=function(t,n){var e,r,o,u,i,a;return null==n&&(n={}),i=l.option(n.method,"get").toLowerCase(),"get"===i?location.href=t:$.rails?(a=n.target,o=$.rails.csrfToken(),r=$.rails.csrfParam(),e=$("<form method='post' action='"+t+"'></form>"),u="<input name='_method' value='"+i+"' type='hidden' />",l.isDefined(r)&&l.isDefined(o)&&(u+="<input name='"+r+"' value='"+o+"' type='hidden' />"),a&&e.attr("target",a),e.hide().append(u).appendTo("body"),e.submit()):error("Can't fake a "+i.toUpperCase()+" request without Rails UJS")},c=function(){return location.href},o=function(){var t,n,e,r,o,u,i,a,s;return window.console||(window.console={}),s=function(){},(t=window.console).log||(t.log=s),(n=window.console).info||(n.info=s),(e=window.console).error||(e.error=s),(r=window.console).debug||(r.debug=s),(o=window.console).warn||(o.warn=s),(u=window.console).group||(u.group=s),(i=window.console).groupCollapsed||(i.groupCollapsed=s),(a=window.console).groupEnd||(a.groupEnd=s)},s=function(n){var e,r;return e=void 0,r=!1,function(){var o;return o=1<=arguments.length?t.call(arguments,0):[],r?e:(r=!0,e=n.apply(null,o))}},r=s(function(){return l.isDefined(history.pushState)}),n=s(function(){return"transition"in document.documentElement.style}),e=s(function(){return"oninput"in document.createElement("input")}),u=function(){var t,n,e,r,o;return o=$.fn.jquery,r=o.split("."),n=parseInt(r[0]),e=parseInt(r[1]),t=n>=2||1===n&&e>=9,t||l.error("jQuery %o found, but Up.js requires 1.9+",o)},i=s(function(){return l.isDefined(document.addEventListener)}),{url:c,ensureConsoleExists:o,loadPage:a,canPushState:r,canCssAnimation:n,canInputEvent:e,isSupported:i,ensureRecentJquery:u}}()}.call(this),function(){var t=[].slice;up.bus=function(){var n,e,r,o,u,i,a,s,l;return l=up.util,n={},r={},e=function(t){return n[t]||(n[t]=[])},a=function(){var t,e,o;r={},o=[];for(e in n)t=n[e],o.push(r[e]=l.copy(t));return o},i=function(){return n=l.copy(r)},u=function(t,n){var r,o,u,i;for(i=t.split(" "),o=0,u=i.length;u>o;o++)r=i[o],e(r).push(n);return function(){return s(t,n)}},s=function(t,n){var r,o,u,i,a;for(i=t.split(" "),a=[],o=0,u=i.length;u>o;o++)r=i[o],a.push(l.remove(e(r),n));return a},o=function(){var n,r,o;return o=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],l.debug("Emitting event %o with args %o",o,n),r=e(o),l.each(r,function(t){return t.apply(null,n)})},u("framework:ready",a),u("framework:reset",i),{on:u,off:s,emit:o}}()}.call(this),function(){up.viewport=function(){var t,n,e,r,o,u,i;return i=up.util,n={duration:0,view:"body",easing:"swing"},e=function(t){return i.extend(n,t)},t="up-scroll-promise",u=function(e,o,u){var a,s,l,c,p;return a=$(e),u=i.options(u),l=i.option(u.duration,n.duration),c=i.option(u.easing,n.easing),r(a),l>0?(s=$.Deferred(),a.data(t,s),s.then(function(){return a.removeData(t),a.finish()}),p={scrollTop:o},a.animate(p,{duration:l,easing:c,complete:function(){return s.resolve()}}),s):(a.scrollTop(o),i.resolvedDeferred())},r=function(n){return $(n).each(function(){var n;return(n=$(this).data(t))?n.resolve():void 0})},o=function(t,e){var r,o,a,s,l,c,p,f,d,m,h;return e=i.options(e),m=i.option(e.view,n.view),f=i.option(e.padding,n.padding),r=$(t),o=$(m),h=o.height(),d=o.scrollTop(),c=d,p=d+h,l=r.position().top,a=c>l-f,s=l>p-f,a||s?(d=l-f,d=Math.max(d,0),d=Math.min(d,h-1),u(o,d,e)):i.resolvedDeferred()},{reveal:o,scroll:u,finishScrolling:r,defaults:e}}(),up.scroll=up.viewport.scroll,up.reveal=up.viewport.reveal}.call(this),function(){up.flow=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g,y;return y=up.util,h=function(t,n){var e;return e=$(t),y.isPresent(n)&&(n=y.normalizeUrl(n)),e.attr("up-source",n)},v=function(t){var n;return n=$(t).closest("[up-source]"),y.presence(n.attr("up-source"))||up.browser.url()},f=function(t,n,e){var r,o,u;return e=y.options(e),u=y.presence(t)?t:y.createSelectorFromElement($(t)),up.browser.canPushState()||y.castsToFalse(e.history)?(o={url:n,method:e.method,selector:u,cache:e.cache,preload:e.preload},r=up.proxy.ajax(o),r.done(function(t,r,a){var s,l;return(s=y.locationFromXhr(a))&&(y.debug("Location from server: %o",s),l={url:s,method:y.methodFromXhr(a),selector:u},up.proxy.alias(o,l),n=s),(y.isMissing(e.history)||y.castsToTrue(e.history))&&(e.history=n),(y.isMissing(e.source)||y.castsToTrue(e.source))&&(e.source=n),e.preload?void 0:i(u,t,e)}),r.fail(y.error),r):(e.preload||up.browser.loadPage(n,y.only(e,"method")),y.resolvedPromise())},i=function(t,n,e){var o,u,i,a,p,f,d,m;for(e=y.options(e,{historyMethod:"push"}),y.castsToFalse(e.history)&&(e.history=null),y.castsToFalse(e.scroll)&&(e.scroll=null),e.source=y.option(e.source,e.history),f=l(n),e.title||(e.title=f.title()),p=s(t,e),d=[],i=0,a=p.length;a>i;i++)m=p[i],u=r(m.selector),o=f.find(m.selector),d.push(c(u,e).then(function(){return g(u,o,m.pseudoClass,m.transition,e)}));return d},r=function(t){return o(".up-popup "+t)||o(".up-modal "+t)||o(t)||u(t)},u=function(t){var n;return n="Could not find selector %o in current body HTML","#"===n[0]&&(n+=" (avoid using IDs)"),y.error(n,t)},l=function(t){var n;return n=y.createElementFromHtml(t),{title:function(){var t;return null!=(t=n.querySelector("title"))?t.textContent:void 0},find:function(e){var r;return(r=n.querySelector(e))?$(r):y.error("Could not find selector %o in response %o",e,t)}}},c=function(t,n){return up.motion.finish(t),m(t,n.scroll)},m=function(t,n){return n?up.reveal(t,{view:n}):y.resolvedDeferred()},e=function(n,e){return"function"==typeof e.insert&&e.insert(n),e.history&&(e.title&&(document.title=e.title),up.history[e.historyMethod](e.history)),h(n,e.source),t(n),up.ready(n)},g=function(t,r,o,u,i){var a,s;return u||(u="none"),o?(s="before"===o?"prepend":"append",a=r.children(),t[s](r.contents()),y.copyAttributes(r,t),e(a,i),up.animate(r,u,i)):n(t,{animation:function(){return r.insertBefore(t),e(r,i),t.is("body")&&"none"!==u&&y.error("Cannot apply transitions to body-elements (%o)",u),up.morph(t,r,u,i)}})},s=function(t,n){var e,r,o,u,i,a,s,l,c,p,f;for(p=n.transition||n.animation||"none",e=/\ *,\ */,r=t.split(e),y.isPresent(p)&&(f=p.split(e)),a=[],o=u=0,i=r.length;i>u;o=++u)s=r[o],l=s.match(/^(.+?)(?:\:(before|after))?$/),c=f[o]||y.last(f),a.push({selector:l[1],pseudoClass:l[2],transition:c});return a},t=function(t){var n,e;return e="[autofocus]:last",n=y.findWithSelf(t,e),n.length&&n.get(0)!==document.activeElement?n.focus():void 0},a=function(t){var n;return n=".up-ghost, .up-destroying",0===t.closest(n).length},o=function(t){var n,e,r,o,u,i;for(o=$(t).get(),e=null,u=0,i=o.length;i>u;u++)if(r=o[u],n=$(r),a(n)){e=n;break}return e},n=function(t,n){var e,r,o;return e=$(t),n=y.options(n,{animation:"none"}),r=up.motion.animateOptions(n),e.addClass("up-destroying"),y.isPresent(n.url)&&up.history.push(n.url),y.isPresent(n.title)&&(document.title=n.title),up.bus.emit("fragment:destroy",e),o=y.presence(n.animation,y.isPromise)||up.motion.animate(e,n.animation,r),o.then(function(){return e.remove()})},p=function(t,n){var e;return n=y.options(n,{cache:!1}),e=n.url||v(t),f(t,e,n)},d=function(){return up.bus.emit("framework:reset")},up.bus.on("app:ready",function(){return h(document.body,up.browser.url())}),{replace:f,reload:p,destroy:n,implant:i,reset:d,first:o}}(),up.replace=up.flow.replace,up.reload=up.flow.reload,up.destroy=up.flow.destroy,up.reset=up.flow.reset,up.first=up.flow.first}.call(this),function(){var t=[].slice;up.magic=function(){var n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g;return g=up.util,n="up-destroyable",e="up-destroyer",f=[],l=null,p=function(t,n,e){var r,o;if(up.browser.isSupported())return r=[t,n,function(t){return e.apply(this,[t,$(this),a(this)])}],f.push(r),(o=$(document)).on.apply(o,r)},i=[],s=null,u=function(){var n,e,r;return r=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],up.browser.isSupported()?(u=n.pop(),e=g.options(n[0],{batch:!1}),i.push({selector:r,callback:u,batch:e.batch})):void 0},r=function(t,r,o){var u;return g.debug("Applying compiler %o on %o",t.selector,o),u=t.callback.apply(o,[r,a(r)]),g.isFunction(u)?(r.addClass(n),r.data(e,u)):void 0},o=function(t){var n,e,o,a;for(g.debug("Compiling fragment %o",t),a=[],e=0,o=i.length;o>e;e++)u=i[e],n=g.findWithSelf(t,u.selector),a.push(n.length?u.batch?r(u,n,n.get()):n.each(function(){return r(u,$(this),this)}):void 0);return a},c=function(t){return g.findWithSelf(t,"."+n).each(function(){var t,n;return t=$(this),(n=t.data(e))()})},a=function(t){var n,e;return n=$(t),e=n.attr("up-data"),g.isString(e)&&""!==g.trim(e)?JSON.parse(e):{}},v=function(){return l=g.copy(f),s=g.copy(i)},h=function(){var t,n,e,r;for(n=0,e=f.length;e>n;n++)t=f[n],g.contains(l,t)||(r=$(document)).off.apply(r,t);return f=g.copy(l),i=g.copy(s)},m=function(t){var n;return n=$(t),up.bus.emit("fragment:ready",n),n},d=function(t){return p("keydown","body",function(n){return g.escapePressed(n)?t(n):void 0})},up.bus.on("app:ready",function(){return m(document.body)}),up.bus.on("fragment:ready",o),up.bus.on("fragment:destroy",c),up.bus.on("framework:ready",v),up.bus.on("framework:reset",h),{compiler:u,on:p,ready:m,onEscape:d,data:a}}(),up.compiler=up.magic.compiler,up.on=up.magic.on,up.ready=up.magic.ready,up.awaken=function(){var n;return n=1<=arguments.length?t.call(arguments,0):[],up.util.warn("up.awaken has been renamed to up.compiler and will be removed in a future version"),up.compiler.apply(up,n)}}.call(this),function(){up.history=function(){var t,n,e,r,o,u;return u=up.util,t=function(t){return u.normalizeUrl(t,{hash:!0})===u.normalizeUrl(up.browser.url(),{hash:!0})},o=function(e,r){return r=u.options(r,{force:!1}),r.force||!t(e)?n("replace",e):void 0},r=function(e){return t(e)?void 0:n("push",e)},n=function(t,n){return up.browser.canPushState()?(t+="State",window.history[t]({fromUp:!0},"",n)):u.error("This browser doesn't support history.pushState")},e=function(t){var n;return n=t.originalEvent.state,(null!=n?n.fromUp:void 0)?(u.debug("Restoring state %o (now on "+up.browser.url()+")",n),up.visit(up.browser.url(),{historyMethod:"replace"})):u.debug("Discarding unknown state %o",n)},up.browser.canPushState()&&setTimeout(function(){return $(window).on("popstate",e),o(up.browser.url(),{force:!0})},200),{push:r,replace:o}}()}.call(this),function(){up.motion=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g,y,b,w,k;return w=up.util,o={},a={},b={},s={},i={duration:300,delay:0,easing:"ease"},l=function(t){return w.extend(i,t)},n=function(t,r,o){var i;return i=$(t),p(i),o=e(o),w.isFunction(r)?u(r(i,o),r):w.isString(r)?n(i,c(r),o):w.isHash(r)?w.cssAnimate(i,r,o):w.error("Unknown animation type %o",r)},e=function(t,n){var e;return null==n&&(n=null),t=w.options(t),e={},e.easing=w.option(t.easing,null!=n?n.attr("up-easing"):void 0,i.easing),e.duration=Number(w.option(t.duration,null!=n?n.attr("up-duration"):void 0,i.duration)),e.delay=Number(w.option(t.delay,null!=n?n.attr("up-delay"):void 0,i.delay)),e},c=function(t){return o[t]||w.error("Unknown animation %o",r)},t="up-ghosting-promise",k=function(n,e,r){var o,u,i,a;return u=null,o=null,w.temporaryCss(e,{display:"none"},function(){return u=w.prependGhost(n).addClass("up-destroying")}),w.temporaryCss(n,{display:"none"},function(){return o=w.prependGhost(e)}),n.css({visibility:"hidden"}),a=w.temporaryCss(e,{display:"none"}),i=r(u,o),n.data(t,i),e.data(t,i),i.then(function(){return n.removeData(t),e.removeData(t),u.remove(),o.remove(),n.css({display:"none"}),a()}),i},p=function(t){return $(t).each(function(){var t;return t=$(this),w.finishCssAnimate(t),f(t)})},f=function(n){var e;return(e=n.data(t))?(w.debug("Canceling existing ghosting on %o",n),"function"==typeof e.resolve?e.resolve():void 0):void 0},u=function(t,n){return w.isDeferred(t)?t:w.error("Did not return a promise with .then and .resolve methods: %o",n)},d=function(t,r,i,a){var s,l,c,f,h;return up.browser.canCssAnimation()?(a=e(a),l=$(t),s=$(r),p(l),p(s),"none"===i?m():(h=w.presence(i,w.isFunction)||b[i])?k(l,s,function(t,n){return u(h(t,n,a),i)}):(c=o[i])?(l.hide(),n(s,c,a)):w.isString(i)&&i.indexOf("/")>=0?(f=i.split("/"),h=function(t,e,r){return v(n(t,f[0],r),n(e,f[1],r))},d(l,s,h,a)):w.error("Unknown transition %o",i)):w.resolvedDeferred()},y=function(t,n){return b[t]=n},r=function(t,n){return o[t]=n},g=function(){return a=w.copy(o),s=w.copy(b)},h=function(){return o=w.copy(a),b=w.copy(s)},v=w.resolvableWhen,m=w.resolvedDeferred,r("none",m),r("fade-in",function(t,e){return t.css({opacity:0}),n(t,{opacity:1},e)}),r("fade-out",function(t,e){return t.css({opacity:1}),n(t,{opacity:0},e)}),r("move-to-top",function(t,e){var r,o;return r=w.measure(t),o=r.top+r.height,t.css({"margin-top":"0px"}),n(t,{"margin-top":"-"+o+"px"},e)}),r("move-from-top",function(t,e){var r,o;return r=w.measure(t),o=r.top+r.height,t.css({"margin-top":"-"+o+"px"}),n(t,{"margin-top":"0px"},e)}),r("move-to-bottom",function(t,e){var r,o;return r=w.measure(t),o=w.clientSize().height-r.top,t.css({"margin-top":"0px"}),n(t,{"margin-top":o+"px"},e)}),r("move-from-bottom",function(t,e){var r,o;return r=w.measure(t),o=w.clientSize().height-r.top,t.css({"margin-top":o+"px"}),n(t,{"margin-top":"0px"},e)}),r("move-to-left",function(t,e){var r,o;return r=w.measure(t),o=r.left+r.width,t.css({"margin-left":"0px"}),n(t,{"margin-left":"-"+o+"px"},e)}),r("move-from-left",function(t,e){var r,o;return r=w.measure(t),o=r.left+r.width,t.css({"margin-left":"-"+o+"px"}),n(t,{"margin-left":"0px"},e)}),r("move-to-right",function(t,e){var r,o;return r=w.measure(t),o=w.clientSize().width-r.left,t.css({"margin-left":"0px"}),n(t,{"margin-left":o+"px"},e)}),r("move-from-right",function(t,e){var r,o;return r=w.measure(t),o=w.clientSize().width-r.left,t.css({"margin-left":o+"px"}),n(t,{"margin-left":"0px"},e)}),r("roll-down",function(t,e){var r,o;return r=t.height(),o=w.temporaryCss(t,{height:"0px",overflow:"hidden"}),n(t,{height:r+"px"},e).then(o)}),y("none",m),y("move-left",function(t,e,r){return v(n(t,"move-to-left",r),n(e,"move-from-right",r))}),y("move-right",function(t,e,r){return v(n(t,"move-to-right",r),n(e,"move-from-left",r))}),y("move-up",function(t,e,r){return v(n(t,"move-to-top",r),n(e,"move-from-bottom",r))}),y("move-down",function(t,e,r){return v(n(t,"move-to-bottom",r),n(e,"move-from-top",r))}),y("cross-fade",function(t,e,r){return v(n(t,"fade-out",r),n(e,"fade-in",r))}),up.bus.on("framework:ready",g),up.bus.on("framework:reset",h),{morph:d,animate:n,animateOptions:e,finish:p,transition:y,animation:r,defaults:l,none:m,when:v}}(),up.transition=up.motion.transition,up.animation=up.motion.animation,up.morph=up.motion.morph,up.animate=up.motion.animate}.call(this),function(){up.proxy=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m,h,v,g,y,b,w,k,x,C,T,E,S,P,A,D,U,F,O,M;return M=up.util,s=void 0,t=void 0,S=void 0,i=void 0,T=void 0,m=void 0,a=void 0,n={busyDelay:300,preloadDelay:75,cacheSize:70,cacheExpiry:3e5},p=function(){return clearTimeout(S),S=null},c=function(){return clearTimeout(i),i=null},A=function(){return s={},t=null,p(),c(),T=0,m=M.copy(n),a=!1},A(),h=function(t){return M.extend(m,t)},l=function(t){return C(t),[t.url,t.method,t.data,t.selector].join("|")},O=function(){var t,n,e;return t=M.keys(s),t.length>m.cacheSize&&(n=null,e=null,M.each(t,function(t){var r,o;return r=s[t],o=r.timestamp,!e||e>o?(n=t,e=o):void 0}),n)?delete s[n]:void 0},F=function(){return(new Date).valueOf()},C=function(t){return t._normalized||(t.method=M.normalizeMethod(t.method),t.url&&(t.url=M.normalizeUrl(t.url)),t.selector||(t.selector="body"),t._normalized=!0),t},o=function(t,n){var e;return M.debug("Aliasing %o to %o",t,n),(e=v(t))?D(n,e):void 0},r=function(t){var n,e,r,o,u;return n=M.castsToTrue(t.cache),e=M.castsToFalse(t.cache),u=M.only(t,"url","method","data","selector","_normalized"),r=!0,b(u)||n?(o=v(u))&&!e?r="pending"===o.state():(o=w(u),D(u,o)):(d(),o=w(u)),r&&!t.preload&&(x(),o.then(k)),o},e=["GET","OPTIONS","HEAD"],g=function(){return 0===T},u=function(){return T>0},x=function(){var t,n;return n=g(),T+=1,n?(t=function(){return u()?(up.bus.emit("proxy:busy"),a=!0):void 0},m.busyDelay>0?i=setTimeout(t,m.busyDelay):t()):void 0},k=function(){return T-=1,g()&&a?(up.bus.emit("proxy:idle"),a=!1):void 0},w=function(t){var n;return up.bus.emit("proxy:load",t),n=M.ajax(t),n.then(function(){return up.bus.emit("proxy:receive",t)}),n},b=function(t){return C(t),M.contains(e,t.method)},y=function(t){var n;return n=F()-t.timestamp,n<m.cacheExpiry},v=function(t){var n,e;return n=l(t),(e=s[n])?y(e)?(M.debug("Cache hit for %o (%o)",t.url,t),e):(M.debug("Discarding stale cache entry for %o (%o)",t.url,t),void P(t)):void M.debug("Cache miss for %o (%o)",t.url,t)},D=function(t,n){var e;return O(),e=l(t),n.timestamp=F(),s[e]=n,n},P=function(t){var n;return n=l(t),delete s[n]},d=function(){return s={}},f=function(n){var e,r;return r=parseInt(M.presentAttr(n,"up-delay"))||m.preloadDelay,n.is(t)?void 0:(t=n,p(),e=function(){return E(n)},U(e,r))},U=function(t,n){return S=setTimeout(t,n)},E=function(t,n){var e,r;return e=$(t),n=M.options(n),r=up.link.followMethod(e,n),b({method:r})?(M.debug("Preloading %o",e),n.preload=!0,up.link.follow(e,n)):(M.debug("Won't preload %o due to unsafe method %o",e,r),M.resolvedPromise())},up.bus.on("framework:reset",A),up.on("mouseover mousedown touchstart","[up-preload]",function(t,n){return up.link.childClicked(t,n)?void 0:f(n)}),{preload:E,ajax:r,get:v,set:D,alias:o,clear:d,remove:P,idle:g,busy:u,defaults:h}}()}.call(this),function(){up.link=function(){var childClicked,follow,followMethod,shouldProcessLinkEvent,u,visit;return u=up.util,visit=function(t,n){return u.debug("Visiting "+t),up.replace("body",t,n)},follow=function(t,n){var e,r,o;return e=$(t),n=u.options(n),o=u.option(e.attr("up-href"),e.attr("href")),r=u.option(n.target,e.attr("up-target"),"body"),n.transition=u.option(n.transition,e.attr("up-transition"),e.attr("up-animation")),n.history=u.option(n.history,e.attr("up-history")),n.scroll=u.option(n.scroll,e.attr("up-scroll"),"body"),n.cache=u.option(n.cache,e.attr("up-cache")),n.method=followMethod(e,n),n=u.merge(n,up.motion.animateOptions(n,e)),up.replace(r,o,n)},followMethod=function(t,n){return n=u.options(n),u.option(n.method,t.attr("up-method"),t.attr("data-method"),"get").toUpperCase()},up.on("click","a[up-target], [up-href][up-target]",function(t,n){return shouldProcessLinkEvent(t,n)?n.is("[up-instant]")?t.preventDefault():(t.preventDefault(),follow(n)):void 0}),up.on("mousedown","a[up-instant], [up-href][up-instant]",function(t,n){return shouldProcessLinkEvent(t,n)?(t.preventDefault(),follow(n)):void 0}),childClicked=function(t,n){var e,r;return e=$(t.target),r=e.closest("a, [up-href]"),r.length&&n.find(r).length},shouldProcessLinkEvent=function(t,n){return u.isUnmodifiedMouseEvent(t)&&!childClicked(t,n)},up.on("click","a[up-follow], [up-href][up-follow]",function(t,n){return shouldProcessLinkEvent(t,n)?n.is("[up-instant]")?t.preventDefault():(t.preventDefault(),follow(n)):void 0}),up.compiler("[up-expand]",function(t){var n,e,r,o,i,a,s,l;for(o=t.find("a, [up-href]").get(0),o||u.error("No link to expand within %o",t),l=/^up-/,a={},a["up-href"]=$(o).attr("href"),s=o.attributes,e=0,r=s.length;r>e;e++)n=s[e],i=n.name,i.match(l)&&(a[i]=n.value);return u.isGiven(a["up-target"])||(a["up-follow"]=""),u.setMissingAttrs(t,a),t.removeAttr("up-expand")}),up.compiler("[up-dash]",function(t){var n,e;return e=t.attr("up-dash"),n={"up-preload":"true","up-instant":"true"},u.isBlank(e)||u.castsToTrue(e)?n["up-follow"]="":n["up-target"]=e,u.setMissingAttrs(t,n),t.removeAttr("up-dash")}),{knife:eval("undefined"!=typeof Knife&&null!==Knife?Knife.point:void 0),visit:visit,follow:follow,childClicked:childClicked,followMethod:followMethod}}(),up.visit=up.link.visit,up.follow=up.link.follow}.call(this),function(){up.form=function(){var observe,submit,u;return u=up.util,submit=function(t,n){var e,r,o,i,a,s,l,c,p,f,d,m;return e=$(t).closest("form"),n=u.options(n),c=u.option(n.target,e.attr("up-target"),"body"),o=u.option(n.failTarget,e.attr("up-fail-target"),function(){return u.createSelectorFromElement(e)}),a=u.option(n.history,e.attr("up-history"),!0),p=u.option(n.transition,e.attr("up-transition")),i=u.option(n.failTransition,e.attr("up-fail-transition"),p),s=u.option(n.method,e.attr("up-method"),e.attr("data-method"),e.attr("method"),"post").toUpperCase(),r=up.motion.animateOptions(n,e),m=u.option(n.cache,e.attr("up-cache")),d=u.option(n.url,e.attr("action"),up.browser.url()),e.addClass("up-active"),up.browser.canPushState()||u.castsToFalse(a)?(l={url:d,method:s,data:e.serialize(),selector:c,cache:m},f=function(t){var n;return d=a?u.castsToFalse(a)?!1:u.isString(a)?a:(n=u.locationFromXhr(t))?n:"GET"===l.type?l.url+"?"+l.data:void 0:void 0,u.option(d,!1)},up.proxy.ajax(l).always(function(){return e.removeClass("up-active")}).done(function(t,n,e){var o;return o=u.merge(r,{history:f(e),transition:p}),up.flow.implant(c,t,o)}).fail(function(t){var n,e;return e=t.responseText,n=u.merge(r,{transition:i}),up.flow.implant(o,e,n)})):void e.get(0).submit()},observe=function(fieldOrSelector,options){var $field,callback,callbackPromise,callbackTimer,changeEvents,check,clearTimer,codeOnChange,delay,knownValue,nextCallback,runNextCallback;return $field=$(fieldOrSelector),options=u.options(options),delay=u.option($field.attr("up-delay"),options.delay,0),delay=parseInt(delay),knownValue=null,callback=null,callbackTimer=null,(codeOnChange=$field.attr("up-observe"))?callback=function(value,$field){return eval(codeOnChange)}:options.change?callback=options.change:u.error("up.observe: No change callback given"),callbackPromise=u.resolvedPromise(),nextCallback=null,runNextCallback=function(){var t;return nextCallback?(t=nextCallback(),nextCallback=null,t):void 0},check=function(){var t,n;return n=$field.val(),t=u.isNull(knownValue),knownValue===n||(knownValue=n,t)?void 0:(clearTimer(),nextCallback=function(){return callback.apply($field.get(0),[n,$field])},callbackTimer=setTimeout(function(){return callbackPromise.then(function(){var t;return t=runNextCallback(),callbackPromise=u.isPromise(t)?t:u.resolvedPromise()})},delay))},clearTimer=function(){return clearTimeout(callbackTimer)},changeEvents=up.browser.canInputEvent()?"input change":"input change keypress paste cut click propertychange",$field.on(changeEvents,check),check(),clearTimer},up.on("submit","form[up-target]",function(t,n){return t.preventDefault(),submit(n)}),up.compiler("[up-observe]",function(t){return observe(t)}),{submit:submit,observe:observe}}(),up.submit=up.form.submit,up.observe=up.form.observe}.call(this),function(){up.popup=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m;return d=up.util,u=void 0,e={openAnimation:"fade-in",closeAnimation:"fade-out",position:"bottom-right"},i=function(t){return d.extend(e,t)},p=function(t,n,e){var r,o;return o=d.measure(t,{full:!0}),r=function(){switch(e){case"bottom-right":return{right:o.right,top:o.top+o.height};case"bottom-left":return{left:o.left,top:o.bottom+o.height};case"top-right":return{right:o.right,bottom:o.top};case"top-left":return{left:o.left,bottom:o.top};default:return d.error("Unknown position %o",e)}}(),n.attr("up-position",e),n.css(r),s(n)},s=function(t){var n,e,r,o,u,i,a;if(e=d.measure(t,{full:!0}),r=null,o=null,e.right<0&&(r=-e.right),e.bottom<0&&(o=-e.bottom),e.left<0&&(r=e.left),e.top<0&&(o=e.top),r&&((u=parseInt(t.css("left")))?t.css("left",u-r):(i=parseInt(t.css("right")))&&t.css("right",i+r)),o){if(a=parseInt(t.css("top")))return t.css("top",a-o);if(n=parseInt(t.css("bottom")))return t.css("bottom",n+o)}},c=function(){var t;return t=$(".up-popup"),t.attr("up-previous-url",up.browser.url()),t.attr("up-previous-title",document.title)},a=function(){var t;return t=$(".up-popup"),t.removeAttr("up-previous-url"),t.removeAttr("up-previous-title")},o=function(t,n,e){var r,o;return o=d.$createElementFromSelector(".up-popup"),e&&o.attr("up-sticky",""),r=d.$createElementFromSelector(n),r.appendTo(o),o.appendTo(document.body),c(),o.hide(),o
|
2
|
+
},m=function(t,n,e,r,o){return n.show(),p(t,n,e),up.animate(n,r,o)},l=function(t,r){var u,i,a,s,l,c,p,f,h;return u=$(t),r=d.options(r),h=d.option(r.url,u.attr("href")),p=d.option(r.target,u.attr("up-popup"),"body"),c=d.option(r.position,u.attr("up-position"),e.position),s=d.option(r.animation,u.attr("up-animation"),e.openAnimation),f=d.option(r.sticky,u.is("[up-sticky]")),l=up.browser.canPushState()?d.option(r.history,u.attr("up-history"),!1):!1,a=up.motion.animateOptions(r,u),n(),i=o(u,p,f),up.replace(p,h,{history:l,insert:function(){return m(u,i,c,s,a)}})},f=function(){return u},n=function(t){var n;return n=$(".up-popup"),n.length?(t=d.options(t,{animation:e.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),u=void 0,up.destroy(n,t)):void 0},t=function(){return $(".up-popup").is("[up-sticky]")?void 0:(a(),n())},r=function(t){var n;return n=$(t),n.closest(".up-popup").length>0},up.on("click","a[up-popup]",function(t,e){return t.preventDefault(),e.is(".up-current")?n():l(e)}),up.on("click","body",function(t){var e;return e=$(t.target),e.closest(".up-popup").length||e.closest("[up-popup]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){var e;return r(n)?(e=n.attr("up-source"))?u=e:void 0:t()}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,e){return e.closest(".up-popup")?n():void 0}),up.bus.on("framework:reset",n),{open:l,close:n,source:f,defaults:i,contains:r}}()}.call(this),function(){var t=[].slice;up.modal=function(){var n,e,r,o,u,i,a,s,l,c,p,f,d,m;return d=up.util,i=void 0,r={width:"auto",height:"auto",openAnimation:"fade-in",closeAnimation:"fade-out",closeLabel:"X",template:function(t){return'<div class="up-modal">\n <div class="up-modal-dialog">\n <div class="up-modal-close" up-close>'+t.closeLabel+'</div>\n <div class="up-modal-content"></div>\n </div>\n</div>'}},a=function(t){return d.extend(r,t)},f=function(){var t;return t=r.template,d.isFunction(t)?t(r):t},c=function(){var t;return t=$(".up-modal"),t.attr("up-previous-url",up.browser.url()),t.attr("up-previous-title",document.title)},s=function(){var t;return t=$(".up-modal"),t.removeAttr("up-previous-url"),t.removeAttr("up-previous-title")},u=function(t,n,e,r){var o,u,i,a;return i=$(f()),r&&i.attr("up-sticky",""),i.attr("up-previous-url",up.browser.url()),i.attr("up-previous-title",document.title),u=i.find(".up-modal-dialog"),d.isPresent(n)&&u.css("width",n),d.isPresent(e)&&u.css("height",e),o=u.find(".up-modal-content"),a=d.$createElementFromSelector(t),a.appendTo(o),i.appendTo(document.body),c(),i.hide(),i},m=function(t,n,e){return t.show(),up.animate(t,n,e)},l=function(){var n,o,i,a,s,l,c,p,f,h,v,g;return s=1<=arguments.length?t.call(arguments,0):[],!d.isObject(s[0])||d.isElement(s[0])||d.isJQuery(s[0])?(n=$(s[0]),p=s[1]):(n=d.nullJquery(),p=s[0]),p=d.options(p),v=d.option(p.url,n.attr("up-href"),n.attr("href")),f=d.option(p.target,n.attr("up-modal"),"body"),g=d.option(p.width,n.attr("up-width"),r.width),l=d.option(p.height,n.attr("up-height"),r.height),a=d.option(p.animation,n.attr("up-animation"),r.openAnimation),h=d.option(p.sticky,n.is("[up-sticky]")),c=up.browser.canPushState()?d.option(p.history,n.attr("up-history"),!0):!1,i=up.motion.animateOptions(p,n),e(),o=u(f,g,l,h),up.replace(f,v,{history:c,insert:function(){return m(o,a,i)}})},p=function(){return i},e=function(t){var n;return n=$(".up-modal"),n.length?(t=d.options(t,{animation:r.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),i=void 0,up.destroy(n,t)):void 0},n=function(){return $(".up-modal").is("[up-sticky]")?void 0:(s(),e())},o=function(t){var n;return n=$(t),n.closest(".up-modal").length>0},up.on("click","a[up-modal]",function(t,n){return t.preventDefault(),n.is(".up-current")?e():l(n)}),up.on("click","body",function(t){var n;return n=$(t.target),n.closest(".up-modal-dialog").length||n.closest("[up-modal]").length?void 0:e()}),up.bus.on("fragment:ready",function(t){var e;if(o(t)){if(e=t.attr("up-source"))return i=e}else if(!up.popup.contains(t))return n()}),up.magic.onEscape(function(){return e()}),up.on("click","[up-close]",function(t,n){return n.closest(".up-modal")?e():void 0}),up.bus.on("framework:reset",e),{open:l,close:e,source:p,defaults:a,contains:o}}()}.call(this),function(){up.tooltip=function(){var t,n,e,r,o;return o=up.util,r=function(t,n,e){var r,u,i;return u=o.measure(t),i=o.measure(n),r=function(){switch(e){case"top":return{left:u.left+.5*(u.width-i.width),top:u.top-i.height};case"bottom":return{left:u.left+.5*(u.width-i.width),top:u.top+u.height};default:return o.error("Unknown position %o",e)}}(),n.attr("up-position",e),n.css(r)},n=function(t){return o.$createElementFromSelector(".up-tooltip").html(t).appendTo(document.body)},e=function(e,u){var i,a,s,l,c,p;return null==u&&(u={}),i=$(e),c=o.option(u.html,i.attr("up-tooltip"),i.attr("title")),p=o.option(u.position,i.attr("up-position"),"top"),l=o.option(u.animation,i.attr("up-animation"),"fade-in"),s=up.motion.animateOptions(u,i),t(),a=n(c),r(i,a,p),up.animate(a,l,s)},t=function(t){var n;return n=$(".up-tooltip"),n.length?(t=o.options(t,{animation:"fade-out"}),t=o.merge(t,up.motion.animateOptions(t)),up.destroy(n,t)):void 0},up.compiler("[up-tooltip]",function(n){return n.on("mouseover",function(){return e(n)}),n.on("mouseout",function(){return t()})}),up.on("click","body",function(){return t()}),up.bus.on("framework:reset",t),up.magic.onEscape(function(){return t()}),{open:e,close:t}}()}.call(this),function(){up.navigation=function(){var t,n,e,r,o,u,i,a,s,l,c,p,f,d,m;return f=up.util,t="up-active",n="up-current",e=["a","[up-href]","[up-alias]"],o=e.join(", "),u=function(){var t,n,r;for(r=[],t=0,n=e.length;n>t;t++)p=e[t],r.push(p+"[up-instant]");return r}().join(", "),r="."+t,s=function(t){return f.isPresent(t)?f.normalizeUrl(t,{search:!1,stripTrailingSlash:!0}):void 0},c=function(t){var n,e,r,o,u,i,a,l;for(i=[],u=["href","up-href"],r=0,o=u.length;o>r;r++)e=u[r],(a=f.presentAttr(t,e))&&i.push(a);return(n=f.presentAttr(t,"up-alias"))&&(l=n.split(" "),i=i.concat(l)),i.map(s)},m=function(t){var n,e,r,o;return t=f.compact(t),r=function(t){return"*"===t.substr(-1)?e(t.slice(0,-1)):n(t)},n=function(n){return f.contains(t,n)},e=function(n){return f.detect(t,function(t){return 0===t.indexOf(n)})},o=function(t){return f.detect(t,r)},{matchesAny:o}},a=function(){var t;return t=m([s(up.browser.url()),s(up.modal.source()),s(up.popup.source())]),f.each($(o),function(e){var r,o;return r=$(e),o=c(r),t.matchesAny(o)?r.addClass(n):r.removeClass(n)})},l=function(n){return d(),n=i(n),n.addClass(t)},i=function(t){return f.presence(t.parents(o))||t},d=function(){return $(r).removeClass(t)},up.on("click",o,function(t,n){return f.isUnmodifiedMouseEvent(t)&&!n.is("[up-instant]")?l(n):void 0}),up.on("mousedown",u,function(t,n){return f.isUnmodifiedMouseEvent(t)?l(n):void 0}),up.bus.on("fragment:ready",function(){return d(),a()}),up.bus.on("fragment:destroy",function(t){return t.is(".up-modal, .up-popup")?a():void 0})}()}.call(this),function(){up.slot=function(){var t,n,e;return e=up.util,n=function(t){return""!==e.trim(t.html())},t=function(t){return e.findWithSelf(t,"[up-slot]").each(function(){var t;return t=$(this),n(t)?void 0:t.hide()})},up.bus.on("fragment:ready",t)}()}.call(this),function(){up.browser.ensureRecentJquery(),up.browser.isSupported()&&(up.browser.ensureConsoleExists(),up.bus.emit("framework:ready"),$(document).on("ready",function(){return up.bus.emit("app:ready")}))}.call(this);
|
@@ -38,8 +38,8 @@ We need to work on this page:
|
|
38
38
|
|
39
39
|
- Decide whether to refactor this into document events
|
40
40
|
- Decide whether `fragment:enter` and `fragment:leave` would be better names
|
41
|
+
- Decide if we wouldn't rather document events in the respective module (e.g. proxy).
|
41
42
|
|
42
|
-
|
43
43
|
@class up.bus
|
44
44
|
###
|
45
45
|
up.bus = (->
|
@@ -79,15 +79,32 @@ up.bus = (->
|
|
79
79
|
event is triggered.
|
80
80
|
|
81
81
|
@method up.bus.on
|
82
|
-
@param {String}
|
83
|
-
|
82
|
+
@param {String} eventNames
|
83
|
+
A space-separated list of event names to match.
|
84
84
|
@param {Function} handler
|
85
|
-
The event handler to be called with the event arguments.
|
85
|
+
The event handler to be called with the event arguments.
|
86
|
+
@return {Function}
|
87
|
+
A function that unregisters the given handlers
|
86
88
|
###
|
87
89
|
# We cannot call this function "on" because Coffeescript
|
88
90
|
# https://makandracards.com/makandra/29733-english-words-that-you-cannot-use-in-coffeescript
|
89
|
-
listen = (
|
90
|
-
|
91
|
+
listen = (eventNames, handler) ->
|
92
|
+
for eventName in eventNames.split(' ')
|
93
|
+
callbacksFor(eventName).push(handler)
|
94
|
+
-> stopListen(eventNames, handler)
|
95
|
+
|
96
|
+
###*
|
97
|
+
Unregisters the given handler from the given events.
|
98
|
+
|
99
|
+
@method up.bus.off
|
100
|
+
@param {String} eventNames
|
101
|
+
A space-separated list of event names .
|
102
|
+
@param {Function} handler
|
103
|
+
The event handler that should stop listening.
|
104
|
+
###
|
105
|
+
stopListen = (eventNames, handler) ->
|
106
|
+
for eventName in eventNames.split(' ')
|
107
|
+
u.remove(callbacksFor(eventName), handler)
|
91
108
|
|
92
109
|
###*
|
93
110
|
Triggers an event over the framework bus.
|
@@ -123,5 +140,6 @@ up.bus = (->
|
|
123
140
|
listen 'framework:reset', reset
|
124
141
|
|
125
142
|
on: listen
|
143
|
+
off: stopListen
|
126
144
|
emit: emit
|
127
145
|
)()
|
@@ -4,7 +4,7 @@ Caching and preloading
|
|
4
4
|
|
5
5
|
All HTTP requests go through the Up.js proxy.
|
6
6
|
It caches a [limited](/up.proxy#up.proxy.defaults) number of server responses
|
7
|
-
|
7
|
+
for a [limited](/up.proxy#up.proxy.defaults) amount of time,
|
8
8
|
making requests to these URLs return insantly.
|
9
9
|
|
10
10
|
The cache is cleared whenever the user makes a non-`GET` request
|
@@ -13,17 +13,78 @@ The cache is cleared whenever the user makes a non-`GET` request
|
|
13
13
|
The proxy can also used to speed up reaction times by preloading
|
14
14
|
links when the user hovers over the click area (or puts the mouse/finger
|
15
15
|
down before releasing). This way the
|
16
|
-
response will already be cached when the user performs the click.
|
16
|
+
response will already be cached when the user performs the click.
|
17
|
+
|
18
|
+
Spinners
|
19
|
+
---------
|
20
|
+
|
21
|
+
You can listen to [framework events](/up.bus) to implement a spinner
|
22
|
+
(progress indicator) that appears during a long-running request,
|
23
|
+
and disappears once the response has been received:
|
24
|
+
|
25
|
+
<div class="spinner">Please wait!</div>
|
26
|
+
|
27
|
+
Here is the Javascript to make it alive:
|
28
|
+
|
29
|
+
up.compiler('.spinner', function($element) {
|
30
|
+
|
31
|
+
show = function() { $element.show() };
|
32
|
+
hide = function() { $element.hide() };
|
33
|
+
|
34
|
+
up.bus.on('proxy:busy', show);
|
35
|
+
up.bus.on('proxy:idle', hide);
|
36
|
+
|
37
|
+
return function() {
|
38
|
+
up.bus.off('proxy:busy', show);
|
39
|
+
up.bus.off('proxy:idle', hide);
|
40
|
+
};
|
41
|
+
|
42
|
+
});
|
43
|
+
|
44
|
+
The `proxy:busy` event will be emitted after a delay of 300 ms
|
45
|
+
to prevent the spinner from flickering on and off.
|
46
|
+
You can change (or remove) this delay like this:
|
47
|
+
|
48
|
+
up.proxy.defaults({ busyDelay: 150 });
|
17
49
|
|
18
50
|
@class up.proxy
|
19
51
|
###
|
20
52
|
up.proxy = (->
|
21
53
|
|
22
|
-
|
54
|
+
u = up.util
|
55
|
+
|
56
|
+
cache = undefined
|
57
|
+
$waitingLink = undefined
|
58
|
+
preloadDelayTimer = undefined
|
59
|
+
busyDelayTimer = undefined
|
60
|
+
pendingCount = undefined
|
61
|
+
config = undefined
|
62
|
+
busyEventEmitted = undefined
|
63
|
+
FACTORY_CONFIG =
|
64
|
+
busyDelay: 300
|
23
65
|
preloadDelay: 75
|
24
66
|
cacheSize: 70
|
25
67
|
cacheExpiry: 1000 * 60 * 5
|
26
68
|
|
69
|
+
cancelPreloadDelay = ->
|
70
|
+
clearTimeout(preloadDelayTimer)
|
71
|
+
preloadDelayTimer = null
|
72
|
+
|
73
|
+
cancelBusyDelay = ->
|
74
|
+
clearTimeout(busyDelayTimer)
|
75
|
+
busyDelayTimer = null
|
76
|
+
|
77
|
+
reset = ->
|
78
|
+
cache = {}
|
79
|
+
$waitingLink = null
|
80
|
+
cancelPreloadDelay()
|
81
|
+
cancelBusyDelay()
|
82
|
+
pendingCount = 0
|
83
|
+
config = u.copy(FACTORY_CONFIG)
|
84
|
+
busyEventEmitted = false
|
85
|
+
|
86
|
+
reset()
|
87
|
+
|
27
88
|
###*
|
28
89
|
@method up.proxy.defaults
|
29
90
|
@param {Number} [options.preloadDelay=75]
|
@@ -35,17 +96,13 @@ up.proxy = (->
|
|
35
96
|
@param {Number} [options.cacheExpiry=300000]
|
36
97
|
The number of milliseconds until a cache entry expires.
|
37
98
|
Defaults to 5 minutes.
|
99
|
+
@param {Number} [options.busyDelay=300]
|
100
|
+
How long the proxy waits until emitting the `proxy:busy` [event](/up.bus).
|
101
|
+
Use this to prevent flickering of spinners.
|
38
102
|
###
|
39
103
|
defaults = (options) ->
|
40
104
|
u.extend(config, options)
|
41
|
-
|
42
|
-
cache = {}
|
43
|
-
|
44
|
-
u = up.util
|
45
|
-
|
46
|
-
$waitingLink = null
|
47
|
-
delayTimer = null
|
48
|
-
|
105
|
+
|
49
106
|
cacheKey = (request) ->
|
50
107
|
normalizeRequest(request)
|
51
108
|
[ request.url,
|
@@ -82,7 +139,7 @@ up.proxy = (->
|
|
82
139
|
u.debug("Aliasing %o to %o", oldRequest, newRequest)
|
83
140
|
if promise = get(oldRequest)
|
84
141
|
set(newRequest, promise)
|
85
|
-
|
142
|
+
|
86
143
|
###*
|
87
144
|
Makes a request to the given URL and caches the response.
|
88
145
|
If the response was already cached, returns the HTML instantly.
|
@@ -91,6 +148,11 @@ up.proxy = (->
|
|
91
148
|
not be cached and the entire cache will be cleared.
|
92
149
|
Only requests with a method of `GET`, `OPTIONS` and `HEAD`
|
93
150
|
are considered to be read-only.
|
151
|
+
|
152
|
+
If a network connection is attempted, the proxy will emit
|
153
|
+
a `proxy:load` event with the `request` as its argument.
|
154
|
+
Once the response is received, a `proxy:receive` event will
|
155
|
+
be emitted.
|
94
156
|
|
95
157
|
@method up.proxy.ajax
|
96
158
|
@param {String} request.url
|
@@ -106,23 +168,91 @@ up.proxy = (->
|
|
106
168
|
|
107
169
|
request = u.only(options, 'url', 'method', 'data', 'selector', '_normalized')
|
108
170
|
|
171
|
+
pending = true
|
172
|
+
|
109
173
|
# We don't cache non-GET responses unless `options.cache`
|
110
174
|
# is explicitly set to `true`.
|
111
175
|
if !isIdempotent(request) && !forceCache
|
112
176
|
clear()
|
113
|
-
promise =
|
177
|
+
promise = load(request)
|
114
178
|
# If a cached response is available, we use it unless
|
115
179
|
# `options.cache` is explicitly set to `false`.
|
116
180
|
else if (promise = get(request)) && !ignoreCache
|
117
|
-
promise
|
181
|
+
pending = (promise.state() == 'pending')
|
118
182
|
else
|
119
|
-
promise =
|
183
|
+
promise = load(request)
|
120
184
|
set(request, promise)
|
121
185
|
|
186
|
+
if pending && !options.preload
|
187
|
+
# This will actually make `pendingCount` higher than the actual
|
188
|
+
# number of outstanding requests. However, we need to cover the
|
189
|
+
# following case:
|
190
|
+
#
|
191
|
+
# - User starts preloading a request.
|
192
|
+
# This triggers *no* `proxy:busy`.
|
193
|
+
# - User starts loading the request (without preloading).
|
194
|
+
# This triggers `proxy:busy`.
|
195
|
+
# - The request finishes.
|
196
|
+
# This triggers `proxy:idle`.
|
197
|
+
loadStarted()
|
198
|
+
promise.then(loadEnded)
|
199
|
+
|
122
200
|
promise
|
123
201
|
|
124
202
|
SAFE_HTTP_METHODS = ['GET', 'OPTIONS', 'HEAD']
|
125
|
-
|
203
|
+
|
204
|
+
###*
|
205
|
+
Returns `true` if the proxy is not currently waiting
|
206
|
+
for a request to finish. Returns `false` otherwise.
|
207
|
+
|
208
|
+
The proxy will also emit an `proxy:idle` [event](/up.bus) if it
|
209
|
+
used to busy, but is now idle.
|
210
|
+
|
211
|
+
@method up.proxy.idle
|
212
|
+
@return {Boolean} Whether the proxy is idle
|
213
|
+
###
|
214
|
+
idle = ->
|
215
|
+
pendingCount == 0
|
216
|
+
|
217
|
+
###*
|
218
|
+
Returns `true` if the proxy is currently waiting
|
219
|
+
for a request to finish. Returns `false` otherwise.
|
220
|
+
|
221
|
+
The proxy will also emit an `proxy:busy` [event](/up.bus) if it
|
222
|
+
used to idle, but is now busy.
|
223
|
+
|
224
|
+
@method up.proxy.busy
|
225
|
+
@return {Boolean} Whether the proxy is busy
|
226
|
+
###
|
227
|
+
busy = ->
|
228
|
+
pendingCount > 0
|
229
|
+
|
230
|
+
loadStarted = ->
|
231
|
+
wasIdle = idle()
|
232
|
+
pendingCount += 1
|
233
|
+
if wasIdle
|
234
|
+
emission = ->
|
235
|
+
if busy() # a fast response might have beaten the delay
|
236
|
+
up.bus.emit('proxy:busy')
|
237
|
+
busyEventEmitted = true
|
238
|
+
if config.busyDelay > 0
|
239
|
+
busyDelayTimer = setTimeout(emission, config.busyDelay)
|
240
|
+
else
|
241
|
+
emission()
|
242
|
+
|
243
|
+
loadEnded = ->
|
244
|
+
pendingCount -= 1
|
245
|
+
if idle() && busyEventEmitted
|
246
|
+
up.bus.emit('proxy:idle')
|
247
|
+
busyEventEmitted = false
|
248
|
+
|
249
|
+
load = (request) ->
|
250
|
+
up.bus.emit('proxy:load', request)
|
251
|
+
promise = u.ajax(request)
|
252
|
+
promise.then ->
|
253
|
+
up.bus.emit('proxy:receive', request)
|
254
|
+
promise
|
255
|
+
|
126
256
|
isIdempotent = (request) ->
|
127
257
|
normalizeRequest(request)
|
128
258
|
u.contains(SAFE_HTTP_METHODS, request.method)
|
@@ -180,16 +310,12 @@ up.proxy = (->
|
|
180
310
|
delay = parseInt(u.presentAttr($link, 'up-delay')) || config.preloadDelay
|
181
311
|
unless $link.is($waitingLink)
|
182
312
|
$waitingLink = $link
|
183
|
-
|
313
|
+
cancelPreloadDelay()
|
184
314
|
curriedPreload = -> preload($link)
|
185
|
-
|
315
|
+
startPreloadDelay(curriedPreload, delay)
|
186
316
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
cancelDelay = ->
|
191
|
-
clearTimeout(delayTimer)
|
192
|
-
delayTimer = null
|
317
|
+
startPreloadDelay = (block, delay) ->
|
318
|
+
preloadDelayTimer = setTimeout(block, delay)
|
193
319
|
|
194
320
|
###*
|
195
321
|
@protected
|
@@ -209,10 +335,6 @@ up.proxy = (->
|
|
209
335
|
else
|
210
336
|
u.debug("Won't preload %o due to unsafe method %o", $link, method)
|
211
337
|
u.resolvedPromise()
|
212
|
-
|
213
|
-
reset = ->
|
214
|
-
cancelDelay()
|
215
|
-
cache = {}
|
216
338
|
|
217
339
|
up.bus.on 'framework:reset', reset
|
218
340
|
|
@@ -244,6 +366,8 @@ up.proxy = (->
|
|
244
366
|
alias: alias
|
245
367
|
clear: clear
|
246
368
|
remove: remove
|
369
|
+
idle: idle
|
370
|
+
busy: busy
|
247
371
|
defaults: defaults
|
248
372
|
|
249
373
|
)()
|
@@ -568,6 +568,12 @@ up.util = (->
|
|
568
568
|
if isMissing($element.attr(key))
|
569
569
|
$element.attr(key, value)
|
570
570
|
|
571
|
+
remove = (array, element) ->
|
572
|
+
index = array.indexOf(element)
|
573
|
+
if index >= 0
|
574
|
+
array.splice(index, 1)
|
575
|
+
element
|
576
|
+
|
571
577
|
presentAttr: presentAttr
|
572
578
|
createElement: createElement
|
573
579
|
normalizeUrl: normalizeUrl
|
@@ -637,5 +643,6 @@ up.util = (->
|
|
637
643
|
resolvedDeferred: resolvedDeferred
|
638
644
|
resolvableWhen: resolvableWhen
|
639
645
|
setMissingAttrs: setMissingAttrs
|
646
|
+
remove: remove
|
640
647
|
|
641
648
|
)()
|
data/lib/upjs/rails/version.rb
CHANGED
data/spec_app/Gemfile.lock
CHANGED
@@ -86,6 +86,146 @@ describe 'up.proxy', ->
|
|
86
86
|
it "caches #{method} requests with cache: true option", ->
|
87
87
|
u.times 2, -> up.proxy.ajax(url: '/foo', method: method, cache: true)
|
88
88
|
expect(jasmine.Ajax.requests.count()).toEqual(1)
|
89
|
+
|
90
|
+
describe 'events', ->
|
91
|
+
|
92
|
+
beforeEach ->
|
93
|
+
up.proxy.defaults(busyDelay: 0)
|
94
|
+
@events = []
|
95
|
+
u.each ['proxy:load', 'proxy:receive', 'proxy:busy', 'proxy:idle'], (eventName) =>
|
96
|
+
up.bus.on eventName, =>
|
97
|
+
@events.push eventName
|
98
|
+
|
99
|
+
it 'emits an proxy:busy event once the proxy started loading, and proxy:idle if it is done loading', ->
|
100
|
+
|
101
|
+
up.proxy.ajax(url: '/foo')
|
102
|
+
|
103
|
+
expect(@events).toEqual([
|
104
|
+
'proxy:load',
|
105
|
+
'proxy:busy'
|
106
|
+
])
|
107
|
+
|
108
|
+
up.proxy.ajax(url: '/bar')
|
109
|
+
|
110
|
+
expect(@events).toEqual([
|
111
|
+
'proxy:load',
|
112
|
+
'proxy:busy',
|
113
|
+
'proxy:load'
|
114
|
+
])
|
115
|
+
|
116
|
+
jasmine.Ajax.requests.at(0).respondWith
|
117
|
+
status: 200
|
118
|
+
contentType: 'text/html'
|
119
|
+
responseText: 'foo'
|
120
|
+
|
121
|
+
expect(@events).toEqual([
|
122
|
+
'proxy:load',
|
123
|
+
'proxy:busy',
|
124
|
+
'proxy:load',
|
125
|
+
'proxy:receive'
|
126
|
+
])
|
127
|
+
|
128
|
+
jasmine.Ajax.requests.at(1).respondWith
|
129
|
+
status: 200
|
130
|
+
contentType: 'text/html'
|
131
|
+
responseText: 'bar'
|
132
|
+
|
133
|
+
expect(@events).toEqual([
|
134
|
+
'proxy:load',
|
135
|
+
'proxy:busy',
|
136
|
+
'proxy:load',
|
137
|
+
'proxy:receive',
|
138
|
+
'proxy:receive',
|
139
|
+
'proxy:idle'
|
140
|
+
])
|
141
|
+
|
142
|
+
it 'does not emit an proxy:busy event if preloading', ->
|
143
|
+
|
144
|
+
# A request for preloading preloading purposes
|
145
|
+
# doesn't make us busy.
|
146
|
+
up.proxy.ajax(url: '/foo', preload: true)
|
147
|
+
expect(@events).toEqual([
|
148
|
+
'proxy:load'
|
149
|
+
])
|
150
|
+
expect(up.proxy.busy()).toBe(false)
|
151
|
+
|
152
|
+
# The same request with preloading does make us busy.
|
153
|
+
up.proxy.ajax(url: '/foo')
|
154
|
+
expect(@events).toEqual([
|
155
|
+
'proxy:load',
|
156
|
+
'proxy:busy'
|
157
|
+
])
|
158
|
+
expect(up.proxy.busy()).toBe(true)
|
159
|
+
|
160
|
+
# The response resolves both promises and makes
|
161
|
+
# the proxy idle again.
|
162
|
+
jasmine.Ajax.requests.at(0).respondWith
|
163
|
+
status: 200
|
164
|
+
contentType: 'text/html'
|
165
|
+
responseText: 'foo'
|
166
|
+
expect(@events).toEqual([
|
167
|
+
'proxy:load',
|
168
|
+
'proxy:busy',
|
169
|
+
'proxy:receive',
|
170
|
+
'proxy:idle'
|
171
|
+
])
|
172
|
+
expect(up.proxy.busy()).toBe(false)
|
173
|
+
|
174
|
+
it 'can delay the proxy:busy event to prevent flickering of spinners', ->
|
175
|
+
jasmine.clock().install()
|
176
|
+
up.proxy.defaults(busyDelay: 100)
|
177
|
+
|
178
|
+
up.proxy.ajax(url: '/foo')
|
179
|
+
expect(@events).toEqual([
|
180
|
+
'proxy:load'
|
181
|
+
])
|
182
|
+
|
183
|
+
jasmine.clock().tick(50)
|
184
|
+
expect(@events).toEqual([
|
185
|
+
'proxy:load'
|
186
|
+
])
|
187
|
+
|
188
|
+
jasmine.clock().tick(50)
|
189
|
+
expect(@events).toEqual([
|
190
|
+
'proxy:load',
|
191
|
+
'proxy:busy'
|
192
|
+
])
|
193
|
+
|
194
|
+
jasmine.Ajax.requests.at(0).respondWith
|
195
|
+
status: 200
|
196
|
+
contentType: 'text/html'
|
197
|
+
responseText: 'foo'
|
198
|
+
|
199
|
+
expect(@events).toEqual([
|
200
|
+
'proxy:load',
|
201
|
+
'proxy:busy',
|
202
|
+
'proxy:receive',
|
203
|
+
'proxy:idle'
|
204
|
+
])
|
205
|
+
|
206
|
+
it 'does not emit proxy:idle if a delayed proxy:busy was never emitted due to a fast response', ->
|
207
|
+
jasmine.clock().install()
|
208
|
+
up.proxy.defaults(busyDelay: 100)
|
209
|
+
|
210
|
+
up.proxy.ajax(url: '/foo')
|
211
|
+
expect(@events).toEqual([
|
212
|
+
'proxy:load'
|
213
|
+
])
|
214
|
+
|
215
|
+
jasmine.clock().tick(50)
|
216
|
+
|
217
|
+
jasmine.Ajax.requests.at(0).respondWith
|
218
|
+
status: 200
|
219
|
+
contentType: 'text/html'
|
220
|
+
responseText: 'foo'
|
221
|
+
|
222
|
+
jasmine.clock().tick(100)
|
223
|
+
|
224
|
+
expect(@events).toEqual([
|
225
|
+
'proxy:load',
|
226
|
+
'proxy:receive'
|
227
|
+
])
|
228
|
+
|
89
229
|
|
90
230
|
describe 'up.proxy.preload', ->
|
91
231
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upjs-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henning Koch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|