<PUBLIC:COMPONENT tagname="UnifiedSearch">
	<@component name="UnifiedSearch">
	   Implements detailed view of object in the model.

	   <copyright>(c) SAP AG 2003-2006. All rights reserved.</copyright>
	</component@>

	<PUBLIC:PROPERTY name="searchCancelled" get="getSearchCancelled" put="setSearchCancelled"/>
	<PUBLIC:PROPERTY name="enableContextMenu" get="getEnableContextMenu" put="setEnableContextMenu"/>
	<PUBLIC:PROPERTY name="enableDetaiedView" get="getEnableDetaiedView" put="setEnableDetaiedView"/>
	<PUBLIC:PROPERTY name="includeList" get="getIncludeList" put="setIncludeList"/>
	<PUBLIC:PROPERTY name="provider" get="getProvider" put="setProvider"/>
	<PUBLIC:PROPERTY name="searchStr" get="getSearchString" put="setSearchString"/>
	<PUBLIC:PROPERTY name="searchType" get="getSearchObjectType" put="setSearchObjectType"/>
	<PUBLIC:PROPERTY name="searchTechnology" get="getSearchTechnology" put="setSearchTechnology"/>
	<PUBLIC:PROPERTY name="hideParams" put="setHideParams"/>
	<PUBLIC:PROPERTY name="disableProvider" get="getDisableProvider" put="setDisableProvider"/>
	<PUBLIC:PROPERTY name="disableSearchType" get="getDisableSearchType" put="setDisableSearchType"/>
	<PUBLIC:PROPERTY name="disableSearchTechnology" get="getDisableSearchTechnology" put="setDisableSearchTechnology"/>
	<PUBLIC:PROPERTY name="refreshBtnVisibility" get="getRefreshVisibility" put="setRefreshVisibility"/>
	<PUBLIC:PROPERTY name="searchContext" get="getSearchContext" put="setSearchContext"/>

	<PUBLIC:METHOD   name="init"/>
	<PUBLIC:METHOD   name="layout"/>
	<PUBLIC:METHOD   name="insertSearchParams"/>
	<PUBLIC:METHOD   name="getObjectTypeParam"/>
	<PUBLIC:METHOD   name="getAdditionalParamsParam"/>
	<PUBLIC:METHOD   name="startSearch"/>
	<PUBLIC:METHOD   name="enableSearch"/>
	<PUBLIC:METHOD   name="onServerError"/>
	<PUBLIC:METHOD   name="showResults"/>
	<PUBLIC:METHOD   name="configNode"/>
	<PUBLIC:METHOD   name="locateInTree"/>
	<PUBLIC:METHOD   name="getNextRes"/>
	<PUBLIC:METHOD   name="contextMenu" />
	<PUBLIC:METHOD   name="getSearchContext" />
	<PUBLIC:METHOD   name="clearResults" />
	<PUBLIC:METHOD   name="formatId" />

	<PUBLIC:EVENT    name="onNodeSelect" ID="evtNodeSelect" />
	<PUBLIC:EVENT    name="onNodeUnselect" ID="evtNodeUnselect" />
	<PUBLIC:EVENT    name="onFinishedLoading" ID="evtFinishedLoading" />

	<PUBLIC:ATTACH   event="oncontentready" onevent="init()" />
	<PUBLIC:ATTACH   event="onSearchLoad" onevent="insertSearchParams()" />
	<PUBLIC:ATTACH   event="onresize" onevent="layout()" />
	<PUBLIC:DEFAULTS viewLinkContent="true"/>

	<HTML xmlns:stb="urn:guimachine-com:storyboard" xmlns:gml="urn:guimachine-com:gml">
	<HEAD>

	<META HTTP-EQUIV="MSThemeCompatible" CONTENT="no">

	#INCLUDE[defs.inc]
	#INCLUDE[gml:defs.inc]

	#DEPENDENCIES[
		lib:Global.js
		lib:Xml.js
		lib:Basic.js
		lib:PopupMgr.js
		lib:ColorMgr.js
	]


	#USING[env:AspectFactory.js]


	#USING[lib:Box.htc]
	#USING[lib:Splitter.htc]
	#USING[lib:SmartForm.htc]
	#USING[lib:Dialog.htc]
	#USING[lib:TreeView.htc]
	#USING[lib:Input.htc]
	#USING[lib:Button.htc]
	#USING[lib:defs.inc]
	#USING[lib:Global.js]

	#INCLUDE[lib:InputMgr.js]
	#INCLUDE[lib:EventsMgr.js]

	#INCLUDE[lib:EnumMgr.js]
	#INCLUDE[env:global_hotkeys.inc]


	<SCRIPT language="JavaScript">


	/////////////////////////////////////////////////////////////////////
	// SETUP WINDOW

	$DOM.installAspects('core.dev:GmlPalette');

	/////////////////////////////////////////////////////////////////////

	var searchConnector;
	// Delimiters (Provider , Unique id)
	var P_DELIMITER = ':', UID_DELIMITER = '$';
	var pageSize = 30;
	//current results size
	var csize = 0;
	//total result size
	var tsize = 0;
	var _searchCancelled = false;
	var _enableContextMenu = true;
	var _enableDetaiedView = true;
	var _searchContext = "";
	var _advancedSearchLink = "";
	var _elmAdvanceData = {};
	var _progressHandle = null; // Progress Bar handler
	var _finishedLoading = false;

	// Vars needed in order to implement the Filter feature.
	var _includeList = {};
	var _includeListGiven = false;


	var __ENUMS = self.window.__ENUMS;
	var _hideParams = false;
	var _urlPrefix; // to be used when converting server-generated URNs to URLs the client can activate
	var _cache={}; 	/* a cache to store search data retrieved from server - for now we store:
					1. providers list - returned by SearchConnector#getProvidersList(productionKit)
					2. provider's data - returned by SearchConnector#getProviderData(providerID)
					*/
	var _that = this; //for callbacks
	var _UID = -1; // Suffix to promise uniqueness of VC Search nodes (int >= 0)

	<@prop name="hideParams:b:false">
		Whether or not to hide the search params are of the control
	</prop@>
	function setHideParams(hide)
	{
		_hideParams = BOOL(hide);
	}

	<@prop name="searchContext:s">
		The search context string to hint on the usage enviorment
	</prop@>
	function getSearchContext()
	{
		return _searchContext;
	}

	function setSearchContext(searchContext)
	{
		_searchContext = searchContext;
	}

	<@prop name="provider:s">
		The provider to use when searching
	</prop@>
	function getProvider()
	{
		return fldSearchProv.value || '';
	}


	function setProvider(provider)
	{
		fldSearchProv.value = (provider || '');
		getObjectTypeParam();
	}

	<@prop name="searchStr:s">
		The query to search for
	</prop@>
	function getSearchString()
	{
		return fldSearchStr.value || '';
	}

	function setSearchString(searchStr)
	{
		fldSearchStr.value = (searchStr || '');
	}

	<@prop name="searchType:s">
		The search type to search for (depends on the search provider)
	</prop@>
	function getSearchObjectType()
	{
		return (fldSearchType.value || '');
	}

	function setSearchObjectType(objType)
	{
		fldSearchType.value = (objType || '');
		getAdditionalParamsParam();
	}

	<@prop name="searchTechnology:s">
		The search type to search for (depends on the search provider)
	</prop@>
	function getSearchTechnology()
	{
		return (fldSearchTechnology.value || '');
	}

	function setSearchTechnology(searchTech)
	{
		fldSearchTechnology.value = (searchTech || '');
		updateProviderData();
	}

	function init() {
		ENABLE_INPUTS(document.body);
		ENABLE_EVENTS(document.body);

		fldSearchStr.value = '';
		var cfg=$ENV.kitsConfig;
		searchConnector = $ENV.searchlpr || $ENV.getHelper('#NS[SearchConnector]');

		if(!searchConnector)
			searchConnector = $ENV.defineHelper('#NS[SearchConnector]', element);
		else
			updateConnectorReference();
		_urlPrefix = searchConnector.getProperty("urlPrefix");

		//Get search provider in a separate thread
		setTimeout(function() {

			document.body.style.cursor = 'wait';

			fetchProvidersList();

			document.body.style.cursor = 'auto';
			layout();
		}); //end of setTimeout

		elmResList.onnodemenu = contextMenu;
		elmResList.onnodedrag	  = onListNodeDrag;
		elmResList.onnodedrop	  = onListNodeDrop;
		elmResList.showRoot = false;
		elmResList.calcDragEffect = calcListDragEffect;
		elmDialog.onlayout = splitLayout;

		//elmParamsBox.visible = !_hideParams;
		hideParamSection	(_hideParams);
		elmSplitter.hideSplitterBar();	//[EK]
		//setTimeout(function(){layout();});
	}

	function fetchProvidersList() {
		//fetch list of providers
		_cache = {};
		_cache.providersData = {};
		_cache.technologyDomain=null;
		var technologyDomain = _cache.technologyDomain;
		var tempTechnologyDomain = [];
		if (!technologyDomain) {
			technologyDomain = searchConnector.getProvidersList($ENV.kitsConfig.production.urn);
			if (COUNT(technologyDomain)==0) { //if empty list (for any reason), hide input fields and show an error message in the links section
				resetUI();
				fldSearchTechnology.enabled=false;
				showErrors(["#TEXT[XMSG_FAILED_TO_FETCH_PROVIDERS]"]);
				hideUI();
				return;
			}
			else { //successfully featched providers list ==> cache it, populate the combo, and add a pseudo "pls select a provider" entry
				if (_includeListGiven) // A filter on the search providers was requested.
				{
					for (var i=0, len=technologyDomain.length; i<len;i++)
					{
						var temp = technologyDomain[i].value;
						if (_includeList[temp]) {
							tempTechnologyDomain.push(technologyDomain[i]);
						}
					}
					technologyDomain=tempTechnologyDomain;
				}
				
				if (!GETVAR("enableEJBSearch"))
				{
					for (var i=0; i<technologyDomain.length ; i++){
						if (technologyDomain[i].value=='EJBSearchProvider'){
							technologyDomain.splice(i, 1); 
							break;
						}
					}
				}
				
				technologyDomain.sort(sortTechDomain);
				_cache.technologyDomain = technologyDomain;
				fldSearchTechnology.domain = [{text:"-- #TEXT[XFLD_SELECT_A_PROVIDER] --", value:'#TEXT[XFLD_SELECT_A_PROVIDER]'}].concat(technologyDomain);
				fldSearchTechnology.value='#TEXT[XFLD_SELECT_A_PROVIDER]';
				fldSearchTechnology.domain = technologyDomain;
			}
		}	
	}
	
	function sortTechDomain(a,b) {
		var aLabel = a.text.substr(a.text.lastIndexOf("> ")+2).toUpperCase(); 
		var bLabel = b.text.substr(b.text.lastIndexOf("> ")+2).toUpperCase();
		var res;
		if (aLabel==bLabel)
			res=0;
		else if (aLabel>bLabel) 
			res=1;
		else res=-1;
		return(res);
	}

	function layout(){
		elmDialog.layout();
		adjustSpliter();
		if (!_finishedLoading){
			evt=createEventObject();
			evtFinishedLoading.fire(evt);
			_finishedLoading = true;
		}
	}

	function splitLayout(){
		elmSplitter.updatePos();
	}

	function insertSearchParams(evt){
		var provDomain = fldSearchProv.domain;
		if(provDomain.indexOf(evt.provider) != -1){
			fldSearchProv.value = evt.provider;
			getObjectTypeParam();

			var typeDomain = fldSearchType.domain;
			if (typeDomain.indexOf(evt.objectType) != -1){
				fldSearchType.value = evt.objectType;
				getAdditionalParamsParam();
			}
			else{
				clean();
				resultsHeader.innerHTML ='<img src="#URL[~skin:icons.error_triangle.gif]" align=absmiddle> #TEXT[XMSG_ERROR_IN_OBJECT_TYPE]';

			}
		}
		else{
			clean();
			resultsHeader.innerHTML ='<img src="#URL[~skin:icons.error_triangle.gif]" align=absmiddle> #TEXT[XMSG_ERROR_IN_PROVIDER]';
		}

	}


	<@prop name="searchCancelled:b:true">
		Gets or sets whether search was cancelled
	</prop@>
	function getSearchCancelled() { return _searchCancelled; }
	function setSearchCancelled(flag) {
		_searchCancelled = BOOL(flag);
	}

	<@prop name="enableContextMenu:b:true">
		Gets or sets whether to show context menu
	</prop@>
	function getEnableContextMenu() { return _enableContextMenu; }
	function setEnableContextMenu(flag) {
		_enableContextMenu = BOOL(flag);
	}

	<@prop name="enableDetaiedView:b:true">
		Gets or sets whether to show the detailed view of each result
	</prop@>
	function getEnableDetaiedView() { return _enableDetaiedView; }
	function setEnableDetaiedView(flag) {
		_enableDetaiedView = BOOL(flag);
	}

	function getIncludeList() { return _includeList; }
	function setIncludeList(list) {

		// Analyze the include list
		var arr = SPLIT(REPLACE(list, ' ', '$'), ",");

		for (var i = 0, len=arr.length; i<len; i++)
		{
			var loc = arr[i].indexOf('.');

			if (loc != -1)
			{
				var remainder = arr[i].length;
				var objectType = (arr[i].substring(loc+1, remainder));
				var provider = arr[i].substring(0, loc);
				var tmpObj = {};
				tmpObj[objectType] = true;

				if (_includeList[provider]) // Already have such a provider
				{
					_includeList[provider].objectType = true;
				}
				else // No such provider
				{
					_includeList[provider] = tmpObj;
				}
			}
			else
			{
				//#LOG[4, 'Setting a provider without the asterisk notation will mean that no objecTypes will be set'];
			}
		}

		_includeListGiven = true;
	}

	function getDisableProvider(){return !fldSearchProv.enabled}
	function setDisableProvider(bool){
		fldSearchProv.enabled = !BOOL(bool);
	}

	function getDisableSearchType(){return !fldSearchType.enabled}
	function setDisableSearchType(bool){
		fldSearchType.enabled = !BOOL(bool);
	}

	function getDisableSearchTechnology(){return !fldSearchTechnology.enabled}
	function setDisableSearchTechnology(bool){
		fldSearchTechnology.enabled = !BOOL(bool);
	}
	function getRefreshVisibility(){return !btnRefresh.style.visibility == 'hidden'}
	function setRefreshVisibility(bool) {
		bool = BOOL(bool);
		btnRefresh.style.visibility = bool ? 'visible' : 'hidden';
		SET_BOX(fldSearchTechnology, bool ? "4 25 W-31 20" : "4 25 W-8 20");
		LAYOUT_BOX(fldSearchTechnology);
	}

	function clearResults(){
		clean();
	}
	function getObjectTypeParam(){
		spanProviderErrors.innerHTML = '';
		btnOk.enabled = true;
		setFldAdvancedPropVisibility(false);
		clearEditor();
		fldSearchType.value = '';

		//fires the login event
		var evt = $ENV.createEvtObject();
		evt.type = 'onSearchLogin';
		var index = fldSearchProv.value.indexOf('/');
		var provider;
		var system;
		if (index > 0){
			provider = fldSearchProv.value.substring(0,index);
			system = fldSearchProv.value.substring(index+1);
		}
		else{
			provider = fldSearchProv.value;
			system = "";
		}
		evt.provider = provider;
		evt.system = system;
		evt.connector = searchConnector.id;
		// Fire an Event
		$ENV.fireModelEvent(evt);
		updateConnectorReference();
		var types = searchConnector.getObjectTypes(fldSearchProv.value);
		var typeStr = "";
		if (types != null)
		{
			if (!_includeListGiven)
			{
				var index = 0;
				var i;
				for (i in types)
				{
					typeStr += i + ":" + types[i] + ";";
					index++;
				}
			}
			else // We have a filter set up
			{
				var prov = _includeList[provider];
				if (prov["*"]) // All object types for this provider
				{
					var index = 0;
					var i;
					for (i in types)
					{
						typeStr += i + ":" + types[i] + ";";
						index++;
					}
				}
				else // Only some of the object types...
				{
					var index = 0;
					var i;
					for (i in types)
					{
						if (prov[types[i]])
						{
							typeStr += i + ":" + types[i] + ";";
						}
						else
						{
							// Do Nothing
						}
					}
					index++;
				}
			}
		}
		//handle objectTypes field
		if (index > 1) {
			showFld(spanSearchType, fldSearchType, typeStr); //show the search type drop down
		}
		if(index == 1){ //only 1 search type
			hideFld(spanSearchType, fldSearchType, true); //hide the search type drop down
		    var typeDesc = types[i];
		    if (typeDesc == 'WSDL')
				typeDesc = 'operation';
		    else if (typeDesc == 'WSIL')
				typeDesc = 'WSDL/operation';
			divSearchStr.innerHTML="#TEXT[XFLD_SEARCH_FOR] " + typeDesc; //add search type's name to the "search for" label
			fldSearchType.value = i;
			getAdditionalParamsParam();
		}
		if (index == 0) { //no object types at all ==> error !!
			showErrors(["#TEXT[XMSG_CONNECT_TO_MODELS_LIB]"]);
			var errStr = "No object types found in search.\nDetails: Provider="+provider+" ; System="+(system?system:"provider has no systems");
			#LOG[4, errStr];
		}
		layout();
	}


	function getAdditionalParamsParam(){
		var editor = null;
		clearEditor();
		var additionalParams = searchConnector.getAdditionalParamsEditor(fldSearchProv.value, fldSearchType.value);
		if (typeof additionalParams == 'string'){
			if(additionalParams.indexOf(".htm")>-1){
				var locationAdditionalParam=additionalParams.indexOf("?");
				if(locationAdditionalParam>-1){
					_advancedSearchLink = additionalParams.substring(0,locationAdditionalParam);
					_elmAdvanceData['locationAdditionalParam']=additionalParams.substring(locationAdditionalParam+1);
				}else{
					_advancedSearchLink = additionalParams;
				}
				setFldAdvancedPropVisibility(true);
				layout();
				return;
			}
			else{
				editor = $ENV.getEditor(additionalParams);
				if (!editor) return;
				editor.data = {};
				setFldAdvancedPropVisibility(true);
			}
		}

		else{
			if(!additionalParams || additionalParams.length == 0) return;
			var editor = $ENV.getEditor('#NS[SEARCH_EDITOR]');
			if (editor){
				$ENV.removeEditor('#NS[SEARCH_EDITOR]');
			}
			editor = $ENV.defineEditor({
			      id:         '#NS[SEARCH_EDITOR]',
			      category:   'SEARCH',
			      priority:    100
			   });

			editor.data = {};
			var index = 0;
			if(additionalParams != null){
				for (var i in additionalParams){
					var param = additionalParams[i];
					var toggle = 'off';
					if (index == 0){
						if (param.type != 'group'){
							clean();
							resultsHeader.innerHTML ='<img src="#URL[~skin:icons.error_triangle.gif]" align=absmiddle> #TEXT[XMSG_ADVANCED_PARAM_ERROR]';
							return;
						}
						toggle = 'on';
					}
					if(param.type == 'group'){
						editor.append({
							type:   param.type,
							id:     param.name,
							title:  param.label,
							toggle: toggle
						});
						if (toggle == 'on') toggle = 'off';
					}
					else {
						editor.append({
							type:   param.type,
							id:     param.name,
							label:  param.label,
							descr: 	param.label,
							value: "",
							getter: function(data, def){
									//	return def.value;
									return editor.data[def.id];
									},
							setter: function(value, data, def){
										//def.value = value;
										editor.data[def.id] = value;
									},
							style: 'width:350'
						});
					}
					index++;
				}
			setFldAdvancedPropVisibility(true);
			}
		}
		if(editor != null){
			elmEditor.appendEditor(editor);
			elmEditor.repaintAll();
		}
		layout();
	}

	function setFldAdvancedPropVisibility(show) {
		if (show) {
			spanAdvancedLink.style.display="block";
		}
		else {
			spanAdvancedLink.style.display="none";
		}
	}

	function resize() {
	}

	function getSearchParams(){
		var searchParams = {};
		if(fldSearchProv.value == "" || fldSearchProv.value == null){
			resultsHeader.innerHTML ='<img src="#URL[~skin:icons.info.gif]" align=absmiddle> #TEXT[XMSG_MISSING_SEARCH_PROVIDER]';
			return;
		}

		if(fldSearchType.value == "" || fldSearchType.value == null){
			resultsHeader.innerHTML ='<img src="#URL[~skin:icons.info.gif]" align=absmiddle> #TEXT[XMSG_MISSING_OBJECT_TYPE]';
			return;
		}

		if(fldSearchStr.value == "" || fldSearchStr.value == null){
			searchParams['searchString'] = '*';
		} else {
			searchParams['searchString'] = fldSearchStr.value;
			if (!searchParams['searchString'].match(/\*$/))
				searchParams['searchString'] += '*';
			fldSearchStr.addHistory();
		}

		searchParams['objectType'] = fldSearchType.value;
		editor = elmEditor.editors[0];
		if (editor) {
			for(var i in editor.data){
				searchParams[i] = editor.data[i];
			}
		}
	//	else if(!ISEMPTY(_elmAdvanceData)){
	//		var a = _elmAdvanceData;
			for(var i in _elmAdvanceData){
				if(_elmAdvanceData[i])
					searchParams[i] = _elmAdvanceData[i];
			}
	//	}
		return searchParams;
	}


	function startSearch() {
		clean();
		var searchParams = getSearchParams();
		if (!searchParams) {
			showHeaderBox(1); //[EK]
			return;
		}
		enableSearch(false);
		_searchCancelled = false;
									//[EK]
		resultsHeader.innerHTML = '<B>#TEXT[XMSG_SEARCHING]</B><DIV style="background:#fff;margin-top:3;border:1 solid #[BR1]"><IMG id=elmPrgImg width="100%" height="4px" src="#URL[gml2~res:skins.neutral.icons.runtime.progress.gif]"/></DIV>';
		setTimeout(doSearch, 100);

		function doSearch()
		{
			updateConnectorReference();
			searchConnector.search(searchParams, fldSearchProv.value, pageSize);

			evtNodeUnselect.fire(createEventObject());
		}
	}

	/**
		Update the search connector (which is a global object) reference to the unified search element to point to this element.
	 */
	function updateConnectorReference()
	{
		searchConnector.unifiedSearchElm = element
	}

	function showHeaderBox(val){//[EK]
		if(val==1) {
			elmResultHeaderBox.visible = true;
			elmResultHeaderBox.style.background='#[BG1]';
			elmResultHeaderBox.style.borderBottom = '1 solid #[FG2]';
		} else {
			elmResultHeaderBox.style.background='#[WHT]';
			elmResultHeaderBox.style.borderBottom = '0';
		}
	}

	function showResults(results){
	//	_searchCancelled = false;
		enableSearch(true);
		if (results==null){
			clean();
			resultsHeader.innerHTML ='<img src="#URL[~skin:icons.error_triangle.gif]" align=absmiddle> #TEXT[XMSG_ERROR_IN_SEARCH]';
			return;
		}
		tsize = NVAL(results['tsize']);
		csize = NVAL(results['csize']);
		initList(results);
		var paging = searchConnector.supportPaging(fldSearchProv.value);
		if (paging == true){
			btnBox.visible = true;
			SET_BOX(elmResultBox, '0 39 W H-67'); //[EK]
		}
		else{
			btnBox.visible = false;
			SET_BOX(elmResultBox, '0 39 W H-39'); //[EK]
		}
		showHeaderBox(1);//[EK]
		setButtons(paging);
		elmResultBox.visible = true;
	//	elmResultHeaderBox.visible = true;
		elmResultBox.layout();
		elmResultHeaderBox.layout();

	}

	//csize - current size
	//tsize - total results size
	function setButtons(supportPagging)
	{
		if(tsize == 0)
			resultsHeader.innerHTML = '#TEXT[XMSG_SEARCH_NO_RESULT]';
		else //we have results
		{
			var num;
			if (supportPagging) num = (CEIL(csize/pageSize)-1)*pageSize + 1;
			else num = 1;
			var c = tsize>csize?csize:tsize;

			if (!supportPagging && tsize > csize) //no paging and truncated results
			{
				var tooltip = '#TEXT[XMSG_RESULTS_TRUNC_TOOLTIP]'.replace('{0}',csize).replace('{1}',csize);
				var message = '#TEXT[XMSG_RESULTS_TRUNCATED]'.replace('{0}',tsize).replace('{1}',csize);
				resultsHeader.innerHTML = '<SPAN title="' + tooltip + '"><img src="#URL[~skin:icons.warning.gif]" align=absmiddle />&nbsp;&nbsp;' + message + '</SPAN>'
			}
			else //either paging or no truncation
			{
				//resultsHeader.innerHTML = '#TEXT[XMSG_RESULTS_LIST]'.replace('{0}',num).replace('{1}',c).replace('{2}',tsize);
				if(supportPagging) resultsHeader.innerHTML = '#TEXT[XMSG_RESULTS_LIST]'.replace('{0}',num).replace('{1}',c).replace('{2}',tsize);
				else resultsHeader.innerHTML = '#TEXT[XMSG_RESULTS_FOUND]'.replace('{0}',tsize);
			}

		}
		if(supportPagging){
			//pageSp.innerHTML = 'Page ' + CEIL(csize/pageSize) + ' of ' + CEIL(tsize/pageSize);
			pageSp.innerText = 'Page ' + CEIL(csize/pageSize) + ' of ' + CEIL(tsize/pageSize);
			if (csize < tsize){
				DISABLE(btnNext, false);
				DISABLE(btnEnd, false);
			}
			else{
				DISABLE(btnNext, true);
				DISABLE(btnEnd, true);
			}

			if (csize <= pageSize){
				DISABLE(btnStart, true);
				DISABLE(btnPrev, true);
			}
			else{
				DISABLE(btnStart, false);
				DISABLE(btnPrev, false);
			}
		}
	}

	function enableSearch(enable){
		btnOk.enabled = enable;
		btnCancel.enabled = !enable;
	}

	function onServerError(errStr){
		clean();
		resultsHeader.innerHTML ='<img src="#URL[~skin:icons.error_triangle.gif]" align=absmiddle>' +
								 (errStr ? errStr : '#TEXT[XMSG_ERROR_IN_SEARCH]');
	}

	function initList(results){
		elmResList.provider = new ContentProvider(results);
		elmResList.reset();
	}

	//-----------------define list provider---------------------------------------------------

	function ContentProvider(results){
		this.index = {};
		this.firstlevel = [];
		this.root  = {
				id:	'$',
				name:	'results',
				icon: '#URL[~skin:icons.folder.gif]',
				size:	1,
				isRoot:	true
			};
		this.index['$'] = this.root;
		var p = fldSearchProv.value;
		var provider = p.substring(0,p.indexOf("/"));
		var system = p.substring(p.indexOf("/")+1);
		var len = results.length>tsize?tsize:results.length ;
		for (var i=0; i<len; i++){
			result = results[i];
			result['provider']=provider;
			//result['system']=system;
			result['objectType']=fldSearchType.value;
			var elem = ($ENV.getClassesTable())[result['gmlObject']];
			var node = new configNode(result);
		    this.index[node.id] = node;
		    this.firstlevel.push(node);
		}
	}



	ContentProvider.prototype.getRoot = function() {
	    return this.root;
	}

	ContentProvider.prototype.getNode = function(id) {
		return this.index[id] || null;
	}

	ContentProvider.prototype.getChildNodes = function(id) {
		var childNodes;
		if(id == '$') {
			return this.firstlevel;
		}
		else{
			var provider = id.substring(0, id.indexOf(":"));
			var subId = id.substring(id.indexOf(":")+1);
			var parentNode = this.getNode(id);

			if(parentNode.event && parentNode.event != ""){
				//var evt = $ENV.createEvtObject();
				var ruleName = parentNode.event;
				//evt.provider = provider;
				var connector = searchConnector.id;
				var cloneNode = CLONE(parentNode);
				var id = cloneNode.id;
				cloneNode.id = id.substring(id.indexOf(":") +1);
				RULE(ruleName, connector, provider, cloneNode,parentNode);
			}

			childNodes = searchConnector.getChildNodes(provider, subId, parentNode);
			//MUST [ran] uncomment in SP5
			//childNodes = searchConnector.retrieveDiscoveryChildNodes(subId, parentNode);
		}
		var nodes = [];
		for (var index in childNodes){
			var node = new configNode(childNodes[index]);
			nodes.push(node);
			this.index[node.id] = node;
		}
		return nodes;
	}

	function configNode(obj) {
		var nodeName;
		var tmpIcon = obj.icon;
		this.discoveryParameters= obj.discoveryParameters;

		var icon = '#URL[~skin:icons.element16.gif]';
		if ( (tmpIcon != '') && (tmpIcon != null) ){
			icon = icon.replace("core.dev~skin:icons.element16.gif", tmpIcon);
		}
	    this.id   = obj.provider + P_DELIMITER + obj.id + UID_DELIMITER + generateUID();
	    if(obj.isRoot == true)
		nodeName = '<b>' + obj.name + '<b>' || obj+'';
	    else
		nodeName = obj.name || obj+'';
	    this.name = ESCAPE_TO_HTML(nodeName);
	    var title = this.discoveryParameters[#[DISCOVERY_PARAMETER_TITLE]];// || nodeName;
	    if( (title != undefined) && (title != '') && (title != null))
		this.hint = title;

	    this.system = obj.system;
	    if(this.system == ""){
		var k = fldSearchProv.value.indexOf("/");
		if(k>-1){
			this.system = fldSearchProv.value.substring(k+1);
		}
	    }
	    this.icon =icon;
	    this.gmlObject = obj.gmlObject;
	    this.objectType = obj.objectType;
	    if(this.objectType == ""){
		this.objectType = fldSearchType.value;
	    }
	    this.data = obj.data;

	    this.event = obj.event;
	    if(obj.hasChildNodes == "true"){
		this.size = 1;
	    }
	    else this.size = 0;
	}
	
	function generateUID() {
		return ++_UID;
	}
	
	function resetUIDs() {
		_UID = -1;
	}

	//----------------------------------------------------------------------------------------

	function locateInTree(){
		$TSK.openPanel('#NS[BROWSE]', false, function(){
							var evt = $ENV.createEvtObject();
							evt.type = "onLocateInTree";
							evt.provider = searchConnector.getRelatedBrowseProvider(fldSearchProv.value);
							evt.id = elmResList.selection.substring(elmResList.selection.indexOf(":")+1);
							$ENV.fireModelEvent(evt);
							});
	}


	function getNextRes(state){
		var lastRec;
		var next;
		switch(state){
			case "start": lastRec = pageSize + 1;
						  next = false;
						  break;
			case "prev":  lastRec = (CEIL(csize/pageSize)-1)*pageSize + 1;
						  next = false;
						  break;
			case "next":  lastRec = csize;
						  next = true;
						  break;
			case "end":   lastRec = lastRec = (CEIL(tsize/pageSize)-1)*pageSize;
					      next = true;
					      break;
		}
		results = searchConnector.getNextResults(next, fldSearchProv.value, lastRec, pageSize);

		if (results==null){
			clean();
			resultsHeader.innerHTML ='<img src="#URL[~skin:icons.error_triangle.gif]" align=absmiddle> #TEXT[XMSG_ERROR_IN_SEARCH]';
			return;
		}

		tsize = NVAL(results['tsize']);
		csize = NVAL(results['csize']);
		elmResList.clear();
		initList(results);
		setButtons(true);
	}


	function updateAdvancedPropDlgSize(){
		if(_advancedSearchLink != ""){
			if (!_elmAdvanceData) _elmAdvanceData = {};
			_elmAdvanceData.type = fldSearchType.value;
			var res = MODAL('Fetcher?urn='+ _advancedSearchLink, _elmAdvanceData, true);
			_elmAdvanceData = res;
		}
		else{
			if (elmAdvancedBox.visible == false && elmResultBox.visible == true) {
				elmSplitter.split="50%";
				elmSplitter.updatePos();
				elmAdvancedBox.visible = true;
				fldAdvancedProp.innerHTML = "#TEXT[XLNK_HIDE_ADVANCED_SEARCH]";
				elmAdvancedBox.layout();
			}
			else if (elmAdvancedBox.visible == false && elmResultBox.visible == false) {
				elmSplitter.split="50%";
				elmSplitter.updatePos();
				elmAdvancedBox.visible = true;
				fldAdvancedProp.innerHTML = "#TEXT[XLNK_HIDE_ADVANCED_SEARCH]";
				elmAdvancedBox.layout();
			}
			else if(elmAdvancedBox.visible == true && elmResultBox.visible == true){
				elmSplitter.split="19%";
				elmSplitter.updatePos();
				elmAdvancedBox.visible = false;
				fldAdvancedProp.innerHTML = "#TEXT[XLNK_SHOW_ADVANCED_SEARCH]";
			}
			else{
				elmSplitter.split="19%";
				elmSplitter.updatePos();
				elmAdvancedBox.visible = false;
				fldAdvancedProp.innerHTML = "#TEXT[XLNK_SHOW_ADVANCED_SEARCH]";
			}
		}
	}

	function clearEditor(){
		if(elmEditor.editors[0]){
				elmEditor.removeEditor(elmEditor.editors[0].id);
		}
		_advancedSearchLink = "";
		_elmAdvanceData = {};
	}

	function clean(){
		resetUIDs();
		showHeaderBox(0);//[EK]
		btnBox.visible = false;
		elmResList.clear();
		elmResultBox.visible = false;
		elmResultHeaderBox.visible = true;
		resultsHeader.innerHTML="";
		dataBox.visible=false;
		fldDetails.style.visibility = 'hidden';
		SET_BOX(dataBox, '0 0 W H'); //[EK]
		elmSplitterLower.split = "100%"	//[EK]

	}

	function cancel(){
		_searchCancelled = true;
		searchConnector.cancel();
		enableSearch(true);
		resultsHeader.innerHTML = '<div style="margin-left:4">#TEXT[XMSG_SEARCH_CANCELED]</div>';

	}

	// Events handling--------------------------------------------------------------------------------

	function contextMenu(){

		if(!_enableContextMenu) return;
		src=event.srcElement;
		var sel = elmResList.selection;
		if(!sel) return;
		var node = elmResList.provider.getNode(sel);
		var menu=[];
		var e;
		for (e=src; e && (e.id !="elmResList"); e=e.parentElement);
		if(e){
			var browseProvider = searchConnector.getRelatedBrowseProvider(fldSearchProv.value);
			if(browseProvider != "" && browseProvider != null){
				menu.push({signal:"locateInTree",   text:"#TEXT[XTIT_LOCATE_IN_TREE]", icon:'#URL[~res:skins.neutral.sdkicons.hierarchy.gif]'});
			}
			//var contexts = searchConnector.getSearchContextMenu(fldSearchProv.value, fldSearchType.value);
			var id=event.node;
			var nodeID = id.substring(id.indexOf(":")+1);
			//Node object type is taken directly from the node and not from fldSearchType
			var contexts = searchConnector.getSearchContextMenuWithID(fldSearchProv.value, (nodeID ||''),(node.objectType || ''));
			for (var i in contexts){
				var context = contexts[i];
				var tmpIcon = context.icon;
				var icon = '#URL[~skin:blank.gif]';
				if(tmpIcon && tmpIcon != ""){
					icon = icon.replace("core.dev~skin:blank.gif", tmpIcon);
				}
				menu.push({signal:context.name,   text:context.label, icon:icon});
			}
		}
		if (menu.length > 0) {
			CONTEXT_MENU(menu, doMenu, 'SCREEN', event.screenX, event.screenY);
		}
		function doMenu(signal) {
			if (signal == 'locateInTree'){
				locateInTree();
				return;
			}
			var evt = $ENV.createEvtObject();
			evt.type = signal;
		    evt.def = node;
		    evt.connector = searchConnector.id;
		    var index = fldSearchProv.value.indexOf('/');
			var provider;
			var system;
			if (index > 0){
				provider = fldSearchProv.value.substring(0,index);
				system = fldSearchProv.value.substring(index+1);
			}
			else{
				provider = fldSearchProv.value;
				system = "";
			}

		    evt.provider = provider;
		    evt.system = system;
		    evt.objectType = fldSearchType.value;
			$ENV.fireModelEvent(evt);

			var board = $ENV.context.getBoardAspect();
			// We replace the '#' (if exists) to ':' to get class full name
			var gmlclass = CLASS(fldSearchType.value.replace(/#/,":"));
			// Trigger a rule if dealing with a GmlObject class.
			if (gmlclass) {
				RULE('defineSearchMenu', board, gmlclass, searchConnector, provider, system, node, context.name);
			}
		}
	}

	function showData(){

		if(!_enableDetaiedView) return;
		if (elmResList.selection == '$') return; //no data to show for the dummy root node
		var node = elmResList.provider.getNode(elmResList.selection);
		if (!node) return;
		var params = node['data'];
		var discoveryParameters = node['discoveryParameters'];
		if (!discoveryParameters) return; //can't continue without these parameters

		var id = node.id;
		//MUST see how this affect search component
		var provider = discoveryParameters[#[DISCOVERY_PARAMETER_PROVIDER_NAME]];
		//var provider = id.substring(0, id.indexOf(":"));
		var subId = id.substring(id.indexOf(":")+1);

		//We handle the editor separately to speed things up

		setTimeout(
			function()
			{

				if(elmData.editors && elmData.editors[0]){
						elmData.removeEditor(elmData.editors[0].id);
				}
				var editor = $ENV.getEditor('#NS[SEARCH_DATA_EDITOR]');
				if (editor){
					$ENV.removeEditor('#NS[SEARCH_DATA_EDITOR]');
				}
				editor = $ENV.defineEditor({
						  id:         '#NS[SEARCH_DATA_EDITOR]',
						  category:   'SEARCH_DATA',
						  priority:    100
				});
				if (params != null) {
					var index = 0;
					for (var i in params)
					{
						i = i +''; //make sure it's a string
						if (i.indexOf('internal') < 0) //if the key has 'internal' in it - do not show it.
						{
							//The keys, when returned from the SDI providers, usually have a namespace prefix, delimited with a colon (':').
							// We therefore remove this prefix when we show it in the lower pane.
							var l = i;	//the label - do not make any changes to i.
							var colonIndex = l.indexOf(P_DELIMITER);
							if (colonIndex > -1 && colonIndex < (l.length-1)) //we have a colon, and it is not the last character
								l = l.substring(colonIndex+1);
							editor.append(
							{
								type:   'str',
								id:     index,
								label:  l,
								descr: 	(l+' '+params[i] || ''),
								value: params[i],
								active: function(data, def){ return false;},
								getter: function(data, def){ return def.value;},
								inner:5
							});
							index++;
						}
					} // for
				}

				if(editor != null)
				{
					elmData.appendEditor(editor);
					elmData.repaintAll();
				}
				if(index > 0 && elmSplitterLower.split == "100%")elmSplitterLower.split = "82%";	//[EK]
				if(searchConnector.supportsQuickDetailsOnDemand(provider, node.system, node.objectType)) {
					fldDetails.style.visibility = 'visible';
					SET_BOX(dataBox, '0 0 W H-20'); //[EK]
				}

			}); //end of setTimeout


		dataBox.visible = true;
		dataBox.layout();
		var evt=createEventObject();

		evt.provider = provider;
		evt.nodeId = subId;
		evt.nodeName = node.name;
		evt.nodeSystem = node.system;
		evt.nodeGmlObject = node.gmlObject;
		evt.nodeObjectType = node.objectType;
		evt.nodeData = node.data;
		evt.discoveryParameters = node.discoveryParameters;
		evtNodeSelect.fire(evt);

	}

	function showMoreDetails(){
		var node = elmResList.provider.getNode(elmResList.selection);
		if(!node) return;

		//var id = node.id;
		var id = node.discoveryParameters[#[DISCOVERY_PARAMETER_NODE_ID]];

		var subId = id.substring(id.indexOf(":")+1);

		//var provider = id.substring(0, id.indexOf(":"));
		var provider = node.discoveryParameters[#[DISCOVERY_PARAMETER_PROVIDER_NAME]];

		var name = node.discoveryParameters[#[DISCOVERY_PARAMETER_NODE_NAME]];
		var system = node.discoveryParameters[#[DISCOVERY_PARAMETER_SYSTEM]];
		var objectType = node.discoveryParameters[#[DISCOVERY_PARAMETER_OBJECT_TYPE]];

		//var more = searchConnector.getQuickDetailsOnDemand(provider, subId,node.name, node.system, node.objectType);
		var more = searchConnector.getQuickDetailsOnDemand(provider, subId,name, system, objectType);
		if(!more){
			WRITE("No Additional Information Is Available");
			return;
		}
		if(more.type == "urn"){
			var res = MODAL('/#SYS[SERVER_URL]/servlet/Fetcher?urn='+more.text, null, true);
		}
		else{
			var res = MODAL("#URL[search.DetailsDlg.htm]", more, true);
		}
	}

	//-----------------------------------------------------------------------------
	//handle drag and drop

	function onListNodeDrag() {
		var sel =  elmResList.selection;
		if (!sel) return;
		var node =  elmResList.provider.getNode(sel);
		if (!node) return;
		var gmlcstor = $ENV.getClass(node.gmlObject);
		if (!gmlcstor) return false;
		var src = elmResList.getNodeByID(sel);
		if(node.gmlObject == null ||node.gmlObject == '') {
			event.dnd = {
				source:		src,
	//			gmlclass:	node.gmlObject,
				effect:		#[DND_COPY],
				icon:		node.icon
			}
		}
		else{
			runtimeDataObj = {
				runtimeEngine: 		node.discoveryParameters['runtimeEngine']||''
			}
			
			event.dnd = {
				source:		src,
				gmlclass:	node.gmlObject,
				trgclass:	node.gmlObject,
				canReplace: true,
				effect:		#[DND_COPY],
				icon:		node.icon, 
				runtimeData: runtimeDataObj
			}
			event.dnd.properties = node.properties || null;
			if ($ENV.contextElement) {
			      if (!event.dnd.properties) event.dnd.properties = {};
			      event.dnd.properties['roleName'] = $ENV.contextElement.getProperty('roleName');
			}
	//		event.dnd.trgclass = node.gmlObject;
	//		var unit  = $ENV.contextUnit;
	//		var board = $ENV.context.getBoardAspect();
	//   		RULE('dragSearchItem', unit, board, gmlcstor, event.dnd, node);
		}
	}

	function calcListDragEffect(sourceId, targetId, evt) {
		return #[DND_NONE];
	}

	function onListNodeDrop() {
		var dnd=event.dnd;
		setTimeout (function () {
			_progressHandle = PROGRESS_START();
			if (!dnd || !dnd.gmlclass) return;
			var node =  elmResList.provider.getNode(elmResList.selection);
			var evt = $ENV.createEvtObject();
			evt.type = 'onSearchDrop';
			evt.def = node;
			evt.dnd = dnd;
			evt.connector = searchConnector.id;
			var index = fldSearchProv.value.indexOf('/');
			var provider;
			var system;
			if (index > 0){
				provider = fldSearchProv.value.substring(0,index);
				system = fldSearchProv.value.substring(index+1);
			}
			else{
				provider = fldSearchProv.value;
				system = "";
			}

			evt.provider = provider;
			evt.system = system;
			evt.objectType = fldSearchType.value;
			evt.id = node.id.substring(node.id.indexOf(":")+1);

			//Not sure if needed
			evt.discoveryParameters = node.discoveryParameters;

			// Fire an Event
			$ENV.fireModelEvent(evt);


			// Prepare rule data
			dropData = {};
			dropData.def = node;
			dropData.dnd = dnd;
			dropData.searchConnectorID = searchConnector.id;
			dropData.provider = provider;
			dropData.system = (node.system && node.system!="")?node.system:system;
			//dropData.objectType = fldSearchType.value.replace(/#/,":"); // We replace the '#' (if exists) to ':' to get class full name
			dropData.objectType = node.objectType.replace(/#/,":");
			dropData.id = formatId(node.id);
			dropData.name = node.name;
			dropData.data = node.data;
			dropData.discoveryParameters = node.discoveryParameters;
			dropData.position = {screenX: evt.screenX,
						screenY: evt.screenY,
						clientX: evt.clientX,
						clientY: evt.clientY
						};
			dropData.ctrlKey = evt.ctrlKey;


			var board = $ENV.context.getBoardAspect();
			var gmlclass = $ENV.getClass(dnd.gmlclass);
			// Trigger a rule
			RULE('dropSearchItem', dnd.target, board, dnd.parent, gmlclass, dnd.values, dropData, null, false, true);
			PROGRESS_FINISH(_progressHandle);
		});
	}
	
	function formatId(id) {
		var delim = id.indexOf(P_DELIMITER)+1;
		// remove prefix (i.e. search provider + : )
		var retId = id.substring(delim);
		// remove suffix (i.e. UID)
		delim = retId.lastIndexOf(UID_DELIMITER);
		if (delim != -1) return retId.substr(0, delim);
		return retId;
	}
	//Show or hide the parameters section (accodring to the given flag)
	function hideParamSection(hide)
	{
		hide = BOOL(hide);
		elmParamsBox.visible = !hide;
		if (hide)
		{
			elmParamsBox.minsize = 0;
			elmParamsBox.box = "0 0 0 0";
			elmSplitter.split = "0%";
		}
		else
		{
			elmParamsBox.minsize = 160;
			elmParamsBox.box = "0 0 W H";
			elmSplitter.split = "18%";
		}
	}

	<@doc>
	   After the user selected a provider, retrieve provider's data, and update corresponding fields
	</doc@>
	function updateProviderData() {
		resetUI(); //reset fields to default state
		var providerId = fldSearchTechnology.value;
		//get provider data XML, and init provider properties
		var providerXml = _cache.providersData[providerId] && _cache.providersData[providerId].xml;
		if (!providerXml) {
			initProviderDataCache(providerId);
			providerXml = _cache.providersData[providerId].xml;
			if (!providerXml) {
				showErrors(["#TEXT[XMSG_GET_PROVIDER_DATA_FAILED]"]);
				hideUI();
				layout();
				return;
			}
		}
		//handle visibility of searchString and searchButton
		if (!_cache.providersData[providerId].searchButton.visible) {
			btnOk.style.display="none";
			btnCancel.style.display="none";
		}
		if (!_cache.providersData[providerId].searchString.visible) {
			hideFld(spanSearchStr, fldSearchStr, false);
		}
		//handle list of provider's systems
		var systemsDomain;
		var msgLinks=[];
		if (_cache.providersData[providerId].hasSystems) {
			systemsDomain = _cache.providersData[providerId].systemsDomain;
			if (!systemsDomain) {
				systemsDomain = searchConnector.parseProviderSystems(providerXml);
				systemsDomain = systemsDomain.split(";").sort(sortSystemsDomain).join(";");
				_cache.providersData[providerId].systemsDomain = systemsDomain;
			}
			if (systemsDomain.length==0) {  //provider requires phsycal systems but none is found
				msgLinks=[{name:"#TEXT[XMSG_NO_DESTINATIONS_DEFINED].",type:"TITLE"}];
				hideUI();
			} else {	//phsycal systems are found 
				//Check whether there is a system with id = systemError.
				//In this case we display the error message in the UI and return.
				var systemError = _cache.providersData[providerId].errorSystem;
				if (!systemError){
					searchConnector.parseProviderSystemError(providerXml);
				} 
				//if there is "error system", it means that 
				//something wrong with system configuration,
				if (systemError != null){
						showErrors([systemError]);
						hideUI();
						layout();
						return;
				}
				showFld(spanSearchProvider, fldSearchProv, systemsDomain);
				if (systemsDomain.split(";").length == 1)
					getObjectTypeParam();
			}
		} else { //no physical systems by definition ==> hide systems field (fldSearchProv), and already calculate ObjectTypes by ProviderID
			hideFld(spanSearchProvider, fldSearchProv, true);
			fldSearchProv.value = providerId+"/"+providerId;
			getObjectTypeParam();
		}
		//handle links (inc. wizard - if it's a link)
		var links = _cache.providersData[providerId].links;
		if (!links) {
			links = searchConnector.parseProviderLinks(providerXml);
			_cache.providersData[providerId].links = links;
		}
		links = msgLinks.concat(links);
		if (links.length==0) {
			spanProviderLinks.innerHTML="";
		}
		else {
			showLinks(links);
		}
		//handle wizard button
		var wizBtn = _cache.providersData[providerId].wizBtn;
		if (!wizBtn) {
			wizBtn = searchConnector.parseProviderWizardButton(providerXml, "button");
			_cache.providersData[providerId].wizBtn = wizBtn;
		}
		if (COUNT(wizBtn)>0) {
			btnWizard.style.display="inline";
			btnWizard.standard = wizBtn.name;
			var onclickUrl = _urlPrefix+wizBtn.urn;
			btnWizard.onclick=function(){MODAL(_urlPrefix+wizBtn.urn, _that, true)};
		}
		layout();
	}

	function sortSystemsDomain(a,b) {  	
		var aLabel = a.substr(a.lastIndexOf(":")).toUpperCase();   	
		var bLabel = b.substr(b.lastIndexOf(":")).toUpperCase();  	
		var res;  	
		if (aLabel==bLabel)  		
			res=0;  	
		else if (aLabel>bLabel)   		
			res=1;  	
		else res=-1;  	
		return(res);  
	};

	<@doc>
	   Retrieve a specific provider's data, and store it in the cache
	   <param name="providerId:S">the specific provider to retrieve</param>
	</doc@>
	function initProviderDataCache(providerId) {
		_cache.providersData[providerId]={};
		var providerXml = searchConnector.getProviderData(providerId);
		if (providerXml == null) return;
		_cache.providersData[providerId].xml = providerXml;
		_cache.providersData[providerId].hasSystems = searchConnector.parseHasSystems(providerXml);
		_cache.providersData[providerId].searchButton = searchConnector.parseSearchButton(providerXml);
		_cache.providersData[providerId].searchString = searchConnector.parseSearchString(providerXml);
		_cache.providersData[providerId].errorSystem = searchConnector.parseProviderSystemError(providerXml);
		
	}

	<@doc>
	   Set minimal size ot the splitter's upper box
	</doc@>
	function adjustSpliter() {
		//elmParamsBox.minsize = btnOk.offsetTop + btnOk.offsetHeight + spanAdvancedLink.offsetTop + spanAdvancedLink.offsetHeight;
		var searchBoxLoc = elmInnerSearchBox.style.display == "none" ? 0 : elmInnerSearchBox.offsetTop + elmInnerSearchBox.offsetHeight;
		var btnWizardLoc = btnWizard.style.display == "none" ? 0 : btnWizard.offsetTop + btnWizard.offsetHeight + spanAdvancedLink.offsetHeight;
		var btnOkLoc = btnOk.style.display == "none" ? 0 : btnOk.offsetTop + btnOk.offsetHeight + spanAdvancedLink.offsetHeight;
		elmParamsBox.minsize = 10+MAX(searchBoxLoc, btnWizardLoc, btnOkLoc, 60);
		//elmSplitter.split="0%"; // to force the spliter to place itself right bellow the elmParamsBox (that's why we set the minsize)
		elmSplitter.split=(elmParamsBox.minsize*100/elmSplitter.offsetHeight)+"%";
	}

	<@doc>
	   Reset UI elements to default state
	</doc@>
	function resetUI() {
		elmInnerSearchBox.visible=true;
		btnOk.enabled = true;
		btnOk.style.display="inline";
		btnCancel.style.display="inline";
		btnWizard.style.display="none";
		setFldAdvancedPropVisibility(false);
		showFld(spanSearchProvider, fldSearchProv, '');
		hideFld(spanSearchType, fldSearchType, true);
		showFld(spanSearchStr, fldSearchStr, '');
		divSearchStr.innerHTML="#TEXT[XFLD_SEARCH_FOR]";
		spanProviderErrors.innerHTML = '';
	}

	<@doc>
	   Hide UI elements that need hiding when data fetching fails
	</doc@>
	function hideUI() {
		hideFld(spanSearchProvider, fldSearchProv, true);
		hideFld(spanSearchStr, fldSearchStr, false);
		hideFld(spanSearchType, fldSearchType, true);
		btnOk.style.display="none";
		btnCancel.style.display="none";
		btnWizard.style.display="none";
	}

	<@doc>
	   Build HTML to show the search errors. These are errors when preparing for the search, not when executing the search;
	   <param name="errors" type="Array">an Array that holds the errors to show</param>
	</doc@>
	function showErrors(errors) {
		var errHTML = "<img src='#URL[core.dev~res:skins.gm.icons.error_triangle.gif]' style='vertical-align:middle'>&nbsp{1}";
		var errorsHTML="<BR>";
		for (var i=0, len=errors.length;i<len;i++) {
			errorsHTML += errHTML.replace("{1}",errors[i]);
		}
		spanProviderErrors.innerHTML=errorsHTML;
		btnOk.enabled=false;
	}

	<@doc>
	   Build HTML to show the provider's relevant links. This can include error messages and the Wizard.
	   <param name="links" type="Array">an Array that holds the links to show</param>
	</doc@>
	function showLinks(links) {
		var actionHTML='<SPAN style="color:blue; cursor:hand;" onClick="activateLink({1})" ><u>{2}</u></SPAN><BR><BR>';
		var titleHTML='{2}<BR>';
		var linksHTML="<BR>",tempLink;
		for (var i=0, len=links.length;i<len;i++) {
			if (links[i].type == "TITLE") //meaning no action attached
				tempLink = titleHTML;
			else
				tempLink = actionHTML.replace("{1}","'"+links[i].urn+"'");
			linksHTML += tempLink.replace("{2}",links[i].name);
		}
		spanProviderLinks.innerHTML=linksHTML;
	}
	<@doc>
	   Activate a link that was selected by the modeler. Activation process depends on the plaform - is it J2EE or Eclipse
	   <param name="xml" type="xml">the xml</param>
	</doc@>
	function activateLink(urn) {
		switch ('#SYS[COM_SAP_VDS_PLATFORMSPECIFIC_PROPERTIES_PLATFORM]') {
			case 'eclipse':
				searchConnector.activateLink(fldSearchTechnology.value, urn); //params are: providerID, link to acrivate
				break;
			default:
				//MUST be resize=true in order to refresh the grids
				window.open(urn,"_blank","directories=no,resizable=yes");
		}
	}

	<@doc>
	   Display a field - show its span, itself, and set its domain
	   <param name="span:S">the span's ID</param>
	   <param name="fld:S">the field's ID</param>
	   <param name="domain:S">the domain</param>
	</doc@>
	function showFld(span, fld, domain) {
		var firstValue='';
		var arr = domain.split(";");
		if (arr.length == 1) {
			firstValue = arr[0].split(":")[0];
		}
		if (domain)
			fld.domain = domain;
		fld.value=firstValue;
		span.style.display="block";
		elmParamsBox.layout();
	}
	<@doc>
	   Hide a field - hide its span, itself, and clear its domain
	   <param name="span:S">the span's ID</param>
	   <param name="fld:S">the field's ID</param>
	   <param name="hideDomain:b">whether to reset the domainn</param>
	</doc@>
	function hideFld(span, fld, hideDomain) {
		if (hideDomain)
			fld.domain = "";
		span.style.display="none";
	}

	<@doc>
	   restart the htc, clear all context info, as if the htc was reloaded
	</doc@>
	function restart(){
		csize = 0;
		tsize = 0;
		_searchCancelled = false;
		_enableContextMenu = true;
		_enableDetaiedView = true;
		_searchContext = "";
		_advancedSearchLink = "";
		_elmAdvanceData = {};
		_progressHandle = null;
		_finishedLoading = false;
		_includeList = {};
		_includeListGiven = false;
		_hideParams = false;
		clearResults();elmResultHeaderBox.visible=false;
		hideUI();spanProviderErrors.innerHTML = '';
		spanProviderLinks.innerHTML="";
		setFldAdvancedPropVisibility(false);
		elmAdvancedBox.visible=false;
		adjustSpliter();
		fetchProvidersList();
	}

	/*
	function test()
	{
		var params = {};
		debugger;
		params[#[DISCOVERY_PARAMETER_PROVIDER_NAME]] = "SDIJDBCProvider";
		params["com.sap.sbi:system"] = "JDBCDummy";
		params["com.sap.sbi:node.id"] = "func1";
		searchConnector.retrieveComponentMetadata(params);
	}
	*/
	//------------------------------------------------------------------------------------
	//EVENTS

	<@event name="onNodeSelect">
		Fires whenever a node is selected by the user
		<param name="provider">The provider name</param>
		<param name="nodeId">The node Id</param>
		<param name="nodeName">The node name</param>
		<param name="nodeSystem">The node Id</param>
		<param name="nodeGmlObject">The node gml object</param>
		<param name="nodeObjectType">The node object type</param>
		<param name="nodeData">The node data bag</param>
	</event@>


	//-------------------------------------------------------------------------------------

	</SCRIPT>

	</HEAD>

	<body onresize="resize();">

	<STB:DIALOG id=elmDialog box="0 0 W H" style="background:#[BG1]">
		<STB:SPLITTER id=elmSplitter box="0 0 W H" type="vert" split="18%" splitterColor="#[BG1]">
			<STB:BOX id=elmParamsBox box="0 0 W H">
				<STB:BOX id=elmSearchBox box="0 0 W H" style="background:#[BG1];padding:2px;">
					<!--div hasChildBoxes=true-->
						<STB:BOX  style="white-space: nowrap" box="4 12 W 10" >#TEXT[XFLD_SELECT_PROVIDER]</STB:BOX>
						<STB:INPUT box="4 25 W-29 20" id=fldSearchTechnology type="icon" tooltip="#TEXT[XTOL_SELECT_A_PROVDIER]" onkeydown="if (event.keyCode == 13) updateProviderData()" onChange="updateProviderData()"/>
						<STB:BUTTON box="W-18 27 18 18" glyph="LINKBTN" id=btnRefresh enabled=true title="#TEXT[XBUT_REFRESH]" onclick="restart();" align=right><img part=BTN src="#URL[~skin:icons.refresh.gif]"/></STB:BUTTON>
					<!--/div-->
					<STB:BOX id=elmInnerSearchBox visible=false box="4 45 W-8 h">
						<span hasChildBoxes=true id="spanSearchProvider">
							<div style="white-space: nowrap;padding-top:6;">#TEXT[XFLD_SYSTEM_DETSINATIONS]</div>
							<div id=fldSearchProvDiv hasChildBoxes=true >
								<STB:INPUT id=fldSearchProv type="enum" tooltip="#TEXT[XTOL_SEARCH_IN]" onkeydown="if (event.keyCode == 13) getObjectTypeParam()" onChange="getObjectTypeParam()"/>
							</div>
						</span>
						<span hasChildBoxes=true id="spanSearchType" nowrap>
							<div style="white-space: nowrap;padding-top:6;">#TEXT[XFLD_SEARCH_TYPE]</div>
							<div id=fldSearchTypeDiv hasChildBoxes=true>
								<STB:INPUT id=fldSearchType type="enum" tooltip="#TEXT[XTOL_SEARCH_TYPE]" onkeydown="if (event.keyCode == 13) getAdditionalParamsParam()" onChange="getAdditionalParamsParam()"/>
							</div>
						</span>
						<div hasChildBoxes=true id="spanSearchStr" nowrap>
							<div id=divSearchStr  style="white-space: nowrap;padding-top:6;">#TEXT[XFLD_SEARCH_FOR]</div>
							<div id=fldSearchStrDiv hasChildBoxes=true >
								<STB:INPUT id=fldSearchStr type="combo" history="SearchHelpHist" tooltip="#TEXT[XTOL_SEARCH_FOR]" onkeydown="if (event.keyCode == #[ENTER]) startSearch()"/>
							</div>
						</div>
						<span hasChildBoxes=true id="spanProviderLinks" ></span>
						<span hasChildBoxes=true id="spanProviderErrors" ></span>
						<div hasChildBoxes=true id=spanButton style="padding-top:10;padding-bottom:10">
							<STB:BUTTON id=btnWizard style="display:none" enabled=true></STB:BUTTON>
							<STB:BUTTON id=btnOk enabled=true onclick="startSearch()">#TEXT[XBUT_SEARCH]</STB:BUTTON>
							<STB:BUTTON id=btnCancel enabled=false onclick="cancel()">#TEXT[XBUT_CANCEL]</STB:BUTTON>
						</div>
						<div id="spanAdvancedLink">
							<a href="" id=fldAdvancedProp onClick="updateAdvancedPropDlgSize(); return false;" title="#TEXT[XTOL_SHOW_ADVANCED_SEARCH]">#TEXT[XLNK_SHOW_ADVANCED_SEARCH]</a>
						<BR></div>
					</STB:BOX>
				<STB:BOX id=elmAdvancedBox box="0 160 W H-160" visible=false style="overflow-y:auto;width:100%;height:100%;background:#[WHS];border-top:solid #[BR1] 1">
						<STB:SMARTFORM id="elmEditor"/>
					</STB:BOX>
				</STB:BOX>
			</STB:BOX>
			<STB:SPLITTER id=elmSplitterLower box="0 0 W H-220" type="vert" split="100%" splitterColor="#[CL1]" >
				<STB:BOX box="0 0 W H" style="background:#[WHT];border-top:1 solid #[FG2]" minsize="100">
					<STB:BOX id=elmResultHeaderBox box="0 -1 W 40" visible=false style="width:100%;height:100%;background:#[BG1];border-bottom:1 solid #[BR1];padding:5;overflow-y:auto;">
						<DIV id=resultsHeader></DIV>
					</STB:BOX>
					<STB:BOX id=elmResultBox box="0 39 W H-39" visible=false GLYPH="WHITEBOX SCROLL">
					<!--	<STB:BOX box="10 5 W-20 H-10" style="overflow-y:auto;width:100%;height:100%;background:#[WHT];border-bottom:solid #[WHS] 1;border-top:solid #[BR1] 1;border-left:solid #[BR1] 1;border-right:solid #[WHS] 1">-->
							<STB:TREEVIEW id="elmResList" glyph="TOC1" wheelAction="scroll" onNodeSelect="showData()" onNodeMenu="contextMenu()" style="cursor:hand;"/>
					<!--	</STB:BOX>-->
					</STB:BOX>
					<STB:BOX box="0 H-28 W 28" id=btnBox visible=false style="padding:2;background:#[BG1];border-top:1 solid #[BR1];border-bottom:1 solid #[BR1]">
						<SPAN id=btnStart onclick="getNextRes('start')" class="TOOLBTN" title="#TEXT[XTOL_START]"><img src="#URL[~skin:icons.page_first.gif]"></SPAN>
						<SPAN id=btnPrev onclick="getNextRes('prev')" class="TOOLBTN" title="#TEXT[XTOL_BACK]"><img src="#URL[~skin:icons.page_prev.gif]"></SPAN>
						<span style="width:80;position:relative;top:0;padding-bottom:7;text-align:center;" id=pageSp></span>
						<SPAN id=btnNext onclick="getNextRes('next')" class="TOOLBTN" title="#TEXT[XTOL_FORWARD]"><img src="#URL[~skin:icons.page_next.gif]"></SPAN>
						<SPAN id=btnEnd onclick="getNextRes('end')" class="TOOLBTN" title="#TEXT[XTOL_END]"><img src="#URL[~skin:icons.page_last.gif]"></SPAN>
					</STB:BOX>
				</STB:BOX>
				<STB:BOX box="0 0 W H" style="background:#[WHS]" minsize="25">
					<STB:BOX id=dataBox box="0 0 W H-20" visible=false style="border-top:1 solid #[BR1];overflow-y:auto;">
							<STB:SMARTFORM id="elmData"/>
					</STB:BOX>
					<a href="" box="19 H-20 W-38 20" id=fldDetails onClick="showMoreDetails(); return false;" style="visibility:hidden" >Show All Details...</a>

				</STB:BOX>
			</STB:SPLITTER>
		</STB:SPLITTER>
	</STB:DIALOG>


	</BODY>

	</HTML>
	</PUBLIC:COMPONENT>
