// Copyright(c) 2007 The Australian National University

function Searcher(){this.hasLastSearch=false;var searches={};var lastSearch;var catalog;this.getSavedSearchNames=function(){var searchNames=[];for(var name in searches){searchNames.push(name);}
if(searchNames.length==0){SearchAccessor.getSavedSearchNames({callback:function(names){if(names==null){return;}
searchNames=names;for(var i=0;i<names.length;i++){searches[names[i]]=null;}},async:false});}
return searchNames;};this.searchExists=function(searchName){searchName=searchName.toLowerCase();for(var name in searches){if(name.toLowerCase()===searchName){return true;}}
return false;}
this.loggedOut=function(){searches={};};this.loggedIn=function(){searches={};};this.getCatalog=function(){if(catalog===undefined){ConfigAccessor.getCatalogTree({callback:function(catalogMap){catalog=catalogMap;},async:false});}
return catalog;};this.getCatalogDatasets=function(queryString){var results;SearchAccessor.getCatalogDatasets(queryString,{callback:function(searchResults){results=searchResults;},async:false});return results;};this.getDatasetVariables=function(queryString){var results;SearchAccessor.getDatasetVariables(queryString,{callback:function(searchResults){results=searchResults;},async:false});return results;};this.saveLast=function(searchName){var result;SearchAccessor.saveLast(searchName,{callback:function(searchName){result=searchName;},async:false});searches[searchName]=null;lastSearch=undefined;this.hasLastSearch=false;return result;};this.getSearch=function(searchName){var search=searches[searchName];if(search==null){SearchAccessor.getSearch(searchName,{callback:function(searchResults){search=searchResults;},async:false});if(search!=null){if(searchName==="lastSearch"){lastSearch=search;}else{searches[searchName]=search;}}}
if(searchName==="lastSearch"&&search!==null){this.hasLastSearch=true;}
return search;};this.getSearchPage=function(searchName,hitType){var hits;var result={};var search;if(searchName==="lastSearch"){search=lastSearch;}else{search=searches[searchName];}
SearchAccessor.getSearchPage(searchName,hitType,{callback:function(results){hits=results;},async:false});if(hits==null){return null;}else{result.searchName=searchName;result.hitType=hitType;var hitsInSearch;if(hitType==="dataset"){hitsInSearch=search.numDatasets;searchHits=search.datasets;}else{hitsInSearch=search.numVariables;searchHits=search.variables;}
result.hitsInSearch=hitsInSearch;result.hits=hits;result.server=search.server;for(var i=0;i<hits.length;i++){searchHits.push(hits[i]);}
result.hitsRetrieved=searchHits.length;return result;}};this.applyFilter=function(searchName,filterType,field,value){var searchResults;var search;SearchAccessor.applyFilter(searchName,filterType,field,value,false,{callback:function(results){searchResults=results;},async:false});if(searchResults==null){return;}
if(searchName==="lastSearch"){search=lastSearch;}else{search=searches[searchName];}
if(filterType==="dataset"){search.numDatasets=searchResults.numVariables;search.datasets=searchResults.variables;search.datasetFilter=true;}else{search.numVariables=searchResults.numVariables;search.variables=searchResults.variables;search.variableFilter=true;}
return search;};this.removeFilter=function(searchName,filterType){var searchResults;var search;SearchAccessor.removeFilter(searchName,filterType,{callback:function(results){searchResults=results;},async:false});if(searchResults==null){return;}
if(searchName==="lastSearch"){search=lastSearch;}else{search=searches[searchName];}
if(filterType==="dataset"){search.numDatasets=searchResults.numVariables;search.datasets=searchResults.variables;search.datasetFilter=false;}else{search.numVariables=searchResults.numVariables;search.variables=searchResults.variables;search.variableFilter=false;}
return search;};this.deleteSearch=function(searchName){var message;SearchAccessor.deleteSearch(searchName,{callback:function(result){message=result;},async:false});if(message=="SESSION_EXPIRED"||message=="SEARCH_NOT_FOUND"){return null;}
delete searches[searchName];return message;};this.renameSearch=function(oldName,newName){var message;SearchAccessor.renameSearch(oldName,newName,{callback:function(result){message=result;},async:false});if(message=="SESSION_EXPIRED"||message=="SEARCH_NOT_FOUND"){return null;}
delete searches[oldName];return message;};}