// GLOBAL.JS Release 1.2 vom 19.06.2001
// Technischer Kontakt martin@wiegenstein.de

var myForm  = 'sdwform';
var datSep  = '.';
var timSep  = ':';
var timSep2  = '.';
var arrSep  = ';';
var cCR	= '\n';

// Sprachabhängige Bausteine

var cChoice = '-- Bitte wählen --';
var cPleaseState = 'Bitte geben Sie "#c#" an.';
var cFieldMinLen = 'Im Feld "#c#" müssen #i# Zeichen angegeben werden.';
var cFieldMaxLen = 'Im Feld "#c#" dürfen maximal #i# Zeichen angegeben werden.';
var cNoDate = '#d# ist kein gültiges Datum.';
var cMinDate = '#d# liegt in der Vergangenheit.';
var cMaxDate = '#d# liegt zu weit in der Zukunft.';
var cNoTime = '#d# ist keine gültige Uhrzeit (HH' + timSep + 'MM).';
var cInvldFormat = 'Ungültiges Format : "#c#".';
var cHasDigits   = 'Text enthält Ziffern : "#c#".';
var cPleaseSelct = 'Bitte wählen Sie "#c#" aus.';
var cPleaseFillMin = 'Bitten füllen Sie mindestens #i# Feld(er) aus.';
var cIllegalChar = 'Illegales Zeichen (#c1#) im Feld "#c2#".';

var iDayInMilliSecs = 24 * 60 * 60 * 1000;
var aDigit   = new String('0123456789');
var aMonLen  = new Array(31,29,31,30,31,30,31,31,30,31,30,31);
var aIllegal = new Array();

var iAnzTestLines = 20;
var aFieldsTestLines = new Array();
var aNamesTestLines = new Array();

var bAddErrorOverride = false;
var bOnlyAddError = false;

// Dummy Funktion für zusätzliche komplexere Prüfungen
function addCheckFunction() {
	return new String("");
}



// HELPER functions **************************************

// "true" wenn s1 und s2 gleich
function CmpString(s1, s2) {
	var str1 = new String(s1);
	var str2 = new String(s2);
	var bRet = (str1.indexOf(str2) == 0) && (str2.indexOf(str1) == 0);

	return bRet;
}

function strReplaceBy() {
	var cSrc = '';
	if (arguments.length > 1) {

		cSrc = new String(arguments[0]);
		for (var ij = 0; ij < (arguments.length - 1) / 2; ij++) {
			if (2 * ij + 2 < arguments.length) {
				var cSeek = arguments[2 * ij + 1];
				var cRepl = arguments[2 * ij + 2];
				cSrc = cSrc.split(cSeek).join(cRepl);
			}
		}

	}
	return cSrc;
}












// FORM functions **************************************************

// Liefert den Index (Index-Origin 0) des Feldes valField im Formular
function formIndex(valField) {
	var bFound = false;
	var fi = 0;
	if (new String(valField).length > 0) {
		var ff = dform;
		while (!bFound && (fi < ff.length)) {
			if (CmpString(ff.elements[fi].name, valField)) {
				bFound = true;
			} else {
				fi++;
			}
		}
	}

	var ret = -1;
	if (bFound) {
		ret = fi;
	}

	return ret;
}

// Liefert den Wert des Feldes valField
function formValue(valField) {
	var cRet = '';
	
	var cField = eval('dform.' + valField);
	if (cField) {
		cRet = cField.value;
	} else {
		var fi = formIndex(valField);
		if (fi != -1) {
			cRet = eval('dform.elements[' + fi + '].value');
		}
	}
	
	return new String(cRet);
}

// Liefert die Länge des Wertes des Feldes aField; " " und "*" werden überlesen
function fieldLength(aField) {
	var pField = formValue(aField);
	var retVal = 0;
	for (var fi = 0; fi < pField.length; fi++) {
		var c = pField.charAt(fi);
		if (c != " ") {
			retVal++;
		}
	}
	return retVal;
}

// Liefert "true" wenn aVal nur Ziffern enthält. ! Achtung : ist aVal leer wird false zurückgegeben !
function OnlyDigits(aVal) {
	var retVal = true;
	var aField = new String(aVal);
	if (aField.length != 0) {
		for (var fi = 0; fi < aField.length ; fi++) {
			var myVal = aField.charAt(fi);
			if (aDigit.indexOf(myVal) == -1) {
				retVal = false;
			}
		}
	} else {
		retVal = false;
	}
	return retVal;
}

// Liefert "true" wenn aVal keine Ziffern enthält.
function NoDigits(aVal) {
	var retVal = true;
	var aField = new String(aVal);
	if (aField.length != 0) {
		for (var fi = 0; fi < aDigit.length ; fi++) {
			myVal = aDigit.charAt(fi);
			if (aField.indexOf(myVal) != -1) {
				retVal = false;
			}
		}
	}
	return retVal;
}

// Versucht den String als Datum zu interpretieren und gibt den Wert in serial zurück
function charToSerial(s) {
	var cRet = null;

	if ((s.indexOf('.') != -1) || (s.indexOf(',') != -1) || (OnlyDigits(s) && ((s.length < 3) || (s.length == 6) || (s.length == 8)))) {
		var cSpl = '';
		var aSep = new Array();

		if (OnlyDigits(s) && ((s.length == 6) || (s.length == 8))) {

			aSep[0] = s.substring(0, 2);
			aSep[1] = s.substring(2, 4);
			if (s.length == 6) {
				aSep[2] = s.substring(4, 6);
			} else {
				aSep[2] = s.substring(4, 8);
			}

		} else {
			if (s.indexOf('.') != -1) {
				cSpl = '.';
			} else {
				cSpl = ',';
			}
			aSep = s.split(cSpl);
		}

		var d = new Date();
		var aRet = new Array(d.getDate(), d.getMonth() + 1, d.getFullYear());

		for (var si = 0; si < aRet.length; si++) {
			var pS = new String(aSep[si]);
			if ((pS != 'undefined') && (pS != 'null') && (pS != '')) {
				aRet[si] = pS - 0;
				if ((aRet[si] < 100) && (si == 2)) {
					aRet[si] = aRet[si] + d.getFullYear() - (d.getFullYear() % 100);
				}
			}
		}

		cRet = aRet[2];
		cHelp = '0'+aRet[1];
		cRet += cHelp.substr(cHelp.length-2,2);
		cHelp = '0'+aRet[0];
		cRet += cHelp.substr(cHelp.length-2,2)+'0000';
	}
	return cRet;
}

// Liefert "true" wenn aVal ein gültiges Datum ist (Format TT.MM.JJJJ oder TTMMJJJJ; siehe datSep). ! Schaltjahre werden ignoriert !
function isDate(aVal) {
	var ret = false;
	var s = new String(aVal);
	
	if ((s.indexOf('.') != -1) || (s.indexOf(',') != -1) || (OnlyDigits(s) && ((s.length < 3) || (s.length == 6) || (s.length == 8)))) {

		ret = true;
		var aSep = new Array();

		if (OnlyDigits(s) && ((s.length == 6) || (s.length == 8))) {

			aSep[0] = s.substring(0, 2);
			aSep[1] = s.substring(2, 4);
			if (s.length == 6) {
				aSep[2] = s.substring(4, 6);
			} else {
				aSep[2] = s.substring(4, 8);
			}

		} else {
	
			var cSpl = '';
			if (s.indexOf('.') != -1) {
				cSpl = '.';
			} else {
				cSpl = ',';
			}
			aSep = s.split(cSpl);
			
		}

		var d = new Date();
		var aRet = new Array(d.getDate(), d.getMonth() + 1, d.getFullYear());
		
		for (var si = 0; si < aSep.length; si++) {
		
			if (aSep[si].length > 0) {
				if (!OnlyDigits(aSep[si])) {
					ret = false;
				} else {
					aRet[si] = aSep[si] - 0;
				}
			}

		}



		if (ret) {
		
			var iD = aRet[0] - 0;
			var iM = aRet[1] - 0;
			var cY = new String(aRet[2]);

			if (cY.length < 4) {
				var l = cY.length;
				cYear = new String(d.getYear());
				cY = cYear.substring(0, 4 - l) + cY;
			}
			var iY = cY - 0;

			if ((iM < 1) || (iM > 12) || (iD < 1) || (iD > aMonLen[iM - 1]) || (iY < 1)) {
				ret = false;
			}

		}


	}
	
	return ret;
}

// Liefert "true" wenn aVal eine gültige Zeit ist (Format HH:MM; siehe timSep).
function isTime(aVal) {
	var ret = true;
	var pS  = new String(aVal);
	
	var iH = -1;
	var iM = -1;
	
	if (OnlyDigits(pS)) {
		if ((pS.length == 4) || (pS.length == 2)) {
			iH = pS.substring(0, 2);
			if (pS.length == 4) {
				iM = pS.substring(2, 4);
			} else {
				iM = 0;
			}
		} else {
			ret = false;
		}
	} else {
		var aDat = pS.split(timSep);
		if (aDat.length != 2) {
			var aDat = pS.split(timSep2);
		}
		
		if (aDat.length == 2) {
			for (var fi = 0; fi < aDat.length; fi++) {
				if (!OnlyDigits(aDat[fi])) {
					ret = false;
				}
			}

			if (ret) {
				iH = aDat[0] - 0;
				iM = aDat[1] - 0;
			}

		} else {
			ret = false;
		}
	}
	
	if (ret) {
		if ((iH < 0) || (iH > 23) || (iM < 0) || (iM > 59)) {
			ret = false;
		}
	}
	
	return ret;
}

function testLines() {

	var cRet = '';
	
	if (aFieldsTestLines.length > 0) {

		for (var z = 1; z <= iAnzTestLines; z++) {
		
			var bLineEmpty = true;
			
			for (var i = 0; i < aFieldsTestLines.length; i++) {
				if (z < 10) {
					var cText = aFieldsTestLines[i] + '0' + z;
				} else {
					var cText = aFieldsTestLines[i] + z;
				}
				if (formValue(cText).length > 0) {
					bLineEmpty = false;
				}
			}
			
			if (!bLineEmpty) {
				for (var i = 0; i < aFieldsTestLines.length; i++) {
					if (z < 10) {
						var cText = aFieldsTestLines[i] + '0' + z;
					} else {
						var cText = aFieldsTestLines[i] + z;
					}

					if (formValue(cText).length == 0) {
						cRet += '\nFeld "' + aNamesTestLines[i] + '" in Zeile ' + z + ' ist nicht ausgefüllt.';
					}
				}
			}
		}
		
	}

	return cRet;

}

// Hauptprüfungsroutine für alle Formularfelder; liefert "true" wenn Formular fehlerfrei
function letsVerify(f) {

	var bLetsVerify = true;
	var bIgnore = formValue('iqIgnore') == '1';

	if (!bIgnore) {
	
		var aFocus = "";
		var myAlert = "";
		
		var pFieldName = '';
		var pFieldText = '';
		var pFieldType = '';
		var pFieldMust = '';
		var pFieldLimit = '';

		var pDropName = '';
		var pDropText = '';

		var pFieldName	  = formValue('iqFieldName');
		var pFieldText	  = formValue('iqFieldText');
		var pFieldType	  = formValue('iqFieldType');
		var pFieldMust	  = formValue('iqFieldMust');
		var pFieldLimit	  = formValue('iqFieldLimit');
	        var pFieldDateMax = formValue('iqFieldDateMax');

		var pDropName	  = formValue('iqDropName');
		var pDropText	  = formValue('iqDropText');
		var pDropMust	  = formValue('iqDropMust');

		var aFieldName    = pFieldName.split(',');
		var aFieldText    = pFieldText.split(',');
		var aFieldType    = pFieldType.split(',');
		var aFieldMust    = pFieldMust.split(',');
		var aFieldLimit   = pFieldLimit.split(',');
	        var aFieldDateMax = pFieldDateMax.split(',');

		var aDropName	= pDropName.split(',');
		var aDropText	= pDropText.split(',');
		var aDropMust	= pDropMust.split(',');

		var pRequired	= formValue('iqRequired');
		var iRequired	= pRequired - 0;

		if (isNaN(iRequired)) {
			iRequired = 0;
		}
		var iReq = iRequired;

		var bProcess = (pFieldMust.length > 0) || (aDropMust.length > 0);

		var bAllEmpty = true;			// Alle Textfelder leer ?
		var bNothingSelected = true;	// Alle Selectfelder auf Index 0 ?

		var dateNow = new Date();
		var tDate   = dateNow.getFullYear() * 366 + (dateNow.getMonth() + 1) * 31 + dateNow.getDate();
		

		// Textfelder prüfen
		var i = 0;
		while ((i < aFieldName.length) && bAllEmpty) {
			if (fieldLength(aFieldName[i]) != 0) {
				bAllEmpty = false;
			} else {
				i++;
			}
		}

		// Selectfelder prüfen
		var i = 0;
		while ((i < aDropName.length) && bNothingSelected) {
			var iNdx = formIndex(aDropName[i]);
			if (iNdx != -1) {
				var dv = f.elements[iNdx];
				if (dv.selectedIndex > 0) {
					bNothingSelected = false;
				}
			}
			i++;
		}

		if ((bAllEmpty && bNothingSelected) && (iRequired > 0)) {
			iReq = 1;
		}

		if (bProcess && (!bAllEmpty || !bNothingSelected)) {

			// Logisches Prüfen aller Textfelder

			for (var i = 0; i < aFieldMust.length; i++) {
				var bFieldOK = true;
				var iMinLen  = aFieldMust[i];
				var iMaxLen  = aFieldLimit[i];
				var iMaxDate = aFieldDateMax[i] -0;
				var iMomLen  = fieldLength(aFieldName[i]);
				if ((iMinLen > 0) && (iMomLen < iMinLen)) {

					if (iMinLen == 1) {
						myAlert = myAlert + '\n' + strReplaceBy(cPleaseState, '#c#', aFieldText[i]);
					} else {
						myAlert = myAlert + '\n' + strReplaceBy(cFieldMinLen, '#c#', aFieldText[i], '#i#', iMinLen);
					}

					bLetsVerify = false;
					bFieldOK = false;

					if (aFocus.length == 0) {
					     aFocus = new String(aFieldName[i]);
					}
				}

				if ((iMaxLen > 0) && (iMomLen > iMaxLen)) {
					myAlert = myAlert + '\n' + strReplaceBy(cFieldMaxLen, '#c#', aFieldText[i], '#i#', iMaxLen);
					bLetsVerify = false;
					bFieldOK = false;

					if (aFocus.length == 0) {
					     aFocus = new String(aFieldName[i]);
					}
				}

				if ((iReq > 0) && (iMomLen > 0)) {
					iReq--;
				}

				var cVal = formValue(aFieldName[i]);
				var bIllegal = false;

				var ik = 0;
				while ((!bIllegal) && (ik < aIllegal.length)) {
					if (cVal.indexOf(aIllegal[ik]) != -1) {
						bIllegal = true;
					} else {
						ik++;
					}
				}
				if (bIllegal) {
					myAlert = myAlert + '\n' + strReplaceBy(cIllegalChar, '#c1#', aIllegal.join(' '), '#c2#', aFieldText[i]);
					bLetsVerify = false;
					bFieldOK = false;

					if (aFocus.length == 0) {
					     aFocus = new String(aFieldName[i]);
					}
				}

				if ((bFieldOK) && (iMomLen > 0)) {
					var iTyp = getType(aFieldType, i);
					if (iTyp > 0) {
						bMomErr = false;
						switch(iTyp) {
							case 1 : {
								if (!isDate(formValue(aFieldName[i]))) {
									bMomErr = true;
									myAlert = myAlert + '\n' + strReplaceBy(cNoDate, '#d#', formValue(aFieldName[i]));
								} else {
									if (iMaxDate > 0) {
										var s = formValue(aFieldName[i]);
										if (OnlyDigits(s) && ((s.length == 6) || (s.length == 8))) {
											var aSep = new Array();
											aSep[0] = s.substring(0, 2) -0;
											aSep[1] = s.substring(2, 4) -0;
											if (s.length == 6) {
												aSep[2] = s.substring(4, 6) -0;
											} else {
												aSep[2] = s.substring(4, 8) -0;
											}
										} else {
											var cSpl = '';
											if (s.indexOf('.') != -1) {
												cSpl = '.';
											} else {
												cSpl = ',';
											}
											aSep = s.split(cSpl);
										}

										var iJahr = aSep[2] - 0;
										if (iJahr == 0) iJahr = dateNow.getFullYear();
										if (iJahr < 100) iJahr = iJahr + 2000;
										var iMonth = aSep[1] -0; 
										if ((aSep[1] == 'undefined') || (aSep[1] == 'null') || (aSep[1] == '')) iMonth = dateNow.getMonth();
										var iDay = aSep[0] -0;
										
										tField = iJahr * 366 + iMonth * 31 + iDay;
										
										dMax = new Date(dateNow.getTime() + iMaxDate * iDayInMilliSecs);
										tMax = dMax.getFullYear() * 366 + (dMax.getMonth() + 1) * 31 + dMax.getDate();
										
										if (tField < tDate) {
											bMomErr = true;
											myAlert = myAlert + '\n' + strReplaceBy(cMinDate, '#d#', formValue(aFieldName[i])) +'"'+tDate+'"'+iJahr+'"'+(aSep[1] -0)+'"'+(aSep[0] -0)+'"';
										}
										
										if (tField > tMax) {
											bMomErr = true;
											myAlert = myAlert + '\n' + strReplaceBy(cMaxDate, '#d#', formValue(aFieldName[i]));
										}
									}
								}
								break;
							}
							case 2 : {
								if (!OnlyDigits(formValue(aFieldName[i]))) {
									bMomErr = true;
									myAlert = myAlert + '\n' + strReplaceBy(cInvldFormat, '#c#', aFieldText[i]);
								}
								break;
							}
							case 3 : {
								if (!isTime(formValue(aFieldName[i]))) {
									bMomErr = true;
									myAlert = myAlert + '\n' + strReplaceBy(cNoTime, '#d#', formValue(aFieldName[i]));
								}
								break;
							}
							case 4 : {
								if (!NoDigits(formValue(aFieldName[i]))) {
									bMomErr = true;
									myAlert = myAlert + '\n' + strReplaceBy(cHasDigits, '#c#', aFieldText[i]);
								}
								break;
							}
						}
						if (bMomErr) {
							bLetsVerify = false;
							if (aFocus.length == 0) {
								 aFocus = new String(aFieldName[i]);
							}

						}
					}
				}

			}

			if (pDropName.length > 0) {
				for (var i = 0; i < aDropName.length; i++) {
					var iNdx = formIndex(aDropName[i]);
					var dv = f.elements[iNdx];
					if (aDropMust[i] == "1") {
						if (iReq > 0) {
							iReq--;
						}

						if (dv.selectedIndex == 0) {
							myAlert = myAlert + '\n' + strReplaceBy(cPleaseSelct, '#c#', aDropText[i]);
							bLetsVerify = false;
							if (aFocus.length == 0) {
								 aFocus = new String(aDropName[i]);
							}
						}
					}
				}
			}
			
			var pADC = addCheckFunction();

			bOnlyAddError = false;
			
			if (pADC.length > 0) {
				myAlert = myAlert + pADC;
				
				if (bAddErrorOverride) {
					bOnlyAddError = bLetsVerify;
				}
				
				bLetsVerify = false;
			}

		}

		if (iReq > 0) {
			bLetsVerify = false;
			myAlert += '\n' + strReplaceBy(cPleaseFillMin, '#i#', iRequired);
		}


		if (!bLetsVerify) {
			alert(myAlert);
			if (aFocus.length != 0) {
				pi = formIndex(aFocus);
				if (pi != -1) {
					eval('dform.elements[' + pi + '].focus()');
				}
			}
		}


		if (bLetsVerify) {
			if (bAllEmpty) {
				if (dform.iqSavePage) {
					dform.iqSavePage.value = '0';
				}
			}
		}

	}

	return bLetsVerify;
}

function letsSubmit(aForm) {
	if (arguments.length > 0) {
		myForm	= aForm;
	}
	dform	= eval('document.' + myForm);
	
	var bLetsSubmit = letsVerify(dform);

//	Entfernt 05.10.2007 MW
//	if (!bLetsSubmit && bOnlyAddError) {
//		bLetsSubmit = confirm('Möchten Sie die Daten absenden, obwohl sie unvollständig sind?\n\nOK = Daten absenden\nAbbrechen = Daten korrigieren.');
//	}
	
	if (bLetsSubmit) {
		eval(dform.submit());
	}
	return bLetsSubmit;
}


function setFocus(aFieldName) {
	eval('dform.' + aFieldName).focus();
}

function getType(aFieldType, iField) {
	var pTemp = new String(aFieldType[iField]);
	var iType = -1;
	if (pTemp.indexOf('non') == 0) {
		iType = 0;
	}
	if (pTemp.indexOf('dat') == 0) {
		iType = 1;
	}
	if (pTemp.indexOf('num') == 0) {
		iType = 2;
	}
	if (pTemp.indexOf('tim') == 0) {
		iType = 3;
	}
	if (pTemp.indexOf('txt') == 0) {
		iType = 4;
	}
	return iType;
}

