// cookies.js: Cookie support in Javascript
// ----------------------------------------

// Versioning
// [KK 2010-07-27] 1.00 First version

/* Synopsis

   Array cookie_names()
   Purpose: returns all cookies for this domain
   Example:
       var names = cookie_names();
       for (var i = 0; i < names[i]; i++)
           // do something with cookie names[i]

   [void] cookie_set(name, value, expires, path, domain, secure)
   Purpose: Sets a cookie with a given name/value. All other arguments
   	    may be null. When given:
	    expires - expiry time in the future (in days from now)
	    path - applicable path, '/' is a good choice
	    domain - specific domain, default is the current domain
	    secure - cookie should only be passed with https, not with http
   Example:
       cookie_set('mycookie', 'myvalue');
	    
   [string] cookie_get(name)
   Purpose: Returns the value of the named cookie, or null.
   Example:
       var val = cookie_get('mycookie');

   [void] cookie_delete(name)
   Purpose: Deletes the named cookie (if it's there).
   Example:
       cookie_delete('mycookie');

   [void] cookies_delete(blacklist)
   Purpose: Deletes all cookies in the given blacklist array. The
   	    array is optional, if absent, all cookies are killed.
   Example:
      cookies_delete(new Array('first', 'second'));   // delete given 2
      cookies_delete();                               // delete all

   [void] cookies_delete_except(whitelist)
   Purpose: Deletes all cookies except when they are in the whitelist.
   	    When the whitelist is absent, then nothing happens.
   Example:
       cookies_delete_except(new Array('first', 'second'));
   
End of synopsis. */

// Get the available cookies as an array.
function cookie_names() {
    var ret = new Array();
    var cookies = document.cookie;
    while (true) {
	var len = cookies.indexOf('=');
	if (len <= 0)
	    break;
	ret.push(cookies.substring(0, len));
	var end = cookies.indexOf(';');
	if (end <= 0)
	    break;
	end++;
	cookies = cookies.substring(end);
	if (cookies.substring(0, 1) == ' ')
	    cookies = cookies.substring(1);
    }
    return ret;
}

	    
// Set a cookie with a given expiry, path, domain, secure value.
function cookie_set(name, value, expires, path, domain, secure) { 
    var today = new Date();
    today.setTime(today.getTime());

    if (expires)
        expires = expires * 1000 * 60 * 60 * 24;

    var expires_date = new Date(today.getTime() + (expires));
    var str = name + "=" + escape(value) +
        ((expires) ? ";expires=" + expires_date.toGMTString() : "") + 
        ((path)    ? ";path=" + path : "") + 
        ((domain)  ? ";domain=" + domain : "") +
        ((secure)  ? ";secure" : "");
    document.cookie = str;
}

// Get the value of a given cookie.
function cookie_get(name) {
    var start = document.cookie.indexOf(name + "=");
    var len = start + name.length + 1;
    if ((! start) &&
        (name != document.cookie.substring (0, name.length)))
        return null;

    if (start == -1)
        return null;
    
    var end = document.cookie.indexOf(";", len);
    if (end == -1)
        end = document.cookie.length;
    return (unescape (document.cookie.substring (len, end)));
}

// Delete a given cookie.
function cookie_delete(name) {
    cookie_set(name, '', -10, '/');
}

// Delete all cookies in a given blacklist
function cookies_delete(blacklist) {
    var cookies = cookie_names();
    if (!blacklist || !blacklist.length) {
        for (var i = 0; i < cookies.length; i++)
	    cookie_delete(cookies[i]);
    } else {
        for (var i = 0; i < cookies.length; i++) {
		var found = false;
		for (var j = 0; j < blacklist.length; j++)
		    if (cookies[i] == blacklist[j]) {
			found = true;
			break;
		    }
	    if (found)
		cookie_delete(cookies[i]);
	}
    }
}
// Delete all cookies except for a given few.
function cookies_delete_except(whitelist) {
    var cookies = cookie_names();
    for (var i = 0; i < cookies.length; i++) {
	var found = false;
	for (var j = 0; j < whitelist.length; j++)
	    if (cookies[i] == whitelist[j]) {
		found = true;
		break;
	    }
	if (!found)
	    cookie_delete(cookies[i]);
    }
}

   

