function eventTarget(e) {
  var el = e.target ? e.target : e.srcElement;  // e.target for W3C, e.srcElement for IE
  if (el.nodeType == 3) el = el.parentNode;     // Safari bug
  return el;
}
var faq = {
  DELTA: .1,  
  DELAY: 0,
  target: null,
  init: function(id, tog){
    var dl = document.getElementById(id);
    var dt = dl.getElementsByTagName("dt");
    var dd = dl.getElementsByTagName("dd");
    dl.className = "faq";
    var a = document.createElement("a");
    a.id = "top";
    dl.insertBefore(a, dt[0]);
    for (i = 0; i < dt.length; i++){
      dt[i].onclick = this.toggle;
      dt[i].className = "faqClosed";
      dd[i].style.height = "0px";
      dd[i].appendChild(this.createBackToTop());
    }
    this.sa = new Array();
    this.sa[0] = dl.insertBefore(this.createShowAll(), dt[0]);
    this.sa[1] = dl.appendChild(this.createShowAll());
    this.dt = dt;
    this.dd = dd;
    if (typeof tog != "undefined") this.toggle(dt[tog]);
  },
  createBackToTop: function(){
    var a = document.createElement("a");
    a.innerHTML = "";
    a.className = "faqToTop";
    a.href = "#top";
    return a;
  },
  createShowAll: function(){
    var a = document.createElement("a");
    a.innerHTML = "Show All Answers";
    a.className = "faqShow";
    a.href = "";
    a.onclick = this.toggleAll;
    return a;
  },
  toggle: function(e){
    // this = element clicked
    e = e ? e : window.event;
    if (e.nodeType) var dt = e;
    else var dt = eventTarget(e);
    if (e && dt) {
      var dd = dt.nextSibling;
      while (dd.nodeType != 1){
        dd = dd.nextSibling;
      }
      if (dt.className != "faqOpen"){
        faq.anim(dd, dd.scrollHeight, faq.DELTA);
        dt.className = "faqOpen";
        var sw = true;
        for (i = 0; i < faq.dt.length; i++){
          if (faq.dt[i].className != "faqOpen") sw = false;
        }
        if (sw) faq.toggleShowAll("Hide");
      } else {
        faq.target = dt;
        faq.anim(dd, dd.scrollHeight, -faq.DELTA, faq.toggleClose);
      }
    }
  },
  toggleClose: function(){
    faq.target.className = "faqClosed";
    faq.toggleShowAll("Show");
  },
  toggleAll: function(e){
    e = e ? e : window.event;
    var a = eventTarget(e);
    if (a.className == "faqShow"){
      faq.toggleShowAll("Hide");
      for (i = 0; i < faq.dt.length; i++){
        if (faq.dt[i].className != "faqOpen"){
          faq.dt[i].className = "faqOpen";
          faq.anim(faq.dd[i], faq.dd[i].scrollHeight, .1);
        }
      }
    } else {
      faq.toggleShowAll("Show");
      for (i = 0; i < faq.dt.length; i++){
        faq.dt[i].className = "faqClosed";
        faq.anim(faq.dd[i], faq.dd[i].scrollHeight, -.1);
      }
    }
    return false;
  },
  toggleShowAll: function(showhide){
      for (i = 0; i < faq.sa.length; i++){
        this.sa[i].className = "faq" + showhide;
        this.sa[i].innerHTML = showhide + " All Answers";
      }
  },
  anim: function(el, scroll, delta, callback){
    if ((parseInt(el.style.height) < scroll && delta > 0) || (parseInt(el.style.height) > 0 && delta < 0)){
      var height = parseInt(el.style.height) + scroll * delta;
      if (height > scroll) height = scroll;
      if (height < 0)  height = 0;
      el.style.height = height + "px"; 
      if (height < scroll && height > 0) setTimeout(function(){ faq.anim(el, scroll, delta, callback); }, this.DELAY);
      else if(typeof callback == "function") callback();
    }
  }
};
window.onload = function(){
  faq.init('faq', 0);
}
