﻿/**
* 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: Apache Software License 2
*          http://www.apache.org/licenses/LICENSE-2.0
* Version: 0.6
* Updated: Oct 2, 2009 by Peter Deppe
* 
* Chnage Log:
*   v 0.6 (by PD)
*   -  Updated to pass in the prefix for the cookie so u can have multiples.
*   -  Updated to make the expires optional so u can have a memory cookie
*   v 0.5
*   -  Changed License from CC to Apache 2
*   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: "__PWSELS__",

    /**
    * Initializes the cookie jar with the options.
    */
    initialize: function(options) {
        this.options = {
            prefix: '',             // cookie prefix (so u can override the prefix)
            expires: '',        	// allows you to store the cookie (optional)
            path: '', 		        // cookie path
            domain: '', 		    // cookie domain
            secure: ''			    // secure ?
        };
        Object.extend(this.options, options || {});

        if (this.options.prefix != '') {
            this.appendString = this.options.prefix;
        }
        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;
        var expires = '';
        try {

            if (cookie.expires != '') {
                var date = new Date();
                date.setTime(date.getTime() - (3600 * 1000));
                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;
    },

    /*
    * Returns the length of the key array.
    */
    getKeyLength: function() {
        keys = this.getKeys();
        size = keys.size();
        return size;
    }

};
