﻿
/**************************************************************

	Script		: Validate
	Version		: 2.1
	Authors		: Samuel Birch
	Desc		: Form validation
	Licence		: Open Source MIT Licence

**************************************************************/
var errMsg=new Array();



var Validate = new Class({
	
	getOptions: function(){
		return {
			errorClass: 'error',
			errorMsgClass: 'errorMessage',
			container: 'validateContent',
			onFail: Class.empty,
			onSuccess: false,
			showErrorsInline: false,
			label: 'Please wait...',
			skip: false
		};
	},

	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){
                        this.validate(el);
			el.addEvent('blur', this.validate.bind(this, el));
		}.bind(this));
		
		this.form.addEvent('submit', function(e){
			var event = new Event(e);
			var doSubmit = true;
			if (this.options.skip){this.options.skip==false;return;}
			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{
				var container=$(this.options.container).empty();
				this.getList().injectInside(container);
				this.options.onFail();
			}
		}.bind(this));
	},
	
	getList: function(){
		var list = new Element('ul');
		this.list.each(function(el,i){
			if (el.error != undefined){
				var li = new Element('li').injectInside(list);
				if($type(el.error)=='string'){
					new Element('span').setText(el.getPrevious().title+": "+el.error).injectInside(li);
				}else{
					el.error.clone().setText(el.getPrevious().title+": "+el.error.getText()).injectInside(li);
				}
			}
		});
		return list;
	},
	
	validate: function(el){
		var valid = true;
		this.clearMsg(el);

		switch(el.type){
			case 'text':
			case 'textarea':
			case 'file':
			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 = false;
							this.setMsg(el, validationI18N.glp('mail'));
						}
					}
					
					if(el.hasClass('number')){
						var regNum = /[-+]?[0-9]*\.?[0-9]+/;
						if(!el.value.match(regNum)){
							valid = false;
							this.setMsg(el, validationI18N.glp('number'));
						}
					}
					
					if(el.hasClass('date')){	 
						var formDate = /^(\d{4})-(\d{2})-(\d{2})$/;
						if(!el.value.match(formDate)) {
							valid = false;
							this.setMsg(el, validationI18N.glp('date'));
						}
					}
					
					if(el.hasClass('day')){
						if(el.value<1 || el.value>31) {
							valid = false;
							this.setMsg(el, validationI18N.glp('day'));
						}
					}

					if(el.hasClass('year')){
						var formDate = /^(\d{4})$/;
						if(!el.value.match(formDate)) {
							valid = false;
							this.setMsg(el, validationI18N.glp('year'));
						}
					}
					
				}else{
					valid = false;
					this.setMsg(el, validationI18N.glp('required'));
				}
				break;

			case 'hidden': //for contributors
				if(el.hasClass('netid')){
				    var sumitterMatch = false;
					var objs = this.form.getElements('.netid');
					objs.each(function(e,i){
						if (e.value == currUser){
							sumitterMatch = true;
						}
					});
					if(!sumitterMatch){
						valid = false;
						this.setMsg(el, validationI18N.glp('author'));
					}
				}
				break;
				
			case 'checkbox':
			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(), validationI18N.glp('option'));
				}
				break;
		}
		return valid;
	},
	
	setMsg: function(el, msg){
		if(this.options.showErrorsInline){
			if(el.error == undefined){
				el.error = new Element('span').addClass(this.options.errorMsgClass).setText(msg).injectAfter(el);
			}else{
				el.error.setText(msg);
			}
		}else{
			el.error = msg;
		}
		if(el.type == 'radio' || el.type == 'checkbox') {
			el.getParent().addClass(this.options.errorClass);
		}
		else {
			el.addClass(this.options.errorClass);
		}
	},
	
	clearMsg: function(el){
		if(el.type == 'radio' || el.type == 'checkbox') {
			el.getParent().removeClass(this.options.errorClass);
		}else{el.removeClass(this.options.errorClass);}
		if(el.error != undefined){
		    if(this.options.showErrorsInline){
				el.error.remove();
			}
			el.error = undefined;
		}
	},
	
	skip: function(){
		this.options.skip=true;
	}
});

Validate.implement(new Options);
Validate.implement(new Events);


/*************************************************************/


