var elementConfig = {
	/* MASK */
	mask : {
		getMask : function( pMask ) {
			var fMask = pMask.toLowerCase().trim();
			switch ( fMask ) {
				case ( 'cpf' )		: return '999.999.999-99';
				case ( 'cpnj' )		: return '99.999.999/9999-99';
				case ( 'cep' )		: return '99999-999';
				case ( 'ddd' )		: return '99';
				case ( 'tel' )		: return '9999-9999';
				case ( 'dddtel' )	: return '(99) 9999-9999';
				case ( 'data' )		: return '99/99/9999';
				default				: {
					var _maskInt = parseInt( fMask );
					if ( !isNaN( _maskInt ) ) {
						return replicate('9', _maskInt );
					}
					return '';
				}
			}
		},
		
		config : function( pSelector ) {
			var fthis = this;
			var $ele = null;
			if ( typeof( pSelector ) == 'string' ) {
				$ele = jQuery( pSelector )
			} else {
				$ele = jQuery( pSelector );
			}
			var fMask = $ele.attr( 'data-mask' );
			if ( fMask != undefined ) {
				if ( fMask != null ) {
					if ( fMask != '' ) {
						switch( fMask ) {
							case ( 'valor' ) : {
								jQuery( pSelector ).priceFormat();
							}
							default : {
								fMask = fthis.getMask( fMask );
								if ( fMask != '' ) {
									jQuery( pSelector ).mask( fMask );
								}
								break;
							}
						}
					}
				}
			}
		}
	},
	
	setMask : function() {
		var fthis = this;
		jQuery('*[data-mask]').each( function() {
			fthis.mask.config( this );
		});
	},
	
	/* MASK */
	
	/* VALIDATE */
	
	validate : {
		idioma : 'pt',
		mensagem : {
			campoNaoSelecionado : function( pObject ) {
				var i = elementConfig.validate.idioma;
				switch ( i ) {
					case ( 'pt' ) : { return 'O campo "'+ pObject.attr( 'title' ) +'" não foi selecionado.'; }
					case ( 'en' ) : { return 'The "'+ pObject.attr( 'title' ) +'" field was not selected.'; }
				}
			},
			campoNaoPreenchido : function( pObject ) {
				var i = elementConfig.validate.idioma;
				switch ( i ) {
					case ( 'pt' ) : { return 'O campo "'+ pObject.attr( 'title' ) +'" não foi preenchido corretamente.'; }
					case ( 'en' ) : { return 'The "'+ pObject.attr( 'title' ) +'" field was not filled in correctly.'; }
				}
			},
			campoInvalido : function( pObject ) {
				var i = elementConfig.validate.idioma;
				switch ( i ) {
					case ( 'pt' ) : { return 'O campo "'+ pObject.attr( 'title' ) +'" não foi preenchido corretamente.  (Formato inválido)'; }
					case ( 'en' ) : { return 'O campo "'+ pObject.attr( 'title' ) +'" field was not filled in correctly. (Format format)'; }
				}
			},
			extensoesInvalida : function( pObject, pExtensao ) {
				var i = elementConfig.validate.idioma;
				switch ( i ) {
					case ( 'pt' ) : { return 'O arquivo "'+ pObject.attr( 'title' ) +'" deve ter as seguintes extensões: ' + pExtensao; }
					case ( 'en' ) : { return 'The file "'+ pObject.attr( 'title' ) +'" must have the following extensions: ' + pExtensao; }
				}
			},
			extensaoInvalida : function( pObject, pExtensao ) {
				var i = elementConfig.validate.idioma;
				switch ( i ) {
					case ( 'pt' ) : { return 'O arquivo "'+ pObject.attr( 'title' ) +'" deve ter a seguinte extensão: ' + pExtensao; }
					case ( 'en' ) : { return 'The file "'+ pObject.attr( 'title' ) +'" must have the following extension: ' + pExtensao; }
				}
			},
			extensaoNaoPermitida : function( pObject, pExtensao ) {
				var i = elementConfig.validate.idioma;
				switch ( i ) {
					case ( 'pt' ) : { return 'O arquivo "'+ pObject.attr( 'title' ) +'" não deve a seguinte extensão: ' + pExtensao; }
					case ( 'en' ) : { return 'The file "'+ pObject.attr( 'title' ) +'" should not the following extension: ' + pExtensao; }
				}
			},
			extensoesNaoPermitidas : function( pObject, pExtensao ) {
				var i = elementConfig.validate.idioma;
				switch ( i ) {
					case ( 'pt' ) : { return 'O arquivo "'+ pObject.attr( 'title' ) +'" não deve as seguintes extensões: ' + pExtensao; }
					case ( 'en' ) : { return 'The file "'+ pObject.attr( 'title' ) +'" hould not the following extensions: ' + pExtensao; }
				}
			},
			senhasNaoConferem : function( pObject ) {
				var i = elementConfig.validate.idioma;
				switch ( i ) {
					case ( 'pt' ) : { return 'As senhas informadas não conferem.'; }
					case ( 'en' ) : { return 'The passwords do not match.'; }
				}
			},
			arquivoNaoSelecionado : function( pObject ) {
				var i = elementConfig.validate.idioma;
				switch ( i ) {
					case ( 'pt' ) : { return 'O arquivo do campo "'+ pObject.attr( 'title' ) +'" não foi selecionado.'; }
					case ( 'en' ) : { return 'The file from the "'+ pObject.attr( 'title' ) +'" was not selected.'; }
				}
			}
		},
		getValidate : function( pValidate, pValidacao ) {
			var fthis = this;
			var fValidate = '';
			if ( pValidacao == undefined ) {
				fValidate = pValidate.attr( 'data-validate' ).split( ',' );
			} else{
				fValidate = pValidacao.split( ',' );
			}
			var isValid = false;
			
			jQuery( fValidate ).each( function() {
				//var _fValidate = this.toLowerCase().trim();
				var _fValidate = this.trim();
				switch ( _fValidate ) {
					case ( 'branco' ) : {}
					case ( 'vazio' ) : {
						
						switch ( pValidate.get(0).tagName.toLowerCase() ) {
							case ( 'select' ) : {
								if( pValidate.val() == '' ) {
									alert( fthis.mensagem.campoNaoSelecionado( pValidate ) );
									pValidate.focus();
									isValid = false;
									return false;
								};
								break;
							}

							case ( 'file' ) : {
								if( pValidate.val() == '' ) {									
									alert( fthis.mensagem.arquivoNaoSelecionado( pValidate ) );
									pValidate.focus();
									isValid = false;
									return false;
								};
								break;
							}
							
							case ( 'textarea' ) : {
								if( pValidate.val() == '' ) {
									alert( fthis.mensagem.campoNaoPreenchido( pValidate ) );
									pValidate.focus();
									isValid = false;
									return false;
								};
								break;
							}
							
							default : {
								switch ( pValidate.attr('type').toLowerCase() ) {
									case ( 'radio' ) : {}
									case ( 'checkbox' ) : {
										if ( $( '*[name="'+ pValidate.attr( 'name' ) +'"]:checked' ).length < 1 ) {
											alert( fthis.mensagem.campoNaoSelecionado( pValidate ) );
											pValidate.focus();
											isValid = false;
											return false;
										};
										break;
									}
									default : {										
										if( pValidate.val() == '' ) {
											alert( fthis.mensagem.campoNaoPreenchido( pValidate ) );
											pValidate.focus();
											isValid = false;
											return false;
										};
										break;
									}
								};
								break;
							}
						};
						
						break;
					}
					
					case ( '0' ) : {}
					case ( 'zero' ) : {
						if( pValidate.val() == '0' ) {
							alert( fthis.mensagem.campoNaoSelecionado( pValidate ) );
							pValidate.focus();
							isValid = false;
							return false;
						};
						break;
					}
					
					case ( 'cpf' ) : {
						if( !validaCpf( pValidate.val() ) ) {
							alert( fthis.mensagem.campoInvalido( pValidate ) );
							pValidate.focus();
							isValid = false;
							return false;
						};
						break;
					}
					
					case ( 'cpnj' ) : {
						if( !validaCnpj( pValidate.val() ) ) {
							alert( fthis.mensagem.campoInvalido( pValidate ) );
							pValidate.focus();
							isValid = false;
							return false;
						};
						break;
					}
					
					case ( 'e-mail' ) : {}
					case ( 'email' ) : {
						if( !validaEmail( pValidate.val() ) ) {
							alert( fthis.mensagem.campoInvalido( pValidate ) );
							pValidate.focus();
							isValid = false;
							return false;
						};
						break;
					}
					
					case ( 'data' ) : {
						if( !isDate( pValidate.val() ) ) {
							alert( fthis.mensagem.campoInvalido( pValidate ) );
							pValidate.focus();
							isValid = false;
							return false;
						};
						break;
					}
					
					default : {
						
						//Extensão valida
						var Regex = /extensao\(([^\n\r]+)\)/gi;				
						if ( Regex.test( _fValidate ) ) {
							var exts = _fValidate.replace( /extensao/, '' );
							if( exts.length > 2 ) {
								exts = exts.substring( 1, exts.length - 1 );
								var aexts = exts.split( ';' );
								var dvo = true;
								if ( aexts[0] == '1' ) {
									dvo = elementConfig.validate.getValidate( pValidate, 'branco' );
									if ( !dvo ) {
										isValid = false;
										return false;
									}
								} else {
									dvo = ( pValidate.val() != '' );
								}
								if ( dvo ) {
									var ve = validaExtensao( pValidate.val(), aexts );
									if( !ve ) {
										var strexts = '';
										for ( i = 1; i < aexts.length; i++ ) {
											strexts += ( aexts[i] );
											if ( i < aexts.length - 1 ) {
												strexts += ', ';
											}
										}
										if ( aexts.length > 1 ) {
											alert( fthis.mensagem.extensoesInvalida( pValidate, strexts ) );
										} else {
											alert( fthis.mensagem.extensaoInvalida( pValidate, strexts ) );
										}
										pValidate.focus();
										isValid = false;
										return false;
									}
								}
							}
						}
						
						//Extensão invalida
						var Regex = /extensaoInvalida\(([^\n\r]+)\)/gi;				
						if ( Regex.test( _fValidate ) ) {
							var exts = _fValidate.replace( /extensaoInvalida/, '' );
							if( exts.length > 2 ) {
								exts = exts.substring( 1, exts.length - 1 );
								var aexts = exts.split( ';' );
								var dvo = true;
								if ( aexts[0] == '1' ) {
									dvo = elementConfig.validate.getValidate( pValidate, 'branco' );
									if ( !dvo ) {
										isValid = false;
										return false;
									}
								} else {
									dvo = ( pValidate.val() != '' );
								}
								if ( dvo ) {
									var ve = validaExtensao( pValidate.val(), aexts );
									if( ve ) {
										var strexts = '';
										for ( i = 1; i < aexts.length; i++ ) {
											strexts += ( aexts[i] );
											if ( i < aexts.length - 1 ) {
												strexts += ', ';
											}
										}
										if ( aexts.length > 1 ) {
											alert( fthis.mensagem.extensoesNaoPermitidas( pValidate, strexts ) );
										} else {
											alert( fthis.mensagem.extensaoNaoPermitida( pValidate, strexts ) );
										}
										pValidate.focus();
										isValid = false;
										return false;
									}
								}
							}
						}
						
						//Confirmar Senha
						var Regex = /confirmarSenha\(([^\n\r]+)\)/gi;
						if ( Regex.test( _fValidate ) ) {
							var exts = _fValidate.replace( /confirmarSenha/gi, '' );
							if( exts.length > 2 ) {
								exts = exts.substring( 1, exts.length - 1 );
								var aexts = exts.split( ';' );
								var dvo = true;
								if ( aexts[0] == '1' ) {
									dvo = elementConfig.validate.getValidate( pValidate, 'branco' );
									if ( !dvo ) {
										isValid = false;
										return false;
									}
									dvo = elementConfig.validate.getValidate( jQuery( aexts[1] ), 'branco' );
									if ( !dvo ) {
										isValid = false;
										return false;
									}
								} else {
									dvo = ( pValidate.val() != '' );
								}
								if ( dvo ) {
									var pass1 = pValidate.val();
									var pass2 = jQuery( aexts[1] ).val();
									if ( pass1 != pass2 ) {
										alert( fthis.mensagem.senhasNaoConferem( pValidate ) );
										pValidate.focus();
										isValid = false;
										return false;
									}
								}
							}
						}
						
						//custom
						var Regex = /custom\(([^\n\r]+)\)/gi;
						if ( Regex.test( _fValidate ) ) {
							var exts = _fValidate.replace( /custom/gi, '' );
							if( exts.length > 2 ) {
								exts = exts.substring( 1, exts.length - 1 );
								try {
									var __func = eval( exts );
									var __r = __func.call( this, pValidate );
									if ( !__r ) {
										isValid = false;
										return false;
									}
								} catch (ex) {
									//console.log( [ 'erro ao chamar funcao', _fValidate , Regex, Regex.test( _fValidate ) ] );
								}
							}
						}
						
						break;
					}
				}
				isValid = true;
			} );
			return isValid;
		}
	},

	setValidate : function( f, i ) {
		var fthis = this;
		
		if ( i != undefined ) {
			if ( i != '' ) {
				fthis.validate.idioma = i;
			}
		}
		
		var isValid = false;
		var $objs = null;
		if ( typeof( f ) == 'string' ) {
			$objs = jQuery( f + ' *[data-validate]' );
		} else {
			$objs = jQuery( f ).find('*[data-validate]');
		}
		$objs.each( function() {
			var $this = jQuery( this );
			if ( !fthis.validate.getValidate( $this ) ) {
				isValid = false;
				return false;
			}
			isValid = true;
		});
		return isValid;
	}
	
	/* VALIDATE */
}
