source: main/trunk/model-interfaces-dev/heritage-nz/iframe/heritage-nz-dl_files/helper.js@ 32796

Last change on this file since 32796 was 32796, checked in by davidb, 5 years ago

Initial set of files to provide look and feel of Heritage NZ site, plus SVN clickable map in an iframe

  • Property svn:executable set to *
File size: 9.3 KB
Line 
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);
Note: See TracBrowser for help on using the repository browser.