//	FormValidate
//	Based on Validate by Samuel Birch http://www.phatfusion.net/validate/
//	Licence: Open Source MIT Licence
//	Hacked to work with mootools 1.2
//	Adrian Jones eSterling Ltd http://www.esterling.co.uk/
//  2010-02-19 added setOK()


var FormValidate = new Class({
		Implements: [Events, Options],
		list:[],
		options: {
			validateOnBlur: true,
			errorClass: 'error',
			errorMsgClass: 'errorMessage',
			okMsgClass: 'validValue',
			dateFormat: 'dd/MM/yy',
			onFail: $empty,
			onSuccess: false,
			showErrorsInline: true,
			label: 'Please wait...'    	    	
		},
		initialize: function(form, options){
			if(form){this.form = $(form)};
			if(!this.form) return false;
			
			this.setOptions(options);			
			
			this.elements = this.form.getElements('.required');
			
			this.elements.each(function(el,i){
				if(this.options.validateOnBlur){
					el.addEvent('blur', this.validate.bind(this, el));
				}
			}.bind(this)); //end each
			
			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.erase(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)); //end addEvent
			
		}, //end initialize
		
		getList: function(){
			var list = new Element('ul');
			this.list.each(function(el,i){
				if(el.title != ''){
				var li = new Element('li').inject(list);
				new Element('label').setProperty('for', el.id).set('text', el.title).inject(li); 
				}
			});
			return list;
		},

	
	validate: function(el){
		var valid = true;
		this.clearMsg(el);
		this.clearOk(el);
		
		switch(el.type){
			case 'text':
			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;
							this.setOk(el);
						}else{
							valid = false;
							this.setMsg(el, 'Please enter a valid email address');
						}
					}
					else	if(el.hasClass('number')){
						var regNum = /[-+]?[0-9]*\.?[0-9]+/;
						if(el.value.match(regNum)){
							valid = true;
							this.setOk(el);
						}else{
							valid = false;
							this.setMsg(el, 'Please enter a valid number');
						}
					}
					else 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;
							this.setOk(el);
						}else{
							valid = false;
							this.setMsg(el, 'Please enter a valid postcode');
						}
					}
					else if(el.hasClass('date')){
						var d = Date.parseExact(el.value, this.options.dateFormat);
						if(d != null){
							valid = true;
							this.setOk(el);
						}else{
							valid = false;
							this.setMsg(el, 'Please enter a valid date in the format: '+this.options.dateFormat.toLowerCase());
						}
					}
					else{
						this.setOk(el);
					}
					
				}else{
					valid = false;
					this.setMsg(el);
				}
				break;
				
			case 'checkbox':
				if(!el.checked){
					valid = false;
					this.setMsg(el);
				}else{
					valid = true;
					this.setOk(el);
				}
				break;
				
			case 'radio':
				var rad = $A(this.form[el.name]);
				var ok = false;
				rad.each(function(e,i){
					if(e.checked){
						ok = true;
						this.setOk(el);
					}
				});
				if(!ok){
					valid = false;
					this.setMsg(rad.getLast(), 'Please select an option');
				}else{
					valid = true;
					this.clearMsg(rad.getLast());
					this.setOk(rad.getLast());		
				}
				break;
				
		}
		return valid;
	}, // end validate
	
	setMsg: function(el, msg){
		if(msg == undefined){
			msg = el.title + ' is required';
		}
		if(this.options.showErrorsInline){
			if(el.error == undefined){
				el.error = new Element('span').addClass(this.options.errorMsgClass).set('html',msg).inject(el,'after');
			}else{
				el.error.set('text',msg);
			}
			el.addClass(this.options.errorClass);
		}
	}, // end setMsg
	
	setOk: function(el){
		if(el.ok == undefined){
			el.ok = new Element('span').addClass(this.options.okMsgClass).set('html','&nbsp;').inject(el,'after');
		}
		
	},
	
	clearOk: function(el){
		if(el.ok != undefined){
			el.ok.dispose();
			el.ok = undefined;
		}		
	},
	
	clearMsg: function(el){
		el.removeClass(this.options.errorClass);
		if(el.error != undefined){
			el.error.dispose();
			el.error = undefined;
		}
	} // end clearMsg 

});
