pacejs_rails 0.4.15

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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OGY4YmMxNGNiNDgxOTM0MWU1YjYyN2U0NmMxNjM5YTg1ZmFlOTQ0Yw==
5
+ data.tar.gz: !binary |-
6
+ OWJmODExZjU4YTZmOGM3MGY2MWJhMDUxNjJmYjk0ZWM2YWU5ZDExZg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OGI4MzgyNjBjMTE1ODA5MjkzNzgzMDM5MTIxZDI1NTM5ZTI4MWJhZDM0NjQz
10
+ YjMwMzMxODcyNjhkNGJlZGU5MDI3MTA2YTQxZGY3OTI5NDkyNGI3NDVmZDY3
11
+ YTQzY2U1YzU2ODQzNWJmMmQ4YWRhN2MzNmJhYTVhNTRjMGQ5NWM=
12
+ data.tar.gz: !binary |-
13
+ OGFhMjc1NThhYWU2YTgwY2M0NTYxNjIyOTkwMTVkNTQ1ZmFiZTM3Y2QzOGIz
14
+ NWY0NDQ0ZjY1ZTI0NDYwYWM4NGEwNDg2NDdlZGZhOGFmNWExNDVjZmY5MzM5
15
+ NGYzMzg3ZjczMDc5N2FmZWU4NWZmNzBmZjE4M2FkY2U0NDZlNzA=
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pacejs_rails.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Guy Israeli
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,46 @@
1
+ # PacejsRails
2
+
3
+ Pace.js (Automatic web page progress bar) for Rails 3.1 and up (including 4) to work with the asset pipeline to provide versioning of the code
4
+
5
+ as seen https://github.com/HubSpot/pace
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'pacejs_rails'
12
+
13
+
14
+ Add the following directive to your Javascript manifest file (application.js):
15
+
16
+ //= require pace
17
+
18
+ In the stylesheet manifest (application.css) add a theme of your choosing:
19
+
20
+ for exmaple
21
+
22
+ *= pace-theme-big-counter
23
+
24
+ see themes here: http://github.hubspot.com/pace/docs/welcome/
25
+
26
+ themes available: https://github.com/HubSpot/pace/tree/master/themes
27
+
28
+
29
+ And then execute:
30
+
31
+ $ bundle
32
+
33
+ Or install it yourself as:
34
+
35
+ $ gem install pacejs_rails
36
+
37
+ ## Usage
38
+
39
+ just install and it will monitor all ajax requests and stuff
40
+ ## Contributing
41
+
42
+ 1. Fork it
43
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
44
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
45
+ 4. Push to the branch (`git push origin my-new-feature`)
46
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,759 @@
1
+ // Pace.js
2
+ // 0.4.15
3
+ // https://github.com/HubSpot/pace
4
+ (function() {
5
+ var AjaxMonitor, Bar, DocumentMonitor, ElementMonitor, ElementTracker, EventLagMonitor, Events, NoTargetError, RequestIntercept, SOURCE_KEYS, Scaler, SocketRequestTracker, XHRRequestTracker, animation, avgAmplitude, bar, cancelAnimation, cancelAnimationFrame, defaultOptions, extend, extendNative, getFromDOM, getIntercept, handlePushState, init, now, options, requestAnimationFrame, result, runAnimation, scalers, sources, uniScaler, _WebSocket, _XDomainRequest, _XMLHttpRequest, _intercept, _pushState, _ref, _replaceState,
6
+ __slice = [].slice,
7
+ __hasProp = {}.hasOwnProperty,
8
+ __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
9
+ __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
10
+
11
+ defaultOptions = {
12
+ catchupTime: 500,
13
+ initialRate: .03,
14
+ minTime: 500,
15
+ ghostTime: 250,
16
+ maxProgressPerFrame: 10,
17
+ easeFactor: 1.25,
18
+ startOnPageLoad: true,
19
+ restartOnPushState: true,
20
+ restartOnRequestAfter: 500,
21
+ target: 'body',
22
+ elements: {
23
+ checkInterval: 100,
24
+ selectors: ['body']
25
+ },
26
+ eventLag: {
27
+ minSamples: 10,
28
+ sampleCount: 3,
29
+ lagThreshold: 3
30
+ },
31
+ ajax: {
32
+ trackMethods: ['GET'],
33
+ trackWebSockets: false
34
+ }
35
+ };
36
+
37
+ now = function() {
38
+ var _ref;
39
+ return (_ref = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref : +(new Date);
40
+ };
41
+
42
+ requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
43
+
44
+ cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame;
45
+
46
+ if (requestAnimationFrame == null) {
47
+ requestAnimationFrame = function(fn) {
48
+ return setTimeout(fn, 50);
49
+ };
50
+ cancelAnimationFrame = function(id) {
51
+ return clearTimeout(id);
52
+ };
53
+ }
54
+
55
+ runAnimation = function(fn) {
56
+ var last, tick;
57
+ last = now();
58
+ tick = function() {
59
+ var diff;
60
+ diff = now() - last;
61
+ last = now();
62
+ return fn(diff, function() {
63
+ return requestAnimationFrame(tick);
64
+ });
65
+ };
66
+ return tick();
67
+ };
68
+
69
+ result = function() {
70
+ var args, key, obj;
71
+ obj = arguments[0], key = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
72
+ if (typeof obj[key] === 'function') {
73
+ return obj[key].apply(obj, args);
74
+ } else {
75
+ return obj[key];
76
+ }
77
+ };
78
+
79
+ extend = function() {
80
+ var key, out, source, sources, val, _i, _len;
81
+ out = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
82
+ for (_i = 0, _len = sources.length; _i < _len; _i++) {
83
+ source = sources[_i];
84
+ if (source) {
85
+ for (key in source) {
86
+ if (!__hasProp.call(source, key)) continue;
87
+ val = source[key];
88
+ if ((out[key] != null) && typeof out[key] === 'object' && (val != null) && typeof val === 'object') {
89
+ extend(out[key], val);
90
+ } else {
91
+ out[key] = val;
92
+ }
93
+ }
94
+ }
95
+ }
96
+ return out;
97
+ };
98
+
99
+ avgAmplitude = function(arr) {
100
+ var count, sum, v, _i, _len;
101
+ sum = count = 0;
102
+ for (_i = 0, _len = arr.length; _i < _len; _i++) {
103
+ v = arr[_i];
104
+ sum += Math.abs(v);
105
+ count++;
106
+ }
107
+ return sum / count;
108
+ };
109
+
110
+ getFromDOM = function(key, json) {
111
+ var data, e, el;
112
+ if (key == null) {
113
+ key = 'options';
114
+ }
115
+ if (json == null) {
116
+ json = true;
117
+ }
118
+ el = document.querySelector("[data-pace-" + key + "]");
119
+ if (!el) {
120
+ return;
121
+ }
122
+ data = el.getAttribute("data-pace-" + key);
123
+ if (!json) {
124
+ return data;
125
+ }
126
+ try {
127
+ return JSON.parse(data);
128
+ } catch (_error) {
129
+ e = _error;
130
+ return typeof console !== "undefined" && console !== null ? console.error("Error parsing inline pace options", e) : void 0;
131
+ }
132
+ };
133
+
134
+ if (window.Pace == null) {
135
+ window.Pace = {};
136
+ }
137
+
138
+ options = Pace.options = extend(defaultOptions, window.paceOptions, getFromDOM());
139
+
140
+ NoTargetError = (function(_super) {
141
+ __extends(NoTargetError, _super);
142
+
143
+ function NoTargetError() {
144
+ _ref = NoTargetError.__super__.constructor.apply(this, arguments);
145
+ return _ref;
146
+ }
147
+
148
+ return NoTargetError;
149
+
150
+ })(Error);
151
+
152
+ Bar = (function() {
153
+ function Bar() {
154
+ this.progress = 0;
155
+ }
156
+
157
+ Bar.prototype.getElement = function() {
158
+ var targetElement;
159
+ if (this.el == null) {
160
+ targetElement = document.querySelector(options.target);
161
+ if (!targetElement) {
162
+ throw new NoTargetError;
163
+ }
164
+ this.el = document.createElement('div');
165
+ this.el.className = "pace pace-active";
166
+ document.body.className = document.body.className.replace('pace-done', '');
167
+ document.body.className += ' pace-running';
168
+ this.el.innerHTML = '<div class="pace-progress">\n <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>';
169
+ if (targetElement.firstChild != null) {
170
+ targetElement.insertBefore(this.el, targetElement.firstChild);
171
+ } else {
172
+ targetElement.appendChild(this.el);
173
+ }
174
+ }
175
+ return this.el;
176
+ };
177
+
178
+ Bar.prototype.finish = function() {
179
+ var el;
180
+ el = this.getElement();
181
+ el.className = el.className.replace('pace-active', '');
182
+ el.className += ' pace-inactive';
183
+ document.body.className = document.body.className.replace('pace-running', '');
184
+ return document.body.className += ' pace-done';
185
+ };
186
+
187
+ Bar.prototype.update = function(prog) {
188
+ this.progress = prog;
189
+ return this.render();
190
+ };
191
+
192
+ Bar.prototype.destroy = function() {
193
+ try {
194
+ this.getElement().parentNode.removeChild(this.getElement());
195
+ } catch (_error) {
196
+ NoTargetError = _error;
197
+ }
198
+ return this.el = void 0;
199
+ };
200
+
201
+ Bar.prototype.render = function() {
202
+ var el, progressStr;
203
+ if (document.querySelector(options.target) == null) {
204
+ return false;
205
+ }
206
+ el = this.getElement();
207
+ el.children[0].style.width = "" + this.progress + "%";
208
+ if (!this.lastRenderedProgress || this.lastRenderedProgress | 0 !== this.progress | 0) {
209
+ el.children[0].setAttribute('data-progress-text', "" + (this.progress | 0) + "%");
210
+ if (this.progress >= 100) {
211
+ progressStr = '99';
212
+ } else {
213
+ progressStr = this.progress < 10 ? "0" : "";
214
+ progressStr += this.progress | 0;
215
+ }
216
+ el.children[0].setAttribute('data-progress', "" + progressStr);
217
+ }
218
+ return this.lastRenderedProgress = this.progress;
219
+ };
220
+
221
+ Bar.prototype.done = function() {
222
+ return this.progress >= 100;
223
+ };
224
+
225
+ return Bar;
226
+
227
+ })();
228
+
229
+ Events = (function() {
230
+ function Events() {
231
+ this.bindings = {};
232
+ }
233
+
234
+ Events.prototype.trigger = function(name, val) {
235
+ var binding, _i, _len, _ref1, _results;
236
+ if (this.bindings[name] != null) {
237
+ _ref1 = this.bindings[name];
238
+ _results = [];
239
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
240
+ binding = _ref1[_i];
241
+ _results.push(binding.call(this, val));
242
+ }
243
+ return _results;
244
+ }
245
+ };
246
+
247
+ Events.prototype.on = function(name, fn) {
248
+ var _base;
249
+ if ((_base = this.bindings)[name] == null) {
250
+ _base[name] = [];
251
+ }
252
+ return this.bindings[name].push(fn);
253
+ };
254
+
255
+ return Events;
256
+
257
+ })();
258
+
259
+ _XMLHttpRequest = window.XMLHttpRequest;
260
+
261
+ _XDomainRequest = window.XDomainRequest;
262
+
263
+ _WebSocket = window.WebSocket;
264
+
265
+ extendNative = function(to, from) {
266
+ var e, key, val, _results;
267
+ _results = [];
268
+ for (key in from.prototype) {
269
+ try {
270
+ val = from.prototype[key];
271
+ if ((to[key] == null) && typeof val !== 'function') {
272
+ _results.push(to[key] = val);
273
+ } else {
274
+ _results.push(void 0);
275
+ }
276
+ } catch (_error) {
277
+ e = _error;
278
+ }
279
+ }
280
+ return _results;
281
+ };
282
+
283
+ RequestIntercept = (function(_super) {
284
+ __extends(RequestIntercept, _super);
285
+
286
+ function RequestIntercept() {
287
+ var monitorXHR,
288
+ _this = this;
289
+ RequestIntercept.__super__.constructor.apply(this, arguments);
290
+ monitorXHR = function(req) {
291
+ var _open;
292
+ _open = req.open;
293
+ return req.open = function(type, url, async) {
294
+ var _ref1;
295
+ if (_ref1 = (type != null ? type : 'GET').toUpperCase(), __indexOf.call(options.ajax.trackMethods, _ref1) >= 0) {
296
+ _this.trigger('request', {
297
+ type: type,
298
+ url: url,
299
+ request: req
300
+ });
301
+ }
302
+ return _open.apply(req, arguments);
303
+ };
304
+ };
305
+ window.XMLHttpRequest = function(flags) {
306
+ var req;
307
+ req = new _XMLHttpRequest(flags);
308
+ monitorXHR(req);
309
+ return req;
310
+ };
311
+ extendNative(window.XMLHttpRequest, _XMLHttpRequest);
312
+ if (_XDomainRequest != null) {
313
+ window.XDomainRequest = function() {
314
+ var req;
315
+ req = new _XDomainRequest;
316
+ monitorXHR(req);
317
+ return req;
318
+ };
319
+ extendNative(window.XDomainRequest, _XDomainRequest);
320
+ }
321
+ if ((_WebSocket != null) && options.ajax.trackWebSockets) {
322
+ window.WebSocket = function(url, protocols) {
323
+ var req;
324
+ req = new _WebSocket(url, protocols);
325
+ _this.trigger('request', {
326
+ type: 'socket',
327
+ url: url,
328
+ protocols: protocols,
329
+ request: req
330
+ });
331
+ return req;
332
+ };
333
+ extendNative(window.WebSocket, _WebSocket);
334
+ }
335
+ }
336
+
337
+ return RequestIntercept;
338
+
339
+ })(Events);
340
+
341
+ _intercept = null;
342
+
343
+ getIntercept = function() {
344
+ if (_intercept == null) {
345
+ _intercept = new RequestIntercept;
346
+ }
347
+ return _intercept;
348
+ };
349
+
350
+ if (options.restartOnRequestAfter !== false) {
351
+ getIntercept().on('request', function(_arg) {
352
+ var args, request, type;
353
+ type = _arg.type, request = _arg.request;
354
+ if (!Pace.running) {
355
+ args = arguments;
356
+ return setTimeout(function() {
357
+ var source, stillActive, _i, _len, _ref1, _ref2, _results;
358
+ if (type === 'socket') {
359
+ stillActive = request.readyState < 2;
360
+ } else {
361
+ stillActive = (0 < (_ref1 = request.readyState) && _ref1 < 4);
362
+ }
363
+ if (stillActive) {
364
+ Pace.restart();
365
+ _ref2 = Pace.sources;
366
+ _results = [];
367
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
368
+ source = _ref2[_i];
369
+ if (source instanceof AjaxMonitor) {
370
+ source.watch.apply(source, args);
371
+ break;
372
+ } else {
373
+ _results.push(void 0);
374
+ }
375
+ }
376
+ return _results;
377
+ }
378
+ }, options.restartOnRequestAfter);
379
+ }
380
+ });
381
+ }
382
+
383
+ AjaxMonitor = (function() {
384
+ function AjaxMonitor() {
385
+ var _this = this;
386
+ this.elements = [];
387
+ getIntercept().on('request', function() {
388
+ return _this.watch.apply(_this, arguments);
389
+ });
390
+ }
391
+
392
+ AjaxMonitor.prototype.watch = function(_arg) {
393
+ var request, tracker, type;
394
+ type = _arg.type, request = _arg.request;
395
+ if (type === 'socket') {
396
+ tracker = new SocketRequestTracker(request);
397
+ } else {
398
+ tracker = new XHRRequestTracker(request);
399
+ }
400
+ return this.elements.push(tracker);
401
+ };
402
+
403
+ return AjaxMonitor;
404
+
405
+ })();
406
+
407
+ XHRRequestTracker = (function() {
408
+ function XHRRequestTracker(request) {
409
+ var event, size, _i, _len, _onreadystatechange, _ref1,
410
+ _this = this;
411
+ this.progress = 0;
412
+ if (window.ProgressEvent != null) {
413
+ size = null;
414
+ request.addEventListener('progress', function(evt) {
415
+ if (evt.lengthComputable) {
416
+ return _this.progress = 100 * evt.loaded / evt.total;
417
+ } else {
418
+ return _this.progress = _this.progress + (100 - _this.progress) / 2;
419
+ }
420
+ });
421
+ _ref1 = ['load', 'abort', 'timeout', 'error'];
422
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
423
+ event = _ref1[_i];
424
+ request.addEventListener(event, function() {
425
+ return _this.progress = 100;
426
+ });
427
+ }
428
+ } else {
429
+ _onreadystatechange = request.onreadystatechange;
430
+ request.onreadystatechange = function() {
431
+ var _ref2;
432
+ if ((_ref2 = request.readyState) === 0 || _ref2 === 4) {
433
+ _this.progress = 100;
434
+ } else if (request.readyState === 3) {
435
+ _this.progress = 50;
436
+ }
437
+ return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0;
438
+ };
439
+ }
440
+ }
441
+
442
+ return XHRRequestTracker;
443
+
444
+ })();
445
+
446
+ SocketRequestTracker = (function() {
447
+ function SocketRequestTracker(request) {
448
+ var event, _i, _len, _ref1,
449
+ _this = this;
450
+ this.progress = 0;
451
+ _ref1 = ['error', 'open'];
452
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
453
+ event = _ref1[_i];
454
+ request.addEventListener(event, function() {
455
+ return _this.progress = 100;
456
+ });
457
+ }
458
+ }
459
+
460
+ return SocketRequestTracker;
461
+
462
+ })();
463
+
464
+ ElementMonitor = (function() {
465
+ function ElementMonitor(options) {
466
+ var selector, _i, _len, _ref1;
467
+ if (options == null) {
468
+ options = {};
469
+ }
470
+ this.elements = [];
471
+ if (options.selectors == null) {
472
+ options.selectors = [];
473
+ }
474
+ _ref1 = options.selectors;
475
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
476
+ selector = _ref1[_i];
477
+ this.elements.push(new ElementTracker(selector));
478
+ }
479
+ }
480
+
481
+ return ElementMonitor;
482
+
483
+ })();
484
+
485
+ ElementTracker = (function() {
486
+ function ElementTracker(selector) {
487
+ this.selector = selector;
488
+ this.progress = 0;
489
+ this.check();
490
+ }
491
+
492
+ ElementTracker.prototype.check = function() {
493
+ var _this = this;
494
+ if (document.querySelector(this.selector)) {
495
+ return this.done();
496
+ } else {
497
+ return setTimeout((function() {
498
+ return _this.check();
499
+ }), options.elements.checkInterval);
500
+ }
501
+ };
502
+
503
+ ElementTracker.prototype.done = function() {
504
+ return this.progress = 100;
505
+ };
506
+
507
+ return ElementTracker;
508
+
509
+ })();
510
+
511
+ DocumentMonitor = (function() {
512
+ DocumentMonitor.prototype.states = {
513
+ loading: 0,
514
+ interactive: 50,
515
+ complete: 100
516
+ };
517
+
518
+ function DocumentMonitor() {
519
+ var _onreadystatechange, _ref1,
520
+ _this = this;
521
+ this.progress = (_ref1 = this.states[document.readyState]) != null ? _ref1 : 100;
522
+ _onreadystatechange = document.onreadystatechange;
523
+ document.onreadystatechange = function() {
524
+ if (_this.states[document.readyState] != null) {
525
+ _this.progress = _this.states[document.readyState];
526
+ }
527
+ return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0;
528
+ };
529
+ }
530
+
531
+ return DocumentMonitor;
532
+
533
+ })();
534
+
535
+ EventLagMonitor = (function() {
536
+ function EventLagMonitor() {
537
+ var avg, interval, last, points, samples,
538
+ _this = this;
539
+ this.progress = 0;
540
+ avg = 0;
541
+ samples = [];
542
+ points = 0;
543
+ last = now();
544
+ interval = setInterval(function() {
545
+ var diff;
546
+ diff = now() - last - 50;
547
+ last = now();
548
+ samples.push(diff);
549
+ if (samples.length > options.eventLag.sampleCount) {
550
+ samples.shift();
551
+ }
552
+ avg = avgAmplitude(samples);
553
+ if (++points >= options.eventLag.minSamples && avg < options.eventLag.lagThreshold) {
554
+ _this.progress = 100;
555
+ return clearInterval(interval);
556
+ } else {
557
+ return _this.progress = 100 * (3 / (avg + 3));
558
+ }
559
+ }, 50);
560
+ }
561
+
562
+ return EventLagMonitor;
563
+
564
+ })();
565
+
566
+ Scaler = (function() {
567
+ function Scaler(source) {
568
+ this.source = source;
569
+ this.last = this.sinceLastUpdate = 0;
570
+ this.rate = options.initialRate;
571
+ this.catchup = 0;
572
+ this.progress = this.lastProgress = 0;
573
+ if (this.source != null) {
574
+ this.progress = result(this.source, 'progress');
575
+ }
576
+ }
577
+
578
+ Scaler.prototype.tick = function(frameTime, val) {
579
+ var scaling;
580
+ if (val == null) {
581
+ val = result(this.source, 'progress');
582
+ }
583
+ if (val >= 100) {
584
+ this.done = true;
585
+ }
586
+ if (val === this.last) {
587
+ this.sinceLastUpdate += frameTime;
588
+ } else {
589
+ if (this.sinceLastUpdate) {
590
+ this.rate = (val - this.last) / this.sinceLastUpdate;
591
+ }
592
+ this.catchup = (val - this.progress) / options.catchupTime;
593
+ this.sinceLastUpdate = 0;
594
+ this.last = val;
595
+ }
596
+ if (val > this.progress) {
597
+ this.progress += this.catchup * frameTime;
598
+ }
599
+ scaling = 1 - Math.pow(this.progress / 100, options.easeFactor);
600
+ this.progress += scaling * this.rate * frameTime;
601
+ this.progress = Math.min(this.lastProgress + options.maxProgressPerFrame, this.progress);
602
+ this.progress = Math.max(0, this.progress);
603
+ this.progress = Math.min(100, this.progress);
604
+ this.lastProgress = this.progress;
605
+ return this.progress;
606
+ };
607
+
608
+ return Scaler;
609
+
610
+ })();
611
+
612
+ sources = null;
613
+
614
+ scalers = null;
615
+
616
+ bar = null;
617
+
618
+ uniScaler = null;
619
+
620
+ animation = null;
621
+
622
+ cancelAnimation = null;
623
+
624
+ Pace.running = false;
625
+
626
+ handlePushState = function() {
627
+ if (options.restartOnPushState) {
628
+ return Pace.restart();
629
+ }
630
+ };
631
+
632
+ if (window.history.pushState != null) {
633
+ _pushState = window.history.pushState;
634
+ window.history.pushState = function() {
635
+ handlePushState();
636
+ return _pushState.apply(window.history, arguments);
637
+ };
638
+ }
639
+
640
+ if (window.history.replaceState != null) {
641
+ _replaceState = window.history.replaceState;
642
+ window.history.replaceState = function() {
643
+ handlePushState();
644
+ return _replaceState.apply(window.history, arguments);
645
+ };
646
+ }
647
+
648
+ SOURCE_KEYS = {
649
+ ajax: AjaxMonitor,
650
+ elements: ElementMonitor,
651
+ document: DocumentMonitor,
652
+ eventLag: EventLagMonitor
653
+ };
654
+
655
+ (init = function() {
656
+ var source, type, _i, _j, _len, _len1, _ref1, _ref2, _ref3;
657
+ Pace.sources = sources = [];
658
+ _ref1 = ['ajax', 'elements', 'document', 'eventLag'];
659
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
660
+ type = _ref1[_i];
661
+ if (options[type] !== false) {
662
+ sources.push(new SOURCE_KEYS[type](options[type]));
663
+ }
664
+ }
665
+ _ref3 = (_ref2 = options.extraSources) != null ? _ref2 : [];
666
+ for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {
667
+ source = _ref3[_j];
668
+ sources.push(new source(options));
669
+ }
670
+ Pace.bar = bar = new Bar;
671
+ scalers = [];
672
+ return uniScaler = new Scaler;
673
+ })();
674
+
675
+ Pace.stop = function() {
676
+ Pace.running = false;
677
+ bar.destroy();
678
+ cancelAnimation = true;
679
+ if (animation != null) {
680
+ if (typeof cancelAnimationFrame === "function") {
681
+ cancelAnimationFrame(animation);
682
+ }
683
+ animation = null;
684
+ }
685
+ return init();
686
+ };
687
+
688
+ Pace.restart = function() {
689
+ Pace.stop();
690
+ return Pace.start();
691
+ };
692
+
693
+ Pace.go = function() {
694
+ Pace.running = true;
695
+ bar.render();
696
+ cancelAnimation = false;
697
+ return animation = runAnimation(function(frameTime, enqueueNextFrame) {
698
+ var avg, count, done, element, elements, i, j, remaining, scaler, scalerList, source, start, sum, _i, _j, _len, _len1, _ref1;
699
+ remaining = 100 - bar.progress;
700
+ count = sum = 0;
701
+ done = true;
702
+ for (i = _i = 0, _len = sources.length; _i < _len; i = ++_i) {
703
+ source = sources[i];
704
+ scalerList = scalers[i] != null ? scalers[i] : scalers[i] = [];
705
+ elements = (_ref1 = source.elements) != null ? _ref1 : [source];
706
+ for (j = _j = 0, _len1 = elements.length; _j < _len1; j = ++_j) {
707
+ element = elements[j];
708
+ scaler = scalerList[j] != null ? scalerList[j] : scalerList[j] = new Scaler(element);
709
+ done &= scaler.done;
710
+ if (scaler.done) {
711
+ continue;
712
+ }
713
+ count++;
714
+ sum += scaler.tick(frameTime);
715
+ }
716
+ }
717
+ avg = sum / count;
718
+ bar.update(uniScaler.tick(frameTime, avg));
719
+ start = now();
720
+ if (bar.done() || done || cancelAnimation) {
721
+ bar.update(100);
722
+ return setTimeout(function() {
723
+ bar.finish();
724
+ return Pace.running = false;
725
+ }, Math.max(options.ghostTime, Math.min(options.minTime, now() - start)));
726
+ } else {
727
+ return enqueueNextFrame();
728
+ }
729
+ });
730
+ };
731
+
732
+ Pace.start = function(_options) {
733
+ extend(options, _options);
734
+ Pace.running = true;
735
+ try {
736
+ bar.render();
737
+ } catch (_error) {
738
+ NoTargetError = _error;
739
+ }
740
+ if (!document.querySelector('.pace')) {
741
+ return setTimeout(Pace.start, 50);
742
+ } else {
743
+ return Pace.go();
744
+ }
745
+ };
746
+
747
+ if (typeof define === 'function' && define.amd) {
748
+ define(function() {
749
+ return Pace;
750
+ });
751
+ } else if (typeof exports === 'object') {
752
+ module.exports = Pace;
753
+ } else {
754
+ if (options.startOnPageLoad) {
755
+ Pace.start();
756
+ }
757
+ }
758
+
759
+ }).call(this);