function ConfirmDelete() {
  var x = confirm("Are you sure you want to restore to factory defaults?");
  if (x) {
    window.localStorage.clear()
    return true;
  } else {
    return false;
  }
}

function initLocalStorage() {
  var settingsOpen = document.getElementById('jsonFile');
  settingsOpen.addEventListener('change', restoreSettingsLocal, false);
  $('#savesettings').on('click', function() {
    saveSettingsLocal();
  });
  checkSettingsLocal();
}

// FIXME
// A way to access all of the settings
// $("#settings-menu-panel input, #settings-menu-panel textarea, #settings-menu-panel select").each(function() {console.log(this.id + ": " + $(this).val())});

localParams = [
  ['sizexmax', true],
  ['sizeymax', true],
  ['sizezmax', true],
  ['startgcode', false],
  ['laseron', false],
  ['laseroff', false],
  ['endgcode', false],
  ['g0command', true],
  ['g1command', true],
  ['scommandnewline', true],
  ['scommand', true],
  ['scommandscale', true],
  ['ihsgcode', false],
  ['machinetype', true],
  ['performanceLimit', false]
];


// Wrappers for direct access to local storage -- these will get swapped with profiles laster
function saveSetting(setting, value) {
  if (setting == "machinetype") {
    setMachineButton(value)
  }
  localStorage.setItem(setting, value);

};

function loadSetting(setting) {
  return localStorage.getItem(setting);
};


function saveSettingsLocal() {
  console.group("Saving settings to LocalStorage");
  for (i = 0; i < localParams.length; i++) {
    var localParam = localParams[i];
    var paramName = localParam[0];
    if (paramName == 'sizexmax' || paramName == 'sizeymax') {
      var newval = $('#' + paramName).val()
      var oldval = loadSetting(paramName);
      if (oldval != newval) {
        redrawGrid()
      }
    }
    if (paramName == 'scommandnewline') {
      var val = $('#' + paramName).is(":checked");
    } else if (paramName == 'performanceLimit') {
      var val = $('#' + paramName).is(":checked");
    } else {
      var val = $('#' + paramName).val(); // Read the value from form
    }
    printLog('Saving: ' + paramName + ' : ' + val, successcolor);
    saveSetting(paramName, val);
  }
  printLog('<b>Saved Settings: <br>NB:</b> Please refresh page for settings to take effect', errorcolor, "settings");
  // $("#settingsmodal").modal("hide");
  console.groupEnd();

};

function loadSettingsLocal() {
  // console.log("Loading settings from LocalStorage")
  for (i = 0; i < localParams.length; i++) {
    var localParam = localParams[i];
    var paramName = localParam[0];
    var val = loadSetting(paramName);

    if (val) {
      // console.log('Loading: ' + paramName + ' : ' + val);
      if (paramName == 'machinetype') {
        setMachineButton(val)
      }
      if (paramName == 'scommandnewline') {
        $('#' + paramName).prop('checked', parseBoolean(val));
        // console.log('#' + paramName + " is set to " + val)
      } else if (paramName == 'performanceLimit') {
        $('#' + paramName).prop('checked', parseBoolean(val));
        // console.log('#' + paramName + " is set to " + val)
      } else {
        $('#' + paramName).val(val); // Set the value to Form from Storage
      }
    } else {
      // console.log('Not in local storage: ' +  paramName);
    }
  }
  // console.groupEnd();
};

function backupSettingsLocal() {
  var json = JSON.stringify(localStorage)
  var blob = new Blob([json], {
    type: "application/json"
  });
  invokeSaveAsDialog(blob, 'settings-backup.json');
};

function checkSettingsLocal() {
  var anyissues = false;
  // printLog('<b>Checking for configuration :</b><p>', msgcolor, "settings");
  for (i = 0; i < localParams.length; i++) {
    var localParam = localParams[i];
    var paramName = localParam[0];
    var paramRequired = localParam[1];
    var val = $('#' + localParams[i]).val(); // Read the value from form

    if (!val && paramRequired) {
      printLog('Missing required setting: ' + paramName, errorcolor, "settings");
      anyissues = true;

    } else if (!val && !paramRequired) {
      printLog('Missing optional setting: ' + paramName, warncolor, "settings");
    } else {
      // printLog('Found setting: ' + paramName + " : " + val, msgcolor, "settings");
    }
  }


  if (anyissues) {
    // console.log(`<b>MISSING CONFIG: You need to configure your setup. </b>. Click Edit, <a href='#' onclick='Metro.dialog.open('#settingsmodal');'><kbd>Settings <i class="fa fa-cogs"></i></kbd></a> on the top menu bar, and work through all the options`, errorcolor, "settings");
    // $("#settingsmodal").modal("show");
    setTimeout(function() {
      Metro.dialog.open('#settingsmodal');
    }, 1000)
  }


};

function restoreSettingsLocal(evt) {
  // console.log('Inside Restore');
  var input, file, fr;

  console.log('event ', evt)
  file = evt.target.files[0];
  fr = new FileReader();
  fr.onload = loadSettings;
  fr.readAsText(file);
};

function loadSettings(e) {
  lines = e.target ? e.target.result : e;
  var o = JSON.parse(lines);
  for (var property in o) {
    if (o.hasOwnProperty(property)) {
      saveSetting(property, o[property]);
    } else {
      // I'm not sure this can happen... I want to log this if it does!
      // console.log("Found a property " + property + " which does not belong to itself.");
    }
  }
  loadSettingsLocal();
};

window.parseBoolean = function(string) {
  var bool;
  bool = (function() {
    switch (false) {
      case string.toLowerCase() !== 'true':
        return true;
      case string.toLowerCase() !== 'false':
        return false;
    }
  })();
  if (typeof bool === "boolean") {
    return bool;
  }
  return void 0;
};


// Settings Dialog


function selectToolhead(type) {
  console.log(this)

  console.log("Selecting toolhead type: ", type)
  if (type == 'router' && $("#hasRouter").is(':checked')) {
    // $('#hasRouter').prop('checked', false);
    $('#hasPlasma').prop('checked', false);
    $('#hasLaser').prop('checked', false);
    $('#hasPenPlotter').prop('checked', false);
    $('#hasSpindle').prop('checked', false);
  } else if (type == 'plasma' && $("#hasPlasma").is(':checked')) {
    $('#hasRouter').prop('checked', false);
    // $('#hasPlasma').prop('checked', false);
    $('#hasLaser').prop('checked', false);
    $('#hasPenPlotter').prop('checked', false);
    $('#hasSpindle').prop('checked', false);
  } else if (type == 'laser' && $("#hasLaser").is(':checked')) {
    $('#hasRouter').prop('checked', false);
    $('#hasPlasma').prop('checked', false);
    // $('#hasLaser').prop('checked', false);
    $('#hasPenPlotter').prop('checked', false);
    $('#hasSpindle').prop('checked', false);
  } else if (type == 'penPlotter' && $("#hasPenPlotter").is(':checked')) {
    $('#hasRouter').prop('checked', false);
    $('#hasPlasma').prop('checked', false);
    $('#hasLaser').prop('checked', false);
    // $('#hasPenPlotter').prop('checked', false);
    $('#hasSpindle').prop('checked', false);
  } else if (type == 'spindle' && $("#hasSpindle").is(':checked')) {
    $('#hasRouter').prop('checked', false);
    $('#hasPlasma').prop('checked', false);
    $('#hasLaser').prop('checked', false);
    $('#hasPenPlotter').prop('checked', false);
    // $('#hasSpindle').prop('checked', false);
  }

  // Default grbl parameters
  var tplscommand = `S`;
  $('#scommand').val(tplscommand);
  var tplsscale = `1000`;
  var tplsnewline = false;
  $('#scommandnewline').prop('checked', tplsnewline);
  var tplrapidcommand = `G0`;
  $('#g0command').val(tplrapidcommand);
  var tplmovecommand = `G1`;
  $('#g1command').val(tplmovecommand);

  $('#startgcode').val("");
  $('#endgcode').val("");
  $("#ihsgcode").val("");
  var startcode = `; Created by OpenBuilds CAM\nG54; Work Coordinates\nG21; mm-mode\nG90; Absolute Positioning\n`;
  var endcode = "";

  if ($("#hasRouter").is(':checked')) {
    // console.log('Add Spindle')
    startcode += "M3 S" + $('#scommandscale').val() + "; Spindle On\n"
    endcode += "M5 S0; Spindle Off\n"
    $('#scommandscale').val(1000);
    localStorage.setItem("hasRouter", true);
  } else {
    localStorage.setItem("hasRouter", false);
  }

  if ($("#hasSpindle").is(':checked')) {
    // console.log('Add Spindle')
    //startcode += "M3 S" + $('#scommandscale').val() + "; Spindle On\n"
    endcode += "M5 S0; Spindle Off\n"
    $('#scommandscale').val(24000);
    localStorage.setItem("hasSpindle", true);
  } else {
    localStorage.setItem("hasSpindle", false);
  }

  if ($("#hasPlasma").is(':checked')) {
    $("#ihsgcode").val("G38.2 Z-30 F500; Touch off Probe\nG10 L20 Z-3; Set Z Zero\n")
    $('#scommandscale').val(1000);
    var xaxis = 740
    var yaxis = 830
    var zaxis = 80
    $("#sizexmax").val(xaxis)
    $("#sizeymax").val(yaxis)
    $("#sizezmax").val(zaxis)
    localStorage.setItem("hasPlasma", true);
  } else {
    localStorage.setItem("hasPlasma", false);
  }

  if ($("#hasLaser").is(':checked')) {
    // console.log('Add Laser Dynamic')
    startcode += "M4; Dynamic Power Laser On\n"
    endcode += "M5; Laser Off\n"
    $('#scommandscale').val(1000);
    localStorage.setItem("hasLaser", true);
  } else {
    localStorage.setItem("hasLaser", false);
  }

  if ($("#hasPenPlotter").is(':checked')) {
    // console.log('Add Laser Dynamic')
    // startcode += "; Plotter does not need specific startup\n"
    endcode += "G0 X0 Y0; Move back to start Position\n"
    //$('#scommandscale').val(1000);
    localStorage.setItem("hasPenPlotter", true);
  } else {
    localStorage.setItem("hasPenPlotter", false);
  }


  if ($("#hasDust").is(':checked')) {
    // console.log('Add Misting')
    startcode += "M8; Coolant Output On - turns on Dust Extractor if wired\n"
    endcode += "M9; Coolant Output Off  - turns off Dust Extractor if wired\n"
    localStorage.setItem("hasDust", true);
  } else {
    localStorage.setItem("hasDust", false);
  }

  $('#startgcode').val(startcode)
  $('#endgcode').val(endcode)

  console.log("Start GCODE: ", startcode)
  console.log("End GCODE: ", endcode)
  console.log("Plasma Touchoff Macro: ", $("#ihsgcode").val())
}

function selectMachine(type) {
  console.log("Loading Machine Template")
  if (type == "sphinx55") {
    var xaxis = 333
    var yaxis = 325
    var zaxis = 85
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "sphinx1050") {
    var xaxis = 833
    var yaxis = 325
    var zaxis = 85
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "workbee1050") {
    var xaxis = 335
    var yaxis = 760
    var zaxis = 122
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "workbee1010") {
    var xaxis = 824
    var yaxis = 780
    var zaxis = 122
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "workbee1510") {
    var xaxis = 824
    var yaxis = 1280
    var zaxis = 122
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "acro55") {
    var xaxis = 300
    var yaxis = 300
    var zaxis = 0
    //$('#toolheadSelect').data('select').val('laserm4')
  } else if (type == "acro510") {
    var xaxis = 800
    var yaxis = 300
    var zaxis = 0
    //$('#toolheadSelect').data('select').val('laserm4')
  } else if (type == "acro1010") {
    var xaxis = 800
    var yaxis = 800
    var zaxis = 0
    //$('#toolheadSelect').data('select').val('laserm4')
  } else if (type == "acro1510") {
    var xaxis = 1300
    var yaxis = 800
    var zaxis = 0
    //$('#toolheadSelect').data('select').val('laserm4')
  } else if (type == "acro1515") {
    var xaxis = 1300
    var yaxis = 1300
    var zaxis = 0
    //$('#toolheadSelect').data('select').val('laserm4')
  } else if (type == "acroA1") {
    var xaxis = 863
    var yaxis = 609
    var zaxis = 0
    selectToolhead('penPlotter');
    //$('#toolheadSelect').data('select').val('laserm4')
  } else if (type == "minimill") {
    var xaxis = 120
    var yaxis = 195
    var zaxis = 80
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "cbeam") {
    var xaxis = 350
    var yaxis = 280
    var zaxis = 32
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "cbeamxl") {
    var xaxis = 750
    var yaxis = 330
    var zaxis = 51
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "leadmachine1515") {
    var xaxis = 1170
    var yaxis = 1250
    var zaxis = 90
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "leadmachine1010") {
    var xaxis = 730
    var yaxis = 810
    var zaxis = 90
    //$('#toolheadSelect').data('select').val('spindleonoff')
  } else if (type == "custom") {
    var xaxis = 1000
    var yaxis = 1000
    var zaxis = 100
    //$('#toolheadSelect').data('select').val('spindleonoff')
  }
  $("#machinetype").val(type)
  $("#sizexmax").val(xaxis)
  $("#sizeymax").val(yaxis)
  $("#sizezmax").val(zaxis)
  setMachineButton(type);
};

function setMachineButton(type) {
  console.log(type)

  // Set Dropdown menu selected option in Settings modal
  if (type == "sphinx55") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Sphinx 55`
  } else if (type == "sphinx1050") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Sphinx 1050`
  } else if (type == "workbee1050") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Workbee 1050`
  } else if (type == "workbee1010") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Workbee 1010`
  } else if (type == "workbee1510") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Workbee 1510`
  } else if (type == "sphinx1050") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Sphinx 1050`
  } else if (type == "sphinx1050") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Sphinx 1050`
  } else if (type == "acro55") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Acro 55`
  } else if (type == "acro510") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Acro 510`
  } else if (type == "acro1010") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Acro 1010`
  } else if (type == "acro1510") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Acro 1510`
  } else if (type == "acro1515") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds Acro 1515`
  } else if (type == "acroA1") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds ACRO A1`
  } else if (type == "minimill") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds MiniMill`
  } else if (type == "cbeam") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds C-Beam Machine`
  } else if (type == "cbeamxl") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds C-Beam XL`
  } else if (type == "leadmachine1515") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds LEAD 1515`
  } else if (type == "leadmachine1010") {
    template = `<img src="images/mch/` + type + `.png"/>  OpenBuilds LEAD 1010`
  } else if (type == "leadmachine1010") {
    template = `<img src="images/mch/` + type + `.png"/>  CUSTOM`
  } else {
    template = `<img src="images/mch/sphinx55.png"/>  Select Machine`
  }
  $('#context_toggle2').html(template);

  // Tick add-on checkboxes
  if (localStorage.getItem("hasPlasma") == 'true') {
    $("#hasPlasma").attr('checked', true)
  }
  if (localStorage.getItem("hasRouter") == 'true') {
    $("#hasRouter").attr('checked', true)
  }
  if (localStorage.getItem("hasSpindle") == 'true') {
    $("#hasSpindle").attr('checked', true)
  }
  if (localStorage.getItem("hasDust") == 'true') {
    $("#hasDust").attr('checked', true)
  }
  if (localStorage.getItem("hasLaser") == 'true') {
    $("#hasLaser").attr('checked', true)
  }
  if (localStorage.getItem("hasPenPlotter") == 'true') {
    $("#hasPenPlotter").attr('checked', true)
  }

  // workaround for Lead Plasma specifically (not quite a modular machine, has its own picture on front page overlay)
  if (type == "leadmachine1010" && localStorage.getItem("hasPlasma") == 'true') {
    $('#overlayimg').html(`<img src="images/mch/leadmachine1010plasma.png" style="max-width:100%; max-height:100%;"/>`)
  } else {
    $('#overlayimg').html(`<img src="images/mch/` + type + `.png" style="max-width:100%; max-height:100%;"/>`)
  }
};

$(document).ready(function() {
  var modal = `
  <!-- Settings Modal -->

  <div class="dialog dark" data-overlay-click-close="true" data-role="dialog" id="settingsmodal" data-width="830" data-to-top="true">
    <div class="dialog-title">Application Settings</div>
    <div class="dialog-content" style="max-height: calc(100vh - 200px);overflow-y: auto; overflow-x: hidden;">
      <form>

        <div>
          <center><h6>Welcome to OpenBuilds CAM</h6> Let us help you get set up!</center>
        </div>

          <ul class="step-list mb-3">

            <li>
              <h6>Select your Machine<br><small>Tell us what machine you have?</small></h6>
              <div>
                <a style="width: 100%;" class="button dropdown-toggle bd-openbuilds outline" id="context_toggle2"><img src="images/mch/sphinx55.png"/> Select Machine</a>
                <ul class="ribbon-dropdown" data-role="dropdown" data-duration="100">
                    <li>
                      <a href="#" class="dropdown-toggle"><img src="images/mch/acro55.png" width="16px"/> OpenBuilds ACRO</a>
                      <ul class="ribbon-dropdown" data-role="dropdown">
                        <li onclick="selectMachine('acro55');"><a href="#"><img src="images/mch/acro55.png" width="16px"/>  OpenBuilds ACRO 55</a></li>
                        <li onclick="selectMachine('acro510');"><a href="#"><img src="images/mch/acro510.png" width="16px"/>  OpenBuilds ACRO 510</a></li>
                        <li onclick="selectMachine('acro1010');"><a href="#"><img src="images/mch/acro1010.png" width="16px"/>  OpenBuilds ACRO 1010</a></li>
                        <li onclick="selectMachine('acro1510');"><a href="#"><img src="images/mch/acro1510.png" width="16px"/>  OpenBuilds ACRO 1510</a></li>
                        <li onclick="selectMachine('acro1515');"><a href="#"><img src="images/mch/acro1515.png" width="16px"/>  OpenBuilds ACRO 1515</a></li>
                        <li class="divider"></li>
                        <li onclick="selectMachine('acroA1');"><a href="#"><img src="images/mch/acroA1.png" width="16px"/>  OpenBuilds ACRO A1</a></li>
                      </ul>
                    </li>
                    <li>
                      <a href="#" class="dropdown-toggle"><img src="images/mch/cbeam.png" width="16px"/>  OpenBuilds C-Beam Machine</a>
                      <ul class="ribbon-dropdown" data-role="dropdown">
                        <li onclick="selectMachine('cbeam');"><a href="#"><img src="images/mch/cbeam.png" width="16px"/>  OpenBuilds C-Beam Machine</a></li>
                        <li onclick="selectMachine('cbeamxl');"><a href="#"><img src="images/mch/cbeamxl.png" width="16px"/>  OpenBuilds C-Beam XL</a></li>
                      </ul>
                    </li>
                    <li>
                      <a href="#" class="dropdown-toggle"><img src="images/mch/leadmachine1010.png" width="16px"/>  OpenBuilds LEAD Machine</a>
                      <ul class="ribbon-dropdown" data-role="dropdown">
                        <li onclick="selectMachine('leadmachine1010');"><a href="#"><img src="images/mch/leadmachine1010.png" width="16px"/>OpenBuilds LEAD 1010</a></li>
                        <li onclick="selectMachine('leadmachine1515');"><a href="#"><img src="images/mch/leadmachine1515.png" width="16px"/>OpenBuilds LEAD 1515</a></li>
                      </ul>
                    </li>
                    <li><a href="#" onclick="selectMachine('minimill');"><img src="images/mch/minimill.png" width="16px"/>  OpenBuilds MiniMill</a></li>

                    <li><a href="#" onclick="selectMachine('custom');"><img src="images/mch/custom.png" width="16px"/>  Custom Machine</a></li>

                  </ul>
                <input type="hidden" class="form-control form-control-sm" id="machinetype" value="" >
              </div>
            </li>

            <li>
              <h6>Add-Ons Installed<br><small>Telling us what kind of attachments the machine has, allows us to setup the G-Code to control these devices correctly from within the job</small></h6>

              <ul class="image-checkbox-ul">
                <li>
                  <input type="checkbox" onchange="selectToolhead('router')" id="hasRouter"  />
                  <label for="hasRouter"><img src="./images/router11.png" /></label>
                  <div class="image-checkbox-text">RoutER11 with IoT Relay</div>
                </li>
                <li>
                  <input type="checkbox" onchange="selectToolhead('plasma')" id="hasPlasma" />
                  <label for="hasPlasma"><img src="./images/leadplasma.png" /></label>
                  <div class="image-checkbox-text">LEAD 1010 Plasma Add-On</div>
                </li>
                <li>
                  <input type="checkbox" onchange="selectToolhead('laser')" id="hasLaser" />
                  <label for="hasLaser"><img src="./images/laser.png" /></label>
                  <div class="image-checkbox-text">Laser Diode Module</div>
                </li>
                <li>
                  <input type="checkbox" onchange="selectToolhead('penPlotter')" id="hasPenPlotter" />
                  <label for="hasPenPlotter"><img src="./images/plotter.png" /></label>
                  <div class="image-checkbox-text">SCRIBE<br>Pen Lifter</div>
                </li>
                <li>
                  <input type="checkbox" onchange="selectToolhead('spindle')" id="hasSpindle" />
                  <label for="hasSpindle"><img src="./images/vfd.png" /></label>
                  <div class="image-checkbox-text">Variable Speed Spindle</div>
                </li>
                <li>
                  <input type="checkbox" onchange="selectToolhead('dust')" id="hasDust" />
                  <label for="hasDust"><img src="./images/dustshoe.png" /></label>
                  <div class="image-checkbox-text">Dust Shoe with Extractor</div>
                </li>
              </ul>

            </li>

            <li>
              <h6>Advanced Settings<br><small>If you have any custom requirements, please customise the settings in the Advanced Settings section</small></h6>

              <button class="button" id="collapse_toggle_2">Show Advanced Settings</button>
              <div class="pos-relative">
                  <div data-role="collapse"
                       data-toggle-element="#collapse_toggle_2" data-collapsed="true">


                       <div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">X-Axis Length</label>
                             <div class="cell-sm-6">
                               <input type="number" data-role="input" data-clear-button="false" class="form-control " id="sizexmax" value="200" data-append="mm" step="any">
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">Y-Axis Length</label>
                             <div class="cell-sm-6">
                               <input type="number" data-role="input" data-clear-button="false" class="form-control " id="sizeymax" value="200" data-append="mm" step="any">
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">Z-Axis Length</label>
                             <div class="cell-sm-6">
                               <input type="number" data-role="input" data-clear-button="false" class="form-control " id="sizezmax" value="100" data-append="mm" step="any">
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">Spindle / Laser / Plasma Command</label>
                             <div class="cell-sm-6">
                                 <input type="text" data-role="input" data-clear-button="false" class="form-control form-control-sm" id="scommand" value="S" >
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">Power/Speed Scale</label>
                             <div class="cell-sm-6">
                               <input type="number" data-role="input" data-clear-button="false" class="form-control form-control-sm" id="scommandscale" value="1000" data-prepend="0 to" step="any">
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">Power/Speed on new-line</label>
                             <div class="cell-sm-6">
                                   <input data-role="checkbox" type="checkbox" id="scommandnewline" value="option1">
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">Rapid Move Command</label>
                             <div class="cell-sm-6">
                                 <input type="text" data-role="input" data-clear-button="false" class="form-control form-control-sm" id="g0command" value="G0" >
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">Linear Move Command</label>
                             <div class="cell-sm-6">
                                 <input type="text" data-role="input" data-clear-button="false" class="form-control form-control-sm" id="g1command" value="G1" >
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">Start G-Code</label>
                             <div class="cell-sm-6">
                               <textarea id="startgcode" data-role="textarea" data-auto-size="true" data-clear-button="false" placeholder="For example M4 G28 G90 M80 - supports multi line commands"></textarea>
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">End G-Code</label>
                             <div class="cell-sm-6">
                               <textarea id="endgcode" data-role="textarea" data-auto-size="true" data-clear-button="false" placeholder="For example M5 M81 G28 - supports multi line commands"></textarea>
                             </div>
                         </div>

                         <div class="row mb-2">
                             <label class="cell-sm-6">Plasma: Touch Off Sequence</label>
                             <div class="cell-sm-6">
                               <textarea id="ihsgcode" data-role="textarea" contenteditable="true" data-auto-size="true" data-clear-button="false" placeholder="G0 + clearanceHeight + \nG38.2 Z-30 F100\nG10 L20 P1 Z0"></textarea>
                             </div>
                         </div>

                         <div class="row mb-0">
                             <label class="cell-sm-6">Performance: Disable Tool-Width Preview<br>
                             <span class="text-small">
                               This can speed up toolpath calculations, but will
                               disable the toolpath-width preview: You'll only see
                               the centerline of the toolpath, not the width of the
                               cut.  Helps slow PCs work better
                             </span>
                             </label>
                             <div class="cell-sm-6">
                                 <input data-role="checkbox" type="checkbox" id="performanceLimit" value="option1">
                             </div>
                         </div>

                       </div>


                  </div>
              </div>


            </li>
          </ul>
        </form>
    </div>
    <div class="dialog-actions">

      <button class="button secondary outline js-dialog-close">Cancel</button>
      <button id="savesettings" type="button" class="button js-dialog-close success">Save</button>
    </div>
  </div>
  <!-- #settingsmodal -->
  `
  $("body").append(modal);
});