TopMenu = {}

-- private variables
local topMenu
local leftButtonsPanel
local rightButtonsPanel
local leftGameButtonsPanel
local rightGameButtonsPanel

-- private functions
local function addButton(id, description, icon, callback, panel, toggle)
  local class
  if toggle then
    class = 'TopToggleButton'
  else
    class = 'TopButton'
  end

  local button = g_ui.createWidget(class, panel)
  button:setId(id)
  button:setTooltip(description)
  button:setIcon(resolvepath(icon, 3))
  button.onClick = callback
  return button
end

-- public functions
function TopMenu.init()
  connect(g_game, { onGameStart = TopMenu.showGameButtons,
                    onGameEnd = TopMenu.hideGameButtons })

  topMenu = g_ui.displayUI('topmenu.otui')

  leftButtonsPanel = topMenu:getChildById('leftButtonsPanel')
  rightButtonsPanel = topMenu:getChildById('rightButtonsPanel')
  leftGameButtonsPanel = topMenu:getChildById('leftGameButtonsPanel')
  rightGameButtonsPanel = topMenu:getChildById('rightGameButtonsPanel')

  if g_game.isOnline() then
    leftGameButtonsPanel:show()
    rightGameButtonsPanel:show()
  end
end

function TopMenu.terminate()
  disconnect(g_game, { onGameStart = TopMenu.showGameButtons,
                       onGameEnd = TopMenu.hideGameButtons })

  leftButtonsPanel = nil
  rightButtonsPanel = nil
  leftGameButtonsPanel = nil
  rightGameButtonsPanel = nil

  topMenu:destroy()
  topMenu = nil

  TopMenu = nil
end

function TopMenu.addLeftButton(id, description, icon, callback)
  return addButton(id, description, icon, callback, leftButtonsPanel, false)
end

function TopMenu.addLeftToggleButton(id, description, icon, callback, right)
  return addButton(id, description, icon, callback, leftButtonsPanel, true)
end

function TopMenu.addRightButton(id, description, icon, callback)
  return addButton(id, description, icon, callback, rightButtonsPanel, false)
end

function TopMenu.addRightToggleButton(id, description, icon, callback, right)
  return addButton(id, description, icon, callback, rightButtonsPanel, true)
end

function TopMenu.addLeftGameButton(id, description, icon, callback)
  return addButton(id, description, icon, callback, leftGameButtonsPanel, false)
end

function TopMenu.addLeftGameToggleButton(id, description, icon, callback, right)
  return addButton(id, description, icon, callback, leftGameButtonsPanel, true)
end

function TopMenu.addRightGameButton(id, description, icon, callback)
  return addButton(id, description, icon, callback, rightGameButtonsPanel, false)
end

function TopMenu.addRightGameToggleButton(id, description, icon, callback, right)
  return addButton(id, description, icon, callback, rightGameButtonsPanel, true)
end

function TopMenu.hideGameButtons()
  leftGameButtonsPanel:hide()
  rightGameButtonsPanel:hide()
end

function TopMenu.showGameButtons()
  leftGameButtonsPanel:show()
  rightGameButtonsPanel:show()
end

function TopMenu.getButton(id)
  return topMenu:recursiveGetChildById(id)
end