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