﻿function DDObject()
{
    this.GetSensor = function(customerGUID, siteid)
    {
        if (siteid != null) return new DDSensor(customerGUID, siteid);
        else return new DDSensor(customerGUID, 0);
    }
}

var __DDSelf;

/* UUID Generation */

function UUID(){
	this.id = this.createUUID();
}

UUID.prototype.valueOf = function(){ return this.id; }
UUID.prototype.toString = function(){ return this.id; }
UUID.prototype.createUUID = function(){
  
	var dg = new Date(1582, 10, 15, 0, 0, 0, 0);
	var dc = new Date();
	var t = dc.getTime() - dg.getTime();
	var h = '-';
	var tl = UUID.getIntegerBits(t,0,31);
	var tm = UUID.getIntegerBits(t,32,47);
	var thv = UUID.getIntegerBits(t,48,59) + '1'; // version 1, security version is 2
	var csar = UUID.getIntegerBits(UUID.rand(4095),0,7);
	var csl = UUID.getIntegerBits(UUID.rand(4095),0,7);

	var n = UUID.getIntegerBits(UUID.rand(8191),0,7) + 
			UUID.getIntegerBits(UUID.rand(8191),8,15) + 
			UUID.getIntegerBits(UUID.rand(8191),0,7) + 
			UUID.getIntegerBits(UUID.rand(8191),8,15) + 
			UUID.getIntegerBits(UUID.rand(8191),0,15); // this last number is two octets long
	return tl + h + tm + h + thv + h + csar + csl + h + n; 
}

UUID.getIntegerBits = function(val,start,end){
	var base16 = UUID.returnBase(val,16);
	var quadArray = new Array();
	var quadString = '';
	var i = 0;
	for(i=0;i<base16.length;i++){
		quadArray.push(base16.substring(i,i+1));	
	}
	for(i=Math.floor(start/4);i<=Math.floor(end/4);i++){
		if(!quadArray[i] || quadArray[i] == '') quadString += '0';
		else quadString += quadArray[i];
	}
	return quadString;
}


UUID.returnBase = function(number, base){
	return (number).toString(base).toUpperCase();
}


UUID.rand = function(max){
	return Math.floor(Math.random() * (max + 1));
}




function DDSensor(customerGUID, siteid)
{
    __DDSelf = this;
    /* Variabili private */
    
	var _imgs = new Array();
	var _imgIdx=0;
	
    /* NOTE: Update when publish */
    // var _imagePath = "//213.215.225.106/DD3/Sensor/WebSensor.aspx";
    // var _imagePath = "//dla.domodomain.com/Sensor/WebSensor.aspx";
    var _imagePath = "//saas.intelligencefocus.com/sensor/WebSensor.aspx";
    // var _imagePath_2 = "//dla.domodomain.com/Test/Sensor/WebSensor.aspx";
    _imagePath_2 = null;
    
    var _customerGUID = customerGUID;
    var _siteid = siteid;
    var _titleAsLabel = false;
    var _customValue;
    var _queryStringParamToBeIgnored = null;

    var _sendAlive = false;
    var _aliveTimer;
    var _aliveTick = 30000;
    
    var _timezone = 0;
    var _width = 0;
    var _height = 0;
    var _app = "";
    var _color = 0;
	var __ddvc;
	
	var _pending = false;
    var _urls = new Array();
		
    var _divBase =
	        "<img src=\""  +
	        "[[IMGSRC]]" +
	        "\" width=\"1\" height=\"1\" >";
	        
    
    var _searchEngines = new Array();
    _searchEngines[0] = {e:'yahoo', q:'p'};
    _searchEngines[1] = {e:'msn', q:'q'};
    _searchEngines[2] = {e:'aol', q:'query'};
    _searchEngines[3] = {e:'aol', q:'encquery'};
    _searchEngines[4] = {e:'lycos', q:'query'};
    _searchEngines[5] = {e:'ask', q:'q'};
    _searchEngines[6] = {e:'altavista', q:'q'};
    _searchEngines[7] = {e:'netscape', q:'query'};
    _searchEngines[8] = {e:'cnn', q:'query'};
    _searchEngines[9] = {e:'looksmart', q:'qt'};
    _searchEngines[10] = {e:'about', q:'terms'};
    _searchEngines[11] = {e:'mamma', q:'query'};
    _searchEngines[12] = {e:'alltheweb', q:'q'};
    _searchEngines[13] = {e:'gigablast', q:'q'};
    _searchEngines[14] = {e:'voila', q:'rdata'};
    _searchEngines[15] = {e:'virgilio', q:'qs'};
    _searchEngines[16] = {e:'live', q:'q'};
    _searchEngines[17] = {e:'baidu', q:'wd'};
    _searchEngines[18] = {e:'alice', q:'qs'};
    _searchEngines[19] = {e:'yandex', q:'text'};
    _searchEngines[20] = {e:'najdi', q:'q'};
    _searchEngines[21] = {e:'aol', q:'q'};
    _searchEngines[22] = {e:'club-internet', q:'query'};
    _searchEngines[23] = {e:'mama', q:'query'};
    _searchEngines[24] = {e:'seznam', q:'q'};
    _searchEngines[25] = {e:'search.live', q:'q'};        
    _searchEngines[26] = {e:'search', q:'q'};
    _searchEngines[27] = {e:'wp', q:'szukaj'};
    _searchEngines[28] = {e:'onet', q:'qt'};
    _searchEngines[29] = {e:'netsprint', q:'q'};
    _searchEngines[30] = {e:'google.interia', q:'q'};
    _searchEngines[31] = {e:'szukacz', q:'q'};
    _searchEngines[32] = {e:'yam', q:'k'};
    _searchEngines[33] = {e:'pchome', q:'q'};
    _searchEngines[34] = {e:'kvasir', q:'searchExpr'};
    _searchEngines[35] = {e:'sesam', q:'q'};
    _searchEngines[36] = {e:'ozu', q:'q'};
    _searchEngines[37] = {e:'terra', q:'query'};
    _searchEngines[38] = {e:'nostrum', q:'query'};
    _searchEngines[39] = {e:'mynet', q:'q'};
    _searchEngines[40] = {e:'ekolay', q:'q'};
    _searchEngines[41] = {e:'search.ilse', q:'search_for'};
    _searchEngines[42] = {e:'google', q:'q'};
    _searchEngines[43] = {e:'bing', q:'q'};   
    
    
    /* Funzioni */
    
    function _computeSerachEngine(referrer)
    {
        var _searchEngine;
        var _searchQuery;
        
        var i;
        
        // Test use only
        
        for (i in _searchEngines)
        {
            var _regex = new RegExp("^https?://\\w+\\." + _searchEngines[i].e + "\\.\\w+");
            _regex.ignoreCase = true;
            if (_regex.test(referrer))
            {
                _searchEngine = _searchEngines[i].e;
                var _qs = referrer.replace(_regex,"");
                
                var _regexQS = new RegExp("[&\\?]" + _searchEngines[i].q + "=[^&]*");
                var _TMPsearchQuery = _regexQS.exec(_qs);
                _regexQS = new RegExp("[&\\?]" + _searchEngines[i].q + "=");
                _searchQuery = _TMPsearchQuery.toString().replace(_regexQS, "");
                break;
            }
        }
        
        return  "&searchengine=" + _searchEngine +
                "&searchquery=" + _searchQuery;
    }
    
    function _getImageQueryParam(event, isCustomEvent, location, label, eventValue)
    {
        
        var _clientdatetime = 0;
        var n = new Date();
        _clientdatetime = n.getTime();
        
        
        return  "?customerGUID=" + _customerGUID +
                "&ddid=" + _customerGUID +
                "&siteid=" + _siteid +
                "&rnd=" + Math.random() +
	            "&color=" + _color +
	            "&width=" + _width +
	            "&height=" + _height +
	            "&timezone=" + _timezone +
	            "&clientdatetime=" + _clientdatetime +
	            "&referrer=" + escape(document.referrer) +
	            "&event=" + escape(event) +
	            "&iscustomevent=" + isCustomEvent.toString() +
	            "&eventvalue=" + escape(eventValue) +
	            "&customvalue=" + escape(_customValue) +
	            "&location=" + location +
	            "&label=" + escape(label) +
				"&__ddvc=" + __ddvc +
	            _computeSerachEngine(document.referrer);
    }
    
    function _cleanQueryString(url)
    {
        var _url = url.toString();
        var p;
        
		/*        
			alert(_url);
			alert(typeof('_url'));                            
		*/
        
        if (_queryStringParamToBeIgnored)
        {        
            for (var i=0; i<_queryStringParamToBeIgnored.length; i++)
            {                
                var p1 = new RegExp("[?]" + _queryStringParamToBeIgnored[i] + "=[^&]*&");
                var p2 = new RegExp("[?]" + _queryStringParamToBeIgnored[i] + "=[^&]*");
                var p3 = new RegExp("[&]" + _queryStringParamToBeIgnored[i] + "=[^&]*");
                                                                                       
                if (_url.match(p1))            
                {
                    // alert("p1 match");
                    _url = _url.replace(p1, "?");
                }
                    
                if (_url.match(p2))
                {
                    // alert("p2 match");
                    _url = _url.replace(p2, "");
                }
                
                if (_url.match(p3))
                {
                    // alert("p3 match");
                    _url = _url.replace(p3, "");
                }                
            }
        }
        // alert(_url);
        
        return _url;
    }
    
	function _imageLoading() {
        if (_urls.length != 0) {
            // console.log('image loaded: ' + this.src);
            this.onload = null;
            var url = _urls.shift();
            _imgs[_imgIdx] = new Image(1, 1);
            _imgs[_imgIdx].src = url;
            _imgs[_imgIdx].onload = _imageLoading;
            _imgIdx++;                        
        }
        else {
            _pending = false;    // no more image to load
            // console.log('no more url pending');
        }
    }
    
    function _inject(imgSrc, level)
    {
     
		if (document.images)
		{
			if (!_pending) { // if no loading is pending load the new image                
                _pending = true;
                _imgs[_imgIdx] = new Image(1, 1);
                _imgs[_imgIdx].src = imgSrc;
                _imgs[_imgIdx].onload = _imageLoading;
                _imgIdx++;
            }
            else {
                // console.log('equeue: ' + imgSrc);
                _urls.push(imgSrc);
            }
		}
		else
		{
			if (level == null) 
				level=0;        
		
			var _div = _divBase.replace("[[IMGSRC]]",imgSrc);
					
			if (_imagePath_2!=null && _imagePath_2.length>0) 
			{                   
				if (level == 0)
				{
					var __DDDIV_0 = document.getElementById('__DDDIV_0');
					__DDDIV_0.innerHTML = _div;
				}
				if (level == 2)
				{
					var __DDDIV_2 = document.getElementById('__DDDIV_2');
					__DDDIV_2.innerHTML = _div;
				}                
			}
			else
			{
				var __DDDIV = document.getElementById('__DDDIV');
				__DDDIV.innerHTML = _div;
			}
		}
		
		
		
    }
    
    this._trackAlive = function()
    {
        var url = null;
        var label = null;
        
        var _location = ((url!=null && url.length>0)?url:document.URL);
        var _label = _location;
        if (_titleAsLabel && document.title!=null && document.title.length>0) _label = document.title;
        if (label!=null && label.length>0) _label = label;
        
        var _imgSrc = document.location.protocol + _imagePath + _getImageQueryParam("__alive", false, _location, _label);
        _inject(_imgSrc);
        
        /* Doppia chiamata */
        if (_imagePath_2!=null && _imagePath_2.length>0)
        {
            _imgSrc = document.location.protocol + _imagePath_2 + _getImageQueryParam("__alive", false, _location, _label);
            _inject(_imgSrc, 2);
        }

    }
    
    /* Metodi pubblici */
    
    
    this.Initialize = function(injectDiv)
    {    
        var n = new Date();
        
        _timezone = n.getTimezoneOffset();
        _width=screen.width;
        _height=screen.height;
        _app=navigator.appName;
        
        var __DDDIV_0 = "<div id='__DDDIV_0' style=\"width:1px; height:1px; display:none;\"></div>";
        var __DDDIV_2 = "<div id='__DDDIV_2' style=\"width:1px; height:1px; display:none;\"></div>";
        
        if (_app!="Netscape") 
            _color=screen.colorDepth;
        else 
            _color=screen.pixelDepth;
        
		if (!document.images)
		{	
			if (injectDiv == null || injectDiv)
			{
				// sensor inject the main div __DDDIV        	
				if (_imagePath_2!=null && _imagePath_2.length>0)
				{
					// inject main div (__DDDIV) and his childs for double injection (__DDDIV_0, __DDDIV_2)
					document.write("<div id='__DDDIV' style=\"width:1px; height:1px; display:none;\">" + 
								   __DDDIV_0 +
								   __DDDIV_2 +        	                   
								   "</div>"
								  );        				
				}
				else
				{
					// inject main div (__DDDIV) only
					document.write("<div id='__DDDIV' style=\"width:1px; height:1px; display:none;\"></div>");        
				}
			}
			else {                
				// main div already present on page, inject only childs div if needed (double injection)
				if (_imagePath_2!=null && _imagePath_2.length>0)
				{
					// inject child div
					var __DDDIV = document.getElementById('__DDDIV');        
					if (__DDDIV != null)
					{
						__DDDIV.innerHTML = __DDDIV_0 + __DDDIV_2;
					}
				} 
			}
		}		
		
		// check for cookie
		__ddvc = _getCookie("__ddvc");
		if (!__ddvc)
		{	
			__ddvc = new UUID();
			_setCookie("__ddvc",__ddvc);
		}
    }
    
    
    
    this.TrackPageview = function(url,label)
    {
        var _location = ((url!=null && url.length>0)?url:document.location);

        var _label = _location;
        if (_titleAsLabel && document.title!=null && document.title.length>0) _label = document.title;
        if (label!=null && label.length>0) _label = label;


        _location = _cleanQueryString(_location);
        _location = encodeURIComponent(_location);
        _label = encodeURIComponent(_label);

        var _imgSrc = document.location.protocol + _imagePath + _getImageQueryParam("__pageview", false, _location, _label);
        _inject(_imgSrc);
        /* Doppia chiamata */
        if (_imagePath_2!=null && _imagePath_2.length>0)
        {
            _imgSrc = document.location.protocol + _imagePath_2 + _getImageQueryParam("__pageview", false, _location, _label);
            _inject(_imgSrc, 2);
        }
		_sleep(500);
		return true;
    }
    
    function _sleep(naptime)
    {
          var sleeping = true;
          var now = new Date();
          var alarm;
          var startingMSeconds = now.getTime();
          while(sleeping){
             alarm = new Date();
             alarmMSeconds = alarm.getTime();
             if(alarmMSeconds - startingMSeconds > naptime){ sleeping = false; }
          }      
    }
    
	// set visitor coolie
	function _setCookie(name, value)
	{
		// expire date
		var exp = new Date();		
		var ts = exp.getTime() + (365*2*24*60*60*1000);
		exp.setTime(ts);
		
		// domain
		var host = location.host;		
		if (host.substring(0,4).toLowerCase()=="www.")
			host=host.substring(4);
		
		var cookie;
		
		if (host.toLowerCase()!="localhost")
			cookie = name + "=" + value + "; expires=" + exp.toGMTString() + "; domain=" + host +"; path=/";
		else
			cookie = name + "=" + value + "; expires=" + exp.toGMTString() + ";";
			
		document.cookie = cookie;
	}
	
	function _getCookie(name)
	{
		var arg=name+"=";
		var alen=arg.length;
		var clen=document.cookie.length;
		var i=0;
		var res = null;
		while(i<clen)
		{
			var j=i+alen;
			if (document.cookie.substring(i,j)==arg) {
				res = _getCookieVal(j);
				break;
			}
			else
			{
				i=document.cookie.indexOf(" ", i) +1;
				if(i==0)
					break;				
			}
		}		
		return res;
	}
			
	function _getCookieVal(offset)
	{
		var endstr = document.cookie.indexOf(";", offset);
		if (endstr==-1)
			endstr = document.cookie.length;
		return document.cookie.substring(offset, endstr);
	}
		
    this.TrackResource = function(url,label)
    {
        var _location = ((url!=null && url.length>0)?url:"");
        var _label = ((label!=null && label.length>0)?label:_location);

        var _imgSrc = document.location.protocol + _imagePath + _getImageQueryParam("__resource", false, _location, _label);
        _inject(_imgSrc);
        /* Doppia chiamata */
        if (_imagePath_2!=null && _imagePath_2.length>0)
        {
            _imgSrc = document.location.protocol + _imagePath_2 + _getImageQueryParam("__resource", false, _location, _label);
            _inject(_imgSrc, 2);
        }
        _sleep(500);
        return true;
        
    }
    
    this.TrackLink = function(sender,url,label)
    {
        var _location = "";
        if (sender!=null)
        {
            _location = sender.href;
        }
        var _location = ((url!=null && url.length>0)?url:_location);        
        var _label = ((label!=null && label.length>0)?label:_location);

        var _imgSrc = document.location.protocol + _imagePath + _getImageQueryParam("__link", false, _location, _label);
        _inject(_imgSrc);
        /* Doppia chiamata */
        if (_imagePath_2!=null && _imagePath_2.length>0)
        {
            _imgSrc = document.location.protocol + _imagePath_2 + _getImageQueryParam("__link", false, _location, _label);
            _inject(_imgSrc, 2);
        }
        _sleep(500);
        return true;
        
    }
    
    this.TrackCustomEvent = function(event,value)
    {
        var url = null;
        var label = null;
        
        var _location = ((url!=null && url.length>0)?url:document.URL);

        var _label = _location;
        if (_titleAsLabel && document.title!=null && document.title.length>0) _label = document.title;
        if (label!=null && label.length>0) _label = label;
        
        var _imgSrc = document.location.protocol + _imagePath + _getImageQueryParam(event, true, _location, _label, value);
        _inject(_imgSrc);
        /* Doppia chiamata */
        if (_imagePath_2!=null && _imagePath_2.length>0)
        {
            _imgSrc = document.location.protocol + _imagePath_2 + _getImageQueryParam(event, true, _location, _label, value);
            _inject(_imgSrc, 2);
        }		
		return true;
    }
    
    this.trackCustomEventAndFillImage = function(event,value,imgID)
    {
        var url = null;
        var label = null;
        
        var _location = ((url!=null && url.length>0)?url:document.URL);

        var _label = _location;
        if (_titleAsLabel && document.title!=null && document.title.length>0) _label = document.title;
        if (label!=null && label.length>0) _label = label;
        
        var _imgSrc = document.location.protocol + _imagePath + _getImageQueryParam(event, true, _location, _label, value);
        _inject(_imgSrc);
        /* Doppia chiamata */
        if (_imagePath_2!=null && _imagePath_2.length>0)
        {
            _imgSrc = document.location.protocol + _imagePath_2 + _getImageQueryParam(event, true, _location, _label, value);
            _inject(_imgSrc, 2);
        }
        
        document.getElementById(imgID).innerHTML = "<img src=\"" + (value + '.gif') + "\" width=\"32\" height=\"32\" >" ;        
		return true;        
    }
    
    
    /* Proprietà */
    
    this.SetCustomValue = function(value)
    {
        _customValue = value;
    }
    
    this.SetTitleAsLabel = function(value)
    {
        _titleAsLabel=value;
    }
    
    this.SetQueryStringParamToBeIgnored = function(paramArray)
    {
        _queryStringParamToBeIgnored = paramArray;
    }
    
    this.SendAlive = function(value)
    {
        if (_sendAlive!=value)
        {
            _sendAlive = value;
            if (_sendAlive)
            {
                _aliveTimer = setInterval("__DDSelf._trackAlive()" ,_aliveTick);
            }
            else
            {
                clearInterval(_aliveTimer);
            }
        }
        
    }
    
    
    
}

var __dd = new DDObject();
