//
    //   loadFormDataFromCookie(formName)
    //
    //   Loads form data from a cookie value that is the same as the form's name.
    //
    //   Parameters:
    //       Required:  formName -- the name of the form (e.g. <form name="formName">).
    //
    function loadFormDataFromCookie(formName) {

        var boolDebug = false;

	form = document.forms[formName];
	if (typeof form  == "undefined") {
	    return(true);
	}

        var cookie = document.cookie;
	if (boolDebug) {
	    alert("Cookie = " + document.cookie);
	}
	var cookieStart = cookie.indexOf(formName);
	if (cookieStart < 0) {
	    return(true);
	}
	cookieStart += formName.length + 1;
	var cookieEnd = cookie.indexOf(";", cookieStart);
	if (cookieEnd < cookieStart) {
	    cookieEnd = cookie.length;
	}
	var cookieValue = unescape(cookie.substring(cookieStart, cookieEnd));
	var semiColonLoc = -1;
	var nextSemiColonLoc = cookieValue.indexOf(";");
	var cookieFields = "";
	while (nextSemiColonLoc > 0) {
	    var equalsLoc = cookieValue.indexOf("=", semiColonLoc);
	    var name = cookieValue.substring(semiColonLoc + 1, equalsLoc);
	    var value = unescape(cookieValue.substring(equalsLoc + 1, nextSemiColonLoc));
	    if (typeof form[name] != "undefined") {		
		//  Text or TextArea
		if ((form[name].type == "text") || (form[name].type == "textarea")) {
	            form[name].value = value;
		}
		//  Select-One
		else if (form[name].type == "select-one") {
		    var singleSelect = form[name];
		    for (k = 0; (k < singleSelect.length); k++) {
			if (singleSelect.options[k].value == value) {
			    singleSelect.options[k].selected = true;
			}
		    }
		}
		//  Select-Multiple
		else if (form[name].type == "select-multiple") {
		    var multiSelect = form[name];
		    for (k = 0; (k < multiSelect.length); k++) {
			if (multiSelect.options[k].value == value) {
			    multiSelect.options[k].selected = true;
			}
		    }	            
		}
		//  Checkbox or Radio
		else if (typeof form[name].length != "undefined") {
		    var nodeList = form[name];
		    for (k = 0; (k < nodeList.length); k++) {
			if (nodeList[k].value == value) {
		   	    nodeList[k].checked = true;
			}
		    }
		}
		//  Unhandled type -- ignore hidden input types
		else if (form[name].type != "hidden") {
		    alert ("Name = " + name + "   Type = " + form[name].type + "   typeof = " + typeof form[name] + "   Value = " + form[name]);
		}
	    }
	    cookieFields += "\n" + name + " : " + value;
	    semiColonLoc = nextSemiColonLoc;
	    nextSemiColonLoc = cookieValue.indexOf(";", semiColonLoc + 1);
	}
	if (boolDebug) {
	    alert("cookieFields = " + cookieFields);
	}
	
	return(true);
    }


    //
    //   persistFormDataInCookie(formObject 
    //       [,timeToLive:number, timeToLiveUnit:Minutes|Hours|Days,
    //         include:field1,field2,... | exclude:field1,field2,...])
    //
    //   Writes form data to a session cookie.
    //
    //   Parameters:
    //       Required:  formObject -- e.g.: <form onSubmit="return(persistFormDataInCookie(this))">
    //       Optional:  String, timeToLive:number  --  by default the number is minutes (see: timeToLiveUnit)
    //			String, timeToLiveUnit:Seconds|Minutes|Hours|Months|Years
    //			String, comma seperated field names (no spaces) prefixed with 
    //			"include:" or "exclude:".
    //			When "include:" is the prefix, only the listed named field's values will be stored.
    //			When "exclude:" is the prefix, the listed named field's values will not be stored.
    //			When the optional parameter is omitted, all named field values are stored. 
    //
    function persistFormDataInCookie(formObj) {

        var boolDebug = false;
	var cookieValue = "";
        var includeFields = null;
        var excludeFields = null;
	//var timeToLive = 0; 
var timeToLive = 1; 
	//var timeToLiveMultiplier = 60000; // Default to Minutes
var timeToLiveMultiplier = 2592000000; // Default to months
	if (arguments.length > 1) {
	    for (i = 1; (i < arguments.length); i++) {
		if (typeof arguments[i] != "string") {
		    continue;
		}
		var colonLoc = arguments[i].indexOf(":");
		if (colonLoc > 0) {
		    var paramName = arguments[i].substring(0,colonLoc);
		    var paramValue = arguments[i].substring(colonLoc + 1);
		    if ((paramName.toLowerCase() == "include") && (excludeFields == null)) {
			includeFields = paramValue.split(",");
		    }
		    else if ((paramName.toLowerCase() == "exclude") && (includeFields == null)) {
			excludeFields = paramValue.split(",");
		    }
		    else if (paramName.toLowerCase() == "timetolive") {
			try {
			    timeToLive = paramValue * 1;
			}
			catch (error) {
			    timeToLive = 0;
			}
		    }
		    else if ((paramName.toLowerCase() == "timetoliveunit") || (paramName.toLowerCase() == "timetoliveunits")) {
			if ((paramValue.toLowerCase() == "second") || (paramValue.toLowerCase() == "seconds")) {
			    timeToLiveMultiplier = 1000;
			}
			else if ((paramValue.toLowerCase() == "minute") || (paramValue.toLowerCase() == "minutes")) {
			    timeToLiveMultiplier = 60000;
			}
			else if ((paramValue.toLowerCase() == "hour") || (paramValue.toLowerCase() == "hours")) {
			    timeToLiveMultiplier = 3600000;
			}
			else if ((paramValue.toLowerCase() == "day") || (paramValue.toLowerCase() == "days")) {
			    timeToLiveMultiplier = 86400000;
			}
			else if ((paramValue.toLowerCase() == "month") || (paramValue.toLowerCase() == "months")) {
			    timeToLiveMultiplier = 2592000000;
			}
			else if ((paramValue.toLowerCase() == "year") || (paramValue.toLowerCase() == "years")) {
			    timeToLiveMultiplier = 31536000000;
			}
		    }
		}
	    } 
	}
	if (boolDebug) {
	    alert ("Time to Live = " + timeToLive + "\nTime to Live Multiplier = " + timeToLiveMultiplier +
		   "\nExclude Fields = " + excludeFields + "\nInclude Fields = " + includeFields);
	}
        for (j = 0; (j < formObj.elements['length']); j++) {
	    var fieldName = "";
	    var fieldValue = ""; 
	    if ((formObj.elements[j].type != "submit") && 
		(formObj.elements[j].type != "reset")) {
		//  Text or TextArea
		if ((formObj.elements[j].type == "text") || (formObj.elements[j].type == "textarea")) {
		    cookieValue += addToCookieValue(formObj.elements[j].name, fieldValue = formObj.elements[j].value, includeFields, excludeFields);
		}
		// Select-One
		else if (formObj.elements[j].type == "select-one") {
		    var singleSelect = formObj.elements[j];
		    for (k = 0; (k < singleSelect.length); k++) {
			if (singleSelect.options[k].selected == true) {
			    cookieValue += addToCookieValue(singleSelect.name, singleSelect.options[k].value, includeFields, excludeFields);
			    break;
			}
		    }
		}
		//  Select-Multiple
		else if (formObj.elements[j].type == "select-multiple") {
		    var multiSelect = formObj.elements[j];
		    for (k = 0; (k < multiSelect.length); k++) {
			if (multiSelect.options[k].selected == true) {
			    cookieValue += addToCookieValue(multiSelect.name, multiSelect.options[k].value, includeFields, excludeFields);
			}
		    }	            
		}
		//  Checkbox or Radio
		else if ((formObj.elements[j].type == "checkbox") || (formObj.elements[j].type == "radio")) {
		    if (formObj.elements[j].checked == true) {
			 cookieValue += addToCookieValue(formObj.elements[j].name, fieldValue = formObj.elements[j].value, includeFields, excludeFields);
		    }
		}
		//  Unhandled type -- ignore hidden input types
		else {
		    if (formObj.elements[j].type != "hidden") {
			alert("Name = " + formObj.elements[j].name + "   Type = " + formObj.elements[j].type + "   typeof = " + typeof formObj.elements[j]);
		    }
		}
	    }

        }	

	var expirationDate = null;
        try {
	    if (timeToLive > 0) {
		var timeInMilliseconds = new Date().getTime();
		timeInMilliseconds += (timeToLive * timeToLiveMultiplier);
		expirationDate = new Date(timeInMilliseconds);
	    }
	}
	catch (error) {}

        if (boolDebug) {
	    if (expirationDate == null) {
	        alert("cookieName = " + formObj.name + "\ncookieValue = " + cookieValue + "\npath = /");
	    }
	    else {
	        alert("cookieName = " + formObj.name + "\ncookieValue = " + cookieValue + "\npath = /" + "\nexpires = " + expirationDate.toGMTString());
	    }
	}

	if (expirationDate == null) {
	    document.cookie = formObj.name + "=" + escape(cookieValue) + "; path=/";
	}
	else {
	    document.cookie = formObj.name + "=" + escape(cookieValue) + "; path=/; expires=" + expirationDate.toGMTString();
	} 
        
	return(true);
    }


    //
    //   addToCookieValue(fieldName, fieldVaue, includeFields, excludeFields) {
    //
    //   Returns a string in the format "fieldName=escaped(fieldValue)" 
    //   or "" if the include/exclude rules require that that field be excluded.
    //
    //
    //   Parameters:
    //       Required:  fieldName     -- name of field
    //       		fieldValue    -- value of the named field
    //			includeFields -- array of field names which should be included, or undefined var
    //			excludeFields -- array of field names which should be excluded, or undefined var 
    //
    function addToCookieValue(fieldName, fieldValue, includeFields, excludeFields) {
	var cookieValueAddOn = "";
	if (fieldName != "") {
	    if ((includeFields != null) && (typeof includeFields != "undefined") && (includeFields.length > 0)) {
		var ki = 0;
		for (; (ki < includeFields.length); ki++) {
		    if (includeFields[ki] == fieldName) {
			cookieValueAddOn = fieldName + "=" + escape(fieldValue) + ";";
			break;
		    }
		} 
	    }
	    else if ((excludeFields != null) && (typeof excludeFields != "undefined") && (excludeFields.length > 0)) {
		var ke = 0;
		for (; (ke < excludeFields.length); ke++) {
		    if (excludeFields[ke] == fieldName) {
			break;
		    }
		} 
		if (ke >= excludeFields.length) {
		    cookieValueAddOn = fieldName + "=" + escape(fieldValue) + ";";
		}
	    }
	    else {
		cookieValueAddOn = fieldName + "=" + escape(fieldValue) + ";";
	    }
	}
	return(cookieValueAddOn);
    }


