diff --git a/static/js/script.js b/static/js/script.js index 7307cc4a0882027e3bff9b94e6299a7f995cf8d1..8b21136caeba2cf4d49aa81b661331e87e05a611 100644 --- a/static/js/script.js +++ b/static/js/script.js @@ -28,6 +28,64 @@ function resize_textarea_delayed(textarea) { return _inner_resize_textarea_delayed; } +function tab_on_key_down(textarea) { + function _inner_tab_on_key_down(e) { + console.log(e); + if (e.keyCode == 9) { + var start = textarea.selectionStart; + var end = textarea.selectionEnd; + var text = textarea.value; + if (start == end) { + var text_before = text.substring(0, start); + var text_after = text.substring(end); + textarea.value = text_before + "\t" + text_after; + textarea.selectionStart = start+1; + textarea.selectionEnd = end+1; + } else { + var text_before = text.substring(0, start); + var text_center = text.substring(start, end); + var text_after = text.substring(end); + lines = text_center.split("\n"); + var forward = !e.shiftKey; + var new_center = ""; + if (forward) { + for (var i = 0; i < lines.length; i++) { + new_center += "\t" + lines[i]; + if (i != lines.length - 1) { + new_center += "\n"; + } + } + textarea.value = text_before + new_center + text_after; + textarea.selectionStart = start; + textarea.selectionEnd = end + lines.length; + } else { + var reduction = 0; + var start_reduction = 0; + for (var i = 0; i < lines.length; i++) { + var newline = lines[i]; + if (newline[0] == "\t") { + newline = newline.substring(1); + reduction += 1; + if (i == 0) { + start_reduction += 1; + } + } + new_center += newline; + if (i != lines.length - 1) { + new_center += "\n"; + } + } + textarea.value = text_before + new_center + text_after; + textarea.selectionStart = start - start_reduction; + textarea.selectionEnd = end - reduction; + } + } + e.preventDefault(); + } + } + return _inner_tab_on_key_down; +} + window.onload=function() { // toggle expansion var buttons = document.getElementsByClassName("expansion-button"); @@ -35,15 +93,17 @@ window.onload=function() { var button = buttons[i]; button.onclick = toggle_expansion; } - // resize textarea + // resize of and tabs in textarea var textareas = document.getElementsByTagName("textarea"); for (var i = 0; i < textareas.length; i++) { var textarea = textareas[i]; + var delayed = resize_textarea_delayed(textarea); + var tab_func = tab_on_key_down(textarea); textarea.addEventListener("change", resize_textarea(textarea), false); - textarea.addEventListener("cut", resize_textarea_delayed(textarea), false); - textarea.addEventListener("paste", resize_textarea_delayed(textarea), false); - textarea.addEventListener("drop", resize_textarea_delayed(textarea), false); - textarea.addEventListener("keydown", resize_textarea_delayed(textarea), false); + textarea.addEventListener("cut", delayed, false); + textarea.addEventListener("paste", delayed, false); + textarea.addEventListener("drop", delayed, false); + textarea.addEventListener("keydown", function(e){tab_func(e); delayed()}, false); resize_textarea(textarea)(); } };