/* formcheck library
*/


/**
 * Funktion JumpAtSpecificValueLength
 *
 * Die Funktion setzt den Focus auf das Feld oToInput, wenn im Feld oFromInput
 * iValueLength Zeichen und als letztes Zeichen eine Ziffer eingegeben wurden. Der IF-Block
 * mit den keyCode-Abfragen wird benötigt, um ein Wechseln mit TAB bzw. SHIFT+TAB
 * zu ermöglichen, sofern bereits iValueLength Ziffern eingetragen sind.
 * 
 * <code>
 * 
 * <input ... id="FromInput" onKeyUp="JumpAtSpecificValueLength(this, 'ToInput', 5, oEvent);" ...>
 * <input ... id="ToInput">
 *
 * </code>
 *
 * Key-Codes:
 *	
 * 48  = 0 (normale Tastatur)
 * 57  = 9 (normale Tastatur)
 * 96  = 0 (Num-Block)
 * 105 = 9 (Num-Block)
 * 
 * @param object oFromInput ist das Feld, in dem die Zeichen gezählt werden
 * @param string sToInput ist das Feld, in das gesprungen werden soll
 * @param integer iValueLength ist die Anzahl der Zeichen, nach der gesprungen werden soll
 * @param object oEvent wird benötigt, um die Funktion Mozilla-Browser-kompatibel zu machen
 */
function JumpAtSpecificValueLength(oFromInput, sToInput, iValueLength, oEvent)
{
	oEvent   = oEvent || window.event;
	oToInput = window.document.getElementById(sToInput);
	
    if ((oEvent.keyCode >= 48 && oEvent.keyCode <= 57) || (oEvent.keyCode >= 96 && oEvent.keyCode <= 105))
	{
    	if (oFromInput.value.length >= 5)
		{
		    oToInput.focus();
    	}
	}
}



/*
    Funktion überprüft übergebenes Feld auf genaue Anzahl eingegebener Zeichen.
	Feld darf nur vom Typ "text" oder eine <textarea></textarea> sein
	
	Aufruf durch <input type="text"... onChange="AccurateLength(this, 6, 'e');" ...>
*/
function AccurateLength(oElement, iAccurateLength, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	if(oElement.value.length < iAccurateLength || oElement.value.length > iAccurateLength) {
		switch(sLanguage) {
			case 'e':
				sMessage = 'You have to enter exactly ' + iAccurateLength + ' characters.';
				break;
			case 's':
				sMessage = 'No puede introducir más de ' + iAccurateLength + ' signos.';
				break;
			case 'd':
			default:
				sMessage = 'Sie müssen genau ' + iAccurateLength + ' Zeichen eingeben.';
				break;
		}

		alert(sMessage);
		oElement.focus();
		return false;
    }
}


function formcheck_accuratelength(ofrm, sAccurateLengthField, sAccurateLengthName, iAccurateLengthNumber){
//alert(sAccurateLengthField + ': ' + typeof(sAccurateLengthField) + '\n' + sAccurateLengthName + ': ' + typeof(sAccurateLengthName) + '\n' + iAccurateLengthNumber + ': ' + typeof(iAccurateLengthNumber));
	iAccurateLengthNumber = Number(iAccurateLengthNumber);
//alert(sAccurateLengthField + ': ' + typeof(sAccurateLengthField) + '\n' + sAccurateLengthName + ': ' + typeof(sAccurateLengthName) + '\n' + iAccurateLengthNumber + ': ' + typeof(iAccurateLengthNumber));
//  if(ofrm.elements[sAccurateLengthField].value.length < iAccurateLengthNumber || ofrm.elements[sAccurateLengthField].value.length > iAccurateLengthNumber) {
    if(window.document.getElementById(sAccurateLengthField).value.length < iAccurateLengthNumber || window.document.getElementById(sAccurateLengthField).value.length > iAccurateLengthNumber) {
		return ((sAccurateLengthName == "") ? string_beautify_1st(sAccurateLengthField) : sAccurateLengthName)+ "\n"
	} else {
		return ""
	}
}



function formcheck_accuratelength_array(ofrm, aAccurateLengthField, aAccurateLengthName, aAccurateLengthNumbers, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';
	
	var sMissingFields = "";
    switch(sLanguage) {
		case 'e':
			sMissingFieldsLabel = "The following fields have not been completed:";
			break;
		case 's':
			sMissingFieldsLabel = "Las siguientes casillas no fueron rellenadas:";
			break;
		case 'd':
		default:
			sMissingFieldsLabel = "Folgende Felder wurden nicht vollständig ausgefüllt:";
			break;
	}
    for (var i=0; i <= aAccurateLengthField.length-1; i++)
		sMissingFields += formcheck_accuratelength(ofrm, aAccurateLengthField[i], aAccurateLengthName[i], aAccurateLengthNumbers[i])
	if (sMissingFields != "")
		sMissingFields = sMissingFieldsLabel + "\n\n" + sMissingFields + "\n"
	return sMissingFields
}



function ValueLength(sId, iValueLength, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

    sValue = window.document.getElementById(sId).value;
//	window.document.getElementById(sId).maxlength = window.document.getElementById(sId).maxlength + 1;
//	window.document.getElementById(sId).removeAttribute('maxlength');
	switch(sLanguage) {
		case 'e':
		    sMessage = 'You may not enter more than ' + iValueLength + ' characters.';
			break;
		case 's':
		    sMessage = 'No puede introducir más de ' + iValueLength + ' signos.';
			break;
		case 'd':
		default:
		    sMessage = 'Sie können nicht mehr als ' + iValueLength + ' Zeichen eingeben.';
			break;
	}
	if(sValue.length > iValueLength) {
		alert(sMessage);
		window.document.getElementById(sId).value = sValue.substr(0, iValueLength);
		window.document.getElementById(sId).focus();
	}
}



function ValueCheck(sId, iMode, aAllowedCharacters, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	// Funtioniert nur bei <input type="text"> oder <textarea></textarea>
	// iMode = dieser Zeichentyp darf nicht vorkommen;
	//     iMode = 'd' (Digits -> Zahlen) || iMode = 'l' (Letters -> Buchstaben)
    sValue = window.document.getElementById(sId).value;

    switch (iMode) {
        case 'l':
		    iPosOfMatch = sValue.search(/\D/gi);
		    switch(sLanguage) {
				case 'e':
				    sMessage = 'Digits';
					break;
				case 's':
				    sMessage = 'cifras';
					break;
				case 'd':
				default:
				    sMessage = 'Ziffern';
					break;
			}
			break;
        case 'd':
		    iPosOfMatch = sValue.search(/\d/gi);
		    switch(sLanguage) {
				case 'e':
				    sMessage = 'Letters';
					break;
				case 's':
				    sMessage = 'letras';
					break;
				case 'd':
				default:
				    sMessage = 'Buchstaben';
					break;
			}
		    break;
		default:
		    break;
	}
	
/*	for(iCounter1 = 0; iCounter1 < aAllowedCharacters.length; iCounter1++) {
		for(iCounter2 = 0; iCounter2 < sValue.length; iCounter2++) {
			bCharacterAllowed = (sValue.substr(iCounter2, 1) == aAllowedCharacters[iCounter1]) ? true : false;
			alert('|' + sValue.substr(iCounter2, 1) + '| : |' + aAllowedCharacters[iCounter1] + '| : |' + bCharacterAllowed + '|');
		}
	}*/

/*    if(sMessage && iPosOfMatch != -1 && bCharacterAllowed != true) {*/
    if(sMessage && iPosOfMatch != -1) {
		switch(sLanguage) {
			case 'e':
				sMessage = 'Please enter only ' + sMessage + ' here.';
				break;
			case 's':
			    sMessage = 'Por favor, aquí introducir sólo ' + sMessage + '.';
				break;
			case 'd':
			default:
				sMessage = 'Bitte geben Sie hier nur ' + sMessage + ' ein.';
				break;
		}
		alert(sMessage);
    	window.document.getElementById(sId).value = sValue.substr(0, iPosOfMatch);
	}
}




//010711 selected -1 - bei  selectboxen mit eingestellter size; deshalb <= 0
function formcheck_selected(ofrm, sFieldName, sShowName){
	var iUnselected
	if (ofrm.elements[sFieldName].size > 0)
		iUnselected = -1
	else
		iUnselected = 0
	if 	(ofrm.elements[sFieldName].selectedIndex <= iUnselected)
		return ((sShowName == "") ? string_beautify_1st(sFieldName) : sShowName)+ "\n"
	else
		return ""
}

function formcheck_selected_array(ofrm, aFieldName, aShowName, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	var sMissingFields = ""
	for (var i=0; i <= aFieldName.length-1; i++)
		sMissingFields += formcheck_selected(ofrm,aFieldName[i], aShowName[i])
	if (sMissingFields != "") {
		switch(sLanguage) {
			case 'e':
				sMessage = 'The following lists have not been selected:';
				break;
			case 's':
				sMessage = 'Las siguientes listas no fueron seleccionadas:';
				break;
			case 'd':
			default:
				sMessage = 'Folgende Listen wurden nicht ausgewählt:';
				break;
		}
		sMissingFields = sMessage + "\n\n" + sMissingFields + "\n";
	}
	return sMissingFields
}

function formcheck_must(ofrm, sFieldName, sShowName){
	if 	(ofrm.elements[sFieldName].value == "")
		return ((sShowName == "") ? string_beautify_1st(sFieldName) : sShowName)+ "\n"
	else
		return ""
}

function formcheck_must_array(ofrm, aFieldName, aShowName, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	var sMissingFields = "";
    switch(sLanguage) {
		case 'e':
			sMissingFieldsLabel = "The following fields have not been completed:";
			break;
		case 's':
			sMissingFieldsLabel = "Las siguientes casillas no fueron rellenadas:";
			break;
		case 'd':
		default:
			sMissingFieldsLabel = "Folgende Felder wurden nicht ausgefüllt:";
			break;
	}
    for (var i=0; i <= aFieldName.length-1; i++)
		sMissingFields += formcheck_must(ofrm,aFieldName[i], aShowName[i])
	if (sMissingFields != "")
		sMissingFields = sMissingFieldsLabel + "\n\n" + sMissingFields + "\n"
	return sMissingFields
}



/**
 * Funktion formcheck_radio
 *
 * Prüft, ob ein Button einer Gruppe von Radio-Buttons ausgewählt wurde
 *
 * @param oFrm			object		oFrm ist das Formular-Objekt, das die Radio-Button-Gruppe enthält
 * @param sFieldName	string		der Name der Radio-Buttons, die geprüft werden sollen
 * @param sShowName		string		Zeichenkette, die als Fehlermeldung zurückgegeben werden soll
 *
 * @return 				string		Zeichenkette, die als Fehlermeldung zurückgegeben wird
 *
 */
function formcheck_radio(oFrm, sFieldName, sShowName)
{
	for (iCounter2 = 0; iCounter2 < oFrm.elements[sFieldName].length; iCounter2++)
	{
		if (true == oFrm.elements[sFieldName][iCounter2].checked)
		{
			return '';
		}
	}

	return ((sShowName == '') ? string_beautify_1st(sFieldName) : sShowName) + '\n';
}



/**
 * Funktion formcheck_radio_array
 *
 * Prüft, löst für eine oder mehrere Gruppen von Radio-Buttons die Funktion formcheck_radio
 * aus und gibt entsprechende Fehlermeldungen zurück
 *
 * @param oFrm			object		oFrm ist das Formular-Objekt, das die Radio-Button-Gruppe enthält
 * @param aFieldName	array		Array mit Namen der Radio-Button-Gruppen, die geprüft werden sollen
 * @param aShowName		array		Array mit Zeichenkette der Radio-Button-Gruppen, die als Fehlermeldung zurückgegeben werden soll
 *
 * @return 				string		Zeichenkette, die als Fehlermeldung zurückgegeben wird
 *
 */
function formcheck_radio_array(ofrm, aFieldName, aShowName, sLanguage)
{
	sLanguage = sLanguage || gsLanguage || 'd';

	var sMissingFields = '';
	
    for (var iCounter1 = 0; iCounter1 < aFieldName.length; iCounter1++)
	{
		sMissingFields += formcheck_radio(ofrm, aFieldName[iCounter1], aShowName[iCounter1]);
	}

    if (sMissingFields != "")
	{
		switch(sLanguage)
		{
			case 'e':
				sMessage = '';
				break;
			case 's':
				sMessage = '';
				break;
			case 'd':
			default:
				sMessage = 'Bitte wählen Sie aus:';
				break;
		}

        sMissingFields = sMessage + "\n\n" + sMissingFields + "\n";
	}

    return sMissingFields;
}



function formcheck_not_equal(ofrm, sProperty, aFieldName, aShowName, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	var sEqualFields = ""
	var aEqual = new Array()
	for (var i=0; i < aFieldName.length-1; i++){
		for (var i2=i+1; i2 < aFieldName.length; i2++){
			//if ( (ofrm.elements[aFieldName[i]].value).toString() == (ofrm.elements[aFieldName[i2]].value).toString() )
			if ( eval("(ofrm.elements[aFieldName[i]]."+sProperty+").toString() == (ofrm.elements[aFieldName[i2]]."+sProperty+").toString()") )
			{
				array_push_once(aEqual, string_beautify_1st(aShowName[i]))
				array_push_once(aEqual, string_beautify_1st(aShowName[i2]))
			}
		}
	}
	if (aEqual.length) {
		switch(sLanguage) {
			case 'e':
				sMessage = "The following fields should not be identical:";
				break;
			case 's':
				sMessage = "Las siguientes casillas no pueden ser iguales:";
				break;
			case 'd':
			default:
				sMessage = "Folgende Felder dürfen nicht gleich sein:";
				break;
		}
		sEqualFields = sMessage + "\n\n" + aEqual.join("\n")+"\n\n"
	}
	return sEqualFields
}

function formcheck_email(ofrm, sFieldName, sShowName){
	if ( ofrm.elements[sFieldName].value != "" ) 
		if ( (ofrm.elements[sFieldName].value).indexOf("@") == -1 || (ofrm.elements[sFieldName].value).indexOf(".") == -1)
			return ((sShowName == "") ? string_beautify_1st(sFieldName) : sShowName)+ "\n"
	return ""
}

function formcheck_email_array(ofrm, aFieldName, aShowName, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	var sWrongEmail = ""
	for (var i=0; i <= aFieldName.length-1; i++)
		sWrongEmail += formcheck_email(ofrm, aFieldName[i], aShowName[i])
	if (sWrongEmail != "") {
		switch(sLanguage) {
			case 'e':
				sMessage = "The following fields contain invalid Email addresses:";
				break;
			case 's':
				sMessage = "Las siguientes casillas contienen direcciones de E-Mail inválidas:";
				break;
			case 'd':
			default:
				sMessage = "Folgende Felder enthalten ungültige E-Mail-Adressen:";
				break;
		}
		sWrongEmail = sMessage + "\n\n" + sWrongEmail + "\n\n"
	}
	return sWrongEmail
}

function formcheck_date(ofrm, sFieldName, sShowName){
	var iYear = 0, iMonth = 0 , iDay = 0, iHour = 0, iMinute = 0, iSecond =0
	var sValue = ""
	var bOK = true;
	// Valid Format: 2000-06-31*12:50:59 
	//				 1234-67-90-23-56-89
	sValue = ofrm.elements[sFieldName].value
	if ( sValue != "" ){
		iYear =		0 + sValue.substr(1,4)
		iMonth =	0 + sValue.substr(6,2)
		iDay =		0 + sValue.substr(9,2)
		if ( iMonth > 12 ) bOK = false;
		if ( iDay > 31 ) bOK = false;
		if ( sValue.length > 11 ){
			iHour =		0 + sValue.substr(12,2)
			iMinute =	0 + sValue.substr(15,2)
			iSecond =	0 + sValue.substr(18,2)
			if ( iHour > 24 ) bOK = false;
			if ( iMinute > 60 ) bOK = false;
			if ( iSecond > 60 ) bOK = false;
		}
		return ((sShowName == "") ? string_beautify_1st(sFieldName) : sShowName)+ "\n"
	}
	return ""
}

function formcheck_all_except(ofrm, aExcept){
	var sMissingFields = ""
	for (var oField in ofrm){
		if (oField.type == "text" || oField.type == "textarea" || oField.type == "password" )
			sMissingFields += formcheck_must(ofrm, oField.name, oField.name)
	}
	return sMissingFields
}

function formcheck_number(ofrm, sFieldName, sShowName, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	var sVal = "" + ofrm.elements[sFieldName].value
	var sDigits = "0123456789"
	for (var i=0; i<sVal.length; i++)
		if (sDigits.indexOf(sVal.charAt(i)) == -1 ) {
		switch(sLanguage) {
			case 'e':
				sMessage = "The following fields contain invalid Email addresses:";
				break;
			case 's':
				sMessage = "Las siguientes casillas contienen direcciones de E-Mail inválidas:";
				break;
			case 'd':
			default:
				sMessage = "Folgende Felder enthalten ungültige Email-Adressen:";
				break;
		}
			return sMessage + " " + ((sShowName == "") ? string_beautify_1st(sFieldName) : sShowName)+ "\n"
		}
	return ""
}
function formcheck_length(ofrm, iLength, sFieldName, sShowName, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	if 	((""+ofrm.elements[sFieldName].value).length > iLength) {
		switch(sLanguage) {
			case 'e':
				sMessage = "Field content too long";
				break;
			case 's':
				sMessage = "El contenido de la casilla es demasiado largo";
				break;
			case 'd':
			default:
				sMessage = "Feldinhalt zu lang";
				break;
		}
		return sMessage + " (" + iLength + "): " + ((sShowName == "") ? string_beautify_1st(sFieldName) : sShowName)+ "\n"
	}
	else
		return ""
}

//011023 Fileextensioon von Uploadfeldern prüfen
function formcheck_filename(ofrm, sFieldName, sShowName, aExtension, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	var bValid=false;
	var sFile = ""+ofrm.elements[sFieldName].value
	for (var i=0; i <= aExtension.length-1; i++)
		if (sFile.substr(sFile.length-3, 3).toUpperCase() == (""+aExtension[i]).toUpperCase())
			bValid=true;
	if (!bValid) {
		switch(sLanguage) {
			case 'e':
				sMessage = "Invalid type of file in field:";
				break;
			case 's':
				sMessage = "Tipo de archivo inválido en la casilla:";
				break;
			case 'd':
			default:
				sMessage = "Ungültiger Dateityp in Feld:";
				break;
		}
		return sMessage + " " + ((sShowName == "") ? string_beautify_1st(sFieldName) : sShowName) + ".\n"
	}
	else
		return ""
}



function formcheck_leave(oFormular, sLanguage) {
	sLanguage = sLanguage || gsLanguage || 'd';

	bMakeAlert       = false;

    switch(sLanguage) {
		case 'e':
		    sMessage = 'You have entered data in this form without sending it!\nWould you wish to discard this data and leave the site?';
			break;
		case 's':
		    sMessage = 'Ha introducido datos en el formulario, sin haber enviado el mismo.\nQuiere desechar la entrada y abandonar la página?';
			break;
		case 'd':
		default:
		    sMessage = 'Sie haben Daten in das Formular eingegeben, ohne dieses abzuschicken!\nMöchten Sie die Eingaben verwerfen und die Seite verlassen?';
			break;
	}

    if(window.document.getElementById(oFormular)) {
		for(iCounter1 = 0; iCounter1 < window.document.getElementById(oFormular).elements.length; iCounter1++) {
			sElements = window.document.getElementById(oFormular).elements[iCounter1];
			switch(sElements.type) {
				case 'text':
				case 'hidden':
				case 'password':
				case 'file':
				case 'textarea':
				    if(sElements.value != sElements.defaultValue) bMakeAlert = true;
					break;
				case 'radio':
				case 'checkbox':
				    if(sElements.checked != sElements.defaultChecked) bMakeAlert = true;
					break;
				case 'select-one':
				case 'select-multiple':
				    for(iCounter2 = 0; iCounter2 < sElements.options.length; iCounter2++) {
						if(sElements.options[iCounter2].selected == true && sElements.options[iCounter2].defaultSelected == false) {
							 bMakeAlert = true;
						}
					}
					break;
				case 'submit':
				case 'reset':
				case 'button':
				default:
				    break;
			}
		}
		if(bMakeAlert == true) {
			event.returnValue = sMessage;
		}
    }
}