function _PION_(conf) {
  this.base = {tagURL: conf.tagURL || "", debug: !!conf.debug};
  if (!conf.noFormAbandon) {
    this.forms = {lastField: "", formSubmit: false};
    this.addEvent(window, "load", this.formsTrack);
  }
  if (!conf.noExitLink) {
    this.links = {exitLink: "", intDomains: conf.intDomains || [window.location.hostname.replace(/\./g, "\\.")]};
    this.addEvent(window, "load", this.linksTrack);
  }
  this.addEvent(window, "beforeunload", this.exitPage);
}
_PION_.prototype.addEvent = function(obj, event, func) {
  var po = this, eh = function(e){return func.call(po, obj);}
  if (obj.addEventListener) obj.addEventListener(event, eh, false);
  else if (obj.attachEvent) obj.attachEvent("on" + event, eh);
  //else obj["on" + event] = eh;
}
_PION_.prototype.selfTag = function(ev, arg) {
  var url = this.base.tagURL + "?ev=" + ev + (arg ? "&" + arg : "");
  if (this.base.debug) alert("selfTag: " + url);
  if (this.base.tagURL.length > 0) {var tag = new Image(); tag.src = url;}
}
_PION_.prototype.formsTrack = function(obj) {
  var doc = obj.document;
  var fh = function(o){this.forms.lastField = o.parentNode.name + "." + o.name;}
  var sh = function(o){this.forms.formSubmit = true;}
  for (var i = 0; i < doc.forms.length; i++) {
    if (doc.forms[i].name)
      for (var j = 0; j < doc.forms[i].elements.length; j++)
        if (doc.forms[i].elements[j].name)
          this.addEvent(doc.forms[i].elements[j], "focus", fh);
    this.addEvent(doc.forms[i], "submit", sh);
  }
}
_PION_.prototype.linksTrack = function(obj) {
  var doc = obj.document;
  var ch = function(o){this.links.exitLink = o.href;}
  var sh = function(o){this.links.exitLink = o.action;}
  var rx1 = new RegExp("^(ht|f|nn)tps?://([^:@]+(:[^@]+)?@)?([^:/]+)");
  var rx2 = new RegExp("(^|\\.)(" + this.links.intDomains.join("|") + ")$", "i");
  for (var i = 0; i < doc.links.length; i++) {
    var result = rx1.exec(doc.links[i].href);
    if (result && !rx2.test(result[4]))
      this.addEvent(doc.links[i], "click", ch);
  }
  for (var i = 0; i < doc.forms.length; i++) {
    var result = rx1.exec(doc.forms[i].action);
    if (result && !rx2.test(result[4]))
      this.addEvent(doc.forms[i], "submit", sh);
  }
}
_PION_.prototype.exitPage = function(obj) {
  var doc = obj.document;
  if (this.forms && (this.forms.lastField != "") && !this.forms.formSubmit)
    this.selfTag("formabandon", "lastfield=" + this.forms.lastField);
  if (this.links && (this.links.exitLink != ""))
    this.selfTag("exitlink", "href=" + this.links.exitLink);
}