(function() {
  window.WH = {
    lastLinkClicked: null,
    warehouseTag: null,
    firstVisit: null,
    path: '',
    domain: '',
    sessionID: '',
    userID: '',
    cacheBuster: 0,
    init: function(opts) {
      if (opts == null) {
        opts = {};
      }
      WH.clickBindSelector = opts.clickBindSelector || 'a, input[type=submit], input[type=button]';
      WH.warehouseURL = opts.warehouseURL || 'http://my-data-warehouse.com/tracker.gif';
      WH.parentTagsAllowed = opts.parentTagsAllowed || /div|ul/;
      WH.setCookies();
      WH.determinePlatform();
      WH.determineDimensions();
      WH.path = "" + document.location.pathname + document.location.search;
      WH.domain = document.location.host;
      return $(function() {
        WH.metaData = WH.getDataFromMetaTags();
        WH.firePageViewTag();
        return WH.bindBodyClicked();
      });
    },
    firePageViewTag: function() {
      return WH.fire({
        type: 'pageview'
      });
    },
    firstClass: function(elem) {
      var klasses;
      if (!(klasses = elem.attr('class'))) {
        return;
      }
      return klasses.split(' ')[0];
    },
    determineParent: function(elem) {
      var el, _i, _len, _ref;
      _ref = elem.parents();
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        el = _ref[_i];
        if (el.tagName.toLowerCase().match(WH.parentTagsAllowed)) {
          return WH.firstClass($(el));
        }
      }
    },
    getDataFromMetaTags: function() {
      var metaTag, metas, name, retObj, _i, _len;
      retObj = {
        cg: ''
      };
      metas = $('meta');
      for (_i = 0, _len = metas.length; _i < _len; _i++) {
        metaTag = metas[_i];
        metaTag = $(metaTag);
        if (metaTag.attr('name').indexOf('WH.') === 0) {
          name = metaTag.attr('name').replace('WH.', '');
          retObj[name] = metaTag.attr('content');
        }
      }
      return retObj;
    },
    bindBodyClicked: function() {
      return $(WH.clickBindSelector).bind('click', WH.elemClicked);
    },
    determineDimensions: function() {
      var doc, win;
      win = $(window);
      doc = $(document);
      WH.windowDimensions = "" + (win.width()) + "x" + (win.height());
      return WH.browserDimensions = "" + (doc.width()) + "x" + (doc.height());
    },
    determinePlatform: function() {
      return WH.platform = WH.BrowserDetect.init();
    },
    elemClicked: function(e) {
      var attr, attrs, domTarget, href, item, jQTarget, realName, subGroup, trackingData, value, _i, _len;
      domTarget = e.target;
      jQTarget = $(e.target);
      attrs = domTarget.attributes;
      item = WH.firstClass(jQTarget) || '';
      subGroup = WH.determineParent(jQTarget) || '';
      value = jQTarget.text() || '';
      trackingData = {
        sg: subGroup,
        item: item,
        value: value,
        type: 'click',
        x: e.clientX,
        y: e.clientY
      };
      for (_i = 0, _len = attrs.length; _i < _len; _i++) {
        attr = attrs[_i];
        if (attr.name.indexOf('data-') === 0) {
          realName = attr.name.replace('data-', '');
          trackingData[realName] = attr.value;
        }
      }
      if (href = jQTarget.attr('href')) {
        WH.lastLinkClicked = href;
        e.preventDefault();
      }
      WH.fire(trackingData);
      return e.stopPropagation();
    },
    fire: function(obj) {
      var lastLinkRedirect, requestURL, timeoutID;
      obj.cb = WH.cacheBuster++;
      obj.sess = "" + WH.userID + "." + WH.sessionID;
      obj.fpc = WH.userID;
      obj.site = WH.domain;
      obj.path = WH.path;
      obj.title = $('title').text();
      obj.bs = WH.windowDimensions;
      obj.sr = WH.browserDimensions;
      obj.os = WH.platform.OS;
      obj.browser = WH.platform.browser;
      obj.ver = WH.platform.version;
      obj.ref = document.referrer;
      if (WH.firstVisit) {
        obj.firstVisit = WH.firstVisit;
        WH.firstVisit = null;
      }
      requestURL = WH.warehouseURL + WH.obj2query($.extend(obj, WH.metaData));
      if (requestURL.length > 2048 && navigator.userAgent.indexOf('MSIE') >= 0) {
        requestURL = requestURL.substring(0, 2043) + "&tu=1";
      }
      if (WH.warehouseTag) {
        WH.warehouseTag.attr('src', requestURL);
      } else {
        WH.warehouseTag = $("<img id='PRMWarehouseTag' border='0' width='1' height='1' src='" + requestURL + "'/>");
        $('body').append(WH.warehouseTag);
      }
      if (WH.lastLinkClicked) {
        lastLinkRedirect = function() {
          clearTimeout(timeoutID);
          if (WH.lastLinkClicked.indexOf('javascript:') === -1) {
            return document.location = WH.lastLinkClicked;
          }
        };
        timeoutID = setTimeout(lastLinkRedirect, 2000);
        return WH.warehouseTag.unbind('load').unbind('error').bind('load', lastLinkRedirect).bind('error', lastLinkRedirect);
      }
    },
    obj2query: function(obj) {
      var key, rv, val;
      rv = [];
      for (key in obj) {
        if (obj.hasOwnProperty(key) && ((val = obj[key]) != null)) {
          rv.push("&" + key + "=" + (encodeURIComponent(val)));
        }
      }
      return rv.join('').replace(/^&/, '?');
    },
    setCookies: function() {
      var sessionID, timestamp, userID;
      userID = $.cookie('WHUserID');
      sessionID = $.cookie('WHSessionID');
      timestamp = new Date().getTime();
      if (!userID) {
        userID = timestamp;
        $.cookie('WHUserID', userID, {
          expires: 3650,
          path: '/'
        });
      }
      if (!sessionID) {
        sessionID = timestamp;
        WH.firstVisit = timestamp;
        $.cookie('WHSessionID', sessionID, {
          path: '/'
        });
      }
      WH.sessionID = sessionID;
      return WH.userID = userID;
    },
    BrowserDetect: {
      init: function() {
        this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "an unknown version";
        this.OS = this.searchString(this.dataOS) || "an unknown OS";
        return this;
      },
      searchString: function(data) {
        var dataProp, dataString, datum, _i, _len, _results;
        _results = [];
        for (_i = 0, _len = data.length; _i < _len; _i++) {
          datum = data[_i];
          dataString = datum.string;
          dataProp = datum.prop;
          this.versionSearchString = datum.versionSearch || datum.identity;
          if (dataString) {
            if (dataString.indexOf(datum.subString) !== -1) {
              return datum.identity;
            }
          } else if (dataProp) {
            return datum.identity;
          }
        }
        return _results;
      },
      searchVersion: function(dataString) {
        var index;
        index = dataString.indexOf(this.versionSearchString);
        if (index === -1) {
          return;
        }
        return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
      },
      dataBrowser: [
        {
          string: navigator.userAgent,
          subString: "Chrome",
          identity: "Chrome"
        }, {
          string: navigator.userAgent,
          subString: "OmniWeb",
          versionSearch: "OmniWeb/",
          identity: "OmniWeb"
        }, {
          string: navigator.vendor,
          subString: "Apple",
          identity: "Safari",
          versionSearch: "Version"
        }, {
          prop: window.opera,
          identity: "Opera"
        }, {
          string: navigator.vendor,
          subString: "iCab",
          identity: "iCab"
        }, {
          string: navigator.vendor,
          subString: "KDE",
          identity: "Konqueror"
        }, {
          string: navigator.userAgent,
          subString: "Firefox",
          identity: "Firefox"
        }, {
          string: navigator.vendor,
          subString: "Camino",
          identity: "Camino"
        }, {
          string: navigator.userAgent,
          subString: "Netscape",
          identity: "Netscape"
        }, {
          string: navigator.userAgent,
          subString: "MSIE",
          identity: "Explorer",
          versionSearch: "MSIE"
        }, {
          string: navigator.userAgent,
          subString: "Gecko",
          identity: "Mozilla",
          versionSearch: "rv"
        }, {
          string: navigator.userAgent,
          subString: "Mozilla",
          identity: "Netscape",
          versionSearch: "Mozilla"
        }
      ],
      dataOS: [
        {
          string: navigator.platform,
          subString: "Win",
          identity: "Windows"
        }, {
          string: navigator.platform,
          subString: "Mac",
          identity: "Mac"
        }, {
          string: navigator.userAgent,
          subString: "iPhone",
          identity: "iPhone/iPod"
        }, {
          string: navigator.platform,
          subString: "Linux",
          identity: "Linux"
        }
      ]
    }
  };
}).call(this);

