/**
 * A cookie object for the specified document, 
 * with a specified name and optional attributes.
 * Note: 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.	<br>
 * load() refers from getting the cookie data from the browser into the cookie object <br>
 * store() refers to storing the data in the cookie object to the browser's cookie file. <br>
 * A future version of this might add a put() and get() methods to put the data into the
 * cookie object and get the data out of the object. <br>
 * [Your object] --- put() ---&gt; [Cookie object] --- store() ---&gt; [Cookie itself] <br>
 * [Your object] &lt;--- get() --- [Cookie object] &lt;--- load() --- [Cookie itself] <br>
 *
 *
 * Arguments:
 *  @argument document The Document object that the cookie is stored for. Required.
 *  @argument name     A string that specifies a name for the cookie. Required.
 *  @argument hours    An optional number that specifies the number of hours from now
 *            that the cookie should expire.
 *  @argument path     An optional string that specifies the cookie path attribute.
 *  @argument domain   An optional string that specifies the cookie domain attribute.
 *  @argument secure   An optional Boolean value that, if true, requests a secure cookie.
 */
function Cookie(document, name, hours, path, domain, secure) {


	/**
	 * The document to which the cookie pertains
	 */ 
    this._document = document;

	/**
	 * The name given to this cookie
	 */ 
    this._name = name;

    if (hours) {
		/**
		 * The expiration period for this cookie stated in hours
	 	 */ 
        this._expiration = new Date((new Date()).getTime() + hours*3600000);
    } else {
    	this._expiration = null;
    }

    if (path) { 
		/**
		 * The path to which this cookie pertains
	 	 */ 
    	this._path = path; 
    } else {
    	this._path = null;
    }

    if (domain) {
		/**
		 * The domain to which this cookie pertains
	 	 */ 
    	this._domain = domain; 
    } else {
    	this._domain = null;
    }

    if (secure) {
		/**
		 * Where this is a secure (encrypted) cookie
	 	 */ 
    	this._secure = true; 
    } else {
    	this._secure = false;
	}

	/**
	 * Whether to use "escaped" values (boolean)
	 */
	this._useEscaped = true;


}



/**
 * Store the properties of the cookie
 */ 
Cookie.prototype.store = function() {

    // 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 += '&';
		if (this._useEscaped) {
        	cookieval += prop + ':' + escape(this[prop]);
        } else {
        	cookieval += prop + ':' + 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 (typeof allCookieCount != "undefined") {
		if (allCookieCount != null) {
			allCookieCount += cookie.length;
		}
	}

	// alert(cookie);


    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';

	// temporary warning
	/*
	if ( cookie.length > 4000 ) {
		var warn = "Warning: The " + this._name + " cookie contains " + cookie.length + " bytes.  Data will not be saved.";
		alert(warn);	
	} else if ( cookie.length > 2000 ) {
		warn = "Information: The " + this._name + " cookie contains " + cookie.length + " bytes.";
		alert(warn);	

	} 
	*/
	

    // Now store the cookie by setting the magic Document.cookie property.
    this._document.cookie = cookie;

}



/**
 * Load the values of this cookie
 */ 
Cookie.prototype.load = function() {

	// debugger;

    // 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 (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'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.

    // Break it into array of pieces
    var a2 = cookieval.split('&');    
    // actual number of items
    var l2 = a2.length / 2;
	// actual items
	var a = new Array();
    for (var i=0;i < l2; i++) {
    	 // places pieces into an array.
        a[i] = [ a2[i*2], a2[i*2+1] ];
	}

    // 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.
    if (this._useEscaped) {
		for (var i = 0; i < a.length; i++) {
			this[a[i][0]] = unescape(a[i][1]);
		}
    } else {
		for (var i = 0; i < a.length; i++) {
			this[a[i][0]] = a[i][1];
		}
    }


    // We're done, so return the success code.
    return true;
}



/**
 * Remove the contents of this cookie.
 */ 
Cookie.prototype.remove = function() {

    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;

}

//===================================================================
//  The code above is the definition of the Cookie class.
//===================================================================
