
var SdEcConditions = {};		// public  global identifiers
var $_EcConditions = {};		// private global identifiers

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

SdEcConditions.evaluate = function (text)
{
	var value;
	try
	{
		var tokens = text.split(" ");

		var buffer = { "tokens" : tokens, "pos" : 0 };

		value = $_EcConditions.expression( buffer );
	}
	catch (message)
	{
		SdCommon.error(message);
		value = false;
	}

	return value;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcConditions.expression = function ( buffer )
{
	var left = $_EcConditions.term    ( buffer );
	var op   = $_EcConditions.getToken( buffer );

	var value = null;

	while(true)
	{
		if (op == "and") {
			var right = $_EcConditions.term( buffer );
			value = (left && right);		
		} else if (op == "or") {
			var right = $_EcConditions.term( buffer );
			value = (left || right);
		} else {
			$_EcConditions.backUp( buffer );
			value = left;
			break;
		}

		op   = $_EcConditions.getToken( buffer );
		left = value;
	}

	return value;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcConditions.term = function ( buffer )
{
	var left  = $_EcConditions.factor  ( buffer );
	var op    = $_EcConditions.getToken( buffer );

	if (op == "is") {
		var right = $_EcConditions.factor( buffer );
		if (right != 'empty') throw "operator 'is' must be followed by 'empty'";
		return (left == "");
	}

	if (op == "not") {
		var right = $_EcConditions.factor( buffer );
		if (right != 'empty') throw "operator 'not' must be followed by 'empty'";
		return (left != "");
	}

	var value;

	if (op == "eq") {
		var right = $_EcConditions.factor( buffer );
		value = (left == right);
	} else if (op == "ne") {
		var right = $_EcConditions.factor( buffer );
		value = (left != right);
	} else if (op == "gt") {
		var right = $_EcConditions.factor( buffer );
		value = (left >  right);
	} else if (op == "lt") {
		var right = $_EcConditions.factor( buffer );
		value = (left <  right);
	} else if (op == "ge") {
		var right = $_EcConditions.factor( buffer );
		value = (left >= right);
	} else if (op == "le") {
		var right = $_EcConditions.factor( buffer );
		value = (left <= right);
	} else {
		$_EcConditions.backUp( buffer );
		return left;
	}

	if (left  == "") value = false;
	if (right == "") value = false;

	return value;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcConditions.factor = function ( buffer )
{
	
	var value = null;

	var token = $_EcConditions.getToken( buffer );
	if (token != "(")
	{
		value = token;
	}
	else
	{
		value = $_EcConditions.expression( buffer );
		token = $_EcConditions.getToken  ( buffer );
		if (token != ")") throw "mismatched parenthesis";
	}

	return value;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcConditions.getToken = function ( buffer )
{
	var tokens = buffer["tokens"];
	var pos    = buffer["pos"   ];
	var len    = tokens.length;

	var token = (pos < len ? tokens[pos] : null);

	buffer["pos"] = (pos + 1);

	return token;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$_EcConditions.backUp = function ( buffer )
{
	var pos = buffer["pos"  ];
	buffer["pos"] = (pos-1);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

