
/**************************************************************

	Script		: Validate
	Version		: 2.1
	Authors		: Samuel Birch - customized/modified by Reece Cox 
	Desc		: Form validation
	Licence		: Open Source MIT Licence

**************************************************************/

var Validate = new Class({
	
	getOptions: function(){
		return {
			validateOnBlur: true,
			errorClass: 'validation-failed',
			validClass: 'validation-valid',
			errorMsgClass: 'errorMessage',
			dateFormat: 'dd/MM/yy',
			mmyyDateFormat: 'MM/yy',
			onFail: Class.empty,
			onSuccess: false,
			showErrorsInline: true,
			label: 'Please wait...'
		};
	},

	initialize: function(form, options){
		this.setOptions(this.getOptions(), options);
		
		this.form = $(form);
		this.elements = this.form.getElements('.required');

		this.list = [];

		this.focus = false;
		
		this.elementsAll = this.form.getElements('input,textarea,select');
		
		this.elementsAll.each(function(el,i){
			
			if ( el.get('type') != 'radio' ){
				new Element('div', {'class': 'inputErrorIndicator','styles': { 'top': 0,'left': 0 }}).inject(el, 'after');
			}
			
			/*
			el.addEvent('focus', this.showMsg.bind(this));
			el.addEvent('blur', this.hideMsg.bind(this));
			*/
			el.addEvent('mouseover',this.showMsg.bind(this));
			el.addEvent('mouseout',this.hideMsg.bind(this));
			
			if(this.options.validateOnBlur){
				el.addEvent('blur', this.validate.bind(this, el));
			}

		}.bind(this));

/*
		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;
	},

	validateWithin: function(within){
		this.within_form = $(within);
		this.within_elementsAll = this.within_form.getElements('input,textarea,select');
		
		var allValidated = true;
		this.within_elementsAll.each(function(el,i){
			if(!this.validate(el)){
				allValidated = false;
			}
		}.bind(this));
		
		if (allValidated == false){
			return false;	
		} else {
			return true;
		}
	},
	
	validateAll: function(){
		var allValidated = true;
		this.elementsAll.each(function(el,i){
			if(!this.validate(el)){
				allValidated = false;
			}
		}.bind(this));

		if (allValidated == false){
			return false;	
		} else {
			return true;	
		}
	},

	validate: function(el){
		var valid = true;
		this.setValid(el);

		switch(el.type){
			case 'text':
			case 'textarea':
			case 'select-one':

				if (el.get('autotext')){
					if( el.get('autotext') == el.get('value') && el.hasClass('required') ){
						valid = false;
						this.setNotValid(el);
					}
				}

				if ( valid ){
					if (el.get('autotext') != el.get('value')){
						if (el.get('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.setNotValid(el);
								}
							}

							if(el.hasClass('number')){
								var regNum = /^[0-9\ \-\+]+$/;
								if(el.value.match(regNum)){
									valid = true;
								}else{
									valid = false;
									this.setNotValid(el);
								}
							}


                                                        if(el.hasClass('phonenumber')){
                                                            var regPhonenumber = /^((00|\+)44|0)\d{6,10}$/;
                                                            var phonenumber = (el.value).replace(/\s/g,'');
                                                            if ( regPhonenumber.test(phonenumber) ){
                                                                valid = true;
                                                            } else {
                                                                valid = false;
								this.setNotValid(el);
                                                            }
                                                        }


							if(el.hasClass('postcode')){
								var regPC = /^GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW]) [0-9][ABD-HJLNP-UW-Z]{2}$/;
								var sPostCode = el.value;
								sPostCode = sPostCode.split(' ').join('').toUpperCase();
								sPostCode = sPostCode.substring(0, sPostCode.length-3) + ' ' + sPostCode.substring(sPostCode.length-3, sPostCode.length);
								if( sPostCode.match(regPC) ){
									el.value = sPostCode;
									valid = true;
								} else {
									valid = false;
									this.setNotValid(el);	
								}
							}
							
							if(el.hasClass('date')){
								var d = Date.parseExact(el.value, this.options.dateFormat);
								if(d != null){
									valid = true;
								}else{
									valid = false;
									this.setNotValid(el);
								}
							}

							if(el.get('minlength')){
                                                            if ( el.get('value').length < el.get('minlength') || el.get('value')=='' ){
                                                                valid = false;
								this.setNotValid(el);
                                                            } else {
                                                                valid = true;
                                                            }
							}
								
							if(el.hasClass('url')){
								var regPC = /https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?/;
								if(el.value.match(regPC)){
									valid = true;
								}else{
									valid = false;
									this.setNotValid(el);
								}
							}
							
							// CARD VALIDATION
							if(el.hasClass('card')){
								var number = el.value;
								number=number.replace(/\D/g, '');
								var number_length=number.length;
								var parity=number_length % 2;
								var total=0;
								for (i=0; i < number_length; i++) {
									var digit=number.charAt(i);
									if (i % 2 == parity) {
										digit=digit * 2;
										if (digit > 9) { digit=digit - 9; }
									}
									total = total + parseInt(digit);
								}
								if (total % 10 == 0) {
									valid = true;
								} else {
									valid = false;
									this.setNotValid(el);
								}
							}
							
							if(el.hasClass('match')){
								if ( el.get('toMatch') ){
									var value = el.value;
									var valueToMatch = $(el.get('toMatch')).value;
									if ( value == valueToMatch ){
										valid = true;	
									} else {
										valid = false;
										this.setNotValid(el);
									}
								}
							}
							
						} else if (el.hasClass('required')) {
							valid = false;
							this.setNotValid(el);
						}
						
					} else {
						valid = true;
						//valid = false;
						//this.setNotValid(el);
					}
					
					/*
					if ( valid ){
						this.setNotValid(el);
					} else {
						this.setValid(el);
					}
					*/
					
				} // if still valid

				break;
				
			case 'checkbox':
				if(!el.checked && el.hasClass('required')){
					valid = false;
					this.setNotValid(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.setNotValid(rad.getLast());
				}else{
					valid = true;
					this.setValid(rad.getLast());
				}
				break;
		}
		
		
		return valid;
	},
	
	showMsg: function(e){
		var el = e.target;
		var fieldInfo = el.getParent().getLast();
		if ( e.type == 'focus' ){
			this.focus = el;
		}
		
		var elCoor = el.getCoordinates();
		
		if ( fieldInfo.hasClass('field_info') ) {
			fieldInfo.setStyles({'top':elCoor['top'], 'left':elCoor['right']-8});
			fieldInfo.setStyle('display','block');
		}		
	},

	hideMsg: function(e){
		var el = e.target;
		var fieldInfo = el.getParent().getLast();
		if ( this.focus != el || e.type == 'blur' ){
			if ( fieldInfo.hasClass('field_info') ) {
				fieldInfo.setStyle('display','none');
			}
		}
	},
	
	setNotValid: function(el, msg){
		if ( !el.hasClass('noIcon') && el.get('type') != 'radio' ){
			if ( !this.checkAutotext(el) ){
				el.getNext().removeClass('inputOk');
				el.getNext().addClass('inputError');
				
				var elCoor = el.getCoordinates();
				if ( el.type == 'select-one' ){ var rightPx = (+2); } else { var rightPx = (-20); }
				el.getNext().setStyles({ 'top': elCoor['top']+4,'left': elCoor['right']+(rightPx) });
			} else {
				el.getNext().removeClass('inputOk');
				el.getNext().removeClass('inputError');
			}
		}
		el.addClass(this.options.errorClass);
		el.removeClass(this.options.validClass);
	},
	
	setValid: function(el){
		if ( !el.hasClass('noIcon') && el.get('type') != 'radio' ){
			el.getNext().removeClass('inputOk');
			el.getNext().removeClass('inputError');	
			
			if ( !this.checkAutotext(el) ){
				el.getNext().removeClass('inputError');
				el.getNext().addClass('inputOk');
				
				var elCoor = el.getCoordinates();
				if ( el.type == 'select-one' ){ var rightPx = (+2); } else { var rightPx = (-20); }
				el.getNext().setStyles({ 'top': elCoor['top']+4,'left': elCoor['right']+(rightPx) });
			} else {
				el.getNext().removeClass('inputOk');
				el.getNext().removeClass('inputError');
			}
		}
		el.removeClass(this.options.errorClass);
		el.addClass(this.options.validClass);
	},
	
	checkAutotext: function(el){
		if ( el.get('autotext') && !el.hasClass('required') ){
			if (el.get('autotext') == el.get('value')){
				return true;
			}
		}
		return false;
	}
	
	
});

Validate.implement(new Options);
Validate.implement(new Events);
