
mt.component.SearchEngine = function() {

	var self = this;

	this.queryData = {};
	this.result = {};
	this.iPageOffset = 15;
	
	this.queryData.isPaginated = false;

	this.init = function(){
		this.queryData.tablesWithLeftJoin = [];
		this.queryData.tablesWithInnerJoin = [];
		this.queryData.whereClauses = [];
	}
	
	this.getQueryData = function(){
		return this.queryData;
	}

	this.run = function(init){
		if (init) this.queryData.pageIndex = 1;
		this.init();
		try {this.layoutProvider.init();}catch(e){};
		if (this.queryData.isPaginated) Element.hide(this.domPaginationId);
		if (this.onBeforeSearch()) {
			this.setLoading();
			this.load();
		}
	}
	
	this.setLoading = function() {
		$(this.layoutProvider.domId).innerHTML = '<div class="center" style="margin-top:10px"><img src="'+rootPath+'pages/images/loader.gif" alt="" /></div>';
		this.onLoading();
	}
	this.load = function(){
		SearchEngine.getResults(Object.toJSON(this.queryData), function(results){
			self.result = results.evalJSON();
			self.layoutProvider.setDisplay(self);
			if (self.queryData.isPaginated && (self.result.totalCount>self.result.pageOffset)){
				self.setPagination();
			}
			self.onAfterSearch(self.result);
		});
		
	}
	
	this.setLayoutProvider = function(provider) {
		this.layoutProvider = provider;
	}
	
	this.enablePagination = function(enable){
		this.queryData.isPaginated = enable;
	}
	
	this.setPagination = function(){
		
		var numPages = Math.ceil(this.result.totalCount/this.result.pageOffset);
		
		var container = document.createElement("div");
		
		if (this.queryData.pageIndex>1) {
			var link = document.createElement("a");
			link.style.paddingRight = "15px";
			link.onclick = function(){
				self.setPageIndex(self.queryData.pageIndex-1);
				self.run(false);
			}
			link.href = "javascript:void(0)";
			link.innerHTML = "&lt; ";
			container.appendChild(link);
		}
		
		
		
		(numPages).times(function(num){
			if (self.queryData.pageIndex==(num+1)) {
				container.appendChild(document.createTextNode(num+1));
			} else {
				var link = document.createElement("a");
				link.style.padding = "0 3px 0 3px";
				link.onclick = function(){
					self.setPageIndex(num+1);
					self.run(false);
				}
				link.href = "javascript:void(0)";
				link.innerHTML = num+1;
				container.appendChild(link);
			}
		});
		
		
		if (this.queryData.pageIndex<numPages) {
			var link = document.createElement("a");
			link.style.padding = "0 3px 0 3px";
			link.onclick = function(){
				self.setPageIndex(self.queryData.pageIndex+1);
				self.run(false);
			}
			link.href = "javascript:void(0)";
			link.innerHTML = " &gt;";
			container.appendChild(link);
		}
		
		Element.show(this.domPaginationId);
		$(this.domPaginationContentId).innerHTML = "";
		
		$(this.domPaginationContentId).appendChild(container);
		
	}
	
	this.setPaginationElements = function(id, id2){
		this.domPaginationId = id;
		this.domPaginationContentId = id2;
	}
	
	this.onBeforeSearch = function(){return true};
	this.onAfterSearch = function(){};
	this.onLoading = function(){};
	
	this.setMainTable = function(tableName, tableAlias, tableId){
		this.queryData.tableName = tableName;
		this.queryData.tableAlias = tableAlias;
		this.queryData.tableId = tableId;
	}
	
	this.setSelectPart = function(select){
		this.queryData.select = select;
	}
	
	this.setGroupByClause = function(clause){
		this.queryData.groupByClause = clause;
	}
	
	this.setOrderBy = function(clause, direction){
		this.queryData.orderByClause = clause+" "+direction;
	}

	this.addTable = function(tableName, jointure, values){
		this.queryData.tablesWithInnerJoin.push({jointure:tableName+" ON ("+jointure+")", values:values || []});
	}
	
	this.addTableWithLeftJoin = function(tableName, jointure, values){
		this.queryData.tablesWithLeftJoin.push({jointure:tableName+" ON ("+jointure+")", values:values || []});
	}
	
	this.addWhereClause = function(clause, values){
		this.queryData.whereClauses.push({clause:clause, values:values || []});
	}
	
	this.getWhereClauses = function() {
		return this.queryData.whereClauses;
	}
	
	this.setPageIndex = function(index){
		this.queryData.pageIndex = index;
	}
	this.setPageOffset = function(iPageOffset){
		this.queryData.iPageOffset = iPageOffset;
	}
	
	this.init();	
}

/*
mt.component.layout.CustomLayout = function(domId){
	this.domId = domId;
	this.setDisplay = function(engineInstance) {};
}
*/