//
//  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
//                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";
      }
}
