var Solr = {}; // Namespace anlegen

Solr.Parser = Class.create({
	solrQ: false,
	solrQParsed: false,
	initialize: function(parameters) {
		try {
			var query = location.href.split('?')[1];
			
			try {
				query = decodeURIComponent(query);
			}catch(exc) {
				console.error(exc);
			}
			
			query = unescape(query);
			if(query && query.length > 0) {
				query.split("&").each(function(urlParam) {
					if(urlParam && urlParam.length > 0) {
						var paramPair = urlParam.split("=");
						
						if(paramPair[0] == "q") {
							this.solrQ = paramPair[1];
						}
					}
				}.bind(this));
			}
		}catch(exc) {
			console.error(exc);
		}
	},
	parse: function() {
		if(this.solrQ && !this.solrQParsed) {
			this.solrQParsed = new Array();
			var tmpData = this.solrQ.replace(/\+TO\+/g, "__PLUS__TO__PLUS__");
			
			/**
			 * Ersetzt logische Verkuepfungen und deren Klammern, um diese in UI zu aktivieren.
			 * Die UI selbst entscheidet über spätere Verknuepfungen, somit koennen zwei UIs einen
			 * Solr Q untereinander tauschen, aber die Logik ist seperat via Components zu steueren.
			 * (sma)
			 */
			tmpData = tmpData.replace(/\(|\)|\AND|OR/g, "");
			
			tmpData = tmpData.split("+");
			
			tmpData.each(function(solrParamPair) {
				var splittedPair = solrParamPair.split(":");
				if(splittedPair && splittedPair.length > 0 && splittedPair[0] != "") {
					this.solrQParsed.push(this.detectNode(splittedPair));
				}
			}.bind(this));
		}
		
		return this.solrQParsed;
	},
	detectNode: function(arrParserValue) {
		var item = {};
		item.name = arrParserValue[0];
		item.value = arrParserValue[1].replace(/__PLUS__TO__PLUS__/g, " TO ");
		
		// RegExp fuer Ranges von [* TO *], [ZAHL TO *], [* TO ZAHL] und [ZAHL TO ZAHL]
		var regularExpression = /[\[]{1}([[0-9]{1,}|[*]) TO ([[0-9]{1,}|[*])[\]]/g;
		regularExpression.exec(null);
		var regexResult = regularExpression.exec(item.value);
		
		//console.log("Item.value: %o", item.value);
		//console.log("RegexRes: %o", regexResult);
		
		if(regexResult) {
			item.value = false;
			item.from = regexResult[1];
			item.to = regexResult[2];
		}else {
			item.from = false;
			item.to = false;
		}
		
		return item;
	}
});