Mercurial > hg > extraction-interface
diff geotemco/lib/jquery/jquery.remember.js @ 0:b12c99b7c3f0
commit for previous development
author | Zoe Hong <zhong@mpiwg-berlin.mpg.de> |
---|---|
date | Mon, 19 Jan 2015 17:13:49 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/geotemco/lib/jquery/jquery.remember.js Mon Jan 19 17:13:49 2015 +0100 @@ -0,0 +1,220 @@ +/*! +* +* jQuery Remember Plugin +* Version 0.1.1 +* +* Copyright Nick Dreckshage, licensed GPL & MIT +* https://github.com/ndreckshage/jquery-remember +* +* A fork of jQuery Cookie Plugin +* https://github.com/carhartl/jquery-cookie +* Copyright Klaus Hartl +* Released under the MIT licensed +* +*/ + +(function($){ + + // recommend changing to return function(options) { if using require.js... + $.remember = function(options){ + var settings, + remember, + controller; + + settings = $.extend({ + name: null, // name/key of the cookie/localstorage item + value: undefined, // value pair of cookie/localstorage + getSet: false, // if true, will get if available, set if not. default is to just get OR set + remove: false, // if true, will remove based on name/key + use: 'default', // whether to use localstorage or cookies. default localstorage with cookie fallback. + expires: null, // forces cookie (invalid localstorage attribue). + path: null, // forces cookie. + domain: null, // forces cookie. + secure: null, // forces cookie. + json: false, // will convert to json when set. parse with get. + fallback: true, // whether to fallback to cookies if localstorage not available. + raw: false, // if true, will skip uri encoding/decoding + modernizr: false // set true if youd rather handle localstorage detection through modernizr + }, options); + + remember = { + init: function(){ + var controller; + + // controls what to do with the input. set - get - set/get - erase + // set if name exists, value exists, and not set to remove cookie. + // get if name exists, value does not exist, and not set to remove + // remove if remove set to true + if (settings.name !== null && settings.value !== undefined && settings.remove !== true){ + if (settings.getSet === true){ + var get = this.get(); + // if the value of get exists, return it. otherwise, set the value as specified. + if (get === null){ + this.set(); + } else { + controller = get; + } + } else { + this.set(); + } + } else if (settings.name !== null && settings.value === undefined && settings.remove !== true){ + controller = this.get(); + } else if (settings.name !== null && settings.remove === true){ + this.erase(); + } + + // will return result of everything to calling js + return controller; + }, + get: function(){ + var use = this._use(), + value = null, + cookies, + parts, + name; + + // grab the key value pair from localstorage + if (use === 'localstorage') { + value = localStorage.getItem(settings.name); + } + + // hit if cookie requested, and when double checking a get on an empty localstorage item + if ((use === 'cookie') || (use === 'localstorage' && value === null && settings.fallback !== false)) { + + // grab all the cookies from the browser, check if set, and loop through + cookies = document.cookie ? document.cookie : null; + if (cookies !== null){ + cookies = cookies.split(';'); + for (var i = 0; i < cookies.length; i++){ + // separate the key value pair + parts = cookies[i].split('='); + // set name and value to split parts, cleaning up whitespace + name = parts.shift(); + name = settings.raw === false ? this._trim(this._decode(name)) : this._trim(name); + value = parts[0]; + // break when we hit a match, or cookie is empty + if (settings.name === name) { + break; + } else if (settings.fallback !== false) { + value = localStorage.getItem(settings.name) || null; + } else { + value = null; + } + } + } + } + + // decode uri and if json is requested, parse the cookie/localstorage and return to controller + value = (value && settings.raw === false) ? this._decode(value) : value; + value = (value && settings.json === true) ? JSON.parse(value) : value; + + return value; + }, + set: function(){ + var use = this._use(); + + // if set is hit, user has intentionally tried to set (get/set not hit) + // clear the storage alternative, so the same value isnt stored in both + this.erase(); + + // convert the value to store in json if requested + settings.value = settings.json === true ? JSON.stringify(settings.value) : settings.value; + + // encode + settings.name = settings.raw === false ? encodeURIComponent(settings.name) : settings.name; + settings.value = settings.raw === false ? encodeURIComponent(settings.value) : settings.value; + + // store the key value pair in appropriate storage. set unless storage requirements failed + if (use === 'localstorage'){ + localStorage.setItem(settings.name, settings.value); + } else if (use !== false){ + // convert values that cant be stored and set + settings.value = settings.value === null ? 'null' : settings.value; + this._setCookie(); + } + }, + erase: function(){ + var use = this._use(); + + // clear localstorage and cookies by setting expiration to negative + if (use !== 'cookie' || settings.fallback !== false){ + localStorage.removeItem(settings.name); + } + if (use !== 'localstorage' || settings.fallback !== false){ + this._setCookie('', -1); + } + }, + _use: function(){ + var use, + localStorageSupport = this._localStorage(); + + // if cookie requested, or any options set that only apply to cookies + if (settings.use === 'cookie' || settings.expires !== null || settings.path !== null || settings.domain !== null || settings.secure !== null){ + use = 'cookie'; + } else { + // use local storage if available + if (localStorageSupport){ + use = 'localstorage'; + } else if (settings.fallback !== false) { + // default to cookie, unless fallback banned + use = 'cookie'; + } else { + // if all this fails, nothing can be set + use = false; + } + } + + return use; + }, + _setCookie: function(){ + // allow for varying parameters with defaults. value then expires as optional params + var value = arguments.length > 0 ? arguments[0] : settings.value, + expires = arguments.length > 1 ? arguments[1] : settings.expires, + expire; + + // set a date in the future (or negative to delete) based on expires date offset + if (typeof expires === 'number') { + expire = new Date(); + expire.setDate(expire.getDate() + expires); + } + + // set the cookies with all the varying settings + document.cookie = [ + settings.name, + '=', + value, + expire ? '; expires=' + expire.toUTCString() : '', + settings.path ? '; path=' + settings.path : '', + settings.domain ? '; domain=' + settings.domain : '', + settings.secure ? '; secure' : '' + ].join(''); + }, + _localStorage: function(){ + if (settings.modernizr === true && typeof Modernizr !== 'undefined'){ + return Modernizr.localstorage; + } else { + // check if a browser supports localstorage with simple try catch + try { + localStorage.setItem('jquery-remember-test','jquery-remember-test'); + localStorage.removeItem('jquery-remember-test'); + return true; + } catch(e){ + return false; + } + } + }, + _trim: function(s){ + // trail a strings leading/ending whitespace + return s.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + }, + _decode: function(s){ + return decodeURIComponent(s.replace(/\+/g, ' ')); + } + }; + + return remember.init(); + }; + + return $.remember; + +}(jQuery));