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