You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by jm...@apache.org on 2013/05/09 07:56:58 UTC

[1/5] git commit: [flex-sdk] [refs/heads/develop] - Replaced removeRangeFromSelection with sane code (thanks to Erik)

Updated Branches:
  refs/heads/develop b0ddb4ec2 -> 02aa4310b


Replaced removeRangeFromSelection with sane code (thanks to Erik)


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/fe78d41a
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/fe78d41a
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/fe78d41a

Branch: refs/heads/develop
Commit: fe78d41ad41e972e71474ec7ca15707e263d0823
Parents: b0ddb4e
Author: Justin Mclean <jm...@apache.org>
Authored: Thu May 9 10:50:35 2013 +1000
Committer: Justin Mclean <jm...@apache.org>
Committed: Thu May 9 10:50:35 2013 +1000

----------------------------------------------------------------------
 .../projects/mx/src/mx/controls/CalendarLayout.as  |  111 +++++++--------
 1 files changed, 52 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/fe78d41a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
index 745f43e..138b4c7 100644
--- a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
+++ b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
@@ -2001,66 +2001,59 @@ public class CalendarLayout extends UIComponent
      *  from the selected dates.
      */
     mx_internal function removeRangeFromSelection(startDate:Date, endDate:Date):void
-    {
-        for (var n:int = 0; n < selectedRangeCount; n++)
-        {
-            var s1:int;
-
-            if (!startDate || startDate <= _selectedRanges[n].rangeStart)
-                s1 = 1;
-            else if (startDate <= _selectedRanges[n].rangeEnd)
-                s1 = 2;
-            else if (startDate > _selectedRanges[n].rangeEnd)
-                s1 = 3;
-
-            if (endDate < _selectedRanges[n].rangeStart)
-                s1 *= 5;
-            else if (endDate < _selectedRanges[n].rangeEnd)
-                s1 *= 7;
-            else if (!endDate || endDate >= _selectedRanges[n].rangeEnd)
-                s1 *= 11;
-
-            switch (s1)
-            {
-                case 5:
-                case 33:
-                    break;
-
-                case 14:
-                {
-                    var temp:Date = _selectedRanges[n].rangeEnd;
-
-                    _selectedRanges[n].rangeEnd = incrementDate(startDate,-1);
-
-                    _selectedRanges[selectedRangeCount] = {};
-                    _selectedRanges[selectedRangeCount].rangeStart = incrementDate(endDate);
-                    _selectedRanges[selectedRangeCount].rangeEnd = temp;
-                    selectedRangeCount += 1;
-                    break;
-                }
-
-                case 7:
-                {
-                    _selectedRanges[n].rangeStart = incrementDate(endDate);
-                    break;
-                }
-
-                case 22:
-                {
-                    _selectedRanges[n].rangeEnd = incrementDate(startDate,-1);
-                    break;
-                }
+	{
+		var rangeEnd:Date;
+		var rangeStart:Date;
+		
+		if (endDate < startDate)
+			return;
+		
+		for (var n:int = 0; n < selectedRangeCount; n++)
+		{
+			rangeStart = _selectedRanges[n].rangeStart;
+			
+			if (endDate < rangeStart)
+				continue;
+			
+			rangeEnd = _selectedRanges[n].rangeEnd;
+			
+			if (startDate <= rangeStart)
+			{
+				if (endDate < rangeEnd)
+				{
+					_selectedRanges[n].rangeStart = incrementDate(endDate);
+				}
+				else
+				{
+					_selectedRanges[n] = _selectedRanges[selectedRangeCount - 1];
+					_selectedRanges[selectedRangeCount - 1] = null;
+					
+					selectedRangeCount -= 1;
+				}
+			}
+			else if (startDate <= rangeEnd)
+			{
+				if (endDate < rangeEnd)
+				{
+					var temp:Date = _selectedRanges[n].rangeEnd;
+					
+					_selectedRanges[n].rangeEnd = incrementDate(startDate, -1);
+					
+					_selectedRanges[selectedRangeCount] = {};
+					_selectedRanges[selectedRangeCount].rangeStart =
+						incrementDate(endDate);
+					_selectedRanges[selectedRangeCount].rangeEnd = temp;
+					
+					selectedRangeCount += 1;
+				}
+				else
+				{
+					_selectedRanges[n].rangeEnd = incrementDate(startDate, -1);
+				}
+			}
+		}
+	}
 
-                case 11:
-                {
-                    _selectedRanges[n] = _selectedRanges[selectedRangeCount-1];
-                    _selectedRanges[selectedRangeCount-1] = null;
-                    selectedRangeCount -= 1;
-                    break;
-                }
-            }
-        }
-    }
 
     /**
      *  @private


[2/5] git commit: [flex-sdk] [refs/heads/develop] - FLEX-12749 Changed date maths to use real days so it works across daylight saving boundaries

Posted by jm...@apache.org.
FLEX-12749 Changed date maths to use real days so it works across daylight saving boundaries


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/9cd95538
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/9cd95538
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/9cd95538

Branch: refs/heads/develop
Commit: 9cd95538e563c8d34a837fd9ac37dec5b3252d58
Parents: fe78d41
Author: Justin Mclean <jm...@apache.org>
Authored: Thu May 9 11:27:19 2013 +1000
Committer: Justin Mclean <jm...@apache.org>
Committed: Thu May 9 11:27:19 2013 +1000

----------------------------------------------------------------------
 .../projects/mx/src/mx/controls/CalendarLayout.as  |   21 +++++++--------
 1 files changed, 10 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/9cd95538/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
index 138b4c7..04676e4 100644
--- a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
+++ b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
@@ -941,12 +941,12 @@ public class CalendarLayout extends UIComponent
                 if (dayOffset < 0)
                     dayOffset += 7;
 
-                tempDate = incrementDate(tempDate,dayOffset)
+                tempDate = addSubtractDays(tempDate, dayOffset);
 
                 while (tempDate < maxDate)
                 {
-                    removeRangeFromSelection(tempDate,tempDate);
-                    tempDate = incrementDate(tempDate,7)
+                    removeRangeFromSelection(tempDate, tempDate);
+                    tempDate = addSubtractDays(tempDate, 7);
                 }
             }
         }
@@ -1969,12 +1969,11 @@ public class CalendarLayout extends UIComponent
      *  Increments/decrements a date by 'No. of days'
      *  specified by amount and returns the new date.
      */
-    mx_internal function incrementDate(value:Date, amount:int = 1):Date
+    mx_internal function addSubtractDays(value:Date, amount:int):Date
     {
         var newDate:Date = new Date(value);
-        var time:Number = newDate.getTime();
-        newDate.setTime(time + amount * 86400000);
-        return newDate;
+		
+        return new Date(newDate.fullYear, newDate.month, newDate.date + amount);
     }
 
     /**
@@ -2021,7 +2020,7 @@ public class CalendarLayout extends UIComponent
 			{
 				if (endDate < rangeEnd)
 				{
-					_selectedRanges[n].rangeStart = incrementDate(endDate);
+					_selectedRanges[n].rangeStart = addSubtractDays(endDate, 1);
 				}
 				else
 				{
@@ -2037,18 +2036,18 @@ public class CalendarLayout extends UIComponent
 				{
 					var temp:Date = _selectedRanges[n].rangeEnd;
 					
-					_selectedRanges[n].rangeEnd = incrementDate(startDate, -1);
+					_selectedRanges[n].rangeEnd = addSubtractDays(startDate, -1);
 					
 					_selectedRanges[selectedRangeCount] = {};
 					_selectedRanges[selectedRangeCount].rangeStart =
-						incrementDate(endDate);
+						addSubtractDays(endDate, 1);
 					_selectedRanges[selectedRangeCount].rangeEnd = temp;
 					
 					selectedRangeCount += 1;
 				}
 				else
 				{
-					_selectedRanges[n].rangeEnd = incrementDate(startDate, -1);
+					_selectedRanges[n].rangeEnd = addSubtractDays(startDate, -1);
 				}
 			}
 		}


[3/5] git commit: [flex-sdk] [refs/heads/develop] - FLEX-13423 Date ranges are currently used inconstantly - simpler and easier to understand if endDate and startDates are included

Posted by jm...@apache.org.
FLEX-13423 Date ranges are currently used inconstantly - simpler and easier to understand if endDate and startDates are included


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/8326e93f
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/8326e93f
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/8326e93f

Branch: refs/heads/develop
Commit: 8326e93f0e982c9353e0efffe2474d4e2e0519b8
Parents: 9cd9553
Author: Justin Mclean <jm...@apache.org>
Authored: Thu May 9 12:17:07 2013 +1000
Committer: Justin Mclean <jm...@apache.org>
Committed: Thu May 9 12:17:07 2013 +1000

----------------------------------------------------------------------
 .../projects/mx/src/mx/controls/CalendarLayout.as  |   21 +++++++--------
 1 files changed, 10 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/8326e93f/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
index 04676e4..95a9586 100644
--- a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
+++ b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
@@ -2020,7 +2020,7 @@ public class CalendarLayout extends UIComponent
 			{
 				if (endDate < rangeEnd)
 				{
-					_selectedRanges[n].rangeStart = addSubtractDays(endDate, 1);
+					_selectedRanges[n].rangeStart = endDate;
 				}
 				else
 				{
@@ -2036,18 +2036,17 @@ public class CalendarLayout extends UIComponent
 				{
 					var temp:Date = _selectedRanges[n].rangeEnd;
 					
-					_selectedRanges[n].rangeEnd = addSubtractDays(startDate, -1);
+					_selectedRanges[n].rangeEnd = startDate;
 					
 					_selectedRanges[selectedRangeCount] = {};
-					_selectedRanges[selectedRangeCount].rangeStart =
-						addSubtractDays(endDate, 1);
+					_selectedRanges[selectedRangeCount].rangeStart = endDate;
 					_selectedRanges[selectedRangeCount].rangeEnd = temp;
 					
 					selectedRangeCount += 1;
 				}
 				else
 				{
-					_selectedRanges[n].rangeEnd = addSubtractDays(startDate, -1);
+					_selectedRanges[n].rangeEnd = startDate;
 				}
 			}
 		}
@@ -2450,12 +2449,12 @@ public class CalendarLayout extends UIComponent
                 {
                     if (alreadySelected)
                     {
-                        removeSelectionIndicator(colIndex,rowIndex);
-                        removeRangeFromSelection(newDate,newDate);
+                        removeSelectionIndicator(colIndex, rowIndex);
+                        removeRangeFromSelection(newDate, newDate);
                     }
                     else
                     {
-                        addSelectionIndicator(colIndex,rowIndex);
+                        addSelectionIndicator(colIndex, rowIndex);
                         addToSelected(newDate);
                     }
                 }
@@ -2474,14 +2473,14 @@ public class CalendarLayout extends UIComponent
                         }
                         else if (event.ctrlKey)
                         {
-                            removeSelectionIndicator(colIndex,rowIndex);
-                            removeRangeFromSelection(newDate,newDate);
+                            removeSelectionIndicator(colIndex, rowIndex);
+                            removeRangeFromSelection(newDate, newDate);
                         }
                     }
                     else
                     {
                             selectedRangeCount = 0;
-                            addSelectionIndicator(colIndex,rowIndex);
+                            addSelectionIndicator(colIndex, rowIndex);
                             addToSelected(newDate);
                             setSelectedIndicators();
                     }


[4/5] git commit: [flex-sdk] [refs/heads/develop] - Changed magic numbers to static consts so code is easier to understand

Posted by jm...@apache.org.
Changed magic numbers to static consts so code is easier to understand


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/154ee708
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/154ee708
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/154ee708

Branch: refs/heads/develop
Commit: 154ee70893570ee77247eca371203737c9ff2482
Parents: 8326e93
Author: Justin Mclean <jm...@apache.org>
Authored: Thu May 9 13:17:25 2013 +1000
Committer: Justin Mclean <jm...@apache.org>
Committed: Thu May 9 13:17:25 2013 +1000

----------------------------------------------------------------------
 .../projects/mx/src/mx/controls/CalendarLayout.as  |   64 ++++++++-------
 1 files changed, 36 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/154ee708/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
index 95a9586..153d760 100644
--- a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
+++ b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
@@ -199,6 +199,11 @@ public class CalendarLayout extends UIComponent
         addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
         addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
     }
+	
+	private static const START_END:int = 1;
+	private static const START_ONLY:int = 2;
+	private static const END_ONLY:int = 3;
+	private static const SINGLE_DATE:int = 4;
 
     //--------------------------------------------------------------------------
     //
@@ -531,7 +536,7 @@ public class CalendarLayout extends UIComponent
         {
             if (_disabledRanges[i] is Date)
             {
-                disabledRangeMode[i] = 4;
+                disabledRangeMode[i] = SINGLE_DATE;
                 _disabledRanges[i] = new Date(value[i].getFullYear(),
                                               value[i].getMonth(),
                                               value[i].getDate());
@@ -544,17 +549,17 @@ public class CalendarLayout extends UIComponent
                 if (!_disabledRanges[i].rangeStart &&
                     _disabledRanges[i].rangeEnd)
                 {
-                    disabledRangeMode[i] = 3;
+                    disabledRangeMode[i] = END_ONLY;
                 }
                 else if (_disabledRanges[i].rangeStart &&
                         !_disabledRanges[i].rangeEnd)
                 {
-                    disabledRangeMode[i] = 2;
+                    disabledRangeMode[i] = START_ONLY;
                 }
                 else if (_disabledRanges[i].rangeStart &&
                          _disabledRanges[i].rangeEnd)
                 {
-                    disabledRangeMode[i] = 1;
+                    disabledRangeMode[i] = START_END;
                 }
             }
         }
@@ -750,7 +755,7 @@ public class CalendarLayout extends UIComponent
         
         if (value is Date)
         {
-            selRangeMode = 4;
+            selRangeMode = SINGLE_DATE;
             
             _selectableRange = new Date(value.getFullYear(),
                                         value.getMonth(),
@@ -765,7 +770,7 @@ public class CalendarLayout extends UIComponent
 
             if (!value.rangeStart && value.rangeEnd)
             {
-                selRangeMode = 3;
+                selRangeMode = END_ONLY;
                 _selectableRange.rangeEnd = value.rangeEnd;
                 
                 if (todaysYear <= _selectableRange.rangeEnd.getFullYear())
@@ -791,7 +796,7 @@ public class CalendarLayout extends UIComponent
             }
             else if (!value.rangeEnd && value.rangeStart)
             {
-                selRangeMode = 2;
+                selRangeMode = START_ONLY;
                 _selectableRange.rangeStart = value.rangeStart;
                 
                 if (todaysYear >= _selectableRange.rangeStart.getFullYear())
@@ -816,7 +821,7 @@ public class CalendarLayout extends UIComponent
             }
             else if (value.rangeStart && value.rangeEnd)
             {
-                selRangeMode = 1;
+                selRangeMode = START_END;
                 _selectableRange.rangeStart = value.rangeStart;
                 _selectableRange.rangeEnd = value.rangeEnd;
                 
@@ -867,25 +872,25 @@ public class CalendarLayout extends UIComponent
     public function get selectedRanges():Array
     {
         if (_selectableRange)
-        {
+        {		
             switch (selRangeMode)
             {
-                case 1:
+                case START_END:
                 {
                     removeRangeFromSelection(null, _selectableRange.rangeStart);
                     removeRangeFromSelection(_selectableRange.rangeEnd, null);
                     break;
                 }
 
-                case 2:
-                case 3:
+                case START_ONLY:
+                case END_ONLY:
                 {
                     removeRangeFromSelection(_selectableRange.rangeEnd,
                                              _selectableRange.rangeStart);
                     break;
                 }
 
-                case 4:
+                case SINGLE_DATE:
                 {
                     removeRangeFromSelection(null, _selectableRange as Date);
                     removeRangeFromSelection(_selectableRange as Date, null);
@@ -900,19 +905,19 @@ public class CalendarLayout extends UIComponent
         {
             switch (disabledRangeMode[i])
             {
-                case 1:
-                case 2:
-                case 3:
+                case START_END:
+                case START_ONLY:
+                case END_ONLY:
                 {
-                    removeRangeFromSelection(_disabledRanges[i].rangeStart,
-                                             _disabledRanges[i].rangeEnd);
+                    removeRangeFromSelection(addSubtractDays(_disabledRanges[i].rangeStart, -1),
+								addSubtractDays(_disabledRanges[i].rangeEnd, +1));
                     break;
                 }
 
-                case 4:
+                case SINGLE_DATE:
                 {
-                    removeRangeFromSelection(_disabledRanges[i],
-                                             _disabledRanges[i]);
+                    removeRangeFromSelection(addSubtractDays(_disabledRanges[i], -1),
+								_disabledRanges[i]);
                     break;
                 }
             }
@@ -1620,7 +1625,7 @@ public class CalendarLayout extends UIComponent
             // "end"::All dates before ths specified date are disabled, including the end Date
             // "date"::Only that day has to be disabled
             // "normal"::range is disabled including the start and end date
-            if (_disabledRanges.length>0)
+            if (_disabledRanges.length > 0)
             {
                 for (var dRanges:int = 0; dRanges < _disabledRanges.length; dRanges++)
                 {
@@ -1826,8 +1831,8 @@ public class CalendarLayout extends UIComponent
             }
             
             switch (rangeMode)
-            {
-                case 1:
+            {	
+                case START_END:
                 {
                     if (value < dateRange.rangeStart ||
                         value > dateRange.rangeEnd)
@@ -1837,21 +1842,21 @@ public class CalendarLayout extends UIComponent
                     break;
                 }
 
-                case 2:
+                case START_ONLY:
                 {
                     if (value < dateRange.rangeStart)
                         result = false;
                     break;
                 }
 
-                case 3:
+                case END_ONLY:
                 {
                     if (value > dateRange.rangeEnd)
                         result = false;
                     break;
                 }
 
-                case 4:
+                case SINGLE_DATE:
                 {
                     if (value > dateRange || value < dateRange)
                         result = false;
@@ -1973,7 +1978,10 @@ public class CalendarLayout extends UIComponent
     {
         var newDate:Date = new Date(value);
 		
-        return new Date(newDate.fullYear, newDate.month, newDate.date + amount);
+		if (value)
+        	return new Date(newDate.fullYear, newDate.month, newDate.date + amount);
+		else
+			return null;
     }
 
     /**


[5/5] git commit: [flex-sdk] [refs/heads/develop] - Fix further confusion in code about date ranges being off by one and rewrote removeRangeFromSelection so it actually works for all cases.

Posted by jm...@apache.org.
Fix further confusion in code about date ranges being off by one and rewrote removeRangeFromSelection so it actually works for all cases.


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/02aa4310
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/02aa4310
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/02aa4310

Branch: refs/heads/develop
Commit: 02aa4310bd4427b4b23ebc862e8dfda3c7377cc3
Parents: 154ee70
Author: Justin Mclean <jm...@apache.org>
Authored: Thu May 9 15:23:05 2013 +1000
Committer: Justin Mclean <jm...@apache.org>
Committed: Thu May 9 15:23:05 2013 +1000

----------------------------------------------------------------------
 .../projects/mx/src/mx/controls/CalendarLayout.as  |  114 ++++++++-------
 1 files changed, 62 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/02aa4310/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
index 153d760..05988ed 100644
--- a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
+++ b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
@@ -299,7 +299,7 @@ public class CalendarLayout extends UIComponent
     /**
      *  @private
      */
-    mx_internal var selRangeMode:int = 1;
+    mx_internal var selRangeMode:int = START_END;
 
     //--------------------------------------------------------------------------
     //
@@ -834,7 +834,7 @@ public class CalendarLayout extends UIComponent
                 else if (todaysDate < _selectableRange.rangeStart)
                 {
                     callMonth = _selectableRange.rangeStart.getMonth();
-                    callYear = _selectableRange. rangeStart.getFullYear();
+                    callYear = _selectableRange.rangeStart.getFullYear();
                 }
                 else if (todaysDate > _selectableRange.rangeEnd)
                 {
@@ -877,23 +877,22 @@ public class CalendarLayout extends UIComponent
             {
                 case START_END:
                 {
-                    removeRangeFromSelection(null, _selectableRange.rangeStart);
-                    removeRangeFromSelection(_selectableRange.rangeEnd, null);
+                    removeRangeFromSelection(null, addSubtractDays(_selectableRange.rangeStart, -1));
+                    removeRangeFromSelection(addSubtractDays(_selectableRange.rangeEnd, +1), null);
                     break;
                 }
 
                 case START_ONLY:
                 case END_ONLY:
                 {
-                    removeRangeFromSelection(_selectableRange.rangeEnd,
-                                             _selectableRange.rangeStart);
+                    removeRangeFromSelection(addSubtractDays(_selectableRange.rangeStart, -1),
+												addSubtractDays(_selectableRange.rangeEnd, +1));
                     break;
                 }
 
                 case SINGLE_DATE:
                 {
-                    removeRangeFromSelection(null, _selectableRange as Date);
-                    removeRangeFromSelection(_selectableRange as Date, null);
+                    removeDayFromSelection(_selectableRange as Date);
                     break;
                 }
             }
@@ -909,15 +908,13 @@ public class CalendarLayout extends UIComponent
                 case START_ONLY:
                 case END_ONLY:
                 {
-                    removeRangeFromSelection(addSubtractDays(_disabledRanges[i].rangeStart, -1),
-								addSubtractDays(_disabledRanges[i].rangeEnd, +1));
+                    removeRangeFromSelection(_disabledRanges[i].rangeStart, _disabledRanges[i].rangeEnd);
                     break;
                 }
 
                 case SINGLE_DATE:
                 {
-                    removeRangeFromSelection(addSubtractDays(_disabledRanges[i], -1),
-								_disabledRanges[i]);
+                    removeDayFromSelection(_disabledRanges[i]);
                     break;
                 }
             }
@@ -950,7 +947,7 @@ public class CalendarLayout extends UIComponent
 
                 while (tempDate < maxDate)
                 {
-                    removeRangeFromSelection(tempDate, tempDate);
+                    removeDayFromSelection(tempDate);
                     tempDate = addSubtractDays(tempDate, 7);
                 }
             }
@@ -1927,7 +1924,7 @@ public class CalendarLayout extends UIComponent
     mx_internal function addToSelected(newDate:Date, range:Boolean = false):void
     {
 
-        if (!selectedRangeCount)
+        if (selectedRangeCount == 0)
             rangeStartDate = null;
 
         lastSelectedDate = newDate;
@@ -2018,48 +2015,61 @@ public class CalendarLayout extends UIComponent
 		for (var n:int = 0; n < selectedRangeCount; n++)
 		{
 			rangeStart = _selectedRanges[n].rangeStart;
+			rangeEnd = _selectedRanges[n].rangeEnd;
 			
-			if (endDate < rangeStart)
+			// ignore selection range outsie of date range
+			if (endDate < rangeStart || startDate > rangeEnd)
 				continue;
 			
-			rangeEnd = _selectedRanges[n].rangeEnd;
-			
-			if (startDate <= rangeStart)
+			// remove selection range inside of date range
+			if (startDate <= rangeStart && endDate >= rangeEnd)
+			{
+				_selectedRanges[n] = null;
+			}
+			// split selection range if date range inside selection range
+			else if (startDate > rangeStart && endDate < rangeEnd)
 			{
-				if (endDate < rangeEnd)
-				{
-					_selectedRanges[n].rangeStart = endDate;
-				}
-				else
-				{
-					_selectedRanges[n] = _selectedRanges[selectedRangeCount - 1];
-					_selectedRanges[selectedRangeCount - 1] = null;
-					
-					selectedRangeCount -= 1;
-				}
+				var temp:Date = _selectedRanges[n].rangeEnd;
+				
+				_selectedRanges[n].rangeEnd = addSubtractDays(startDate, -1);
+				
+				_selectedRanges[selectedRangeCount] = {};
+				_selectedRanges[selectedRangeCount].rangeStart = addSubtractDays(endDate, +1);
+				_selectedRanges[selectedRangeCount].rangeEnd = temp;
+				
+				selectedRangeCount++;
 			}
+			// move selection start date if end overlaps
+			else if (endDate >= rangeStart)
+			{
+				_selectedRanges[n].rangeStart = addSubtractDays(endDate, +1);	
+			}
+			// move selection end date if start overlaps
 			else if (startDate <= rangeEnd)
 			{
-				if (endDate < rangeEnd)
-				{
-					var temp:Date = _selectedRanges[n].rangeEnd;
-					
-					_selectedRanges[n].rangeEnd = startDate;
-					
-					_selectedRanges[selectedRangeCount] = {};
-					_selectedRanges[selectedRangeCount].rangeStart = endDate;
-					_selectedRanges[selectedRangeCount].rangeEnd = temp;
-					
-					selectedRangeCount += 1;
-				}
-				else
-				{
-					_selectedRanges[n].rangeEnd = startDate;
-				}
+				_selectedRanges[n].rangeEnd = addSubtractDays(startDate, -1);	
+			}			
+		}
+		
+		// clean up any removed selections
+		for (n = selectedRangeCount -1; n > 0; n--)
+		{
+			if (_selectedRanges[n] == null)
+			{
+				_selectedRanges.splice(n,1);
+				selectedRangeCount--;
 			}
 		}
 	}
-
+	
+	/**
+	 *  @private
+	 *  Removes a single date specified by singleDate from the selected dates.
+	 */
+	mx_internal function removeDayFromSelection(singleDate:Date):void
+	{
+		removeRangeFromSelection(singleDate, singleDate);
+	}
 
     /**
      *  @private
@@ -2458,7 +2468,7 @@ public class CalendarLayout extends UIComponent
                     if (alreadySelected)
                     {
                         removeSelectionIndicator(colIndex, rowIndex);
-                        removeRangeFromSelection(newDate, newDate);
+                        removeDayFromSelection(newDate);
                     }
                     else
                     {
@@ -2482,15 +2492,15 @@ public class CalendarLayout extends UIComponent
                         else if (event.ctrlKey)
                         {
                             removeSelectionIndicator(colIndex, rowIndex);
-                            removeRangeFromSelection(newDate, newDate);
+                            removeDayFromSelection(newDate);
                         }
                     }
                     else
                     {
-                            selectedRangeCount = 0;
-                            addSelectionIndicator(colIndex, rowIndex);
-                            addToSelected(newDate);
-                            setSelectedIndicators();
+                        selectedRangeCount = 0;
+                        addSelectionIndicator(colIndex, rowIndex);
+                        addToSelected(newDate);
+                        setSelectedIndicators();
                     }
                 }
             }