Built motion from commit 99feb03.|0.0.140
[motion.git] / public / bower_components / angular-local-storage / angular-local-storage.js
index 4bd5a14..e731ad1 100644 (file)
@@ -1,11 +1,14 @@
 /**
  * An Angular module that gives you access to the browsers local storage
- * @version v0.2.6 - 2016-03-16
+ * @version v0.2.3 - 2015-10-11
  * @link https://github.com/grevory/angular-local-storage
  * @author grevory <greg@gregpike.ca>
  * @license MIT License, http://www.opensource.org/licenses/MIT
  */
-(function (window, angular) {
+(function ( window, angular, undefined ) {
+/*jshint globalstrict:true*/
+'use strict';
+
 var isDefined = angular.isDefined,
   isUndefined = angular.isUndefined,
   isNumber = angular.isNumber,
@@ -13,434 +16,434 @@ var isDefined = angular.isDefined,
   isArray = angular.isArray,
   extend = angular.extend,
   toJson = angular.toJson;
-
-angular
-  .module('LocalStorageModule', [])
-  .provider('localStorageService', function() {
-    // You should set a prefix to avoid overwriting any local storage variables from the rest of your app
-    // e.g. localStorageServiceProvider.setPrefix('yourAppName');
-    // With provider you can use config as this:
-    // myApp.config(function (localStorageServiceProvider) {
-    //    localStorageServiceProvider.prefix = 'yourAppName';
-    // });
-    this.prefix = 'ls';
-
-    // You could change web storage type localstorage or sessionStorage
-    this.storageType = 'localStorage';
-
-    // Cookie options (usually in case of fallback)
-    // expiry = Number of days before cookies expire // 0 = Does not expire
-    // path = The web path the cookie represents
-    this.cookie = {
-      expiry: 30,
-      path: '/'
-    };
-
-    // Send signals for each of the following actions?
+var angularLocalStorage = angular.module('LocalStorageModule', []);
+
+angularLocalStorage.provider('localStorageService', function() {
+
+  // You should set a prefix to avoid overwriting any local storage variables from the rest of your app
+  // e.g. localStorageServiceProvider.setPrefix('yourAppName');
+  // With provider you can use config as this:
+  // myApp.config(function (localStorageServiceProvider) {
+  //    localStorageServiceProvider.prefix = 'yourAppName';
+  // });
+  this.prefix = 'ls';
+
+  // You could change web storage type localstorage or sessionStorage
+  this.storageType = 'localStorage';
+
+  // Cookie options (usually in case of fallback)
+  // expiry = Number of days before cookies expire // 0 = Does not expire
+  // path = The web path the cookie represents
+  this.cookie = {
+    expiry: 30,
+    path: '/'
+  };
+
+  // Send signals for each of the following actions?
+  this.notify = {
+    setItem: true,
+    removeItem: false
+  };
+
+  // Setter for the prefix
+  this.setPrefix = function(prefix) {
+    this.prefix = prefix;
+    return this;
+  };
+
+   // Setter for the storageType
+   this.setStorageType = function(storageType) {
+     this.storageType = storageType;
+     return this;
+   };
+
+  // Setter for cookie config
+  this.setStorageCookie = function(exp, path) {
+    this.cookie.expiry = exp;
+    this.cookie.path = path;
+    return this;
+  };
+
+  // Setter for cookie domain
+  this.setStorageCookieDomain = function(domain) {
+    this.cookie.domain = domain;
+    return this;
+  };
+
+  // Setter for notification config
+  // itemSet & itemRemove should be booleans
+  this.setNotify = function(itemSet, itemRemove) {
     this.notify = {
-      setItem: true,
-      removeItem: false
+      setItem: itemSet,
+      removeItem: itemRemove
     };
-
-    // Setter for the prefix
-    this.setPrefix = function(prefix) {
-      this.prefix = prefix;
-      return this;
-    };
-
-    // Setter for the storageType
-    this.setStorageType = function(storageType) {
-      this.storageType = storageType;
-      return this;
-    };
-
-    // Setter for cookie config
-    this.setStorageCookie = function(exp, path) {
-      this.cookie.expiry = exp;
-      this.cookie.path = path;
-      return this;
-    };
-
-    // Setter for cookie domain
-    this.setStorageCookieDomain = function(domain) {
-      this.cookie.domain = domain;
-      return this;
-    };
-
-    // Setter for notification config
-    // itemSet & itemRemove should be booleans
-    this.setNotify = function(itemSet, itemRemove) {
-      this.notify = {
-        setItem: itemSet,
-        removeItem: itemRemove
-      };
-      return this;
+    return this;
+  };
+
+  this.$get = ['$rootScope', '$window', '$document', '$parse', function($rootScope, $window, $document, $parse) {
+    var self = this;
+    var prefix = self.prefix;
+    var cookie = self.cookie;
+    var notify = self.notify;
+    var storageType = self.storageType;
+    var webStorage;
+
+    // When Angular's $document is not available
+    if (!$document) {
+      $document = document;
+    } else if ($document[0]) {
+      $document = $document[0];
+    }
+
+    // If there is a prefix set in the config lets use that with an appended period for readability
+    if (prefix.substr(-1) !== '.') {
+      prefix = !!prefix ? prefix + '.' : '';
+    }
+    var deriveQualifiedKey = function(key) {
+      return prefix + key;
     };
+    // Checks the browser to see if local storage is supported
+    var browserSupportsLocalStorage = (function () {
+      try {
+        var supported = (storageType in $window && $window[storageType] !== null);
+
+        // When Safari (OS X or iOS) is in private browsing mode, it appears as though localStorage
+        // is available, but trying to call .setItem throws an exception.
+        //
+        // "QUOTA_EXCEEDED_ERR: DOM Exception 22: An attempt was made to add something to storage
+        // that exceeded the quota."
+        var key = deriveQualifiedKey('__' + Math.round(Math.random() * 1e7));
+        if (supported) {
+          webStorage = $window[storageType];
+          webStorage.setItem(key, '');
+          webStorage.removeItem(key);
+        }
 
-    this.$get = ['$rootScope', '$window', '$document', '$parse', function($rootScope, $window, $document, $parse) {
-      var self = this;
-      var prefix = self.prefix;
-      var cookie = self.cookie;
-      var notify = self.notify;
-      var storageType = self.storageType;
-      var webStorage;
-
-      // When Angular's $document is not available
-      if (!$document) {
-        $document = document;
-      } else if ($document[0]) {
-        $document = $document[0];
+        return supported;
+      } catch (e) {
+        storageType = 'cookie';
+        $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
+        return false;
+      }
+    }());
+
+    // Directly adds a value to local storage
+    // If local storage is not available in the browser use cookies
+    // Example use: localStorageService.add('library','angular');
+    var addToLocalStorage = function (key, value) {
+      // Let's convert undefined values to null to get the value consistent
+      if (isUndefined(value)) {
+        value = null;
+      } else {
+        value = toJson(value);
       }
 
-      // If there is a prefix set in the config lets use that with an appended period for readability
-      if (prefix.substr(-1) !== '.') {
-        prefix = !!prefix ? prefix + '.' : '';
+      // If this browser does not support local storage use cookies
+      if (!browserSupportsLocalStorage || self.storageType === 'cookie') {
+        if (!browserSupportsLocalStorage) {
+            $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED');
+        }
+
+        if (notify.setItem) {
+          $rootScope.$broadcast('LocalStorageModule.notification.setitem', {key: key, newvalue: value, storageType: 'cookie'});
+        }
+        return addToCookies(key, value);
       }
-      var deriveQualifiedKey = function(key) {
-        return prefix + key;
-      };
-      // Checks the browser to see if local storage is supported
-      var browserSupportsLocalStorage = (function () {
-        try {
-          var supported = (storageType in $window && $window[storageType] !== null);
-
-          // When Safari (OS X or iOS) is in private browsing mode, it appears as though localStorage
-          // is available, but trying to call .setItem throws an exception.
-          //
-          // "QUOTA_EXCEEDED_ERR: DOM Exception 22: An attempt was made to add something to storage
-          // that exceeded the quota."
-          var key = deriveQualifiedKey('__' + Math.round(Math.random() * 1e7));
-          if (supported) {
-            webStorage = $window[storageType];
-            webStorage.setItem(key, '');
-            webStorage.removeItem(key);
-          }
 
-          return supported;
-        } catch (e) {
-          storageType = 'cookie';
-          $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
-          return false;
+      try {
+        if (webStorage) {
+          webStorage.setItem(deriveQualifiedKey(key), value);
         }
-      }());
-
-      // Directly adds a value to local storage
-      // If local storage is not available in the browser use cookies
-      // Example use: localStorageService.add('library','angular');
-      var addToLocalStorage = function (key, value) {
-        // Let's convert undefined values to null to get the value consistent
-        if (isUndefined(value)) {
-          value = null;
-        } else {
-          value = toJson(value);
+        if (notify.setItem) {
+          $rootScope.$broadcast('LocalStorageModule.notification.setitem', {key: key, newvalue: value, storageType: self.storageType});
         }
+      } catch (e) {
+        $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
+        return addToCookies(key, value);
+      }
+      return true;
+    };
 
-        // If this browser does not support local storage use cookies
-        if (!browserSupportsLocalStorage || self.storageType === 'cookie') {
-          if (!browserSupportsLocalStorage) {
-            $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED');
-          }
+    // Directly get a value from local storage
+    // Example use: localStorageService.get('library'); // returns 'angular'
+    var getFromLocalStorage = function (key) {
 
-          if (notify.setItem) {
-            $rootScope.$broadcast('LocalStorageModule.notification.setitem', {key: key, newvalue: value, storageType: 'cookie'});
-          }
-          return addToCookies(key, value);
+      if (!browserSupportsLocalStorage || self.storageType === 'cookie') {
+        if (!browserSupportsLocalStorage) {
+          $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED');
         }
 
-        try {
-          if (webStorage) {
-            webStorage.setItem(deriveQualifiedKey(key), value);
-          }
-          if (notify.setItem) {
-            $rootScope.$broadcast('LocalStorageModule.notification.setitem', {key: key, newvalue: value, storageType: self.storageType});
-          }
-        } catch (e) {
-          $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
-          return addToCookies(key, value);
-        }
-        return true;
-      };
+        return getFromCookies(key);
+      }
 
-      // Directly get a value from local storage
-      // Example use: localStorageService.get('library'); // returns 'angular'
-      var getFromLocalStorage = function (key) {
+      var item = webStorage ? webStorage.getItem(deriveQualifiedKey(key)) : null;
+      // angular.toJson will convert null to 'null', so a proper conversion is needed
+      // FIXME not a perfect solution, since a valid 'null' string can't be stored
+      if (!item || item === 'null') {
+        return null;
+      }
 
+      try {
+        return JSON.parse(item);
+      } catch (e) {
+        return item;
+      }
+    };
+
+    // Remove an item from local storage
+    // Example use: localStorageService.remove('library'); // removes the key/value pair of library='angular'
+    var removeFromLocalStorage = function () {
+      var i, key;
+      for (i=0; i<arguments.length; i++) {
+        key = arguments[i];
         if (!browserSupportsLocalStorage || self.storageType === 'cookie') {
           if (!browserSupportsLocalStorage) {
             $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED');
           }
 
-          return getFromCookies(key);
-        }
-
-        var item = webStorage ? webStorage.getItem(deriveQualifiedKey(key)) : null;
-        // angular.toJson will convert null to 'null', so a proper conversion is needed
-        // FIXME not a perfect solution, since a valid 'null' string can't be stored
-        if (!item || item === 'null') {
-          return null;
-        }
-
-        try {
-          return JSON.parse(item);
-        } catch (e) {
-          return item;
+          if (notify.removeItem) {
+            $rootScope.$broadcast('LocalStorageModule.notification.removeitem', {key: key, storageType: 'cookie'});
+          }
+          removeFromCookies(key);
         }
-      };
-
-      // Remove an item from local storage
-      // Example use: localStorageService.remove('library'); // removes the key/value pair of library='angular'
-      var removeFromLocalStorage = function () {
-        var i, key;
-        for (i=0; i<arguments.length; i++) {
-          key = arguments[i];
-          if (!browserSupportsLocalStorage || self.storageType === 'cookie') {
-            if (!browserSupportsLocalStorage) {
-              $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED');
-            }
-
+        else {
+          try {
+            webStorage.removeItem(deriveQualifiedKey(key));
             if (notify.removeItem) {
-              $rootScope.$broadcast('LocalStorageModule.notification.removeitem', {key: key, storageType: 'cookie'});
+              $rootScope.$broadcast('LocalStorageModule.notification.removeitem', {
+                key: key,
+                storageType: self.storageType
+              });
             }
+          } catch (e) {
+            $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
             removeFromCookies(key);
           }
-          else {
-            try {
-              webStorage.removeItem(deriveQualifiedKey(key));
-              if (notify.removeItem) {
-                $rootScope.$broadcast('LocalStorageModule.notification.removeitem', {
-                  key: key,
-                  storageType: self.storageType
-                });
-              }
-            } catch (e) {
-              $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
-              removeFromCookies(key);
-            }
-          }
         }
-      };
+      }
+    };
 
-      // Return array of keys for local storage
-      // Example use: var keys = localStorageService.keys()
-      var getKeysForLocalStorage = function () {
+    // Return array of keys for local storage
+    // Example use: var keys = localStorageService.keys()
+    var getKeysForLocalStorage = function () {
 
-        if (!browserSupportsLocalStorage) {
-          $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED');
-          return [];
-        }
+      if (!browserSupportsLocalStorage) {
+        $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED');
+        return false;
+      }
 
-        var prefixLength = prefix.length;
-        var keys = [];
-        for (var key in webStorage) {
-          // Only return keys that are for this app
-          if (key.substr(0, prefixLength) === prefix) {
-            try {
-              keys.push(key.substr(prefixLength));
-            } catch (e) {
-              $rootScope.$broadcast('LocalStorageModule.notification.error', e.Description);
-              return [];
-            }
+      var prefixLength = prefix.length;
+      var keys = [];
+      for (var key in webStorage) {
+        // Only return keys that are for this app
+        if (key.substr(0,prefixLength) === prefix) {
+          try {
+            keys.push(key.substr(prefixLength));
+          } catch (e) {
+            $rootScope.$broadcast('LocalStorageModule.notification.error', e.Description);
+            return [];
           }
         }
-        return keys;
-      };
+      }
+      return keys;
+    };
 
-      // Remove all data for this app from local storage
-      // Also optionally takes a regular expression string and removes the matching key-value pairs
-      // Example use: localStorageService.clearAll();
-      // Should be used mostly for development purposes
-      var clearAllFromLocalStorage = function (regularExpression) {
+    // Remove all data for this app from local storage
+    // Also optionally takes a regular expression string and removes the matching key-value pairs
+    // Example use: localStorageService.clearAll();
+    // Should be used mostly for development purposes
+    var clearAllFromLocalStorage = function (regularExpression) {
 
-        // Setting both regular expressions independently
-        // Empty strings result in catchall RegExp
-        var prefixRegex = !!prefix ? new RegExp('^' + prefix) : new RegExp();
-        var testRegex = !!regularExpression ? new RegExp(regularExpression) : new RegExp();
+      // Setting both regular expressions independently
+      // Empty strings result in catchall RegExp
+      var prefixRegex = !!prefix ? new RegExp('^' + prefix) : new RegExp();
+      var testRegex = !!regularExpression ? new RegExp(regularExpression) : new RegExp();
 
-        if (!browserSupportsLocalStorage || self.storageType === 'cookie') {
-          if (!browserSupportsLocalStorage) {
-            $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED');
-          }
-          return clearAllFromCookies();
+      if (!browserSupportsLocalStorage || self.storageType === 'cookie') {
+        if (!browserSupportsLocalStorage) {
+          $rootScope.$broadcast('LocalStorageModule.notification.warning', 'LOCAL_STORAGE_NOT_SUPPORTED');
         }
+        return clearAllFromCookies();
+      }
 
-        var prefixLength = prefix.length;
+      var prefixLength = prefix.length;
 
-        for (var key in webStorage) {
-          // Only remove items that are for this app and match the regular expression
-          if (prefixRegex.test(key) && testRegex.test(key.substr(prefixLength))) {
-            try {
-              removeFromLocalStorage(key.substr(prefixLength));
-            } catch (e) {
-              $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
-              return clearAllFromCookies();
-            }
+      for (var key in webStorage) {
+        // Only remove items that are for this app and match the regular expression
+        if (prefixRegex.test(key) && testRegex.test(key.substr(prefixLength))) {
+          try {
+            removeFromLocalStorage(key.substr(prefixLength));
+          } catch (e) {
+            $rootScope.$broadcast('LocalStorageModule.notification.error',e.message);
+            return clearAllFromCookies();
           }
         }
-        return true;
-      };
+      }
+      return true;
+    };
 
-      // Checks the browser to see if cookies are supported
-      var browserSupportsCookies = (function() {
-        try {
-          return $window.navigator.cookieEnabled ||
+    // Checks the browser to see if cookies are supported
+    var browserSupportsCookies = (function() {
+      try {
+        return $window.navigator.cookieEnabled ||
           ("cookie" in $document && ($document.cookie.length > 0 ||
-            ($document.cookie = "test").indexOf.call($document.cookie, "test") > -1));
-          } catch (e) {
-            $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
-            return false;
-          }
-        }());
+          ($document.cookie = "test").indexOf.call($document.cookie, "test") > -1));
+      } catch (e) {
+          $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
+          return false;
+      }
+    }());
 
-        // Directly adds a value to cookies
-        // Typically used as a fallback is local storage is not available in the browser
-        // Example use: localStorageService.cookie.add('library','angular');
-        var addToCookies = function (key, value, daysToExpiry) {
+    // Directly adds a value to cookies
+    // Typically used as a fallback is local storage is not available in the browser
+    // Example use: localStorageService.cookie.add('library','angular');
+    var addToCookies = function (key, value, daysToExpiry) {
 
-          if (isUndefined(value)) {
-            return false;
-          } else if(isArray(value) || isObject(value)) {
-            value = toJson(value);
-          }
+      if (isUndefined(value)) {
+        return false;
+      } else if(isArray(value) || isObject(value)) {
+        value = toJson(value);
+      }
 
-          if (!browserSupportsCookies) {
-            $rootScope.$broadcast('LocalStorageModule.notification.error', 'COOKIES_NOT_SUPPORTED');
-            return false;
-          }
+      if (!browserSupportsCookies) {
+        $rootScope.$broadcast('LocalStorageModule.notification.error', 'COOKIES_NOT_SUPPORTED');
+        return false;
+      }
 
-          try {
-            var expiry = '',
+      try {
+        var expiry = '',
             expiryDate = new Date(),
             cookieDomain = '';
 
-            if (value === null) {
-              // Mark that the cookie has expired one day ago
-              expiryDate.setTime(expiryDate.getTime() + (-1 * 24 * 60 * 60 * 1000));
-              expiry = "; expires=" + expiryDate.toGMTString();
-              value = '';
-            } else if (isNumber(daysToExpiry) && daysToExpiry !== 0) {
-              expiryDate.setTime(expiryDate.getTime() + (daysToExpiry * 24 * 60 * 60 * 1000));
-              expiry = "; expires=" + expiryDate.toGMTString();
-            } else if (cookie.expiry !== 0) {
-              expiryDate.setTime(expiryDate.getTime() + (cookie.expiry * 24 * 60 * 60 * 1000));
-              expiry = "; expires=" + expiryDate.toGMTString();
-            }
-            if (!!key) {
-              var cookiePath = "; path=" + cookie.path;
-              if(cookie.domain){
-                cookieDomain = "; domain=" + cookie.domain;
-              }
-              $document.cookie = deriveQualifiedKey(key) + "=" + encodeURIComponent(value) + expiry + cookiePath + cookieDomain;
-            }
-          } catch (e) {
-            $rootScope.$broadcast('LocalStorageModule.notification.error', e.message);
-            return false;
-          }
-          return true;
-        };
-
-        // Directly get a value from a cookie
-        // Example use: localStorageService.cookie.get('library'); // returns 'angular'
-        var getFromCookies = function (key) {
-          if (!browserSupportsCookies) {
-            $rootScope.$broadcast('LocalStorageModule.notification.error', 'COOKIES_NOT_SUPPORTED');
-            return false;
+        if (value === null) {
+          // Mark that the cookie has expired one day ago
+          expiryDate.setTime(expiryDate.getTime() + (-1 * 24 * 60 * 60 * 1000));
+          expiry = "; expires=" + expiryDate.toGMTString();
+          value = '';
+        } else if (isNumber(daysToExpiry) && daysToExpiry !== 0) {
+          expiryDate.setTime(expiryDate.getTime() + (daysToExpiry * 24 * 60 * 60 * 1000));
+          expiry = "; expires=" + expiryDate.toGMTString();
+        } else if (cookie.expiry !== 0) {
+          expiryDate.setTime(expiryDate.getTime() + (cookie.expiry * 24 * 60 * 60 * 1000));
+          expiry = "; expires=" + expiryDate.toGMTString();
+        }
+        if (!!key) {
+          var cookiePath = "; path=" + cookie.path;
+          if(cookie.domain){
+            cookieDomain = "; domain=" + cookie.domain;
           }
+          $document.cookie = deriveQualifiedKey(key) + "=" + encodeURIComponent(value) + expiry + cookiePath + cookieDomain;
+        }
+      } catch (e) {
+        $rootScope.$broadcast('LocalStorageModule.notification.error',e.message);
+        return false;
+      }
+      return true;
+    };
 
-          var cookies = $document.cookie && $document.cookie.split(';') || [];
-          for(var i=0; i < cookies.length; i++) {
-            var thisCookie = cookies[i];
-            while (thisCookie.charAt(0) === ' ') {
-              thisCookie = thisCookie.substring(1,thisCookie.length);
-            }
-            if (thisCookie.indexOf(deriveQualifiedKey(key) + '=') === 0) {
-              var storedValues = decodeURIComponent(thisCookie.substring(prefix.length + key.length + 1, thisCookie.length));
-              try {
-                return JSON.parse(storedValues);
-              } catch(e) {
-                return storedValues;
-              }
-            }
-          }
-          return null;
-        };
-
-        var removeFromCookies = function (key) {
-          addToCookies(key,null);
-        };
-
-        var clearAllFromCookies = function () {
-          var thisCookie = null, thisKey = null;
-          var prefixLength = prefix.length;
-          var cookies = $document.cookie.split(';');
-          for(var i = 0; i < cookies.length; i++) {
-            thisCookie = cookies[i];
-
-            while (thisCookie.charAt(0) === ' ') {
-              thisCookie = thisCookie.substring(1, thisCookie.length);
-            }
+    // Directly get a value from a cookie
+    // Example use: localStorageService.cookie.get('library'); // returns 'angular'
+    var getFromCookies = function (key) {
+      if (!browserSupportsCookies) {
+        $rootScope.$broadcast('LocalStorageModule.notification.error', 'COOKIES_NOT_SUPPORTED');
+        return false;
+      }
 
-            var key = thisCookie.substring(prefixLength, thisCookie.indexOf('='));
-            removeFromCookies(key);
-          }
-        };
-
-        var getStorageType = function() {
-          return storageType;
-        };
-
-        // Add a listener on scope variable to save its changes to local storage
-        // Return a function which when called cancels binding
-        var bindToScope = function(scope, key, def, lsKey) {
-          lsKey = lsKey || key;
-          var value = getFromLocalStorage(lsKey);
-
-          if (value === null && isDefined(def)) {
-            value = def;
-          } else if (isObject(value) && isObject(def)) {
-            value = extend(value, def);
+      var cookies = $document.cookie && $document.cookie.split(';') || [];
+      for(var i=0; i < cookies.length; i++) {
+        var thisCookie = cookies[i];
+        while (thisCookie.charAt(0) === ' ') {
+          thisCookie = thisCookie.substring(1,thisCookie.length);
+        }
+        if (thisCookie.indexOf(deriveQualifiedKey(key) + '=') === 0) {
+          var storedValues = decodeURIComponent(thisCookie.substring(prefix.length + key.length + 1, thisCookie.length));
+          try {
+            return JSON.parse(storedValues);
+          } catch(e) {
+            return storedValues;
           }
+        }
+      }
+      return null;
+    };
 
-          $parse(key).assign(scope, value);
-
-          return scope.$watch(key, function(newVal) {
-            addToLocalStorage(lsKey, newVal);
-          }, isObject(scope[key]));
-        };
-
-        // Return localStorageService.length
-        // ignore keys that not owned
-        var lengthOfLocalStorage = function() {
-          var count = 0;
-          var storage = $window[storageType];
-          for(var i = 0; i < storage.length; i++) {
-            if(storage.key(i).indexOf(prefix) === 0 ) {
-              count++;
-            }
-          }
-          return count;
-        };
-
-        return {
-          isSupported: browserSupportsLocalStorage,
-          getStorageType: getStorageType,
-          set: addToLocalStorage,
-          add: addToLocalStorage, //DEPRECATED
-          get: getFromLocalStorage,
-          keys: getKeysForLocalStorage,
-          remove: removeFromLocalStorage,
-          clearAll: clearAllFromLocalStorage,
-          bind: bindToScope,
-          deriveKey: deriveQualifiedKey,
-          length: lengthOfLocalStorage,
-          cookie: {
-            isSupported: browserSupportsCookies,
-            set: addToCookies,
-            add: addToCookies, //DEPRECATED
-            get: getFromCookies,
-            remove: removeFromCookies,
-            clearAll: clearAllFromCookies
-          }
-        };
-      }];
-  });
-})(window, window.angular);
\ No newline at end of file
+    var removeFromCookies = function (key) {
+      addToCookies(key,null);
+    };
+
+    var clearAllFromCookies = function () {
+      var thisCookie = null, thisKey = null;
+      var prefixLength = prefix.length;
+      var cookies = $document.cookie.split(';');
+      for(var i = 0; i < cookies.length; i++) {
+        thisCookie = cookies[i];
+
+        while (thisCookie.charAt(0) === ' ') {
+          thisCookie = thisCookie.substring(1, thisCookie.length);
+        }
+
+        var key = thisCookie.substring(prefixLength, thisCookie.indexOf('='));
+        removeFromCookies(key);
+      }
+    };
+
+    var getStorageType = function() {
+      return storageType;
+    };
+
+    // Add a listener on scope variable to save its changes to local storage
+    // Return a function which when called cancels binding
+    var bindToScope = function(scope, key, def, lsKey) {
+      lsKey = lsKey || key;
+      var value = getFromLocalStorage(lsKey);
+
+      if (value === null && isDefined(def)) {
+        value = def;
+      } else if (isObject(value) && isObject(def)) {
+        value = extend(def, value);
+      }
+
+      $parse(key).assign(scope, value);
+
+      return scope.$watch(key, function(newVal) {
+        addToLocalStorage(lsKey, newVal);
+      }, isObject(scope[key]));
+    };
+
+    // Return localStorageService.length
+    // ignore keys that not owned
+    var lengthOfLocalStorage = function() {
+      var count = 0;
+      var storage = $window[storageType];
+      for(var i = 0; i < storage.length; i++) {
+        if(storage.key(i).indexOf(prefix) === 0 ) {
+          count++;
+        }
+      }
+      return count;
+    };
+
+    return {
+      isSupported: browserSupportsLocalStorage,
+      getStorageType: getStorageType,
+      set: addToLocalStorage,
+      add: addToLocalStorage, //DEPRECATED
+      get: getFromLocalStorage,
+      keys: getKeysForLocalStorage,
+      remove: removeFromLocalStorage,
+      clearAll: clearAllFromLocalStorage,
+      bind: bindToScope,
+      deriveKey: deriveQualifiedKey,
+      length: lengthOfLocalStorage,
+      cookie: {
+        isSupported: browserSupportsCookies,
+        set: addToCookies,
+        add: addToCookies, //DEPRECATED
+        get: getFromCookies,
+        remove: removeFromCookies,
+        clearAll: clearAllFromCookies
+      }
+    };
+  }];
+});
+})( window, window.angular );
\ No newline at end of file