-
Tor-Einar Skog authoredTor-Einar Skog authored
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();
}