Last active
August 29, 2015 13:57
-
-
Save GFoley83/9357423 to your computer and use it in GitHub Desktop.
AngularJS / Javascript Utility Service compiled of different functions. See comment below for breakdown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function (ng, $) { | |
angular.module('helper') | |
.factory('utils', ['$timeout', '$window', function ($timeout, $window) { | |
var utils = {}; | |
// http://ng.malsup.com/#!/getting-started-with-$q | |
// A nice way of calling $timeout | |
/* | |
utils.wait(5).then(function(msg) { | |
// Success | |
}, function() { | |
// Error | |
}); | |
*/ | |
utils.wait = function (seconds) { | |
// return the $timeout's promise | |
return $timeout(function () { | |
// the return from this function is the value passed to the promise's success handler (the resolve value) | |
return (seconds + ' seconds have elapsed'); | |
}, seconds * 1000); | |
}; | |
// Load Google Maps w/ promise | |
utils.loadGoogleMaps = function () { | |
return utils.loadScript("http://maps.google.com/maps/api/js?v=3&sensor=false", function () { | |
return $window.google; | |
}, "Google Maps"); | |
}; | |
// Load script (local or external) w/ promise | |
utils.loadScript = function (scriptSrc, scriptLoadedCheck, name) { | |
var script = document.createElement("script"); | |
script.src = scriptSrc; | |
document.getElementsByTagName("head")[0].appendChild(script); | |
return utils.poll(scriptLoadedCheck, null, null, name); | |
}; | |
// Polls to check when a variable is defined. Returns a promise | |
utils.poll = function (whenReady, interval, timeout, name) { | |
var deferred = $q.defer(), | |
interval = parseInt(arguments[1], 10) || 50, // default to 50 milliseconds | |
timeout = parseInt(arguments[2], 10) || Infinity; // default: poll until found | |
(function poll() { | |
var me = this; | |
if (whenReady.apply(me)) { // poll check func satisfied | |
deferred.resolve(); | |
} else if ((timeout -= interval) > 0) { // poll again | |
deferred.notify("Polling " + (name || "")) | |
$timeout(poll, interval); | |
} else { // timeout reached | |
deferred.reject("Poll timeout reached " + (name || "")); | |
} | |
}()); | |
return deferred.promise; | |
}; | |
// http://stackoverflow.com/a/4994244/654708 | |
// Check if an object is empty or has no properties of its own. | |
utils.isEmpty = function (obj) { | |
// null and undefined are "empty" | |
if (obj == null) return true; | |
// Assume if it has a length property with a non-zero value | |
// that that property is correct. | |
if (obj.length > 0) return false; | |
if (obj.length === 0) return true; | |
// Otherwise, does it have any properties of its own? | |
// Note that this doesn't handle | |
// toString and valueOf enumeration bugs in IE < 9 | |
for (var key in obj) { | |
if (hasOwnProperty.call(obj, key)) return false; | |
} | |
return true; | |
}; | |
// http://stackoverflow.com/a/3855394/654708 | |
// Creates an object from querty string with name and values | |
// Use utils.qs.isEmpty to see if any values are present | |
utils.qs = (function (a) { | |
var b = { | |
isEmpty: true | |
}; | |
if (a == "") return b; | |
for (var i = 0; i < a.length; ++i) { | |
var p = a[i].split('='); | |
if (p.length != 2) continue; | |
b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " ")); | |
if (b.isEmpty) { | |
b.isEmpty = false; | |
} | |
} | |
return b; | |
})(window.location.search.substr(1).split('&')); | |
// https://github.com/yearofmoo/AngularJS-Scope.SafeApply | |
// Calls Angular $apply only when not in digest or apply phase | |
utils.safeApply = function () { | |
var $scope, fn, force = false; | |
if (arguments.length == 1) { | |
var arg = arguments[0]; | |
if (typeof arg == 'function') { | |
fn = arg; | |
} else { | |
$scope = arg; | |
} | |
} else { | |
$scope = arguments[0]; | |
fn = arguments[1]; | |
if (arguments.length == 3) { | |
force = !! arguments[2]; | |
} | |
} | |
$scope = $scope || this; | |
fn = fn || function () {}; | |
if (force || !($scope.$$phase || $scope.$root.$$phase)) { | |
$scope.$apply ? $scope.$apply(fn) : $scope.apply(fn); | |
} else { | |
fn(); | |
} | |
}; | |
// http://davidwalsh.name/javascript-debounce-function | |
/* | |
var myEfficientFn = utils.debounce(function() { | |
// All the taxing stuff you do | |
}, 250); | |
window.addEventListener('resize', myEfficientFn); | |
*/ | |
utils.debounce = function (func, wait, immediate) { | |
var timeout; | |
return function () { | |
var context = this, | |
args = arguments; | |
clearTimeout(timeout); | |
timeout = setTimeout(function () { | |
timeout = null; | |
if (!immediate) func.apply(context, args); | |
}, wait); | |
if (immediate && !timeout) func.apply(context, args); | |
}; | |
}, | |
// Checks if current device is a touch device | |
utils.isTouchDevice = function () { | |
return 'ontouchstart' in $window || !! (navigator.msMaxTouchPoints); | |
}; | |
// http://detectmobilebrowsers.com/ | |
// Checks user agent to determine if user is on a mobile | |
utils.isMobile = function () { | |
var a = $window.navigator.userAgent || $window.navigator.vendor || $window.opera; | |
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)); | |
}; | |
return utils; | |
}]); | |
})(angular, window.jQuery || angular.element); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
AngularJS/Javascript Utility Service compiled of different handy functions including: