<!-- HIDE FROM OLD BROWSERS
//
// Cookie Functions - "Night of the Living Cookie"
// Version (25-Jul-96)
// 
// Written by: Bill Dortch, hIdaho Design
// bdortch@hidaho.com 
// 
// The following functions are released to the
// public domain.
//
// This version takes a more aggressive approach
// to deleting cookies. Previous versions set
// the expiration date to one millisecond prior
// to the current time; however, this method did
// not work in Netscape 2.02 (though it does in
// earlier and later versions), resulting in
// "zombie" cookies that would not die.

// DeleteCookie now sets the expiration date to
// the earliest usable date (one second into
// 1970), and sets the cookie's value to null
// for good measure.
//

// Also, this version adds optional path and
// domain parameters to the DeleteCookie
// function. If you specify a path and/or
// domain when creating (setting) a cookie**,
// you must specify the same path/domain when
// deleting it, or deletion will not occur.
//

// The FixCookieDate function must now be called
// explicitly to correct for the 2.x Mac date
// bug. This function should be called *once*
// after a Date object is created and before it
// is passed (as an expiration date) to
// SetCookie. Because the Mac date bug affects
// all dates, not just those passed to
// SetCookie, you might want to make it a habit
// to call FixCookieDate any time you create a
// new Date object:
//
// var theDate = new Date();
// FixCookieDate (theDate);
//

// Calling FixCookieDate has no effect on
// platforms other than the Mac, so there is no
// need to determine the user's platform prior
// to calling it.
//

// This version also incorporates several minor
// coding improvements.
//

// **Note that it is possible to set multiple
// cookies with the same name but different
// (nested) paths. For example:
//

// SetCookie ("color","red",null,"/outer");
// SetCookie ("color","blue",null,"/outer/inner");
//

// However, GetCookie cannot distinguish between
// these and will return the first cookie that
// matches a given name. It is therefore
// recommended that you *not* use the same name
// for cookies with different paths. (Bear in
// mind that there is *always* a path associated
// with a cookie; if you don't explicitly
// specify one, the path of the setting document
// is used.)
// 

// Revision History:
//

// "Toss Your Cookies" Version (22-Mar-96)
// - Added FixCookieDate() function to
// correct for Mac date bug
//

// "Second Helping" Version (21-Jan-96)
// - Added path, domain and secure
// parameters to SetCookie
// - Replaced home-rolled encode/decode
// functions with Netscape's new (then)
// escape and unescape functions
//
// "Free Cookies" Version (December 95)
//
//
// For information on the significance of cookie
// parameters, and on cookies in general,
// please refer to the official cookie spec, at:
//
// http://www.netscape.com/newsref/std/cookie_spec.html
//
//*************************************************
//
// "Internal" function to return the decoded
// value of a cookie
//

function getCookieVal (offset) {

var endstr = 

document.cookie.indexOf (";", offset);

if (endstr == -1)

endstr = document.cookie.length;

return unescape(document.cookie.substring(offset, endstr));

}

//
// Function to correct for 2.x Mac date bug.
// Call this function to fix a date object prior
// to passing it to SetCookie. IMPORTANT: This
// function should only be called *once* for any
// given date object! See example at the end of
// this document.
//
function FixCookieDate (date) {

var base = new Date(0);

var skew = base.getTime(); // dawn of (Unix)

// time-should be 0

if (skew > 0)

// Except on the Mac - ahead of its time

date.setTime (date.getTime() - skew);

}

//
// Function to return the value of the cookie
// specified by "name".
// 
// name - String object containing the cookie
// name. 
// returns - String object containing the
// cookie value, or null if the cookie
// does not exist.
//

function GetCookie (name) {

var arg = name + "=";

var alen = arg.length;

var clen = document.cookie.length;

var i = 0;

while (i < clen) {

var j = i + alen;

if (document.cookie.substring(i, j) == arg)

return getCookieVal (j);

i = document.cookie.indexOf(" ", i) + 1;

if (i == 0) break; 

}

return null;

}

//
// Function to create or update a cookie.
// name - String object containing the cookie
// name.

// value - String object containing the cookie
// value. May contain any valid string
// characters.

// [expires] - Date object containing the
// expiration data of the cookie. If
// omitted or null, expires the cookie
// at the end of the current session.

// [path] - String object indicating the path
// for which the cookie is valid. If
// omitted or null, uses the path of
// the calling document.

// [domain] - String object indicating the
// domain for which the cookie is
// valid. If omitted or null, uses the
// domain of the calling document.

// [secure] - Boolean (true/false) value
// indicating whether cookie
// transmission requires a secure
// channel (HTTPS).
//
// The first two parameters are required. The
// others, if supplied, must be passed in the
// order listed above. To omit an unused
// optional field, use null as a place holder.
// For example, to call SetCookie using name,
// value and path, you would code:
//
// SetCookie ("myCookieName", 
// "myCookieValue", null, "/");
//
// Note that trailing omitted parameters do not
// require a placeholder.
//
// To set a secure cookie for path "/myPath",
// that expires after the current session, you
// might code:
//
// SetCookie (myCookieVar, cookieValueVar, 
//                  null, "/myPath", null, true);
//
function SetCookie (name, value, expires, path, 

domain, secure) {

document.cookie = 

name + "=" + escape (value) +

((expires) ? "; expires=" + expires.toGMTString() : "") +

((path) ? "; path=" + path : "") +

((domain) ? "; domain=" + domain : "") +

((secure) ? "; secure" : "");

}

// Function to delete a cookie. (Sets expiration
// date to start of epoch)
// name - String object containing the
// cookie name 
// path - String object containing the path
// of the cookie to delete. This
// MUST be the same as the path used
// to create the cookie, or
// null/omitted if no path was
// specified when creating the
// cookie. 
// domain - String object containing the
// domain of the cookie to delete.
// This MUST be the same as the
// domain used to create the cookie,
// or null/omitted if no domain was
// specified when creating the
// cookie.
//

function DeleteCookie (name,path,domain) {

if (GetCookie(name)) {

document.cookie = name + "=" +

((path) ? "; path=" + path : "") +

((domain) ? "; domain=" + domain : "") +

"; expires=Thu, 01-Jan-70 00:00:01 GMT";

}

}

 

//
// Local variables and functions
//
// global variable to count the number of to do
// cookies set. 


var numberOfCookies = 0

// A document onLoad event handler to obtain the
// number of cookies in the to do list and load
// the selection list with their values.


//

function getNumberOfCookies() {

numberOfCookies = GetCookie("todoNumber")

// Load the selection list if necessary.

if (numberOfCookies > 0 ) {

var select = document.todoForm.items.options

for (var i = 0; i <= numberOfCookies; i++) {

var value = GetCookie("todo" + i)

select[select.length] = 

new Option(unescape(value),"",false,false)

}

}

}

// Add a to do item to the list.
//
function addToDoCookie(theForm) {

if (theForm.item.value.length <= 0) {

alert("Please enter a new item.")

return false

} else {

var expdate = new Date();

var select = document.todoForm.items.options

// Fix the date and set the cookies to expire
// 24 hours from now.

FixCookieDate(expdate)

expdate.setTime(expdate.getTime() + 

(24 * 60 * 60 * 1000))

// Set the cookies

SetCookie("todo" + numberOfCookies, 

theForm.item.value, expdate)

SetCookie("todoNumber",numberOfCookies,expdate)

numberOfCookies++

// Add the item to the selection list

select[select.length] = 

new Option(theForm.item.value,"",false,false)

return true

}

}

// STOP HIDING -->

 
