var validationBehaviours =
{
	//behaviour attached to the validation function of an element with class mandatory
	".v-mandatory":function(el){
		//if it's an input button
		if(el.nodeName.toUpperCase() == "INPUT"){
			
			//check for previous validation
			try{
				if(el.validate.push){}
			}catch(e){
				el.validate = new Array();
			}
			//what type of validation
			switch(el.type){
				case "text":
				case "hidden":
				case "password": // for Text or Password field
					el.validate.push(function(element){
						if(element.value.length < 1 || element.value == element.title){
								jQuery(el).parents("form").each(function(){
									this.errorStack.push({errorName:'v-mandatory',name:el.name.toString(),obj:el,label:jQuery("label[@for*='"+el.id+"']")[0]});

								});
						}
					});
					break;
				case "file":
					el.validate.push(function(element){
						if(element.value.length < 1 || element.value == element.title){
								jQuery(el).parents("form").each(function(){
									this.errorStack.push({errorName:'v-mandatory',name:el.name.toString(),obj:el,label:jQuery("label[@for*='"+el.name+"']")[0]});

								});
						}
					});						
				break;
				case "radio":
				case "checkbox": 
					el.validate.push(function(el){
							var valid = false;
							jQuery("input[@name='"+el.name+"']").each(function(){
								if(this.name == el.name){										
									if(this.checked){valid = true;}
								}
							});
							if(!valid){
								jQuery(el).parents("form").each(function(){
									this.errorStack.push({errorName:'v-mandatory',name:el.name.toString(),obj:el,label:jQuery("label[@for*='"+el.id+"']")[0]});

								});
							}
							jQuery(el).parents("form").each(function(){
								this.stopCheck.push(el.name);
							});
					});
				break;
				case "image":
				case "submit":
				case "button":
				default:
				
			}
		}
		//if it's a select box 
		if(el.nodeName.toUpperCase() == "SELECT"){
			//check for previous validation
			if(typeof el.validate == "undefined"){
				el.validate = new Array();
			}				
			el.validate.push(function(el){
				var valid = false;
				if(typeof validateConfig != "undefined" && typeof validateConfig["selectErrorOptions"] != "undefined" && typeof validateConfig["selectErrorOptions"][el.name] != "undefined"){
					if(el.value != validateConfig["selectErrorOptions"][el.name]){valid = true;}
				}else{
					if(el.value != -1){valid = true;}
				}
				
				if(!valid){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-mandatory',name:el.name.toString(),obj:el,label:jQuery("label[@for*='"+el.id+"']")[0]});

					});
				}
			});
			
		}
		// if it's a textarea
		if(el.nodeName.toUpperCase() == "TEXTAREA"){
			//check for previous validation
			if(typeof el.validate == "undefined"){
				el.validate = new Array();
			}				
			el.validate.push(function(element){
				if(!element.value.length){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-mandatory',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

					});
				}
			});			
		}
	},
	".v-postalCode":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(!/^([a-zA-Z]{1}\d{1}[a-zA-Z]{1}\s?\d{1}[a-zA-Z]{1}\d{1})?$/.test(el.value) && !/^(\d{5}((-|\s){1}\d{4})?)?$/.test(el.value)){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-postalCode',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});
					});
			}
		});			
	},
	".v-email":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(!/^(\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+)?$/.test(el.value)){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-email',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

					});
			}
		});
	},
	".v-numeric":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(!/^(\d+([\.]?\d+)?)?$/.test(el.value)){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-numeric',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

					});
			}
		});		
	},
	".v-currency":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(!/^((\$)?(\s)?\d+([\.]?\d+)?(\s)?(\$)?)?$/.test(el.value)){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-currency',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

					});
			}
		});		
	},
	".v-alpha":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(!/^([a-zA-Z\s]*)?$/.test(el.value)){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-alpha',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

					});
			}
		});		
	},
	".v-password":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}		
		el.validate.push(function(){
			try{
				var valid = true
				for(validate in validateConfig["vPasswordSecurity"]){
					var checkPassword = new RegExp(validateConfig["vPasswordSecurity"][validate],"g");
					if(!checkPassword.exec(el.value)){valid=false;}
				}
				if(!valid){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-password',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

					})
				}
			}catch(e){
			    alert("ERROR");
			}
		});				
	},
	".v-phone":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(!/^((\()?[\d]{3}(\))?(\s|-)?[\d]{3}(\s|-)?[\d]{4}((\s)+(ext|x|entension)?(\s)?(\d)+)?)?$/i.test(el.value)){
			    jQuery(el).parents("form").each(function(){
				    this.errorStack.push({errorName:'v-phone',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

			    });
		    }
		});			
	},
	"[@class*=v-min]":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		
		
		el.validate.push(function(el){
			var minlength = parseInt(el.className.split("v-min")[1].split(" ")[0]);
			if(el.value.length < minlength){
			    jQuery(el).parents("form").each(function(){
				    this.errorStack.push({errorName:'v-min'+minlength,name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

			    });
		    }
		});			
	},
	"[@class*=v-max]":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			var maxlength = parseInt(el.className.split("v-max")[1].split(" ")[0]);
			if(el.value.length > maxlength){
			    jQuery(el).parents("form").each(function(){
				    this.errorStack.push({errorName:'v-max'+maxlength,name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

			    });
		    }
		});			
	},	
	".v-FQDN":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(!/^(([a-zA-Z0-9]+([.\-_]?))*[a-zA-Z0-9]+([.]{1}[a-zA-Z]{2,3}){1})?$/.test(el.value)){
				jQuery(el).parents("form").each(function(){
					this.errorStack.push({errorName:'v-FQDN',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.name+"']")[0]});
				});
			}
		});		
	},
	".v-NOSpecial":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(!/^([a-zA-Z0-9_]*)?$/.test(el.value)){
				jQuery(el).parents("form").each(function(){
					this.errorStack.push({errorName:'v-NOSpecial',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.name+"']")[0]});

				});
			}
		});		
	},
	"#friend_0_name, #friend_1_name, #friend_2_name":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(!$('#friend_0_name, #friend_1_name, #friend_2_name').map(function(){if($(this).val() !== 'Name' && $(this).val() !== '' ) {return $(this).val();}}).length){
				jQuery(el).parents("form").each(function(){
					this.errorStack.push({errorName:'v-mandatory',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});

				});
			}else{
				
				if(el.value.length && el.value !== "Name"){
					if($('#'+el.id.replace('name','email')).val() == 'Email' || !$('#'+el.id.replace('name','email')).val().length){
						jQuery(el).parents("form").each(function(){
							this.errorStack.push({errorName:'v-mandatory',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});
						});
					}
				}			
			}
		});		
	},
	"#friend_0_email, #friend_1_email, #friend_2_email":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			if(el.value !== 'Email' && !/^(\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+)?$/.test(el.value)){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-email',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id.replace('email','name')+"']")[0]});

					});
			}
		});		
	},	
	".v-confirmation":function(el){
		if(typeof el.validate == "undefined"){
			el.validate = new Array();
		}
		el.validate.push(function(el){
			jQuery("#"+el.id.replace(validateConfig["confirmPrefix"],"")).each(function(){
				if(this.value != el.value){
					jQuery(el).parents("form").each(function(){
						this.errorStack.push({errorName:'v-confirmation',name:el.name.toString(),obj:el,label:jQuery("label[@for='"+el.id+"']")[0]});
					});
				}
			});
		});
	},
	"form.v-form":function(el){
		if(typeof el.validators == "undefined"){
			el.validators = new Array();
			for (selector in this){
				//if(selector.indexOf(".") != -1){
					el.validators.push(selector);
				//}
			}				
		}

	
		el.onsubmit = function(event){
			for(element in this.errorStack){
				try{
					this.errorStack[element].onPreCheck = validateConfig["onPreCheck"];
					this.errorStack[element].onPreCheck();
				}catch(e){
				}
			}
			this.errorStack = new Array();
			this.stopCheck = new Array();
			this.validate = new Array();
				try{
					jQuery("."+validateConfig["errorClass"]).each(function(){
							this.className = $(this).map(function(){ return this.className.split(" ") }).filter("."+validateConfig["errorClass"]).get().join(" ");
					});					
				}catch(e){
				}
			for( obj in this.validators){
				var valObj = this.validators[obj];
				jQuery(el).find(valObj).each(function(){
					var added = false;
					var element = this;
					jQuery(el.validate).each(function(){
						if(this.name == element.name){
							added = true;
						}
					});
					if(!added){
						el.validate.push(this);
					}

				});
			}
			jQuery(this.validate).each(function(){
				for(i=0; i < this.validate.length;i++){
					if(typeof this.validate[i] == "function" && !jQuery(this).parents(":hidden").length){
						this.validate[i](this);
					}
				}
			});

			if(this.errorStack.length){
				for(element in this.errorStack){
					try{
						this.errorStack[element].onError = validateConfig["onError"];
						this.errorStack[element].onError();						
					}catch(e){
					}
					
					try{
						if(validateConfig["errorNotificationType"] == 'label'){
							this.errorStack[element].label.className += " "+validateConfig["errorClass"];
						}
					}catch(e){
					}

				}
				try{
				    validateConfig["onPostError"](this.errorStack);
				}catch(e){
				}
				this.hasErrors = true;
				return false;
			}
			this.hasErrors = false;
			return true;
		}
	}
};
jQuery(function(){
	for(elements in validationBehaviours){
		jQuery(elements).each(function(){
			validationBehaviours[elements](this, elements);
		});
	}
});
var validateConfig = {
	errorClass:"error", 													//class for CSS error
	confirmPrefix:"confirm", 												//prefix for confirm validation fields
	errorContainerName:"div_error",
	selectErrorOptions: {numberofrooms: '', numoccupants: '', Shirt1: '', Shirt2: ''},
	errorNotificationType:"field",
	//onBlur:"",                                          
	onPreCheck:function(){
		jQuery(".error").removeClass("error");
		/*jQuery(".error").each(function(){
			this.className = this.className.replace(/\serror/ig,"");
		});*/
	},
	onError:function(){
	    this.label.className += " "+validateConfig["errorClass"];
	},
	onPostError:function(errorStack){
		var errors = '';
		var errorType = new Array();
		for(i=0; obj = errorStack[i]; i++){
			if(typeof this.errorMSG[obj['name']+obj['errorName']] === 'string' ){ errors += "<li>"+this.errorMSG[obj['name']+obj['errorName']]+"</li>" }else if(typeof this.errorMSG[obj['name']] === 'string' ){ errors += "<li>"+this.errorMSG[obj['name']]+"</li>" }else if(typeof this.errorMSG[obj['errorName']] === 'string' && $.inArray(obj['errorName'],errorType ) == -1 ){errorType.push(obj['errorName']); errors += "<li>"+this.errorMSG[obj['errorName']]+"</li>" }
		}
		jQuery('#div_error').append("<ol>"+errors+"</ol>").show();
	}
}
