upjs-rails 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/dist/up.js +177 -52
- data/dist/up.min.js +1 -1
- data/lib/assets/javascripts/up/browser.js.coffee +4 -0
- data/lib/assets/javascripts/up/flow.js.coffee +8 -1
- data/lib/assets/javascripts/up/form.js.coffee +47 -20
- data/lib/assets/javascripts/up/motion.js.coffee +85 -43
- data/lib/assets/javascripts/up/util.js.coffee +57 -11
- data/lib/upjs/rails/version.rb +1 -1
- data/spec_app/Gemfile.lock +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 655fa884c0c4a62058305fcaff08f3c30ae120cd
|
4
|
+
data.tar.gz: fb4bf39f399523965d43dff9ec87562448277010
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02a61e45289d9e5250e17a97d27b8bfd7b1614214bbd24f7391619370d9cfc076e4b1b3bda019b4370add571dfd107b9ee4dd63d31f68f572026ab379c033a32
|
7
|
+
data.tar.gz: d79a915cbff359e71e4c9ca4e7805e10f11518d2de78ca3bd2dcf634613b7f0805de6b09b1796e6f32eb08b87a12e1cc053bbe008cdaaf4ab7499ad04848757f
|
data/dist/up.js
CHANGED
@@ -25,7 +25,7 @@ If you use them in your own code, you will get hurt.
|
|
25
25
|
var __slice = [].slice;
|
26
26
|
|
27
27
|
up.util = (function() {
|
28
|
-
var $createElementFromSelector, ajax, castsToFalse, castsToTrue, clientSize, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, detect, each, error, escapePressed, extend, findWithSelf, forceCompositing, get, ifGiven, isArray, isBlank, isDefined, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, keys, last, locationFromXhr, measure, merge, nextFrame, normalizeUrl, only, option, options, prependGhost, presence, presentAttr, resolvedPromise, select, temporaryCss, trim, unwrap;
|
28
|
+
var $createElementFromSelector, ANIMATION_PROMISE_KEY, ajax, castsToFalse, castsToTrue, clientSize, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, detect, each, error, escapePressed, extend, findWithSelf, finishCssAnimate, forceCompositing, get, ifGiven, isArray, isBlank, isDeferred, isDefined, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, keys, last, locationFromXhr, measure, merge, nextFrame, normalizeUrl, only, option, options, prependGhost, presence, presentAttr, resolvableWhen, resolvedDeferred, resolvedPromise, select, temporaryCss, trim, unwrap;
|
29
29
|
get = function(url, options) {
|
30
30
|
options = options || {};
|
31
31
|
options.url = url;
|
@@ -132,12 +132,12 @@ If you use them in your own code, you will get hurt.
|
|
132
132
|
return element;
|
133
133
|
};
|
134
134
|
error = function() {
|
135
|
-
var args,
|
135
|
+
var args, asString;
|
136
136
|
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
137
|
-
|
138
|
-
|
139
|
-
alert(
|
140
|
-
throw
|
137
|
+
console.log.apply(console, ["[UP] Error"].concat(__slice.call(args)));
|
138
|
+
asString = args.length === 1 && up.util.isString(args[0]) ? args[0] : JSON.stringify(args);
|
139
|
+
alert(asString);
|
140
|
+
throw asString;
|
141
141
|
};
|
142
142
|
createSelectorFromElement = function($element) {
|
143
143
|
var classString, classes, id, klass, selector, _i, _len;
|
@@ -252,7 +252,10 @@ If you use them in your own code, you will get hurt.
|
|
252
252
|
return object instanceof jQuery;
|
253
253
|
};
|
254
254
|
isPromise = function(object) {
|
255
|
-
return isFunction(object.then);
|
255
|
+
return isObject(object) && isFunction(object.then);
|
256
|
+
};
|
257
|
+
isDeferred = function(object) {
|
258
|
+
return isPromise(object) && isFunction(object.resolve);
|
256
259
|
};
|
257
260
|
ifGiven = function(object) {
|
258
261
|
if (isGiven(object)) {
|
@@ -408,6 +411,12 @@ If you use them in your own code, you will get hurt.
|
|
408
411
|
/**
|
409
412
|
Animates the given element's CSS properties using CSS transitions.
|
410
413
|
|
414
|
+
If the element is already being animated, the previous animation
|
415
|
+
will instantly jump to its last frame before the new animation begins.
|
416
|
+
|
417
|
+
To improve performance, the element will be forced into compositing for
|
418
|
+
the duration of the animation.
|
419
|
+
|
411
420
|
@method up.util.cssAnimate
|
412
421
|
@param {Element|jQuery|String} elementOrSelector
|
413
422
|
The element to animate.
|
@@ -425,7 +434,7 @@ If you use them in your own code, you will get hurt.
|
|
425
434
|
A promise for the animation's end.
|
426
435
|
*/
|
427
436
|
cssAnimate = function(elementOrSelector, lastFrame, opts) {
|
428
|
-
var $element, deferred, transition, withoutCompositing, withoutTransition;
|
437
|
+
var $element, deferred, endTimeout, transition, withoutCompositing, withoutTransition;
|
429
438
|
$element = $(elementOrSelector);
|
430
439
|
if (up.browser.canCssAnimation()) {
|
431
440
|
opts = options(opts, {
|
@@ -445,15 +454,41 @@ If you use them in your own code, you will get hurt.
|
|
445
454
|
$element.css(lastFrame);
|
446
455
|
deferred.then(withoutCompositing);
|
447
456
|
deferred.then(withoutTransition);
|
448
|
-
|
457
|
+
$element.data(ANIMATION_PROMISE_KEY, deferred);
|
458
|
+
deferred.then(function() {
|
459
|
+
return $element.removeData(ANIMATION_PROMISE_KEY);
|
460
|
+
});
|
461
|
+
endTimeout = setTimeout((function() {
|
449
462
|
return deferred.resolve();
|
450
463
|
}), opts.duration + opts.delay);
|
451
|
-
|
464
|
+
deferred.then(function() {
|
465
|
+
return clearTimeout(endTimeout);
|
466
|
+
});
|
467
|
+
return deferred;
|
452
468
|
} else {
|
453
469
|
$element.css(lastFrame);
|
454
470
|
return resolvedPromise();
|
455
471
|
}
|
456
472
|
};
|
473
|
+
ANIMATION_PROMISE_KEY = 'up-animation-promise';
|
474
|
+
|
475
|
+
/*
|
476
|
+
Completes the animation for the given element by jumping
|
477
|
+
to the last frame instantly. All callbacks chained to
|
478
|
+
the original animation's promise will be called.
|
479
|
+
|
480
|
+
Does nothing if the given element is not currently animating.
|
481
|
+
|
482
|
+
@param {Element|jQuery|String} elementOrSelector
|
483
|
+
*/
|
484
|
+
finishCssAnimate = function(elementOrSelector) {
|
485
|
+
return $(elementOrSelector).each(function() {
|
486
|
+
var existingAnimation;
|
487
|
+
if (existingAnimation = $(this).data(ANIMATION_PROMISE_KEY)) {
|
488
|
+
return existingAnimation.resolve();
|
489
|
+
}
|
490
|
+
});
|
491
|
+
};
|
457
492
|
measure = function($element, options) {
|
458
493
|
var box, coordinates, viewport;
|
459
494
|
coordinates = (options != null ? options.relative : void 0) ? $element.position() : $element.offset();
|
@@ -536,11 +571,25 @@ If you use them in your own code, you will get hurt.
|
|
536
571
|
}
|
537
572
|
return filtered;
|
538
573
|
};
|
539
|
-
|
574
|
+
resolvedDeferred = function() {
|
540
575
|
var deferred;
|
541
576
|
deferred = $.Deferred();
|
542
577
|
deferred.resolve();
|
543
|
-
return deferred
|
578
|
+
return deferred;
|
579
|
+
};
|
580
|
+
resolvedPromise = function() {
|
581
|
+
return resolvedDeferred().promise();
|
582
|
+
};
|
583
|
+
resolvableWhen = function() {
|
584
|
+
var deferreds, joined;
|
585
|
+
deferreds = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
586
|
+
joined = $.when.apply($, deferreds);
|
587
|
+
joined.resolve = function() {
|
588
|
+
return each(deferreds, function(deferred) {
|
589
|
+
return typeof deferred.resolve === "function" ? deferred.resolve() : void 0;
|
590
|
+
});
|
591
|
+
};
|
592
|
+
return joined;
|
544
593
|
};
|
545
594
|
return {
|
546
595
|
presentAttr: presentAttr,
|
@@ -574,6 +623,7 @@ If you use them in your own code, you will get hurt.
|
|
574
623
|
isString: isString,
|
575
624
|
isJQuery: isJQuery,
|
576
625
|
isPromise: isPromise,
|
626
|
+
isDeferred: isDeferred,
|
577
627
|
isHash: isHash,
|
578
628
|
ifGiven: ifGiven,
|
579
629
|
unwrap: unwrap,
|
@@ -581,6 +631,7 @@ If you use them in your own code, you will get hurt.
|
|
581
631
|
measure: measure,
|
582
632
|
temporaryCss: temporaryCss,
|
583
633
|
cssAnimate: cssAnimate,
|
634
|
+
finishCssAnimate: finishCssAnimate,
|
584
635
|
forceCompositing: forceCompositing,
|
585
636
|
prependGhost: prependGhost,
|
586
637
|
escapePressed: escapePressed,
|
@@ -595,7 +646,9 @@ If you use them in your own code, you will get hurt.
|
|
595
646
|
only: only,
|
596
647
|
trim: trim,
|
597
648
|
keys: keys,
|
598
|
-
resolvedPromise: resolvedPromise
|
649
|
+
resolvedPromise: resolvedPromise,
|
650
|
+
resolvedDeferred: resolvedDeferred,
|
651
|
+
resolvableWhen: resolvableWhen
|
599
652
|
};
|
600
653
|
})();
|
601
654
|
|
@@ -612,7 +665,7 @@ Browser interface
|
|
612
665
|
var __slice = [].slice;
|
613
666
|
|
614
667
|
up.browser = (function() {
|
615
|
-
var canCssAnimation, canPushState, ensureConsoleExists, isSupported, loadPage, memoize, u, url;
|
668
|
+
var canCssAnimation, canInputEvent, canPushState, ensureConsoleExists, isSupported, loadPage, memoize, u, url;
|
616
669
|
u = up.util;
|
617
670
|
loadPage = function(url, options) {
|
618
671
|
var $form, csrfParam, csrfToken, metadataInput, method, target;
|
@@ -669,6 +722,9 @@ Browser interface
|
|
669
722
|
canCssAnimation = memoize(function() {
|
670
723
|
return 'transition' in document.documentElement.style;
|
671
724
|
});
|
725
|
+
canInputEvent = memoize(function() {
|
726
|
+
return 'oninput' in document.createElement('input');
|
727
|
+
});
|
672
728
|
isSupported = memoize(function() {
|
673
729
|
return u.isDefined(document.addEventListener);
|
674
730
|
});
|
@@ -678,6 +734,7 @@ Browser interface
|
|
678
734
|
loadPage: loadPage,
|
679
735
|
canPushState: canPushState,
|
680
736
|
canCssAnimation: canCssAnimation,
|
737
|
+
canInputEvent: canInputEvent,
|
681
738
|
isSupported: isSupported
|
682
739
|
};
|
683
740
|
})();
|
@@ -904,6 +961,7 @@ We need to work on this page:
|
|
904
961
|
_results = [];
|
905
962
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
906
963
|
step = _ref1[_i];
|
964
|
+
up.motion.finish(step.selector);
|
907
965
|
$old = u.presence($(".up-popup " + step.selector)) || u.presence($(".up-modal " + step.selector)) || u.presence($(step.selector)) || u.error("Could not find selector (" + step.selector + ") in current body HTML");
|
908
966
|
if (fragment = htmlElement.querySelector(step.selector)) {
|
909
967
|
$new = $(fragment);
|
@@ -1388,7 +1446,7 @@ We need to work on this page:
|
|
1388
1446
|
|
1389
1447
|
(function() {
|
1390
1448
|
up.motion = (function() {
|
1391
|
-
var animate, animation, animations,
|
1449
|
+
var GHOSTING_PROMISE_KEY, animate, animation, animations, assertIsDeferred, config, defaultAnimations, defaultTransitions, defaults, findAnimation, finish, finishGhosting, morph, none, reset, resolvableWhen, snapshot, transition, transitions, u, withGhosts;
|
1392
1450
|
u = up.util;
|
1393
1451
|
config = {
|
1394
1452
|
duration: 300,
|
@@ -1413,6 +1471,9 @@ We need to work on this page:
|
|
1413
1471
|
/**
|
1414
1472
|
Animates an element.
|
1415
1473
|
|
1474
|
+
If the element is already being animated, the previous animation
|
1475
|
+
will instantly jump to its last frame before the new animation begins.
|
1476
|
+
|
1416
1477
|
The following animations are pre-registered:
|
1417
1478
|
|
1418
1479
|
- `fade-in`
|
@@ -1439,9 +1500,10 @@ We need to work on this page:
|
|
1439
1500
|
animate = function(elementOrSelector, animation, options) {
|
1440
1501
|
var $element;
|
1441
1502
|
$element = $(elementOrSelector);
|
1503
|
+
finish($element);
|
1442
1504
|
options = u.options(options, config);
|
1443
1505
|
if (u.isFunction(animation)) {
|
1444
|
-
return
|
1506
|
+
return assertIsDeferred(animation($element, options), animation);
|
1445
1507
|
} else if (u.isString(animation)) {
|
1446
1508
|
return animate($element, findAnimation(animation), options);
|
1447
1509
|
} else if (u.isHash(animation)) {
|
@@ -1453,6 +1515,7 @@ We need to work on this page:
|
|
1453
1515
|
findAnimation = function(name) {
|
1454
1516
|
return animations[name] || u.error("Unknown animation", animation);
|
1455
1517
|
};
|
1518
|
+
GHOSTING_PROMISE_KEY = 'up-ghosting-promise';
|
1456
1519
|
withGhosts = function($old, $new, block) {
|
1457
1520
|
var $newGhost, $oldGhost, newCssMemo, promise;
|
1458
1521
|
$oldGhost = null;
|
@@ -1474,7 +1537,11 @@ We need to work on this page:
|
|
1474
1537
|
display: 'none'
|
1475
1538
|
});
|
1476
1539
|
promise = block($oldGhost, $newGhost);
|
1477
|
-
|
1540
|
+
$old.data(GHOSTING_PROMISE_KEY, promise);
|
1541
|
+
$new.data(GHOSTING_PROMISE_KEY, promise);
|
1542
|
+
promise.then(function() {
|
1543
|
+
$old.removeData(GHOSTING_PROMISE_KEY);
|
1544
|
+
$new.removeData(GHOSTING_PROMISE_KEY);
|
1478
1545
|
$oldGhost.remove();
|
1479
1546
|
$newGhost.remove();
|
1480
1547
|
$old.css({
|
@@ -1482,10 +1549,39 @@ We need to work on this page:
|
|
1482
1549
|
});
|
1483
1550
|
return newCssMemo();
|
1484
1551
|
});
|
1552
|
+
return promise;
|
1553
|
+
};
|
1554
|
+
|
1555
|
+
/*
|
1556
|
+
Completes all animations and transitions for the given element
|
1557
|
+
by jumping to the last animation frame instantly. All callbacks chained to
|
1558
|
+
the original animation's promise will be called.
|
1559
|
+
|
1560
|
+
Does nothing if the given element is not currently animating.
|
1561
|
+
|
1562
|
+
@param {Element|jQuery|String} elementOrSelector
|
1563
|
+
*/
|
1564
|
+
finish = function(elementOrSelector) {
|
1565
|
+
return $(elementOrSelector).each(function() {
|
1566
|
+
var $element;
|
1567
|
+
$element = $(this);
|
1568
|
+
u.finishCssAnimate($element);
|
1569
|
+
return finishGhosting($element);
|
1570
|
+
});
|
1571
|
+
};
|
1572
|
+
finishGhosting = function($element) {
|
1573
|
+
var existingGhosting;
|
1574
|
+
if (existingGhosting = $element.data(GHOSTING_PROMISE_KEY)) {
|
1575
|
+
console.log("EXISTING", existingGhosting);
|
1576
|
+
return typeof existingGhosting.resolve === "function" ? existingGhosting.resolve() : void 0;
|
1577
|
+
}
|
1485
1578
|
};
|
1486
|
-
|
1487
|
-
u.
|
1488
|
-
|
1579
|
+
assertIsDeferred = function(object, origin) {
|
1580
|
+
if (u.isDeferred(object)) {
|
1581
|
+
return object;
|
1582
|
+
} else {
|
1583
|
+
return u.error("Did not return a promise with .then and .resolve methods: ", origin);
|
1584
|
+
}
|
1489
1585
|
};
|
1490
1586
|
|
1491
1587
|
/**
|
@@ -1522,10 +1618,12 @@ We need to work on this page:
|
|
1522
1618
|
options = u.options(config);
|
1523
1619
|
$old = $(source);
|
1524
1620
|
$new = $(target);
|
1621
|
+
finish($old);
|
1622
|
+
finish($new);
|
1525
1623
|
transition = u.presence(transitionOrName, u.isFunction) || transitions[transitionOrName];
|
1526
1624
|
if (transition) {
|
1527
1625
|
return withGhosts($old, $new, function($oldGhost, $newGhost) {
|
1528
|
-
return
|
1626
|
+
return assertIsDeferred(transition($oldGhost, $newGhost, options), transitionOrName);
|
1529
1627
|
});
|
1530
1628
|
} else if (animation = animations[transitionOrName]) {
|
1531
1629
|
$old.hide();
|
@@ -1533,14 +1631,14 @@ We need to work on this page:
|
|
1533
1631
|
} else if (u.isString(transitionOrName) && transitionOrName.indexOf('/') >= 0) {
|
1534
1632
|
parts = transitionOrName.split('/');
|
1535
1633
|
transition = function($old, $new, options) {
|
1536
|
-
return
|
1634
|
+
return resolvableWhen(animate($old, parts[0], options), animate($new, parts[1], options));
|
1537
1635
|
};
|
1538
1636
|
return morph($old, $new, transition, options);
|
1539
1637
|
} else {
|
1540
1638
|
return u.error("Unknown transition: " + transitionOrName);
|
1541
1639
|
}
|
1542
1640
|
} else {
|
1543
|
-
return u.
|
1641
|
+
return u.resolvedDeferred();
|
1544
1642
|
}
|
1545
1643
|
};
|
1546
1644
|
|
@@ -1574,6 +1672,15 @@ We need to work on this page:
|
|
1574
1672
|
return transitions = u.copy(defaultTransitions);
|
1575
1673
|
};
|
1576
1674
|
|
1675
|
+
/**
|
1676
|
+
Returns a new promise that resolves once all promises in the given array resolve.
|
1677
|
+
Other then e.g. `$.then`, the combined promise will have a `resolve` method.
|
1678
|
+
|
1679
|
+
@method up.motion.when
|
1680
|
+
@param promises...
|
1681
|
+
*/
|
1682
|
+
resolvableWhen = u.resolvableWhen;
|
1683
|
+
|
1577
1684
|
/**
|
1578
1685
|
Returns a no-op animation or transition which has no visual effects
|
1579
1686
|
and completes instantly.
|
@@ -1582,7 +1689,7 @@ We need to work on this page:
|
|
1582
1689
|
@return {Promise}
|
1583
1690
|
A resolved promise
|
1584
1691
|
*/
|
1585
|
-
none = u.
|
1692
|
+
none = u.resolvedDeferred;
|
1586
1693
|
animation('none', none);
|
1587
1694
|
animation('fade-in', function($ghost, options) {
|
1588
1695
|
$ghost.css({
|
@@ -1701,29 +1808,31 @@ We need to work on this page:
|
|
1701
1808
|
});
|
1702
1809
|
transition('none', none);
|
1703
1810
|
transition('move-left', function($old, $new, options) {
|
1704
|
-
return
|
1811
|
+
return resolvableWhen(animate($old, 'move-to-left', options), animate($new, 'move-from-right', options));
|
1705
1812
|
});
|
1706
1813
|
transition('move-right', function($old, $new, options) {
|
1707
|
-
return
|
1814
|
+
return resolvableWhen(animate($old, 'move-to-right', options), animate($new, 'move-from-left', options));
|
1708
1815
|
});
|
1709
1816
|
transition('move-up', function($old, $new, options) {
|
1710
|
-
return
|
1817
|
+
return resolvableWhen(animate($old, 'move-to-top', options), animate($new, 'move-from-bottom', options));
|
1711
1818
|
});
|
1712
1819
|
transition('move-down', function($old, $new, options) {
|
1713
|
-
return
|
1820
|
+
return resolvableWhen(animate($old, 'move-to-bottom', options), animate($new, 'move-from-top', options));
|
1714
1821
|
});
|
1715
1822
|
transition('cross-fade', function($old, $new, options) {
|
1716
|
-
return
|
1823
|
+
return resolvableWhen(animate($old, 'fade-out', options), animate($new, 'fade-in', options));
|
1717
1824
|
});
|
1718
1825
|
up.bus.on('framework:ready', snapshot);
|
1719
1826
|
up.bus.on('framework:reset', reset);
|
1720
1827
|
return {
|
1721
1828
|
morph: morph,
|
1722
1829
|
animate: animate,
|
1830
|
+
finish: finish,
|
1723
1831
|
transition: transition,
|
1724
1832
|
animation: animation,
|
1725
1833
|
defaults: defaults,
|
1726
|
-
none: none
|
1834
|
+
none: none,
|
1835
|
+
when: resolvableWhen
|
1727
1836
|
};
|
1728
1837
|
})();
|
1729
1838
|
|
@@ -2044,8 +2153,7 @@ We need to work on this page:
|
|
2044
2153
|
};
|
2045
2154
|
|
2046
2155
|
/**
|
2047
|
-
Observes an input field
|
2048
|
-
Executes code when the value changes.
|
2156
|
+
Observes an input field and executes code when its value changes.
|
2049
2157
|
|
2050
2158
|
up.observe('input', { change: function(value, $input) {
|
2051
2159
|
up.submit($input)
|
@@ -2062,17 +2170,20 @@ We need to work on this page:
|
|
2062
2170
|
If given as a function, it must take two arguments (`value`, `$field`).
|
2063
2171
|
If given as a string, it will be evaled as Javascript code in a context where
|
2064
2172
|
(`value`, `$field`) are set.
|
2065
|
-
@param {Number} [options.
|
2173
|
+
@param {Number} [options.delay=0]
|
2174
|
+
The number of miliseconds to wait before executing the callback
|
2175
|
+
after the input value changes. Use this to limit how often the callback
|
2176
|
+
will be invoked for a fast typist.
|
2066
2177
|
*/
|
2067
2178
|
observe = function(fieldOrSelector, options) {
|
2068
|
-
var $field, callback, check, clearTimer, codeOnChange,
|
2179
|
+
var $field, callback, callbackPromise, callbackTimer, changeEvents, check, clearTimer, codeOnChange, delay, knownValue, nextCallback, runNextCallback;
|
2069
2180
|
$field = $(fieldOrSelector);
|
2070
|
-
options = u.options(options
|
2071
|
-
|
2072
|
-
|
2181
|
+
options = u.options(options);
|
2182
|
+
delay = u.option($field.attr('up-delay'), options.delay, 0);
|
2183
|
+
delay = parseInt(delay);
|
2073
2184
|
knownValue = null;
|
2074
|
-
timer = null;
|
2075
2185
|
callback = null;
|
2186
|
+
callbackTimer = null;
|
2076
2187
|
if (codeOnChange = $field.attr('up-observe')) {
|
2077
2188
|
callback = function(value, $field) {
|
2078
2189
|
return eval(codeOnChange);
|
@@ -2082,6 +2193,16 @@ We need to work on this page:
|
|
2082
2193
|
} else {
|
2083
2194
|
u.error('observe: No change callback given');
|
2084
2195
|
}
|
2196
|
+
callbackPromise = u.resolvedPromise();
|
2197
|
+
nextCallback = null;
|
2198
|
+
runNextCallback = function() {
|
2199
|
+
var returnValue;
|
2200
|
+
if (nextCallback) {
|
2201
|
+
returnValue = nextCallback();
|
2202
|
+
nextCallback = null;
|
2203
|
+
return returnValue;
|
2204
|
+
}
|
2205
|
+
};
|
2085
2206
|
check = function() {
|
2086
2207
|
var skipCallback, value;
|
2087
2208
|
value = $field.val();
|
@@ -2089,26 +2210,30 @@ We need to work on this page:
|
|
2089
2210
|
if (knownValue !== value) {
|
2090
2211
|
knownValue = value;
|
2091
2212
|
if (!skipCallback) {
|
2092
|
-
|
2213
|
+
clearTimer();
|
2214
|
+
nextCallback = function() {
|
2215
|
+
return callback.apply($field.get(0), [value, $field]);
|
2216
|
+
};
|
2217
|
+
return callbackTimer = setTimeout(function() {
|
2218
|
+
return callbackPromise.then(function() {
|
2219
|
+
var returnValue;
|
2220
|
+
returnValue = runNextCallback();
|
2221
|
+
if (u.isPromise(returnValue)) {
|
2222
|
+
return callbackPromise = returnValue;
|
2223
|
+
} else {
|
2224
|
+
return callbackPromise = u.resolvedPromise();
|
2225
|
+
}
|
2226
|
+
});
|
2227
|
+
}, delay);
|
2093
2228
|
}
|
2094
2229
|
}
|
2095
2230
|
};
|
2096
|
-
resetTimer = function() {
|
2097
|
-
if (timer) {
|
2098
|
-
clearTimer();
|
2099
|
-
return startTimer();
|
2100
|
-
}
|
2101
|
-
};
|
2102
2231
|
clearTimer = function() {
|
2103
|
-
|
2104
|
-
return timer = null;
|
2105
|
-
};
|
2106
|
-
startTimer = function() {
|
2107
|
-
return timer = setInterval(check, options.frequency);
|
2232
|
+
return clearTimeout(callbackTimer);
|
2108
2233
|
};
|
2109
|
-
|
2234
|
+
changeEvents = up.browser.canInputEvent() ? 'input' : 'keypress paste cut change click propertychange';
|
2235
|
+
$field.on(changeEvents, check);
|
2110
2236
|
check();
|
2111
|
-
startTimer();
|
2112
2237
|
return clearTimer;
|
2113
2238
|
};
|
2114
2239
|
|
data/dist/up.min.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
(function(){window.up={}}).call(this),function(){var t=[].slice;up.util=function(){var n,e,r,o,i,u,a,s,c,p,l,f,m,d,h,v,g,y,b,w,k,S,C,T,x,P,E,A,F,U,O,j,z,D,H,L,M,W,G,I,X,q,N,V,R,B,J,Z,_,Q,K,Y,tn,nn;return w=function(t,n){return n=n||{},n.url=t,e(n)},e=function(t){return t.selector&&(t.headers={"X-Up-Selector":t.selector}),$.ajax(t)},D=function(t,n){return(""===n||"80"===n)&&"http:"===t||"443"===n&&"https:"===t},N=function(t,n){var e,r,o;return e=H(t)?$("<a>").attr({href:t}).get(0):nn(t),r=e.protocol+"//"+e.hostname,D(e.protocol,e.port)||(r+=":"+e.port),o=e.pathname,(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},n=function(t){var n,e,r,o,i,u,a,s,c,p,l,f,m,d,h,v;for(l=t.split(/[ >]/),r=null,p=m=0,h=l.length;h>m;p=++m){for(u=l[p],i=u.match(/(^|\.|\#)[A-Za-z0-9\-_]+/g),f="div",o=[],c=null,d=0,v=i.length;v>d;d++)switch(a=i[d],a[0]){case".":o.push(a.substr(1));break;case"#":c=a.substr(1);break;default:f=a}s="<"+f,o.length&&(s+=' class="'+o.join(" ")+'"'),c&&(s+=' id="'+c+'"'),s+=">",n=$(s),e&&n.appendTo(e),0===p&&(r=n),e=n}return r},c=function(t,n){var e;return e=document.createElement(t),j(n)&&(e.innerHTML=n),e},h=function(){var n,e;throw n=1<=arguments.length?t.call(arguments,0):[],e=1===n.length&&up.util.isString(n[0])?n[0]:JSON.stringify(n),console.log.apply(console,["[UP] Error: "+e].concat(t.call(n))),alert(e),e},l=function(t){var n,e,r,o,i,u,a;for(console.log("Creating selector from element",t),e=(n=t.attr("class"))?n.split(" "):[],r=t.attr("id"),i=t.prop("tagName").toLowerCase(),r&&(i+="#"+r),u=0,a=e.length;a>u;u++)o=e[u],i+="."+o;return i},p=function(t){var n,e,r,o,i,u,a,s,p,l,f,m;return p=function(t){return"<"+t+"(?: [^>]*)?>"},u=function(t){return"</"+t+">"},n="(?:.|\\n)*?",i=function(t){return"("+t+")"},m=new RegExp(p("head")+n+p("title")+i(n)+u("title")+n+u("body"),"i"),o=new RegExp(p("body")+i(n)+u("body"),"i"),(r=t.match(o))?(s=document.createElement("html"),e=c("body",r[1]),s.appendChild(e),(f=t.match(m))&&(a=c("head"),s.appendChild(a),l=c("title",f[1]),a.appendChild(l)),s):c("div",t)},g=$.extend,tn=$.trim,M=Object.keys||function(t){var n,e,r,o;for(e=[],r=0,o=t.length;o>r;r++)n=t[r],t.hasOwnProperty(n)&&e.push(n);return e},d=function(t,n){var e,r,o,i,u;for(u=[],e=o=0,i=t.length;i>o;e=++o)r=t[e],u.push(n(r,e));return u},U=function(t){return null===t},L=function(t){return void 0===t},T=function(t){return!L(t)},F=function(t){return L(t)||U(t)},P=function(t){return!F(t)},C=function(t){return F(t)||O(t)&&0===M(t).length||0===t.length},Z=function(t,n){return null==n&&(n=j),n(t)?t:null},j=function(t){return!C(t)},x=function(t){return"function"==typeof t},H=function(t){return"string"==typeof t},E=function(t){return"object"==typeof t&&!!t},O=function(t){return E(t)||"function"==typeof t},A=function(t){return t instanceof jQuery},z=function(t){return x(t.then)},k=function(t){return P(t)?t:void 0},S=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},a=function(t){return S(t)?t.slice():g({},t)},nn=function(t){return A(t)?t.get(0):t},X=function(t,n){return g(a(t),n)},B=function(t,n){var e,r,o,i;if(o=t?a(t):{},n)for(r in n)e=n[r],i=o[r],P(i)?O(e)&&O(i)&&(o[r]=B(i,e)):o[r]=e;return o},R=function(){var n,e,r,o,i,u;for(e=1<=arguments.length?t.call(arguments,0):[],r=null,i=0,u=e.length;u>i;i++)if(n=e[i],o=n,x(o)&&(o=o()),j(o)){r=o;break}return r},m=function(t,n){var e,r,o,i;for(r=null,o=0,i=t.length;i>o;o++)if(e=t[o],n(e)){r=e;break}return r},K=function(t,n){var e;return e=[],d(t,function(t){return n(t)?e.push(t):void 0}),e},_=function(){var n,e,r,o;return n=arguments[0],r=2<=arguments.length?t.call(arguments,1):[],o=function(){var t,o,i;for(i=[],t=0,o=r.length;o>t;t++)e=r[t],i.push(n.attr(e));return i}(),m(o,j)},q=function(t){return setTimeout(t,0)},W=function(t){return t[t.length-1]},i=function(){var t;return t=document.documentElement,{width:t.clientWidth,height:t.clientHeight}},Y=function(t,n,e){var r,o;return o=t.css(M(n)),t.css(n),r=function(){return t.css(o)},e?(e(),r()):r},b=function(t){var n,e;return e=t.css(["transform","-webkit-transform"]),C(e)?(n=function(){return t.css(e)},t.css({transform:"translateZ(0)","-webkit-transform":"translateZ(0)"})):n=function(){},n},f=function(t,n,e){var r,o,i,u,a;return r=$(t),up.browser.canCssAnimation()?(e=B(e,{duration:300,delay:0,easing:"ease"}),o=$.Deferred(),i={"transition-property":M(n).join(", "),"transition-duration":e.duration+"ms","transition-delay":e.delay+"ms","transition-timing-function":e.easing},u=b(r),a=Y(r,i),r.css(n),o.then(u),o.then(a),setTimeout(function(){return o.resolve()},e.duration+e.delay),o.promise()):(r.css(n),Q())},I=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=i(),e.right=o.width-(e.left+e.width),e.bottom=o.height-(e.top+e.height)),e},s=function(t,n){var e,r,o,i,u;for(i=t.get(0).attributes,u=[],r=0,o=i.length;o>r;r++)e=i[r],u.push(e.specified?n.attr(e.name,e.value):void 0);return u},J=function(t){var n,e;return e=I(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)},y=function(t,n){return t.find(n).addBack(n)},v=function(t){return 27===t.keyCode},u=function(t,n){return t.indexOf(n)>=0},o=function(t){return"true"===String(t)},r=function(t){return"false"===String(t)},G=function(t){return t.getResponseHeader("X-Up-Current-Location")},V=function(){var n,e,r,o,i,u;for(o=arguments[0],r=2<=arguments.length?t.call(arguments,1):[],n={},i=0,u=r.length;u>i;i++)e=r[i],o.hasOwnProperty(e)&&(n[e]=o[e]);return n},Q=function(){var t;return t=$.Deferred(),t.resolve(),t.promise()},{presentAttr:_,createElement:c,normalizeUrl:N,createElementFromHtml:p,$createElementFromSelector:n,createSelectorFromElement:l,get:w,ajax:e,extend:g,copy:a,merge:X,options:B,option:R,error:h,each:d,detect:m,select:K,last:W,isNull:U,isDefined:T,isUndefined:L,isGiven:P,isMissing:F,isPresent:j,isBlank:C,presence:Z,isObject:O,isFunction:x,isString:H,isJQuery:A,isPromise:z,isHash:E,ifGiven:k,unwrap:nn,nextFrame:q,measure:I,temporaryCss:Y,cssAnimate:f,forceCompositing:b,prependGhost:J,escapePressed:v,copyAttributes:s,findWithSelf:y,contains:u,isArray:S,castsToTrue:o,castsToFalse:r,locationFromXhr:G,clientSize:i,only:V,trim:tn,keys:M,resolvedPromise:Q}}()}.call(this),function(){var t=[].slice;up.browser=function(){var n,e,r,o,i,u,a,s;return a=up.util,i=function(t,n){var e,r,o,i,u,s;return null==n&&(n={}),u=a.option(n.method,"get").toLowerCase(),"get"===u?location.href=t:$.rails?(s=n.target,o=$.rails.csrfToken(),r=$.rails.csrfParam(),e=$("<form method='post' action='"+t+"'></form>"),i="<input name='_method' value='"+u+"' type='hidden' />",a.isDefined(r)&&a.isDefined(o)&&(i+="<input name='"+r+"' value='"+o+"' type='hidden' />"),s&&e.attr("target",s),e.hide().append(i).appendTo("body"),e.submit()):error("Can't fake a "+u.toUpperCase()+" request without Rails UJS")},s=function(){return location.href},r=function(){var t;return window.console||(window.console={}),(t=window.console).log||(t.log=function(){})},u=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))}},e=u(function(){return a.isDefined(history.pushState)}),n=u(function(){return"transition"in document.documentElement.style}),o=u(function(){return a.isDefined(document.addEventListener)}),{url:s,ensureConsoleExists:r,loadPage:i,canPushState:e,canCssAnimation:n,isSupported:o}}()}.call(this),function(){var t=[].slice;up.bus=function(){var n,e,r,o,i,u,a;return 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]=up.util.copy(t));return o},u=function(){return n=up.util.copy(r)},i=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):[],console.log("bus emitting",o,n),r=e(o),up.util.each(r,function(t){return t.apply(null,n)})},i("framework:ready",a),i("framework:reset",u),{on:i,emit:o}}()}.call(this),function(){up.flow=function(){var t,n,e,r,o,i,u,a,s,c,p,l;return l=up.util,s=function(t,n){var e;return e=$(t),l.isPresent(n)&&(n=l.normalizeUrl(n)),e.attr("up-source",n)},c=function(t){var n;return n=$(t).closest("[up-source]"),l.presence(n.attr("up-source"))||up.browser.url()},u=function(t,n,e){var o;return e=l.options(e),o=l.presence(t)?t:l.createSelectorFromElement($(t)),up.browser.canPushState()||l.castsToFalse(e.history)?l.ajax({url:n,selector:o},l.only(e,"method")).done(function(t,i,u){var a;return(a=l.locationFromXhr(u))&&(n=a),(l.isMissing(e.history)||l.castsToTrue(e.history))&&(e.history=n),(l.isMissing(e.source)||l.castsToTrue(e.source))&&(e.source=n),r(o,t,e)}).fail(l.error):void up.browser.loadPage(n,l.only(e,"method"))},r=function(t,n,e){var r,i,u,a,s,c,f,m,d,h;for(e=l.options(e,{historyMethod:"push"}),"false"===e.history&&(e.history=null),e.source=l.option(e.source,e.history),a=l.createElementFromHtml(n),e.title||(e.title=null!=(m=a.querySelector("title"))?m.textContent:void 0),d=o(t,e),h=[],c=0,f=d.length;f>c;c++)s=d[c],i=l.presence($(".up-popup "+s.selector))||l.presence($(".up-modal "+s.selector))||l.presence($(s.selector))||l.error("Could not find selector ("+s.selector+") in current body HTML"),(u=a.querySelector(s.selector))?(r=$(u),h.push(p(i,r,s.pseudoClass,s.transition,e))):h.push(l.error("Could not find selector ("+s.selector+") in response ("+n+")"));return h},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)),s(n,e.source),t(n),up.ready(n)},p=function(t,r,o,i,u){var a,s;return i||(i="none"),o?(s="before"===o?"prepend":"append",a=r.children(),t[s](r.contents()),l.copyAttributes(r,t),e(a,u),up.animate(r,i)):n(t,{animation:function(){return r.insertAfter(t),e(r,u),t.is("body")&&"none"!==i&&l.error("Cannot apply transitions to body-elements",i),up.morph(t,r,i)}})},o=function(t,n){var e,r,o,i,u,a,s,c,p,f,m;for(s=n.transition||n.animation||"none",e=/\ *,\ */,r=t.split(e),l.isPresent(s)&&(c=s.split(e)),m=[],o=p=0,f=r.length;f>p;o=++p)i=r[o],u=i.match(/^(.+?)(?:\:(before|after))?$/),a=c[o]||l.last(c),m.push({selector:u[1],pseudoClass:u[2],transition:a});return m},t=function(t){var n,e;return e="[autofocus]:last",n=l.findWithSelf(t,e),n.length&&n.get(0)!==document.activeElement?n.focus():void 0},n=function(t,n){var e,r;return e=$(t),n=l.options(n,{animation:"none"}),e.addClass("up-destroying"),l.isPresent(n.url)&&up.history.push(n.url),l.isPresent(n.title)&&(document.title=n.title),up.bus.emit("fragment:destroy",e),r=l.presence(n.animation,l.isPromise)||up.motion.animate(e,n.animation),r.then(function(){return e.remove()})},i=function(t){var n;return n=c(t),u(t,n)},a=function(){return up.bus.emit("framework:reset")},up.bus.on("app:ready",function(){return s(document.body,up.browser.url())}),{replace:u,reload:i,destroy:n,implant:r,reset:a}}(),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,i,u,a,s,c,p,l,f,m,d,h,v;return v=up.util,n="up-destroyable",e="up-destroyer",l=[],s=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)])}],l.push(r),(o=$(document)).on.apply(o,r)},i=[],a=null,o=function(){var n,e,r,o;return o=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],up.browser.isSupported()?(e=n.pop(),r=v.options(n[0],{batch:!1}),i.push({selector:o,callback:e,batch:r.batch})):void 0},r=function(t,r,o){var i;return i=t.callback.apply(o,[r]),v.isFunction(i)?(r.addClass(n),r.data(e,i)):void 0},u=function(t){var n,e,o,u,a;for(console.log("Compiling fragment",t),a=[],o=0,u=i.length;u>o;o++)e=i[o],n=v.findWithSelf(t,e.selector),a.push(n.length?e.batch?r(e,n,n.get()):n.each(function(){return r(e,$(this),this)}):void 0);return a},c=function(t){return v.findWithSelf(t,"."+n).each(function(){var t,n;return t=$(this),(n=t.data(e))()})},h=function(){return s=v.copy(l),a=v.copy(i)},d=function(){var t,n,e,r;for(n=0,e=l.length;e>n;n++)t=l[n],v.contains(s,t)||(r=$(document)).off.apply(r,t);return l=v.copy(s),i=v.copy(a)},m=function(t){var n;return n=$(t),up.bus.emit("fragment:ready",n),n},f=function(t){return p("keydown","body",function(n){return v.escapePressed(n)?t(n):void 0})},up.bus.on("app:ready",function(){return m(document.body)}),up.bus.on("fragment:ready",u),up.bus.on("fragment:destroy",c),up.bus.on("framework:ready",h),up.bus.on("framework:reset",d),{awaken:o,on:p,ready:m,onEscape:f}}(),up.awaken=up.magic.awaken,up.on=up.magic.on,up.ready=up.magic.ready}.call(this),function(){up.history=function(){var t,n,e,r,o,i;return i=up.util,t=function(t){return i.normalizeUrl(t,{hash:!0})===i.normalizeUrl(up.browser.url(),{hash:!0})},o=function(e,r){return r=i.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)):i.error("This browser doesn't support history.pushState")},e=function(t){var n;return n=t.originalEvent.state,console.log("popping state",n),console.log("current href",up.browser.url()),(null!=n?n.fromUp:void 0)?up.visit(up.browser.url(),{historyMethod:"replace"}):console.log("strange state",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,i,u,a,s,c,p,l,f,m,d,h,v;return h=up.util,o={duration:300,delay:0,easing:"ease"},e={},i={},d={},u={},a=function(t){return h.extend(o,t)},t=function(n,e,i){var u;return u=$(n),i=h.options(i,o),h.isFunction(e)?r(e(u,i),["Animation did not return a Promise",e]):h.isString(e)?t(u,s(e),i):h.isHash(e)?h.cssAnimate(u,e,i):h.error("Unknown animation type",e)},s=function(t){return e[t]||h.error("Unknown animation",n)},v=function(t,n,e){var r,o,i,u;return o=null,r=null,h.temporaryCss(n,{display:"none"},function(){return o=h.prependGhost(t).addClass("up-destroying")}),h.temporaryCss(t,{display:"none"},function(){return r=h.prependGhost(n)}),t.css({visibility:"hidden"}),i=h.temporaryCss(n,{display:"none"}),u=e(o,r),u.then(function(){return o.remove(),r.remove(),t.css({display:"none"}),i()})},r=function(t,n){return h.isPromise(t)||h.error.apply(h,n),t},c=function(n,i,u,a){var s,p,l,f,m;return up.browser.canCssAnimation()?(a=h.options(o),p=$(n),s=$(i),m=h.presence(u,h.isFunction)||d[u],m?v(p,s,function(t,n){return r(m(t,n,a),["Transition did not return a promise",u])}):(l=e[u])?(p.hide(),t(s,l,a)):h.isString(u)&&u.indexOf("/")>=0?(f=u.split("/"),m=function(n,e,r){return $.when(t(n,f[0],r),t(e,f[1],r))},c(p,s,m,a)):h.error("Unknown transition: "+u)):h.resolvedPromise()},m=function(t,n){return d[t]=n},n=function(t,n){return e[t]=n},f=function(){return i=h.copy(e),u=h.copy(d)},l=function(){return e=h.copy(i),d=h.copy(u)},p=h.resolvedPromise,n("none",p),n("fade-in",function(n,e){return n.css({opacity:0}),t(n,{opacity:1},e)}),n("fade-out",function(n,e){return n.css({opacity:1}),t(n,{opacity:0},e)}),n("move-to-top",function(n,e){var r,o;return r=h.measure(n),o=r.top+r.height,n.css({"margin-top":"0px"}),t(n,{"margin-top":"-"+o+"px"},e)}),n("move-from-top",function(n,e){var r,o;return r=h.measure(n),o=r.top+r.height,n.css({"margin-top":"-"+o+"px"}),t(n,{"margin-top":"0px"},e)}),n("move-to-bottom",function(n,e){var r,o;return r=h.measure(n),o=h.clientSize().height-r.top,n.css({"margin-top":"0px"}),t(n,{"margin-top":o+"px"},e)}),n("move-from-bottom",function(n,e){var r,o;return r=h.measure(n),o=h.clientSize().height-r.top,n.css({"margin-top":o+"px"}),t(n,{"margin-top":"0px"},e)}),n("move-to-left",function(n,e){var r,o;return r=h.measure(n),o=r.left+r.width,n.css({"margin-left":"0px"}),t(n,{"margin-left":"-"+o+"px"},e)}),n("move-from-left",function(n,e){var r,o;return r=h.measure(n),o=r.left+r.width,n.css({"margin-left":"-"+o+"px"}),t(n,{"margin-left":"0px"},e)}),n("move-to-right",function(n,e){var r,o;return r=h.measure(n),o=h.clientSize().width-r.left,n.css({"margin-left":"0px"}),t(n,{"margin-left":o+"px"},e)}),n("move-from-right",function(n,e){var r,o;return r=h.measure(n),o=h.clientSize().width-r.left,n.css({"margin-left":o+"px"}),t(n,{"margin-left":"0px"},e)}),n("roll-down",function(n,e){var r,o;return r=n.height(),o=h.temporaryCss(n,{height:"0px",overflow:"hidden"}),t(n,{height:r+"px"},e).then(o)}),m("none",p),m("move-left",function(n,e,r){return $.when(t(n,"move-to-left",r),t(e,"move-from-right",r))}),m("move-right",function(n,e,r){return $.when(t(n,"move-to-right",r),t(e,"move-from-left",r))}),m("move-up",function(n,e,r){return $.when(t(n,"move-to-top",r),t(e,"move-from-bottom",r))}),m("move-down",function(n,e,r){return $.when(t(n,"move-to-bottom",r),t(e,"move-from-top",r))}),m("cross-fade",function(n,e,r){return $.when(t(n,"fade-out",r),t(e,"fade-in",r))}),up.bus.on("framework:ready",f),up.bus.on("framework:reset",l),{morph:c,animate:t,transition:m,animation:n,defaults:a,none:p}}(),up.transition=up.motion.transition,up.animation=up.motion.animation,up.morph=up.motion.morph,up.animate=up.motion.animate}.call(this),function(){up.link=function(){var t,n,e,r,o;return r=up.util,o=function(t,n){return console.log("up.visit",t),up.replace("body",t,n)},t=function(t,n){var e,o,i;return e=$(t),n=r.options(n),i=r.option(e.attr("href"),e.attr("up-follow")),o=r.option(n.target,e.attr("up-target"),"body"),n.transition=r.option(n.transition,e.attr("up-transition"),e.attr("up-animation")),n.history=r.option(n.history,e.attr("up-history")),up.replace(o,i,n)},n=function(t){var n;return n=$(t),n.is("a")||r.presentAttr(n,"up-follow")?n:n.find("a:first")},e=function(t){var e;return(e=n(t))?r.option(e.attr("href"),e.attr("up-follow")):void 0},up.on("click","a[up-target]",function(n,e){return n.preventDefault(),t(e)}),up.on("click","[up-follow]",function(e,r){var o;return o=function(){var t,n;return t=$(e.target),n=t.closest("a, [up-follow]"),n.length&&r.find(n).length},o()?void 0:(e.preventDefault(),t(n(r)))}),{visit:o,follow:t,resolve:n,resolveUrl:e}}(),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,c,p,l,f;return e=$(t).closest("form"),n=u.options(n),c=u.option(n.target,e.attr("up-target"),"body"),r=u.option(n.failTarget,e.attr("up-fail-target"),function(){return u.createSelectorFromElement(e)}),i=u.option(n.history,e.attr("up-history"),!0),p=u.option(n.transition,e.attr("up-transition")),o=u.option(n.failTransition,e.attr("up-fail-transition")),a=u.option(n.method,e.attr("up-method"),e.attr("data-method"),e.attr("method"),"post").toUpperCase(),f=u.option(n.url,e.attr("action"),up.browser.url()),e.addClass("up-active"),up.browser.canPushState()||u.castsToFalse(i)?(s={url:f,type:a,data:e.serialize(),selector:c},l=function(t){var n;return f=i?"false"===i?!1:u.isString(i)?i:(n=u.locationFromXhr(t))?n:"GET"===s.type?s.url+"?"+s.data:void 0:void 0,u.option(f,!1)},u.ajax(s).always(function(){return e.removeClass("up-active")}).done(function(t,n,e){return up.flow.implant(c,t,{history:l(e),transition:p})}).fail(function(t){var n;return n=t.responseText,up.flow.implant(r,n,{transition:o})})):void e.get(0).submit()},observe=function(fieldOrSelector,options){var $field,callback,check,clearTimer,codeOnChange,knownValue,resetTimer,startTimer,timer;return $field=$(fieldOrSelector),options=u.options(options,{frequency:500}),knownValue=null,timer=null,callback=null,(codeOnChange=$field.attr("up-observe"))?callback=function(value,$field){return eval(codeOnChange)}:options.change?callback=options.change:u.error("observe: No change callback given"),check=function(){var t,n;return n=$field.val(),t=_.isNull(knownValue),knownValue===n||(knownValue=n,t)?void 0:callback.apply($field.get(0),[n,$field])},resetTimer=function(){return timer?(clearTimer(),startTimer()):void 0},clearTimer=function(){return clearInterval(timer),timer=null},startTimer=function(){return timer=setInterval(check,options.frequency)},$field.bind("keyup click mousemove",resetTimer),check(),startTimer(),clearTimer},up.on("submit","form[up-target]",function(t,n){return t.preventDefault(),submit(n)}),up.awaken("[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,i,u,a,s,c,p;return c=up.util,e={openAnimation:"fade-in",closeAnimation:"fade-out",origin:"bottom-right"},o=function(t){return c.extend(e,t)},a=function(t,n,e){var r,o;return o=c.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 c.error("Unknown origin",e)}}(),n.attr("up-origin",e),n.css(r),i(n)},i=function(t){var n,e,r,o,i,u,a;if(e=c.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&&((i=parseInt(t.css("left")))?t.css("left",i-r):(u=parseInt(t.css("right")))&&t.css("right",u+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)}},r=function(t,n,e){var r,o;return o=c.$createElementFromSelector(".up-popup"),e&&o.attr("up-sticky",""),o.attr("up-previous-url",up.browser.url()),o.attr("up-previous-title",document.title),r=c.$createElementFromSelector(n),r.appendTo(o),o.appendTo(document.body),o.hide(),o},p=function(t,n,e,r){return n.show(),a(t,n,e),up.animate(n,r)},u=function(t,o){var i,u,a,s,l,f,m,d;return i=$(t),o=c.options(o),d=c.option(i.attr("href")),f=c.option(o.target,i.attr("up-popup"),"body"),l=c.option(o.origin,i.attr("up-origin"),e.origin),a=c.option(o.animation,i.attr("up-animation"),e.openAnimation),m=c.option(o.sticky,i.is("[up-sticky]")),s=up.browser.canPushState()?c.option(o.history,i.attr("up-history"),!1):!1,n(),u=r(i,f,m),up.replace(f,d,{history:s,insert:function(){return p(i,u,l,a)}})},s=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=c.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():u(e)}),up.on("click","body",function(t){var e;return e=$(t.target),e.closest(".up-popup").length||e.closest("[up-popup]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){return n.closest(".up-popup").length?void 0:t()}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,e){return e.closest(".up-popup")?n():void 0}),up.bus.on("framework:reset",n),{open:u,close:n,source:s,defaults:o}}()}.call(this),function(){up.modal=function(){var t,n,e,r,o,i,u,a,s,c;return s=up.util,e={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>'}},o=function(t){return s.extend(e,t)},a=function(){var t;return t=e.template,s.isFunction(t)?t(e):t},r=function(t,n,e,r){var o,i,u,c;return u=$(a()),r&&u.attr("up-sticky",""),u.attr("up-previous-url",up.browser.url()),u.attr("up-previous-title",document.title),i=u.find(".up-modal-dialog"),s.isPresent(n)&&i.css("width",n),s.isPresent(e)&&i.css("height",e),o=i.find(".up-modal-content"),c=s.$createElementFromSelector(t),c.appendTo(o),u.appendTo(document.body),u.hide(),u},c=function(t,n){return t.show(),up.animate(t,n)},i=function(t,o){var i,u,a,p,l,f,m,d,h;return i=$(t),o=s.options(o),d=s.option(i.attr("href")),f=s.option(o.target,i.attr("up-modal"),"body"),h=s.option(o.width,i.attr("up-width"),e.width),p=s.option(o.height,i.attr("up-height"),e.height),a=s.option(o.animation,i.attr("up-animation"),e.openAnimation),m=s.option(o.sticky,i.is("[up-sticky]")),l=up.browser.canPushState()?s.option(o.history,i.attr("up-history"),!0):!1,n(),u=r(f,h,p,m),up.replace(f,d,{history:l,insert:function(){return c(u,a)}})},u=function(){var t;return t=$(".up-modal"),t.is(".up-destroying")?void 0:t.find("[up-source]").attr("up-source")},n=function(t){var n;return n=$(".up-modal"),n.length?(t=s.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-modal").is("[up-sticky]")?void 0:n()},up.on("click","a[up-modal]",function(t,e){return t.preventDefault(),e.is(".up-current")?n():i(e)}),up.on("click","body",function(t){var e;return e=$(t.target),e.closest(".up-modal-dialog").length||e.closest("[up-modal]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){return n.closest(".up-modal").length?void 0:(console.log("fragment inserted",n,n.closest(".up-modal")),t())}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,e){return e.closest(".up-modal")?n():void 0}),up.bus.on("framework:reset",n),{open:i,close:n,source:u,defaults:o}}()}.call(this),function(){up.tooltip=function(){var t,n,e,r,o;return o=up.util,r=function(t,n,e){var r,i,u;return i=o.measure(t),u=o.measure(n),r=function(){switch(e){case"top":return{left:i.left+.5*(i.width-u.width),top:i.top-u.height};case"bottom":return{left:i.left+.5*(i.width-u.width),top:i.top+i.height};default:return o.error("Unknown origin",e)}}(),n.attr("up-origin",e),n.css(r)},n=function(t){return o.$createElementFromSelector(".up-tooltip").html(t).appendTo(document.body)},e=function(e,i){var u,a,s,c,p;return null==i&&(i={}),u=$(e),c=o.option(i.html,u.attr("up-tooltip")),p=o.option(i.origin,u.attr("up-origin"),"top"),s=o.option(i.animation,u.attr("up-animation"),"fade-in"),t(),a=n(c),r(u,a,p),up.animate(a,s,i)},t=function(t){var n;return n=$(".up-tooltip"),n.length?(t=o.options(t,{animation:"fade-out"}),up.destroy(n,t)):void 0},up.awaken("[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,i,u,a,s,c;return s=up.util,t="up-active",n="up-current",r="a[href], a[up-target], [up-follow], [up-modal], [up-popup]",e="."+t,u=function(t){return s.isPresent(t)?s.normalizeUrl(t,{search:!1,stripTrailingSlash:!0}):void 0},i=function(){var t,e,o;return o=u(up.browser.url()),t=u(up.modal.source()),e=u(up.popup.source()),s.each($(r),function(r){var i,a;return i=$(r),a=up.link.resolveUrl(i),a=u(a),a===o||a===t||a===e?i.addClass(n):i.removeClass(n)})},a=function(n){return c(),n=o(n),n.addClass(t)},o=function(t){return s.presence(t.parents(r))||t},c=function(){return $(e).removeClass(t)},up.on("click",r,function(t,n){return a(n)}),up.bus.on("fragment:ready",function(){return c(),i()}),up.bus.on("fragment:destroy",function(t){return t.is(".up-modal, .up-popup")?i():void 0})}()}.call(this),function(){up.marker=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-marker]").each(function(){var t;return t=$(this),n(t)?void 0:t.hide()})},up.bus.on("fragment:ready",t)}()}.call(this),function(){up.browser.isSupported()&&(up.browser.ensureConsoleExists(),up.bus.emit("framework:ready"),$(document).on("ready",function(){return up.bus.emit("app:ready")}))}.call(this);
|
1
|
+
(function(){window.up={}}).call(this),function(){var t=[].slice;up.util=function(){var n,e,r,o,u,i,a,s,c,l,p,f,d,m,h,v,g,y,b,w,k,C,S,x,T,E,P,A,F,D,U,O,j,z,H,I,N,W,L,M,G,X,V,R,q,B,J,Z,_,Q,K,Y,tn,nn,en,rn,on,un,an;return C=function(t,n){return n=n||{},n.url=t,r(n)},r=function(t){return t.selector&&(t.headers={"X-Up-Selector":t.selector}),$.ajax(t)},N=function(t,n){return(""===n||"80"===n)&&"http:"===t||"443"===n&&"https:"===t},B=function(t,n){var e,r,o;return e=W(t)?$("<a>").attr({href:t}).get(0):an(t),r=e.protocol+"//"+e.hostname,N(e.protocol,e.port)||(r+=":"+e.port),o=e.pathname,(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},n=function(t){var n,e,r,o,u,i,a,s,c,l,p,f,d,m,h,v;for(p=t.split(/[ >]/),r=null,l=d=0,h=p.length;h>d;l=++d){for(i=p[l],u=i.match(/(^|\.|\#)[A-Za-z0-9\-_]+/g),f="div",o=[],c=null,m=0,v=u.length;v>m;m++)switch(a=u[m],a[0]){case".":o.push(a.substr(1));break;case"#":c=a.substr(1);break;default:f=a}s="<"+f,o.length&&(s+=' class="'+o.join(" ")+'"'),c&&(s+=' id="'+c+'"'),s+=">",n=$(s),e&&n.appendTo(e),0===l&&(r=n),e=n}return r},l=function(t,n){var e;return e=document.createElement(t),H(n)&&(e.innerHTML=n),e},v=function(){var n,e;throw n=1<=arguments.length?t.call(arguments,0):[],console.log.apply(console,["[UP] Error"].concat(t.call(n))),e=1===n.length&&up.util.isString(n[0])?n[0]:JSON.stringify(n),alert(e),e},f=function(t){var n,e,r,o,u,i,a;for(console.log("Creating selector from element",t),e=(n=t.attr("class"))?n.split(" "):[],r=t.attr("id"),u=t.prop("tagName").toLowerCase(),r&&(u+="#"+r),i=0,a=e.length;a>i;i++)o=e[i],u+="."+o;return u},p=function(t){var n,e,r,o,u,i,a,s,c,p,f,d;return c=function(t){return"<"+t+"(?: [^>]*)?>"},i=function(t){return"</"+t+">"},n="(?:.|\\n)*?",u=function(t){return"("+t+")"},d=new RegExp(c("head")+n+c("title")+u(n)+i("title")+n+i("body"),"i"),o=new RegExp(c("body")+u(n)+i("body"),"i"),(r=t.match(o))?(s=document.createElement("html"),e=l("body",r[1]),s.appendChild(e),(f=t.match(d))&&(a=l("head"),s.appendChild(a),p=l("title",f[1]),a.appendChild(p)),s):l("div",t)},y=$.extend,un=$.trim,M=Object.keys||function(t){var n,e,r,o;for(e=[],r=0,o=t.length;o>r;r++)n=t[r],t.hasOwnProperty(n)&&e.push(n);return e},h=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},j=function(t){return null===t},L=function(t){return void 0===t},P=function(t){return!L(t)},O=function(t){return L(t)||j(t)},F=function(t){return!O(t)},T=function(t){return O(t)||z(t)&&0===M(t).length||0===t.length},K=function(t,n){return null==n&&(n=H),n(t)?t:null},H=function(t){return!T(t)},A=function(t){return"function"==typeof t},W=function(t){return"string"==typeof t},D=function(t){return"object"==typeof t&&!!t},z=function(t){return D(t)||"function"==typeof t},U=function(t){return t instanceof jQuery},I=function(t){return z(t)&&A(t.then)},E=function(t){return I(t)&&A(t.resolve)},S=function(t){return F(t)?t:void 0},x=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},s=function(t){return x(t)?t.slice():y({},t)},an=function(t){return U(t)?t.get(0):t},R=function(t,n){return y(s(t),n)},_=function(t,n){var e,r,o,u;if(o=t?s(t):{},n)for(r in n)e=n[r],u=o[r],F(u)?z(e)&&z(u)&&(o[r]=_(u,e)):o[r]=e;return o},Z=function(){var n,e,r,o,u,i;for(e=1<=arguments.length?t.call(arguments,0):[],r=null,u=0,i=e.length;i>u;u++)if(n=e[u],o=n,A(o)&&(o=o()),H(o)){r=o;break}return r},m=function(t,n){var e,r,o,u;for(r=null,o=0,u=t.length;u>o;o++)if(e=t[o],n(e)){r=e;break}return r},rn=function(t,n){var e;return e=[],h(t,function(t){return n(t)?e.push(t):void 0}),e},Y=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}(),m(o,H)},q=function(t){return setTimeout(t,0)},G=function(t){return t[t.length-1]},i=function(){var t;return t=document.documentElement,{width:t.clientWidth,height:t.clientHeight}},on=function(t,n,e){var r,o;return o=t.css(M(n)),t.css(n),r=function(){return t.css(o)},e?(e(),r()):r},k=function(t){var n,e;return e=t.css(["transform","-webkit-transform"]),T(e)?(n=function(){return t.css(e)},t.css({transform:"translateZ(0)","-webkit-transform":"translateZ(0)"})):n=function(){},n},d=function(t,n,r){var o,u,i,a,s,c;return o=$(t),up.browser.canCssAnimation()?(r=_(r,{duration:300,delay:0,easing:"ease"}),u=$.Deferred(),a={"transition-property":M(n).join(", "),"transition-duration":r.duration+"ms","transition-delay":r.delay+"ms","transition-timing-function":r.easing},s=k(o),c=on(o,a),o.css(n),u.then(s),u.then(c),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),en())},e="up-animation-promise",w=function(t){return $(t).each(function(){var t;return(t=$(this).data(e))?t.resolve():void 0})},V=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=i(),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},Q=function(t){var n,e;return e=V(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)},b=function(t,n){return t.find(n).addBack(n)},g=function(t){return 27===t.keyCode},a=function(t,n){return t.indexOf(n)>=0},u=function(t){return"true"===String(t)},o=function(t){return"false"===String(t)},X=function(t){return t.getResponseHeader("X-Up-Current-Location")},J=function(){var n,e,r,o,u,i;for(o=arguments[0],r=2<=arguments.length?t.call(arguments,1):[],n={},u=0,i=r.length;i>u;u++)e=r[u],o.hasOwnProperty(e)&&(n[e]=o[e]);return n},nn=function(){var t;return t=$.Deferred(),t.resolve(),t},en=function(){return nn().promise()},tn=function(){var n,e;return n=1<=arguments.length?t.call(arguments,0):[],e=$.when.apply($,n),e.resolve=function(){return h(n,function(t){return"function"==typeof t.resolve?t.resolve():void 0})},e},{presentAttr:Y,createElement:l,normalizeUrl:B,createElementFromHtml:p,$createElementFromSelector:n,createSelectorFromElement:f,get:C,ajax:r,extend:y,copy:s,merge:R,options:_,option:Z,error:v,each:h,detect:m,select:rn,last:G,isNull:j,isDefined:P,isUndefined:L,isGiven:F,isMissing:O,isPresent:H,isBlank:T,presence:K,isObject:z,isFunction:A,isString:W,isJQuery:U,isPromise:I,isDeferred:E,isHash:D,ifGiven:S,unwrap:an,nextFrame:q,measure:V,temporaryCss:on,cssAnimate:d,finishCssAnimate:w,forceCompositing:k,prependGhost:Q,escapePressed:g,copyAttributes:c,findWithSelf:b,contains:a,isArray:x,castsToTrue:u,castsToFalse:o,locationFromXhr:X,clientSize:i,only:J,trim:un,keys:M,resolvedPromise:en,resolvedDeferred:nn,resolvableWhen:tn}}()}.call(this),function(){var t=[].slice;up.browser=function(){var n,e,r,o,u,i,a,s,c;return s=up.util,i=function(t,n){var e,r,o,u,i,a;return null==n&&(n={}),i=s.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' />",s.isDefined(r)&&s.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;return window.console||(window.console={}),(t=window.console).log||(t.log=function(){})},a=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=a(function(){return s.isDefined(history.pushState)}),n=a(function(){return"transition"in document.documentElement.style}),e=a(function(){return"oninput"in document.createElement("input")}),u=a(function(){return s.isDefined(document.addEventListener)}),{url:c,ensureConsoleExists:o,loadPage:i,canPushState:r,canCssAnimation:n,canInputEvent:e,isSupported:u}}()}.call(this),function(){var t=[].slice;up.bus=function(){var n,e,r,o,u,i,a;return 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]=up.util.copy(t));return o},i=function(){return n=up.util.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):[],console.log("bus emitting",o,n),r=e(o),up.util.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.flow=function(){var t,n,e,r,o,u,i,a,s,c,l,p;return p=up.util,s=function(t,n){var e;return e=$(t),p.isPresent(n)&&(n=p.normalizeUrl(n)),e.attr("up-source",n)},c=function(t){var n;return n=$(t).closest("[up-source]"),p.presence(n.attr("up-source"))||up.browser.url()},i=function(t,n,e){var o;return e=p.options(e),o=p.presence(t)?t:p.createSelectorFromElement($(t)),up.browser.canPushState()||p.castsToFalse(e.history)?p.ajax({url:n,selector:o},p.only(e,"method")).done(function(t,u,i){var a;return(a=p.locationFromXhr(i))&&(n=a),(p.isMissing(e.history)||p.castsToTrue(e.history))&&(e.history=n),(p.isMissing(e.source)||p.castsToTrue(e.source))&&(e.source=n),r(o,t,e)}).fail(p.error):void up.browser.loadPage(n,p.only(e,"method"))},r=function(t,n,e){var r,u,i,a,s,c,f,d,m,h;for(e=p.options(e,{historyMethod:"push"}),"false"===e.history&&(e.history=null),e.source=p.option(e.source,e.history),a=p.createElementFromHtml(n),e.title||(e.title=null!=(d=a.querySelector("title"))?d.textContent:void 0),m=o(t,e),h=[],c=0,f=m.length;f>c;c++)s=m[c],up.motion.finish(s.selector),u=p.presence($(".up-popup "+s.selector))||p.presence($(".up-modal "+s.selector))||p.presence($(s.selector))||p.error("Could not find selector ("+s.selector+") in current body HTML"),(i=a.querySelector(s.selector))?(r=$(i),h.push(l(u,r,s.pseudoClass,s.transition,e))):h.push(p.error("Could not find selector ("+s.selector+") in response ("+n+")"));return h},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)),s(n,e.source),t(n),up.ready(n)},l=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()),p.copyAttributes(r,t),e(a,i),up.animate(r,u)):n(t,{animation:function(){return r.insertAfter(t),e(r,i),t.is("body")&&"none"!==u&&p.error("Cannot apply transitions to body-elements",u),up.morph(t,r,u)}})},o=function(t,n){var e,r,o,u,i,a,s,c,l,f,d;for(s=n.transition||n.animation||"none",e=/\ *,\ */,r=t.split(e),p.isPresent(s)&&(c=s.split(e)),d=[],o=l=0,f=r.length;f>l;o=++l)u=r[o],i=u.match(/^(.+?)(?:\:(before|after))?$/),a=c[o]||p.last(c),d.push({selector:i[1],pseudoClass:i[2],transition:a});return d},t=function(t){var n,e;return e="[autofocus]:last",n=p.findWithSelf(t,e),n.length&&n.get(0)!==document.activeElement?n.focus():void 0},n=function(t,n){var e,r;return e=$(t),n=p.options(n,{animation:"none"}),e.addClass("up-destroying"),p.isPresent(n.url)&&up.history.push(n.url),p.isPresent(n.title)&&(document.title=n.title),up.bus.emit("fragment:destroy",e),r=p.presence(n.animation,p.isPromise)||up.motion.animate(e,n.animation),r.then(function(){return e.remove()})},u=function(t){var n;return n=c(t),i(t,n)},a=function(){return up.bus.emit("framework:reset")},up.bus.on("app:ready",function(){return s(document.body,up.browser.url())}),{replace:i,reload:u,destroy:n,implant:r,reset:a}}(),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,c,l,p,f,d,m,h,v;return v=up.util,n="up-destroyable",e="up-destroyer",p=[],s=null,l=function(t,n,e){var r,o;if(up.browser.isSupported())return r=[t,n,function(t){return e.apply(this,[t,$(this)])}],p.push(r),(o=$(document)).on.apply(o,r)},u=[],a=null,o=function(){var n,e,r,o;return o=arguments[0],n=2<=arguments.length?t.call(arguments,1):[],up.browser.isSupported()?(e=n.pop(),r=v.options(n[0],{batch:!1}),u.push({selector:o,callback:e,batch:r.batch})):void 0},r=function(t,r,o){var u;return u=t.callback.apply(o,[r]),v.isFunction(u)?(r.addClass(n),r.data(e,u)):void 0},i=function(t){var n,e,o,i,a;for(console.log("Compiling fragment",t),a=[],o=0,i=u.length;i>o;o++)e=u[o],n=v.findWithSelf(t,e.selector),a.push(n.length?e.batch?r(e,n,n.get()):n.each(function(){return r(e,$(this),this)}):void 0);return a},c=function(t){return v.findWithSelf(t,"."+n).each(function(){var t,n;return t=$(this),(n=t.data(e))()})},h=function(){return s=v.copy(p),a=v.copy(u)},m=function(){var t,n,e,r;for(n=0,e=p.length;e>n;n++)t=p[n],v.contains(s,t)||(r=$(document)).off.apply(r,t);return p=v.copy(s),u=v.copy(a)},d=function(t){var n;return n=$(t),up.bus.emit("fragment:ready",n),n},f=function(t){return l("keydown","body",function(n){return v.escapePressed(n)?t(n):void 0})},up.bus.on("app:ready",function(){return d(document.body)}),up.bus.on("fragment:ready",i),up.bus.on("fragment:destroy",c),up.bus.on("framework:ready",h),up.bus.on("framework:reset",m),{awaken:o,on:l,ready:d,onEscape:f}}(),up.awaken=up.magic.awaken,up.on=up.magic.on,up.ready=up.magic.ready}.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,console.log("popping state",n),console.log("current href",up.browser.url()),(null!=n?n.fromUp:void 0)?up.visit(up.browser.url(),{historyMethod:"replace"}):console.log("strange state",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,c,l,p,f,d,m,h,v,g,y,b,w;return b=up.util,u={duration:300,delay:0,easing:"ease"},r={},i={},y={},a={},s=function(t){return b.extend(u,t)},n=function(t,e,r){var i;return i=$(t),l(i),r=b.options(r,u),b.isFunction(e)?o(e(i,r),e):b.isString(e)?n(i,c(e),r):b.isHash(e)?b.cssAnimate(i,e,r):b.error("Unknown animation type",e)},c=function(t){return r[t]||b.error("Unknown animation",e)},t="up-ghosting-promise",w=function(n,e,r){var o,u,i,a;return u=null,o=null,b.temporaryCss(e,{display:"none"},function(){return u=b.prependGhost(n).addClass("up-destroying")}),b.temporaryCss(n,{display:"none"},function(){return o=b.prependGhost(e)}),n.css({visibility:"hidden"}),i=b.temporaryCss(e,{display:"none"}),a=r(u,o),n.data(t,a),e.data(t,a),a.then(function(){return n.removeData(t),e.removeData(t),u.remove(),o.remove(),n.css({display:"none"}),i()}),a},l=function(t){return $(t).each(function(){var t;return t=$(this),b.finishCssAnimate(t),p(t)})},p=function(n){var e;return(e=n.data(t))?(console.log("EXISTING",e),"function"==typeof e.resolve?e.resolve():void 0):void 0},o=function(t,n){return b.isDeferred(t)?t:b.error("Did not return a promise with .then and .resolve methods: ",n)},f=function(t,e,i,a){var s,c,p,d,m;return up.browser.canCssAnimation()?(a=b.options(u),c=$(t),s=$(e),l(c),l(s),m=b.presence(i,b.isFunction)||y[i],m?w(c,s,function(t,n){return o(m(t,n,a),i)}):(p=r[i])?(c.hide(),n(s,p,a)):b.isString(i)&&i.indexOf("/")>=0?(d=i.split("/"),m=function(t,e,r){return h(n(t,d[0],r),n(e,d[1],r))},f(c,s,m,a)):b.error("Unknown transition: "+i)):b.resolvedDeferred()},g=function(t,n){return y[t]=n},e=function(t,n){return r[t]=n},v=function(){return i=b.copy(r),a=b.copy(y)},m=function(){return r=b.copy(i),y=b.copy(a)},h=b.resolvableWhen,d=b.resolvedDeferred,e("none",d),e("fade-in",function(t,e){return t.css({opacity:0}),n(t,{opacity:1},e)}),e("fade-out",function(t,e){return t.css({opacity:1}),n(t,{opacity:0},e)}),e("move-to-top",function(t,e){var r,o;return r=b.measure(t),o=r.top+r.height,t.css({"margin-top":"0px"}),n(t,{"margin-top":"-"+o+"px"},e)}),e("move-from-top",function(t,e){var r,o;return r=b.measure(t),o=r.top+r.height,t.css({"margin-top":"-"+o+"px"}),n(t,{"margin-top":"0px"},e)}),e("move-to-bottom",function(t,e){var r,o;return r=b.measure(t),o=b.clientSize().height-r.top,t.css({"margin-top":"0px"}),n(t,{"margin-top":o+"px"},e)}),e("move-from-bottom",function(t,e){var r,o;return r=b.measure(t),o=b.clientSize().height-r.top,t.css({"margin-top":o+"px"}),n(t,{"margin-top":"0px"},e)}),e("move-to-left",function(t,e){var r,o;return r=b.measure(t),o=r.left+r.width,t.css({"margin-left":"0px"}),n(t,{"margin-left":"-"+o+"px"},e)}),e("move-from-left",function(t,e){var r,o;return r=b.measure(t),o=r.left+r.width,t.css({"margin-left":"-"+o+"px"}),n(t,{"margin-left":"0px"},e)}),e("move-to-right",function(t,e){var r,o;return r=b.measure(t),o=b.clientSize().width-r.left,t.css({"margin-left":"0px"}),n(t,{"margin-left":o+"px"},e)}),e("move-from-right",function(t,e){var r,o;return r=b.measure(t),o=b.clientSize().width-r.left,t.css({"margin-left":o+"px"}),n(t,{"margin-left":"0px"},e)}),e("roll-down",function(t,e){var r,o;return r=t.height(),o=b.temporaryCss(t,{height:"0px",overflow:"hidden"}),n(t,{height:r+"px"},e).then(o)}),g("none",d),g("move-left",function(t,e,r){return h(n(t,"move-to-left",r),n(e,"move-from-right",r))}),g("move-right",function(t,e,r){return h(n(t,"move-to-right",r),n(e,"move-from-left",r))}),g("move-up",function(t,e,r){return h(n(t,"move-to-top",r),n(e,"move-from-bottom",r))}),g("move-down",function(t,e,r){return h(n(t,"move-to-bottom",r),n(e,"move-from-top",r))}),g("cross-fade",function(t,e,r){return h(n(t,"fade-out",r),n(e,"fade-in",r))}),up.bus.on("framework:ready",v),up.bus.on("framework:reset",m),{morph:f,animate:n,finish:l,transition:g,animation:e,defaults:s,none:d,when:h}}(),up.transition=up.motion.transition,up.animation=up.motion.animation,up.morph=up.motion.morph,up.animate=up.motion.animate}.call(this),function(){up.link=function(){var t,n,e,r,o;return r=up.util,o=function(t,n){return console.log("up.visit",t),up.replace("body",t,n)},t=function(t,n){var e,o,u;return e=$(t),n=r.options(n),u=r.option(e.attr("href"),e.attr("up-follow")),o=r.option(n.target,e.attr("up-target"),"body"),n.transition=r.option(n.transition,e.attr("up-transition"),e.attr("up-animation")),n.history=r.option(n.history,e.attr("up-history")),up.replace(o,u,n)},n=function(t){var n;return n=$(t),n.is("a")||r.presentAttr(n,"up-follow")?n:n.find("a:first")},e=function(t){var e;return(e=n(t))?r.option(e.attr("href"),e.attr("up-follow")):void 0},up.on("click","a[up-target]",function(n,e){return n.preventDefault(),t(e)}),up.on("click","[up-follow]",function(e,r){var o;return o=function(){var t,n;return t=$(e.target),n=t.closest("a, [up-follow]"),n.length&&r.find(n).length},o()?void 0:(e.preventDefault(),t(n(r)))}),{visit:o,follow:t,resolve:n,resolveUrl:e}}(),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,c,l,p,f;return e=$(t).closest("form"),n=u.options(n),c=u.option(n.target,e.attr("up-target"),"body"),r=u.option(n.failTarget,e.attr("up-fail-target"),function(){return u.createSelectorFromElement(e)}),i=u.option(n.history,e.attr("up-history"),!0),l=u.option(n.transition,e.attr("up-transition")),o=u.option(n.failTransition,e.attr("up-fail-transition")),a=u.option(n.method,e.attr("up-method"),e.attr("data-method"),e.attr("method"),"post").toUpperCase(),f=u.option(n.url,e.attr("action"),up.browser.url()),e.addClass("up-active"),up.browser.canPushState()||u.castsToFalse(i)?(s={url:f,type:a,data:e.serialize(),selector:c},p=function(t){var n;return f=i?"false"===i?!1:u.isString(i)?i:(n=u.locationFromXhr(t))?n:"GET"===s.type?s.url+"?"+s.data:void 0:void 0,u.option(f,!1)},u.ajax(s).always(function(){return e.removeClass("up-active")}).done(function(t,n,e){return up.flow.implant(c,t,{history:p(e),transition:l})}).fail(function(t){var n;return n=t.responseText,up.flow.implant(r,n,{transition:o})})):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("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=_.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":"keypress paste cut change click propertychange",$field.on(changeEvents,check),check(),clearTimer},up.on("submit","form[up-target]",function(t,n){return t.preventDefault(),submit(n)}),up.awaken("[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,c,l;return c=up.util,e={openAnimation:"fade-in",closeAnimation:"fade-out",origin:"bottom-right"},o=function(t){return c.extend(e,t)},a=function(t,n,e){var r,o;return o=c.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 c.error("Unknown origin",e)}}(),n.attr("up-origin",e),n.css(r),u(n)},u=function(t){var n,e,r,o,u,i,a;if(e=c.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)}},r=function(t,n,e){var r,o;return o=c.$createElementFromSelector(".up-popup"),e&&o.attr("up-sticky",""),o.attr("up-previous-url",up.browser.url()),o.attr("up-previous-title",document.title),r=c.$createElementFromSelector(n),r.appendTo(o),o.appendTo(document.body),o.hide(),o},l=function(t,n,e,r){return n.show(),a(t,n,e),up.animate(n,r)},i=function(t,o){var u,i,a,s,p,f,d,m;return u=$(t),o=c.options(o),m=c.option(u.attr("href")),f=c.option(o.target,u.attr("up-popup"),"body"),p=c.option(o.origin,u.attr("up-origin"),e.origin),a=c.option(o.animation,u.attr("up-animation"),e.openAnimation),d=c.option(o.sticky,u.is("[up-sticky]")),s=up.browser.canPushState()?c.option(o.history,u.attr("up-history"),!1):!1,n(),i=r(u,f,d),up.replace(f,m,{history:s,insert:function(){return l(u,i,p,a)}})},s=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=c.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():i(e)}),up.on("click","body",function(t){var e;return e=$(t.target),e.closest(".up-popup").length||e.closest("[up-popup]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){return n.closest(".up-popup").length?void 0:t()}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,e){return e.closest(".up-popup")?n():void 0}),up.bus.on("framework:reset",n),{open:i,close:n,source:s,defaults:o}}()}.call(this),function(){up.modal=function(){var t,n,e,r,o,u,i,a,s,c;return s=up.util,e={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>'}},o=function(t){return s.extend(e,t)},a=function(){var t;return t=e.template,s.isFunction(t)?t(e):t},r=function(t,n,e,r){var o,u,i,c;return i=$(a()),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"),s.isPresent(n)&&u.css("width",n),s.isPresent(e)&&u.css("height",e),o=u.find(".up-modal-content"),c=s.$createElementFromSelector(t),c.appendTo(o),i.appendTo(document.body),i.hide(),i},c=function(t,n){return t.show(),up.animate(t,n)},u=function(t,o){var u,i,a,l,p,f,d,m,h;return u=$(t),o=s.options(o),m=s.option(u.attr("href")),f=s.option(o.target,u.attr("up-modal"),"body"),h=s.option(o.width,u.attr("up-width"),e.width),l=s.option(o.height,u.attr("up-height"),e.height),a=s.option(o.animation,u.attr("up-animation"),e.openAnimation),d=s.option(o.sticky,u.is("[up-sticky]")),p=up.browser.canPushState()?s.option(o.history,u.attr("up-history"),!0):!1,n(),i=r(f,h,l,d),up.replace(f,m,{history:p,insert:function(){return c(i,a)}})},i=function(){var t;return t=$(".up-modal"),t.is(".up-destroying")?void 0:t.find("[up-source]").attr("up-source")},n=function(t){var n;return n=$(".up-modal"),n.length?(t=s.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-modal").is("[up-sticky]")?void 0:n()},up.on("click","a[up-modal]",function(t,e){return t.preventDefault(),e.is(".up-current")?n():u(e)}),up.on("click","body",function(t){var e;return e=$(t.target),e.closest(".up-modal-dialog").length||e.closest("[up-modal]").length?void 0:n()}),up.bus.on("fragment:ready",function(n){return n.closest(".up-modal").length?void 0:(console.log("fragment inserted",n,n.closest(".up-modal")),t())}),up.magic.onEscape(function(){return n()}),up.on("click","[up-close]",function(t,e){return e.closest(".up-modal")?n():void 0}),up.bus.on("framework:reset",n),{open:u,close:n,source:i,defaults:o}}()}.call(this),function(){up.tooltip=function(){var t,n,e,r,o;return o=up.util,r=function(t,n,e){var r,u,i;return u=o.measure(t),i=o.measure(n),r=function(){switch(e){case"top":return{left:u.left+.5*(u.width-i.width),top:u.top-i.height};case"bottom":return{left:u.left+.5*(u.width-i.width),top:u.top+u.height};default:return o.error("Unknown origin",e)}}(),n.attr("up-origin",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,c,l;return null==u&&(u={}),i=$(e),c=o.option(u.html,i.attr("up-tooltip")),l=o.option(u.origin,i.attr("up-origin"),"top"),s=o.option(u.animation,i.attr("up-animation"),"fade-in"),t(),a=n(c),r(i,a,l),up.animate(a,s,u)},t=function(t){var n;return n=$(".up-tooltip"),n.length?(t=o.options(t,{animation:"fade-out"}),up.destroy(n,t)):void 0},up.awaken("[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,c;return s=up.util,t="up-active",n="up-current",r="a[href], a[up-target], [up-follow], [up-modal], [up-popup]",e="."+t,i=function(t){return s.isPresent(t)?s.normalizeUrl(t,{search:!1,stripTrailingSlash:!0}):void 0},u=function(){var t,e,o;return o=i(up.browser.url()),t=i(up.modal.source()),e=i(up.popup.source()),s.each($(r),function(r){var u,a;return u=$(r),a=up.link.resolveUrl(u),a=i(a),a===o||a===t||a===e?u.addClass(n):u.removeClass(n)})},a=function(n){return c(),n=o(n),n.addClass(t)},o=function(t){return s.presence(t.parents(r))||t},c=function(){return $(e).removeClass(t)},up.on("click",r,function(t,n){return a(n)}),up.bus.on("fragment:ready",function(){return c(),u()}),up.bus.on("fragment:destroy",function(t){return t.is(".up-modal, .up-popup")?u():void 0})}()}.call(this),function(){up.marker=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-marker]").each(function(){var t;return t=$(this),n(t)?void 0:t.hide()})},up.bus.on("fragment:ready",t)}()}.call(this),function(){up.browser.isSupported()&&(up.browser.ensureConsoleExists(),up.bus.emit("framework:ready"),$(document).on("ready",function(){return up.bus.emit("app:ready")}))}.call(this);
|
@@ -66,6 +66,9 @@ up.browser = (->
|
|
66
66
|
|
67
67
|
canCssAnimation = memoize ->
|
68
68
|
'transition' of document.documentElement.style
|
69
|
+
|
70
|
+
canInputEvent = memoize ->
|
71
|
+
'oninput' of document.createElement('input')
|
69
72
|
|
70
73
|
isSupported = memoize ->
|
71
74
|
# This is the most concise way to exclude IE8 and lower
|
@@ -77,6 +80,7 @@ up.browser = (->
|
|
77
80
|
loadPage: loadPage
|
78
81
|
canPushState: canPushState
|
79
82
|
canCssAnimation: canCssAnimation
|
83
|
+
canInputEvent: canInputEvent
|
80
84
|
isSupported: isSupported
|
81
85
|
|
82
86
|
)()
|
@@ -113,8 +113,15 @@ up.flow = (->
|
|
113
113
|
|
114
114
|
# TODO: extract title from HTTP header
|
115
115
|
options.title ||= htmlElement.querySelector("title")?.textContent
|
116
|
-
|
116
|
+
|
117
117
|
for step in implantSteps(selector, options)
|
118
|
+
|
119
|
+
# Before we select a replacement target, ensure that all transitions
|
120
|
+
# and animations have been run. Finishing a transition usually removes
|
121
|
+
# the element that is being morphed, so it will affect further selections
|
122
|
+
# using the same selector.
|
123
|
+
up.motion.finish(step.selector)
|
124
|
+
|
118
125
|
$old =
|
119
126
|
# always prefer to replace content in popups or modals
|
120
127
|
u.presence($(".up-popup " + step.selector)) ||
|
@@ -107,8 +107,7 @@ up.form = (->
|
|
107
107
|
)
|
108
108
|
|
109
109
|
###*
|
110
|
-
Observes an input field
|
111
|
-
Executes code when the value changes.
|
110
|
+
Observes an input field and executes code when its value changes.
|
112
111
|
|
113
112
|
up.observe('input', { change: function(value, $input) {
|
114
113
|
up.submit($input)
|
@@ -125,15 +124,22 @@ up.form = (->
|
|
125
124
|
If given as a function, it must take two arguments (`value`, `$field`).
|
126
125
|
If given as a string, it will be evaled as Javascript code in a context where
|
127
126
|
(`value`, `$field`) are set.
|
128
|
-
@param {Number} [options.
|
127
|
+
@param {Number} [options.delay=0]
|
128
|
+
The number of miliseconds to wait before executing the callback
|
129
|
+
after the input value changes. Use this to limit how often the callback
|
130
|
+
will be invoked for a fast typist.
|
129
131
|
###
|
130
132
|
observe = (fieldOrSelector, options) ->
|
131
133
|
|
132
134
|
$field = $(fieldOrSelector)
|
133
|
-
options = u.options(options
|
135
|
+
options = u.options(options)
|
136
|
+
delay = u.option($field.attr('up-delay'), options.delay, 0)
|
137
|
+
delay = parseInt(delay)
|
138
|
+
|
134
139
|
knownValue = null
|
135
|
-
timer = null
|
136
140
|
callback = null
|
141
|
+
callbackTimer = null
|
142
|
+
|
137
143
|
if codeOnChange = $field.attr('up-observe')
|
138
144
|
callback = (value, $field) ->
|
139
145
|
eval(codeOnChange)
|
@@ -142,30 +148,51 @@ up.form = (->
|
|
142
148
|
else
|
143
149
|
u.error('observe: No change callback given')
|
144
150
|
|
151
|
+
callbackPromise = u.resolvedPromise()
|
152
|
+
|
153
|
+
# This holds the next callback function, curried with `value` and `$field`.
|
154
|
+
# Since we're waiting for callback promises to resolve before running
|
155
|
+
# another callback, this might be overwritten while we're waiting for a
|
156
|
+
# previous callback to finish.
|
157
|
+
nextCallback = null
|
158
|
+
|
159
|
+
runNextCallback = ->
|
160
|
+
if nextCallback
|
161
|
+
returnValue = nextCallback()
|
162
|
+
nextCallback = null
|
163
|
+
returnValue
|
164
|
+
|
145
165
|
check = ->
|
146
166
|
value = $field.val()
|
147
|
-
|
167
|
+
# don't run the callback for the check during initialization
|
168
|
+
skipCallback = _.isNull(knownValue)
|
148
169
|
if knownValue != value
|
149
170
|
knownValue = value
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
171
|
+
unless skipCallback
|
172
|
+
clearTimer()
|
173
|
+
nextCallback = -> callback.apply($field.get(0), [value, $field])
|
174
|
+
callbackTimer = setTimeout(
|
175
|
+
->
|
176
|
+
# Only run the callback once the previous callback's
|
177
|
+
# promise resolves.
|
178
|
+
callbackPromise.then ->
|
179
|
+
returnValue = runNextCallback()
|
180
|
+
# If the callback returns a promise, we will remember it
|
181
|
+
# and chain additional callback invocations to it.
|
182
|
+
if u.isPromise(returnValue)
|
183
|
+
callbackPromise = returnValue
|
184
|
+
else
|
185
|
+
callbackPromise = u.resolvedPromise()
|
186
|
+
, delay
|
187
|
+
)
|
156
188
|
|
157
189
|
clearTimer = ->
|
158
|
-
|
159
|
-
timer = null
|
160
|
-
|
161
|
-
startTimer = ->
|
162
|
-
timer = setInterval(check, options.frequency)
|
190
|
+
clearTimeout(callbackTimer)
|
163
191
|
|
164
|
-
|
165
|
-
$field.
|
192
|
+
changeEvents = if up.browser.canInputEvent() then 'input' else 'keypress paste cut change click propertychange'
|
193
|
+
$field.on changeEvents, check
|
166
194
|
|
167
195
|
check()
|
168
|
-
startTimer()
|
169
196
|
|
170
197
|
# return destructor
|
171
198
|
return clearTimer
|
@@ -45,6 +45,9 @@ up.motion = (->
|
|
45
45
|
###*
|
46
46
|
Animates an element.
|
47
47
|
|
48
|
+
If the element is already being animated, the previous animation
|
49
|
+
will instantly jump to its last frame before the new animation begins.
|
50
|
+
|
48
51
|
The following animations are pre-registered:
|
49
52
|
|
50
53
|
- `fade-in`
|
@@ -70,12 +73,10 @@ up.motion = (->
|
|
70
73
|
###
|
71
74
|
animate = (elementOrSelector, animation, options) ->
|
72
75
|
$element = $(elementOrSelector)
|
76
|
+
finish($element)
|
73
77
|
options = u.options(options, config)
|
74
78
|
if u.isFunction(animation)
|
75
|
-
|
76
|
-
animation($element, options),
|
77
|
-
["Animation did not return a Promise", animation]
|
78
|
-
)
|
79
|
+
assertIsDeferred(animation($element, options), animation)
|
79
80
|
else if u.isString(animation)
|
80
81
|
animate($element, findAnimation(animation), options)
|
81
82
|
else if u.isHash(animation)
|
@@ -85,6 +86,8 @@ up.motion = (->
|
|
85
86
|
|
86
87
|
findAnimation = (name) ->
|
87
88
|
animations[name] or u.error("Unknown animation", animation)
|
89
|
+
|
90
|
+
GHOSTING_PROMISE_KEY = 'up-ghosting-promise'
|
88
91
|
|
89
92
|
withGhosts = ($old, $new, block) ->
|
90
93
|
$oldGhost = null
|
@@ -98,7 +101,12 @@ up.motion = (->
|
|
98
101
|
|
99
102
|
newCssMemo = u.temporaryCss($new, display: 'none')
|
100
103
|
promise = block($oldGhost, $newGhost)
|
104
|
+
$old.data(GHOSTING_PROMISE_KEY, promise)
|
105
|
+
$new.data(GHOSTING_PROMISE_KEY, promise)
|
106
|
+
|
101
107
|
promise.then ->
|
108
|
+
$old.removeData(GHOSTING_PROMISE_KEY)
|
109
|
+
$new.removeData(GHOSTING_PROMISE_KEY)
|
102
110
|
$oldGhost.remove()
|
103
111
|
$newGhost.remove()
|
104
112
|
# Now that the transition is over we show $new again.
|
@@ -106,10 +114,34 @@ up.motion = (->
|
|
106
114
|
# $new should take up space
|
107
115
|
$old.css(display: 'none')
|
108
116
|
newCssMemo()
|
117
|
+
|
118
|
+
promise
|
119
|
+
|
120
|
+
###
|
121
|
+
Completes all animations and transitions for the given element
|
122
|
+
by jumping to the last animation frame instantly. All callbacks chained to
|
123
|
+
the original animation's promise will be called.
|
124
|
+
|
125
|
+
Does nothing if the given element is not currently animating.
|
126
|
+
|
127
|
+
@param {Element|jQuery|String} elementOrSelector
|
128
|
+
###
|
129
|
+
finish = (elementOrSelector) ->
|
130
|
+
$(elementOrSelector).each ->
|
131
|
+
$element = $(this)
|
132
|
+
u.finishCssAnimate($element)
|
133
|
+
finishGhosting($element)
|
134
|
+
|
135
|
+
finishGhosting = ($element) ->
|
136
|
+
if existingGhosting = $element.data(GHOSTING_PROMISE_KEY)
|
137
|
+
console.log("EXISTING", existingGhosting)
|
138
|
+
existingGhosting.resolve?()
|
109
139
|
|
110
|
-
|
111
|
-
u.
|
112
|
-
|
140
|
+
assertIsDeferred = (object, origin) ->
|
141
|
+
if u.isDeferred(object)
|
142
|
+
object
|
143
|
+
else
|
144
|
+
u.error("Did not return a promise with .then and .resolve methods: ", origin)
|
113
145
|
|
114
146
|
###*
|
115
147
|
Performs a transition between two elements.
|
@@ -144,20 +176,19 @@ up.motion = (->
|
|
144
176
|
options = u.options(config)
|
145
177
|
$old = $(source)
|
146
178
|
$new = $(target)
|
179
|
+
finish($old)
|
180
|
+
finish($new)
|
147
181
|
transition = u.presence(transitionOrName, u.isFunction) || transitions[transitionOrName]
|
148
182
|
if transition
|
149
183
|
withGhosts $old, $new, ($oldGhost, $newGhost) ->
|
150
|
-
|
151
|
-
transition($oldGhost, $newGhost, options),
|
152
|
-
["Transition did not return a promise", transitionOrName]
|
153
|
-
)
|
184
|
+
assertIsDeferred(transition($oldGhost, $newGhost, options), transitionOrName)
|
154
185
|
else if animation = animations[transitionOrName]
|
155
186
|
$old.hide()
|
156
187
|
animate($new, animation, options)
|
157
188
|
else if u.isString(transitionOrName) && transitionOrName.indexOf('/') >= 0
|
158
189
|
parts = transitionOrName.split('/')
|
159
190
|
transition = ($old, $new, options) ->
|
160
|
-
|
191
|
+
resolvableWhen(
|
161
192
|
animate($old, parts[0], options),
|
162
193
|
animate($new, parts[1], options)
|
163
194
|
)
|
@@ -167,11 +198,11 @@ up.motion = (->
|
|
167
198
|
else
|
168
199
|
# Skip ghosting and all the other stuff that can go wrong
|
169
200
|
# in ancient browsers
|
170
|
-
u.
|
201
|
+
u.resolvedDeferred()
|
171
202
|
|
172
203
|
###*
|
173
204
|
Defines a named transition.
|
174
|
-
|
205
|
+
|
175
206
|
@method up.transition
|
176
207
|
@param {String} name
|
177
208
|
@param {Function} transition
|
@@ -181,100 +212,109 @@ up.motion = (->
|
|
181
212
|
|
182
213
|
###*
|
183
214
|
Defines a named animation.
|
184
|
-
|
215
|
+
|
185
216
|
@method up.animation
|
186
217
|
@param {String} name
|
187
218
|
@param {Function} animation
|
188
219
|
###
|
189
220
|
animation = (name, animation) ->
|
190
221
|
animations[name] = animation
|
191
|
-
|
222
|
+
|
192
223
|
snapshot = ->
|
193
224
|
defaultAnimations = u.copy(animations)
|
194
225
|
defaultTransitions = u.copy(transitions)
|
195
|
-
|
226
|
+
|
196
227
|
reset = ->
|
197
228
|
animations = u.copy(defaultAnimations)
|
198
229
|
transitions = u.copy(defaultTransitions)
|
199
|
-
|
230
|
+
|
231
|
+
###*
|
232
|
+
Returns a new promise that resolves once all promises in the given array resolve.
|
233
|
+
Other then e.g. `$.then`, the combined promise will have a `resolve` method.
|
234
|
+
|
235
|
+
@method up.motion.when
|
236
|
+
@param promises...
|
237
|
+
###
|
238
|
+
resolvableWhen = u.resolvableWhen
|
239
|
+
|
200
240
|
###*
|
201
241
|
Returns a no-op animation or transition which has no visual effects
|
202
242
|
and completes instantly.
|
203
|
-
|
243
|
+
|
204
244
|
@method up.motion.none
|
205
245
|
@return {Promise}
|
206
|
-
A resolved promise
|
246
|
+
A resolved promise
|
207
247
|
###
|
208
|
-
none = u.
|
209
|
-
|
248
|
+
none = u.resolvedDeferred
|
249
|
+
|
210
250
|
animation('none', none)
|
211
251
|
|
212
252
|
animation('fade-in', ($ghost, options) ->
|
213
253
|
$ghost.css(opacity: 0)
|
214
254
|
animate($ghost, { opacity: 1 }, options)
|
215
255
|
)
|
216
|
-
|
256
|
+
|
217
257
|
animation('fade-out', ($ghost, options) ->
|
218
258
|
$ghost.css(opacity: 1)
|
219
259
|
animate($ghost, { opacity: 0 }, options)
|
220
260
|
)
|
221
|
-
|
261
|
+
|
222
262
|
animation('move-to-top', ($ghost, options) ->
|
223
263
|
box = u.measure($ghost)
|
224
264
|
travelDistance = box.top + box.height
|
225
265
|
$ghost.css('margin-top': '0px')
|
226
266
|
animate($ghost, { 'margin-top': "-#{travelDistance}px" }, options)
|
227
267
|
)
|
228
|
-
|
268
|
+
|
229
269
|
animation('move-from-top', ($ghost, options) ->
|
230
270
|
box = u.measure($ghost)
|
231
271
|
travelDistance = box.top + box.height
|
232
272
|
$ghost.css('margin-top': "-#{travelDistance}px")
|
233
273
|
animate($ghost, { 'margin-top': '0px' }, options)
|
234
274
|
)
|
235
|
-
|
275
|
+
|
236
276
|
animation('move-to-bottom', ($ghost, options) ->
|
237
277
|
box = u.measure($ghost)
|
238
278
|
travelDistance = u.clientSize().height - box.top
|
239
279
|
$ghost.css('margin-top': '0px')
|
240
280
|
animate($ghost, { 'margin-top': "#{travelDistance}px" }, options)
|
241
281
|
)
|
242
|
-
|
282
|
+
|
243
283
|
animation('move-from-bottom', ($ghost, options) ->
|
244
284
|
box = u.measure($ghost)
|
245
285
|
travelDistance = u.clientSize().height - box.top
|
246
286
|
$ghost.css('margin-top': "#{travelDistance}px")
|
247
287
|
animate($ghost, { 'margin-top': '0px' }, options)
|
248
288
|
)
|
249
|
-
|
289
|
+
|
250
290
|
animation('move-to-left', ($ghost, options) ->
|
251
291
|
box = u.measure($ghost)
|
252
292
|
travelDistance = box.left + box.width
|
253
293
|
$ghost.css('margin-left': '0px')
|
254
294
|
animate($ghost, { 'margin-left': "-#{travelDistance}px" }, options)
|
255
295
|
)
|
256
|
-
|
296
|
+
|
257
297
|
animation('move-from-left', ($ghost, options) ->
|
258
298
|
box = u.measure($ghost)
|
259
299
|
travelDistance = box.left + box.width
|
260
300
|
$ghost.css('margin-left': "-#{travelDistance}px")
|
261
301
|
animate($ghost, { 'margin-left': '0px' }, options)
|
262
302
|
)
|
263
|
-
|
303
|
+
|
264
304
|
animation('move-to-right', ($ghost, options) ->
|
265
305
|
box = u.measure($ghost)
|
266
306
|
travelDistance = u.clientSize().width - box.left
|
267
307
|
$ghost.css('margin-left': '0px')
|
268
308
|
animate($ghost, { 'margin-left': "#{travelDistance}px" }, options)
|
269
309
|
)
|
270
|
-
|
310
|
+
|
271
311
|
animation('move-from-right', ($ghost, options) ->
|
272
312
|
box = u.measure($ghost)
|
273
313
|
travelDistance = u.clientSize().width - box.left
|
274
314
|
$ghost.css('margin-left': "#{travelDistance}px")
|
275
315
|
animate($ghost, { 'margin-left': '0px' }, options)
|
276
316
|
)
|
277
|
-
|
317
|
+
|
278
318
|
animation('roll-down', ($ghost, options) ->
|
279
319
|
fullHeight = $ghost.height()
|
280
320
|
styleMemo = u.temporaryCss($ghost,
|
@@ -283,39 +323,39 @@ up.motion = (->
|
|
283
323
|
)
|
284
324
|
animate($ghost, { height: "#{fullHeight}px" }, options).then(styleMemo)
|
285
325
|
)
|
286
|
-
|
326
|
+
|
287
327
|
transition('none', none)
|
288
|
-
|
328
|
+
|
289
329
|
transition('move-left', ($old, $new, options) ->
|
290
|
-
|
330
|
+
resolvableWhen(
|
291
331
|
animate($old, 'move-to-left', options),
|
292
332
|
animate($new, 'move-from-right', options)
|
293
333
|
)
|
294
334
|
)
|
295
|
-
|
335
|
+
|
296
336
|
transition('move-right', ($old, $new, options) ->
|
297
|
-
|
337
|
+
resolvableWhen(
|
298
338
|
animate($old, 'move-to-right', options),
|
299
339
|
animate($new, 'move-from-left', options)
|
300
340
|
)
|
301
341
|
)
|
302
|
-
|
342
|
+
|
303
343
|
transition('move-up', ($old, $new, options) ->
|
304
|
-
|
344
|
+
resolvableWhen(
|
305
345
|
animate($old, 'move-to-top', options),
|
306
346
|
animate($new, 'move-from-bottom', options)
|
307
347
|
)
|
308
348
|
)
|
309
|
-
|
349
|
+
|
310
350
|
transition('move-down', ($old, $new, options) ->
|
311
|
-
|
351
|
+
resolvableWhen(
|
312
352
|
animate($old, 'move-to-bottom', options),
|
313
353
|
animate($new, 'move-from-top', options)
|
314
354
|
)
|
315
355
|
)
|
316
|
-
|
356
|
+
|
317
357
|
transition('cross-fade', ($old, $new, options) ->
|
318
|
-
|
358
|
+
resolvableWhen(
|
319
359
|
animate($old, 'fade-out', options),
|
320
360
|
animate($new, 'fade-in', options)
|
321
361
|
)
|
@@ -326,10 +366,12 @@ up.motion = (->
|
|
326
366
|
|
327
367
|
morph: morph
|
328
368
|
animate: animate
|
369
|
+
finish: finish
|
329
370
|
transition: transition
|
330
371
|
animation: animation
|
331
372
|
defaults: defaults
|
332
373
|
none: none
|
374
|
+
when: resolvableWhen
|
333
375
|
|
334
376
|
)()
|
335
377
|
|
@@ -89,10 +89,10 @@ up.util = (->
|
|
89
89
|
element
|
90
90
|
|
91
91
|
error = (args...) ->
|
92
|
-
|
93
|
-
|
94
|
-
alert
|
95
|
-
throw
|
92
|
+
console.log("[UP] Error", args...)
|
93
|
+
asString = if args.length == 1 && up.util.isString(args[0]) then args[0] else JSON.stringify(args)
|
94
|
+
alert asString
|
95
|
+
throw asString
|
96
96
|
|
97
97
|
createSelectorFromElement = ($element) ->
|
98
98
|
console.log("Creating selector from element", $element)
|
@@ -205,8 +205,11 @@ up.util = (->
|
|
205
205
|
object instanceof jQuery
|
206
206
|
|
207
207
|
isPromise = (object) ->
|
208
|
-
isFunction(object.then)
|
209
|
-
|
208
|
+
isObject(object) && isFunction(object.then)
|
209
|
+
|
210
|
+
isDeferred = (object) ->
|
211
|
+
isPromise(object) && isFunction(object.resolve)
|
212
|
+
|
210
213
|
ifGiven = (object) ->
|
211
214
|
object if isGiven(object)
|
212
215
|
|
@@ -317,6 +320,12 @@ up.util = (->
|
|
317
320
|
|
318
321
|
###*
|
319
322
|
Animates the given element's CSS properties using CSS transitions.
|
323
|
+
|
324
|
+
If the element is already being animated, the previous animation
|
325
|
+
will instantly jump to its last frame before the new animation begins.
|
326
|
+
|
327
|
+
To improve performance, the element will be forced into compositing for
|
328
|
+
the duration of the animation.
|
320
329
|
|
321
330
|
@method up.util.cssAnimate
|
322
331
|
@param {Element|jQuery|String} elementOrSelector
|
@@ -343,6 +352,8 @@ up.util = (->
|
|
343
352
|
delay: 0,
|
344
353
|
easing: 'ease'
|
345
354
|
)
|
355
|
+
# We don't finish an existing animation here, since
|
356
|
+
# the public API `up.motion.animate` already does this.
|
346
357
|
deferred = $.Deferred()
|
347
358
|
transition =
|
348
359
|
'transition-property': keys(lastFrame).join(', ')
|
@@ -354,12 +365,34 @@ up.util = (->
|
|
354
365
|
$element.css(lastFrame)
|
355
366
|
deferred.then(withoutCompositing)
|
356
367
|
deferred.then(withoutTransition)
|
357
|
-
|
358
|
-
deferred.
|
368
|
+
$element.data(ANIMATION_PROMISE_KEY, deferred)
|
369
|
+
deferred.then(-> $element.removeData(ANIMATION_PROMISE_KEY))
|
370
|
+
endTimeout = setTimeout((-> deferred.resolve()), opts.duration + opts.delay)
|
371
|
+
deferred.then(-> clearTimeout(endTimeout)) # clean up in case we're canceled
|
372
|
+
# Return the whole deferred and not just return a thenable.
|
373
|
+
# Other code will need the possibility to cancel the animation
|
374
|
+
# by resolving the deferred.
|
375
|
+
deferred
|
359
376
|
else
|
360
377
|
$element.css(lastFrame)
|
361
378
|
resolvedPromise()
|
362
|
-
|
379
|
+
|
380
|
+
ANIMATION_PROMISE_KEY = 'up-animation-promise'
|
381
|
+
|
382
|
+
###
|
383
|
+
Completes the animation for the given element by jumping
|
384
|
+
to the last frame instantly. All callbacks chained to
|
385
|
+
the original animation's promise will be called.
|
386
|
+
|
387
|
+
Does nothing if the given element is not currently animating.
|
388
|
+
|
389
|
+
@param {Element|jQuery|String} elementOrSelector
|
390
|
+
###
|
391
|
+
finishCssAnimate = (elementOrSelector) ->
|
392
|
+
$(elementOrSelector).each ->
|
393
|
+
if existingAnimation = $(this).data(ANIMATION_PROMISE_KEY)
|
394
|
+
existingAnimation.resolve()
|
395
|
+
|
363
396
|
measure = ($element, options) ->
|
364
397
|
coordinates = if options?.relative
|
365
398
|
$element.position()
|
@@ -430,10 +463,19 @@ up.util = (->
|
|
430
463
|
filtered[key] = object[key]
|
431
464
|
filtered
|
432
465
|
|
433
|
-
|
466
|
+
resolvedDeferred = ->
|
434
467
|
deferred = $.Deferred()
|
435
468
|
deferred.resolve()
|
436
|
-
deferred
|
469
|
+
deferred
|
470
|
+
|
471
|
+
resolvedPromise = ->
|
472
|
+
resolvedDeferred().promise()
|
473
|
+
|
474
|
+
resolvableWhen = (deferreds...) ->
|
475
|
+
joined = $.when(deferreds...)
|
476
|
+
joined.resolve = ->
|
477
|
+
each deferreds, (deferred) -> deferred.resolve?()
|
478
|
+
joined
|
437
479
|
|
438
480
|
# memoArray = ->
|
439
481
|
# array = []
|
@@ -482,6 +524,7 @@ up.util = (->
|
|
482
524
|
isString: isString
|
483
525
|
isJQuery: isJQuery
|
484
526
|
isPromise: isPromise
|
527
|
+
isDeferred: isDeferred
|
485
528
|
isHash: isHash
|
486
529
|
ifGiven: ifGiven
|
487
530
|
unwrap: unwrap
|
@@ -489,6 +532,7 @@ up.util = (->
|
|
489
532
|
measure: measure
|
490
533
|
temporaryCss: temporaryCss
|
491
534
|
cssAnimate: cssAnimate
|
535
|
+
finishCssAnimate: finishCssAnimate
|
492
536
|
forceCompositing: forceCompositing
|
493
537
|
prependGhost: prependGhost
|
494
538
|
escapePressed: escapePressed
|
@@ -504,5 +548,7 @@ up.util = (->
|
|
504
548
|
trim: trim
|
505
549
|
keys: keys
|
506
550
|
resolvedPromise: resolvedPromise
|
551
|
+
resolvedDeferred: resolvedDeferred
|
552
|
+
resolvableWhen: resolvableWhen
|
507
553
|
|
508
554
|
)()
|
data/lib/upjs/rails/version.rb
CHANGED
data/spec_app/Gemfile.lock
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upjs-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henning Koch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|