/*
	Dateiname:			global.js
	Zweck:				Globale JavaScripts
	Ersteller:			Hakan Erci
	Datum:				10.08.07
	Version:			4.1.1
							 
	Aenderungen :
	Datum		Version	Wer		Beschreibung
	18.11.2008	4.1.1a	uo		Folgende Funktionen vom contactform.js übertragen, da diese in div. Modulen verwendet werden:
								checkemailadr, threeway_checkeurodate, threeway_checkday, threeway_checkinteger, threeway_numberrange, threeway_checknumber, threeway_checkrange, threeway_checktime

	------------------------------------------------------------
	
	Kundenspezifische Anpassungen:
	Datum		Wer		Beschreibung
	
*/

<!--
/* E-Mail Adressen verschluesseln */
	function CryptMailto()
	{
		var n = 0;
		var r = "";
		var s = "mailto:"+document.forms[0].emailField.value+"?subject="+document.forms[0].emailsubject.value;
		var e = document.forms[0].emailField.value;
	
		e = e.replace( /@/, " [at] ");
		/* e = e.replace( /\./g, " [dot] "); */
	
		for( var i=0; i < s.length; i++)
		{
			n = s.charCodeAt(i);
			if( n >= 8364 )
			{
				n = 128;
			}
			r += String.fromCharCode(n+1);
		}
		document.forms[0].cyptedEmailField.value = r;
		document.forms[0].HTMLCyptedEmailField.value = "<a href=\"javascript:linkTo_UnCryptMailto('"+ r +"');\">"+ e +"</a>";
	}

/* E-Mail Adressen entschluesseln */
	function UnCryptMailto(s)
	{
		var n = 0;
		var r = "";
		for( var i = 0; i < s.length; i++)
		{
			n = s.charCodeAt(i);
			if( n >= 8364 )
			{
				n = 128;
			}
			r += String.fromCharCode(n - 1);
		}
		return r;
	}

/* Aufruf von Link auf E-Mailadresse */
	function linkTo_UnCryptMailto(s)
	{
		location.href=UnCryptMailto(s);
	}

/* Tip Layer steuern */
	function ShowTip(fArg)
	{
		var tooltipOBJ = (document.getElementById) ? document.getElementById(fArg) : eval("document.all['" + fArg + "']");
		if (tooltipOBJ != null) {
			var tooltipLft = (document.body.offsetWidth?document.body.offsetWidth:document.body.style.pixelWidth) - (tooltipOBJ.offsetWidth?tooltipOBJ.offsetWidth:(tooltipOBJ.style.pixelWidth?tooltipOBJ.style.pixelWidth:380)) - 30;
			var tooltipTop = 10;
			if (navigator.appName == 'Netscape') {
				tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10);
	 			tooltipOBJ.style.top = tooltipTop+"px";
				tooltipOBJ.style.left = tooltipLft+"px";
			}
			else {
				tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10);
				tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10);
				if ((event.clientX > tooltipLft) && (event.clientY < (tooltipOBJ.scrollHeight?tooltipOBJ.scrollHeight:tooltipOBJ.style.pixelHeight) + 10)) {
					tooltipTop = (document.body.scrollTop?document.body.scrollTop:document.body.offsetTop) + event.clientY + 20;
				}
				tooltipOBJ.style.left = tooltipLft;
				tooltipOBJ.style.top = tooltipTop;
			}
			tooltipOBJ.style.visibility = "visible";
		}
	}
	
	function HideTip(fArg)
	{
		//var tooltipOBJ = (document.getElementById) ? document.getElementById('tt' + fArg) : eval("document.all['tt" + fArg + "']");
		var tooltipOBJ = (document.getElementById) ? document.getElementById(fArg) : eval("document.all['fArg']");
		if (tooltipOBJ != null) {
			tooltipOBJ.style.visibility = "hidden";
		}
	}
/* End Tip Layer steuern */

/* E-Mail pruefen */
	function checkemailadr(emailadr){
		
		// Bsp. na-me.vor_name@nach-name.ch
		var validFormat = /^[a-z0-9](\.?[-_\w])*@[a-z0-9](\.?[-\w])*\.([a-z]{3}(\.[a-z]{2})?|[a-z]{2}(\.?[a-z]{2})?)$/i;
		var hotName = /@hotmail\./i;
		var hotTopDomain = /\.com$/i;
		var emailValid = validFormat.test(emailadr);
		var hotNameValid = hotName.test(emailadr);
		var hotTopDomainValid = hotTopDomain.test(emailadr);
		var formatOK = true;
		
		if(!emailValid){
			//alert('Bad email format !');
			formatOK = false;
			//return false;
		}
		
		if(hotNameValid && formatOK){
			if(!hotTopDomainValid){
				// alert('Hotmail allways ends with .com');
				formatOK = false;
				//return false;
			}
		}
		return formatOK;
	}
/* End E-Mail pruefen */

/* Datum und Zeit pruefen */
	function threeway_checkeurodate(object_value){
		
	    <!--- Returns true if value is a eurodate format or is NULL --->
	    <!--- otherwise returns false	 --->
	
	    if (object_value.length == 0) return true;
	
	    <!--- Returns true if value is a date in the dd/mm/yyyy format --->
		isplit = object_value.indexOf('/');
	
		if (isplit == -1) isplit = object_value.indexOf('.');
	
		if (isplit == -1 || isplit == object_value.length) return false;
	
	    sDay = object_value.substring(0, isplit);
	
		monthSplit = isplit + 1;
	
		isplit = object_value.indexOf('/', monthSplit);
	
		if (isplit == -1) isplit = object_value.indexOf('.', monthSplit);
	
		if (isplit == -1 ||  (isplit + 1 ) == object_value.length) return false;
	
	    sMonth = object_value.substring((sDay.length + 1), isplit);
	
		sYear = object_value.substring(isplit + 1);
	
		<!--- check month --->
		
		if (
					!threeway_checkinteger(sMonth)
				|| 	!threeway_checkrange(sMonth, 1, 12) 		// check month
				|| 	!threeway_checkinteger(sYear) 				// check year --->
				|| 	!threeway_checkrange(sYear, 0, null) 		// check year --->
				|| 	!threeway_checkinteger(sDay) 				// check day --->
				|| 	!threeway_checkday(sYear, sMonth, sDay)		// check day --->
			)	return false;
		else	return true;
	}

	function threeway_checkday(checkYear, checkMonth, checkDay){
		
		maxDay = 31;
		if (checkMonth == 4 || checkMonth == 6 || checkMonth == 9 || checkMonth == 11){
			maxDay = 30;
		}else if (checkMonth == 2){
			if (checkYear % 4 > 0)									maxDay = 28;
			else if (checkYear % 100 == 0 && checkYear % 400 > 0)	maxDay = 28;
			else													maxDay = 29;
		}
		return threeway_checkrange(checkDay, 1, maxDay); <!--- check day --->
	}

	function threeway_checkinteger(object_value){
		
	    <!--- Returns true if value is a number or is NULL --->
	    <!--- otherwise returns false	 --->
	
	    if (object_value.length == 0) return true;
	
	    <!--- Returns true if value is an integer defined as --->
	    <!--- having an optional leading + or -. --->
	    <!--- otherwise containing only the characters 0-9. --->
		var decimal_format = ".";
		var check_char;
	
	    <!--- The first character can be + -  blank or a digit. --->
		check_char = object_value.indexOf(decimal_format)
	    <!--- Was it a decimal? --->
	    if (check_char < 1)	return threeway_checknumber(object_value);
	    else				return false;
	}

	function threeway_numberrange(object_value, min_value, max_value){
		
	    <!--- check minimum --->
	    if (min_value != null && object_value < min_value) return false;
	
	    <!--- check maximum --->
	    if (max_value != null && object_value > max_value) return false;
		
	    <!--- All tests passed, so... --->
	    return true;
	}

	function threeway_checknumber(object_value){
		
	    <!--- Returns true if value is a number or is NULL --->
	    <!--- otherwise returns false	 --->
	
	    if (object_value.length == 0)
	        return true;
	
	    <!--- Returns true if value is a number defined as --->
	    <!--- having an optional leading + or -. --->
	    <!--- having at most 1 decimal point. --->
	    <!--- otherwise containing only the characters 0-9. --->
		var start_format = " .+-0123456789";
		var number_format = " .0123456789";
		var check_char;
		var decimal = false;
		var trailing_blank = false;
		var digits = false;
	
	    <!--- The first character can be + - .  blank or a digit. --->
		check_char = start_format.indexOf(object_value.charAt(0))
	    <!--- Was it a decimal? --->
		if (check_char == 1)		decimal = true;
		else if (check_char < 1)	return false;
	        
		<!--- Remaining characters can be only . or a digit, but only one decimal. --->
		for (var i = 1; i < object_value.length; i++){
			
			check_char = number_format.indexOf(object_value.charAt(i))
			if (check_char < 0){
				return false;
			}else if (check_char == 1){
				<!--- Second decimal. --->
				if (decimal)	return false;
				else			decimal = true;
			
			}else if (check_char == 0){
				if (decimal || digits)	trailing_blank = true;
	        <!--- ignore leading blanks --->
	
			}else if (trailing_blank){
				return false;
			}else{
				digits = true;
			}
		}	
	    <!--- All tests passed, so... --->
	    return true
	}

	function threeway_checkrange(object_value, min_value, max_value)
	{
	    <!--- if value is in range then return true else return false --->
	
	    if (object_value.length == 0) return true;
	
	    if (!threeway_checknumber(object_value))	return false;
		else										return (threeway_numberrange((eval(object_value)), min_value, max_value));
		
	    <!--- All tests passed, so... --->
	    return true;
	}

	function threeway_checktime(object_value)
	{
	    //Returns true if value is in time format or is NULL
	    //otherwise returns false	
	
	    if (object_value.length == 0) return true;
	
	    //Returns true if value is a date in the mm/dd/yyyy format
		isplit = object_value.indexOf(':');
	
		if (isplit == -1 || isplit == object_value.length) return false;
	
	    sHour = object_value.substring(0, isplit);
		iminute = object_value.indexOf(':', isplit + 1);
	
		if (iminute == -1 || iminute == object_value.length)	sMin = object_value.substring((sHour.length + 1));
		else													sMin = object_value.substring((sHour.length + 1), iminute);
		
		
		//check hour
	    if (!threeway_checkinteger(sHour) || !threeway_checkrange(sHour, 0, 23))  return false;
		
		//check minutes
		if (!threeway_checkinteger(sMin) || !threeway_checkrange(sMin, 0, 59)) return false;
	
		// did they specify seconds
	    if (iminute != -1){
			sSec = object_value.substring(iminute + 1);
			// check seconds
			if (!threeway_checkinteger(sSec) || !threeway_checkrange(sSec, 0, 59)) return false;
		}
	    
	    return true;
	}
	
/* End Datum und Zeit pruefen */


//AJAX Requests einfach gemacht!
/*
Einen neuen Ajax-Request erstellt man wie folgt.
Ajax.startRequest(methode, url, callback [, async])

wobei:
methode:	"get" oder "post"
url:		Pfad zum gewünschten File
callback:	Funktion, die nach erfolgreichem Abschluss des Requests ausgeführt wird
async:		true oder false, wobei true = asynchron und false = synchron
*/
var Ajax = {
	getTransport: function()
	{
		req = false;
		//Gecko
		if (window.XMLHttpRequest) {
			try {req = new XMLHttpRequest();}
			catch(e) {req = false;}
		}
		//IE
		else if (window.ActiveXObject) {
		try {req = new ActiveXObject("Msxml2.XMLHTTP");}
			catch(e) {
				try {req = new ActiveXObject("Microsoft.XMLHTTP");}
				catch(e) {req = false;}
			}
		}
		return req;
	},
	
	startRequest: function(method, url, callback, async)
	{
		var url = url.replace(/&amp;/g, "&");
		if (async == undefined) async = true;
		var transport = this.getTransport();
		if (!transport) {alert("No Ajax possible in your Browser!")}
		else
		{
			transport.onreadystatechange = function()
			{
				if (transport.readyState == 4)
				{
					if (transport.status == 200 || transport.status == 204)
					{
						callback(transport);
					}
				}
			};
			transport.open(method, url, async);
			transport.send(null);
		}
		return transport;
	}
};
// -->

/*
	addEvent

	Zweck der Funktion:
	Registriert einen Event-Listener (browserübergreifend)
	
	Aufruf:
	addEvent(DOM-Element, Typ des Events, Handler-Funktion, useCaption)
	
	Beispiel:
	addEvent(document.body, "click", function(){alert("Auf Body geklickt!")}, false)
*/

function addEvent(obj, eventType, handleFunction, useCaption)
{
	var useCaption = (useCaption || false);
	if (obj.addEventListener) /* FF, Safari, etc. */
	{
		obj.addEventListener(eventType, handleFunction, useCaption);
		return true;
	}
	else if (obj.attachEvent) /* IE */
	{
		return obj.attachEvent("on"+eventType, handleFunction);
	}
	else return false;
}

/*
	getElementsByClassName

	Zweck der Funktion:
	Gibt eine HTMLNodeList aller Elemente zurück, die den übergebenen Klassennamen enthalten.
	
	Aufruf:
	getElementsByClassName(classname)
*/

function getElementsByClassName(classname, context)
{
	var context = context || document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = context.getElementsByTagName("*");
	for (var i=0; i < els.length; i++)
	{
		if(re.test(els[i].className))
		{
			a.push(els[i]);
		}
	}
	return a;
}


/*
	getMousePos

	Zweck der Funktion:
	Gibt die aktuelle Mauszeigerposition relativ zum Dokument zurück. Rückgabewert ist ein Objekt mit zwei Eigenschaften,
	"x" und "y", die jeweils die Position des Mauszeigers in Pixel angeben.
	
	Aufruf:
	getMousePos(Event)
*/

function getMousePos(e)
{
	if (!e) e = window.event;
	var body = (window.document.compatMode && window.document.compatMode == "CSS1Compat") ? window.document.documentElement : window.document.body;
	return {
		x: e.pageX ? e.pageX : e.clientX + body.scrollLeft - body.clientLeft,
		y: e.pageY ? e.pageY : e.clientY + body.scrollTop - body.clientTop
	};
}


/*
	addLoadEvent

	Zweck der Funktion:
	Dieser Funktion kann eine Funktion übergeben werden, die ausgeführt wird, sobald die komplette Seite geladen wurde.
	Wird diese Funktion mehrmals aufgerufen, werden die übergebenen Funktionen in der Reihenfolge ausgeführt, wie sie übergeben wurden.
	
	Aufruf:
	addLoadEvent(Funktion)
*/

function addLoadEvent(func)
{
	var oldonload = window.onload;
	if (typeof window.onload != 'function') window.onload = func;
	else {
		window.onload = function() {
			if (oldonload) oldonload();
			func();
		}
	}
}


/*
	onDomLoaded

	Zweck der Funktion:
	Sie heisst "onDomLoaded" und erwartet ein Argument, nämlich eine Funktion,
	die ausgeführt werden soll, sobald das DOM der Seite geladen und referenzierbar ist.
	Die window.onload-Funktion oder <body onload=... wird erst ausgeführt,
	wenn sämtliche Bilder, iFrames, Flash-Movies, ... der Seite komplett geladen sind,
	was unter Umständen einige Zeit in Anspruch nehmen kann. "onDomLoaded" hingegen führt die Funktion aus,
	wenn die Dokumentstruktur geladen wurde, aber BEVOR irgendein eingebettetes Objekt
	mit dem Ladevorgang beginnt.
	Es ist ausserdem möglich, die Funktion mehrmals aufzurufen und jeweils eine andere Funktion
	als Argument zu übergeben. Sobald das DOM geladen ist, werden die registrierten Funktion
	in der Reihenfolge ausgeführt, wie sie übergeben worden sind
	
	Aufruf:
	onDomLoaded(Funktionsreferenz)
*/

function onDomLoaded(func)
{
	DOM_loaded_checkDomLoaded(); // starte die Überprüfung
	if (DOM_loaded_domLoaded)
		func(); // wenn das DOM bereits geladen, führe Funktion sofort aus
	else
	{
		if (!DOM_loaded_readyList) DOM_loaded_readyList = [];
		DOM_loaded_readyList.push(func); // andererseits füge Funktion der Warteliste hinzu
	}
	
	function DOM_loaded_ready()
	{
		if (!DOM_loaded_domLoaded) // wenn DOM bereits geladen, keine weiteren Massnahmen
		{
			DOM_loaded_domLoaded = true;	
			// führe alle Funktionen in der Warteliste aus
			for (var i = 0; i < DOM_loaded_readyList.length; i++)
			{
				DOM_loaded_readyList[i]();
			}
			DOM_loaded_readyList = null;
		}	
	}
	
	function DOM_loaded_checkDomLoaded()
	{
		if (typeof DOM_loaded_readyBound != "undefined" && DOM_loaded_readyBound == true) return;
		DOM_loaded_readyBound = true;
		DOM_loaded_domLoaded = false;
		DOM_loaded_readyList = false;
		
		// Mozilla, Opera und Webkit (Safari, Chrome)
		if (document.addEventListener)
		{
			document.addEventListener("DOMContentLoaded", function()
			{
				document.removeEventListener("DOMContentLoaded", arguments.callee, false);
				DOM_loaded_ready();
			}, false);
		}
		
		// Internet Explorer
		else if (document.attachEvent)
		{
			// wird ausgeführt kurz bevor window.onload, gilt auch für iFrames
			document.attachEvent("onreadystatechange", function()
			{
				if (document.readyState === "complete")
				{
					document.detachEvent("onreadystatechange", arguments.callee);
					DOM_loaded_ready();
				}
			});
	
			// wenn Internet Explorer, aber kein iFrame
			if (document.documentElement.doScroll && window == window.top)
			{
				// gemäss http://javascript.nwbox.com/IEContentLoaded/
				(function() {
					if (DOM_loaded_domLoaded) return;
					try {
						document.documentElement.doScroll("left");
					}
					catch(error)
					{
						setTimeout(arguments.callee, 0);
						return;
					}
					DOM_loaded_ready();
				})();
			}
		}
		
		// Fallback
		addEvent(window, "load", DOM_loaded_ready);
	}
}




//Schütze Zeichen für Variable in RegExp
RegExp.escape = function(text)
{
	if (!arguments.callee.sRE)
	{
		var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^'];
		arguments.callee.sRE = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
	}
	text = text.replace("&", "&amp;");
	return text.replace(arguments.callee.sRE, '\\$1');
}


/*
	Function.prototype.bind

	Zweck der Funktion:
	Die Funktion wird im Kontext eines beliebigen Objekts ausgeführt. Hilfreich besonders bei Event-Listener-Funktionen,
	die nicht im globalen Kontext ausgeführt werden sollen.
	Es ist zudem möglich, Parameter zu übergeben, die dann bis zum effektiven Funktionsaufruf konserviert werden.
	
	Aufruf:
	[Funktionsname].bind(Objektinstanz)
*/

Function.prototype.bind = function(object)
{
	var arguments2array = function(args)
	{
		var arr_args = [];
		for (var i = 0; i < args.length; i++)
		{
			arr_args.push(args[i]);
		}
		return arr_args;
	}
	
	if (typeof object != "object") return this;
	
	var arr_args = arguments2array(arguments);
	var object = arr_args.shift();
	
	var __method = this;
	return function()
	{
		var arr_args_new = arguments2array(arguments);
		return __method.apply(object, arr_args_new.concat(arr_args));
	}
}


/*
	showDefaultInputValues

	Zweck der Funktion:
	Vorgabe-Texte in input- und textarea-Feldern, die die Klasse "default_text" besitzen.
	Der Wert des title-Attributs wird als Vorgabewert verwendet.
	Die Klasse "default_text_active" wird verwendet, um den Vorgabetext mit CSS speziell zu gestalten.
	
	Aufruf:
	wird automatisch initialisiert
*/

function showDefaultInputValues()
{
	var handler = function(input_element)
	{
		//wenn kein title-Attribut vorhanden, nehme leeren String als Vorgabetext
		var default_text = input_element.getAttribute("title") || "";
		
		this.defaultTextHandlerFocus = function()
		{
			if (input_element.value == default_text && input_element.className.search(/default_text_active/) >= 0)
			{
				input_element.className = input_element.className.replace("default_text_active", "");
				input_element.value = "";
			}
		};
		
		this.defaultTextHandlerBlur = function()
		{
			if (input_element.value == "")
			{
				input_element.value = default_text;
				input_element.className = input_element.className + " default_text_active";
			}
		};
		
		this.defaultTextHandlerBlur(); //Initialisierung simulieren
		
		addEvent(input_element, "focus", this.defaultTextHandlerFocus);
		addEvent(input_element, "blur", this.defaultTextHandlerBlur);
	};
	
	var i;
	var element_list = getElementsByClassName("default_text");
	for (i = 0; i < element_list.length; i++)
	{
		if (element_list[i].nodeName == "INPUT" || element_list[i].nodeName == "TEXTAREA")
		{
			element_list[i].defaultHandler = new handler(element_list[i]); //erzeuge Handler-Objekt
		}
	}
}

//starte Initialisierung
onDomLoaded(showDefaultInputValues);

/*
	Webtext

	Zweck der Funktionen:
	Mit Webtext.init(prefix) werden sämtliche Webtexte initialisiert, die mit "prefix" beginnen.
	Mit Webtext.get(web_textcode) wird der gewünschte Webtext zurückgegeben. Wenn er zuvor nicht initialisiert
	wurde, wird das stillschweigend nachgeholt.
	Bei wenigen Webtexten empfiehlt sich Webtext.get zu verwenden, bei vielen empfiehlt sich eine einmalige
	Initialisierung per Webtext.init.
	
	Aufruf:
	Webtext.init(String prefix)
	Webtext.get(String web_textcode)
*/

var Webtext = {
	webtext: new Object(),
	init: function(code)
	{
		if (!code) code = "";
		var transport = Ajax.startRequest("get", "/indexXMLhttp.cfm?xmlhttpaction=getwebtext&code=" + code + "&mandant=" + three_way.mandant + three_way.urlparam, function(){}, false);
		this.updateObject(transport.responseText);
	},
	get: function(web_textcode)
	{
		if (!this.webtext[web_textcode]) this.init(web_textcode);
		return this.webtext[web_textcode] || false;
	},
	updateObject: function(result)
	{
		//erstelle Objekt basierend auf JSON
		var obj = eval("(" + result + ")");
		for (var code in obj) this.webtext[code] = obj[code];
	}
};

/*
	stripeTables

	Zweck der Funktionen:
	Ermittelt beim kompletten Laden des Dokuments alle Tabellen mit dem Klassennamen "stripes" und fügt allen enthaltenen
	Reihen (tr) abwechslungsweise die Klassennamen "odd" und "even" an. Per CSS lässt sich so der Zebrastreifeneffekt
	erzeugen.
	
	Aufruf:
	wird automatisch initialisiert
*/

function stripeTables()
{
	// ermittle alle Tabellen, die den Klassennamen "stripes" aufweisen
	var tables = getElementsByClassName("stripes");
	var current_classname = "";
	
	for (var a = 0; a < tables.length; a++)
	{
		if (tables[a].nodeName == "TABLE")
		{
			// ermittle alle Reihen dieser Tabelle
			var rows = tables[a].getElementsByTagName("tr");
			for (var b = 0; b < rows.length; b++)
			{
				// füge den entsprechenden Klassennamen an
				current_classname = (b % 2 == 0) ? "odd" : "even";
				rows[b].className = rows[b].className + " " + current_classname;
			}
		}
	}
}

onDomLoaded(stripeTables);



/*
	serializeForm

	Zweck der Funktionen:
	---
	
	Aufruf:
	serializeForm(Referenz zu HTML-Formular)
*/

function serializeForm(form)
{
	if (!form.elements) return ""; // es handelt sich offenbar nicht um ein Formular
	
	// Funktion erweitert aktuelle URL-Liste um ein key/value-Paar
	function addValueToString(name, value) {
		arr_key_value.push(encodeURIComponent(name) + "=" + encodeURIComponent(value));
	}
	
	var elements = form.elements;
	var arr_key_value = [];
	var str_url = "";
	var name, value, a;
	
	// loope über alle enthaltenen Formularelemente
	for (var i = 0; i < elements.length; i++)
	{
		value = null;
		if (!elements[i].name) continue; // ohne name-Attribute sind die value-Attribute wertlos
		name = elements[i].name;
		
		switch (elements[i].type)
		{
			case "radio":
			case "checkbox":
				if (elements[i].checked) value = elements[i].value;
				break;
				
			case "select-multiple":
				for (a = 0; a < elements[i].options.length; a++)
					if (elements[i].options[a].selected)
						// kann kein value-Wert gefunden werden, wir der text-Wert verwendet (Firefox-default)
						addValueToString(name, elements[i].options[a].value || elements[i].options[a].text);
				break;
			
			default:
				// text, textarea, select, hidden
				value = elements[i].value;
		}
		
		if (value !== null) addValueToString(name, value);
	}
	
	// setze key/value-Paare zusammen
	str_url = arr_key_value.join("&");
	return str_url;
}


/*
	inputValidator

	Zweck der Klasse:
	Echtzeit-Überprüfungen auf Textfelder (input und textarea) registrieren.
	
	Aufruf:
		var validatorInstance = new inputValidator(Referenz auf input-Element);
	
	Methoden:
		setCallback(Funktionsreferenz);
			Die übergebene Funktion wird ausgeführt, wenn sich der Wert im Textfeld ändert.
			Kann beliebig oft aufgerufen werden.
		start();
			Mit dieser Funktion wird die Überprüfung gestartet.
*/

function inputValidator(inputElement)
{
	var currentInputValue;
	var callback = [];
	
	this.setCallback = function(callbackFunc) {
		callback.push(callbackFunc); // füge Funktion ans Ende des callback-Arrays
	};
	
	this.start = function() {
		watchInputValue(); // starte die frequente Überprüfung
	};

	var watchInputValue = function()
	{
		// führe Überprüfung nur durch, wenn sich der Wert überhaupt verändert hat
		if (inputElement.value !== currentInputValue) check();
		currentInputValue = inputElement.value;
		setTimeout(arguments.callee, 100);
	};
	
	var check = function()
	{
		// Loope über das Array callback und führe jede Funktion aus
		for (var i = 0; i < callback.length; i++)
			callback[i](inputElement.value);
	};
}