var ignoreTypes = new Array("button", "file", "hidden", "password", "reset", "submit");
var formArray;

function parseForms()
{
  var i;
  formArray = new Array(document.forms.length);

  for (i=0; i<formArray.length; i++)
  {
    formArray[i] = formValue(document.forms[i]);
    document.forms[i].onsubmit = stopOnBeforeUnload;
  }
}
function compareForms()
{
  var numforms = document.forms.length;
  var changedForms = new Array(numforms);
  for (i=0; i<numforms; i++)
  {
     changedForms[i] = (formValue(document.forms[i]) != formArray[i]);
  }
  
  if (inArray(changedForms, true))
  {
    return "There are unsaved changes on this page.";
  }
}

function formValue(formobj)
{
  var i, allvals;
  
  allvals = "";
  for (i=0; i<formobj.elements.length; i++)
  {
    var thiselmt = formobj.elements[i]
    var thistype = thiselmt.type;
    if (!inArray(ignoreTypes, thistype))
    {
      var thisval = "";
      if (thistype.indexOf("select") > -1)
      {
        thisval = thiselmt.selectedIndex;
      }
      else
      {
        // Only keep value if the item is checked OR not a cb/radio
        var isCheckable = inArray(new Array("radio", "checkbox"), thistype);
        if (!isCheckable || (isCheckable && thiselmt.checked))
        {
          thisval = thiselmt.value;
        }
      }
      allvals += thisval;
    }
  }
  return allvals;
}

function inArray(arrayobj, val)
{
  var i;
  for (i=0; i<arrayobj.length; i++)
  {
    if (arrayobj[i] == val)
    {
      return true;
    }
  }
  return false;
}

function stopOnBeforeUnload()
{
  window.onbeforeunload = null;
}
window.onload = parseForms;
window.onbeforeunload = compareForms;

