//-----------------------
function getCookieVal (offset) {
  var endstr = document.cookie.indexOf (";", offset);
  if (endstr == -1) endstr = document.cookie.length;
  return unescape(document.cookie.substring(offset, endstr));
}

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

// the following function can accept more than two arguments
// two arguments are declared to enforce using at least them
//-----------------------
function SetCookie (name, value) {
  var argv    = SetCookie.arguments;
  var argc    = SetCookie.arguments.length;
  var expires = (argc > 2) ? argv[2] : null;
  var path    = (argc > 3) ? argv[3] : null;
  var domain  = (argc > 4) ? argv[4] : null;
  var secure  = (argc > 5) ? argv[5] : false;
  document.cookie = name + "=" + escape (value) +
  ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
  ((path    == null) ? "" : ("; path=" + path)) +
  ((domain  == null) ? "" : ("; domain=" + domain)) +
  ((secure  == true) ? "; secure" : "");
}

//-----------------------
function DeleteCookie(name) {
  var exp = new Date();
  exp.setTime(exp.getTime() - 1);
  var cval = GetCookie(name);
  if (cval != null) document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}



// FormSaveRestore saves and retrieve form contents:
//  FormSaveRestore('save',    'cookie_name_prefix', 'form_name_1', 'form_name_2', ..., 'form_name_n');
//  FormSaveRestore('restore', 'cookie_name_prefix', 'form_name_1', 'form_name_2', ..., 'form_name_n');
//  FormSaveRestore('delete',  'cookie_name_prefix', 'form_name_1', 'form_name_2', ..., 'form_name_n');
// It works in IE 5+ and in Netscape 6+


//-----------------------
var expDays = 360;
var exp = new Date();
exp.setTime(exp.getTime() + (expDays*24*60*60*1000));


function FormSaveRestore() {
  if (FormSaveRestore.arguments.lenght<3) return;
  var mode=FormSaveRestore.arguments[0];
  var cookieName=FormSaveRestore.arguments[1];

  for(f=2; f<FormSaveRestore.arguments.length; f++) {
    var formName=FormSaveRestore.arguments[f];

    if (mode=='restore') {
      cookieValue=GetCookie(cookieName+'_'+formName);
      if (cookieValue!=null) {
        var cookieArray=cookieValue.split('#cf#');

        if (cookieArray.length==document[formName].elements.length) {
          for(i=0; i<document[formName].elements.length; i++) {

            if (cookieArray[i].substring(0,6)=='select') {
              document[formName].elements[i].options.selectedIndex=cookieArray[i].substring(7, cookieArray[i].length-1);
            } else if ((cookieArray[i]=='cbtrue') || (cookieArray[i]=='rbtrue')) {
              document[formName].elements[i].checked=true;
            } else if ((cookieArray[i]=='cbfalse') || (cookieArray[i]=='rbfalse')) {
              document[formName].elements[i].checked=false;
            } else {
              document[formName].elements[i].value=(cookieArray[i]) ? cookieArray[i] : '';
            }
          }
        }
      }
    } else if (mode=='save') {
      cookieValue='';
      for(i=0; i<document[formName].elements.length; i++) {
        fieldType=document[formName].elements[i].type;

        if (fieldType=='password') { passValue=''; }
        else if (fieldType=='checkbox') { passValue='cb'+document[formName].elements[i].checked; }
        else if (fieldType=='radio') { passValue='rb'+document[formName].elements[i].checked; }
        else if (fieldType=='select') { passValue='select'+document[formName].elements[i].options.selectedIndex; }
        else { passValue=document[formName].elements[i].value; }

        cookieValue=cookieValue+passValue+'#cf#';
      }
      cookieValue=cookieValue.substring(0, cookieValue.length-4); // Remove last delimiter

      SetCookie(cookieName+'_'+formName, cookieValue, exp);
    } else if (mode=='delete') {
      DeleteCookie(cookieName+'_'+formName);
    } else {
        alert('Invalid directive for FormSaveRestore!\nUse: FormSaveRestore("cookie_name", "save"|"restore", form_name);');
    }
  }
}