function WGT_SearchEngine(isite,igoogle,iyahoo,ilive)
{
	var obj = {
		
		site: null,
		googleWebSearch: null,
		googleSearchControl: null,
		yahooSearchControl: null,
		liveSearchControl: null,
		searchingTxt: 'Searching...',
		noResultsTxt: '0 results found.',
		searchResultsTxt: 'Search results for',
		resultsid: null,
		result_target_blank: false,
		event_url: '',
		yahooID: '',

		current_query: '',
		current_engine: '',
		current_restricted: false,
		default_first:0,
		default_count: 8,

		init: function(isite,igoogle,iyahoo,ilive)
		{
			this.site = isite;
			if (igoogle == 1)
			{
				var div = document.createElement("DIV");

				this.googleSearchControl = new GSearchControl();
				this.googleWebSearch = new GwebSearch();

				this.googleWebSearch.setNoHtmlGeneration();
				this.googleSearchControl.addSearcher(this.googleWebSearch);
				this.googleSearchControl.setResultSetSize(GSearch.LARGE_RESULTSET);
				this.googleSearchControl.setSearchCompleteCallback(this, this.googleOnSearchComplete);
				this.googleSearchControl.draw(div);
			}
			if (iyahoo == 1)
			{ this.yahooSearchControl = true; }

			this.liveSearchControl = false;  // Windows Live Search is COPYRIGHTED !!.
		},

		setResultsDivID: function(divid)
		{ this.resultsid = divid; },

		setResultsTargetBlank: function(b)
		{ this.result_target_blank = b; },

		setSearchingText: function(txt)
		{ this.searchingTxt = txt; },

		setNoResultsText: function(txt)
		{ this.noResultsTxt = txt; },

		setSearchResultsText: function(txt)
		{ this.searchResultsTxt = txt; },

		setEventUrl: function(u)
		{ this.event_url = u; },

		setYahooID: function(i)
		{ this.yahooID = i; },

		methodClosure: function(object, method, opt_argArray)
		{
			return function()
			{ return method.apply(object, opt_argArray); }
		},

		execute_search: function(query,engine,restricted,first,count)
		{
			if (first == null)
			{
				first = this.default_first;
				this.showSearchingText();
			}

			if (count == null)
			{ count = this.default_count; }
			
			this.current_query = query;
			this.current_engine = engine;
			this.current_restricted = restricted;
			if (engine == 'GOOGLE' && this.googleSearchControl != null && this.googleWebSearch != null)
			{
				if (restricted && this.site != null && this.site.length > 0)
				{ this.googleWebSearch.setSiteRestriction(this.site); }
				else { this.googleWebSearch.setSiteRestriction(null); }

				this.googleSearchControl.execute(query);
			}
			else if (engine == 'YAHOO' && this.yahooSearchControl != null)
			{
				var search_url = 'http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=' + this.yahooID + '&';

				if (restricted && this.site != null && this.site.length > 0)
				{ search_url += 'site=' + this.site + '&'; }

				search_url += 'start='+ first + '&';
				search_url += 'results='+ count + '&';
				search_url += '&output=xml&query=' + query;
			
				var args = new Object;
				args.url = search_url;

				ajaxCaller.postVars(this.event_url,args,null,this.yahooOnSearchComplete,true,this,true);
			}
			else if (engine == 'LIVE' && this.liveSearchControl != null)
			{
				var search_url = 'http://search.live.com/results.aspx?';

				if (restricted && this.site != null && this.site.length > 0)
				{ search_url += 'q1=site%3A' + this.site + '&'; }

				first = first+1;  // ???
				search_url += 'first='+ first + '&';
				search_url += 'count='+ count + '&';
				search_url += 'fulltext=Search&format=xml&q='+query;
				
				var args = new Object;
				args.url = search_url;

				ajaxCaller.postVars(this.event_url,args,null,this.liveOnSearchComplete,true,this,true);
			}
			else
			{ alert('Search Engine "' + engine + '" is not valid'); }
		},


		// ---------  Google only Functions ---------

		googleGotoPage: function(searcher, page)
		{ searcher.gotoPage(page); },

		googleOnSearchComplete: function(sc, searcher)
		{
			var list = [];
			var cursorNode=null;

			var n=0;
			this.hideSearchingText();
			if ( searcher.results && searcher.results.length > 0) {
				for (var i = 0; i < searcher.results.length; i++)
				{
					var result = searcher.results[i];
					var o = new Object;
					o.url = result.url;
					o.visibleUrl = result.visibleUrl;
					o.title = result.title;
					o.content = result.content;
					list[n++] = o;
				}
			}

			// now, see if we have a cursor, and if so, create the 
			if (searcher.cursor)
			{
				if (searcher.cursor.pages.length > 1)
				{
					cursorNode = document.createElement("DIV");
					cursorNode.className = "search_engine_cursor";
					for (var i=0; i<searcher.cursor.pages.length; i++)
					{
						var classN = "search_engine_page_number";
						if (i == searcher.cursor.currentPageIndex)
						{ classN = classN + " search_engine_current_page"; }

						var pageNode = document.createElement("DIV");
						pageNode.className = classN;
						pageNode.innerHTML = i+1;
						pageNode.onclick = this.methodClosure(this, this.googleGotoPage, [searcher, i]);
						cursorNode.appendChild(pageNode);
					}
				}
			}
			this.showResults(list,cursorNode);
		},

		// ---------- Yahoo! functions -----------

		yahooOnSearchComplete: function(doc,head,ctx)
		{
			var list = [];
			var cursorNode=null;

			var n=0;
			ctx.hideSearchingText();
			if (doc != null)
			{
				
				var results = doc.getElementsByTagName("Result");
				var i=0;
				while (i < results.length)
				{
					var d = results.item(i);
					var o = new Object;
					var url_node = d.getElementsByTagName("Url")[0];
					if (url_node != null && url_node.firstChild != null)
					{
						o.url = url_node.firstChild.nodeValue;
	
						var visibleUrl_node = d.getElementsByTagName("DisplayUrl")[0];
						if (visibleUrl_node != null && visibleUrl_node.firstChild != null)
						{ o.visibleUrl = visibleUrl_node.firstChild.nodeValue }
						else
						{ o.visibleUrl = ''; }

						var title_node = d.getElementsByTagName("Title")[0];
						if (title_node != null && title_node.firstChild != null)
						{ o.title = title_node.firstChild.nodeValue; }
						else
						{ o.title = ''; }

						var content_node = d.getElementsByTagName("Summary")[0];
						if (content_node != null && content_node.firstChild != null)
						{ o.content = content_node.firstChild.nodeValue; }
						else
						{ o.content=''; }
						list[n++] = o;
					}
					i++;
				}
				
				var start = null;
				var count = null;
				var total = null;
				var docset = doc.getElementsByTagName("ResultSet")[0];
				if (docset != null)
				{
					if (docset.attributes.firstResultPosition != null)
					{ start = docset.attributes.firstResultPosition.value; }
					if (docset.attributes.totalResultsReturned != null)
					{ count = docset.attributes.totalResultsReturned.value; }
					if (docset.attributes.totalResultsAvailable != null)
					{ total = docset.attributes.totalResultsAvailable.value; }
				}

				if (start != null && count != null && total != null)
				{ cursorNode = ctx.createCustomCursor(start,count,total); }


			}
			ctx.showResults(list,cursorNode);
		},

		// ---------- Windows Live functions -----------

		liveOnSearchComplete: function(doc,head,ctx)
		{
			var list = [];
			var cursorNode=null;

			var n=0;
			ctx.hideSearchingText();
			if (doc != null)
			{
				var results = doc.getElementsByTagName("document");
				var i=0;
				while (i < results.length)
				{
					var d = results.item(i);
					var o = new Object;
					var url_node = d.getElementsByTagName("url")[0];
					if (url_node != null)
					{
						o.url = url_node.firstChild.nodeValue;
	
						var visibleUrl_node = d.getElementsByTagName("displayurl")[0];
						if (visibleUrl_node != null)
						{ o.visibleUrl = visibleUrl_node.firstChild.nodeValue }
						else
						{
							visibleUrl_node = d.getElementsByTagName("captionurl")[0];
							if (visibleUrl_node != null)
							{ o.visibleUrl = visibleUrl_node.firstChild.nodeValue }
							else
							{ o.visibleUrl = ''; }
						}

						var title_node = d.getElementsByTagName("title")[0];
						if (title_node != null)
						{ o.title = title_node.firstChild.nodeValue; }
						else
						{ o.title = ''; }
						// Windows Live fixes...
						o.title = o.title.replace(/</g,'&lt;');
						o.title = o.title.replace(/&/g,'&amp;');

						var content_node = d.getElementsByTagName("desc")[0];
						if (content_node != null)
						{ o.content = content_node.firstChild.nodeValue; }
						else
						{ o.content=''; }
						list[n++] = o;
					}
					i++;
				}
				
				var start = null;
				var count = null;
				var total = null;
				var docset = doc.getElementsByTagName("documentset")[0];
				if (docset != null)
				{
					if (docset.attributes.start != null)
					{ start = docset.attributes.start.value; }
					if (docset.attributes.count != null)
					{ count = docset.attributes.count.value; }
					if (docset.attributes.total != null)
					{ total = docset.attributes.total.value; }
				}

				if (start != null && count != null && total != null)
				{ cursorNode = ctx.createCustomCursor(start,count,total); }
			}
			ctx.showResults(list,cursorNode);
		},



		// ---------  Common Functions (to all engines) ---------

		createCustomCursor: function(start,count,total)
		{
			var pages = parseInt(total/count);
			if (pages > 4) { pages=4; }  // shows a maximum of 4 pages
			if (pages == 1) { return null; }

			var cursorNode = document.createElement("DIV");
			cursorNode.className = "search_engine_cursor";

			var current_page = parseInt(start/count);
			for (var i=0; i<pages; i++)
			{
				var classN = "search_engine_page_number";
				if (i == current_page)
				{ classN = classN + " search_engine_current_page"; }

				var pageNode = document.createElement("DIV");
				pageNode.className = classN;
				var next = i*count;
				pageNode.innerHTML = (i+1);
				pageNode.onclick = this.methodClosure(this, this.execute_search, [this.current_query,this.current_engine,this.current_restricted,next,count]);
				cursorNode.appendChild(pageNode);
			}
			return cursorNode;
		},


		showSearchingText: function()
		{
			if (this.resultsid != null)
			{
				var obj = document.getElementById(this.resultsid);
				if (obj != null)
				{ obj.innerHTML = '<div class="search_engine_text">' + this.searchingTxt + '</div>'; }
			}
		},

		hideSearchingText: function()
		{
			if (this.resultsid != null)
			{
				var obj = document.getElementById(this.resultsid);
				if (obj != null)
				{ obj.innerHTML = ''; }
			}
		},

		showResults: function(resultlist,cursorNode)
		{
			if (this.resultsid == null)
			{ return; }

			var obj = document.getElementById(this.resultsid);
			if (obj == null)
			{ return; }

			var html = '<span class="search_engine_text">' + this.searchResultsTxt + ': <b>' + this.current_query + '</b></span>';
			html += '<div class="search_engine_results">';
			if (resultlist.length > 0)
			{
				for (i in resultlist)
				{
					var item = resultlist[i];
					html += '<div class="search_engine_result_item">';
					html += '<a href="' + item.url + '"';
					if (this.result_target_blank)
					{ html += ' target="_blank"'; }
					html += '>' + item.title + '</a><br>';
					html += '' + item.content + '<br>';
					html += '<span class="search_engine_result_url">' + item.visibleUrl + '</span>';
					html += '</div>';
				}
			}
			else
			{ html += this.noResultsTxt; cursorNode=null; }
			html += '</div>';


			obj.innerHTML = html;
			if (cursorNode != null)
			{ obj.appendChild(cursorNode); }
		}
	};

	obj.init(isite,igoogle,iyahoo,ilive);

	return obj;
}

