﻿/**
 * Validiert auf das Datums-Format TT.MM.JJJJ, sowie auf das Datum selbst, ob es
 * ueberhaupt existiert.
 */
jQuery.validator.addMethod('date', function(value, element) {
	
	// Auf dem Element die Fehlermeldungen zuruecksetzen...
	element.errorMessages = [];
	
	if ((value || '') == '' || element.getAttribute('alt') == value) return true;
	
	// Schauen ob es eine Maske zu dem gefundenen gibt ...
	var tmpRule = eveSetup.currentDateRule || false;
	
	// Wurde nichts gefunden, dann alles okay.
	if(!tmpRule) return true;
	
	var tmpResult = this.optional(element) ||tmpRule.regExp.test(value);
	
	if (tmpResult) {
		
		var tmpArray = value.split('.'); tmpArray[0] *= 1; tmpArray[1] *= 1; tmpArray[2] *= 1;
		var tmpDate = new Date(tmpArray[2], tmpArray[1] - 1, tmpArray[0], 0, 0, 0);
		
		var tmpArray2 = [tmpDate.getDate(), tmpDate.getMonth() + 1, tmpDate.getFullYear()];
		
		tmpResult = (this.optional(element) || (tmpArray.join('.') == tmpArray2.join('.'))) ? true : false ;
	}
	
	if (tmpResult == false) {
		
		element.errorMessages.push(jQuery.validator.messages.dateByShopError.replace('{0}', tmpRule.example));
		
		return this.optional(element) || false;
		
	} else {
		
		return true;
	}
	
}, function(e, element) { return element.errorMessages.join('<br />'); } );

/**
 * Prueft ob [n] Eingabefelder den gleichen Wert haben. Dabei wird zu der CSS-Klasse
 * "repeat" noch eine weitere mit dem Prefix "repeat" und einem Indize verwendet. Alle
 * Eingabfelder mit diesem Indize werden dann miteinander abgeglichen.
 */
jQuery.validator.addMethod('repeat', function(value, element) {
	
	// Formular finden ...
	var tmpForm = eveJs.findParent(element, 'form', 'nodeName', 0);
	if(!tmpForm) return true;
	
	var tmpFormId = eveJs.getElementId(tmpForm);
	
	// Rausfinden, nach welchem Indize gesucht wird.
	var tmpReg = /repeat(\w+)([^\s]||$)/gi;
	var tmpRes = ((element.className || '').match(tmpReg) || false)[0] || false;
	
	if (!tmpRes) return true;
	
	// Jetzt, nachdem die Klasse bekannt ist, werden alle zugehoerigen Felder gesucht.
	var tmpElements = jQuery('#' + tmpFormId + ' input.' + tmpRes) || [];
	
	element.isInvalidRepeat = false;
	
	for (var i = 0; i < tmpElements.length; i++) {
		
		if(element == tmpElements[i]) continue;
		
		if (tmpElements[i].getValue() == '') continue;
		
		// Merker setzen, dass das aktuelle Element bisschen falsch ist ;)
		if ((tmpElements[i].getValue() || '') != value) element.isInvalidRepeat = true;
	};
	
	if(element.isInvalidRepeat) return this.optional(element) || false;
	
	// Wenn alles okay ist, dann die anderen Felder noch validieren...
	for (var i = 0; i < tmpElements.length; i++) {
		
		var tmpOtherEl = tmpElements[i];
		
		if(element == tmpOtherEl) continue;
		
		if((tmpOtherEl.isInvalidRepeat || false)) {
			
			var tmpFunc = function(form, element) {
				
				jQuery(form).validate().element(element);
				
			}.defer(10, this, true, [tmpForm, tmpOtherEl]);
			
			tmpFunc();
		}
	};
	
	return true;
	
}, jQuery.validator.messages.repeat);

/**
 * Validiert ein Eingabefeld in Abhaengigkeit zu einem oder mehreren anderen. Dabei wird zu der CSS-Klasse
 * "requiredIf" noch eine weitere mit dem Prefix "requiredIf" und einem Indize verwendet. Alle
 * Eingabfelder mit diesem Indize werden dann miteinander abgeglichen.
 */
jQuery.validator.addMethod('requiredIf', function(value, element) {
	
	// Formular finden ...
	var tmpForm = eveJs.findParent(element, 'form', 'nodeName', 0);
	if(!tmpForm) return true;
	
	var tmpFormId = eveJs.getElementId(tmpForm);
	
	// Rausfinden, nach welchem Indize gesucht wird.
	var tmpReg = /requiredIf(\w+)([^\s]||$)/gi;
	var tmpRes = ((element.className || '').match(tmpReg) || false)[0] || false;
	
	if (!tmpRes) return true;
	
	// Jetzt, nachdem die Klasse bekannt ist, werden alle zugehoerigen Felder gesucht.
	var tmpElements = jQuery('#' + tmpFormId + ' input.' + tmpRes) || [];
	var tmpFoundEl = false;
	
	// Es muss jetzt noch das Element gesucht werden, welches kein "requiredIf", sondern nur
	// das "requiredIfPostfix" hat - die Quelle, wenn diese nicht gesetzt ist, dann ist auch Ende
	for (var i = 0; i < tmpElements.length; i++) {
	
		if(!(tmpFoundEl = (tmpElements[i] || false))) continue;
		
		if(jQuery(tmpFoundEl).hasClass('requiredIf')) continue;
		
		if(!eveJs.isFieldSet(tmpFoundEl)) return true;
	}
	
	return (value == '') ? false : true ;
	
}, jQuery.validator.messages.required);

/**
 * Prueft ob max. [n] E-Mails angegeben wurden, diese nicht doppelt sind und diese Valide sind.
 * Dabei wird zu der CSS-Klasse "emaillist" noch eine weitere mit dem Prefix "emaillist" und einem 
 * Indize als Integer mit der Anzahl der max. anzugebenden E-Mails verwendet.
 */
jQuery.validator.addMethod('emaillist', function(value, element) {
	
	// Rausfinden, nach welchem Indize gesucht wird.
	var tmpReg = /emaillist(\d+)([^\s]||$)/gi;
	var tmpRes = ((element.className || '').match(tmpReg) || false)[0] || 0;
	var tmpMax = parseInt(tmpRes.split('emaillist').pop() || 0);
	
	if (tmpMax == 0) return true;
	
	// Auf dem Element die Fehlermeldungen zuruecksetzen...
	element.errorMessages = [];
	
	// E-Mails auseinander droesseln und vorher noch die Leerzeichen entfernen
	var tmpArray = value.split(' ').join('').split(';');
	var tmpMails = [];
	var isAlreadyIn = {};
	
	// Sicherstellen, dass keine leeren Elemente mitgezaehlt werden ...
	for(var i = 0; i < tmpArray.length; i++) {
		
		if ((tmpArray[i] || '') == '' || (isAlreadyIn[tmpArray[i]] || false) == true) continue;
			
		tmpMails.push(tmpArray[i]);
		
		isAlreadyIn[tmpArray[i]] = true;
	}
	
	// Value nachformatieren und Fehler entfernen
	element.value = tmpMails.join('; ');
	
	// Sollte das Value jetzt leer sein, noch einmal validieren und hier abbrechen.
	if(element.value == '') {
		
		// Formular finden ...
		var tmpForm = eveJs.findParent(element, 'form', 'nodeName', 0);
		if(!tmpForm) return true;
		
		var tmpFormId = eveJs.getElementId(tmpForm);
		
		var tmpFunc = function(form, element) {
				
			jQuery(form).validate().element(element);
			
		}.defer(10, this, true, [tmpForm, element]);
		
		tmpFunc();
		
		return true;
	}
	
	// Wenn es mehr als [n] Eintraege gibt, dann Alert
	if (tmpMails.length > tmpMax) {
	
		element.errorMessages.push(jQuery.validator.messages.emaillistmax.replace('{max}', tmpMax)); 
		
		return this.optional(element) || false;
	}
	
	// Jetzt jede einzelne Adresse noch pruefen, ob diese denn korrekt sind
	var tmpFunc = jQuery.validator.methods.email.scope(this);
	
	for (var i = 0; i < tmpMails.length; i++) {
		
		if(!tmpFunc(tmpMails[i], element)) element.errorMessages.push(jQuery.validator.messages.emaillistwrong.replace('{pos}', (i + 1))); 
	};
	
	if(element.errorMessages.length > 0) return false;
	
	return true;
	
}, function(e, element) { return element.errorMessages.join('<br />'); } );


/**
 * Validiert ein ZipCode-Eingabefeld in Abhaengigkeit zu einem Land-Eingabefeld ueber die Laenderkuerzel, wie
 * z. B. "DE" oder "NL". Dazu wird auf das ZipCode-Eingabefeld die CSS-Klasse "zipByCountry", sowie auf diesem
 * und auf das Land-Eingabefeld eine CSS-Klasse "zipByCountry[POSTFIX]" gelegt, wobei das [POSTFIX] fuer einen
 * beliebigen Text steht.
 *
 * Findet die Validierung ueber das aktuell im Land-Eingabefeld eingestellte Land eine "Regel", so versucht
 * sie diese anzuwenden.
 */
jQuery.validator.addMethod('zipByCountry', function(value, element) {
	
	// Auf dem Element die Fehlermeldungen zuruecksetzen...
	element.errorMessages = [];
		
	// Formular finden ...
	var tmpForm = eveJs.findParent(element, 'form', 'nodeName', 0);
	if(!tmpForm) return true;
	
	// Rausfinden, nach welchem Indize gesucht wird.
	var tmpReg = /zipByCountry(\w+)([^\s]||$)/gi;
	var tmpRes = ((element.className || '').match(tmpReg) || false)[0] || false;
	
	if (!tmpRes) return true;
	
	// Jetzt, nachdem die Klasse bekannt ist, werden alle zugehoerigen Felder gesucht.
	var tmpElements  = jQuery(tmpForm).find('.' + tmpRes) || [];
	var tmpFoundEl   = false;
	var tmpFoundCode = false;
	
	// Es muss jetzt noch das Element gesucht werden, welches kein "requiredIf", sondern nur
	// das "requiredIfPostfix" hat - die Quelle, wenn diese nicht gesetzt ist, dann ist auch Ende
	for (var i = 0; i < tmpElements.length; i++) {
	
		if(!(tmpFoundEl = (tmpElements[i] || false))) continue;
		
		if(jQuery(tmpFoundEl).hasClass('zipByCountry')) continue;
		
		tmpFoundCode = eveJs.isFieldSet(tmpFoundEl) || false;
		
		break;
	}
	
	// Wurde nichts gefunden, dann alles okay.
	if(!tmpFoundCode) return true;
	
	// Schauen ob es eine Maske zu dem gefundenen gibt ...
	var tmpRule = eveSetup.zipRules[tmpFoundCode.toUpperCase()] || false;
	
	// Wurde nichts gefunden, dann alles okay.
	if(!tmpRule) return true;
	
	// Pruefen das Value mit der Regeln uebereinstimmt.
	var res = value.search(tmpRule.regExp);
	
	if (res < 0) {
		
		element.errorMessages.push(jQuery.validator.messages.zipByCountryError.replace('{0}', tmpRule.example));
		
		return this.optional(element) || false;
		
	} else {
		
		return true;
	}
	
}, function(e, element) { return element.errorMessages.join('<br />'); } );


/**
 * Validiert ein Name-Eingabefeld in Abhaengigkeit zu einem Land-Eingabefeld ueber die Laenderkuerzel, wie
 * z. B. "DE" oder "NL". Dazu wird auf das Name-Eingabefeld die CSS-Klasse "forenameByCountry", sowie auf diesem
 * und auf das Land-Eingabefeld eine CSS-Klasse "forenameByCountry[POSTFIX]" gelegt, wobei das [POSTFIX] fuer einen
 * beliebigen Text steht.
 *
 * Findet die Validierung ueber das aktuell im Land-Eingabefeld eingestellte Land eine "Regel", so versucht
 * sie diese anzuwenden.
 */
jQuery.validator.addMethod('forenameByCountry', function(value, element) {
	
	// Auf dem Element die Fehlermeldungen zuruecksetzen...
	element.errorMessages = [];
		
	// Formular finden ...
	var tmpForm = eveJs.findParent(element, 'form', 'nodeName', 0);
	if(!tmpForm) return true;
	
	// Rausfinden, nach welchem Indize gesucht wird.
	var tmpReg = /forenameByCountry(\w+)([^\s]||$)/gi;
	var tmpRes = ((element.className || '').match(tmpReg) || false)[0] || false;
	
	if (!tmpRes) return true;
	
	// Jetzt, nachdem die Klasse bekannt ist, werden alle zugehoerigen Felder gesucht.
	var tmpElements  = jQuery(tmpForm).find('.' + tmpRes) || [];
	var tmpFoundEl   = false;
	var tmpFoundCode = false;
	
	// Es muss jetzt noch das Element gesucht werden, welches kein "forenameByCountry", sondern nur
	// das "forenameByCountryPostfix" hat - die Quelle, wenn diese nicht gesetzt ist, dann ist auch Ende
	for (var i = 0; i < tmpElements.length; i++) {
	
		if(!(tmpFoundEl = (tmpElements[i] || false))) continue;
		
		if(jQuery(tmpFoundEl).hasClass('forenameByCountry')) continue;
		
		tmpFoundCode = eveJs.isFieldSet(tmpFoundEl) || false;
		
		break;
	}
	
	// Wurde nichts gefunden, dann alles okay.
	if(!tmpFoundCode) return true;
	
	// Schauen ob es eine Maske zu dem gefundenen gibt ...
	var tmpRule = eveSetup.nameRules[tmpFoundCode.toUpperCase()] || false;
	
	// Wurde nichts gefunden, dann alles okay.
	if(!tmpRule) return true;
	
	// Pruefen das Value mit der Regeln uebereinstimmt.
	var res = value.search(tmpRule.regExp);
	
	if (res < 0) {
	
		return true;
		
	} else {
		
		element.errorMessages.push(jQuery.validator.messages.forenameByCountryError.replace('{0}', tmpRule.example));
		
		return this.optional(element) || false;
	}
	
}, function(e, element) { return element.errorMessages.join('<br />'); } );


/**
 * Validiert ein Name-Eingabefeld in Abhaengigkeit zu einem Land-Eingabefeld ueber die Laenderkuerzel, wie
 * z. B. "DE" oder "NL". Dazu wird auf das Name-Eingabefeld die CSS-Klasse "forenameByCountry", sowie auf diesem
 * und auf das Land-Eingabefeld eine CSS-Klasse "forenameByCountry[POSTFIX]" gelegt, wobei das [POSTFIX] fuer einen
 * beliebigen Text steht.
 *
 * Findet die Validierung ueber das aktuell im Land-Eingabefeld eingestellte Land eine "Regel", so versucht
 * sie diese anzuwenden.
 */
jQuery.validator.addMethod('surnameByCountry', function(value, element) {
	
	// Auf dem Element die Fehlermeldungen zuruecksetzen...
	element.errorMessages = [];
		
	// Formular finden ...
	var tmpForm = eveJs.findParent(element, 'form', 'nodeName', 0);
	if(!tmpForm) return true;
	
	// Rausfinden, nach welchem Indize gesucht wird.
	var tmpReg = /surnameByCountry(\w+)([^\s]||$)/gi;
	var tmpRes = ((element.className || '').match(tmpReg) || false)[0] || false;
	
	if (!tmpRes) return true;
	
	// Jetzt, nachdem die Klasse bekannt ist, werden alle zugehoerigen Felder gesucht.
	var tmpElements  = jQuery(tmpForm).find('.' + tmpRes) || [];
	var tmpFoundEl   = false;
	var tmpFoundCode = false;
	
	// Es muss jetzt noch das Element gesucht werden, welches kein "forenameByCountry", sondern nur
	// das "forenameByCountryPostfix" hat - die Quelle, wenn diese nicht gesetzt ist, dann ist auch Ende
	for (var i = 0; i < tmpElements.length; i++) {
	
		if(!(tmpFoundEl = (tmpElements[i] || false))) continue;
		
		if(jQuery(tmpFoundEl).hasClass('surnameByCountry')) continue;
		
		tmpFoundCode = eveJs.isFieldSet(tmpFoundEl) || false;
		
		break;
	}
	
	// Wurde nichts gefunden, dann alles okay.
	if(!tmpFoundCode) return true;
	
	// Schauen ob es eine Maske zu dem gefundenen gibt ...
	var tmpRule = eveSetup.nameRules[tmpFoundCode.toUpperCase()] || false;
	
	// Wurde nichts gefunden, dann alles okay.
	if(!tmpRule) return true;
	
	// Pruefen das Value mit der Regeln uebereinstimmt.
	var res = value.search(tmpRule.regExp);
	
	if (res < 0) {
	
		return true;
		
	} else {
		
		element.errorMessages.push(jQuery.validator.messages.surnameByCountryError.replace('{0}', tmpRule.example));
		
		return this.optional(element) || false;
	}
	
}, function(e, element) { return element.errorMessages.join('<br />'); } );


/**
 * Ersetzt die Validate-Methode. Prueft ob die PLZ im richtigen Format ist, abhaengig vom Ursprungsland des Shops
 * und nicht abheangig von der aktuell genutzten Sprache.
 */
jQuery.validator.addMethod('plz', function(value, element) {
	
	// Auf dem Element die Fehlermeldungen zuruecksetzen...
	element.errorMessages = [];
	
	if ((value || '') == '' || element.getAttribute('alt') == value) return true;
	
	// Schauen ob es eine Maske zu dem gefundenen gibt ...
	var tmpRule = eveSetup.currentZipRule || false;
	
	// Wurde nichts gefunden, dann alles okay.
	if(!tmpRule) return true;
	
	// Die Regular Expression ist in der setup.js zu finden
	var res = value.search(tmpRule.regExp);
	
	if (res < 0) {
		
		element.errorMessages.push(jQuery.validator.messages.zipByShopError.replace('{0}', tmpRule.example));
		
		return this.optional(element) || false;
		
	} else {
		
		return true;
	}
	
}, function(e, element) { return element.errorMessages.join('<br />'); } );
												  
