From 686ff4b538b3fc4f0c632b1d35a123b2ee3770cc Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 23 Jan 2015 03:49:47 -0500
Subject: [PATCH] Fix keyboard navigation and css in datepicker widget across many Firefox versions

---
 CHANGELOG                                                 |    1 
 plugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css |    4 +-
 plugins/jqueryui/themes/larry/jquery-ui-css.diff          |    4 +-
 plugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js        |   31 +++++++++++++--
 program/js/app.js                                         |    4 +-
 plugins/jqueryui/js/jquery-ui-accessible-datepicker.js    |   31 +++++++++++++--
 6 files changed, 59 insertions(+), 16 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 007c293..ce2dccf 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -14,6 +14,7 @@
 - Fix bug where Reply-To address was ignored on reply to messages sent by self (#1490233)
 - Fix bug where empty fieldmap config entries caused empty results of ldap search (#1490229)
 - Fix bug where drafts list wasn't refreshed after draft message was sent from another window (#1490238)
+- Fix keyboard navigation and css in datepicker widget across many Firefox versions
 
 RELEASE 1.1-rc
 --------------
diff --git a/plugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js b/plugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js
index ea4edec..73248ec 100755
--- a/plugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js
+++ b/plugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js
@@ -109,17 +109,23 @@
 		var that = this;
 
 		// register additional keyboard events to control date selection with cursor keys
-		$(target).unbind('keyup.datepicker-extended').bind('keyup.datepicker-extended', function(event) {
+		$(target).unbind('keydown.datepicker-extended').bind('keydown.datepicker-extended', function(event) {
 			var inc = 1;
 			switch (event.keyCode) {
 				case 109:
+				case 173:
 				case 189:  // "minus"
 					inc = -1;
+				case 61:
 				case 107:
 				case 187:  // "plus"
+					// do nothing if the input does not contain full date string
+					if (this.value.length < that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear).length) {
+						return true;
+					}
 					that._adjustInstDate(inst, inc, 'D');
-					that._selectDate(target, that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear));
-					break;
+					that._selectDateRC(target, that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear));
+					return false;
 
 				case $.ui.keyCode.UP:
 				case $.ui.keyCode.DOWN:
@@ -222,8 +228,23 @@
 			inst.dpDiv.find('.ui-datepicker-calendar').focus();
 			inst._hasfocus = false;
 		}
-	}
+	},
 
+	_selectDateRC: function(id, dateStr) {
+		var target = $(id), inst = this._getInst(target[0]);
+
+		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+		if (inst.input) {
+			inst.input.val(dateStr);
+		}
+		this._updateAlternate(inst);
+		if (inst.input) {
+			inst.input.trigger("change"); // fire the change event
+		}
+		if (inst.inline) {
+			this._updateDatepicker(inst);
+		}
+	}
 });
 
-}(jQuery));
\ No newline at end of file
+}(jQuery));
diff --git a/plugins/jqueryui/js/jquery-ui-accessible-datepicker.js b/plugins/jqueryui/js/jquery-ui-accessible-datepicker.js
index 1c79e13..ef7561c 100644
--- a/plugins/jqueryui/js/jquery-ui-accessible-datepicker.js
+++ b/plugins/jqueryui/js/jquery-ui-accessible-datepicker.js
@@ -94,17 +94,23 @@
 		var that = this;
 
 		// register additional keyboard events to control date selection with cursor keys
-		$(target).unbind('keyup.datepicker-extended').bind('keyup.datepicker-extended', function(event) {
+		$(target).unbind('keydown.datepicker-extended').bind('keydown.datepicker-extended', function(event) {
 			var inc = 1;
 			switch (event.keyCode) {
 				case 109:
+				case 173:
 				case 189:  // "minus"
 					inc = -1;
+				case 61:
 				case 107:
 				case 187:  // "plus"
+					// do nothing if the input does not contain full date string
+					if (this.value.length < that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear).length) {
+						return true;
+					}
 					that._adjustInstDate(inst, inc, 'D');
-					that._selectDate(target, that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear));
-					break;
+					that._selectDateRC(target, that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear));
+					return false;
 
 				case $.ui.keyCode.UP:
 				case $.ui.keyCode.DOWN:
@@ -207,8 +213,23 @@
 			inst.dpDiv.find('.ui-datepicker-calendar').focus();
 			inst._hasfocus = false;
 		}
-	}
+	},
 
+	_selectDateRC: function(id, dateStr) {
+		var target = $(id), inst = this._getInst(target[0]);
+
+		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+		if (inst.input) {
+			inst.input.val(dateStr);
+		}
+		this._updateAlternate(inst);
+		if (inst.input) {
+			inst.input.trigger("change"); // fire the change event
+		}
+		if (inst.inline) {
+			this._updateDatepicker(inst);
+		}
+	}
 });
 
-}(jQuery));
\ No newline at end of file
+}(jQuery));
diff --git a/plugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css b/plugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css
index 737f477..b800873 100755
--- a/plugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css
+++ b/plugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css
@@ -1453,10 +1453,10 @@
 	        appearance: none;
 }
 .mozilla .ui-datepicker .ui-datepicker-title select {
-	background-position: right -17px;
+	background-position: right -14px;
 	text-indent: 0.01px;
 	text-overflow: '';
-	padding-right: 0;
+	padding-right: 10px;
 }
 .ui-datepicker .ui-datepicker-month:focus,
 .ui-datepicker .ui-datepicker-year:focus {
diff --git a/plugins/jqueryui/themes/larry/jquery-ui-css.diff b/plugins/jqueryui/themes/larry/jquery-ui-css.diff
index cce9906..e3971ec 100644
--- a/plugins/jqueryui/themes/larry/jquery-ui-css.diff
+++ b/plugins/jqueryui/themes/larry/jquery-ui-css.diff
@@ -538,10 +538,10 @@
 +	        appearance: none;
 +}
 +.mozilla .ui-datepicker .ui-datepicker-title select {
-+	background-position: right -17px;
++	background-position: right -14px;
 +	text-indent: 0.01px;
 +	text-overflow: '';
-+	padding-right: 0;
++	padding-right: 10px;
 +}
 +.ui-datepicker .ui-datepicker-month:focus,
 +.ui-datepicker .ui-datepicker-year:focus {
diff --git a/program/js/app.js b/program/js/app.js
index 5dd9272..1028b77 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -5173,10 +5173,10 @@
         dateFormat: this.env.date_format,
         changeMonth: true,
         changeYear: true,
-        yearRange: '-100:+10',
+        yearRange: '-120:+10',
         showOtherMonths: true,
         selectOtherMonths: true,
-        onSelect: function(dateText) { $(this).focus().val(dateText) }
+//        onSelect: function(dateText) { $(this).focus().val(dateText); }
       });
       $('input.datepicker').datepicker();
     }

--
Gitblit v1.9.1