
// Link Tracker, version 1.0
// (c)Glenn Jones - Dec 2005
// For details: http://www.glennjones.net/

// Adapted for asp/mdb use at http://www.envador.com/asp-ajax-LinkTracker/


var labelsCreated = false;
var labelsDisplayed = false;

function addLinkTracker()
{
	if (!document.getElementsByTagName) return false;
	
	linksElements = document.getElementsByTagName('a')
	for (var i = 0; i < linksElements.length; i++) 
	{
		addEvent(linksElements[i], 'mousedown', recordClick, false);
		// If a link does not have any id it is given one
		if (! linksElements[i].getAttribute('id') )
			linksElements[i].setAttribute('id',"link_" + i)
	}
}



function recordClick(e)
{
	
	if (typeof e == 'undefined')
		var e = window.event;

	var source;
	if (typeof e.target != 'undefined') 
	{
		source = e.target;
	} else if (typeof e.srcElement != 'undefined') {
		source = e.srcElement;
	} else {
		return true;
	}

	if (source.nodeType == 3)
		source = source.parentNode;
		
	// Changed to work with hyperlinks 
	// around images. See Peter Bowyer comment
	//---------------------------------
	var id, target, url, label
	
	if( source.tagName == "IMG" )
	{
		if( source.parentNode.tagName == "A" )
		{
			id = source.parentNode.getAttribute('id');
			target = source.parentNode.getAttribute('href');
		}
		label = escape(source.getAttribute("alt"));
	}else{
		id = source.getAttribute('id');
		target = source.getAttribute('href');
		label = escape(source.childNodes[0].nodeValue);
	}
	url = document.location.href;
	//---------------------------------
	
	var pars = '';	
	apiurl = "/LinkTracker/addClick.cfm?id=" + id + "&label=" + label + "&target=" + target + "&url=" + url + "&rand="+Math.random();

	ajaxRequest = new Ajax.Request(apiurl, {method: 'get', parameters: pars, onComplete: passThrough});
	
	return false;	
}

function passThrough( originalRequest )
{
	// Helps debug api errors
	//alert( originalRequest.responseText );
}

//------------------------------------------------------------------

function keyCheck(e)
{
	var keyID = (window.event) ? event.keyCode : e.keyCode;
	var ctrlKey = (window.event) ? event.ctrlKey : e.ctrlKey;
	//alert( keyID + " - " + ctrlKey );
	
	if((keyID == 88)&&(ctrlKey == true))  // Ctrl X
	{ 
		if( labelsCreated == false )
		{
			getClickThroughInfo();
		}
		else
		{
			if(labelsDisplayed == true)
			{
				displayStatus = "none"
				labelsDisplayed = false
			}
			else
			{
				displayStatus = "block"
				labelsDisplayed = true
			}
			
			eltLabels = document.getElementsByClassName('linklabel');	
			for (var i = 0; i < eltLabels.length; i++)
			{
				eltLabels[i].style.display = displayStatus;
			}
		}
	}
}

function getClickThroughInfo()
{
	var pars = '';	
	url = document.location.href;
	apiurl = "/LinkTracker/getClicks.cfm?url=" + url + "&rand="+Math.random();
	ajaxRequest = new Ajax.Request(apiurl, {method: 'get', parameters: pars, onComplete: displayClickThroughs});
}	

function displayClickThroughs( originalRequest )
{
	if (!document.getElementsByTagName) return false;
	
	//alert (originalRequest);
	
	if( originalRequest.responseXml )
		node = originalRequest.responseXml;
	else
		node = originalRequest.responseXML;

	//Helps debug api errors
	//alert( originalRequest.responseText );

	if(node.childNodes[0].nodeType == 7)
		rootNode = node.childNodes[1]
	else
		rootNode = node.childNodes[0]

	for (var i = 0; i < rootNode.childNodes.length; i++){

		linknode = rootNode.childNodes[i];
		if(!linknode.getAttribute('count')) {
			return false;
		}

		count = linknode.getAttribute('count');
		percent = linknode.getAttribute('percent');
		label = linknode.getAttribute('label');
		id = linknode.childNodes[0].nodeValue;
		
		if ( document.getElementById(id) )
		{
			eltLink =  document.getElementById(id);
			//alert(eltLink);
			eltDiv = document.createElement( 'div' );
			eltDiv.className = "linklabel";
			eltText = document.createTextNode( percent + "% (" + count + ") " + label );
			eltDiv.appendChild( eltText );
			document.body.appendChild( eltDiv );
			
			ileft = parseInt(getPageOffsetLeft( eltLink )) + 10;
			itop = parseInt(getPageOffsetTop( eltLink )) + 10;

			Drag.init(eltDiv, eltDiv);

			eltDiv.style.left = ileft + "px";
			eltDiv.style.top = itop + "px";
			//alert(eltDiv.style.top);
		}
	} 
	labelsCreated = true;
	labelsDisplayed = true;

}


//------------------------------------------------------------------

document.getElementsByClassName = function(className) 
{
  var children = document.getElementsByTagName('*') || document.all;
  var elements = new Array();
  for (var i = 0; i < children.length; i++) {
    var child = children[i];
    var classNames = child.className.split(' ');
    for (var j = 0; j < classNames.length; j++) {
      if (classNames[j] == className) {
        elements.push(child);
        break;
      }
    }
  }
  return elements;
}

function addEvent(elm, evType, fn, useCapture) 
{
  // cross-browser event handling for IE5+, NS6 and Mozilla By Scott Andrew 
  if (elm.addEventListener) { 
    elm.addEventListener(evType, fn, useCapture); 
    return true; 
  } else if (elm.attachEvent) { 
    var r = elm.attachEvent('on' + evType, fn); 
    return r; 
  } else {
    elm['on' + evType] = fn;
  }
}


function getPageOffsetLeft(elt) 
{
  var x;
  x = elt.offsetLeft;
  if (elt.offsetParent != null)
    x += getPageOffsetLeft(elt.offsetParent);
  return x;
}


function getPageOffsetTop(elt) 
{
  var y;
  y = elt.offsetTop;
  if (elt.offsetParent != null)
    y += getPageOffsetTop(elt.offsetParent);
  return y;
}


addEvent(window, 'load', addLinkTracker, false);
addEvent(document, 'keydown', keyCheck, false);

var Drag = {

	obj : null,

	init : function(o, oRoot, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper)
	{
		o.onmousedown = Drag.start;
		o.hmode = bSwapHorzRef ? false : true ;
		o.vmode = bSwapVertRef ? false : true ;

		o.root = oRoot && oRoot != null ? oRoot : o ;

		if (o.hmode  && isNaN(parseInt(o.root.style.left  ))) o.root.style.left   = '0px';
		if (o.vmode  && isNaN(parseInt(o.root.style.top   ))) o.root.style.top    = '0px';
		if (!o.hmode && isNaN(parseInt(o.root.style.right ))) o.root.style.right  = '0px';
		if (!o.vmode && isNaN(parseInt(o.root.style.bottom))) o.root.style.bottom = '0px';

		o.minX = typeof minX != 'undefined' ? minX : null;
		o.minY = typeof minY != 'undefined' ? minY : null;
		o.maxX = typeof maxX != 'undefined' ? maxX : null;
		o.maxY = typeof maxY != 'undefined' ? maxY : null;

		o.xMapper = fXMapper ? fXMapper : null;
		o.yMapper = fYMapper ? fYMapper : null;

		o.root.onDragStart = new Function();
		o.root.onDragEnd = new Function();
		o.root.onDrag = new Function();
	},

	start : function(e)
	{
			
		var o = Drag.obj = this;
		e = Drag.fixE(e);
		var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
		var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
		o.root.onDragStart(x, y);

		o.lastMouseX = e.clientX;
		o.lastMouseY = e.clientY;

		if (o.hmode) {
			if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;
			if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;
		} else {
			if (o.minX != null) o.maxMouseX = -o.minX + e.clientX + x;
			if (o.maxX != null) o.minMouseX = -o.maxX + e.clientX + x;
		}

		if (o.vmode) {
			if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;
			if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;
		} else {
			if (o.minY != null) o.maxMouseY = -o.minY + e.clientY + y;
			if (o.maxY != null) o.minMouseY = -o.maxY + e.clientY + y;
		}

		document.onmousemove = Drag.drag;
		document.onmouseup = Drag.end;

		return false;
	},

	drag : function(e)
	{
		e = Drag.fixE(e);
		var o = Drag.obj;

		var ey = e.clientY;
		var ex = e.clientX;
		var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
		var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
		var nx, ny;

		if (o.minX != null) ex = o.hmode ? Math.max(ex, o.minMouseX) : Math.min(ex, o.maxMouseX);
		if (o.maxX != null) ex = o.hmode ? Math.min(ex, o.maxMouseX) : Math.max(ex, o.minMouseX);
		if (o.minY != null) ey = o.vmode ? Math.max(ey, o.minMouseY) : Math.min(ey, o.maxMouseY);
		if (o.maxY != null) ey = o.vmode ? Math.min(ey, o.maxMouseY) : Math.max(ey, o.minMouseY);

		nx = x + ((ex - o.lastMouseX) * (o.hmode ? 1 : -1));
		ny = y + ((ey - o.lastMouseY) * (o.vmode ? 1 : -1));

		if (o.xMapper) nx = o.xMapper(y)
		else if (o.yMapper) ny = o.yMapper(x)

		Drag.obj.root.style[o.hmode ? 'left' : 'right'] = nx + 'px';
		Drag.obj.root.style[o.vmode ? 'top' : 'bottom'] = ny + 'px';
		Drag.obj.lastMouseX = ex;
		Drag.obj.lastMouseY = ey;

		Drag.obj.root.onDrag(nx, ny);
		return false;
	},

	end : function()
	{
		document.onmousemove = null;
		document.onmouseup   = null;
		Drag.obj.root.onDragEnd(    parseInt(Drag.obj.root.style[Drag.obj.hmode ? 'left' : 'right']), 
		parseInt(Drag.obj.root.style[Drag.obj.vmode ? 'top' : 'bottom']));
		Drag.obj = null;
	},

	fixE : function(e)
	{
		if (typeof e == 'undefined') e = window.event;
		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
		return e;
	}
};
	
