upjs-rails 0.6.5 → 0.7.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/README.md +4 -6
- data/dist/up.js +158 -92
- data/dist/up.min.js +2 -2
- data/lib/assets/javascripts/up/link.js.coffee +80 -64
- data/lib/assets/javascripts/up/modal.js.coffee +1 -1
- data/lib/assets/javascripts/up/navigation.js.coffee +71 -23
- data/lib/assets/javascripts/up/proxy.js.coffee +2 -5
- data/lib/upjs/rails/version.rb +1 -1
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +20 -9
- data/spec_app/spec/javascripts/up/navigation_spec.js.coffee +4 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f53141ffd99539ab7bc215ba15ab960e977dd880
|
4
|
+
data.tar.gz: 8239bca9c301220a7a9a8b40e1ec5b0ee70e37d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ac8d0ad08fd44a6bd63bfe67a11e7388ec79af88659cda42995e64c3687ddf390bdddb13b0a4995b8336eff19d2bc7042c9780ce0fd9478f02d9e94cb3c38ef
|
7
|
+
data.tar.gz: 91d72658bc7b13e5966223a885fb6c169fe60c0464e818c6f4b472eecdee52a51bd7b0d30b8c954faa1f7fae91038f02d482b35845fea8d222fb2667d70b3329
|
data/README.md
CHANGED
@@ -33,15 +33,13 @@ We are currently feeding three release channels:
|
|
33
33
|
- Bower
|
34
34
|
- Rubygems (as the `upjs-rails` gem)
|
35
35
|
|
36
|
-
To make a new
|
36
|
+
To make a new release:
|
37
37
|
|
38
38
|
- Edit `lib/upjs/rails/version.rb` and bump the version number. Use [semantic versioning](http://semver.org/).
|
39
39
|
- Commit and push the version bump
|
40
|
+
- From the project root, type `rake assets:compile`. This will output minified JS and CSS files to the `dist` folder.
|
41
|
+
- Commit and push the generated files
|
40
42
|
- From the project root, type `rake release`. This will publish a new gem version to Rubygems.org.
|
41
43
|
It will also push a tag for this version, which Bower requires for its own versioning scheme.
|
42
|
-
|
43
|
-
Now make the release for manual download and bower:
|
44
44
|
|
45
|
-
|
46
|
-
- This will output minified JS and CSS files to the `dist` folder
|
47
|
-
- Commit and push the generated files
|
45
|
+
Always run `rake assets:compile` before `rake release` so the git tag points to the correct commit (required for Bower versioning).
|
data/dist/up.js
CHANGED
@@ -2627,7 +2627,7 @@ response will already be cached when the user performs the click.
|
|
2627
2627
|
|
2628
2628
|
(function() {
|
2629
2629
|
up.proxy = (function() {
|
2630
|
-
var $waitingLink, SAFE_HTTP_METHODS, ajax, alias, cache, cacheKey, cancelDelay, checkPreload, clear, config, defaults, delayTimer,
|
2630
|
+
var $waitingLink, SAFE_HTTP_METHODS, ajax, alias, cache, cacheKey, cancelDelay, checkPreload, clear, config, defaults, delayTimer, get, isFresh, isIdempotent, normalizeRequest, preload, remove, reset, set, startDelay, timestamp, trim, u;
|
2631
2631
|
config = {
|
2632
2632
|
preloadDelay: 75,
|
2633
2633
|
cacheSize: 70,
|
@@ -2740,9 +2740,6 @@ response will already be cached when the user performs the click.
|
|
2740
2740
|
normalizeRequest(request);
|
2741
2741
|
return u.contains(SAFE_HTTP_METHODS, request.method);
|
2742
2742
|
};
|
2743
|
-
ensureIsIdempotent = function(request) {
|
2744
|
-
return isIdempotent(request) || u.error("Won't preload non-GET request %o", request);
|
2745
|
-
};
|
2746
2743
|
isFresh = function(promise) {
|
2747
2744
|
var timeSinceTouch;
|
2748
2745
|
timeSinceTouch = timestamp() - promise.timestamp;
|
@@ -2865,7 +2862,7 @@ response will already be cached when the user performs the click.
|
|
2865
2862
|
*/
|
2866
2863
|
up.on('mouseover mousedown touchstart', '[up-preload]', function(event, $element) {
|
2867
2864
|
if (!up.link.childClicked(event, $element)) {
|
2868
|
-
return checkPreload(
|
2865
|
+
return checkPreload($element);
|
2869
2866
|
}
|
2870
2867
|
});
|
2871
2868
|
return {
|
@@ -2968,7 +2965,7 @@ Read on
|
|
2968
2965
|
|
2969
2966
|
(function() {
|
2970
2967
|
up.link = (function() {
|
2971
|
-
var childClicked, follow, followMethod,
|
2968
|
+
var childClicked, follow, followMethod, shouldProcessLinkEvent, u, visit;
|
2972
2969
|
u = up.util;
|
2973
2970
|
|
2974
2971
|
/**
|
@@ -3028,7 +3025,7 @@ Read on
|
|
3028
3025
|
var $link, selector, url;
|
3029
3026
|
$link = $(link);
|
3030
3027
|
options = u.options(options);
|
3031
|
-
url = u.option($link.attr('href'), $link.attr('up-
|
3028
|
+
url = u.option($link.attr('href'), $link.attr('up-href'));
|
3032
3029
|
selector = u.option(options.target, $link.attr('up-target'), 'body');
|
3033
3030
|
options.transition = u.option(options.transition, $link.attr('up-transition'), $link.attr('up-animation'));
|
3034
3031
|
options.history = u.option(options.history, $link.attr('up-history'));
|
@@ -3047,16 +3044,6 @@ Read on
|
|
3047
3044
|
options = u.options(options);
|
3048
3045
|
return u.option(options.method, $link.attr('up-method'), $link.attr('data-method'), 'get').toUpperCase();
|
3049
3046
|
};
|
3050
|
-
resolve = function(element) {
|
3051
|
-
var $element, followAttr;
|
3052
|
-
$element = $(element);
|
3053
|
-
followAttr = $element.attr('up-follow');
|
3054
|
-
if ($element.is('a') || (u.isPresent(followAttr) && !u.castsToTrue(followAttr))) {
|
3055
|
-
return $element;
|
3056
|
-
} else {
|
3057
|
-
return $element.find('a:first');
|
3058
|
-
}
|
3059
|
-
};
|
3060
3047
|
|
3061
3048
|
/**
|
3062
3049
|
Follows this link via AJAX and replaces a CSS selector in the current page
|
@@ -3095,27 +3082,25 @@ Read on
|
|
3095
3082
|
Load more tasks
|
3096
3083
|
</a>
|
3097
3084
|
|
3098
|
-
\#\#\#\# Following
|
3085
|
+
\#\#\#\# Following elements that are no links
|
3099
3086
|
|
3100
|
-
|
3101
|
-
|
3087
|
+
You can also use `[up-target]` to turn an arbitrary element into a link.
|
3088
|
+
In this case, put the link's destination into the `up-href` attribute:
|
3102
3089
|
|
3103
|
-
<
|
3090
|
+
<button up-target=".main" up-href="/foo/bar">Go</button>
|
3104
3091
|
|
3105
|
-
Note that using
|
3106
|
-
|
3107
|
-
navigation actions this isn't needed. E.g. popular operation
|
3108
|
-
systems switch tabs on `mousedown`.
|
3092
|
+
Note that using any element other than `<a>` will prevent users from
|
3093
|
+
opening the destination in a new tab.
|
3109
3094
|
|
3110
|
-
@method
|
3095
|
+
@method [up-target]
|
3111
3096
|
@ujs
|
3112
3097
|
@param {String} up-target
|
3113
3098
|
The CSS selector to replace
|
3114
|
-
@param up-
|
3115
|
-
|
3116
|
-
|
3099
|
+
@param [up-href]
|
3100
|
+
The destination URL to follow.
|
3101
|
+
If omitted, the the link's `href` attribute will be used.
|
3117
3102
|
*/
|
3118
|
-
up.on('click', '
|
3103
|
+
up.on('click', '[up-target]', function(event, $link) {
|
3119
3104
|
if (shouldProcessLinkEvent(event, $link)) {
|
3120
3105
|
if ($link.is('[up-instant]')) {
|
3121
3106
|
return event.preventDefault();
|
@@ -3125,10 +3110,30 @@ Read on
|
|
3125
3110
|
}
|
3126
3111
|
}
|
3127
3112
|
});
|
3128
|
-
|
3113
|
+
|
3114
|
+
/**
|
3115
|
+
By adding an `up-instant` attribute to a link, the destination will be
|
3116
|
+
fetched on `mousedown` instead of `click` (`mouseup`).
|
3117
|
+
|
3118
|
+
<a href="/users" up-target=".main" up-instant>User list</a>
|
3119
|
+
|
3120
|
+
This will save precious milliseconds that otherwise spent
|
3121
|
+
on waiting for the user to release the mouse button. Since an
|
3122
|
+
AJAX request will be triggered right way, the interaction will
|
3123
|
+
appear faster.
|
3124
|
+
|
3125
|
+
Note that using `[up-instant]` will prevent a user from canceling a link
|
3126
|
+
click by moving the mouse away from the interaction area. However, for
|
3127
|
+
navigation actions this isn't needed. E.g. popular operation
|
3128
|
+
systems switch tabs on `mousedown` instead of `click`.
|
3129
|
+
|
3130
|
+
@method [up-instant]
|
3131
|
+
@ujs
|
3132
|
+
*/
|
3133
|
+
up.on('mousedown', '[up-instant]', function(event, $link) {
|
3129
3134
|
if (shouldProcessLinkEvent(event, $link)) {
|
3130
3135
|
event.preventDefault();
|
3131
|
-
return
|
3136
|
+
return follow($link);
|
3132
3137
|
}
|
3133
3138
|
});
|
3134
3139
|
|
@@ -3148,40 +3153,31 @@ Read on
|
|
3148
3153
|
|
3149
3154
|
/**
|
3150
3155
|
If applied on a link, Follows this link via AJAX and replaces the
|
3151
|
-
current `<body>` element with the response's `<body>` element
|
3156
|
+
current `<body>` element with the response's `<body>` element.
|
3152
3157
|
|
3153
|
-
|
3158
|
+
Example:
|
3154
3159
|
|
3155
|
-
|
3160
|
+
<a href="/users" up-follow>User list</a>
|
3156
3161
|
|
3157
|
-
|
3158
|
-
|
3162
|
+
To only update a fragment instead of the entire page,
|
3163
|
+
see [`up-target`](#up-target).
|
3159
3164
|
|
3160
|
-
|
3165
|
+
\#\#\#\# Turn any element into a link
|
3161
3166
|
|
3162
|
-
|
3163
|
-
|
3164
|
-
navigation actions this isn't needed. E.g. popular operation
|
3165
|
-
systems switch tabs on `mousedown`.
|
3167
|
+
You can also use `[up-follow]` to turn an arbitrary element into a link.
|
3168
|
+
In this case, put the link's destination into the `up-href` attribute:
|
3166
3169
|
|
3167
|
-
|
3170
|
+
<span up-follow up-href="/foo/bar">Go</span>
|
3168
3171
|
|
3169
|
-
|
3170
|
-
|
3171
|
-
|
3172
|
-
<div class="notification" up-follow>
|
3173
|
-
Record was saved!
|
3174
|
-
<a href="/records">Close</a>
|
3175
|
-
</div>
|
3176
|
-
|
3177
|
-
In the example above, clicking anywhere within `.notification` element
|
3178
|
-
would follow the *Close* link.
|
3172
|
+
Note that using any element other than `<a>` will prevent users from
|
3173
|
+
opening the destination in a new tab.
|
3179
3174
|
|
3180
3175
|
@method [up-follow]
|
3181
3176
|
@ujs
|
3182
3177
|
@param {String} [up-follow]
|
3183
|
-
@param up-
|
3184
|
-
|
3178
|
+
@param [up-href]
|
3179
|
+
The destination URL to follow.
|
3180
|
+
If omitted, the the link's `href` attribute will be used.
|
3185
3181
|
*/
|
3186
3182
|
up.on('click', '[up-follow]', function(event, $link) {
|
3187
3183
|
if (shouldProcessLinkEvent(event, $link)) {
|
@@ -3189,15 +3185,45 @@ Read on
|
|
3189
3185
|
return event.preventDefault();
|
3190
3186
|
} else {
|
3191
3187
|
event.preventDefault();
|
3192
|
-
return follow(
|
3188
|
+
return follow($link);
|
3193
3189
|
}
|
3194
3190
|
}
|
3195
3191
|
});
|
3196
|
-
|
3197
|
-
|
3198
|
-
|
3199
|
-
|
3192
|
+
|
3193
|
+
/**
|
3194
|
+
Add an `up-expand` class to any element that contains a link
|
3195
|
+
in order to enlarge the link's click area:
|
3196
|
+
|
3197
|
+
<div class="notification" up-expand>
|
3198
|
+
Record was saved!
|
3199
|
+
<a href="/records">Close</a>
|
3200
|
+
</div>
|
3201
|
+
|
3202
|
+
In the example above, clicking anywhere within `.notification` element
|
3203
|
+
would [follow](#up-follow) the *Close* link.
|
3204
|
+
|
3205
|
+
`up-expand` honors all the UJS behavior in expanded links
|
3206
|
+
(`up-target`, `up-instant`, `up-preload`, etc.).
|
3207
|
+
|
3208
|
+
@ujs
|
3209
|
+
@method [up-expand]
|
3210
|
+
*/
|
3211
|
+
up.compiler('[up-expand]', function($fragment) {
|
3212
|
+
var attribute, i, len, link, name, newAttrs, ref, upAttributePattern;
|
3213
|
+
link = $fragment.find('[up-href], [href]').get(0);
|
3214
|
+
link || u.error('No link to expand within %o', $fragment);
|
3215
|
+
upAttributePattern = /^up-/;
|
3216
|
+
newAttrs = {};
|
3217
|
+
ref = link.attributes;
|
3218
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
3219
|
+
attribute = ref[i];
|
3220
|
+
name = attribute.name;
|
3221
|
+
if (name === 'href' || name.match(upAttributePattern)) {
|
3222
|
+
newAttrs[name] = attribute.value;
|
3223
|
+
}
|
3200
3224
|
}
|
3225
|
+
u.setMissingAttrs($fragment, newAttrs);
|
3226
|
+
return $fragment.removeAttr('up-expand');
|
3201
3227
|
});
|
3202
3228
|
|
3203
3229
|
/**
|
@@ -3216,14 +3242,6 @@ Read on
|
|
3216
3242
|
|
3217
3243
|
<a href="/users" up-target=".main" up-instant up-preload>User list</a>
|
3218
3244
|
|
3219
|
-
You can also apply `[up-dash]` to any element that contains a link
|
3220
|
-
in order to enlarge the link's click area:
|
3221
|
-
|
3222
|
-
<div class="notification" up-dash>
|
3223
|
-
Record was saved!
|
3224
|
-
<a href="/records" up-dash='.main'>Close</a>
|
3225
|
-
</div>
|
3226
|
-
|
3227
3245
|
@method [up-dash]
|
3228
3246
|
@ujs
|
3229
3247
|
*/
|
@@ -3246,7 +3264,6 @@ Read on
|
|
3246
3264
|
knife: eval(typeof Knife !== "undefined" && Knife !== null ? Knife.point : void 0),
|
3247
3265
|
visit: visit,
|
3248
3266
|
follow: follow,
|
3249
|
-
resolve: resolve,
|
3250
3267
|
childClicked: childClicked,
|
3251
3268
|
followMethod: followMethod
|
3252
3269
|
};
|
@@ -4020,7 +4037,7 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4020
4037
|
options = args[1];
|
4021
4038
|
}
|
4022
4039
|
options = u.options(options);
|
4023
|
-
url = u.option(options.url, $link.attr('href'), $link.attr('
|
4040
|
+
url = u.option(options.url, $link.attr('up-href'), $link.attr('href'));
|
4024
4041
|
selector = u.option(options.target, $link.attr('up-modal'), 'body');
|
4025
4042
|
width = u.option(options.width, $link.attr('up-width'), config.width);
|
4026
4043
|
height = u.option(options.height, $link.attr('up-height'), config.height);
|
@@ -4340,18 +4357,6 @@ to the current location (class `up-current`).
|
|
4340
4357
|
This dramatically improves the perceived speed of your user interface
|
4341
4358
|
by providing instant feedback for user interactions.
|
4342
4359
|
|
4343
|
-
The classes are added and removed automatically whenever
|
4344
|
-
a page fragment is added, changed or destroyed through Up.js.
|
4345
|
-
|
4346
|
-
How Up.js computes the current location
|
4347
|
-
---------------------------------------
|
4348
|
-
|
4349
|
-
From Up's point of view the "current" location is either:
|
4350
|
-
|
4351
|
-
- the URL displayed in the browser window's location bar
|
4352
|
-
- the source URL of a currently opened [modal dialog](/up.modal)
|
4353
|
-
- the source URL of a currently opened [popup overlay](/up.popup)
|
4354
|
-
|
4355
4360
|
@class up.navigation
|
4356
4361
|
*/
|
4357
4362
|
|
@@ -4361,7 +4366,7 @@ From Up's point of view the "current" location is either:
|
|
4361
4366
|
u = up.util;
|
4362
4367
|
CLASS_ACTIVE = 'up-active';
|
4363
4368
|
CLASS_CURRENT = 'up-current';
|
4364
|
-
SELECTORS_SECTION = ['
|
4369
|
+
SELECTORS_SECTION = ['[href]', '[up-target]', '[up-follow]', '[up-modal]', '[up-popup]', '[up-href]'];
|
4365
4370
|
SELECTOR_SECTION = SELECTORS_SECTION.join(', ');
|
4366
4371
|
SELECTOR_SECTION_INSTANT = ((function() {
|
4367
4372
|
var i, len, results;
|
@@ -4382,16 +4387,14 @@ From Up's point of view the "current" location is either:
|
|
4382
4387
|
}
|
4383
4388
|
};
|
4384
4389
|
sectionUrls = function($section) {
|
4385
|
-
var
|
4390
|
+
var attr, i, len, ref, url, urls;
|
4386
4391
|
urls = [];
|
4387
|
-
|
4388
|
-
|
4389
|
-
|
4390
|
-
|
4391
|
-
|
4392
|
-
|
4393
|
-
urls.push(url);
|
4394
|
-
}
|
4392
|
+
ref = ['up-href', 'href'];
|
4393
|
+
for (i = 0, len = ref.length; i < len; i++) {
|
4394
|
+
attr = ref[i];
|
4395
|
+
if (url = u.presentAttr($section, attr)) {
|
4396
|
+
url = normalizeUrl(url);
|
4397
|
+
urls.push(url);
|
4395
4398
|
}
|
4396
4399
|
}
|
4397
4400
|
return urls;
|
@@ -4410,6 +4413,34 @@ From Up's point of view the "current" location is either:
|
|
4410
4413
|
}
|
4411
4414
|
});
|
4412
4415
|
};
|
4416
|
+
|
4417
|
+
/**
|
4418
|
+
Links that are currently loading are assigned the `up-active`
|
4419
|
+
class automatically. Style `.up-active` in your CSS to improve the
|
4420
|
+
perceived responsiveness of your user interface.
|
4421
|
+
|
4422
|
+
The `up-active` class will be removed as soon as another
|
4423
|
+
page fragment is added or updated through Up.js.
|
4424
|
+
|
4425
|
+
\#\#\#\# Example
|
4426
|
+
|
4427
|
+
We have a link:
|
4428
|
+
|
4429
|
+
<a href="/foo" up-follow>Foo</a>
|
4430
|
+
|
4431
|
+
The user clicks on the link. While the request is loading,
|
4432
|
+
the link has the `up-active` class:
|
4433
|
+
|
4434
|
+
<a href="/foo" up-follow up-active>Foo</a>
|
4435
|
+
|
4436
|
+
Once the fragment is loaded the browser's location bar is updated
|
4437
|
+
to `http://yourhost/foo` via [`history.pushState`](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#Adding_and_modifying_history_entries):
|
4438
|
+
|
4439
|
+
<a href="/foo" up-follow up-current>Foo</a>
|
4440
|
+
|
4441
|
+
@ujs
|
4442
|
+
@method [up-active]
|
4443
|
+
*/
|
4413
4444
|
sectionClicked = function($section) {
|
4414
4445
|
unmarkActive();
|
4415
4446
|
$section = enlargeClickArea($section);
|
@@ -4431,6 +4462,41 @@ From Up's point of view the "current" location is either:
|
|
4431
4462
|
return sectionClicked($section);
|
4432
4463
|
}
|
4433
4464
|
});
|
4465
|
+
|
4466
|
+
/**
|
4467
|
+
Links that point to the current location are assigned
|
4468
|
+
the `up-current` class automatically.
|
4469
|
+
|
4470
|
+
The use case for this is navigation bars:
|
4471
|
+
|
4472
|
+
<nav>
|
4473
|
+
<a href="/foo">Foo</a>
|
4474
|
+
<a href="/bar">Bar</a>
|
4475
|
+
</nav>
|
4476
|
+
|
4477
|
+
If the browser location changes to `/foo`, the markup changes to this:
|
4478
|
+
|
4479
|
+
<nav>
|
4480
|
+
<a href="/foo" up-current>Foo</a>
|
4481
|
+
<a href="/bar">Bar</a>
|
4482
|
+
</nav>
|
4483
|
+
|
4484
|
+
\#\#\#\# What's considered to be "current"?
|
4485
|
+
|
4486
|
+
The current location is considered to be either:
|
4487
|
+
|
4488
|
+
- the URL displayed in the browser window's location bar
|
4489
|
+
- the source URL of a currently opened [modal dialog](/up.modal)
|
4490
|
+
- the source URL of a currently opened [popup overlay](/up.popup)
|
4491
|
+
|
4492
|
+
A link matches the current location (and is marked as `.up-current`) if it matches either:
|
4493
|
+
|
4494
|
+
- the link's `href` attribute
|
4495
|
+
- the link's [`up-href`](/up.link#turn-any-element-into-a-link) attribute
|
4496
|
+
|
4497
|
+
@method [up-current]
|
4498
|
+
@ujs
|
4499
|
+
*/
|
4434
4500
|
up.bus.on('fragment:ready', function() {
|
4435
4501
|
unmarkActive();
|
4436
4502
|
return locationChanged();
|
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,T,x,E,S,P,A,D,U,F,M,O,j,z,L,H,I,N,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 x=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)},W=function(t,n){return(""===n||"80"===n)&&"http:"===t||"443"===n&&"https:"===t},tn=function(t,n){var e,r,o;return e=null,q(t)?(e=$("<a>").attr({href:t}).get(0),P(e.hostname)&&(e.href=e.href)):e=wn(t),r=e.protocol+"//"+e.hostname,W(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},Y=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},p=function(t,n){var e;return e=document.createElement(t),I(n)&&(e.innerHTML=n),e},h=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)))},y=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=an($(".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+")"})},d=function(t){var n,e,r,o,u,i,a;for(h("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},f=function(t){var n,e,r,o,u,i,a,s,l,c,f,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=p("body",r[1]),s.appendChild(e),(f=t.match(d))&&(a=p("head"),s.appendChild(a),c=p("title",f[1]),a.appendChild(c)),s):p("div",t)},w=$.extend,bn=$.trim,R=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},g=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},L=function(t){return null===t},G=function(t){return void 0===t},D=function(t){return!G(t)},z=function(t){return G(t)||L(t)},M=function(t){return!z(t)},P=function(t){return z(t)||H(t)&&0===R(t).length||0===t.length},an=function(t,n){return null==n&&(n=I),n(t)?t:null},I=function(t){return!P(t)},F=function(t){return"function"==typeof t},q=function(t){return"string"==typeof t},O=function(t){return"object"==typeof t&&!!t},H=function(t){return O(t)||"function"==typeof t},U=function(t){return!(!t||1!==t.nodeType)},j=function(t){return t instanceof jQuery},N=function(t){return H(t)&&F(t.then)},A=function(t){return N(t)&&F(t.resolve)},E=function(t){return M(t)?t:void 0},S=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},yn=function(t){return Array.prototype.slice.call(t)},l=function(t){return S(t)?t.slice():w({},t)},wn=function(t){return j(t)?t.get(0):t},B=function(t,n){return w(l(t),n)},on=function(t,n){var e,r,o,u;if(o=t?l(t):{},n)for(r in n)e=n[r],u=o[r],M(u)?H(e)&&H(u)&&(o[r]=on(u,e)):o[r]=e;return o},rn=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,F(i)&&(i=i()),M(i)){u=i;break}return u},v=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},fn=function(t,n){var e;return e=[],g(t,function(t){return n(t)?e.push(t):void 0}),e},sn=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}(),v(o,I)},Z=function(t){return setTimeout(t,0)},K=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(R(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"]),P(e)?(n=function(){return t.css(e)},t.css({transform:"translateZ(0)","-webkit-transform":"translateZ(0)"})):n=function(){},n},m=function(t,n,r){var o,u,i,a,s,l;return o=$(t),up.browser.canCssAnimation()?(r=on(r,{duration:300,delay:0,easing:"ease"}),u=$.Deferred(),a={"transition-property":R(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),pn())},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},c=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},un=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)},k=function(t,n){return t.find(n).addBack(n)},b=function(t){return 27===t.keyCode},s=function(t,n){return t.indexOf(n)>=0},i=function(t){return"true"===String(t)},u=function(t){return"false"===String(t)},V=function(t){return t.getResponseHeader("X-Up-Location")},Q=function(t){return t.getResponseHeader("X-Up-Method")},en=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},X=function(t){return!(t.metaKey||t.shiftKey||t.ctrlKey)},J=function(t){var n;return n=G(t.button)||0===t.button,n&&X(t)},cn=function(){var t;return t=$.Deferred(),t.resolve(),t},pn=function(){return cn().promise()},nn=function(){return{is:function(){return!1},attr:function(){},find:function(){return[]}}},ln=function(){var n,e;return n=1<=arguments.length?t.call(arguments,0):[],e=$.when.apply($,n),e.resolve=function(){return g(n,function(t){return"function"==typeof t.resolve?t.resolve():void 0})},e},dn=function(t,n){var e,r,o;r=[];for(e in n)o=n[e],r.push(z(t.attr(e))?t.attr(e,o):void 0);return r},mn=function(t){var n,e,r,o,u,i,a,s;for(a={},n=function(t){return a[o(t)]},e=function(t){return v(t,n)},i=function(t){return a[o(t)]=!0},o=function(t){return"_"+t},r=0,u=t.length;u>r;r++)s=t[r],i(s);return{put:i,includes:n,includesAny:e}},{presentAttr:sn,createElement:p,normalizeUrl:tn,normalizeMethod:Y,createElementFromHtml:f,$createElementFromSelector:n,createSelectorFromElement:d,get:x,ajax:o,extend:w,copy:l,merge:B,options:on,option:rn,error:y,debug:h,warn:kn,each:g,times:gn,detect:v,select:fn,last:K,isNull:L,isDefined:D,isUndefined:G,isGiven:M,isMissing:z,isPresent:I,isBlank:P,presence:an,isObject:H,isFunction:F,isString:q,isElement:U,isJQuery:j,isPromise:N,isDeferred:A,isHash:O,ifGiven:E,isUnmodifiedKeyEvent:X,isUnmodifiedMouseEvent:J,nullJquery:nn,unwrap:wn,nextFrame:Z,measure:_,temporaryCss:vn,cssAnimate:m,finishCssAnimate:C,forceCompositing:T,prependGhost:un,escapePressed:b,copyAttributes:c,findWithSelf:k,contains:s,isArray:S,toArray:yn,castsToTrue:i,castsToFalse:u,locationFromXhr:V,methodFromXhr:Q,clientSize:a,only:en,trim:bn,keys:R,resolvedPromise:pn,resolvedDeferred:cn,resolvableWhen:ln,setMissingAttrs:dn,stringSet: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;return v=up.util,d=function(t,n){var e;return e=$(t),v.isPresent(n)&&(n=v.normalizeUrl(n)),e.attr("up-source",n)},m=function(t){var n;return n=$(t).closest("[up-source]"),v.presence(n.attr("up-source"))||up.browser.url()},c=function(t,n,e){var r,o,i;return e=v.options(e),i=v.presence(t)?t:v.createSelectorFromElement($(t)),up.browser.canPushState()||v.castsToFalse(e.history)?(o={url:n,method:e.method,selector:i,cache:e.cache},r=up.proxy.ajax(o),r.done(function(t,r,a){var s,l;return(s=v.locationFromXhr(a))&&(v.debug("Location from server: %o",s),l={url:s,method:v.methodFromXhr(a),selector:i},up.proxy.alias(o,l),n=s),(v.isMissing(e.history)||v.castsToTrue(e.history))&&(e.history=n),(v.isMissing(e.source)||v.castsToTrue(e.source))&&(e.source=n),e.preload?void 0:u(i,t,e)}),r.fail(v.error),r):(e.preload||up.browser.loadPage(n,v.only(e,"method")),v.resolvedPromise())},u=function(t,n,e){var o,u,l,c,p,f,d,m;for(e=v.options(e,{historyMethod:"push"}),v.castsToFalse(e.history)&&(e.history=null),v.castsToFalse(e.scroll)&&(e.scroll=null),e.source=v.option(e.source,e.history),f=a(n),e.title||(e.title=f.title()),p=i(t,e),d=[],l=0,c=p.length;c>l;l++)m=p[l],u=r(m.selector),o=f.find(m.selector),d.push(s(u,e).then(function(){return h(u,o,m.pseudoClass,m.transition,e)}));return d},r=function(t){var n;return n=t+":not(.up-ghost, .up-destroying)",v.presence($(".up-popup "+n))||v.presence($(".up-modal "+n))||v.presence($(n))||o(t)},o=function(t){var n;return n="Could not find selector %o in current body HTML","#"===n[0]&&(n+=" (avoid using IDs)"),v.error(n,t)},a=function(t){var n;return n=v.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):v.error("Could not find selector %o in response %o",e,t)}}},s=function(t,n){return up.motion.finish(t),f(t,n.scroll)},f=function(t,n){return n?up.reveal(t,{view:n}):v.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)),d(n,e.source),t(n),up.ready(n)},h=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()),v.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&&v.error("Cannot apply transitions to body-elements (%o)",u),up.morph(t,r,u,i)}})},i=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),v.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]||v.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=v.findWithSelf(t,e),n.length&&n.get(0)!==document.activeElement?n.focus():void 0},n=function(t,n){var e,r,o;return e=$(t),n=v.options(n,{animation:"none"}),r=up.motion.animateOptions(n),e.addClass("up-destroying"),v.isPresent(n.url)&&up.history.push(n.url),v.isPresent(n.title)&&(document.title=n.title),up.bus.emit("fragment:destroy",e),o=v.presence(n.animation,v.isPromise)||up.motion.animate(e,n.animation,r),o.then(function(){return e.remove()})},l=function(t,n){var e;return n=v.options(n,{cache:!1}),e=n.url||m(t),c(t,e,n)},p=function(){return up.bus.emit("framework:reset")},up.bus.on("app:ready",function(){return d(document.body,up.browser.url())}),{replace:c,reload:l,destroy:n,implant:u,reset:p}}(),up.replace=up.flow.replace,up.reload=up.flow.reload,up.destroy=up.flow.destroy,up.reset=up.flow.reset}.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,T,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 v(t),[t.url,t.method,t.selector].join("|")},T=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},C=function(){return(new Date).valueOf()},v=function(t){return!x.isHash(t),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=d(t))?w(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","selector","_normalized"),h(o)||n?(r=d(o))&&!e||(r=x.ajax(o),w(o,r)):(s(),r=x.ajax(o)),r},n=["GET","OPTIONS","HEAD"],h=function(t){return v(t),x.contains(n,t.method)},f=function(t){return h(t)||x.error("Won't preload non-GET request %o",t)},m=function(t){var n;return n=C()-t.timestamp,n<l.cacheExpiry},d=function(t){var n,e;return n=u(t),(e=o[n])?m(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 y(t)):void x.debug("Cache miss for %o (%o)",t.url,t)},w=function(t,n){var e;return T(),e=u(t),n.timestamp=C(),o[e]=n,n},y=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 g(n)},k(e,r))},k=function(t,n){return p=setTimeout(t,n)},i=function(){return clearTimeout(p),p=null},g=function(t,n){var e,r;return e=$(t),n=x.options(n),r=up.link.followMethod(e,n),h({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())},b=function(){return i(),o={}},up.bus.on("framework:reset",b),up.on("mouseover mousedown touchstart","[up-preload]",function(t,n){return up.link.childClicked(t,n)?void 0:a(up.link.resolve(n))}),{preload:g,ajax:e,get:d,set:w,alias:r,clear:s,remove:y,defaults:c}}()}.call(this),function(){up.link=function(){var childClicked,follow,followMethod,resolve,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("href"),e.attr("up-follow")),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()},resolve=function(t){var n,e;return n=$(t),e=n.attr("up-follow"),n.is("a")||u.isPresent(e)&&!u.castsToTrue(e)?n:n.find("a:first")},up.on("click","a[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-target][up-instant]",function(t,n){return shouldProcessLinkEvent(t,n)?(t.preventDefault(),up.follow(n)):void 0}),childClicked=function(t,n){var e,r;return e=$(t.target),r=e.closest("a, [up-follow]"),r.length&&n.find(r).length},shouldProcessLinkEvent=function(t,n){return u.isUnmodifiedMouseEvent(t)&&!childClicked(t,n)},up.on("click","[up-follow]",function(t,n){return shouldProcessLinkEvent(t,n)?n.is("[up-instant]")?t.preventDefault():(t.preventDefault(),follow(resolve(n))):void 0}),up.on("mousedown","[up-follow][up-instant]",function(t,n){return shouldProcessLinkEvent(t,n)?(t.preventDefault(),follow(resolve(n))):void 0}),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,resolve:resolve,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,type: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)},u.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;return p=up.util,e={openAnimation:"fade-in",closeAnimation:"fade-out",position:"bottom-right"},o=function(t){return p.extend(e,t)},l=function(t,n,e){var r,o;return o=p.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 p.error("Unknown position %o",e)}}(),n.attr("up-position",e),n.css(r),i(n)},i=function(t){var n,e,r,o,u,i,a;if(e=p.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)}},s=function(){var t;return t=$(".up-popup"),t.attr("up-previous-url",up.browser.url()),t.attr("up-previous-title",document.title)},u=function(){var t;return t=$(".up-popup"),t.removeAttr("up-previous-url"),t.removeAttr("up-previous-title")},r=function(t,n,e){var r,o;return o=p.$createElementFromSelector(".up-popup"),e&&o.attr("up-sticky",""),r=p.$createElementFromSelector(n),r.appendTo(o),o.appendTo(document.body),s(),o.hide(),o},f=function(t,n,e,r,o){return n.show(),l(t,n,e),up.animate(n,r,o)},a=function(t,o){var u,i,a,s,l,c,d,m,h;return u=$(t),o=p.options(o),h=p.option(o.url,u.attr("href")),d=p.option(o.target,u.attr("up-popup"),"body"),c=p.option(o.position,u.attr("up-position"),e.position),s=p.option(o.animation,u.attr("up-animation"),e.openAnimation),m=p.option(o.sticky,u.is("[up-sticky]")),l=up.browser.canPushState()?p.option(o.history,u.attr("up-history"),!1):!1,a=up.motion.animateOptions(o,u),n(),i=r(u,d,m),up.replace(d,h,{history:l,insert:function(){return f(u,i,c,s,a)}})},c=function(){var t;return t=$(".up-popup"),t.is(".up-destroying")?void 0:t.find("[up-source]").attr("up-source")},n=function(t){var n;return n=$(".up-popup"),n.length?(t=p.options(t,{animation:e.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),up.destroy(n,t)):void 0},t=function(){return $(".up-popup").is("[up-sticky]")?void 0:n()},up.on("click","a[up-popup]",function(t,e){return t.preventDefault(),e.is(".up-current")?n():a(e)
|
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,S,E,P,A,D,U,F,M,O,j,z,L,H,I,N,W,q,X,G,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 T=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)},W=function(t,n){return(""===n||"80"===n)&&"http:"===t||"443"===n&&"https:"===t},tn=function(t,n){var e,r,o;return e=null,q(t)?(e=$("<a>").attr({href:t}).get(0),P(e.hostname)&&(e.href=e.href)):e=wn(t),r=e.protocol+"//"+e.hostname,W(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},Y=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},p=function(t,n){var e;return e=document.createElement(t),I(n)&&(e.innerHTML=n),e},h=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)))},y=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=an($(".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+")"})},d=function(t){var n,e,r,o,u,i,a;for(h("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},f=function(t){var n,e,r,o,u,i,a,s,l,c,f,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=p("body",r[1]),s.appendChild(e),(f=t.match(d))&&(a=p("head"),s.appendChild(a),c=p("title",f[1]),a.appendChild(c)),s):p("div",t)},w=$.extend,bn=$.trim,R=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},g=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},L=function(t){return null===t},X=function(t){return void 0===t},D=function(t){return!X(t)},z=function(t){return X(t)||L(t)},M=function(t){return!z(t)},P=function(t){return z(t)||H(t)&&0===R(t).length||0===t.length},an=function(t,n){return null==n&&(n=I),n(t)?t:null},I=function(t){return!P(t)},F=function(t){return"function"==typeof t},q=function(t){return"string"==typeof t},O=function(t){return"object"==typeof t&&!!t},H=function(t){return O(t)||"function"==typeof t},U=function(t){return!(!t||1!==t.nodeType)},j=function(t){return t instanceof jQuery},N=function(t){return H(t)&&F(t.then)},A=function(t){return N(t)&&F(t.resolve)},S=function(t){return M(t)?t:void 0},E=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},yn=function(t){return Array.prototype.slice.call(t)},l=function(t){return E(t)?t.slice():w({},t)},wn=function(t){return j(t)?t.get(0):t},B=function(t,n){return w(l(t),n)},on=function(t,n){var e,r,o,u;if(o=t?l(t):{},n)for(r in n)e=n[r],u=o[r],M(u)?H(e)&&H(u)&&(o[r]=on(u,e)):o[r]=e;return o},rn=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,F(i)&&(i=i()),M(i)){u=i;break}return u},v=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},fn=function(t,n){var e;return e=[],g(t,function(t){return n(t)?e.push(t):void 0}),e},sn=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}(),v(o,I)},Z=function(t){return setTimeout(t,0)},K=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(R(n)),t.css(n),r=function(){return t.css(o)},e?(e(),r()):r},x=function(t){var n,e;return e=t.css(["transform","-webkit-transform"]),P(e)?(n=function(){return t.css(e)},t.css({transform:"translateZ(0)","-webkit-transform":"translateZ(0)"})):n=function(){},n},m=function(t,n,r){var o,u,i,a,s,l;return o=$(t),up.browser.canCssAnimation()?(r=on(r,{duration:300,delay:0,easing:"ease"}),u=$.Deferred(),a={"transition-property":R(n).join(", "),"transition-duration":r.duration+"ms","transition-delay":r.delay+"ms","transition-timing-function":r.easing},s=x(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),pn())},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},c=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},un=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)},k=function(t,n){return t.find(n).addBack(n)},b=function(t){return 27===t.keyCode},s=function(t,n){return t.indexOf(n)>=0},i=function(t){return"true"===String(t)},u=function(t){return"false"===String(t)},V=function(t){return t.getResponseHeader("X-Up-Location")},Q=function(t){return t.getResponseHeader("X-Up-Method")},en=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},G=function(t){return!(t.metaKey||t.shiftKey||t.ctrlKey)},J=function(t){var n;return n=X(t.button)||0===t.button,n&&G(t)},cn=function(){var t;return t=$.Deferred(),t.resolve(),t},pn=function(){return cn().promise()},nn=function(){return{is:function(){return!1},attr:function(){},find:function(){return[]}}},ln=function(){var n,e;return n=1<=arguments.length?t.call(arguments,0):[],e=$.when.apply($,n),e.resolve=function(){return g(n,function(t){return"function"==typeof t.resolve?t.resolve():void 0})},e},dn=function(t,n){var e,r,o;r=[];for(e in n)o=n[e],r.push(z(t.attr(e))?t.attr(e,o):void 0);return r},mn=function(t){var n,e,r,o,u,i,a,s;for(a={},n=function(t){return a[o(t)]},e=function(t){return v(t,n)},i=function(t){return a[o(t)]=!0},o=function(t){return"_"+t},r=0,u=t.length;u>r;r++)s=t[r],i(s);return{put:i,includes:n,includesAny:e}},{presentAttr:sn,createElement:p,normalizeUrl:tn,normalizeMethod:Y,createElementFromHtml:f,$createElementFromSelector:n,createSelectorFromElement:d,get:T,ajax:o,extend:w,copy:l,merge:B,options:on,option:rn,error:y,debug:h,warn:kn,each:g,times:gn,detect:v,select:fn,last:K,isNull:L,isDefined:D,isUndefined:X,isGiven:M,isMissing:z,isPresent:I,isBlank:P,presence:an,isObject:H,isFunction:F,isString:q,isElement:U,isJQuery:j,isPromise:N,isDeferred:A,isHash:O,ifGiven:S,isUnmodifiedKeyEvent:G,isUnmodifiedMouseEvent:J,nullJquery:nn,unwrap:wn,nextFrame:Z,measure:_,temporaryCss:vn,cssAnimate:m,finishCssAnimate:C,forceCompositing:x,prependGhost:un,escapePressed:b,copyAttributes:c,findWithSelf:k,contains:s,isArray:E,toArray:yn,castsToTrue:i,castsToFalse:u,locationFromXhr:V,methodFromXhr:Q,clientSize:a,only:en,trim:bn,keys:R,resolvedPromise:pn,resolvedDeferred:cn,resolvableWhen:ln,setMissingAttrs:dn,stringSet: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;return v=up.util,d=function(t,n){var e;return e=$(t),v.isPresent(n)&&(n=v.normalizeUrl(n)),e.attr("up-source",n)},m=function(t){var n;return n=$(t).closest("[up-source]"),v.presence(n.attr("up-source"))||up.browser.url()},c=function(t,n,e){var r,o,i;return e=v.options(e),i=v.presence(t)?t:v.createSelectorFromElement($(t)),up.browser.canPushState()||v.castsToFalse(e.history)?(o={url:n,method:e.method,selector:i,cache:e.cache},r=up.proxy.ajax(o),r.done(function(t,r,a){var s,l;return(s=v.locationFromXhr(a))&&(v.debug("Location from server: %o",s),l={url:s,method:v.methodFromXhr(a),selector:i},up.proxy.alias(o,l),n=s),(v.isMissing(e.history)||v.castsToTrue(e.history))&&(e.history=n),(v.isMissing(e.source)||v.castsToTrue(e.source))&&(e.source=n),e.preload?void 0:u(i,t,e)}),r.fail(v.error),r):(e.preload||up.browser.loadPage(n,v.only(e,"method")),v.resolvedPromise())},u=function(t,n,e){var o,u,l,c,p,f,d,m;for(e=v.options(e,{historyMethod:"push"}),v.castsToFalse(e.history)&&(e.history=null),v.castsToFalse(e.scroll)&&(e.scroll=null),e.source=v.option(e.source,e.history),f=a(n),e.title||(e.title=f.title()),p=i(t,e),d=[],l=0,c=p.length;c>l;l++)m=p[l],u=r(m.selector),o=f.find(m.selector),d.push(s(u,e).then(function(){return h(u,o,m.pseudoClass,m.transition,e)}));return d},r=function(t){var n;return n=t+":not(.up-ghost, .up-destroying)",v.presence($(".up-popup "+n))||v.presence($(".up-modal "+n))||v.presence($(n))||o(t)},o=function(t){var n;return n="Could not find selector %o in current body HTML","#"===n[0]&&(n+=" (avoid using IDs)"),v.error(n,t)},a=function(t){var n;return n=v.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):v.error("Could not find selector %o in response %o",e,t)}}},s=function(t,n){return up.motion.finish(t),f(t,n.scroll)},f=function(t,n){return n?up.reveal(t,{view:n}):v.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)),d(n,e.source),t(n),up.ready(n)},h=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()),v.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&&v.error("Cannot apply transitions to body-elements (%o)",u),up.morph(t,r,u,i)}})},i=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),v.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]||v.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=v.findWithSelf(t,e),n.length&&n.get(0)!==document.activeElement?n.focus():void 0},n=function(t,n){var e,r,o;return e=$(t),n=v.options(n,{animation:"none"}),r=up.motion.animateOptions(n),e.addClass("up-destroying"),v.isPresent(n.url)&&up.history.push(n.url),v.isPresent(n.title)&&(document.title=n.title),up.bus.emit("fragment:destroy",e),o=v.presence(n.animation,v.isPromise)||up.motion.animate(e,n.animation,r),o.then(function(){return e.remove()})},l=function(t,n){var e;return n=v.options(n,{cache:!1}),e=n.url||m(t),c(t,e,n)},p=function(){return up.bus.emit("framework:reset")},up.bus.on("app:ready",function(){return d(document.body,up.browser.url())}),{replace:c,reload:l,destroy:n,implant:u,reset:p}}(),up.replace=up.flow.replace,up.reload=up.flow.reload,up.destroy=up.flow.destroy,up.reset=up.flow.reset}.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.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!x.isHash(t),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","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("href"),e.attr("up-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","[up-target]",function(t,n){return shouldProcessLinkEvent(t,n)?n.is("[up-instant]")?t.preventDefault():(t.preventDefault(),follow(n)):void 0}),up.on("mousedown","[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-follow]"),r.length&&n.find(r).length},shouldProcessLinkEvent=function(t,n){return u.isUnmodifiedMouseEvent(t)&&!childClicked(t,n)},up.on("click","[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("[up-href], [href]").get(0),o||u.error("No link to expand within %o",t),l=/^up-/,a={},s=o.attributes,e=0,r=s.length;r>e;e++)n=s[e],i=n.name,("href"===i||i.match(l))&&(a[i]=n.value);return 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,type: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)},u.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;return p=up.util,e={openAnimation:"fade-in",closeAnimation:"fade-out",position:"bottom-right"},o=function(t){return p.extend(e,t)},l=function(t,n,e){var r,o;return o=p.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 p.error("Unknown position %o",e)}}(),n.attr("up-position",e),n.css(r),i(n)},i=function(t){var n,e,r,o,u,i,a;if(e=p.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)}},s=function(){var t;return t=$(".up-popup"),t.attr("up-previous-url",up.browser.url()),t.attr("up-previous-title",document.title)},u=function(){var t;return t=$(".up-popup"),t.removeAttr("up-previous-url"),t.removeAttr("up-previous-title")},r=function(t,n,e){var r,o;return o=p.$createElementFromSelector(".up-popup"),e&&o.attr("up-sticky",""),r=p.$createElementFromSelector(n),r.appendTo(o),o.appendTo(document.body),s(),o.hide(),o},f=function(t,n,e,r,o){return n.show(),l(t,n,e),up.animate(n,r,o)},a=function(t,o){var u,i,a,s,l,c,d,m,h;return u=$(t),o=p.options(o),h=p.option(o.url,u.attr("href")),d=p.option(o.target,u.attr("up-popup"),"body"),c=p.option(o.position,u.attr("up-position"),e.position),s=p.option(o.animation,u.attr("up-animation"),e.openAnimation),m=p.option(o.sticky,u.is("[up-sticky]")),l=up.browser.canPushState()?p.option(o.history,u.attr("up-history"),!1):!1,a=up.motion.animateOptions(o,u),n(),i=r(u,d,m),up.replace(d,h,{history:l,insert:function(){return f(u,i,c,s,a)}})},c=function(){var t;return t=$(".up-popup"),t.is(".up-destroying")?void 0:t.find("[up-source]").attr("up-source")},n=function(t){var n;return n=$(".up-popup"),n.length?(t=p.options(t,{animation:e.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),up.destroy(n,t)):void 0},t=function(){return $(".up-popup").is("[up-sticky]")?void 0:n()},up.on("click","a[up-popup]",function(t,e){return t.preventDefault(),e.is(".up-current")?n():a(e)}),up.on("click","body",function(t){var e;
|
2
|
+
return e=$(t.target),e.closest(".up-popup").length||e.closest("[up-popup]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){return n.closest(".up-popup").length?void 0:(u(),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:a,close:n,source:c,defaults:o}}()}.call(this),function(){var t=[].slice;up.modal=function(){var n,e,r,o,u,i,a,s,l,c,p,f;return p=up.util,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>'}},u=function(t){return p.extend(r,t)},c=function(){var t;return t=r.template,p.isFunction(t)?t(r):t},s=function(){var t;return t=$(".up-modal"),t.attr("up-previous-url",up.browser.url()),t.attr("up-previous-title",document.title)},i=function(){var t;return t=$(".up-modal"),t.removeAttr("up-previous-url"),t.removeAttr("up-previous-title")},o=function(t,n,e,r){var o,u,i,a;return i=$(c()),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"),p.isPresent(n)&&u.css("width",n),p.isPresent(e)&&u.css("height",e),o=u.find(".up-modal-content"),a=p.$createElementFromSelector(t),a.appendTo(o),i.appendTo(document.body),s(),i.hide(),i},f=function(t,n,e){return t.show(),up.animate(t,n,e)},a=function(){var n,u,i,a,s,l,c,d,m,h,v,g;return s=1<=arguments.length?t.call(arguments,0):[],!p.isObject(s[0])||p.isElement(s[0])||p.isJQuery(s[0])?(n=$(s[0]),d=s[1]):(n=p.nullJquery(),d=s[0]),d=p.options(d),v=p.option(d.url,n.attr("up-href"),n.attr("href")),m=p.option(d.target,n.attr("up-modal"),"body"),g=p.option(d.width,n.attr("up-width"),r.width),l=p.option(d.height,n.attr("up-height"),r.height),a=p.option(d.animation,n.attr("up-animation"),r.openAnimation),h=p.option(d.sticky,n.is("[up-sticky]")),c=up.browser.canPushState()?p.option(d.history,n.attr("up-history"),!0):!1,i=up.motion.animateOptions(d,n),e(),u=o(m,g,l,h),up.replace(m,v,{history:c,insert:function(){return f(u,a,i)}})},l=function(){var t;return t=$(".up-modal"),t.is(".up-destroying")?void 0:t.find("[up-source]").attr("up-source")},e=function(t){var n;return n=$(".up-modal"),n.length?(t=p.options(t,{animation:r.closeAnimation,url:n.attr("up-previous-url"),title:n.attr("up-previous-title")}),up.destroy(n,t)):void 0},n=function(){return $(".up-modal").is("[up-sticky]")?void 0:(i(),e())},up.on("click","a[up-modal]",function(t,n){return t.preventDefault(),n.is(".up-current")?e():a(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){return t.closest(".up-modal").length?void 0: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:a,close:e,source:l,defaults:u}}()}.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;return f=up.util,t="up-active",n="up-current",e=["[href]","[up-target]","[up-follow]","[up-modal]","[up-popup]","[up-href]"],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;for(i=[],o=["up-href","href"],e=0,r=o.length;r>e;e++)n=o[e],(u=f.presentAttr(t,n))&&(u=s(u),i.push(u));return i},a=function(){var t;return t=f.stringSet([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.includesAny(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);
|
@@ -143,7 +143,7 @@ up.link = (->
|
|
143
143
|
$link = $(link)
|
144
144
|
|
145
145
|
options = u.options(options)
|
146
|
-
url = u.option($link.attr('href'), $link.attr('up-
|
146
|
+
url = u.option($link.attr('href'), $link.attr('up-href'))
|
147
147
|
selector = u.option(options.target, $link.attr('up-target'), 'body')
|
148
148
|
options.transition = u.option(options.transition, $link.attr('up-transition'), $link.attr('up-animation'))
|
149
149
|
options.history = u.option(options.history, $link.attr('up-history'))
|
@@ -162,14 +162,6 @@ up.link = (->
|
|
162
162
|
options = u.options(options)
|
163
163
|
u.option(options.method, $link.attr('up-method'), $link.attr('data-method'), 'get').toUpperCase()
|
164
164
|
|
165
|
-
resolve = (element) ->
|
166
|
-
$element = $(element)
|
167
|
-
followAttr = $element.attr('up-follow')
|
168
|
-
if $element.is('a') || (u.isPresent(followAttr) && !u.castsToTrue(followAttr))
|
169
|
-
$element
|
170
|
-
else
|
171
|
-
$element.find('a:first')
|
172
|
-
|
173
165
|
###*
|
174
166
|
Follows this link via AJAX and replaces a CSS selector in the current page
|
175
167
|
with corresponding elements from a new page fetched from the server:
|
@@ -207,27 +199,25 @@ up.link = (->
|
|
207
199
|
Load more tasks
|
208
200
|
</a>
|
209
201
|
|
210
|
-
\#\#\#\# Following
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
<
|
216
|
-
|
217
|
-
Note that using `[up-instant]` will prevent a user from canceling a link
|
218
|
-
click by moving the mouse away from the interaction area. However, for
|
219
|
-
navigation actions this isn't needed. E.g. popular operation
|
220
|
-
systems switch tabs on `mousedown`.
|
202
|
+
\#\#\#\# Following elements that are no links
|
203
|
+
|
204
|
+
You can also use `[up-target]` to turn an arbitrary element into a link.
|
205
|
+
In this case, put the link's destination into the `up-href` attribute:
|
206
|
+
|
207
|
+
<button up-target=".main" up-href="/foo/bar">Go</button>
|
221
208
|
|
222
|
-
|
209
|
+
Note that using any element other than `<a>` will prevent users from
|
210
|
+
opening the destination in a new tab.
|
211
|
+
|
212
|
+
@method [up-target]
|
223
213
|
@ujs
|
224
214
|
@param {String} up-target
|
225
215
|
The CSS selector to replace
|
226
|
-
@param up-
|
227
|
-
|
228
|
-
|
216
|
+
@param [up-href]
|
217
|
+
The destination URL to follow.
|
218
|
+
If omitted, the the link's `href` attribute will be used.
|
229
219
|
###
|
230
|
-
up.on 'click', '
|
220
|
+
up.on 'click', '[up-target]', (event, $link) ->
|
231
221
|
if shouldProcessLinkEvent(event, $link)
|
232
222
|
if $link.is('[up-instant]')
|
233
223
|
# If the link was already processed on mousedown, we still need
|
@@ -237,10 +227,29 @@ up.link = (->
|
|
237
227
|
event.preventDefault()
|
238
228
|
follow($link)
|
239
229
|
|
240
|
-
|
230
|
+
###*
|
231
|
+
By adding an `up-instant` attribute to a link, the destination will be
|
232
|
+
fetched on `mousedown` instead of `click` (`mouseup`).
|
233
|
+
|
234
|
+
<a href="/users" up-target=".main" up-instant>User list</a>
|
235
|
+
|
236
|
+
This will save precious milliseconds that otherwise spent
|
237
|
+
on waiting for the user to release the mouse button. Since an
|
238
|
+
AJAX request will be triggered right way, the interaction will
|
239
|
+
appear faster.
|
240
|
+
|
241
|
+
Note that using `[up-instant]` will prevent a user from canceling a link
|
242
|
+
click by moving the mouse away from the interaction area. However, for
|
243
|
+
navigation actions this isn't needed. E.g. popular operation
|
244
|
+
systems switch tabs on `mousedown` instead of `click`.
|
245
|
+
|
246
|
+
@method [up-instant]
|
247
|
+
@ujs
|
248
|
+
###
|
249
|
+
up.on 'mousedown', '[up-instant]', (event, $link) ->
|
241
250
|
if shouldProcessLinkEvent(event, $link)
|
242
251
|
event.preventDefault()
|
243
|
-
|
252
|
+
follow($link)
|
244
253
|
|
245
254
|
###*
|
246
255
|
@method up.link.childClicked
|
@@ -256,40 +265,31 @@ up.link = (->
|
|
256
265
|
|
257
266
|
###*
|
258
267
|
If applied on a link, Follows this link via AJAX and replaces the
|
259
|
-
current `<body>` element with the response's `<body>` element
|
268
|
+
current `<body>` element with the response's `<body>` element.
|
269
|
+
|
270
|
+
Example:
|
260
271
|
|
261
272
|
<a href="/users" up-follow>User list</a>
|
262
273
|
|
263
|
-
|
274
|
+
To only update a fragment instead of the entire page,
|
275
|
+
see [`up-target`](#up-target).
|
264
276
|
|
265
|
-
|
266
|
-
on `mousedown` instead of `click`, making the interaction even faster:
|
267
|
-
|
268
|
-
<a href="/users" up-follow up-instant>User list</a>
|
269
|
-
|
270
|
-
Note that using `[up-instant]` will prevent a user from canceling a link
|
271
|
-
click by moving the mouse away from the interaction area. However, for
|
272
|
-
navigation actions this isn't needed. E.g. popular operation
|
273
|
-
systems switch tabs on `mousedown`.
|
277
|
+
\#\#\#\# Turn any element into a link
|
274
278
|
|
275
|
-
|
279
|
+
You can also use `[up-follow]` to turn an arbitrary element into a link.
|
280
|
+
In this case, put the link's destination into the `up-href` attribute:
|
276
281
|
|
277
|
-
|
278
|
-
in order to enlarge the link's click area:
|
279
|
-
|
280
|
-
<div class="notification" up-follow>
|
281
|
-
Record was saved!
|
282
|
-
<a href="/records">Close</a>
|
283
|
-
</div>
|
282
|
+
<span up-follow up-href="/foo/bar">Go</span>
|
284
283
|
|
285
|
-
|
286
|
-
|
284
|
+
Note that using any element other than `<a>` will prevent users from
|
285
|
+
opening the destination in a new tab.
|
287
286
|
|
288
287
|
@method [up-follow]
|
289
288
|
@ujs
|
290
289
|
@param {String} [up-follow]
|
291
|
-
@param up-
|
292
|
-
|
290
|
+
@param [up-href]
|
291
|
+
The destination URL to follow.
|
292
|
+
If omitted, the the link's `href` attribute will be used.
|
293
293
|
###
|
294
294
|
up.on 'click', '[up-follow]', (event, $link) ->
|
295
295
|
if shouldProcessLinkEvent(event, $link)
|
@@ -299,12 +299,37 @@ up.link = (->
|
|
299
299
|
event.preventDefault()
|
300
300
|
else
|
301
301
|
event.preventDefault()
|
302
|
-
follow(
|
302
|
+
follow($link)
|
303
303
|
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
304
|
+
###*
|
305
|
+
Add an `up-expand` class to any element that contains a link
|
306
|
+
in order to enlarge the link's click area:
|
307
|
+
|
308
|
+
<div class="notification" up-expand>
|
309
|
+
Record was saved!
|
310
|
+
<a href="/records">Close</a>
|
311
|
+
</div>
|
312
|
+
|
313
|
+
In the example above, clicking anywhere within `.notification` element
|
314
|
+
would [follow](#up-follow) the *Close* link.
|
315
|
+
|
316
|
+
`up-expand` honors all the UJS behavior in expanded links
|
317
|
+
(`up-target`, `up-instant`, `up-preload`, etc.).
|
318
|
+
|
319
|
+
@ujs
|
320
|
+
@method [up-expand]
|
321
|
+
###
|
322
|
+
up.compiler '[up-expand]', ($fragment) ->
|
323
|
+
link = $fragment.find('[up-href], [href]').get(0)
|
324
|
+
link or u.error('No link to expand within %o', $fragment)
|
325
|
+
upAttributePattern = /^up-/
|
326
|
+
newAttrs = {}
|
327
|
+
for attribute in link.attributes
|
328
|
+
name = attribute.name
|
329
|
+
if name == 'href' || name.match(upAttributePattern)
|
330
|
+
newAttrs[name] = attribute.value
|
331
|
+
u.setMissingAttrs($fragment, newAttrs)
|
332
|
+
$fragment.removeAttr('up-expand')
|
308
333
|
|
309
334
|
###*
|
310
335
|
Marks up the current link to be followed *as fast as possible*.
|
@@ -322,14 +347,6 @@ up.link = (->
|
|
322
347
|
|
323
348
|
<a href="/users" up-target=".main" up-instant up-preload>User list</a>
|
324
349
|
|
325
|
-
You can also apply `[up-dash]` to any element that contains a link
|
326
|
-
in order to enlarge the link's click area:
|
327
|
-
|
328
|
-
<div class="notification" up-dash>
|
329
|
-
Record was saved!
|
330
|
-
<a href="/records" up-dash='.main'>Close</a>
|
331
|
-
</div>
|
332
|
-
|
333
350
|
@method [up-dash]
|
334
351
|
@ujs
|
335
352
|
###
|
@@ -349,7 +366,6 @@ up.link = (->
|
|
349
366
|
knife: eval(Knife?.point)
|
350
367
|
visit: visit
|
351
368
|
follow: follow
|
352
|
-
resolve: resolve
|
353
369
|
childClicked: childClicked
|
354
370
|
followMethod: followMethod
|
355
371
|
|
@@ -151,7 +151,7 @@ up.modal = (->
|
|
151
151
|
options = args[1]
|
152
152
|
|
153
153
|
options = u.options(options)
|
154
|
-
url = u.option(options.url, $link.attr('href'), $link.attr('
|
154
|
+
url = u.option(options.url, $link.attr('up-href'), $link.attr('href'))
|
155
155
|
selector = u.option(options.target, $link.attr('up-modal'), 'body')
|
156
156
|
width = u.option(options.width, $link.attr('up-width'), config.width)
|
157
157
|
height = u.option(options.height, $link.attr('up-height'), config.height)
|
@@ -9,18 +9,6 @@ to the current location (class `up-current`).
|
|
9
9
|
This dramatically improves the perceived speed of your user interface
|
10
10
|
by providing instant feedback for user interactions.
|
11
11
|
|
12
|
-
The classes are added and removed automatically whenever
|
13
|
-
a page fragment is added, changed or destroyed through Up.js.
|
14
|
-
|
15
|
-
How Up.js computes the current location
|
16
|
-
---------------------------------------
|
17
|
-
|
18
|
-
From Up's point of view the "current" location is either:
|
19
|
-
|
20
|
-
- the URL displayed in the browser window's location bar
|
21
|
-
- the source URL of a currently opened [modal dialog](/up.modal)
|
22
|
-
- the source URL of a currently opened [popup overlay](/up.popup)
|
23
|
-
|
24
12
|
@class up.navigation
|
25
13
|
###
|
26
14
|
up.navigation = (->
|
@@ -29,7 +17,7 @@ up.navigation = (->
|
|
29
17
|
|
30
18
|
CLASS_ACTIVE = 'up-active'
|
31
19
|
CLASS_CURRENT = 'up-current'
|
32
|
-
SELECTORS_SECTION = ['
|
20
|
+
SELECTORS_SECTION = ['[href]', '[up-target]', '[up-follow]', '[up-modal]', '[up-popup]', '[up-href]']
|
33
21
|
SELECTOR_SECTION = SELECTORS_SECTION.join(', ')
|
34
22
|
SELECTOR_SECTION_INSTANT = ("#{selector}[up-instant]" for selector in SELECTORS_SECTION).join(', ')
|
35
23
|
SELECTOR_ACTIVE = ".#{CLASS_ACTIVE}"
|
@@ -43,11 +31,10 @@ up.navigation = (->
|
|
43
31
|
|
44
32
|
sectionUrls = ($section) ->
|
45
33
|
urls = []
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
urls.push(url)
|
34
|
+
for attr in ['up-href', 'href']
|
35
|
+
if url = u.presentAttr($section, attr)
|
36
|
+
url = normalizeUrl(url)
|
37
|
+
urls.push(url)
|
51
38
|
urls
|
52
39
|
|
53
40
|
locationChanged = ->
|
@@ -67,6 +54,33 @@ up.navigation = (->
|
|
67
54
|
else
|
68
55
|
$section.removeClass(CLASS_CURRENT)
|
69
56
|
|
57
|
+
###*
|
58
|
+
Links that are currently loading are assigned the `up-active`
|
59
|
+
class automatically. Style `.up-active` in your CSS to improve the
|
60
|
+
perceived responsiveness of your user interface.
|
61
|
+
|
62
|
+
The `up-active` class will be removed as soon as another
|
63
|
+
page fragment is added or updated through Up.js.
|
64
|
+
|
65
|
+
\#\#\#\# Example
|
66
|
+
|
67
|
+
We have a link:
|
68
|
+
|
69
|
+
<a href="/foo" up-follow>Foo</a>
|
70
|
+
|
71
|
+
The user clicks on the link. While the request is loading,
|
72
|
+
the link has the `up-active` class:
|
73
|
+
|
74
|
+
<a href="/foo" up-follow up-active>Foo</a>
|
75
|
+
|
76
|
+
Once the fragment is loaded the browser's location bar is updated
|
77
|
+
to `http://yourhost/foo` via [`history.pushState`](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#Adding_and_modifying_history_entries):
|
78
|
+
|
79
|
+
<a href="/foo" up-follow up-current>Foo</a>
|
80
|
+
|
81
|
+
@ujs
|
82
|
+
@method [up-active]
|
83
|
+
###
|
70
84
|
sectionClicked = ($section) ->
|
71
85
|
unmarkActive()
|
72
86
|
$section = enlargeClickArea($section)
|
@@ -85,12 +99,46 @@ up.navigation = (->
|
|
85
99
|
up.on 'mousedown', SELECTOR_SECTION_INSTANT, (event, $section) ->
|
86
100
|
if u.isUnmodifiedMouseEvent(event)
|
87
101
|
sectionClicked($section)
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
102
|
+
|
103
|
+
###*
|
104
|
+
Links that point to the current location are assigned
|
105
|
+
the `up-current` class automatically.
|
106
|
+
|
107
|
+
The use case for this is navigation bars:
|
108
|
+
|
109
|
+
<nav>
|
110
|
+
<a href="/foo">Foo</a>
|
111
|
+
<a href="/bar">Bar</a>
|
112
|
+
</nav>
|
113
|
+
|
114
|
+
If the browser location changes to `/foo`, the markup changes to this:
|
115
|
+
|
116
|
+
<nav>
|
117
|
+
<a href="/foo" up-current>Foo</a>
|
118
|
+
<a href="/bar">Bar</a>
|
119
|
+
</nav>
|
120
|
+
|
121
|
+
\#\#\#\# What's considered to be "current"?
|
122
|
+
|
123
|
+
The current location is considered to be either:
|
124
|
+
|
125
|
+
- the URL displayed in the browser window's location bar
|
126
|
+
- the source URL of a currently opened [modal dialog](/up.modal)
|
127
|
+
- the source URL of a currently opened [popup overlay](/up.popup)
|
128
|
+
|
129
|
+
A link matches the current location (and is marked as `.up-current`) if it matches either:
|
130
|
+
|
131
|
+
- the link's `href` attribute
|
132
|
+
- the link's [`up-href`](/up.link#turn-any-element-into-a-link) attribute
|
133
|
+
|
134
|
+
@method [up-current]
|
135
|
+
@ujs
|
136
|
+
###
|
93
137
|
up.bus.on 'fragment:ready', ->
|
138
|
+
# When a fragment is ready it might either have brought a location change
|
139
|
+
# with it, or it might have opened a modal / popup which we consider
|
140
|
+
# to be secondary location sources (the primary being the browser's
|
141
|
+
# location bar).
|
94
142
|
unmarkActive()
|
95
143
|
# If a new fragment is inserted, it's likely to be the result
|
96
144
|
# to the active action. So we can remove the active marker.
|
@@ -126,10 +126,7 @@ up.proxy = (->
|
|
126
126
|
isIdempotent = (request) ->
|
127
127
|
normalizeRequest(request)
|
128
128
|
u.contains(SAFE_HTTP_METHODS, request.method)
|
129
|
-
|
130
|
-
ensureIsIdempotent = (request) ->
|
131
|
-
isIdempotent(request) or u.error("Won't preload non-GET request %o", request)
|
132
|
-
|
129
|
+
|
133
130
|
isFresh = (promise) ->
|
134
131
|
timeSinceTouch = timestamp() - promise.timestamp
|
135
132
|
timeSinceTouch < config.cacheExpiry
|
@@ -238,7 +235,7 @@ up.proxy = (->
|
|
238
235
|
# of a link. The actual link will receive the event
|
239
236
|
# and bubble in a second.
|
240
237
|
unless up.link.childClicked(event, $element)
|
241
|
-
checkPreload(
|
238
|
+
checkPreload($element)
|
242
239
|
|
243
240
|
preload: preload
|
244
241
|
ajax: ajax
|
data/lib/upjs/rails/version.rb
CHANGED
@@ -57,14 +57,29 @@ describe 'up.link', ->
|
|
57
57
|
|
58
58
|
describe 'unobtrusive behavior', ->
|
59
59
|
|
60
|
-
describe '
|
60
|
+
describe '[up-target]', ->
|
61
61
|
|
62
62
|
it 'should have tests'
|
63
63
|
|
64
64
|
describe '[up-follow]', ->
|
65
65
|
|
66
|
-
it
|
67
|
-
|
66
|
+
it "calls up.follow with the clicked link", ->
|
67
|
+
followSpy = up.link.knife.mock('follow')
|
68
|
+
$link = affix('a[href="/path"][up-follow]')
|
69
|
+
up.ready($link)
|
70
|
+
$link.click()
|
71
|
+
expect(followSpy).toHaveBeenCalledWith($link)
|
72
|
+
|
73
|
+
describe '[up-expand]', ->
|
74
|
+
|
75
|
+
it 'copies up-related attributes of a contained link', ->
|
76
|
+
$area = affix('div[up-expand] a[href="/path"][up-target="selector"][up-instant][up-preload]')
|
77
|
+
up.ready($area)
|
78
|
+
expect($area.attr('href')).toEqual('/path')
|
79
|
+
expect($area.attr('up-target')).toEqual('selector')
|
80
|
+
expect($area.attr('up-instant')).toEqual('')
|
81
|
+
expect($area.attr('up-preload')).toEqual('')
|
82
|
+
|
68
83
|
describe '[up-instant]', ->
|
69
84
|
|
70
85
|
beforeEach ->
|
@@ -74,14 +89,10 @@ describe 'up.link', ->
|
|
74
89
|
afterEach ->
|
75
90
|
Knife.reset()
|
76
91
|
|
77
|
-
it 'follows
|
92
|
+
it 'follows a link on mousedown (instead of on click)', ->
|
78
93
|
Trigger.mousedown(@$link)
|
79
94
|
expect(@followSpy.calls.mostRecent().args[0]).toEqual(@$link)
|
80
|
-
|
81
|
-
it 'follows an [up-target] link on mousedown (instead of on click)', ->
|
82
|
-
Trigger.mousedown(@$link)
|
83
|
-
expect(@followSpy.calls.mostRecent().args[0]).toEqual(@$link)
|
84
|
-
|
95
|
+
|
85
96
|
it 'does nothing on mouseup', ->
|
86
97
|
Trigger.mouseup(@$link)
|
87
98
|
expect(@followSpy).not.toHaveBeenCalled()
|
@@ -60,8 +60,10 @@ describe 'up.navigation', ->
|
|
60
60
|
expect($link).not.toHaveClass('up-active')
|
61
61
|
expect($link).toHaveClass('up-current')
|
62
62
|
|
63
|
-
it 'prefers to mark an enclosing [up-
|
64
|
-
$area = affix('div[up-
|
63
|
+
it 'prefers to mark an enclosing [up-expand] click area', ->
|
64
|
+
$area = affix('div[up-expand] a[href="/foo"][up-target=".main"]')
|
65
|
+
up.ready($area)
|
66
|
+
console.log($area)
|
65
67
|
$link = $area.find('a')
|
66
68
|
affix('.main')
|
67
69
|
$link.click()
|