/*
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
www.paulspages.co.uk
(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.
*/

/* Sample Usage
-----------------------------------------------------------------------------------
userCookie = new cookieObject("userdata", 365, null, "name", "date")
// executing new cookieObject automatically executes the object's read() method
if (userCookie.found) {
    document.write('Hi there '+userCookie.get("name")+
         ', you last visited us on '+ userCookie.get("date")+'')
} else {
    userCookie.put("name", prompt("Please type your name here: "))
    document.write('Welcome, '+ userCookie.get("name")+'!')
}
vdate = new Date()
userCookie.put ("date",  vdate.toGMTString())
userCookie.write()
-----------------------------------------------------------------------------------
*/

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) {
    for (var i = 0; i < this.fieldnames.length; i++) {
        if (fieldname == this.fieldnames[i]) {
            return i;
        }
    }
    return -1;
}

function ucWrite() {      
    var cookietext = this.name + "=";
    // 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]);
    } else { // multi-field cookie
        for (var i= 0; i < this.fields.length; i++) {
            cookietext += escape(this.fields[i]) + this.fieldSeparator;
        }
    }
    // 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;
    }
    // write cookie
    // alert("writing "+cookietext)
    document.cookie = 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();
}

