/**
 *	The constructor function: creates a cookie object for the specified
 *	document, with a specified name and optional attributes.
 *
 *	20 cookies can be stored per domain
 *	With ? K per cookie.
 *
 *	On a page one cookie object would be created per need
 *	Usage:
 *	
 *	To store a cookie with values:
 *		var userCookie = new Cookie(document, "formVals", 0);
 *		userCookie.e_name = someForm.someField0.value;		
 *		userCookie.e_type = someForm.someField1.value;		
 *		// ... et cetera.
 *		userCookie.store()
 *	
 *	To retreive info from a cookie:
 *		var userCookie = new Cookie(document, someName, 0);
 *		// where someName is a String, telling the object which kind of cookie
 *		// to look for.		
 *		// load will return true or false depending on whether or not there
 *		// are values to return.
 *		if ( userCookie.load() )
 *		alert(userCookie.e_name)
 *		alert(userCookie.e_type)
 *		// or do something completely different.
 *	
 *	To clean a cookie of the values you'd put in
 *		( This could be done, for instance, as soon as the values have been
 *		extracted. )
 *		var userCookie = new Cookie(document, someName, 0);
 *		userCookie.remove();	
 *
 *	@package	documentation.presentation.javascriptdoc
 *	@declare	public final class
 *	@param	document	HTMLElementObject	The Document object that the cookie is stored for. Required.
 *	@param	name	String	Specifies a name for the cookie. Required.
 *	@param	hours	Integer	Specifies the number of hours from now
 *		that the cookie should expire. Optional.
 *	@param	path	String	Specifies the cookie path attribute. Optional.
 *	@param	domain	String	Specifies the cookie domain attribute. Optional.
 *	@param	secure	Boolean	An optional Boolean value that, if true, requests 
 *		a secure cookie.
 */
function Cookie( document, name, hours, path, domain, secure )
{

	//-------------------------------------------------------------------------
	// VARIABLES
    // All the predefined properties of this object begin with '$'
    // to distinguish them from other properties which are the values to
    // be stored in the cookie.

	/**
	 *	The Document object that the cookie is stored for. Required.
	 *
	 *	@declare	private
	 *	@typez	HTMLDocumentObject
	 */
	 
    this.$document = document;


	/**
	 *	A string that specifies a name for the cookie. Required.
	 *
	 *	@declare	private
	 *	@type	HTMLDocumentObject
	 */

    this.$name = name;


	/**
	 *	An optional number that specifies the number of hours from now
	 *   	that the cookie should expire.
	 *
	 *	@declare	private
	 *	@type	TimeObject
	 */

	this.$expiration = null;

    if ( hours )
	{
		this.$expiration = new Date((new Date()).getTime() + hours*3600000);
	}
	

	/**
	 *	An optional string that specifies the cookie path attribute.
	 *
	 *	@declare	private
	 *	@type	String
	 */

	this.$path = null;

    if ( path )
	{
		this.$path = path;
	}

	
	/**
	 *	An optional string that specifies the cookie domain attribute.
	 *
	 *	@declare	private
	 *	@type	String
	 */
	 
	this.$domain = null;
    if ( domain )
	{
		this.$domain = domain;
	}


	/**
	 *	An optional Boolean value that, if true, requests a secure cookie.
	 *
	 *	@declare	private
	 *	@type	Boolean
	 */

	this.$secure = false;

	if ( secure )
	{
		this.$secure = true;
	}
		

	//-------------------------------------------------------------------------
	// JAVASCRIPT METHOD DECLARATIONS
	this.store = store;
	this.load = load;
	this.remove = remove;
	
	//-------------------------------------------------------------------------
	// METHODS
	/**
	 *	This function is the store() method of the Cookie object.
	 *
	 *	@declare	public
	 */

	function store()
	{
		// First, loop through the properties of the Cookie object and
		// put together the value of the cookie. 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 properties with names that begin with '$' and also methods.
			if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function'))
			{
				continue;
			}
			if (cookieval != "")
			{
				cookieval += '&';
			}
			cookieval += 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;
	}


	/**
	 *	Gets the attributes that have been stored in a particular cookie. And
	 *	makes them attributes of this cookie object so that they can be 
	 *	retreived by the user.
	 *
	 *	@declare	public
	 *	@returns	Boolean	Whether or not anything has been loaded or not.
	 */

	function load()
	{
		var returnVal = false;
	
	    // First, get a list of all cookies that pertain to this document.
	    // We do this by reading the magic Document.cookie property.
	    var allcookies = this.$document.cookie;

		// if there is nothing in the cookie there is nothing to return
	    if (allcookies != "") 
		{	
			// Now extract just the named cookie from that list.	
			var start = allcookies.indexOf(this.$name + '=');

			// this checks to make sure that there is actually the specific
			// cookie that we want. -1 means the name was not found in the cookie
			if (start != -1)
			{
				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've
				// got to break that 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 colons. We use the split method
				// to parse everything.
				var a = cookieval.split('&');    // Break it into 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]] = unescape(a[i][1]);
				}

			    // We're done, so return the success code.
			    returnVal = true;
			}
		}		
		return returnVal
	}
	
	/**
	 *	This function is the remove() method of the Cookie object.
	 *
	 *	@declare	public
	 */

	function remove()
	{
		var cookie;
		cookie = this.$name + '=';

		if (this.$path)
		{
			cookie += '; path=' + this.$path;
		}

		if (this.$domain)
		{
			cookie += '; domain=' + this.$domain;
		}

		cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT';

		this.$document.cookie = cookie;
	}
}


