
function GenernetAnalytics() {}

GenernetAnalytics.DELAY = 2000; // 2s
GenernetAnalytics.LOG_LEVEL = 2; // 0=nothing; 1=load,close; 2=load,get,close;
GenernetAnalytics.METHOD = "GET";
GenernetAnalytics.ACTION = "publicStatistics.pu";
GenernetAnalytics.PARAMS = {};
GenernetAnalytics.PARAMS.UID_SESSION = "";
GenernetAnalytics.PARAMS.ENTORNO = "";
GenernetAnalytics.PARAMS.COMPANY = "";
GenernetAnalytics.PARAMS.USER = "";
GenernetAnalytics.PARAMS.IP_CLIENT = "0.0.0.0";
GenernetAnalytics.PARAMS.PORTAL = "";

GenernetAnalytics.startStatistics = function() {	
	GenernetAnalytics.getInstance().init();
};

GenernetAnalytics.sendStatistic = function( label, url, src, uid ) {
	GenernetAnalytics.getInstance().sendStatistic( label, url, src, uid );
};

GenernetAnalytics.finalice = function() {
	GenernetAnalytics.getInstance().finalice();
};

GenernetAnalytics.getInstance = function() {
	if( !window.genernetAnalytics ) {
		window.genernetAnalytics = new GenernetAnalytics();
	}
	return window.genernetAnalytics;
};

(function($){
	var statisticsRemaining = new Array();
	var interval = false;
	var numPeticion = 0;
	var sendTimeout = false;
	var http = null;
	var httpAbort = false;
	
	// IE6, IE7
	if( !window.XMLHttpRequest ) {
		window.XMLHttpRequest = function() {
			try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch( e ) {}
			var req = function(){};
			req.prototype = {
				open: function(){},
				setRequestHeader: function(){},
				send: function(){}
			};
			return req;
		};
	}
	
	var send = function( async ) {
		if( statisticsRemaining.length > 0 ) {
			var data = statisticsRemaining.splice( 0, 1 )[0];
			if( http ) { 
				try { http.abort(); } catch(e) {} 
			} else {
				http = new XMLHttpRequest();
			}
			try{
			http.open( $.METHOD, $.ACTION + "?" + param(data), async );
			http.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
			http.send();
			}catch(err){}
		}
	};
	
	var sendDeferred = function( data ) {
		statisticsRemaining[statisticsRemaining.length] = data;
	};
	
	var sendLoadStatistic = function() {
		if( $.LOG_LEVEL == 1 || $.LOG_LEVEL == 2 ) {
			numPeticion++;
			var data = {
				"type": "LOAD",
				"timestamp": (new Date()).getTime(),
				"uidSession": $.PARAMS.UID_SESSION,
				"entorno": $.PARAMS.ENTORNO,
				"company": $.PARAMS.COMPANY,
				"portal": $.PARAMS.PORTAL,
				"user": $.PARAMS.USER,
				"ip": $.PARAMS.IP_CLIENT,
				"userAgent": window.navigator.userAgent,
				"width": window.screen.width,
				"height": window.screen.height,
				"numPeticion": numPeticion
			};
			sendDeferred( data );
		}
	};
	
	var sendGetStatistic = function( label, url, src, uidMenu ) {
		if( $.LOG_LEVEL == 2 ) {
			numPeticion++;
			var data = {
				"type": "GET",
				"timestamp": (new Date()).getTime(),
				"uidSession": $.PARAMS.UID_SESSION,
				"label": label,
				"url": url,
				"uidMenu": uidMenu? uidMenu: "",
				"numPeticion": numPeticion,
				"source": src? src: ""
			};
			sendDeferred( data );
		}
	};
	
	var sendCloseStatistic = function() {
		if( $.LOG_LEVEL == 1 || $.LOG_LEVEL == 2 ) {
			numPeticion++;
			var data = {
				"type": "CLOSE",
				"timestamp": (new Date()).getTime(),
				"uidSession": $.PARAMS.UID_SESSION,
				"numPeticion": numPeticion
			};
			sendDeferred( data );
		}
	};
	
	// (jquery) Serialize an array of a set of key/values into a query string
	var param = function(a) {
		var s = [ ];
		var add = function( key, value ){
			s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
		};
		// Serialize the key/values
		for ( var j in a ) {
			add( j, a[j] );
		}
		// Return the resulting serialization
		return s.join("&").replace(/%20/g, "+");
	};
	
	/**
	 * Inicialitza l'objecte
	 * IMPORTANT: s'ha de cridar a l'onload
	 */
	$.prototype.init = function() {
		if( !$.ACTION || $.ACTION.length == 0 ) {
			$.LOG_LEVEL = 0;
		}
		if( $.LOG_LEVEL == 1 || $.LOG_LEVEL == 2 ) {
			sendLoadStatistic();
			
			var self = this;
			if( window.attachEvent ) {
				window.attachEvent( "onbeforeunload", function() {
					self.finalice();
				});
			} else if( window.addEventListener ) {
				window.addEventListener( "beforeunload", function() {
					self.finalice();
				}, false );
			}
			
			interval = window.setInterval( function() {
				send( true );
			}, GenernetAnalytics.DELAY );
			
			// evitem que ens cridin l'init més d'un cop
			this.init = function() {};
		}
	};
	
	/**
	 * Envia un event de forma asincrona al servidor perquè es registri
	 */
	$.prototype.sendStatistic = function( label, url, src, uid ) {
		sendGetStatistic( label, url, src, uid );
	};
	
	/**
	 * Força l'enviament dels events
	 */
	$.prototype.flush = function() {
		if( interval ) {
			window.clearInterval( interval );
			interval = false;
		}
		while( statisticsRemaining.length > 0 ) {
			send( false );
		}
	};
	
	/**
	 * Finalitza l'enviament de les estadístiques
	 */
	$.prototype.finalice = function() {
		sendCloseStatistic();
		this.flush();
		
		// evitem l'enviament de més estadístiques
		send = function(){}; 
		sendDeferred = function(){};
	};

})(GenernetAnalytics);



