/*
	javascript library für dass online db 4.3 Framework
	Version 06.01.2008
*/
var debugmode=0;

/*
	Hinzufügen/Entfernen von eindeutigen elementen aus einem kommaseparierten string
*/
function modify_idstring(formname, fieldname, idval, add) {
	if (!document.forms[formname]) {
		alert('Formular '+formname+' existiert nicht.');
	}else {
		var formobj=document.forms[formname];
		var formel=formobj.elements[fieldname];
		if (formel && idval) {
			var idstring=formel.value;
			var parts=idstring.split(',');
			var newparts=new Array();
			var idx=-1;
			if (add) {
				for (var i=0; i<parts.length; i++) {
					if (parts[i]!='') {
						newparts[newparts.length]=parts[i];
						if (parts[i]==idval) {
							idx=i;
						}
					}
				}
				if (idx<0) {
					newparts[newparts.length]=idval;
				}
			}else {
				for (var i=0; i<parts.length; i++) {
					if (parts[i]!='') {
						if (parts[i]!=idval) {
							newparts[newparts.length]=parts[i];
						}
					}
				}
			}
			idstring=newparts.join(',');
			formel.value=idstring;
		}
	}
}
// setzt checkboxen und gibt die anzahl der gecheckten (d.h. checked==true) zurück
// oder -1 bei fehler
function set_checkboxes(formobj, basename, checkedval) {
	var count=-1;
	if (formobj && basename) {
		// bool sicherstellen
		if (checkedval) {
			checkedval=true;
		}else {
			checkedval=false;
		}
		count=0;
		for (var i=0; i < formobj.elements.length; i++) {
			var formelement=formobj.elements[i];
			var elname=formelement.name;
			if (elname.indexOf(basename)==0) {
				if (formelement.type=='checkbox') {
					if (checkedval) count++;
					formelement.checked=checkedval;
				}
			}
		}
	}
	return count;
}

function save_scrollstate(formobj) {
	if (formobj) {
		if (formobj.scroll_x) {
			formobj.scroll_x.value=document.body.scrollLeft;
		}
		if (formobj.scroll_y) {
			formobj.scroll_y.value=document.body.scrollTop;
		}
	}
}

function submit_form(formobj) {
	if (formobj) {
		var oldmethod=formobj.method;
		var tryagain=true;
		save_scrollstate(formobj);
		try {
			formobj.submit();
			tryagain=false;
		}catch(err) {
			formobj.method='post';
		}
		if (tryagain) {
			try {
				formobj.submit();
			}catch(err) {
				alert('Problem beim Absenden eines Formulars');
			}finally {
				formobj.method=oldmethod;
			}
		}
	}
}

function return_to_referer(formname, fieldname) {
	if (formname=='') formname='standform';
	if (fieldname=='') fieldname='referer';
	var formobj=document.forms[formname];
	if (!formobj) {
		alert('Form '+formname+' existiert nicht.');
	}else {
		var target=formobj.target;
		var doc=window.document;
		if (target) {
			// das richtige frameobjekt ansteuern
			var found=false;
			if (top.frames.length>0) {
				if (top.frames[target]) {
					doc=top.frames[target].document;
					//alert('unter top');
					found=true;
				}
			}
			if (!found && parent.frames.length>0) {
				if (parent.frames[target]) {
					doc=parent.frames[target].document;
					//alert('unter parent');
					found=true;
				}
			}
			if (!found) {
				doc=top.document;
				//alert('top');
			}
		}else {
			//alert('kein target');
		}
		var ref='';
		if (window.referer) {
			ref=window.referer;
		}else {
			var formel=formobj.elements[fieldname];
			if (!formel) {
				alert('Element '+fieldname+' existiert nicht.');
			}else {
				ref=formel.value;
			}
		}
		if (ref) {
			//alert('Setze Referer '+ref);
			//doc.location.href=formel.value;
			doc.location.href=ref;
		}
	}
}

function refresh_opener(checksave){
//forces the opening widow to be refreshed
	if (window.opener){
		if (window.opener.closed == true) {
			//alert ("Öffnendes Formular ist geschlossen!");
		}else{
			if (checksave) {
				window.opener.document.checkapplyfilter();
			}else{
				if (window.opener.document.standform) {
					submit_form(window.opener.document.standform)
					//window.opener.standform.submit()
				}
				window.focus();
			}
		}
	}
}


function selectrecord(fieldvalstring){
	var formnames=new Array()
	//alle möglichen formnames hier definieren
	formnames[0]="quicksearch";
	formnames[1]="standform";
	var formobj=document.standform
	//alert(formobj.parent.window.name);
	var fldvals=new Array()
	fldvals=fieldvalstring.split(",")
	var countvals=fldvals.lenght
	if (countvals>0) {
		if (fldvals[0]==''){
			alert ('Leere ID; kann Datensatz nicht auswählen.')
			return;
		}
	}
	var defaultfiltername=""; //um den aufrufenden  verweis ändern zu können
	var callingfields=formobj.callingfields;
	var fieldstring=callingfields.value;
	var linknamesubpart="selectrecordlink"; //so müssen die linknamen anfangen, wenn ihr href angepasst werden soll
	var subpartlength=16;
	var selectlinkname="";

	if (fieldstring.length==0) {
		alert("Name des aufrufenden Feldes verloren, Dialogseite bitte nochmals öffnen!!")
		return;
	}
	if (window.opener){
		if (window.opener.closed == true) {
			alert (LCMsgLostOpener); //"Öffnendes Formular konnte nicht ermittelt werden!");
		}else{
//			if (window.opener.standform) {
			////////////////////////////////////
				var flds=new Array();
				flds=fieldstring.split(",");
				var rowcheckfield="";
				//try different formnames, see on which form the field flds[0] exists
				var identified=false;
				var calldocument=opener.document;
				for (i=0;i<formnames.length;i++) {
					if (calldocument.forms[formnames[i]]) {
					//alert(formnames[i]+", feld "+flds[0])
						if (calldocument.forms[formnames[i]].elements[flds[0]]) {
							//alert(formnames[i]+", feld "+flds[0])
							var callform=calldocument.forms[formnames[i]];
							identified=true;
							break;
						}
					}

				}
				if (!identified) {
					alert("Konnte das aufrufende Formular nicht ermitteln.\nVersuchte, das Feld "+flds[0]+" zu finden.")
					return;
				}
				var fieldname=callform.elements[flds[0]].name;
				var nameparts=fieldname.split("[");
				if (nameparts.length==2) {
					var parts2=nameparts[1].split("]");
					rownumber=parts2[0];
					rowcheckfield="rowdirty"+rownumber; //thats the row-dirty field
					//alert(rowcheckfield)
				}else{
					rowcheckfield="";
					rownumber="";
					//alert ("Kann Name des dirty-Feldes nicht ermitteln")
				}
				//to be able to modify the calling url, the name of the link ???
				//and the name of the filter field must have been submitted via callingfields
				// neu 19.11.2004
				if (flds.length>1) {
					//dann ist das letzte feld der filtername
					var filtername=flds[flds.length-1];
					if (filtername.indexOf('_')>0) {
						defaultfiltername=filtername;
						if (flds.length>2) {
							//dann ist das vorletzte feld der linkname
							var linkname=flds[flds.length-2];
							if (linkname.indexOf('link')>0) {
								selectlinkname=linkname;
							}
						}
					}
				}
				//alert("defaultfiltername="+defaultfiltername);
				//alert("linknamesubpart="+linknamesubpart);
				//if linkname has been omitted try the following default link name:
				if (selectlinkname=="") {
					if (rownumber) selectlinkname=linknamesubpart+"["+rownumber+"]";
				}

				for (i=0;i<flds.length;i++){
					var parts=flds[i].split("_");
					if (parts.length>1) defaultfiltername=flds[i];
				}

				if (flds.length>fldvals.length) {
					countvals=fldvals.length;
				}else{
					countvals=flds.length;
				}
				//Werte setzen
				for (i=0;i<countvals;i++){
					if (callform.elements[flds[i]]) {
						if (callform.elements[flds[i]].type=="select-one"){
							var combo=callform.elements[flds[i]];
							for(j=0;j<combo.length;j++) {
								if (combo.options[j].value==fldvals[i]) {
									//alert("gefunden")
									combo.value=fldvals[i];
									combo.selectedIndex=j;
									break;
								}
							}
						}else{ //non-combo
							//alert("setze" +flds[i]+" auf "+fldvals[i]);
							//alert("aktuell ist:"+callform.elements[flds[i]].value);
							callform.elements[flds[i]].value=fldvals[i];
						}
					}
				}

				//if (callform.elements["Anzeigetitel"]) callform.elements["Anzeigetitel"].value=designation
				if (rowcheckfield!="") {
					if (callform.elements[rowcheckfield]){
						callform.elements[rowcheckfield].checked=true;
						callform.elements[rowcheckfield].value=true;
					}else alert("Kann dirty Feld '"+rowcheckfield+"' nicht setzen!");
					if (callform.elements["formdirty"]){
						callform.elements["formdirty"].value='1';
					}else alert("Kann dirty Feld 'formdirty' nicht setzen!");
				}

				//change calling href according to new selection
				var linkname="";
				if (defaultfiltername!="" && selectlinkname!="") { //wenn fehler beim setzen der id
					for (i=0;i<window.opener.document.links.length;i++){
						linkname=window.opener.document.links[i].name;
						/*if (linkname.length>0) {
							alert('suche nach: '+selectlinkname+'\nVergleich mit: '+linkname);
						}*/
						if (linkname==selectlinkname) {
							var selectlink=window.opener.document.links[i];
							var selecthref=selectlink.href;
							defaultfiltername+="=";
							var parts=selecthref.split(defaultfiltername);
							//alert(linkname+' gefunden');
							if (parts.length==2) {
								var part1=parts[0]+defaultfiltername+fldvals[0];
								var parts2=parts[1].split("&");
								for(j=1;j<parts2.length;j++){
									part1+="&"+parts2[j];
								}
								selectlink.href=part1 ;
								break;
							}else{
								alert ("Kann den aufrufenden Filternamen nicht in der URL finden finden ("+defaultfiltername+")");
								break;
							}
						}
					}
				}
				window.close();
//			}else{
//				alert("Formular 'standform' nicht gefunden!")
//			}
		}
	}else alert("Auswählen geht nur wenn die Seite vom zugehörigen Formular aus aufgerufen wurde");
}

function reset_fieldselection(){
	var formobj=document.standform;
	if (formobj) {
		if (formobj.actiontype) {
			formobj.actiontype.value='resetfieldselection';
			if (formobj.elements['doedit'] && formobj.elements['doedit'].value) {
				checkapplyfilter();
			}else {
				submit_form(formobj);
			}
		}
	}
}

function popupwindow(url, poptarget, popoptions, check_save, winposkey){
	//performs widow.open, checks whether data needs saving
	// Änderung 13.03.2006 gibt fenster verweis zurück
	// Änderung 02.05.2006 winposkey für 0=dialogfenster, 1=helpfenster, ..
	var formobj=document.standform;
	var check=true;
	if (!winposkey) winposkey=0;
	if (check_save){
		if (formobj.elements["formdirty"]) {
			var formisdirty=(formobj.elements["formdirty"].value=='1');
			if (formisdirty) {
				check=checkuserinput(true);
			}
			if (!check) formobj.formdirty.value='0';
			if (check && formisdirty) {
				save(window.location);
				return;
			}
		}
	}
	if (url && poptarget){
		if (url!="" && poptarget!=""){
			var optionstring="";
			if (!popoptions) popoptions="";
			if (popoptions=="") {
				var newheight=100;
				var newwidth=100;
				var newtop=100;
				var newleft=100;
				switch(winposkey) {
					case 1:
						newheight=screen.availHeight*0.5;
						var w=odb_textwidth;
						if (w) {
							w+=50;
							newwidth=w;
						}else {
							newwidth=550;
						}
						newtop=0;
						newleft=0;
						break;
					default:
						newheight=screen.availHeight*0.8;
						newwidth=screen.availWidth*0.9;
						newtop=screen.availHeight*0.2;
						newleft=screen.availWidth*0.2;
						break;
				}
				optionstring="height="+Math.round(newheight);
				optionstring+=",width="+Math.round(newwidth);
				optionstring+=",top="+Math.round(newtop);
				optionstring+=",left="+Math.round(newleft);
				optionstring+=",dependent=yes,resizable=yes,scrollbars=yes,status= yes ";
			}else{
				optionstring=popoptions;
			}
			window.open(url, poptarget, optionstring, false);
			//newwin.focus()
		}
	}
}

function selectfields(){
	var formobj=document.standform
	var oldmethod=formobj.method;
	var oldaction=formobj.action;
	var oldtarget=formobj.target;
	window.open('about:blank',"fieldselection","scrollbars=1,WIDTH=700,HEIGHT=410,LEFT=250,TOP=200,resizable=YES",true);
	formobj.method="post";
	formobj.target="fieldselection";
	formobj.action='fieldselection.php';
	submit_form(formobj);
	formobj.method=oldmethod;
	formobj.action=oldaction;
	formobj.target=oldtarget;
}

function save(url){
	var formobj=document.standform
	var oldmethod=formobj.method
	var oldaction=formobj.action
	formobj.method="post"
	formobj.action=url
	formobj.dosave.value="1"
	submit_form(formobj);
	//formobj.submit()
	formobj.method=oldmethod
	formobj.action=oldaction
}


function checkformelement(elname,formname){
	if (!formname) formname='standform';
	var formobj=document.forms[formname];
	if (!formobj.elements[elname]) {
		if (debugmode) alert("Formularelement "+elname+" existiert nicht!")
		return false
	}else{
		return true
	}
}

var fieldaliases=new Array();

function get_fieldalias(fieldname){
	if (fieldname.length>0) {
		var parts=fieldname.split('[');
		fieldname=parts[0];
		if (parts.length>2) {
			// odb40 Benennungskonvention data[10][fieldname]
			// data [ 10] [ fieldname]
			fieldname=parts[parts.length-1];
			if (fieldname.length<2) {
				fieldname='Feld';
			}else {
				fieldname=fieldname.substring(0, fieldname.length-1);

			}
		}
	}
	var returnval=fieldname;
	if (fieldaliases[fieldname]){
		returnval=fieldaliases[fieldname];
	}
	return returnval;
}

function checkinteger(elname,formname,fieldalias){
	var check=false;
	if (!formname) formname='standform';
	var formobj=document.forms[formname];
	if (checkformelement(elname,formname)) {
		var el=formobj.elements[elname];
		var val=formobj.elements[elname].value;
		if (val=="") return true;
		if (!isNaN(val)) {
			numval=val*1;
			if (is_integer(numval)==true) {
				el.value=numval;
				check=true;
			}
		}
		if (check==false) {
			if (!fieldalias) {
				fieldalias=get_fieldalias(elname);
			}
			alert(fieldalias+' '+LCMsgInvalidInteger);//" muss ganze Zahl sein!");
			el.focus();
			el.select();
		}
	}
	return check
}

function checkfloat(elname,formname,fieldalias){
	var check=false
	if (!formname) formname='standform';
	var formobj=document.forms[formname];
	if (checkformelement(elname,formname)) {
		var el=formobj.elements[elname]
		var val=formobj.elements[elname].value
		//alert(val)
		if (val=="") return true;
		val=val.replace(",",".");
		if (!isNaN(val)) {
			check=true;
			numval=val*1 //remove leading zeros etc
			if (is_integer(numval)==true) {
				val=numval+".0"
			}else val=numval;
			el.value=val
		}
		if (check==false) {
			if (!fieldalias) {
				fieldalias=get_fieldalias(elname);
			}
			alert(fieldalias+' '+LCMsgInvalidFloat);//muss Dezimalzahl sein!");
			el.focus();
			el.select();
		}
	}
	return check
}
function is_integer(valtocheck) {
	var check=false;
	if (!isNaN(valtocheck)) {
		valtocheck=valtocheck*1;
		if (parseInt(valtocheck)==valtocheck) check=true;
	}
	return check;
}

/* neue checkfunktion */

function checkdatetime(elname,format,formname) {
	var check=true;
	var errmsg='';
	if (!format) format='dt';
	if (format!='d' && format!='t' && format!='dt') {
		alert('Aufruf von checkdatetime weder für Datum noch für Zeit');
	}else {
		if (!formname) formname='standform';
		var formobj=document.forms[formname];
		var errmsgdefault='';
		var el=formobj.elements[elname];
		var datetimestring=el.value;
		if (!datetimestring) {
			// bei leerem wert true zurückgeben
		}else {
			var datestring='';
			var timestring='';
			var buildDate=true;
			var buildTime=true;
			switch(format) {
				case 'd':
					//errmsgdefault='Bitte gültiges Datum (z.B. 23.3 oder 1.2.06 oder 1.2.2006 eigeben)';
					errmsgdefault=LCMsgInvalidDate;
					datestring=datetimestring;
					buildTime=false;
					break;
				case 't':
					//errmsgdefault='Bitte gültigen 24 Stunden-Zeitwert eingeben (z.B. 13:30 oder 9:05:45)';
					errmsgdefault=LCMsgInvalidTime;
					timestring=datetimestring;
					buildDate=false;
					break;
				default :
					//errmsgdefault='Bitte gültiges Datum oder gültiges Datum + Uhrzeit eingeben (z.B. 23.3 oder 23.3.06 oder 23.3 10:30 oder 23.3.2006 10:30)';
					errmsgdefault=LCMsgInvalidDateTime;
					if (datetimestring.length>0) {
						var pos=datetimestring.indexOf(':'); var c='';
						if (pos>-1) {
							timestring=datetimestring;
							if (pos>0) {
								var s=datetimestring.substr(0,pos);
								var pos1=s.lastIndexOf(' ');
								if (pos1>0) {
									datestring=s.substr(0,pos1);
									timestring=datetimestring.substr(pos1,datetimestring.length-pos1);
								}
							}
						}else {
							datestring=datetimestring;
						}
					}
					break;
			}
			//alert(datestring+' - '+timestring);
			// date check
			if (buildDate) {
				if (!datestring) {
					// heute setzen
				}else {
					var dateseps= new Array(".",","," ");
					var months31= ",1,3,5,7,8,10,12,";
					//var c='';
					var partIndex=0;
					var yearstring='';
					var monthstring='';
					var daystring='';
					for (var i=0;i<datestring.length;i++) {
						var c=datestring.substr(i,1);
						switch(c) {
							case '.':
							case ',':
								partIndex++;
								break;
							default:
								if (isNaN(c)) {
									errmsg=errmsgdefault+"\n"+LCMsgInvalidCharacter+' '+c; //'Ungültiges Zeichen '+c;
									check=false;
								}else {
									switch(partIndex) {
										case 0: daystring+=c; break;
										case 1: monthstring+=c; break;
										case 2: yearstring+=c; break;
									}
								}
						}
						if (!check || partIndex>2) break;
					}
					if (partIndex<1) check=false;
					if (check) {
						// auf number parsen ist besser als parseInt, weil so nicht interpretiertes zu 0 wird
						var day1=Number(daystring);
						var month1=Number(monthstring);
						var year1=Number(yearstring);
						if (year1==0) {
							var today=new Date();
							year1=today.getYear();
						}
						if (year1<999) {
							if (year1>30) {
								year1+=1900;
							}else {
								year1+=2000;
							}
						}
						if (year1>2200 || year1<1800) {
							errmsg=errmsgdefault+"\n"+LCMsgInvalidYear+' '+year1;
							check=false;
						}else {
							if (month1<1 || month1>12) {
								errmsg=errmsgdefault+"\n"+LCMsgInvalidMonth+' '+month1;
								check=false;
							}else {
								var maxday=30;
								if (months31.indexOf(','+month1+',')>-1) {
									maxday=31;
								}else {
									if (month1==2) maxday=29;
								}
								if (day1<1 || day1>maxday) {
									errmsg=errmsgdefault+"\n"+LCMsgInvalidDay+' '+day1+'.'+month1+'.';
									check=false;
								}
							}
							if (check) {
								yearstring=year1;
								monthstring=(month1<10) ? '0'+month1 : month1;
								daystring=(day1<10) ? '0'+day1 : day1;
								datestring=daystring+'.'+monthstring+'.'+yearstring;
							}
						}
					}
				}
			}
			// Zeitcheck
			if (buildTime) {
				var timeDefault='00:00:00';
				if (timestring) {
					partIndex=0;
					var hourstring='';
					var minstring='';
					var secstring='';
					for (var i=0;i<timestring.length;i++) {
						var c=timestring.substr(i,1);
						switch(c) {
							case ':':
								partIndex++;
								break;
							default:
								if (isNaN(c)) {
									errmsg=errmsgdefault+"\n"+LCMsgInvalidCharacter+' '+c;
									check=false;
								}else {
									switch(partIndex) {
										case 0: hourstring+=c; break;
										case 1: minstring+=c; break;
										case 2: secstring+=c; break;
									}
								}
						}
						if (!check || partIndex>2) break;
					}
					if (check) {
						var hour1=Number(hourstring);
						var min1=Number(minstring);
						var sec1=Number(secstring);
						if (hour1<0 || hour1>24) {
							errmsg=errmsgdefault+"\n"+LCMsgInvalidHour+' '+hour1;
							check=false;
						}else {
							if (min1<0 || min1>60) {
								errmsg=errmsgdefault+"\n"+LCMsgInvalidMinute+' '+min1;
								check=false;
							}else {
								if (sec1<0 || sec1>60) {
									errmsg=errmsgdefault+"\n"+LCMsgInvalidSecond+' '+sec1;
									check=false;
								}
							}
						}
						if (check) {
							hourstring=(hour1<10) ? '0'+hour1 : hour1;
							minstring=(min1<10) ? '0'+min1 : min1;
							secstring=(sec1<10) ? '0'+sec1 : sec1;
							timestring=hourstring+':'+minstring+':'+secstring;
						}
					}
				}
				if (!timestring) timestring=timeDefault;
			}
			if (check) {
				switch(format) {
					case 'd': datetimestring=datestring; break;
					case 't': datetimestring=timestring; break;
					case 'dt': datetimestring=datestring+' '+timestring;
				}
				//alert(datetimestring);
			}else {
				if (!errmsg) errmsg=errmsgdefault;
			}
		}
		if (!check) {
			alert(errmsg);
			el.focus();
		}else{
			el.value=datetimestring;
		}
	}
	return check;
}
/* ende neu */

function checkdate(elname,formname){
	return checkdatetime(elname,'d',formname);
}

function checktime(elname,formname){
	return checkdatetime(elname,'t',formname);
}

function checkemail(elname){
	var check=false
	var formobj=document.standform
	if (formobj.elements[elname]) {
		var el=formobj.elements[elname]
		var val=el.value;
		//var filter=/^(\w+(?:[\.\-\w]+)*)@((?:\w+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
		//var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
		var filter=/^([A-Za-z0-9_|-]+[.]*[A-Za-z0-9_|-]+)+@[A-Za-z0-9|-]+([.][A-Za-z0-9|-]+)*[.][A-Za-z0-9]+$/ig;
		if (filter.test(val)){
			check=true
		}else{
			alert(LCMsgInvalidEmail);//"Bitte eine gültige eMail-Adresse eingeben!")
			el.focus()
		}
	}
	return check
}

function checkspecificuserinput(rownumber) {
	var formobj=document.standform
	var elnamesdate=new Array()
	var elnamestime=new Array()
	var elnamesnumeric=new Array()

	elname="datefields_to_compare"
	if (checkformelement(elname)) elnamesdate=formobj.elements[elname].value.split(",")
	elname="timefields_to_compare"
	if (checkformelement(elname)) elnamestime=formobj.elements[elname].value.split(",")
	elname="numericfields_to_compare"
	if (checkformelement(elname)) elnamesnumeric=formobj.elements[elname].value.split(",")

	if (compareinput(formobj,elnamesdate,rownumber,"d")==false) return false;
	if (compareinput(formobj,elnamestime,rownumber,"t")==false) return false;
	if (compareinput(formobj,elnamesnumeric,rownumber,"n")==false) return false;

	return true
}

function compareinput(formobj,basefieldnames,rownumber,format) {
//called from checkspecificuserinput
	if (basefieldnames.length==0 || basefieldnames.length==1) return true;
	var fieldnames=new Array()
	for (var i=0; i < basefieldnames.length; i++) {
		if (rownumber!="") {
			fieldnames[i]=basefieldnames[i]+"["+rownumber+"]"
		}else{
			fieldnames[i]=basefieldnames[i]
		}
		if (checkformelement(fieldnames[i])==false) return false;
	}
	var val1=""
	var val2=""
	for (var i=0; i < fieldnames.length; i=i+2) {
		val1=formobj.elements[fieldnames[i]].value
		val2=formobj.elements[fieldnames[i+1]].value
		errmsg=get_fieldalias(fieldnames[i+1])+" muss größer oder gleich "+get_fieldalias(fieldnames[i])+" sein!"
		switch(format) {
			case "d":
				if (compare_german_dates(val1,val2)==1){
					alert(errmsg)
					return false
				}else break;
			case "t":
				if (compare_german_times(val1,val2)==1){
					alert(errmsg)
					return false
				}else break;
			case "n":
				if (val1=="" || val2=="") break;
				val1=val1*1
				val2=val2*1
				//alert("comparing "+val1+" and "+val2);
				//alert("val1>val2? "+(val1>val2));
				if (val1>val2){
					alert(errmsg)
					return false
				}else break;
		}
	}
	return true
}

function compare_german_dates(date1,date2){
//like 12.2.2002
//returns -1 if undefined, 0 if date1=date2, 1 if date1>date2, 2 if date1<date2
	returnval=-1
	if (date1!="" && date2!=""){
		var parts1=date1.split(".")
		var parts2=date2.split(".")
		if (parts1.length==3 && parts2.length==3){
			var val1=0
			var val2=0
			for (var i=3; i >-1; i=i-1) {
			    val1=parts1[i]*1
			    val2=parts2[i]*1
				if (val2>val1){
					returnval=2
					break;
				}else if (val2<val1){
					returnval=1
					break;
				}else{
					returnval=0
				}
			}
		}else{
			alert("Datumsvergleich nicht möglich wegen ungültigem Datum!")
		}
	}
	return returnval
}

function compare_german_times(time1,time2){
//like 13:05:00 or 13:05
//returns -1 if undefined, 0 if time1=time2, 1 if time1>time2, 2 if time1<time2
	returnval=-1
	if (time1!="" && time2!=""){
		var parts1=time1.split(":")
		var parts2=time2.split(":")
		if (parts1.length==2) parts1[2]="00"
		if (parts2.length==2) parts2[2]="00"
		if (parts1.length==3 && parts2.length==3){
			var val1=0
			var val2=0
			for (var i=3; i >-1; i=i-1) {
			    val1=parts1[i]*1
			    val2=parts2[i]*1
				if (val2>val1){
					returnval=2
					break;
				}else if (val2<val1){
					returnval=1
					break;
				}else{
					returnval=0
				}
			}
		}else{
			alert("Zeitvergleich nicht möglich wegen ungültigem Zeitwert!")
		}
	}
	return returnval
}

/*
	checkt ob form dirty ist und gibt ggf true zurück, sonst false
*/
function checkdirtystate(dont_prompt, formname){
	var retval=false;
	if (!formname) formname='standform';
	var formobj=document.forms[formname];
	if (!formobj) {
		alert('Formular "'+formname+'" nicht gefunden.');
	}else {
		if (formobj.formdirty.value=='1' || formobj.formdirty.value=='true') {
			if (!dont_prompt) {
				alert('Bitte erst speichern.');
			}
			retval=true;
		}
	}
	return retval;
}

function checksave(dont_prompt){
	var formobj=document.standform
	if (formobj.formdirty.value=="1" || formobj.formdirty.value=="true") {
		if (checkuserinput(false)) save(window.location);
	}else {
		if (!dont_prompt) alert(LCNothingToSave+".")
	}
}

/*
	Odb25 Variante
*/
function doaction(actiontext, prompttext, dontsave, actiontarget){
	doaction3(actiontext, prompttext, dontsave, actiontarget, 'standform', 'actiontype')
}

/*
	Allgemeinste Variante mit frei wählbaren Elementnamen im Aufruf
*/
function doaction3(actiontext, prompttext, dontsave, actiontarget, formname, actionfieldname){
	var formobj=document.forms[formname];
	if (!formobj) {
		alert('Formular "'+formname+'" nicht gefunden.');
	}else {
		if (!dontsave){
			if (formobj.formdirty){
				if (formobj.formdirty.value=='1') {
					alert(LCPleaseSave);
					return;
				}
			}
		}
		if (actiontext){
			var formel=formobj.elements[actionfieldname];
			if (!formel) {
				alert('Element "'+actionfieldname+'" nicht gefunden.');
			}else {
					if (prompttext){
					if (prompttext!=''){
						var check=confirm(prompttext+"?")
						if (!check) return;
					}
				}
				formel.value=actiontext;
				if (actiontarget){
					if (actiontarget=="body"){
						formobj.target=get_bodyframe();
					}else{
						formobj.target=actiontarget;
					}
				}
				submit_form(formobj);
			}
		}
	}
}

function checkdelete(id,qi,userprompt){
	var formobj=document.standform;
	var check=true;
	if (id!="") {
		if (userprompt) {
			question=userprompt;
		}else {
			question="Soll der Datensatz mit der ID '"+id+"' wirklich gelöscht werden?";
		}
		check=confirm(question);
		if (check) {
			if (formobj.formdirty) {
				if (formobj.formdirty.value=='1') {
					//alert('vor checkuserinput');
					check=checkuserinput(true);
					//25.5.2003: erst speichern, nie löschen wenn dirty
					return;
				}
			}
		}
		if (check) {
			formobj.deleteid.value=id;
			if (qi!="") {
				//GPA if (formobj.queryindex.value!=qi) {
				//GPA 	formobj.displayfields.value="";
				//GPA }
				formobj.queryindex.value=qi;
			}
			submit_form(formobj);
		}
	}
}

function confirmdelete(id,url){
	var formobj=document.standform
	if (url=="") url=window.location
	if (id!="") {
		if (confirm("Soll der Datensatz mit der ID '"+id+"' wirklich gelöscht werden?")) {
			oldmethod=formobj.method
			oldaction=formobj.action
			formobj.method="post"
			formobj.action=url
			formobj.deleteid.value=id
			submit_form(formobj);
			//formobj.submit()
			formobj.method=oldmethod
			formobj.action=oldaction
		}
	}
}
function checkopenurl(url){
	if (url=="") url=window.location;
	var formobj=document.standform
	var check=true
	var formisdirty=(formobj.formdirty.value=='1');
	if (formisdirty) check=checkuserinput(true);
	//alert("chek="+check)
	if (check) {
		if (formisdirty) {
			save(window.location)
		}else{
			formobj.dosave.value="";
			formobj.doedit.value="";
			openurl(url);
		}
	}
}

function openurl(url){
	var formobj=document.standform
	oldmethod=formobj.method
	oldaction=formobj.action
	formobj.method="post"
	formobj.action=url
	submit_form(formobj);
	//formobj.submit()
	formobj.method=oldmethod
	formobj.action=oldaction
}

function openprinterfriend(url){
	var formobj=document.standform;
	var oldmethod=formobj.method;
	var oldaction=formobj.action;
	var oldtarget=formobj.target;
	formobj.method="post";
	formobj.action=url;
	formobj.target="_blank";
	formobj.doprint.value=true;
	submit_form(formobj);
	//formobj.submit()
	formobj.method=oldmethod;
	formobj.action=oldaction;
	formobj.target=oldtarget;
	formobj.doprint.value="";
}

function exportToCsv(){
	var formobj=document.standform;
	if (formobj.actiontype) {
		if (confirm(LCPromptExportToCsv)) {
			formobj.actiontype.value='csvexport';
			var oldmethod=formobj.method;
			var oldtarget=formobj.target;
			formobj.method='post';
			formobj.target="_blank";
			submit_form(formobj);
			formobj.actiontype.value='';
			formobj.method=oldmethod;
			formobj.target=oldtarget;
		}
	}else {
		alert('Element actiontype existiert nicht.');
	}
}

function openclone(){
	var formobj=document.standform;
	var oldtarget=formobj.target;
	var oldmethod=formobj.method;
	var jetzt = new Date();
	var newtarget=jetzt.getTime();
	formobj.target=newtarget;
	formobj.method='post';
	var oldpopup;
	if (formobj.popup) {
		oldpopup=formobj.popup.value;
		formobj.popup.value=1;
	}
	var oldpagekey='';
	if (formobj.pagekey) {
		oldpagekey=formobj.pagekey.value;
		formobj.pagekey.value='';
	}
	submit_form(formobj);
	formobj.target=oldtarget;
	formobj.method=oldmethod;
	if (formobj.popup) formobj.popup.value=oldpopup;
	if (formobj.pagekey) formobj.pagekey.value=oldpagekey;
}

function checkopenprinterfriend(url) {
	if (url=="") url=window.location;
	var formobj=document.standform
	var check=true
	var formisdirty=(formobj.formdirty.value=='1');
	if (formisdirty) check=checkuserinput(true);
	if (check) {
		if (formisdirty) {
			save(window.location)
		}else{
			formobj.dosave.value=""
			formobj.doedit.value=""
			openprinterfriend(url)
		}
	}
}

function setview(qi, mode, filtername, viewtarget) {
/* function for genericlist.php to change the display mode, added 24/1/2003*/
	var formobj=document.standform;
	if (!formobj) {
		alert('Form standform nicht gefunden.');
		return;
	}
	if (!formobj.doedit) {
		alert('Formelement doedit fehlt.')
		return;
	}
	if (filtername) {
		if (filtername!='') {
			if (!formobj.elements[filtername]) {
				//alert('Kann Filterelement ''+filtername+'' nicht löschen!')
				//filter may not be there too
			}else{
				formobj.elements[filtername].value='';
			}
		}
	}
	if (viewtarget) {
		if (viewtarget!='') {
			if (viewtarget=='body') {
				formobj.subformmode.value='' //dont pass on the current subformmode
				viewtarget=get_bodyframe()
			}
			formobj.target=viewtarget
		}
	}
	switch(mode) {
 	case 'addnewnofilter':
		deletefilter('standform');
 	case 'addnew':
		formobj.addnew.value=1;
 	case 'edit':
		seteditview(qi);
		break;
 	case 'details':
 	case 'view':
		if (mode=='details') {
			formobj.viewmode.value='1';
		}else if (mode=='view') {
			formobj.viewmode.value='0';
		}
		setlistview(qi);
		break;
 	default:
		alert('function setview: Mode '+mode+' nicht behandelt!')
	}
}

function setlistview(qi) {
	var formobj=document.standform;
	formobj.doedit.value="";
	if (qi!="") {
		formobj.queryindex.value=qi;
	}
	if (formobj.actiontype) formobj.actiontype.value="";
	checkapplyfilter();
}

function seteditview(qi) {
	var formobj=document.standform
	formobj.doedit.value=true
	if (qi!="") {
		formobj.queryindex.value=qi;
	}
	if (formobj.actiontype) formobj.actiontype.value="";
	checkapplyfilter();
}

function check_submit_form(formobj){
	var check=false;
	if (formobj) {
		var formisdirty=false;
		if (formobj.formdirty) {
			formisdirty=(formobj.formdirty.value=='1');
			if (formisdirty) {
				check=checkuserinput(true);
			}else{
				check=true;
			}
			if (!check) {
				formobj.formdirty.value='0';
			}
		}
		if (check && formisdirty) {
			//if (formisdirty) {
			save(window.location)
		}else{
			check=true;
			submit_form(formobj);
		}
	}
	return check;
}

function checkapplyfilter(){
	var formobj=document.standform;
	var check=true;
	if (!formobj.formdirty) {
		alert('Element formdirty nicht gefunden!');
		return;
	}
	var formisdirty=formobj.formdirty.value=='1' ? true : false;
	if (formisdirty) {
		check=checkuserinput(true);
	}else{
		check=true;
	}
	//alert("check="+check)
	if (!check) {
		formobj.formdirty.value='0';
		//alert('check==false');
		if (formobj.posted) {
			formobj.posted.value='0';
		}
		submit_form(formobj);
		return;
	}
	if (check && formisdirty) {
		//if (formisdirty) {
		save(window.location);
	}else{
		var oldmethod=formobj.method
		//##################!!!!!!!!!!!!!!!
		formobj.dosave.value='0';
		if (formobj.doedit.value=='1'){
			formobj.method="post"
		}
		if (formobj.posted) {
			formobj.posted.value='0';
		}
		//alert(formobj.target)
		submit_form(formobj);
		//formobj.submit()
		formobj.method=oldmethod
	}
}

function check_passwords2(elname1,elname2){
	var formobj=null;
	var formname='standform';
	if (document.forms[formname]) {
		formobj=document.forms[formname];
	}else {
		if (document.forms[0]) {
			formobj=document.forms[0];
		}
	}
	if (!formobj) {
		alert("Formular konnte nicht bestimmt werden (function check_passwords2)");
		return false;
	}else {
		var check=true
		if (!formobj.elements[elname1]) {
			alert("Kennwort Feld "+elname1+" existiert nicht (function check_passwords2)!")
			return false;
		}
		if (!formobj.elements[elname2]) {
			alert("Kennwort Feld "+elname2+" existiert nicht (function check_passwords2)!")
			return false;
		}
		var el1=formobj.elements[elname1]
		var el2=formobj.elements[elname2]
		var pw1=el1.value
		var pw2=el2.value
		if (pw1=="") {
			el1.focus()
			return false;
		}
		if (pw2=="") {
			el2.focus()
			return false;
		}
		if (pw2!=pw1) {
			alert(LCPasswordsDifferent+"!")
			el1.value=""
			el2.value=""
			el1.focus()
			return false;
		}
		return true;
	}
}

function check_passwords(elname1,elname2){
//compares passwords
//alert("checking")
	var formobj=document.standform
	var check=true
	if (!formobj.elements[elname1]) {
		alert("password field "+elname1+" not available!")
		return false;
	}
	if (!formobj.elements[elname2]) {
		alert("confirm password field "+elname2+" not available!")
		return false;
	}
	var el1=formobj.elements[elname1]
	var el2=formobj.elements[elname2]
	var pw1=el1.value
	var pw2=el2.value
	if (pw1=="") {
		alert(LCPleaseEnterPassword+"!")
		el1.focus()
		return false;
	}
	if (pw2=="") {
		alert(LCPleaseConfirmPassword+"!")
		el2.focus()
		return false;
	}
	if (pw2!=pw1) {
		alert(LCPasswordsDifferent+"!")
		el1.value=""
		el2.value=""
		el1.focus()
		return false;
	}
	return true
}



function checkuserinput(showprompt){
//if form=dirty, required fields are checked
//if user cancels prompt rowdirty fields are reset
	var formobj=document.standform;
	var check=true;
	var keepchanges=true;
	if (formobj.formdirty.value=="1") {
		if (showprompt) keepchanges=confirm(LCNeedsSave);
		//alert("keepchanges="+ keepchanges)
		var fieldstring='';
		if (formobj.requiredfields) fieldstring=formobj.requiredfields.value;
		//if there are required fields
		var flds=new Array();
		if (fieldstring.length>0) flds=fieldstring.split(",");
		// loop thru formelements ...
		var elname="";
		for (var i=0; i < formobj.elements.length; i++) {
			var formelement=formobj.elements[i];
			elname=formelement.name;
			//loop thru all the elements named rowdirty0, rowdirty1 etc
			if (elname.indexOf("rowdirty")>-1){
				//if record dirty check required fields..
				if (formelement.value) {
					if (!keepchanges) {
						//set record to not dirty
						formobj.elements[elname].value="";
						check=false;
					}else{ //otherwise check required fields
						var rownumber=elname.substring(8,elname.length)
						//for all required fields
						for (var j=0; j < flds.length && check; j++) {
							/////////////
							if (flds[j].length>0) {
								var fieldname1=flds[j]+"["+rownumber+"]"
								if (!formobj.elements[fieldname1]){
									alert ("erforderliches Feld "+fieldname1+" existiert nicht!!")
									check=false
									break;
								}
								//alert(fieldname1)
								var el=formobj.elements[fieldname1]
								var eltype=el.type
								if (eltype=="text" || eltype=="textarea" || eltype=="hidden" || eltype=="password"){
									if (el.value=="" || el.value=="0") {
										alert(LCbitteEingabe1+" "+get_fieldalias(fieldname1)+" "+LCbitteEingabe2)
										check=false
										break;
									}
								}else if (eltype=="select-one") {
									if (el.value=="") {
										alert("Bitte "+get_fieldalias(fieldname1)+" auswählen!")
										check=false
										break;
									}
								}else{
									alert("Typ des Feldes '"+fieldname1+"'="+eltype+"' und nicht behandelt!!!");
									check=false
									break;
								}
								//////////////////////////////
								if (!check) {
									if ( eltype!="hidden") el.focus();
									break;
								}
								//////////
							}
						}//end loop over all required fields
						if (check) check=checkspecificuserinput(rownumber)
					}//end check fields in case of savechanges
				} //end if record dirty (rowdirty=true)
			}//end rowdirty-field
			if (!check) break;
		}//end loop thru formelements
	}//end formdirty
	if (!keepchanges) formobj.formdirty.value='0';

	return check;
}

function setdirty(chkname, check_by_box){
//check_by_box is true if the user directly clicks the box; thus he may toggle save or not
//when calling thru onchange check_by_box is  false
	var formobj=document.standform;
	if (formobj.elements[chkname]) {
		var checkel=formobj.elements[chkname];
		var curval=checkel.value;
		//alert(curval)
		if (check_by_box) {
			if (curval=='0') {
				checkel.value='1';
			}else{
				checkel.value='0';
			}
		}else{
			if (checkel.type=='checkbox') checkel.checked=true;
			checkel.value='1';
		}
		if (formobj.formdirty) {
			formobj.formdirty.value='1';
		}else {
			alert("Das Element formdirty existiert nicht.");
		}
	}else {
		alert("Das Element '"+chkname+"' existiert nicht.");
	}
}

function saveasnewrecord(url,idname){
	var formobj=document.standform;
	if (confirm(LCSaveAsNewRecord+"?")) {
		formobj.elements[idname].value='';
		formobj.dosave.value="1";
		var oldmethod=formobj.method;
		formobj.method="post";
		formobj.action=url;
		submit_form(formobj);
		//formobj.submit()
		formobj.action=oldmethod;
	}
}

function edit(url){
	if (url=="") url=window.location;
	var formobj=document.standform
	oldmethod=formobj.method
	oldaction=formobj.action
	formobj.method="post"
	formobj.action=url
	if (formobj.edit) formobj.edit.value=true
	if (formobj.doedit) formobj.doedit.value=true
	submit_form(formobj);
	//formobj.submit()
	formobj.method=oldmethod
	formobj.action=oldaction
}

function addnewrecord(url){
	if (url=="") url=window.location;
	var formobj=document.standform
	var oldmethod=formobj.method
	var oldaction=formobj.action
	if (formobj.addnew){ //if exists
		formobj.addnew.value=true
		formobj.method="post"
		formobj.action=url
		//alert(formobj.addnew.value)
		submit_form(formobj);
		//formobj.submit()
		formobj.method=oldmethod
		formobj.action=oldaction
	}else alert("Feld addnew existiert nicht!");
}


function nextrecords(sign){
	formobj=document.standform
	formobj.offset.value=eval(formobj.offset.value)+sign*eval(formobj.rpp.value)
	submit_form(formobj);
	//formobj.submit()
}

function movelast(counttotal) {
	formobj=document.standform
	formobj.offset.value=counttotal-formobj.rpp.value
	submit_form(formobj);
	//formobj.submit()
}

function movefirst() {
	formobj=document.standform
	formobj.offset.value=0
	submit_form(formobj);
	//formobj.submit()
}

function deletefilter(formname){
	var formobj=document.forms(formname)
	var freezestring=new String
	if (formobj.freezefilters){
		freezestring=formobj.freezefilters.value
	}
	freezestring=","+freezestring+","
	//alert("nr1")
	//		alert(freezestring)
	for (var i=0; i < formobj.elements.length; i++) {
		var formelement=formobj.elements[i]
		if (is_filtername(formelement.name)) {
			//alert(formelement.name)
			if (freezestring.indexOf(","+formelement.name+",")==-1) formelement.value=""
		}
	}
}

function is_filtername(text) {
	//according to filter naming conventions of odb2
	returnval=false
	if (text.indexOf("_")>0){
		if (text.indexOf("pmatch")>=0 ||
			text.indexOf("lmatch")>=0 ||
			text.indexOf("rmatch")>=0 ||
			text.indexOf("xmatch")>=0 ||
			text.indexOf("num")>=0 ||
			text.indexOf("gerd")>=0 ||
			text.indexOf("gert")>=0) {
			returnval=true
		}
	}
	return returnval
}

function sortlist(fieldname){
	formobj=document.standform
	if (fieldname!="") {
		currentfields=formobj.orderbyfields.value
		if (currentfields.indexOf(fieldname)>-1 && currentfields.indexOf(fieldname+" DESC")==-1) {
			formobj.orderbyfields.value=fieldname+" DESC"
		}else{
			formobj.orderbyfields.value=fieldname
		}
		submit_form(formobj);
		//formobj.submit()
	}
}

function reloadbody(){
	if (!parent.parent.body) {
		top.location.reload()
	}else parent.parent.body.location.reload()
}

function tell_target(){
	var msg="window: "+window.name
	if (parent.frames.length>0){
		msg+="\nparent: "+parent.window.name
		for(var i=0; i < parent.frames.length; i++){
			msg+="\nframe["+i+"].name="+parent.frames[i].name
		}
	}
	if (top.frames.length>0){
		for(i=0; i < top.frames.length; i++){
			msg+="\ntop.frame["+i+"].name="+top.frames[i].name
		}
	}
	if (document.standform) msg+="\nstandformtarget="+document.standform.target
	alert(msg);
	alert("bodyframe="+get_bodyframe());
}

function rename_window(){
	check_linktargets();
}

function find_frame(framename){
	if (framename.length>0){
		if (parent.frames.length>0){
			for(var i=0; i < parent.frames.length; i++){
				msg+="\nframe["+i+"].name="+parent.frames[i].name
			}
		}
	}
}

function check_linktargets(){
//überschreibt die linktargets wenn sie body heissen,
//aber im aktuellen fenster kein frame namens "body" ist
	var linktarget=get_bodyframe();
	//alert(linktarget)
	if (linktarget!="body"){
		for (var i=0; i<document.links.length; i++){
			var somelink=document.links[i]
			if (somelink.target=="body") somelink.target=linktarget;
		}
		for (i=0; i<document.forms.length; i++) {
			var someform=document.forms[i]
			if (someform.target=="body") someform.target=linktarget;
		}
	}
}


function get_bodyframe(){
	var msg=""
	var framefound=false
	var bodyframe="body"
	if (window.name==bodyframe) {
		return bodyframe;
	}else{
		if (top.frames.length>0){
			for (i=0;i<top.frames.length;i++){
				msg+="\ntop "+i+": "+top.frames[i].name
				if (top.frames[i].name==bodyframe){
					framefound=true; break;
				}
			}
			if (!framefound){
				for (var i=0;i<parent.frames.length;i++){
					msg+="\nparent "+i+": "+parent.frames[i].name
					if (parent.frames[i].name==bodyframe){
						framefound=true; break;
					}
				}
			}
			if (!framefound){
				if (top.name!=""){
					return top.name
				}else{
					return "_top";
				}
			}else{
				return bodyframe
			}
		}else{
			return window.name;
		}
	}
}

/**
*silke eMail-Verschlüsselung 08-07-2008
*/

var nospam  = '%99%';  // für das @

function decodeString(myEncStr) {
	var tmp;
	tmp = myEncStr.replace( eval("/" + nospam + "/"), '@');
	return(tmp);
}

function printLink(myEncStr, pilot) {
  var decStr = decodeString(myEncStr);
  with ( document ) {
    open();
    document.writeln("<a href=\"mailto:" + decStr + "\" title=\"" + decStr + "\">" + pilot + "</a>");
    close();
  }
}

////

//line colors from phpmyadmin 2.2.6
/**
 * Sets/unsets the pointer and marker in browse mode
 *
 * @param   object   the table row
 * @param   string   the action calling this script (over, out or click)
 * @param   string   the default background color
 * @param   string   the color to use for mouseover
 * @param   string   the color to use for marking a row
 *
 * @return  boolean  whether pointer is set or not
 */

function setPointer(theRow, theAction, theDefaultColor, thePointerColor, theMarkColor)
{
    var theCells = null;
    // 1. Pointer and mark feature are disabled or the browser can't get the
    //    row -> exits
    if ((thePointerColor == '' && theMarkColor == '')
        || typeof(theRow.style) == 'undefined') {
        return false;
    }



    // 2. Gets the current row and exits if the browser can't get it
    if (typeof(document.getElementsByTagName) != 'undefined') {
        theCells = theRow.getElementsByTagName('td');
    }
    else if (typeof(theRow.cells) != 'undefined') {
        theCells = theRow.cells;
    }
    else {
        return false;
    }

    // 3. Gets the current color...
    var rowCellsCnt  = theCells.length;
    var domDetect    = null;
    var currentColor = null;
    var newColor     = null;
    // 3.1 ... with DOM compatible browsers except Opera that does not return
    //         valid values with "getAttribute"
    if (typeof(window.opera) == 'undefined'
        && typeof(theCells[0].getAttribute) != 'undefined') {
        currentColor = theCells[0].getAttribute('bgcolor');
        domDetect    = true;
    }
    // 3.2 ... with other browsers
    else {
        currentColor = theCells[0].style.backgroundColor;
        domDetect    = false;
    } // end 3



    // 4. Defines the new color
    // 4.1 Current color is the default one
    if (currentColor) {
	    if (currentColor == ''
	        || currentColor.toLowerCase() == theDefaultColor.toLowerCase()) {
	        if (theAction == 'over' && thePointerColor != '') {
	            newColor = thePointerColor;
	        }
	        else if (theAction == 'click' && theMarkColor != '') {
	            newColor = theMarkColor;
	        }
	    }

	    // 4.1.2 Current color is the pointer one
	    else if (currentColor.toLowerCase() == thePointerColor.toLowerCase()) {
	        if (theAction == 'out') {
	            newColor = theDefaultColor;
	        }
	        else if (theAction == 'click' && theMarkColor != '') {
	            newColor = theMarkColor;
	        }
	    }

	    // 4.1.3 Current color is the marker one
	    else if (currentColor.toLowerCase() == theMarkColor.toLowerCase()) {
	        if (theAction == 'click') {
	            newColor = (thePointerColor != '')
	                     ? thePointerColor
	                     : theDefaultColor;
	        }
	    } // end 4
    }

    // 5. Sets the new color...
    if (newColor) {
        var c = null;
       // 5.1 ... with DOM compatible browsers except Opera
        if (domDetect) {
            for (c = 0; c < rowCellsCnt; c++) {
                theCells[c].setAttribute('bgcolor', newColor, 0);
            } // end for
        }
        // 5.2 ... with other browsers
        else {
            for (c = 0; c < rowCellsCnt; c++) {
                theCells[c].style.backgroundColor = newColor;
            }
        }
    } // end 5
    return true;

} // end of the 'setPointer()' function
//</SCRIPT>