var posx;
var posy;
var refx;
var refy;
var data = false;
var ms = 0;
var domain = "http://developtronic.de/tracker/collect/";
var koordinaten = new Array();

var cookiecontent = document.cookie;


if(cookiecontent!=""){
  c_start=document.cookie.indexOf("mt20" + "=");
  if (c_start!=-1){
    c_start=c_start + 5; // + mt20.lenght+1
    c_end=document.cookie.indexOf(";",c_start);
    if (c_end==-1) c_end=document.cookie.length;
    cookiecontent = unescape(document.cookie.substring(c_start,c_end));
    SaveUserData();
    MainHandler();
  }
}
else {
  var datum = new Date();
  cookiecontent = "tac"+datum.getDate()+Math.random()*1000;
  SaveUserData();
  MainHandler(); 
  document.cookie = "mt20="+cookiecontent+"; path=/"; 
}  

function serialize( mixed_value ) {
    // Returns a string representation of variable (which can later be unserialized)  
    // 
    // version: 906.1807
    // discuss at: http://phpjs.org/functions/serialize
    // +   original by: Arpad Ray (mailto:arpad@php.net)
    // +   improved by: Dino
    // +   bugfixed by: Andrej Pavlovic
    // +   bugfixed by: Garagoth
    // +      input by: DtTvB (http://dt.in.th/2008-09-16.string-length-in-bytes.html)
    // +   bugfixed by: Russell Walker (http://www.nbill.co.uk/)
    // %          note: We feel the main purpose of this function should be to ease the transport of data between php & js
    // %          note: Aiming for PHP-compatibility, we have to translate objects to arrays
    // *     example 1: serialize(['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'
    // *     example 2: serialize({firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'});
    // *     returns 2: 'a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'
    var _getType = function( inp ) {
        var type = typeof inp, match;
        var key;
        if (type == 'object' && !inp) {
            return 'null';
        }
        if (type == "object") {
            if (!inp.constructor) {
                return 'object';
            }
            var cons = inp.constructor.toString();
            match = cons.match(/(\w+)\(/);
            if (match) {
                cons = match[1].toLowerCase();
            }
            var types = ["boolean", "number", "string", "array"];
            for (key in types) {
                if (cons == types[key]) {
                    type = types[key];
                    break;
                }
            }
        }
        return type;
    };
    var type = _getType(mixed_value);
    var val, ktype = '';
    
    switch (type) {
        case "function": 
            val = ""; 
            break;
        case "boolean":
            val = "b:" + (mixed_value ? "1" : "0");
            break;
        case "number":
            val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
            break;
        case "string":
            val = "s:" + encodeURIComponent(mixed_value).replace(/%../g, 'x').length + ":\"" + mixed_value + "\"";
            break;
        case "array":
        case "object":
            val = "a";
            /*
            if (type == "object") {
                var objname = mixed_value.constructor.toString().match(/(\w+)\(\)/);
                if (objname == undefined) {
                    return;
                }
                objname[1] = serialize(objname[1]);
                val = "O" + objname[1].substring(1, objname[1].length - 1);
            }
            */
            var count = 0;
            var vals = "";
            var okey;
            var key;
            for (key in mixed_value) {
                ktype = _getType(mixed_value[key]);
                if (ktype == "function") { 
                    continue; 
                }
                
                okey = (key.match(/^[0-9]+$/) ? parseInt(key, 10) : key);
                vals += serialize(okey) +
                        serialize(mixed_value[key]);
                count++;
            }
            val += ":" + count + ":{" + vals + "}";
            break;
        case "undefined": // Fall-through
        default: // if the JS object has a property which contains a null value, the string cannot be unserialized by PHP
            val = "N";
            break;
    }
    if (type != "object" && type != "array") {
        val += ";";
    }
    return val;
}


 /*
 * GetRelativUrl
 * Der index Bug wird behoben
 */
 
function GetRelativUrl() {
  return location.pathname;
}


/*
* Speichert die UserId
* Wird direkt beim start aufgerufen
* 
*/
function SaveUserData() {   
  var url = GetRelativUrl();
  
  var ext = new Image();  
  ext.src = domain+"tracervisit.php"+"?&url="+url+"&h="+cookiecontent+"&d="+trackingid;
}
  
  
/* 
* SaveClick
* 
* Wird direkt beim Klick ausgeführt 
* Die aktuelle Position wird ermittelt  
* Daten werden per ajax im Hintergrund direkt verschickt
* 
* Ermittlung der Browserneutralen Mauskoordinaten in Anlehnung an:
* Koch, P. (2002): Mission Impossible - mouse position
* http://evolt.org/article/Mission_Impossible_mouse_position/17/23335/index.html
*/

function SaveClick(e) {
	var posx;
	var posy;
  if (!e) var e = window.event;
  if (e.pageX || e.pageY) 	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}

   var url = GetRelativUrl();
   var ext = new Image();  
   ext.src = domain+"tracer_click.php"+"?&posx="+posx+"&posy="+posy+"&page="+url+"&h="+cookiecontent+"&d="+trackingid;
}


/*
* GetMousePos
* 
* Wird aufgerufen sobald die Maus bewegt wird
* Speichert die aktuelle Mausposition in die Variablen rein
* Makiert mit data das jetzt positionen vorhanden sind.
* 
* Ermittlung der Browserneutralen Mauskoordinaten in Anlehnung an:
* Koch, P. (2002): Mission Impossible - mouse position
* http://evolt.org/article/Mission_Impossible_mouse_position/17/23335/index.html
*/
	
function GetMousePos(e) {
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		posx = e.clientX + document.body.scrollLeft	+ document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}
  data = true;     // Ab jetzt gibt es die aktuelle Mausposition
}


/*
* SaveMousePos
* 
* Wird bei onload und alle 5 Sekunden aufgerufen
* übergibt den Array mit Mauspositionen um sie in die Datenbank zu speichern
*
*/

function SaveMousePos() {
  SaveResolution(); 
  var url = GetRelativUrl();
  var serializedArray = serialize(koordinaten);
  var ext = new Image();  
  ext.src = domain+"tracer_mouse.php"+"?&pos="+serializedArray+"&page="+url+"&h="+cookiecontent+"&d="+trackingid;
}

  
  /*
  * MainHandler
  *  
  * Wird direkt beim Start aufgerufen
  * Arbeitet aber erst richtig sobald Mausdaten vorliegen damit.
  * Speichert 4* pro Sekunde die Mausposition und Sekundenzahl in den koordinaten Array
  * Alle 5 Sekunden werden die Daten an den Server hochgeladen  
  *    
  */
function MainHandler() {                  
  if(data){                       // Sobald Positionen vorhanden sind
    koordinaten.push(posx);              // Sekunden und Kords werden in den Array gespeichert
    koordinaten.push(posy); 

    this.ms++;
    if(this.ms==16){  // 16/4 = 4sekunden
      this.data = false;
      SaveMousePos();
      koordinaten.length = 0;
      this.ms = 0;
    }
  } 
  window.setTimeout ("MainHandler()", 250); 
}

/*
* SaveResolution
* 
* Wird bei onunload aufgerufen
* Speichert die Auflösung und den Referenzpunkt ein.
* Wird erst später aufrufen, da die Auflösung nicht direkt verfügbar ist.
* 
*/

function SaveResolution() {   
  var width = screen.width;
  var height = screen.height;
  var refdiv = document.getElementById(ref);
  var refx = refdiv.offsetLeft;      // Die relative Position wird ermittelt 
  var refy = refdiv.offsetTop;       // um eine Auflösungsneutrale darstellung zu garantieren

  var ext = new Image();  
  ext.src = domain+"tracer_data.php"+"?&width="+width+"&height="+height+"&refx="+refx+"&refy="+refy+"&h="+cookiecontent+"&d="+trackingid; 
}
 
 // Bei einem Mausklick wird die position direkt ermittelt und gespeichert
function handleKeyPress(evt) {
  SaveClick(evt);
}
  
function handleMousemovement(evt) {     // Sobald sich die Maus bewegt wird die aktuelle position ermittelt
  GetMousePos(evt);
}

document.onmousedown = handleKeyPress;
document.onmousemove = handleMousemovement;
window.onunload = SaveMousePos;

