/* Browser Detection

----------------------------------------------------------------------------- */

var _BROWSER_IS_IE =

    (document.all

     && window.ActiveXObject

     && navigator.userAgent.toLowerCase().indexOf("msie") > -1

     && navigator.userAgent.toLowerCase().indexOf("opera") == -1);



/**

 * I hate navigator string based browser detection too, but when Opera alone

 * chokes on cookies containing double quotes...

 */

var _BROWSER_IS_OPERA =

    (navigator.userAgent.toLowerCase().indexOf("opera") != -1);



/* CookieManager Object

----------------------------------------------------------------------------- */

/**

 * Provides a simple interface for creating, retrieving and clearing cookies.

 *

 * @author Jonathan Buchanan

 * @version 0.8

 * @dependencies $() in Core.js

 */

CookieManager = Class.create();

CookieManager.prototype =

{

    /**

     * Determines if this object will use IE's proprietary userData behaviour

     * instead of cookies for storage.

     */

    userDataForIE: false,



    initialize: function(userDataForIE)

    {

        this.cookieShelfLife = 365;

        this.userDataForIE = userDataForIE;



        // Internet Explorer has a cookie handling bug - if the *combined size*

        // of all cookies stored for a given domain is greater than 4096 bytes,

        // document.cookie will return an empty string. Until this is fixed , we

        // will fall back on IE's proprietary userData behaviour.

        if (_BROWSER_IS_IE && this.userDataForIE)

        {

            this.IE_CACHE_NAME = "storage";

            if ($(this.IE_CACHE_NAME) == null)

            {

                var div = document.createElement("DIV");

                div.id = this.IE_CACHE_NAME;

                document.body.appendChild(div);

            }

            this.store = $(this.IE_CACHE_NAME);

            this.store.style.behavior = "url('#default#userData')";

        }

    },



    /**

     * Returns the value of a cookie with the given name, or <code>null</code>

     * if no such cookie exists.

     */

    getCookie: function(aCookieName)

    {

        var result = null;

        if (_BROWSER_IS_IE && this.userDataForIE)

        {

            this.store.load(this.IE_CACHE_NAME);

            result = this.store.getAttribute(aCookieName);

        }

        else

        {

            for (var i = 0; i < document.cookie.split('; ').length; i++)

            {

                var crumb = document.cookie.split('; ')[i].split('=');

                if (crumb[0] == aCookieName && crumb[1] != null)

                {

                    result = crumb[1];

                    break;

                }

            }

        }



        if (_BROWSER_IS_OPERA && result != null)

        {

            result = result.replace(/%22/g, '"');

        }

        return result;

    },



    /**

     * Sets a cookie with the given name and value.

     */

    setCookie: function(aCookieName, aCookieValue)

    {

        if (_BROWSER_IS_IE && this.userDataForIE)

        {

            this.store.setAttribute(aCookieName, aCookieValue);

            this.store.save(this.IE_CACHE_NAME);

        }

        else

        {

            if (_BROWSER_IS_OPERA)

            {

                aCookieValue = aCookieValue.replace(/"/g, "%22");

            }

            var date = new Date();

            date.setTime(date.getTime() + (this.cookieShelfLife * 24*60*60*1000));

            var expires = '; expires=' + date.toGMTString();

            document.cookie = aCookieName + '=' + aCookieValue + expires + '; path=/';

        }

    },



    /**

     * Clears the cookie with the given name.

     */

    clearCookie: function(aCookieName)

    {

        if (_BROWSER_IS_IE && this.userDataForIE)

        {

            this.store.load(this.IE_CACHE_NAME);

            this.store.removeAttribute(aCookieName);

            this.store.save(this.IE_CACHE_NAME);

        }

        else

        {

            document.cookie =

                aCookieName + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';

        }

    }

}