
/*
#"v=" + version  // 0.0.1
#"c=" + client   // CC-129022
#"r=" + referer  // http://google.de/?q=ababa
#"t=" + title    // actual page title
#"s=" + screen   // 1680,1050,24
#"l=" + language // de
#"u=" + url      // /actual/page/requested/
#"x=" + random   // 238928392
#"d=" + campagne // 348932
#"h=" + hostname // www.xarg.org
#"z=" + time     // 893428934332
#"n=" + flags    // is javascript?(0) is cookie?(1)
#"p=" + plugins  // Adobe, Flash, Xxx
#"e=" + status_code    // 404
*/

/* todo:
#is cookie?
#is java?
#is javascript?
#is adobe?
#is quicktime?
#is wmp?
#is divx?
#is realplayer?
#is shockwave?
#is gears?
#is silverlight?
#is google earth?
 */


(function() {

	var version = '0.0.1';

	var encode = encodeURIComponent;


	/**
Final write
	 **/
	function writeRequest(obj) {

		var x = obj.bf;

		for(var i = 0; i < cb.length; i++) {
			cb[i](x);
		}

		var buf = "";
		var sta = false;

		for(var k in x) {

			if (sta) {
				buf+= "&";
			} else {
				sta = true;
			}

			var t = x[k];
			if(t != undefined && t != "") {
				buf+= k;
				buf+= "=";
				buf+= x[k];
			}
		}

		var img = new Image(1, 1);
		img.src = 'http://track.trafficmaxx.de/track.php?'+buf;
		img.onload = function () {
			img.onload = null;
		}
	}

	/**
Plugin search map
	 **/
	var re = [

		{
			name: "adobe",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.a = obj.version;
				} else if(x&&x[1]) {
					ret.a = x[1];
				}
				return 2;
			}
		},{
			name: "realplayer",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.r = obj.version;
				} else if(x&&x[1]) {
					ret.r = x[1];
				}
				return 3;
			}
		},{
			name: "quicktime",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.q = obj.version;
				} else if(x&&x[1]) {
					ret.q = x[1];
				}
				return 4;
			}
		},{
			name: "flash",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.f = obj.version;
				} else if(x&&x[1]) {
					ret.f = x[1];
				}

				return 5;
			}
		},{
			name: "windows media player",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.w = obj.version;
				} else if(x&&x[1]) {
					ret.w = x[1];
				}
				return 6;
			}
		},{
			name: "google gears",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.g = obj.version;
				} else if(x&&x[1]) {
					ret.g = x[1];
				}
				return 7;
			}
		},{
			name: "divx",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.x = obj.version;
				} else if(x&&x[1]) {
					ret.x = x[1];
				}
				return 9;
			}
		},{
			name: "silverlight",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.s = obj.version;
				} else if(x&&x[1]) {
					ret.s = x[1];
				}
				return 10;
			}
		},{
			name: "java plug-in",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.j = obj.version;
				} else if(x&&x[1]) {
					ret.j = x[1];
				}
				return 11;
			}
		},{
			name: "google earth",
			test: function(x, ret, obj) {
				if (obj.version) {
					ret.e = obj.version;
				} else if(x&&x[1]) {
					ret.e = x[1];
				}
				return 12;
			}
		}

	];


	/**
Type callback map
	 **/
	var cb = [

		// title
		function(o) {

			if (document.title) {
				o.t = encode(document.title);
			} else {
				o.t = encode(document.location.href.split('?')[0]);
			}
		},

		// resolution
		function(o) {
			if (screen.width !== undefined)
				o.s = screen.width + "_" + screen.height + "_" + Math.min(screen.colorDepth, 24);
		},

		// langauge
		function(o) {

			if (navigator) {
				if (navigator.language) {
					o.l = navigator.language;
				} else if (navigator.browserLanguage) {
					o.l = navigator.browserLanguage;
				} else if (navigator.userLanguage) {
					o.l = navigator.userLanguage;
				}
			}
		},

		// referer
		function(o) {

			if (top.document.referrer) {
				o.r = encode(top.document.referrer);
			} else if (document.referrer) {
				o.r = encode(document.referrer);
			}
		},

		// timestamp
		function(o) {
			o.z = Math.floor(new Date().getTime() / 1000);
		},

		// random number
		function(o) {
			o.x = Math.round(Math.random() * 1147483647) + 1E9;
		},

		// hostname
		function(o) {

			if (window.location.hostname) {
				o.h = encode(window.location.hostname);
			}
		},

		// uri
		function(o) {
			if (window.location.pathname) {
				o.u = encode(window.location.pathname);
			}
		},

		function (o) {

			var meta = document.getElementsByTagName('meta');

			for (var i=0; i<meta.length; i++) {
				switch (meta[i].getAttribute('name')) {
					case 'robots':
						o.bot = meta[i].getAttribute('content');
						break;
					case 'description':
						o.des = meta[i].getAttribute('content');
						break;
				}
			}

			var link = document.getElementsByTagName('link');
			for (var i=0; i<link.length; i++) {
				if (link[i].getAttribute('rel')==='canonical') {
					o.can = link[i].getAttribute('href');
					break;
				}
			}

		},

		// plugins using regex map
		function(o) {

			var r = {
				toString:function() {

					var b = '';

					for(i in this) {
						if(i != "toString")
							b+= i + '(' + this[i] + ')';
					}
					return b;
				}
			};

			if(navigator) {

				if(navigator.cookieEnabled) {
					o.n = 1;
				} else {
					o.n = 0;
				}

				if (navigator.plugins) {

					var p = navigator.plugins;

					if(p.length > 0) {

						for (var j = 0; j < p.length; j++) {

							for (var i = 0; i < re.length; i++) {

								var tmp = p[j].name + p[j].description;

								if (-1 != tmp.toLowerCase().indexOf(re[i].name)) {
									o.n|= 1 << re[i].test(/([0-9._]{3,})/.exec(tmp), r, p[j]);
									break;
								}
							}
						}
					}
				}

			} else {
				// IE SHIT
			}
			o.p = r.toString();
		}

	];

	window._cc = {

		/**
	write buffer
		 **/
		bf : {
			v: version,
			y: ""
		},

		/**
	"constructor"
		 **/
		getTracker: function(client) {
			this.bf.c = client;
			return this;
		},

		/**
	tracker
		 **/
		trackPageview: function(campagne) {

			this.bf.d = campagne;

			writeRequest(this);
		},

		/**
	track single variable
		 **/
		trackVariable: function(name, value) {
			this.bf.y+= name + "('" + encode(value) + "')";
			return this;
		},

		/**
	track HTTP status
		 **/
		trackHTTPStatus: function(status) {

			status = parseInt(status);

			if(status != 200 && 100 <= status && status < 600) {
				this.bf.e = status;
			}
			return this;
		}

	};

})();
