1 | (function (ng, $) {
|
---|
2 | angular.module('helper')
|
---|
3 | .factory('utils', ['$timeout', '$window', function ($timeout, $window) {
|
---|
4 | return {
|
---|
5 | // http://ng.malsup.com/#!/getting-started-with-$q
|
---|
6 | // A nice way of calling $timeout
|
---|
7 | /*
|
---|
8 | Wait(5).then(function(msg) {
|
---|
9 | // Success
|
---|
10 | }, function() {
|
---|
11 | // Error
|
---|
12 | });
|
---|
13 | */
|
---|
14 | wait: function (seconds) {
|
---|
15 | // return the $timeout's promise
|
---|
16 | return $timeout(function () {
|
---|
17 | // the return from this function is the value passed to the promise's success handler (the resolve value)
|
---|
18 | return (seconds + ' seconds have elapsed');
|
---|
19 | }, seconds * 1000);
|
---|
20 | },
|
---|
21 |
|
---|
22 | // http://stackoverflow.com/a/4994244/654708
|
---|
23 | // Check if an object is empty or has no properties of its own.
|
---|
24 | isEmpty: function (obj) {
|
---|
25 | // null and undefined are "empty"
|
---|
26 | if (obj == null) return true;
|
---|
27 |
|
---|
28 | // Assume if it has a length property with a non-zero value
|
---|
29 | // that that property is correct.
|
---|
30 | if (obj.length > 0) return false;
|
---|
31 | if (obj.length === 0) return true;
|
---|
32 |
|
---|
33 | // Otherwise, does it have any properties of its own?
|
---|
34 | // Note that this doesn't handle
|
---|
35 | // toString and valueOf enumeration bugs in IE < 9
|
---|
36 | for (var key in obj) {
|
---|
37 | if (hasOwnProperty.call(obj, key)) return false;
|
---|
38 | }
|
---|
39 |
|
---|
40 | return true;
|
---|
41 | },
|
---|
42 |
|
---|
43 | // http://stackoverflow.com/a/3855394/654708
|
---|
44 | // Creates an object from querty string with name and values
|
---|
45 | // Use utils.qs.isEmpty to see if any values are present
|
---|
46 | qs: (function (a) {
|
---|
47 | var b = { isEmpty: true };
|
---|
48 | if (a == "") return b;
|
---|
49 | for (var i = 0; i < a.length; ++i) {
|
---|
50 | var p = a[i].split('=');
|
---|
51 | if (p.length != 2) continue;
|
---|
52 | b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
|
---|
53 | if (b.isEmpty) { b.isEmpty = false; }
|
---|
54 | }
|
---|
55 | return b;
|
---|
56 | })(window.location.search.substr(1).split('&')),
|
---|
57 |
|
---|
58 |
|
---|
59 | // http://cwestblog.com/2013/05/28/javascript-polling/
|
---|
60 | // Polls to check when a variable is defined.
|
---|
61 | /* Usage:
|
---|
62 | utils.poll(function() {
|
---|
63 | return 'google' in $window;
|
---|
64 | }, function() {
|
---|
65 | console.log("'google' is now defined:");
|
---|
66 | });
|
---|
67 | */
|
---|
68 | poll: function (fnIsReady, fnOnReady, fnOnTimeout, interval, timeout, args) {
|
---|
69 |
|
---|
70 | var typeOf = function (obj) {
|
---|
71 | return obj == undefined
|
---|
72 | ? obj === undefined ? 'undefined' : 'null'
|
---|
73 | : emptyObj.toString.call(obj).slice(8, -1);
|
---|
74 | };
|
---|
75 |
|
---|
76 | var fnCaller = function () {
|
---|
77 | var me = this;
|
---|
78 |
|
---|
79 | if (fnIsReady.apply(me, args)) {
|
---|
80 | fnOnReady.apply(me, args);
|
---|
81 | } else if ((timeout -= interval) > 0) {
|
---|
82 | setTimeout(fnCaller, interval);
|
---|
83 | } else if (fnOnTimeout) {
|
---|
84 | fnOnTimeout.apply(me, args);
|
---|
85 | }
|
---|
86 | };
|
---|
87 |
|
---|
88 | var emptyObj = {},
|
---|
89 | emptyArr = [],
|
---|
90 | types = ['Function', 'Number', 'Number', 'Array'];
|
---|
91 |
|
---|
92 | // Pre-process the arguments to account for optionals.
|
---|
93 | var myArg, myArgs = emptyArr.slice.call(arguments, 2);
|
---|
94 |
|
---|
95 | var i = -1;
|
---|
96 | while (myArg = myArgs[++i]) {
|
---|
97 | if (myArg != undefined && typeOf(myArg) != types[i]) {
|
---|
98 | myArgs.splice(i, 0, undefined);
|
---|
99 | }
|
---|
100 | }
|
---|
101 |
|
---|
102 | fnOnTimeout = myArgs[0];
|
---|
103 | interval = myArgs[1] || 50;
|
---|
104 | timeout = myArgs[2] || Infinity;
|
---|
105 | args = myArgs[3] || emptyArr;
|
---|
106 |
|
---|
107 | fnCaller();
|
---|
108 | },
|
---|
109 |
|
---|
110 | // https://github.com/yearofmoo/AngularJS-Scope.SafeApply
|
---|
111 | // Calls Angular $apply only when not in digest or apply phase
|
---|
112 | safeApply: function () {
|
---|
113 | var $scope, fn, force = false;
|
---|
114 | if (arguments.length == 1) {
|
---|
115 | var arg = arguments[0];
|
---|
116 | if (typeof arg == 'function') {
|
---|
117 | fn = arg;
|
---|
118 | }
|
---|
119 | else {
|
---|
120 | $scope = arg;
|
---|
121 | }
|
---|
122 | }
|
---|
123 | else {
|
---|
124 | $scope = arguments[0];
|
---|
125 | fn = arguments[1];
|
---|
126 | if (arguments.length == 3) {
|
---|
127 | force = !!arguments[2];
|
---|
128 | }
|
---|
129 | }
|
---|
130 | $scope = $scope || this;
|
---|
131 | fn = fn || function () { };
|
---|
132 | if (force || !($scope.$$phase || $scope.$root.$$phase)) {
|
---|
133 | $scope.$apply ? $scope.$apply(fn) : $scope.apply(fn);
|
---|
134 | }
|
---|
135 | else {
|
---|
136 | fn();
|
---|
137 | }
|
---|
138 | },
|
---|
139 |
|
---|
140 | // http://davidwalsh.name/javascript-debounce-function
|
---|
141 | /*
|
---|
142 | var myEfficientFn = utils.debounce(function() {
|
---|
143 | // All the taxing stuff you do
|
---|
144 | }, 250);
|
---|
145 | window.addEventListener('resize', myEfficientFn);
|
---|
146 | */
|
---|
147 | debounce: function (func, wait, immediate) {
|
---|
148 | var timeout;
|
---|
149 | return function () {
|
---|
150 | var context = this, args = arguments;
|
---|
151 | clearTimeout(timeout);
|
---|
152 | timeout = setTimeout(function () {
|
---|
153 | timeout = null;
|
---|
154 | if (!immediate) func.apply(context, args);
|
---|
155 | }, wait);
|
---|
156 | if (immediate && !timeout) func.apply(context, args);
|
---|
157 | };
|
---|
158 | },
|
---|
159 |
|
---|
160 | // Checks if current device is a touch device
|
---|
161 | isTouchDevice: function () {
|
---|
162 | return 'ontouchstart' in $window || !!(navigator.msMaxTouchPoints);
|
---|
163 | },
|
---|
164 |
|
---|
165 | // http://detectmobilebrowsers.com/
|
---|
166 | // Checks user agent to determine if user is on a mobile
|
---|
167 | isMobile: function () {
|
---|
168 | var a = $window.navigator.userAgent || $window.navigator.vendor || $window.opera;
|
---|
169 | return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4));
|
---|
170 | }
|
---|
171 | };
|
---|
172 | }]);
|
---|
173 | })(angular, window.jQuery || angular.element); |
---|