(function(back) {
  var settings;

  function loadSettings() {
    settings = require("Storage").readJSON("bthome.json",1)||{};
    if (!(settings.buttons instanceof Array))
      settings.buttons = [];
  }

  function saveSettings() {
    require("Storage").writeJSON("bthome.json",settings)
  }

  // Get id number for button that is sent to bthome
  function getNewIdNumber(){
    return [1, 2, 3, 4, 5, 6, 7, 8, 9].find(id => settings.buttons.every(button => id != button.n));
  }

  function showButtonMenu(button, isNew) {
    if (!button) {
      button = {name:"home", icon:"home", n:getNewIdNumber(), v:"press"};
      isNew = true;
    }
    var actions = ["press","double_press","triple_press","long_press","long_double_press","long_triple_press"];
    var menu = {
      "":{title:isNew ? /*LANG*/"New Button" : /*LANG*/"Edit Button", back: () => {
        loadSettings(); // revert changes
        showMenu();
      }},
      /*LANG*/"Icon" : {
        value : "\0"+require("icons").getIcon(button.icon),
        onchange : () => {
          require("icons").showIconChooser().then(function(iconName) {
            button.icon = iconName;
            button.name = iconName;
            showButtonMenu(button, isNew);
          }, function() {
            showButtonMenu(button, isNew);
          });
        }
      },
      /*LANG*/"Name" : {
        value : button.name,
        onchange : () => {
          require("textinput").input({text:button.name}).then(function(name) {
            button.name = name;
            showButtonMenu(button, isNew);
          }, function() {
            showButtonMenu(button, isNew);
          });
        }
      },
      /*LANG*/"Action" : {
        value : Math.max(0,actions.indexOf(button.v)), min:0, max:actions.length-1,
        format : v => actions[v],
        onchange : v => button.v=actions[v]
      },
      /*LANG*/"Save" : () => {
        if (isNew) settings.buttons.push(button);
        saveSettings();
        showMenu();
      }
    };
    if (!isNew) menu[/*LANG*/"Delete"] = function() {
      E.showPrompt("Delete Button?").then(function(yes) {
        if (yes) {
          settings.buttons.splice(settings.buttons.indexOf(button),1);
          saveSettings();
        }
        showMenu();
      });
    }
    E.showMenu(menu);
  }

  function showMenu() {
    var menu = [];
    menu[""] = {title:"BTHome", back:back};
    menu.push({
      title : /*LANG*/"Show Battery",
      value : !!settings.showBattery,
      onchange : v=>{
        settings.showBattery = v;
        saveSettings();
      }
    });
    settings.buttons.forEach((button,idx) => {
      var img = require("icons").getIcon(button.icon);
      menu.push({
        title : /*LANG*/"Button"+(img ? " \0"+img : (idx+1)),
        onchange : function() {
          showButtonMenu(button, false);
        }
      });
    });
    menu.push({
      title : /*LANG*/"Add Button",
      onchange : function() {
        showButtonMenu(undefined, true);
      }
    });
    E.showMenu(menu);
  }

  loadSettings();
  showMenu();
})