function Validator(formName) {

    this.frm = document.forms[formName];
    this.initialFieldsValue = new Array(this.frm.length);

    this.iniMsg;
    this.errMsg;
}

/****************************************************
*    PEGA CAMPOS DO FORMULARIO
****************************************************/
Validator.prototype.getInitialFieldsValue = function() {
    for( i = 0; i < this.frm.length; i++ )
    {
        var value = this.getValue(i);
        if ( value.length > 0 )
            this.initialFieldsValue.push( value );
    }
}


/****************************************************
*    PEGA VALOR DE UM CAMPO DO FORMULARIO
****************************************************/
Validator.prototype.getValue = function(i) {

	if (typeof(i)=="number") {
		var field = this.frm[i];
	} else {
		var field = i;
	}

    var value    = '';
    var tag      = field.tagName.toLowerCase();

    switch( tag )
    {
        case 'input':
            value = field.value;
            break;
        case 'select':
			value = (field.selectedIndex == 0)?"":field.selectedIndex;
            break;

		case 'textarea':
			value = field.value;
			break;
    }

    return value;
}

Validator.prototype.getFriendlyName = function (field) {
	var friendlyName;
	friendlyName = field.getAttribute('friendlyname')
	
	if ((friendlyName=="") || (friendlyName==null)) {
		friendlyName = field.name;
	}

	return friendlyName;
}

/****************************************************
*    RETORNA NOME DO OPERADOR UTILIZADO
****************************************************/
Validator.prototype.getOperatorName = function ( operator ) {
    
    switch( operator )
    {
        case ( '<' ):
            return 'menor';

        case ( '<=' ):
            return 'menor ou igual';

        case ( '>' ):
            return 'maior';

        case ( '>=' ):
            return 'maior ou igual';

        case ( '!=' ):
            return 'diferente';

        default:
            return 'igual';
    }

}


Validator.prototype.validateRequired = function ( field )
{
    var tag     = field.tagName.toLowerCase();
    var bReturn	= (field.getAttribute('required')=="true");    

	return !(bReturn && this.getValue(field).length==0);
}


Validator.prototype.validateFormat = function( field )
{

    var format    = field.getAttribute('format');

    if( format != null )
    {
        var rgxReturn;

        switch( format )
        {
            case 'email':
                rgxReturn = new RegExp( '.+@.+\\.[a-z]+' );            
                break;
			
            case 'date':
                 rgxReturn = new RegExp( '^(((0?[1-9]|[12]\\d|3[01])[\\.\\-\\/](0?[13578]|1[02])[\\.\\-\\/]((1[6-9]|[2-9]\\d)?\\d{2}|\\d))|((0?[1-9]|[12]\\d|30)[\\.\\-\\/](0?[13456789]|1[012])[\\.\\-\\/]((1[6-9]|[2-9]\\d)?\\d{2}|\\d))|((0?[1-9]|1\\d|2[0-8])[\\.\\-\\/]0?2[\\.\\-\\/]((1[6-9]|[2-9]\\d)?\\d{2}|\\d))|(29[\\.\\-\\/]0?2[\\.\\-\\/]((1[6-9]|[2-9]\\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00|[048])))$' );
                break;
                
            default:
                rgxReturn = new RegExp( format );                
                break;
        }

        return ( field.value.match( rgxReturn ) );
    }
    else
        return true;

}

Validator.prototype.validateCompare = function( field )
{
    var operator = field.getAttribute( 'operator' );
	
    if ( field.getAttribute( 'compareto' ) != null )
    {
        compareField = this.frm[ field.getAttribute( 'compareto' ) ];

		if ((operator=="") || (operator==null)) 
			operator="==";

		return ( eval("field.value "+operator+" compareField.value "));
    }
    else
        return true;

}

Validator.prototype.isValid = function(){

	this.iniMsg = ''; //'Os seguintes erros de validação foram encontrados:\n';
    this.errMsg = this.iniMsg;

    for( i = 0; i < this.frm.length; i++ )
    {
        var field			= this.frm[i];
        var validate		= field.getAttribute( 'validate' );
		var friendlyName	= this.getFriendlyName(field);

        if ( validate )
        {
            if ( !this.validateRequired( field ) )
                 this.errMsg += '\n - O campo ' + friendlyName + ' é obrigatório' ;
            else
            {
                if ( !this.validateFormat( field ) )
                    this.errMsg += '\n - O campo ' + friendlyName + ' está no formato incorreto ';
        
                if ( !this.validateCompare( field ) )
                {
                    var compareField = this.frm[ field.getAttribute( 'compareto' ) ];
                    var operator = field.getAttribute( 'operator' );
                    var operatorName = this.getOperatorName( operator );

                    this.errMsg += '\n - O campo ' + friendlyName + ' precisa ser ' + operatorName + ' ao ' + compareField.getAttribute( 'friendlyname' );
                }
            }
        }
    }

    return ( this.errMsg == this.iniMsg );
}
