/********************************************************************
* gn_search.js
*
* This file contains functions related to the dynamic behavior of geonetwork:
* - Metadata search & reset
* - Area of Interest Map behavior
* - metadata present
* - metadata vote rating
*
********************************************************************/

function fixGroups()
{
	var groups = $('groups');	
	var notgroups = $('notgroups');
	var notgroupsInterface = $('notgroupsInterface');
	if (groups.options[0].selected) {
		for (var i = 1;i < groups.options.length;i++) {
			groups.options[i].selected = false;
		}
		notgroups.checked = false;
		notgroupsInterface.hide();
	} else {
		notgroupsInterface.show();
	}
}

function fixTypes()
{
	var types = $('types');	
	if (types.options[0].selected) {
		for (var i = 1;i < types.options.length;i++) {
			types.options[i].selected = false;
		}
	}
}

/**********************************************************
***
***		SIMPLE SEARCH
***
**********************************************************/

function initSimpleSearch(wmc)
{
	im_mm_init(wmc, function()
	{
		$('openIMBtn').style.cursor = 'pointer';
		Event.observe('openIMBtn', 'click',  function(){openIntermap()} );
	});		
}

function getWherePars()
{
	var pars="";
	var region = $('region').value;
	if(region!="") {
		pars += "&attrset=geo";
		pars += "&"+im_mm_getURLselectedbbox();
		pars += fetchParam('relation');
		pars += fetchParam('region');
	} else {
		pars += "&westBL=-180&eastBL=180&northBL=90&southBL=-90";
		pars += "&region=";
		pars += "&relation=overlaps";
	}
	return pars;
}

function getSimplePars()
{
	var pars = "any=" + encodeURIComponent($('any') .value);

	var region = $('region').value;
	pars += getWherePars();
	pars += fetchParam('sortBy');
	pars += fetchParam('sortOrder');
	pars += fetchParam('hitsPerPage');
	pars += fetchParam('output');
	pars += "&remote=off";

	return pars;
}

function runSimpleSearch() 
{
	preparePresent('simple');

	setSort();

	var pars = getSimplePars();

	// Load results via AJAX
	gn_search(pars);    
}

function resetSimpleSearch()
{
/* make sure all values are completely reset (instead of just using the default
   form.reset that would only return to the values stored in the session */
    setParam('any','');		
    setParam('relation','overlaps');		
    setParam('region',null);
   
		resetMiniMap();
    
 		setParam('sortBy',      'relevance');
 		setParam('hitsPerPage', '10');
 		setParam('output',      'full');
		setParam('remote',			'off');
		keyordsSelected = false;

		var pars = getSimplePars();
		sendSearchParsToServer(pars);
}

function sendSearchParsToServer(pars)
{

		// send the search parameters we've reset back to server

    var myAjax = new Ajax.Request(
        getGNServiceURL('main.search.reset'), 
        {
            method: 'get',
            parameters: pars,
            onSuccess: 
						ker.wrap(this, function(req) {
									if (req.nodeName == 'error')
										ker.showError('Error resetting search parameters', req);
									}),
            onFailure:
						ker.wrap(this, function(req) {
									alert("Error: request to main.search.reset failed");
									})
        }
		);

}

/********************************************************************
* 
*  show simple/advanced/remote search
*
********************************************************************/

function showRemoteSearch(search)
{
	var myAjax = new Ajax.Updater (
		'remotesearch',    
		getGNServiceURL('main.searchform.remote.embedded'), 
		{
			method: 'get',    		    	
			onComplete: function()
			{
				initRemoteSearch();
				if (search == 'true') {
					runRemoteSearch();
				}
			},
			onFailure: im_load_error
		}
	);	
 
}

function showAdvancedSearch(search)
{
	var myAjax = new Ajax.Updater (
		'advancedsearch',    
		getGNServiceURL('main.searchform.advanced.embedded'), 
		{
			method: 'get',    		    	
			evalScripts: true,
			onComplete: function()
			{
				initAdvancedSearch();
				if (search == 'true') {
					runAdvancedSearch();
				}
			},
			onFailure: im_load_error
		}
	);	
 
}

function showSimpleSearch(search)
{
	var myAjax = new Ajax.Updater (
		'simplesearch',    
		getGNServiceURL('main.searchform.simple.embedded'), 
		{
			method: 'get',
			onComplete: function()
			{
				initSimpleSearch();
				if (search == 'true') {
					runSimpleSearch();
				}
			},
			onFailure: im_load_error
		}
	);	
}

function showLuceneSearch()
{
	var myAjax = new Ajax.Updater (
		'lucenesearch',    
		getGNServiceURL('main.searchform.lucene.embedded'), 
		{
			method: 'get',    		    	
			evalScripts: true,
			onComplete: function()
			{
				initLuceneSearch();				
			},
			onFailure: im_load_error
		}
	);	
 
}

/**********************************************************
***
***		REMOTE SEARCH
***
**********************************************************/

function initRemoteSearch()
{
	im_mm_init();
}

function getRemotePars() {
	var pars = "any=" + encodeURIComponent($('any') .value);
	pars += fetchParam('title');
	pars += fetchParam('abstract');
	pars += fetchParam('themekey');
	pars += "&attrset=geo";

	pars += getWherePars();
	pars += fetchMultipleParam('servers');

	pars += fetchParam('timeout');
	pars += fetchBoolParam('serverhtml');
	pars += fetchParam('hitsPerPage');
	pars += "&remote=on";

	return pars;
}

function resetRemoteSearch() {

	setParam('any','');
	setParam('title','');
	setParam('abstract','');
	setParam('themekey','');
	setParam('region','');
	setParam('relation','overlaps');

	resetMiniMap();

 	setParam('hitsPerPage', '10');
 	setBoolParam('serverhtml',false);
 	setParam('timeout','20');
 	setParam('profile','');
	deselectAllServers();

	var pars = getRemotePars();
	sendSearchParsToServer(pars);
}

function profileSelected()
{
	var serverList = $('profile').value;
	var serverArray = serverList.split(' ');
	deselectAllServers();
	for (var i=0; i < serverArray.length; i++)
		selectServer(serverArray[i]);
}
	
function deselectAllServers()
{
	var rservers = $('servers');
	for (var i=0; i < rservers.length; i++)
		rservers.options[i].selected = false;
}
	
function selectServer(server)
{
	var rservers = $('servers');
	for (var i=0; i < rservers.length; i++) {
		if (rservers.options[i].value == server) {
			rservers.options[i].selected = true;
		}
	}
}
		
function checkRemoteFields()
{
	if (isWhitespace($('any').value) && isWhitespace($('title').value) && isWhitespace($('abstract').value) && isWhitespace($('themekey').value) && isWhitespace($('region').value)) {
		alert("Please enter or select some search criteria");
		return false;
	}
	var servers = 0;
	var rservers = $('servers');
	for (var i=0; i < rservers.length; i++) {
			if (rservers.options[i].selected) servers++;
	}
	if (servers == 0) {
		alert("Please select a server to search");
		return false;
	}
	return true;
}
		
function runRemoteSearch(type) 
{
	if (checkRemoteFields()) {
		if (type != "pdf") preparePresent('remote');

		var pars = getRemotePars();

		if (type == "pdf") {
			pars = pars.replace(/hitsPerPage=\d{2,3}/, 'hitsPerPage=1000');
			location.replace(getGNServiceURL('pdf.search') + "?" + pars);
		} else {
			// Load results via AJAX
			gn_search(pars);    
		}
	}
}

/**********************************************************
***
***		ADVANCED SEARCH
***
**********************************************************/

/*
function initHelp(formId) 
{
	// process all input (not checkbox) and select fields and place a ? image 
	// after each one and a div with potential help in it
	
	var mycontent = $(formId).select('input:not([type~=checkbox][type~=radio])', 'select');
	mycontent.each(function(formControl) {
		imgUrl = '/geonetwork/images/help.png';
		id = formId+"_"+formControl.readAttribute('id');
		helpText = i18n(id);
		img = '<img src="'+imgUrl+'" id="'+id+'.img" style="cursor:hand;cursor:pointer;"/>';
		formControl.insert({'after':img});
		div = '<div style="display:none;" id="'+id+'.div">'+helpText+'</div>';
		formControl.insert({'after':div});
		Event.observe(id+'.img','click',function() { $(id+'.div').show(); });
	});
	
}
*/

function initAdvancedSearch()
{
	im_mm_init();

	new Ajax.Autocompleter('themekey', 'keywordList', 'portal.search.keywords?',{
		paramName: 'keyword', 
		updateElement : function(li) { addQuote('themekey',li); }
	});
	/* need to fix Analyzer in Lucene
	new Ajax.Autocompleter('credit', 'creditList', 'portal.search.credits?',{
		paramName: 'creditCompleter', 
		updateElement : function(li) { addQuote('credit',li); }
	});
	new Ajax.Autocompleter('title', 'titleList', 'portal.search.titles?',{
		paramName: 'titleCompleter', 
		updateElement : function(li) { addQuote('title',li); }
	});
	*/
	new Ajax.Autocompleter('dataparam', 'dataparamList', 'portal.search.dataparams?',{
		paramName: 'dataparam', 
		updateElement : function(li) { addQuote('dataparam',li); },
		callback : function(element, queryParam) { return addWildcard(queryParam); }
	});


	keyordsSelected = false;

	Calendar.setup({
		inputField     :    "dateFrom",     // id of the input field
		ifFormat       :    "%Y-%m-%dT%H:%M:00",      // format of the input field
		button         :    "from_trigger_c",  // trigger for the calendar (button ID)
		showsTime 		 :		true,
		align          :    "Tl",           // alignment (defaults to "Bl")
		singleClick    :    true
	});
	
	Calendar.setup({
		inputField	:    "dateTo",     // id of the input field
		ifFormat	:    "%Y-%m-%dT%H:%M:00",      // format of the input field           
		button		:    "to_trigger_c",  // trigger for the calendar (button ID)
		showsTime	:    true,
		align		:    "Tl",           // alignment (defaults to "Bl")
		singleClick	:    true
	});

}

function getAdvancedPars() 
{

	var pars = "any=" + encodeURIComponent($('any') .value);
	pars += fetchParam('phrase');
	pars += fetchParam('or');
	pars += fetchParam('without');
	pars += fetchParam('title');
	pars += fetchParam('abstract');
	pars += fetchParam('themekey');
	pars += fetchRadioParam('similarity');

	pars += getWherePars();

	pars += fetchParam('dateFrom');
	pars += fetchParam('dateTo');

	pars += fetchMultipleParam('groups');
	pars += fetchBoolParam('ownergroups');
	pars += fetchBoolParam('notgroups');
	pars += fetchBoolParam('owner');

	pars += fetchParam('credit');
	pars += fetchParam('dataparam');
	pars += fetchMultipleParam('types');
	pars += fetchParam('uuid');
	pars += fetchParam('category');
	pars += fetchParam('siteId');
	
	pars += fetchBoolParam('digital');
	pars += fetchBoolParam('paper');
	pars += fetchBoolParam('dynamic');
	pars += fetchBoolParam('download');
	pars += fetchParam('protocol').toLowerCase();
	pars += fetchParam('template');
	pars += fetchParam('sortBy');
	pars += fetchParam('sortOrder');
	pars += fetchParam('hitsPerPage');
	pars += fetchParam('output');
	pars += "&remote=off";
	return pars;
}

function runAdvancedSearch() 
{
	preparePresent('advanced');

	setSort();

	var pars = getAdvancedPars();

	gn_search(pars);    
	muffleAdvancedSearchForm(pars);
}

function muffleAdvancedSearchForm(pars) {
	var str = '<div><b>Your advanced search was:</b><br/>';
	// Split the parameter string on & then process the array
	var pA = pars.split('&');
	for (i = 0;i < pA.length;i++) {
		var p = pA[i].split('=');	
		if (p[0] == "output" || p[0] == "remote" || p[0] == "sortBy" || p[0] == "sortOrder" || p[0] == "attrset") {
			// don't show these
		} else {
			if (p[0].endsWith("BL")) p[1] = p[1].substring(0,6);
			if (p[0] == "northBL") p[0] = "latitude(min)";
			else if (p[0] == "southBL") p[0] = "latitude(max)";
			else if (p[0] == "eastBL") p[0] = "longitude(min)";
			else if (p[0] == "westBL") p[0] = "longitude(max)";
			str+=" <b>"+p[0]+":</b> ";
			if (p[1].blank()) p[1] = "blank";
			str+="<code>"+p[1]+"</code>";
		}
	}
	str+='<div><center><button onclick="restoreAdvancedSearchForm()">Restore advanced search form</button></center></div>'

	$('advsearch').hide();
	$('yoursearch').innerHTML = str;
	$('yoursearch').show();
}

function restoreAdvancedSearchForm() {
	$('yoursearch').hide();
	$('advsearch').show();
}


function resetAdvancedSearch()
{
/* make sure all values are completely reset (instead of just using the default
   form.reset that would only return to the values stored in the session */
	setParam('any','');		
	setParam('phrase', '');
	setParam('or', '');
	setParam('without', '');
	setParam('title','');		
	setParam('abstract','');		
	setParam('themekey','');		
	var radioSimil = document.getElementsByName('similarity');
	setBoolParam(radioSimil[0],true);
	setParam('relation','overlaps');		
	setParam('region',null);		

	resetMiniMap();
	
	setParam('dateFrom','');
	setParam('dateTo','');
	setBoolParam('radfrom0',true);
	setBoolParam('radfrom1',false);
	setParam('credit','');		
	setParam('dataparam','');		
	setParam('types','');		
	setParam('uuid','');		
	setParam('groups','');		
	setBoolParam('ownergroups',false);
	setBoolParam('notgroups',false);
	setBoolParam('owner',false);
	setParam('category','');		
	setParam('siteId','');		
	setBoolParam('digital',false);
	setBoolParam('paper',false);
	setBoolParam('dynamic',false);
	setBoolParam('download',false);
	setParam('protocol',    '');
	setParam('template',    'n');
 	setParam('sortBy',      'relevance');
 	setParam('hitsPerPage', '10');
 	setParam('output',      'full');
 	setParam('remote',      'off');
	keyordsSelected = false;

	var pars = getAdvancedPars();
	sendSearchParsToServer(pars);
	$('notgroupsInterface').hide();
}

/**********************************************************
***
***		LUCENE SEARCH
***
**********************************************************/

function initLuceneSearch()
{}

function createLuceneQuery()
{
	frm = $('luceneform');	
	phraseInput = $('phrase-input');
	phrase = $('phrase');
	if (phraseInput.value.length > 0) phrase.value = quote(phraseInput.value);
	else if (phrase.value.length > 0) phrase.value = '';
	doMakeQuery(frm); // function from luceneQueryConstructor.js
}

function clearLuceneQueries()
{
	frm = $('luceneform');
	frm.query.value = '';
	frm.extraquery.value = '';
	$('curQuery').innerHTML = '';
	frm.luceneField.value = 'any';
	updateWithFields();
	frm.reset();
}

function saveLuceneQuery()
{
	frm = $('luceneform');
	createLuceneQuery();
	query = frm.query.value + ' ' + frm.extraquery.value;
	if (query == ' ') {
		alert("Cannot save an empty query - enter some query terms first!");
		return;
	}

	node = Builder.node('form',{style: 'border: 1px; solid #0F0;',id: 'luceneQuerySaver'});
	div = Builder.node('div');
	node.appendChild(div);
	p = Builder.node('p','Current query: '+query);
	div.appendChild(p);
	lbl = Builder.node('span','Enter a name for this query ');
	div.appendChild(lbl);
	chk = Builder.node('input',{type:'text',name:'queryname'});
	div.appendChild(chk);
	save = Builder.node('input',{type: 'button', value: 'Save', id: 'save'});
	node.appendChild(save);

	function saveLuceneQuery(e)
	{
		lqFrm = $('luceneQuerySaver');
		queryName = lqFrm.queryname.value;
		if (queryName == '') {
			alert('No name entered!');
		} else {
			// store the query in the cookie using the entered name as a key
			Cookie.init({name: 'geonetworkQuery', expires: 86400});
			Cookie.setData(queryName, {name: queryName, query: query, savedate: new Date()});
			Modalbox.hide();
		}
	}

	saverOb = saveLuceneQuery.bindAsEventListener();
	function setObservers() {
		Event.observe($('save'),'click', saverOb);
	};
	function removeObservers() {
		Event.stopObserving($('save'),'click', saverOb);
	}

	Modalbox.show(node, {title: 'Save query to a cookie', width: 600, 
	afterLoad: setObservers, onHide: removeObservers });
		
}

function retrieveLuceneQueries()
{
	frm = $('luceneform');

	// retrieve the query from the cookie
	Cookie.init({name: 'geonetworkQuery', expires: 86400});
	queries = Cookie.retrieve();
	queriesJSON = queries.evalJSON(true);
	queriesHash = new Hash(queriesJSON);
	return queriesHash;
}

function showLuceneQueries()
{
	frm = $('luceneform');

	space = Builder.node('span',' ');
	queriesHash = retrieveLuceneQueries();
	if (queriesHash.keys().length == 0) {
		alert("You haven't got any saved queries in your session");
		return;
	}

	node = Builder.node('form',{style: 'border: 1px; solid #0F0;',id: 'luceneQueries'});
	t = Builder.node('table',{width: '100%'});
	node.appendChild(t);
	tb = Builder.node('tbody');
	t.appendChild(tb);
	qn = queriesHash.keys();
	qv = queriesHash.values();
	for (var i=0;i<queriesHash.values().length;i++) {
		queryName = qn[i];
		queryData = qv[i];

		tr = Builder.node('tr');
		tb.appendChild(tr);

		// query name
		td = Builder.node('td');
		lbl = Builder.node('label',{style: 'white-space: nowrap;'})
		chk = Builder.node('input',{type:'checkbox',value:queryData.query,name:queryName});
		lbl.appendChild(chk);
		lbl.appendChild(document.createTextNode(queryName));
		td.appendChild(lbl);
		tr.appendChild(td);

		// query
		td = Builder.node('td',{align:'center'});
		td.appendChild(document.createTextNode(queryData.query));
		tr.appendChild(td);

		// save date
		td = Builder.node('td',{align:'center'});
		td.appendChild(document.createTextNode(queryData.savedate));
		tr.appendChild(td);

	}
	titleActions = Builder.node('span','Actions on selected queries ');
	node.appendChild(titleActions);
	appendSel = Builder.node('input',{type: 'button', value: 'Append', id: 'append'});
	node.appendChild(appendSel);
	node.appendChild(space);
	deleteSel = Builder.node('input',{type: 'button', value: 'Delete', id: 'delete'});
	node.appendChild(deleteSel);

	// The event listeners

	function appendLuceneQueries(e)
	{
		lqFrm = $('luceneQueries');
		frm = $('luceneform');
		var checkBoxes = lqFrm.getInputs('checkbox');
		checkBoxes.each(function(s) {
			if (s.checked) {
				frm.extraquery.value = frm.extraquery.value + ' ' + s.value;
			}
		});
		$('curQuery').innerHTML = frm.query.value + ' ' + frm.extraquery.value;
		Modalbox.hide();
	}

	function deleteLuceneQueries(e)
	{
		Cookie.init({name: 'geonetworkQuery', expires: 86400});
		lqFrm = $('luceneQueries');
		var checkBoxes = lqFrm.getInputs('checkbox');
		checkBoxes.each(function(s) {
			if (s.checked) {
				queries = Cookie.removeData(s.name);
				s.disable();
			}
		});
		Modalbox.hide();
	}

	// End of event listeners

	delOb = deleteLuceneQueries.bindAsEventListener();
	appOb = appendLuceneQueries.bindAsEventListener();
	function setObservers() {
		Event.observe($('append'),'click', appOb);
		Event.observe($('delete'),'click', delOb);
	};
	function removeObservers() {
		Event.stopObserving($('append'),'click', appOb);
		Event.stopObserving($('delete'),'click', delOb);
	}

	Modalbox.show(node, {title: 'Lucene Queries stored in cookies', width: 600, 
	afterLoad: setObservers, onHide: removeObservers });

}

function runLuceneSearch()
{
	frm = $('luceneform');	
	createLuceneQuery();
	var params = ''
	params += ker.createParam('query',frm.query.value+' '+frm.extraquery.value);
	params += ker.createParam('sortBy',frm.sortBy.value);
	params += ker.createParam('sortOrder',frm.sortOrder.value);
	if (updateLuceneQuery()) {
		ker.send('main.search.embedded',ker.createRequestFromParamString(params),showResults,false);
	}
}

function updateLuceneQuery()
{
	frm = $('luceneform');	
	createLuceneQuery();
	// doCheckLuceneQuery is a function from luceneQueryValidator.js
	if (frm.query.value == '' || doCheckLuceneQuery(frm.query)) { 
		$('curQuery').innerHTML = frm.query.value + ' ' + frm.extraquery.value;
		return true;
	} else {
		$('curQuery').innerHTML = 'Query ('+frm.query.value+' '+frm.extraquery.value+') is not valid - fix it first';
		return false;
	}
}

function updateWithFields()
{
	frm = $('luceneform');
	var field = frm.luceneField.value;
	frm.and.className = field;
	frm.or.className = field;
	frm.not.className = field;
	frm.phrase.className = field;
}
		
function showFields(img, div)
{
	var img = $(img);
	var src = img.getAttribute('src');
	var ndx = src.lastIndexOf('/');
	var div = $(div);
	
	src = src.substring(0, ndx+1);
	
	if (div.visible())	img.setAttribute('src', src +'plus.gif');
	else					img.setAttribute('src', src +'minus.png');
	
	div.toggle();
}

//-------------------------------------------------------------------

function setSort()
{
	if ($('sortBy').value=='title') 
	   $('sortOrder').value = 'reverse'; 
	else 
	   $('sortOrder').value = '';
}

//-------------------------------------------------------------------

function setSortAndSearch()
{
	$('sortBy').value = $F('sortBy.live');
	setSort();	
	if (document.cookie.indexOf("search=advanced")!=-1)
		runAdvancedSearch();
	else if (document.cookie.indexOf("search=default")!=-1)
		runSimpleSearch();
	else if (document.cookie.indexOf("search=lucene")!=-1)
		runLuceneSearch();
}

//-------------------------------------------------------------------

/**********************************************************
***
***		RATING
***
**********************************************************/

var ratingPopup = null;

//-------------------------------------------------------------------

function showRatingPopup(id)
{
	if (ratingPopup == null)
	{
		ker.loadURL('rating.popup', ker.wrap(this, 
			function(t)
			{
				var p = document.createElement('div');
	
				p.className     = 'ratingBox';
				p.innerHTML     = t.responseText;
				p.style.display = 'none';
				p.style.zIndex  = 32000;
				
				p.setAttribute('id', 'rating.popup');				
				document.body.appendChild(p);
				
				ratingPopup = p;
				
				setTimeout(ker.wrap(this, function(){ showRatingPopup(id); }), 10);	
			}));
		
		return;
	}
			
	var pos = Position.cumulativeOffset($('rating.link.'+ id));

	ratingPopup.style.left = pos[0] -100;
	ratingPopup.style.top  = pos[1] +16;
	
	ratingPopup.setAttribute('mdid', id);
	
	Element.show(ratingPopup);
}

//-------------------------------------------------------------------

function hideRatingPopup()
{
	var popup = $('rating.popup');
	
	if (popup != null)
	{
		Element.hide(popup);
		Element.hide('rating.image');	
	}
}

//-------------------------------------------------------------------

function rateMetadata(rating)
{
	var id = ratingPopup.getAttribute('mdid');
	
	Element.show('rating.image');	
	
	var request =
		'<request>'+
		'   <id>'+ id +'</id>'+
		'   <rating>'+ rating +'</rating>'+
		'</request>';
	
	ker.send('xml.metadata.rate', request, ker.wrap(this, rateMetadata_OK));	
}

//-------------------------------------------------------------------

function rateMetadata_OK(xmlRes)
{
	if (xmlRes.nodeName == 'error')
		ker.showError('Cannot rate metadata', xmlRes);
	else
		hideRatingPopup();
}


/********************************************************************
*** GET BOUNDINGBOX COORDINATES FOR A REGION
********************************************************************/

function doRegionSearch()
{
    var region = $('region').value;
    if(region=="") 
    {
        region=null;
        $('northBL').value='90';
        $('southBL').value='-90';
        $('eastBL').value='180';
        $('westBL').value='-180';
        
        im_mm_redrawAoI();
        im_mm_zoomToAoI();        
    } else if (region=="userdefined") {
						// Do nothing. AoI is set by the user
		} else
    {
        getRegion(region);
    }
}

function getRegion(region) 
{
    if(region)
        var pars = "id="+region;
    
    var myAjax = new Ajax.Request(
        getGNServiceURL('xml.region.get'), 
        {
            method: 'get',
            parameters: pars,
            onSuccess: getRegion_complete,
            onFailure: getRegion_error
        }
    );
}

function getRegion_complete(req) {
    //Response received 
    var node = req.responseXML;
    var northcc = xml.evalXPath(node, 'response/record/north');
    var southcc = xml.evalXPath(node, 'response/record/south');
    var eastcc = xml.evalXPath(node, 'response/record/east');
    var westcc = xml.evalXPath(node, 'response/record/west');

    $('northBL').value=northcc;
    $('southBL').value=southcc;
    $('eastBL').value=eastcc;
    $('westBL').value=westcc;

    im_mm_redrawAoI();
    im_mm_zoomToAoI();
}

function getRegion_error() {
    alert("ERROR: could not get the region from the server (xml.region.get)");
}

function updateAoIFromForm() {
  var nU = Number($('northBL').value);
  var sU = Number($('southBL').value);
  var eU = Number($('eastBL').value);
  var wU = Number($('westBL').value);
  
  if (nU < sU) { alert("North < South"); } 
  else if (nU > 90) { alert("North > 90 degrees"); }
  else if (sU < -90) { alert("South < -90 degrees"); }
  else if (eU < wU) { alert("East < West"); } 
  else if (eU > 180) { alert("East > 180 degrees"); }
  else if (wU < -180) { alert("West < -180 degrees"); }
  else 
  { 
    im_mm_redrawAoI();
    im_mm_zoomToAoI(); 
    $('updateBB').style.visibility="hidden";
  }
}

function AoIrefresh() {
  $('region').value="userdefined";
  $('updateBB').style.visibility="visible";
}

// Update the dropdown list
function im_mm_aoiUpdated(bUpdate) {
	$('region').value="userdefined";
}

function gn_showSingleMetadataUUID(uuid)
{
	var pars = 'uuid=' + uuid + '&currTab=simple';
	gn_showSingleMet(pars);
}

function resetMiniMap()
{
	$('northBL').value='90';
	$('southBL').value='-90';
	$('eastBL').value='180';
	$('westBL').value='-180';
	
	im_mm_redrawAoI();
	im_mm_zoomToAoI();
}

/********************************************************************
*** DO THE SEARCH!
********************************************************************/

function preparePresent(type) 
{

	if (type != null) {
		type = 'result'+type;
		$('resultList').writeAttribute('class', type);
	}
	clearNode($('resultList'));
	$('loadingMD').show();
}

function gn_filteredSearch()
{
	var myAjax = new Ajax.Request(
		getGNServiceURL('selection.search'),
		{
			method: 'get',
			parameters: '',
			onSuccess: gn_search_complete,
			onFailure: gn_search_error
		}
	);
}

function gn_searchpdf() 
{
	location.replace( getGNServiceURL('pdf.selection.search') );
}

function gn_search(pars) 
{
	var myAjax = new Ajax.Request(
		getGNServiceURL('main.search.embedded'), 
		{
			method: 'get',
			parameters: pars,
			onSuccess: gn_search_complete,
			onFailure: gn_search_error
		}
	);
}

function gn_present(service, frompage, topage) 
{
	preparePresent();
	
	var pars = 'from=' + frompage + "&to=" + topage;
	
	var myAjax = new Ajax.Request(
		getGNServiceURL(service), 
		{
			method: 'get',
			parameters: pars,
			onSuccess: gn_search_complete,
			onFailure: gn_search_error
		}
	);
}

function gn_search_complete(req) {
	showResults(req.responseText);
}

function showResults(responseText) {
    var rlist = $('resultList');
    
    rlist.innerHTML = responseText;
    $('loadingMD').hide();
  	rlist.show();  
}

/********************************************************************
* 
*  Show metadata content
*
********************************************************************/
function gn_showSingleMetadata(id)
{
   var pars = 'id=' + id + '&currTab=simple';
	 gn_showSingleMet(pars);
}

function gn_showSingleMet(pars)
{

   var myAjax = new Ajax.Request(
        getGNServiceURL('metadata.show.embedded'), 
        {
            method: 'get',
            parameters: pars,
            onSuccess: function (req) {
                var parent = $('resultList');
                clearNode(parent);
                // create new element
                var div = document.createElement('div');
                div.className = 'metadata_current';
                div.style.display = 'none';
                div.style.width = '100%';
                parent.appendChild(div);
                
                div.innerHTML = req.responseText;
                
                Effect.BlindDown(div);
                
                var tipman = new TooltipManager();
                ker.loadMan.wait(tipman);
            },
            onFailure: gn_search_error// FIXME
        });
}

function gn_showMetadata(id) 
{
    var pars = 'id=' + id + '&currTab=simple';
    
    $('gn_showmd_' + id) .hide();
    $('gn_loadmd_' + id) .show();
    
    var myAjax = new Ajax.Request(
        getGNServiceURL('metadata.show.embedded'), 
        {
            method: 'get',
            parameters: pars,
            onSuccess: function (req) {
                var parent = $('mdwhiteboard_' + id);
                clearNode(parent);
                
                $('gn_loadmd_' + id) .hide();
                $('gn_hidemd_' + id) .show();
                
                // create new element
                var div = document.createElement('div');
                div.className = 'metadata_current';
                div.style.display = 'none';
                div.style.width = '100%';
                parent.appendChild(div);
                
                div.innerHTML = req.responseText;
                
                Effect.BlindDown(div);
                
                var tipman = new TooltipManager();
                ker.loadMan.wait(tipman);
            },
            onFailure: gn_search_error// FIXME
        });
}

function gn_hideMetadata(id) 
{
    var parent = $('mdwhiteboard_' + id);
    var div = parent.firstChild;
    Effect.BlindUp(div, { afterFinish: function (obj) {
            clearNode(parent);
            $('gn_showmd_' + id) .show();
            $('gn_hidemd_' + id) .hide();
        }
    });
}

function a(msg) {
    alert(msg);
}

function gn_search_error() {
    $('loadingMD') .hide();
// style.display = 'none';
    alert("ERROR: search failed");
}

/**********************************************************
***
***		STUFF FOR CATEGORY SEARCH
***
**********************************************************/

function runCategorySearch(category) 
{
	preparePresent();

	var pars = "&category="+category;
	
	// Load results via AJAX
	gn_search(pars);    
}


/**********************************************************
*** Search helper functions
**********************************************************/

function fetchMultipleParam(p)
{
  var pL = $(p);
	var param = "&"+p+"=";
  if (!pL) 
    return param;
  else {
		var pars = "";
		for (i = 0;i < pL.length;i++) {
			if (pL.options[i].selected) {
  			var t = pL.options[i].value;
  			pars += param+encodeURIComponent(t);
			}
		}
		if (pars == "") return param;
		else return pars;
	}
}

function fetchParam(p)
{
  var pL = $(p);
	var param = "&"+p+"=";
  if (!pL) 
    return param;
  else {
  	var t = pL.value;
  	if(t)
  		return param+encodeURIComponent(t);
  	else 
  		return param;
	}
}

function fetchBoolParam(p)
{
  var pL = $(p);
	var param = "&"+p+"=";
  if (!pL) 
    return param+"off";
  else {
  	if(pL.checked )
  		return param+"on";
  	else 
  		return param+"off";
  }
}

function fetchRadioParam(name)
{
	var radio = document.getElementsByName(name);
	var value = getCheckedValue(radio);
	return "&"+name+"="+value;
}

// return the value of the radio button that is checked
// return an empty string if none are checked, or there are no radio buttons
function getCheckedValue(radioObj) {
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}


function setParam(p, val)
{
  var pL = $(p);
  if (pL) pL.value = val;
}

function setBoolParam(p, val)
{
  var pL = $(p);
  if (pL) pL.checked = val;
}

function addWildcard(queryParam)
{
	var param = queryParam.split('=')[0];
	var value = queryParam.split('=')[1];
	
	return  param + '=*' + value + '*' ;
}

/**********************************************************
*** Keywords
**********************************************************/

  var keyordsSelected = false;

  function addQuote (id,li){
  	$(id).value = '"'+li.innerHTML+'"'; 
  }

  function keywordSelector(){
	if ($("keywordSelectorFrame").style.display == 'none'){
		if (!keyordsSelected){
			new Ajax.Updater("keywordSelector","portal.search.keywords?mode=selector&keyword="+$("themekey").value);
			keyordsSelected = true;
		}
		$("keywordSelectorFrame").show();
	}else{
		$("keywordSelectorFrame").hide();
	}
  }

  function keywordCheck(k, check){
	k = '"'+ k + '"';
	//alert (k+"-"+check);
	if (check){	// add the keyword to the list
		if ($("themekey").value != '') // add the "or" keyword
			$("themekey").value += ' or '+ k;
		else
			$("themekey").value = k;
	}else{ // Remove that keyword
		$("themekey").value = $("themekey").value.replace(' or '+ k, '');
		$("themekey").value = $("themekey").value.replace(k, '');
		pos = $("themekey").value.indexOf(" or ");
		if (pos == 0){
			$("themekey").value = $("themekey").value.substring (4, $("themekey").value.length);
		}
	}
  }


 /*sets date string (user defined 'from' date to Now()) in advanced search [0: any;1: after; 2: change sel
 
 Function extracted by the current FAO site and adapted
 */
function setDates(what) 
{
	var xfrom = $('dateFrom');
	var xto = $('dateTo');
	
	if (what==0) //anytime 
	{ 
		xfrom.value = "";
		xto.value = "";
		return;
	}
	//BUILDS to DATE STRING AND UPDATES INPUT
	today=new Date();
	fday = today.getDate();
	if (fday.toString().length==1) 
		fday = "0"+fday.toString();
	fmonth = today.getMonth()+1; //Month is 0-11 in JavaScript
	if (fmonth.toString().length==1) 
		fmonth = "0"+fmonth.toString();
	fyear = today.getYear();
	if (fyear<1900) 
		fyear = fyear + 1900;
	
	var todate = fyear+"-"+fmonth+"-"+fday+"T23:59:59";
	var fromdate = (fyear-10)+"-"+fmonth+"-"+fday+"T00:00:00";
	xto.value = todate;
	xfrom.value = fromdate;
}

/**********************************************************************
 * Massive Ownership Transfer stuff
 **********************************************************************/

	function checkMassiveNewOwner(action,title) {

	// These two alerts should use localized versions of the strings 
	// in xml/metadata-massiveOwnership.xml 
	
		if ($('user').value == '') {
			alert("Select the user who will be the new owner");
			return false;
		}
		if ($('group').value == '') {
			alert("Select a group that the selected user belongs to");
			return false;
		}
		Modalbox.show(getGNServiceURL(action),{title: title, params: $('massivenewowner').serialize(true), afterHide: function() { $('search-results-content').hide(); }});
	}

	function addGroups(xmlRes) {
		var list = xml.children(xmlRes, 'group');
		$('group').options.length = 0; // clear out the options
		for (var i=0; i<list.length; i++) {
			var id     = xml.evalXPath(list[i], 'id');
			var name	 = xml.evalXPath(list[i], 'name');
			var opt = document.createElement('option');
			opt.text  = name;
			opt.value = id;
			if (list.length == 1) opt.selected = true;
			$('group').options.add(opt);
		}
	}

	function addGroupsCallback_OK(xmlRes) {
		if (xmlRes.nodeName == 'error') {
			ker.showError('Cannot retrieve groups', xmlRes);
			$('group').options.length = 0; // clear out the options
			$('group').value = ''; 
			var user = $('user'); 
			for (i=0;i<user.options.length;i++) {
				user.options[i].selected = false;
			}
		} else {
			addGroups(xmlRes);
		}
	}
	
	function doGroups(userid) {
		var request = ker.createRequest('id',userid);
		ker.send('xml.usergroups.list', request, addGroupsCallback_OK);
	}

/*** EOF ***********************************************************/

