var FormAjax = new Class({
									
			Implements: [Options, Events],
			options: {
						//elements
						required: 'req',
						Resp: 'response',
						WrapEl:  'formWrap',
						//events
						validateOnBlur: true,
						useAjax: true,
						showErrorsInline: true,
						showResponse: false,
						//classes
						errorClass: 'error',
						errorMsgClass: 'errorMessage',
						dateFormat: 'dd/MM/yy',
						onFail: Class.empty,
						//messages		
						SendingLabel: 'Please wait...',
						ThankYou: 'Dakujeme',
						EmailError: 'Please enter a valid email address',					
						NumberError: 'Please enter a valid number',
						TextError: 'This field can not be empty',
						PostError: 'Please enter a valid postcode',
						DateError: 'Please enter a valid date in the format:'
						
										
					    },
									
			initialize: function(elem,options){
				   this.setOptions(options);
				   this.form = $(elem);
				   this.elements = $(elem).getElements('.req');
				   var AllowResponse  = this.options.showResponse;
				   var Wrap =  $(this.options.WrapEl);
				   var log = $(this.options.Resp);
				   var thankyou = this.options.ThankYou;
				   
				   	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 doSubmit = true;
								this.elements.each(function(el,i){
										if(!this.validate(el))
										doSubmit = false;
								},this);
								
					if(doSubmit){
						
							if(this.options.useAjax) {
								e.stop();
								log.empty().addClass('ajax-loading');
								this.form.getElement('input[type=submit]').setProperty('value',this.options.SendingLabel);
								this.form.set('send', {onComplete: 								
									function(response) 
									{
									log.removeClass('ajax-loading');
									
										if(AllowResponse){
										log.set('html', response);
										} else {
										log.set('html', thankyou); 
										}
										
									   Wrap.dispose();
									}
								});	
							
							this.form.send();
					
							} 
					
					}else{
				 return false;
				}
							
			}.bind(this)); 
						
	    },
			
		validate: function(el){
		var valid = true;
		this.clearMsg(el);
		
		
		switch(el.type){
			case 'text':
			case 'textarea':
			case 'select-one':
					if(el.hasClass('mail')){
						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, this.options.EmailError);
						}
					}
					
					if(el.hasClass('number')){
						var regNum = /[-+]?[0-9]*\.?[0-9]+/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el,this.options.NumberError );
						}
					}	
				   
				   if(el.hasClass('text')){
						if(el.value!=''){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, this.options.TextError);
						}
					}
					
					if(el.hasClass('postcode')){
						var regPC = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$/
						if(el.value.match(regPC)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, this.options.PostError);
						}
					}
					
					if(el.hasClass('date')){
						var d = Date.parseExact(el.value, this.options.dateFormat);
						if(d != null){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, this.options.DateError+this.options.dateFormat.toLowerCase());
						}
					}
					
				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 = el.title;
		}
		if(this.options.showErrorsInline){
			if(el.error == undefined){
				el.error = new Element('span').injectAfter(el).addClass(this.options.errorMsgClass).set('text',msg);
			}else{
				el.error.set('text',msg);
			}
			el.addClass(this.options.errorClass);
		}
	},
	
	clearMsg: function(el){
		el.removeClass(this.options.errorClass);
		if(el.error != undefined){
			el.error.dispose();
			el.error = undefined;
		}
	}


			
			
});


