
/***
Term
****/
// Constructeur d'objets Term
// Un terme correspond a un nom de champ et sa valeur.
// VA le 7/8/2008 : gestion du boost
// Le boost est la pertinence de la recherche, par défaut c'est 1. Si on met un chiffre plus élevé, alors 
// il apparaitra dans les premiers de la liste des résultats. Il permet de ponderer le score d'une recherche.
function Term(name, value, boost) {
	this.name = name;
	this.value = value;
	if (boost == null) boost = 1; // Valeur par défaut
	//this.type="TERM";
	
	this.getString = function() {
		var str = "";
		
		if(this.name && this.value && (this.name.length > 0) && (this.value.length > 0)) {
			str += this.name + ":(" + this.value + ")";
			if (this.boost && this.boost > 1) {
				str += "^" + this.boost;
			}
		}
		return str;
	}
}

/***
Expr
****/

// Represente une suite de Term ou de Expr combines avec un meme operateur ( AND ou OR)
// Ex: (toto OR titi OR tata)
function Expr(op)
{
	this.operator = op;
	//this.type="EXPR";
	this.items = new Array();
	
	// Fonction privée d'évaluation récursive
	function evalItems(tab, operator, start, end)
	{
		var first = tab[start].getString();
		
		if(start==end)
			return first;
			
		else
		{
			var remainder = evalItems(tab, operator, start+1, end);
			if(first != "")
			{
				if(remainder != "") {
					/*
					 * VA le 9-9-2009 : les () ne sont plus mises ici, car pour le NOT on ne peut pas
					 * (expr) AND (expr) AND (NOT (expr))
					 * ne fonctionne pas, mais
					 * (expr AND expr AND NOT (expr)) 
					 * fonctionne
					 * Les () sont donc inserees dans le getString
					 return "(" + first + ") " + operator + " (" + remainder + ")";
					*/
					return first + " " + operator + " " + remainder;
				} else {
					return first;
				}
			} else {
				return remainder;
			}
		}
	}
	
	// Fonction publique qui renvoi le résultat de l'évaluation
	// pas déclarée par prototype pour avoir visibilité sur fonction evaluate
	this.getString = function()
	{
		var str = "";

		if ( this.items.length > 0 ) {
			/*
			 * VA le 9-9-2009 : ajout des () dans le getString pour pouvoir gerer le NOT
			str = evalItems(this.items, this.operator, 0, this.items.length-1);
			*/
			str = "(" + evalItems(this.items, this.operator, 0, this.items.length-1) + ")";
		}
		return str;		
	}
}

// Ajoute un Term a l'expression
Expr.prototype.addItem = function(item)
{
	this.items[this.items.length] = item;
}

Expr.prototype.itemCount = function()
{
	return this.items.length;
}

/*
 * ExprNot est une surcharge de Expr dont le getString retourne une expression sous la forme
 * NOT (expr OR expr)
 */
 
function ExprNot() {
  Expr.call(this, "NOT");
  this.getString = function() {
		var str = "";
		if (this.items.length > 0) {
			//str = "NOT (" +  Expr.prototype.evalItems.call(this, this.items, "", 0, this.items.length-1) + ")";
			// Les ExprNot sont de type : NOT (expr )
			for(var i = 0 ; i < this.items.length ; i++) {
				if (str.length != 0) str += " OR ";
				str += " " + this.items[i].getString();
			}
			str = "NOT (" + str + ")";
		}
		return str;
  }
  
};
ExprNot.prototype = Expr.prototype;

