/* Copyright (c) 2008 Alessandro Cappellini (cappellini@econ.unito.it) 
 * GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Requires: jQuery 1.2+
 */


// act.js

// ------------------------------------------------------------------------//
// mouse recording frame per seconds and movement tolerance

var mouse_fps     = 1;  
var mouse_tolerance =25;

// ------------------------------------------------------------------------//
// ON ELEMENT -  mouse recording frame per seconds and movement tolerance

var mouse_onElement_fps     = 5;  
var mouse_onElement_tolerance =10;


// ------------------------------------------------------------------------//
// ajax connections

function send_action(action,posX,posY,name,note) {
	dtNewDate = new Date();
	eventtime = dtNewDate.getTime();
  var curtime = eventtime-began_loading;  

  $.post("../ajax/act.php",{time: curtime, action: action, posX: posX, posY: posY, name:name, note: note});
}


// ------------------------------------------------------------------------//
// ajax connection

function done_loading() {
var text ={ loadTime: ((new Date()).getTime() - began_loading) , appName: navigator.appName, userAgent: navigator.userAgent, language:navigator.language, appVersion: navigator.appVersion, appCodeName: navigator.appCodeName, platform: navigator.platform, innerHeight: window.innerHeight, innerWidth: window.innerWidth, outerHeight: window.outerHeight, outerWidth: window.outerWidth, colorDepth: window.screen.colorDepth, pixelDepth: window.screen.pixelDepth, height: window.screen.height, width: window.screen.width, availHeight: window.screen.availHeight, availWidth: window.screen.availWidth, docHeight: document.height, docWidth: document.width}

$.post("../ajax/access.php",text);
}

// ------------------------------------------------------------------------//
// ON ELEMENT - ajax connections

function sendActionOnElement(action,posX,posY,note) {

$.post("../ajax/actOnElement.php",{time: curtime, action: action, posX: posX, posY: posY, note:note,name: name});

}


// ------------------------------------------------------------------------//
// mouse tracking

var mouse_tracking_interval = Math.round(1000/mouse_fps);     
var mouseY=0;
var mouseX=0;
var oldMouseY=0;
var oldMouseX=0;

var mouse_rec;
// to exclude mouse movement tracking, ccomment the following line
mouse_rec = setInterval("recMouse()", mouse_tracking_interval);

$("*").dblclick(function(e){send_action("MOUSE",e.pageX,e.pageY,"DOUBLE","");});
$("*").click(function(e){send_action("MOUSE",e.pageX,e.pageY,"CLICK","");});
$("*").mousemove(function(e){
      mouseX= e.pageX; 
      mouseY= e.pageY;
    });
    
function recMouse(){
    if(Math.abs(oldMouseX - mouseX)>mouse_tolerance || Math.abs(oldMouseY - mouseY)>mouse_tolerance)
    {
      send_action("MOUSE",mouseX,mouseY,"MOVE","");
      oldMouseX=mouseX;
      oldMouseY=mouseY;
    }
}    

// ------------------------------------------------------------------------//
// ON ELEMENT - mouse tracking


/*
var mouse_onElement_tracking_interval = Math.round(1000/mouse_onElement_fps);     

var oldMouseOnElementY=0;
var oldMouseOnElementX=0;




$(".watched").dblclick(function(e){sendActionOnElement("M_DBL",e.pageX,e.pageY,"");});
$(".watched").click(function(e){sendActionOnElement("M_CLI",e.pageX,e.pageY,"");});
$(".watched").mousemove(function(e){
      mouseX= e.pageX; 
      mouseY= e.pageY;
    });
var mouse_rec_onElement;

$(".watched").mouseover(mouse_rec_onElement = setInterval("recMouseOnElement()", mouse_onElement_tracking_interval));
$(".watched").mouseout(function(e){clearInterval(mouse_rec_onElement);});

    
function recMouseOnElement(){
    if(Math.abs(oldMouseOnElementX - mouseX)>mouse_onElement_tolerance || Math.abs(oldMouseOnElementY - mouseY)>mouse_onElement_tolerance)
    {
      // se this.offset funge      
      sendActionOnElement("M_MV",this.offset().left - mouseX,this.offset().top - mouseY,"");// name!!!!
      oldMouseOnElementX=mouseX;
      oldMouseOnElementY=mouseY;
    }
}    
  */  

// ------------------------------------------------------------------------//
// browser window events tracking
    
    
window.onblur       = function(){send_action("WINDOW",0,0,"BLUR","");};
document.onfocusout = function(){send_action("WINDOW",0,0,"BLUR","");}; // IE workaround
window.onfocus      = function(){send_action("WINDOW",0,0,"FOCUS","");};
window.onmove       = function(){send_action("WINDOW",0,0,"MOVE","");};
window.onresize     = function(){send_action("WINDOW",0,0,"RESIZE","");};
$(window).scroll(function () {send_action("WINDOW",0,0,"SCROLL","");});




// ------------------------------------------------------------------------//
// mouse over/out image tracking


$(".image").mouseout (function () {send_action("OUT", $(this).offset().left,$(this).offset().top,$(this).attr('name'));})
           .mouseover(function () {send_action("OVER",$(this).offset().left,$(this).offset().top,$(this).attr('name'));});



// ------------------------------------------------------------------------//
// Monitoring users' keyboard activity

var pageUDCounter    = 0;
var pageUDDelta      = 0;
var cursorRLCounter  = 0;
var cursorRLDelta    = 0;
var cursorUDCounter  = 0;
var cursorUDDelta    = 0;
var tabCounter       = 0;
var tabDelta         = 0;

function keysMon(){                
    // keys
    
    jQuery.hotkeys.add('backspace',{propagate: true},function(){send_action("KEY",0,0,"BACK","");});
    jQuery.hotkeys.add('del',      {propagate: true},function(){send_action("KEY",0,0,"DEL","");});
    jQuery.hotkeys.add('space',    {propagate: true},function(){send_action("KEY",0,0,"SPACE","");});
    jQuery.hotkeys.add('esc',      {propagate: true},function(){send_action("KEY",0,0,"ESC","");});
    jQuery.hotkeys.add('home',     {propagate: true},function(){send_action("KEY",0,0,"HOME","");});
    jQuery.hotkeys.add('end',      {propagate: true},function(){send_action("KEY",0,0,"END","");});
    
    jQuery.hotkeys.add('capslock', {propagate: true},function(){send_action("KEY",0,0,"CAPS","");});
    jQuery.hotkeys.add('scroll',   {propagate: true},function(){send_action("KEY",0,0,"SCROLL","");});
    jQuery.hotkeys.add('numlock',  {propagate: true},function(){send_action("KEY",0,0,"NUM","");});
    jQuery.hotkeys.add('pause',    {propagate: true},function(){send_action("KEY",0,0,"PAUSE","");});
    jQuery.hotkeys.add('insert',   {propagate: true},function(){send_action("KEY",0,0,"INS","");});
    jQuery.hotkeys.add('return',   {propagate: true},function(){send_action("KEY",0,0,"RET","");});
    
    // counter and positioning: page up/down
    
    jQuery.hotkeys.add('pageup',  {propagate: true},function(){pageUDCounter++;pageUDDelta++;send_action("KEY",pageUDCounter,pageUDDelta,"PGUP","");});                
    jQuery.hotkeys.add('pagedown',{propagate: true},function(){pageUDCounter++;pageUDDelta--;send_action("KEY",pageUDCounter,pageUDDelta,"PGDW","");});
    
    // counter and positioning: cursors
    
    jQuery.hotkeys.add('up',   {propagate: true},function(){cursorUDCounter++;cursorUDDelta++;send_action("KEY",cursorUDCounter,cursorUDDelta,"UP","");});
    jQuery.hotkeys.add('down', {propagate: true},function(){cursorUDCounter++;cursorUDDelta--;send_action("KEY",cursorUDCounter,cursorUDDelta,"DOWN","");});
    jQuery.hotkeys.add('left', {propagate: true},function(){cursorRLCounter++;cursorRLDelta++;send_action("KEY",cursorRLCounter,cursorRLDelta,"LEFT","");});
    jQuery.hotkeys.add('right',{propagate: true},function(){cursorRLCounter++;cursorRLDelta--;send_action("KEY",cursorRLCounter,cursorRLDelta,"RIGHT","");});
    
    // counter and positioning: tab
    
    jQuery.hotkeys.add('tab',      {propagate: true},function(){tabCounter++;tabDelta++;send_action("KEY",tabCounter,tabDelta,"TAB","");});                
    jQuery.hotkeys.add('shift+tab',{propagate: true},function(){tabCounter++;tabDelta--;send_action("KEY",tabCounter,tabDelta,"TAB_SHIFT","");});
    
    // functions
    
    jQuery.hotkeys.add('ctrl+tab',      {propagate: true},function(){send_action("KEY",0,0,"CTRL_TAB","");});                
    jQuery.hotkeys.add('ctrl+shift+tab',{propagate: true},function(){send_action("KEY",0,0,"CTRL_TAB_SHIFT","");});
    jQuery.hotkeys.add('ctrl+pageup',   {propagate: true},function(){send_action("KEY",0,0,"CTRL_PGUP","");});                
    jQuery.hotkeys.add('ctrl+pagedown' ,{propagate: true},function(){send_action("KEY",0,0,"CTRL_PGDW","");});
    jQuery.hotkeys.add('ctrl+w',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_W","");});                
    jQuery.hotkeys.add('ctrl+q',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_Q","");});                
    jQuery.hotkeys.add('ctrl+c',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_C","");});                
    jQuery.hotkeys.add('ctrl+v',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_V","");});                
    jQuery.hotkeys.add('ctrl+x',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_X","");});                
    jQuery.hotkeys.add('ctrl+z',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_Z","");});   
    jQuery.hotkeys.add('ctrl+y',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_Y","");});   
    jQuery.hotkeys.add('ctrl+shift+x',  {propagate: true},function(){send_action("KEY",0,0,"CTRL_X_SHIFT","");});   
    
    jQuery.hotkeys.add('ctrl+f',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_F","");});   
    jQuery.hotkeys.add('ctrl+g',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_G","");});   
    jQuery.hotkeys.add('f3',            {propagate: true},function(){send_action("KEY",0,0,"F3","");});   
    jQuery.hotkeys.add('ctrl+shift+g',  {propagate: true},function(){send_action("KEY",0,0,"CTRL_G_SHIFT","");});   
    
    jQuery.hotkeys.add('f1',            {propagate: true},function(){send_action("KEY",0,0,"F1","");});   
    jQuery.hotkeys.add('f11',           {propagate: true},function(){send_action("KEY",0,0,"F11","");});       
    jQuery.hotkeys.add('ctrl+r',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_R","");});   
    jQuery.hotkeys.add('f5',            {propagate: true},function(){send_action("KEY",0,0,"F5","");});  
    jQuery.hotkeys.add('ctrl+n',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_N","");});    
    jQuery.hotkeys.add('ctrl+t',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_T","");});    
    jQuery.hotkeys.add('ctrl+u',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_U","");});    
    jQuery.hotkeys.add('ctrl+d',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_D","");});    
    jQuery.hotkeys.add('ctrl+b',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_B","");});    
    jQuery.hotkeys.add('ctrl+a',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_A","");});    
    
    jQuery.hotkeys.add('ctrl++',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_+","");});    
    jQuery.hotkeys.add('ctrl+-',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_-","");});    
    
    jQuery.hotkeys.add('alt+down',      {propagate: true},function(){send_action("KEY",0,0,"ALT_DOWN","");});
    jQuery.hotkeys.add('alt+home',      {propagate: true},function(){send_action("KEY",0,0,"ALT_HOME","");});
    jQuery.hotkeys.add('alt+left',      {propagate: true},function(){send_action("KEY",0,0,"ALT_LEFT","");});
    jQuery.hotkeys.add('alt+right',      {propagate: true},function(){send_action("KEY",0,0,"ALT_RIGHT","");});
    
    jQuery.hotkeys.add('ctrl+p',        {propagate: true},function(){send_action("KEY",0,0,"CTRL_P","");});  
    jQuery.hotkeys.add('ctrl+shift+f12',{propagate: true},function(){send_action("KEY",0,0,"CTRL_F12_SHIFT","");});
    
    jQuery.hotkeys.add('ctrl+shift+home',{propagate: true},function(){send_action("KEY",0,0,"CTRL_HOME_SHIFT","");});      
    jQuery.hotkeys.add('ctrl+shift+end' ,{propagate: true},function(){send_action("KEY",0,0,"CTRL_END_SHIFT","");});
    
}

jQuery(document).ready(keysMon);


		

// ------------------------------------------------------------------------//	
// Mouse wheel monitoring 	

var wheelCounter = 0;
var wheelDeltaCounter = 0;

function handle(delta) {
	wheelCounter++;
	if (delta < 0)
		wheelDeltaCounter--;
  else
		wheelDeltaCounter++;  
send_action("WHEEL",wheelCounter,wheelDeltaCounter,delta,"");
}

function wheel(event){
	var delta = 0;
	if (!event) event = window.event;
	if (event.wheelDelta) {
		delta = event.wheelDelta/120; 
		if (window.opera) delta = -delta;
	} else if (event.detail) {
		delta = -event.detail/3;
	}
	if (delta)
		handle(delta);
}

/* Initialization code. */
if (window.addEventListener)
	window.addEventListener('DOMMouseScroll', wheel, false);
window.onmousewheel = document.onmousewheel = wheel;

// ------------------------------------------------------------------------//	
// Fill select options of boring lists of years, days, values...

function selectNumberOptions(start,end,filler){
    var options = '';
    if(filler)
    options += '<option value="--">--</option>';     
    for (var i = start; i < end; i++) {
    	options += '<option value="' + i + '">' + i + '</option>';
    }
    return options;
}


// ------------------------------------------------------------------------//	
// Look and Fell - highlight current question in forms

$(function() {
    $('input,select').focus(function(){$(this).parents('li').addClass('focused')});
    $('input,select').click(function(){$(this).parents('li').addClass('focused')});
    $('input,select').blur(function(){$(this).parents('li').removeClass('focused')});
});

// ------------------------------------------------------------------------//
// Font Size

var fontSizeChange = 0;	

// ------------------------------------------------------------------------//	
// Validation of select boxes with multiple option 

$("form").submit(function() {
$("select[multiple] option[value='--']").attr('selected', 'selected');
    });
// ------------------------------------------------------------------------//


