
/**************************************************************

	Script		: Validate
	Version		: 2.1
	Authors		: Samuel Birch
	Desc		: Form validation
	Licence		: Open Source MIT Licence

**************************************************************/
/**************************************************************
How to use:
REQUIRES Mootools 1.1+

- Each required field enter class='required' in the input field
- For the same field enter a title tag with a message to be displayed when the required field is not entered

- For email fields add email to the class

- For checking one email field against another,
   1. add confemail to the class
   2. be sure the emailFieldId is what shows below. This can be changed by using setoptions in the Javascript

Language customization for error messages can be done via the the initiation process.

Add the following initialization code:
NOTE: 'formBuilder' must be replaced with the name of your form being validated
<script type="text/javascript"><!--
//<![CDATA[ 
	window.addEvent('domready', function(){
		var myFormValidation = new Validate('formBuilder',{
			errorClass: 'red',
			emailFieldID: 'form-1',
			msgWaitLabel: 'Tunggu...',  
			msgEnterSameEmail: 'Email harus sama',
			msgInvalidEmail: 'Harus bentuk email yang valid',
			msgEnterNumber: 'Tolong masukkan angka',
			msgEnterDateInFormat: 'Masukkan tanggal dalam bentuk ',
			msgCheckBox: 'Harus disetujui',
			msgSelectOne: 'Tolong pilih salah satu'
			});
			});
//]]>
// --></script>

***************************************************************/

var Validate = new Class({

	getOptions: function(){
		return {
			validateOnBlur: true,
			errorClass: 'error',
			errorMsgClass: 'errorMessage',
			dateFormat: 'dd/MM/yy',
			onFail: Class.empty,
			onSuccess: false,
			showErrorsInline: true,
			emailFieldID: 'emailID',
			msgWaitLabel: 'Please wait...',  
			msgEnterSameEmail: 'Email addresses must match',
			msgInvalidEmail: 'Email must be valid email format (e.g., name@server.com)',
			msgEnterNumber: 'Please enter a number',
			msgEnterDateInFormat: 'Please enter date in dd/mm/yy form ',
			msgCheckBox: 'Must be checked',
			msgSelectOne: 'Please select one option'
		};
	},

	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){
				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.msgWaitLabel);
				}
			}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 '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, this.options.msgInvalidEmail);
						}
					}
					if(el.hasClass('confirmemail')){
				    if(el.value.toLowerCase() != $(this.options.emailFieldID).value.toLowerCase()){
						  valid = false;
						  this.setMsg(el, this.options.msgEnterSameEmail);
					}else{
						  valid = true;
					}
                  }
					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.msgEnterNumber);
						}
					}
					
					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, 'Please enter a valid postcode');
						}
					}
					
					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.msgEnterDateInFormat);
						}
					}
					
				}else{
					valid = false;
					this.setMsg(el);
				}
				break;
				
			case 'checkbox':
				if(!el.checked){
					valid = false;
					this.setMsg(el,this.options.msgCheckBox);
				}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(), this.options.msgSelectOne);
				}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('p').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);


/*************************************************************/

