﻿/*
enth?lt die auf allen Seiten standardm??ig verwendeten Funktionen
*/



debugWin = false;

/**
* schreibt je nach write_mode einen Debug-String auf unterschiedliche Art in ein eigenes PopUp-Fenster
* oder erzeugt einen Alert
* kleiner Haken:
* bei Aufruf via mouse_over_events werden immer mehrere Debug-Fenster ge?ffnet,
* bis dass das jeweils unter der globalen Variable debugWin ge?ffnete Fenster genommen wird
* @param String der ausgegebene String (wird beim Schreiben un das Fenster um Zeilenumbr?che erg?nzt)
* @param write_mode String, Varianten: pre (String wird vor dem vorhandenen Text angef?gt)
* post (String wird hinter dem vorhandenen Text angef?gt)
* new (nur der neue String wird angezeigt)
* alert (Ausgabe als alert)
*/
function write_2_debug_win(debugString,write_mode)
{
	if(write_mode == 'alert')
	{
		alert(debugString);
	}
	else
	{
		if(!debugWin || debugWin.closed)
		{
			window_settings='menubar=no, status=yes, locationbar=no, resizable=yes, scrollbars=yes, width=250px, height=250px';
			debugWin = window.open('about:blank','debugWin',window_settings);
			debugWin.document.write('<html><head><title>Debug-Fenster</title></head><body style="font-family: arial"><div id="resultArea"></div></body></html>');
			debugWin.document.close();
		}

		if(write_mode == 'pre')
		{
			debugWin.document.getElementById('resultArea').innerHTML = debugString + '<br>' + debugWin.document.getElementById('resultArea').innerHTML;
		}
		else if(write_mode == 'post')
		{
			debugWin.document.getElementById('resultArea').innerHTML = debugWin.document.getElementById('resultArea').innerHTML + debugString + '<br>';
		}
		else //if(write_mode == 'replace')
		{
			debugWin.document.getElementById('resultArea').innerHTML = debugString + '<br>';
		}
	}
}

/*
bei jedem Aufruf dieser Seite wird zuerst mal der verwendete Browser und die Versionsnummer gecheckt:
*/

function checkBrowser()
{
	if(navigator.userAgent.indexOf('Opera') != -1)
	{
		theUserAgent = 'Opera';
		versionPos = navigator.userAgent.indexOf('Opera') + 5;
		versionLength = 5;
		theUserVersion = parseInt(navigator.userAgent.substr(versionPos,versionLength));
	}
	else if (navigator.userAgent.indexOf('Firefox') != -1)
	{
		theUserAgent = 'Firefox';
		versionPos = navigator.userAgent.indexOf('Firefox') + 8;
		versionLength = 5;
		theUserVersion = parseInt(navigator.userAgent.substr(versionPos,versionLength));
	}
	else if(navigator.userAgent.indexOf('MSIE') != -1)
	{
		theUserAgent = 'MSIE';
		versionPos = navigator.userAgent.indexOf('MSIE') + 5;
		versionLength = 3;
		theUserVersion = parseInt(navigator.userAgent.substr(versionPos,versionLength));
	}
	else if(navigator.userAgent.indexOf('Mozilla') != -1)
	{
		theUserAgent = 'Mozilla';
		versionPos = navigator.userAgent.indexOf('Mozilla') + 8;
		versionLength = 3;
		theUserVersion = parseInt(navigator.userAgent.substr(versionPos,versionLength));
	}
}

/*
Events f?r bestimmte HTML-Elemente (z.B. 'td') dynamisch setzen
@param string Name des Tags
@param string Name des Events (!Kleinbuchstaben)
@param string Name der Funktion (ohne Attributklammern)
*/
function set_tag_event(tag_name,event_name,function_name)
{
	theElements = document.getElementsByTagName(tag_name);
	for(ec=0;ec<theElements.length;ec++)
	{
		theElement=theElements[ec];
		the_expression = "theElement." + event_name + "=" + function_name;
		eval(the_expression);
	}
}

/**
* Events f?r bestimmte HTML-Elemente (z.B. 'td') mit bestimmten StyleSheet-Klassen dynamisch setzen
* Funktioniert im IExplore und Firefox
* @param string Name des Tags
* @param string Name der Klasse
* @param string Name des Events (!Kleinbuchstaben)
* @param string Name der Funktion (ohne Attributklammern)
*/
function set_class_event(tag_name,class_name,event_name,function_name)
{
	theElements = document.getElementsByTagName(tag_name);
	for(ec=0;ec<theElements.length;ec++)
	{
		theElement=theElements[ec];

		if(theElement.className == class_name)
		{
			the_expression = "theElement." + event_name + "=" + function_name;
			eval(the_expression);
		}
	}
}

/**
* Events f?r HTML-Elemente mit bestimmten Attributen dynamisch setzen
* Achtung:
* das name-Attribut ist gem. W3C nur bei folgenden Elementen zul?ssig:
* a applet form frame img input iframe map meta object param select textarea
* getElementsByName wird im MSIE nur bei diesen Tags ber?cksichtigt, andere Browser geben auch die sonstigen Elemente mit diesem namen zur?ck,
* daher im Script Fallunterscheidung je nach Browser
* @param string Name des Elements
* @param string Name des Events (!Kleinbuchstaben)
* @param string Name der Funktion (ohne Attributklammern)
*/
function set_name_event(element_name,event_name,function_name)
{
	if(theUserAgent == 'MSIE')
	{
		allElements = document.all;
		for(ec=0;ec<allElements.length;ec++)
		{
			theElement = allElements[ec];
			if(theElement.getAttribute('name') == element_name)
			{
				the_expression = "theElement." + event_name + "=" + function_name;
				eval(the_expression);
			}
		}
	}
	else
	{
		theElements = document.getElementsByName(element_name);
		for(ec=0;ec<theElements.length;ec++)
		{
			theElement=theElements[ec];
			the_expression = "theElement." + event_name + "=" + function_name;
			eval(the_expression);
		}
	}
}


/**
 * Events f?r ein eindeutiges HTML-Element dynamisch setzen
 * wichtig:
 * @param string element_id
 * @param string event_name => Kleinbuchstaben!!
 * @param string function_name => ohne Attributklammern!!
*/
function set_id_event(element_id,event_name,function_name)
{
	theElement = document.getElementById(element_id);
	if(theElement != null)
	{
		the_expression = "document.getElementById('" + element_id + "')." + event_name + "=" + function_name;
		eval(the_expression);
	}
	else
	{
		alert('Error Funktion set_id_event: Element mit ID ' + element_id + ' im aktuellen Dokument nicht enthalten...');
	}
}

/**
*  Hilfsfunktion zum Ersetzen oder Hinzuf?gen eines Parameters in der ?bergebenen URL
*  @param string  falls leer, wird die aktuelle URL genommen
*  @param string  Name des Paramters
*  @param string  Wert des Parameters
*  @return string
*/
function change_url_param(old_url,param_name,param_value)
{
	if(old_url == '')
	{
		old_url = document.location.href;
	}

	new_param = param_name + '=' + param_value;

	query_part_starts_at = old_url.indexOf('?');
	//noch kein query_string vorhanden
	if(query_part_starts_at == -1)
	{
		new_url_part = old_url;
		new_query_part = new_param;
	}
	else
	{
		//Zerlegen der URL in url_part und query_part
		new_url_part = old_url.substring(0,query_part_starts_at);
		old_query_part = old_url.substr(query_part_starts_at + 1);
		//Zerlegen query_part in Einzelparameter
		param_array = old_query_part.split('&');
		new_param_array = Array();
		param_found = false;
		for (var i = 0; i < param_array.length; ++i)
		{
			this_param = param_array[i];
			//zerlegen Einzelparameter in Name- und Wert-Paare
			this_param_array = this_param.split('=');
			this_param_name = this_param_array[0];
			this_param_value = this_param_array[1];
			//?berpr?fung, ob der neue Parameter bereits im query-String vorkam, falls ja, dann durch neuen Wert ersetzten:
			if(this_param_name == param_name)
			{
				new_param_array.push(new_param);
				param_found = true;
			}
			else
			{
				new_param_array.push(this_param);
			}
		}
		//der neue Parameter wurde nicht gefunden, er wird angeh?ngt
		if(param_found == false)
		{
			new_param_array.push(new_param);
		}
		new_query_part = new_param_array.join('&');
	}

	new_url = new_url_part + '?' + new_query_part;
	return new_url;
}

/*
ein Element mit einer ID sichtbar oder unsichtbar schalten
falls auf unsichtbar, wird die globale Variable panning auf false gesetzt, um den Pan-Modus abzuschalten
*/
function toggleDisplay(elementID)
{
	theElement = document.getElementById(elementID);
	if(theElement != null)
	{
		if(theElement.style.display == 'none')
		{
			theElement.style.display = 'block';
		}
		else
		{
			theElement.style.display = 'none';
		}
	}
	panning = false;
}

function write2debugWin(debug_string)
{


}

/*
3 Scripte zum verschieben angeklickter Elemente
1. startPanMode => Ausgel?st mit onmousedown
2. doPan => Ausgel?st mit onmousemove
3. stopPanMode => Ausgel?st mit onmouseup
*/

/*
1. startPanMode:
ermittelt die aktuelle Klickposition startX/startY
ermittelt die Position des angeklickten Elements elementStartX/elementStartY
setzt die Variable panning auf true
?ndert den Cursor auf move
*/
function startPanMode(ereignis)
{
	//IE: .x/.y enthalten den Abstand vom Fensterrand, zur Positionierung des Flyouts muss daher die Scrollposition addiert werden
	//bei anderen Browsern enthalten pageX und pageY den Abstand vom Dokumentrand, der Scrollabstand ist nicht erforderlich
	if(!ereignis)
	{
		ereignis = window.event;
	}
	the_event = new myEvent(ereignis);

	startX = the_event.myStyleX;
	startY = the_event.myStyleY;

	elementStartX = parseInt(this.style.left);
	elementStartY = parseInt(this.style.top);

	panning = true;
}
/*
2: doPan:
falls panning auf true steht, wird
die aktuelle Mausposition ermittelt
die Differenz zur Mausposition bei startPanMode ermittelt
die neuen Koordinaten errechnet
das aktuelle Objekt zu dieser Stelle verschoben
Verwendet die globalen Variablen startX/startY und elementStartX/elementStartY aus der Funktion startPanMode
*/
function doPan(ereignis)
{
	if(panning)
	{
		if(!ereignis)
		{
			ereignis = window.event;
		}
		the_event = new myEvent(ereignis);
		endX = the_event.myStyleX;
		endY = the_event.myStyleY;

		deltaX = endX - startX;
		deltaY = endY - startY;
		newX = elementStartX + deltaX;
		newY = elementStartY + deltaY;
		this.style.left = newX + 'px';
		this.style.top = newY + 'px';
		this.style.cursor = 'move';
	}
	else
	{
		this.style.cursor = 'default';
	}
}
/*
stopPanMode:
setzt die Variable panning auf true
?ndert den Cursor auf default
*/
function stopPanMode(ereignis)
{
	panning = false;
	this.style.cursor = 'default';
}

/**
* Hilfsklasse/Objekt zur Berechnung der Event-Position in Abh?ngigkeit vom Browser
* Beinhaltet die browserunabh?ngigen (?)
* Eigenschaften des aktuellen Events:
* myStyleX
* myStyleY
* myEventX
* myEventY
* myScreenX
* myScreenY
* myScrollX
* myScrollY
* @param Event
*/
function myEvent(ereignis)
{
	this.myEventX = 0;
	this.myEventY = 0;
	this.myStyleX = 0;
	this.myStyleY = 0;
	this.myScreenX = 0;
	this.myScreenY = 0;
	this.myScrollX = 0;
	this.myScrollY = 0;
	this.myShiftKey = false;
	this.myCtrlKey = false;
	this.myAltKey = false;

	//1. Ereigniskoordinaten relativ zur oberen linken Ecke des Fensters ohne Ber?cksichtigung des Scrollens
	if(ereignis.clientX)
	{
		this.myEventX = ereignis.clientX;
	}
	else if(ereignis.x)
	{
		this.myEventX = ereignis.x;
	}

	if(ereignis.clientY)
	{
		this.myEventY = ereignis.clientY;
	}
	else if(ereignis.y)
	{
		this.myEventY = ereignis.y;
	}

	//2. Scrollwerte des Fensters

	if(document.body.scrollLeft)
	{
		this.myScrollX = document.body.scrollLeft;
	}
	else if(document.documentElement.scrollLeft)
	{
		this.myScrollX = document.documentElement.scrollLeft;
	}

	if(document.body.scrollTop)
	{
		this.myScrollY = document.body.scrollTop;
	}
	else if(document.documentElement.scrollTop)
	{
		this.myScrollY = document.documentElement.scrollTop;
	}

	//3. die Style-Infos des Ereignisses als Addition der Event-Position und der Scrollposition
	this.myStyleX = this.myEventX + this.myScrollX;
	this.myStyleY = this.myEventY + this.myScrollY;

	//4. die Koordinatenangaben bezogen auf die linke obere Bildschirmecke
	if(ereignis.screenX)
	{
		this.myScreenX = ereignis.screenX;
	}

	if(ereignis.screenY)
	{
		this.myScreenY = ereignis.screenY;
	}
}

/*
Hilfsfunktion zur browserunabh?ngigen (?) Ermittlung von Fenstereigenschaften
Die aus dem window, document.documentElement und document.body entnehmbaren und
je nach Browser interpretierbaren Eigenschaften werden "harmonisiert"
Die Eigenschaften des myWindow-Objektes orientieren sich dabei an den Mozilla-Bezeichnungen
Achtung:
Aktuelle DPI-Einstellung werden vom MSIE ber?cksichtigt, so dass dort Pixel unterschiedlich breit werden (default 96 DPI).
Mozilla verwendet die gem. Bildschirmaufl?sung korrekten Fenstergr??en
Auch das Screen-Objekt (availWidth/availHeight zeigt diesen Effekt
@param window (falls leer, wird das aktuelle Fenster verwendet)
*/
function myWindow(theWindow)
{
	if(!theWindow)
	{
		theWindow = window;
	}

	theDoc = theWindow.document;
	theBody = theDoc.body;

	//Nutzbare Breite/H?he des Anzeigebereichs (ohne evtl. vorhandene Scrollbars)
	this.myClientHeight = 0;
	this.myClientWidth = 0;

	//Breite/H?he des Anzeigebereichs mit Scrollbars
	this.myInnerWidth = 0;
	this.myInnerHeight = 0;

	//Breite/H?he des Fensters incl. Menuleisten, Statuszeile (entspricht dem Ergebnis von window.resizeTo(x,y) ohne den Fensterrand)
	this.myWindowHeight = 0;
	this.myWindowWidth = 0;

	//aktuelle Scrollposition
	this.myScrollX = 0;
	this.myScrollY = 0;

	//scrollbare Breite/H?he
	this.myScrollWidth = 0;
	this.myScrollHeight = 0;

	//Fensterkoordinaten links/oben auf Bildschirm
	this.myScreenX = 0;
	this.myScreenY = 0;

	/*
	Bei den unterscuhten Browsern erscheinen ?bereinstimmende Eigenschaften unter verschiedenen Namen und bei unterschiedlichen Objekten,
	teils sogar innerhalb eines Browsers mehrfach, beim MSIE6 sogar je nach Modus (falls <!DOCTYPE... deklariert => strict, sonst quirks) unterschiedlich...
	letzterem Umstand wird dadurch begegnet, dass alle Seiten eine korrekte DOCTYPE-Deklaration besitzen
	Priorit?t bei der Festlegung der Eigenschaften
	1a. window-Objekt im MSIE strict-Mode
	2a. window-Objekt in Mozilla/Firefox strict-Mode
	1b. document.documentElement-Objekt im MSIE strict-Mode
	2b. document.documentElement-Objekt in Mozilla/Firefox strict-Mode
	1c. document.body-Objekt im MSIE strict-Mode
	2c. document.body-Objekt in Mozilla/Firefox strict-Mode
	*/

	//Fensterposition
	if(theWindow.screenLeft)                     //MSIE
	{
		this.myScreenX = theWindow.screenLeft;
	}
	else if(theWindow.screenX)                   //Moz
	{
		this.myScreenX = theWindow.screenX;
	}

	if(theWindow.screenTop)                     //MSIE
	{
		this.myScreenY = theWindow.screenTop;
	}
	else if(theWindow.screenY)                   //Moz
	{
		this.myScreenY = theWindow.screenY;
	}


}

/*
Hilfsfunktion, welche alle Eigenschaften eines Objektes als Tabelle ausgibt
Optional k?nnen per regul?rem Aussdruck bestimmte Eigenschaften selektiert werden
Der dritte Parameter bewirkt, das nur Eigenschaften mit numerischen Werten angezeigt werden
@param Objekt
@param RegExp
@param Boolean
@returns String
*/
function objectProps2Table(theObject,eigenschaftRegExp,justNumbers)
{
	if(theObject)
	{
		tableString = '<h2>Eigenschaften Objekt ' + theObject + '</h2>';
		if(eigenschaftRegExp)
		{
			tableString += '<h3>(Eigenschaften mit Regexp-Filter: ' + eigenschaftRegExp + ')</h3>';
		}
		if(justNumbers)
		{
			tableString += '<h3>(nur numerische Werte)</h3>';
		}
		tableString += '<table>';
		trArray = new Array();
		for (var Eigenschaft in theObject)
		{
			if(theObject[Eigenschaft])
			{
				if(eigenschaftRegExp)
				{
					if(Eigenschaft.search(eigenschaftRegExp) != -1)
					{
						if(justNumbers)
						{
							if(parseFloat(theObject[Eigenschaft]) || theObject[Eigenschaft] == 0)
							{
								trString = '<tr><td style="vertical-align:top;">' + Eigenschaft + '</td><td>' + theObject[Eigenschaft] + '</td></tr>';
								trArray.push(trString);
							}
						}
						else
						{
							trString = '<tr><td style="vertical-align:top;">' + Eigenschaft + '</td><td>' + theObject[Eigenschaft] + '</td></tr>';
							trArray.push(trString);
						}
					}
				}
				else
				{
					if(justNumbers)
					{

						if(parseFloat(theObject[Eigenschaft]) || theObject[Eigenschaft] == 0)
						{
							trString = '<tr><td style="vertical-align:top;">' + Eigenschaft + '</td><td>' + theObject[Eigenschaft] + '</td></tr>';
							trArray.push(trString);
						}
					}
					else
					{
						trString = '<tr><td style="vertical-align:top;">' + Eigenschaft + '</td><td>' + theObject[Eigenschaft] + '</td></tr>';
						trArray.push(trString);
					}
				}

			}
		}
		trArray.sort();

		numOfTrs = trArray.length;
		for(tr = 0; tr < numOfTrs; tr ++)
		{
			tableString +=  trArray[tr];
		}


		tableString += '</table>';
	}
	else
	{
		tableString = "Objekt nicht ?bergeben...";
	}
	return tableString;
}

/**
* cross-browser-scripting (gem. quirksmode.org)
* Funktionen ermitteln die aktuelle Scroll-Position des Fensters
*/
function get_scroll_top(the_win)
{
	var scroll_top;
	if (the_win.pageYOffset) // all except Explorer
	{
		scroll_top = the_win.pageYOffset;
	}
	else if (the_win.document.documentElement && the_win.document.documentElement.scrollTop)
		// Explorer 6 Strict
	{
		scroll_top = the_win.document.documentElement.scrollTop;
	}
	else if (the_win.document.body) // all other Explorers
	{
		scroll_top = the_win.document.body.scrollTop;
	}
	return scroll_top;
}

function get_scroll_left(the_win)
{
	var scroll_left;
	if (the_win.pageYOffset) // all except Explorer
	{
		scroll_left = the_win.pageXOffset;
	}
	else if (the_win.document.documentElement && the_win.document.documentElement.scrollTop)
		// Explorer 6 Strict
	{
		scroll_left = the_win.document.documentElement.scrollLeft;
	}
	else if (the_win.document.body) // all other Explorers
	{
		scroll_left = the_win.document.body.scrollLeft;
	}
	return scroll_left;
}

/**
* einige Hilfsfunktionen f?r das browserunabh?ngige Positionieren
*/
function getEventStyleLeft(theWin)
{
	windowOffsetX = theWin.document.body.scrollLeft;
	styleLeft = theWin.event.x + windowOffsetX;
	return styleLeft;
}
function getEventStyleTop(theWin)
{
	windowOffsetY = theWin.body.scrollTop;
	styleTop = theWin.event.y + windowOffsetY;
	return styleTop;
}
function getElementStyleLeft(element)
{
	styleLeft = parseInt(element.style.left);
	return styleLeft;
}
function getElementStyleTop(element)
{
	styleTop = parseInt(element.style.top);
	return styleTop;
}
function getElementStyleWidth(element)
{
	styleWidth = parseInt(element.style.width);
	return styleWidth;
}
function getElementStyleHeight(element)
{
	styleHeight = parseInt(element.style.height);
	return styleHeight;
}