/kai/public/javascripts/rst_helpers.js

https://bitbucket.org/bbangert/kai/ · JavaScript · 129 lines · 112 code · 8 blank · 9 comment · 30 complexity · 54b6f76eae78820816bb70e4a5ce7adf MD5 · raw file

  1. function getCaretPosition(element){
  2. var caret = 0;
  3. if ('selectionStart' in element) { // W3
  4. var selectionStart = element.selectionStart;
  5. var selectionEnd = element.selectionEnd;
  6. return selectionStart;
  7. } else { // IE
  8. // Walk up the tree looking for this textarea's document node.
  9. var doc = element;
  10. while (doc.parentNode) {
  11. doc = doc.parentNode;
  12. }
  13. if (!doc.selection || !doc.selection.createRange) {
  14. // Not IE?
  15. return null;
  16. }
  17. var range = doc.selection.createRange();
  18. if (range.parentElement() != element) {
  19. // Cursor not in this textarea.
  20. return null;
  21. }
  22. var newRange = doc.body.createTextRange();
  23. var collapsed = (range.text == '');
  24. newRange.moveToElementText(element);
  25. if (!collapsed) {
  26. newRange.setEndPoint('EndToEnd', range);
  27. }
  28. newRange.setEndPoint('EndToStart', range);
  29. var startPrefix = newRange.text;
  30. return startPrefix.length;
  31. }
  32. }
  33. /*
  34. http://stackoverflow.com/questions/29709/how-do-i-get-the-coordinates-of-the-caret-in-text-boxes
  35. */
  36. function insertAtCaret(myField, myValue) {
  37. /* selecion model - ie */
  38. if (document.selection) {
  39. myField.focus();
  40. sel = document.selection.createRange();
  41. sel.text = myValue;
  42. }
  43. /* field.selectionstart/end firefox */
  44. else if (myField.selectionStart || myField.selectionStart == '0' ) {
  45. var startPos = myField.selectionStart;
  46. var endPos = myField.selectionEnd;
  47. myField.value = myField.value.substring(0, startPos)
  48. + myValue
  49. + myField.value.substring(endPos, myField.value.length);
  50. myField.selectionStart = startPos + myValue.length;
  51. myField.selectionEnd = startPos + myValue.length;
  52. myField.focus();
  53. }
  54. // cursor not active/present
  55. else {
  56. myField.value += myValue;
  57. }
  58. }
  59. var contentbox = document.getElementById("snippet_form_content");
  60. contentbox.focus();
  61. if(contentbox.addEventListener ) {
  62. contentbox.addEventListener('keydown',this.keyHandler,false);
  63. } else if(contentbox.attachEvent ) {
  64. contentbox.attachEvent('onkeydown',this.keyHandler); /* damn IE hack */
  65. }
  66. var onchange_timer = null;
  67. function keyHandler(e) {
  68. var TABKEY = 9;
  69. var ENTER = 13;
  70. if(e.keyCode == TABKEY) {
  71. setTimeout(function(){
  72. var sc = contentbox.scrollTop;
  73. var caret = getCaretPosition(contentbox);
  74. var val = contentbox.value.substr(0, caret);
  75. var i = val.lastIndexOf('\n');
  76. var v = ' ';
  77. switch((val.length - i - 1) % 4){
  78. case 1:
  79. v = ' ';
  80. break;
  81. case 2:
  82. v = ' ';
  83. break;
  84. case 3:
  85. v = ' ';
  86. break;
  87. }
  88. insertAtCaret(contentbox, v);
  89. contentbox.scrollTop = sc;
  90. },0)
  91. if(e.preventDefault) {
  92. e.preventDefault();
  93. }
  94. return false;
  95. } else if (e.keyCode == ENTER) {
  96. setTimeout(function(){
  97. var sc = contentbox.scrollTop;
  98. var caret = getCaretPosition(contentbox);
  99. var val = contentbox.value.substr(0, caret);
  100. var i = val.lastIndexOf('\n');
  101. if (i > 0 && i+1 < caret) {
  102. var curline = contentbox.value.substring(i+1, caret);
  103. var spaces = curline.replace(/^(\s+).*/, '$1');
  104. var v = '';
  105. if (spaces.match(/^\s+$/)) {
  106. v = '\n' + spaces;
  107. } else {
  108. v = '\n';
  109. }
  110. insertAtCaret(contentbox, v);
  111. contentbox.scrollTop = sc;
  112. } else {
  113. insertAtCaret(contentbox, '\n');
  114. contentbox.scrollTop = sc;
  115. }
  116. },0)
  117. if(e.preventDefault) {
  118. e.preventDefault();
  119. }
  120. }
  121. }