(function(){

/** 

 * simple mouse tracking v. 1.1.7 record mode (smt_record.js)

 * Release date:  November 7th 2008

 * 

 * Copyleft (cc) 2006-2008 Luis Leiva.

 * see http://smt.speedzinemedia.com for more details

 *  

 * License LGPL: http://www.opensource.org/licenses/lgpl-2.1.php

 * 

 * This script is free software; you can redistribute it and/or

 * modify it under the terms of the GNU Lesser General Public

 * License (LGPL) as published by the Free Software Foundation; either

 * version 2.1 of the License, or (at your option) any later version.

 */



/* (smt) default options ---------------------------------------------------- */

var smtOpt = {

  fps:      24,                         // tracking frequency, in frames per second

  recTime:  120,                        // tracking timeout, in seconds

  smtPath:  "/smt",                     // Do NOT place a final slash (/)

  warn:     false,                      // advice users or not                                 

  warnText: "Your mouse movements are going to be logged.\nDo you agree?",

  disabled: false  // Math.round(Math.random()) random user selection: if true, (smt) in not initialized

};

/* (smt) auxiliar functions ------------------------------------------------- */

var aux = {

  addEvent: function(obj, type, fn) { 

    // thanks to John Resig

  	if (obj.addEventListener)

  		obj.addEventListener(type, fn, false);

  	else if (obj.attachEvent)	{

  		obj["e"+type+fn] = fn;

  		obj[type+fn] = function(){ obj["e"+type+fn](window.event) };

  		obj.attachEvent("on"+type, obj[type+fn]);

  	}

  },

  

  getWindowSize: function(dim) {

    var w = document.documentElement.clientWidth  || document.body.clientWidth;   

    var h = document.documentElement.clientHeight || document.body.clientHeight;

    return (dim == "width") ? w : h;

  },

  

  getBase: function(url) {

    // split url in dirs

    var paths = url.split("/");

    // remove last element, so we do not have to worry about the query string (?var1=value1&var2=value2#anchor...)

    delete paths[(paths.length-1)];

    // and we have the BASE href

    return paths.join("/");

  },

  

  roundTo: function(number,digits) {

    var exp = Math.pow(10,digits);

    return Math.round(exp*number)/exp; 

  }

};

/* (smt) record system definition ------------------------------------------- */

var smtRec = {

  posX: 0,                              // init global aux vars

  posY: 0,

  i: 0,

  

  dr_h: 1,                              // data normalization

  dr_v: 1,

  w: aux.getWindowSize("width"),

  h: aux.getWindowSize("height"),

  

  coordsX: [],                          // store mouse X coords

  coordsY: [],                          // store mouse Y coords

  clicksX: [],                          // store click X coords

  clicksY: [],                          // store click Y coords

  clicksT: [],                          // store click time



  url:      null,                       // document URI

  base:     null,                       // document base path

  rec:      null,                       // recording identifier

  pause:    false,                      // check active window

  clicked:  false,                      // no mouse click yet

  

  timeout: smtOpt.fps*smtOpt.recTime,   // session timeout



  /* METHODS */

  pauseRecording: function() {

    smtRec.pause = true;

  },

  

  continueRecording: function() {

    smtRec.pause = false;

  },

  

  normalizeData: function() {

    var w = aux.getWindowSize("width");

    var h = aux.getWindowSize("height");

    // compute discrepace ratio

    smtRec.dr_h = Math.round(w / smtRec.w);

    smtRec.dr_v = Math.round(h / smtRec.h);

    // update new values

    smtRec.w = w;

    smtRec.h = h;

  },

  

  getMousePos: function(e) { 

    // thanks to Peter-Paul Koch

    if (!e) var e = window.event;

  	if (e.pageX || e.pageY) {

  		smtRec.posX = e.pageX;

  		smtRec.posY = e.pageY;
  	}	else if (e.clientX || e.clientY) {

  		smtRec.posX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;

  		smtRec.posY = e.clientY + document.body.scrollTop  + document.documentElement.scrollTop;

  	}

  },

  

  setClick: function() {

    /**

     * Double clicks are considered as single clicks (it's simpler and faster), because

     * the rate of the double click depends upon the settings of the operating system.

     */

    smtRec.clicked = true;

    // time is computed in seconds

    smtRec.clicksT.push(aux.roundTo(smtRec.i/smtOpt.fps, 2));

    //smtRec.clicksT.push(smtRec.i/smtOpt.fps);

  },

  

  releaseClick: function() {

    smtRec.clicked = false; 

  },

  

  recMouse: function() {

    // track mouse only if window is active (has focus)

    if (smtRec.pause) return;

    // get mouse coords until timeout is reached 

    if (smtRec.i < smtRec.timeout) {

      // get normalized coords

      var x = smtRec.dr_h * smtRec.posX;

      var y = smtRec.dr_v * smtRec.posY;

      // track mouse coords when they're inside the client window

      if (smtRec.posY != null && smtRec.posY != 0) {

        smtRec.coordsX.push(x);

        smtRec.coordsY.push(y);

        // get mouse clicks

        if (!smtRec.clicked) {

          smtRec.clicksX.push(0); 

          smtRec.clicksY.push(0); 

        } else { 

          smtRec.clicksX.push(x); 

          smtRec.clicksY.push(y); 

        }

      }

  	} else {

  	  // timeout reached

  	  clearInterval(smtRec.rec);

  	  smtRec.rec = null;

  	}

  	smtRec.i++;

  },



  sendData: function() {

    // check data before sending them (we need at least one mouse movement)

    if (smtRec.coordsX.length < 2) return;

    // compute total time session

    var time = aux.roundTo(smtRec.i/smtOpt.fps, 2);

    // also, exit if the user expended less than 2 seconds on the page

    if (time < 2) return;



    // create AJAX object

    var ajax_obj = false;

    // current AJAX flavours

    var flavours = [

      function() {return new XMLHttpRequest()},

      function() {return new ActiveXObject("Msxml2.XMLHTTP")},

      function() {return new ActiveXObject("Msxml3.XMLHTTP")},

      function() {return new ActiveXObject("Microsoft.XMLHTTP")}

    ];

    // check AJAX flavour

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

      try {

        ajax_obj = flavours[i]();

      } catch(e) {

        continue;

      }

      break;

    }

    // set type accordingly to anticipated content type

    if (ajax_obj.overrideMimeType) 

        ajax_obj.overrideMimeType('text/html');

    // send data using AJAX to the server via POST

  	ajax_obj.open("POST", smtOpt.smtPath+"/smt_storeData.php", true);

    ajax_obj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    ajax_obj.setRequestHeader("Connection",   "close");



    var data  = "url="      + smtRec.url;

        data += "&base="    + smtRec.base;

        data += "&title="   + document.title;

        data += "&browser=" + browserDetect.browser;

        data += "&version=" + browserDetect.version;

        data += "&OS="      + browserDetect.OS;

        data += "&sW="      + screen.width;

        data += "&sH="      + screen.height;

        data += "&dW="      + smtRec.w;

        data += "&dH="      + smtRec.h;

        data += "&t="       + time;

        data += "&cX="      + smtRec.coordsX;

        data += "&cY="      + smtRec.coordsY;

        data += "&clX="     + smtRec.clicksX;

        data += "&clY="     + smtRec.clicksY;

        data += "&clT="     + smtRec.clicksT;

        data += "&fps="     + smtOpt.fps;

        

    ajax_obj.send(data);

  },

  

  init: function() {

    // thanks to  Dean Edwards/Matthias Miller/John Resig

    if (arguments.callee.done) return;

    // flag this function so we don't do the same thing twice

    arguments.callee.done = true;

    // kill the timer

    if (_timer) {

      clearInterval(_timer);

      _timer = null;

    }

    

    // get this locations BEFORE making the AJAX request

    smtRec.url  = window.location.href;

    smtRec.base = aux.getBase(smtRec.url);

    

    // set main function: the (smt) recording interval

    var interval = Math.round(1000/smtOpt.fps);

    smtRec.rec   = setInterval(smtRec.recMouse, interval);

    

    // add unobstrusive events

    aux.addEvent(document, "mousemove", smtRec.getMousePos);      // get mouse coords (X, Y)

    aux.addEvent(document, "mousedown", smtRec.setClick);         // mouse is clicked        

    aux.addEvent(document, "mouseup",   smtRec.releaseClick);     // mouse is released

    aux.addEvent(window,   "resize",    smtRec.normalizeData);    // make easy data interpretation

    aux.addEvent(window,   "blur",      smtRec.pauseRecording);   // only record mouse when window is active

    aux.addEvent(window,   "focus",     smtRec.continueRecording);

    

    if (typeof window.onbeforeunload == 'function')

      aux.addEvent(window, "beforeunload", smtRec.sendData);      // user closes the brower window

    else 

      aux.addEvent(window, "unload",       smtRec.sendData);      // page is unloaded (for old browsers)

    

    // allow mouse tracking over Flash animations

    var obj = document.getElementsByTagName("object");

    for (var i=0,t=obj.length; i<t; ++i) {

      var param = document.createElement("param");

      param.setAttribute('name', 'wmode');

      param.setAttribute('value','transparent');

      obj[i].appendChild(param);

    }

    var embed = document.getElementsByTagName("embed");

    for (var i=0,t=embed.length; i<t; ++i)

      embed[i].setAttribute('wmode', 'transparent');

     

  }

};

/* Browser detection -------------------------------------------------------- */

var browserDetect = {

  // script by Peter-Paul Koch @ QuirksMode.org

	init: function () {

		this.browser = this.searchString(this.dataBrowser) || "Other"; // other browser

		this.version = this.searchVersion(navigator.userAgent)

			|| this.searchVersion(navigator.appVersion)

			|| "Unknown"; // unknown browser version

		this.OS = this.searchString(this.dataOS) || "Other"; // other OS

	},

	searchString: function (data) {

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

			var dataString = data[i].string;

			var dataProp = data[i].prop;

			this.versionSearchString = data[i].versionSearch || data[i].identity;

			if (dataString) {

				if (dataString.indexOf(data[i].subString) != -1)

					return data[i].identity;

			} else if (dataProp)

				  return data[i].identity;

		}

	},

	searchVersion: function (dataString) {

		var 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: "Flock", identity: "Flock" },

		{ string: navigator.userAgent, subString: "OmniWeb", versionSearch: "OmniWeb/", identity: "OmniWeb" },

		{ string: navigator.vendor, subString: "Apple", identity: "Safari" },

		{ 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: "IExplorer", 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.platform, subString: "Linux", identity: "Linux" }

	]

};



/* (smt) initialization ----------------------------------------------------- */

var agree = (smtOpt.warn) ? confirm(smtOpt.warnText) : true;

if (!agree || smtOpt.disabled) return;



// launch browser detection script (for statistical/debugging purposes)

browserDetect.init();



// 1. for Mozilla browsers

if (document.addEventListener)

  document.addEventListener("DOMContentLoaded", smtRec.init, false);



// 2. for Internet Explorer

/*@cc_on

@if (@_win32||@_win64)

  document.write("<script id=__ie_onload defer src=//0><\/scr"+"ipt>");

	var script = document.getElementById("__ie_onload");

	script.onreadystatechange = function() {

    if (this.readyState == "complete")

      smtRec.init();

	};

@end @*/



// 3. for Safari browsers

if (/WebKit/i.test(navigator.userAgent)) { // sniff

	var _timer = setInterval(function() {

  	if (/loaded|complete/.test(document.readyState))

	 	 smtRec.init();

	}, 10);

}



// 4. for other browsers

aux.addEvent(window, "load", smtRec.init);



})();