function JQForm(){
	var arrayItens = new Array();
	this.valid = true;
	var customErrorMsg = "";
	var AllErrorMsg ="";
	/*
	ADDPARAMETER
	Adiciona um parametro a ser validado:
		Target: Elemento (ou grupo de) alvo da validação;
		ValType: Tipo de dado o qual o alvo deve corresponder;
		errorMsg: Mensagem de erro para esse campo em especifico;
	*/
	this.setErrorMsg = function(newErrorMsg){
		customErrorMsg = newErrorMsg;
	}
	this.addParameter = function(target,valType,errorMsg){
		var singleItem = new Array(3);
			singleItem[0] = target;
			singleItem[1] = valType;
			singleItem[2] = errorMsg;
			
		arrayItens[arrayItens.length] = singleItem;
	}
	/*TIPOS DE VALIDACAO*/
	/*Valida se é um email válido*/
	var isEmail = function(target,mode) {
		var allValid = true;
		$(target).each(function(){
			var string = $(this).val();
			var isValidEmail = true;
			var emails;
			if(mode == "multiple"){
				string = string.replace(";",",");
				emails = string.split(",");	
				for(x=0;x<emails.length;x++){
					if (emails[x].search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1){
						allValid = false;
					}
				}
			}else{
				emails = string;
				if (emails.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1)
				allValid = false;
			}
		});
		return allValid;
	}
	/*Valida qtde caracteres*/
	var charCount = function(target,param){
		var allValid = true;
		$(target).each(function(){
			var charSize = $(this).val().length;
			
			if(param.split("..").length==2){
				var numbers = param.split("..");
				if((charSize<numbers[0])||(charSize>numbers[1])){
					allValid = false;
				}
			}else{
				switch(param.substr(param.length-1,param.length)){
					case "+": 
						if(charSize<(param.substr(0,param.length-1)))allValid = false;
						
						break;
					case "-": 
						if(charSize>(param.substr(0,param.length-1)))allValid = false;
						break;
					
					default: if(charSize!=param)allValid = false;
				}
			}
		});
		
		return allValid;
	}
	/*Valida se numérico*/
	var isNumber = function(target,param){
		var allValid = true;
		$(target).each(function(){
			var numberCompare;	
			if(numberCompare = $(this).val().match("^[0-9]*$")){
				if(param!=""){
					if(param.split("..").length==2){
						var numbers = param.split("..");
						if((numberCompare<numbers[0])||(numberCompare>numbers[1])){
							allValid = false;
						}
					}else{
						switch(param.substr(param.length-1,param.length)){
							case "+": 
								if(numberCompare<param.substr(0,param.length-1))allValid = false;
								break;
							case "-": 
								if(numberCompare>param.substr(0,param.length-1))allValid = false;
								break;
							
							default: if(numberCompare!=param)allValid = false;
						}
					}
				}
			}else{
				allValid = false;
			}
			
		});
		
		return allValid;
	}
	/*Valida se Alpha*/
	var isAlpha = function(target,param){		
		var allValid = true;
		$(target).each(function(){
			if(param!=""){
				if(!charCount(target,param)){
					allValid = false;
				}
			}
			
			if(!$(this).val().match("^[a-zA-ZÀ-ü ]*$"))
				allValid = false;
			
		});
		return allValid;
	}
	/*Valida se AlphaNumber*/
	var isAlphaNumber = function(target,param){		
		var allValid = true;
		$(target).each(function(){
			if(param!=""){
				if(!charCount(target,param)){
					allValid = false;
				}
			}
			
			if(!$(this).val().match("^[a-zA-ZÀ-ü0-9]*$"))
				allValid = false;
			
		});
		return allValid;
	}
	/*Valida Expressão Regular*/
	var ereg = function(target,param){
	
		var allValid = true;
		$(target).each(function(){
						
			if(!$(this).val().match(param))
				allValid = false;
			
		});
		return allValid;
	}
	/*Valida Iqualdade*/
	var isEqual = function(target,param){		
		var allValid = true;
		$(target).each(function(){
			
			if($(this).val()!=$(param).val()){
				allValid = false;
			}
		});
		
		return allValid;
	}
	/*Valida se checado*/
	var isChecked = function(target,param){		
		var allValid = true;
		$(target).each(function(){
			allValid = ($(this).attr('checked'));
		});
		
		return allValid;
	}
	
	var isDate = function(target,param){		
		var allValid = true;
		var ereg ;
		switch(param.toUpperCase()){
			case "BR":
				ereg = "^(?:(?:(?:0?[1-9]|1\d|2[0-8])\/(?:0?[1-9]|1[0-2]))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$|^(?:(?:(?:31\/0?[13578]|1[02])|(?:(?:29|30)\/(?:0?[1,3-9]|1[0-2])))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$|^(?:29\/0?2\/(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26]))))$";
				break;
			case "US":
				ereg = "^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$";
				break;
			default:
				ereg = "^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$";
				
		}
		$(target).each(function(){
						
			if(!$(this).val().match(param))
				allValid = false;
			
		});
		return allValid;
	}
	
	/*Error Engine*/
	var appendError = function(elem){
		AllErrorMsg = AllErrorMsg + arrayItens[elem][2] +" \n";
	}
	var sendError = function(errorMode,errorFunc){
		if(AllErrorMsg.length>0){
			AllErrorMsg = customErrorMsg+AllErrorMsg;
			switch(errorMode){
				case "alert":
					alertError();
					break;
				case "modal":
					break;
				default:
					divError(errorMode,errorFunc);
			}
		}
	}
	var alertError = function(){
		alert(AllErrorMsg);
		AllErrorMsg ="";
	}
	var divError = function(errorMode,errorFunc){
		appendMsg = AllErrorMsg.split("\n");
		$(errorMode).empty();
		for(x=0;x<appendMsg.length;x++){
			
			$(errorMode).append(appendMsg[x]+"<br>");
		}
		
		if(errorFunc){
			errorFunc();
		}
		AllErrorMsg ="";
	}
	
	/*Val sender*/
	var isValid = function(target,valType){
		var valid ;
		var valereg = valType;
		valType = valType.split("[");
		varFunc = valType[0];
		varParam = valType[1].replace("]","");
		switch(varFunc){
			case "isEmail": 
				valid = isEmail(target,varParam);
				break;
			case "charCount": 
				valid = charCount(target,varParam);
				break;
			case "isNumber": 
				valid = isNumber(target,varParam);
				break;
			case "isAlpha": 
				valid = isAlpha(target,varParam);
				break;
			case "isAlphaNumber":
				valid = isAlphaNumber(target,varParam);
				break;
			case "ereg":
				var newParam = valereg.substr(5,valereg.length-6);
				valid = ereg(target,newParam);
	
				break;
			case "isEqual":
				valid = isEqual(target,varParam);
				break;
			case "isChecked":
				valid = isChecked(target,varParam);
				break;
		}
		return valid;
	}
	
	/*
	VALIDATE
	*/
	this.validate = function(){
		this.valid = true;
		
		for(x=0;x<arrayItens.length;x++){
			if(!isValid(arrayItens[x][0],arrayItens[x][1])){
				this.valid = false;
				appendError(x);
			}
		}
		
		
	}				
	this.send = function(errorMode,errorFunc){
		this.validate();
		//alert(this.valid);
		sendError(errorMode,errorFunc);
		return this.valid;
		//return false;
	}
}
			

