(function () {
  var data = {};
  
  var _escape = window.encodeURIComponent ? function (value) {
    return encodeURIComponent(value);
  } : function (value) {
    return escape(value).replace("@", "%40").replace("+", "%2B").replace("/", "%2F");
  };
  
  var _unescape = window.decodeURIComponent ? function (value) {
    return decodeURIComponent(value);
  } : function (value) {
    return unescape(value);
  };
  
  var isArray = function (self) {
    return Object.prototype.toString.call(self) === '[object Array]';
  };
  
	var locationIsGET = function (name) {
		return !!location.search.match(new RegExp("(^\\?|&)" + name + "(=|&|$)"));
	};
	
  var _shift = function (arr) {
    if (arr.shift) {
      return arr.shift();
    }
    var item = arr[0];
    for (var i = 1; i < arr.length; ++i) {
      arr[i - 1]  = arr[i];
    }
    delete arr[arr.length - 1];
    return item;
  };
  var fromString = function (pairs, keepEncoded) {
    var o = {};
    var skip = 0;
    for (var i = 0; i < pairs.length; i += (1 + skip)) {
      var pair = pairs[i].split("=");
      var name = _shift(pair);
      if (!name) {
        continue;
      } else {
        name = keepEncoded ? name : _unescape(name);
      }
      var data = pair.length ? pair.join("=") : null;
      if (!keepEncoded && data) {
        data = _unescape(data);
      }
      if (o[name]) {
        if (!isArray(o[name])) {
          o[name] = [o[name]];
        }
        o[name][o[name].length] = data;
      } else {
        o[name] = data;
      }
    }
    return o;
  };
  
  var fromSemicolonString = function (qstr, keepEncoded) {
    return fromString(qstr.replace(/\+/g, "%20").split(/;\s*/), keepEncoded);
  };
  var cache;
  var cookie = {
    get: function (name, reread) {
      if (reread || !cache) {
        cache = fromSemicolonString(document.cookie);
      }
      return cache[name] || null;
    },
    set: function (name, value, days) {
      if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
      } else {
        var expires = "";
      }
      document.cookie = name + "=" + _escape(value) + expires + "; path=/";
      if (cache) {
        if (typeof days == "number" && days > 0) {
          cache[name] = value;
        } else {
          delete cache[name];
        }
      }
    },
    erase: function (name) {
      cookie.set(name, "", -1);
    }
  };
  
  // Flash version
  var playerVersion = [0,0,0];
  var d = null;
  if (typeof navigator.plugins != "undefined" && typeof navigator.plugins["Shockwave Flash"] == "object") {
    d = navigator.plugins["Shockwave Flash"].description;
    if (d && !(typeof navigator.mimeTypes != "undefined" && navigator.mimeTypes["application/x-shockwave-flash"] && !navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)) { // navigatorigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
      d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
      playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
      playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
      playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
    }
  } else if (typeof window.ActiveXObject != "undefined") {
    var a = null, fp6Crash = false;
    try {
      a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash" + ".7");
    }
    catch(e) {
      try { 
        a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash" + ".6");
        playerVersion = [6,0,21];
        a.AllowScriptAccess = "always";  // Introduced in fp6.0.47
      }
      catch(e) {
        if (playerVersion[0] == 6) {
         fp6Crash = true;
        }
      }
      if (!fp6Crash) {
        try {
          a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
        }
        catch(e) {}
      }
    }
    if (!fp6Crash && a) { // a will return null when ActiveX is disabled
      try {
        d = a.GetVariable("$version");  // Will crash fp6.0.21/23/29
        if (d) {
          d = d.split(" ")[1].split(",");
          playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
        }
      }
      catch(e) {}
    }
  }
  if (playerVersion[0] !== 0) {
    data.flashVersion = playerVersion.join(".");
  }
  
  var readProperties = function (obj) {
    for (var i in obj) {
      if (((typeof obj[i] === "string") || (typeof obj[i] === "number") || (typeof obj[i] === "boolean")) && typeof data[i] === "undefined") {
        data[i] = obj[i];
      }
    }
  };
  
  var readMethod = function (obj, name) {
    try {
      if (obj[name]) {
        data[name] = obj[name]();
      }
    } catch (e) {}; 
  };
  
  var readProperty = function (obj, name) {
    try {
      if (((typeof obj[name] === "string") || (typeof obj[name] === "number") || (typeof obj[name] === "boolean")) && typeof data[name] === "undefined") {
        data[name] = obj[name];
      }
    } catch (e) {}; 
  };
    
  readMethod(navigator, "javaEnabled");
  readMethod(navigator, "taintEnabled");
  readProperties(navigator);
  readProperties(screen);
  readProperty(screen, "availHeight");
  readProperty(screen, "availWidth");
  readProperty(screen, "bufferDepth");
  readProperty(screen, "colorDepth");
  readProperty(screen, "deviceXDPI");
  readProperty(screen, "deviceYDPI");
  readProperty(screen, "fontSmoothingEnabled");
  readProperty(screen, "height");
  readProperty(screen, "logicalXDPI");
  readProperty(screen, "logicalYDPI");
  readProperty(screen, "updateInterval");
  readProperty(screen, "width");
  
	// viewport dimensions
	if (window.innerWidth) {
    // Non IE
    data['viewport_width'] = window.innerWidth;
		data['viewport_height'] = window.innerHeight;
  } else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
    // IE 6+ in 'standards compliant mode'
		data['viewport_width'] = document.documentElement.clientWidth;
    data['viewport_height'] = document.documentElement.clientHeight;
  } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
    //IE 4 compatible
		data['viewport_width'] = document.body.clientWidth;
    data['viewport_height'] = document.body.clientHeight;
  }

  // viewport position
	/*
	// chyba nie ma sensu.. zawsze w tym punkcie obydwa wynoszą 0 .. dopiero po załadowaniu wszystkiego przeglądarka przesuwa okno
	data['viewport_top'] = (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
  data['viewport_left'] = (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
  */
	
  var query = [];
  for (var i in data) {
    query[query.length] = (i + "=" + _escape(data[i]));
  }
  
  var currentData = {};
  if (typeof document.referrer !== "undefined") { 
    currentData.referrer = document.referrer;
  }
  currentData.href = location.href;
  currentData.time = (new Date()).getTime();
  
  var id;
  var queryJoin = query.join("&");
  if (id = cookie.get("stats_id")) {
    currentData.id = id;
    if (queryJoin !== cookie.get("stats_query")) {
      query[query.length] = '_change=1';
    } else {
      query = [];
    }
  }
  cookie.set("stats_query", queryJoin, 365);
  
  for (var i in currentData) {
    query[query.length] = (i + "=" + _escape(currentData[i]));
  }
	if (locationIsGET('stats_log')) {
    query[query.length] = "stats_log=1";
  }
  query = query.join("&");
  
  var e = document.createElement("script");
  e.src = "/stats.php?" + query;
  e.type="text/javascript";
  document.getElementsByTagName("head")[0].appendChild(e);
  
})();
