1*eb8dc403SDave Cobbley/*! 2*eb8dc403SDave Cobbley * jQuery Cookie Plugin v1.4.0 3*eb8dc403SDave Cobbley * https://github.com/carhartl/jquery-cookie 4*eb8dc403SDave Cobbley * 5*eb8dc403SDave Cobbley * Copyright 2013 Klaus Hartl 6*eb8dc403SDave Cobbley * Released under the MIT license 7*eb8dc403SDave Cobbley */ 8*eb8dc403SDave Cobbley(function (factory) { 9*eb8dc403SDave Cobbley if (typeof define === 'function' && define.amd) { 10*eb8dc403SDave Cobbley // AMD. Register as anonymous module. 11*eb8dc403SDave Cobbley define(['jquery'], factory); 12*eb8dc403SDave Cobbley } else { 13*eb8dc403SDave Cobbley // Browser globals. 14*eb8dc403SDave Cobbley factory(jQuery); 15*eb8dc403SDave Cobbley } 16*eb8dc403SDave Cobbley}(function ($) { 17*eb8dc403SDave Cobbley 18*eb8dc403SDave Cobbley var pluses = /\+/g; 19*eb8dc403SDave Cobbley 20*eb8dc403SDave Cobbley function encode(s) { 21*eb8dc403SDave Cobbley return config.raw ? s : encodeURIComponent(s); 22*eb8dc403SDave Cobbley } 23*eb8dc403SDave Cobbley 24*eb8dc403SDave Cobbley function decode(s) { 25*eb8dc403SDave Cobbley return config.raw ? s : decodeURIComponent(s); 26*eb8dc403SDave Cobbley } 27*eb8dc403SDave Cobbley 28*eb8dc403SDave Cobbley function stringifyCookieValue(value) { 29*eb8dc403SDave Cobbley return encode(config.json ? JSON.stringify(value) : String(value)); 30*eb8dc403SDave Cobbley } 31*eb8dc403SDave Cobbley 32*eb8dc403SDave Cobbley function parseCookieValue(s) { 33*eb8dc403SDave Cobbley if (s.indexOf('"') === 0) { 34*eb8dc403SDave Cobbley // This is a quoted cookie as according to RFC2068, unescape... 35*eb8dc403SDave Cobbley s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); 36*eb8dc403SDave Cobbley } 37*eb8dc403SDave Cobbley 38*eb8dc403SDave Cobbley try { 39*eb8dc403SDave Cobbley // Replace server-side written pluses with spaces. 40*eb8dc403SDave Cobbley // If we can't decode the cookie, ignore it, it's unusable. 41*eb8dc403SDave Cobbley s = decodeURIComponent(s.replace(pluses, ' ')); 42*eb8dc403SDave Cobbley } catch(e) { 43*eb8dc403SDave Cobbley return; 44*eb8dc403SDave Cobbley } 45*eb8dc403SDave Cobbley 46*eb8dc403SDave Cobbley try { 47*eb8dc403SDave Cobbley // If we can't parse the cookie, ignore it, it's unusable. 48*eb8dc403SDave Cobbley return config.json ? JSON.parse(s) : s; 49*eb8dc403SDave Cobbley } catch(e) {} 50*eb8dc403SDave Cobbley } 51*eb8dc403SDave Cobbley 52*eb8dc403SDave Cobbley function read(s, converter) { 53*eb8dc403SDave Cobbley var value = config.raw ? s : parseCookieValue(s); 54*eb8dc403SDave Cobbley return $.isFunction(converter) ? converter(value) : value; 55*eb8dc403SDave Cobbley } 56*eb8dc403SDave Cobbley 57*eb8dc403SDave Cobbley var config = $.cookie = function (key, value, options) { 58*eb8dc403SDave Cobbley 59*eb8dc403SDave Cobbley // Write 60*eb8dc403SDave Cobbley if (value !== undefined && !$.isFunction(value)) { 61*eb8dc403SDave Cobbley options = $.extend({}, config.defaults, options); 62*eb8dc403SDave Cobbley 63*eb8dc403SDave Cobbley if (typeof options.expires === 'number') { 64*eb8dc403SDave Cobbley var days = options.expires, t = options.expires = new Date(); 65*eb8dc403SDave Cobbley t.setDate(t.getDate() + days); 66*eb8dc403SDave Cobbley } 67*eb8dc403SDave Cobbley 68*eb8dc403SDave Cobbley return (document.cookie = [ 69*eb8dc403SDave Cobbley encode(key), '=', stringifyCookieValue(value), 70*eb8dc403SDave Cobbley options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 71*eb8dc403SDave Cobbley options.path ? '; path=' + options.path : '', 72*eb8dc403SDave Cobbley options.domain ? '; domain=' + options.domain : '', 73*eb8dc403SDave Cobbley options.secure ? '; secure' : '' 74*eb8dc403SDave Cobbley ].join('')); 75*eb8dc403SDave Cobbley } 76*eb8dc403SDave Cobbley 77*eb8dc403SDave Cobbley // Read 78*eb8dc403SDave Cobbley 79*eb8dc403SDave Cobbley var result = key ? undefined : {}; 80*eb8dc403SDave Cobbley 81*eb8dc403SDave Cobbley // To prevent the for loop in the first place assign an empty array 82*eb8dc403SDave Cobbley // in case there are no cookies at all. Also prevents odd result when 83*eb8dc403SDave Cobbley // calling $.cookie(). 84*eb8dc403SDave Cobbley var cookies = document.cookie ? document.cookie.split('; ') : []; 85*eb8dc403SDave Cobbley 86*eb8dc403SDave Cobbley for (var i = 0, l = cookies.length; i < l; i++) { 87*eb8dc403SDave Cobbley var parts = cookies[i].split('='); 88*eb8dc403SDave Cobbley var name = decode(parts.shift()); 89*eb8dc403SDave Cobbley var cookie = parts.join('='); 90*eb8dc403SDave Cobbley 91*eb8dc403SDave Cobbley if (key && key === name) { 92*eb8dc403SDave Cobbley // If second argument (value) is a function it's a converter... 93*eb8dc403SDave Cobbley result = read(cookie, value); 94*eb8dc403SDave Cobbley break; 95*eb8dc403SDave Cobbley } 96*eb8dc403SDave Cobbley 97*eb8dc403SDave Cobbley // Prevent storing a cookie that we couldn't decode. 98*eb8dc403SDave Cobbley if (!key && (cookie = read(cookie)) !== undefined) { 99*eb8dc403SDave Cobbley result[name] = cookie; 100*eb8dc403SDave Cobbley } 101*eb8dc403SDave Cobbley } 102*eb8dc403SDave Cobbley 103*eb8dc403SDave Cobbley return result; 104*eb8dc403SDave Cobbley }; 105*eb8dc403SDave Cobbley 106*eb8dc403SDave Cobbley config.defaults = {}; 107*eb8dc403SDave Cobbley 108*eb8dc403SDave Cobbley $.removeCookie = function (key, options) { 109*eb8dc403SDave Cobbley if ($.cookie(key) !== undefined) { 110*eb8dc403SDave Cobbley // Must not alter options, thus extending a fresh object... 111*eb8dc403SDave Cobbley $.cookie(key, '', $.extend({}, options, { expires: -1 })); 112*eb8dc403SDave Cobbley return true; 113*eb8dc403SDave Cobbley } 114*eb8dc403SDave Cobbley return false; 115*eb8dc403SDave Cobbley }; 116*eb8dc403SDave Cobbley 117*eb8dc403SDave Cobbley})); 118