
/**************************************************************

	Script		: Validate
	Version		: 2.1
	Authors		: DMT Media
	Desc		: Form validation
	Licence		: Copyright 2008

**************************************************************/

var Validate = new Class({
	
	getOptions: function(){
		return {
			invalidFieldClass: 'invalid_field',
			validFieldClass: 'valid_field',
			invalidMsgClass: 'invalid_message',
			validMsgClass: 'valid_message',
			dateFormat: 'dd/MM/yy',
			onFail: Class.empty,
			label: 'Processing...'
		};
	},

	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){

		switch(el.type){
			case 'text':
			case 'textarea':
			case 'password':
			el.addEvent('keyup', this.validate.bind(this, el));
			break;
			
			case 'file':
			case 'select-one':
			case 'select-multiple':
			case 'checkbox':
			case 'radio':
			el.addEvent('change', this.validate.bind(this, el));
			break;
		}
		
		}.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{
					/* Process Form */
				}
			}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 'hidden':
				case 'file':
				
				if(el.hasClass('required')){
						var requiredValue = el.value;
						
						if(requiredValue != ''){
							valid = true;
							this.setMsg(el, '\u00A0', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Required', 'fail');
						}
					}
					
					if(el.hasClass('match_new')){

						var requiredValue1 = el.value;
						var requiredValue2 = $E('.match').value;
						
						if(requiredValue1 == requiredValue2 && requiredValue != ''){
							valid = true;
							this.setMsg(el, '\u00A0', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Required', 'fail');
						}
					}

					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.setMsg(el, '\u00A0', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Type a valid email address', 'fail');
						}
					}
					
					if(el.hasClass('number')){
						var regNum = /[-+]?[0-9]*\.?[0-9]+/;
						if(el.value.match(regNum)){
							valid = true;
							this.setMsg(el, '\u00A0', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Numbers only', 'fail');
						}
					}
					
					if(el.hasClass('zip')){
						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.setMsg(el, '\u00A0', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Enter a valid postcode', 'fail');
						}
					}
					
					if(el.hasClass('date')){
						var d = Date.parseExact(el.value, this.options.dateFormat);
						if(d != null){
							valid = true;
							this.setMsg(el, '\u00A0', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Date in the format: '+this.options.dateFormat.toLowerCase(), 'fail');
						}
					}
					
					if(el.hasClass('phone')){
						var regNum = /([\(\+])?([0-9]{1,3}([\s])?)?([\+|\(|\-|\)|\s])?([0-9]{2,4})([\-|\)|\.|\s]([\s])?)?([0-9]{2,4})?([\.|\-|\s])?([0-9]{4,8})/;
						if(el.value.match(regNum)){
							valid = true;
							this.setMsg(el, '\u00A0', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Enter a valid phone number', 'fail');
						}
					}
					
					if(el.hasClass('url')){
						var regNum = /^((([hH][tT][tT][pP][sS]?|[fF][tT][pP])\:\/\/)?([\w\.\-]+(\:[\w\.\&%\$\-]+)*@)?((([^\s\(\)\<\>\\\"\.\[\]\,@;:]+)(\.[^\s\(\)\<\>\\\"\.\[\]\,@;:]+)*(\.[a-zA-Z]{2,4}))|((([01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}([01]?\d{1,2}|2[0-4]\d|25[0-5])))(\b\:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)\b)?((\/[^\/][\w\.\,\?\'\\\/\+&%\$#\=~_\-@]*)*[^\.\,\?\"\'\(\)\[\]!;<>{}\s\x7F-\xFF])?)$/;
						if(el.value.match(regNum)){
							valid = true;
							this.setMsg(el, '\u00A0', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Url: http://www.website.com', 'fail');
						}
					}

				break;

			case 'textarea':
				if(el.hasClass('required')){
						var requiredValue = el.value;
						if(requiredValue != ''){
							valid = true;
							this.setMsg(el, 'Text entry present', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Text entry is required', 'fail');
						}
					}
			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(), 'Select an option', 'fail');
				}else{
					valid = true;
					this.setMsg(rad.getLast(), 'Option selected', 'success');
				}
				break;
				
				
				
				
								
			case 'checkbox':
				if(!el.checked){
					valid = false;
					this.setMsg(el, 'This option is required', 'fail');
				}else{
					valid = true;
					this.setMsg(el, 'Option selected', 'success');
				}
				break;
				
				
				case 'select-multiple':
				
				if(el.hasClass('required')){
						var requiredValue = el.value;
						
						if(requiredValue != ''){
							valid = true;
							this.setMsg(el, 'Option selected', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Selection required', 'fail');
						}
					}
				break;
				
			case 'select-one':	
							if(el.hasClass('required')){
						var requiredValue = el.value;
						
						if(requiredValue != ''){
							valid = true;
							this.setMsg(el, '\u00A0', 'success');
						}else{
							valid = false;
							this.setMsg(el, 'Selection required', 'fail');
				}
			}
					
			break;		
					
		}
		return valid;
	},
	
	setMsg: function(el, msg, msgType){
	
			if(msgType == 'fail' && el.title != ''){
			msg = el.title;
			}
			
		
		if(el.alert_msg == undefined){
			switch(el.type){
				case 'textarea':
				case 'select-multiple':
				el.alert_msg = new Element('span').setText(msg).injectAfter(el);
				el.alert_msg.setStyle('clear','both');
				el.alert_msg.setStyle('display','block');
				break;
				
				case 'checkbox':
				case 'radio':
				el.alert_msg = new Element('span').setText(msg).injectAfter(el.getParent());
				el.alert_msg.setStyle('clear','both');
				el.alert_msg.setStyle('display','block');
				if(msgType == 'success'){
				el.getParent().getParent().removeClass(this.options.invalidFieldClass);
				el.getParent().getParent().addClass(this.options.validFieldClass);
				}else{
				el.getParent().getParent().removeClass(this.options.validFieldClass);
				el.getParent().getParent().addClass(this.options.invalidFieldClass);
				}
				break;
				
				default:
				el.alert_msg = new Element('span').setText(msg).injectAfter(el);
				break;
			}
		}else{
		
			switch(el.type){
				case 'checkbox':
				case 'radio':
				if(msgType == 'success'){
				el.getParent().getParent().removeClass(this.options.invalidFieldClass);
				el.getParent().getParent().addClass(this.options.validFieldClass);
				}else{
				el.getParent().getParent().removeClass(this.options.validFieldClass);
				el.getParent().getParent().addClass(this.options.invalidFieldClass);
				}
				break;
			}
			
			el.alert_msg.setText(msg);
			
		}
	
	if(msgType == 'success'){
		el.alert_msg.addClass(this.options.validMsgClass);
		el.addClass(this.options.validFieldClass);
		
		el.alert_msg.removeClass(this.options.invalidMsgClass);
		el.removeClass(this.options.invalidFieldClass);
	}else{
		el.alert_msg.removeClass(this.options.validMsgClass);
		el.removeClass(this.options.validFieldClass);
		
		el.alert_msg.addClass(this.options.invalidMsgClass);
		el.addClass(this.options.invalidFieldClass);
	}
	
	},
	
	clearMsg: function(el){ 
		el.removeClass(this.options.invalidFieldClass);
		el.removeClass(this.options.validFieldClass);
	
	if(el.alert_msg != undefined){
		el.alert_msg.remove();
		el.alert_msg = undefined;
	}
	}
	
});

Validate.implement(new Options);
Validate.implement(new Events);


/*************************************************************/

