/**
 * @author Brad Sevening 7/15/2007
 */

// JavaScript Document
var MakeQuery = {

	callback : null,
	qname : null,
	tabArgsArray : null,
	
	/**
	 * click event handler
	 * @deprecated
	 */
	/*qryButtonHandler : function() {
		var tblArray = [];
		tblArray.push( $("select#trigSource1").val());
		if ($("select#trigSource2").val())
			tblArray.push($("select#trigSource2").val());
		this.makeQuery(1, "bedone", tblArray);
	}, */
	 
	 showTabContent : function(reqXML) {
	 	var needTable = true;
	 	var localCrit = MakeQuery.buildCriteria(reqXML.responseXML, needTable);
		var search = new FocusSearch(localCrit, $('#' + localCrit[0].table));
		search.draw();
		$.each(localCrit, function(i, n){
			MakeQuery.critArray.push(n);	
		});
	 },
	 
	 buildTabs : function() {
	 	
	 	var qTabArray = new Array()
	 	
 		var qTabWin = lfWinLib.activate('queryTabWin', null,
			{
				modal : false,
				title : 'Query Filter Editor'
			}
		);		
		
		if (qTabWin != null) {
			
			var qkey = 0;
			var qTabSet;
			
			$.each(MakeQuery.tabArgsArray, function(i, n){
				var tcontent = '<div id="' + n.tblname + '"></div>'; 
				qTabArray[i] = new Tab(n.tagname, tcontent);
			});
			
			qTabSet = new TabSet(qTabArray, 0, "hide", "qtabs");
			
		 	$("#qbuttons").append('<div id="buttondiv" class="dialogBtnBar"></div>');
			$("#buttondiv").append('<input type="button" id="savebutton" value="Save" class="button">');
			$("#savebutton").click(function() {
				MakeQuery.saveDone('queryTabWin');							  
			});
			$("#buttondiv").append('<input type="button" id="cancelbutton" value="Cancel" class="button">');
			$("#cancelbutton").click(function() {
				lfWinLib.deactivate('queryTabWin');						  
			});
			
			$.each(MakeQuery.tabArgsArray, function(i, n){
				if(n.tbltype == 'Column') 
					method = 'loadTableColumn';
				else
					method = 'loadTableData';
					
				$.ajax( {
					type: "GET",
					dataType: "xml",
					url: URLs.makeQuery,
					async: true,
					data: "method=" + method + "&tablelist=" + n.tblname + "&querykey=" + qkey,
					complete: MakeQuery.showTabContent
				} );	
				
			});
			
		}
	 },
	
	/**
	 * makeQuery builds a GUI for defining a query which then
	 * gets saved via an ajax call.
	 * @param qkey int
	 * @param callback function
	 * @param tables list
	 * @param args object
	 */
	makeQuery : function (qkey, callback, args) {
		qkey  ? qkey : qkey = 0;
		MakeQuery.callback = callback;
		MakeQuery.tabArgsArray = args;
		MakeQuery.critArray = new Array();
		
		//var tt = $("#popup_win_trigEditor");
		//MakeQuery.qKey = MakeQuery.qKey = $("#popup_win_trigEditor")[0].data.triggerID;
		var qwin = lfWinLib.activate("queryEdit",
			null,
			{
				modal : false,
				title : "Query Editor"
			}
		);		
		
		if (qwin != null) {
			$.ajax( {
				type: "GET",
				dataType: "xml",
				url: URLs.makeQuery,
				async: true,
				data: "method=loadDefaultConfig",
				complete: MakeQuery.buildScreen
			} );
		}
	},
	
	/**
	 * buildScreen is a ajax call back function that builds the criteria
	 * array via the buildCritera call and then calls FocusSearch 
	 * which builds the screen.
	 * @param reqXML xml document
	 */
	buildScreen : function(reqXML) {				
		MakeQuery.critArray = MakeQuery.critArray.concat(MakeQuery.critArray, MakeQuery.buildCriteria(reqXML.responseXML));
		var Search = new FocusSearch(MakeQuery.critArray, $("#queryTable"));
		Search.draw();
		$("#queryTable").append('<div id="qdiv" class="dialogBtnBar">Advanced</div>')
		$("#qdiv").click(function() {
				MakeQuery.buildTabs();
				MakeQuery.critArray = new Array();
				lfWinLib.deactivate("queryEdit");
		});
		$("#qdiv").append('<input type="button" id="squerybutton" value="Save" class="button">');
		$("#squerybutton").click(function() {
			MakeQuery.saveDone('queryEdit');							  
		});
		$("#qdiv").append('<input type="button" id="scancelbutton" value="Cancel" class="button">');
		$("#scancelbutton").click(function() {
			lfWinLib.deactivate('queryEdit');						  
		});
	},
	
	/**
	 * @deprecated in this version of Make Query
	 * saveQuery builds url string that gets posted to the server
	 * via an ajax call.
	 */
	saveQuery : function() {
		var x = 0;
		var qUrlString = '';
		
		$.each(MakeQuery.critArray, function(i, n){
			if (n.value != '') {
				if (x == 0)
					MakeQuery.qname =  n.label + n.value;
					if ((MakeQuery.qname.length) > 64) {
						var indx = MakeQuery.qname.lastIndexOf(' ', 64);
						if (indx == -1 || indx <= 45)
							var indx = MakeQuery.qname.lastIndexOf(',', 64);
							if (indx == -1)
								var indx = 64;
						MakeQuery.qname = MakeQuery.qname.substr(0, indx);
					}
					
				else if (x == 1)
					MakeQuery.qname = MakeQuery.qname + ' ...';
					
  				qUrlString = qUrlString + n.field + '|' + n.value + '\n';
				
				x++;
			}
		});
		
		var qdata = "method=save&queryname=" + MakeQuery.qname + "&querykey=" + MakeQuery.qKey + "&critstr=" + qUrlString; 
		$.ajax( {
			type: "Post",
			dataType: "xml",
			url: URLs.makeQuery,
			async: true,
			data: qdata,
			complete: MakeQuery.saveDone
			
		} );
	},
	
	/**
	 * saveDone is event handler for ok GUI button that deactivates
	 * the screen and calls the call back function.
	 */
	saveDone: function(win) {
		lfWinLib.deactivate(win);
		MakeQuery.callback(MakeQuery.critArray);
		//alert('Query Saved');
	},
	
	/**
	 * buildCritera parses xml and builds an array of objects.
	 * @param respXML string (xml)
	 * @returns array of objects
	 */
	buildCriteria : function(respXML, needTable) {
		var aliasval = '';
		var qfCritArray = [];
		var qfRoots = respXML.getElementsByTagName('queryfields');
		
		for (var i = 0 ; i < qfRoots.length ; i++) {
			var qfRoot = qfRoots[i];
			var table = qfRoot.getAttribute("table");
			var qfCols = qfRoot.getElementsByTagName("col");
			
			for (var x = 0 ; x < qfCols.length ; x++) {
				var qfCol = qfCols[x];
				var fieldval = qfCol.getAttribute("name");
				var labelval = qfCol.getElementsByTagName("displayname")[0].firstChild.nodeValue;
				var fieldtypeval = qfCol.getElementsByTagName("type")[0].firstChild.nodeValue;
				if (qfCol.getElementsByTagName("alias")[0].firstChild)
					var aliasval = qfCol.getElementsByTagName("alias")[0].firstChild.nodeValue;
				if (needTable)
					var qfCrit = {table: table, field: fieldval, label: labelval, fieldtype: fieldtypeval, alias:aliasval};
				else
					var qfCrit = {field: fieldval, label: labelval, fieldtype: fieldtypeval, alias:aliasval};
				qfCritArray.push(qfCrit);	
			}
		}
		
		var qvRoots = respXML.getElementsByTagName('lmquery');
		
		for (var i = 0 ; i < qvRoots.length ; i++) {
			var qvRoot = qvRoots[i];
			var qid = qvRoot.getAttribute("id");
			var qvCritVals = qvRoot.getElementsByTagName("crit");
			
			for (var x = 0 ; x < qvCritVals.length ; x++) {
				var qvCritVal = qvCritVals[x];
				var tblFldName = qvCritVal.getAttribute("field");
				
				for (var j = 0 ; j < qfCritArray.length ; j++) {
					if (qfCritArray[j].field == tblFldName)
						qfCritArray[j].value = qvCritVal.firstChild.nodeValue;
				}
			}
		}
		
		return qfCritArray;
	}
}

