fValidate.prototype.comparisonv = function( field1, operator, value2 )
{
	if ( this.typeMismatch( 'hidden' ) ) return;
	var elem1	= this.form.elements[field1],
		value1	= this.getValue( elem1 ),
		i18n	= this.i18n.comparison;
		i		= -1;
	
	var operators =
	[
		['>',	i18n.gt],
		['<',	i18n.lt],
		['>=',	i18n.gte],
		['<=',	i18n.lte],
		['==',	i18n.eq],
		['!=',	i18n.neq]
	];
	
	while( operators[++i][0] != operator ){  }
	this.elem.fields = [elem1];
	if ( ! eval( value1 + operator + value2 ) )
	{
		this.throwError( [elem1.fName, operators[i][1], value2] );
	}
}

fValidate.prototype.comparisonvexec = function( field1, operator, value2, mcvalidator )
{

	if ( this.typeMismatch( 'hidden' ) ) return;
	var elem1	= this.form.elements[field1],
		value1	= this.getValue( elem1 ),
		i18n	= this.i18n.comparison;
		i		= -1;
	
	var operators =
	[
		['>',	i18n.gt],
		['<',	i18n.lt],
		['>=',	i18n.gte],
		['<=',	i18n.lte],
		['==',	i18n.eq],
		['!=',	i18n.neq]
	];
	while( operators[++i][0] != operator ){  }
	this.elem.fields = [elem1];
	
	if ( eval( value1 + operator + value2 ) )
	{
		var elemcalls = mcvalidator.split( "," );
		var i = 0;
		while (elem = this.form.elements[elemcalls[i++]]) {
		
			attr = this.config.code;	
			fvCode			= ( elem[attr] ) ? elem[attr] : elem.getAttribute( attr );

			if ( !( typeof fvCode == 'undefined' || fvCode == null || fvCode == "" ) )
			{
				//	Set params, validation type, and validation state
				params			= fvCode.split( "|" );
				type			= params[0];
				elem.validated	= true;
				params = params.reduce( 1, 1 );
			}
	
			this.elem = elem;
			this.type = type;
			this.elem.mustcall = false;
			
	//		//	Create function to call the proper validator method of the fValidate class
			var func = new Function( "obj", "method", "obj[method]( " + params.toArgString() + " );" );
			func( this, type );
		}
	}
}

fValidate.prototype.comparisonexec = function( type, args, mcvalidatortrue, mcvalidatorfalse )
{

	if ( this.typeMismatch( 'hidden' ) ) return;
	var bExec = true;
	
	switch(type) {
		case "1": // elem x elem
		
			var args = args.split( "," );
			var field1 = args[0];
			var operator = args[1];
			var field2 = args[2];
			
			var elem1	= this.form.elements[field1];
			if (typeof elem1 == 'undefined') { this.devError( [field1,this.elem.name], 'notFound' ); return; }
			value1	= this.getValue( elem1 );
			var elem2	= this.form.elements[field2];
			if (typeof elem2 == 'undefined') { this.devError( [field2,this.elem.name], 'notFound' ); return; }
			value2	= this.getValue( elem2 );

			if (!eval( "'" + value1 + "'" + operator + "'" + value2 + "'") ) { bExec = false; }
			
			break;
		case "2": // elem x value
			var args = args.split( "," );
			var field1 = args[0];
			var operator = args[1];
			var value2 = args[2];
			var elem1	= this.form.elements[field1];
			if (typeof elem1 == 'undefined') { this.devError( [field1,this.elem.name], 'notFound' ); return; }
			value1	= this.getValue( elem1 );
			if (!eval( "'" + value1 + "'" + operator + "'" + value2 + "'") ) bExec = false;
			
			break;
		case "3": // expresion
			if (!eval(args)) { bExec = false; }
			break;
		default:
			return;
	}
	
	var i18n	= this.i18n.comparison;
		i		= -1;

	var operators =
	[
		['>',	i18n.gt],
		['<',	i18n.lt],
		['>=',	i18n.gte],
		['<=',	i18n.lte],
		['==',	i18n.eq],
		['!=',	i18n.neq]
	];
	while( operators[++i][0] != operator ){  }
	this.elem.fields = [elem1];

	if (bExec == true) {
		if (!mcvalidatortrue) return;
		var elemcalls = mcvalidatortrue.split( "," );
	} else {
		if (!mcvalidatorfalse) return;
		var elemcalls = mcvalidatorfalse.split( "," );
	}
	
	var i = 0;
	while (elem = this.form.elements[elemcalls[i++]]) {
		attr = this.config.code;	
		fvCode			= ( elem[attr] ) ? elem[attr] : elem.getAttribute( attr );

		if ( !( typeof fvCode == 'undefined' || fvCode == null || fvCode == "" ) )
		{
			//	Set params, validation type, and validation state
			params			= fvCode.split( "|" );
			type			= params[0];
			elem.validated	= true;
			params = params.reduce( 1, 1 );
		}

		this.elem = elem;
		this.type = type;
		this.elem.mustcall = false;
		
		
//		//	Create function to call the proper validator method of the fValidate class
		var func = new Function( "obj", "method", "obj[method]( " + params.toArgString() + " );" );
		func( this, type );
	}
}



fValidate.prototype.cpf = function() {

	var r = this.elem.value;
	var iError = 0 ;
	var nCPF_ = this.elem.value;
	var nCPF = new Array() ;
	var iDV1 , iDV2 ;

	if ( (r * 1) == 0 ) iError++;

   	if ( nCPF_.length != 11 ) iError++ ;

   	for ( i = 0 ; i < 11 ; i++ ) { nCPF[i] = parseInt(nCPF_.charAt(i)) ; }

   	iDV1 = ( nCPF[0] * 10 + nCPF[1] * 9 + nCPF[2] * 8 + nCPF[3] * 7 + nCPF[4] * 6 + nCPF[5] * 5 + nCPF[6] * 4 + nCPF[7] * 3 + nCPF[8] * 2 ) % 11 ;

   	iDV2 = ( nCPF[0] * 11 + nCPF[1] * 10 + nCPF[2] * 9 + nCPF[3] * 8 + nCPF[4] * 7 + nCPF[5] * 6 + nCPF[6] * 5 +nCPF[7] * 4 + nCPF[8] * 3 + nCPF[9] * 2 ) % 11 ;

    ( iDV1 == 1 || iDV1 == 0 ) ? iDV1 = 0 : iDV1 = 11 - iDV1 ;
	( iDV2 == 1 || iDV2 == 0 ) ? iDV2 = 0 : iDV2 = 11 - iDV2 ;

    if ( iDV1 != nCPF[9] ) iError++ ;
   	if ( iDV2 != nCPF[10] ) iError++ ;

   	if ( iError > 0 ) 
		this.throwError( [this.elem.fName] );
}

fValidate.prototype.cnpj = function() {

   	var r = this.elem.value; ;
   	var iError = 0 ;
   	var nCNPJ_ = this.elem.value; ;
	var nCNPJ = new Array() ;
	var iDV1 , iDV2 ;

   	if ( (r * 1) == 0 ) iError++ ;

	if ( nCNPJ_.length == 15 && nCNPJ_.charAt(0) == "0") nCNPJ_ = parseInt(nCNPJ_.substring(1 , nCNPJ_.length)) ;
	if ( nCNPJ_.length != 14 ) iError++ ;

   	for ( i = 0 ; i < 15 ; i++ ) { nCNPJ[i] = nCNPJ_.charAt(i) ; }

   	iDV1 = ( nCNPJ[0] * 5 + nCNPJ[1] * 4 + nCNPJ[2] * 3 + nCNPJ[3] * 2 + nCNPJ[4] * 9 + nCNPJ[5] * 8 + nCNPJ[6] * 7 + nCNPJ[7] * 6 + nCNPJ[8] * 5 + nCNPJ[9] * 4 + nCNPJ[10] * 3 + nCNPJ[11] * 2 ) % 11 ;

   	iDV2 = ( nCNPJ[0] * 6 + nCNPJ[1] * 5 + nCNPJ[2] * 4 + nCNPJ[3] * 3 + nCNPJ[4] * 2 + nCNPJ[5] * 9 + nCNPJ[6] * 8 + nCNPJ[7] * 7 + nCNPJ[8] * 6 + nCNPJ[9] * 5 + nCNPJ[10] * 4 + nCNPJ[11] * 3 + nCNPJ[12] * 2) % 11 ;

    ( iDV1 == 1 || iDV1 == 0 ) ? iDV1 = 0 : iDV1 = 11 - iDV1 ;
   	( iDV2 == 1 || iDV2 == 0 ) ? iDV2 = 0 : iDV2 = 11 - iDV2 ; 

    if ( iDV1 != nCNPJ[12] ) iError++ ;
   	if ( iDV2 != nCNPJ[13] ) iError++ ;

   	if ( iError > 0 ) 
		this.throwError( [this.elem.fName] );
}

/*	Returns value(s) of reference element passed
------------------------------------------- */
fValidate.prototype.getValue = function( elem ) {

	var type = elem.type;
	if ( typeof elem.type == 'undefined' ) { // workaround for arrayed radio buttons
		type = elem[0] ? elem[0].type : elem.type; 
	}

	switch ( type ) {
		case 'text' :
		case 'password' :
		case 'textarea' :
		case 'hidden' :
		case 'file' :
			return elem.value;
		case 'radio':
			for ( var i = 0; i < elem.length; i++ ) {
				if (elem[i].checked) return elem[i].value;
			}
			return null;
		case 'select-one':
			if ( typeof elem.length == 'undefined' ) {
				return elem.value;
			} else {
				for ( var i = 0; i < elem.length; i++ ) {
					choice = ( elem.type == 'radio' ) ? "checked" : "selected";
					if ( elem[i][choice] ) {
						return elem[i].value;
					}
				}
			}
			return null;
		case 'select-multiple' :
		case 'checkbox' :
			if ( typeof elem.length == 'undefined' ) {
				if (elem.type=='checkbox') {
					if (elem.checked) {
						return elem.value;
					} else {
						return null;
					}
				}
				return elem.value
			} else {
				var returnValues = new Array();
				for ( var i = 0; i < elem.length; i++ ) {
					choice = ( elem.type == 'checkbox' ) ? "checked" : "selected";
					if ( elem[i][choice] ) {
						returnValues.push( elem[i].value );
					}
				}
				return returnValues;
			}
		default: return null;
	}
}

/*	Blank checker.  Optional string argument for evaluating element other than current
------------------------------------------- */
fValidate.prototype.isBlank = function( el ) {

	var elem = this.form.elements[el] || this.elem;
	
	var elemvalue = "";
	switch(elem.type) {
		case "text":
		case "password":
		case "textarea":
		case "hidden":
			elemvalue = elem.value;
			break;
		case "select-one":
		case "select-multiple":
			elemvalue = (elem.selectedIndex == -1) ? "" : elem.options[elem.selectedIndex].value;
			break;
		case "radio":
			for ( var i = 0; i < (eval("this.form." + elem.name + ".length")); i++ ) {
				if (eval("this.form." + elem.name + "[" + i + "].checked")) {
					elemvalue = eval("this.form." + elem.name + "[" + i + "].value");
				}
			
			}
			break;
		case "checkbox":
			elemvalue = elem.checked ? elem.value : "";
			break;
		case "file":
		default:
	}
	
	return Boolean( /^\s*$/.test( elemvalue ) );
}

/*< blank basic *******************************************************************/
fValidate.prototype.blank = function()
{
//	if ( this.typeMismatch( 'text' ) ) return;
	if ( this.isBlank() )
	{
		this.throwError( [this.elem.fName] );
	}
}
/*/>*/

fValidate.prototype.date = function( formatStr, delim, code, specDate, specDate2 )
{
	if ( this.typeMismatch( 'text' ) ) return;
	if ( typeof formatStr == 'undefined' )
	{
		this.paramError( 'formatStr' );
		return;
	}

	delim = this.setArg( delim, "/" );

	var error	= [this.elem.fName, formatStr.replace( /\//g, delim )];
	var format  = formatStr.split( "/" );
	var compare = this.elem.value.split( delim );
	var order   = new Object();
	
	for ( var i = 0; i < format.length; i++ )
	{
		switch( format[i].charAt( 0 ).toLowerCase() )
		{
			case 'm' :
				order.months = i;
				break;
			case 'd' :
				order.days = i;
				break;
			case 'y' :
				order.years = i;
				break;
		}
	}
	var thisDate = new Date( compare[order.years], compare[order.months]-1, compare[order.days] );
	
	if ( isNaN( thisDate ) || thisDate.getDate() != compare[order.days] || thisDate.getMonth() != compare[order.months]-1 || thisDate.getFullYear().toString().length != formatStr.match( /y/g ).length )
	{
		this.throwError( error );
		return;
	}
	
	var compareElem = this.form.elements[specDate];
	if ( typeof compareElem != 'undefined' )
	{
		specDate = compareElem.validDate || compareElem.value;
	}
	var compareDate = ( specDate == 'today' )?
		new Date():
		new Date( specDate );
	compareDate.setHours(0);
	compareDate.setMinutes(0);
	compareDate.setSeconds(0);
	compareDate.setMilliseconds(0);
	
	var timeDiff = compareDate.getTime() - thisDate.getTime();
	var dateOk   = false;
	
	switch ( parseInt( code ) ) {
		case 1 :	// Before specDate
			dateOk	= Boolean( timeDiff > 0 );
			error	= 1;
			break;
		case 2 :	// Before or on specDate
			dateOk	= Boolean( ( timeDiff + 86400000 ) > 0 );
			error	= 2;
			break;
		case 3 :	// After specDate
			dateOk	= Boolean( timeDiff < 0 );
			error	= 3;
			break;
		case 4 :	// After or on specDate
			dateOk	= Boolean( ( timeDiff - 86400000 ) < 0 );
			error	= 4;
			break;
		case 5: // Between specDate and specDate2

			var compareElem2 = this.form.elements[specDate2];
			if ( typeof compareElem2 != 'undefined' ) {
				specDate2 = compareElem2.validDate || compareElem2.value;
			}
		
			var compareDate2 = ( specDate2 == 'today' )?
				new Date():
				new Date( specDate2 );
			compareDate2.setHours(0);
			compareDate2.setMinutes(0);
			compareDate2.setSeconds(0);
			compareDate2.setMilliseconds(0);
		
			if (
			( (compareDate.getTime() <= thisDate.getTime()) && (thisDate.getTime()<=compareDate2.getTime()) )
			||
			( (compareDate.getTime() >= thisDate.getTime()) && (thisDate.getTime()>=compareDate2.getTime()) )
			) {
				dateOk = true;
			} else {
				dateOk = false;
			}
			error = 5;
			break;
		default : dateOk = true;
		}
	if ( !dateOk )
	{
		this.throwError( [specDate,specDate2], error );
	}
	this.elem.validDate = thisDate.toString();
}	
