// JavaScript cookie handling
// Based on example from Apple Inc,
// http://developer.apple.com/internet/safari/faq.html


var defaultPath = "/";

/***********************/
/* Implementation part */
/***********************/

function listCookies()
{
    return document.cookie.split("; ");
}

function setCookie(name, value, expires, path, domain, secure, dontEscape) 
{ 
    path = (path) ? path : ((defaultPath) ? defaultPath : null);
    var curCookie = name + "=" + (dontEscape ? value : escape(value)) + 
        ((expires) ? "; expires=" + expires.toGMTString() : "") + 
        ((path)    ? "; path="    + path                  : "") + 
        ((domain)  ? "; domain="  + domain                : "") + 
        ((secure)  ? "; secure"                           : ""); 
    document.cookie = curCookie; 
}

function getCookie(name, defaultValue)
{
    if (document.cookie.length > 0)
    {
        var cookieName = name.toString() + "=";
        if (document.cookie.indexOf(cookieName) != -1) 
        {
            var cookies = listCookies();
            for (var cookie=0; cookie<cookies.length; cookie++)
            {
                if (cookies[cookie].indexOf(cookieName) === 0) 
                {
                    return cookies[cookie].substr(cookieName.length, cookies[cookie].length);
                }
            }
        }
    }
    return defaultValue;
}

function clearCookie(name)
{
    var d = new Date();
    setCookie(name, "", new Date(d.getTime()+(-24*60*60*1000)));
}

function setMultiValue(name, attribute, value, expires, path, domain, secure)
{
    var cookie = getCookie(name);
    if (cookie) 
    {
        var attrs = cookie.split("&");
        for (var i = 0; i < attrs.length; i++)
        {
            var thisCookie = attrs[i].split("=", 2);
            if (thisCookie[0] == attribute)
            {
                if (value)
                {
                    thisCookie[1] = escape(value);
                    attrs[i] = thisCookie.join("=");
                }
                else
                {
                    attrs.splice(i, 1);
                }
                return setCookie(name, attrs.join("&"), expires, path, domain, secure, true);
            }
        }
        // not found so far
        cookie += "&";
    }
    else
    {
        cookie = "";
    }
    
    setCookie(name, cookie+attribute+"="+escape(value), expires, path, domain, secure, true);
}

function getMultiValue(name, attribute, defaultValue)
{
    var cookie = getCookie(name);
    if (cookie)
    {
        var attrs = cookie.split("&");
        for (var i = 0; i < attrs.length; i++)
        {
            var thisCookie = attrs[i];
            if (thisCookie.indexOf("=") === -1)
            {
                return;
            }
            thisCookie = thisCookie.split("=", 2);
            if (thisCookie[0] == attribute) 
            {
                return unescape(thisCookie[1]);
            }
        }
        return defaultValue;
    }
}

function clearMultiValue(name, attribute)
{
    setMultiValue(name, attribute);
}

function isValueMultiValue(value)
{
    if (value)
    {
        return value.toString().indexOf("&") >= 0;
    }
    return false;
}

function isMultiValue(name)
{
    var value = getCookie(name);
    return isValueMultiValue(value);
}

function listMultiValue(name)
{
    var value = getCookie(name);
    var values = value.split("&");
    var names = Array();
    for (var i = 0; i < values.length; i++)
    {
        names.push( values[i].split("=")[0] );
    }
    return names;
}

function testCookies() 
{ 
    var exp = new Date(); 
    exp.setTime(exp.getTime() + 1800000); 
    // first write a test cookie 
    setCookie("cookies", "cookies", exp, false, false, false); 
    var res = document.cookie.indexOf('cookies') != -1;
    // now delete the test cookie 
    exp = new Date(); 
    exp.setTime(exp.getTime() - 1800000); 
    setCookie("cookies", "cookies", exp, false, false, false); 

    return res;
}


