function domainFixup(domain)
{
	var dl = domain.length;

	// remove trailing '.'
	if (domain.charAt(--dl) === '.') {
		domain = domain.slice(0, dl);
	}
	// remove leading '*'
	if (domain.slice(0, 2) === '*.') {
		domain = domain.slice(1);
	}
	return domain;
}

function getReferrer()
{
	var referrer = '';

	try {
		referrer = window.top.document.referrer;
	} catch (e) {
		if (window.parent) {
			try {
				referrer = window.parent.document.referrer;
			} catch (e2) {
				referrer = '';
			}
		}
	}
	if (referrer === '') {
		referrer = document.referrer;
	}

	return referrer;
}

function urlFixup(hostName, href, referrer)
{
	if (hostName === 'translate.googleusercontent.com') { 
		if (referrer === '') {
			referrer = href;
		}
		href = getParameter(href, 'u');
		hostName = getHostName(href);
	} else if (hostName === 'cc.bingj.com' || 
			hostName === 'webcache.googleusercontent.com' ||  
			hostName.slice(0, 5) === '74.6.') {
		href = document.links[0].href;
		hostName = getHostName(href);
	}
	return [hostName, href, referrer];
}


function isSiteHostName(hostName)
{
	var i,
	alias,
	offset;

	for (i = 0; i < configHostsAlias.length; i++) {
		alias = domainFixup(configHostsAlias[i].toLowerCase());

		if (hostName === alias) {
			return true;
		}

		if (alias.slice(0, 1) === '.') {
			if (hostName === alias.slice(1)) {
				return true;
			}

			offset = hostName.length - alias.length;
			if ((offset > 0) && (hostName.slice(offset) === alias)) {
				return true;
			}
		}
	}
	return false;
}

function addEventListener(element, eventType, eventHandler, useCapture)
{
	if (element.addEventListener) {
		element.addEventListener(eventType, eventHandler, useCapture);
		return true;
	}
	if (element.attachEvent) {
		return element.attachEvent('on' + eventType, eventHandler);
	}
	element['on' + eventType] = eventHandler;
}

function getClassesRegExp(configClasses, defaultClass)
{
	var i,
	classesRegExp = '(^| )(piwik[_-]' + defaultClass;

	if (configClasses) {
		for (i = 0; i < configClasses.length; i++) {
			classesRegExp += '|' + configClasses[i];
		}
	}
	classesRegExp += ')( |$)';

	return new RegExp(classesRegExp);
}

function addClickListeners(enable)
{
	// iterate through anchor elements with href and AREA elements
	var configIgnoreClasses = [];

	var i,
	ignorePattern = getClassesRegExp(configIgnoreClasses, 'ignore'),
	linkElements = document.links;

	if (linkElements) {
		for (i = 0; i < linkElements.length; i++) {
			if (!ignorePattern.test(linkElements[i].className)) {
				addClickListener(linkElements[i], enable);
			}
		}
	}
}

function addClickListener(element, enable)
{
	if (enable) {
		// for simplicity and performance, we ignore drag events
		addEventListener(element, 'mouseup', clickHandler, false);
		addEventListener(element, 'mousedown', clickHandler, false);
	} else {
		addEventListener(element, 'click', clickHandler, false);
	}
}


function clickHandler(evt)
{
	var button,
	target;

	evt = evt || window.event;
	button = evt.which || evt.button;
	target = evt.target || evt.srcElement;

	// Using evt.type (added in IE4), we avoid defining separate handlers for mouseup and mousedown.
	if (evt.type === 'click') {
		if (target) {
			processClick(target);
		}
	} else if (evt.type === 'mousedown') {
		if ((button === 1 || button === 2) && target) {
			lastButton = button;
			lastTarget = target;
		} else {
			lastButton = lastTarget = null;
		}
	} else if (evt.type === 'mouseup') {
		if (button === lastButton && target === lastTarget) {
			processClick(target);
		}
		lastButton = lastTarget = null;
	}
}

function getLinkType(className, href, isInLink)
{
	// outlinks
	if (!isInLink) {
		return 'link';
	}

	// does class indicate whether it is an (explicit/forced) outlink or a download?
	var downloadPattern = getClassesRegExp(configDownloadClasses, 'download'),
	linkPattern = getClassesRegExp(configLinkClasses, 'link'),

	// does file extension indicate that it is a download?
	downloadExtensionsPattern = new RegExp('\\.(' + configDownloadExtensions + ')([?&#]|$)', 'i');

	// optimization of the if..elseif..else construct below
	return linkPattern.test(className) ? 'link' : (downloadPattern.test(className) || downloadExtensionsPattern.test(href) ? 'download' : 0);
}

function processClick(sourceElement)
{
	var parentElement,
	tag,
	linkType;

	while ((parentElement = sourceElement.parentNode) !== null &&
			isDefined(parentElement) && // buggy IE5.5
			((tag = sourceElement.tagName.toUpperCase()) !== 'A' && tag !== 'AREA')) {
		sourceElement = parentElement;
	}

	if (isDefined(sourceElement.href)) {
		// browsers, such as Safari, don't downcase hostname and href
		var originalSourceHostName = sourceElement.hostname || getHostName(sourceElement.href),
		sourceHostName = originalSourceHostName.toLowerCase(),
		sourceHref = sourceElement.href.replace(originalSourceHostName, sourceHostName),
		scriptProtocol = new RegExp('^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto):', 'i');

		// ignore script pseudo-protocol links
		if (!scriptProtocol.test(sourceHref)) {
			// track outlinks and all downloads
			linkType = getLinkType(sourceElement.className, sourceHref, isSiteHostName(sourceHostName));
			if (linkType) {
				// urldecode %xx
				sourceHref = urldecode(sourceHref);
				//logLink(sourceHref, linkType);
				doTrackAction(sourceHref, linkType);
			}
		}
	}
}

function getCookie(name)
{ // get cookie
	var dc = document.cookie;
	var prefix = name + "=";
	var begin = dc.indexOf("; " + prefix);
	if (begin == -1) {
		begin = dc.indexOf(prefix);
		if (begin != 0) return false;
	} else {
		begin += 2;
	}
	var end = document.cookie.indexOf(";", begin);
	if (end == -1) {
		end = dc.length;
	}
	return unescape(dc.substring(begin + prefix.length, end));
}

function setCookie(cookieName,cookieValue,nDays)
{ // set cookie
	var today = new Date();
	var expire = new Date();
	if (nDays==null || nDays==0) nDays=1;
	expire.setTime(today.getTime() + 3600000*24*nDays);
	document.cookie = cookieName+"="+escape(cookieValue) + "; path=/; expires="+expire.toGMTString();
}

function detectBrowserFeatures()
{
	var i,
	mimeType,
	pluginMap = {
	// document types
	pdf: 'application/pdf',

	// media players
	qt: 'video/quicktime',
	realp: 'audio/x-pn-realaudio-plugin',
	wma: 'application/x-mplayer2',

	// interactive multimedia
	dir: 'application/x-director',
	fla: 'application/x-shockwave-flash',

	// RIA
	java: 'application/x-java-vm',
	gears: 'application/x-googlegears',
	ag: 'application/x-silverlight'
	};

	// general plugin detection
	if (navigator.mimeTypes && navigator.mimeTypes.length) {
		for (i in pluginMap) {
			if (Object.prototype.hasOwnProperty.call(pluginMap, i)) {
				mimeType = navigator.mimeTypes[pluginMap[i]];
				browserFeatures[i] = (mimeType && mimeType.enabledPlugin) ? '1' : '0';
			}
		}
	}

	// Safari and Opera
	// IE6/IE7 navigator.javaEnabled can't be aliased, so test directly
	if (typeof navigator.javaEnabled !== 'unknown' && isDefined(navigator.javaEnabled) && navigator.javaEnabled()) {
		browserFeatures.java = '1';
	}

	// Firefox
	if (isFunction(window.GearsFactory)) {
		browserFeatures.gears = '1';
	}

}

function hasCookies()
{
	var testCookieName = 'testcookie';

	if (!isDefined(navigator.cookieEnabled)) {
		setCookie(testCookieName, '1');
		return getCookie(testCookieName) === '1' ? '1' : '0';
	}

	return navigator.cookieEnabled ? '1' : '0';
}

function isDefined(property)
{
	return typeof property !== 'undefined';
}

function isFunction(property)
{                                                                               
	return typeof property === 'function';                                                                
}

function getXmlHttp()
{
	var xmlhttp;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}

function getAJAXData(handlerPath, parameters)
{
	var req;
	// Creation of AJAX request
	req = getXmlHttp();
	if (req) {
		// Send async request by POST
		req.open("POST", handlerPath, true);
		// Set special header
		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		// Send parameters
		req.send(parameters);

	} else {
		// Browser is not support AJAX.
	}
}


function sendStatAJAX()
{
	var pagePdf = browserFeatures['pdf'];
	var pageQt = browserFeatures['qt'];
	var pageRealP = browserFeatures['realp'];
	var pageWma = browserFeatures['wma'];
	var pageDir = browserFeatures['dir'];
	var pageFla = browserFeatures['fla'];
	var pageAg = browserFeatures['ag'];
	var pageJava = 0;
	var pageGears = 0;
	
	if(browserFeatures['java']==1 || browserFeatures.java==1){
		pageJava = 1;
	}
	
	if(browserFeatures['gears']==1 || browserFeatures.gears==1){
		pageGears = 1;
	}
	
	if (typeof jQuery == 'undefined'){
		getAJAXData(
			"/"+genParentFolder+"/generator.php",
	    	"pageTrackerType=page&pageTitle=" + document.title + "&pageReferer=" + document.referrer + "&pageCookieEnabled=" + hasCookies() + "&pageResolutionW=" + parseInt(screen.width) + "&pageResolutionH=" + parseInt(screen.height) + "&pagePdf=" + pagePdf + "&pageQt=" + pageQt + "&pageRealP=" + pageRealP + "&pageWma=" + pageWma + "&pageDir=" + pageDir + "&pageFla=" + pageFla + "&pageAg=" + pageAg + "&pageJava=" + pageJava + "&pageGears=" + pageGears
		);
	} else {
		jQuery.ajax({
			url: "/"+genParentFolder+"/generator.php",
			type: "POST",
			cache: false,
			data: {
				'pageTrackerType': 'page',
				'pageTitle': document.title,
				'pageReferer': document.referrer,
				'pageCookieEnabled': hasCookies(),
				'pageResolutionW': parseInt(screen.width),
				'pageResolutionH': parseInt(screen.height),
				'pagePdf': pagePdf,
				'pageQt': pageQt,
				'pageRealP': pageRealP,
				'pageWma': pageWma,
				'pageDir': pageDir,
				'pageFla': pageFla,
				'pageAg': pageAg,
				'pageJava': pageJava,
				'pageGears': pageGears
			}
		});
	}

}

function doTrackAction(url, linkType)
{
	var pagePdf = browserFeatures['pdf'];
	var pageQt = browserFeatures['qt'];
	var pageRealP = browserFeatures['realp'];
	var pageWma = browserFeatures['wma'];
	var pageDir = browserFeatures['dir'];
	var pageFla = browserFeatures['fla'];
	var pageAg = browserFeatures['ag'];
	var pageJava = 0;
	var pageGears = 0;
	
	if(browserFeatures['java']==1 || browserFeatures.java==1){
		pageJava = 1;
	}
	
	if(browserFeatures['gears']==1 || browserFeatures.gears==1){
		pageGears = 1;
	}


	if (typeof jQuery == 'undefined'){
		getAJAXData(
			"/"+genParentFolder+"/generator.php",
	    	"pageTrackerType=action&pageUrl=" + url + "&pageLinkType=" + linkType + "&pageTitle=" + document.title + "&pageReferer=" + document.referrer + "&pageCookieEnabled=" + hasCookies() + "&pageResolutionW=" + parseInt(screen.width) + "&pageResolutionH=" + parseInt(screen.height) + "&pagePdf=" + pagePdf + "&pageQt=" + pageQt + "&pageRealP=" + pageRealP + "&pageWma=" + pageWma + "&pageDir=" + pageDir + "&pageFla=" + pageFla + "&pageAg=" + pageAg + "&pageJava=" + pageJava + "&pageGears=" + pageGears
		);
	} else {
		jQuery.ajax({
			url: "/"+genParentFolder+"/generator.php",
			type: "POST",
			cache: false,
			data: {
				'pageTrackerType': 'action',
				'pageUrl': url,
				'pageLinkType': linkType,
				'pageTitle': document.title,
				'pageReferer': document.referrer,
				'pageCookieEnabled': hasCookies(),
				'pageResolutionW': parseInt(screen.width),
				'pageResolutionH': parseInt(screen.height),
				'pagePdf': pagePdf,
				'pageQt': pageQt,
				'pageRealP': pageRealP,
				'pageWma': pageWma,
				'pageDir': pageDir,
				'pageFla': pageFla,
				'pageAg': pageAg,
				'pageJava': pageJava,
				'pageGears': pageGears

			}
		});
	
	}

}

try {
	var configDownloadClasses = [];
	var configLinkClasses = [];
	var configDownloadExtensions = '7z|aac|ar[cj]|as[fx]|avi|bin|csv|deb|dmg|doc|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|ms[ip]|od[bfgpst]|og[gv]|pdf|phps|png|ppt|qtm?|ra[mr]?|rpm|sea|sit|tar|t?bz2?|tgz|torrent|txt|wav|wm[av]|wpd||xls|xml|z|zip';                                     
	var locationArray = urlFixup(document.domain, window.location.href, getReferrer());
	var domainAlias = domainFixup(locationArray[0]);
	var locationHrefAlias = locationArray[1];
	var configReferrerUrl = locationArray[2];
	var configHostsAlias = [domainAlias];
	var urldecode = unescape;
	var browserFeatures = {};
	detectBrowserFeatures();
	sendStatAJAX();
	addClickListeners();
} catch( err ) {}

