You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by gs...@apache.org on 2007/12/15 02:15:27 UTC

svn commit: r604364 [2/4] - in /wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui: ./ calendar/ calendar/assets/ calendar/assets/skins/sam/ dom/ event/ yahoo/

Modified: wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/calendar.js
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/calendar.js?rev=604364&r1=604363&r2=604364&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/calendar.js (original)
+++ wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/calendar.js Fri Dec 14 17:15:26 2007
@@ -2,7 +2,7 @@
 Copyright (c) 2007, Yahoo! Inc. All rights reserved.
 Code licensed under the BSD License:
 http://developer.yahoo.net/yui/license.txt
-version: 2.3.0
+version: 2.4.0
 */
 (function () {
 
@@ -18,25 +18,19 @@
     * @param {Object} owner The owner Object to which this Config Object belongs
     */
     YAHOO.util.Config = function (owner) {
-    
+
         if (owner) {
-    
             this.init(owner);
-    
-        }
-    
-        if (!owner) { 
-        
-    
         }
-    
+
+
     };
 
 
     var Lang = YAHOO.lang,
-        CustomEvent = YAHOO.util.CustomEvent,        
+        CustomEvent = YAHOO.util.CustomEvent,
         Config = YAHOO.util.Config;
-    
+
 
     /**
      * Constant representing the CustomEvent type for the config changed event.
@@ -249,11 +243,11 @@
                     !Lang.isUndefined(this.initialConfig[key])) {
     
                     this.setProperty(key, this.initialConfig[key]);
+
+                    return true;
     
                 }
     
-                return true;
-    
             } else {
     
                 return false;
@@ -353,7 +347,7 @@
                         if (queueItem) {
                             queueItemKey = queueItem[0];
                             queueItemValue = queueItem[1];
-                            
+
                             if (queueItemKey == key) {
     
                                 /*
@@ -381,37 +375,37 @@
                 }
         
                 if (property.supercedes) {
-        
+
                     sLen = property.supercedes.length;
-        
+
                     for (s = 0; s < sLen; s++) {
-        
+
                         supercedesCheck = property.supercedes[s];
                         qLen = this.eventQueue.length;
-        
+
                         for (q = 0; q < qLen; q++) {
                             queueItemCheck = this.eventQueue[q];
-        
+
                             if (queueItemCheck) {
                                 queueItemCheckKey = queueItemCheck[0];
                                 queueItemCheckValue = queueItemCheck[1];
-                                
+
                                 if (queueItemCheckKey == 
                                     supercedesCheck.toLowerCase() ) {
-    
+
                                     this.eventQueue.push([queueItemCheckKey, 
                                         queueItemCheckValue]);
-    
+
                                     this.eventQueue[q] = null;
                                     break;
-    
+
                                 }
                             }
                         }
                     }
                 }
 
-        
+
                 return true;
             } else {
                 return false;
@@ -459,13 +453,23 @@
         */
         applyConfig: function (userConfig, init) {
         
-            var prop;
-        
+            var sKey,
+                oConfig;
+
             if (init) {
-                this.initialConfig = userConfig;
+                oConfig = {};
+                for (sKey in userConfig) {
+                    if (Lang.hasOwnProperty(userConfig, sKey)) {
+                        oConfig[sKey.toLowerCase()] = userConfig[sKey];
+                    }
+                }
+                this.initialConfig = oConfig;
             }
-            for (prop in userConfig) {
-                this.queueProperty(prop, userConfig[prop]);
+
+            for (sKey in userConfig) {
+                if (Lang.hasOwnProperty(userConfig, sKey)) {
+                    this.queueProperty(sKey, userConfig[sKey]);
+                }
             }
         },
         
@@ -533,19 +537,12 @@
             var property = this.config[key.toLowerCase()];
     
             if (property && property.event) {
-    
                 if (!Config.alreadySubscribed(property.event, handler, obj)) {
-    
                     property.event.subscribe(handler, obj, override);
-    
                 }
-    
                 return true;
-    
             } else {
-    
                 return false;
-    
             }
     
         },
@@ -665,28 +662,20 @@
             i;
 
         if (nSubscribers > 0) {
-
             i = nSubscribers - 1;
-        
             do {
-
                 subsc = evt.subscribers[i];
-
                 if (subsc && subsc.obj == obj && subsc.fn == fn) {
-        
                     return true;
-        
-                }    
-            
+                }
             }
             while (i--);
-        
         }
-    
+
         return false;
-    
+
     };
-    
+
     YAHOO.lang.augmentProto(Config, YAHOO.util.EventProvider);
 
 }());
@@ -854,7 +843,7 @@
 	* @return {Date}	January 1 of the calendar year specified.
 	*/
 	getJan1 : function(calendarYear) {
-		return new Date(calendarYear,0,1); 
+		return this.getDate(calendarYear,0,1);
 	},
 
 	/**
@@ -890,7 +879,7 @@
 		date = this.clearTime(date);
 		var nearestThurs = new Date(date.getTime() + (4 * this.ONE_DAY_MS) - ((date.getDay()) * this.ONE_DAY_MS));
 
-		var jan1 = new Date(nearestThurs.getFullYear(),0,1);
+		var jan1 = this.getDate(nearestThurs.getFullYear(),0,1);
 		var dayOfYear = ((nearestThurs.getTime() - jan1.getTime()) / this.ONE_DAY_MS) - 1;
 
 		var weekNum = Math.ceil((dayOfYear)/ 7);
@@ -934,7 +923,7 @@
 	* @return {Date}		The JavaScript Date representing the first day of the month
 	*/
 	findMonthStart : function(date) {
-		var start = new Date(date.getFullYear(), date.getMonth(), 1);
+		var start = this.getDate(date.getFullYear(), date.getMonth(), 1);
 		return start;
 	},
 
@@ -960,14 +949,46 @@
 	clearTime : function(date) {
 		date.setHours(12,0,0,0);
 		return date;
+	},
+
+	/**
+	 * Returns a new JavaScript Date object, representing the given year, month and date. Time fields (hr, min, sec, ms) on the new Date object
+	 * are set to 0. The method allows Date instances to be created with the a year less than 100. "new Date(year, month, date)" implementations 
+	 * set the year to 19xx if a year (xx) which is less than 100 is provided.
+	 * <p>
+	 * <em>NOTE:</em>Validation on argument values is not performed. It is the caller's responsibility to ensure
+	 * arguments are valid as per the ECMAScript-262 Date object specification for the new Date(year, month[, date]) constructor.
+	 * </p>
+	 * @method getDate
+	 * @param {Number} y Year.
+	 * @param {Number} m Month index from 0 (Jan) to 11 (Dec).
+	 * @param {Number} d (optional) Date from 1 to 31. If not provided, defaults to 1.
+	 * @return {Date} The JavaScript date object with year, month, date set as provided.
+	 */
+	getDate : function(y, m, d) {
+		var dt = null;
+		if (YAHOO.lang.isUndefined(d)) {
+			d = 1;
+		}
+		if (y >= 100) {
+			dt = new Date(y, m, d);
+		} else {
+			dt = new Date();
+			dt.setFullYear(y);
+			dt.setMonth(m);
+			dt.setDate(d);
+			dt.setHours(0,0,0,0);
+		}
+		return dt;
 	}
 };
 
 /**
-* The Calendar component is a UI control that enables users to choose one or more dates from a graphical calendar presented in a one-month  or multi-month interface. Calendars are generated entirely via script and can be navigated without any page refreshes.
+* The Calendar component is a UI control that enables users to choose one or more dates from a graphical calendar presented in a one-month or
+* multi-month interface. Calendars are generated entirely via script and can be navigated without any page refreshes.
 * @module    calendar
-* @title     Calendar
-* @namespace YAHOO.widget
+* @title    Calendar
+* @namespace  YAHOO.widget
 * @requires  yahoo,dom,event
 */
 
@@ -979,18 +1000,39 @@
 * <p>To construct the placeholder for the calendar widget, the code is as
 * follows:
 *	<xmp>
-*		<div id="cal1Container"></div>
+*		<div id="calContainer"></div>
+*	</xmp>
+* </p>
+* <p>
+* <strong>NOTE: As of 2.4.0, the constructor's ID argument is optional.</strong>
+* The Calendar can be constructed by simply providing a container ID string, 
+* or a reference to a container DIV HTMLElement (the element needs to exist 
+* in the document).
+* 
+* E.g.:
+*	<xmp>
+*		var c = new YAHOO.widget.Calendar("calContainer", configOptions);
 *	</xmp>
+* or:
+*   <xmp>
+*       var containerDiv = YAHOO.util.Dom.get("calContainer");
+*		var c = new YAHOO.widget.Calendar(containerDiv, configOptions);
+*	</xmp>
+* </p>
+* <p>
+* If not provided, the ID will be generated from the container DIV ID by adding an "_t" suffix.
+* For example if an ID is not provided, and the container's ID is "calContainer", the Calendar's ID will be set to "calContainer_t".
 * </p>
+* 
 * @namespace YAHOO.widget
 * @class Calendar
 * @constructor
-* @param {String}	id			The id of the table element that will represent the calendar widget
-* @param {String}	containerId	The id of the container div element that will wrap the calendar table
-* @param {Object}	config		The configuration object containing the Calendar's arguments
+* @param {String} id optional The id of the table element that will represent the Calendar widget. As of 2.4.0, this argument is optional.
+* @param {String | HTMLElement} container The id of the container div element that will wrap the Calendar table, or a reference to a DIV element which exists in the document.
+* @param {Object} config optional The configuration object containing the initial configuration values for the Calendar.
 */
 YAHOO.widget.Calendar = function(id, containerId, config) {
-	this.init(id, containerId, config);
+	this.init.apply(this, arguments);
 };
 
 /**
@@ -1147,7 +1189,8 @@
 	MY_LABEL_MONTH_POSITION:{key:"my_label_month_position", value:1},
 	MY_LABEL_YEAR_POSITION:{key:"my_label_year_position", value:2},
 	MY_LABEL_MONTH_SUFFIX:{key:"my_label_month_suffix", value:" "},
-	MY_LABEL_YEAR_SUFFIX:{key:"my_label_year_suffix", value:""}
+	MY_LABEL_YEAR_SUFFIX:{key:"my_label_year_suffix", value:""},
+	NAV: {key:"navigator", value: null}
 };
 
 /**
@@ -1167,7 +1210,17 @@
 	BEFORE_RENDER : "beforeRender",
 	RENDER : "render",
 	RESET : "reset",
-	CLEAR : "clear"
+	CLEAR : "clear",
+	BEFORE_HIDE : "beforeHide",
+	HIDE : "hide",
+	BEFORE_SHOW : "beforeShow",
+	SHOW : "show",
+	BEFORE_HIDE_NAV : "beforeHideNav",
+	HIDE_NAV : "hideNav",
+	BEFORE_SHOW_NAV : "beforeShowNav",
+	SHOW_NAV : "showNav",
+	BEFORE_RENDER_NAV : "beforeRenderNav",
+	RENDER_NAV : "renderNav"
 };
 
 /**
@@ -1200,6 +1253,7 @@
 	CSS_CONTAINER : "yui-calcontainer",
 	CSS_NAV_LEFT : "calnavleft",
 	CSS_NAV_RIGHT : "calnavright",
+	CSS_NAV : "calnav",
 	CSS_CLOSE : "calclose",
 	CSS_CELL_TOP : "calcelltop",
 	CSS_CELL_LEFT : "calcellleft",
@@ -1243,7 +1297,7 @@
 	* @type HTMLTableCellElement[]
 	*/
 	cells : null,
-	
+
 	/**
 	* The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays in the format of [YYYY, M, D].
 	* @property cellDates
@@ -1252,13 +1306,20 @@
 	cellDates : null,
 
 	/**
-	* The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page.
+	* The id that uniquely identifies this Calendar.
 	* @property id
 	* @type String
 	*/
 	id : null,
 
 	/**
+	* The unique id associated with the Calendar's container
+	* @property containerId
+	* @type String
+	*/
+	containerId: null,
+
+	/**
 	* The DOM element reference that points to this calendar's container element. The calendar will be inserted into this element when the shell is rendered.
 	* @property oDomContainer
 	* @type HTMLElement
@@ -1288,6 +1349,14 @@
 	_renderStack : null,
 
 	/**
+	* A reference to the CalendarNavigator instance created for this Calendar.
+	* Will be null if the "navigator" configuration property has not been set
+	* @property oNavigator
+	* @type CalendarNavigator
+	*/
+	oNavigator : null,
+
+	/**
 	* The private list of initially selected dates.
 	* @property _selectedDates
 	* @private
@@ -1300,2473 +1369,2837 @@
 	* @property domEventMap
 	* @type Object
 	*/
-	domEventMap : null
-};
-
-
-
-/**
-* Initializes the Calendar widget.
-* @method init
-* @param {String}	id			The id of the table element that will represent the calendar widget
-* @param {String}	containerId	The id of the container div element that will wrap the calendar table
-* @param {Object}	config		The configuration object containing the Calendar's arguments
-*/
-YAHOO.widget.Calendar.prototype.init = function(id, containerId, config) {
-	this.initEvents();
-	this.today = new Date();
-	YAHOO.widget.DateMath.clearTime(this.today);
-
-	this.id = id;
-	this.oDomContainer = document.getElementById(containerId);
-
-	/**
-	* The Config object used to hold the configuration variables for the Calendar
-	* @property cfg
-	* @type YAHOO.util.Config
-	*/
-	this.cfg = new YAHOO.util.Config(this);
-	
-	/**
-	* The local object which contains the Calendar's options
-	* @property Options
-	* @type Object
-	*/
-	this.Options = {};
+	domEventMap : null,
 
 	/**
-	* The local object which contains the Calendar's locale settings
-	* @property Locale
-	* @type Object
-	*/
-	this.Locale = {};
-
-	this.initStyles();
-
-	YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_CONTAINER);	
-	YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_SINGLE);
-	
-	this.cellDates = [];
-	this.cells = [];
-	this.renderStack = [];
-	this._renderStack = [];
-
-	this.setupConfig();
-	
-	if (config) {
-		this.cfg.applyConfig(config, true);
-	}
-	
-	this.cfg.fireQueue();
-};
-
-/**
-* Default Config listener for the iframe property. If the iframe config property is set to true, 
-* renders the built-in IFRAME shim if the container is relatively or absolutely positioned.
-* 
-* @method configIframe
-*/
-YAHOO.widget.Calendar.prototype.configIframe = function(type, args, obj) {
-	var useIframe = args[0];
-
-	if (!this.parent) {
-		if (YAHOO.util.Dom.inDocument(this.oDomContainer)) {
-			if (useIframe) {
-				var pos = YAHOO.util.Dom.getStyle(this.oDomContainer, "position");
-				
-				if (pos == "absolute" || pos == "relative") {
-					
-					if (!YAHOO.util.Dom.inDocument(this.iframe)) {
-						this.iframe = document.createElement("iframe");
-						this.iframe.src = "javascript:false;";
-
-						YAHOO.util.Dom.setStyle(this.iframe, "opacity", "0");
-
-						if (YAHOO.env.ua.ie && YAHOO.env.ua.ie <= 6) {
-							YAHOO.util.Dom.addClass(this.iframe, "fixedsize");
-						}
-
-						this.oDomContainer.insertBefore(this.iframe, this.oDomContainer.firstChild);
-					}
-				}
-			} else {
-				if (this.iframe) {
-					if (this.iframe.parentNode) {
-						this.iframe.parentNode.removeChild(this.iframe);
+	 * Protected helper used to parse Calendar constructor/init arguments.
+	 *
+	 * As of 2.4.0, Calendar supports a simpler constructor 
+	 * signature. This method reconciles arguments
+	 * received in the pre 2.4.0 and 2.4.0 formats.
+	 * 
+	 * @protected
+	 * @method _parseArgs
+	 * @param {Array} Function "arguments" array
+	 * @return {Object} Object with id, container, config properties containing
+	 * the reconciled argument values.
+	 **/
+	_parseArgs : function(args) {
+		/*
+		   2.4.0 Constructors signatures
+
+		   new Calendar(String)
+		   new Calendar(HTMLElement)
+		   new Calendar(String, ConfigObject)
+		   new Calendar(HTMLElement, ConfigObject)
+
+		   Pre 2.4.0 Constructor signatures
+
+		   new Calendar(String, String)
+		   new Calendar(String, HTMLElement)
+		   new Calendar(String, String, ConfigObject)
+		   new Calendar(String, HTMLElement, ConfigObject)
+		 */
+		var nArgs = {id:null, container:null, config:null};
+
+		if (args && args.length && args.length > 0) {
+			switch (args.length) {
+				case 1:
+					nArgs.id = null;
+					nArgs.container = args[0];
+					nArgs.config = null;
+					break;
+				case 2:
+					if (YAHOO.lang.isObject(args[1]) && !args[1].tagName && !(args[1] instanceof String)) {
+						nArgs.id = null;
+						nArgs.container = args[0];
+						nArgs.config = args[1];
+					} else {
+						nArgs.id = args[0];
+						nArgs.container = args[1];
+						nArgs.config = null;
 					}
-					this.iframe = null;
-				}
+					break;
+				default: // 3+
+					nArgs.id = args[0];
+					nArgs.container = args[1];
+					nArgs.config = args[2];
+					break;
 			}
-		}
-	}
-};
-
-/**
-* Default handler for the "title" property
-* @method configTitle
-*/
-YAHOO.widget.Calendar.prototype.configTitle = function(type, args, obj) {
-	var title = args[0];
-	var close = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.CLOSE.key);
-	
-	var titleDiv;
-
-	if (title && title !== "") {
-		titleDiv = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || document.createElement("div");
-		titleDiv.className = YAHOO.widget.CalendarGroup.CSS_2UPTITLE;
-		titleDiv.innerHTML = title;
-		this.oDomContainer.insertBefore(titleDiv, this.oDomContainer.firstChild);
-		YAHOO.util.Dom.addClass(this.oDomContainer, "withtitle");
-	} else {
-		titleDiv = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || null;
-
-		if (titleDiv) {
-			YAHOO.util.Event.purgeElement(titleDiv);
-			this.oDomContainer.removeChild(titleDiv);
-		}
-		if (! close) {
-			YAHOO.util.Dom.removeClass(this.oDomContainer, "withtitle");
-		}
-	}
-};
-
-/**
-* Default handler for the "close" property
-* @method configClose
-*/
-YAHOO.widget.Calendar.prototype.configClose = function(type, args, obj) {
-	var close = args[0];
-	var title = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.TITLE.key);
-	
-	var DEPR_CLOSE_PATH = "us/my/bn/x_d.gif";
-
-	var linkClose;
-
-	if (close === true) {
-		linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || document.createElement("a");
-		linkClose.href = "#";
-		linkClose.className = "link-close";
-		YAHOO.util.Event.addListener(linkClose, "click", function(e, cal) {cal.hide(); YAHOO.util.Event.preventDefault(e); }, this);
-		
-		if (YAHOO.widget.Calendar.IMG_ROOT !== null) {
-			var imgClose = document.createElement("img");
-			imgClose.src = YAHOO.widget.Calendar.IMG_ROOT + DEPR_CLOSE_PATH;
-			imgClose.className = YAHOO.widget.CalendarGroup.CSS_2UPCLOSE;
-			linkClose.appendChild(imgClose);
 		} else {
-			linkClose.innerHTML = '<span class="' + YAHOO.widget.CalendarGroup.CSS_2UPCLOSE + ' ' + this.Style.CSS_CLOSE + '"></span>';
-		}
-		
-		this.oDomContainer.appendChild(linkClose);
-		YAHOO.util.Dom.addClass(this.oDomContainer, "withtitle");
-	} else {
-		linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || null;
-		if (linkClose) {
-			YAHOO.util.Event.purgeElement(linkClose);
-			this.oDomContainer.removeChild(linkClose);
 		}
-		if (! title || title === "") {
-			YAHOO.util.Dom.removeClass(this.oDomContainer, "withtitle");
-		}
-	}
-};
-
-/**
-* Initializes Calendar's built-in CustomEvents
-* @method initEvents
-*/
-YAHOO.widget.Calendar.prototype.initEvents = function() {
-
-	var defEvents = YAHOO.widget.Calendar._EVENT_TYPES;
+		return nArgs;
+	},
 
 	/**
-	* Fired before a selection is made
-	* @event beforeSelectEvent
+	* Initializes the Calendar widget.
+	* @method init
+	*
+	* @param {String} id optional The id of the table element that will represent the Calendar widget. As of 2.4.0, this argument is optional.
+	* @param {String | HTMLElement} container The id of the container div element that will wrap the Calendar table, or a reference to a DIV element which exists in the document.
+	* @param {Object} config optional The configuration object containing the initial configuration values for the Calendar.
 	*/
-	this.beforeSelectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_SELECT); 
+	init : function(id, container, config) {
+		// Normalize 2.4.0, pre 2.4.0 args
+		var nArgs = this._parseArgs(arguments);
 
-	/**
-	* Fired when a selection is made
-	* @event selectEvent
-	* @param {Array}	Array of Date field arrays in the format [YYYY, MM, DD].
-	*/
-	this.selectEvent = new YAHOO.util.CustomEvent(defEvents.SELECT);
+		id = nArgs.id;
+		container = nArgs.container;
+		config = nArgs.config;
 
-	/**
-	* Fired before a selection is made
-	* @event beforeDeselectEvent
-	*/
-	this.beforeDeselectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_DESELECT);
+		this.oDomContainer = YAHOO.util.Dom.get(container);
 
-	/**
-	* Fired when a selection is made
-	* @event deselectEvent
-	* @param {Array}	Array of Date field arrays in the format [YYYY, MM, DD].
-	*/
-	this.deselectEvent = new YAHOO.util.CustomEvent(defEvents.DESELECT);
+		if (!this.oDomContainer.id) {
+			this.oDomContainer.id = YAHOO.util.Dom.generateId();
+		}
+		if (!id) {
+			id = this.oDomContainer.id + "_t";
+		}
 
-	/**
-	* Fired when the Calendar page is changed
-	* @event changePageEvent
-	*/
-	this.changePageEvent = new YAHOO.util.CustomEvent(defEvents.CHANGE_PAGE);
+		this.id = id;
+		this.containerId = this.oDomContainer.id;
 
-	/**
-	* Fired before the Calendar is rendered
-	* @event beforeRenderEvent
-	*/
-	this.beforeRenderEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_RENDER);
+		this.initEvents();
 
-	/**
-	* Fired when the Calendar is rendered
-	* @event renderEvent
-	*/
-	this.renderEvent = new YAHOO.util.CustomEvent(defEvents.RENDER);
+		this.today = new Date();
+		YAHOO.widget.DateMath.clearTime(this.today);
 
-	/**
-	* Fired when the Calendar is reset
-	* @event resetEvent
-	*/
-	this.resetEvent = new YAHOO.util.CustomEvent(defEvents.RESET);
+		/**
+		* The Config object used to hold the configuration variables for the Calendar
+		* @property cfg
+		* @type YAHOO.util.Config
+		*/
+		this.cfg = new YAHOO.util.Config(this);
 
-	/**
-	* Fired when the Calendar is cleared
-	* @event clearEvent
-	*/
-	this.clearEvent = new YAHOO.util.CustomEvent(defEvents.CLEAR);
+		/**
+		* The local object which contains the Calendar's options
+		* @property Options
+		* @type Object
+		*/
+		this.Options = {};
 
-	this.beforeSelectEvent.subscribe(this.onBeforeSelect, this, true);
-	this.selectEvent.subscribe(this.onSelect, this, true);
-	this.beforeDeselectEvent.subscribe(this.onBeforeDeselect, this, true);
-	this.deselectEvent.subscribe(this.onDeselect, this, true);
-	this.changePageEvent.subscribe(this.onChangePage, this, true);
-	this.renderEvent.subscribe(this.onRender, this, true);
-	this.resetEvent.subscribe(this.onReset, this, true);
-	this.clearEvent.subscribe(this.onClear, this, true);
-};
+		/**
+		* The local object which contains the Calendar's locale settings
+		* @property Locale
+		* @type Object
+		*/
+		this.Locale = {};
 
-/**
-* The default event function that is attached to a date link within a calendar cell
-* when the calendar is rendered.
-* @method doSelectCell
-* @param {DOMEvent} e	The event
-* @param {Calendar} cal	A reference to the calendar passed by the Event utility
-*/
-YAHOO.widget.Calendar.prototype.doSelectCell = function(e, cal) {
-	var cell,index,d,date;
+		this.initStyles();
 
-	var target = YAHOO.util.Event.getTarget(e);
-	var tagName = target.tagName.toLowerCase();
-	var defSelector = false;
+		YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_CONTAINER);
+		YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_SINGLE);
 
-	while (tagName != "td" && ! YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
+		this.cellDates = [];
+		this.cells = [];
+		this.renderStack = [];
+		this._renderStack = [];
 
-		if (!defSelector && tagName == "a" && YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTOR)) {
-			defSelector = true;	
-		}
+		this.setupConfig();
 
-		target = target.parentNode;
-		tagName = target.tagName.toLowerCase(); 
-		if (tagName == "html") {
-			return;
+		if (config) {
+			this.cfg.applyConfig(config, true);
 		}
-	}
-
-	if (defSelector) {
-		// Stop link href navigation for default renderer
-		YAHOO.util.Event.preventDefault(e);
-	}
 
-	cell = target;
+		this.cfg.fireQueue();
+	},
 
-	if (YAHOO.util.Dom.hasClass(cell, cal.Style.CSS_CELL_SELECTABLE)) {
-		index = cell.id.split("cell")[1];
-		d = cal.cellDates[index];
-		date = new Date(d[0],d[1]-1,d[2]);
+	/**
+	* Default Config listener for the iframe property. If the iframe config property is set to true, 
+	* renders the built-in IFRAME shim if the container is relatively or absolutely positioned.
+	* 
+	* @method configIframe
+	*/
+	configIframe : function(type, args, obj) {
+		var useIframe = args[0];
 	
-		var link;
-
-		if (cal.Options.MULTI_SELECT) {
-			link = cell.getElementsByTagName("a")[0];
-			if (link) {
-				link.blur();
+		if (!this.parent) {
+			if (YAHOO.util.Dom.inDocument(this.oDomContainer)) {
+				if (useIframe) {
+					var pos = YAHOO.util.Dom.getStyle(this.oDomContainer, "position");
+					
+					if (pos == "absolute" || pos == "relative") {
+						
+						if (!YAHOO.util.Dom.inDocument(this.iframe)) {
+							this.iframe = document.createElement("iframe");
+							this.iframe.src = "javascript:false;";
+	
+							YAHOO.util.Dom.setStyle(this.iframe, "opacity", "0");
+	
+							if (YAHOO.env.ua.ie && YAHOO.env.ua.ie <= 6) {
+								YAHOO.util.Dom.addClass(this.iframe, "fixedsize");
+							}
+	
+							this.oDomContainer.insertBefore(this.iframe, this.oDomContainer.firstChild);
+						}
+					}
+				} else {
+					if (this.iframe) {
+						if (this.iframe.parentNode) {
+							this.iframe.parentNode.removeChild(this.iframe);
+						}
+						this.iframe = null;
+					}
+				}
 			}
+		}
+	},
 
-			var cellDate = cal.cellDates[index];
-			var cellDateIndex = cal._indexOfSelectedFieldArray(cellDate);
-
-			if (cellDateIndex > -1) {	
-				cal.deselectCell(index);
-			} else {
-				cal.selectCell(index);
-			}	
+	/**
+	* Default handler for the "title" property
+	* @method configTitle
+	*/
+	configTitle : function(type, args, obj) {
+		var title = args[0];
 
+		// "" disables title bar
+		if (title) {
+			this.createTitleBar(title);
 		} else {
-			link = cell.getElementsByTagName("a")[0];
-			if (link) {
-				link.blur();
+			var close = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.CLOSE.key);
+			if (!close) {
+				this.removeTitleBar();
+			} else {
+				this.createTitleBar("&#160;");
 			}
-			cal.selectCell(index);
-		}
-	}
-};
-
-/**
-* The event that is executed when the user hovers over a cell
-* @method doCellMouseOver
-* @param {DOMEvent} e	The event
-* @param {Calendar} cal	A reference to the calendar passed by the Event utility
-*/
-YAHOO.widget.Calendar.prototype.doCellMouseOver = function(e, cal) {
-	var target;
-	if (e) {
-		target = YAHOO.util.Event.getTarget(e);
-	} else {
-		target = this;
-	}
-
-	while (target.tagName.toLowerCase() != "td") {
-		target = target.parentNode;
-		if (target.tagName.toLowerCase() == "html") {
-			return;
-		}
-	}
-
-	if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
-		YAHOO.util.Dom.addClass(target, cal.Style.CSS_CELL_HOVER);
-	}
-};
-
-/**
-* The event that is executed when the user moves the mouse out of a cell
-* @method doCellMouseOut
-* @param {DOMEvent} e	The event
-* @param {Calendar} cal	A reference to the calendar passed by the Event utility
-*/
-YAHOO.widget.Calendar.prototype.doCellMouseOut = function(e, cal) {
-	var target;
-	if (e) {
-		target = YAHOO.util.Event.getTarget(e);
-	} else {
-		target = this;
-	}
-
-	while (target.tagName.toLowerCase() != "td") {
-		target = target.parentNode;
-		if (target.tagName.toLowerCase() == "html") {
-			return;
 		}
-	}
-
-	if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
-		YAHOO.util.Dom.removeClass(target, cal.Style.CSS_CELL_HOVER);
-	}
-};
-
-YAHOO.widget.Calendar.prototype.setupConfig = function() {
-
-	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
-
+	},
+	
 	/**
-	* The month/year representing the current visible Calendar date (mm/yyyy)
-	* @config pagedate
-	* @type String
-	* @default today's date
+	* Default handler for the "close" property
+	* @method configClose
 	*/
-	this.cfg.addProperty(defCfg.PAGEDATE.key, { value:new Date(), handler:this.configPageDate } );
-
+	configClose : function(type, args, obj) {
+		var close = args[0],
+			title = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.TITLE.key);
+	
+		if (close) {
+			if (!title) {
+				this.createTitleBar("&#160;");
+			}
+			this.createCloseButton();
+		} else {
+			this.removeCloseButton();
+			if (!title) {
+				this.removeTitleBar();
+			}
+		}
+	},
+	
 	/**
-	* The date or range of dates representing the current Calendar selection
-	* @config selected
-	* @type String
-	* @default []
+	* Initializes Calendar's built-in CustomEvents
+	* @method initEvents
 	*/
-	this.cfg.addProperty(defCfg.SELECTED.key, { value:[], handler:this.configSelected } );
-
-	/**
-	* The title to display above the Calendar's month header
-	* @config title
-	* @type String
-	* @default ""
-	*/
-	this.cfg.addProperty(defCfg.TITLE.key, { value:defCfg.TITLE.value, handler:this.configTitle } );
-
-	/**
-	* Whether or not a close button should be displayed for this Calendar
-	* @config close
-	* @type Boolean
-	* @default false
-	*/
-	this.cfg.addProperty(defCfg.CLOSE.key, { value:defCfg.CLOSE.value, handler:this.configClose } );
-
-	/**
-	* Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below.
-	* This property is enabled by default for IE6 and below. It is disabled by default for other browsers for performance reasons, but can be 
-	* enabled if required.
-	* 
-	* @config iframe
-	* @type Boolean
-	* @default true for IE6 and below, false for all other browsers
-	*/
-	this.cfg.addProperty(defCfg.IFRAME.key, { value:defCfg.IFRAME.value, handler:this.configIframe, validator:this.cfg.checkBoolean } );
-
-	/**
-	* The minimum selectable date in the current Calendar (mm/dd/yyyy)
-	* @config mindate
-	* @type String
-	* @default null
-	*/
-	this.cfg.addProperty(defCfg.MINDATE.key, { value:defCfg.MINDATE.value, handler:this.configMinDate } );
-
-	/**
-	* The maximum selectable date in the current Calendar (mm/dd/yyyy)
-	* @config maxdate
-	* @type String
-	* @default null
-	*/
-	this.cfg.addProperty(defCfg.MAXDATE.key, { value:defCfg.MAXDATE.value, handler:this.configMaxDate } );
-
-
-	// Options properties
-
-	/**
-	* True if the Calendar should allow multiple selections. False by default.
-	* @config MULTI_SELECT
-	* @type Boolean
-	* @default false
-	*/
-	this.cfg.addProperty(defCfg.MULTI_SELECT.key,	{ value:defCfg.MULTI_SELECT.value, handler:this.configOptions, validator:this.cfg.checkBoolean } );
-
-	/**
-	* The weekday the week begins on. Default is 0 (Sunday).
-	* @config START_WEEKDAY
-	* @type number
-	* @default 0
-	*/
-	this.cfg.addProperty(defCfg.START_WEEKDAY.key,	{ value:defCfg.START_WEEKDAY.value, handler:this.configOptions, validator:this.cfg.checkNumber  } );
-
-	/**
-	* True if the Calendar should show weekday labels. True by default.
-	* @config SHOW_WEEKDAYS
-	* @type Boolean
-	* @default true
-	*/
-	this.cfg.addProperty(defCfg.SHOW_WEEKDAYS.key,	{ value:defCfg.SHOW_WEEKDAYS.value, handler:this.configOptions, validator:this.cfg.checkBoolean  } );
-
-	/**
-	* True if the Calendar should show week row headers. False by default.
-	* @config SHOW_WEEK_HEADER
-	* @type Boolean
-	* @default false
-	*/
-	this.cfg.addProperty(defCfg.SHOW_WEEK_HEADER.key, { value:defCfg.SHOW_WEEK_HEADER.value, handler:this.configOptions, validator:this.cfg.checkBoolean } );
-
-	/**
-	* True if the Calendar should show week row footers. False by default.
-	* @config SHOW_WEEK_FOOTER
-	* @type Boolean
-	* @default false
-	*/	
-	this.cfg.addProperty(defCfg.SHOW_WEEK_FOOTER.key,{ value:defCfg.SHOW_WEEK_FOOTER.value, handler:this.configOptions, validator:this.cfg.checkBoolean } );
-
-	/**
-	* True if the Calendar should suppress weeks that are not a part of the current month. False by default.
-	* @config HIDE_BLANK_WEEKS
-	* @type Boolean
-	* @default false
-	*/	
-	this.cfg.addProperty(defCfg.HIDE_BLANK_WEEKS.key, { value:defCfg.HIDE_BLANK_WEEKS.value, handler:this.configOptions, validator:this.cfg.checkBoolean } );
+	initEvents : function() {
 	
-	/**
-	* The image that should be used for the left navigation arrow.
-	* @config NAV_ARROW_LEFT
-	* @type String
-	* @deprecated	You can customize the image by overriding the default CSS class for the left arrow - "calnavleft"  
-	* @default null
-	*/	
-	this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key,	{ value:defCfg.NAV_ARROW_LEFT.value, handler:this.configOptions } );
-
-	/**
-	* The image that should be used for the right navigation arrow.
-	* @config NAV_ARROW_RIGHT
-	* @type String
-	* @deprecated	You can customize the image by overriding the default CSS class for the right arrow - "calnavright"
-	* @default null
-	*/	
-	this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key, { value:defCfg.NAV_ARROW_RIGHT.value, handler:this.configOptions } );
-
-	// Locale properties
-
-	/**
-	* The short month labels for the current locale.
-	* @config MONTHS_SHORT
-	* @type String[]
-	* @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
-	*/
-	this.cfg.addProperty(defCfg.MONTHS_SHORT.key,	{ value:defCfg.MONTHS_SHORT.value, handler:this.configLocale } );
+		var defEvents = YAHOO.widget.Calendar._EVENT_TYPES;
 	
-	/**
-	* The long month labels for the current locale.
-	* @config MONTHS_LONG
-	* @type String[]
-	* @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
-	*/	
-	this.cfg.addProperty(defCfg.MONTHS_LONG.key,		{ value:defCfg.MONTHS_LONG.value, handler:this.configLocale } );
+		/**
+		* Fired before a selection is made
+		* @event beforeSelectEvent
+		*/
+		this.beforeSelectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_SELECT); 
 	
-	/**
-	* The 1-character weekday labels for the current locale.
-	* @config WEEKDAYS_1CHAR
-	* @type String[]
-	* @default ["S", "M", "T", "W", "T", "F", "S"]
-	*/	
-	this.cfg.addProperty(defCfg.WEEKDAYS_1CHAR.key,	{ value:defCfg.WEEKDAYS_1CHAR.value, handler:this.configLocale } );
+		/**
+		* Fired when a selection is made
+		* @event selectEvent
+		* @param {Array}	Array of Date field arrays in the format [YYYY, MM, DD].
+		*/
+		this.selectEvent = new YAHOO.util.CustomEvent(defEvents.SELECT);
 	
-	/**
-	* The short weekday labels for the current locale.
-	* @config WEEKDAYS_SHORT
-	* @type String[]
-	* @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]
-	*/	
-	this.cfg.addProperty(defCfg.WEEKDAYS_SHORT.key,	{ value:defCfg.WEEKDAYS_SHORT.value, handler:this.configLocale } );
+		/**
+		* Fired before a selection is made
+		* @event beforeDeselectEvent
+		*/
+		this.beforeDeselectEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_DESELECT);
 	
-	/**
-	* The medium weekday labels for the current locale.
-	* @config WEEKDAYS_MEDIUM
-	* @type String[]
-	* @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
-	*/	
-	this.cfg.addProperty(defCfg.WEEKDAYS_MEDIUM.key,	{ value:defCfg.WEEKDAYS_MEDIUM.value, handler:this.configLocale } );
+		/**
+		* Fired when a selection is made
+		* @event deselectEvent
+		* @param {Array}	Array of Date field arrays in the format [YYYY, MM, DD].
+		*/
+		this.deselectEvent = new YAHOO.util.CustomEvent(defEvents.DESELECT);
 	
-	/**
-	* The long weekday labels for the current locale.
-	* @config WEEKDAYS_LONG
-	* @type String[]
-	* @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
-	*/	
-	this.cfg.addProperty(defCfg.WEEKDAYS_LONG.key,	{ value:defCfg.WEEKDAYS_LONG.value, handler:this.configLocale } );
-
-	/**
-	* Refreshes the locale values used to build the Calendar.
-	* @method refreshLocale
-	* @private
-	*/
-	var refreshLocale = function() {
-		this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key);
-		this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key);
-	};
-
-	this.cfg.subscribeToConfigEvent(defCfg.START_WEEKDAY.key, refreshLocale, this, true);
-	this.cfg.subscribeToConfigEvent(defCfg.MONTHS_SHORT.key, refreshLocale, this, true);
-	this.cfg.subscribeToConfigEvent(defCfg.MONTHS_LONG.key, refreshLocale, this, true);
-	this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_1CHAR.key, refreshLocale, this, true);
-	this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_SHORT.key, refreshLocale, this, true);
-	this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_MEDIUM.key, refreshLocale, this, true);
-	this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_LONG.key, refreshLocale, this, true);
+		/**
+		* Fired when the Calendar page is changed
+		* @event changePageEvent
+		*/
+		this.changePageEvent = new YAHOO.util.CustomEvent(defEvents.CHANGE_PAGE);
 	
-	/**
-	* The setting that determines which length of month labels should be used. Possible values are "short" and "long".
-	* @config LOCALE_MONTHS
-	* @type String
-	* @default "long"
-	*/	
-	this.cfg.addProperty(defCfg.LOCALE_MONTHS.key,	{ value:defCfg.LOCALE_MONTHS.value, handler:this.configLocaleValues } );
+		/**
+		* Fired before the Calendar is rendered
+		* @event beforeRenderEvent
+		*/
+		this.beforeRenderEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_RENDER);
 	
-	/**
-	* The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long".
-	* @config LOCALE_WEEKDAYS
-	* @type String
-	* @default "short"
-	*/	
-	this.cfg.addProperty(defCfg.LOCALE_WEEKDAYS.key,	{ value:defCfg.LOCALE_WEEKDAYS.value, handler:this.configLocaleValues } );
-
-	/**
-	* The value used to delimit individual dates in a date string passed to various Calendar functions.
-	* @config DATE_DELIMITER
-	* @type String
-	* @default ","
-	*/	
-	this.cfg.addProperty(defCfg.DATE_DELIMITER.key,		{ value:defCfg.DATE_DELIMITER.value, handler:this.configLocale } );
-
-	/**
-	* The value used to delimit date fields in a date string passed to various Calendar functions.
-	* @config DATE_FIELD_DELIMITER
-	* @type String
-	* @default "/"
-	*/	
-	this.cfg.addProperty(defCfg.DATE_FIELD_DELIMITER.key, { value:defCfg.DATE_FIELD_DELIMITER.value, handler:this.configLocale } );
-
-	/**
-	* The value used to delimit date ranges in a date string passed to various Calendar functions.
-	* @config DATE_RANGE_DELIMITER
-	* @type String
-	* @default "-"
-	*/
-	this.cfg.addProperty(defCfg.DATE_RANGE_DELIMITER.key, { value:defCfg.DATE_RANGE_DELIMITER.value, handler:this.configLocale } );
+		/**
+		* Fired when the Calendar is rendered
+		* @event renderEvent
+		*/
+		this.renderEvent = new YAHOO.util.CustomEvent(defEvents.RENDER);
+	
+		/**
+		* Fired when the Calendar is reset
+		* @event resetEvent
+		*/
+		this.resetEvent = new YAHOO.util.CustomEvent(defEvents.RESET);
+	
+		/**
+		* Fired when the Calendar is cleared
+		* @event clearEvent
+		*/
+		this.clearEvent = new YAHOO.util.CustomEvent(defEvents.CLEAR);
+	
+		/**
+		* Fired just before the Calendar is to be shown
+		* @event beforeShowEvent
+		*/
+		this.beforeShowEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_SHOW);
+	
+		/**
+		* Fired after the Calendar is shown
+		* @event showEvent
+		*/
+		this.showEvent = new YAHOO.util.CustomEvent(defEvents.SHOW);
+	
+		/**
+		* Fired just before the Calendar is to be hidden
+		* @event beforeHideEvent
+		*/
+		this.beforeHideEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_HIDE);
+	
+		/**
+		* Fired after the Calendar is hidden
+		* @event hideEvent
+		*/
+		this.hideEvent = new YAHOO.util.CustomEvent(defEvents.HIDE);
 
-	/**
-	* The position of the month in a month/year date string
-	* @config MY_MONTH_POSITION
-	* @type Number
-	* @default 1
-	*/
-	this.cfg.addProperty(defCfg.MY_MONTH_POSITION.key,	{ value:defCfg.MY_MONTH_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+		/**
+		* Fired just before the CalendarNavigator is to be shown
+		* @event beforeShowNavEvent
+		*/
+		this.beforeShowNavEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_SHOW_NAV);
+	
+		/**
+		* Fired after the CalendarNavigator is shown
+		* @event showNavEvent
+		*/
+		this.showNavEvent = new YAHOO.util.CustomEvent(defEvents.SHOW_NAV);
+	
+		/**
+		* Fired just before the CalendarNavigator is to be hidden
+		* @event beforeHideNavEvent
+		*/
+		this.beforeHideNavEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_HIDE_NAV);
+	
+		/**
+		* Fired after the CalendarNavigator is hidden
+		* @event hideNavEvent
+		*/
+		this.hideNavEvent = new YAHOO.util.CustomEvent(defEvents.HIDE_NAV);
 
-	/**
-	* The position of the year in a month/year date string
-	* @config MY_YEAR_POSITION
-	* @type Number
-	* @default 2
-	*/
-	this.cfg.addProperty(defCfg.MY_YEAR_POSITION.key,	{ value:defCfg.MY_YEAR_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+		/**
+		* Fired just before the CalendarNavigator is to be rendered
+		* @event beforeRenderNavEvent
+		*/
+		this.beforeRenderNavEvent = new YAHOO.util.CustomEvent(defEvents.BEFORE_RENDER_NAV);
 
-	/**
-	* The position of the month in a month/day date string
-	* @config MD_MONTH_POSITION
-	* @type Number
-	* @default 1
-	*/
-	this.cfg.addProperty(defCfg.MD_MONTH_POSITION.key,	{ value:defCfg.MD_MONTH_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+		/**
+		* Fired after the CalendarNavigator is rendered
+		* @event renderNavEvent
+		*/
+		this.renderNavEvent = new YAHOO.util.CustomEvent(defEvents.RENDER_NAV);
 
+		this.beforeSelectEvent.subscribe(this.onBeforeSelect, this, true);
+		this.selectEvent.subscribe(this.onSelect, this, true);
+		this.beforeDeselectEvent.subscribe(this.onBeforeDeselect, this, true);
+		this.deselectEvent.subscribe(this.onDeselect, this, true);
+		this.changePageEvent.subscribe(this.onChangePage, this, true);
+		this.renderEvent.subscribe(this.onRender, this, true);
+		this.resetEvent.subscribe(this.onReset, this, true);
+		this.clearEvent.subscribe(this.onClear, this, true);
+	},
+	
 	/**
-	* The position of the day in a month/year date string
-	* @config MD_DAY_POSITION
-	* @type Number
-	* @default 2
-	*/
-	this.cfg.addProperty(defCfg.MD_DAY_POSITION.key,		{ value:defCfg.MD_DAY_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+	* The default event function that is attached to a date link within a calendar cell
+	* when the calendar is rendered.
+	* @method doSelectCell
+	* @param {DOMEvent} e	The event
+	* @param {Calendar} cal	A reference to the calendar passed by the Event utility
+	*/
+	doSelectCell : function(e, cal) {
+		var cell,index,d,date;
+
+		var target = YAHOO.util.Event.getTarget(e);
+		var tagName = target.tagName.toLowerCase();
+		var defSelector = false;
 
-	/**
-	* The position of the month in a month/day/year date string
-	* @config MDY_MONTH_POSITION
-	* @type Number
-	* @default 1
-	*/
-	this.cfg.addProperty(defCfg.MDY_MONTH_POSITION.key,	{ value:defCfg.MDY_MONTH_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+		while (tagName != "td" && ! YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
 
-	/**
-	* The position of the day in a month/day/year date string
-	* @config MDY_DAY_POSITION
-	* @type Number
-	* @default 2
-	*/
-	this.cfg.addProperty(defCfg.MDY_DAY_POSITION.key,	{ value:defCfg.MDY_DAY_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+			if (!defSelector && tagName == "a" && YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTOR)) {
+				defSelector = true;	
+			}
 
-	/**
-	* The position of the year in a month/day/year date string
-	* @config MDY_YEAR_POSITION
-	* @type Number
-	* @default 3
-	*/
-	this.cfg.addProperty(defCfg.MDY_YEAR_POSITION.key,	{ value:defCfg.MDY_YEAR_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
-	
-	/**
-	* The position of the month in the month year label string used as the Calendar header
-	* @config MY_LABEL_MONTH_POSITION
-	* @type Number
-	* @default 1
-	*/
-	this.cfg.addProperty(defCfg.MY_LABEL_MONTH_POSITION.key,	{ value:defCfg.MY_LABEL_MONTH_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+			target = target.parentNode;
+			tagName = target.tagName.toLowerCase();
+			// TODO: No need to go all the way up to html.
+			if (tagName == "html") {
+				return;
+			}
+		}
 
-	/**
-	* The position of the year in the month year label string used as the Calendar header
-	* @config MY_LABEL_YEAR_POSITION
-	* @type Number
-	* @default 2
-	*/
-	this.cfg.addProperty(defCfg.MY_LABEL_YEAR_POSITION.key,	{ value:defCfg.MY_LABEL_YEAR_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
-	
-	/**
-	* The suffix used after the month when rendering the Calendar header
-	* @config MY_LABEL_MONTH_SUFFIX
-	* @type String
-	* @default " "
-	*/
-	this.cfg.addProperty(defCfg.MY_LABEL_MONTH_SUFFIX.key,	{ value:defCfg.MY_LABEL_MONTH_SUFFIX.value, handler:this.configLocale } );
+		if (defSelector) {
+			// Stop link href navigation for default renderer
+			YAHOO.util.Event.preventDefault(e);
+		}
 	
-	/**
-	* The suffix used after the year when rendering the Calendar header
-	* @config MY_LABEL_YEAR_SUFFIX
-	* @type String
-	* @default ""
-	*/
-	this.cfg.addProperty(defCfg.MY_LABEL_YEAR_SUFFIX.key, { value:defCfg.MY_LABEL_YEAR_SUFFIX.value, handler:this.configLocale } );
-};
-
-/**
-* The default handler for the "pagedate" property
-* @method configPageDate
-*/
-YAHOO.widget.Calendar.prototype.configPageDate = function(type, args, obj) {
-	this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key, this._parsePageDate(args[0]), true);
-};
-
-/**
-* The default handler for the "mindate" property
-* @method configMinDate
-*/
-YAHOO.widget.Calendar.prototype.configMinDate = function(type, args, obj) {
-	var val = args[0];
-	if (YAHOO.lang.isString(val)) {
-		val = this._parseDate(val);
-		this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MINDATE.key, new Date(val[0],(val[1]-1),val[2]));
-	}
-};
+		cell = target;
 
-/**
-* The default handler for the "maxdate" property
-* @method configMaxDate
-*/
-YAHOO.widget.Calendar.prototype.configMaxDate = function(type, args, obj) {
-	var val = args[0];
-	if (YAHOO.lang.isString(val)) {
-		val = this._parseDate(val);
-		this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MAXDATE.key, new Date(val[0],(val[1]-1),val[2]));
-	}
-};
+		if (YAHOO.util.Dom.hasClass(cell, cal.Style.CSS_CELL_SELECTABLE)) {
+			index = cell.id.split("cell")[1];
+			d = cal.cellDates[index];
+			date = YAHOO.widget.DateMath.getDate(d[0],d[1]-1,d[2]);
+		
+			var link;
 
-/**
-* The default handler for the "selected" property
-* @method configSelected
-*/
-YAHOO.widget.Calendar.prototype.configSelected = function(type, args, obj) {
-	var selected = args[0];
-	var cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
-	
-	if (selected) {
-		if (YAHOO.lang.isString(selected)) {
-			this.cfg.setProperty(cfgSelected, this._parseDates(selected), true);
-		} 
-	}
-	if (! this._selectedDates) {
-		this._selectedDates = this.cfg.getProperty(cfgSelected);
-	}
-};
+			if (cal.Options.MULTI_SELECT) {
+				link = cell.getElementsByTagName("a")[0];
+				if (link) {
+					link.blur();
+				}
 
-/**
-* The default handler for all configuration options properties
-* @method configOptions
-*/
-YAHOO.widget.Calendar.prototype.configOptions = function(type, args, obj) {
-	this.Options[type.toUpperCase()] = args[0];
-};
+				var cellDate = cal.cellDates[index];
+				var cellDateIndex = cal._indexOfSelectedFieldArray(cellDate);
 
-/**
-* The default handler for all configuration locale properties
-* @method configLocale
-*/
-YAHOO.widget.Calendar.prototype.configLocale = function(type, args, obj) {
-	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
-	this.Locale[type.toUpperCase()] = args[0];
+				if (cellDateIndex > -1) {	
+					cal.deselectCell(index);
+				} else {
+					cal.selectCell(index);
+				}	
+	
+			} else {
+				link = cell.getElementsByTagName("a")[0];
+				if (link) {
+					link.blur();
+				}
+				cal.selectCell(index);
+			}
+		}
+	},
 
-	this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key);
-	this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key);
-};
+	/**
+	* The event that is executed when the user hovers over a cell
+	* @method doCellMouseOver
+	* @param {DOMEvent} e	The event
+	* @param {Calendar} cal	A reference to the calendar passed by the Event utility
+	*/
+	doCellMouseOver : function(e, cal) {
+		var target;
+		if (e) {
+			target = YAHOO.util.Event.getTarget(e);
+		} else {
+			target = this;
+		}
 
-/**
-* The default handler for all configuration locale field length properties
-* @method configLocaleValues
-*/
-YAHOO.widget.Calendar.prototype.configLocaleValues = function(type, args, obj) {
-	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; 
+		while (target.tagName && target.tagName.toLowerCase() != "td") {
+			target = target.parentNode;
+			if (!target.tagName || target.tagName.toLowerCase() == "html") {
+				return;
+			}
+		}
 
-	type = type.toLowerCase();
-	var val = args[0];
+		if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
+			YAHOO.util.Dom.addClass(target, cal.Style.CSS_CELL_HOVER);
+		}
+	},
 
-	switch (type) {
-		case defCfg.LOCALE_MONTHS.key:
-			switch (val) {
-				case YAHOO.widget.Calendar.SHORT:
-					this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_SHORT.key).concat();
-					break;
-				case YAHOO.widget.Calendar.LONG:
-					this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_LONG.key).concat();
-					break;
-			}
-			break;
-		case defCfg.LOCALE_WEEKDAYS.key:
-			switch (val) {
-				case YAHOO.widget.Calendar.ONE_CHAR:
-					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_1CHAR.key).concat();
-					break;
-				case YAHOO.widget.Calendar.SHORT:
-					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_SHORT.key).concat();
-					break;
-				case YAHOO.widget.Calendar.MEDIUM:
-					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_MEDIUM.key).concat();
-					break;
-				case YAHOO.widget.Calendar.LONG:
-					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_LONG.key).concat();
-					break;
-			}
-			
-			var START_WEEKDAY = this.cfg.getProperty(defCfg.START_WEEKDAY.key);
+	/**
+	* The event that is executed when the user moves the mouse out of a cell
+	* @method doCellMouseOut
+	* @param {DOMEvent} e	The event
+	* @param {Calendar} cal	A reference to the calendar passed by the Event utility
+	*/
+	doCellMouseOut : function(e, cal) {
+		var target;
+		if (e) {
+			target = YAHOO.util.Event.getTarget(e);
+		} else {
+			target = this;
+		}
 
-			if (START_WEEKDAY > 0) {
-				for (var w=0;w<START_WEEKDAY;++w) {
-					this.Locale.LOCALE_WEEKDAYS.push(this.Locale.LOCALE_WEEKDAYS.shift());
-				}
+		while (target.tagName && target.tagName.toLowerCase() != "td") {
+			target = target.parentNode;
+			if (!target.tagName || target.tagName.toLowerCase() == "html") {
+				return;
 			}
-			break;
-	}
-};
-
-/**
-* Defines the style constants for the Calendar
-* @method initStyles
-*/
-YAHOO.widget.Calendar.prototype.initStyles = function() {
+		}
 
-	var defStyle = YAHOO.widget.Calendar._STYLES;
+		if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
+			YAHOO.util.Dom.removeClass(target, cal.Style.CSS_CELL_HOVER);
+		}
+	},
+	
+	setupConfig : function() {
+	
+		var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
 
-	this.Style = {
 		/**
-		* @property Style.CSS_ROW_HEADER
+		* The month/year representing the current visible Calendar date (mm/yyyy)
+		* @config pagedate
+		* @type String
+		* @default today's date
 		*/
-		CSS_ROW_HEADER: defStyle.CSS_ROW_HEADER,
+		this.cfg.addProperty(defCfg.PAGEDATE.key, { value:new Date(), handler:this.configPageDate } );
+
 		/**
-		* @property Style.CSS_ROW_FOOTER
+		* The date or range of dates representing the current Calendar selection
+		* @config selected
+		* @type String
+		* @default []
 		*/
-		CSS_ROW_FOOTER: defStyle.CSS_ROW_FOOTER,
+		this.cfg.addProperty(defCfg.SELECTED.key, { value:[], handler:this.configSelected } );
+
 		/**
-		* @property Style.CSS_CELL
+		* The title to display above the Calendar's month header
+		* @config title
+		* @type String
+		* @default ""
 		*/
-		CSS_CELL : defStyle.CSS_CELL,
+		this.cfg.addProperty(defCfg.TITLE.key, { value:defCfg.TITLE.value, handler:this.configTitle } );
+
 		/**
-		* @property Style.CSS_CELL_SELECTOR
+		* Whether or not a close button should be displayed for this Calendar
+		* @config close
+		* @type Boolean
+		* @default false
 		*/
-		CSS_CELL_SELECTOR : defStyle.CSS_CELL_SELECTOR,
+		this.cfg.addProperty(defCfg.CLOSE.key, { value:defCfg.CLOSE.value, handler:this.configClose } );
+
 		/**
-		* @property Style.CSS_CELL_SELECTED
+		* Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below.
+		* This property is enabled by default for IE6 and below. It is disabled by default for other browsers for performance reasons, but can be 
+		* enabled if required.
+		* 
+		* @config iframe
+		* @type Boolean
+		* @default true for IE6 and below, false for all other browsers
 		*/
-		CSS_CELL_SELECTED : defStyle.CSS_CELL_SELECTED,
+		this.cfg.addProperty(defCfg.IFRAME.key, { value:defCfg.IFRAME.value, handler:this.configIframe, validator:this.cfg.checkBoolean } );
+
 		/**
-		* @property Style.CSS_CELL_SELECTABLE
+		* The minimum selectable date in the current Calendar (mm/dd/yyyy)
+		* @config mindate
+		* @type String
+		* @default null
 		*/
-		CSS_CELL_SELECTABLE : defStyle.CSS_CELL_SELECTABLE,
+		this.cfg.addProperty(defCfg.MINDATE.key, { value:defCfg.MINDATE.value, handler:this.configMinDate } );
+
 		/**
-		* @property Style.CSS_CELL_RESTRICTED
+		* The maximum selectable date in the current Calendar (mm/dd/yyyy)
+		* @config maxdate
+		* @type String
+		* @default null
 		*/
-		CSS_CELL_RESTRICTED : defStyle.CSS_CELL_RESTRICTED,
+		this.cfg.addProperty(defCfg.MAXDATE.key, { value:defCfg.MAXDATE.value, handler:this.configMaxDate } );
+	
+	
+		// Options properties
+	
 		/**
-		* @property Style.CSS_CELL_TODAY
+		* True if the Calendar should allow multiple selections. False by default.
+		* @config MULTI_SELECT
+		* @type Boolean
+		* @default false
 		*/
-		CSS_CELL_TODAY : defStyle.CSS_CELL_TODAY,
+		this.cfg.addProperty(defCfg.MULTI_SELECT.key,	{ value:defCfg.MULTI_SELECT.value, handler:this.configOptions, validator:this.cfg.checkBoolean } );
+	
 		/**
-		* @property Style.CSS_CELL_OOM
+		* The weekday the week begins on. Default is 0 (Sunday).
+		* @config START_WEEKDAY
+		* @type number
+		* @default 0
 		*/
-		CSS_CELL_OOM : defStyle.CSS_CELL_OOM,
+		this.cfg.addProperty(defCfg.START_WEEKDAY.key,	{ value:defCfg.START_WEEKDAY.value, handler:this.configOptions, validator:this.cfg.checkNumber  } );
+	
 		/**
-		* @property Style.CSS_CELL_OOB
+		* True if the Calendar should show weekday labels. True by default.
+		* @config SHOW_WEEKDAYS
+		* @type Boolean
+		* @default true
 		*/
-		CSS_CELL_OOB : defStyle.CSS_CELL_OOB,
+		this.cfg.addProperty(defCfg.SHOW_WEEKDAYS.key,	{ value:defCfg.SHOW_WEEKDAYS.value, handler:this.configOptions, validator:this.cfg.checkBoolean  } );
+	
 		/**
-		* @property Style.CSS_HEADER
+		* True if the Calendar should show week row headers. False by default.
+		* @config SHOW_WEEK_HEADER
+		* @type Boolean
+		* @default false
 		*/
-		CSS_HEADER : defStyle.CSS_HEADER,
+		this.cfg.addProperty(defCfg.SHOW_WEEK_HEADER.key, { value:defCfg.SHOW_WEEK_HEADER.value, handler:this.configOptions, validator:this.cfg.checkBoolean } );
+	
 		/**
-		* @property Style.CSS_HEADER_TEXT
-		*/
-		CSS_HEADER_TEXT : defStyle.CSS_HEADER_TEXT,
+		* True if the Calendar should show week row footers. False by default.
+		* @config SHOW_WEEK_FOOTER
+		* @type Boolean
+		* @default false
+		*/	
+		this.cfg.addProperty(defCfg.SHOW_WEEK_FOOTER.key,{ value:defCfg.SHOW_WEEK_FOOTER.value, handler:this.configOptions, validator:this.cfg.checkBoolean } );
+	
 		/**
-		* @property Style.CSS_BODY
-		*/
-		CSS_BODY : defStyle.CSS_BODY,
+		* True if the Calendar should suppress weeks that are not a part of the current month. False by default.
+		* @config HIDE_BLANK_WEEKS
+		* @type Boolean
+		* @default false
+		*/	
+		this.cfg.addProperty(defCfg.HIDE_BLANK_WEEKS.key, { value:defCfg.HIDE_BLANK_WEEKS.value, handler:this.configOptions, validator:this.cfg.checkBoolean } );
+		
 		/**
-		* @property Style.CSS_WEEKDAY_CELL
-		*/
-		CSS_WEEKDAY_CELL : defStyle.CSS_WEEKDAY_CELL,
+		* The image that should be used for the left navigation arrow.
+		* @config NAV_ARROW_LEFT
+		* @type String
+		* @deprecated	You can customize the image by overriding the default CSS class for the left arrow - "calnavleft"  
+		* @default null
+		*/	
+		this.cfg.addProperty(defCfg.NAV_ARROW_LEFT.key,	{ value:defCfg.NAV_ARROW_LEFT.value, handler:this.configOptions } );
+	
 		/**
-		* @property Style.CSS_WEEKDAY_ROW
-		*/
-		CSS_WEEKDAY_ROW : defStyle.CSS_WEEKDAY_ROW,
+		* The image that should be used for the right navigation arrow.
+		* @config NAV_ARROW_RIGHT
+		* @type String
+		* @deprecated	You can customize the image by overriding the default CSS class for the right arrow - "calnavright"
+		* @default null
+		*/	
+		this.cfg.addProperty(defCfg.NAV_ARROW_RIGHT.key, { value:defCfg.NAV_ARROW_RIGHT.value, handler:this.configOptions } );
+	
+		// Locale properties
+	
 		/**
-		* @property Style.CSS_FOOTER
+		* The short month labels for the current locale.
+		* @config MONTHS_SHORT
+		* @type String[]
+		* @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
 		*/
-		CSS_FOOTER : defStyle.CSS_FOOTER,
+		this.cfg.addProperty(defCfg.MONTHS_SHORT.key,	{ value:defCfg.MONTHS_SHORT.value, handler:this.configLocale } );
+		
 		/**
-		* @property Style.CSS_CALENDAR
-		*/
-		CSS_CALENDAR : defStyle.CSS_CALENDAR,
+		* The long month labels for the current locale.
+		* @config MONTHS_LONG
+		* @type String[]
+		* @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
+		*/	
+		this.cfg.addProperty(defCfg.MONTHS_LONG.key,		{ value:defCfg.MONTHS_LONG.value, handler:this.configLocale } );
+
 		/**
-		* @property Style.CSS_SINGLE
-		*/
-		CSS_SINGLE : defStyle.CSS_SINGLE,
+		* The 1-character weekday labels for the current locale.
+		* @config WEEKDAYS_1CHAR
+		* @type String[]
+		* @default ["S", "M", "T", "W", "T", "F", "S"]
+		*/	
+		this.cfg.addProperty(defCfg.WEEKDAYS_1CHAR.key,	{ value:defCfg.WEEKDAYS_1CHAR.value, handler:this.configLocale } );
+		
+		/**
+		* The short weekday labels for the current locale.
+		* @config WEEKDAYS_SHORT
+		* @type String[]
+		* @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]
+		*/	
+		this.cfg.addProperty(defCfg.WEEKDAYS_SHORT.key,	{ value:defCfg.WEEKDAYS_SHORT.value, handler:this.configLocale } );
+		
+		/**
+		* The medium weekday labels for the current locale.
+		* @config WEEKDAYS_MEDIUM
+		* @type String[]
+		* @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
+		*/	
+		this.cfg.addProperty(defCfg.WEEKDAYS_MEDIUM.key,	{ value:defCfg.WEEKDAYS_MEDIUM.value, handler:this.configLocale } );
+		
+		/**
+		* The long weekday labels for the current locale.
+		* @config WEEKDAYS_LONG
+		* @type String[]
+		* @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
+		*/	
+		this.cfg.addProperty(defCfg.WEEKDAYS_LONG.key,	{ value:defCfg.WEEKDAYS_LONG.value, handler:this.configLocale } );
+	
 		/**
-		* @property Style.CSS_CONTAINER
+		* Refreshes the locale values used to build the Calendar.
+		* @method refreshLocale
+		* @private
 		*/
-		CSS_CONTAINER : defStyle.CSS_CONTAINER,
+		var refreshLocale = function() {
+			this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key);
+			this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key);
+		};
+	
+		this.cfg.subscribeToConfigEvent(defCfg.START_WEEKDAY.key, refreshLocale, this, true);
+		this.cfg.subscribeToConfigEvent(defCfg.MONTHS_SHORT.key, refreshLocale, this, true);
+		this.cfg.subscribeToConfigEvent(defCfg.MONTHS_LONG.key, refreshLocale, this, true);
+		this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_1CHAR.key, refreshLocale, this, true);
+		this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_SHORT.key, refreshLocale, this, true);
+		this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_MEDIUM.key, refreshLocale, this, true);
+		this.cfg.subscribeToConfigEvent(defCfg.WEEKDAYS_LONG.key, refreshLocale, this, true);
+		
+		/**
+		* The setting that determines which length of month labels should be used. Possible values are "short" and "long".
+		* @config LOCALE_MONTHS
+		* @type String
+		* @default "long"
+		*/	
+		this.cfg.addProperty(defCfg.LOCALE_MONTHS.key,	{ value:defCfg.LOCALE_MONTHS.value, handler:this.configLocaleValues } );
+		
+		/**
+		* The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long".
+		* @config LOCALE_WEEKDAYS
+		* @type String
+		* @default "short"
+		*/	
+		this.cfg.addProperty(defCfg.LOCALE_WEEKDAYS.key,	{ value:defCfg.LOCALE_WEEKDAYS.value, handler:this.configLocaleValues } );
+	
+		/**
+		* The value used to delimit individual dates in a date string passed to various Calendar functions.
+		* @config DATE_DELIMITER
+		* @type String
+		* @default ","
+		*/	
+		this.cfg.addProperty(defCfg.DATE_DELIMITER.key,		{ value:defCfg.DATE_DELIMITER.value, handler:this.configLocale } );
+	
+		/**
+		* The value used to delimit date fields in a date string passed to various Calendar functions.
+		* @config DATE_FIELD_DELIMITER
+		* @type String
+		* @default "/"
+		*/	
+		this.cfg.addProperty(defCfg.DATE_FIELD_DELIMITER.key, { value:defCfg.DATE_FIELD_DELIMITER.value, handler:this.configLocale } );
+	
 		/**
-		* @property Style.CSS_NAV_LEFT
+		* The value used to delimit date ranges in a date string passed to various Calendar functions.
+		* @config DATE_RANGE_DELIMITER
+		* @type String
+		* @default "-"
 		*/
-		CSS_NAV_LEFT : defStyle.CSS_NAV_LEFT,
+		this.cfg.addProperty(defCfg.DATE_RANGE_DELIMITER.key, { value:defCfg.DATE_RANGE_DELIMITER.value, handler:this.configLocale } );
+	
 		/**
-		* @property Style.CSS_NAV_RIGHT
+		* The position of the month in a month/year date string
+		* @config MY_MONTH_POSITION
+		* @type Number
+		* @default 1
 		*/
-		CSS_NAV_RIGHT : defStyle.CSS_NAV_RIGHT,
+		this.cfg.addProperty(defCfg.MY_MONTH_POSITION.key,	{ value:defCfg.MY_MONTH_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+	
 		/**
-		* @property Style.CSS_CLOSE
+		* The position of the year in a month/year date string
+		* @config MY_YEAR_POSITION
+		* @type Number
+		* @default 2
 		*/
-		CSS_CLOSE : defStyle.CSS_CLOSE,
+		this.cfg.addProperty(defCfg.MY_YEAR_POSITION.key,	{ value:defCfg.MY_YEAR_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+	
 		/**
-		* @property Style.CSS_CELL_TOP
+		* The position of the month in a month/day date string
+		* @config MD_MONTH_POSITION
+		* @type Number
+		* @default 1
 		*/
-		CSS_CELL_TOP : defStyle.CSS_CELL_TOP,
+		this.cfg.addProperty(defCfg.MD_MONTH_POSITION.key,	{ value:defCfg.MD_MONTH_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+	
 		/**
-		* @property Style.CSS_CELL_LEFT
+		* The position of the day in a month/year date string
+		* @config MD_DAY_POSITION
+		* @type Number
+		* @default 2
 		*/
-		CSS_CELL_LEFT : defStyle.CSS_CELL_LEFT,
+		this.cfg.addProperty(defCfg.MD_DAY_POSITION.key,		{ value:defCfg.MD_DAY_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+	
 		/**
-		* @property Style.CSS_CELL_RIGHT
+		* The position of the month in a month/day/year date string
+		* @config MDY_MONTH_POSITION
+		* @type Number
+		* @default 1
 		*/
-		CSS_CELL_RIGHT : defStyle.CSS_CELL_RIGHT,
+		this.cfg.addProperty(defCfg.MDY_MONTH_POSITION.key,	{ value:defCfg.MDY_MONTH_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+	
 		/**
-		* @property Style.CSS_CELL_BOTTOM
+		* The position of the day in a month/day/year date string
+		* @config MDY_DAY_POSITION
+		* @type Number
+		* @default 2
 		*/
-		CSS_CELL_BOTTOM : defStyle.CSS_CELL_BOTTOM,
+		this.cfg.addProperty(defCfg.MDY_DAY_POSITION.key,	{ value:defCfg.MDY_DAY_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+	
 		/**
-		* @property Style.CSS_CELL_HOVER
+		* The position of the year in a month/day/year date string
+		* @config MDY_YEAR_POSITION
+		* @type Number
+		* @default 3
 		*/
-		CSS_CELL_HOVER : defStyle.CSS_CELL_HOVER,
+		this.cfg.addProperty(defCfg.MDY_YEAR_POSITION.key,	{ value:defCfg.MDY_YEAR_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+		
 		/**
-		* @property Style.CSS_CELL_HIGHLIGHT1
+		* The position of the month in the month year label string used as the Calendar header
+		* @config MY_LABEL_MONTH_POSITION
+		* @type Number
+		* @default 1
 		*/
-		CSS_CELL_HIGHLIGHT1 : defStyle.CSS_CELL_HIGHLIGHT1,
+		this.cfg.addProperty(defCfg.MY_LABEL_MONTH_POSITION.key,	{ value:defCfg.MY_LABEL_MONTH_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+	
 		/**
-		* @property Style.CSS_CELL_HIGHLIGHT2
+		* The position of the year in the month year label string used as the Calendar header
+		* @config MY_LABEL_YEAR_POSITION
+		* @type Number
+		* @default 2
 		*/
-		CSS_CELL_HIGHLIGHT2 : defStyle.CSS_CELL_HIGHLIGHT2,
+		this.cfg.addProperty(defCfg.MY_LABEL_YEAR_POSITION.key,	{ value:defCfg.MY_LABEL_YEAR_POSITION.value, handler:this.configLocale, validator:this.cfg.checkNumber } );
+		
 		/**
-		* @property Style.CSS_CELL_HIGHLIGHT3
+		* The suffix used after the month when rendering the Calendar header
+		* @config MY_LABEL_MONTH_SUFFIX
+		* @type String
+		* @default " "
 		*/
-		CSS_CELL_HIGHLIGHT3 : defStyle.CSS_CELL_HIGHLIGHT3,
+		this.cfg.addProperty(defCfg.MY_LABEL_MONTH_SUFFIX.key,	{ value:defCfg.MY_LABEL_MONTH_SUFFIX.value, handler:this.configLocale } );
+		
 		/**
-		* @property Style.CSS_CELL_HIGHLIGHT4
+		* The suffix used after the year when rendering the Calendar header
+		* @config MY_LABEL_YEAR_SUFFIX
+		* @type String
+		* @default ""
 		*/
-		CSS_CELL_HIGHLIGHT4 : defStyle.CSS_CELL_HIGHLIGHT4
-	};
-};
-
-/**
-* Builds the date label that will be displayed in the calendar header or
-* footer, depending on configuration.
-* @method buildMonthLabel
-* @return	{String}	The formatted calendar month label
-*/
-YAHOO.widget.Calendar.prototype.buildMonthLabel = function() {
-	var pageDate = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key);
-
-	var monthLabel  = this.Locale.LOCALE_MONTHS[pageDate.getMonth()] + this.Locale.MY_LABEL_MONTH_SUFFIX;
-	var yearLabel = pageDate.getFullYear() + this.Locale.MY_LABEL_YEAR_SUFFIX;
-
-	if (this.Locale.MY_LABEL_MONTH_POSITION == 2 || this.Locale.MY_LABEL_YEAR_POSITION == 1) {
-		return yearLabel + monthLabel;
-	} else {
-		return monthLabel + yearLabel;
-	}
-};
-
-/**
-* Builds the date digit that will be displayed in calendar cells
-* @method buildDayLabel
-* @param {Date}	workingDate	The current working date
-* @return	{String}	The formatted day label
-*/
-YAHOO.widget.Calendar.prototype.buildDayLabel = function(workingDate) {
-	return workingDate.getDate();
-};
-
-/**
-* Renders the calendar header.
-* @method renderHeader
-* @param {Array}	html	The current working HTML array
-* @return {Array} The current working HTML array
-*/
-YAHOO.widget.Calendar.prototype.renderHeader = function(html) {
-	var colSpan = 7;
-	
-	var DEPR_NAV_LEFT = "us/tr/callt.gif";
-	var DEPR_NAV_RIGHT = "us/tr/calrt.gif";	
-	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
-	
-	if (this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key)) {
-		colSpan += 1;
-	}
-
-	if (this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key)) {
-		colSpan += 1;
-	}
+		this.cfg.addProperty(defCfg.MY_LABEL_YEAR_SUFFIX.key, { value:defCfg.MY_LABEL_YEAR_SUFFIX.value, handler:this.configLocale } );
 
-	html[html.length] = "<thead>";
-	html[html.length] =		"<tr>";
-	html[html.length] =			'<th colspan="' + colSpan + '" class="' + this.Style.CSS_HEADER_TEXT + '">';
-	html[html.length] =				'<div class="' + this.Style.CSS_HEADER + '">';
+		/**
+		* Configuration for the Month/Year CalendarNavigator UI which allows the user to jump directly to a 
+		* specific Month/Year without having to scroll sequentially through months.
+		* <p>
+		* Setting this property to null (default value) or false, will disable the CalendarNavigator UI.
+		* </p>
+		* <p>
+		* Setting this property to true will enable the CalendarNavigatior UI with the default CalendarNavigator configuration values.
+		* </p>
+		* <p>
+		* This property can also be set to an object literal containing configuration properties for the CalendarNavigator UI.
+		* The configuration object expects the the following case-sensitive properties, with the "strings" property being a nested object.
+		* Any properties which are not provided will use the default values (defined in the CalendarNavigator class).
+		* </p>
+		* <dl>
+		* <dt>strings</dt>
+		* <dd><em>Object</em> :  An object with the properties shown below, defining the string labels to use in the Navigator's UI
+		*     <dl>
+		*         <dt>month</dt><dd><em>String</em> : The string to use for the month label. Defaults to "Month".</dd>
+		*         <dt>year</dt><dd><em>String</em> : The string to use for the year label. Defaults to "Year".</dd>
+		*         <dt>submit</dt><dd><em>String</em> : The string to use for the submit button label. Defaults to "Okay".</dd>
+		*         <dt>cancel</dt><dd><em>String</em> : The string to use for the cancel button label. Defaults to "Cancel".</dd>
+		*         <dt>invalidYear</dt><dd><em>String</em> : The string to use for invalid year values. Defaults to "Year needs to be a number".</dd>
+		*     </dl>
+		* </dd>
+		* <dt>monthFormat</dt><dd><em>String</em> : The month format to use. Either YAHOO.widget.Calendar.LONG, or YAHOO.widget.Calendar.SHORT. Defaults to YAHOO.widget.Calendar.LONG</dd>
+		* <dt>initialFocus</dt><dd><em>String</em> : Either "year" or "month" specifying which input control should get initial focus. Defaults to "year"</dd>
+		* </dl>
+		* <p>E.g.</p>
+		* <pre>
+		* var navConfig = {
+		*	  strings: {
+		*		  month:"Calendar Month",
+		*		  year:"Calendar Year",
+		*		  submit: "Submit",
+		*		  cancel: "Cancel",
+		*		  invalidYear: "Please enter a valid year"
+		*	  },
+		*	  monthFormat: YAHOO.widget.Calendar.SHORT,
+		*	  initialFocus: "month"
+		* }
+		* </pre>
+		* @config navigator
+		* @type {Object|Boolean}
+		* @default null
+		*/
+		this.cfg.addProperty(defCfg.NAV.key, { value:defCfg.NAV.value, handler:this.configNavigator } );
+	},
 
-	var renderLeft, renderRight = false;
+	/**
+	* The default handler for the "pagedate" property
+	* @method configPageDate
+	*/
+	configPageDate : function(type, args, obj) {
+		this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key, this._parsePageDate(args[0]), true);
+	},
 
-	if (this.parent) {
-		if (this.index === 0) {
-			renderLeft = true;
-		}
-		if (this.index == (this.parent.cfg.getProperty("pages") -1)) {
-			renderRight = true;
+	/**
+	* The default handler for the "mindate" property
+	* @method configMinDate
+	*/
+	configMinDate : function(type, args, obj) {
+		var val = args[0];
+		if (YAHOO.lang.isString(val)) {
+			val = this._parseDate(val);
+			this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MINDATE.key, YAHOO.widget.DateMath.getDate(val[0],(val[1]-1),val[2]));
 		}
-	} else {
-		renderLeft = true;
-		renderRight = true;
-	}
+	},
 
-	var cal = this.parent || this;
-	
-	if (renderLeft) {
-		var leftArrow = this.cfg.getProperty(defCfg.NAV_ARROW_LEFT.key);
-		// Check for deprecated customization - If someone set IMG_ROOT, but didn't set NAV_ARROW_LEFT, then set NAV_ARROW_LEFT to the old deprecated value
-		if (leftArrow === null && YAHOO.widget.Calendar.IMG_ROOT !== null) {
-			leftArrow = YAHOO.widget.Calendar.IMG_ROOT + DEPR_NAV_LEFT;
+	/**
+	* The default handler for the "maxdate" property
+	* @method configMaxDate
+	*/
+	configMaxDate : function(type, args, obj) {
+		var val = args[0];
+		if (YAHOO.lang.isString(val)) {
+			val = this._parseDate(val);
+			this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MAXDATE.key, YAHOO.widget.DateMath.getDate(val[0],(val[1]-1),val[2]));
 		}
-		var leftStyle = (leftArrow === null) ? "" : ' style="background-image:url(' + leftArrow + ')"';
-		html[html.length] = '<a class="' + this.Style.CSS_NAV_LEFT + '"' + leftStyle + ' >&#160;</a>';
-	}
-	
-	html[html.length] = this.buildMonthLabel();
+	},
 	
-	if (renderRight) {
-		var rightArrow = this.cfg.getProperty(defCfg.NAV_ARROW_RIGHT.key);
-		if (rightArrow === null && YAHOO.widget.Calendar.IMG_ROOT !== null) {
-			rightArrow = YAHOO.widget.Calendar.IMG_ROOT + DEPR_NAV_RIGHT;
+	/**
+	* The default handler for the "selected" property
+	* @method configSelected
+	*/
+	configSelected : function(type, args, obj) {
+		var selected = args[0];
+		var cfgSelected = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
+		
+		if (selected) {
+			if (YAHOO.lang.isString(selected)) {
+				this.cfg.setProperty(cfgSelected, this._parseDates(selected), true);
+			} 
 		}
-		var rightStyle = (rightArrow === null) ? "" : ' style="background-image:url(' + rightArrow + ')"';
-		html[html.length] = '<a class="' + this.Style.CSS_NAV_RIGHT + '"' + rightStyle + ' >&#160;</a>';
-	}
-
-	html[html.length] =	'</div>\n</th>\n</tr>';
-
-	if (this.cfg.getProperty(defCfg.SHOW_WEEKDAYS.key)) {
-		html = this.buildWeekdays(html);
-	}
+		if (! this._selectedDates) {
+			this._selectedDates = this.cfg.getProperty(cfgSelected);
+		}
+	},
 	
-	html[html.length] = '</thead>';
-
-	return html;
-};
-
-/**
-* Renders the Calendar's weekday headers.
-* @method buildWeekdays
-* @param {Array}	html	The current working HTML array
-* @return {Array} The current working HTML array
-*/
-YAHOO.widget.Calendar.prototype.buildWeekdays = function(html) {
-
-	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
-
-	html[html.length] = '<tr class="' + this.Style.CSS_WEEKDAY_ROW + '">';
-
-	if (this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key)) {
-		html[html.length] = '<th>&#160;</th>';
-	}
-
-	for(var i=0;i<this.Locale.LOCALE_WEEKDAYS.length;++i) {
-		html[html.length] = '<th class="calweekdaycell">' + this.Locale.LOCALE_WEEKDAYS[i] + '</th>';
-	}
-
-	if (this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key)) {
-		html[html.length] = '<th>&#160;</th>';
-	}
-
-	html[html.length] = '</tr>';
-
-	return html;
-};
-
-/**
-* Renders the calendar body.
-* @method renderBody
-* @param {Date}	workingDate	The current working Date being used for the render process
-* @param {Array}	html	The current working HTML array
-* @return {Array} The current working HTML array
-*/
-YAHOO.widget.Calendar.prototype.renderBody = function(workingDate, html) {
-	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
-
-	var startDay = this.cfg.getProperty(defCfg.START_WEEKDAY.key);
-
-	this.preMonthDays = workingDate.getDay();
-	if (startDay > 0) {
-		this.preMonthDays -= startDay;
-	}
-	if (this.preMonthDays < 0) {
-		this.preMonthDays += 7;
-	}
+	/**
+	* The default handler for all configuration options properties
+	* @method configOptions
+	*/
+	configOptions : function(type, args, obj) {
+		this.Options[type.toUpperCase()] = args[0];
+	},
 	
-	this.monthDays = YAHOO.widget.DateMath.findMonthEnd(workingDate).getDate();
-	this.postMonthDays = YAHOO.widget.Calendar.DISPLAY_DAYS-this.preMonthDays-this.monthDays;
+	/**
+	* The default handler for all configuration locale properties
+	* @method configLocale
+	*/
+	configLocale : function(type, args, obj) {
+		var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
+		this.Locale[type.toUpperCase()] = args[0];
 	
-	workingDate = YAHOO.widget.DateMath.subtract(workingDate, YAHOO.widget.DateMath.DAY, this.preMonthDays);
-
-	var weekNum,weekClass;
-	var weekPrefix = "w";
-	var cellPrefix = "_cell";
-	var workingDayPrefix = "wd";
-	var dayPrefix = "d";
-	
-	var cellRenderers;
-	var renderer;
-	
-	var todayYear = this.today.getFullYear();
-	var todayMonth = this.today.getMonth();
-	var todayDate = this.today.getDate();
-	
-	var useDate = this.cfg.getProperty(defCfg.PAGEDATE.key);
-	var hideBlankWeeks = this.cfg.getProperty(defCfg.HIDE_BLANK_WEEKS.key);
-	var showWeekFooter = this.cfg.getProperty(defCfg.SHOW_WEEK_FOOTER.key);
-	var showWeekHeader = this.cfg.getProperty(defCfg.SHOW_WEEK_HEADER.key);
-	var mindate = this.cfg.getProperty(defCfg.MINDATE.key);
-	var maxdate = this.cfg.getProperty(defCfg.MAXDATE.key);
-
-	if (mindate) {
-		mindate = YAHOO.widget.DateMath.clearTime(mindate);
-	}
-	if (maxdate) {
-		maxdate = YAHOO.widget.DateMath.clearTime(maxdate);
-	}
+		this.cfg.refireEvent(defCfg.LOCALE_MONTHS.key);
+		this.cfg.refireEvent(defCfg.LOCALE_WEEKDAYS.key);
+	},
 	
-	html[html.length] = '<tbody class="m' + (useDate.getMonth()+1) + ' ' + this.Style.CSS_BODY + '">';
+	/**
+	* The default handler for all configuration locale field length properties
+	* @method configLocaleValues
+	*/
+	configLocaleValues : function(type, args, obj) {
+		var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG; 
 	
-	var i = 0;
-
-	var tempDiv = document.createElement("div");
-	var cell = document.createElement("td");
-	tempDiv.appendChild(cell);
-
-	var jan1 = new Date(useDate.getFullYear(),0,1);
-
-	var cal = this.parent || this;
-
-	for (var r=0;r<6;r++) {
-
-		weekNum = YAHOO.widget.DateMath.getWeekNumber(workingDate, useDate.getFullYear(), startDay);
-		weekClass = weekPrefix + weekNum;
-
-		// Local OOM check for performance, since we already have pagedate
-		if (r !== 0 && hideBlankWeeks === true && workingDate.getMonth() != useDate.getMonth()) {
-			break;
-		} else {
-
-			html[html.length] = '<tr class="' + weekClass + '">';
-			
-			if (showWeekHeader) { html = this.renderRowHeader(weekNum, html); }
-			
-			for (var d=0;d<7;d++){ // Render actual days
-
-				cellRenderers = [];
-				renderer = null;
-
-				this.clearElement(cell);
-				cell.className = this.Style.CSS_CELL;
-				cell.id = this.id + cellPrefix + i;
-
-				if (workingDate.getDate()		== todayDate && 
-					workingDate.getMonth()		== todayMonth &&
-					workingDate.getFullYear()	== todayYear) {
-					cellRenderers[cellRenderers.length]=cal.renderCellStyleToday;
-				}
-				
-				var workingArray = [workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()];
-				this.cellDates[this.cellDates.length] = workingArray; // Add this date to cellDates
-				
-				// Local OOM check for performance, since we already have pagedate
-				if (workingDate.getMonth() != useDate.getMonth()) {
-					cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth;
-				} else {
-					YAHOO.util.Dom.addClass(cell, workingDayPrefix + workingDate.getDay());
-					YAHOO.util.Dom.addClass(cell, dayPrefix + workingDate.getDate());
-				
-					for (var s=0;s<this.renderStack.length;++s) {
-
-						var rArray = this.renderStack[s];
-						var type = rArray[0];
-						
-						var month;
-						var day;
-						var year;
-						
-						switch (type) {
-							case YAHOO.widget.Calendar.DATE:
-								month = rArray[1][1];
-								day = rArray[1][2];
-								year = rArray[1][0];
-
-								if (workingDate.getMonth()+1 == month && workingDate.getDate() == day && workingDate.getFullYear() == year) {
-									renderer = rArray[2];
-									this.renderStack.splice(s,1);
-								}
-								break;
-							case YAHOO.widget.Calendar.MONTH_DAY:
-								month = rArray[1][0];
-								day = rArray[1][1];
-								
-								if (workingDate.getMonth()+1 == month && workingDate.getDate() == day) {
-									renderer = rArray[2];
-									this.renderStack.splice(s,1);
-								}
-								break;
-							case YAHOO.widget.Calendar.RANGE:
-								var date1 = rArray[1][0];
-								var date2 = rArray[1][1];
-
-								var d1month = date1[1];
-								var d1day = date1[2];
-								var d1year = date1[0];
-								
-								var d1 = new Date(d1year, d1month-1, d1day);
-
-								var d2month = date2[1];
-								var d2day = date2[2];
-								var d2year = date2[0];
-
-								var d2 = new Date(d2year, d2month-1, d2day);
-
-								if (workingDate.getTime() >= d1.getTime() && workingDate.getTime() <= d2.getTime()) {
-									renderer = rArray[2];
-
-									if (workingDate.getTime()==d2.getTime()) { 
-										this.renderStack.splice(s,1);
-									}
-								}
-								break;
-							case YAHOO.widget.Calendar.WEEKDAY:
-								
-								var weekday = rArray[1][0];
-								if (workingDate.getDay()+1 == weekday) {
-									renderer = rArray[2];
-								}
-								break;
-							case YAHOO.widget.Calendar.MONTH:
-								
-								month = rArray[1][0];
-								if (workingDate.getMonth()+1 == month) {
-									renderer = rArray[2];
-								}
-								break;
-						}
-						
-						if (renderer) {
-							cellRenderers[cellRenderers.length]=renderer;
-						}
-					}
-
-				}
-
-				if (this._indexOfSelectedFieldArray(workingArray) > -1) {
-					cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected; 
+		type = type.toLowerCase();
+		var val = args[0];
+	
+		switch (type) {
+			case defCfg.LOCALE_MONTHS.key:
+				switch (val) {
+					case YAHOO.widget.Calendar.SHORT:
+						this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_SHORT.key).concat();
+						break;
+					case YAHOO.widget.Calendar.LONG:
+						this.Locale.LOCALE_MONTHS = this.cfg.getProperty(defCfg.MONTHS_LONG.key).concat();
+						break;
 				}
-
-				if ((mindate && (workingDate.getTime() < mindate.getTime())) ||
-					(maxdate && (workingDate.getTime() > maxdate.getTime()))
-				) {
-					cellRenderers[cellRenderers.length]=cal.renderOutOfBoundsDate;
-				} else {
-					cellRenderers[cellRenderers.length]=cal.styleCellDefault;
-					cellRenderers[cellRenderers.length]=cal.renderCellDefault;	
+				break;
+			case defCfg.LOCALE_WEEKDAYS.key:
+				switch (val) {
+					case YAHOO.widget.Calendar.ONE_CHAR:
+						this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_1CHAR.key).concat();
+						break;
+					case YAHOO.widget.Calendar.SHORT:
+						this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_SHORT.key).concat();
+						break;
+					case YAHOO.widget.Calendar.MEDIUM:
+						this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_MEDIUM.key).concat();
+						break;
+					case YAHOO.widget.Calendar.LONG:
+						this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(defCfg.WEEKDAYS_LONG.key).concat();
+						break;
 				}
 				
-				for (var x=0; x < cellRenderers.length; ++x) {
-					if (cellRenderers[x].call(cal, workingDate, cell) == YAHOO.widget.Calendar.STOP_RENDER) {
-						break;
+				var START_WEEKDAY = this.cfg.getProperty(defCfg.START_WEEKDAY.key);
+	
+				if (START_WEEKDAY > 0) {
+					for (var w=0;w<START_WEEKDAY;++w) {
+						this.Locale.LOCALE_WEEKDAYS.push(this.Locale.LOCALE_WEEKDAYS.shift());
 					}
 				}
+				break;
+		}
+	},
 
-				workingDate.setTime(workingDate.getTime() + YAHOO.widget.DateMath.ONE_DAY_MS);
-
-				if (i >= 0 && i <= 6) {
-					YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_TOP);
-				}
-				if ((i % 7) === 0) {
-					YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_LEFT);
-				}
-				if (((i+1) % 7) === 0) {
-					YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_RIGHT);
-				}
-				
-				var postDays = this.postMonthDays; 
-				if (hideBlankWeeks && postDays >= 7) {
-					var blankWeeks = Math.floor(postDays/7);
-					for (var p=0;p<blankWeeks;++p) {
-						postDays -= 7;
+	/**
+	 * The default handler for the "navigator" property
+	 * @method configNavigator
+	 */
+	configNavigator : function(type, args, obj) {
+		var val = args[0];
+		if (YAHOO.widget.CalendarNavigator && (val === true || YAHOO.lang.isObject(val))) {
+			if (!this.oNavigator) {
+				this.oNavigator = new YAHOO.widget.CalendarNavigator(this);
+				// Cleanup DOM Refs/Events before innerHTML is removed.
+				function erase() {
+					if (!this.pages) {
+						this.oNavigator.erase();
 					}
 				}
-				
-				if (i >= ((this.preMonthDays+postDays+this.monthDays)-7)) {
-					YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_BOTTOM);
-				}
-
-				html[html.length] = tempDiv.innerHTML;
-				i++;
+				this.beforeRenderEvent.subscribe(erase, this, true);
+			}
+		} else {
+			if (this.oNavigator) {
+				this.oNavigator.destroy();
+				this.oNavigator = null;
 			}
-
-			if (showWeekFooter) { html = this.renderRowFooter(weekNum, html); }
-
-			html[html.length] = '</tr>';
 		}
-	}
-
-	html[html.length] = '</tbody>';
-
-	return html;
-};
-
-/**
-* Renders the calendar footer. In the default implementation, there is
-* no footer.
-* @method renderFooter
-* @param {Array}	html	The current working HTML array
-* @return {Array} The current working HTML array
-*/
-YAHOO.widget.Calendar.prototype.renderFooter = function(html) { return html; };
-
-/**
-* Renders the calendar after it has been configured. The render() method has a specific call chain that will execute
-* when the method is called: renderHeader, renderBody, renderFooter.
-* Refer to the documentation for those methods for information on 
-* individual render tasks.
-* @method render
-*/
-YAHOO.widget.Calendar.prototype.render = function() {
-	this.beforeRenderEvent.fire();
-
-	var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
-
-	// Find starting day of the current month
-	var workingDate = YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty(defCfg.PAGEDATE.key));
-
-	this.resetRenderers();
-	this.cellDates.length = 0;
-
-	YAHOO.util.Event.purgeElement(this.oDomContainer, true);
-
-	var html = [];
-
-	html[html.length] = '<table cellSpacing="0" class="' + this.Style.CSS_CALENDAR + ' y' + workingDate.getFullYear() + '" id="' + this.id + '">';
-	html = this.renderHeader(html);
-	html = this.renderBody(workingDate, html);
-	html = this.renderFooter(html);
-	html[html.length] = '</table>';
-
-	this.oDomContainer.innerHTML = html.join("\n");
-
-	this.applyListeners();
-	this.cells = this.oDomContainer.getElementsByTagName("td");
+	},
 
-	this.cfg.refireEvent(defCfg.TITLE.key);
-	this.cfg.refireEvent(defCfg.CLOSE.key);
-	this.cfg.refireEvent(defCfg.IFRAME.key);
+	/**
+	* Defines the style constants for the Calendar
+	* @method initStyles
+	*/
+	initStyles : function() {
 
-	this.renderEvent.fire();
-};
+		var defStyle = YAHOO.widget.Calendar._STYLES;
 
-/**
-* Applies the Calendar's DOM listeners to applicable elements.
-* @method applyListeners
-*/
-YAHOO.widget.Calendar.prototype.applyListeners = function() {
+		this.Style = {
+			/**
+			* @property Style.CSS_ROW_HEADER
+			*/
+			CSS_ROW_HEADER: defStyle.CSS_ROW_HEADER,
+			/**
+			* @property Style.CSS_ROW_FOOTER
+			*/
+			CSS_ROW_FOOTER: defStyle.CSS_ROW_FOOTER,
+			/**
+			* @property Style.CSS_CELL
+			*/
+			CSS_CELL : defStyle.CSS_CELL,
+			/**
+			* @property Style.CSS_CELL_SELECTOR
+			*/
+			CSS_CELL_SELECTOR : defStyle.CSS_CELL_SELECTOR,
+			/**
+			* @property Style.CSS_CELL_SELECTED
+			*/
+			CSS_CELL_SELECTED : defStyle.CSS_CELL_SELECTED,
+			/**
+			* @property Style.CSS_CELL_SELECTABLE
+			*/
+			CSS_CELL_SELECTABLE : defStyle.CSS_CELL_SELECTABLE,
+			/**
+			* @property Style.CSS_CELL_RESTRICTED
+			*/
+			CSS_CELL_RESTRICTED : defStyle.CSS_CELL_RESTRICTED,
+			/**
+			* @property Style.CSS_CELL_TODAY
+			*/
+			CSS_CELL_TODAY : defStyle.CSS_CELL_TODAY,
+			/**
+			* @property Style.CSS_CELL_OOM
+			*/
+			CSS_CELL_OOM : defStyle.CSS_CELL_OOM,
+			/**
+			* @property Style.CSS_CELL_OOB
+			*/
+			CSS_CELL_OOB : defStyle.CSS_CELL_OOB,
+			/**
+			* @property Style.CSS_HEADER
+			*/
+			CSS_HEADER : defStyle.CSS_HEADER,
+			/**
+			* @property Style.CSS_HEADER_TEXT
+			*/
+			CSS_HEADER_TEXT : defStyle.CSS_HEADER_TEXT,
+			/**
+			* @property Style.CSS_BODY
+			*/
+			CSS_BODY : defStyle.CSS_BODY,
+			/**
+			* @property Style.CSS_WEEKDAY_CELL
+			*/
+			CSS_WEEKDAY_CELL : defStyle.CSS_WEEKDAY_CELL,
+			/**
+			* @property Style.CSS_WEEKDAY_ROW
+			*/
+			CSS_WEEKDAY_ROW : defStyle.CSS_WEEKDAY_ROW,
+			/**
+			* @property Style.CSS_FOOTER
+			*/
+			CSS_FOOTER : defStyle.CSS_FOOTER,
+			/**
+			* @property Style.CSS_CALENDAR
+			*/
+			CSS_CALENDAR : defStyle.CSS_CALENDAR,
+			/**
+			* @property Style.CSS_SINGLE
+			*/
+			CSS_SINGLE : defStyle.CSS_SINGLE,
+			/**
+			* @property Style.CSS_CONTAINER
+			*/
+			CSS_CONTAINER : defStyle.CSS_CONTAINER,
+			/**
+			* @property Style.CSS_NAV_LEFT
+			*/
+			CSS_NAV_LEFT : defStyle.CSS_NAV_LEFT,
+			/**
+			* @property Style.CSS_NAV_RIGHT
+			*/
+			CSS_NAV_RIGHT : defStyle.CSS_NAV_RIGHT,
+			/**
+			* @property Style.CSS_NAV
+			*/
+			CSS_NAV : defStyle.CSS_NAV,
+			/**
+			* @property Style.CSS_CLOSE
+			*/
+			CSS_CLOSE : defStyle.CSS_CLOSE,
+			/**
+			* @property Style.CSS_CELL_TOP
+			*/
+			CSS_CELL_TOP : defStyle.CSS_CELL_TOP,
+			/**
+			* @property Style.CSS_CELL_LEFT
+			*/
+			CSS_CELL_LEFT : defStyle.CSS_CELL_LEFT,
+			/**
+			* @property Style.CSS_CELL_RIGHT
+			*/
+			CSS_CELL_RIGHT : defStyle.CSS_CELL_RIGHT,
+			/**
+			* @property Style.CSS_CELL_BOTTOM
+			*/

[... 6198 lines stripped ...]