/*****************************************************************************************
Formular Validierung
******************************************************************************************
Prüfkriterien:
'R'				Mussfeld ohne Prüfung
'NisNum'		Prüfung auf Zahl
'RisNum'		Mussfeld mit Prüfung auf Zahl
'NisEmail'		Prüfung auf @
'RisEmail'		Mussfeld mit Prüfung auf E-Mail Adresse
'NinRange2:5'	Prüfung auf Zahl zwischen 2 und 5
'RinRange2:5'	Mussfeld mit Prüfung auf Zahl zwischen 2 und 5
'NisDate'		Prüfung auf Datum [tt.mm.jjjj]
'RisDate'		Mussfeld mit Prüfung auf Datum [tt.mm.jjjj]
'NisTime'		Prüfung auf Zeit [hh:mm]
'RisTime'		Mussfeld mit Prüfung auf Zeit [h:m ... hh:mm:ss]
'NisVisaCard'	Prüfung auf gültige Visa-Kartennummer
'RisVisaCard'	Mussfeld mit Prüfung auf gültige Visa-Kartennummer
----------------------------------------------------------------------------------------*/
var v_clsFormFieldError = 'formFieldError';	// Klasse zur Markierung von fehlerhaften Feldern
var v_dtCh = ".";					// Trenner zwischen Tag, Monat und Jahr (Datumsprüfung)
var v_minYear = 1800;				// Minimum Jahr (Datumsprüfung)
var v_maxYear = 3000;				// Maximum Jahr (Datumsprüfung)
var v_attElm = 'nv-for';			// Tag mit Referenz zu parent-Element (Initialisierung)
var v_attElmLabel = 'nv-label';		// Tag mit Feldbezeichnung
var v_attElmFunction = 'nv-function';		// Tag mit Funktionsaufrufen bei onClick auf Radiobutton und Checkboxen
var v_clsFormLabelInakt = 'inakt'; // Klasse zur Markierung von inaktiven Labels
var v_clsFieldInakt = 'formFieldDisabled'; // Klasse zur Markierung von inaktiven Feldern
var v_clsCheckbox = 'checkbox';		// Klasse zur Darstellung von input-Feldern mit dem Typ "radio" und "checkbox"
var v_clsInputText = 'inpText';		// Klasse zur Darstellung von input-Feldern (ausgenommen "radio" und "checkbox")
var v_doReturnKey = true;			// Speichert ob der Fokus auf einem textarea-Feld ist
var v_formCheck;					// Speichert ob nur die Validierung ausgeführt werden soll [true/false]
var v_submitFunction				// Beinhaltet eine Alternativfunktion die anstelle des Submit ausgeführt wird (beim Klick auf Return).
var v_nameSubmitFields = 'field_to_mail_';		// Stammname der Felder welche die zu übermittelnden Felder beinhalten
var v_maxSubmitFields = 5;			// Maximale Anzahl der Felder welche die zu übermittelnden Felder beinhalten
var v_nameSubmitFieldsLabel = 'field_to_mail_label_';	// Stammname der Felder welche die zu übermittelnden Feldbezeichnungen beinhalten

function MM_validateForm(args) { // Eigene erweiterte Version
	var i,p,q,nm,test,num,min,max,errors='',args=args.split(',');
	for (i=0; i<(args.length-2); i+=3){
		test=args[i+2];
		v_objField = val = MM_findObj(args[i]);
		
		if (v_objField){ // Es werden nur Felder geprüft, welche auch existieren!
			if (!v_objField.readonly || !v_objField.disabled){ // Es werden nur Felder geprüft, welche enabled sind!
				v_objField.className = v_clsInputText; // Zurücksetzen der formFieldError-Klasse
				nm=val.getAttribute(v_attElmLabel);
				nmLabel = '-'+nm+'-';
				if (((val=val.value)!="") && (val.toLowerCase() != nmLabel.toLowerCase())){ // Prüft ob ein Wert vorhanden ist und ob dieser nicht ein Label ist [-Label-]
					if (test.indexOf('isEmail')!=-1){
						p=val.indexOf('@');
						if (p<1 || p==(val.length-1)){
							errors+='- '+String.fromCharCode(171)+nm+String.fromCharCode(187)+' muss eine E-Mail Adresse beinhalten.\n';
							v_objField.className = v_objField.className+' '+v_clsFormFieldError;
						}
					}
					else {
						if (test!='R'){
							if (test.indexOf('isNum')!=-1){
								num = parseFloat(val);
								if (isNaN(val)){
									errors+='- '+String.fromCharCode(171)+nm+String.fromCharCode(187)+' muss eine Zahl beinhalten.\n';
									v_objField.className = v_objField.className+' '+v_clsFormFieldError;
								}
								if (test.indexOf('inRange') != -1){
									p=test.indexOf(':');
									min=test.substring(8,p);
									max=test.substring(p+1);
									if (num<min || max<num){
										errors+='- '+String.fromCharCode(171)+nm+String.fromCharCode(187)+' muss eine Zahl zwischen '+min+' und '+max+'.\n';
										v_objField.className = v_objField.className+' '+v_clsFormFieldError;
									}
								}
							}
							else if(test.indexOf('isDate')!=-1){
								if(!f_isDate(val)){
									errors+='- '+String.fromCharCode(171)+nm+String.fromCharCode(187)+' muss ein g'+String.fromCharCode(252)+'ltiges Datum sein [tt.mm.jjjj].\n';
									v_objField.className = v_objField.className+' '+v_clsFormFieldError;
								}
							}
							else if(test.indexOf('isTime')!=-1){
								if(!f_isTime(val)){
									errors+='- '+String.fromCharCode(171)+nm+String.fromCharCode(187)+' muss eine g'+String.fromCharCode(252)+'ltige Zeitangabe sein z.B. [hh:mm:ss].\n';
									v_objField.className = v_objField.className+' '+v_clsFormFieldError;
								}
							}
							else if(test.indexOf('isMinLength')!=-1){
								v_minLengthIndex = eval(test.substring(12,test.length));
								if(val.length < v_minLengthIndex){
									errors+='- '+String.fromCharCode(171)+nm+String.fromCharCode(187)+' muss mindestens '+v_minLengthIndex+' Zeichen lang sein.\n';
									v_objField.className = v_objField.className+' '+v_clsFormFieldError;
								}
							}
							else if(test.indexOf('isVisaCard')!=-1){
								if (!f_isVisa(val)){
									errors+='- '+String.fromCharCode(171)+nm+String.fromCharCode(187)+' muss eine g'+String.fromCharCode(252)+'ltige Kartennummer beinhalten.\n';
									v_objField.className = v_objField.className+' '+v_clsFormFieldError;
								}
							}
						}
					}
				}
				else if (test.charAt(0) == 'R'){
					errors += '- '+String.fromCharCode(171)+nm+String.fromCharCode(187)+' ist erforderlich.\n';
					v_objField.className = v_objField.className+' '+v_clsFormFieldError;
				}
			}
		}
	}
	if (errors){alert('Folgende Fehler sind aufgetreten:\n'+errors);}
	document.MM_returnValue = (errors == '');
}

/* Start: Kreditkartenprüfung ------------------------------------------------------------------*/
function f_isVisa(cc){
	cc=f_cleanCode(cc);
	if (((cc.length == 16) || (cc.length == 13)) && (cc.substring(0,1) == 4)){
		return isCreditCard(cc);
	}
	else {
		return false;
	}
}
function f_cleanCode(cc){
	for(i=0;i<10;i++){
		cc= cc.replace(/-/, "");
		cc= cc.replace(/ /, "");
	}
	return cc;	
}
function isCreditCard(st){
	// Encoding only works on cards with less than 19 digits
	if (st.length > 19)	{
		return (false);
	}
	sum = 0;
	mul = 1;
	l = st.length;
	for (i = 0; i < l; i++)	{
		digit = st.substring(l-i-1,l-i);
		tproduct = parseInt(digit ,10)*mul;
		if (tproduct >= 10)	{
			sum += (tproduct % 10) + 1;
		}
		else {
			sum += tproduct;
		}
		if (mul == 1){	
			mul++;
		}
		else {
			mul--;
		}
	}
	if ((sum % 10) == 0){
		return (true);
	}
	else {
		return (false);
	}
}
/* Ende: Kreditkartenprüfung ------------------------------------------------------------------*/

/* Start: Datumsprüfung ------------------------------------------------------------------*/
function f_isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}
function f_stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}
function f_daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function f_DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31

		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}
function f_isDate(dtStr){
	var daysInMonth = f_DaysArray(12)
	var pos1=dtStr.indexOf(v_dtCh)
	var pos2=dtStr.indexOf(v_dtCh,pos1+1)
	var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		//alert("The date format should be : mm.dd.yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		//alert("Please enter a valid month")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>f_daysInFebruary(year)) || day > daysInMonth[month]){
		//alert("Please enter a valid day")
		return false
	}
	if (strYear.length != 4 || year==0 || year<v_minYear || year>v_maxYear){
		//alert("Please enter a valid 4 digit year between "+v_minYear+" and "+v_maxYear)
		return false
	}
	if (dtStr.indexOf(v_dtCh,pos2+1)!=-1 || f_isInteger(f_stripCharsInBag(dtStr, v_dtCh))==false){
		//alert("Please enter a valid date")
		return false
	}
return true
}

function f_isTime(dtStr)//valid: h:m ... hh:mm:ss
{
	if (dtStr.length<3 || dtStr.length>8) return false;
	var chars = new Array(dtStr.length);
	for(i=0;i<dtStr.length;i++){
		chars[i]=dtStr.substr(i,1);
	}
	i=0
	//Check Std: '9:' oder '23:'
	if(chars[i+1]==':'){
		if (((chars[i] < "0") || (chars[i] > "9"))) return false;
		i=i+2
	}else{
		if (((chars[i] < "0") || (chars[i] > "2"))) return false;
		if(chars[i] == "2"){if (((chars[i+1] < "0") || (chars[i+1] > "3"))) return false;}
		else{if (((chars[i+1] < "0") || (chars[i+1] > "9"))) return false;}
		i=i+3
	}
	//Check Min ':9' oder ':59'
	if(dtStr.length<=i) return false;
	if(chars[i-1]!=':') return false;
	if(dtStr.length==i+1){
		if (((chars[i] < "0") || (chars[i] > "9"))) return false;
		return true;
	}
	if(chars[i+1]==':')
	{	
		if (((chars[i] < "0") || (chars[i] > "9"))) return false;
		i=i+2
	}
	else
	{
		if (((chars[i] < "0") || (chars[i] > "5"))) return false;	
		if (((chars[i+1] < "0") || (chars[i+1] > "9"))) return false;	
		if(dtStr.length==i+2) return true;
		i=i+3
	}
	//Check Sec ':9' oder ':59'
	if(dtStr.length<=i) return false;
	if(chars[i-1]!=':') return false;
	if(dtStr.length==i+1){
		if (((chars[i] < "0") || (chars[i] > "9"))) return false;
		return true;
	}else{
		if (((chars[i] < "0") || (chars[i] > "5"))) return false;	
		if (((chars[i+1] < "0") || (chars[i+1] > "9"))) return false;	
		if(dtStr.length==i+2) return true;
		i=i+3
	}
	//kein check auf hundertstel
	return false;
}
/* Ende: Datumsprüfung ------------------------------------------------------------------*/

/*****************************************************************************************
Aktivieren und inaktivieren von Formularelementen
******************************************************************************************
Über die Funktion "f_initFormElm()", welche über die onload-Funktion aufgerufen wird, werden
die Formularelemente (input, textarea, select, label) der Seite initialisiert.

Input-Felder der Typen "radio" und "checkbox" lösen mittels der Funktion "f_setFormElmStatus" eine Statusüberprüfung aus.

Radiobutton, Checkboxen und Selectboxen werden auf disabled gesetzt. Textfelder und Textbereiche auf readonly damit darin gescrollt werden kann.

Definition der Variablen (müssen nicht gesetzt werden):
v_attElm			= Eigene Attributbezeichnung welche auf das parent-Element verweist. Alle eigenen Attribute beginnen mit "nv-" für Netview.
v_clsFormLabelInakt	= Inaktiv Klasse der Labels
----------------------------------------------------------------------------------------*/

var v_arrInput;
var v_arrTextarea;
var v_arrSelect;
var v_arrTagElm;
var v_arrForm;
var v_arrLabel;

function f_initFormElm(v_getFocus,v_getFormCheck,v_getSubmitFunction){
	if (typeof(bw)!='undefined'){
		// Die Kombination von getElementsByTagName-Collections mit concat() funktioniert nicht!
		v_arrInput = document.getElementsByTagName('input');
		v_arrTextarea = document.getElementsByTagName('textarea');
		v_arrSelect = document.getElementsByTagName('select');
		v_arrTagElm = new Array(v_arrInput,v_arrTextarea,v_arrSelect);
		v_arrForm = document.getElementsByTagName('form');
	
		v_arrLabel = document.getElementsByTagName('label');
		
		v_formCheck = v_getFormCheck;
		v_submitFunction = v_getSubmitFunction;
		
		for (i=0;i < v_arrInput.length;i++){
			if ((v_arrInput[i].type == 'radio') || (v_arrInput[i].type == 'checkbox')){
				v_arrInput[i].className = v_clsCheckbox;
				v_arrInput[i].getAttribute(v_attElmFunction);
				v_arrInput[i].onclick = function (){f_radioCheckboxOnClick(this.getAttribute(v_attElmFunction))}
			}
			else if (v_arrInput[i].type != 'hidden'){v_arrInput[i].className = v_clsInputText;}
			if ((v_arrInput[i].type == 'text') && (v_arrInput[i].value == '-'+v_arrInput[i].getAttribute(v_attElmLabel)+'-')){
				v_arrInput[i].onclick = f_clearField;
				v_arrInput[i].onblur = f_writeLabel;
			}
			if (bw.firefox){v_arrInput[i].setAttribute('autocomplete','OFF');} // Firefox erzeugt ansonsten einen Fehler bei ausführen der Funktion "f_clearField" und beim drücken der Return-Taste
		}
		for (i=0;i < v_arrTextarea.length;i++){
			if ((v_arrTextarea[i].value == '-'+v_arrTextarea[i].getAttribute(v_attElmLabel)+'-')){
				//v_arrTextarea[i].setAttribute('autocomplete','OFF'); // Firefox erzeugt ansonsten einen Fehler bei ausführen der Funktion "f_clearField"
				v_arrTextarea[i].onclick = f_clearField;
				v_arrTextarea[i].onblur = f_writeLabel;
			}
			v_arrTextarea[i].onfocus = function (){v_doReturnKey = false;};
			v_arrTextarea[i].onblur = function (){v_doReturnKey = true;}
		}
		for (i=0;i < v_arrSelect.length;i++){
			v_arrSelect[i].onfocus = function (){v_doReturnKey = false;};
			v_arrSelect[i].onblur = function (){v_doReturnKey = true;}
		}
		f_setFormElmStatus();
		if (document.getElementById(v_getFocus)){document.getElementById(v_getFocus).focus();} // Weist beim Laden der Seite einem Feld den Fokus zu
		
		f_writeInpFieldsLabel('init'); // Zu übermittelnde Feldbezeichnungen (nv-label) in neues hidden-Feld schreiben
	}
}
function f_writeInpFieldsLabel(v_formNr){
	// Zu übermittelnde Feldbezeichnungen (nv-label) in neues hidden-Feld schreiben
	// Gross-/Kleinschreibung wird bei Feldbezeichnungen (Namen) unterschieden!
	// Beim Zurücksetzen eines Formulars auf IE müssen dynamisch gesetzte hidden-Felder wieder geschrieben werden - falls diese noch Gültigkeit haben.
	
	v_index = (v_formNr == 'init')?0:v_formNr;
	v_reset = (v_formNr != 'init')?true:false;		// Wird ein Formular zurückgesetzt
	
	for (i=v_index;i < v_arrForm.length;i++){
		for (k=1;k <= v_maxSubmitFields;k++){
			if (v_arrForm[i].elements[v_nameSubmitFields+k]){
				v_labelFieldValue = '';
				v_arrFields = v_arrForm[i].elements[v_nameSubmitFields+k].value.split(';');
				for (l=0;l < v_arrFields.length;l++){
					if (v_arrForm[i].elements[v_arrFields[l]]){
						if (v_arrForm[i].elements[v_arrFields[l]][0]){ // Für Radiobuttons / Selectboxen
							if (v_arrForm[i].elements[v_arrFields[l]][0].type == 'radio'){ // Für Radiobuttons
								v_formElm = v_arrForm[i].elements[v_arrFields[l]][0];
							}
							else { // Für Selectboxen
								v_formElm = v_arrForm[i].elements[v_arrFields[l]];
							}
						}
						else {
							v_formElm = v_arrForm[i].elements[v_arrFields[l]];
						}
						if (v_formElm.getAttribute('nv-label')){
							v_labelFieldValue += v_formElm.getAttribute('nv-label')+';';
						}
						else {
							v_labelFieldValue += v_formElm.name+';';
						}
					}
					else {alert('Das Feld "'+v_arrFields[l]+'" existiert im Formular "'+i+'" nicht.');v_labelFieldValue = ''; break;}
				}
				if (v_arrForm[i].elements[v_nameSubmitFieldsLabel+k]){
					v_arrForm[i].elements[v_nameSubmitFieldsLabel+k].value = v_labelFieldValue;
				}
			}
		}
		if (v_reset){break}
	}	
}
function f_radioCheckboxOnClick(v_function){
	f_setFormElmStatus();
	eval(v_function);
}
function f_clearField(){
	nm=this.getAttribute(v_attElmLabel);
	nmLabel = '-'+nm+'-';
	if ((this.value.toLowerCase() == nmLabel.toLowerCase()) && (this.readOnly != true)){
		this.value = '';
	}
}
function f_writeLabel(){
	nm=this.getAttribute(v_attElmLabel);
	nmLabel = '-'+nm+'-';
	if ((this.value == '') && (this.readOnly != true)){
		this.value = nmLabel;
	}
}
function f_submitForm(indexForm,formCheck,submitFunction){
	if (indexForm == 0){ // Setzt die Werte beim ersten Formular (inkl. Return-Taste)
		v_formCheck = (formCheck)?formCheck:v_formCheck;
		v_submitFunction = (submitFunction)?submitFunction:v_submitFunction;
	}
	else {
		v_formCheck = formCheck;
		v_submitFunction = submitFunction;
	}
	if (document.forms[indexForm].elements['validate']){
		MM_validateForm(document.forms[indexForm].elements['validate'].value);
	}
	else {document.MM_returnValue = true} // Ohne Prüfung weil input-Feld "validate" nicht vorhanden ist
	if (document.MM_returnValue && !v_formCheck && v_submitFunction){eval(v_submitFunction);}
	else if (document.MM_returnValue && !v_formCheck){document.forms[indexForm].submit();}
	else if (v_formCheck){return document.MM_returnValue;}
}
function f_onSubmit(){
	v_onSubmit = !v_formCheck && document.MM_returnValue;
	return v_onSubmit;
}
function f_resetForm(indexForm){
	document.forms[indexForm].reset();
	f_setFormElmStatus('fromReset');
	f_writeInpFieldsLabel(indexForm);
}
function f_setFormElmStatus(){ // Setzen von aktiv und inaktiv von Label und Feldern
	args = f_setFormElmStatus.arguments;
	for (i=0;i < v_arrTagElm.length;i++){
		for (k=0;k < v_arrTagElm[i].length;k++){
			if ((v_arrTagElm[i][k].className.indexOf(v_clsFormFieldError) > -1) && (args[0]=='fromReset')){ // Setzt die formFieldError-Klasse der Felder zurück
				v_arrTagElm[i][k].className = v_clsInputText;
			}
			if (v_arrTagElm[i][k].getAttribute(v_attElm)){ // Elternelement vorhanden
				v_attValue = v_arrTagElm[i][k].getAttribute(v_attElm);
				v_parentElm = document.getElementById(v_attValue);
				if ((v_parentElm.checked == true) && (v_parentElm.disabled == false)){
					if (v_arrTagElm[i][k].type == 'select-one'){
						v_arrTagElm[i][k].disabled = false;
						v_arrTagElm[i][k].className = '';
					}
					else if ((v_arrTagElm[i][k].type != 'radio') && (v_arrTagElm[i][k].type != 'checkbox')){
						v_arrTagElm[i][k].readOnly = false;
						v_arrTagElm[i][k].className = v_clsInputText;
					}
					else {v_arrTagElm[i][k].disabled = false;}
				}
				else {
					if (v_arrTagElm[i][k].type == 'select-one'){
						v_arrTagElm[i][k].disabled = true;
						v_arrTagElm[i][k].className = v_clsFieldInakt;
					}
					else if ((v_arrTagElm[i][k].type != 'radio') && (v_arrTagElm[i][k].type != 'checkbox')){
						v_arrTagElm[i][k].readOnly = true;
						v_arrTagElm[i][k].className = v_clsInputText+' '+v_clsFieldInakt;
					}
					else {v_arrTagElm[i][k].disabled = true;}
				}
			}
		}
	}
	for (i=0;i < v_arrLabel.length;i++){ // Setzen der Label
		if ((document.getElementById(v_arrLabel[i].htmlFor).disabled == true) ||
			(document.getElementById(v_arrLabel[i].htmlFor).readOnly == true)){
			v_arrLabel[i].className = v_clsFormLabelInakt;
		}
		else {
			v_arrLabel[i].className = '';
		}
	}
}

/*****************************************************************************************
Klick auf Return-Taste übermittelt das Formular (nur wenn eines vorhanden)
******************************************************************************************/

document.onkeydown = function (e){
	if(typeof(v_arrForm) !='undefined') 
	{
						if ((v_arrForm.length == 1) && (v_doReturnKey == true)){
							v_keyCode = (window.event)?window.event.keyCode:(bw.safari)?0:e.keyCode;
							if (v_keyCode == 13){
									f_submitForm(0);
							}
						}
					}
				}