///////////////////////////////////////////////////////////////////////////////////////////
// Sticky forms Javascript library
// (C) Copyright 2000 Joost Nieuwenhuijse, New House Internet Service, joost@newhouse.nl
// Usage and distribution without prior written permission by author prohibited!!
///////////////////////////////////////////////////////////////////////////////////////////
// Usage: Include the following code:
// at top of document:    <SCRIPT SRC="stickyform.js"></SCRIPT>
// in the BODY tag:       onLoad="sfInit();"
// in the FORM tag:       onSubmit="sfFormSubmit(this);"
// insert the following fields in the form:
//   <INPUT TYPE=HIDDEN NAME="sfFields" VALUE="field1,field2,...">  (list of sticky fields)
//   <INPUT TYPE=HIDDEN NAME="sfPrefix" VALUE="_sometext">          (cookies will be prefixed with this text, use unique word)
///////////////////////////////////////////////////////////////////////////////////////////

function sfSetCookie(name, value, persistent, path, domain) 
{
  var expire=(persistent? "Thursday, 31-Dec-2020 23:59:59 GMT" : null);

  var c=name + "=" + escape(value)
   + ((expire == null) ? "" : ("; expires=" + expire))
   + ((path == null) ? "" : ("; path=" + path))
   + ((domain == null) ? "" : ("; domain=" + domain));
  document.cookie = c;
}

function sfClearCookie(name, path, domain) 
{
  var value="";
  var expire="Tuesday, 1-Jan-1980 00:00:00 GMT";
   document.cookie = name + "=" + escape(value)
   + ((expire == null) ? "" : ("; expires=" + expire))
   + ((path == null) ? "" : ("; path=" + path))
   + ((domain == null) ? "" : ("; domain=" + domain));
}

function sfGetCookie(Name) {
   var search = Name + "=";
   if (document.cookie.length > 0) { // if there are any cookies
      offset = document.cookie.indexOf(search);
      if (offset != -1) { // if cookie exists 
         offset += search.length;
         // set index of beginning of value
         end = document.cookie.indexOf(";", offset);
         // set index of end of cookie value
         if (end == -1)
            end = document.cookie.length;
         return unescape(document.cookie.substring(offset, end));
      } 
   }
   else
   {
     return "";
   }
}

// get the value of a form field, regardless of its type
function sfGetFieldValue(form,name)
{
  var field=form.elements[name];
  if(field)
  {
    var t;
    if(field.type)
    {
      t=field.type;
    }
    else
    {
      t=field[0].type;
    }
    if(t == "select-one")
    {
  		if(field.selectedIndex==-1)
  		{
  			return '';
  		}
      	return field.options[field.selectedIndex].value;
    }
    else if(t == "select-multiple")
    {
      // todo
      alert("Multiple lists not supported");
      return "";
    }
    else if(t == "checkbox")
    {
      if(field.checked)
      {
        return field.value;
      }
      else
      {
        return "";
      }
    }
    else if(t == "radio")
    {
      var i;
      for(i=0;i<field.length;i++)
      {
        var r=field[i];
        if(r.checked)
        {
          return r.value;
        }
      }
      return "";
    }
    else
    {
      return field.value;  // this works for input, etc.
    }
  }
  else
  {
    return "";
  }
}

// set the value of a form field, regardless of its type
function sfSetFieldValue(form,name,value)
{
  var field=form.elements[name];
  if(field)
  {
    var t;
    if(field.type)
    {
      t=field.type;
    }
    else
    {
      t=field[0].type;
    }
    if(t == "select-one")
    {
      var i;
      for(i=0;i<field.options.length;i++)
      {
        field.options[i].selected=(field.options[i].value == value);
      }
    }
    else if(t == "select-multiple")
    {
      // todo
      alert("Multiple lists not supported");
    }
    else if(t == "radio")
    {
      var i;
      for(i=0;i<field.length;i++)
      {
        var r=field[i];
        r.checked=(r.value == value);
      }
    }
    else if(t == "checkbox")
    {
      field.checked=(field.value==value);
    }
    else
    {
      field.value=value;  // this works for input, etc.
    }
  }
}

function sfSaveFields(names,prefix,form)
{
  var i;
  for(i=0;i<names.length;i++)
  {
    var name=names[i];
    sfSetCookie(prefix+name,sfGetFieldValue(form,name),true,null,null);
  }
}

function sfLoadFields(names,prefix,form)
{
  var i;
  for(i=0;i<names.length;i++)
  {
    var name=names[i];
    var value=sfGetCookie(prefix+name);
    if(typeof(value) != "undefined")
    {
      sfSetFieldValue(form,name,value);
    }
  }
}

function sfInit()
{
  var i;
  for(i=0;i<document.forms.length;i++)
  {
    var f=document.forms[i];
    var prefix;
    if(f.elements["sfPrefix"])
    {
      prefix=f.elements["sfPrefix"].value;
    }
    else
    {
      prefix=escape(document.URL+f.name);
    }
    if(f.elements["sfFields"])
    {
      var fields=f.elements["sfFields"].value.split(",");
      sfLoadFields(fields,prefix,f);
    }
  }
  return true;
}

function sfFormSubmit(f)
{
  var prefix;
  if(f.elements["sfPrefix"])
  {
    prefix=f.elements["sfPrefix"].value;
  }
  else
  {
    prefix=escape(document.URL+f.name);
  }
  if(f.elements["sfFields"])
  {
    var fields=f.elements["sfFields"].value.split(",");
    sfSaveFields(fields,prefix,f);
  }
  return true;
}
