src/cm/media/js/lib/yui/yui_3.10.3/build/calendar/calendar-debug.js
changeset 525 89ef5ed3c48b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/media/js/lib/yui/yui_3.10.3/build/calendar/calendar-debug.js	Tue Jul 16 14:29:46 2013 +0200
@@ -0,0 +1,574 @@
+/*
+YUI 3.10.3 (build 2fb5187)
+Copyright 2013 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+
+YUI.add('calendar', function (Y, NAME) {
+
+/**
+ * The Calendar component is a UI widget that allows users
+ * to view dates in a two-dimensional month grid, as well as
+ * to select one or more dates, or ranges of dates. Calendar
+ * is generated dynamically and relies on the developer to
+ * provide for a progressive enhancement alternative.
+ *
+ *
+ * @module calendar
+ */
+
+var getCN             = Y.ClassNameManager.getClassName,
+    CALENDAR          = 'calendar',
+    KEY_DOWN          = 40,
+    KEY_UP            = 38,
+    KEY_LEFT          = 37,
+    KEY_RIGHT         = 39,
+    KEY_ENTER         = 13,
+    KEY_SPACE         = 32,
+    CAL_DAY_SELECTED  = getCN(CALENDAR, 'day-selected'),
+    CAL_DAY_HILITED   = getCN(CALENDAR, 'day-highlighted'),
+    CAL_DAY           = getCN(CALENDAR, 'day'),
+    CAL_PREVMONTH_DAY = getCN(CALENDAR, 'prevmonth-day'),
+    CAL_NEXTMONTH_DAY = getCN(CALENDAR, 'nextmonth-day'),
+    CAL_GRID          = getCN(CALENDAR, 'grid'),
+    ydate             = Y.DataType.Date,
+    CAL_PANE          = getCN(CALENDAR, 'pane'),
+    os                = Y.UA.os;
+
+/** Create a calendar view to represent a single or multiple
+    * month range of dates, rendered as a grid with date and
+    * weekday labels.
+    *
+    * @class Calendar
+    * @extends CalendarBase
+    * @param config {Object} Configuration object (see Configuration attributes)
+    * @constructor
+    */
+function Calendar() {
+    Calendar.superclass.constructor.apply ( this, arguments );
+}
+
+Y.Calendar = Y.extend(Calendar, Y.CalendarBase, {
+
+    _keyEvents: [],
+
+    _highlightedDateNode: null,
+
+    /**
+     * A property tracking the last selected date on the calendar, for the
+     * purposes of multiple selection.
+     *
+     * @property _lastSelectedDate
+     * @type Date
+     * @default null
+     * @private
+     */
+    _lastSelectedDate: null,
+
+    /**
+     * Designated initializer. Activates the navigation plugin for the calendar.
+     *
+     * @method initializer
+     */
+    initializer : function () {
+        this.plug(Y.Plugin.CalendarNavigator);
+
+        this._keyEvents = [];
+        this._highlightedDateNode = null;
+        this._lastSelectedDate = null;
+    },
+
+    /**
+     * Overrides the _bindCalendarEvents placeholder in CalendarBase
+     * and binds calendar events during bindUI stage.
+     * @method _bindCalendarEvents
+     * @protected
+     */
+    _bindCalendarEvents : function () {
+        var contentBox = this.get('contentBox'),
+            pane       = contentBox.one("." + CAL_PANE);
+
+        pane.on("selectstart", this._preventSelectionStart);
+        pane.delegate("click", this._clickCalendar, "." + CAL_DAY + ", ." + CAL_PREVMONTH_DAY + ", ." + CAL_NEXTMONTH_DAY, this);
+        pane.delegate("keydown", this._keydownCalendar, "." + CAL_GRID, this);
+        pane.delegate("focus", this._focusCalendarGrid, "." + CAL_GRID, this);
+        pane.delegate("focus", this._focusCalendarCell, "." + CAL_DAY, this);
+        pane.delegate("blur", this._blurCalendarGrid, "." + CAL_GRID + ",." + CAL_DAY, this);
+    },
+
+    /**
+     * Prevents text selection if it is started within the calendar pane
+     * @method _preventSelectionStart
+     * @param event {Event} The selectstart event
+     * @protected
+     */
+    _preventSelectionStart : function (event) {
+        event.preventDefault();
+    },
+
+    /**
+     * Highlights a specific date node with keyboard highlight class
+     * @method _highlightDateNode
+     * @param oDate {Date} Date corresponding the node to be highlighted
+     * @protected
+     */
+    _highlightDateNode : function (oDate) {
+        this._unhighlightCurrentDateNode();
+        var newNode = this._dateToNode(oDate);
+        newNode.focus();
+        newNode.addClass(CAL_DAY_HILITED);
+    },
+
+    /**
+     * Unhighlights a specific date node currently highlighted with keyboard highlight class
+     * @method _unhighlightCurrentDateNode
+     * @protected
+     */
+    _unhighlightCurrentDateNode : function () {
+        var allHilitedNodes = this.get("contentBox").all("." + CAL_DAY_HILITED);
+        if (allHilitedNodes) {
+            allHilitedNodes.removeClass(CAL_DAY_HILITED);
+        }
+    },
+
+    /**
+     * Returns the grid number for a specific calendar grid (for multi-grid templates)
+     * @method _getGridNumber
+     * @param gridNode {Node} Node corresponding to a specific grid
+     * @protected
+     */
+    _getGridNumber : function (gridNode) {
+        var idParts = gridNode.get("id").split("_").reverse();
+
+        return parseInt(idParts[0], 10);
+    },
+
+    /**
+     * Handler for loss of focus of calendar grid
+     * @method _blurCalendarGrid
+     * @protected
+     */
+    _blurCalendarGrid : function () {
+        this._unhighlightCurrentDateNode();
+    },
+
+
+    /**
+     * Handler for gain of focus of calendar cell
+     * @method _focusCalendarCell
+     * @protected
+     */
+    _focusCalendarCell : function (ev) {
+        this._highlightedDateNode = ev.target;
+        ev.stopPropagation();
+    },
+
+    /**
+     * Handler for gain of focus of calendar grid
+     * @method _focusCalendarGrid
+     * @protected
+     */
+    _focusCalendarGrid : function () {
+        this._unhighlightCurrentDateNode();
+        this._highlightedDateNode = null;
+    },
+
+    /**
+     * Handler for keyboard press on a calendar grid
+     * @method _keydownCalendar
+     * @protected
+     */
+    _keydownCalendar : function (ev) {
+        var gridNum = this._getGridNumber(ev.target),
+            curDate = !this._highlightedDateNode ? null : this._nodeToDate(this._highlightedDateNode),
+            keyCode = ev.keyCode,
+            dayNum = 0,
+            dir = '',
+            selMode,
+            newDate,
+            startDate,
+            endDate,
+            lastPaneDate;
+
+        switch(keyCode) {
+            case KEY_DOWN:
+                dayNum = 7;
+                dir = 's';
+                break;
+            case KEY_UP:
+                dayNum = -7;
+                dir = 'n';
+                break;
+            case KEY_LEFT:
+                dayNum = -1;
+                dir = 'w';
+                break;
+            case KEY_RIGHT:
+                dayNum = 1;
+                dir = 'e';
+                break;
+            case KEY_SPACE: case KEY_ENTER:
+                ev.preventDefault();
+                if (this._highlightedDateNode) {
+                    selMode = this.get("selectionMode");
+                    if (selMode === "single" && !this._highlightedDateNode.hasClass(CAL_DAY_SELECTED)) {
+                            this._clearSelection(true);
+                            this._addDateToSelection(curDate);
+                    } else if (selMode === "multiple" || selMode === "multiple-sticky") {
+                        if (this._highlightedDateNode.hasClass(CAL_DAY_SELECTED)) {
+                            this._removeDateFromSelection(curDate);
+                        } else {
+                            this._addDateToSelection(curDate);
+                        }
+                    }
+                }
+                break;
+        }
+
+
+        if (keyCode === KEY_DOWN || keyCode === KEY_UP || keyCode === KEY_LEFT || keyCode === KEY_RIGHT) {
+
+            if (!curDate) {
+                curDate = ydate.addMonths(this.get("date"), gridNum);
+                dayNum = 0;
+            }
+
+            ev.preventDefault();
+
+            newDate = ydate.addDays(curDate, dayNum);
+            startDate = this.get("date");
+            endDate = ydate.addMonths(this.get("date"), this._paneNumber - 1);
+            lastPaneDate = new Date(endDate);
+            endDate.setDate(ydate.daysInMonth(endDate));
+
+            if (ydate.isInRange(newDate, startDate, endDate)) {
+/*
+                var paneShift = (newDate.getMonth() - curDate.getMonth()) % 10;
+
+                if (paneShift != 0) {
+                    var newGridNum = gridNum + paneShift,
+                            contentBox = this.get('contentBox'),
+                            newPane = contentBox.one("#" + this._calendarId + "_pane_" + newGridNum);
+                            newPane.focus();
+                }
+*/
+                this._highlightDateNode(newDate);
+            } else if (ydate.isGreater(startDate, newDate)) {
+                if (!ydate.isGreaterOrEqual(this.get("minimumDate"), startDate)) {
+                    this.set("date", ydate.addMonths(startDate, -1));
+                    this._highlightDateNode(newDate);
+                }
+            } else if (ydate.isGreater(newDate, endDate)) {
+                if (!ydate.isGreaterOrEqual(lastPaneDate, this.get("maximumDate"))) {
+                    this.set("date", ydate.addMonths(startDate, 1));
+                    this._highlightDateNode(newDate);
+                }
+            }
+        }
+    },
+
+    /**
+     * Handles the calendar clicks based on selection mode.
+     * @method _clickCalendar
+     * @param {Event} ev A click event
+     * @private
+     */
+    _clickCalendar : function (ev) {
+        var clickedCell = ev.currentTarget,
+            clickedCellIsDay = clickedCell.hasClass(CAL_DAY) &&
+                                !clickedCell.hasClass(CAL_PREVMONTH_DAY) &&
+                                !clickedCell.hasClass(CAL_NEXTMONTH_DAY),
+
+        clickedCellIsSelected = clickedCell.hasClass(CAL_DAY_SELECTED),
+        selectedDate;
+
+        switch (this.get("selectionMode")) {
+            case("single"):
+                if (clickedCellIsDay) {
+                    if (!clickedCellIsSelected) {
+                        this._clearSelection(true);
+                        this._addDateToSelection(this._nodeToDate(clickedCell));
+                    }
+                }
+                break;
+            case("multiple-sticky"):
+                if (clickedCellIsDay) {
+                    if (clickedCellIsSelected) {
+                        this._removeDateFromSelection(this._nodeToDate(clickedCell));
+                    } else {
+                        this._addDateToSelection(this._nodeToDate(clickedCell));
+                    }
+                }
+                break;
+            case("multiple"):
+                if (clickedCellIsDay) {
+                    if (!ev.metaKey && !ev.ctrlKey && !ev.shiftKey) {
+                        this._clearSelection(true);
+                        this._lastSelectedDate = this._nodeToDate(clickedCell);
+                        this._addDateToSelection(this._lastSelectedDate);
+                    } else if (((os === 'macintosh' && ev.metaKey) || (os !== 'macintosh' && ev.ctrlKey)) && !ev.shiftKey) {
+                        if (clickedCellIsSelected) {
+                            this._removeDateFromSelection(this._nodeToDate(clickedCell));
+                            this._lastSelectedDate = null;
+                        } else {
+                            this._lastSelectedDate = this._nodeToDate(clickedCell);
+                            this._addDateToSelection(this._lastSelectedDate);
+                        }
+                    } else if (((os === 'macintosh' && ev.metaKey) || (os !== 'macintosh' && ev.ctrlKey)) && ev.shiftKey) {
+                        if (this._lastSelectedDate) {
+                            selectedDate = this._nodeToDate(clickedCell);
+                            this._addDateRangeToSelection(selectedDate, this._lastSelectedDate);
+                            this._lastSelectedDate = selectedDate;
+                        } else {
+                            this._lastSelectedDate = this._nodeToDate(clickedCell);
+                            this._addDateToSelection(this._lastSelectedDate);
+                        }
+                    } else if (ev.shiftKey) {
+                        if (this._lastSelectedDate) {
+                            selectedDate = this._nodeToDate(clickedCell);
+                            this._clearSelection(true);
+                            this._addDateRangeToSelection(selectedDate, this._lastSelectedDate);
+                            this._lastSelectedDate = selectedDate;
+                        } else {
+                            this._clearSelection(true);
+                            this._lastSelectedDate = this._nodeToDate(clickedCell);
+                            this._addDateToSelection(this._lastSelectedDate);
+                        }
+                    }
+                }
+                break;
+        }
+
+        if (clickedCellIsDay) {
+            /**
+            * Fired when a specific date cell in the calendar is clicked. The event carries a
+            * payload which includes a `cell` property corresponding to the node of the actual
+            * date cell, and a `date` property, with the `Date` that was clicked.
+            *
+            * @event dateClick
+            */
+            this.fire("dateClick", {cell: clickedCell, date: this._nodeToDate(clickedCell)});
+        } else if (clickedCell.hasClass(CAL_PREVMONTH_DAY)) {
+            /**
+            * Fired when any of the previous month's days displayed before the calendar grid
+            * are clicked.
+            *
+            * @event prevMonthClick
+            */
+            this.fire("prevMonthClick");
+        } else if (clickedCell.hasClass(CAL_NEXTMONTH_DAY)) {
+            /**
+            * Fired when any of the next month's days displayed after the calendar grid
+            * are clicked.
+            *
+            * @event nextMonthClick
+            */
+            this.fire("nextMonthClick");
+        }
+    },
+
+    /**
+     * Subtracts one month from the current calendar view.
+     * @method subtractMonth
+     * @return {Calendar} A reference to this object
+     * @chainable
+     */
+    subtractMonth : function (e) {
+        this.set("date", ydate.addMonths(this.get("date"), -1));
+        if (e) {
+            e.halt();
+        }
+        return this;
+    },
+
+    /**
+     * Subtracts one year from the current calendar view.
+     * @method subtractYear
+     * @return {Calendar} A reference to this object
+     * @chainable
+     */
+    subtractYear : function (e) {
+        this.set("date", ydate.addYears(this.get("date"), -1));
+        if (e) {
+            e.halt();
+        }
+        return this;
+    },
+
+    /**
+     * Adds one month to the current calendar view.
+     * @method addMonth
+     * @return {Calendar} A reference to this object
+     * @chainable
+     */
+    addMonth : function (e) {
+        this.set("date", ydate.addMonths(this.get("date"), 1));
+        if (e) {
+            e.halt();
+        }
+        return this;
+    },
+
+    /**
+     * Adds one year to the current calendar view.
+     * @method addYear
+     * @return {Calendar} A reference to this object
+     * @chainable
+     */
+    addYear : function (e) {
+        this.set("date", ydate.addYears(this.get("date"), 1));
+        if (e) {
+            e.halt();
+        }
+        return this;
+    }
+}, {
+    /**
+    * The identity of the widget.
+    *
+    * @property NAME
+    * @type String
+    * @default 'calendar'
+    * @readOnly
+    * @protected
+    * @static
+    */
+    NAME: "calendar",
+
+    /**
+    * Static property used to define the default attribute configuration of
+    * the Widget.
+    *
+    * @property ATTRS
+    * @type {Object}
+    * @protected
+    * @static
+    */
+    ATTRS: {
+
+        /**
+         * A setting specifying the type of selection the calendar allows.
+         * Possible values include:
+         * <ul>
+         *   <li>`single` - One date at a time</li>
+         *   <li>`multiple-sticky` - Multiple dates, selected one at a time (the dates "stick"). This option
+         *   is appropriate for mobile devices, where function keys from the keyboard are not available.</li>
+         *   <li>`multiple` - Multiple dates, selected with Ctrl/Meta keys for additional single
+         *   dates, and Shift key for date ranges.</li>
+         *
+         * @attribute selectionMode
+         * @type String
+         * @default single
+         */
+        selectionMode: {
+            value: "single"
+        },
+
+        /**
+         * The date corresponding to the current calendar view. Always
+         * normalized to the first of the month that contains the date
+         * at assignment time. Used as the first date visible in the
+         * calendar.
+         *
+         * @attribute date
+         * @type Date
+         * @default Today's date as set on the user's computer.
+         */
+        date: {
+            value: new Date(),
+            lazyAdd: false,
+            setter: function (val) {
+
+                var newDate = this._normalizeDate(val),
+                    newTopDate = ydate.addMonths(newDate, this._paneNumber - 1),
+                    minDate = this.get("minimumDate"),
+                    maxDate = this.get("maximumDate"),
+                    actualMaxDate;
+
+                if ((!minDate || ydate.isGreaterOrEqual(newDate, minDate)) &&
+                        (!maxDate || ydate.isGreaterOrEqual(maxDate, newTopDate))
+                ) {
+                    return newDate;
+                } else if (minDate && ydate.isGreater(minDate, newDate)) {
+                    return minDate;
+                } else if (maxDate && ydate.isGreater(newTopDate, maxDate)) {
+                    actualMaxDate = ydate.addMonths(maxDate, -1*(this._paneNumber - 1));
+                    return actualMaxDate;
+                }
+            }
+        },
+
+        /**
+         * The minimum date that can be displayed by the calendar. The calendar will not
+         * allow dates earlier than this one to be set, and will reset any earlier date to
+         * this date. Should be `null` if no minimum date is needed.
+         *
+         * @attribute minimumDate
+         * @type Date
+         * @default null
+         */
+        minimumDate: {
+            value: null,
+            setter: function (val) {
+                if (val) {
+                    var curDate = this.get('date'),
+                        newMinDate = this._normalizeDate(val);
+                    if (curDate && !ydate.isGreaterOrEqual(curDate, newMinDate)) {
+                        this.set('date', newMinDate);
+                    }
+                    return newMinDate;
+                } else {
+                    return this._normalizeDate(val);
+                }
+            }
+        },
+
+        /**
+         * The maximum date that can be displayed by the calendar. The calendar will not
+         * allow dates later than this one to be set, and will reset any later date to
+         * this date. Should be `null` if no maximum date is needed.
+         *
+         * @attribute maximumDate
+         * @type Date
+         * @default null
+         */
+        maximumDate: {
+            value: null,
+            setter: function (val) {
+                if (val) {
+                    var curDate = this.get('date'),
+                        newMaxDate = this._normalizeDate(val);
+                    if (curDate && !ydate.isGreaterOrEqual(val, ydate.addMonths(curDate, this._paneNumber - 1))) {
+                        this.set('date', ydate.addMonths(newMaxDate, -1*(this._paneNumber -1)));
+                    }
+                    return newMaxDate;
+                } else {
+                    return val;
+                }
+            }
+        }
+    }
+});
+
+}, '3.10.3', {
+    "requires": [
+        "calendar-base",
+        "calendarnavigator"
+    ],
+    "lang": [
+        "de",
+        "en",
+        "es",
+        "es-AR",
+        "fr",
+        "it",
+        "ja",
+        "nb-NO",
+        "nl",
+        "pt-BR",
+        "ru",
+        "zh-HANT-TW"
+    ],
+    "skinnable": true
+});