From 378efddbbe776cdfd9be8c5904afeb4eecf33291 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Fri, 2 May 2014 11:01:18 +0200 Subject: MOve more IE<9 code to legacy_browser --- plugins/legacy_browser/js/iehacks.js | 80 ++++++++++++++++++++++++++++++- plugins/legacy_browser/legacy_browser.php | 11 ++++- program/js/app.js | 76 ++++------------------------- 3 files changed, 96 insertions(+), 71 deletions(-) diff --git a/plugins/legacy_browser/js/iehacks.js b/plugins/legacy_browser/js/iehacks.js index 129ad6003..91dc6d63a 100644 --- a/plugins/legacy_browser/js/iehacks.js +++ b/plugins/legacy_browser/js/iehacks.js @@ -1,7 +1,8 @@ // Make getElementById() case-sensitive on IE7 document._getElementById = document.getElementById; -document.getElementById = function(id) { +document.getElementById = function(id) +{ var i = 0, obj = document._getElementById(id); if (obj && obj.id != id) @@ -18,3 +19,80 @@ $(document).ready(function() { $('li:last-child', ul).css('border-bottom', 0); }); }); + +// gets cursor position (IE<9) +rcube_webmail.prototype.get_caret_pos = function(obj) +{ + if (document.selection && document.selection.createRange) { + var range = document.selection.createRange(); + if (range.parentElement() != obj) + return 0; + + var gm = range.duplicate(); + if (obj.tagName == 'TEXTAREA') + gm.moveToElementText(obj); + else + gm.expand('textedit'); + + gm.setEndPoint('EndToStart', range); + var p = gm.text.length; + + return p <= obj.value.length ? p : -1; + } + + return obj.value.length; +}; + +// moves cursor to specified position (IE<9) +rcube_webmail.prototype.set_caret_pos = function(obj, pos) +{ + if (obj.createTextRange) { + var range = obj.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } +}; + +// get selected text from an input field (IE<9) +// http://stackoverflow.com/questions/7186586/how-to-get-the-selected-text-in-textarea-using-jquery-in-internet-explorer-7 +rcube_webmail.prototype.get_input_selection = function(obj) +{ + var start = 0, end = 0, len, + normalizedValue, textInputRange, endRange, + range = document.selection.createRange(); + + if (range && range.parentElement() == obj) { + len = obj.value.length; + normalizedValue = obj.value; //.replace(/\r\n/g, "\n"); + + // create a working TextRange that lives only in the input + textInputRange = obj.createTextRange(); + textInputRange.moveToBookmark(range.getBookmark()); + + // Check if the start and end of the selection are at the very end + // of the input, since moveStart/moveEnd doesn't return what we want + // in those cases + endRange = obj.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, text: normalizedValue.substr(start, end-start)}; +}; diff --git a/plugins/legacy_browser/legacy_browser.php b/plugins/legacy_browser/legacy_browser.php index 0dc0794f3..9378cdc3e 100644 --- a/plugins/legacy_browser/legacy_browser.php +++ b/plugins/legacy_browser/legacy_browser.php @@ -25,10 +25,17 @@ class legacy_browser extends rcube_plugin // replace jQuery 2.x with 1.x $ts1 = filemtime($this->home . '/js/jquery.min.js'); $ts2 = filemtime($this->home . '/js/iehacks.js'); + + // put iehacks.js after app.js + $args['content'] = preg_replace( + '|()|', + '\\1', + $args['content'], 1, $count); + $args['content'] = preg_replace( '||', - ''."\n" - .'', + '' + . ($count ? '' : "\n".''), $args['content'], 1); return $args; diff --git a/program/js/app.js b/program/js/app.js index 5055b4d42..5d0443095 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -7611,7 +7611,7 @@ function rcube_webmail() { var msg = this.env.messages ? this.env.messages[uid] : {}; return msg.mbox || this.env.mailbox; - } + }; // gets cursor position this.get_caret_pos = function(obj) @@ -7619,89 +7619,31 @@ function rcube_webmail() if (obj.selectionEnd !== undefined) return obj.selectionEnd; - if (document.selection && document.selection.createRange) { - var range = document.selection.createRange(); - if (range.parentElement() != obj) - return 0; - - var gm = range.duplicate(); - if (obj.tagName == 'TEXTAREA') - gm.moveToElementText(obj); - else - gm.expand('textedit'); - - gm.setEndPoint('EndToStart', range); - var p = gm.text.length; - - return p <= obj.value.length ? p : -1; - } - return obj.value.length; }; // moves cursor to specified position this.set_caret_pos = function(obj, pos) { - if (obj.setSelectionRange) - obj.setSelectionRange(pos, pos); - else if (obj.createTextRange) { - var range = obj.createTextRange(); - range.collapse(true); - range.moveEnd('character', pos); - range.moveStart('character', pos); - range.select(); + try { + if (obj.setSelectionRange) + obj.setSelectionRange(pos, pos); } + catch(e) {}; // catch Firefox exception if obj is hidden }; // get selected text from an input field - // http://stackoverflow.com/questions/7186586/how-to-get-the-selected-text-in-textarea-using-jquery-in-internet-explorer-7 this.get_input_selection = function(obj) { - var start = 0, end = 0, - normalizedValue, range, - textInputRange, len, endRange; + var start = 0, end = 0, normalizedValue = ''; if (typeof obj.selectionStart == "number" && typeof obj.selectionEnd == "number") { normalizedValue = obj.value; start = obj.selectionStart; end = obj.selectionEnd; } - else { - range = document.selection.createRange(); - - if (range && range.parentElement() == obj) { - len = obj.value.length; - normalizedValue = obj.value; //.replace(/\r\n/g, "\n"); - - // create a working TextRange that lives only in the input - textInputRange = obj.createTextRange(); - textInputRange.moveToBookmark(range.getBookmark()); - - // Check if the start and end of the selection are at the very end - // of the input, since moveStart/moveEnd doesn't return what we want - // in those cases - endRange = obj.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, text:normalizedValue.substr(start, end-start) }; + return {start: start, end: end, text: normalizedValue.substr(start, end-start)}; }; // disable/enable all fields of a form @@ -7723,9 +7665,7 @@ function rcube_webmail() // remember which elem was disabled before lock if (lock && elm.disabled) this.disabled_form_elements.push(elm); - // check this.disabled_form_elements before inArray() as a workaround for FF5 bug - // http://bugs.jquery.com/ticket/9873 - else if (lock || (this.disabled_form_elements && $.inArray(elm, this.disabled_form_elements)<0)) + else if (lock || $.inArray(elm, this.disabled_form_elements) < 0) elm.disabled = lock; } }; -- cgit v1.2.3