/********************************************************************
* 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
*
********************************************************************/

/**********************************************************
***
***		SIMPLE SEARCH
***
**********************************************************/

function initSimpleSearch() {
        // heikki doeleman for GeoNovum	
	initCalendars();
}

function gn_anyKeyObserver(e)
{
	if(e.keyCode == Event.KEY_RETURN && !jQuery.browser.msie)
		runSimpleSearch();
}

/*  */
function runPdfSearch() {
    if (document.cookie.indexOf("search=advanced")!=-1)
        runAdvancedSearch("pdf");
    else
        runSimpleSearch("pdf");
}

function runSimpleSearch(type) 
{
    if (type != "pdf")
        preparePresent();

	setSort();

	var pars = "any=" + encodeURIComponent($('any') .value);

	var region = $('region').value;

	if (!defaultExtent()) {
		pars += "&attrset=geo";
		pars += "&"+im_mm_getURLselectedbbox();
		pars += fetchParam('relation');
		if(region!="userdefined")
		{
			pars += fetchParam('region');
      	}
    }
    
	pars += fetchSlidebarParam('similarity');
	pars += fetchParam('dateFrom');
	pars += fetchParam('dateTo');

	pars += fetchParam('sortBy');
	pars += fetchParam('sortOrder');
	pars += fetchParam('hitsPerPage');
	pars += fetchParam('output');
        // heikki doeleman for GeoNovum
	pars += fetchParam('phrase');
	pars += fetchParam('all');
	pars += fetchParam('or');
	pars += fetchParam('without');
// added by heikki from advanced search.. 
      pars += fetchParam('themekey');
// added by heikki from advanced search.. 
	pars += fetchParam('siteId');
// added by Thijs Brentjens (Geonovum)
    pars += fetchParam('group');
    pars += fetchParam('type');
    pars += fetchParam('title');
    pars += fetchParam('protocol');    
	pars += fetchParam('inspireannex');
    pars += addINSPIREThemes();    
    // Thijs Brentjens (Geonovum): strange way of setting the inspire-param, but this is necessary because of the way luxene-indexing is applied for INSPIRE based on a keyword now
    var inspire = $('inspire');
    if (inspire) {
        if (inspire.checked) pars += "&inspire=true";
    }
// added by heikki
	pars += addTopics();	
    
	if (type == "pdf") {
		gn_searchpdf(pars);
	}
	else {
		// Load results via AJAX
		gn_search(pars);    
	}

}

 function setSliderValue(slider, value) {
 	if (isNaN(value)) slider.setValue(0);
 	else slider.setValue(value);
 }
 
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);
    
    $('northBL').value='90'; 
    $('southBL').value='-90';
    $('eastBL').value='180';
    $('westBL').value='-180';		


    GeoNetwork.miniapp.clearExtentBox();
    var minimap =  GeoNetwork.miniapp.getMap();
    if (minimap) {
        var pnl = Ext.getCmp('mini_mappanel');
        pnl.map.setCenter(pnl.center, pnl.zoom);
    }	

 	setParam('sortBy',      'relevance');
        setParam('sortOrder',   '');
 	setParam('hitsPerPage', '10');
 	setParam('output',      'full');

 	setParam('similarity', '0.7');
 	setSliderValue(similaritySlider, '0.7');
 	setSliderValue(paginationSlider, '1');

	setParam('title','');		
	setParam('abstract','');		
	setParam('themekey','');
	setParam('phrase', '');
	setParam('all', '');
	setParam('or', '');
	setParam('without', '');		
	setParam('dateFrom','');
	setParam('dateTo','');
	$('radfrom0').checked=true;
	//$('radfrom1').disabled='disabled';
	// Thijs Brentjens (Geonovum): reset type
	resetOrgSearchParams()
	setParam('category','');		
	setParam('siteId','');		
	setParam('protocol',    '');
	setParam('template',    'n');
	
	var keywords = document.getElementsByName('keywordinput');
	for(var i = 0; i < keywords.length; i++) {
		keywords[i].checked = false;
	}

	// Thijs (Geonovum): reset INSPIRE options
	$('inspire').checked=false;
	setParam('title','');
	setParam('inspireannex','');
	setParam('inspirebrontype','');	
	setParam('protocol','');
	setParam('orgselect_inspire','');
	
	$('inspire_GeographicalNames').checked=false;
	$('inspire_AdministrativeUnits').checked=false;
	$('inspire_Addresses').checked=false;
	$('inspire_CadastralParcels').checked=false;
	$('inspire_TransportNetworks').checked=false;
	$('inspire_Hydrography').checked=false;
	$('inspire_ProtectedSites').checked=false;
	$('inspire_Elevation').checked=false;
	$('inspire_LandCover').checked=false;
	$('inspire_Orthoimagery').checked=false;
	$('inspire_Geology').checked=false;
	$('inspire_StatisticalUnits').checked=false;
	$('inspire_Buildings').checked=false;
	$('inspire_Soil').checked=false;
	$('inspire_LandUse').checked=false;
	$('inspire_HumanHealthAndSafety').checked=false;
	$('inspire_UtilityAndGovernmentServices').checked=false;
	$('inspire_EnvironmentalMonitoringFacilities').checked=false;
	$('inspire_ProductionAndIndustrialFacilities').checked=false;
	$('inspire_AgriculturalAndAquacultureFacilities').checked=false;
	$('inspire_PopulationDistribution-Demography').checked=false;
	$('inspire_AreaManagementRestrictionRegulationZonesAndReportingUnits').checked=false;
	$('inspire_NaturalRiskZones').checked=false;
	$('inspire_AtmosphericConditions').checked=false;
	$('inspire_MeteorologicalGeographicalFeatures').checked=false;
	$('inspire_OceanographicGeographicalFeatures').checked=false;
	$('inspire_SeaRegions').checked=false;
	$('inspire_Bio-geographicalRegions').checked=false;
	$('inspire_HabitatsAndBiotopes').checked=false;
	$('inspire_SpeciesDistribution').checked=false;
	$('inspire_EnergyResources').checked=false;
	$('inspire_MineralResources').checked=false;
	$('inspire_MineralResources').checked=false;
	$('inspire_MineralResources').checked=false;	
	// End reset INSPIRE options
	
	$('farming').checked=false;
	$('biota').checked=false;
	$('boundaries').checked=false;
	$('climatology').checked=false;
	$('economy').checked=false;
	$('elevation').checked=false;
	$('environment').checked=false;
	$('geoscientific').checked=false;
	$('health').checked=false;
	$('earthcover').checked=false;
	$('military').checked=false;
	$('inlandwaters').checked=false;
	$('location').checked=false;
	$('oceans').checked=false;
	$('planning').checked=false;
	$('society').checked=false;
	$('structure').checked=false;
	$('transportation').checked=false;
	$('utilities').checked=false;

	
}

function resetOrgSearchParams() {
    // Thijs Brentjens (Geonovum): reset type
    setParam('group','');
    setParam('type','');  
}

function addTopics() {
	var allTopics = '';
	var prefix = '&topic-category=';
	if($('farming').checked) {
		var str = 'farming*' ;
		allTopics += prefix + str ;
	}
	if($('biota').checked) {
		var str = 'biota*' ;
		allTopics += prefix + str ;
	}
	if($('boundaries').checked) {
		var str = 'boundaries*' ;
		allTopics += prefix + str ;
	}
	if($('climatology').checked) {
		var str = 'climatology*' ;
		allTopics += prefix + str ;
	}
	if($('economy').checked) {
		var str = 'economy*' ;
		allTopics += prefix + str ;
	}
	if($('elevation').checked) {
		var str = 'elevation*' ;
		allTopics += prefix + str ;
	}
	if($('environment').checked) {
		var str = 'environment*' ;
		allTopics += prefix + str ;
	}
	if($('geoscientific').checked) {
		var str = 'geoscientific*' ;
		allTopics += prefix + str ;
	}
	if($('health').checked) {
		var str = 'health*' ;
		allTopics += prefix + str ;
	}
	if($('earthcover').checked) {
		var str = 'earthcover*' ;
		allTopics += prefix + str ;
	}
	if($('military').checked) {
		var str = 'military*' ;
		allTopics += prefix + str ;
	}
	if($('inlandwaters').checked) {
		var str = 'inlandwaters*' ;
		allTopics += prefix + str ;
	}
	if($('location').checked) {
		var str = 'location*' ;
		allTopics += prefix + str ;
	}
	if($('oceans').checked) {
		var str = 'oceans*' ;
		allTopics += prefix + str ;
	}
	if($('planning').checked) {
		var str = 'planning*' ;
		allTopics += prefix + str ;
	}
	if($('society').checked) {
		var str = 'society*' ;
		allTopics += prefix + str ;
	}
	if($('structure').checked) {
		var str = 'structure*' ;
		allTopics += prefix + str ;
	}
	if($('transportation').checked) {
		var str = 'transportation*' ;
		allTopics += prefix + str ;
	}
	if($('utilities').checked) {
		var str = 'utilities*' ;
		allTopics += prefix + str ;
	}
	return allTopics ;
}


// Thijs Brentjens (Geonovum): INSPIRE Themes
// 
// Mapping table for English theme names to Dutch names, used because NGR contains both English and Dutch names
// 
var inspireThemeMapping = new Array();
inspireThemeMapping["Geographical names"] 	= "Geografische namen";
inspireThemeMapping["Administrative units"] 	= "Administratieve eenheden";
inspireThemeMapping["Addresses"] 		= "Adressen";
inspireThemeMapping["Cadastral parcels"] 	= "Kadastrale percelen";
inspireThemeMapping["Transport networks"] = "Vervoersnetwerken";
inspireThemeMapping["Hydrography"] = "Hydrografie";
inspireThemeMapping["Protected sites"] = "Beschermde gebieden";
inspireThemeMapping["Geographical grid systems"] = "Geografisch rastersysteem";
inspireThemeMapping["Coordinate reference systems"] = "Systemen voor verwijzing door middel van coördinaten";
inspireThemeMapping["Elevation"] = "Hoogte";
inspireThemeMapping["Land cover"] = "Bodemgebruik";
inspireThemeMapping["Orthoimagery"] = "orthobeeldvorming";
inspireThemeMapping["Geology"] = "geologie";
inspireThemeMapping["Statistical units"] = "statistische eenheden";
inspireThemeMapping["Buildings"] = "gebouwen";
inspireThemeMapping["Soil"] = "bodem";
inspireThemeMapping["Land use"] = "landgebruik";
inspireThemeMapping["Human health and safety"] = "menselijke gezondheid en veiligheid";
inspireThemeMapping["Utility and Government services"] = "nutsdiensten en overheidsdiensten";
inspireThemeMapping["Environmental monitoring facilities"] = "milieubewakingsvoorzieningen";
inspireThemeMapping["Production and industrial facilities"] = "faciliteiten voor productie en industrie";
inspireThemeMapping["Agricultural and aquaculture facilities"] = "faciliteiten voor landbouw en aquacultuur";
inspireThemeMapping["Population distribution - demography"] = "spreiding van de bevolking — demografie";
inspireThemeMapping["Area management/restriction/regulation zones and reporting units"] = "gebiedsbeheer, gebieden waar beperkingen gelden, gereguleerde gebieden en rapportage-eenheden";
inspireThemeMapping["Natural risk zones"] = "gebieden met natuurrisico's";
inspireThemeMapping["Atmospheric conditions"] = "atmosferische omstandigheden";
inspireThemeMapping["Meteorological geographical features"] = "meteorologische geografische kenmerken";
inspireThemeMapping["Oceanographic geographical features"] = "oceanografische geografische kenmerken";
inspireThemeMapping["Sea regions"] = "zeegebieden";
inspireThemeMapping["Bio-geographical regions"] = "biogeografische gebieden";
inspireThemeMapping["Habitats and biotopes"] = "habitats en biotopen";
inspireThemeMapping["Species distribution"] = "spreiding van soorten";
inspireThemeMapping["Energy resources"] ="energiebronnen";
inspireThemeMapping["Mineral resources"] = "minerale bronnen";

function addINSPIREThemes() {
	var allThemes = '';
	var prefix = '&inspiretheme=';
    // Select all checkboxes in inspirethemesdiv
    var inspireThemeChk = $$('#inspirethemesdiv input[type="checkbox"]');
    // console.log(inspireThemeChk.length);
    for (i=0;i<inspireThemeChk.length;i++) {
        if (inspireThemeChk[i].checked) {
            allThemes += prefix + encodeURIComponent(inspireThemeChk[i].value+"*");
	    // also add the Dutch name, using the themeMapping
	    var dutchTheme = inspireThemeMapping[inspireThemeChk[i].value];
	    if (dutchTheme!=undefined) {
		allThemes += prefix + encodeURIComponent(dutchTheme+"*");
	    }
        }    
    }    
	return allThemes ;
}

function openSearch(s)
{
	if( ! Prototype.Browser.IE )
	{
		Effect.BlindDown(s);
	}
	else
	{    
		$(s).show();		    
	}
}

function closeSearch(s)
{
	clearNode('im_mm_map');

	if( ! Prototype.Browser.IE )
	{
		Effect.BlindUp($(s), {afterFinish: function(){ clearNode($(s)); } });
	}
	else
	{    
		$(s).hide();	
		clearNode($(s))	    
	}
}

/**********************************************************
***
***		ADVANCED SEARCH
***
**********************************************************/

function initAdvancedSearch()
{
	im_mm_init();

	new Ajax.Autocompleter('themekey', 'keywordList', 'portal.search.keywords?',{paramName: 'keyword', updateElement : addQuote});
        // heikki doeleman for GeoNovum
	initCalendars();

}
function initCalendars() {
	Calendar.setup({
		inputField     :    "dateFrom",     // id of the input field
        // heikki doeleman for GeoNovum
		ifFormat       :    "%Y-%m-%d",      // format of the input field
		button         :    "from_trigger_c",  // trigger for the calendar (button ID)
        // heikki doeleman for GeoNovum
		showsTime	   :	  false,
		align          :    "Tl",           // alignment (defaults to "Bl")
		singleClick    :    true
	});
	
	Calendar.setup({
		inputField	:    "dateTo",     // id of the input field
        // heikki doeleman for GeoNovum
		ifFormat	:    "%Y-%m-%d",      // format of the input field           
		button		:    "to_trigger_c",  // trigger for the calendar (button ID)
        // heikki doeleman for GeoNovum
		showsTime	:    false,
		align		:    "Tl",           // alignment (defaults to "Bl")
		singleClick	:    true
	});

}

function runAdvancedSearch(type) 
{
    if (type != "pdf")
	   preparePresent();

	setSort();

	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 += fetchSlidebarParam('similarity');

	var region = $('region').value;
	if(region!="") 
  {
		pars += "&attrset=geo";
		pars += "&"+im_mm_getURLselectedbbox();
		pars += fetchParam('relation');
		if(region!="userdefined")
		{
		pars += fetchParam('region');
	}
	}

	if($('radfrom1').checked)
	{
		pars += fetchParam('dateFrom');
		pars += fetchParam('dateTo');
	}

	pars += fetchParam('group');
	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 += fetchParam('inspireannex');
    // Thijs Brentjens (Geonovum): strange way of setting the inspire-param, but this is necessary because of the way luxene-indexing is applied for INSPIRE based on a keyword now
    var inspire = $('inspire');
    if (inspire) {
        if (inspire.checked) pars += "&inspire=true";
    }
    pars+=addTopics();
    // TODO: extend topics with INSPIRE THEMES?
    pars+=addINSPIREThemes();
    
    if (type == "pdf")
       gn_searchpdf(pars);
    else
	   // Load results via AJAX
	   gn_search(pars);    
}

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','');		
	setParam('similarity','1');		
	setParam('relation','overlaps');		
	setParam('region',null);		
	$('northBL').value='90';
	$('southBL').value='-90';
	$('eastBL').value='180';
	$('westBL').value='-180';
	setParam('dateFrom','');
	setParam('dateTo','');
	$('radfrom0').checked=true;
	$('radfrom1').disabled='disabled';
	setParam('group','');		
    // Thijs Brentjens (Geonovum): reset the org search params
    resetOrgSearchParams();
	setParam('category','');		
	setParam('siteId','');		
	$('digital') .checked = false;		
	$('paper')   .checked = false;		
	$('dynamic') .checked = false;
	$('download').checked = false;		
	setParam('protocol',    '');
	setParam('template',    'n');
 	setParam('sortBy',      'relevance');
 	setParam('sortOrder',   '');
 	setParam('hitsPerPage', '10');
 	setParam('output',      'full');
}

/**********************************************************
***
***		RATING
***
**********************************************************/

function showOptions()
{
	var img = $('options.img');
	var src = img.getAttribute('src');
	var ndx = src.lastIndexOf('/');
	var div = $('options.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()
{
	Element.show('sorting.image');	
	$('sortBy').value = $F('sortBy.live');
	setSort();
	runSimpleSearch();
}
function setSelectSortAndSearch()
{
	Element.show('sorting.image');	
	$('sortBySelect').value = $F('sortBySelect.live');
	var pars = "sortBySelect=" + encodeURIComponent($('sortBySelect').value);
	// Load results via AJAX
	gn_select(pars);
}

//-------------------------------------------------------------------

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));

	if(pos[0]) {
		ratingPopup.style.left = pos[0] -100;
	}
	if(pos[1]) {
		ratingPopup.style.top  = pos[1] +16;
	}
	ratingPopup.style.width = '300px';
	ratingPopup.style.backgroundColor = 'white';	

	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));
	setSortAndSearch();	
}

//-------------------------------------------------------------------

function rateMetadata_OK(xmlRes)
{
	if (xmlRes.nodeName == 'error')
		ker.showError(translate('rateMetadataFailed'), 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 rrrond(e) {
                   	var NumericValue = parseFloat( e );
                   	NumericValue = NumericValue.toFixed(3);
                   	return NumericValue;
                   }

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=rrrond(northcc);
    $('southBL').value=rrrond(southcc);
    $('eastBL').value=rrrond(eastcc);
    $('westBL').value=rrrond(westcc);

    im_mm_redrawAoI();
    im_mm_zoomToAoI();
}

function getRegion_error() {
    alert(translate("error"));
}

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(translate("northSouth")); } 
  else if (nU > 90) { alert(translate("north90")); }
  else if (sU < -90) { alert(translate("south90")); }
  else if (eU < wU) { alert(translate("eastWest")); } 
  else if (eU > 180) { alert(translate("east180")); }
  else if (wU < -180) { alert(translate("west180")); }
  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";
}

/********************************************************************
*** DO THE SEARCH!
********************************************************************/

function preparePresent() 
{
    	// hide single result   
	var singleresult = $('single-search-result');
	if(singleresult != null) {
		singleresult.style.display="none";
	}

    	// hide single result full  
	var singleresult = $('geonovum-metadata');
	if(singleresult != null) {
		singleresult.style.display="none";
	}

	// Display results area
	$('loadingMD').show();
}

function gn_search(pars) 
{
	var fromdiv = $('results-from');
	if(fromdiv) {
		fromdiv.innerHTML = 1;
	}
	var todiv = $('results-to');
	if(todiv) {
		todiv.innerHTML = 10;
	}

	var myAjax = new Ajax.Request(
		getGNServiceURL('main.search.embedded'), 
		{
			method: 'get',
			parameters: pars,
			onSuccess: gn_search_complete,
			onFailure: gn_search_error
		}
	);
}

function gn_select(pars) 
{
	//alert('select: ' + getGNServiceURL('user.metadata'));
	var myAjax = new Ajax.Request(
		getGNServiceURL('user.metadata'), 
		{
			method: 'get',
			parameters: pars,
			onSuccess: gn_select_complete,
			onFailure: gn_search_error
		}
	);
}

function gn_searchpdf(pars) 
{
    pars = pars.replace(/hitsPerPage=\d{2,3}/, 'hitsPerPage=9999'); 
    // Update this value if more document required in PDF output
    // FIXME : Should be defined in service config.
    location.replace (
        getGNServiceURL('pdf.search') + "?" + pars
    );
}

function gn_present(frompage, topage) 
{
	var fromdiv = $('results-from');
	if(fromdiv) {
		fromdiv.innerHTML = frompage;
	}
	var todiv = $('results-to');
	if(todiv) {
		todiv.innerHTML = topage;
	}
	preparePresent();
	
	var pars = 'from=' + frompage + "&to=" + topage;
	
	var myAjax = new Ajax.Request(
		getGNServiceURL('main.present.embedded'), 
		{
			method: 'get',
			parameters: pars,
			onSuccess: gn_search_complete,
			onFailure: gn_search_error
		}
	);
}

function gn_select_complete(req) {
       Element.hide('sorting.image');
    	// add results to resultlist and show it    
	var rlist = $('geonovum-container');
      rlist.innerHTML = req.responseText;
	Effect.BlindDown(rlist);
}

/**
 * Hides search form and shows search results.
 */
function gn_search_complete(req) {
    
	// hide msg displayed during search		
	$('loadingMD').hide();

	// show results header
    	var header = $('searchresults-header');
	Effect.BlindDown(header);

    	// add results to resultlist and show it    
	var rlist = $('geonovum-result-list');
    rlist.innerHTML = req.responseText;
	Effect.BlindDown(rlist);
    
    	// hide searchform   
	var searchform = $('searchdiv');
	searchform.style.display="none";

    	// hide single result   
	var singleresult = $('single-search-result');
	if(singleresult != null) {
		singleresult.style.display="none";
	}
    
    	// hide single result full  
	var singleresultfull = $('geonovum-metadata');
	if(singleresultfull != null) {
		singleresultfull.style.display="none";
	}

	//$('geonovum-left').hide();
	//$('geonovum-left-legend').show();
    $('extras').hide();
    // Thijs Brentjens (Geonovum): search can be executed from organisaties as well
    // Hide these elements if the results are shown
    hideOrganisaties();

	if(jQuery.browser.msie){
		jQuery('img.ie-only').show();
	}

	var origin = $('origin');
	if(origin) {
		origin.innerHTML = 'searchresults';
	}

    var originmetadata = $('originmetadata');
    if (originmetadata) {
        originmetadata.innerHTML = "none";
    }

	scroll(0,0);
}

/********************************************************************
* 
*  Show metadata content
*
********************************************************************/
function gn_showSingleMetadataUUID(uuid)
{
//alert('a');
   var pars = 'uuid=' + uuid + '&currTab=simple';
    // heikki for Geonovum: do not show embedded page (was: gn_showSingleMet)
   gn_showSingleResultPars(pars);
}

function gn_showSingleMetadata(id)
{
   var pars = 'id=' + id + '&currTab=simple';
   gn_showSingleMet(pars);
}

function gn_showSingleMet(pars)
{
//alert('b');
    	// hide single result   
	var singleresult = $('single-search-result');
	if(singleresult != null) {
		singleresult.style.display="none";
	}
//alert('c');
    	// hide single result full  
	var singleresultfull = $('geonovum-metadata');
	if(singleresultfull != null) {
		singleresultfull.style.display="none";
	}
//alert('d');
   var myAjax = new Ajax.Request(
        getGNServiceURL('metadata.show.embedded'), 
        {
            method: 'get',
            parameters: pars,
            onSuccess: function (req) {
				//alert('e: succes');
				//alert(req.responseText);
                //var parent = $('geonovum-result-list');
				//if(!parent) {
				//	alert('not parent');
				parent = $('geonovum-main');
				//}
				//alert('parent: ' + parent + ' id ' + parent.id);
                //clearNode(parent);
				hideAllPageElements();
                // create new element
                var div = document.createElement('div');
                div.className = 'metadata_current';
                div.style.display = 'none';
                div.style.width = '100%';
				div.setAttribute("id", "single-metadata");
                parent.appendChild(div);
                
                div.innerHTML = req.responseText;
                Effect.BlindDown(div);
                
		    scroll(0,0);
                
                var tipman = new TooltipManager();
                ker.loadMan.wait(tipman);
            },
            onFailure: gn_search_error// FIXME
        });
}

function gn_showMetadata(id) 
{
    var pars = 'id=' + id + '&currTab=simple';
    gn_showMetadataPars(pars);
}

function gn_showMetadataPars(pars) {
	var origin = $('origin');
	if(origin) {
		origin = origin.innerHTML;
	}
	else {
		origin = 'mainpage';
	}
	pars += '&origin='+origin;	var myAjax = new Ajax.Request('/geonetwork/srv/'+Env.lang+'/main.present.single.metadata',
		{
			method: 'get',
			parameters: pars,
			onSuccess: function (req) {
				// hide results header
    				var header = $('searchresults-header');
			    	if(header) header.style.display = "none";
    
	    			// hide resultlist	
				var rlist = $('geonovum-result-list');
				if(rlist) rlist.style.display="none";
	
		    		// hide searchform   
				var searchform = $('searchdiv');
				if(searchform) searchform.style.display="none";

				// hide single result
				var singleresult = $('single-search-result');
				if(singleresult) singleresult.style.display="none";

				// hide organisatiepagina if available
				var orgpage = $('organisaties');
				if(orgpage) orgpage.style.display="none";        // don't use hideOrganisaties, since this hides the left bar as well      

				// hide organisatiepagina if available
				var adminpage = $('publiceren');
				if(adminpage) adminpage.style.display="none";  
                
				// show single metadata
				var metadata = $('geonovum-metadata');
				metadata.style.display="block";
				metadata.innerHTML = req.responseText;

				Effect.BlindDown(metadata);
scroll(0,0);

				var tipman = new TooltipManager();
				ker.loadMan.wait(tipman);
 			},
			onFailure: gn_search_error// FIXME
		});
}

function gn_showSingleResult(id) {
	var pars = 'id=' + id + '&currTab=simple';
    gn_showSingleResultPars(pars);
}
function gn_showSingleResultPars(pars) {

	var origin = $('origin');
	if(origin) {
		origin = origin.innerHTML;
	}
	else {
		origin = 'mainpage';
	}
	pars += '&origin='+origin;
	var loadingicon = $('loading-icon');
	if(loadingicon != null) {
		loadingicon.style.display="block";
	}
	$('originmetadata').innerHTML = 'metatada|' + id;
	var myAjax = new Ajax.Request('/geonetwork/srv/'+Env.lang+'/main.present.single.result', {
		method: 'get',
		parameters: pars,
		onSuccess: function (req) {
			// hide results header
			var header = $('searchresults-header');
			header.style.display = "none";
                
			var resultlist = $('geonovum-result-list');
			if(resultlist != null) {
				resultlist.style.display="none";	
			} 
                
			// hide single result   
			var singleresult = $('single-search-result');
			if(singleresult != null) {
				singleresult.style.display="none";
			}
                
			// hide single result full  
			var singleresultfull = $('geonovum-metadata');
			if(singleresultfull != null) {
				singleresultfull.style.display="none";
			}

			if(loadingicon != null) {
				loadingicon.style.display="none";
			}

			// hide searchform   
			var searchform = $('searchdiv');
			searchform.style.display="none";
                
			// show single result
			var singleresult = $('single-search-result');
			singleresult.style.display="block";
			singleresult.innerHTML = req.responseText;
			Effect.BlindDown(singleresult);
                
			createMetadataTabs();
				
			var tipman = new TooltipManager();
			ker.loadMan.wait(tipman);
			scroll(0,0);
		},
		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)");
}

function gn_filteredSearch() {
	var myAjax = new Ajax.Request(
		getGNServiceURL('selection.search'), 
		{
			method: 'get',
			parameters: '',
			onSuccess: gn_search_complete,
			onFailure: gn_search_error
		}
	);
}

/**********************************************************
***
***		STUFF FOR CATEGORY SEARCH
***
**********************************************************/

function runCategorySearch(category) 
{
	preparePresent();

    var pars = "category=" + category;	
	
	// Load results via AJAX
	gn_search(pars);    
}


/**********************************************************
*** Search helper functions
**********************************************************/

function fetchParam(p)
{
  var pL = $(p);
  if (!pL) 
    return "";
  else {
  	var t = pL.value;
  	if(t)
  		return "&"+p+"="+encodeURIComponent(t);
  	else 
  		return "";
	}
}
function fetchSlidebarParam(p)
{
  var pL = $(p);
  if (!pL) 
    return "";
  else {
  	var t = pL.value;
  	return "&"+p+"="+encodeURIComponent(t);
  }
}

function fetchBoolParam(p)
{
  var pL = $(p);
  if (!pL) 
    return "";
  else {
  	if(pL.checked )
  		return "&"+p+"=on";
  	else 
  		return "&"+p+"=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;
}

/**********************************************************
*** Keywords
**********************************************************/

  var keyordsSelected = false;

  function addQuote (li){
  $("themekey").value = '"'+li.innerHTML+'"';
  }

  /**
   * Place popup according to input element position.
   * Load list of keywords
   * 
   * @param el
   * @param pop
   * @return
   */
  function popKeyword(el, pop) {
    if (pop.style.display == "block") {
        pop.style.display = "none";
        return false;
    }
    pop.style.top = el.cumulativeOffset().top + el.getHeight();
    pop.style.left = el.cumulativeOffset().left;
    pop.style.width = '250px'; //el.getWidth();
    pop.style.display = "block";
    if (!keyordsSelected) {
	new Ajax.Updater("keywordSelector","portal.search.keywords?mode=selector&keyword="+$("themekey").value);
	keyordsSelected = true;
    }
  }

  /**
   * Use this function to order keywords different than default. 
   * keywordSortBy can be name or count, keywordSortOrder can be desc or asc.
   */	
  function keywordSelectorSorted(sortBy, sortOrder) {
	new Ajax.Updater("keywordSelector","portal.search.keywords?keywordSortBy="+sortBy+"&keywordSortOrder="+sortOrder+"&mode=selector&keyword="+$("themekey").value);
	keyordsSelected = true;
  }	

  function keywordSelector() {
	if ($("keywordSelectorFrame").style.display == 'none') {
		if (!keyordsSelected) {
			new Ajax.Updater("keywordSelector","portal.search.keywords?keywordSortBy=count&keywordSortOrder=desc&mode=selector&keyword="+$("themekey").value);
			keyordsSelected = true;
		}
		$("keywordSelectorFrame").show();
	}
        else {
		$("keywordSelectorFrame").hide();
	}
  }

  var keywordSeparator = " [keywordseparator] ";
  function keywordCheck(k, check){
	k = '"'+ k + '"';
        // add the keyword to the list
	if (check){	
                // add the "or" keyword
		if ($("themekey").value != '') { 
			$("themekey").value += keywordSeparator + k;
                }
		else {
			$("themekey").value = k;
                }
	}
        // Remove that keyword
        else { 
		$("themekey").value = $("themekey").value.replace(keywordSeparator + k, '');
		$("themekey").value = $("themekey").value.replace(k, '');
		pos = $("themekey").value.indexOf(" or ");
		if (pos == 0) {
			$("themekey").value = $("themekey").value.substring (4, $("themekey").value.length);
		}
	}
  }


function setFromDate(selectedOption) {
	var from = $('dateFrom');
	var myDate=new Date();
	if(selectedOption == '1-day') {
		myDate.setDate(myDate.getDate()-1);
	}
	if(selectedOption == '1-week') {
		myDate.setDate(myDate.getDate()-7);
	}
	if(selectedOption == '1-month') {
		myDate.setMonth(myDate.getMonth()-1);
	}
	if(selectedOption == '1-year') {
		myDate.setUTCFullYear(myDate.getUTCFullYear()-1);
	}
	if(selectedOption == '5-year') {
		myDate.setUTCFullYear(myDate.getUTCFullYear()-5);
	}
	if(selectedOption == '10-year') {
		myDate.setUTCFullYear(myDate.getUTCFullYear()-10);
	}
	if(selectedOption == '20-year') {
		myDate.setUTCFullYear(myDate.getUTCFullYear()-20);
	}
	if(selectedOption == '50-year') {
		myDate.setUTCFullYear(myDate.getUTCFullYear()-50);
	}
	var formattedDate = formatDate(myDate, "yyyy-MM-dd");
	from.value = formattedDate;
}
function setToDateToNow() {
	var to = $('dateTo');
	var myDate=new Date();
	var formattedDate = formatDate(myDate, "yyyy-MM-dd");
	to.value = formattedDate;
}

 /*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;
}

function defaultExtent() {
	if ($("northBL").value != '90') return false;
	if ($("eastBL").value != '180') return false;
	if ($("southBL").value != '-90') return false;
	if ($("westBL").value != '-180') return false;

	return true;
}

function im_mm_getURLselectedbbox()
{
	return urlizebb(
		$("northBL").value,
		$("eastBL").value,
		$("southBL").value,
		$("westBL").value);
}

/**
 * Get the URLized version of the given bbox
 * @param {int} n
 * @param {int} e
 * @param {int} s
 * @param {int} w
 * @return {String} URL
 */
 function urlizebb(n, e, s, w)
{
	return	"northBL="+n+
			"&eastBL="+e+
			"&southBL="+s+
			"&westBL="+w;
};

/********************************************************************
*
*  Show list of addable interactive maps
*
********************************************************************/

// TODO: Thijs Brentjens: document usage more extensively
// This param is used because of complexity with ilwhiteboard element name, for multiple WMS layers on metadata
// Since GN uses XSL's for serverside generation of HTML to show search result, with "hardcoded" element name for ilwhiteboard. 
//		At NGR we are using AJAX, which may result in multiple HTML elements with the same id's if we leave the id hardcoded. So we need to be able to deal with the elem for showing the WMS layer chooser more flexibly.

var _globalElemPrefix='ilwhiteboard';

/**
 * This method is called by the "Interactive map [+]" button in a displayed metadata.
 * It will display the metadata distribution info in a div .
 *
 * @param {int} id   			The Geonetwork metadata id
 * @param {String} elemPrefix	The prefix of the HTML element that will contain the results. The metadata id is added to the prefix.
 */
function gn_showInterList(id, elemPrefix, buttonPrefix)
{
    // Thijs Brentjens: added elemPrefix (optional), to make HTML element to show layerlist in flexible
    if (elemPrefix) _globalElemPrefix = elemPrefix;
    else _globalElemPrefix = 'ilwhiteboard_';

	if (!buttonPrefix) buttonPrefix ='';
	
    // Thijs Brentjens (for Geonovum): use only online options, so currTab=distribution3 instead of currTab=distribution
    var pars = 'id=' + id + "&currTab=distribution3";

    // Change button appearance
    $(buttonPrefix + 'gn_showinterlist_' + id).hide();
    $(buttonPrefix + 'gn_loadinterlist_' + id).show();

    var myAjax = new Ajax.Request(
        getGNServiceURL('metadata.show.embedded'),
        {
            method: 'get',
            parameters: pars,
            onSuccess: function (req) {
                // This is a normally invisible DIV below every MD
                var parent = $(_globalElemPrefix + id);
                clearNode(parent);
                parent.show();

                $(buttonPrefix + 'gn_loadinterlist_' + id) .hide();
                $(buttonPrefix + 'gn_hideinterlist_' + id) .show();

                // create new element
                var div = document.createElement('div');
                div.className = 'metadata_current';
                // $(div).hide();
                parent.appendChild(div);

                div.innerHTML = req.responseText;
                // WORKAROUND: don't use blinddown because it causes a styling problem in IE
				// Effect.BlindDown(div);

                var tipman = new TooltipManager();
                ker.loadMan.wait(tipman);
            },
            onFailure: gn_search_error// FIXME
        });
}

/**
 * This method is called by the "Interactive map [-]" button in a displayed metadata.
 * It will hide and delete the div displaying the metadata distribution info.
 *
 * @param {int} id   		The Geonetwork metadata id
 */
function gn_hideInterList(id, elemPrefix, buttonPrefix)
{
    // Thijs Brentjens: added elemPrefix (optional), to make HTML element to show layerlist in flexible
    if (elemPrefix) _globalElemPrefix = elemPrefix;
    else _globalElemPrefix = 'ilwhiteboard_';

	if (!buttonPrefix) buttonPrefix ='';
	
    var parent = $(_globalElemPrefix + id);
    var div = parent.firstChild;
    Effect.BlindUp(parent, { afterFinish: function (obj) {
            clearNode(parent);
            $(buttonPrefix + 'gn_showinterlist_' + id) .show();
            $(buttonPrefix + 'gn_hideinterlist_' + id) .hide();
        }
    });
}

function clearNode(node)
{
	var enode = $(node);
	while (enode.firstChild)
	{
		//alert('removing: ' + enode.firstChild + ' with id ' + enode.firstChild.id);
		enode.removeChild(enode.firstChild);
	}
}

/*
 *Check and uncheck selected metadata
 */
function check(status) {
	var checks = $('search-results-content').getElementsByTagName('INPUT');
	var checksLength = checks.length;				
	for (var i = 0; i < checksLength; i++) {
		checks[i].checked = status;
	}
}
function metadataselect(id, selected){
	if (selected===true)
		selected='add';
	else if (selected===false)
		selected='remove';
	var param = 'id='+id+'&selected='+selected;
	var http = new Ajax.Request(
		Env.locService +'/'+ 'metadata.select',
		{
			method: 'get',
			parameters: param,
			onComplete: function(originalRequest){
				// console.log('onComplete');
			},
			onLoaded: function(originalRequest){
				// console.log('onLoaded');
			},
			onSuccess: function(originalRequest){
				var xmlString = originalRequest.responseText;
				
				// convert the string to an XML object
				var xmlobject = (new DOMParser()).parseFromString(xmlString, "text/xml");
				// get the XML root item
				var root = xmlobject.getElementsByTagName('response')[0];
				var nbSelected = root.getElementsByTagName('Selected')[0].firstChild.nodeValue;
				var item = document.getElementById('nbselected');
				item.innerHTML = nbSelected;
		},
		onFailure: function(originalRequest){
			alert(translate('metadataSelectionError'));
		}
	});
	if (selected=='remove-all') {
		check(false);
	};
	if (selected=='add-all') {
		check(true);
	};
}
/*** EOF ***********************************************************/

