PageSourceSearch

https://www.holzbiegen.ch/lib/js/global.js

js holzbiegen.ch collected 2026-10-04 01:21:40 UTC 29,254 bytes, 969 lines download raw bytes

1/*
2	Dateiname:			global.js
3	Zweck:				Globale JavaScripts
4	Ersteller:			Hakan Erci
5	Datum:				10.08.07
6	Version:			4.1.1
7							 
8	Aenderungen :
9	Datum		Version	Wer		Beschreibung
10	18.11.2008	4.1.1a	uo		Folgende Funktionen vom contactform.js �bertragen, da diese in div. Modulen verwendet werden:
11								checkemailadr, threeway_checkeurodate, threeway_checkday, threeway_checkinteger, threeway_numberrange, threeway_checknumber, threeway_checkrange, threeway_checktime
12
13	------------------------------------------------------------
14	
15	Kundenspezifische Anpassungen:
16	Datum		Wer		Beschreibung
17	
18*/
19
20<!--
21/* E-Mail Adressen verschluesseln */
22	function CryptMailto()
23	{
24		var n = 0;
25		var r = "";
26		var s = "mailto:"+document.forms[0].emailField.value+"?subject="+document.forms[0].emailsubject.value;
27		var e = document.forms[0].emailField.value;
28	
29		e = e.replace( /@/, " [at] ");
30		/* e = e.replace( /\./g, " [dot] "); */
31	
32		for( var i=0; i < s.length; i++)
33		{
34			n = s.charCodeAt(i);
35			if( n >= 8364 )
36			{
37				n = 128;
38			}
39			r += String.fromCharCode(n+1);
40		}
41		document.forms[0].cyptedEmailField.value = r;
42		document.forms[0].HTMLCyptedEmailField.value = "<a href=\"javascript:linkTo_UnCryptMailto('"+ r +"');\">"+ e +"</a>";
43	}
44
45/* E-Mail Adressen entschluesseln */
46	function UnCryptMailto(s)
47	{
48		var n = 0;
49		var r = "";
50		for( var i = 0; i < s.length; i++)
51		{
52			n = s.charCodeAt(i);
53			if( n >= 8364 )
54			{
55				n = 128;
56			}
57			r += String.fromCharCode(n - 1);
58		}
59		return r;
60	}
61
62/* Aufruf von Link auf E-Mailadresse */
63	function linkTo_UnCryptMailto(s)
64	{
65		location.href=UnCryptMailto(s);
66	}
67
68/* Tip Layer steuern */
69	function ShowTip(fArg)
70	{
71		var tooltipOBJ = (document.getElementById) ? document.getElementById(fArg) : eval("document.all['" + fArg + "']");
72		if (tooltipOBJ != null) {
73			var tooltipLft = (document.body.offsetWidth?document.body.offsetWidth:document.body.style.pixelWidth) - (tooltipOBJ.offsetWidth?tooltipOBJ.offsetWidth:(tooltipOBJ.style.pixelWidth?tooltipOBJ.style.pixelWidth:380)) - 30;
74			var tooltipTop = 10;
75			if (navigator.appName == 'Netscape') {
76				tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10);
77	 			tooltipOBJ.style.top = tooltipTop+"px";
78				tooltipOBJ.style.left = tooltipLft+"px";
79			}
80			else {
81				tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10);
82				tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10);
83				if ((event.clientX > tooltipLft) && (event.clientY < (tooltipOBJ.scrollHeight?tooltipOBJ.scrollHeight:tooltipOBJ.style.pixelHeight) + 10)) {
84					tooltipTop = (document.body.scrollTop?document.body.scrollTop:document.body.offsetTop) + event.clientY + 20;
85				}
86				tooltipOBJ.style.left = tooltipLft;
87				tooltipOBJ.style.top = tooltipTop;
88			}
89			tooltipOBJ.style.visibility = "visible";
90		}
91	}
92	
93	function HideTip(fArg)
94	{
95		//var tooltipOBJ = (document.getElementById) ? document.getElementById('tt' + fArg) : eval("document.all['tt" + fArg + "']");
96		var tooltipOBJ = (document.getElementById) ? document.getElementById(fArg) : eval("document.all['fArg']");
97		if (tooltipOBJ != null) {
98			tooltipOBJ.style.visibility = "hidden";
99		}
100	}
101/* End Tip Layer steuern */
102
103/* E-Mail pruefen */
104	function checkemailadr(emailadr){
105		
106		// Bsp. [email protected]
107		// var validFormat = /^[a-z0-9](\.?[-_\w])*@[a-z0-9](\.?[-\w])*\.([a-z]{3}(\.[a-z]{2})?|[a-z]{2}(\.?[a-z]{2})?)$/i;
108		var validFormat = /^([0-9a-zA-Z]([-_\\.]*[0-9a-zA-Z]+)*)@([0-9a-zA-Z]([-_\\.]*[0-9a-zA-Z]+)*)[\\.]([a-zA-Z]{2,10})$/gmi;
109		// var hotName = /@hotmail\./i;
110		// var hotTopDomain = /\.com$/i;
111		var emailValid = validFormat.test(emailadr);
112		// var hotNameValid = hotName.test(emailadr);
113		// var hotTopDomainValid = hotTopDomain.test(emailadr);
114		var formatOK = true;
115		
116		if(!emailValid){
117			//alert('Bad email format !');
118			formatOK = false;
119			//return false;
120		}
121		/*
122		if(hotNameValid && formatOK){
123			if(!hotTopDomainValid){
124				// alert('Hotmail allways ends with .com');
125				formatOK = false;
126				//return false;
127			}
128		}
129		*/
130		return formatOK;
131	}
132/* End E-Mail pruefen */
133
134/* Datum und Zeit pruefen */
135	function threeway_checkeurodate(object_value){
136		
137	    <!--- Returns true if value is a eurodate format or is NULL --->
138	    <!--- otherwise returns false	 --->
139	
140	    if (object_value.length == 0) return true;
141	
142	    <!--- Returns true if value is a date in the dd/mm/yyyy format --->
143		isplit = object_value.indexOf('/');
144	
145		if (isplit == -1) isplit = object_value.indexOf('.');
146	
147		if (isplit == -1 || isplit == object_value.length) return false;
148	
149	    sDay = object_value.substring(0, isplit);
150	
151		monthSplit = isplit + 1;
152	
153		isplit = object_value.indexOf('/', monthSplit);
154	
155		if (isplit == -1) isplit = object_value.indexOf('.', monthSplit);
156	
157		if (isplit == -1 ||  (isplit + 1 ) == object_value.length) return false;
158	
159	    sMonth = object_value.substring((sDay.length + 1), isplit);
160	
161		sYear = object_value.substring(isplit + 1);
162	
163		<!--- check month --->
164		
165		if (
166					!threeway_checkinteger(sMonth)
167				|| 	!threeway_checkrange(sMonth, 1, 12) 		// check month
168				|| 	!threeway_checkinteger(sYear) 				// check year --->
169				|| 	!threeway_checkrange(sYear, 0, null) 		// check year --->
170				|| 	!threeway_checkinteger(sDay) 				// check day --->
171				|| 	!threeway_checkday(sYear, sMonth, sDay)		// check day --->
172			)	return false;
173		else	return true;
174	}
175
176	function threeway_checkday(checkYear, checkMonth, checkDay){
177		
178		maxDay = 31;
179		if (checkMonth == 4 || checkMonth == 6 || checkMonth == 9 || checkMonth == 11){
180			maxDay = 30;
181		}else if (checkMonth == 2){
182			if (checkYear % 4 > 0)									maxDay = 28;
183			else if (checkYear % 100 == 0 && checkYear % 400 > 0)	maxDay = 28;
184			else													maxDay = 29;
185		}
186		return threeway_checkrange(checkDay, 1, maxDay); <!--- check day --->
187	}
188
189	function threeway_checkinteger(object_value){
190		
191	    <!--- Returns true if value is a number or is NULL --->
192	    <!--- otherwise returns false	 --->
193	
194	    if (object_value.length == 0) return true;
195	
196	    <!--- Returns true if value is an integer defined as --->
197	    <!--- having an optional leading + or -. --->
198	    <!--- otherwise containing only the characters 0-9. --->
199		var decimal_format = ".";
200		var check_char;
201	
202	    <!--- The first character can be + -  blank or a digit. --->
203		check_char = object_value.indexOf(decimal_format)
204	    <!--- Was it a decimal? --->
205	    if (check_char < 1)	return threeway_checknumber(object_value);
206	    else				return false;
207	}
208
209	function threeway_numberrange(object_value, min_value, max_value){
210		
211	    <!--- check minimum --->
212	    if (min_value != null && object_value < min_value) return false;
213	
214	    <!--- check maximum --->
215	    if (max_value != null && object_value > max_value) return false;
216		
217	    <!--- All tests passed, so... --->
218	    return true;
219	}
220
221	function threeway_checknumber(object_value){
222		
223	    <!--- Returns true if value is a number or is NULL --->
224	    <!--- otherwise returns false	 --->
225	
226	    if (object_value.length == 0)
227	        return true;
228	
229	    <!--- Returns true if value is a number defined as --->
230	    <!--- having an optional leading + or -. --->
231	    <!--- having at most 1 decimal point. --->
232	    <!--- otherwise containing only the characters 0-9. --->
233		var start_format = " .+-0123456789";
234		var number_format = " .0123456789";
235		var check_char;
236		var decimal = false;
237		var trailing_blank = false;
238		var digits = false;
239	
240	    <!--- The first character can be + - .  blank or a digit. --->
241		check_char = start_format.indexOf(object_value.charAt(0))
242	    <!--- Was it a decimal? --->
243		if (check_char == 1)		decimal = true;
244		else if (check_char < 1)	return false;
245	        
246		<!--- Remaining characters can be only . or a digit, but only one decimal. --->
247		for (var i = 1; i < object_value.length; i++){
248			
249			check_char = number_format.indexOf(object_value.charAt(i))
250			if (check_char < 0){
251				return false;
252			}else if (check_char == 1){
253				<!--- Second decimal. --->
254				if (decimal)	return false;
255				else			decimal = true;
256			
257			}else if (check_char == 0){
258				if (decimal || digits)	trailing_blank = true;
259			<!--- ignore leading blanks --->
260	
261			}else if (trailing_blank){
262				return false;
263			}else{
264				digits = true;
265			}
266		}	
267		<!--- All tests passed, so... --->
268		return true
269	}
270
271	function threeway_checkrange(object_value, min_value, max_value)
272	{
273	    <!--- if value is in range then return true else return false --->
274	
275	    if (object_value.length == 0) return true;
276	
277	    if (!threeway_checknumber(object_value))	return false;
278		else										return (threeway_numberrange((eval(object_value)), min_value, max_value));
279		
280	    <!--- All tests passed, so... --->
281	    return true;
282	}
283
284	function threeway_checktime(object_value)
285	{
286	    //Returns true if value is in time format or is NULL
287	    //otherwise returns false	
288	
289	    if (object_value.length == 0) return true;
290	
291	    //Returns true if value is a date in the mm/dd/yyyy format
292		isplit = object_value.indexOf(':');
293	
294		if (isplit == -1 || isplit == object_value.length) return false;
295	
296	    sHour = object_value.substring(0, isplit);
297		iminute = object_value.indexOf(':', isplit + 1);
298	
299		if (iminute == -1 || iminute == object_value.length)	sMin = object_value.substring((sHour.length + 1));
300		else													sMin = object_value.substring((sHour.length + 1), iminute);
301		
302		
303		//check hour
304	    if (!threeway_checkinteger(sHour) || !threeway_checkrange(sHour, 0, 23))  return false;
305		
306		//check minutes
307		if (!threeway_checkinteger(sMin) || !threeway_checkrange(sMin, 0, 59)) return false;
308	
309		// did they specify seconds
310	    if (iminute != -1){
311			sSec = object_value.substring(iminute + 1);
312			// check seconds
313			if (!threeway_checkinteger(sSec) || !threeway_checkrange(sSec, 0, 59)) return false;
314		}
315		return true;
316	}
317/* End Datum und Zeit pruefen */
318
319
320/*
321	Ajax
322	
323	Aufruf
324		Ajax.startRequest(methode, url, callback [, async])
325	
326		wobei:
327		methode:	"get" oder "post"
328		url:		Pfad zum gew�nschten File
329		callback:	Funktion, die nach erfolgreichem Abschluss des Requests ausgef�hrt wird
330		async:		true oder false, wobei true = asynchron und false = synchron
331*/
332
333	var Ajax = {
334		getTransport: function()
335		{
336			req = false;
337			//Gecko
338			if (window.XMLHttpRequest) {
339				try {req = new XMLHttpRequest();}
340				catch(e) {req = false;}
341			}
342			//IE
343			else if (window.ActiveXObject) {
344			try {req = new ActiveXObject("Msxml2.XMLHTTP");}
345				catch(e) {
346					try {req = new ActiveXObject("Microsoft.XMLHTTP");}
347					catch(e) {req = false;}
348				}
349			}
350			return req;
351		},
352		
353		startRequest: function(method, url, callback, async)
354		{
355			var url = url.replace(/&amp;/g, "&");
356			if (async == undefined) async = true;
357			var transport = this.getTransport();
358			if (!transport) {alert("No Ajax possible in your Browser!")}
359			else
360			{
361				transport.onreadystatechange = function()
362				{
363					if (transport.readyState == 4)
364					{
365						if (transport.status == 200 || transport.status == 204)
366						{
367							callback(transport);
368						}
369					}
370				};
371				transport.open(method, url, async);
372				transport.send(null);
373			}
374			return transport;
375		}
376	};
377
378
379/*
380	addEvent
381
382	Zweck der Funktion:
383	Registriert einen Event-Listener (browser�bergreifend)
384	
385	Aufruf:
386		addEvent(DOM-Element, Typ des Events, Handler-Funktion, useCaption)
387	
388	Beispiel:
389		addEvent(document.body, "click", function(){alert("Auf Body geklickt!")}, false)
390*/
391
392	function addEvent(obj, eventType, handleFunction, useCaption)
393	{
394		var useCaption = (useCaption || false);
395		if (obj.addEventListener) /* FF, Safari, etc. */
396		{
397			obj.addEventListener(eventType, handleFunction, useCaption);
398			return true;
399		}
400		else if (obj.attachEvent) /* IE */
401		{
402			return obj.attachEvent("on"+eventType, handleFunction);
403		}
404		else return false;
405	}
406
407/*
408	getElementsByClassName
409
410	Zweck der Funktion:
411	Gibt eine HTMLNodeList aller Elemente zur�ck, die den �bergebenen Klassennamen enthalten.
412	
413	Aufruf:
414		getElementsByClassName(classname, context)
415*/
416
417	function getElementsByClassName(classname, context)
418	{
419		var context = context || document.getElementsByTagName("body")[0];
420		var a = [];
421		var re = new RegExp('\\b' + classname + '\\b');
422		var els = context.getElementsByTagName("*");
423		for (var i=0; i < els.length; i++)
424		{
425			if(re.test(els[i].className))
426			{
427				a.push(els[i]);
428			}
429		}
430		return a;
431	}
432
433
434/*
435	getMousePos
436
437	Zweck der Funktion:
438	Gibt die aktuelle Mauszeigerposition relativ zum Dokument zur�ck. R�ckgabewert ist ein Objekt mit zwei Eigenschaften,
439	"x" und "y", die jeweils die Position des Mauszeigers in Pixel angeben.
440	
441	Aufruf:
442		getMousePos(Event)
443*/
444
445	function getMousePos(e)
446	{
447		if (!e) e = window.event;
448		var body = (window.document.compatMode && window.document.compatMode == "CSS1Compat") ? window.document.documentElement : window.document.body;
449		return {
450			x: e.pageX ? e.pageX : e.clientX + body.scrollLeft - body.clientLeft,
451			y: e.pageY ? e.pageY : e.clientY + body.scrollTop - body.clientTop
452		};
453	}
454
455
456/*
457	addLoadEvent
458
459	Zweck der Funktion:
460	Dieser Funktion kann eine Funktion �bergeben werden, die ausgef�hrt wird, sobald die komplette Seite geladen wurde.
461	Wird diese Funktion mehrmals aufgerufen, werden die �bergebenen Funktionen in der Reihenfolge ausgef�hrt, wie sie �bergeben wurden.
462	
463	Aufruf:
464		addLoadEvent(Funktion)
465*/
466
467	function addLoadEvent(func)
468	{
469		var oldonload = window.onload;
470		if (typeof window.onload != 'function') window.onload = func;
471		else {
472			window.onload = function() {
473				if (oldonload) oldonload();
474				func();
475			}
476		}
477	}
478
479
480/*
481	onDomLoaded
482
483	Zweck der Funktion:
484	Sie heisst "onDomLoaded" und erwartet ein Argument, n�mlich eine Funktion,
485	die ausgef�hrt werden soll, sobald das DOM der Seite geladen und referenzierbar ist.
486	Die window.onload-Funktion oder <body onload=... wird erst ausgef�hrt,
487	wenn s�mtliche Bilder, iFrames, Flash-Movies, ... der Seite komplett geladen sind,
488	was unter Umst�nden einige Zeit in Anspruch nehmen kann. "onDomLoaded" hingegen f�hrt die Funktion aus,
489	wenn die Dokumentstruktur geladen wurde, aber BEVOR irgendein eingebettetes Objekt
490	mit dem Ladevorgang beginnt.
491	Es ist ausserdem m�glich, die Funktion mehrmals aufzurufen und jeweils eine andere Funktion
492	als Argument zu �bergeben. Sobald das DOM geladen ist, werden die registrierten Funktion
493	in der Reihenfolge ausgef�hrt, wie sie �bergeben worden sind
494	
495	Aufruf:
496		onDomLoaded(Funktionsreferenz)
497*/
498
499	function onDomLoaded(func)
500	{
501		DOM_loaded_checkDomLoaded(); // starte die �berpr�fung
502		if (DOM_loaded_domLoaded)
503			func(); // wenn das DOM bereits geladen, f�hre Funktion sofort aus
504		else
505		{
506			if (!DOM_loaded_readyList) DOM_loaded_readyList = [];
507			DOM_loaded_readyList.push(func); // andererseits f�ge Funktion der Warteliste hinzu
508		}
509		
510		function DOM_loaded_ready()
511		{
512			if (!DOM_loaded_domLoaded) // wenn DOM bereits geladen, keine weiteren Massnahmen
513			{
514				DOM_loaded_domLoaded = true;	
515				// f�hre alle Funktionen in der Warteliste aus
516				for (var i = 0; i < DOM_loaded_readyList.length; i++)
517				{
518					DOM_loaded_readyList[i]();
519				}
520				DOM_loaded_readyList = null;
521			}	
522		}
523		
524		function DOM_loaded_checkDomLoaded()
525		{
526			if (typeof DOM_loaded_readyBound != "undefined" && DOM_loaded_readyBound == true) return;
527			DOM_loaded_readyBound = true;
528			DOM_loaded_domLoaded = false;
529			DOM_loaded_readyList = false;
530			
531			// Mozilla, Opera und Webkit (Safari, Chrome)
532			if (document.addEventListener)
533			{
534				document.addEventListener("DOMContentLoaded", function()
535				{
536					document.removeEventListener("DOMContentLoaded", arguments.callee, false);
537					DOM_loaded_ready();
538				}, false);
539			}
540			
541			// Internet Explorer
542			else if (document.attachEvent)
543			{
544				// wird ausgef�hrt kurz bevor window.onload, gilt auch f�r iFrames
545				document.attachEvent("onreadystatechange", function()
546				{
547					if (document.readyState === "complete")
548					{
549						document.detachEvent("onreadystatechange", arguments.callee);
550						DOM_loaded_ready();
551					}
552				});
553		
554				// wenn Internet Explorer, aber kein iFrame
555				if (document.documentElement.doScroll && window == window.top)
556				{
557					// gem�ss http://javascript.nwbox.com/IEContentLoaded/
558					(function() {
559						if (DOM_loaded_domLoaded) return;
560						try {
561							document.documentElement.doScroll("left");
562						}
563						catch(error)
564						{
565							setTimeout(arguments.callee, 0);
566							return;
567						}
568						DOM_loaded_ready();
569					})();
570				}
571			}
572			
573			// Fallback
574			addEvent(window, "load", DOM_loaded_ready);
575		}
576	}
577	
578	
579	//Sch�tze Zeichen f�r Variable in RegExp
580	RegExp.escape = function(text)
581	{
582		if (!arguments.callee.sRE)
583		{
584			var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^'];
585			arguments.callee.sRE = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
586		}
587		text = text.replace("&", "&amp;");
588		return text.replace(arguments.callee.sRE, '\\$1');
589	}
590
591
592/*
593	Function.prototype.bind
594
595	Zweck der Funktion:
596	Die Funktion wird im Kontext eines beliebigen Objekts ausgef�hrt. Hilfreich besonders bei Event-Listener-Funktionen,
597	die nicht im globalen Kontext ausgef�hrt werden sollen.
598	Es ist zudem m�glich, Parameter zu �bergeben, die dann bis zum effektiven Funktionsaufruf konserviert werden.
599	
600	Aufruf:
601		[Funktionsname].bind(Objektinstanz)
602*/
603
604	Function.prototype.bind = function(object)
605	{
606		var arguments2array = function(args)
607		{
608			var arr_args = [];
609			for (var i = 0; i < args.length; i++)
610			{
611				arr_args.push(args[i]);
612			}
613			return arr_args;
614		}
615		
616		if (typeof object != "object") return this;
617		
618		var arr_args = arguments2array(arguments);
619		var object = arr_args.shift();
620		
621		var __method = this;
622		return function()
623		{
624			var arr_args_new = arguments2array(arguments);
625			return __method.apply(object, arr_args_new.concat(arr_args));
626		}
627	}
628
629/*
630	Webtext
631
632	Zweck der Funktionen:
633	Mit Webtext.init(prefix) werden s�mtliche Webtexte initialisiert, die mit "prefix" beginnen.
634	Mit Webtext.get(web_textcode) wird der gew�nschte Webtext zur�ckgegeben. Wenn er zuvor nicht initialisiert
635	wurde, wird das stillschweigend nachgeholt.
636	Bei wenigen Webtexten empfiehlt sich Webtext.get zu verwenden, bei vielen empfiehlt sich eine einmalige
637	Initialisierung per Webtext.init.
638	
639	Aufruf:
640		Webtext.init(String prefix)
641		Webtext.get(String web_textcode)
642*/
643	
644	var Webtext = {
645		webtext: new Object(),
646		init: function(code)
647		{
648			if (!code) code = "";
649			//var transport = Ajax.startRequest("get", "/indexXMLhttp.cfm?xmlhttpaction=getwebtext&code=" + code + "&spr=" + three_way.spr + "&mandant=" + three_way.mandant + three_way.urlparam, function(){}, false);
650			var transport = Ajax.startRequest("get", "/indexXMLhttp.cfm?xmlhttpaction=getwebtext&code=" + code + "&mandant=" + three_way.mandant + three_way.urlparam, function(){}, false);
651			// 30.04.2010 haer + "&spr=" + three_way.spr entfernt, da die Sprache in urlparam vorhanden ist
652			this.updateObject(transport.responseText);
653		},
654		get: function(web_textcode)
655		{
656			if (!this.webtext[web_textcode]) this.init(web_textcode);
657			return this.webtext[web_textcode] || false;
658		},
659		updateObject: function(result)
660		{
661			//erstelle Objekt basierend auf JSON
662			var obj = eval("(" + result + ")");
663			for (var code in obj) this.webtext[code] = obj[code];
664		}
665	};
666
667/*
668	stripeTables
669
670	Zweck der Funktionen:
671	Ermittelt beim kompletten Laden des Dokuments alle Tabellen mit dem Klassennamen "stripes" und f�gt allen enthaltenen
672	Reihen (tr) abwechslungsweise die Klassennamen "odd" und "even" an. Per CSS l�sst sich so der Zebrastreifeneffekt
673	erzeugen.
674	
675	Aufruf:
676		wird automatisch initialisiert
677*/
678	
679	function stripeTables()
680	{
681		// ermittle alle Tabellen, die den Klassennamen "stripes" aufweisen
682		var tables = getElementsByClassName("stripes");
683		var current_classname = "";
684		
685		for (var a = 0; a < tables.length; a++)
686		{
687			if (tables[a].nodeName == "TABLE")
688			{
689				// ermittle alle Reihen dieser Tabelle
690				var rows = tables[a].getElementsByTagName("tr");
691				for (var b = 0; b < rows.length; b++)
692				{
693					// f�ge den entsprechenden Klassennamen an
694					current_classname = (b % 2 == 0) ? "odd" : "even";
695					rows[b].className = rows[b].className + " " + current_classname;
696				}
697			}
698		}
699	}
700	
701	onDomLoaded(stripeTables);
702
703	
704	/*
705		serializeForm
706	
707		Zweck der Funktionen:
708		Die aktuelle Einstellung des gesamten Formulars wird als Query-String zur�ckgegeben.
709		Das selbe passiert automatisch, wenn der Browser ein Formular abschickt.
710		
711		Aufruf:
712			serializeForm(Referenz zu HTML-Formular)
713	*/
714	
715	function serializeForm(form)
716	{
717		if (!form.elements) return ""; // es handelt sich offenbar nicht um ein Formular
718		
719		// Funktion erweitert aktuelle URL-Liste um ein key/value-Paar
720		function addValueToString(name, value) {
721			arr_key_value.push(encodeURIComponent(name) + "=" + encodeURIComponent(value));
722		}
723		
724		var elements = form.elements;
725		var arr_key_value = [];
726		var str_url = "";
727		var name, value, a;
728		
729		// loope �ber alle enthaltenen Formularelemente
730		for (var i = 0; i < elements.length; i++)
731		{
732			value = null;
733			if (!elements[i].name) continue; // ohne name-Attribute sind die value-Attribute wertlos
734			name = elements[i].name;
735			
736			switch (elements[i].type)
737			{
738				case "radio":
739				case "checkbox":
740					if (elements[i].checked) value = elements[i].value;
741					break;
742					
743				case "select-multiple":
744					for (a = 0; a < elements[i].options.length; a++)
745						if (elements[i].options[a].selected)
746							// kann kein value-Wert gefunden werden, wir der text-Wert verwendet (Firefox-default)
747							addValueToString(name, elements[i].options[a].value || elements[i].options[a].text);
748					break;
749				
750				default:
751					// text, textarea, select, hidden
752					value = elements[i].value;
753			}
754			
755			if (value !== null) addValueToString(name, value);
756		}
757		
758		// setze key/value-Paare zusammen
759		str_url = arr_key_value.join("&");
760		return str_url;
761	}
762
763/*
764	inputValidator
765
766	Zweck der Klasse:
767	Echtzeit-�berpr�fungen auf Textfelder (input und textarea) registrieren.
768	
769	Aufruf:
770		var validatorInstance = new inputValidator(Referenz auf input-Element);
771	
772	Methoden:
773		setCallback(Funktionsreferenz);
774			Die �bergebene Funktion wird ausgef�hrt, wenn sich der Wert im Textfeld �ndert.
775			Kann beliebig oft aufgerufen werden.
776		start();
777			Mit dieser Funktion wird die �berpr�fung gestartet.
778*/
779	
780	function inputValidator(inputElement)
781	{
782		var currentInputValue;
783		var callback = [];
784		
785		this.setCallback = function(callbackFunc) {
786			callback.push(callbackFunc); // f�ge Funktion ans Ende des callback-Arrays
787		};
788		
789		this.start = function() {
790			watchInputValue(); // starte die frequente �berpr�fung
791		};
792	
793		var watchInputValue = function()
794		{
795			// f�hre �berpr�fung nur durch, wenn sich der Wert �berhaupt ver�ndert hat
796			if (inputElement.value !== currentInputValue) check();
797			currentInputValue = inputElement.value;
798			setTimeout(arguments.callee, 100);
799		};
800		
801		var check = function()
802		{
803			// Loope �ber das Array callback und f�hre jede Funktion aus
804			for (var i = 0; i < callback.length; i++)
805				callback[i](inputElement.value);
806		};
807	}
808	
809	/* Ort(e) zu PLZ selektieren un in Ort-Feld anzeigen */
810	function getcity(zip,country,cityform,cityfield) {
811		var $myform = $("#"+cityform);
812		if (zip.length) {
813			$.ajax({
814				url: "/indexXMLhttp.cfm?xmlhttpaction=get_city&zip=" + zip + "&country=" + country + "&listtype=first",
815				async: false,
816				success: function(data){
817					$myform.find("#"+cityfield).val(data);
818				}
819			});
820		}
821		else{
822			$myform.find("##"+cityfield).val("");
823		}
824	};
825	
826	/* Funktionalität für innodoc - Bildwechsel wenn man mit der Maus über kleines Bild fährt 
827 * innodoc:doc1=xxx;doc2=xxx;effect=3;group=test;coment=test --> doc1 kleines Bild, doc2 grosses Bild
828 * Damit dies funktioniert wird noch ein Grosses Bild zur Anzeige benötigt
829 * innodoc:doc1=xxx;group=test;comment=test
830 * Zugehörigkeit von Bildwechsel zu grossem Bild wird über die Group gesteuert
831 */
832	$(function(){
833		$(".imgvariant").mouseover(
834			function(){
835				$('#'+$(this).attr('rel')).attr('src', $(this).attr('href'));
836				$('#comment'+$(this).attr('rel')).html($(this).find("img").attr('title'));			
837			}
838		);
839		
840		$(".imgvariant").click(
841			function(event){
842				event.preventDefault();
843			}
844		);
845	});
846/* End Funktionalität für innodoc - Bildwechsel wenn man mit der Maus über kleines Bild fährt */
847// -->
848
849
850/*
851	CSS-Klasse "deletable" aktivieren.
852	
853	Nur für <input type="text"> möglich.
854	Zeigt am Ende des Textfeldes ein kleines Kreuz an (oder beliebiges anderes Bild, siehe CSS),
855	welches bei Klick den Inhalt des Textfeldes löscht und den Fokus auf dieses setzt.
856	Das ist ähnlich wie beim OSX für Mac sowie beim iPhone. Sieht man neuerdings immer öfters im Internet.
857	Vor allem für Suchfelder ist es geeignet.
858*/
859var initDeletable = function() {
860	
861	// Funktion, die im Interval aufgerufen wird.
862	var test_text = function($input) {
863		$delete = $input.siblings(".input_delete_button");
864		if ($input.val() != "" && !$input.hasClass("default_text_active")) {
865			$delete.show();
866		} else {
867			$delete.hide();
868		}
869	};
870	
871	$(":text.deletable").each(function(){
872		var $input = $(this);
873		
874		// Erzeuge Hilfsgerüst für die Positionierung.
875		var $wrapper = $("<span/>").css({
876			position: "relative"
877		});
878		$input.wrap($wrapper);
879		
880		// Erzeuge Löschen-Button.
881		var $delete_button = $("<a/>").addClass("input_delete_button").attr({
882			title: ""
883		}).click(function(e){
884			e.preventDefault();
885			$input.val("").focus();
886			$delete_button.hide();
887		}).appendTo($input.parent());
888		
889		// Passe das Layout der Input-Boxen an.
890		var padding = $delete_button.width()*2;
891		$input.css("padding-right", function(i, value){return (parseInt(value) + padding) + "px"});
892		$input.width(function(i, value){return (value - padding)});
893		
894		test_text($input); // Initialisierung
895		
896		// Starte/beende Überprüfung der Eingabe.
897		var interval_handler;
898		
899		$input.focus(function(){
900			interval_handler = window.setInterval(function(){test_text($input)}, 50);
901		}).blur(function(){
902			window.clearInterval(interval_handler);
903			test_text($input); // Sicherheitsüberprüfung
904		});
905	});
906};
907
908
909/*
910	CSS-Klasse "default_text" aktivieren
911	
912	Für <input type="text"> und <textarea> möglich.
913	Erlaubt die Anzeige eines hellgrauen Default-Textes im Textfeld.
914	Sobald der User den Fokus auf das Feld setzt, verschwindet der Text und man kann eine Eingabe machen.
915	Besonders nützlich: Wird ein Formular, welches Textfelder mit Default-Texten enthält
916	abgeschickt, werden sowohl bei einer vorgängigen Überprüfung der Feld-Werte mit JavaScript
917	als auch beim Senden der Werte an den Server allfällig bestehende Default-Texte mit einem leeren String ersetzt,
918	so, als ob es sie gar nicht geben würde (das, was man sonst auch erwarten würde).
919*/
920var initDefaultText = function() {
921	
922	var getDefaultText = function($input) {
923		// Wenn kein title-Attribut vorhanden, verwende leeren String als Default-Text.
924		return $input.attr("title") || "";
925	};
926	
927	// Bei "focus"
928	var deactivate = function() {
929		$input = $(this);
930		if ($input.hasClass("default_text_active")) {
931			$input.val("");
932			$input.removeClass("default_text_active");
933		}
934	};
935	
936	// Bei "blur"
937	var activate = function() {
938		$input = $(this);
939		if ($input.val() == "") {
940			$input.val(getDefaultText($input));
941			$input.addClass("default_text_active");
942		}
943	}
944	
945	// Mache die beiden Funktionen für die Aussenwelt sichtbar.
946	arguments.callee.deactivate = deactivate;
947	arguments.callee.activate = activate;
948	
949	$(".default_text").each(function(){
950		$(this).focus(deactivate).blur(activate);
951		activate.call(this); // Initialisierung simulieren
952	});
953	
954	$(window).unload(function(){
955		// Firefox-Verhalten (schreibt bestehende Werte nach Reload wieder in Felder) umgehen.
956		$(".default_text.default_text_active").val("");
957	});
958};
959
960var cleanDefaults = function(form) {
961	$(".default_text", form).each(initDefaultText.deactivate);
962};
963
964var restoreDefaults = function(form) {
965	$(".default_text", form).each(initDefaultText.activate);
966};
967
968$(initDefaultText);
969$(initDeletable);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.