From c2df5d4e13e9ab63e8f152d638eec35284efdf2f Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Mon, 09 Mar 2015 09:24:05 -0400
Subject: [PATCH] Unified request* event arguments handling, added support for _unlock and _action parameters

---
 program/js/common.js |   85 ++++++++++++++++++++++++++++++------------
 1 files changed, 60 insertions(+), 25 deletions(-)

diff --git a/program/js/common.js b/program/js/common.js
index b532c36..3babf1e 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -31,7 +31,6 @@
 var SHIFT_KEY = 2;
 var CONTROL_SHIFT_KEY = 3;
 
-
 /**
  * Default browser check class
  * @constructor
@@ -40,8 +39,6 @@
 {
   var n = navigator;
 
-  this.ver = parseFloat(n.appVersion);
-  this.appver = n.appVersion;
   this.agent = n.userAgent;
   this.agent_lc = n.userAgent.toLowerCase();
   this.name = n.appName;
@@ -65,19 +62,20 @@
   this.ie = (document.all && !window.opera) || (this.win && this.agent_lc.indexOf('trident/') > 0);
 
   if (this.ie) {
-    this.ie7 = this.appver.indexOf('MSIE 7') > 0;
-    this.ie8 = this.appver.indexOf('MSIE 8') > 0;
-    this.ie9 = this.appver.indexOf('MSIE 9') > 0;
+    this.ie7 = n.appVersion.indexOf('MSIE 7') > 0;
+    this.ie8 = n.appVersion.indexOf('MSIE 8') > 0;
+    this.ie9 = n.appVersion.indexOf('MSIE 9') > 0;
   }
   else if (window.opera) {
-    this.opera = true;
+    this.opera = true; // Opera < 15
     this.vendver = opera.version();
   }
   else {
     this.chrome = this.agent_lc.indexOf('chrome') > 0;
-    this.safari = !this.chrome && (this.webkit || this.agent_lc.indexOf('safari') > 0);
+    this.opera = this.webkit && this.agent.indexOf(' OPR/') > 0; // Opera >= 15
+    this.safari = !this.chrome && !this.opera && (this.webkit || this.agent_lc.indexOf('safari') > 0);
     this.konq = this.agent_lc.indexOf('konqueror') > 0;
-    this.mz = this.dom && !this.chrome && !this.safari && !this.konq && this.agent.indexOf('Mozilla') >= 0;
+    this.mz = this.dom && !this.chrome && !this.safari && !this.konq && !this.opera && this.agent.indexOf('Mozilla') >= 0;
     this.iphone = this.safari && (this.agent_lc.indexOf('iphone') > 0 || this.agent_lc.indexOf('ipod') > 0);
     this.ipad = this.safari && this.agent_lc.indexOf('ipad') > 0;
   }
@@ -104,7 +102,7 @@
   this.xmlhttp_test = function()
   {
     var activeX_test = new Function("try{var o=new ActiveXObject('Microsoft.XMLHTTP');return true;}catch(err){return false;}");
-    this.xmlhttp = (window.XMLHttpRequest || (window.ActiveXObject && activeX_test()));
+    this.xmlhttp = window.XMLHttpRequest || (('ActiveXObject' in window) && activeX_test());
     return this.xmlhttp;
   };
 
@@ -224,7 +222,7 @@
     p.element = document;
 
   if (!p.object._rc_events)
-    p.object._rc_events = [];
+    p.object._rc_events = {};
 
   var key = p.event + '*' + p.method;
   if (!p.object._rc_events[key])
@@ -287,8 +285,11 @@
 is_keyboard: function(e)
 {
   return e && (
-      (e.mozInputSource && e.mozInputSource == e.MOZ_SOURCE_KEYBOARD) ||
-      (!e.pageX && (e.pageY || 0) <= 0 && !e.clientX && (e.clientY || 0) <= 0)
+      (e.pointerType !== undefined && e.pointerType !== 'mouse') ||       // IE 11+
+      (e.mozInputSource && e.mozInputSource == e.MOZ_SOURCE_KEYBOARD) ||  // Firefox
+      (e.offsetX === 0 && e.offsetY === 0) || // Opera
+      (!e.pageX && (e.pageY || 0) <= 0 && !e.clientX && (e.clientY || 0) <= 0) ||  // others
+      (bw.ie && rcube_event._last_keyboard_event && rcube_event._last_keyboard_event.target == e.target)  // hack for IE <= 10
     );
 },
 
@@ -491,21 +492,25 @@
 function rcube_find_object(id, d)
 {
   var n, f, obj, e;
-  if(!d) d = document;
 
-  if(d.getElementsByName && (e = d.getElementsByName(id)))
+  if (!d) d = document;
+
+  if (d.getElementById)
+    if (obj = d.getElementById(id))
+      return obj;
+
+  if (!obj && d.getElementsByName && (e = d.getElementsByName(id)))
     obj = e[0];
-  if(!obj && d.getElementById)
-    obj = d.getElementById(id);
-  if(!obj && d.all)
+
+  if (!obj && d.all)
     obj = d.all[id];
 
-  if(!obj && d.images.length)
+  if (!obj && d.images.length)
     obj = d.images[id];
 
   if (!obj && d.forms.length) {
     for (f=0; f<d.forms.length; f++) {
-      if(d.forms[f].name == id)
+      if (d.forms[f].name == id)
         obj = d.forms[f];
       else if(d.forms[f].elements[id])
         obj = d.forms[f].elements[id];
@@ -513,7 +518,8 @@
   }
 
   if (!obj && d.layers) {
-    if (d.layers[id]) obj = d.layers[id];
+    if (d.layers[id])
+      obj = d.layers[id];
     for (n=0; !obj && n<d.layers.length; n++)
       obj = rcube_find_object(id, d.layers[n].document);
   }
@@ -527,8 +533,8 @@
   var mouse = rcube_event.get_mouse_pos(ev),
     pos = $(obj).offset();
 
-  return ((mouse.x >= pos.left) && (mouse.x < (pos.left + obj.offsetWidth)) &&
-    (mouse.y >= pos.top) && (mouse.y < (pos.top + obj.offsetHeight)));
+  return (mouse.x >= pos.left) && (mouse.x < (pos.left + obj.offsetWidth)) &&
+    (mouse.y >= pos.top) && (mouse.y < (pos.top + obj.offsetHeight));
 };
 
 
@@ -540,6 +546,7 @@
       (path ? "; path=" + path : "") +
       (domain ? "; domain=" + domain : "") +
       (secure ? "; secure" : "");
+
   document.cookie = curCookie;
 };
 
@@ -607,8 +614,8 @@
 }
 
 // array utility function
-Array.prototype.last = function() {
-  return this[this.length-1];
+jQuery.last = function(arr) {
+  return arr && arr.length ? arr[arr.length-1] : undefined;
 }
 
 // jQuery plugin to emulate HTML5 placeholder attributes on input elements
@@ -647,6 +654,34 @@
   });
 };
 
+// function to parse query string into an object
+rcube_parse_query = function(query)
+{
+  if (!query)
+    return {};
+
+  var params = {}, e, k, v,
+    re = /([^&=]+)=?([^&]*)/g,
+    decodeRE = /\+/g, // Regex for replacing addition symbol with a space
+    decode = function (str) { return decodeURIComponent(str.replace(decodeRE, ' ')); };
+
+  query = query.replace(/\?/, '');
+
+  while (e = re.exec(query)) {
+    k = decode(e[1]);
+    v = decode(e[2]);
+
+    if (k.substring(k.length - 2) === '[]') {
+      k = k.substring(0, k.length - 2);
+      (params[k] || (params[k] = [])).push(v);
+    }
+    else
+      params[k] = v;
+  }
+
+  return params;
+};
+
 
 // This code was written by Tyler Akins and has been placed in the
 // public domain.  It would be nice if you left this header intact.

--
Gitblit v1.9.1