Paperli = window.Paperli || {};

// Guard against loading the script twice
Paperli.Tracker = function() { // hide the namespace
	documentAlias = document,
	navigatorAlias = navigator,
	windowAlias = window;
	
	function Tracker(trackerUrl, id) {
		var configTrackerUrl = trackerUrl || '';
		var id = id;
		var configCustomUrl;
		var configCustomData;
		var escapeWrapper = windowAlias.encodeURIComponent || escape;
		var unescapeWrapper = windowAlias.decodeURIComponent || unescape;
		
		function isDefined(property) {
			return typeof property !== 'undefined';
		}
		
		/*
		 * Send image request to server using GET.
		 * The infamous web bug is a transparent, single pixel (1x1) image
		 */
		function getImage(url) {
			var now = new Date(), image = new Image(1, 1);
			
			image.onLoad = function() {
			};
			image.src = url;
		}
		
		
		/*
		 * Get page referrer
		 */
		function getReferrer() {
			var referrer = '';
			try {
				referrer = top.document.referrer;
			} 
			catch (e) {
				if (parent) {
					try {
						referrer = parent.document.referrer;
					} 
					catch (e2) {
						referrer = '';
					}
				}
			}
			if (referrer === '') {
				referrer = documentAlias.referrer;
			}
			
			return referrer;
		}
		
		/*
		 * Does browser have cookies enabled (for this site)?
		 */
		function hasCookies() {
			var testCookieName = '_pk_testcookie';
			if (!isDefined(navigatorAlias.cookieEnabled)) {
				setCookie(testCookieName, '1');
				return getCookie(testCookieName) == '1' ? '1' : '0';
			}
			
			return navigatorAlias.cookieEnabled ? '1' : '0';
		}
		
		/*
		 * Returns the URL to call piwik.php,
		 * with the standard parameters (plugins, resolution, url, referer, etc.)
		 */
		function getRequest() {
			var i, now, request;
			now = new Date();
			request = 'cookie=' + browserHasCookies +
			'&url=' + escapeWrapper(isDefined(configCustomUrl) ? configCustomUrl : documentAlias.location.pathname + documentAlias.location.search) +
			'&urlref=' + escapeWrapper(pageReferrer) +
			'&rand=' + Math.random();
			
			request = configTrackerUrl + '?' + request;
			return request;
		}
		
		/*
		 * Log the page view / visit
		 */
		function logPageView() {
			var request = getRequest();
			request += '&id=' + escapeWrapper(id);
			
			getImage(request);
		}
		
		
		/************************************************************
		 * Constructor
		 ************************************************************/
		/*
		 * initialize tracker
		 */
		pageReferrer = getReferrer();
		browserHasCookies = hasCookies();
		
		/************************************************************
		 * Public data and methods
		 ************************************************************/
		return {
		
			/*
			 * Specify the Piwik server URL
			 */
			setTrackerUrl: function(trackerUrl) {
				if (isDefined(trackerUrl)) {
					configTrackerUrl = trackerUrl;
				}
			},
			
			/*
			 * Override url
			 */
			setCustomUrl: function(url) {
				if (isDefined(url)) {
					configCustomUrl = url;
				}
			},
			
			/*
			 * Pass custom data to the server
			 */
			setCustomData: function(customData) {
				if (isDefined(customData)) {
					configCustomData = customData;
				}
			},
			
			/*
			 * Log visit to this page
			 */
			trackPageView: function(url) {
				if (isDefined(url)) {
					configCustomUrl = url;
				}
				logPageView();
			}
		};
	}
	
	
	return {
		/*
		 * Get Tracker
		 */
		getTracker: function(trackerUrl, id) {
			return new Tracker(trackerUrl, id);
		}
	};
}();

