/** * Javascript code to store data as JSON strings in cookies.  * It uses prototype.js 1.5.1 (http://www.prototypejs.org) *  * Author : Lalit Patel * Website: http://www.lalit.org/lab/jsoncookies * License: Creative Commons Attribution-ShareAlike 2.5 *          http://creativecommons.org/licenses/by-sa/2.5/ * Version: 0.4 * Updated: Aug 11, 2007 10:09am *  * Chnage Log: *   v 0.4 *   -  Removed a extra comma in options (was breaking in IE and Opera). (Thanks Jason) *   -  Removed the parameter name from the initialize function *   -  Changed the way expires date was being calculated. (Thanks David) *   v 0.3 *   -  Removed dependancy on json.js (http://www.json.org/json.js) *   -  empty() function only deletes the cookies set by CookieJar */var CookieJar = Class.create();CookieJar.prototype = {	/**	 * Append before all cookie names to differntiate them.	 */	appendString: "__CJ_",	/**	 * Initializes the cookie jar with the options.	 */	initialize: function(options) {		this.options = {			expires: 3600,		// seconds (1 hr)			path: '',			// cookie path			domain: '',			// cookie domain			secure: ''			// secure ?		};		Object.extend(this.options, options || {});		if (this.options.expires != '') {			var date = new Date();			date = new Date(date.getTime() + (this.options.expires * 1000));			this.options.expires = '; expires=' + date.toGMTString();		}		if (this.options.path != '') {			this.options.path = '; path=' + escape(this.options.path);		}		if (this.options.domain != '') {			this.options.domain = '; domain=' + escape(this.options.domain);		}		if (this.options.secure == 'secure') {			this.options.secure = '; secure';		} else {			this.options.secure = '';		}	},	/**	 * Adds a name values pair.	 */	put: function(name, value) {		name = this.appendString + name;		cookie = this.options;		var type = typeof value;		switch(type) {		  case 'undefined':		  case 'function' :		  case 'unknown'  : return false;		  case 'boolean'  : 		  case 'string'   : 		  case 'number'   : value = String(value.toString());		}		var cookie_str = name + "=" + escape(Object.toJSON(value));		try {			document.cookie = cookie_str + cookie.expires + cookie.path + cookie.domain + cookie.secure;		} catch (e) {			return false;		}		return true;	},	/**	 * Removes a particular cookie (name value pair) form the Cookie Jar.	 */	remove: function(name) {		name = this.appendString + name;		cookie = this.options;		try {			var date = new Date();			date.setTime(date.getTime() - (3600 * 1000));			var expires = '; expires=' + date.toGMTString();			document.cookie = name + "=" + expires + cookie.path + cookie.domain + cookie.secure;		} catch (e) {			return false;		}		return true;	},	/**	 * Return a particular cookie by name;	 */	get: function(name) {		name = this.appendString + name;		var cookies = document.cookie.match(name + '=(.*?)(;|$)');		if (cookies) {			return (unescape(cookies[1])).evalJSON();		} else {			return null;		}	},	/**	 * Empties the Cookie Jar. Deletes all the cookies.	 */	empty: function() {		keys = this.getKeys();		size = keys.size();		for(i=0; i<size; i++) {			this.remove(keys[i]);		}	},	/**	 * Returns all cookies as a single object	 */	getPack: function() {		pack = {};		keys = this.getKeys();		size = keys.size();		for(i=0; i<size; i++) {			pack[keys[i]] = this.get(keys[i]);		}		return pack;	},	/**	 * Returns all keys.	 */	getKeys: function() {		keys = $A();		keyRe= /[^=; ]+(?=\=)/g;		str  = document.cookie;		CJRe = new RegExp("^" + this.appendString);		while((match = keyRe.exec(str)) != undefined) {			if (CJRe.test(match[0].strip())) {				keys.push(match[0].strip().gsub("^" + this.appendString,""));			}		}		return keys;	}};