From 378efddbbe776cdfd9be8c5904afeb4eecf33291 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 02 May 2014 05:01:18 -0400
Subject: [PATCH] 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 129ad60..91dc6d6 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 @@
       $('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 0dc0794..9378cdc 100644
--- a/plugins/legacy_browser/legacy_browser.php
+++ b/plugins/legacy_browser/legacy_browser.php
@@ -25,10 +25,17 @@
         // 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(
+            '|(<script src="program/js/app(\.min)?\.js\?s=[0-9]+" type="text/javascript"></script>)|',
+            '\\1<script src="plugins/legacy_browser/js/iehacks.js?s=' . $ts2 . '" type="text/javascript"></script>',
+            $args['content'], 1, $count);
+
         $args['content'] = preg_replace(
             '|<script src="program/js/jquery\.min\.js\?s=[0-9]+" type="text/javascript"></script>|',
-            '<script src="plugins/legacy_browser/js/jquery.min.js?s=' . $ts1 . '" type="text/javascript"></script>'."\n"
-            .'<script src="plugins/legacy_browser/js/iehacks.js?s=' . $ts2 . '" type="text/javascript"></script>',
+            '<script src="plugins/legacy_browser/js/jquery.min.js?s=' . $ts1 . '" type="text/javascript"></script>'
+            . ($count ? '' : "\n".'<script src="plugins/legacy_browser/js/iehacks.js?s=' . $ts2 . '" type="text/javascript"></script>'),
             $args['content'], 1);
 
         return $args;
diff --git a/program/js/app.js b/program/js/app.js
index 5055b4d..5d04430 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -7611,7 +7611,7 @@
   {
     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 @@
     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 @@
       // 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;
     }
   };

--
Gitblit v1.9.1