
var cmServer = './intermediator.php';
var cmAjaxMutexes = new Array();
var cmPage = '';
var cmReferrer = '';
var cmBrowser = null;

var cmLastIframe = -1;
var cmAdsensesArray = new Array();
var cmAdsenseFocused = false;



function Clicksmap_getClickDetails(event) {
   try {
      var options = new Array();
	   options['c'] = null; //button
	   options['d'] = null; //destination url
	   options['x'] = null; //click x
	   options['y'] = null; //click y
	   options['w'] = null; //client width
      if (!event) {
         event = window.event;
         c = event.button;
         if (c == 0) {
            c = 1;
         }
      } else {
         c = event.which;
      }
		if (c == 0) {
			Clicksmap_debugMessage('Click not logged: no button pressed');
			return true;
		}
      options['c'] = c;
      var hyperNode = null;

      if (event['srcElement']) {
         hyperNode = event['srcElement'];
      } else if(event['target']) {
         hyperNode = event['target'];
      }
      var destinationUrl = '';
      var linkHTML = '';
      if (hyperNode) {
         while (hyperNode && 'html' != hyperNode['tagName'].toLowerCase() && 'body' != hyperNode['tagName'].toLowerCase()) {
            if ('a' == hyperNode['tagName'].toLowerCase() && hyperNode['href']) {
               destinationUrl = hyperNode['href'];
               linkHTML = hyperNode.innerHTML;
               break;
            }
            hyperNode = hyperNode['parentNode'];
         }
      }

      options['d'] = destinationUrl;
      options['lh'] = linkHTML;


		x = event.clientX;
		y = event.clientY;

		d = document.documentElement != undefined && document.documentElement.clientHeight != 0 ? document.documentElement : document.body;
		scrollx = window.pageXOffset == undefined ? d.scrollLeft : window.pageXOffset;
		scrolly = window.pageYOffset == undefined ? d.scrollTop : window.pageYOffset;
		w = window.innerWidth == undefined ? d.clientWidth : window.innerWidth;
		h = window.innerHeight == undefined ? d.clientHeight : window.innerHeight;
		/** Is the click in the viewing area? Not on scrollbars */
		if (x > w || y > h) {
   		Clicksmap_debugMessage('Click not logged: out of document (should be a click on scrollbars under IE)');
			return true;
		}
		var screenSize = window.screen.width;
		options['x'] = x + scrollx;
		options['y'] = y + scrolly;
		options['w'] = w;
		options['ss'] = screenSize;
      options['d'] = options['d'];
      return options;

   } catch(exception) {

   }
}


function Clicksmap_catchAsClick(e, a) {
   try {
      var paramsStr = 't=gac&';

      switch (cmBrowser) {
         case 'msie':
            if (!e) {
               e = window.event;
      			element = e.srcElement;
            } else {
      			element = null;
            }
      		/** Filter for same iframe (focus on iframe => popup ad => close ad => new focus on same iframe) */
      		if (element != null && element.tagName.toLowerCase() == 'iframe') {
      			if (element.sourceIndex == cmLastIframe) {
            		Clicksmap_debugMessage('Click not logged: same iframe (happens when a click on iframe occured opening a popup and popup is closed)');
      				return true;
      			}
      			cmLastIframe = element.sourceIndex;
      		} else {
      			cmLastIframe = -1;
      		}
         case 'opera':
            var options = Clicksmap_getClickDetails(e);
      		paramsStr += Clicksmap_makeRequestString(options);
            break;
      }

      paramsStr += Clicksmap_makeRequestString(a);
      Clicksmap_XMLHTTP_Send(paramsStr);
	} catch(exception) {
		Clicksmap_debugMessage('An error occurred while processing click' + exception.toString());
	}
	return true;
}

function Clicksmap_catchClick(e) {
   try {
      var options = Clicksmap_getClickDetails(e);
		var paramsStr = 't=click&' + Clicksmap_makeRequestString(options);
      Clicksmap_XMLHTTP_Send(paramsStr);
	} catch(exception) {
   	Clicksmap_debugMessage('An error occurred while processing click' + exception.toString());
	}
	return true;
}


function Clicksmap_handleASClick(iframe) {
   var options = new Array();
   var src = iframe.getAttribute('src');
   options['t'] = 'gaa';

   var params = Clicksmap_getSignificantParamsForGas(src);
   var index = 0;

   if (cmAdsensesArray[params]) {
      index = ++cmAdsensesArray[params];
   } else {
      index = 1;
      cmAdsensesArray[params] = index;
   }

   var additionalParams = new Array();
   additionalParams['is'] = src;
   additionalParams['a'] = new Array(params, index);

   var paramsStr = Clicksmap_makeRequestString(options);
   paramsStr += Clicksmap_makeRequestString(additionalParams);
   Clicksmap_XMLHTTP_Send(paramsStr)

   switch (cmBrowser) {
      case 'msie':
         if (typeof iframe.onfocus == 'function') {
            currentFunc = iframe.onfocus;
            iframe.onfocus = function(e) {
               Clicksmap_catchAsClick(e, additionalParams);
               return currentFunc(e);
            }
         } else {
            iframe.onfocus = function(e) {
               Clicksmap_catchAsClick(e, additionalParams);
            }
         }
         break;

      case 'firefox':
      case 'mozilla':
      	iframe.onmouseover = function() {
      	   cmAdsenseFocused = additionalParams;
      	}

      	iframe.onmouseout = function() {
      	   cmAdsenseFocused = false;
      	}

      	window.onbeforeunload = function(e) {
      	   if (cmAdsenseFocused) {
               Clicksmap_catchAsClick(e, cmAdsenseFocused);
               cmAdsenseFocused = false;
      	   }
      	}
         break;

      case 'opera':
         if (typeof iframe.onmouseover == 'function') {
            currentFunc = iframe.onmouseover;
            iframe.onmouseover = function(e) {
               Clicksmap_catchAsClick(e, additionalParams);
               return currentFunc(e);
            }
         } else {
            iframe.onmouseover = function(e) {
               Clicksmap_catchAsClick(e, additionalParams);
            }
         }

         break;
   }
}

function initcm() {

   if ((window.location.href.search(/testcm/) != -1)) {
      Clicksmap_test();
      return;
   }

   cmPage = location.href;
   cmReferrer = document.referrer;
   cmBrowser = Clicksmap_getBrowser();

   var options = new Array();
   options['t'] = 'visit'; //type (is click or visit)

	/** Add onmousedown event */
	if (typeof document.onclick == 'function') {
		currentFunc = document.onclick;
		document.onclick = function(e) {
         Clicksmap_catchClick(e);
         return currentFunc(e);
		}
	} else {
		document.onclick = Clicksmap_catchClick;
	}

   var paramsStr = Clicksmap_makeRequestString(options);
	Clicksmap_XMLHTTP_Send(paramsStr, 'mutex_load');
	var cmInerval1 = setInterval(
      function() {
         if (!cmAjaxMutexes['mutex_load']) {
         	iFrames = document.getElementsByTagName('iframe');
         	for (var i = 0; i < iFrames.length; i++) {
         	   if (0 == iFrames[i].getAttribute('src').indexOf('http://pagead2.googlesyndication.com')) {
                  Clicksmap_handleASClick(iFrames[i]);
         	   }
         	}
         	clearInterval(cmInerval1);
         }
      },
      100
	);
}

function  Clicksmap_XMLHTTP_Send(paramsStr) {
   var sent = true;
   if (arguments.length > 1) {
      var mutexName = arguments[1];
      cmAjaxMutexes[mutexName] = true;
   }
   if (cmServer.substring(0, 4) != 'http') {
      var xmlhttp = false;
      try {
         xmlhttp = new XMLHttpRequest();
      }  catch (e) {
         try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (oc) {
               xmlhttp = null;
            }
         }
      }
      if (xmlhttp) {
         xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
               if (xmlhttp.status == 200) {
                  Clicksmap_debugMessage('reuqest sent ' + cmServer + '?' + paramsStr + '\n\nServer answer: ' + xmlhttp.responseText);
               } else if (xmlhttp.status == 404) {
                  Clicksmap_debugMessage('server not found at: ' + cmServer );
               } else {
                  Clicksmap_debugMessage('server returned a status code ' + xmlhttp.status + ' with the following error: ' + xmlhttp.responseText);
               }
               if (mutexName && cmAjaxMutexes[mutexName]) {
                  cmAjaxMutexes[mutexName] = false;
               }
            }
         }
         xmlhttp.open("POST", cmServer, true);
         xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
         var options = new Array();
         options['s'] = cmPage;
         options['b'] = cmBrowser;
         options['r'] = cmReferrer;
         paramsStr += Clicksmap_makeRequestString(options);
         xmlhttp.send(paramsStr);
         sent = true;
      }
   }
   return sent;
}

function Clicksmap_makeRequestString(options) {
   var paramsStr = '';
   for (var i in options) {
      if (options[i] && ('string' == typeof(options[i]) || 'number' == typeof(options[i]) || 'bool' == typeof(options[i]))) {
         paramsStr += i + '=' + encodeURIComponent(options[i]) + '&';
      } else if (options[i] && 'object' == typeof(options[i])) {
         for (var y = 0; y < options[i].length; y++) {
            paramsStr += i + '[]=' + encodeURIComponent(options[i][y]) + '&';
         }
      }
   }
   return paramsStr;
}

function Clicksmap_getBrowser() {
   /** Also the User-Agent is not the best value to use, it's the only one that gives the real browser */
   b = navigator.userAgent != undefined ? navigator.userAgent.toLowerCase().replace(/-/g, '') : '';
   b0 = b.replace(/^.*(firefox|kmeleon|safari|msie|opera).*$/, '$1');
   if (b == b0 || b0 == '') {
      if (b.match(/mozilla/i)) {
         b0 = 'mozilla';
      } else {
         b0 = 'unknown';
      }
   }
   return b0;
}


function Clicksmap_debugMessage(msg) {
   var cmDebug = (window.location.href.search(/debugcm/) != -1);
   if (cmDebug == true) {
      alert(msg);
   }
}

function Clicksmap_parseQuery(str) {
   var qPos = str.indexOf('?');
   var queryPart = (qPos >= 0)?str.substr(qPos + 1):str;
   var pairs = queryPart.split('&');
   var vars = new Array();
   for (var i = 0; i < pairs.length; i++) {
      pair = pairs[i];
      ePos = pair.indexOf('=');
      if (-1 != ePos) {
         k = pair.substr(0, ePos);
         v = pair.substr(ePos + 1);
         vars[k] = v;
      }
   }
   return vars;
}

function Clicksmap_getSignificantParamsForGas(url) {
   var arr = Clicksmap_parseQuery(url);
   var paramsString = 'ad_type=' + arr['ad_type'];
   paramsString += '&client=' + arr['client'];
   paramsString += '&color_bg=' + arr['color_bg'];
   paramsString += '&color_border=' + arr['color_border'];
   paramsString += '&color_link=' + arr['color_link'];
   paramsString += '&color_text=' + arr['color_text'];
   paramsString += '&color_url=' + arr['color_url'];
   paramsString += '&format=' + arr['format'];
   return paramsString;
}

function Clicksmap_test() {
   if (cmServer.substring(0, 4) != 'http') {
      var xmlhttp = false;
      try {
         xmlhttp = new XMLHttpRequest();
      }  catch (e) {
         try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (oc) {
               xmlhttp = null;
            }
         }
      }
      if (xmlhttp) {
         xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
               if (xmlhttp.status == 200) {
                  if ('OK' == xmlhttp.responseText) {
                     alert('SUCCESS');
                  } else {
                     var msg = 'reuqest sent ' + cmServer;
                     msg += '\n\nServer answer: ' + xmlhttp.responseText;
                     alert(msg);
                  }
               } else if (xmlhttp.status == 404) {
                  alert('server not found at: ' + cmServer );
               } else {
                  alert('server returned a status code ' + xmlhttp.status + ' with the following error: ' + xmlhttp.responseText);
               }
            }
         }
         xmlhttp.open("POST", cmServer, true);
         xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
         xmlhttp.send('client_test=1');
         sent = true;
      }
   }
}







//alert(Clicksmap_getSignificantParamsForGas('http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6857902028706141&dt=1190940112781&lmt=1190940112&format=300x250_as&output=html&correlator=1190940112781&url=http%3A%2F%2Flocalhost%2Fclicksmap%2Fclient%2F&color_bg=CCCCCC&color_text=333333&color_link=000000&color_url=666666&color_border=CCCCCC&ad_type=text_image&cc=100&ga_vid=1265132094.1190940113&ga_sid=1190940113&ga_hid=288600019&flash=9&u_h=768&u_w=1024&u_ah=768&u_aw=1024&u_cd=32&u_tz=240&u_his=2&u_java=true&u_nplug=16&u_nmime=50'));
/*
client=ca-pub-6857902028706141
format=300x250_as
color_bg=CCCCCC
color_text=333333
color_link=000000
color_url=666666
color_border=CCCCCC
ad_type=text_image
*/