UNPKG

automizy-js-api

Version:

JavaScript API library for Automizy Marketing Automation software

186 lines (179 loc) 7.8 kB
define(['automizy/core'], function () { /* * store.js 1.3.18 * (c) 2010-2014 Marcus Westin <http://marcuswest.in> * MIT license * * localStorage wrapper for all browsers without using cookies or flash. * Uses localStorage, globalStorage, and userData behavior under the hood */ var win = window; var store = {}, doc = win.document, localStorageName = 'localStorage', scriptTag = 'script', storage; store.disabled = false; store.version = '1.3.17'; store.set = function(key, value) {}; store.get = function(key, defaultVal) {}; store.has = function(key) { return store.get(key) !== undefined }; store.remove = function(key) {}; store.clear = function() {}; store.transact = function(key, defaultVal, transactionFn) { if (transactionFn == null) { transactionFn = defaultVal; defaultVal = null; } if (defaultVal == null) { defaultVal = {}; } var val = store.get(key, defaultVal); transactionFn(val); store.set(key, val); }; store.getAll = function() {}; store.forEach = function() {}; store.serialize = function(value) { return JSON.stringify(value) }; store.deserialize = function(value) { if (typeof value != 'string') { return undefined } try { return JSON.parse(value) } catch(e) { return value || undefined } }; // Functions to encapsulate questionable FireFox 3.6.13 behavior // when about.config::dom.storage.enabled === false // See https://github.com/marcuswestin/store.js/issues#issue/13 function isLocalStorageNameSupported() { try { return (localStorageName in win && win[localStorageName]) } catch(err) { return false } } if (isLocalStorageNameSupported()) { storage = win[localStorageName]; store.set = function(key, val) { if (val === undefined) { return store.remove(key) } storage.setItem(key, store.serialize(val)); return val }; store.get = function(key, defaultVal) { var val = store.deserialize(storage.getItem(key)); return (val === undefined ? defaultVal : val) }; store.remove = function(key) { storage.removeItem(key) }; store.clear = function() { storage.clear() }; store.getAll = function() { var ret = {}; store.forEach(function(key, val) { ret[key] = val }); return ret }; store.forEach = function(callback) { for (var i=0; i<storage.length; i++) { var key = storage.key(i); callback(key, store.get(key)) } } } else if (doc.documentElement.addBehavior) { var storageOwner, storageContainer; // Since #userData storage applies only to specific paths, we need to // somehow link our data to a specific path. We choose /favicon.ico // as a pretty safe option, since all browsers already make a request to // this URL anyway and being a 404 will not hurt us here. We wrap an // iframe pointing to the favicon in an ActiveXObject(htmlfile) object // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx) // since the iframe access rules appear to allow direct access and // manipulation of the document element, even for a 404 page. This // document can be used instead of the current document (which would // have been limited to the current path) to perform #userData storage. try { storageContainer = new ActiveXObject('htmlfile'); storageContainer.open(); storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>'); storageContainer.close(); storageOwner = storageContainer.w.frames[0].document; storage = storageOwner.createElement('div') } catch(e) { // somehow ActiveXObject instantiation failed (perhaps some special // security settings or otherwse), fall back to per-path storage storage = doc.createElement('div'); storageOwner = doc.body; } var withIEStorage = function(storeFunction) { return function() { var args = Array.prototype.slice.call(arguments, 0); args.unshift(storage); // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx storageOwner.appendChild(storage); storage.addBehavior('#default#userData'); storage.load(localStorageName); var result = storeFunction.apply(store, args); storageOwner.removeChild(storage); return result } }; // In IE7, keys cannot start with a digit or contain certain chars. // See https://github.com/marcuswestin/store.js/issues/40 // See https://github.com/marcuswestin/store.js/issues/83 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g"); function ieKeyFix(key) { return key.replace(/^d/, '___$&').replace(forbiddenCharsRegex, '___') } store.set = withIEStorage(function(storage, key, val) { key = ieKeyFix(key); if (val === undefined) { return store.remove(key) } storage.setAttribute(key, store.serialize(val)); storage.save(localStorageName); return val }); store.get = withIEStorage(function(storage, key, defaultVal) { key = ieKeyFix(key); var val = store.deserialize(storage.getAttribute(key)); return (val === undefined ? defaultVal : val) }); store.remove = withIEStorage(function(storage, key) { key = ieKeyFix(key); storage.removeAttribute(key); storage.save(localStorageName) }); store.clear = withIEStorage(function(storage) { var attributes = storage.XMLDocument.documentElement.attributes; storage.load(localStorageName); for (var i=0, attr; attr=attributes[i]; i++) { storage.removeAttribute(attr.name) } storage.save(localStorageName) }); store.getAll = function(storage) { var ret = {}; store.forEach(function(key, val) { ret[key] = val }); return ret }; store.forEach = withIEStorage(function(storage, callback) { var attributes = storage.XMLDocument.documentElement.attributes; for (var i=0, attr; attr=attributes[i]; ++i) { callback(attr.name, store.deserialize(storage.getAttribute(attr.name))) } }) } try { var testKey = '__storejs__'; store.set(testKey, testKey); if (store.get(testKey) != testKey) { store.disabled = true } store.remove(testKey) } catch(e) { store.disabled = true } store.enabled = !store.disabled; /* if (typeof module != 'undefined' && module.exports && this.module !== module) { module.exports = store } else if (typeof define === 'function' && define.amd) { define(store) } else { win.store = store } */ $A.store = store; });