twitter_ratchet_rails 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/twitter_ratchet_rails/modals.js +41 -0
  3. data/app/assets/javascripts/twitter_ratchet_rails/popovers.js +87 -0
  4. data/app/assets/javascripts/twitter_ratchet_rails/push.js +483 -0
  5. data/app/assets/javascripts/twitter_ratchet_rails/ratchet.js +82 -54
  6. data/app/assets/javascripts/twitter_ratchet_rails/segmented-controllers.js +65 -0
  7. data/app/assets/javascripts/twitter_ratchet_rails/sliders.js +136 -0
  8. data/app/assets/javascripts/twitter_ratchet_rails/toggles.js +118 -0
  9. data/app/assets/stylesheets/twitter_ratchet_rails/ratchet-theme-android.css +113 -79
  10. data/app/assets/stylesheets/twitter_ratchet_rails/ratchet-theme-ios.css +90 -90
  11. data/app/assets/stylesheets/twitter_ratchet_rails/ratchet.css.erb +171 -166
  12. data/lib/twitter_ratchet_rails/version.rb +1 -1
  13. data/test/dummy/app/assets/javascripts/application.js +1 -0
  14. data/test/dummy/app/assets/javascripts/users.js +2 -0
  15. data/test/dummy/app/assets/stylesheets/application.css +1 -0
  16. data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
  17. data/test/dummy/app/assets/stylesheets/users.css +4 -0
  18. data/test/dummy/app/controllers/users_controller.rb +58 -0
  19. data/test/dummy/app/helpers/users_helper.rb +2 -0
  20. data/test/dummy/app/models/user.rb +2 -0
  21. data/test/dummy/app/views/layouts/application.html.erb +26 -9
  22. data/test/dummy/app/views/users/_form.html.erb +25 -0
  23. data/test/dummy/app/views/users/edit.html.erb +6 -0
  24. data/test/dummy/app/views/users/index.html.erb +51 -0
  25. data/test/dummy/app/views/users/new.html.erb +5 -0
  26. data/test/dummy/app/views/users/show.html.erb +14 -0
  27. data/test/dummy/config/routes.rb +4 -0
  28. data/test/dummy/db/development.sqlite3 +0 -0
  29. data/test/dummy/db/migrate/20140620120642_create_users.rb +10 -0
  30. data/test/dummy/db/schema.rb +23 -0
  31. data/test/dummy/log/development.log +834 -0
  32. data/test/dummy/test/controllers/users_controller_test.rb +49 -0
  33. data/test/dummy/test/fixtures/users.yml +9 -0
  34. data/test/dummy/test/helpers/users_helper_test.rb +4 -0
  35. data/test/{integration/navigation_test.rb → dummy/test/models/user_test.rb} +1 -4
  36. data/test/dummy/tmp/cache/assets/development/sprockets/02365dc2cb50c9b2a206bf87d9181ef9 +0 -0
  37. data/test/dummy/tmp/cache/assets/development/sprockets/05c4a034c993964dc3064d1e840449fd +0 -0
  38. data/test/dummy/tmp/cache/assets/development/sprockets/0800f54ee19cf3cee10b956fa9786799 +0 -0
  39. data/test/dummy/tmp/cache/assets/development/sprockets/0e66254a0ff45c104998339ae7c607c5 +0 -0
  40. data/test/dummy/tmp/cache/assets/development/sprockets/0e804c20d0e8d07c2477ce1c0f102adf +0 -0
  41. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  42. data/test/dummy/tmp/cache/assets/development/sprockets/163a4561a07fbc33d8a229302099d8dd +0 -0
  43. data/test/dummy/tmp/cache/assets/development/sprockets/2bd9a33c28022e3c885044a69be41a10 +0 -0
  44. data/test/dummy/tmp/cache/assets/development/sprockets/2d3d6a06270e38c5b1ff9b578aa35990 +0 -0
  45. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  46. data/test/dummy/tmp/cache/assets/development/sprockets/30e315773d1e399a47375b9e13041ed0 +0 -0
  47. data/test/dummy/tmp/cache/assets/development/sprockets/32593d4dfd09e0a66f70fe8095bb1014 +0 -0
  48. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  49. data/test/dummy/tmp/cache/assets/development/sprockets/35fa941d49cfabf40906d7ac81e502b5 +0 -0
  50. data/test/dummy/tmp/cache/assets/development/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
  51. data/test/dummy/tmp/cache/assets/development/sprockets/3a18489ba6c9aaef36fe82a5eccaa683 +0 -0
  52. data/test/dummy/tmp/cache/assets/development/sprockets/3b2f71b1e0ed4912133e1322edeebeb4 +0 -0
  53. data/test/dummy/tmp/cache/assets/development/sprockets/3cff68a61696f3df6cc0150dfe5f0a7a +0 -0
  54. data/test/dummy/tmp/cache/assets/development/sprockets/4050a4e5062ab95c9f32e9b6940821ea +0 -0
  55. data/test/dummy/tmp/cache/assets/development/sprockets/510da110ae528e2d22533be39ff696c5 +0 -0
  56. data/test/dummy/tmp/cache/assets/development/sprockets/5159109e8d44f828ad6e8c67292647ee +0 -0
  57. data/test/dummy/tmp/cache/assets/development/sprockets/56a757e904e5be9c01961ca2d84bf6dd +0 -0
  58. data/test/dummy/tmp/cache/assets/development/sprockets/5f1a0d05e77ca8b9a1fc2a47e17a8174 +0 -0
  59. data/test/dummy/tmp/cache/assets/development/sprockets/6ecbd847a59c3a487acbaf3a341a116e +0 -0
  60. data/test/dummy/tmp/cache/assets/development/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
  61. data/test/dummy/tmp/cache/assets/development/sprockets/7c5d2dcee0e90462ec7314c630051fc2 +0 -0
  62. data/test/dummy/tmp/cache/assets/development/sprockets/87b209c0c9da28094a8d5581a21262c6 +0 -0
  63. data/test/dummy/tmp/cache/assets/development/sprockets/90cccb07f2fc8407c9356103eb53c419 +0 -0
  64. data/test/dummy/tmp/cache/assets/development/sprockets/c71d61ab8105e8c42bf9dc173a72671d +0 -0
  65. data/test/dummy/tmp/cache/assets/development/sprockets/cebc6db0bbb8120f430da3970b173d2f +0 -0
  66. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  67. data/test/dummy/tmp/cache/assets/development/sprockets/d247d1ed3987a4834f22fb867bdca6bc +0 -0
  68. data/test/dummy/tmp/cache/assets/development/sprockets/d47632ab6c54bae0f6a62e211aca4938 +0 -0
  69. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  70. data/test/dummy/tmp/cache/assets/development/sprockets/dd1bfc325578c5b436921f471d625afa +0 -0
  71. data/test/dummy/tmp/cache/assets/development/sprockets/f333e4623731332ab806c650e07ef890 +0 -0
  72. data/test/dummy/tmp/cache/assets/development/sprockets/f4a9eb5609520a5f6dbad5dbdbeb37ca +0 -0
  73. data/test/dummy/tmp/cache/assets/development/sprockets/f56253b5f374fff1a33fbbc9881c9124 +0 -0
  74. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  75. data/test/dummy/tmp/pids/server.pid +1 -0
  76. metadata +130 -14
  77. data/app/helpers/twitter_ratchet_rails/application_helper.rb +0 -4
  78. data/app/views/layouts/twitter_ratchet_rails/application.html.erb +0 -14
  79. data/test/test_helper.rb +0 -15
  80. data/test/twitter_ratchet_rails_test.rb +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 69700ea5ae1f08547e50baa7299f292202ef0b5b
4
- data.tar.gz: f45188b029214f8b84b9029106f247deb4b3226f
3
+ metadata.gz: ef5e6291d3fcb03fd9744bcc931447272f2afb86
4
+ data.tar.gz: 6a52726ea214422b49b5df2de9c3fa32af9d1d21
5
5
  SHA512:
6
- metadata.gz: ffeedc51df951d05a5208714b4d6e286686d78ce90091474fee57954de8e5367379c3110db23bb3de7eb9c6c91796363370bda5b46ba0b73ac9b9bc12eae8557
7
- data.tar.gz: dcc2fb1b746060b2a1c5b0f45c2a9f370c5709c73f083bf78bdb752bd0600631f542ef3a8bdd21cc1925ab27e0a2734dfa259e47fbb3a07a995c6d21a5dca90d
6
+ metadata.gz: 8c456e7aea4e6b494de2bb89fd5d4e662c6539ffc501462d56d5e7f0a813a059668e15f11e8e5823049ebd3e85de06218a6cea2cee107620f55c2575ee7773f1
7
+ data.tar.gz: 210b0e254dc11d92ecee154715e69e15d0fdfe156d122e125cb17b737bf331c29a5a3d25eb47b90d0fd8a185d336111aa0c3e6588725eaf480a2e0686161dc50
@@ -0,0 +1,41 @@
1
+ /* ========================================================================
2
+ * Ratchet: modals.js v2.0.2
3
+ * http://goratchet.com/components#modals
4
+ * ========================================================================
5
+ * Copyright 2014 Connor Sears
6
+ * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+ !(function () {
10
+ 'use strict';
11
+
12
+ var findModals = function (target) {
13
+ var i;
14
+ var modals = document.querySelectorAll('a');
15
+
16
+ for (; target && target !== document; target = target.parentNode) {
17
+ for (i = modals.length; i--;) {
18
+ if (modals[i] === target) {
19
+ return target;
20
+ }
21
+ }
22
+ }
23
+ };
24
+
25
+ var getModal = function (event) {
26
+ var modalToggle = findModals(event.target);
27
+ if (modalToggle && modalToggle.hash) {
28
+ return document.querySelector(modalToggle.hash);
29
+ }
30
+ };
31
+
32
+ window.addEventListener('touchend', function (event) {
33
+ var modal = getModal(event);
34
+ if (modal) {
35
+ if (modal && modal.classList.contains('modal')) {
36
+ modal.classList.toggle('active');
37
+ }
38
+ event.preventDefault(); // prevents rewriting url (apps can still use hash values in url)
39
+ }
40
+ });
41
+ }());
@@ -0,0 +1,87 @@
1
+ /* ========================================================================
2
+ * Ratchet: popovers.js v2.0.2
3
+ * http://goratchet.com/components#popovers
4
+ * ========================================================================
5
+ * Copyright 2014 Connor Sears
6
+ * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+ !(function () {
10
+ 'use strict';
11
+
12
+ var popover;
13
+
14
+ var findPopovers = function (target) {
15
+ var i;
16
+ var popovers = document.querySelectorAll('a');
17
+
18
+ for (; target && target !== document; target = target.parentNode) {
19
+ for (i = popovers.length; i--;) {
20
+ if (popovers[i] === target) {
21
+ return target;
22
+ }
23
+ }
24
+ }
25
+ };
26
+
27
+ var onPopoverHidden = function () {
28
+ popover.style.display = 'none';
29
+ popover.removeEventListener('webkitTransitionEnd', onPopoverHidden);
30
+ };
31
+
32
+ var backdrop = (function () {
33
+ var element = document.createElement('div');
34
+
35
+ element.classList.add('backdrop');
36
+
37
+ element.addEventListener('touchend', function () {
38
+ popover.addEventListener('webkitTransitionEnd', onPopoverHidden);
39
+ popover.classList.remove('visible');
40
+ popover.parentNode.removeChild(backdrop);
41
+ });
42
+
43
+ return element;
44
+ }());
45
+
46
+ var getPopover = function (e) {
47
+ var anchor = findPopovers(e.target);
48
+
49
+ if (!anchor || !anchor.hash || (anchor.hash.indexOf('/') > 0)) {
50
+ return;
51
+ }
52
+
53
+ try {
54
+ popover = document.querySelector(anchor.hash);
55
+ }
56
+ catch (error) {
57
+ popover = null;
58
+ }
59
+
60
+ if (popover === null) {
61
+ return;
62
+ }
63
+
64
+ if (!popover || !popover.classList.contains('popover')) {
65
+ return;
66
+ }
67
+
68
+ return popover;
69
+ };
70
+
71
+ var showHidePopover = function (e) {
72
+ var popover = getPopover(e);
73
+
74
+ if (!popover) {
75
+ return;
76
+ }
77
+
78
+ popover.style.display = 'block';
79
+ popover.offsetHeight;
80
+ popover.classList.add('visible');
81
+
82
+ popover.parentNode.appendChild(backdrop);
83
+ };
84
+
85
+ window.addEventListener('touchend', showHidePopover);
86
+
87
+ }());
@@ -0,0 +1,483 @@
1
+ /* ========================================================================
2
+ * Ratchet: push.js v2.0.2
3
+ * http://goratchet.com/components#push
4
+ * ========================================================================
5
+ * inspired by @defunkt's jquery.pjax.js
6
+ * Copyright 2014 Connor Sears
7
+ * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE)
8
+ * ======================================================================== */
9
+
10
+ /* global _gaq: true */
11
+
12
+ !(function () {
13
+ 'use strict';
14
+
15
+ var noop = function () {};
16
+
17
+
18
+ // Pushstate caching
19
+ // ==================
20
+
21
+ var isScrolling;
22
+ var maxCacheLength = 20;
23
+ var cacheMapping = sessionStorage;
24
+ var domCache = {};
25
+ var transitionMap = {
26
+ slideIn : 'slide-out',
27
+ slideOut : 'slide-in',
28
+ fade : 'fade'
29
+ };
30
+
31
+ var bars = {
32
+ bartab : '.bar-tab',
33
+ barnav : '.bar-nav',
34
+ barfooter : '.bar-footer',
35
+ barheadersecondary : '.bar-header-secondary'
36
+ };
37
+
38
+ var cacheReplace = function (data, updates) {
39
+ PUSH.id = data.id;
40
+ if (updates) {
41
+ data = getCached(data.id);
42
+ }
43
+ cacheMapping[data.id] = JSON.stringify(data);
44
+ window.history.replaceState(data.id, data.title, data.url);
45
+ domCache[data.id] = document.body.cloneNode(true);
46
+ };
47
+
48
+ var cachePush = function () {
49
+ var id = PUSH.id;
50
+
51
+ var cacheForwardStack = JSON.parse(cacheMapping.cacheForwardStack || '[]');
52
+ var cacheBackStack = JSON.parse(cacheMapping.cacheBackStack || '[]');
53
+
54
+ cacheBackStack.push(id);
55
+
56
+ while (cacheForwardStack.length) {
57
+ delete cacheMapping[cacheForwardStack.shift()];
58
+ }
59
+ while (cacheBackStack.length > maxCacheLength) {
60
+ delete cacheMapping[cacheBackStack.shift()];
61
+ }
62
+
63
+ window.history.pushState(null, '', cacheMapping[PUSH.id].url);
64
+
65
+ cacheMapping.cacheForwardStack = JSON.stringify(cacheForwardStack);
66
+ cacheMapping.cacheBackStack = JSON.stringify(cacheBackStack);
67
+ };
68
+
69
+ var cachePop = function (id, direction) {
70
+ var forward = direction === 'forward';
71
+ var cacheForwardStack = JSON.parse(cacheMapping.cacheForwardStack || '[]');
72
+ var cacheBackStack = JSON.parse(cacheMapping.cacheBackStack || '[]');
73
+ var pushStack = forward ? cacheBackStack : cacheForwardStack;
74
+ var popStack = forward ? cacheForwardStack : cacheBackStack;
75
+
76
+ if (PUSH.id) {
77
+ pushStack.push(PUSH.id);
78
+ }
79
+ popStack.pop();
80
+
81
+ cacheMapping.cacheForwardStack = JSON.stringify(cacheForwardStack);
82
+ cacheMapping.cacheBackStack = JSON.stringify(cacheBackStack);
83
+ };
84
+
85
+ var getCached = function (id) {
86
+ return JSON.parse(cacheMapping[id] || null) || {};
87
+ };
88
+
89
+ var getTarget = function (e) {
90
+ var target = findTarget(e.target);
91
+
92
+ if (!target ||
93
+ e.which > 1 ||
94
+ e.metaKey ||
95
+ e.ctrlKey ||
96
+ isScrolling ||
97
+ location.protocol !== target.protocol ||
98
+ location.host !== target.host ||
99
+ !target.hash && /#/.test(target.href) ||
100
+ target.hash && target.href.replace(target.hash, '') === location.href.replace(location.hash, '') ||
101
+ target.getAttribute('data-ignore') === 'push') { return; }
102
+
103
+ return target;
104
+ };
105
+
106
+
107
+ // Main event handlers (touchend, popstate)
108
+ // ==========================================
109
+
110
+ var touchend = function (e) {
111
+ var target = getTarget(e);
112
+
113
+ if (!target) {
114
+ return;
115
+ }
116
+
117
+ e.preventDefault();
118
+
119
+ PUSH({
120
+ url : target.href,
121
+ hash : target.hash,
122
+ timeout : target.getAttribute('data-timeout'),
123
+ transition : target.getAttribute('data-transition')
124
+ });
125
+ };
126
+
127
+ var popstate = function (e) {
128
+ var key;
129
+ var barElement;
130
+ var activeObj;
131
+ var activeDom;
132
+ var direction;
133
+ var transition;
134
+ var transitionFrom;
135
+ var transitionFromObj;
136
+ var id = e.state;
137
+
138
+ if (!id || !cacheMapping[id]) {
139
+ return;
140
+ }
141
+
142
+ direction = PUSH.id < id ? 'forward' : 'back';
143
+
144
+ cachePop(id, direction);
145
+
146
+ activeObj = getCached(id);
147
+ activeDom = domCache[id];
148
+
149
+ if (activeObj.title) {
150
+ document.title = activeObj.title;
151
+ }
152
+
153
+ if (direction === 'back') {
154
+ transitionFrom = JSON.parse(direction === 'back' ? cacheMapping.cacheForwardStack : cacheMapping.cacheBackStack);
155
+ transitionFromObj = getCached(transitionFrom[transitionFrom.length - 1]);
156
+ } else {
157
+ transitionFromObj = activeObj;
158
+ }
159
+
160
+ if (direction === 'back' && !transitionFromObj.id) {
161
+ return (PUSH.id = id);
162
+ }
163
+
164
+ transition = direction === 'back' ? transitionMap[transitionFromObj.transition] : transitionFromObj.transition;
165
+
166
+ if (!activeDom) {
167
+ return PUSH({
168
+ id : activeObj.id,
169
+ url : activeObj.url,
170
+ title : activeObj.title,
171
+ timeout : activeObj.timeout,
172
+ transition : transition,
173
+ ignorePush : true
174
+ });
175
+ }
176
+
177
+ if (transitionFromObj.transition) {
178
+ activeObj = extendWithDom(activeObj, '.content', activeDom.cloneNode(true));
179
+ for (key in bars) {
180
+ if (bars.hasOwnProperty(key)) {
181
+ barElement = document.querySelector(bars[key]);
182
+ if (activeObj[key]) {
183
+ swapContent(activeObj[key], barElement);
184
+ } else if (barElement) {
185
+ barElement.parentNode.removeChild(barElement);
186
+ }
187
+ }
188
+ }
189
+ }
190
+
191
+ swapContent(
192
+ (activeObj.contents || activeDom).cloneNode(true),
193
+ document.querySelector('.content'),
194
+ transition
195
+ );
196
+
197
+ PUSH.id = id;
198
+
199
+ document.body.offsetHeight; // force reflow to prevent scroll
200
+ };
201
+
202
+
203
+ // Core PUSH functionality
204
+ // =======================
205
+
206
+ var PUSH = function (options) {
207
+ var key;
208
+ var xhr = PUSH.xhr;
209
+
210
+ options.container = options.container || options.transition ? document.querySelector('.content') : document.body;
211
+
212
+ for (key in bars) {
213
+ if (bars.hasOwnProperty(key)) {
214
+ options[key] = options[key] || document.querySelector(bars[key]);
215
+ }
216
+ }
217
+
218
+ if (xhr && xhr.readyState < 4) {
219
+ xhr.onreadystatechange = noop;
220
+ xhr.abort();
221
+ }
222
+
223
+ xhr = new XMLHttpRequest();
224
+ xhr.open('GET', options.url, true);
225
+ xhr.setRequestHeader('X-PUSH', 'true');
226
+
227
+ xhr.onreadystatechange = function () {
228
+ if (options._timeout) {
229
+ clearTimeout(options._timeout);
230
+ }
231
+ if (xhr.readyState === 4) {
232
+ xhr.status === 200 ? success(xhr, options) : failure(options.url);
233
+ }
234
+ };
235
+
236
+ if (!PUSH.id) {
237
+ cacheReplace({
238
+ id : +new Date(),
239
+ url : window.location.href,
240
+ title : document.title,
241
+ timeout : options.timeout,
242
+ transition : null
243
+ });
244
+ }
245
+
246
+ if (options.timeout) {
247
+ options._timeout = setTimeout(function () { xhr.abort('timeout'); }, options.timeout);
248
+ }
249
+
250
+ xhr.send();
251
+
252
+ if (xhr.readyState && !options.ignorePush) {
253
+ cachePush();
254
+ }
255
+ };
256
+
257
+
258
+ // Main XHR handlers
259
+ // =================
260
+
261
+ var success = function (xhr, options) {
262
+ var key;
263
+ var barElement;
264
+ var data = parseXHR(xhr, options);
265
+
266
+ if (!data.contents) {
267
+ return locationReplace(options.url);
268
+ }
269
+
270
+ if (data.title) {
271
+ document.title = data.title;
272
+ }
273
+
274
+ if (options.transition) {
275
+ for (key in bars) {
276
+ if (bars.hasOwnProperty(key)) {
277
+ barElement = document.querySelector(bars[key]);
278
+ if (data[key]) {
279
+ swapContent(data[key], barElement);
280
+ } else if (barElement) {
281
+ barElement.parentNode.removeChild(barElement);
282
+ }
283
+ }
284
+ }
285
+ }
286
+
287
+ swapContent(data.contents, options.container, options.transition, function () {
288
+ cacheReplace({
289
+ id : options.id || +new Date(),
290
+ url : data.url,
291
+ title : data.title,
292
+ timeout : options.timeout,
293
+ transition : options.transition
294
+ }, options.id);
295
+ triggerStateChange();
296
+ });
297
+
298
+ if (!options.ignorePush && window._gaq) {
299
+ _gaq.push(['_trackPageview']); // google analytics
300
+ }
301
+ if (!options.hash) {
302
+ return;
303
+ }
304
+ };
305
+
306
+ var failure = function (url) {
307
+ throw new Error('Could not get: ' + url);
308
+ };
309
+
310
+
311
+ // PUSH helpers
312
+ // ============
313
+
314
+ var swapContent = function (swap, container, transition, complete) {
315
+ var enter;
316
+ var containerDirection;
317
+ var swapDirection;
318
+
319
+ if (!transition) {
320
+ if (container) {
321
+ container.innerHTML = swap.innerHTML;
322
+ } else if (swap.classList.contains('content')) {
323
+ document.body.appendChild(swap);
324
+ } else {
325
+ document.body.insertBefore(swap, document.querySelector('.content'));
326
+ }
327
+ } else {
328
+ enter = /in$/.test(transition);
329
+
330
+ if (transition === 'fade') {
331
+ container.classList.add('in');
332
+ container.classList.add('fade');
333
+ swap.classList.add('fade');
334
+ }
335
+
336
+ if (/slide/.test(transition)) {
337
+ swap.classList.add('sliding-in', enter ? 'right' : 'left');
338
+ swap.classList.add('sliding');
339
+ container.classList.add('sliding');
340
+ }
341
+
342
+ container.parentNode.insertBefore(swap, container);
343
+ }
344
+
345
+ if (!transition) {
346
+ complete && complete();
347
+ }
348
+
349
+ if (transition === 'fade') {
350
+ container.offsetWidth; // force reflow
351
+ container.classList.remove('in');
352
+ var fadeContainerEnd = function () {
353
+ container.removeEventListener('webkitTransitionEnd', fadeContainerEnd);
354
+ swap.classList.add('in');
355
+ swap.addEventListener('webkitTransitionEnd', fadeSwapEnd);
356
+ };
357
+ var fadeSwapEnd = function () {
358
+ swap.removeEventListener('webkitTransitionEnd', fadeSwapEnd);
359
+ container.parentNode.removeChild(container);
360
+ swap.classList.remove('fade');
361
+ swap.classList.remove('in');
362
+ complete && complete();
363
+ };
364
+ container.addEventListener('webkitTransitionEnd', fadeContainerEnd);
365
+
366
+ }
367
+
368
+ if (/slide/.test(transition)) {
369
+ var slideEnd = function () {
370
+ swap.removeEventListener('webkitTransitionEnd', slideEnd);
371
+ swap.classList.remove('sliding', 'sliding-in');
372
+ swap.classList.remove(swapDirection);
373
+ container.parentNode.removeChild(container);
374
+ complete && complete();
375
+ };
376
+
377
+ container.offsetWidth; // force reflow
378
+ swapDirection = enter ? 'right' : 'left';
379
+ containerDirection = enter ? 'left' : 'right';
380
+ container.classList.add(containerDirection);
381
+ swap.classList.remove(swapDirection);
382
+ swap.addEventListener('webkitTransitionEnd', slideEnd);
383
+ }
384
+ };
385
+
386
+ var triggerStateChange = function () {
387
+ var e = new CustomEvent('push', {
388
+ detail: { state: getCached(PUSH.id) },
389
+ bubbles: true,
390
+ cancelable: true
391
+ });
392
+
393
+ window.dispatchEvent(e);
394
+ };
395
+
396
+ var findTarget = function (target) {
397
+ var i;
398
+ var toggles = document.querySelectorAll('a');
399
+
400
+ for (; target && target !== document; target = target.parentNode) {
401
+ for (i = toggles.length; i--;) {
402
+ if (toggles[i] === target) {
403
+ return target;
404
+ }
405
+ }
406
+ }
407
+ };
408
+
409
+ var locationReplace = function (url) {
410
+ window.history.replaceState(null, '', '#');
411
+ window.location.replace(url);
412
+ };
413
+
414
+ var extendWithDom = function (obj, fragment, dom) {
415
+ var i;
416
+ var result = {};
417
+
418
+ for (i in obj) {
419
+ if (obj.hasOwnProperty(i)) {
420
+ result[i] = obj[i];
421
+ }
422
+ }
423
+
424
+ Object.keys(bars).forEach(function (key) {
425
+ var el = dom.querySelector(bars[key]);
426
+ if (el) {
427
+ el.parentNode.removeChild(el);
428
+ }
429
+ result[key] = el;
430
+ });
431
+
432
+ result.contents = dom.querySelector(fragment);
433
+
434
+ return result;
435
+ };
436
+
437
+ var parseXHR = function (xhr, options) {
438
+ var head;
439
+ var body;
440
+ var data = {};
441
+ var responseText = xhr.responseText;
442
+
443
+ data.url = options.url;
444
+
445
+ if (!responseText) {
446
+ return data;
447
+ }
448
+
449
+ if (/<html/i.test(responseText)) {
450
+ head = document.createElement('div');
451
+ body = document.createElement('div');
452
+ head.innerHTML = responseText.match(/<head[^>]*>([\s\S.]*)<\/head>/i)[0];
453
+ body.innerHTML = responseText.match(/<body[^>]*>([\s\S.]*)<\/body>/i)[0];
454
+ } else {
455
+ head = body = document.createElement('div');
456
+ head.innerHTML = responseText;
457
+ }
458
+
459
+ data.title = head.querySelector('title');
460
+ var text = 'innerText' in data.title ? 'innerText' : 'textContent';
461
+ data.title = data.title && data.title[text].trim();
462
+
463
+ if (options.transition) {
464
+ data = extendWithDom(data, '.content', body);
465
+ } else {
466
+ data.contents = body;
467
+ }
468
+
469
+ return data;
470
+ };
471
+
472
+
473
+ // Attach PUSH event handlers
474
+ // ==========================
475
+
476
+ window.addEventListener('touchstart', function () { isScrolling = false; });
477
+ window.addEventListener('touchmove', function () { isScrolling = true; });
478
+ window.addEventListener('touchend', touchend);
479
+ window.addEventListener('click', function (e) { if (getTarget(e)) {e.preventDefault();} });
480
+ window.addEventListener('popstate', popstate);
481
+ window.PUSH = PUSH;
482
+
483
+ }());