From 7ae5432fbfc0e923f2fe8dc62ff77afb8ecc80cf Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Wed, 30 May 2012 04:42:27 -0400
Subject: [PATCH] Abbreviate long attachment file names with ellipsis (#1488499)
---
program/js/common.js | 211 ++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 176 insertions(+), 35 deletions(-)
diff --git a/program/js/common.js b/program/js/common.js
index cacf0ff..a1ba878 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -3,8 +3,11 @@
| Roundcube common js library |
| |
| This file is part of the Roundcube web development suite |
- | Copyright (C) 2005-2007, The Roundcube Dev Team |
- | Licensed under the GNU GPL |
+ | Copyright (C) 2005-2012, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
@@ -52,6 +55,7 @@
this.ie4 = (this.ie && !this.dom);
this.ie5 = (this.dom && this.appver.indexOf('MSIE 5')>0);
this.ie8 = (this.dom && this.appver.indexOf('MSIE 8')>0);
+ this.ie9 = (this.dom && this.appver.indexOf('MSIE 9')>0);
this.ie7 = (this.dom && this.appver.indexOf('MSIE 7')>0);
this.ie6 = (this.dom && !this.ie8 && !this.ie7 && this.appver.indexOf('MSIE 6')>0);
@@ -102,30 +106,23 @@
{
var classname = ' js';
- if (this.ie) {
- classname += ' ie';
- if (this.ie5)
- classname += ' ie5';
- else if (this.ie6)
- classname += ' ie6';
- else if (this.ie7)
- classname += ' ie7';
- else if (this.ie8)
- classname += ' ie8';
- }
+ if (this.ie)
+ classname += ' ie ie'+parseInt(this.vendver);
else if (this.opera)
classname += ' opera';
else if (this.konq)
classname += ' konqueror';
else if (this.safari)
- classname += ' safari';
-
- if (this.chrome)
classname += ' chrome';
- else if (this.iphone)
+ else if (this.chrome)
+ classname += ' chrome';
+
+ if (this.iphone)
classname += ' iphone';
else if (this.ipad)
classname += ' ipad';
+ else if (this.safari || this.chrome)
+ classname += ' webkit';
if (document.documentElement)
document.documentElement.className += classname;
@@ -171,14 +168,12 @@
var opcode = 0;
e = e || window.event;
- if (bw.mac && e) {
+ if (bw.mac && e)
opcode += (e.metaKey && CONTROL_KEY) + (e.shiftKey && SHIFT_KEY);
- return opcode;
- }
- if (e) {
+ else if (e)
opcode += (e.ctrlKey && CONTROL_KEY) + (e.shiftKey && SHIFT_KEY);
- return opcode;
- }
+
+ return opcode;
},
/**
@@ -347,13 +342,25 @@
break;
}
}
-
- if (ret)
- delete ret.event;
+ if (ret && ret.event) {
+ try {
+ delete ret.event;
+ } catch (err) {
+ // IE6-7 doesn't support deleting HTMLFormElement attributes (#1488017)
+ $(ret).removeAttr('event');
+ }
+ }
}
this._event_exec = false;
- delete e.event;
+ if (e.event) {
+ try {
+ delete e.event;
+ } catch (err) {
+ // IE6-7 doesn't support deleting HTMLFormElement attributes (#1488017)
+ $(e).removeAttr('event');
+ }
+ }
return ret;
}
@@ -532,10 +539,17 @@
return out;
};
-// make a string URL safe
+// make a string URL safe (and compatible with PHP's rawurlencode())
function urlencode(str)
{
- return window.encodeURIComponent ? encodeURIComponent(str) : escape(str);
+ if (window.encodeURIComponent)
+ return encodeURIComponent(str).replace('*', '%2A');
+
+ return escape(str)
+ .replace('+', '%2B')
+ .replace('*', '%2A')
+ .replace('/', '%2F')
+ .replace('@', '%40');
};
@@ -607,10 +621,10 @@
return null;
}
else {
- begin += 2;
+ begin += 2;
}
- var end = document.cookie.indexOf(";", begin);
+ var end = dc.indexOf(";", begin);
if (end == -1)
end = dc.length;
@@ -661,13 +675,28 @@
return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};
+// Extend Date prototype to detect Standard timezone without DST
+// from http://www.michaelapproved.com/articles/timezone-detect-and-ignore-daylight-saving-time-dst/
+Date.prototype.getStdTimezoneOffset = function()
+{
+ var m = 12,
+ d = new Date(null, m, 1),
+ tzo = d.getTimezoneOffset();
+
+ while (--m) {
+ d.setUTCMonth(m);
+ if (tzo != d.getTimezoneOffset()) {
+ return Math.max(tzo, d.getTimezoneOffset());
+ }
+ }
+
+ return tzo;
+}
// Make getElementById() case-sensitive on IE
-if (bw.ie)
-{
+if (bw.ie) {
document._getElementById = document.getElementById;
- document.getElementById = function(id)
- {
+ document.getElementById = function(id) {
var i = 0, obj = document._getElementById(id);
if (obj && obj.id != id)
@@ -677,3 +706,115 @@
return obj;
}
}
+
+// jQuery plugin to emulate HTML5 placeholder attributes on input elements
+jQuery.fn.placeholder = function(text) {
+ return this.each(function() {
+ var elem = $(this);
+ this.title = text;
+
+ if ('placeholder' in this) {
+ elem.attr('placeholder', text); // Try HTML5 placeholder attribute first
+ }
+ else { // Fallback to Javascript emulation of placeholder
+ this._placeholder = text;
+ elem.blur(function(e) {
+ if ($.trim(elem.val()) == "")
+ elem.val(text);
+ elem.triggerHandler('change');
+ })
+ .focus(function(e) {
+ if ($.trim(elem.val()) == text)
+ elem.val("");
+ elem.triggerHandler('change');
+ })
+ .change(function(e) {
+ var active = elem.val() == text;
+ elem[(active ? 'addClass' : 'removeClass')]('placeholder').attr('spellcheck', active);
+ });
+
+ if (this != document.activeElement) // Do not blur currently focused element
+ elem.blur();
+ }
+ });
+};
+
+
+// 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.
+// Base64 code from Tyler Akins -- http://rumkin.com
+var Base64 = (function () {
+ var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+ var obj = {
+ /**
+ * Encodes a string in base64
+ * @param {String} input The string to encode in base64.
+ */
+ encode: function (input) {
+ if (typeof(window.btoa) === 'function')
+ return btoa(input);
+
+ var chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0, output = '', len = input.length;
+
+ do {
+ chr1 = input.charCodeAt(i++);
+ chr2 = input.charCodeAt(i++);
+ chr3 = input.charCodeAt(i++);
+
+ enc1 = chr1 >> 2;
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+ enc4 = chr3 & 63;
+
+ if (isNaN(chr2))
+ enc3 = enc4 = 64;
+ else if (isNaN(chr3))
+ enc4 = 64;
+
+ output = output
+ + keyStr.charAt(enc1) + keyStr.charAt(enc2)
+ + keyStr.charAt(enc3) + keyStr.charAt(enc4);
+ } while (i < len);
+
+ return output;
+ },
+
+ /**
+ * Decodes a base64 string.
+ * @param {String} input The string to decode.
+ */
+ decode: function (input) {
+ if (typeof(window.atob) === 'function')
+ return atob(input);
+
+ var chr1, chr2, chr3, enc1, enc2, enc3, enc4, len, i = 0, output = '';
+
+ // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+ len = input.length;
+
+ do {
+ enc1 = keyStr.indexOf(input.charAt(i++));
+ enc2 = keyStr.indexOf(input.charAt(i++));
+ enc3 = keyStr.indexOf(input.charAt(i++));
+ enc4 = keyStr.indexOf(input.charAt(i++));
+
+ chr1 = (enc1 << 2) | (enc2 >> 4);
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+ chr3 = ((enc3 & 3) << 6) | enc4;
+
+ output = output + String.fromCharCode(chr1);
+
+ if (enc3 != 64)
+ output = output + String.fromCharCode(chr2);
+ if (enc4 != 64)
+ output = output + String.fromCharCode(chr3);
+ } while (i < len);
+
+ return output;
+ }
+ };
+
+ return obj;
+})();
--
Gitblit v1.9.1