function collapseAutoAttach() {
  var fieldsets = document.getElementsByTagName('fieldset');
  var legend, fieldset;
  for (var i = 0; fieldset = fieldsets[i]; i++) {
    if (hasClass(fieldset, 'collapsible')) {
      legend = fieldset.getElementsByTagName('legend');
      legend = legend[0];
      var a = document.createElement('a');
      a.href = '#';
      a.onclick = function() {
        toggleClass(this.parentNode.parentNode, 'collapsed');
        toggleFieldSet(this.parentNode.parentNode);
        this.blur();
        return false;
      }
      a.innerHTML = legend.innerHTML;
      while (legend.hasChildNodes()) {
        removeNode(legend.childNodes[0]);
      }
      legend.appendChild(a);
      collapseEnsureErrorsVisible(fieldset);
    }
  }
}
 
function toggleFieldSet(node) {
  var legend = node.getElementsByTagName('legend');
  var field = legend[0].childNodes[0].childNodes[0].nodeValue;
  var expandedFieldSets = {};
  var cookiecontent = getCookie('expandedFieldSets');
  if (cookiecontent !== null) {
    var temp = cookiecontent.split(','), i = temp.length;
    while (i--) expandedFieldSets[temp[i]] = 1;
  }
  if (field in expandedFieldSets) delete(expandedFieldSets[field]);
  else expandedFieldSets[field] = 1;
  var temp = [];
  for (var fieldset in expandedFieldSets) {
    if (!Object.prototype[fieldset]) temp.push(fieldset);
  }
  setCookie('expandedFieldSets', temp.join(','));
}

function collapseEnsureErrorsVisible(fieldset) {
  if (hasClass(fieldset, 'collapsed')) {
    return;
  }
  var inputs = [];
  inputs = inputs.concat(fieldset.getElementsByTagName('input'));
  inputs = inputs.concat(fieldset.getElementsByTagName('textarea'));
  inputs = inputs.concat(fieldset.getElementsByTagName('select'));
  for (var j = 0; j<3; j++) {
    for (var i = 0; i < inputs[j].length; i++) {
      if (hasClass(inputs[j][i], 'error')) {
        return removeClass(fieldset, 'collapsed');
      }
    }
  }
}

addLoadEvent(collapseAutoAttach);
