var Validate = new Class({
	getOptions: function(){
		return {
			validateOnBlur: true,
			errorClass: 'error',
			validClass: 'valid',
			errorMsgClass: 'errorMessage',
			validMsgClass: 'validMessage',
			dateFormat: 'dd/MM/yy',
			onFail: Class.empty,
			onSuccess: false,
			showErrorsInline: true,
			label: 'This might take 1-2 Minutes - Please wait...'
		};
	},

	initialize: function(form, options){
		this.setOptions(this.getOptions(), options);
		
		this.form = $(form);
		this.elements = this.form.getElements('.required');
		this.list = [];
		this.d ="";		
		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{
					event.stop();
					$('submit').setProperty('value',this.options.label);
					$('submit').setProperty('disabled','true');
					$('response_msg').setStyle('display', 'block');
					var log = $('response_msg').empty().addClass('ajax-loading');
					new Fx.Style($('my_form'), 'opacity').set(0.2);
					$('failedtocomplete').setProperty('value','1');
					$('signupsubmit').send({
						onSuccess: function(myresponse){
                 				       log.removeClass('ajax-loading');
							$('my_form').setStyle('display', 'none');
							$('submit').setStyle('display', 'none');
							 log.adopt(new Element('div').setHTML(myresponse));
      						  	// if ($('cc') != null){
							//	$('phone_verify').setStyle('display', 'block');
                                                         //}
               					},
				                onFailure: function(myerror){
				                       log.removeClass('ajax-loading');
							$('submit').removeProperty('disabled');
                                                        $('submit').setProperty('value','Try Again!');
                                                        new Fx.Style($('my_form'), 'opacity').start(0.2,1);
							log.adopt(new Element('div').setHTML(myerror.responseText));
                				}
	    				});
				}
			}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;
							this.setValid(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.setValid(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.setValid(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.setValid(el);
						}else{
							valid = false;
							this.setMsg(el, 'Please enter a valid date in the format: '+this.options.dateFormat.toLowerCase());
						}
					}
					else if(el.hasClass('login')) {
						var myCall = new Ajax('index.php?option=com_hsphere&format=raw&task=checklogin&mylogin='+el.value,{
								method: 'get'
							});
						myCall.addEvent('onComplete', function(response) {
							// d = response.substr(6,(response.length-12));
							// d = response;
					                 if( response == ""){
							 	valid = true;
								 el.valid = new Element('span').addClass('validMessage').setText('').injectAfter(el);
					                         el.addClass('valid');
					                  }else{
						                 valid = false;
								 el.error = new Element('span').addClass('errorMessage').setText('Please choose a different Username').injectAfter(el);
								 el.addClass('red');
                					 }	

								
						}
						);
						myCall.request();
/*						if(el.valid != undefined){
							 alert('VALID?!');
                                                       valid = true;
                                                }
                                                else {
                                                        valid = false;
                                                }
*/


                                        }
					else if(el.hasClass('required')){
					valid = true;
                                        this.setValid(el);
					}
					
				}else{
					valid = false;
					this.setMsg(el);
				}
				break;
				
			case 'checkbox':
				if(!el.checked){
					valid = false;
					this.setMsg(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.setMsg(rad.getLast(), 'Please select an option');
				}else{
					valid = true;
					this.clearMsg(rad.getLast());
				}
				break;
				
		}
		//if (valid) {
		//	this.setValid(el);
		//}
		return valid;
	},
	
	setMsg: function(el, msg){
		if(msg == undefined){
			msg = el.title;
		}
		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);
			}
			el.addClass(this.options.errorClass);
		}

	},
	setValid: function(el){
                        el.valid = new Element('span').addClass(this.options.validMsgClass).setText('').injectAfter(el);
                        el.addClass(this.options.validClass);

        },
	
	clearMsg: function(el){
		el.removeClass(this.options.validClass);
		el.removeClass(this.options.errorClass);
		if(el.error != undefined){
			el.error.remove();
			el.error = undefined;
		}
		if(el.valid != undefined){
                        el.valid.remove();
                        el.valid = undefined;
                }
	}
	
});

Validate.implement(new Options);
Validate.implement(new Events);


/*************************************************************/


