/**
 * @author Nivaria Innova Team
 */

function QueryResultsAjax() {
	this.id = null;						//Id of component
	this.parentId = null;				//If belongs to Query in 3 steps this is id of Query in 3 steps
	this.simplefields = new Array();	//Component simple fields values
	this.itpp = 5;						//Items per page
	this.page = 0;						//Current page 
	this.filter = "";					//Filter parameter
	this.option = 0;					//Define print and export options (0-print current page, 1-print all pages, 2 -export data)
	this.orderField = "";
	this.orderDir = "1";
	this.categoryId = -1;
	this.pid = 0;
	this.vexport = 0;
	this.searchId = -1;					//Id of search component inside the query results
	this.dsType = -1;					//Datasource type
}

QueryResultsAjax.prototype = {
	initialize: function(objectId,options) {
		this.id = objectId;
		//Getting component simple fields values
		ncm.initSimpleFields(QueryResultsAjax,this);
		this.itpp = this.simplefields["NUMROWS"];
		this.filter = this.simplefields["FILTER"]?this.simplefields["FILTER"]:"";
		this.orderField = this.simplefields["ORDERFIELD"]?this.simplefields["ORDERFIELD"]:"";
		this.orderDir = this.simplefields["ORDERDIR"]?this.simplefields["ORDERDIR"]:"1";
		if(this.orderField=="") {
			this.initOrderField();
		}
		this.initDataSourceType();
		if(options!=null) {
			this.parentId = options.parentId?options.parentId:null;
		}
		this.initFilter();
		var extParams = window.location.search.replace(/\?/,"");
		if(extParams==null || extParams=="preview=true") extParams="";
		if(this.parentId==null) {
			this.getResults(extParams);
		}
		if(this.dsType==5 && extParams=="") {	//Events
			ncm.triggerEvent(ncm.event_calendarQueryLoaded,[]);
		}
	},
	
	getResults: function(extParams) {
		var Me = this;
		var jspfile = QueryResultsAjax.getProperty("jsp");
		if(jspfile=="") jspfile= "components/query/results/QueryResultsAjax.jsp";
		var params = this.getRequestParams();
		if(extParams) params +="&"+extParams;
		$jq.ajax({
    		async: true,
       		type: "POST",
       		url: jspfile,
       		data: params,
       		dataType: "html",
       		error: function(request,msg,ex) {
       			ncm.showError(msg,ex,request);
       		},
       		success: function(html) {
				var selector = "#";
				selector += QueryResultsAjax.getProperty("query_results_id");
				selector += Me.id;
				$jq(selector).html(html);
				if(Me.parentId!=null) {
					QueryAjax.get(Me.parentId).showStep(2);
				}
       		}
   		});
	},

	initFilter: function() {
		var Me = this;
		var jspfile = QueryResultsAjax.getProperty("jsp");
		if(jspfile=="") jspfile= "components/query/results/QueryResultsAjax.jsp";
		var params = this.getRequestParams();
		params += "&action=1";
		$jq.ajax({
    		async: false,
       		type: "POST",
       		url: jspfile,
       		data: params,
       		dataType: "json",
       		error: function(request,msg,ex) {
       			ncm.showError(msg,ex,request);
       		},
       		success: function(json) {
				if(json && json.length>0) {
					Me.searchId = json[0];
				}
       		}
   		});
		//Register the filter component
		if(this.searchId!=-1) {
			var options = {
				resultsId: this.id
			};
			try {
				QuerySearchAjax.register(this.searchId,options);
				QuerySearchAjax.get(this.searchId).getSearchFilter($jq("#srchBy"+this.searchId).val());				
			} catch(mErr) {}
		}
	},
	
	getRequestParams: function() {
		var params = "objId=";
		params += this.id;
		params += "&issueId=";
		params += QueryResultsAjax.issueId;
		params += "&inPreview=";
		params += QueryResultsAjax.inPreview;
		params += "&pageUrl=";
		params += QueryResultsAjax.pageUrl;
		params += "&itpp=";
		params += this.itpp;
		params += "&page=";
		params += this.page;
		params += "&vprint=";
		params += this.simplefields["ISPRINT"];
		params += "&filter=";
		params += this.filter;				
		params += "&option=";
		params += this.option;
		params += "&orderBy=";
		params += this.orderField;
		params += "&orderDir=";
		params += this.orderDir;
		params += "&showinpage=";
		params += this.simplefields["DETAILSPAGE"]?this.simplefields["DETAILSPAGE"]:"";
		params += "&channel=";
		params += QueryResultsAjax.channel;
		params += "&selCatId=";
		params += this.categoryId;
		params += "&pid=";
		params += this.pid;
		params += "&vexport=";
		params += this.vexport;
		params += "&accesscontrol=";
		params += this.simplefields["CONTROL"];
		params += "&language=";
		params += QueryResultsAjax.language;
		if(this.parentId!=null) {
			try {
				var searchParams = QueryAjax.get(this.parentId).getSearchParams();
				if(searchParams) {
					params += "&";
					params += searchParams;
				}	
			} catch(mErr) {}
		} else {
			if(typeof(QuerySearchAjax)!="undefined") {
				var srchObject = QuerySearchAjax.getInstanceByDatasource(this.getDataSourceId());
				if(srchObject!=null) {
					var searchParams = srchObject.getSearchParams();
					if(searchParams) {
						params += "&";
						params += searchParams;
					}
				}
			}
		}
		if(this.searchId!=-1) {
			try {
				var filterParams = QuerySearchAjax.get(this.searchId).getFilterParams();
				if(filterParams) {
					params += "&";
					params += filterParams;
				}
			} catch(mErr) {}
		}
		return params;
	},
	
	refreshItems: function(val) {
		this.itpp = val;
		this.page = 0;
		this.getResults();
	},
	
	gotoPage: function(val) {
		this.page = val;
		this.getResults();
	},
	
	changePage: function(val) {
		var pgNum = this.page + val;
		if(pgNum<0) return;
		var selector = "#";
		selector += QueryResultsAjax.getProperty("query_results_id");
		selector += this.id;
		selector += " ul.navpages li";
		var totalPages = $jq(selector).length - 2;
		if(pgNum>totalPages-1) return;
		this.gotoPage(pgNum);
	},
	
	showDetail: function(itemId) {
		var detailsPage = this.simplefields["DETAILSPAGE"]?this.simplefields["DETAILSPAGE"]:"";
		if(detailsPage!="") {
			var prefix = "DS"+this.simplefields["DATASOURCE"]+".";
			document.location.href = detailsPage+"?"+prefix+"step=3&"+prefix+"ID="+itemId;
		} else if(this.parentId!=null) {
			QueryAjax.get(this.parentId).runStep(3,itemId);
		}
	},
	
	initOrderField: function() {
		var jspfile = QueryResultsAjax.jsp_utils;
		if(jspfile==null)
			jspfile = QueryResultsAjax.getProperty("utils_jsp");
		if(jspfile=="") jspfile= "components/components-utils.jsp";
		var params = new String("action=3");
		params += "&objId=";
		params += this.id;
		var Me = this;		
		$jq.ajax({
    		async: false,
       		type: "POST",
       		url: jspfile,
       		data: params,
       		dataType: "json",
       		error: function(request,msg,ex) {
       			ncm.showError(msg,ex,request);
       		},
       		success: function(json) {
				if(json!=null && json.length>1) {
					Me.orderField = json[0];
					Me.orderDir = json[1];				
				}
       		}
   		});
	},

	initDataSourceType: function() {
		var jspfile = QueryResultsAjax.jsp_utils;
		if(jspfile==null)
			jspfile = QueryResultsAjax.getProperty("utils_jsp");
		if(jspfile=="") jspfile= "components/components-utils.jsp";
		var params = new String("action=4");
		params += "&dsId=";
		params += this.getDataSourceId();
		var Me = this;		
		$jq.ajax({
    		async: false,
       		type: "POST",
       		url: jspfile,
       		data: params,
       		dataType: "json",
       		error: function(request,msg,ex) {
       			ncm.showError(msg,ex,request);
       		},
       		success: function(json) {
				if(json!=null && json.length>0) {
					Me.dsType = json[0];
				}
       		}
   		});
		if(this.dsType==5) {  //Events
			var selector = "#";
			selector += QueryResultsAjax.getProperty("query_results_id");
			selector += this.id;
			$jq(selector).bind(ncm.event_calendarClick,function(e,params){
				Me.page = 0;
				Me.getResults(params);
			});
			ncm.addEventListener(ncm.event_calendarClick,selector);
		}
	},
	
	orderByField: function(val) {
   		if(this.orderField==val) {
        	this.orderDir = ""+(-1*(parseInt(this.orderDir)));
       	}
       	this.orderField=val;
		this.getResults();
    },
	
	filterCategory: function(catId) {
		this.categoryId = catId;
		this.page = 0;
		this.getResults();
	},
	
	goback: function() {
		if(this.parentId!=null) {
			QueryAjax.get(this.parentId).showStep(1);
		} else {
			window.history.back();
		}
	},
	
	getDataSourceId: function() {
   		return this.simplefields["DATASOURCE"]!=null?parseInt(this.simplefields["DATASOURCE"]):-1;	
    },
	
	execOption: function (istable) {
		var selector = "#option";
		selector += this.id;
		var opt = $jq(selector).val();
		if(opt=="0" || opt=="1")
			this.printQuery(istable,opt);
		if(opt=="2")
			this.exportQuery();	
    },
   
   	exportQuery: function() {
   		if(this.parentId==null) return;
		var Me = this;
		var jspfile = QueryResultsAjax.getProperty("export_jsp");
		if(jspfile=="") jspfile= "components/query/results/QueryResultsExport.jsp";
		var params = "objId=";
		params += this.parentId;
		params += "&inPreview=";
		params += QueryResultsAjax.inPreview;
		
		$jq.ajax({
    		async: true,
       		type: "POST",
       		url: jspfile,
       		data: params,
       		dataType: "text",
       		error: function(request,msg,ex) {
       			ncm.showError(msg,ex,request);
       		},
       		success: function(contextPath) {
				if($jq.trim(contextPath)!="") {
					ncm.openWindow($jq.trim(contextPath)+'/Export?type=0&fileName=query_export');					
				}
       		}
   		});
   	},
   
   	printQuery: function(istable,opt) {
   		var Me = this;
		var jspfile = QueryResultsAjax.getProperty("preprint_jsp");
		if(jspfile=="") jspfile= "components/query/results/QueryResultsPreparePrint.jsp";
		var params = this.getRequestParams();
		$jq.ajax({
    		async: true,
       		type: "POST",
       		url: jspfile,
       		data: params,
       		dataType: "text",
       		error: function(request,msg,ex) {
       			ncm.showError(msg,ex,request);
       		},
       		success: function(text) {
				if($jq.trim(text)=="OK") {
					ncm.openWindow(QueryResultsAjax.getProperty("print_jsp")+"?table="+istable+"&printall="+opt);
				}
       		}
   		});
   	}
};

QueryResultsAjax.instances = new Array();
QueryResultsAjax.properties = new Array();
QueryResultsAjax.datatype = null;
QueryResultsAjax.jsp_utils = null;
QueryResultsAjax.language = null;
QueryResultsAjax.pageUrl = null;
QueryResultsAjax.channel = null;
QueryResultsAjax.inPreview = false;
QueryResultsAjax.issueId = null;
QueryResultsAjax.instanceByDs = new Array();

QueryResultsAjax.register = function(objectId,options) {
	var resObject = new QueryResultsAjax();
	resObject.initialize(objectId,options);
	QueryResultsAjax.instances[""+objectId] = resObject;
	if(QueryResultsAjax.instanceByDs[""+resObject.getDataSourceId()]==null) {
		QueryResultsAjax.instanceByDs[""+resObject.getDataSourceId()]=resObject;
	}
}

QueryResultsAjax.getRegistered = function(objectId) {
	return QueryResultsAjax.instances[""+objectId];
}

QueryResultsAjax.get = function(objectId) {
	return QueryResultsAjax.getRegistered(objectId);
}

QueryResultsAjax.initProperties = function(options) {
	ncm.initProperties(QueryResultsAjax,options);
}

QueryResultsAjax.getProperty = function(propName) {
	var res = QueryResultsAjax.properties[propName];
	if(res==null) res="";
	if(typeof(res)=="undefined") res="";
	return res;
}

QueryResultsAjax.getInstanceByDatasource = function(dsId) {
	return QueryResultsAjax.instanceByDs[""+dsId];
}
