td {
     vertical-align: top;
 }
-div.bad, td.bad, tr.bad, span.bad {
+div.bad, td.bad, tr.bad, span.bad, input[type="submit"].bad {
     {{macros.css_bg_red()}}
 }
 {% block css %}{% endblock %}
 
 <div id="header">
 <form action="{{path}}" method="POST">
+<span class="disable_on_change">
 ledger <a href="/ledger_structured">structured</a>
 / <a href="/ledger_raw">raw</a>
 · <a href="/balance">balance</a>
-· <input type="submit" name="file_load" value="reload" />
+<span class="disable_on_change">
+· <input type="submit"name="file_load" value="reload" />
+</span>
 {% if tainted %}
-    · <span class="bad">unsaved changes:<input type="submit" name="file_save" value="save"></span>
+    · <span class="bad">unsaved changes:</span><input type="submit" class="bad" name="file_save" value="save">
 {% endif %}
+</span>
 </form>
 </div>
 
 
     Array.from(document.getElementsByClassName('enable_on_change')).forEach((el) => {
         el.disabled = false;
     });
-    // deactivate "disable_on_change" links
+    // deactivate "disable_on_change" span contents
     Array.from(document.getElementsByClassName('disable_on_change')).forEach((el) => {
-        if (el.tagName == 'SPAN') {
-            let links_text = '';
-            Array.from(el.childNodes).forEach((node) => {
-                links_text += node.textContent + ' ';
-            });
-            el.innerHTML = '';
-            const del = document.createElement('del');
-            el.appendChild(del);
-            del.textContent = links_text;
-        } else if (el.type == 'button') {
-            el.disabled = true;
-        }
+        old_nodes = Array.from(el.childNodes);
+        el.innerHTML = '';
+        old_nodes.forEach((node) => {
+            if (node.tagName == 'INPUT') {
+                node.disabled = true;
+                el.appendChild(node);
+            } else if (node.tagName == 'A') {
+                const del = document.createElement('del');
+                del.textContent = node.textContent;
+                el.appendChild(del);
+            } else {
+                el.appendChild(node);
+            };
+        });
     });
     // remove oninput handlers no longer needed (since we only ever go one way)
     Array.from(document.querySelectorAll('*')
 
 
 {% block content %}
 {{macros.edit_bar(block,'structured','raw')}}
-<input type="button" onclick="mirror()" value="mirror" class="disable_on_change">
-<input type="button" onclick="fill_sink()" value="fill sink" class="disable_on_change">
+<span class="disable_on_change">
+<input type="button" onclick="mirror()" value="mirror">
+<input type="button" onclick="fill_sink()" value="fill sink">
 |
-<input type="button" onclick="replace()" value="replace string" class="disable_on_change">
+<input type="button" onclick="replace()" value="replace string">
 from
 <input id="replace_from" />
 to
 <input id="replace_to" />
+</span>
 <hr />
 <table id="booking_lines" class="alternating">
 </table>