//////////////////////////////////////////////
// Search Object VERSION_0.8.5
//////////////////////////////////////////////
//
// Ali Russell 01.2007
//
//////////////////////////////////////////////

//FORM FIELD TYPES
window.SearchFieldType_Text = 0;
window.SearchFieldType_Binary = 0;
window.SearchFieldType_Date = 0;
//###############################


var Search = Class.create();
Search.prototype = {
//
// Member Variables
m_searchInput: null, 
m_searchBtn: null, 
m_clearBtn: null,
m_searchFields: null,
m_columnFilterHash: null,
m_defaultSearchboxClass: null,
m_filterOn: false,

advancedFields: new Array(),

m_currentAutoComplete: null,

m_autoCompleteDiv: null,



//
// Constructor
initialize: function(gsBox, gsSBtn, gsCBtn, advSId)
	{
		
		window.AdvancedSearch = this;
		this.gsBox = $(gsBox);
		this.gsSBtn = $(gsSBtn);
		this.gsCBtn = $(gsCBtn);
		
		
		if (advSId!="")
		{


			this.m_autoCompleteDiv = Builder.node('div', {id: "ASAutoComplete", style: "display: none"});
			
			this.m_autoLoadingDiv = Builder.node('div', {className: "item"}, 
												 						[
																		 Builder.node('img', {src: "./pics/Search/loading.gif", height: "25px"})
																		]);
			this.m_autoNoItemsDiv = Builder.node('div', {className: "item"}, ["No Matches!"]);
			
			document.body.appendChild(this.m_autoCompleteDiv);
			
			
			this.asCBtn = Builder.node('div', {className: "closeBtn", title: "Click to close the Advanced Search Panel"});
			this.asLoadingNode = Builder.node('div', {}, "Loading Columns...");
			RegisterEvent(this.asCBtn, "click", this, "CloseAS");
			
			this.asCont = Builder.node('div', {className: "container"}, 
						 								[
														 	Builder.node('div', {className: "title"},
																		 							[
																									 	Builder.node('div', {className: "titleText"}, ["Advanced Search"]),
																										this.asCBtn
																									]
																		 							),
															this.asLoadingNode
														]
						 								);
			
			this.asDiv = Builder.node('div', {id: "AdvSearchSurface", style: "display: none"}, [this.asCont]);
			$(advSId).appendChild(this.asDiv);			
			
			
			mSpaceApplication.Subscribe("AdvancedSearch.Open", this);
			
			RegisterEvent(document.body, "click", this, "HideAutoComplete");
		}
		
		
		
		
		
		

			
		RegisterEvent(this.gsSBtn, "click", this, "PerformAS");
		RegisterEvent(this.gsCBtn, "click", this, "ClearAS");
		
		RegisterEvent(this.gsBox, "keyup", this, "GSKeyUp");
	
		


		mSpaceApplication.Subscribe("ColumnBrowser.ColumnsLoaded", this);
		mSpaceApplication.Subscribe("AdvancedSearch.ClearItem", this)
		
	},
	
Notify: function(eventName, eventParams)
	{
		switch(eventName)
		{
			case 'Search.Filter.TurnOn' : this.TurnOnFilter(eventParams); break;
			case 'ColumnBrowser.ColumnsLoaded' : this.LoadAdvancedSearch(eventParams); break;
			case 'AdvancedSearch.Open' : this.OpenAS(eventParams); break;
			case 'AdvancedSearch.ClearItem' : this.ClearItem(eventParams); break;
			case 'AdvancedSearch.Perform' : this.PerformAS(eventParams); break;
			default: break;
		}		
	},
	
SortCols: function(a, b)
	{
		if (!a.so && b.so)
		{
			return 1;
		}
		if (a.so && !b.so)
		{
			return -1;
		}		
		else if (a.so<b.so)
		{
			return -1;
		}
		else if (a.so>b.so)
		{
			return 1;
		}	
		else
		{
			return 0;
		}		
	},

LoadAdvancedSearch: function(pcols)
	{
		var thisObj = this;
		var columns = new Array();
		for (var x=0; x<pcols.length; x++) 
		{
			columns.push(pcols[x]);
		}
		
		columns.sort(function(a, b) { return thisObj.SortCols(a, b); });
		
		this.asCont.removeChild(this.asLoadingNode);
		
		this.as_AllFormField = Builder.node('input', {type: "text"});
		RegisterEvent(this.as_AllFormField, "keyup", this, "AnyInputKeyUp");
		this.advancedFields.push({name:'q', type: 'normal', input: this.as_AllFormField});
		
		this.asCont.appendChild(
								Builder.node('div', {className: "AdvSearchItem"},
																				[
																					Builder.node('div', {className: "label"},["All"]),
																					this.as_AllFormField
																				]
											 )
								);
		
		this.asCont.appendChild(Builder.node('div', {className: "AdvSearchBreak"}));
		
		for (var i=0; i<columns.length; i++)
		{			
			if ((columns[i].ctp==0) || (columns[i].ctp==2))
			{
				var tempFF = Builder.node('input', {type: "text"});
				RegisterEvent(tempFF, "keyup", this, "AnyInputKeyUp");
				this.advancedFields.push({name:columns[i].Uri, type: 'normal', input: tempFF});
					
				this.asCont.appendChild(
										Builder.node('div', {className: "AdvSearchItem"},
																						[
																							Builder.node('div', {className: "label"},[columns[i].Label]),
																							tempFF
																						]
													 )
										);			
			}
		}
		
		this.asCont.appendChild(Builder.node('div', {className: "AdvSearchBreak"}));
		
		this.as_searchBtn = Builder.node('input', {type: "button", value: "Search All"});
		RegisterEvent(this.as_searchBtn, "click", this, "PerformAS");
		this.as_searchSomeBtn = Builder.node('input', {type: "button", value: "Search Some"});
		RegisterEvent(this.as_searchSomeBtn, "click", this, "PerformAS");		
		this.as_clearBtn = Builder.node('input', {type: "button", value: "Clear"});
		RegisterEvent(this.as_clearBtn, "click", this, "ClearAS");
		
		this.as_incSliceChk = Builder.node('input', {type: "checkbox"});
		
		
		this.asCont.appendChild(
								Builder.node('div', {className: "AdvSearchButtons"},
																				[
																					this.as_searchBtn,
																					this.as_searchSomeBtn,
																					this.as_clearBtn/*,
																					Builder.node('label', {}, [this.as_incSliceChk, "Search within slice."])*/																	
																				]
											 )
								);		
	},
	
OpenAS: function(a)
	{
		Effect.BlindDown('AdvSearchSurface');
		
	},
	
CloseAS: function(a)
	{
		Effect.BlindUp('AdvSearchSurface');
	},
	

PerformAS: function(e, element)
	{
		

		var sUrl = window.mSpaceApplication.GetServerUrl("infobox");
		
		if ((this.as_incSliceChk.checked) && (window.ColumnBrowser))
		{
			sUrl += window.ColumnBrowser.GetColumnParamString();
		}		
		
		if (element==this.gsSBtn)
		{
			var tempgsVal = this.gsBox.value;
			this.ClearAS();
			this.as_AllFormField.value = tempgsVal;
			this.gsBox.value = tempgsVal;
		}
		else
		{
			this.gsBox.value = this.as_AllFormField.value;
		}
		

		sUrl += this.GetSearchString(element!=this.gsSBtn);

		
		if (element==this.as_searchBtn)
		{
			sUrl += "&searchtype=and";
		}
		else if (element==this.as_searchSomeBtn)
		{
			sUrl += "&searchtype=or";
		}
		else
		{
			sUrl += "&searchtype=and";
		}
		
		mSpaceApplication.FireEvent('InformationControl.SetUrl', sUrl);
		
		
	},

ClearAS: function(a)
	{
		for (var i=0; i<this.advancedFields.length; i++)
		{
			var fd = this.advancedFields[i];
			fd.input.value = "";			
		}	
		
		this.gsBox.value = "";
		
		mSpaceApplication.FireEvent('AdvancedSearch.Clear', null);
	},
	
ClearItem: function(params)
	{
		for (var i=0; i<this.advancedFields.length; i++)
		{
			var fd = this.advancedFields[i];
			if (fd.name==params.field)
			{
				fd.input.value = "";			
			}
		}	
		
		
		if (params.type=="and")
		{
			this.PerformAS(null, this.as_searchBtn);
		}
		else
		{
			this.PerformAS(null, this.as_searchSomeBtn);
		}
		
		
	},
	
GetSearchString: function(adv)
	{

		var searchString = "";

		if (adv)
		{
			for (var i=0; i<this.advancedFields.length; i++)
			{
				var fd = this.advancedFields[i];
				if ((fd.name!='q') && (fd.input.value!=""))
				{
					searchString += "&scol[]=scol:" + URLEncode(fd.name);
					searchString += "&scol[]=val:" + URLEncode(fd.input.value);
				}
			}	
		}
		
		if ((this.as_AllFormField) && (this.as_AllFormField.value!=""))
		{
			searchString += "&q=" + URLEncode(this.as_AllFormField.value);
		}	
		
		return searchString;
	},
	
HandleResponse: function(id, data)
	{
	},
	
GeneralSubmit: function()
	{
	},
	
Clear: function()
	{
	},
	
GSKeyUp: function(e, element)
	{
		if (e.keyCode==13)
		{
			this.PerformAS(e, this.gsSBtn);
		}
	},

AnyInputKeyUp: function(e, element)
	{
		if (e.keyCode==13)
		{
			this.PerformAS(e, element);
			return;
		}
		
		if ((e.keyCode==27) || (element.value==""))
		{
			element.value = "";
			this.HideAutoComplete();
			return;
		}		
		
		
		if (element!=this.as_AllFormField)
		{			
			for (var i=0;i<this.advancedFields.length;i++)
			{
				var advsObj = this.advancedFields[i];
				
				if (advsObj.input==element)
				{
					this.PerformAutoCompletion(advsObj);
				}
			}
		}
		
	},
	
PerformAutoCompletion: function(advancedSearchObject)
	{
		
		var inputObj = advancedSearchObject.input;
		
		this.m_autoCompleteDiv.innerHTML = "";
		this.m_autoCompleteDiv.appendChild(this.m_autoLoadingDiv);
		
		if ((this.m_currentAutoComplete!=null) && (this.m_currentAutoComplete == advancedSearchObject))
		{
		}
		else
		{
			this.m_currentAutoComplete = advancedSearchObject;
			
			
			
			
			var autoDiv = $(this.m_autoCompleteDiv);
			
			autoDiv.style.top = (findPosY(inputObj) + inputObj.offsetHeight) + "px";
			autoDiv.style.left = findPosX(inputObj) + "px";
			
			var spacerBorder = 0;
			//Getting the border only works in ie, so this compensates for the lack of 
			//moz-box-typ.? css style
			var styleString = getStyle(autoDiv, "border");
			if ((styleString!="undefined") && (styleString!=""))
			{
				spacerBorder = parseInt(styleString);
			}					
			
			autoDiv.style.width = (inputObj.offsetWidth - (spacerBorder*2)) + "px";
			//autoDiv.style.height = "150px";
			
			autoDiv.show();
			
			
		}
		
		this.GetAutoCompleteMatches(inputObj.value);
	},
	
GetAutoCompleteMatches: function(text)
	{
		
		mSpaceApplication.FireEvent("DataController.Cancel", this);
		
		var autoUrl = window.mSpaceApplication.GetServerUrl("autocomplete") + "&column=" + this.m_currentAutoComplete.name+ "&term=" + text + "&limit=10&offset=0";
		
		
		mSpaceApplication.FireEvent("DataController.Request", { 'sender' : this, 'id' : 'autocomplete', 'type' : "GET", 'url' : autoUrl });
		
	},
	
HandleResponse: function(id, data, returnParameter)
	{
		
			this.m_autoCompleteDiv.innerHTML = "";
		
			var matches = new Array();
			matches = eval(data);		
			
			
			if (matches.length==0)
			{
				this.m_autoCompleteDiv.appendChild(this.m_autoNoItemsDiv);
				return;
			}
			
			for (var i=0;i<matches.length;i++)
			{
				var tempNode = Builder.node('a', {className: "item"});
				tempNode.innerHTML = matches[i].html;
				
				RegisterEvent(tempNode, "click", this, "AutoItemClick", false, false, matches[i].text);
				
				this.m_autoCompleteDiv.appendChild(tempNode);
				
			}
			
	},
	
AutoItemClick: function(e, element, name, param)
	{
		this.m_currentAutoComplete.input.value = param;
		
		this.HideAutoComplete();
	},
	
HideAutoComplete: function(e, element)
	{
		if (element==this.m_autoCompleteDiv)
			return;
		this.m_currentAutoComplete = null;
		$(this.m_autoCompleteDiv).hide();
	}


	

}
