'use strict'
const path = require('path')
const fs = require('fs')
const mkdirp = require('mkdirp')
const jsonfile = require('jsonfile')
const LineReader = require('line-by-line')
const request = require('superagent')
const Promise = require('bluebird')
var join = Promise.join
const utils = require('../utils/utils')
const settings = require( '../system/settings' )
const remote = require('electron').remote
const dialog = remote.dialog
const rootDir = remote.getGlobal('rootDir')
const enumerations = require( '../../data/enums/enumerations' )
const interpretations = require( '../../data/enums/interpretations' )
const orders = require( '../../data/catalogs/orders' )
const imageprovider = require( '../images/imageprovider' )
const documentcache = require( '../documents/documentcache' )
const catalogcache = require( '../catalogs/catalogcache' )
const documenthandler = require( '../documents/documenthandler' )
const enums = require( '../../data/enums/enumerations' )
const dataformatter = require( '../utils/dataformatter' )
const synonyms = require( '../../data/catalogs/synonyms' )
const kuvapankki = require( '../images/kuvapankki' )
const provincestats = require( '../search/provincestats' )
const { BrowserWindow } = require('electron').remote
let currFamily
let currGenus
let currSpecies
let currOrder
let currSpeciesData
let currSpeciesName
let currSpeciesId
let treeDataCallback = null
let treeData = null
let orderOptions = null
let speciesOptions = []
let maindata = null
// ----------------------------------------------------------------------------
// showImages()
// ----------------------------------------------------------------------------
function showImages()
{
orderOptions = JSON.parse( JSON.stringify( orders.all.orderNames ) )
showTree( orderOptions, [], [], [] )
}
// ----------------------------------------------------------------------------
// showTree()
// ----------------------------------------------------------------------------
function showTree( orderOptions, treeData, observationData, companionData )
{
maindata = createData()
webix.ui({
id : 'mainbody',
padding:'10',
type: 'line',
cols:[
{ rows: [
{
view:'combo',
id:'comboOrder', name:'comboOrder',
value: '', options: orderOptions
},
{
view:'combo', id:'comboSpecies',
name:'comboSpecies',
value: '', options: speciesOptions
},
{ id:'speciestree',
view: 'tree',
width: 215,
scroll:'y',
select: true,
data: treeData
}]
},
{
body: maindata
}]
} , $$('mainbody') )
$$('comboOrder').attachEvent('onChange', value =>
{
currOrder = value
currSpeciesData = catalogcache.getSpeciesData( currOrder )
let taxons = getSpeciesComboOptions( value )
$$('comboSpecies').define( 'options', taxons )
$$('comboSpecies').refresh()
setTreeData( value, treeDataCallback )
})
$$('comboSpecies').attachEvent( 'onChange', taxon =>
{
if ( taxon !== '' )
{
if ( taxon.indexOf(',') !== -1 )
{
let parts = taxon.split(',')
taxon = parts[1] + ' ' + parts[0]
$$('comboSpecies').setValue( taxon )
}
else
{
currSpeciesName = $$('comboSpecies').getValue()
currFamily = currSpeciesData[currSpeciesName].family
currGenus = currSpeciesName.substring( 0, currSpeciesName.indexOf(' '))
currSpecies = currSpeciesName.substring( currSpeciesName.indexOf(' ')+1)
currSpeciesId = currSpeciesData[currSpeciesName].id
/*
treeData.push( {id:sData.family, value:sData.family,
data:[ {id:sData.family+'-'+genus, value:genus,
data:[ {id:sData.family+'-'+genus+'-'+species, value:species }] }] })
*/
$$("speciestree").open( currFamily + '-' + currGenus, true )
$$("speciestree").select( currFamily + '-' + currGenus + '-' + currSpecies )
showSpeciesInfo()
saveLatestTreeSelection( {
order: currOrder, treeNodeId: currFamily + '-' + currGenus + '-' + currSpecies } )
}
}
})
$$("speciestree").attachEvent("onItemClick", function ( id )
{
let treeNode = this.getItem( id )
if ( treeNode.$level === 2 )
{
let taxons = treeNode.id.split('-')
currOrder = $$('comboOrder').getValue()
currSpeciesData = catalogcache.getSpeciesData( currOrder )
currFamily = taxons[0]
currGenus = taxons[1]
currSpecies = null
showGenusInfo()
}
else if ( treeNode.$level === 3 )
{
let taxons = treeNode.id.split('-')
currFamily = taxons[0]
currGenus = taxons[1]
currSpecies = taxons[2]
currOrder = $$('comboOrder').getValue()
currSpeciesData = catalogcache.getSpeciesData( currOrder )
currSpeciesName = currGenus + ' ' + currSpecies
currSpeciesId = currSpeciesData[currSpeciesName].id
showSpeciesInfo()
saveLatestTreeSelection( { order: currOrder, treeNodeId: treeNode.id } )
}
})
$$('btnLajiFi').attachEvent("onItemClick", btnId =>
{
require('electron').shell.openExternal('https://beta.laji.fi/taxon/' + currSpeciesId )
})
$$('btnGoogle').attachEvent("onItemClick", btnId =>
{
require('electron').shell.openExternal('https://www.google.fi/search?q='
+ currGenus + '+' + currSpecies + '&site=imghp&tbm=isch&tbo=u&source=univ' )
})
$$('btnGenusKey').attachEvent("onItemClick", btnId =>
{
let mykeys = null
try
{ mykeys = require( '../../mydata/speciesdata/' + currOrder + '/detkeys' )
}
catch ( err )
{
// webix.alert( err )
}
if ( mykeys && mykeys[currGenus] && mykeys[currGenus].url !== '' )
{
let url = mykeys[currGenus].url
if ( url.startsWith( 'http' ) || url.startsWith( 'file' ) )
{
try
{
if ( mykeys[currGenus].openInBrowser )
{
require('electron').shell.openExternal( url )
}
// else if ( mykeys[currSpeciesName].openInIFrame )
//{
// openInIFrame( url )
// }
else if ( settings.openDetKeyInBrowser )
{
require('electron').shell.openExternal( url )
}
else
{
let window = new BrowserWindow({width: 1100, height: 900 } )
window.loadURL( url )
}
}
catch ( err )
{
webix.alert( err )
}
}
else
{
let file = path.join( rootDir, 'mydata', 'speciesdata', currOrder, 'detkeys', url )
file = file.replace( /\\/gi, '/' )
try
{
if ( settings.openDetKeyInBrowser || mykeys[currGenus].openInBrowser )
{
require('electron').shell.openExternal( file )
}
else
{
let window = new BrowserWindow({width: 1100, height: 900 } )
window.loadURL('file:///' + file )
}
}
catch ( err )
{
webix.alert( err )
}
}
}
else
{
webix.alert( 'Määrityskaavaa ei löydy suvulle
' + currGenus )
}
})
$$('btnDetKey').attachEvent("onItemClick", btnId =>
{
let mykeys = null
try
{ mykeys = require( '../../mydata/speciesdata/' + currOrder + '/detkeys' )
}
catch ( err )
{
webix.alert( err )
}
if ( mykeys && mykeys[currSpeciesName] && mykeys[currSpeciesName].url !== '' )
{
let url = mykeys[currSpeciesName].url
if ( url.startsWith( 'http' ) || url.startsWith( 'file' ) )
{
try
{
if ( mykeys[currSpeciesName].openInBrowser )
{
require('electron').shell.openExternal( url )
}
// else if ( mykeys[currSpeciesName].openInIFrame )
//{
// openInIFrame( url )
// }
else if ( settings.openDetKeyInBrowser )
{
require('electron').shell.openExternal( url )
}
else
{
let window = new BrowserWindow({width: 1100, height: 900 } )
window.loadURL( url )
}
}
catch ( err )
{
webix.alert( err )
}
}
else
{
let file = path.join( rootDir, 'mydata', 'speciesdata', currOrder, 'detkeys', url )
file = file.replace( /\\/gi, '/' )
try
{
if ( settings.openDetKeyInBrowser || mykeys[currSpeciesName].openInBrowser )
{
require('electron').shell.openExternal( file )
}
else
{
let window = new BrowserWindow({width: 1100, height: 900 } )
window.loadURL('file:///' + file )
}
}
catch ( err )
{
webix.alert( err )
}
}
}
else
{
webix.alert( 'Määrityskaavaa ei löydy lajille
' + currSpeciesName )
}
})
$$('btnDetKey').define( { image: '' } )
$$('btnDetKey').refresh()
$$('btnDetKey').disable()
let latestSelectionFile = path.join( rootDir, 'mydata', 'latestimagestreeselection.json' )
if ( fs.existsSync( latestSelectionFile ) )
{
treeData = jsonfile.readFileSync( latestSelectionFile )
// {"order":"Araneae","treeNodeId":"Agelenidae-Agelena"},
// {"order":"Araneae","treeNodeId":"Agelenidae-Agelena-labyrinthica"}
//
treeDataCallback = function()
{
let items = treeData.treeNodeId.split('-')
let parent = items[0] + '-' + items[1]
$$("speciestree").open( parent, true )
$$("speciestree").select( treeData.treeNodeId )
/*
if ( items.length === 2 )
{
currFamily = items[0]
currGenus = items[1]
currOrder = treeData.order
currSpeciesData = catalogcache.getSpeciesData( currOrder )
showGenusInfo()
treeDataCallback = null
}
else if ( items.length === 3 )
*/
{
currFamily = items[0]
currGenus = items[1]
currSpecies = items[2]
currOrder = treeData.order
currSpeciesData = catalogcache.getSpeciesData( currOrder )
currSpeciesName = currGenus + ' ' + currSpecies
currSpeciesId = currSpeciesData[currSpeciesName].id
showSpeciesInfo()
treeDataCallback = null
}
}
$$('comboOrder').setValue( treeData.order )
}
}
// ----------------------------------------------------------------------------
// setTreeData()
// ----------------------------------------------------------------------------
function setTreeData( selectedOrder, treeDataCallback )
{
let treeData = []
let speciesData = catalogcache.getSpeciesData( selectedOrder )
let props = Object.getOwnPropertyNames( speciesData )
props.forEach( speciesName =>
{
let genus = speciesName.substring( 0, speciesName.indexOf(' '))
let species = speciesName.substring( speciesName.indexOf(' ')+1)
let sData = speciesData[speciesName]
// sp['Micropterix mansuetella'] = { id:'MX.58505', speciesNbr:1, authorship:"Zeller, 1844",
// genusAuthorship:"Hübner, 1825", redListStatus:'MX.iucnLC', vernacularName:"pohjanleukanen",
// familyId:'MX.58503', family:'Micropterigidae' }
treeData.push( {id:sData.family, value:sData.family,
data:[ {id:sData.family+'-'+genus, value:genus,
data:[ {id:sData.family+'-'+genus+'-'+species, value:species }] }] })
})
$$('speciestree').clearAll()
$$('speciestree').define( { data: treeData } )
$$('speciestree').refresh()
if ( treeDataCallback ) treeDataCallback()
}
// ----------------------------------------------------------------------------
// showGenusInfo()
// ----------------------------------------------------------------------------
function showGenusInfo()
{
let order = currOrder
let family = currFamily
let genus = currGenus
let mytexts = null
let mykeys = null
try
{ mytexts = require( '../../mydata/speciesdata/' + order + '/texts' )
}
catch ( err )
{
// console.log( err )
}
try
{ mykeys = require( '../../mydata/speciesdata/' + order + '/detkeys' )
}
catch ( err )
{
// console.log( err )
}
imageprovider.getGenusImages( order, family, genus )
.then( images =>
{
provincestats.getGenusProvinces( order, family, genus )
.then( provinces =>
{
if ( images && images.length > 0 )
{
let imgHtml = "
" imgHtml = imgHtml + imgRef + " | \n" } else { let missingRef = 'file:///' + rootDir + '/images/MissingImage2.png' missingRef = missingRef.replace( /\\/gi, '/' ) let imgRef = "" imgHtml = imgHtml + imgRef + " | \n" } } else { if ( img.ref ) { let imgRef = "" imgHtml = imgHtml + imgRef + " | \n" } else { let missingRef = 'file:///' + rootDir + '/images/MissingImage.png' missingRef = missingRef.replace( /\\/gi, '/' ) let imgRef = "" imgHtml = imgHtml + imgRef + " | \n" } } } imgHtml = imgHtml + "\n" // --- Row species names // imgHtml = imgHtml + "|
\n" + " " + g + '. ' + s + "" + vernacularName + " | \n" } imgHtml = imgHtml + "||||
\n"
+ provincesHtml + " " + " | \n"
}
}
imgHtml = imgHtml + "||||
" + mytexts[img.speciesName].genuspagedescription + ' | ' } else if ( mytexts[img.speciesName].description && mytexts[img.speciesName].description.trim() !== '' ) { imgHtml = imgHtml + "" + mytexts[img.speciesName].description + ' | ' } else { imgHtml = imgHtml + '' } } } imgHtml = imgHtml + " | ||
" imgHtml = imgHtml + imgRef + " | \n" } else { let missingRef = 'file:///' + rootDir + '/images/MissingImage2.png' missingRef = missingRef.replace( /\\/gi, '/' ) let imgRef = "" imgHtml = imgHtml + imgRef + " | \n" } } else { if ( img.ref ) { let imgRef = "" imgHtml = imgHtml + imgRef + " | \n" } else { let missingRef = 'file:///' + rootDir + '/images/MissingImage.png' missingRef = missingRef.replace( /\\/gi, '/' ) let imgRef = "" imgHtml = imgHtml + imgRef + " | \n" } } } let l for ( l = nbrLeftOverPics; l < nbrRowPics; l++ ) { imgHtml = imgHtml + "\n" } imgHtml = imgHtml + " |
\n" + " " + g + '. ' + s + "" + vernacularName + " | \n" } for ( l = nbrLeftOverPics; l < nbrRowPics; l++ ) { imgHtml = imgHtml + "\n"; } imgHtml = imgHtml + " | |||
\n"
+ provincesHtml + " " + " | \n"
}
}
imgHtml = imgHtml + "||||
" + mytexts[img.speciesName].genuspagedescription + ' | ' } else if ( mytexts[img.speciesName].description && mytexts[img.speciesName].description.trim() !== '' ) { imgHtml = imgHtml + "" + mytexts[img.speciesName].description + ' | ' } else { imgHtml = imgHtml + '' } } } imgHtml = imgHtml + " |