// G16_Formvalidierung Anfang

//
// ACHTUNG: da hier der ContentType auf "application/javascript" gesetzt wird, greift das Caching des nginx! Purgen nicht vergessen! 
//			Oder in der G16_Javascript.html den Parameter aktualisieren, dadurch wird auch das clientseitige Caching aktualisiert.
//




	
	var validation = false;	
	var doValidatePassword = false;
	var doValidateEmail = false;
	var passedDoubleEmailCheck = null;
	var errors = 0;			
	var keepPosition = false;			
	
	var formValidate = {
		"fa-taxNumber1" : /^(?!\s*$).+/,
		"vatid2" : /^(?!\s*$).+/,
		"customerid" : /^[0-9]{1,10}$/,
		"title" : /^(?!\s*$).+/,
		"del_title" : /^(?!\s*$).+/,
		"target" : /^(?!\s*$).+/,
		"text" : /^(?!\s*$).+/,
		"company" :  /^(?!\s*$).+/,
		"del_company" : /^(?!\s*$).+/,
		"Firma" : /^(?!\s*$).+/,
		"companyaddon" : /^(?!\s*$).+/,
		"del_companyaddon" : /^(?!\s*$).+/,
		"Ansprechpartner" : /^(?!\s*$).+/,
		"salutation" : /^(?!\s*$).+/,
		"del_salutation" : /^(?!\s*$).+/,
		
		"firstname" : /^(?!\s*$).+/,		
		"del_firstname" : /^(?!\s*$).+/,		
		"lastname" : /^(?!\s*$).+/,
		"del_lastname" : /^(?!\s*$).+/,
		
		"street" : /^(?!\s*$).+/,
		"del_street" : /^(?!\s*$).+/,
		"Strasse" : /^(?!\s*$).+/,
		
		"housenumber" : /^(?!\s*$).+/,
		"del_housenumber" : /^(?!\s*$).+/,
		"postbox" : /^(?!\s*$).+/,
		"del_postbox" : /^(?!\s*$).+/,
		"Postfach" : /^(?!\s*$).+/,
		
		
				"fa-taxNumber1" : /^.+$/,
				"zip" : /^[0-9]{2}[-]{1}[0-9]{3}$/,
				"del_zip" : /^[0-9]{2}[-]{1}[0-9]{3}$/,
				"contact_zip" : /^[0-9]{2}[-]{1}[0-9]{3}$/,
				"Plz" : /^[0-9]{2}[-]{1}[0-9]{3}$/,
			
		
		
		
		"city" : /^(?!\s*$).+/,
		"del_city" : /^(?!\s*$).+/,
		"Stadt" : /^(?!\s*$).+/,
		"countrycode" : /^(?!\s*$).+/,
		"del_countrycode" : /^(?!\s*$).+/,
		"phone" : /^[0-9 /)(+-]+$/,
		"del_phone" : /^[0-9 /)(+-]+$/,
		"Telefonnummer" : /^[0-9 /-]+$/,
		"fax" : /^[0-9 /)(+-]+$/,
		"del_fax" : /^[0-9 /)(+-]+$/,
		"login" : /^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~-äöüÄÖÜß]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,	
		"email" : /^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~-äöüÄÖÜß]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,
		"emailRep" : /^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~-äöüÄÖÜß]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,
		"email" : /^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~-äöüÄÖÜß]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,
		"fa-invoiceDigitalAddress" : /^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~-äöüÄÖÜß]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,

        "password" : /^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[,;:!$%&#?*+._@=/-].*)^[a-zA-Z0-9,;:!$%&#?*+._@=/-]{8,64}$/,
		"passwordRep" : /^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[,;:!$%&#?*+._@=/-].*)^[a-zA-Z0-9,;:!$%&#?*+._@=/-]{8,64}$/,
		"passwordold" : /^(?!\s*$).+/,
		"Kundennummer" : /^(?!\s*$).+/,
		"fa-industry" : /^(?!\s*$).+/,
		"fa-headcountProduct" : /^[0-9]{1,6}$/,
		"fa-salesName" : /^(?!\s*$).+/,
		"acceptagb" : true,
		"datasafety" : true,
		"author" : /^(?!\s*$).+/,
		"amount" : /\d/,
		"Menge_1" : /(^$)|(^\d+$)/,
		"Menge_2" : /(^$)|(^\d+$)/,
		"Menge_3" : /(^$)|(^\d+$)/,
		"Menge_4" : /(^$)|(^\d+$)/,
		"Menge_5" : /(^$)|(^\d+$)/,
		"Menge_6" : /(^$)|(^\d+$)/,
		"Menge_7" : /(^$)|(^\d+$)/,
		"prodid" : /^[0-9 /-]+$/,
		"del_title_override" : /^(?!\s*$).+/,
		
		"costcenter" : /^(?!\s*$).+/,
		"subcostcenter" : /^(?!\s*$).+/,
		"birthday" : /([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/,
		
		job : /^(?!\s*$).+/,
		"del_job" : /^(?!\s*$).+/,
		
		"fa-documentData" : "",
	};

	
	//Validierung des Inhaltes pro Feld
	function checkField(_field, _expr) {
    	var field = _field;
    	var fieldParent = field.parentNode;
    	if (field.disabled) {
    		return true;
    	}
		
		if (field.type == "checkbox") {
			if (field.checked != _expr) {
				fieldParent.style.color = "#fb5252";
				if(fieldParent.className.indexOf('not-correct') !== -1){
					fieldParent.className = fieldParent.className + " not-correct";
				}
			} else {
				fieldParent.setAttribute("style","");
			}
			return field.checked == _expr;
		} else if (field.type == "file") {
			if(field.files.length == 0) {
				if(fieldParent.className.indexOf('not-correct') !== -1){
					fieldParent.className = fieldParent.className + " not-correct";
				} 
			} else {
				// Datei ist hochgeladen stimmt
				// Fehlermeldung ausblenden
				var failureBoxes = fieldParent.getElementsByClassName("Tooltip-Require");
				for (var f=0; f < failureBoxes.length; f++) {
					failureBoxes[f].setAttribute("style", "display:none;");
				}
				return true;
			}
		} else {
			if(!field.value.match(_expr)) {
				setErrorMarker(field);
			} else {
				// Eingabe stimmt
				// Fehlermeldung ausblenden
				var failureBoxes = fieldParent.getElementsByClassName("Tooltip-Require");
				for (var f=0; f < failureBoxes.length; f++) {
					failureBoxes[f].setAttribute("style", "display:none;");
				}
				
				//Fehlermeldung ausblenden
				removeErrorMarker(field);
	
				return true;
			}
		}		
	}
	

	function validate(form, submit) {	

		if (arguments.length == 1) {
			submit = false;
	    }
	
	
		$(form).addClass("formvalidation");
		if (validation) {
			errors = 0;
			var result = true;
			var regex = null;
			var checkamounts = false;
			var amounts = 0;
			var offset = null;
			
			resetErrorMessages();
			
			for (var x in formValidate) {
				if (form[x]) {
					if(form[x].type != "hidden" && undefined == form[x].length){
						//Fax (als Moible genutzt, in der Backendlogik aber Fax) und Phone -> eines der beiden muss ausgefüllt sein.
						if (x == "fax" || x == "phone") {
							if ("" == form["fax"].value && "" == form["phone"].value) {
								
								form["phone"].setAttribute("required", true);
								form["fax"].setAttribute("required", true);
								
								
								
								form["phone"].parentNode.children[1].innerHTML = '<div class="Tooltip-Require-Arrow"></div>Podaj Numer telefonu lub Telefon kom\u00F3rkowy <div class="close-tooltip">&#x2715</div>';
								form["fax"].parentNode.children[1].innerHTML = '<div class="Tooltip-Require-Arrow"></div>Podaj Numer telefonu lub Telefon kom\u00F3rkowy <div class="close-tooltip">&#x2715</div>';
								
								setErrorMarker(form["phone"]);
								setErrorMarker(form["fax"]);
								
								result = false;	
								
							} else {
								
								
								
								form["phone"].parentNode.children[1].innerHTML = '<div class="Tooltip-Require-Arrow"></div>Podaj Numer telefonu <div class="close-tooltip">&#x2715</div>';
								form["fax"].parentNode.children[1].innerHTML = '<div class="Tooltip-Require-Arrow"></div>Podaj Telefon kom\u00F3rkowy <div class="close-tooltip">&#x2715</div>';
							
								if("" != form[x].value){ 
									form[x].setAttribute("required", true);
									if (!checkField(form[x], formValidate[x])) {
										removeErrorMarker(form[x]);
										result = false;
									}
								} else {
									removeErrorMarker(form[x]);
									form[x].removeAttribute("required");
								}
							} 
						}
						//Kostenstellen, Geburtsdatum, Passwort
						else if (x == "costcenter") {
							regex = formValidate[x];
							var costcenters = form.querySelectorAll("[name=costcenter]");						
							var costcenter = null;
							
							for (var f = 0; f < costcenters.length; f++) {
								costcenter = costcenters[f];
								
								removeErrorMarker(costcenter);
								
								if (!checkField(costcenter, regex)) {
									result = false;
								}
							}
							
						} else if (x == "subcostcenter") {
							regex = formValidate[x];
							var subcostcenters = form.querySelectorAll("[name=subcostcenter][required]");
							var subcostcenter = null;
							
							for (var f = 0; f < subcostcenters.length; f++) {
								subcostcenter = subcostcenters[f];
								if (subcostcenter.required) {
									removeErrorMarker(subcostcenter);
								}							
								
								if (!checkField(subcostcenter, regex)) {
									result = false;
								}
							}
						} else if (x == "birthday") {	
							if (form["birthday"] != null &&  "" != form["birthday"].value) {
								regex = formValidate[x];
								var dates = form.querySelectorAll("[name=birthday]");
								var date = null;
								for (var f = 0; f < dates.length; f++) {
									date = dates[f];	
									if (!checkField(date, regex)) {
										result = false;
										setErrorMarker(form["birthday"]);
									}  
									if(date.value.length != 10) {
										result = false;
										setErrorMarker(form["birthday"]);
									}
									if(Number(date.value.substring(0,4)) < 1920) {
										result = false;
										setErrorMarker(form["birthday"]);
									}
									
								}
								
							}
	
						} else if (x == "passwordRep" || x == "password") {
							
							if(doValidatePassword){
							
								removeErrorMarker(form[x]);
							
								if (form[x].value == "") {
								
									setErrorMarker(form[x]);
									result = false;
								
								} else if (form[x].value != "") {
								
									regex = formValidate[x];
		
									if (!checkField(form[x], regex)) {
										result = false; 
									} else if (x == "passwordRep") {
										if (form[x].value != form["password"].value) {
										
											setErrorMarker(form[x]);
											result = false;
										}
									}
								} else if (x == "passwordRep" && "" != form["password"].value && form[x].value != form["password"].value) {
							
									setErrorMarker(form[x]);
									result = false;
								}
							}
						}
						//email
						else if(form[x].required && (x == "email" || x == "emailRep")){
							console.log('is email');
							removeErrorMarker(form[x]);
							//korrekte Email Adresse?
							regex = formValidate["email"];
							if (x == "email" && !checkField(form["email"], regex)) {
									
									
								
								form["email"].parentNode.children[1].innerHTML = '<div class="Tooltip-Require-Arrow"></div>Podaj E-mail ';
								
								setErrorMarker(form["email"]);
								result = false;
							
							}  else if(x == "email" && doValidateEmail && !passedDoubleEmailCheck){
								
								console.log('passedDoubleEmailCheck: ' + passedDoubleEmailCheck);
								if (passedDoubleEmailCheck !== false) {
									checkEmail(form[x].value, undefined);
									console.log('new passedDoubleEmailCheck: ' + passedDoubleEmailCheck);
								}
							
								//E-Mail Adresse bereits vorhanden? 
								if (!passedDoubleEmailCheck) {
								
									form["email"].parentNode.children[1].innerHTML = '<div class="Tooltip-Require-Arrow"></div>Ten adres e-mail jest ju\u017C u\u017Cywany w naszym sklepie online.';
								
									setErrorMarker(form[x]);
									result = false;
								}
								
							} else if(x == "emailRep" && doValidateEmail && form[x].value != form["email"].value) {
								
								setErrorMarker(form[x]);
								result = false;
							
							}					
						
						
						///////////////////////////////////////////
						//"normale Validierung entsprechend RegEx"
						} else if (x != "email" && x != "emailRep" && form[x].required && $(form[x]).is(":visible")) {
							console.log(x)
							removeErrorMarker(form[x]);
							
							regex = formValidate[x];
							if (!checkField(form[x], regex)) {
								
								setErrorMarker(form[x]);
								result = false;
							}
						//"Validierung von nicht-Pflichtfeldern, wenn data Attribut gesetzt ist, entsprechend RegEx"
						} else if (form[x].hasAttribute('data-validate')) {
							
							removeErrorMarker(form[x]);
							
							regex = formValidate[x];
							if ("" != form[x].value && !checkField(form[x], regex)) {
								
								setErrorMarker(form[x]);
								result = false;
							}
						}
						
						else if (x.indexOf("Menge_") == 0) {
							checkamounts = true;
							if (!form[x].value.match(regex)){
								form[x].value = 0;
								result = true;
							} else {
								removeErrorMarker(form[x]);
								regex = formValidate[x];
								
								if (!checkField(form[x], regex)) {
									result = false;
								}					
								var value = form[x].value != "" && form[x].value.match(regex) ? parseInt(form[x].value) : 0;
								amounts = amounts + value;
							}
						} else if (x == "del_title_override") {
	
								removeErrorMarker(form[x]);
							
							if (true == form["del_selected_override"].checked && !checkField(form[x], formValidate[x])) {
								
								setErrorMarker(form[x]);
								result = false;
							}
						}
					}
				}
			}
			
			if (checkamounts) {
				if (0 == amounts) {
					for (var x in formValidate) {
						if (x.indexOf("Menge_") == 0) {
							form[x].parentNode.className = form[x].parentNode.className.replace(/not-correct/g, "not-correct");
							result = false;
						}				
					}
				}
			}
			
			setError(form);
			if(submit){
				removeNoSumits(result);
			}
			return result;
		}
	}
	
	var removeNoSumits = function(result){
		if(result){
			$('input[data-do-sumbit="false"]').each(function(){
				this.value = "";
			});
		}
	}
	
	var setError = function(form){
		if(errors == 0){
			errors = 1;
			var children = document.getElementById(form.id).querySelectorAll("input");
			var failureBoxes;
			for (var i in children) {
				if (null != children[i].parentNode && null != children[i].className && -1 != children[i].parentNode.className.indexOf("not-correct")) {
						
					// Fehlermeldungen an den Input-Feldern einblenden (checkboxen ausgenommen)
					if ("checkbox" != children[i].type.toLowerCase()) {
						failureBoxes = children[i].parentNode.getElementsByClassName("Tooltip-Require");
						for (var f=0; f < failureBoxes.length; f++) {
							failureBoxes[f].removeAttribute("style");
						}
					}
					
					if(!keepPosition){
						children[i].focus();
						offset = jQuery(children[i]).offset().top;
						window.scroll(0, offset - 250);
					}
					break;
				}
				
			}
			errors = 0;
		}
	}

var checkEmailForm = $('#registerform')[0];	
	var checkEmail = function(_val,ele) {
		$.ajax({
			type: "GET",
			async: false,
			url: "/shop/pl",
			data: {
				"script" : "G16_Checkmail",
				"email" : _val,
				"shop" : "KuK-PL"
				},
			dataType : "html",
			traditional: true, // wir benötigen nicht die Krücke für PHP oder Ruby
			success : function(data, textStatus, qXHR){
				var expr = /([\s\S]*?)JSON([\s\S]*?)ENDJSON([\s\s]*)/m;
				expr.exec(data);
				var obj = eval('(' + RegExp.$2 + ')');
				console.log('did DoubleEmailCheck: ' + obj.success);
				passedDoubleEmailCheck = (obj.success === true);
				doValidateEmail = true;
				keepPosition = true;
				validate(checkEmailForm);
			},
			error : function(data) {
				console.log('error: '+data);
			}
		});
	};


	checkDate = function(_val,ele) {	
		var dateValidated = false;
		
		if(_val.length > 0){
			
			if(_val.match(/^([0-9]{2})\.([0-9]{2})\.([0-9]{4})$/g)){
				dateValidated = true;
			}else{
				dateValidated = false;
			}
			
		}else {
			dateValidated = true;
		}
		
		removeErrorMarker(ele);
		ele.parentNode.children[2].style.display ="none";
			
		if(!dateValidated){
			setErrorMarker(ele);
			ele.parentNode.children[2].style.display ="flex";
		}											
	};
	
	checkForm = function(event, form) {
		event.preventDefault();
		
		var sendForm = true;
		var formFields = form.elements;
		for (var i = 0, formField; formField = formFields[i++];) {
			if(formField.parentNode.className.indexOf('not-correct') !== -1){
				sendForm = false;
			}
		}
		
		if(sendForm){
			form.submit();
		}
	};
	
var setErrorMarker = function(target){
    $(target).parent().addClass('not-correct');
    $(target).addClass('Tooltip-Require-Color');
    //$(target).next().css('display', '');
}

var removeErrorMarker = function(target){
    //$(target).parent().removeClass('not-correct');
    //$(target).removeClass('Tooltip-Require-Color');
    //$(target).next().css('display', 'none');
}

var resetErrorMessages = function resetErrorMessages(){
	$('.not-correct').removeClass('not-correct');
	$('.Tooltip-Require-Color').removeClass('Tooltip-Require-Color');
	$('.Tooltip-Require').css('display', 'none');
};


	$('.checkEmail').on('keyup blur', function(ev){
		if(doValidateEmail){
			var regex = formValidate['email'];
			if(this.value.match(regex)){
				checkEmail(this.value, this);
//			} else {
//				passedDoubleEmailCheck = true;
			}
		}
	});
	
	if($('.checkEmail') && formValidate['email'].test($('.checkEmail').val())) {
		if(doValidateEmail){
			var value = $('.checkEmail').val();
			var obj = $('.checkEmail')
				//checkEmail(value,obj);
		}
	}
