// KONSTANTEN

//rsv, 10.01.2011: nur diese Messpunkte sind erlaubt.
var REGEXP_ALLOWED_MEASURING_POINTS = new RegExp
(
	"^(" +
		"frmLogin:cmdLogin|" +
		"frmNeuzustellung:cmdSuche|" +
		"frmNeuzustellung:cmdFilter|" +
		"frmNeuzustellung:scroller[12]idx\\d+(_text)?|" +
		"frmNeuzustellung:cmdWeiter(:[1234])?|" +
		"frmZusammenfassung:cmdWeiter" +
	")$"
);

// rsv, 10.01.2011: In diesem Cookie wird der Name des letzten abgesendeten
// gültigen Messpunkts gespeichert, so dass beim Aufruf eines bodyOnLoads
// geprüft werden kann, ob ein Messpunkt-Ende gesendet werden kann.
var COOKIE_CURRENT_MEASUING_POINT = "PerfmonCurrentMeasuringPoint";



function shePerfmonSetCurrentMeasuringPointCookie(ltButtonIdentifier)
{
	shePerfMonSetCookie(COOKIE_CURRENT_MEASUING_POINT,ltButtonIdentifier, 1);
}
function shePerfmonGetCurrentMeasuringPointCookie()
{
	return shePerfMonGetCookie(COOKIE_CURRENT_MEASUING_POINT);
}
function shePerfmonDeleteCurrentMeasuringPointCookie()
{
	shePerfMonSetCookie(COOKIE_CURRENT_MEASUING_POINT,"", -1);
}





/**
 * Holt den Text-Inhalt innerhalb eines HTML-Elements
 * @param ptId ID des Elements
 * @return den Text, oder "", falls Element mit Id ptId nicht vorhanden.
 * @history rsv, 06.10.2010: init
 * rsv, 14.03.2011: Fix, damit 'PerfMonAdditionalInfo' auch richtig läuft
 */
function sheGetElementContent(ptId)
{
	try
	{
		return document.getElementById(ptId).firstChild.nodeValue;
	}
	catch (e)
	{
		return "";
	}
}


/**
 * Setzt den Text innerhalb eines Html-Elements
 * @param ptId ID des Elements
 * @param ptValue zu setzender Inhalt
 * @history rsv, 15.10.2010: init
 */
function sheSetElementContent(ptId, ptValue)
{
	var loElement = document.getElementById(ptId);
	if (!loElement)
	{
		// falls Element nicht existiert, dann erzeugen
		loElement = document.createElement("span");
		loElement.style.display="none";
		loElement.id = ptId;
		document.getElementsByTagName("body")[0].appendChild(loElement);
	}
	if(loElement)
	{
		loElement.appendChild(document.createTextNode(ptValue));
	}

}



/**
 * Falls an Additional_Info_01 noch ein weiterer Text
 * hinzugefügt werden soll, kann dieser hier gesetzt werden.
 * @param ptValue
 * @return
 * @history rsv, 18.10.2010: init
 */
function sheSetPerfMonAdditionalInfo(ptValue)
{
	sheSetElementContent('PerfMonAdditionalInfo', ptValue);
	return true;
}




/**
 * Setzt ein Cookie mit den angegebenen Daten
 *
 * @param ptName		Name des Cookies
 * @param ptValue		Wert des Cookies
 * @param piExpiredays	Anzahl in Tagen, an denen das Cookie abläuft
 *
 * @remarks:	keine Abhängigkeiten zu anderen JS-PerfMon-Funktionen
 *
 * @history che, 17.09.2010: init
 */
function shePerfMonSetCookie(ptName,ptValue,piExpiredays)
{
	if (navigator.cookieEnabled === true)
	{
		var exdate=new Date();
		exdate.setDate(exdate.getDate()+piExpiredays);
		document.cookie=ptName + "=" + escape(ptValue) + ((piExpiredays==null) ? "" : ";expires="+exdate.toUTCString());
	}
}

/**
 * Liefert den Wert des angegebenen Cookie.
 *
 * @param ptName	Name des Cookie dessen Wert geliefert werden soll
 *
 * @return	Wert des Cookie oder die leere Zeichenkette sofern das Cookie nicht gefunden werden konnte
 *
 * @remarks:	keine Abhängigkeiten zu anderen JS-PerfMon-Funktionen
 *
 * @history che, 17.09.2010: init
 */
function shePerfMonGetCookie(ptName)
{
	if (navigator.cookieEnabled === true)
	{
		if (document.cookie.length>0) {
			var c_start=document.cookie.indexOf(ptName + "=");
			if (c_start!=-1) {
				c_start=c_start + ptName.length+1;
				var c_end=document.cookie.indexOf(";",c_start);
				if (c_end==-1) {
					c_end=document.cookie.length;
				}
				return unescape(document.cookie.substring(c_start,c_end));
			}
		}
	}

	return "";
}

/**
 * Aktualisiert den Wert des 'PerfMonCookie' Cookie
 *
 * @remarks:	Abhängig von folgenden ShE-PerfMon-Funktionen:	shePerfMonGetCookie(), perfMonGetSessionID()
 *
 * @history che, 17.09.2010: init
 */
function shePerfMonUpdateRequestGuid()
{
	if (navigator.cookieEnabled === true)
	{
		var lastRequestId = shePerfMonGetCookie('PerfMonCookie');
		var liCurrentRequestID = 1;

		if (lastRequestId != null && lastRequestId != "") {
			var laTokens = lastRequestId.split("===");

			if (isNaN(laTokens[1]))		{
				liCurrentRequestID = 1;
			} else {
				liCurrentRequestID = parseInt(laTokens[1]);
			}

			if (liCurrentRequestID > 100000) {
				liCurrentRequestID = 1
			} else {
				liCurrentRequestID = liCurrentRequestID + 1;
			}
		} else {
			liCurrentRequestID = 1
		}

		shePerfMonSetCookie("PerfMonCookie", perfMonGetSessionID() + "===" + liCurrentRequestID, 1);
	}
}

/**
 * Registriert die Event, um AJAX Calls des A4J Frameworks überwachen zu können
 *
 * @history che, 15.09.2010: init
 */
function shePerfMonRegisterA4J()
{
	// check if "A4J" is available
	if (typeof A4J !== 'undefined')
	{
	   // hijack "A4J Submit" method
	   A4J.AJAX.RealSubmit = A4J.AJAX.Submit;
	   A4J.AJAX.Submit = 	function (ptViewName,ptFormName,poEvent,phParametes)
							{
		   						// update PerfMon Request GUID
		   						shePerfMonUpdateRequestGuid();
								// log "A4J Submit" call
								shePerfMonSendDataIfAllowed("A4J.Ajax.Submit", shePerfMonGetUrlBasePath() + phParametes['actionUrl'], phParametes['similarityGroupingId']);
								// call real "A4J Submit" method
								this.RealSubmit(ptViewName,ptFormName,poEvent,phParametes);
							}

	   // hijack "A4J Finish Request" method
	   A4J.AJAX.RealFinishRequest = A4J.AJAX.finishRequest;
	   A4J.AJAX.finishRequest =     function(req)
									{
										// log "A4J finish request" call
										shePerfMonSendDataIfAllowed("A4J.Ajax.FinishRequest", shePerfMonGetUrlBasePath() + req.options.actionUrl, req.options.similarityGroupingId);
										// call real "A4J finish request" method
										A4J.AJAX.RealFinishRequest(req);
									}
	}
}

/**
 *
 * @param pbOnLoadOnly wenn true, dann wird nichts anderes unternommen, außer das "onLoad"-Event gesendet
 *                     d. h. es werden z. B. keine submit-inputs registriert.
 *                     Das ist für Seiten, die von einem performancerelevanten Submit aufgerufen werden,
 *                     selbst aber keine daten bei einem Submit senden sollen.
 * @return
 *
 * @history che, 15.09.2010: init
 * @history rsv, 06.10.2010: Erweiterung um pbOnLoadOnly
 * @history rsv, 10.03.2011: Bereits bestehendes OnLoad muss erhalten bleiben, sonst funktionieren bspw. Tooltips nicht
 * @history rsv, 24.10.2011: Anpassungen an Firefox
 */
function shePerfMonRegisterDocumentBodyLoad(pbOnLoadOnly)
{
	// Events, die in <body onload=""> stehen werden in Firefox
	// in window.onload gepspeichert.
	// in IE in document.body.onload.
	var loFunc = window.onload;
	if (!loFunc)
	{
		loFunc = document.body.onload;
	}

	window.onload = function ()
	{
		// shePerfMonOnLoadCalled muss zuerst aufgerufen werden,
		// sonst gibt es falsche Messdaten, wenn z. B.
		// loFunc() sehr lange läuft.
		shePerfMonOnLoadCalled(pbOnLoadOnly);

		if (loFunc)
		{
			loFunc();
		}

	}
}


/**
 * Ermittelt aus der Id einer Komponente (Button oder Link)
 * den Permon-Knoten-Identifier und ggf. AdditionalInfo.
 * @param {Object} ptButtonIdentifier
 * @return Array von Strings:
 *         0: Permon-Knoten-Identifier
 *         1: Evtl. AdditionalInfo
 */
function getNodeIdentifier(ptComponentIdentifier)
{
	var ltIdentifier;
	var ltAdditionalInfo;

	var loRegex = /^frmNeuzustellung:scroller([12])idx(\d+)(_text)?$/;
	if (loRegex.test(ptComponentIdentifier))
	{
		// beim Scroller ist das AdditionalInfo02
		// folgendermaßen aufgebaut:
		// erster Paramter: 1 für oben 2 für unten
		// dann "|"
		// zweiter Parameter: Nummer der Seite
		var loResult = loRegex.exec(ptComponentIdentifier);
		ltIdentifier = "frmNeuzustellung:scroller";
		ltAdditionalInfo = loResult[1] + "|" + loResult[2];
	}
	else
	{
		ltIdentifier = ptComponentIdentifier;
		ltAdditionalInfo = "";
	}

	var loResult = [shePerfMonGetUrlReal() + "|" + ltIdentifier, ltAdditionalInfo];

	return loResult;
}


/**
 *
 * @return
 *
 * @history che, 15.09.2010: init
 * @history rsv, 11.10.2010: pbOnLoadOnly hinzugefügt:
 * @history rsv, 24.10.2011: Erweiterung Kompatibilität Firefox
 */
function shePerfMonOnLoadCalled(pbOnLoadOnly)
{
	var ltCookie = shePerfmonGetCurrentMeasuringPointCookie()
	if (REGEXP_ALLOWED_MEASURING_POINTS.test(ltCookie))
	{
		shePerfMonSendData("bodyOnLoad", getNodeIdentifier(ltCookie)[0], '');
		// shePerfMonSendData("bodyOnLoad", shePerfMonGetUrlReal() + ltCookie, '', '');
	}
	shePerfmonDeleteCurrentMeasuringPointCookie();


	if (pbOnLoadOnly)
	{
		return;
	}


	// register for all "submit-inputs"
	var buttonArray = document.getElementsByTagName("input");
	var buttonArrayLength = buttonArray.length;
	for(var liSubmitButtonPos=0; liSubmitButtonPos < buttonArrayLength; liSubmitButtonPos++)
	{
		if (buttonArray[liSubmitButtonPos].getAttribute("type") === "submit")
		{
			if (typeof buttonArray[liSubmitButtonPos].addEventListener != 'undefined')
		    {
				// W3C
				//// buttonArray[liSubmitButtonPos].addEventListener('click', function(poEvent) { shePerfMonSubmitButtonOnClickCalled(poEvent); }, false);
				buttonArray[liSubmitButtonPos].addEventListener('click', shePerfMonSubmitButtonOnClickCalled, true);
		    }
		    else if (typeof buttonArray[liSubmitButtonPos].attachEvent != 'undefined')
		    {
		    	// IE
		    	buttonArray[liSubmitButtonPos].attachEvent('onclick', function() { shePerfMonSubmitButtonOnClickCalled(); });
		    }
		}
	}


	// register for all links
	var linksLength = document.links.length;
	for (var liLinkPos=0; liLinkPos < linksLength; liLinkPos++)
	{
		if (typeof document.links[liLinkPos].addEventListener != 'undefined')
	    {
			// W3C
			///// document.links[liLinkPos].addEventListener('click', function(poEvent) { shePerfMonLinkOnClickCalled(poEvent) } , false);
			document.links[liLinkPos].addEventListener('click', shePerfMonLinkOnClickCalled , true);
	    }
	    else if (typeof document.links[liLinkPos].attachEvent != 'undefined')
	    {
	    	// IE
			document.links[liLinkPos].attachEvent('onclick', function() { shePerfMonLinkOnClickCalled( ) });
	    }
	}

	// register for A4J AJAX calls
	shePerfMonRegisterA4J();
}


/**
 * prüft, ob der Messpunkt ptAdditionalInfo01 gesendet werden darf,
 * und sendet ggf. Perfmon-Daten.
 * ptButtonIdentifier wird dann in einem Cookie gespeichert.
 * @param {Object} ptEvent Event
 * @param {Object} ptButtonIdentifier Id des Buttons
 * @param {Object} ptAdditionalInfo01 Land
 */
function shePerfMonSendDataIfAllowed(ptEvent, ptComponentIdentifier)
{
	if (REGEXP_ALLOWED_MEASURING_POINTS.test(ptComponentIdentifier))
	{
		shePerfmonSetCurrentMeasuringPointCookie(ptComponentIdentifier);

		var laIdentifier = getNodeIdentifier(ptComponentIdentifier)
		shePerfMonSendData(ptEvent, laIdentifier[0], laIdentifier[1]);
	}
	else
	{
		shePerfmonDeleteCurrentMeasuringPointCookie();
	}

}

/**
 *
 * @param ptInputId
 *
 * @history che, 15.09.2010: init
 * @history rsv, 24.10.2011: Erweiterung Komptibilität Firefox
 */
function shePerfMonSubmitButtonOnClickCalled(poEvent)
{
	var loElement;
	if (poEvent && poEvent.target)
	{
		// W3C
		loElement = poEvent.target;
	}
	else if (window.event && window.event.srcElement)
	{
		// IE
		loElement = window.event.srcElement;
	}

	shePerfMonUpdateRequestGuid();

	var ltButtonIdentifier = loElement.getAttribute("id")
	if (ltButtonIdentifier === undefined || ltButtonIdentifier === null || ltButtonIdentifier === "")
	{
		ltButtonIdentifier = loElement.getAttribute("name");
	}

	// rsv, 01.02.2011: value hier zu verwenden ist Blödisinn, ist ja in jeder Sprache anders
	//                  nützlicher ist da die Information Land
	// var ltButtonText = loElement.getAttribute("value");
	// shePerfMonSendData("formSubmitButton", shePerfMonGetUrlReal(), false, ltButtonIdentifier, ltButtonText)


	shePerfMonSendDataIfAllowed("formSubmitButton", ltButtonIdentifier);
}

/**
 *
 * @param ptLinkIdentifier
 *
 * @history che, 15.09.2010: init
 * @history rsv, 24.10.2011: Erweiterung Komptibilität Firefox
*/
function shePerfMonLinkOnClickCalled(poEvent)
{
	var loElement;
	if (poEvent && poEvent.currentTarget)
	{
		// W3C
		loElement = poEvent.currentTarget;
	}
	else if (window.event && window.event.srcElement)
	{
		// IE
		loElement = window.event.srcElement;
	}

	shePerfMonUpdateRequestGuid();

	var ltLinkIdentifier = loElement.getAttribute("id")
	var ltLinkUrl = loElement.getAttribute("href");

	if (!ltLinkUrl || ltLinkUrl == "#")
	{
		var ltLabel = loElement.textContent ? loElement.textContent : loElement.innerText;
		ltLinkUrl = "#:" + ltLabel;
	}

	shePerfMonSendDataIfAllowed("linkClick", ltLinkIdentifier);
}

/**
 *
 * @return
 *
 * @history che, 15.09.2010: init
 */
function shePerfMonOnSubmitCalled()
{
	shePerfMonUpdateRequestGuid();
	// shePerfMonSendData("formSubmit", shePerfMonGetUrlReal(), false, '');
	// shePerfMonSendDataIfAllowed("formSubmit", shePerfMonGetUrlReal(), '');
	shePerfMonSendDataIfAllowed("formSubmit", '');
}


/**
 *
 * @param ptValue
 * @param ptPadChar
 * @param piMaxLength
 *
 * @return
 *
 * @history che, 15.09.2010: init
 */
function shePerfMonPadLeft(ptValue, ptPadChar, piMaxLength)
{
	var ltValue = ''+ptValue;

	if (ptPadChar === undefined)
	{
		ptPadChar = "0";
	}
	if (ptPadChar === null)
	{
		ptPadChar = "0";
	}
	if (ptPadChar === "")
	{
		ptPadChar = "0";
	}

	while (ltValue.length < piMaxLength)
	{
		ltValue = ptPadChar+ltValue;
	}

	return ltValue;
}

/**
 *
 * @param ptEvent
 * @param ptUrl
 * @param pbAsync
 * @param ptAdditionalInfo
 *
 * @return
 *
 * @history che, 15.09.2010: init
 * @history rsv, 07.10.2010: Ajax-Abschaltung
 */
function shePerfMonSendData(ptEvent, ptUrl, ptAdditionalInfo02)
{
	var ltUrl = shePerfMonGetUrlSendLog();
	var loDate = new Date();
	var ltTimestamp = loDate.getFullYear()+"-"+shePerfMonPadLeft((loDate.getMonth()+1),'0',2)+"-"+shePerfMonPadLeft(loDate.getDate(),'0',2)+"T" +shePerfMonPadLeft(loDate.getHours(),'0',2)+':'+shePerfMonPadLeft(loDate.getMinutes(),'0',2)+':'+shePerfMonPadLeft(loDate.getSeconds(),'0',2)+'.'+shePerfMonPadLeft(loDate.getMilliseconds(),'0',3);


	/*
	if (ptAdditionalInfo01 === undefined)
	{
		ptAdditionalInfo01 = "";
	}
	*/
	if (ptAdditionalInfo02 === undefined)
	{
		ptAdditionalInfo02 = "";
	}

	/*
	 * @remark
	 * rsv, 13.09.2011: wird nicht mehr verwendet, da alle clientseitigen Aufrufe über
	 * PictureService.aspx abgewickelt werden

	laRequestParams[++liRequestParamsPos] = "perfMonUrl=" + escape(ptUrl);
	laRequestParams[++liRequestParamsPos] = "perfMonAction=" + ptEvent;
	laRequestParams[++liRequestParamsPos] = "perfMonUserGuid=" + perfMonGetSessionID();
	laRequestParams[++liRequestParamsPos] = "perfMonTimestamp=" + ltTimestamp;
	laRequestParams[++liRequestParamsPos] = "perfMonReferrer=" + shePerfMonGetUrlReferer();
	laRequestParams[++liRequestParamsPos] = "perfMonRequestGuid=" + shePerfMonGetCookie('PerfMonCookie');
	laRequestParams[++liRequestParamsPos] = "perfMonAdditionalInfo=" + ptAdditionalInfo01 + sheGetElementContent('PerfMonAdditionalInfo');
	laRequestParams[++liRequestParamsPos] = "perfMonAdditionalInfo02=" + ptAdditionalInfo02;

	var ltRequestParams = laRequestParams.join('&');
	*/

/*
	var laRequestParams = [];
	var liRequestParamsPos = -1;

	laRequestParams[++liRequestParamsPos] = "type=" + "client";
	laRequestParams[++liRequestParamsPos] = "app=" + shePerfMonGetAppName();
	laRequestParams[++liRequestParamsPos] = "url=" + escape(ptUrl);
	laRequestParams[++liRequestParamsPos] = "referer=" + shePerfMonGetUrlReferer();
	laRequestParams[++liRequestParamsPos] = "uid=" + perfMonGetSessionID();
	laRequestParams[++liRequestParamsPos] = "timestamp=" + ltTimestamp;
	laRequestParams[++liRequestParamsPos] = "rid=" + shePerfMonGetCookie('PerfMonCookie');
	laRequestParams[++liRequestParamsPos] = "event=" + ptEvent;
	laRequestParams[++liRequestParamsPos] = "ai1=" + shePerfMonGetCountry(); // ptAdditionalInfo01 + /////// sheGetElementContent('PerfMonAdditionalInfo');
	// laRequestParams[++liRequestParamsPos] = "ai2=" + escape(ptAdditionalInfo02);
	laRequestParams[++liRequestParamsPos] = "ai2=" + escape(sheGetElementContent('PerfMonAdditionalInfo'));
	laRequestParams[++liRequestParamsPos] = "ui1=" + shePerfMonGetUserInfo01();
	laRequestParams[++liRequestParamsPos] = "ui2=" + shePerfMonGetUserInfo02();
	var ltRequestParams = laRequestParams.join('&');

	alert("ai2:" + escape(sheGetElementContent('PerfMonAdditionalInfo')));
	alert("ai2_:" + sheGetElementContent('PerfMonAdditionalInfo'));
*/

	var laRequestParams =
	[
		"type=" + "client",
		"app=" + shePerfMonGetAppName(),
		"url=" + escape(ptUrl),
		"referer=" + shePerfMonGetUrlReferer(),
		"uid=" + perfMonGetSessionID(),
		"timestamp=" + ltTimestamp,
		"rid=" + shePerfMonGetCookie('PerfMonCookie'),
		"event=" + ptEvent,
		"ai1=" + shePerfMonGetCountry(),
		"ai2=" + escape(sheGetElementContent('PerfMonAdditionalInfo')),
		"ui1=" + shePerfMonGetUserInfo01(),
		"ui2=" + shePerfMonGetUserInfo02(),
	];
	var ltRequestParams = laRequestParams.join('&');






 	// alert(ltUrl + '?' + ltRequestParams);
	// Der Aufruf muss genau so vonstatten gehen.
	// Wenn man ein <img>-Tag bereits im HTML-Dokument 'PerfMonUrlSendLogPic' definiert hat, und
	// diesem src zuweist, so dass die URL geladen wird, fängt der IE manchmal das Spinnen an,
	// und braucht eine Ewigkeit, bis die Seite geladen ist. Wenn man statt <img> <iframe>
	// benutzt, funktioniert alles einwandfrei, doch hier könnte es evtl. Probleme mit der
	// Same-Origin-Policy geben. Ich weiß nicht warum, aber mit new Image() gibt es keine
	// Probleme.
	new Image().src = ltUrl + '?' + ltRequestParams;
	// document.getElementById('PerfMonUrlSendLogPic').src = ltUrl + '?' + ltRequestParams;
}





