rm(list = ls(all.names = TRUE))

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Initial stuff
{
  ## Load libraries
  library(shiny)
  library(shinyjs)
  library(shinyBS)
  library(shinyMatrix)
  library(tidyverse)
  library(eolpop)
  library(popbio)

  ## Load species list
  species_data <- read.csv("./inst/ShinyApp/species_list.csv", sep = ",")
  species_list <- unique(as.character(species_data$NomEspece)) %>% sort
  species_list <- c(species_list, "Esp�ce g�n�rique")

  ## Load survival and fecundities data
  data_sf <- read.csv("./inst/ShinyApp/survivals_fecundities_species.csv", sep = ",")#, encoding = "UTF-8")


  ##### Fixed parameters #####
  # We define theta = 1 (same as in PBR) - for simplicity, given large uncertainty of real shape of density-dependence in nature
  fixed_theta = 1

  # Coefficient of environmental variation (SD)
    ## Environnmental variance set at 8%, based on values found for birds in the literature:
    ## (Saeher & Engen 2002) : between 7% et 14 ==> average : 10%
    ## (S�ther et al. 2005) : between 2.5% et 10% ==> average : 6%
  coeff_var_environ = sqrt(0.08) # SD ~28%

  # Coverage probability used for lower/upper interval input values
  CP = 0.99

  # Values of pop_growth (assumed), when the "trend" option is chosen
  growth_weak <- 1.05
  growth_average <- 1.10
  growth_strong <- 1.15

  decline_weak <- 0.97
  decline_average <- 0.94
  decline_strong <- 0.91

  pop_stable <- 1
  trend_se <- 0.03 # SE to use for pop_growth, when the "trend" option is chosen
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Pre-fill data
{
  ## Data elicitation pre-fill data
  # fatalities
  eli_fatalities <- c(1.0, 2, 5, 8,  0.80,
                      0.2, 0, 3, 6,  0.90,
                      0.2, 2, 4, 10, 0.90,
                      0.1, 1, 3, 7,  0.70)

  # population size
  eli_pop_size <-   c(1.0, 150, 200, 250, 0.80,
                      0.5, 120, 180, 240, 0.90,
                      0.8, 170, 250, 310, 0.90,
                      0.3, 180, 200, 230, 0.70)

  # carrying capacity
  eli_carrying_cap <- c(1.0, 500, 700, 1000, 0.80,
                        0.5, 1000, 1500, 2000, 0.90,
                        0.8, 800, 1200, 1600, 0.90,
                        0.3, 100, 1200, 1500, 0.70)

  # population growth rate
  eli_pop_growth <- c(1.0, -5, -2, 0, 0.95,
                      0.2, -3, 0, 1, 0.90,
                      0.5, -8, -4, -1, 0.90,
                      0.3, -10, -5, -2, 0.70)
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###



###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###
##  User Interface
###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###
# fluidPage
{ui <- fluidPage(

  useShinyjs(),
  titlePanel("eolpop : Impact demographique des collisions aviaires avec les �oliennes"),


  ###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###
  # Head Panel 1 : type of analysis and species
  {wellPanel(
    p("Choix d'analyse et esp�ce", style="font-size:28px"),

    {fluidRow(

      # Select type of analysis : cumulated impacted or not
      {column(width = 4,
              # Choose analysis type (radioButton)
              {radioButtons(inputId = "analysis_choice",
                           label = h4(strong("Type d'analyse"),
                                      bsButton("Q_analysis_choice", label = "", icon = icon("question"), size = "extra-small"),
                                      bsPopover(id = "Q_analysis_choice",
                                                title = "Choix du type d\\'analyse",
                                                content = HTML(
                                                  "<b>Impacts non cumul�s</b> : pour analyser l\\'impact d\\'<b>un seul parc �olien</b>. <br><br> <b>Impact cumul�s</b> : pour analyser l\\'impact de <b>plusieurs parcs �oliens</b> (attention : il faudra fournir des valeurs de mortalit�s propres � chaque parc)."
                                                ),
                                                placement = "right",
                                                trigger = "click",
                                                options = list(container='body')
                                      )
                           ),
                           choices = c("Impacts non cumul�s" = "single_farm", "Impacts cumul�s" = "cumulated", "Multiple sc�narios" = "multi_scenario")
              )},

              # Choose species (selectInput)
              {selectInput(inputId = "species_choice",
                          selected = "Aigle de Bonelli", width = '80%',
                          label = h4(strong("S�lectionner une esp�ce"),
                                     bsButton("Q_species_choice", label = "", icon = icon("question"), size = "extra-small"),
                                     bsPopover(id = "Q_species_choice",
                                               title = "Choix de l\\'esp�ce",
                                               content = HTML(
                                                 "N�cessaire pour fixer les valeurs de <b>param�tres d�mographiques</b> (survie, f�condit�). <br> La liste fournie correspond � une liste d\\'esp�ces prioritaires. Au besoin, une option \\'esp�ce g�n�rique\\' est disponible � la fin de la liste."
                                               ),
                                               placement = "right",
                                               trigger = "click",
                                               options = list(container='body')
                                     )
                          ),
                          choices = species_list)},

              br(),
              # Show dispersal distances : mean and d = 5%
              h4(strong("Distances de dispersion"),
                 bsButton("Q_dispersal_info", label = "", icon = icon("question"), size = "extra-small"),
                 bsPopover(id = "Q_dispersal_info",
                           title = "Distances de dispersion",
                           content = HTML(
                             "(1) <b>Distance moyenne de dispersion</b> de l\\'esp�ce, estim�e � partir des relations allom�triques publi�es dans l\\'article de Claramunt (2021).<br><br> (2) Distance �quivalente � un <b>taux de dispersion relatif de 5%</b>, sous l\\'hypoth�se que la distance de dispersion suit une loi exponentielle.<br><br><u>Reference cit�e</u> : Claramunt, S. (2021). Flight efficiency explains differences in natal dispersal distances in birds. <i>Ecology</i>, e03442."
                             ),
                           placement = "right",
                           trigger = "click",
                           options = list(container='body')
                 )
              ),
              #br(),
              span(textOutput(outputId = "dispersal_mean_info"), style="font-size:16px"),
              br(),
              span(textOutput(outputId = "dispersal_d03p_info"), style="font-size:16px"),
              span(textOutput(outputId = "dispersal_d05p_info"), style="font-size:16px"),
              span(textOutput(outputId = "dispersal_d10p_info"), style="font-size:16px"),

      )}, # close column

      # Show vital rate values (tableOutput)
      {column(width = 4,
              fluidRow(
                h4(strong("Param�tres d�mographiques"),
                   bsButton("Q_vital_rates_info", label = "", icon = icon("question"), size = "extra-small"),
                   bsPopover(id = "Q_vital_rates_info",
                             title = "Param�tres d�mographiques",
                             content = HTML(
                               "Valeurs de <b>survie et f�condit�s par classe d\\'�ge</b>, pour l\\'esp�ce s�lectionn�e. <br><br><b>Juv 0</b> correspond � un individu n� dans l\\'ann�e, n\\'ayant <u>pas encore</u> 1 an r�volu.<br><b>Juv 1</b> correspond � un individu ayant 1 an r�volu, donc dans sa 2<sup>e</sup> ann�e de vie.<br>Etc."
                               ),
                               placement = "right",
                             trigger = "click",
                             options = list(container='body')
                   )
                ),
                tableOutput(outputId = "vital_rates_info"),
              ), # close fluidRow


              # Display the intrinsic lambda(i.e., based solely on the Leslie matrix)
              # Output display (intrinsic lambda)
              h5(strong("Taux de croissance intrins�que"),
                 bsButton("Q_lambda0_info", label = "", icon = icon("question"), size = "extra-small"),
                 bsPopover(id = "Q_lambda0_info",
                           title = "Taux de croissance intrins�que",
                           content = HTML(
                             "Taux de croissance bas� seulement sur la matrice de Leslie (survies et f�condit�s de l\\'esp�ce), <b> avant consid�ration de la tendance de population locale</b>. <br><br>Ce taux de croissance est fourni simplement � titre informatif. La valeur qui sera utilis�e dans les simulations correspond au taux de croissance fourni dans la partie \\'Taux de croissance\\'."
                           ),
                           placement = "right",
                           trigger = "click",
                           options = list(container='body')
                 )
              ),
              span(textOutput(outputId = "lambda0_info", inline = TRUE), style = "color:black; font-size:16px"),

      )}, # close column


      ## Modify vital rates, if needed (actionButton and matrixInput)
      {column(width = 4,
              tags$style(HTML('#button_vital_rates{background-color:#C2C8D3}')),
              actionButton(inputId = "button_vital_rates",
                           label = tags$span("Modifier les param�tres d�mographiques",
                                             style = "font-weight: bold; font-size: 18px;")
              ),

              br(" "),
              numericInput(inputId = "vr_mat_number_age_classes",
                           label = "Nombre de classes d'age",
                           value = 3, min = 2, max = Inf, step = 1),

              #br(),
              matrixInput(inputId = "mat_fill_vr",
                          label = "",
                          value = matrix(data = NA, 3, 2,
                                         dimnames = list(c("Juv 0", "Sub 1", "Adulte"), c("Survie", "F�condit�"))),
                          class = "numeric",
                          rows = list(names = TRUE),
                          cols = list(names = TRUE)
              )

      )}, # close column

    )}, # End fluidRow
  )}, # End wellPanel
  ###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###


  ###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###
  # Head Panel 2 : Model parameters
  {wellPanel(

    ## Enter parameter values (TITLE)
    {p("Saisie des param�tres", style="font-size:28px",
      bsButton("Q_param_enter", label = "", icon = icon("question"), size = "extra-small"),
      bsPopover(id = "Q_param_enter",
                title = "Saisie des param�tres pour l\\'analyse",
                content = HTML(
                "Cliquer sur les boutons ci-dessous pour saisir les valeurs des quatre param�tres requis pour l\\'analyse : <br>(1) Mortalit�s annuelles, <br>(2) Taille de la population, <br>(3) Tendance de la population, <br>(4) Capacit� de charge."
                ),
                placement = "right",
                trigger = "click",
                options = list(container='body')
      )
    )},

    {fluidRow(

      ##~~~~~~~~~~~~~~~~~~~~~~~~~
      ##  1. Fatalities
      ##~~~~~~~~~~~~~~~~~~~~~~~~~
      {column(width = 3,

              tags$style(HTML('#button_fatalities{background-color:#C2C8D3}')),
              actionButton(inputId = "button_fatalities", width = '100%',
                           label = tags$span("Mortalit�s annuelles", style = "font-weight: bold; font-size: 18px;")
              ),
              bsPopover(id = "button_fatalities",
                        title = "Mortalit�s annuelles",
                        content = HTML(
                        "Nombre de mortalit�s totales <b><u>annuelles</u> (cad. sur 12 mois) </b> attendues, pour l\\'esp�ce s�lectionn�e, sur chaque parc �olien concern� (somme des mortalit�s attendues sur toutes les �oliennes d\\'un parc)."
                        ),
                        placement = "top",
                        trigger = "hover",
                        options = list(container='body')
              ),

              ### Part for non-cumulated impacts
              # Input type
              {conditionalPanel("output.hide_fatalities",
                                br(),

                                {wellPanel(style = "background:#FFF8DC",
                                           radioButtons(inputId = "fatalities_unit", inline = FALSE,
                                                        label = "Unit�",
                                                        choices = c("Nombre de mortalit�s" = "M",
                                                                    "Taux de mortalit� (%)" = "h"),
                                                        selected = "M"),
                                )}, # close wellPanel 1

                                {wellPanel(style = "background:#F0F8FF",

                                           radioButtons(inputId = "fatalities_input_type",
                                                        label = "Type de saisie",
                                                        choices = c("Intervalle" = "itvl",
                                                                    "Valeurs" = "val",
                                                                    "Elicitation d'expert" = "eli_exp"),
                                                        selected = "itvl"),

                                           # Interval
                                           numericInput(inputId = "fatalities_lower",
                                                        label = "Borne inf�rieure (mortalit�s annuelles)",
                                                        value = 1.5,
                                                        min = 0, max = Inf, step = 0.5),

                                           numericInput(inputId = "fatalities_upper",
                                                        label = "Borne sup�rieure (mortalit�s annuelles)",
                                                        value = 4.5,
                                                        min = 0, max = Inf, step = 0.5),

                                           # Values
                                           numericInput(inputId = "fatalities_mean",
                                                        label = "Moyenne (mortalit�s annuelles)",
                                                        value = 3.0,
                                                        min = 0, max = Inf, step = 0.5),

                                           numericInput(inputId = "fatalities_se",
                                                        label = "Erreur-type (mortalit�s annuelles)",
                                                        value = 0.5,
                                                        min = 0, max = Inf, step = 0.1),

                                           # Matrix for expert elicitation
                                           numericInput(inputId = "fatalities_number_expert",
                                                        label = "Nombre d'experts",
                                                        value = 4, min = 1, max = Inf, step = 1),

                                           matrixInput(inputId = "fatalities_mat_expert",
                                                       value = matrix(data = eli_fatalities, nrow = 4, ncol = 5,
                                                                      dimnames = list(c("#1", "#2", "#3", "#4"),
                                                                                      c("Poids", "Min", "Best", "Max", "% IC" )),
                                                                      byrow = TRUE),
                                                       class = "numeric",
                                                       rows = list(names = TRUE),
                                                       cols = list(names = TRUE)),

                                           actionButton(inputId = "fatalities_run_expert", label = "Utiliser valeurs experts"),

                                           ### Part for cumulated impacts

                                           numericInput(inputId = "farm_number_cumulated",
                                                        label = "Nombre de parcs �oliens",
                                                        value = 3, min = 2, max = Inf, step = 1),

                                           matrixInput(inputId = "fatalities_mat_cumulated",
                                                       label = span("Mortalit�s dans chaque parc",
                                                                      bsButton("Q_fatalities_mat_cumulated", label = "", icon = icon("question"), size = "extra-small"),
                                                                      bsPopover(id = "Q_fatalities_mat_cumulated",
                                                                                title = "Mortalit�s cumul�es",
                                                                                content = HTML(
                                                                                  "1 ligne = 1 parc <br><br>Les parcs doivent �tre fournis dans l\\'<b>ordre chronologique</b> de leur mise en service (\\'Ann�e d�but\\'). <br><br>Pour chaque parc, veuillez indiquer la <u>moyenne</u> et l\\'<u>erreur-type</u> du nombre de mortalit�s estim�es, ainsi que son <u>ann�e de mise en service</u>."
                                                                                  ),
                                                                                placement = "right",
                                                                                trigger = "click",
                                                                                options = list(container='body')
                                                                      )
                                                       ),
                                                       value = matrix(c(8, 0.5, 2010,
                                                                        3, 0.5, 2015,
                                                                        15, 0.5, 2018),
                                                                      nrow = 3, ncol = 3, byrow = TRUE,
                                                                      dimnames = list(c(paste0("Parc num.", c(1:3))),
                                                                                      c("Moyenne",
                                                                                        "Erreur-type",
                                                                                        "Ann�e de mise en service du parc"))),
                                                       class = "numeric",
                                                       rows = list(names = TRUE),
                                                       cols = list(names = TRUE)),


                                           ### Part for "scenarios option"
                                           selectizeInput(inputId = "fatalities_vec_scenario",
                                             label = HTML(
                                               "Saisir chaque valeur de mortalit�<br>
                                               (s�parer par un espace)"
                                               ),
                                             choices = NULL,
                                             multiple = TRUE,
                                             options = list(
                                               create = TRUE,
                                               delimiter = ' ',
                                               create = I("function(input, callback){
                                                              return {
                                                              value: input,
                                                              text: input
                                                            };
                                                          }")
                                             )
                                           ),






                                )}, # close wellPanel

              )}, # close conditional panel

      )}, # end column "fatalities"

      ###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###


      ##~~~~~~~~~~~~~~~~~~~~~~~~~
      ##  2. Population Size
      ##~~~~~~~~~~~~~~~~~~~~~~~~~
      {column(width = 3,

              tags$style(HTML('#button_pop_size{background-color:#C2C8D3}')),
              actionButton(inputId = "button_pop_size", width = '100%',
                           label = tags$span("Taille de la population", style = "font-weight: bold; font-size: 18px;")
              ),
              bsPopover(id = "button_pop_size",
                        title = "Taille de la population",
                        content = HTML(
                        "Effectif de la population cible pour l\\'analyse d\\'impact. <br> Il peut s\\'agir soit du <b>nombre de couples</b>, soit de l\\'<b>effectif total</b> de la population (cad. toutes classes d\\'�ge incluses)."
                        ),
                        placement = "top",
                        trigger = "hover",
                        options = list(container='body')
              ),

              {conditionalPanel("output.hide_pop_size",
                              br(),

                              {wellPanel(style = "background:#FFF8DC",
                                 radioButtons(inputId = "pop_size_unit", inline = TRUE,
                                              label = "Unit�",
                                              choices = c("Nombre de couples" = "Npair", "Effectif total" = "Ntotal"),
                                              selected = "Npair"),
                              )}, # close wellPanel 1

                              {wellPanel(style = "background:#F0F8FF",

                                         radioButtons(inputId = "pop_size_input_type",
                                                      label = "Type de saisie",
                                                      choices = c("Intervalle" = "itvl",
                                                                  "Valeurs" = "val",
                                                                  "Elicitation d'expert" = "eli_exp")),

                                         # Interval
                                         numericInput(inputId = "pop_size_lower",
                                                      label = "Borne inf�rieure (taille population)",
                                                      value = 350,
                                                      min = 0, max = Inf, step = 10),

                                         numericInput(inputId = "pop_size_upper",
                                                      label = "Borne sup�rieure (taille population)",
                                                      value = 350,
                                                      min = 0, max = Inf, step = 10),

                                         # Values
                                         numericInput(inputId = "pop_size_mean",
                                                      label = "Moyenne de la taille de la population",
                                                      value = 200,
                                                      min = 0, max = Inf, step = 50),

                                         numericInput(inputId = "pop_size_se",
                                                      label = "Erreur-type de la taille de la population",
                                                      value = 30,
                                                      min = 0, max = Inf, step = 1),

                                         # Matrix for expert elicitation
                                         numericInput(inputId = "pop_size_number_expert",
                                                      label = "Nombre d'experts",
                                                      value = 4, min = 1, max = Inf, step = 1),

                                         matrixInput(inputId = "pop_size_mat_expert",
                                                     value = matrix(data = eli_pop_size, nrow = 4, ncol = 5,
                                                                    dimnames = list(c("#1", "#2", "#3", "#4"),
                                                                                    c("Poids", "Min", "Best", "Max", "% IC" )),
                                                                    byrow = TRUE),
                                                     class = "numeric",
                                                     rows = list(names = TRUE),
                                                     cols = list(names = TRUE)),

                                         actionButton(inputId = "pop_size_run_expert", label = "Utiliser valeurs experts"),
                              )}, # close wellPanel 2


                              # Display matrix for stable age distribution
                              h5(strong("Effectifs par classe d'�ge")),
                              tableOutput("pop_size_by_age"),

              )}, # close conditional panel

      )}, # end column "pop size"
      ###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###


      ##~~~~~~~~~~~~~~~~~~~~~~~~~
      ##  3. Population Growth
      ##~~~~~~~~~~~~~~~~~~~~~~~~~
      {column(width = 3,

              tags$style(HTML('#button_pop_growth{background-color:#C2C8D3}')),
              actionButton(inputId = "button_pop_growth", width = '100%',
                           label = tags$span("Taux de croissance", style = "font-weight: bold; font-size: 18px;")
              ),
              bsPopover(id = "button_pop_growth",
                        title = "Taux de croissance",
                        content = HTML(
                          "Taux d\\'accroissement annuel de la population <b>en %</b> : valeur positive pour une population en croissance; valeur <b>n�gative</b> pour une population en <b>d�clin</b> (ex : � -4 � pour un d�clin de 4% par an) ; 0 pour une population stable.<br><br>A d�faut, on pourra juste cocher la <b>tendance globale</b> (d�clin, stabilit� ou croissance) et l\\'intensit� de cette tendance (faible, moyenne, forte)."
                          ),
                        placement = "top",
                        trigger = "hover",
                        options = list(container='body')
              ),

              {conditionalPanel("output.hide_pop_growth",
                                br(),

                                {wellPanel(style = "background:#F0F8FF",

                                           radioButtons(inputId = "pop_growth_input_type",
                                                        label = "Type de saisie",
                                                        choices = c("Intervalle" = "itvl",
                                                                    "Valeurs" = "val",
                                                                    "Elicitation d'expert" = "eli_exp",
                                                                    "Tendance population" = "trend")),
                                           # Interval
                                           numericInput(inputId = "pop_growth_lower",
                                                        label = HTML("Borne inf�rieure<br>(taux d'accroissement en %)"),
                                                        value = -6,
                                                        min = -100, max = 100, step = 1),

                                           numericInput(inputId = "pop_growth_upper",
                                                        label = HTML("Borne sup�rieure<br>(taux d'accroissement en %)"),
                                                        value = -6,
                                                        min = -100, max = 100, step = 1),

                                           ## Input values: mean and se
                                           numericInput(inputId = "pop_growth_mean",
                                                        label = "Moyenne (taux d'accroissement en %)",
                                                        value = -1.5,
                                                        min = -100, max = 100, step = 1),

                                           numericInput(inputId = "pop_growth_se",
                                                        label = "Erreur-type (aussi en %)",
                                                        value = 0.1,
                                                        min = 0, max = Inf, step = 0.5),

                                           ## Input expert elicitation: table
                                           numericInput(inputId = "pop_growth_number_expert",
                                                        label = "Nombre d'experts",
                                                        value = 4, min = 1, max = Inf, step = 1),

                                           matrixInput(inputId = "pop_growth_mat_expert",
                                                       value = matrix(data = eli_pop_growth, nrow = 4, ncol = 5,
                                                                      dimnames = list(c("#1", "#2", "#3", "#4"),
                                                                                      c("Poids", "Min", "Best", "Max", "% IC" )),
                                                                      byrow = TRUE),
                                                       class = "numeric",
                                                       rows = list(names = TRUE),
                                                       cols = list(names = TRUE)),

                                           actionButton(inputId = "pop_growth_run_expert", label = "Utiliser valeurs experts"),

                                           ## Input trend: radio buttons
                                           {fluidRow(
                                             # Trend
                                             column(6,
                                                    radioButtons(inputId = "pop_trend",
                                                                 label = "Tendance",
                                                                 choices = c("En croissance" = "growth",
                                                                             "Stable" = "stable",
                                                                             "En d�clin" = "decline")),
                                             ),

                                             # Strength of trend
                                             column(6,
                                                    radioButtons(inputId = "pop_trend_strength",
                                                                 label = "Intensit�",
                                                                 choices = c("Faible" = "weak",
                                                                             "Moyenne" = "average",
                                                                             "Forte" = "strong")),
                                             ),
                                           )}, # close fluidRow

                                           br(),
                                           actionButton(inputId = "button_calibrate_vr", label = "Calibrer survies et f�condit�s"),


                                )}, # close wellPanel

              )}, # close conditional panel

      )}, # end column "pop growth"
      ###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###


      ##~~~~~~~~~~~~~~~~~~~~~~~~~
      ##  4. Carrying capacity
      ##~~~~~~~~~~~~~~~~~~~~~~~~~
      {column(width = 3,

              tags$style(HTML('#button_carrying_cap{background-color:#C2C8D3}')),
              actionButton(inputId = "button_carrying_cap", width = '100%',
                           label = tags$span("Capacit� de charge", style = "font-weight: bold; font-size: 18px;")
              ),

              bsPopover(id = "button_carrying_cap",
                        title = "Capacit� de charge (K)",
                        content = HTML(
                          "La capacit� de charge (K) correspond � la <b>taille maximale que peut atteindre la population</b> dans son environnement et les limites spatiales consid�r�es. <br><br><u>Note:</u> Ce chiffre sera exprim� dans la <b>m�me unit�</b> que la taille de population (cad. nombre de couples ou effectif total). <br>Il n\\'a pas besoin d\\'�tre tr�s pr�cis&nbsp;; il doit simplement fournir un ordre de grandeur de la taille limite au-del� de laquelle la population ne peut plus cro�tre (environnement local �satur�)."
                          ),
                        placement = "top",
                        trigger = "hover",
                        options = list(container='body')
              ),


              {conditionalPanel("output.hide_carrying_cap",
                                br(),

                                {wellPanel(style = "background:#FFF8DC",
                                           span(textOutput(outputId = "carrying_cap_unit_info"), style="font-size:16px"),

                                )}, # close wellPanel 1

                                {wellPanel(style = "background:#F0F8FF",

                                           radioButtons(inputId = "carrying_cap_input_type",
                                                        label = "Type de saisie",
                                                        choices = c("Intervalle" = "itvl",
                                                                    "Valeur" = "val",
                                                                    "Elicitation d'expert" = "eli_exp",
                                                                    "Absence de K" = "no_K")),

                                           # Interval
                                           numericInput(inputId = "carrying_capacity_lower",
                                                        label = "Borne inf�rieure (capacit� de charge)",
                                                        value = 850,
                                                        min = 0, max = Inf, step = 100),

                                           numericInput(inputId = "carrying_capacity_upper",
                                                        label = "Borne sup�rieure (capacit� de charge)",
                                                        value = 1250,
                                                        min = 0, max = Inf, step = 100),

                                           # Values
                                           numericInput(inputId = "carrying_capacity_mean",
                                                        label = "Moyenne de la capacit� de charge",
                                                        value = 1000,
                                                        min = 0, max = Inf, step = 100),

                                           numericInput(inputId = "carrying_capacity_se",
                                                        label = "Erreur-type de la capacit� de charge",
                                                        value = 100,
                                                        min = 0, max = Inf, step = 50),


                                           # Expert Elicitation Matrix
                                           numericInput(inputId = "carrying_cap_number_expert",
                                                        label = "Nombre d'experts",
                                                        value = 4, min = 1, max = Inf, step = 1),

                                           matrixInput(inputId = "carrying_cap_mat_expert",
                                                       value = matrix(data = eli_carrying_cap, nrow = 4, ncol = 5,
                                                                      dimnames = list(c("#1", "#2", "#3", "#4"),
                                                                                      c("Poids", "Min", "Best", "Max", "% IC" )),
                                                                      byrow = TRUE),
                                                       class = "numeric",
                                                       rows = list(names = TRUE),
                                                       cols = list(names = TRUE)),

                                           actionButton(inputId = "carrying_cap_run_expert", label = "Utiliser valeurs experts"),

                                )}, # close wellPanel 2

              )}, # close conditional panel

      )}, # end column "carrying capacity"
      ###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###


    )}, # # End fluidRow

  )}, # # End wellPanel
  ###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###



  ###~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###
  {sidebarLayout(

    ##  Side Panel : Parameter information
    {sidebarPanel(

      p("Valeurs s�lectionn�es", style="font-size:28px",
        bsButton("Q_selected_values", label = "", icon = icon("question"), size = "extra-small"),
        bsTooltip(id = "Q_selected_values",
                  title = "Rappel des valeurs de param�tres actuellement s�lectionn�es.",
                  placement = "right",
                  trigger = "click",
                  options = list(container='body')
        )
      ),

      # Mortalites annuelles
      {wellPanel(style = "background:#DCDCDC",
                 p("Mortalit�s annuelles", style="font-size:20px; font-weight: bold"),
                 shiny::tags$u(textOutput(outputId = "fatalities_unit_info"), style="font-size:16px"),
                 p(""),
                 span(textOutput(outputId = "fatalities_mean_info"), style="font-size:16px"),
                 span(textOutput(outputId = "fatalities_se_info"), style="font-size:16px"),
      )},

      # Taille de population
      {wellPanel(style = "background:#DCDCDC",
                 p("Taille de la population", style="font-size:20px; font-weight: bold"),
                 shiny::tags$u(textOutput(outputId = "pop_size_unit_info"), style="font-size:16px"),
                 p(""),
                 span(textOutput(outputId = "pop_size_mean_info"), style="font-size:16px"),
                 span(textOutput(outputId = "pop_size_se_info"), style="font-size:16px"),

      )},

      # Tendance de la population
      {wellPanel(style = "background:#DCDCDC",
                 p(HTML("Taux de croissance (&lambda;)"), style="font-size:20px; font-weight: bold"),
                 span(textOutput(outputId = "pop_growth_mean_info"), style="font-size:16px"),
                 span(textOutput(outputId = "pop_growth_se_info"), style="font-size:16px"),
      )},

      # Capacite de charge
      {wellPanel(style = "background:#DCDCDC",
                 p("Capacit� de charge", style="font-size:20px; font-weight: bold"),
                 shiny::tags$u(textOutput(outputId = "carrying_capacity_unit_info"), style="font-size:16px"),
                 p(""),
                 span(textOutput(outputId = "carrying_capacity_mean_info"), style="font-size:16px"),
                 span(textOutput(outputId = "carrying_capacity_se_info"), style="font-size:16px"),
      )},


    )}, # End sidebarPanel


    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ###  Main Panel

    {mainPanel(
      tabsetPanel(

        ## Parameter distribution
        {tabPanel(title = "Distribution param�tres",
                 br(),
                 hr(),

                 span(textOutput(outputId = "title_distri_plot"), style="font-size:24px; font-weight:bold"),
                 plotOutput(outputId = "distri_plot"),

        )}, # End tabPanel


        ## Population Impact : simulations
        {tabPanel(title = "Impact population",

                 br(),
                 numericInput(inputId = "time_horizon",
                              label = "Nombre d'ann�es",
                              value = 30, min = 5, max = Inf, step = 10),

                 br(),
                 numericInput(inputId = "nsim",
                              label = "Nombre de simulations",
                              value = 10, min = 0, max = Inf, step = 10),

                 br(),
                 actionButton(inputId = "run", label = "Lancer l'analyse"),
                 hr(),

                 span(textOutput("title_indiv_impact_result"), align = "left", style = "font-weight: bold; font-size: 18px;"),
                 strong(span(tableOutput("indiv_impact_table"), style="color:green; font-size:18px", align = "left")),

                 hr(),

                 span(textOutput("title_impact_result"), align = "left", style = "font-weight: bold; font-size: 18px;"),
                 strong(span(tableOutput("impact_table"), style="color:blue; font-size:18px", align = "left")),

                 hr(),

                 br(),
                 span(textOutput("title_PrExt_result"), align = "left", style = "font-weight: bold; font-size: 18px;"),
                 strong(span(tableOutput("PrExt_table"), style="color:orange; font-size:18px", align = "left")),

                 br(),
                 hr(),

                 tags$h4(textOutput("title_impact_plot"), align = "center"),
                 plotOutput("impact_plot", width = "100%", height = "550px"),
                 hr(),

                 tags$h4(textOutput("title_traj_plot"), align = "center"),
                 plotOutput("traj_plot", width = "100%", height = "550px")
        )}, # End tabPanel


        ## Report
        {tabPanel(title = "Rapport",
                 br(),
                 radioButtons(inputId = "lifestyle",
                              h4("Mode de vie de l'esp�ce"),
                              choices = c("S�dentaire", "Non-s�dentaire nicheur", "Non-s�dentaire hivernant", "Migrateur de passage")),
                 numericInput(inputId = "wind_farm_nb",
                              h4("Nombre de parcs"),
                              value = 1, min = 0, max = Inf, step = 1),
                 numericInput(inputId = "wind_turbine_nb",
                              h4("Nombre d'�oliennes"),
                              value = 1, min = 0, max = Inf, step = 1)

        )} # End tabPanel

      ) # End tabSetPanel
    )} # End mainPanel

  )} # sidebarLayout

)} # FluidPage

# End UI #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~###