
/*

DISCLAIMER: THESE JAVASCRIPT FUNCTIONS ARE SUPPLIED 'AS IS', WITH 
NO WARRANTY EXPRESSED OR IMPLIED. YOU USE THEM AT YOUR OWN RISK. 
PAUL STEPHENS DOES NOT ACCEPT ANY LIABILITY FOR 
ANY LOSS OR DAMAGE RESULTING FROM THEIR USE, HOWEVER CAUSED. 

Paul Stephens' cookie-handling object library

Version 2.1
2.0 - Introduces field names
2.1 - Fixes bug where undefined embedded fields[] elements weren't written to disk

www.paulspages.co.uk 

TO USE THIS LIBRARY, INSERT ITS CONTENTS IN THE <HEAD> SECTION 
OF YOUR WEB PAGE SOURCE, BEFORE ANY OTHER JAVASCRIPT ROUTINES.

(C) Paul Stephens, 2001-2003. Feel free to use this code, but please leave this comment block in. This code must not be sold, either alone or as part of an application, without the consent of the author.

*/

var cookieMax = 4000; // individual cookies cannot be longer than 4K on most browsers (limited to 4000 for safety)


function cookieObject(name, expires, accessPath) {
var i, j
this.name = name
this.fieldSeparator = "#"
this.found = false
this.expires = expires
this.accessPath = accessPath
this.rawValue = ""
this.fields = new Array()
this.fieldnames = new Array() 
if (arguments.length > 3) { // field name(s) specified
  j = 0
  for (i = 3; i < arguments.length; i++) {
    this.fieldnames[j] = arguments[i]    
    j++
  }
  this.fields.length = this.fieldnames.length 
}
this.read = ucRead

this.write = ucWrite

this.remove = ucDelete
this.get = ucFieldGet
this.put = ucFieldPut
this.namepos = ucNamePos
this.read()
}


function ucFieldGet(fieldname) {
var i = this.namepos(fieldname)
if (i >=0) {
  return this.fields[i]
} else {
  return "BadFieldName!"
}
}

function ucFieldPut (fieldname, fieldval) {
var i = this.namepos(fieldname)
if (i >=0) {
  this.fields[i] = fieldval
  return true
} else {
  return false
}
}

function ucNamePos(fieldname) {
var i 
for (i = 0; i < this.fieldnames.length; i++) {
  if (fieldname == this.fieldnames[i]) {
    return i
  }
}
return -1
}

/*

	This function has been modified so that it will not write a Cookie String that is longer than 'cookieMax'.
	It does this by throwing away the oldest Array entries if necessary.
	This modification is specifically for it's usage as a BreadCrumb Holder.

*/

function ucWrite() {      
  var cookietext = "";
	var max = cookieMax - (this.name.length + 1);

	// Set expiry parameter, if specified
	if (this.expires != null) {  
		if (typeof(this.expires) == "number") { // Expiry period in days specified  
			var today=new Date();
			var expiredate = new Date();
			expiredate.setTime(today.getTime() + 1000*60*60*24*this.expires);
			cookietext += "; expires=" + expiredate.toGMTString();
		} else { // assume it's a date object
			cookietext +=  "; expires=" + this.expires.toGMTString();
		} // end of typeof(this.expires) if
	} // end of this.expires != null if 
   
	// add path, if specified
	if (this.accessPath != null) {
   	cookietext += "; PATH="+this.accessPath;
	}

	// concatenate array elements into cookie string

	// Special case - single-field cookie, so write without # terminator
	if (this.fields.length == 1) {
  	cookietext = escape(this.fields[0]) + cookietext;
 	} else { // multi-field cookie
    for (i= this.fields.length -1; i > -1; i--) { // work backwards through the Array
    	var newitem = escape(this.fields[i]) + this.fieldSeparator; // the next item
    	if (cookietext.length + newitem.length < max) { // make sure the cookie does not get too big
    		cookietext = newitem + cookietext;
    	} else {
    		break; // ignore the rest of the Array Items, loose the oldest ones
    	}
    }
  }

	// write the cookie
	// alert("writing " + cookietext);
	document.cookie = this.name + "=" + cookietext;
	return null;
}


function ucRead() {
  var search = this.name + "="                       
  var CookieString = document.cookie            
  this.rawValue = null
  this.found = false     
  if (CookieString.length > 0) {                
    offset = CookieString.indexOf(search)       
    if (offset != -1) {                         
      offset += search.length                   
      end = CookieString.indexOf(";", offset)   
      if (end == -1) {  // cookie is last item in the string, so no terminator                        
       end = CookieString.length }              
      this.rawValue = CookieString.substring(offset, end)                                   
      this.found = true 
      } 
    }
   
if (this.rawValue != null) { // unpack into fields

  var sl = this.rawValue.length
  var startidx = 0
  var endidx = 0
  var i = 0

// Special case - single-field cookies written by other functions,
// so without a '#' terminator

if (this.rawValue.substr(sl-1, 1) != this.fieldSeparator) {
  this.fields[0] = unescape(this.rawValue)
  } else { // separate fields

  do  
  {
   endidx = this.rawValue.indexOf(this.fieldSeparator, startidx)
   if (endidx !=-1) {
     this.fields[i] = unescape(this.rawValue.substring(startidx, endidx))
     i++
     startidx = endidx + 1}
  }
  while (endidx !=-1 & endidx != (this.rawValue.length -1));
}
} // end of unpack into fields if block
  return this.found
} // end of function


function ucDelete() {
  this.expires = -10
  this.write()
  return this.read()
}

