// $Revision: 3 $ $Date: 2010-02-10 12:46:16+00:00 $ $Workfile: TT_MiniSearch.js $

var en_minusImage = 0;
var en_plusImage = 1;
var en_detailsList = 2;
var en_uniqueID = 3;
var en_Rows = 4;
var en_ClientID = 5;
var en_tableID = 6;
var en_postBackID = 7;
var en_searchFunction = 8;
var en_searchFunctionParameter = 9;
var en_allowEmptySearchString = 10;

var en_dtDescription = 0;
var en_dtHint = 1;
var equalOperator = 0;

var ttsearch_state = [];

function ttsearch_initMiniSearch(miniSearchID) 
{	
	var ttstate = new ttsearch_miniSearch(miniSearchID, eval("ttsearch_"+miniSearchID+"_Mini"),
	eval("ttsearch_"+miniSearchID+"_MiniDetails"));		
}

function ttsearch_GetState(miniSearchID)
{
	if(ttsearch_state[miniSearchID]==null)
		ttsearch_initMiniSearch(miniSearchID);
	return 	ttsearch_state[miniSearchID];
}

function ttsearch_miniSearch(miniSearchID, props, columns)
{
	ttsearch_state[miniSearchID]=this;		
	this.Id =miniSearchID;
	this.MinusImage =props[en_minusImage];
	this.PlusImage	=props[en_plusImage];	
	this.Details	=props[en_detailsList];		
	this.Settings = new ttsearch_settings("normal","","","","");	
	this.UniqueID=props[en_uniqueID];
	this.HiddenField=document.getElementById(this.UniqueID);	
	this.HiddenGroupNames=document.getElementById(this.UniqueID+"groups");		
	this.HiddenGroupExpanded=document.getElementById(this.UniqueID+"expanded");		
	this.Resize=false;	
	this.Groups=[];
	this.ClientID =props[en_ClientID];
	for(i=0;i<props[en_Rows].length;i++)
	{
		rows= new Array();
		for(k=0;k<props[en_Rows][i][1].length;k++)
		{
			rows[rows.length] = new ttsearch_row(props[en_Rows][i][1][k]);
		}
		
		this.Groups[props[en_Rows][i][0]]= rows;
	}			
	this.Table =document.getElementById(props[en_tableID]);//  this.ClientID).getElementsByTagName("TABLE").item(0);
		
	if(document.getElementById(this.ClientID) !=null)
	{
		var tmp =document.getElementById(this.ClientID).getElementsByTagName("TABLE");
		this.FooterTable=tmp.item(tmp.length-1); 		
		//Collapse the relevant groups
		if(this.HiddenGroupNames !=null &&
			this.HiddenGroupNames.value !="")
		{
			var splitGroups = new Array();
			var splitExpanded = new Array();
			splitGroups=this.HiddenGroupNames.value.split("|");
			splitExpanded=this.HiddenGroupExpanded.value.split("|");
			for(l=0;l<splitGroups.length;l++)
			{			
				if(!Boolean(parseInt(splitExpanded[l])))//colapse the relevant group							
					ttsearch_toggleSearchGroup(miniSearchID, splitGroups[l],false);			 
			} 
		}	
	}

	this.PostBackId = props[en_postBackID];
	this.SearchFunction = props[en_searchFunction];
	this.SearchFunctionParameter = props[en_searchFunctionParameter];
	this.AllowEmptySearchString = Boolean(parseInt(props[en_allowEmptySearchString]));
	
	//set the controls
	if(columns.data !=null)
	{
		this.DataMarshaller =columns.data.DataMarshaller;
		this.DataMarshallerLength =columns.length;
		
		for( i=0;i<columns.length;i++)
		{
			if(columns.data.DataMarshaller[i].id !="")
			{
				if(document.getElementById(columns.data.DataMarshaller[i].id) !=null)
				{
				
					this.DataMarshaller[i].object = document.getElementById(columns.data.DataMarshaller[i].id)	
					if(this.DataMarshaller[i].controlType==UIControlType_DropDownLov ||
						this.DataMarshaller[i].controlType==UIControlType_DropDownLovWithPostBack ) 
					{	
						var item = this.DataMarshaller[i].object.parentElement.parentElement.getElementsByTagName("input");
						if(item !=null)
								this.DataMarshaller[i].tag=item[0];
						
					}
				}
			}
		}		
	}
	this.GetColumnValue =GetColumnValue;
	
	function GetColumnValue(column)
	{
		var ttstate = this;
		var returnValue ="";
		var value;
		for(i=0;i<this.DataMarshallerLength;i++)
		{
			if(ttstate.DataMarshaller[i].column ==column)
			{ 
				switch(parseInt(ttstate.DataMarshaller[i].controlType))
				{
					case UIControlType_InputNumeric:
						var numeric =ttstate.DataMarshaller[i].object;
						value =numeric.value; 					
						break;
						
					case UIControlType_InputTimeRange:	
					case UIControlType_InputTime:			
						var hours =ttstate.DataMarshaller[i].object;
						var minutes =hours.parentElement.parentElement.parentElement.nextSibling.nextSibling.getElementsByTagName("input")[0];				
						
						if(hours.value !="" && minutes.value !="" &&	hours.value.toUpperCase() !="HH" && minutes.value.toUpperCase() !="MM" )						
						{					
							value = hours.value +":" + minutes.value;						
						}
						
						break;
						
					case UIControlType_InputDateRange:
					case UIControlType_InputDate:
						var day =ttstate.DataMarshaller[i].object;
						var month =day.parentElement.parentElement.parentElement.nextSibling.nextSibling.getElementsByTagName("input")[0];
						var year =month.parentElement.parentElement.parentElement.nextSibling.nextSibling.getElementsByTagName("input")[0];
						
						if(day.value !="" && month.value !="" && year.value !="" &&
							day.value.toUpperCase() !="DD" && month.value.toUpperCase() !="MM" && year.	value.toUpperCase() !="YYYY")						
						{					
							value = day.value +"/" + month.value  +"/" +year.value;										
						}
						break;
					case UIControlType_InputBoolean:
						if(ttstate.DataMarshaller[i].object.checked )
						{
							value = ttstate.DataMarshaller[i].object.checked;
						}
						break;
					case UIControlType_InputBooleanYN:
						if(ttstate.DataMarshaller[i].object.checked )
						{
							value = "Y";
						}
						break;
					default:
						if(ttstate.DataMarshaller[i].object.value !="")
						{
							value = ttstate.DataMarshaller[i].object.value;						
							
						}		
					break;
				}
				break;
			}
		}
		return value;
	}
}

function ttsearch_row(row)
{	
	this.Row = row;
}

function ttsearch_toggleSearchGroup(miniSearchID,group, updateSettings)
{	
	var ttstate =ttsearch_GetState(miniSearchID);	
	var table =ttstate.Table; 	
	var expanded =false;
	var minRow =9999;	
	for(i=0;i<ttstate.Groups[group].length;i++)
	{ 
	    if(parseInt(ttstate.Groups[group][i].Row) < minRow)
			minRow=ttstate.Groups[group][i].Row;
			
		if(table.rows[ttstate.Groups[group][i].Row].style.display=="")
		{
			table.rows[ttstate.Groups[group][i].Row].style.display="none";		
			expanded=false;			
		}
		else
		{
			table.rows[ttstate.Groups[group][i].Row].style.display="";
			expanded=true;	
		}	
	}	
	minRow--;
	if(expanded)
		table.rows[minRow].cells[0].getElementsByTagName("IMG").item(0).src=ttstate.MinusImage;		
	else
		table.rows[minRow].cells[0].getElementsByTagName("IMG").item(0).src=ttstate.PlusImage;		
		
	if(updateSettings)
	{
		var splitGroups = new Array();
		var splitExpanded = new Array();
		splitGroups=ttstate.HiddenGroupNames.value.split("|");
		splitExpanded=ttstate.HiddenGroupExpanded.value.split("|");
		var tmp= new String();		
		for(l=0;l<splitGroups.length;l++)
		{		
			if(splitGroups[l] ==group)
			{				
				if(expanded)
					tmp +="-1|";
				else
					tmp +="0|";
			}
			else
				tmp+=splitExpanded[l] +"|";			
		} 		
		ttstate.HiddenGroupExpanded.value =tmp.substr(0,tmp.length-1);
	}
				
}


function ttsearch_highlightRow(miniSearchID,row)
{			
	var ttstate =ttsearch_GetState(miniSearchID);	
	ttsearch_resetTableRows(miniSearchID);
	row.cells[1].className="scell";			
	row.cells[2].className="scell mssplit";			
	
	
}

function ttsearch_resetTableRows(miniSearchID)
{
	var ttstate =ttsearch_GetState(miniSearchID);	
	var table =ttstate.Table; 	
	
	for(i=0;i<table.rows.length;i++)
	{	
		if(table.rows[i].cells.length ==4)
		{			
			table.rows[i].cells[1].className="hcell";			
			table.rows[i].cells[2].className="hcell mssplit";						
		}
	}
}

function ttsearch_tableMouseMove(miniSearchID,table,evnt)
{
	try
	{
	var se=ttdd_srcElement(evnt);	
	var ttstate =ttsearch_GetState(miniSearchID);	
	var offsetLeft;
	var left;
	try
	{
		offsetLeft = new Number(table.rows[1].cells[3].offsetLeft-table.rows[1].cells[2].offsetLeft);
		left= ttdd_getPos(table.rows[1].cells[3]).x;	
	}
	catch(ex)
	{
		offsetLeft = new Number(table.rows[0].cells[3].offsetLeft-table.rows[0].cells[2].offsetLeft);
		left= ttdd_getPos(table.rows[0].cells[3]).x;	
	}
	
	//var tmp=ttlayout_settings;			
	if(ttstate.Settings.mode =="normal")
	{
		if(se.tagName =="TD")
		{	
			if(evnt.x <left && (left -evnt.x) <5 ||
				evnt.x >left && (evnt.x-left) <5)	
			{	
				//se.parentElement.style.cursor="col-resize";
				for(i=0;i<table.rows.length;i++)
				{
					table.rows[i].style.cursor="col-resize";
				}
				if(window.event.button==1)
				{
					ttstate.Settings.mode="resize";
				}
			}
			else
			{				
				se.parentElement.style.cursor="pointer";
			}
		}
	}
	else
	{
		if(window.event.button==1)
		{			
			document.getElementById(ttstate.UniqueID).value=offsetLeft-(left -evnt.x)-3;
			for(i=0;i<table.rows.length;i++)
			{
				if(table.rows[i].cells.length >3)
				{
					table.rows[i].cells[2].style.width =offsetLeft-(left -evnt.x)-3; 
				}
			}			
		}
		else
		{
			//se.parentElement.style.cursor="pointer";
			for(i=0;i<table.rows.length;i++)
			{
				table.rows[i].style.cursor="pointer";
			}
			ttstate.Settings.mode="normal";
		}
	}
	}
	catch(er){}
}



function ttsearch_setHintText(miniSearchID,pos)
{	
	try
	{
		var ttstate =ttsearch_GetState(miniSearchID);		
		var footerTable =ttstate.FooterTable;
		
		// Slight hack here. Minisearch is used for Filter dialog in grid. The footer
		// contains buttons here which we don't want to lose
		if (footerTable.rows[0].cells[0].innerHTML.indexOf("BUTTON")==-1)
		{
		    footerTable.rows[0].cells[0].innerHTML =" " +ttstate.Details[pos][en_dtDescription].toLowerCase();
		    footerTable.rows[1].cells[0].innerHTML =" " +ttstate.Details[pos][en_dtHint];		
		}
	}
	catch(e){}
}

function ttsearch_settings(mode,activeCell,activeSpan,currentSelection,currentFocus)
{
	this.mode=mode;
	this.activeCell=activeCell;
	this.activeSpan=activeSpan;
	this.currentSelection=currentSelection;			
	this.currentFocus=currentFocus;
}

function ttsearch_controlFocus(miniSearchID, item, row, dataPos)
{	
	var ttstate =ttsearch_GetState(miniSearchID);	
	if(ttstate !=null && ttstate.Table !=null)
	{
		var table =ttstate.Table; 	
	
		ttsearch_highlightRow(miniSearchID,table.rows[row]);
		//Disabling set hint text for now	
		ttsearch_setHintText(miniSearchID,dataPos);	
	}
}

function ttsearch_keyDown(miniSearchID, e)
{
	var ttstate =ttsearch_GetState(miniSearchID);	
	
	e = e || window.event;
	// Return key pressed
	if ((typeof e != 'undefined') && (typeof e.keyCode != 'undefined') && e.keyCode == 13)
	{
		ttsearch_performSearchKeyDown(miniSearchID, e)
		var linkId =ttstate.PostBackId;
		var button =document.getElementById(linkId);	
		
		try // Does not work in Firefox
		{
			window.document.focus();
			button.focus();	
		}
		catch(ex)
		{
		}
					
		button.onclick();
	}
}

function  ttsearch_performSearchKeyDown(miniSearchID, e)
{
	e = e || window.event;
	// Return key pressed
	if ((typeof e != 'undefined') && (typeof e.keyCode != 'undefined') && e.keyCode == 13)
	{
		ttsearch_performSearch(miniSearchID);
	}
}

function  ttsearch_performSearch(miniSearchID)
{
	var ttstate =ttsearch_GetState(miniSearchID);	
	var searchString = new String();	
	var operator;
	var value;
	var count =0;
	for(i=0;i<ttstate.DataMarshallerLength;i++)
	{
		value ="";
		operator =equalOperator;
		switch(parseInt(ttstate.DataMarshaller[i].controlType))
		{
			case UIControlType_InputNumeric:
			case UIControlType_Currency:
				var numeric =ttstate.DataMarshaller[i].object;
				value =numeric.value; 
				operator=GetOperator(numeric).value;
				break;
				
			case UIControlType_InputTimeRange:	
			case UIControlType_InputTime:			
				var hours =ttstate.DataMarshaller[i].object;
				var minutes =hours.parentElement.parentElement.parentElement.nextSibling.nextSibling.getElementsByTagName("input")[0];				
				
				if(hours.value !="" && minutes.value !="" &&	hours.value.toUpperCase() !="HH" && minutes.value.toUpperCase() !="MM" )						
				{					
					value = hours.value +":" + minutes.value;
					//Determine the operator
					operator=GetOperator(hours).value;				
				}
				
				break;
				
			case UIControlType_InputDateRange:
			case UIControlType_InputDate:
				var day =ttstate.DataMarshaller[i].object;
				var month =day.parentElement.parentElement.parentElement.nextSibling.nextSibling.getElementsByTagName("input")[0];
				var year =month.parentElement.parentElement.parentElement.nextSibling.nextSibling.getElementsByTagName("input")[0];
				if(year.value.length == 2)
				{
					// Interpret 2 year date in the same way as in TT_InputDate
				    var yearNum = new Number(year.value);
				    var today = new Date();
					var currentYear = today.getFullYear();
					
					if (yearNum<100)
					{
						if (2000+yearNum>currentYear+10)
						{
							year.value = 1900+yearNum;
						}
						else
						{
							year.value = 2000+yearNum;
						}
					}
				}
				if(day.value !="" && month.value !="" && year.value !="" &&
					day.value.toUpperCase() !="DD" && month.value.toUpperCase() !="MM" && year.	value.toUpperCase() !="YYYY")						
				{					
					
					value = day.value +"/" + month.value  +"/" +year.value;
					//Determine the operator
					operator=GetOperator(day).value;				
				}
				break;
			case UIControlType_InputBoolean:
				if(ttstate.DataMarshaller[i].object.checked )
				{
					value = ttstate.DataMarshaller[i].object.checked;
					//if a text box determine what search mode has been selected
					if(ttstate.DataMarshaller[i].controlType ==UIControlType_InputText)
					{
						var mode = ttstate.DataMarshaller[i].object.parentElement.parentElement.			getElementsByTagName("select");
						if(mode !=null)
						{
							operator = mode[0].value;
						}					
					}
					
				}
				break;
			case UIControlType_InputBooleanYN:
				if(ttstate.DataMarshaller[i].object.checked )
				{
				    if (ttstate.DataMarshaller[i].inverted == "False")
				    {
					    value = "Y";
					}
					else
					{
					    value = "N";
					}
					
					//if a text box determine what search mode has been selected
					if(ttstate.DataMarshaller[i].controlType ==UIControlType_InputText)
					{
						var mode = ttstate.DataMarshaller[i].object.parentElement.parentElement.			getElementsByTagName("select");
						if(mode !=null)
						{
							operator = mode[0].value;
						}					
					}
				}
				break;
			default:
				if(ttstate.DataMarshaller[i].object.value !="")
				{
				    //AJm Removed escape, instead the entire search string should be escaped when posted
					value = ttstate.DataMarshaller[i].object.value;
					//if a text box determine what search mode has been selected
					if(ttstate.DataMarshaller[i].controlType ==UIControlType_InputText)
					{
						var mode = ttstate.DataMarshaller[i].object.parentElement.parentElement.			getElementsByTagName("select");
						if(mode !=null)
						{
							operator = mode[0].value;
						}					
					}
					
				}		
			break;
		}
		//If not empty add onto search string	
		if(value !="")
		{
			var customAttributeString = '';
			// Use customattributes to store whether we need to use Upper in query
			if (ttstate.DataMarshaller[i].forceCase == "True")
			{
				customAttributeString += 'CONVERTTOUPPERCASE=0';
			}
		
			if(count >0)
				searchString +=conditionSep;
			searchString +=ttstate.DataMarshaller[i].column +"|" + operator +"|" + value +"|" +
			ttstate.DataMarshaller[i].controlType +"||" +customAttributeString;
			count++;
		}
	}

	if(searchString !="" || (searchString =="" && ttstate.AllowEmptySearchString))
	{			
		var functionCall;
		var re = new RegExp('\'', 'gi');
		
		searchString = searchString.replace(re, "\\'");
		
		if(ttstate.SearchFunctionParameter =="") 
			functionCall =ttstate.SearchFunction +"('" + searchString +"','" +miniSearchID +"')";
		else
			functionCall =ttstate.SearchFunction +"('" +ttstate.SearchFunctionParameter  +"','"+ searchString +"','" +miniSearchID+ "')";
			
		eval(functionCall.replace("\\","\\\\"));
	}
}

function GetOperator(control)
{
	var found =false;
	while(found!=true)
	{
		if(control.parentElement ==null)
			return;
		else if (control.getElementsByTagName("select").length >0)
		{
			return control.getElementsByTagName("select")[0];
		}
		control = control.parentElement;
	}
}
