/*********************************************************************************/
/**			copyright (c) PlanetCalc.com, 2007  			**/
/**		    	form input validation functions				*/
/*********************************************************************************/

function ValidatorNonempty( ) {
	this.Validate = function ( src ) {
		return ( src == "" )?getFormattedMessage( 'err_must_be_not_empty' ):"";
	}
}


function ValidatorEmail( obj ) {
	this.Validate = function ( src ) {
		return ( src.indexOf("@")==-1 )?getFormattedMessage( 'err_invalid_email', src ):"";
	}
}

function ValidatorEqual( obj1, lbl ) {
	this.Validate = function ( src ) {
		return ( obj1.value!=src )?getFormattedMessage('err_must_be_the_same_as',lbl):"";
	}
}

function ValidatorTextSize( lenLow , lenHigh ) {
	this.Validate = function ( src ) {
		var valueLength = src.length;
		if ( valueLength<lenLow ) {
			return getFormattedMessage('err_must_be_at_least_x_chars_long', lenLow);
		} else if ( valueLength>lenHigh ) {
			return getFormattedMessage('err_must_be_less_or_equal_x_chars',lenHigh);
		}
		return "";
	}
}
function ValidatorCharset( charset ) {
	this.Validate = function ( src ) {
		for( var i = 0;i<src.length;++i ) {
			var ch = src.substring( i, i+1 );
			if ( charset.indexOf(ch)==-1 ) {
				return getFormattedMessage( 'err_invalid_symbol', charset );
			}
		}
		return "";
	}
}

function ValidatorComplex( ) {
	var m_validators = arguments;
	this.Validate = function ( src ) {
		var res = "";
		for( var i =0; i<m_validators.length;++i ) {
			var validator = m_validators[i];
			var newRes = validator.Validate( src );
			if ( newRes!="" ) {
				if ( res != "" ) {
					res +="<br/>";
				}
				res+=newRes;
			}
		}
		return res;	
	}
}

function ValidatorImport( ) {
	var m_validators = arguments;
	var m_separator = null;
	var m_linesCount = 0;
	var m_fieldIndex = 0;

	function GetSeparator( line, count ) {
		var separators = [ "\t",";",","];
		for( var i=0;i<separators.length; ++i ) {
			var current = separators[i];
			var res = line.split( current );
			if ( res.length == count ) {
				return current;
			}
		}
		return null;
	}

	this.ParseData =  function( processor, src ) {
		m_separator = null;
		m_linesCount = 0;
		m_fieldIndex = 0;
		var separator  = "\r\n";
		if ( src.search(separator)==-1 ) {
			separator  = "\n";
		}
		var lines = src.split(separator);
		if ( !lines.length ) {
			return "";	
		}
		
		if ( m_validators.length>1 ) {
			m_separator = GetSeparator( lines[0], m_validators.length );
			if ( !m_separator ) {
				return getFormattedMessage( 'err_import_cannot_find_separator');
			}
		}
		
		for( var i=0;i<lines.length;++i ) {
			var record = [];
			var line = lines[i];
			if ( m_separator ) {
				record = line.split( m_separator );
			} else {
				record[0] = line;
			}
			++m_linesCount;
			var res = processor.ProcessRow( record );
			if ( res!="" ) {
				return res;
			}
		}
		return "";
	}
	this.Validate = function ( src ) {
		return this.ParseData( this, src );
	}
	this.ProcessRow = function ( record ) {
		for( m_fieldIndex  =0; m_fieldIndex<m_validators.length;++m_fieldIndex ) {
			var validator = m_validators[m_fieldIndex];
			if ( validator ) {
				var value = record[m_fieldIndex];
				var newRes = validator.Validate( value );
				if ( newRes!="" ) {
					return getFormattedMessage( 'err_import_error',m_linesCount, value, newRes);
				}
			}
		}
		return "";	
	}

}

function removeInvalidDigits( src, negative, floatingPoint ) {
	var charset = "0123456789+-*/";
	var dot = false;
	var result = "";
	for( var i = 0;i<src.length;++i ) {
		var ch = src.substring( i, i+1 );
		if ( charset.indexOf(ch)==-1 ) {
			if ( ch == '-' ) {
				if (negative && i==0 ) {
					result+=ch;
				}
			} else if ( ch =='.' ) {
				if( floatingPoint && i!=0 && !dot ) {
					dot = true;
					result+=ch;
				}
			}
		} else {
			result +=ch;
		}
	}
	return result;
}

function ValidatorNumber( negative, floatingPoint ) {
	this.Validate = function ( src ) {
		if ( src != "" ) {
			var newStr = removeInvalidDigits( src, negative, floatingPoint );	
			if ( newStr!=src) {
				if (  negative && floatingPoint ) {
					return getFormattedMessage( 'err_invalid_number' );
				} else if (  !negative && floatingPoint ) {
					return getFormattedMessage( 'err_invalid_positive_number' );
				} else if (  negative && !floatingPoint ) {
					return getFormattedMessage( 'err_invalid_integer_number' );
				} else {
					return getFormattedMessage( 'err_invalid_integer_positive_number' );
				}
			}
		}
	
		return "";
	}
}


function ValidatorRange( rangeLow, rangeHigh ) {
	this.Validate = function ( src ) {
	        var n = Number(src);
		if( n< rangeLow || n>rangeHigh ) {
			return getFormattedMessage( "err_range_error" , rangeLow , rangeHigh );
		}
		return "";
	}
}

function ValidatorFirstAlpha( ) {
	this.Validate = function ( value ) {
		if ( value.length ) {
			var ch = value.substring( 0, 1 );
			if ( ( ch>='a' && ch<='z' ) || ( ch>='A' && ch<='Z') ) {
				return ""
			}
		}
		return getFormattedMessage('err_first_char_must_be_alpha');
	}
}

function ValidatorCalculatorScript( funcHeader ) {
	this.Prohibited = new Array();
	for( var i = 1;i<arguments.length;++i ) {
		this.Prohibited[ i-1 ] = arguments[i];
	}
	this.Validate = function ( value ) {
		var fullText = funcHeader + value + "}";
		for( var i = 0;i<this.Prohibited.length;++i ) {
			var feature = this.Prohibited[i];
			if ( fullText.indexOf(feature)!=-1 ) {
				return getFormattedMessage('err_prohibited_features', feature);
			}
		}
		try {
			eval( fullText );
		} catch( e ) {
			return getFormattedMessage('err_script_compilation_error',e.message );
		}
		return "";
	}
}

