var NcmQueryResults = $jq.createNcmClass({
	fields: {
		id: null,						/*Id of component*/
		simplefields:{},				/*Simple fields*/
		requestParams:[],				/*Request parameters*/
		filterId: null,					/*Id of filter component*/
		isInTab:false,                  /*True if the query is inside an intranet tab*/
		triggers: {},					/*Triggers id's (who affects me)*/
		triggersMap: [],				/*Triggers map*/
		autoPagerId: null,   			/*Id of timer for auto-pager*/
		eventsListeners: {},			/*Events listeners of the component*/
		eventsListenersAdv: {}			/*Events listeners of the component*/
	},
	prototype: {
		initComponent: function(jsonData) {
			/*Initialize request parameters*/
			this.initializeRequestParams();
			/*Search for filter component*/
			if(window[ncm.concat("jso",this.id)]){
				if(window[ncm.concat("jso",this.id)]["filterId"]){
					this.filterId = window[ncm.concat("jso",this.id)]["filterId"];
				}	
				if(window[ncm.concat("jso",this.id)]["tabSet"]){
					this.isInTab = true;
				}
			}
			this.initLiveEvents();
			this.initEvents();
			this.updateTabSet();
		},
		
		initLiveEvents: function(){
			var Me = this;
			/*Initialize events for print and export button*/
			$jq(ncm.concat("div.utilities button#print",this.id)).liveLinkEvents(function(){
				Me.execPrintExport("0");
			});
			$jq(ncm.concat("div.utilities button#printall",this.id)).liveLinkEvents(function(){
				Me.execPrintExport("1");
			});
			$jq(ncm.concat("div.utilities button#export",this.id)).liveLinkEvents(function(){
				Me.execPrintExport("2");
			});
			/*Initialize events for go back option*/
			$jq(ncm.concat(this.getQrSelector()," div.goback a")).liveLinkEvents(function(){
				Me.goback();
				return false;
			});
			/*Initialize click events for related objects*/
			if (this.eventsListeners[ncm.customEvents["ncmValueChange"]]) {
				var pattern1 = new RegExp("DS[0-9]+\\.PROID=","i");
				var pattern2 = new RegExp("PROID=","i");
				$jq(ncm.concat(this.getQrSelector()," a.item-href")).liveLinkEvents(function(){
					var href = $jq(this).attr("href");
					if(pattern1.test(href) || pattern2.test(href)){
						var m_params = href.split("\?")[1];
						m_params = Me.processKeyParams(m_params);
						ncm.triggerCustomEvent(ncm.customEvents["ncmValueChange"], Me, m_params);
						return false;
					} else {
						return true;
					}
				});
			}
			/*Initialize events for order by element*/
			$jq(ncm.concat("button#orderbybutton",this.id)).liveLinkEvents(function(){
				var fldName = $jq(ncm.concat("#orderbyfield",Me.id)).val();
				var fldOrder = $jq(ncm.concat("#orderbydir",Me.id)).val();
				Me.orderByField(fldName,fldOrder);
				return false;
			});
			/*Initialize timer for auto-refresh*/
			if(this.simplefields["ENABLE_AUTO_RELOAD"]){
				var interval = ncm.intval(this.simplefields["AUTO_RELOAD_INTERVAL"]);
				if(interval===0) interval=60000;
				window.setInterval(function(){
					Me.loadData();
				},interval);
			}
			$jq(ncm.concat("li#ticker",this.id," a")).liveLinkEvents(function(){
				Me.toggleAutoPager();
			});
		},
		
		initEvents: function(){
			var Me = this;
			/*Initialize events for pager*/
			ncm.setPagerEvents(this,this.getQrSelector());
			/*Initialize events for table header in the case of 'SKIN_TABLE'*/
			if(window[ncm.concat("jso",this.id)]){
				if(window[ncm.concat("jso",this.id)][ncm.DS_FIELDS_JSO]){
					$jq.each(window[ncm.concat("jso",this.id)][ncm.DS_FIELDS_JSO],function(index,val){
						var ftit = "";
						if(this["simplefields"]){
							$jq.each(this["simplefields"],function(j,valj){
								if(this.name==="TITLE_ORG"){
									ftit = this.value;
									return false;
								}
							});
						}
						$jq("table thead tr th",Me.getQrSelector()).eq(index).linkEvents(function(){
							Me.orderByField(ftit);
						});
					});
				}
			}
			/*Initialize events for auto-pager*/
			if(this.simplefields["AUTO_PAGER"] && $jq(ncm.concat("#ticker",this.id)).length===0){
				$jq(this.getQrSelector()).mouseover(function(){
					Me.stopAutoPager();
				}).mouseout(function(){
					Me.autoPager();
				});
			}
			/*Disable submit for export button form*/
			var eFrm = document.getElementById(ncm.concat("form-export-button-",this.id));
			if(eFrm){
				$jq(eFrm).submit(function(){
					return false;
				});
			}
			/*Initialize the events listeners*/
			ncm.bindCustomEvent(ncm.customEvents["ncmValueChange"],this.getQrSelector(),this,"reload");
		},
		
		actionButton: function(button, btId, actionUrl, autocheck) {
			var Me = this;
			try {
				$jq.fck.update();	// force update RichText mask				
			}catch(err){}
			try {				
				ComboDouble.update(true);
			}catch(err){}

			var params = "";			
			if (autocheck) {
				$jq(this.getObjectsSelector()).each(function(i) {
					if (i > 0) {
						params += "|";
					}
					params += $jq(this).val();
				});				
			} else {
				$jq(this.getCheckedSelector()).each(function(i) {
					if (i > 0) {
						params += "|";
					}
					params += $jq(this).val();
				});
			}

			/* select the action to be executed */
			$jq("#bt"+btId).attr("value", "true");
			$jq("#bt"+btId+"-objects").attr("value", params);
			
			/* append every input in the query */
			var query = $jq(this.getContentSelector());			
			var form = $jq(this.getRequestSelector());
			var inputs = $jq(query).find(":input").clone();
			$jq(form).append(inputs);
			
			/* Process selects */
			$jq(query).find("select").each(function() {
				var name = $jq(this).attr("name");
				$jq(this).find("option:selected").each(function() {
					var value = $jq(this).val();
					$jq(form).find("[name='"+name+"'] option[value='"+$jq(this).val()+"']").each(function() {
						$jq(this).attr("selected", "selected");
					});					
				});				
			});
			/* Process textareas */
			$jq(query).find("textarea").each(function() {
				var name = $jq(this).attr("name");
				$jq(form).find("[name='"+name+"']").val($jq(this).val());
			});
			
			$jq(form).append($jq("#bt"+btId));
			$jq(form).append($jq("#bt"+btId+"-objects"));
			
			/* process the action */
			if (form) {
				if (actionUrl != null && actionUrl != "") {
					/* send the form */
					$jq(form).attr("action", actionUrl);
					$jq(form).attr("method", "post");
					$jq(form).submit();
				} else {
					/* reload the query */
					var strParams = $jq(form).serialize();
					this.updateRequestParams(strParams);
					this.loadData();
				}
			}			
		},		
		
		checkAll: function(check) {
			$jq("input[name='check-"+this.id+"']").each(function(i) {
				$jq(this).attr("checked", check);		
			});
		},
		
		getQrSelector: function(){
			return ncm.concat("div#query-results-",this.id);
		},
		
		getRequestSelector: function() {
			return ncm.concat("#initial-request-",this.id);
		},
		
		getContentSelector: function(){
			return ncm.concat("#query-results-content",this.id);
		},
		
		getCheckedSelector: function() {
			return this.getQrSelector() + " [name='check-" + this.id + "']:checked";	
		},
		
		getButtonSelector: function() {
			return this.getQrSelector() + " [name^='qbutton-']";	
		},
						
		getObjectsSelector: function() {
			return this.getQrSelector() + " input[name='OBJID']";	
		},

		autoPager: function(){
			var interval = ncm.intval(this.simplefields["AUTO_PAGER_INTERVAL"]);
			if(interval===0) interval=3000;
			var Me = this;
			this.autoPagerId = window.setInterval(function(){
				var ppage = ncm.intval(Me.getRequestParam(ncm.concat(Me.getPrefix(),"page")));
				var ptotal = ncm.intval($jq(ncm.concat("#autopager-total-",Me.id)).val());
				ppage += 1;
				if(ppage>ptotal-1) ppage=0;
				Me.gotoPage(ppage);
			},interval);
			this.updateTicker();	
		},
		
		stopAutoPager: function(){
			if(this.autoPagerId){
				window.clearInterval(this.autoPagerId);
				this.autoPagerId = null;
				this.updateTicker();
				$jq(this.getQrSelector()).parent(".fade-wrapper").fadeTo("slow",1);
			}
		},
		
		toggleAutoPager: function(){
			if(this.autoPagerId){
				this.stopAutoPager();
			} else {
				this.autoPager();
			}
		},
		
		updateTicker: function(){
			if(this.autoPagerId!=null){
				$jq(ncm.concat("#ticker",this.id," a")).removeClass("stopped").addClass("started").attr("title",NcmQueryResults.getProperty("lang_pause"));
			} else {
				$jq(ncm.concat("#ticker",this.id," a")).removeClass("started").addClass("stopped").attr("title",NcmQueryResults.getProperty("lang_play"));
			}
		},
		
		reload: function(params,reload){
			if (reload) {
				this.updateRequestParams(params);
				this.setRequestParam(ncm.concat(this.getPrefix(),"page"),"0");
				this.loadData();
			}
		},
		
		loadData: function(){
			var Me = this;
			if(this.simplefields["SHOW_AJAX_PROGRESS"]){
				$jq(this.getQrSelector()).prepend(this.getAjaxProgress());
			}
			ncm.exec(window,"showDisabledLayer");
			ncm.triggerEvent(ncm.customEvents["ncmBeforeLoadData"]);
			$jq.post(ncm.concat("sub_",this.id,".jsp"),ncm.serializeJSONToObject(this["requestParams"]),function(html){
				var m_postprocess = function(){
					/* reset the request parameters */
					Me.requestParams = [];
					var strParams = $jq(Me.getRequestSelector()).serialize();
					Me.updateRequestParams(strParams);
					Me.initEvents();
					if(Me.filterId && window["NcmQueryFilter"]){
						NcmQueryFilter.get(Me.filterId).initEvents();
					}
					if(!Me.simplefields["AUTO_PAGER"] && Me.simplefields["NOT_SCROLL"]){
						window.scrollTo($jq(Me.getQrSelector()).offset().left,$jq(Me.getQrSelector()).offset().top);
					}
					Me.updateTicker();
					Me.triggerEventAfterLoad();
					ncm.exec(window,"hideDisabledLayer");
					ncm.triggerEvent(ncm.customEvents["ncmAfterLoadData"]);
				      /*if(!Me.simplefields["AUTO_PAGER"]){
						ncm.saveSessionStateInHistory();
					}*/      
				};
				var jqObj = $jq(Me.getQrSelector());
				if(Me.simplefields["USE_FADE_EFFECT"]){
					var jqParObj = jqObj.parent(".fade-wrapper");
					if(jqParObj.length===0){
						jqParObj = jqObj.wrap("<div class=\"fade-wrapper\"><\/div>").parent();
					}
					jqParObj.fadeTo("slow",0.3,function(){
						jqObj.replaceWith(html);
						jqParObj.fadeTo("slow",1);
						m_postprocess();
					});
				} else {
					jqObj.replaceWith(html);
					m_postprocess();
				}	
			},"html");
		},
		
		execPrintExport: function(oper){
			if(oper==="0"){
				$jq(ncm.concat("div#print-params-",this.id)).html(this.getHiddenInputs());
			} else if(oper==="1") {
				var aExclude = [ncm.concat(this.getPrefix(),"page"),ncm.concat(this.getPrefix(),"itpp")];
				$jq(ncm.concat("div#printall-params-",this.id)).html(this.getHiddenInputs(aExclude));
	       	} else if(oper==="2") {
	       		$jq(ncm.concat("div#export-params-",this.id)).html(this.getHiddenInputs());
	       		ncm.showFixedDialog(ncm.concat("#export-",this.id),400);
		   	}
		},
		
		goback: function () {
			this.setRequestParam(ncm.concat(this.getPrefix(),"step"),"1");
			var jqForm = $jq("<form action=\"\" method=\"post\"><\/form>").html("<fieldset><\/fieldset>").appendTo("body");
			if(this["requestParams"]){
				$jq.each(this["requestParams"],function(index,val){
					$jq("fieldset",jqForm).append(ncm.concat("<input type=\"hidden\" name=\"",this.name,"\" value=\"",this.value,"\" \/>\n"));
				});
			}
			jqForm.each(function(index){
				this.submit();
			});
		},
		
		orderByField: function(val,ord) {
			if(!val) return;
			if(!ord){
				if(this.getRequestParam(ncm.concat(this.getPrefix(),"orderBy"))===val) {
			   		this.setRequestParam(ncm.concat(this.getPrefix(),"orderDir"),ncm.concat("",-1*parseInt(this.getRequestParam(ncm.concat(this.getPrefix(),"orderDir")))));
		       	}
			} else {
				this.setRequestParam(ncm.concat(this.getPrefix(),"orderDir"),ncm.concat("",ord));
			}	
			this.setRequestParam(ncm.concat(this.getPrefix(),"orderBy"),val);
       		this.loadData();	
		},
				
		triggerEventAfterLoad: function(){
			if(this.eventsListeners[ncm.customEvents["ncmValueChange"]]){
				var linkEl = $jq(ncm.concat(this.getQrSelector()," .item a[href*='PROID=']:first"))[0];
				var pattern1 = new RegExp("DS[0-9]+\\.PROID=","i");
				var pattern2 = new RegExp("PROID=","i");
				var href = $jq(linkEl).attr("href");
				if(pattern1.test(href) || pattern2.test(href)){
					var m_params = href.split("\?")[1];
					ncm.triggerCustomEvent(ncm.customEvents["ncmValueChange"],this,m_params);
				} 
			}
			this.updateTabSet();
		},
		
		updateTabSet: function() {
			if(this.isInTab && window["NcmCevaTabSet"]) {
				var tabSetId = window[ncm.concat("jso",this.id)]["tabSet"]["tabSetId"];
				var tabId = window[ncm.concat("jso",this.id)]["tabSet"]["tabId"];				
				NcmCevaTabSet.getRegistered(tabSetId).updateTabParam(tabId, $jq(this.getRequestSelector()).serialize());
			}		
		},

		deleteRow: function(elem, sUrl) {
			var id = $jq(elem).parents("tr:first").find("[name='OBJID']").val();
			if (id && sUrl) {
				$jq.ajax({
					type:"POST",
					url:sUrl,
					data:(id),
					cache:false,
					success:function(data) {
						$jq(elem).parents("tr:first").remove();
					}
				});
			}
		},

		addRow: function(sUrl,qStr) {
			var Me = this;
			if (sUrl) {
				$jq.ajax({
					type: "POST",
					dataType:"json",
					url:sUrl,
					data:qStr,
					cache:false,
					success:function(json) {
						if(json.VALUES) {
							var id = json.VALUES[0].ID;
							var tbody = $jq(Me.getQrSelector() + " table tbody")
							var tr = tbody.children("tr:first").clone().appendTo(tbody).show();
							tr.find("input, select").each(
								function() {
									this.name = this.name.replace(/:0/gi,(':'+id));
									if (this.name == 'fields')
										this.value = this.value.replace(/:0/gi,(':'+id));
								}
							);
							tr.find("[name='OBJID']").attr("value",id);
						} else {
							alert('Error.');
						}
					}
				});
			}
		}		
	}
});

