Skip to content
Snippets Groups Projects
frontpage.js 26.74 KiB
/*
 * Copyright (c) 2018 NIBIO <http://www.nibio.no/>. 
 * 
 * This file is part of VIPSWeb.
 * VIPSWeb is free software: you can redistribute it and/or modify
 * it under the terms of the NIBIO Open Source License as published by 
 * NIBIO, either version 1 of the License, or (at your option) any
 * later version.
 * 
 * VIPSWeb is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * NIBIO Open Source License for more details.
 * 
 * You should have received a copy of the NIBIO Open Source License
 * along with VIPSWeb.  If not, see <http://www.nibio.no/licenses/>.
 * 
 */

/**
 * Interactive stuff on the VIPSWeb front page. Code for
 * map is found in ./frontpagemap.js 
 * 
 * Depending on /currentLanguage.js and /settings.js
 *
 * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
 */



/**
 * Which crops have been selected? Checks the form
 * @returns
 */
function getSelectedCropCategoryIds()
{
	selectedCropCategoryIds = [];
	formFields = document.getElementsByName("cropCategoryIds");
	for(var i=0;i<formFields.length;i++)
	{
		if(formFields[i].checked)
		{
			selectedCropCategoryIds.push(parseInt(formFields[i].value));
		}
	}
	return selectedCropCategoryIds;
}

function getSelectedCropIds()
{
	var selectedCropCategoryIds = getSelectedCropCategoryIds();
	var selectedCropIdsTemp = [];
	for(var i in settings.cropCategories)
	{
		if(selectedCropCategoryIds.indexOf(settings.cropCategories[i]["cropCategoryId"]) >= 0)
		{
			selectedCropIdsTemp = selectedCropIdsTemp.concat(settings.cropCategories[i]["cropOrganismIds"]);
		}
	}
	// This trick ensures all elements in array are unique
	return selectedCropIdsTemp.filter(function(value,index,self){return self.indexOf(value) === index;});
}

var allObservations;
var filteredObservations;

/**
 * Downloads all the observations that the user has authorization to view
 * @returns
 */
function cacheObservations(callback)
{
	var systemTime = moment().add(settings.systemTimeOffsetMonths,"months");
    var from = systemTime.format("YYYY") + "-01-01"; // XXXX-01-01
    systemTime.add(1,'days');
    var to = systemTime.format("YYYY-MM-DD"); 
    var uuidParam = settings.userUuid != null ? "&userUUID=" + settings.userUuid : "";
	//$.getJSON(settings.vipslogicProtocol + "://" + settings.vipslogicServerName + "/rest/observation/broadcast/list/" + settings.vipsOrganizationId, function( json ) {
    $.getJSON( "/vipslogicproxy/rest/observation/list/filter/" + settings.vipsOrganizationId + "?from=" + from + "&to=" + to + uuidParam , function( json ) {
    //$.getJSON("/vipslogicproxy/rest/observation/broadcast/list/" + settings.vipsOrganizationId + "?season=" + getCurrentYear(), function( json ) {
		allObservations = json;
		//console.log(allObservations);
		filterObservations();
		renderObservationFeatures();
    });
}

/**
 * Showing only observations relevant for the selected crops
 */
function filterObservations(){
	var selectedCropIds = getSelectedCropIds();
	filteredObservations = [];
	for(var i in allObservations)
	{
		var observation = allObservations[i];
		if((selectedCropIds.indexOf(observation.cropOrganismId) >= 0 || observation.cropOrganismId == -10)
				&& observation.observationHeading.trim().length > 0)
		{
			filteredObservations.push(observation);
		}
	}
	renderObservationMessages();
}

/**
 * 
 */
function renderObservationMessages()
{
	// Sort in reverse chronological order
	filteredObservations.sort(sortObservationMessages).reverse();
	var messagesLeftColTBody = document.getElementById("messagesLeftColTBody");
	messagesLeftColTBody.innerHTML = "";
	
	var numberOfRenderedMessages = 0;
	for(var i=0;i<filteredObservations.length;i++) // Max 3 latest messages
	{
		var observation = filteredObservations[i];
		if(observation.broadcastMessage)
		{
			messagesLeftColTBody.innerHTML += '<tr>\n<td class="dateCell">' + getStandardFormattedDate(observation["timeOfObservation"]) + '</td><td><a href="/observations/' + observation["observationId"] + '">' + observation["observationHeading"] + '</a></td>\n</tr>';
			numberOfRenderedMessages++;
			if(numberOfRenderedMessages >= 3)
			{
				break;
			}
		}
		
	}
}

var allMessages;
var filteredMessages;

/**
 * Loads messages and caches them
 */
function cacheMessages()
{
	$.getJSON( "/messages/by_tag/json?messageTagIds=" + settings.frontpageMessageTagIds.join(","), function( json ) {
			allMessages = json;
			filterMessages();
		}
	);
}

/**
 * Rendering the contents of filteredMessages
 */
function renderMessages()
{
	// Sorting in reverse chronological order
	filteredMessages.sort(sortMessages).reverse();
	
	var messagesRightColTBody = document.getElementById("messagesRightColTBody");
	messagesRightColTBody.innerHTML = "";
	
	for(var i=0;i<Math.min(3,filteredMessages.length);i++) // Max 4 latest messages
	{
		var message = filteredMessages[i];
		
		messagesRightColTBody.innerHTML += '<tr>\n<td class="dateCell">' + message["datePub"] + '</td><td><a href="/messages/' + message["messageId"] + '">' + getMessageLocale(message, settings.currentLanguage,settings.languageCode)["heading"] + '</a></td>\n</tr>';
	}
}



/**
 * Filtering on the crops that the messages are attached to. If no crop ids are attached, 
 * the message is considered universally interesting and is always included
 */
function filterMessages()
{
	var selectedCropCategoryIds = getSelectedCropCategoryIds();
	filteredMessages = [];
	for(var tagI in allMessages)
	{
		//console.log(allMessages[tagI]);
		var filteredForTag = [];
		for(var mI in allMessages[tagI])
		{
			var message = allMessages[tagI][mI];
			var cropCategoryIds = message["cropCategoryIds"];
			if(cropCategoryIds.length == 0)
			{
				//filteredForTag.push(message);
				filteredMessages.push(message);
			}
			else
			{
				for(var cci in cropCategoryIds)
				{
					if(selectedCropCategoryIds.indexOf(cropCategoryIds[cci]) >= 0)
					{
						filteredMessages.push(message);
						break; // Should only be added once!
					}
					
				}
			}
		}
		//filteredMessages[tagI] = filteredForTag;
	}
	renderMessages();
}

/**
 * Tries to deliver the most relevant language version for a message
 * Priority is as such: firstLang, secondLang, English, first translation in collection
 * @param theMessage Message object
 * @param firstLang Two-letter language code
 * @param secondLang Two-letter language code
 * @returns
 */
function getMessageLocale(theMessage, firstLang, secondLang)
{
	var retValPri1, retValPri2, retValPri3, retValPri4;
	for(var i in theMessage["messageLocaleSet"])
	{
		var messageLocale = theMessage["messageLocaleSet"][i];
		if(retValPri4 == null)
		{
			retValPri4 = messageLocale;
		}
		if(messageLocale["messageLocalePK"]["locale"] == firstLang)
		{
			retValPri1 = messageLocale;
		}
		if(messageLocale["messageLocalePK"]["locale"] == secondLang)
		{
			retValPri2 = messageLocale;
		}
		if(messageLocale["messageLocalePK"]["locale"] == "en")
		{
			retValPri3 = messageLocale;
		}
	}
	return retValPri1 != null ? retValPri1:
				retValPri2 != null ? retValPri2:
					retValPri2 != null ? retValPri3:
						retValPri4;
}

/**
 * Converts JSON data of forecast configurations into HTML and 
 * renders it to the table with id="forecastSummariesTable"
 * 
 * @param forecastConfigurations
 */
function renderForecastConfigurationSummaries(forecastConfigurations)
{
	document.getElementById("forecastConfigurationSummarySortByForm").style.display =
		forecastConfigurations.length == 0 ? "none" : "block";
	//systemTime = getSystemTime();
	//console.log(systemTime.format());
	var forecastSummariesTable = document.getElementById("forecastSummariesTable");
	var summariesHTML = getforecastSummariesTableHTML(forecastConfigurations);
	forecastSummariesTable.innerHTML = summariesHTML;
	forecastSummariesTable.style.display="block";
	//document.getElementById("emptyForecastSummariesTableInfo").style.display="none";
	
}

/**
 * 
 */
function renderMyForecastConfigurationSummaries()
{
	var myForecastConfigurationIds = getLocalSettings(["myForecastConfigurationIds"], true) != null ?
			getIntArrayFromCsvString(getLocalSettings(["myForecastConfigurationIds"], true)["myForecastConfigurationIds"])
			:[];
	var myForecastSummariesTable = document.getElementById("myForecastSummariesTable");
	var myForecastSummariesContainer = document.getElementById("myForecastSummariesContainer");
	//console.log(myForecastConfigurationIds);	
	if(myForecastConfigurationIds.length == 0 && cachedPrivateForecastSummaries.length == 0)
	{
		$(myForecastSummariesContainer).hide(1000);
		myForecastSummariesTable.innerHTML = "";
		//myForecastSummariesContainer.style.display = "none";
		return;
	}
	var myForecastConfigurations = [];
	
	//console.log(myForecastConfigurationIds );
	for(var i in cachedPrivateForecastSummaries)
	{
		var forecastConfiguration = cachedPrivateForecastSummaries[i];
		//console.log(forecastConfiguration.forecastConfigurationId);
		myForecastConfigurations.push(forecastConfiguration);
	}
	
	for(var i in cachedForecastSummaries)
	{
		var forecastConfiguration = cachedForecastSummaries[i];
		//console.log(forecastConfiguration.forecastConfigurationId);
		if(myForecastConfigurationIds.indexOf(forecastConfiguration.forecastConfigurationId) >= 0)
		{
			myForecastConfigurations.push(forecastConfiguration);
		}
	}
	
	if(myForecastConfigurations.length == 0)
	{
		$(myForecastSummariesContainer).hide(1000);
		myForecastSummariesTable.innerHTML = "";
		//myForecastSummariesContainer.style.display = "none";
		return;
	}
	
	var mySummariesHTML = getforecastSummariesTableHTML(myForecastConfigurations,false, true);
	myForecastSummariesTable.innerHTML = mySummariesHTML;
	//document.getElementById("myForecastSummariesContainer").style.display = "block";
	myForecastSummariesTable.style.display = "block";
	$(myForecastSummariesContainer).show(1000);
	
}


/**
 * 
 * @param forecastConfigurations
 * @param excludePoiName set to true if you don't want the location's name in the heading
 * @returns
 */
function getforecastSummariesTableHTML(forecastConfigurations, excludePoiName, isFavouritesList)
{
	isFavouritesList = typeof isFavouritesList !== 'undefined' ? isFavouritesList : false;
	var summariesHTML = [];
	for(var i in forecastConfigurations)
	{
		var forecastConfiguration = forecastConfigurations[i];
		/*
		console.log("ModelId=" + forecastConfiguration.modelId);
		console.log("forecastConfigurationId=" + forecastConfiguration.forecastConfigurationId);
		console.log("wsId=" + forecastConfiguration.weatherStationPointOfInterestId.pointOfInterestId);
		console.log("date=" + forecastConfiguration.forecastSummaries[0].forecastSummaryPK.summaryForDate);
		*/
		// TODO: Get correct headline
		summariesHTML.push("<tbody class=\"forecastSummaryRowGroup\">");
		summariesHTML.push("<tr><td colspan=\"7\">");
		if(!excludePoiName)
		{
			summariesHTML.push(forecastConfiguration.locationPointOfInterestId.name);
		}
		if(forecastConfiguration.weatherStationPointOfInterestId.name !== forecastConfiguration.locationPointOfInterestId.name)
		{
			summariesHTML.push(" <em>" + forecastConfiguration.weatherStationPointOfInterestId.name + "</em>");
		}
		summariesHTML.push((excludePoiName ? "" : ", ") + getLocalizedOrganismName(forecastConfiguration.cropOrganismId));
		summariesHTML.push(", " + getLocalizedOrganismName(forecastConfiguration.pestOrganismId));
		summariesHTML.push(", <a href='/forecasts/models/" + forecastConfiguration.modelId + "' target='new'>" + modelLocalNames[forecastConfiguration.modelId] + "</a>");
		//summariesHTML.push(" <button type=\"button\" onclick='" + (isFavouritesList ? "removeFrom" : "addTo") + "MyForecastConfigurations(" + forecastConfiguration.forecastConfigurationId + ");'><img src='/static/css/icons/" + (isFavouritesList ? "remove_from" : "add_to") + "_favourites.png' alt='" + (isFavouritesList ? gettext("Remove from my favourites") : gettext("Add to my favourites")) + "'/></button>");
		if(!forecastConfiguration.isPrivate)
		{
			summariesHTML.push(" <span onclick='" + (isFavouritesList ? "removeFrom" : "addTo") + "MyForecastConfigurations(" + forecastConfiguration.forecastConfigurationId + ");' class=\"" + (isFavouritesList ? "fa fa-minus-circle favouriteToggle" : "fa fa-star favouriteToggle") + "\" title=\"" + (isFavouritesList ?  gettext("Remove from my forecasts") : gettext("Add to my forecasts")) + "\"></span>")
		}
		else
		{
			summariesHTML.push(" <span title='Private' class='fa fa-lock'></span>");
		}
		summariesHTML.push("</td></tr>");
		
		// Get correct list of summaries
		var twoDaysAgo = getSystemTime().subtract(2,"days");
		var fourDaysAhead = getSystemTime().add(4,"days");
		
		var forecastSummaries = getSortedAndFilteredForecastSummaries(forecastConfiguration.forecastSummaries,twoDaysAgo,fourDaysAhead);
		
		// Row with symbols and colors
		summariesHTML.push("<tr onclick=\"viewForecastResults(" + forecastConfiguration.forecastConfigurationId + ")\">");
		for(var j in forecastSummaries)
		{
			var summary = forecastSummaries[j];
			var statusText = getLocalizedStatusText(summary.warningStatus);
			summariesHTML.push("<td class=\"forecastStatus s" + summary.warningStatus + "\" title=\"" + statusText + "\"></td>");
		}
		summariesHTML.push("</tr>");
		// Row with dates
		summariesHTML.push("<tr class=\"forecastSummaryDateRow\" onclick=\"viewForecastResults(" + forecastConfiguration.forecastConfigurationId + ")\">");
		for(var j in forecastSummaries)	
		{
			var summary = forecastSummaries[j];
			var summaryDate = moment(summary.forecastSummaryPK.summaryForDate);
			summariesHTML.push(
					"<td class=\"" + (summaryDate.isSame(getSystemTime(),"day") ? "forecastSummaryCellToday":"") + "\">"
					+ summaryDate.format("MM-DD")
					+ "</td>"
			);
		}
		summariesHTML.push("</tr></tbody>");
	}
	return summariesHTML.join("");
}

/**
 * Picks the correct summaries, fills in empty ones where missing, sorts by date ascending
 * @param allForecastSummaries
 * @param firstDay
 * @param lastDay
 * @returns array of the selected summaries
 */
function getSortedAndFilteredForecastSummaries(allForecastSummaries,firstDay,lastDay)
{
	/*console.log(firstDay.format() + "-" + lastDay.format());
	console.log("Difference: " + lastDay.diff(firstDay,"days"));
	console.log(allForecastSummaries.length);*/
	var retVal = Array();
	// Filtering first
	for(var i in allForecastSummaries)
	{
		var summary = allForecastSummaries[i]
		var summaryDate = moment(summary.forecastSummaryPK.summaryForDate);
		if(
				summaryDate.isSame(firstDay,"day")
				|| summaryDate.isSame(lastDay,"day")
				|| (summaryDate.isAfter(firstDay,"day") && summaryDate.isBefore(lastDay,"day"))
		)
		{
			retVal.push(summary);
		}
	}
	// Check for missing dates
	if(retVal.length < lastDay.diff(firstDay,"days") + 1)
	{
		// Find the missing date(s)
		var currentDate = firstDay.clone();
		while(currentDate.isBefore(lastDay) || currentDate.isSame(lastDay))
		{
			var dateFound = false;
			for(var i in retVal)
			{
				if(moment(retVal[i].forecastSummaryPK.summaryForDate).isSame(currentDate,"day"))
				{
					dateFound = true;
				}
			}
			if(!dateFound)
			{
				var emptySummary = {
						"forecastSummaryPK":{
							"forecastConfigurationId":0,
							"summaryForDate":currentDate.format("YYYY-MM-DD")},
						"summaryCreatedTime":0,
						"warningStatus":0
						};
				retVal.push(emptySummary);
			}
			currentDate.add(1,"days");
		}
	}
	// Sorting
	retVal.sort(sortForecastSummaries);
	return retVal;
}


/**
 * Sorting forecast summaries chronologically
 */
var sortForecastSummaries = function(a,b){
	var momentA = moment(a.forecastSummaryPK.summaryForDate);
	var momentB = moment(b.forecastSummaryPK.summaryForDate);
	if(momentA.isBefore(momentB))
	{
		return -1;
	}
	if(momentA.isSame(momentB))
	{
		return 0;
	};
	return 1;
}





/**
 * Returns the localized status message
 * @param warningStatus
 * @returns String
 */
function getLocalizedStatusText(warningStatus) 
{
	switch(warningStatus)
	{
		case 0:
			return gettext("No forecast available");
		case 1:
			return gettext("Missing data");
		case 2:
			return gettext("No risk of infection");
		case 3:
			return gettext("Medium risk of infection");
		case 4:
			return gettext("High risk of infection");
		default:
			return gettext("Invalid forecast status");
	}
}




/**
 * Navigation to details page for forecast results
 * @param forecastConfigurationId
 */
function viewForecastResults(forecastConfigurationId)
{
	window.location.href="/forecasts/" + forecastConfigurationId;
}

/**
 * Refreshes forecast lists based on selected crops
 */
function refreshForecasts()
{
	updateForecastLayers();
	updateForecastSummaries();
	
}

// The globally available caching of forecast summaries
var cachedForecastSummaries = [];
// The globally available caching of private forecast summaries
var cachedPrivateForecastSummaries = [];
//The globally available caching of poi info
var cachedPois;

/**
 * Retrieves all the forecast summaries for further filtering
 * by JavaScript
 */
function cacheForecastSummaries()
{
	//$.getJSON(settings.vipslogicProtocol + "://" + settings.vipslogicServerName + "/rest/forecastconfigurationsummaries/" + settings.vipsOrganizationId, function( json ) {
	$.getJSON( "/vipslogicproxy/rest/forecastconfigurationsummaries/" + settings.vipsOrganizationId + "?foo=bar" + (settings.userUuid != null ? "&userUuid=" + settings.userUuid : "")
			+ (settings.includeOrganizationIds != null ? "&includeOrganizationIds=" + settings.includeOrganizationIds.join(",") : ""), function( json ) {
		  cachedForecastSummaries = json;
		  cachePrivateForecastSummaries();
		  
		  });
	
}

/**
 * If user is logged in, this function fetches the private forecast summaries, if any
 */
function cachePrivateForecastSummaries()
{
	if(settings.userUuid != null)
    {
		//$.getJSON(settings.vipslogicProtocol + "://" + settings.vipslogicServerName + "/rest/forecastconfigurationsummaries/private/" + settings.userUuid , function( json ) {
		$.getJSON( "/vipslogicproxy/rest/forecastconfigurationsummaries/private/" + settings.userUuid)
		.done(function( json ) {
			 cachedPrivateForecastSummaries = json;
			 updateForecastSummariesHeading(cachedForecastSummaries.length);
			 updateForecastSummaries();
		});
    }
	else
	{
		updateForecastSummariesHeading(cachedForecastSummaries.length);
		updateForecastSummaries();
	}
}

/**
 * Collects and caches points of interest
 */
function cachePois()
{
	//$.getJSON(settings.vipslogicProtocol + "://" + settings.vipslogicServerName + "/rest/poi/organization/" + settings.vipsOrganizationId, function( json ) {
	$.getJSON( "/vipslogicproxy/rest/poi/organization/" + settings.vipsOrganizationId, function( json ) {
		  cachedPois = json;
		  });
}

/**
 * 
 * @param numberOfForecastSummaries
 */
function updateForecastSummariesHeading(numberOfForecastSummaries)
{
	document.getElementById("numberOfForecastSummaries").innerHTML=numberOfForecastSummaries;
}

/**
 *  Updates forecast summary list based on map and crop selection inputs
 *  Distributes forecast in general list (based on crop/geo selection) and favourites
 *  (all favourites are always visible). If a forecast summary is in the favourites list,
 *  it is never displayed in the general list.
 */
function updateForecastSummaries()
{
	currentMapZoomlevel = getCurrentMapZoomLevel();
	// Display forecasts when zoom level is closer than default, and from there on
	//console.log(mapZoomlevel + "<=" + settings.mapZoomlevel + " ? " + (mapZoomlevel <= settings.mapZoomlevel));
	//console.log("tableDisplay=" + getElementComputedDisplay(document.getElementById("forecastSummariesTable")));
	/*if(currentMapZoomlevel <= settings.mapZoomlevel && getElementComputedDisplay(document.getElementById("forecastSummariesTable")) == "none")
	{
		return;
	}*/
	
	
	
	var myForecastConfigurationIds = getLocalSettings(["myForecastConfigurationIds"], true) != null ?
			getIntArrayFromCsvString(getLocalSettings(["myForecastConfigurationIds"], true)["myForecastConfigurationIds"])
			:[];

	// Iterate all forecast summaries, filter by crop (must be among the selected crops)
	// and location on the map (must be visible on the map) 
	var selectedCropIds = getSelectedCropIds();
	var filteredForecastSummaries = [];
	for(var i in cachedForecastSummaries)
	{
		var forecastSummary = cachedForecastSummaries[i];
		// Filter by crop
		if(forecastSummary.cropOrganismId == null || selectedCropIds.indexOf(forecastSummary.cropOrganismId.organismId) < 0)
		{
			continue;
		}
		// Filter by map visibility and NOT in favourites list
		var coordinate = [
		                  forecastSummary.locationPointOfInterestId.longitude,
		                  forecastSummary.locationPointOfInterestId.latitude
		                  ];
		if(isCoordinateOnVisibleMap(coordinate,'EPSG:4326') && myForecastConfigurationIds.indexOf(forecastSummary.forecastConfigurationId) < 0)
		{
			filteredForecastSummaries.push(forecastSummary);
		}
	}
	
	// Sort the summaries according to preferences
	filteredForecastSummaries.sort(sortForecastSummaryList);
	renderMyForecastConfigurationSummaries();
	
	updateForecastSummariesHeading(filteredForecastSummaries.length);
	
	/*
	 * Assuming this is not necessary as the user's selections are remembered from session to session
	if(currentMapZoomlevel <= settings.mapZoomlevel && getElementComputedDisplay(document.getElementById("forecastSummariesTable")) == "none")
	{
		return;
	}*/
	
	renderForecastConfigurationSummaries(filteredForecastSummaries);
	
}

function getOrganismIdsForCropCategory(cropCategoryId)
{
	for(var i in settings.cropCategories)
	{
		if(settings.cropCategories[i]["crop_group_id"] == cropCategoryId)
		{
			return settings.cropCategories[i]["crop_ids"];
		}
	}
	return [];
}

/**
 * Array sort function. Use like this: forecastConfigurationList.sort(sortForecastSummaryList);
 * Checks which criterion is selected, sorts accordingly
 */
var sortForecastSummaryList = function(a,b){
	
	var sortByRadioGroup = document.getElementsByName("sortBy");
	var sortCriterion = null;
	for(var i in sortByRadioGroup)
	{
		if(sortByRadioGroup[i].checked)
		{
			sortCriterion = sortByRadioGroup[i].value; 
			break;
		}
	}
	
	//console.log("sortCriterion=" + sortCriterion);
	var retVal = 0;
	if(sortCriterion == "weatherStationName")
	{
		retVal = compareStrings(a.weatherStationPointOfInterestId.name, b.weatherStationPointOfInterestId.name);
	}
	else if(sortCriterion == "pestOrganismId")
	{
		retVal = compareStrings(getLocalizedOrganismName(a.pestOrganismId),getLocalizedOrganismName(b.pestOrganismId));
	}
	else if(sortCriterion == "modelId")
	{
		retVal = compareStrings(modelLocalNames[a.modelId],modelLocalNames[b.modelId]);
	}
	//console.log(retVal);
	return retVal;
}

/**
 * Which forecast summaries are attached to this location?
 * @param poiId
 * @returns {Array}
 */
function getForecastSummariesForPoi(poiId)
{
	var retVal = [];
	var selectedCropIds = getSelectedCropIds();
	var allForecastSummaries = cachedForecastSummaries.concat(cachedPrivateForecastSummaries);
	for(var i in allForecastSummaries)
	{
		var forecastSummary = allForecastSummaries[i];
		if(forecastSummary.cropOrganismId == null || selectedCropIds.indexOf(forecastSummary.cropOrganismId.organismId) < 0)
		{
			continue;
		}
		if(forecastSummary.locationPointOfInterestId.pointOfInterestId == poiId)
		{
			retVal.push(forecastSummary);
		}
		//console.log(forecastSummary);
	}
	return retVal;
}

/**
 * Are there external resources connected to the location. E.g. RIMPro forecasts?
 * @param poiId
 * @returns
 */
function getExternalResourcesForPoi(poiId)
{
	for(var i in cachedPois)
	{
		var poi = cachedPois[i];
		if(poi.pointOfInterestId == poiId)
		{
			return poi.pointOfInterestExternalResourceSet;
		}
	}
	return null;
}

/**
 * Persisting the selected crop Ids locally
 * TODO: If user logged in, store in user session on server for
 * global access on clients where the user is logged in
 */
function storeSelectedCropCategoryIds()
{
	storeLocalSettings({"selectedCropCategoryIds":getSelectedCropCategoryIds()});
}

function restoreSelectedMapLayer()
{
	var selectedMapLayer = getLocalSettings(["selectedMapLayer"]) != null ? getLocalSettings(["selectedMapLayer"])["selectedMapLayer"] : FORECAST_LAYER;
	//console.info("selectedMapLayer=" + selectedMapLayer);
	//console.info(selectedMapLayer);
	document.getElementById("radioForecastLayer").checked = selectedMapLayer == FORECAST_LAYER;
	document.getElementById("radioObservationLayer").checked = selectedMapLayer == OBSERVATION_LAYER;
}

function getSelectedMapLayer()
{
	// Check if preselection has been done
	//console.info((document.getElementById("radioForecastLayer").checked & document.getElementById("radioForecastLayer").checked));
	if(!(document.getElementById("radioForecastLayer").checked & document.getElementById("radioForecastLayer").checked))
	{
		restoreSelectedMapLayer();
	}

	return document.getElementById("radioForecastLayer").checked ? FORECAST_LAYER : OBSERVATION_LAYER;
}

function storeSelectedMapLayer(layerId)
{
	storeLocalSettings({"selectedMapLayer":layerId});
}

/**
 * Getting selected crop Ids from persistence layer
 * TODO: Add server as persistence layer when login system is
 * implemented
 */
function restoreSelectedCropCategoryIds()
{
	// localStorage only stores strings, so we must recreate as array
	var selectedCropCategoryIds = getLocalSettings(["selectedCropCategoryIds"]) != null ?
							getLocalSettings(["selectedCropCategoryIds"])["selectedCropCategoryIds"].split(",")
							: null;
	if(selectedCropCategoryIds != null)
	{
		// Loop through existing crops, set as checked/unchecked
		// Since this is an HTMLCollection, we must do some magic
		formFields = [].slice.call(document.getElementsByName("cropCategoryIds"));
		
		for(i in formFields)
		{
			if(formFields[i].value == undefined)
			{
				continue;
			}
			var previouslySelected = false;
			for(var j in selectedCropCategoryIds)
			{

				// Need to use eval() as values are strings with [] representing arrays
				if(parseInt(formFields[i].value) == parseInt(selectedCropCategoryIds[j]))
				{
					previouslySelected = true;
				}
			}
			formFields[i].checked = previouslySelected;
		}
	}
}

function addToMyForecastConfigurations(forecastConfigurationId)
{
	var myForecastConfigurationIds = getLocalSettings(["myForecastConfigurationIds"], true) != null ?
			getIntArrayFromCsvString(getLocalSettings(["myForecastConfigurationIds"], true)["myForecastConfigurationIds"])
			:[];
	myForecastConfigurationIds.push(forecastConfigurationId);
	storeLocalSettings({"myForecastConfigurationIds":myForecastConfigurationIds});
	updateForecastSummaries();
}

function removeFromMyForecastConfigurations(forecastConfigurationId)
{
	var myForecastConfigurationIds = getLocalSettings(["myForecastConfigurationIds"], true) != null ?
			getIntArrayFromCsvString(getLocalSettings(["myForecastConfigurationIds"], true)["myForecastConfigurationIds"])
			:[];
	var spliceIndex = myForecastConfigurationIds.indexOf(forecastConfigurationId);
	if(spliceIndex >= 0)
	{
		myForecastConfigurationIds.splice(spliceIndex,1);
	}
	storeLocalSettings({"myForecastConfigurationIds":myForecastConfigurationIds});
	updateForecastSummaries();
}

function handleSortByClick()
{
	updateForecastSummaries();
}