//
// Cookie Utility Class
//
// Copyright (c) 2003 redbackDVD P/L.
// This file and its contents are protected by copyright law.
// It is illegal to copy, share, or reuse this file or portions of this
// file for any other purpose than accessing redbackdvd's web site.

//
// Cookie constructor
//
// Arguments:
//	document:	the document object for which the cookie is stored. Required.
//	name	:	a string that specifies a name for the cookie
//	hours	:	an optional number that specifies the number of hours
//				from now the cookie should expire.
//	path	:	an optional string that specifies the cookie path attribute.
//	domain	:	an optional string that specifies the cookie domain attribute.
//	secure	:	an optional boolean value that, if true, requests a secure cookie.
//
function Cookie (document, name, hours, path, domain, secure)
{
	// all the predefined properties of this object begin with '$'
	// to distinguish them from other properties whihc are the values
	// to be stored in the cookie
	this.$document = document;
	this.$name = name;
	this.$expiration = (hours) ? new Date((new Date()).getTime() + hours*3600000) : null;
	this.$path = (path) ? path : null;
	this.$domain = (domain) ? domain : null;
	this.$secure = (secure) ? true : false;
}


Cookie.prototype.store = function () {
	// First, loop through the properties of the Cookie object and
	// put together the value of the cookies. Since cookies use the
	// equals sign and semicolons as separators, we'll use colons
	// and ampersands for the individual state variables we store
	// within a single cookie value. Note that we escape the value of
	// each state variable, in case it contains punctuation or other
	// illegal characters.
	var cookieval = '';
	for (var prop in this) {
		// ignore the properties with names that begin with '$' and also methods
		if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function'))
			continue;
		if (cookieval != '') cookieval += '&';
		cookieval += prop + '=' + this[prop]; //escape(this[prop]);
	}

	// Now that we have the value of the cookie, put together the
	// complete cookie string, which includes the name and the various
	// attributes specified when the cookie object was created
	var cookie = this.$name + '=' + cookieval;
	if (this.$expiration)
		cookie += '; expires=' + this.$expiration.toGMTString();
	if (this.$path)
		cookie += '; path=' + this.$path;
	if (this.$domain)
		cookie += '; domain=' + this.$domain;
	if (this.$secure)
		cookie += '; secure';	

	// Now store the cookie by setting the magic Document.cookie property
	this.$document.cookie = cookie;
}


Cookie.prototype.load = function () {
	// first get a list of all cookies that pertain to this document
	var allcookies = this.$document.cookie;
	if (allcookies == '') return false;
	// now extract just the named cookie from that list
	var start = allcookies.indexOf (this.$name + '=');
	if (start == -1) return false; // cookie not defined for this page
	start += this.$name.length + 1; // skip name and equals sign
	var end = allcookies.indexOf (';', start);
	if (end == -1) end = allcookies.length;
	var cookieval = allcookies.substring (start, end);
	
	// now that we've extracted the value of the named cookie, we must
	// break the value down into individual state variable names and values.
	// The name/value pairs are separated from each other by ampersands, and the
	// individual names and values are separated from each other by '='.
	// We use the split() method to parse everything.
	var a = cookieval.split ('&');	// break it into an array of name/value pairs
	for (var i=0; i<a.length; ++i)	// break each pair into an array
		a[i] = a[i].split ('=');
	
	// now that we've parsed the cookie value, set all the names and values of the
	// state variables in this cookie object. Note that we unescape() the
	// property value, because we called escape() when we stored it.
	for (var i=0; i<a.length; ++i) {
		this[a[i][0]] = a[i][1]; //unescape(a[i][1]);
	}
	
	// we're done, so return the success code
	return true;
}
