
/**************************************************************

	Script		: Validate
	Version		: 2.1
	Authors		: Samuel Birch
	Desc		: Form validation
	Licence		: Open Source MIT Licence

**************************************************************/

var Validate = new Class({
	
	getOptions: function(){
		return {
			validateOnBlur: true,
			errorClass: 'error',
			errorMsgClass: 'warning',
			dateFormat: 'dd/MM/yy',
			onFail: Class.empty,
			onSuccess: false,
			showErrorsInline: true,
			label: 'sendet...',
			label1: 'weiter »',
			label2: 'Fehler !',
			description: '<b style=\"color:#971e00;\">Bitte die rot markierten Felder überprüfen und gegebenenfalls korrigieren.</b>'
		};
	},

	initialize: function(form, options){
		this.setOptions(this.getOptions(), options);
		
		this.form = $(form);
		this.elements = this.form.getElements('.required');
		
		this.list = [];
		
		this.elements.each(function(el,i){
			if(this.options.validateOnBlur){
				if (el.type != "checkbox") {
					el.addEvent('focus', this.validate.bind(this, el));
				}
				el.addEvent('focus', this.checkSubmit.bind(this, el));
				el.addEvent('blur', this.validate.bind(this, el));
			}
		}.bind(this));
		
		this.form.addEvent('submit', function(e){
			var event = new Event(e);
			var doSubmit = true;
			this.elements.each(function(el,i){
				if(!this.validate(el)){
					event.stop();
					doSubmit = false;
					this.list.include(el);
					this.form.getElement('input[type=submit]').setProperty('value',this.options.label2);
					this.form.getElementById("description").innerHTML = this.options.description;
					//self.location.href='#Seitenanfang';
					window.scrollTo(0, 0);
				}else{
					this.list.remove(el);
				}
			}.bind(this));
			
			if(doSubmit){
				if(this.options.onSuccess){
					event.stop();
					this.options.onSuccess(this.form);
				}else{
					this.form.getElement('input[type=submit]').setProperty('value',this.options.label);
				}
			}else{
				this.options.onFail(this.getList());
			}
			
		}.bind(this));
		
	},
	
	checkSubmit: function(){
		this.form.getElement('input[type=submit]').setProperty('value',this.options.label1);
	},
	
	getList: function(){
		var list = new Element('ul');
		this.list.each(function(el,i){
			if(el.title != ''){
			var li = new Element('li').injectInside(list);
			new Element('label').setProperty('for', el.id).setText(el.title).injectInside(li);
			}
		});
		return list;
	},
	
	validate: function(el){
		var valid = true;
		this.clearMsg(el);
		
		switch(el.type){
			case 'text':
				if(el.value != ''){
					var regText = /^[a-zA-Z0-9._'-]/;
					if(el.value.match(regText)){
						if(el.hasClass('email')){
							var regEmail = /^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/;
							if(el.value.toUpperCase().match(regEmail)){
								valid = true;
							}else{
								this.setMsg(el, 'Bitte gültige \'E-Mail -Adresse\' angeben!');
								valid = false;
							}
						}
						
						if(el.hasClass('vorwahl')){
							var regNum = /\d[0-9]/;
							if(el.value.match(regNum)){
								if (el.value.length >= 3) {
									if (el.value.substr(0,1) == 0) {
										valid = true;
									}else{
										valid = false;
										this.setMsg(el, 'Die Vorwahl muss mit einer 0 beginnen!');
									}
								}else{
									valid = false;
									this.setMsg(el, 'Die Vorwahl hat mindestens 3 Ziffern!');
								}
							}else{
								valid = false;
								this.setMsg(el, 'Hier bitte 3 Ziffern eingeben! [0-9]');
							}
						}
						
						if(el.hasClass('number')){
							var regNum = /\D/;
							if(el.value.match(regNum)){
								valid = false;
								this.setMsg(el, 'Hier bitte nur Ziffern eingeben! [0-9]');
							}else{
								valid = true;
							}
						}
						
						if(el.hasClass('streetNum')){
							var regNum = /[0-9]*\.?[0-9]+/;
							if(el.value.match(regNum)){
								valid = true;
							}else{
								valid = false;
								this.setMsg(el, 'Hier bitte nur Ziffern eingeben! [0-9]');
							}
						}
						
						if(el.hasClass('postcode')){
							var regNum = /\D/;
							if(el.value.match(regNum)){
								valid = false;
								this.setMsg(el, 'Hier bitte nur Ziffern eingeben! [0-9]');
							}else{
								var regPC = /\d{5}/;
								if(el.value.match(regPC)){
									valid = true;
								}else{
									valid = false;
									this.setMsg(el, 'Bitte eine 5-Stellige Postleitzahl eingeben.');
								}
							}
						}
						
						if(el.hasClass('konto')){
							var regNum = /\D/;
							if(el.value.match(regNum)){
								valid = false;
								this.setMsg(el, 'Hier bitte nur Ziffern eingeben! [0-9]');
							}else{
								if(el.value.length > 4){
									valid = true;
								}else{
									valid = false;
									this.setMsg(el, 'Bitte min. 4-stellige Kontonummer angeben');
								}
							}
						}
						
						if(el.hasClass('blz')){
							var regNum = /\D/;
							if(el.value.match(regNum)){
								valid = false;
								this.setMsg(el, 'Hier bitte nur Ziffern eingeben! [0-9]');
							}else{
								var regPC = /\d{8}/;
								if(el.value.match(regPC)){
									valid = true;
								}else{
									valid = false;
									this.setMsg(el, 'Bitte eine 8-stellige Bankleitzahl eingeben.');
								}
							}
						}
						
						if(el.hasClass('KontoinhaberCheck')){
							var regNum = this.form.getElementById("KontoinhaberCheck").value;
							
							if(el.value.match(regNum)){
								valid = true;
							} else {
								valid = false;
								this.setMsg(el, 'Kontoinhaber muss Rechnungsempfänger sein!');
							}
						}
					}else{
						valid = false;
						this.setMsg(el, 'Es wurden ungültige Zeichen eingegeben!');
					}
				}else{
					valid = false;
					this.setMsg(el);
				}
				break;
			case 'textarea':
			case 'select-one':
				if(el.value != ''){
					var valid = true;
				
					var tag = new Date();
					var monat = new Date();
					var jahr = new Date();
					
					var getTag = tag.getDate();
					var getMonat = monat.getMonth();
					var getJahr = jahr.getFullYear();
					
					if(el.hasClass('bday')){
						this.form.getElementById('Geburtsdatum_T').removeClass(this.options.errorClass);
						this.form.getElementById('Geburtsdatum_M').removeClass(this.options.errorClass);
						this.form.getElementById('Geburtsdatum_J').removeClass(this.options.errorClass);
						if(this.form.getElementById('Geburtsdatum_T').error != undefined){
							this.form.getElementById('Geburtsdatum_T').error.remove();
							this.form.getElementById('Geburtsdatum_T').error = undefined;
						}
						
						if (this.form.getElementById('Geburtsdatum_J').value == getJahr-18) {
							if (this.form.getElementById('Geburtsdatum_M').value == getMonat+1 && this.form.getElementById('Geburtsdatum_T').value > getTag || this.form.getElementById('Geburtsdatum_M').value > getMonat+1) {
								valid = false;
								this.form.getElementById('Geburtsdatum_T').addClass(this.options.errorClass);
								this.form.getElementById('Geburtsdatum_M').addClass(this.options.errorClass);
								this.form.getElementById('Geburtsdatum_J').addClass(this.options.errorClass);
								this.setMsg(this.form.getElementById('Geburtsdatum_T'), 'Sie sind leider noch nicht volljährig!');
							}
						}

					}else if(el.hasClass('persoDate')){
						this.form.getElementById('GueltigBis_T').removeClass(this.options.errorClass);
						this.form.getElementById('GueltigBis_M').removeClass(this.options.errorClass);
						this.form.getElementById('GueltigBis_J').removeClass(this.options.errorClass);
						if(this.form.getElementById('GueltigBis_T').error != undefined){
							this.form.getElementById('GueltigBis_T').error.remove();
							this.form.getElementById('GueltigBis_T').error = undefined;
						}
						
						if (this.form.getElementById('GueltigBis_J').value == getJahr) {
							if (this.form.getElementById('GueltigBis_M').value == getMonat+1 && this.form.getElementById('GueltigBis_T').value < getTag || this.form.getElementById('GueltigBis_M').value < getMonat+1) {
								valid = false;
								this.form.getElementById('GueltigBis_T').addClass(this.options.errorClass);
								this.form.getElementById('GueltigBis_M').addClass(this.options.errorClass);
								this.form.getElementById('GueltigBis_J').addClass(this.options.errorClass);
								this.setMsg(this.form.getElementById('GueltigBis_T'), 'Ihr Ausweis ist bereits abgelaufen!');
							}
						}
					}
				}else{
					valid = false;
					this.setMsg(el);
				}
				break;
				
			case 'checkbox':
				if(!el.checked){
					valid = false;
					if (el.id == "AGB") {
						this.form.getElementById('warnAGB').style.display = "block";
					} else if (el.id == "AGBProvider") {
						this.form.getElementById('warnAGBProvider').style.display = "block";
					} else {
						this.form.getElementById('warnPermissionTPH').style.display = "block";
					}
				}else{
					valid = true;
				}
				break;
				
			case 'radio':
				var rad = $A(this.form[el.name]);
				var ok = false;
				rad.each(function(e,i){
					if(e.checked){
						ok = true;
					}
				});
				if(!ok){
					valid = false;
					this.setMsg(rad.getLast(), 'Please select an option');
				}else{
					valid = true;
					this.clearMsg(rad.getLast());
				}
				break;
				
		}
		return valid;
	},
	
	setMsg: function(el, msg){
		if(msg == undefined){
			msg = el.title;
		}
		if(this.options.showErrorsInline){
			if(el.error == undefined){
				el.error = new Element('span').addClass(this.options.errorMsgClass).setText(msg).injectAfter(el);
			}else{
				el.error.setText(msg);
			}
			el.addClass(this.options.errorClass);
		}
	},
	
	clearMsg: function(el){
		el.removeClass(this.options.errorClass);
		if(el.error != undefined){
			el.error.remove();
			el.error = undefined;
		}
	}
	
});

Validate.implement(new Options);
Validate.implement(new Events);


/*************************************************************/

