function createXMLRequest() {
	var httpRequest;
	if (window.XMLHttpRequest) {
		httpRequest = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		try {
			httpRequest = new ActiveXObject("MSXML2.XMLHTTP");
		} catch (e) {
			try {
				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
			}
		}
	}
	if (!httpRequest) {
		alert("No ha sido posible crear una instancia de XMLHttpRequest");
	} else {
		return httpRequest;
	}
}

var myIP;

var myIPRequest = createXMLRequest();
myIPRequest.open("GET", reportingURL + "/reportingImp/retrieveUserIP", true);
myIPRequest.onreadystatechange = function() {
	if (myIPRequest.readyState == 4) {
		myIP = myIPRequest.responseText;
	}
}
myIPRequest.send(null);

var jar = new CookieJar( {
	expires : 2592000, // seconds 2592000
	path : '/'
});

var uniqueVisitorCookie = 'cookieUniqueVisitor';

function generateEvent(xml) {
	var date = new Date();
	var httpRequest = createXMLRequest();
	httpRequest.open("GET", wsUrl + "client/client?xml=" + encodeURIComponent(xml) + "&i=" + date.getTime(), true);	
	httpRequest.setRequestHeader("MessageType", "CALL");
	httpRequest.setRequestHeader("Content-Type", "text/xml");
	httpRequest.send(null);
}

function loadXMLString(txt) {
	if (window.DOMParser) {
		parser = new DOMParser();
		xmlDoc = parser.parseFromString(txt, "text/xml");
	} else {
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = "false";
		xmlDoc.loadXML(txt);
	}
	return xmlDoc;
}

function XMLtoString(elem) {
	var serialized;
	try {
		serializer = new XMLSerializer();
		serialized = serializer.serializeToString(elem);
	} catch (e) {
		serialized = elem.xml;
	}
	return serialized;
}

function existCookie(name) {
	cookie = jar.get(name);
	return (cookie != null);
}

function isUniqueVisitor() {
	var isUnique;
	if (!existCookie(uniqueVisitorCookie)) {
		cookieUniqueVisitor = {
			value : 'true'
		};
		jar.put(uniqueVisitorCookie, cookieUniqueVisitor);
		isUnique = true;
	} else {
		isUnique = false;
	}
	return isUnique;
}

function reportingEvent() {
	sendEventViewByLanguage(isUniqueVisitor());
}

function checkTimeZone() {
	var rightNow = new Date();
	var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
	var date2 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
	var temp = date1.toGMTString();
	var date3 = new Date(temp.substring(0, temp.lastIndexOf(" ") - 1));
	var temp = date2.toGMTString();
	var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ") - 1));
	var hoursDiffStdTime = (date1 - date3) / (1000 * 60 * 60);
	var hoursDiffDaylightTime = (date2 - date4) / (1000 * 60 * 60);
	return hoursDiffDaylightTime;
}

function getTime() {
	var currentTime = new Date();
	var month = currentTime.getMonth() + 1;
	var day = currentTime.getDate();
	var year = currentTime.getFullYear();
	var hours = currentTime.getHours();
	var minutes = currentTime.getMinutes();
	var offset = checkTimeZone();
	if (minutes < 10) {
		minutes = "0" + minutes;
	}
	if ((offset < 10) && (offset > 0)) {
		offset = "+0" + offset.toString().substring(1);
	}
	if ((offset > -10) && (offset < 0)) {
		offset = "-0" + offset.toString().substring(1);
	}
	var timeFormat = month + " " + day + " " + hours + ":" + minutes + ":00"
			+ " GMT" + offset + "00 " + year;
	return timeFormat;
}

function addTextNode(xmlDoc, nodeName, value) {
	var nodeText = xmlDoc.createTextNode(value);
	var node = xmlDoc.getElementsByTagName(nodeName)[0]
	node.appendChild(nodeText);
}

function generateGenericXML(xmlText) {
	xmlDoc = loadXMLString(xmlText);

	addTextNode(xmlDoc, "jobId", jobNumber);
	addTextNode(xmlDoc, "landingPageId", jobNumber);
	addTextNode(xmlDoc, "language", language);
	addTextNode(xmlDoc, "country", country);
	addTextNode(xmlDoc, "agent", navigator.userAgent);
	addTextNode(xmlDoc, "visitor", myIP);
	addTextNode(xmlDoc, "date", getTime());

	return xmlDoc;
}

function generateXMLStringForLanguage(isUnique) {
	var xmlText = "<event><eventType>viewLanguage</eventType><jobId></jobId><landingPageId></landingPageId><date></date><language></language><country></country><isUniqueVisitor></isUniqueVisitor><agent></agent><visitor></visitor></event>";

	var xmlDoc = generateGenericXML(xmlText);
	addTextNode(xmlDoc, "isUniqueVisitor", isUnique);

	var eventNode = xmlDoc.getElementsByTagName("event")[0]
	var xmlString = XMLtoString(eventNode);
	return xmlString;
}

function generateXMLStringShare(fromSite, socialMedia) {
	var xmlText = "<event><eventType>impShares</eventType><jobId></jobId><landingPageId></landingPageId><date></date><language></language><country></country><socialMedia></socialMedia><fromSite></fromSite><agent></agent><visitor></visitor><isFromLandingPage></isFromLandingPage></event>";

	var xmlDoc = generateGenericXML(xmlText);
	addTextNode(xmlDoc, "socialMedia", socialMedia);
	addTextNode(xmlDoc, "fromSite", fromSite);
	addTextNode(xmlDoc, "isFromLandingPage", "false");

	var eventNode = xmlDoc.getElementsByTagName("event")[0]
	var xmlString = XMLtoString(eventNode);
	return xmlString;
}

function generateXMLStringEmbed(site) {
	var xmlText = "<event><eventType>impEmbed</eventType><isFromLandingPage></isFromLandingPage><impSizeChoosed></impSizeChoosed><fromSite></fromSite><jobId></jobId><landingPageId></landingPageId><date></date><language></language><country></country><agent></agent><visitor></visitor></event>";

	var xmlDoc = generateGenericXML(xmlText);
	addTextNode(xmlDoc, "fromSite", site);
	addTextNode(xmlDoc, "isFromLandingPage", "false");
	addTextNode(xmlDoc, "impSizeChoosed", "imp512x384");

	var eventNode = xmlDoc.getElementsByTagName("event")[0]
	var xmlString = XMLtoString(eventNode);
	return xmlString;
}

function generateXMLStringExitLink(link, isFromLp) {
	var xmlText = "<event><eventType>exitLink</eventType><isFromLandingPage></isFromLandingPage><jobId></jobId><landingPageId></landingPageId><date></date><language></language><country></country><link></link><agent></agent><visitor></visitor></event>";

	var xmlDoc = generateGenericXML(xmlText);
	addTextNode(xmlDoc, "link", link);
	addTextNode(xmlDoc, "isFromLandingPage", isFromLp);

	var eventNode = xmlDoc.getElementsByTagName("event")[0]
	var xmlString = XMLtoString(eventNode);
	return xmlString;
}

function generateXMLStringForDownload(assetUIID, resource, assetTitle,
		resourceType) {
	var xmlText = '<event><eventType>download</eventType><jobId></jobId><landingPageId></landingPageId><language></language><country></country><visitor></visitor><agent></agent><date></date><assetUIID></assetUIID><resource></resource><assetTitle></assetTitle><resourceType></resourceType></event>';

	var xmlDoc = generateGenericXML(xmlText);
	addTextNode(xmlDoc, "assetUIID", assetUIID);
	addTextNode(xmlDoc, "resource", resource);
	addTextNode(xmlDoc, "assetTitle", assetTitle);
	addTextNode(xmlDoc, "resourceType", resourceType);

	var eventNode = xmlDoc.getElementsByTagName("event")[0]
	var xmlString = XMLtoString(eventNode);
	return xmlString;
}

function generateXMLStringHtmlView() {
	var xmlText = "<event><eventType>playerHTML</eventType><jobId></jobId><landingPageId></landingPageId><date></date><language></language><country></country><agent></agent><visitor></visitor></event>";

	var xmlDoc = generateGenericXML(xmlText);
	var eventNode = xmlDoc.getElementsByTagName("event")[0]
	var xmlString = XMLtoString(eventNode);
	return xmlString;
}


function generateXMLStringForAssetView(assetUIID, resource, assetTitle,
		resourceType) {
	var xmlText = '<event><eventType>clickByObject</eventType><jobId></jobId><landingPageId></landingPageId><language></language><country></country><visitor></visitor><agent></agent><date></date><assetUIID></assetUIID><resource></resource><assetTitle></assetTitle><resourceType></resourceType><triggerComponent></triggerComponent></event>';

	var xmlDoc = generateGenericXML(xmlText);
	addTextNode(xmlDoc, "assetUIID", assetUIID);
	addTextNode(xmlDoc, "resource", resource);
	addTextNode(xmlDoc, "assetTitle", assetTitle);
	addTextNode(xmlDoc, "resourceType", resourceType);
	addTextNode(xmlDoc, "triggerComponent", "landingPage");

	var eventNode = xmlDoc.getElementsByTagName("event")[0]
	var xmlString = XMLtoString(eventNode);
	return xmlString;
}

function generateXMLStringForHTML5View(isUnique) {
	var xmlText = "<event>" + 
		"<eventType>HTML5View</eventType>" + 
		"<jobId></jobId>" + 
		"<landingPageId></landingPageId>" + 
		"<date></date>" +
		"<site></site>" +
		"<language></language>" +
		"<country></country>" +
		"<isUniqueVisitor></isUniqueVisitor>" +
		"<agent></agent>" +
		"<visitor></visitor>" +
		"<isFromLandingPage>true</isFromLandingPage>" +
		"</event>";


	var xmlDoc = generateGenericXML(xmlText);
	var site = window.location;
	addTextNode(xmlDoc, "site", site);
	addTextNode(xmlDoc, "isUniqueVisitor", isUnique);

	var eventNode = xmlDoc.getElementsByTagName("event")[0];
	var xmlString = XMLtoString(eventNode);
	return xmlString;
}

function generateXMLStringForCouponLink(isUnique, link) {
	var xmlText = "<event>" + "<eventType>couponLink</eventType>"
			+ "<jobId></jobId>" + "<landingPageId></landingPageId>"
			+ "<date></date>" + "<language></language>" + "<country></country>"
			+ "<isUniqueVisitor></isUniqueVisitor>" + "<agent></agent>"
			+ "<visitor></visitor>" + "<isUniqueVisitor></isUniqueVisitor>"
			+ "<impSize></impSize>" + "<link></link>" + "<mode></mode>"
			+ "</event>";

	var xmlDoc = generateGenericXML(xmlText);
	addTextNode(xmlDoc, "isUniqueVisitor", isUnique);
	addTextNode(xmlDoc, "impSize", "html5coupon");
	addTextNode(xmlDoc, "link", link);
	addTextNode(xmlDoc, "mode", "print");

	var eventNode = xmlDoc.getElementsByTagName("event")[0];
	var xmlString = XMLtoString(eventNode);
	return xmlString;
}

function sendEventShare(socialMedia) {
	var site = window.location;
	var xml = generateXMLStringShare(site, socialMedia);
	if (xml != null) {
		generateEvent(xml);
	}
}

function sendEventEmbed() {
	var site = window.location;
	var xml = generateXMLStringEmbed(site);
	if (xml != null) {
		generateEvent(xml);
	}
}

function sendEventExitLink(link, isFromLP, event) {
	if (!click(event)) {
		var site = window.location;
		var xml = generateXMLStringExitLink(link, isFromLP);
		if (xml != null) {
			generateEvent(xml);
		}
	}
}

function sendEventViewByLanguage(isUnique) {
	var xml = generateXMLStringForLanguage(isUnique);
	if (xml != null) {
		generateEvent(xml);
	}
}

function sendEventHtmlView() {
	var xml = generateXMLStringHtmlView();
	if (xml != null) {
		generateEvent(xml);
	}
}


function sendEventDownload(assetUIID, resource, assetTitle, resourceType, event) {
	if (!click(event)) {
		var xml = generateXMLStringForDownload(assetUIID, resource, assetTitle,
				resourceType);
		if (xml != null) {
			generateEvent(xml);
		}
	}
}

function sendEventAssetView(assetUIID, resource, assetTitle, resourceType, event) {
	if (!click(event)) {
		var xml = generateXMLStringForAssetView(assetUIID, resource, assetTitle,
				resourceType);
		if (xml != null) {
			generateEvent(xml);
		}
	}
}

function sendLoadImageAssetEvent(assetUIID, resource, assetTitle, resourceType) {
	var xml = generateXMLStringForAssetView(assetUIID, resource, assetTitle,
			resourceType);
	if (xml != null) {
		generateEvent(xml);
	}
}

function sendLoadVideoAssetEvent(assetUIID, resource, assetTitle, resourceType) {
	if (document.createElement('video').canPlayType) {
		var xml = generateXMLStringForAssetView(assetUIID, resource, assetTitle,
			resourceType);
		if (xml != null) {
			generateEvent(xml);
		}
	}
}

function sendEventHTML5View() {
	var xml = generateXMLStringForHTML5View(isUniqueVisitor());
	if (xml != null) {
		generateEvent(xml);
	}
}

function sendEventCouponLink(pLink) {
	var xml = generateXMLStringForCouponLink(isUniqueVisitor(), pLink);
	if (xml != null) {
		generateEvent(xml);
	}
}

function click(e) {
	var rightclick;
	if (e.which)
		rightclick = (e.which == 3);
	else if (e.button)
		rightclick = (e.button == 2);
	return rightclick;
}

