/*
AUTHOR : OLIVIER BOISSIN (oboissin@ftel.fr)
DATE : 2006/06/13
BASED ON MIKE GOLDING'S WORK : http://www.mikezilla.com/exp0031.html

USAGE : GoogleToNotesSearch.init(new Array('myfield1', 'myfield2'));
	  GoogleToNotesSearch.parse("my -google \"search query\"");
*/

var GoogleToNotesSearch = {
	query : "",
	fields : null,

	init : function(fields) {
		this.fields = fields ;
	},
	trim : function(str) {
		return str.replace(/^\s*([\s\S]*\S+)\s*$|^\s*$/,'$1') ;
	},
	parse : function(query) {
		this.query = query ;

		try {
			var gQuery, tQuery ;

			// trim, on remplace tous les espaces (doubles et + y compris) par des symb\uFFFDles _#_
			gQuery = this.trim(this.query).replace(/ ( )*/g, "_#_") ;
	
			// on remplace tous les symb\uFFFDles _#_ compris entre guillemets par des '_@_'
			oQuery = "" ;
			while (oQuery != gQuery) {
				oQuery = gQuery ;
				gQuery = gQuery.replace(/"(.*?)_#_(.*?)"/g, "\"$1_@_$2\"");
			}

			// transformation des '_#_' en ' AND '	
			gQuery = gQuery.replace(/_#_/g, " AND ") ;

			// transformation des ' -' en ' NOT '	
			gQuery = gQuery.replace(/ \-(\w)/g, " NOT $1") ;

			// transformation des ' | ' en ' OR '	
			gQuery = gQuery.replace(/ \| /g, " OR ") ;
			gQuery = gQuery.replace(/ AND OR /g, " OR ") ;
			gQuery = gQuery.replace(/ OR AND /g, " OR ") ;

			// transformation des '"..."' en '... '	(retrait des guillemets)
			gQuery = gQuery.replace(/"(.*?)"/g, "$1") ;	

			// des champs ont \uFFFDt\uFFFD pr\uFFFDcis\uFFFDs, on modifie la requ\uFFFDte en cons\uFFFDquence
			if (this.fields != null && this.fields.length > 0) {
				var tQuery = gQuery.split(" ");
				for (var i=0 ; i<tQuery.length ; i++) {
					var val = tQuery[i];
	
					if (val == "AND" || val == "OR" || val == "NOT") 
						continue ;

					tQuery[i] = "(";
	
					for (var j=0 ; j<this.fields.length ; j++) {
						tQuery[i] += "[" + this.fields[j] + "]=" + val + " OR ";				
					}

					tQuery[i] = tQuery[i].substring(0, tQuery[i].length - 4) + ")";
				}
		
				gQuery = tQuery.join(" ");
			}

			// transformation des '_@_' en ' '	(au sein des guillemets, donc)
			gQuery = gQuery.replace(/_@_/g, " ") ;	
	
			return gQuery ;
		}
		catch (exception) {
			return this.query ;
		}		
	}	
}
