(function($) { 
Array.prototype.find = function(searchStr) {
	var returnArray = false;

	for (i=0; i<this.length; i++) {
		if (typeof(searchStr) == 'function') {
			if (searchStr.test(this[i])) {
				if (!returnArray) { returnArray = [] }
				returnArray.push(i);
			}
		} else {
			if (this[i]===searchStr) {
				if (!returnArray) { returnArray = [] }
				returnArray.push(i);
			}
		}
	}

	return returnArray;
}

var path = getPath();
var clickList = new Array();
var clickDisplayList = new Array();
var clickLastTime = new Array();

$('<link/>').attr({ rel: 'stylesheet', type: 'text/css', href: path + 'clicktracker.css' }).appendTo('head');

$.fn.saveClicks = function(settings) { 
	return this.each(function() {
		var $$ = $(this);

		if (!clickDisplayList.find(settings)) {
			clickList.push($$);
			clickDisplayList.push(settings);
			clickLastTime[getElement(this)] = 0;
		}

		$(settings.displayclicks).click(function() {
			for (var i = 0; i < clickList.length; i++) {
				clickList[i].stopSavingClicks();
			}
			
	        $$.displayClicks(settings);

	        $('.clicktracker-container').click(function() {
				$$.removeClicks();
				
				for (var i = 0; i < clickList.length; i++) {
					clickList[i].saveClicks(clickDisplayList[i]);
				}

				return false; 
	        });
	        return false; 
		});
		
		$$.bind('mousedown.clicktracker', function(evt) {
			clickCurrentTime = new Date();

			if (clickCurrentTime.getTime() - clickLastTime[getElement(this)] < 1000) {
				clickLastTime[getElement(this)] = clickCurrentTime.getTime();
				return true;
			}

			clickLastTime[getElement(this)] = clickCurrentTime.getTime();

			$.getJSON(path + 'clicktracker.php?callback=?', { a: "set", x: evt.pageX - $$.offset().left, y: evt.pageY - $$.offset().top, e: getElement(this), l: escape(window.location.href) }, function(data){
//				alert(data.response);
			}); 
    	});
	}); 
}; 
 
$.fn.stopSavingClicks = function() { 
	return this.each(function() {
		$(this).unbind('mousedown.clicktracker');
	});
};

$.fn.displayClicks = function(settings) {
	var defaults = {
		overlay:'fullscreen'
	}
	var settings = $.extend({}, defaults, settings);
	return this.each(function() {
		var $$ = $(this);
		if ($$.data('clicktracker')) {
			return false;
		}
	    var container = $('<div class="clicktracker-container"></div>');
		var overlay   = $('<div class="clicktracker-overlay"></div>'); 
		var loading   = $('<div class="clicktracker-loading"></div>');

		$$.data('clicktracker', {
		 	overlay:   	overlay,
			loading: 	loading,
			container: 	container
		});

		if (settings.overlay == 'partial') {
			$(overlay).appendTo('body');
			placeMap($$, overlay);	
		} else {
			addOverlay();
		}
		
		$(loading).appendTo('body');
		placeMap($$, loading);

		$(container).appendTo('body');
		placeMap($$, container);

		$.getJSON(path + 'clicktracker.php?callback=?', { a: "get", e: getElement(this), l: escape(window.location.href) }, function(data){
			$(loading).remove();

			$.each(data.points, function(i, point){
				$('<div/>').css({ left: point.left + 'px', top: point.top + 'px' }).appendTo(container);
			});
		}); 
	}); 
}; 

$.fn.removeClicks = function() { 
	return this.each(function() {
		var $$ = $(this);	
		if (dt = $$.data('clicktracker')) {
			dt.container.remove();
			dt.overlay.remove();
			dt.loading.remove();
			removeOverlay();
		}
		$$.removeData('clicktracker');
	});
};

function addOverlay() {
	if ($('#clicktracker-overlay').size() == 0) {
		$('<div id="clicktracker-overlay"></div>')
			.appendTo('body')
			// .width($(window).width())
			// .height($(window).height())
			.width('100%')
			.height('100%')
			//.css('position', 'absolute')
			.css('top', 0)
			.css('left', 0);
	}
}

function removeOverlay() {
	if ($('.clicktracker-container').size() == 0) {
		$('#clicktracker-overlay').remove();
	}
}

function getPath() {
	var path;
	$('script').each(function(i, script) { 
		matching = $(script).get(0).src.match(/(.*)clicktracker(\.pack)?\.js$/); 
		if (matching !== null) { 
			path = matching[1];
		} 
	});
	return path;
}

function getElement(elmt) {
	tg = elmt.nodeName;
	id = elmt.id ? '#'+ elmt.id : '';
	cl = ''; //elmt.className ? '.'+ elmt.className : '';
	return tg + id + cl;
};

function placeMap($$, elmt) {
	elmt.width( $$.outerWidth())
		.height($$.outerHeight())
		.css('top',  $$.offset().top)
		.css('left', $$.offset().left);
	
	if ($$.data('clicktracker')) {
		setTimeout(function() {
			placeMap($$, elmt);
		}, 100);	
	}
};
         
})(jQuery);