
/**************************************************************

	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: 'errorMessage',
			dateFormat: 'dd/MM/yy',
			onFail: Class.empty,
			onSuccess: false,
			showErrorsInline: true,
			label: 'Please wait...'
		};
	},

	initialize: function(form, options){
		this.setOptions(this.getOptions(), options);
		if($(form)) {
			this.form = $(form);
			this.elements = this.form.getElements('');
			this.list = [];
			
			this.elements.each(function(el,i){
				if(this.options.validateOnBlur){
					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);
					}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));
		}
	},
	
	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':
			case 'password':
			case 'textarea':
			case 'select-one':
			    if(el.value != ''){
					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{
							valid = false;
							this.setMsg(el, 'Bitte geben Sie eine korrekte E-Mail - Adresse ein');
						}
					}
					
					if(el.hasClass('number')) {
						var regNum = /^[-+]?[0-9]*[\.,]?[0-9]+$/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Geben Sie bitte eine korrekte Zahl ein');
						}
					}
					
					if(el.hasClass('postcode')){
						var regPC = /^[0-9]{5}$/
						if(el.value.match(regPC)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Geben Sie bitte eine korrekte Postleitzahl ein');
						}
					}
					
					if(el.hasClass('date')){
						var tmp = el.value.split(".");
						var date = new Date(tmp[2],(tmp[1] - 1) ,tmp[0]);
						tag = date.getDate();
						if(tag < 10) tag = '0' + tag;
						mon = date.getMonth() +1;
						if(mon < 10) mon = '0' + mon;
						jahr = date.getYear();
						if (jahr < 999) jahr += 1900;
						neu = tag+'.'+mon+'.'+jahr;
						if(el.value == neu) {
							valid = true;
						} else {
							valid = false;
							this.setMsg(el);
						}
					}
					var regLen = /length_(\d+)/;
					a = el.className.match(regLen);
					if(a[1]) {
						var len = a[1];
						if(len < el.value.length) {
							valid = false;
							this.setMsg(el, 'Bitte geben Sie max. '+len+' Zeichen an');
						}
					}
					
				}else{
					if(el.hasClass('required')){
					 valid = false;
					 this.setMsg(el);
					} 
				}
				break;
				
			case 'checkbox':
				if(!el.checked){
					valid = false;
					this.setMsg(el);
				}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 = "<br />"+ 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);


/*************************************************************/

