function _PION_(conf) {
  this.base = {tagURL: conf.tagURL || "", debug: !!conf.debug};
  this.base.st = new Date();
  this.base.evn = 0;
  this.base.ecp = document.location.href;
  if (conf.logDebug) { this.logDebug = conf.logDebug; }
  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, oh = obj["on" + event] ? obj["on" + event] : function(e){}; 
      var eh = function(e){var a = func.call(po, obj), b = oh(e); if (a === false || b === false) return false} 
      obj["on" + event] = eh; 
} 

_PION_.prototype.selfTag = function(ev, arg) {
  this.base.evn++;
  var url = this.base.tagURL +
	  "?ev=" + ev +
	  "&evn=" + this.base.evn +
	  "&est=" + this.base.st.valueOf() +
	  "&eft=" + (new Date()).valueOf() +
	  "&ecp=" + encodeURIComponent(this.base.ecp);
  // est = this js start time
  // eft = this js fire time (when the event(s) were finally sent to Pion)
  if (arg) {
    if (typeof(arg) == "string") url = url + "&evd=" + encodeURIComponent(arg);
    if (typeof(arg) == "object") {
	  var p = ""
      for (var k in arg) {
	    if (p != "") p += "&";
		p += k + "=" + arg[k];
	  }
      url += "&evd=" + encodeURIComponent(p);
	}
  }
  if (this.base.debug) this.logDebug("pre selfTag: " + url);
  //if (this.base.tagURL.length > 0) {var tag = new Image(); tag.src = ""; tag.src = url;}
  if (this.base.tagURL.length > 0) {
    var xhr = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"));
    xhr.open("GET",url,true);
	xhr.send(null);
  }
  if (this.base.debug) this.logDebug("post selfTag: " + url);
  return true;
}
_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);
	this.forms.lastField = ""; //reset the lastField
  }
  if (this.links && (this.links.exitLink != "")) {
    this.selfTag("exitlink", "href=" + this.links.exitLink);
    this.links.exitLink = ""; //reset the exitLink
  }
}
_PION_.prototype.logDebug = function(obj) { alert(obj); }
