diff --git a/lib/gollum/frontend/public/javascript/gollum-editor/gollum.editor.js b/lib/gollum/frontend/public/javascript/gollum-editor/gollum.editor.js index cf5560c0..0d7fd77d 100755 --- a/lib/gollum/frontend/public/javascript/gollum-editor/gollum.editor.js +++ b/lib/gollum/frontend/public/javascript/gollum-editor/gollum.editor.js @@ -503,11 +503,46 @@ */ getFieldSelectionPosition: function( $field ) { if ($field.length) { - return { - start: $field[0].selectionStart, - end: $field[0].selectionEnd + var start = 0, end = 0, normalizedValue, range, + textInputRange, len, endRange; + var el = $field.get(0); + + if (typeof el.selectionStart == "number" && + typeof el.selectionEnd == "number") { + start = el.selectionStart; + end = el.selectionEnd; + } else { + range = document.selection.createRange(); + + if (range && range.parentElement() == el) { + len = el.value.length; + normalizedValue = el.value.replace(/\r\n/g, "\n"); + textInputRange = el.createTextRange(); + textInputRange.moveToBookmark(range.getBookmark()); + endRange = el.createTextRange(); + endRange.collapse(false); + + if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { + start = end = len; + } else { + start = -textInputRange.moveStart("character", -len); + start += normalizedValue.slice(0, start).split("\n").length - 1; + + if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) { + end = len; + } else { + end = -textInputRange.moveEnd("character", -len); + end += normalizedValue.slice(0, end).split("\n").length - 1; + } + } + } } - } + + return { + start: start, + end: end + }; + } // end if ($field.length) },