//########################## INÍCIO DO OBJETO FilterForms() #######################################
function FilterForms(){
	/*
	*@author Fabrizio Silva Marmitt
	*@description objeto validador de formulários. Compatível com qualquer tipo de formulário
	*@observation este objeto necessita de um import do arquivo lib.function.js para funcionar adequadamente
	*/
	
	this.definingErros = function(errorCode,errorMessage){		
		defaultErrors = new Array('ERROR 101 : illegal characters','ERROR 102 : minimum size not reached','ERROR 103 : maximum size exceeded','ERROR 104 : empty field','ERROR 105 : illegal email format','ERROR 106 : illegal date format','ERROR 107 : illegal url format','ERROR 108 : isn\'t an integer','ERROR 109 : isn\'t a float number','ERROR 110 : unknown constant','ERROR 111 : illegal file type','ERROR 112 : illegal phone format','ERROR 113 : illegal post code format','ERROR 114 : minimum extension x not reached','ERROR 115 : maximum extension x exceeded','ERROR 116 : minimum extension y not reached','ERROR 117 : maximum extension y exceeded','ERROR 118 : isn\'t alphabetic caracters','ERROR 119 : no field selected','ERROR 120 : minimum number of selected fields not reached','ERROR 121 : illegal cpf','ERROR 122 : illegal cnpj','ERROR 123 : regular expression not defined','ERROR 124 : the parameter "possible values" was not defined','ERROR 125 : invalid value selected');
		
		errorCode = explode(',',trim(errorCode));		
		
		errors = new Array();
		
		if(typeof(errorCode) == 'undefined' || errorCode.length  == 0){
			return false;
		}
		
		if( typeof(errorMessage) == 'object' && errorMessage.length > 0 ){
			for(x=0;x<errorCode.length;x++){
				Code = errorCode[x]-101;
				try{
					errors[x] =  errorMessage[x];
				}catch(e){
					errors[x] =  defaultErrors[Code];
				}
			}
		}else{			
			for(x=0;x<errorCode.length;x++){
				Code = errorCode[x]-101;				
				errors[x] =  defaultErrors[Code];
			}
		}
		
		return errors;		
	}/*fim do método privado definingErros*/

	
	this.definingFieldsLength = function(minLen,maxLen,minDefault,maxDefault){
		/*
		*@description : Verifica os valores informados e analisa se não está vazio e se é um número inteiro. Se true retorna os próprios valores, senão retorna default.
		*				OBS .: Os valores default também podem ser alterados pelo usuário, porém se estiverem vazios ou se não forem números inteiros, os valores default serão 0 e 255.
		*/
		ret = new Array();
		
		if(typeof(minDefault) == 'undefined' || minDefault.length == 0 || isNaN(minDefault)){
			minDefault = 0;	 
		}else{
			minDefault = parseInt(minDefault);
		}
		
		if(typeof(maxDefault) == 'undefined' || maxDefault.length == 0 || isNaN(maxDefault)){
			maxDefault = 255;	 
		}else{
			maxDefault = parseInt(maxDefault);
		}
		
		if(typeof(minLen) == 'undefined' || minLen.length == 0 || isNaN(minLen)){
			ret[0] = minLen = parseInt(minDefault);	 
		}else{
			ret[0] = minLen = parseInt(minLen);
		}
		
		if(typeof(maxLen) == 'undefined' || maxLen.length == 0 || isNaN(maxLen)){
			ret[1] = maxLen = parseInt(maxDefault);	 
		}else{
			ret[1] = maxLen = parseInt(maxLen);
		}
		
		return ret;		
	};/*fim do método fieldLength*/
	
	this.filterName = function(field,minLen,maxLen,ifTrue,ifFalse){		
		definingErros = this.definingErros('101,102,103,104',ifFalse);
		
		definingFieldsLength = this.definingFieldsLength(minLen,maxLen,2);
		
		if(field.length == 0){
			return definingErros[3];	
		}else if(field.length < definingFieldsLength[0]){
			return definingErros[1];	
		}else if(field.length > definingFieldsLength[1]){
			return definingErros[2];	
		}
		
		var regName = /^[a-zA-ZáÁàÀãÃâÂéÉèÈêÊíÍìÌîÎóÓòÒôÔõÕúÚùÙûÛñÑ' -]*$/;	

		var filterName = regName.exec(field);
		
		if(filterName == null){
			return definingErros[0];	
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
		
	};/*fim do método filterName*/
	
	this.filterSizeField = function(field,minLen,maxLen,ifTrue,ifFalse){		
		definingErros = this.definingErros('102,103,104',ifFalse);
		
		definingFieldsLength = this.definingFieldsLength(minLen,maxLen);
		
		if(field.length == 0){
			return definingErros[2];	
		}else if(field.length < definingFieldsLength[0]){
			return definingErros[0];	
		}else if(field.length > definingFieldsLength[1]){
			return definingErros[1];	
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
		
	};/*fim do método filterSizeField*/
	
	this.filterDate = function(field,dateFormat,ifTrue,ifFalse){
		definingErros = this.definingErros('104,106',ifFalse);
						
		if(field.length == 0){
			return definingErros[0];	
		}
		
		switch(dateFormat){
			case 'D1':
				reg = /^[0-9]{4}-(0[0-9]|1[0,1,2])-([0,1,2][0-9]|3[0,1])$/;				
				break;
			case 'D2':
				reg = /^[0-9]{4}-(0[0-9]|1[0,1,2])-([0,1,2][0-9]|3[0,1]) ([0-1][0-9]|[2][0-3])(:([0-5][0-9])){1,2}(:([0-5][0-9])){1,2}$/;				
				break;
			case 'D3':
				reg = /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/\d{4}$/;				
				break;
			case 'D4':
				reg = /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/\d{4} ([0-1][0-9]|[2][0-3])(:([0-5][0-9])){1,2}(:([0-5][0-9])){1,2}$/;				
				break;
			default: 
				error110 = this.definingErros('110');
				return error110[0];
		}
		
		regExec = reg.exec(field);
		
		if(regExec == null){
			return definingErros[1];	
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
		
	};/*fim do método filterDate*/
	
	this.filterURL = function(field,ifTrue,ifFalse){
		definingErros = this.definingErros('104,107',ifFalse);
		
		field = trim(field);
		
		if(field.length == 0){
			return definingErros[0];
		}
		
		reg = /^(http[s]?:\/\/|ftp:\/\/)?(www\.)?[a-zA-Z0-9-\.]+\.[a-z]+$/;
		
		regExec = reg.exec(field);
		
		if(regExec == null){
			return definingErros[1];
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
		
	};/*fim do método filterURL*/
	
	this.filterIntNumber = function(field,ifTrue,ifFalse){
		definingErros = this.definingErros('104,108',ifFalse);
				
		if(field.length == 0){
			return definingErros[0];
		}
		
		var reg = /^[0-9]+$/;
		
		var regExec = reg.exec(field);
		
		if(isNaN(field) || regExec == null){
			return definingErros[1];
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
	};/*fim do método filterIntNumber*/
	
	this.filterFloatNumber = function(field,ifTrue,ifFalse){
		definingErros = this.definingErros('104,109',ifFalse);
		
		if(field.length == 0){
			return definingErros[0];
		}
		
		var reg = /^[0-9]+(\.[0-9]+)?$/;
		
		var regExec = reg.exec(field);
		
		if(regExec == null){
			return definingErros[1];
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
	};/*fim do método filterFloatNumber*/
	
	this.filterNumberFormat = function(field,intDecimal,separadorDecimal,separadorMilhar,ifTrue,ifFalse){
		field = trim(field);		
		ifTrue = trim(ifTrue);		
		strPos = new Array();
		
		fieldLen = field.length;
		decSepPos = fieldLen-intDecimal-1;
		intPart = field.substring(0,decSepPos);		
		intPartLen = intPart.length;
		y = Math.round(intPartLen/5);
		ultSepPos = 4*y-1;
		
		definingErros = this.definingErros('101,104',ifFalse);		
		
		if(field.length == 0){
			return definingErros[1];	
		}
		
		
		for(x=0; x < fieldLen; x++){
			strPos.push(field[x]);
		}
		
		reg = /^[0-9]+$/;
		
		regExec = reg.exec(intPart[0]);
		
		if(strPos[decSepPos] != separadorDecimal){
			return definingErros[0];	
		}else if(regExec==null){
			return definingErros[0];	
		}
		
		if(intPartLen >= 4){
			for(x=ultSepPos;x>=3;x-=4){
				if(intPart[intPartLen-x-1] != separadorMilhar){
					return definingErros[0];	
				}		
			}
		}
		
		if(ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}		
	};/*fim do método filterNumberFormat*/
	
	this.filterFileType = function(field,fileType,extensions,ifTrue,ifFalse){
		definingErros = this.definingErros('104,111',ifFalse);
		
		if(field.length == 0 || typeof(fileType) == 'undefined' || fileType.length == 0){
			return definingErros[0];
		}
		
		if(field.lastIndexOf('\\') > -1){
			_pos = field.lastIndexOf('\\');
			field = field.substring(_pos+1);	
		}
		
		if(typeof(extensions) == 'string'){
			_extensions = explode(',',extensions);
			extensions = '|' + implode('|',_extensions);
		}else{
			extensions = '';
		}
		
		switch(fileType){
			case 'IMAGE': reg = eval("/^[a-zA-Z0-9-_\. ]+\.(jpg|jpeg|bmp|png|gif" + extensions + ")$/");
				break;
			case 'AUDIO': reg =  eval("/^[a-zA-Z0-9-_\. ]+\.(mov|wma|mpg|mp3|wav|mid|ogg" + extensions + ")$/");
				break;
			case 'VIDEO': reg =  eval("/^[a-zA-Z0-9-_\. ]+\.(swf|avi|mpeg|mpg|mp4|divx|wmv|3gp" + extensions + ")$/");
				break;
			case 'SLIDES': reg =  eval("/^[a-zA-Z0-9-_\. ]+\.(ppt|pps|odp|otp|swf" + extensions + ")$/");
				break;
			case 'DOC': reg =  eval("/^[a-zA-Z0-9-_\. ]+\.(txt|rtf|pdf|doc|odt|otp|xml" + extensions + ")$/");
				break;
			case 'TBL': reg =  eval("/^[a-zA-Z0-9-_\. ]+\.(xls|odt|otp|xml" + extensions + ")$/");
				break;
			case 'NEW': reg =  eval("/^[a-zA-Z0-9-_\. ]+\.(" + extensions + ")$/");
				break;			
			default: 
				error110 = this.definingErros('110');
				return error110[0];
		}
		
		regExec = reg.exec(field);
		
		if(regExec == null){
			return definingErros[1];
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
	};/*fim do método filterFileType*/
	
	this.filterPhone = function(field,phoneFormat,ifTrue,ifFalse){
		definingErros = this.definingErros('104,112',ifFalse);
				
		if(field.length == 0 || typeof(phoneFormat) == 'undefined' || phoneFormat.length ==0){
			return definingErros[0];
		}
		
		switch(phoneFormat){
			case 'PH1': reg = /^[0-9]{4}-[0-9]{4}$/;
				break; 
			case 'PH2': reg = /^(\([0-9]{2}\))+([0-9]{4}-[0-9]{4})$/;
				break;
			case 'PH3': reg = /^(\+?[0-9]{2}) ([0-9]{2}) ([0-9]{4}-[0-9]{4})$/;
				break;		
			default: 
				error110 = this.definingErros('110');
				return error110[0];
		}
		
		regExec = reg.exec(field);
		
		if(regExec == null){
			return definingErros[1];
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
		
	};/*fim do método filterPhone*/
	
	this.filterPostCode = function(field,postCodeFormat,ifTrue,ifFalse){
		definingErros = this.definingErros('104,113',ifFalse);
		
		if(field.length == 0){
			return definingErros[0];	
		}
		
		switch(postCodeFormat){
			case 'PC1': reg = /^([0-9]{5})-([0-9]{3})$/;
				break;			
			default: return this._error110;
		}
		
		regExec = reg.exec(field);
		
		if(regExec == null){
			return definingErros[1];
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
	};/*fim do método filterPostCode*/
	
	this.filterCPF = function(field,ifTrue,ifFalse){		
		definingErros = this.definingErros('104,121',ifFalse);
		
		if(field.length == 0){
			return definingErros[0];	
		}
		
		strcpf = field;
		str_aux = "";
		
		for (i = 0; i <= strcpf.length - 1; i++){		
			if ((strcpf.charAt(i)).match(/\d/)){		
				str_aux += strcpf.charAt(i);
			}else if (!(strcpf.charAt(i)).match(/[\.\-]/)) {
				return definingErros[1];		
		 	}
		}
		
		if (str_aux.length != 11) {		   
		   return definingErros[1];
		}
		soma1 = soma2 = 0;
		for (i = 0; i <= 8; i++) {
		   soma1 += str_aux.charAt(i) * (10-i);
		   soma2 += str_aux.charAt(i) * (11-i);
		}
		
		d1 = ((soma1 * 10) % 11) % 10;
		d2 = (((soma2 + (d1 * 2)) * 10) % 11) % 10;
		if ((d1 != str_aux.charAt(9)) || (d2 != str_aux.charAt(10))) {
			return definingErros[1];
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
			
	};/*fim do método */
		
	this.filterCNPJ = function(field,ifTrue,ifFalse){
		definingErros = this.definingErros('104,122',ifFalse);
		
		if(field.length == 0){
			return definingErros[0];	
		}
		
		var nonNumbers = /\D/;		
		if(nonNumbers.test(field)){
			return definingErros[1];	
		}
		
		_a = field.substring(0,12);
		_b = [5,4,3,2,9,8,7,6,5,4,3,2];
		_c = new Number();
		_d = _a;
		
		for(x=0;x<12;x++){			
			_c += _a[x]*_b[x];	
		}
		
		if((x = _c % 11) < 2){
			_d += 0;	
		}else{
			_d += 11 - x;	
		}
		
		_e = [6,5,4,3,2,9,8,7,6,5,4,3,2];
		_f = new Number();
		_g = _d;
		
		for(x=0;x<13;x++){			
			_f += _d[x]*_e[x];	
		}
		
		if((x = _f % 11) < 2){
			_g += 0;	
		}else{
			_g += 11 - x;	
		}
		
		if (field != _g){
		 	return definingErros[1];
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
		
	};/*fim do método */
	
	this.regExp = function(field,regularExpression,ifTrue,ifFalse){
		definingErros = this.definingErros('101,104',ifFalse);
		
		if(field.length == 0 || typeof(regularExpression) == 'undefined'){
			return definingErros[1];	
		}
		
		reg = eval("/" + regularExpression + "/");
		
		regExec = reg.exec(field);
		
		if(regExec == null){
			return definingErros[0];	
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
	};/*fim do método regExp*/
	
	this.filterEmail = function(field,ifTrue,ifFalse){
		definingErros = this.definingErros('104,105',ifFalse);
		
		if(field.length == 0){
			return definingErros[0];	
		}
		
		reg = /^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$/;
		
		regExec = reg.exec(field);
		
		if(regExec == null){
			return definingErros[1];	
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
		
	};/*fim do método filterEmail*/
	
	this.filterAlphaCaracters = function(field,ifTrue,ifFalse){
		definingErros = this.definingErros('104,118',ifFalse);
		
		if(field.length == 0){
			return definingErros[0];	
		}
		
		reg = /^[a-zA-ZáÁàÀãÃâÂéÉèÈêÊíÍìÌîÎóÓòÒôÔõÕúÚùÙûÛñÑ' -]*$/;
		
		regExec = reg.exec(field);
		
		if(regExec == null){
			return definingErros[1];
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
	};/*fim do método filterAlphaCaracters*/
	
	this.filterRadioField = function(fieldName,ifTrue,ifFalse){		
		definingErros = this.definingErros('104,119',ifFalse);
		
		if(fieldName.length == 0){
			return definingErros[0];	
		}
		
		var _chk = 0;
		
		var _fields = document.getElementsByTagName('input');
		
		for(x=0 ; x<_fields.length;x++){			
			if(_fields[x].type == 'radio' && _fields[x].name == fieldName && _fields[x].checked){				
				_chk++	
			}		
		}
		
		if(_chk ==0){
			return definingErros[1];	
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
		
	};/*fim do método */
	
	this.filterCheckBoxField = function(fieldName,minSelected,ifTrue,ifFalse){
		definingErros = this.definingErros('104,120',ifFalse);
		
		if(fieldName.length == 0){
			return definingErros[0];	
		}
		
		var _chk = 0;
		
		var _fields = document.getElementsByTagName('input');
		
		for(x=0;x<_fields.length;x++){
			if(_fields[x].name == fieldName && _fields[x].checked == true){
				_chk++	
			}		
		}
		
		if(_chk < minSelected){
			return definingErros[1];	
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
	};/*fim do método */
	
	this.filterSelectField = function(fieldName,minSelected,ifTrue,ifFalse){
		definingErros = this.definingErros('104,120',ifFalse);
		
		if(fieldName.length == 0){
			return definingErros[0];	
		}
		
		var _chk = 0;
		
		var _fields = document.getElementsByTagName('select');
		
		for(x=0;x<_fields.length;x++){			
			if(_fields[x].name == fieldName){
				_options = _fields[x].options;
				for(i=0;i<_options.length;i++){
					if(_options[i].value.length > 0 && _options[i].selected){
						_chk++;
					}
				}
			}		
		}
		
		if(_chk < minSelected){
			return definingErros[1];	
		}else if(typeof(ifTrue) != 'undefined' && ifTrue.length > 0){
			return ifTrue;
		}else{
			return true;
		}
	};/*fim do método */
	
}/*fim do objeto*/
//########################## FIM DO OBJETO FilterForms() #######################################
