1 |
|
2 | if (typeof exports === "undefined" || exports === null) {
|
3 | if (!this.gi) {
|
4 | this.gi = {};
|
5 | }
|
6 | if (!this.gi.util) {
|
7 | this.gi['util'] = {};
|
8 | }
|
9 | if (!this.gi.util.common) {
|
10 | this.gi.util['common'] = {};
|
11 | }
|
12 | }
|
13 |
|
14 | (function(exports) {
|
15 | var calculatePeriodStart, enrichPeriod, moment;
|
16 | moment = typeof window !== "undefined" && window !== null ? window.moment : require('moment');
|
17 | enrichPeriod = function(pattern, recurrence) {
|
18 | var calculatedPeriodLength, i, length, missingSecondsInPattern, onTime, s, secondsInADay, _i, _len;
|
19 | length = 0;
|
20 | secondsInADay = 60 * 60 * 24;
|
21 | if (recurrence === 'weekly') {
|
22 | length = secondsInADay * 7;
|
23 | }
|
24 | onTime = 0;
|
25 | calculatedPeriodLength = 0;
|
26 | for (i = _i = 0, _len = pattern.length; _i < _len; i = ++_i) {
|
27 | s = pattern[i];
|
28 | if (i % 2 === 1) {
|
29 | onTime += s;
|
30 | }
|
31 | calculatedPeriodLength += s;
|
32 | }
|
33 | if (calculatedPeriodLength < length) {
|
34 | missingSecondsInPattern = length - calculatedPeriodLength;
|
35 | pattern.push(missingSecondsInPattern);
|
36 | if (pattern.length % 2 === 0) {
|
37 | onTime += missingSecondsInPattern;
|
38 | }
|
39 | }
|
40 | return {
|
41 | length: length,
|
42 | onTime: onTime
|
43 | };
|
44 | };
|
45 | calculatePeriodStart = function(period, start, pattern, recurrence) {
|
46 | period.start = moment(start);
|
47 | if (recurrence === 'weekly') {
|
48 | period.start = moment(start).startOf('week');
|
49 | }
|
50 | period.secondsToStart = start.diff(period.start, 'seconds');
|
51 | return period;
|
52 | };
|
53 | exports.timeOnBetween = function(_start, _stop, pattern, recurrence) {
|
54 | var index, period, result, secondsFromStartToStop, start, stop;
|
55 | start = moment(_start);
|
56 | stop = moment(_stop);
|
57 | result = 0;
|
58 | period = enrichPeriod(pattern, recurrence);
|
59 | secondsFromStartToStop = stop.diff(start, 'seconds');
|
60 | while (secondsFromStartToStop > period.length) {
|
61 | result += period.onTime;
|
62 | start.add('seconds', period.length);
|
63 | secondsFromStartToStop = stop.diff(start, 'seconds');
|
64 | }
|
65 | period = calculatePeriodStart(period, start, pattern, recurrence);
|
66 | index = 0;
|
67 | while (true) {
|
68 | if (period.secondsToStart >= pattern[index]) {
|
69 | period.secondsToStart -= pattern[index];
|
70 | index += 1;
|
71 | } else {
|
72 | break;
|
73 | }
|
74 | }
|
75 | if (index % 2 === 0) {
|
76 | if (secondsFromStartToStop >= pattern[index] - period.secondsToStart) {
|
77 | secondsFromStartToStop -= pattern[index] - period.secondsToStart;
|
78 | index += 1;
|
79 | } else {
|
80 | secondsFromStartToStop = 0;
|
81 | }
|
82 | } else {
|
83 | if (secondsFromStartToStop >= pattern[index] - period.secondsToStart) {
|
84 | result += pattern[index] - period.secondsToStart;
|
85 | secondsFromStartToStop -= pattern[index] - period.secondsToStart;
|
86 | index += 1;
|
87 | } else {
|
88 | result += secondsFromStartToStop;
|
89 | secondsFromStartToStop = 0;
|
90 | }
|
91 | }
|
92 | while (secondsFromStartToStop > 0) {
|
93 | if (index % 2 === 0) {
|
94 | if (secondsFromStartToStop >= pattern[index]) {
|
95 | secondsFromStartToStop -= pattern[index];
|
96 | index += 1;
|
97 | } else {
|
98 | secondsFromStartToStop = 0;
|
99 | }
|
100 | } else {
|
101 | if (secondsFromStartToStop >= pattern[index]) {
|
102 | result += pattern[index];
|
103 | secondsFromStartToStop -= pattern[index];
|
104 | index += 1;
|
105 | } else {
|
106 | result += secondsFromStartToStop;
|
107 | secondsFromStartToStop = 0;
|
108 | }
|
109 | }
|
110 | }
|
111 | return result;
|
112 | };
|
113 | return exports.timeAfterXSecondsOnFrom = function(_start, x, pattern, recurrence) {
|
114 | var index, onSeconds, period, result, start;
|
115 | start = moment(_start);
|
116 | result = moment(start);
|
117 | period = enrichPeriod(pattern, recurrence);
|
118 | while (x > period.onTime) {
|
119 | result.add('seconds', period.length);
|
120 | start.add('seconds', period.length);
|
121 | x -= period.onTime;
|
122 | }
|
123 | period = calculatePeriodStart(period, start, pattern, recurrence);
|
124 | index = 0;
|
125 | while (true) {
|
126 | if (period.secondsToStart >= pattern[index]) {
|
127 | period.secondsToStart -= pattern[index];
|
128 | index += 1;
|
129 | if (index === pattern.length) {
|
130 | index = 0;
|
131 | }
|
132 | } else {
|
133 | if (index % 2 === 1) {
|
134 | x += period.secondsToStart;
|
135 | }
|
136 | result.subtract('seconds', period.secondsToStart);
|
137 | break;
|
138 | }
|
139 | }
|
140 | while (x > 0) {
|
141 | if (index % 2 === 0) {
|
142 | result.add('seconds', pattern[index]);
|
143 | index += 1;
|
144 | if (index === pattern.length) {
|
145 | index = 0;
|
146 | }
|
147 | } else {
|
148 | onSeconds = pattern[index];
|
149 | if (x >= onSeconds) {
|
150 | result.add('seconds', onSeconds);
|
151 | x -= onSeconds;
|
152 | index += 1;
|
153 | if (index === pattern.length) {
|
154 | index = 0;
|
155 | }
|
156 | } else {
|
157 | result.add('seconds', x);
|
158 | x = 0;
|
159 | }
|
160 | }
|
161 | }
|
162 | return result;
|
163 | };
|
164 | })((typeof exports !== "undefined" && exports !== null ? exports : this.gi.util.common['timePatterns'] = {}));
|
165 |
|
166 | angular.module('gi.util', ['ngResource']);
|
167 |
|
168 | angular.module('gi.util').factory('giCrud', [
|
169 | '$resource', '$q', 'giSocket', function($resource, $q, Socket) {
|
170 | var factory;
|
171 | factory = function(resourceName, prefix, idField) {
|
172 | var all, allCached, bulkMethods, bulkResource, clearCache, count, destroy, exports, get, getCached, items, itemsById, methods, queryMethods, queryResource, resource, save, updateMasterList, version, _version;
|
173 | if (prefix == null) {
|
174 | prefix = '/api';
|
175 | }
|
176 | if (idField == null) {
|
177 | idField = '_id';
|
178 | }
|
179 | methods = {
|
180 | query: {
|
181 | method: 'GET',
|
182 | params: {},
|
183 | isArray: true
|
184 | },
|
185 | save: {
|
186 | method: 'PUT',
|
187 | params: {},
|
188 | isArray: false
|
189 | },
|
190 | create: {
|
191 | method: 'POST',
|
192 | params: {},
|
193 | isArray: false
|
194 | }
|
195 | };
|
196 | bulkMethods = {
|
197 | save: {
|
198 | method: 'PUT',
|
199 | params: {},
|
200 | isArray: true
|
201 | }
|
202 | };
|
203 | queryMethods = {
|
204 | query: {
|
205 | method: 'POST',
|
206 | params: {},
|
207 | isArray: true
|
208 | }
|
209 | };
|
210 | bulkResource = $resource('/api/' + resourceName + '', {}, bulkMethods);
|
211 | resource = $resource('/api/' + resourceName + '/:id', {}, methods);
|
212 | queryResource = $resource('/api/' + resourceName + '/query', {}, queryMethods);
|
213 | items = [];
|
214 | itemsById = {};
|
215 | updateMasterList = function(newItem) {
|
216 | var replaced;
|
217 | replaced = false;
|
218 | if (angular.isArray(newItem)) {
|
219 | angular.forEach(newItem, function(newRec, i) {
|
220 | replaced = false;
|
221 | if (itemsById[newRec[idField]] != null) {
|
222 | angular.forEach(items, function(item, j) {
|
223 | if (!replaced) {
|
224 | if (item[idField] === newRec[idField]) {
|
225 | items[j] = newRec;
|
226 | return replaced = true;
|
227 | }
|
228 | }
|
229 | });
|
230 | } else {
|
231 | items.push(newRec);
|
232 | }
|
233 | return itemsById[newRec[idField]] = newRec;
|
234 | });
|
235 | } else {
|
236 | replaced = false;
|
237 | angular.forEach(items, function(item, index) {
|
238 | if (!replaced) {
|
239 | if (newItem[idField] === item[idField]) {
|
240 | replaced = true;
|
241 | return items[index] = newItem;
|
242 | }
|
243 | }
|
244 | });
|
245 | if (!replaced) {
|
246 | items.push(newItem);
|
247 | }
|
248 | itemsById[newItem[idField]] = newItem;
|
249 | }
|
250 | };
|
251 | all = function(params) {
|
252 | var cacheable, deferred, options, r;
|
253 | deferred = $q.defer();
|
254 | options = {};
|
255 | cacheable = true;
|
256 | r = resource;
|
257 | if ((params == null) && items.length > 0) {
|
258 | deferred.resolve(items);
|
259 | } else {
|
260 | if (params != null) {
|
261 | cacheable = false;
|
262 | }
|
263 | options = params;
|
264 | if ((params != null ? params.query : void 0) != null) {
|
265 | r = queryResource;
|
266 | }
|
267 | r.query(options, function(results) {
|
268 | if (cacheable) {
|
269 | items = results;
|
270 | angular.forEach(results, function(item, index) {
|
271 | return itemsById[item[idField]] = item;
|
272 | });
|
273 | }
|
274 | return deferred.resolve(results);
|
275 | }, function(err) {
|
276 | return deferred.reject(err);
|
277 | });
|
278 | }
|
279 | return deferred.promise;
|
280 | };
|
281 | save = function(item) {
|
282 | var deferred;
|
283 | deferred = $q.defer();
|
284 | if (angular.isArray(item)) {
|
285 | bulkResource.save({}, item, function(result) {
|
286 | updateMasterList(result);
|
287 | return deferred.resolve(result);
|
288 | }, function(failure) {
|
289 | return deferred.reject(failure);
|
290 | });
|
291 | } else {
|
292 | if (item[idField]) {
|
293 | resource.save({
|
294 | id: item[idField]
|
295 | }, item, function(result) {
|
296 | updateMasterList(result);
|
297 | return deferred.resolve(result);
|
298 | }, function(failure) {
|
299 | return deferred.reject(failure);
|
300 | });
|
301 | } else {
|
302 | resource.create({}, item, function(result) {
|
303 | updateMasterList(result);
|
304 | return deferred.resolve(result);
|
305 | }, function(failure) {
|
306 | return deferred.reject(failure);
|
307 | });
|
308 | }
|
309 | }
|
310 | return deferred.promise;
|
311 | };
|
312 | getCached = function(id) {
|
313 | return itemsById[id];
|
314 | };
|
315 | allCached = function() {
|
316 | return items;
|
317 | };
|
318 | get = function(id) {
|
319 | var deferred;
|
320 | deferred = $q.defer();
|
321 | resource.get({
|
322 | id: id
|
323 | }, function(item) {
|
324 | if (items.length > 0) {
|
325 | updateMasterList(item);
|
326 | }
|
327 | return deferred.resolve(item);
|
328 | }, function(err) {
|
329 | return deferred.reject(err);
|
330 | });
|
331 | return deferred.promise;
|
332 | };
|
333 | destroy = function(id) {
|
334 | var deferred;
|
335 | deferred = $q.defer();
|
336 | resource["delete"]({
|
337 | id: id
|
338 | }, function() {
|
339 | var removed;
|
340 | removed = false;
|
341 | delete itemsById[id];
|
342 | angular.forEach(items, function(item, index) {
|
343 | if (!removed) {
|
344 | if (item[idField] === id) {
|
345 | removed = true;
|
346 | return items.splice(index, 1);
|
347 | }
|
348 | }
|
349 | });
|
350 | return deferred.resolve();
|
351 | }, function(err) {
|
352 | return deferred.reject(err);
|
353 | });
|
354 | return deferred.promise;
|
355 | };
|
356 | count = function() {
|
357 | return items.length;
|
358 | };
|
359 | clearCache = function() {
|
360 | items = [];
|
361 | return itemsById = {};
|
362 | };
|
363 | Socket.emit('watch:' + resourceName);
|
364 | Socket.on(resourceName + '_created', function(data) {
|
365 | updateMasterList(data);
|
366 | return _version += 1;
|
367 | });
|
368 | Socket.on(resourceName + '_updated', function(data) {
|
369 | updateMasterList(data);
|
370 | return _version += 1;
|
371 | });
|
372 | _version = 0;
|
373 | version = function() {
|
374 | return _version;
|
375 | };
|
376 | exports = {
|
377 | query: all,
|
378 | all: all,
|
379 | cache: updateMasterList,
|
380 | get: get,
|
381 | getCached: getCached,
|
382 | allCached: allCached,
|
383 | destroy: destroy,
|
384 | save: save,
|
385 | count: count,
|
386 | version: version,
|
387 | clearCache: clearCache
|
388 | };
|
389 | return exports;
|
390 | };
|
391 | return {
|
392 | factory: factory
|
393 | };
|
394 | }
|
395 | ]);
|
396 |
|
397 | angular.module('gi.util').factory('giSocket', [
|
398 | '$rootScope', function($rootScope) {
|
399 | var socket;
|
400 | if (typeof io !== "undefined" && io !== null) {
|
401 | socket = io.connect();
|
402 | }
|
403 | return {
|
404 | on: function(eventName, callback) {
|
405 | if (typeof io !== "undefined" && io !== null) {
|
406 | return socket.on(eventName, function() {
|
407 | var args;
|
408 | args = arguments;
|
409 | if (callback) {
|
410 | return $rootScope.$apply(function() {
|
411 | return callback.apply(socket, args);
|
412 | });
|
413 | }
|
414 | });
|
415 | }
|
416 | },
|
417 | emit: function(eventName, data, callback) {
|
418 | if (typeof io !== "undefined" && io !== null) {
|
419 | return socket.emit(eventName, data, function() {
|
420 | var args;
|
421 | args = arguments;
|
422 | if (callback) {
|
423 | return $rootScope.$apply(function() {
|
424 | return callback.apply(socket, args);
|
425 | });
|
426 | }
|
427 | });
|
428 | }
|
429 | }
|
430 | };
|
431 | }
|
432 | ]);
|
433 |
|
434 | ; |
\ | No newline at end of file |