src/cm/media/js/lib/yui/yui3-3.15.0/build/widget-modality/widget-modality.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('widget-modality', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
 * Provides modality support for Widgets, though an extension
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
 * @module widget-modality
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
var WIDGET       = 'widget',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
    RENDER_UI    = 'renderUI',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
    BIND_UI      = 'bindUI',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
    SYNC_UI      = 'syncUI',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
    BOUNDING_BOX = 'boundingBox',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
    CONTENT_BOX  = 'contentBox',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
    RENDERED     = 'rendered',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
    VISIBLE      = 'visible',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
    Z_INDEX      = 'zIndex',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
    CHANGE       = 'Change',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
    isBoolean    = Y.Lang.isBoolean,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
    getCN        = Y.ClassNameManager.getClassName,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
    MaskShow     = "maskShow",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
    MaskHide     = "maskHide",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
    ClickOutside = "clickoutside",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
    FocusOutside = "focusoutside",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
    supportsPosFixed = (function(){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
        /*! IS_POSITION_FIXED_SUPPORTED - Juriy Zaytsev (kangax) - http://yura.thinkweb2.com/cft/ */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
        var doc         = Y.config.doc,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
            isSupported = null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
            el, root;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
        if (doc.createElement) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
            el = doc.createElement('div');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
            if (el && el.style) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
                el.style.position = 'fixed';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
                el.style.top = '10px';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
                root = doc.body;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
                if (root && root.appendChild && root.removeChild) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
                    root.appendChild(el);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
                    isSupported = (el.offsetTop === 10);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
                    root.removeChild(el);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
        return isSupported;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    }());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
     * Widget extension, which can be used to add modality support to the base Widget class,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
     * through the Base.create method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
     * @class WidgetModality
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
     * @param {Object} config User configuration object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
    function WidgetModal(config) {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
    var MODAL           = 'modal',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
        MASK            = 'mask',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
        MODAL_CLASSES   = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
            modal   : getCN(WIDGET, MODAL),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
            mask    : getCN(WIDGET, MASK)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
    * Static property used to define the default attribute
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
    * configuration introduced by WidgetModality.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
    *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
    * @property ATTRS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
    * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
    * @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
    WidgetModal.ATTRS = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
            /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
             * @attribute maskNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
             * @type Y.Node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
             *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
             * @description Returns a Y.Node instance of the node being used as the mask.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
             */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
            maskNode : {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
                getter      : '_getMaskNode',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
                readOnly    : true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
            /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
             * @attribute modal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
             * @type boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
             *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
             * @description Whether the widget should be modal or not.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
             */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
            modal: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
                value:false,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
                validator: isBoolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
            /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
             * @attribute focusOn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
             * @type array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
             *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
             * @description An array of objects corresponding to the nodes and events that will trigger a re-focus back on the widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
             * The implementer can supply an array of objects, with each object having the following properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
             * <p>eventName: (string, required): The eventName to listen to.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
             * <p>node: (Y.Node, optional): The Y.Node that will fire the event (defaults to the boundingBox of the widget)</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
             * <p>By default, this attribute consists of two objects which will cause the widget to re-focus if anything
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
             * outside the widget is clicked on or focussed upon.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
             */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
            focusOn: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
                valueFn: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
                    return [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
                        {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
                            // node: this.get(BOUNDING_BOX),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
                            eventName: ClickOutside
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
                        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
                        {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
                            //node: this.get(BOUNDING_BOX),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
                            eventName: FocusOutside
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
                    ];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
                },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
                validator: Y.Lang.isArray
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
    WidgetModal.CLASSES = MODAL_CLASSES;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
     * Returns the mask if it exists on the page - otherwise creates a mask. There's only
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
     * one mask on a page at a given time.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
     * <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
     * This method in invoked internally by the getter of the maskNode ATTR.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
     * </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
     * @method _GET_MASK
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
     * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
    WidgetModal._GET_MASK = function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
        var mask = Y.one('.' + MODAL_CLASSES.mask),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
            win  = Y.one('win');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
        if (mask) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
            return mask;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
        mask = Y.Node.create('<div></div>').addClass(MODAL_CLASSES.mask);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
        if (supportsPosFixed) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
            mask.setStyles({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
                position: 'fixed',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
                width   : '100%',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
                height  : '100%',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
                top     : '0',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
                left    : '0',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
                display : 'block'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
            mask.setStyles({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
                position: 'absolute',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
                width   : win.get('winWidth') +'px',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
                height  : win.get('winHeight') + 'px',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
                top     : '0',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
                left    : '0',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
                display : 'block'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        return mask;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
     * A stack of Y.Widget objects representing the current hierarchy of modal widgets presently displayed on the screen
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
     * @property STACK
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
    WidgetModal.STACK = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
    WidgetModal.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
        initializer: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
            Y.after(this._renderUIModal, this, RENDER_UI);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
            Y.after(this._syncUIModal, this, SYNC_UI);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
            Y.after(this._bindUIModal, this, BIND_UI);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
        destructor: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
            // Hack to remove this thing from the STACK.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
            this._uiSetHostVisibleModal(false);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
        // *** Instance Members *** //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
        _uiHandlesModal: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
         * Adds modal class to the bounding box of the widget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
         * <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
         * This method in invoked after renderUI is invoked for the Widget class
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
         * using YUI's aop infrastructure.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
         * </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
         * @method _renderUIModal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
        _renderUIModal : function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
            var bb = this.get(BOUNDING_BOX);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
                //cb = this.get(CONTENT_BOX);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
            //this makes the content box content appear over the mask
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
            // cb.setStyles({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
            //     position: ""
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
            // });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
            this._repositionMask(this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
            bb.addClass(MODAL_CLASSES.modal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
         * Hooks up methods to be executed when the widget's visibility or z-index changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
         * <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
         * This method in invoked after bindUI is invoked for the Widget class
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
         * using YUI's aop infrastructure.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
         * </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
         * @method _bindUIModal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
        _bindUIModal : function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
            this.after(VISIBLE+CHANGE, this._afterHostVisibleChangeModal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
            this.after(Z_INDEX+CHANGE, this._afterHostZIndexChangeModal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
            this.after("focusOnChange", this._afterFocusOnChange);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
            // Re-align the mask in the viewport if `position: fixed;` is not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
            // supported. iOS < 5 and Android < 3 don't actually support it even
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
            // though they both pass the feature test; the UA sniff is here to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
            // account for that. Ideally this should be replaced with a better
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
            // feature test.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
            if (!supportsPosFixed ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
                    (Y.UA.ios && Y.UA.ios < 5) ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
                    (Y.UA.android && Y.UA.android < 3)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
                Y.one('win').on('scroll', this._resyncMask, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
         * Syncs the mask with the widget's current state, namely the visibility and z-index of the widget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
         * <p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
         * This method in invoked after syncUI is invoked for the Widget class
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
         * using YUI's aop infrastructure.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
         * </p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
         * @method _syncUIModal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
        _syncUIModal : function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
            //var host = this.get(HOST);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
            this._uiSetHostVisibleModal(this.get(VISIBLE));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
         * Provides mouse and tab focus to the widget's bounding box.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
         * @method _focus
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
        _focus : function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
            var bb = this.get(BOUNDING_BOX),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
            oldTI = bb.get('tabIndex');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
            bb.set('tabIndex', oldTI >= 0 ? oldTI : 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
            this.focus();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
         * Blurs the widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
         * @method _blur
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
        _blur : function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
            this.blur();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
         * Returns the Y.Node instance of the maskNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
         * @method _getMaskNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
         * @return {Node} The Y.Node instance of the mask, as returned from WidgetModal._GET_MASK
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
        _getMaskNode : function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
            return WidgetModal._GET_MASK();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
         * Performs events attaching/detaching, stack shifting and mask repositioning based on the visibility of the widget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
         * @method _uiSetHostVisibleModal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
         * @param {boolean} Whether the widget is visible or not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
        _uiSetHostVisibleModal : function (visible) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
            var stack    = WidgetModal.STACK,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
                maskNode = this.get('maskNode'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
                isModal  = this.get('modal'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
                topModal, index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
            if (visible) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
                Y.Array.each(stack, function(modal){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
                    modal._detachUIHandlesModal();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
                    modal._blur();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
                // push on top of stack
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
                stack.unshift(this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
                this._repositionMask(this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
                this._uiSetHostZIndexModal(this.get(Z_INDEX));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
                if (isModal) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
                    maskNode.show();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
                    Y.later(1, this, '_attachUIHandlesModal');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
                    if (this.get(RENDERED)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
                        this._focus();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
                index = Y.Array.indexOf(stack, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
                if (index >= 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
                    // Remove modal widget from global stack.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
                    stack.splice(index, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
                this._detachUIHandlesModal();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
                this._blur();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
                if (stack.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
                    topModal = stack[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
                    this._repositionMask(topModal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
                    //topModal._attachUIHandlesModal();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
                    topModal._uiSetHostZIndexModal(topModal.get(Z_INDEX));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
                    if (topModal.get('modal')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
                        //topModal._attachUIHandlesModal();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
                        Y.later(1, topModal, '_attachUIHandlesModal');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
                        topModal._focus();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
                    if (maskNode.getStyle('display') === 'block') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
                        maskNode.hide();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
         * Sets the z-index of the mask node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
         * @method _uiSetHostZIndexModal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
         * @param {Number} zIndex Z-Index of the widget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
        _uiSetHostZIndexModal : function (zIndex) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
            if (this.get('modal')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
                this.get('maskNode').setStyle(Z_INDEX, zIndex || 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
         * Attaches UI Listeners for "clickoutside" and "focusoutside" on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
         * widget. When these events occur, and the widget is modal, focus is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
         * shifted back onto the widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
         * @method _attachUIHandlesModal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
        _attachUIHandlesModal : function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
            if (this._uiHandlesModal || WidgetModal.STACK[0] !== this) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
                // Quit early if we have ui handles, or if we not at the top
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
                // of the global stack.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
            var bb          = this.get(BOUNDING_BOX),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
                maskNode    = this.get('maskNode'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
                focusOn     = this.get('focusOn'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
                focus       = Y.bind(this._focus, this),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
                uiHandles   = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
                i, len, o;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
            for (i = 0, len = focusOn.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
                o = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
                o.node = focusOn[i].node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
                o.ev = focusOn[i].eventName;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
                o.keyCode = focusOn[i].keyCode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
                //no keycode or node defined
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
                if (!o.node && !o.keyCode && o.ev) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
                    uiHandles.push(bb.on(o.ev, focus));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
                //node defined, no keycode (not a keypress)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
                else if (o.node && !o.keyCode && o.ev) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
                    uiHandles.push(o.node.on(o.ev, focus));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
                //node defined, keycode defined, event defined (its a key press)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
                else if (o.node && o.keyCode && o.ev) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
                    uiHandles.push(o.node.on(o.ev, focus, o.keyCode));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
                else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
            if ( ! supportsPosFixed) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
                uiHandles.push(Y.one('win').on('scroll', Y.bind(function(e){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
                    maskNode.setStyle('top', maskNode.get('docScrollY'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
                }, this)));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
            this._uiHandlesModal = uiHandles;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
         * Detaches all UI Listeners that were set in _attachUIHandlesModal from the widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
         * @method _detachUIHandlesModal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
        _detachUIHandlesModal : function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
            Y.each(this._uiHandlesModal, function(h){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
                h.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
            this._uiHandlesModal = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
         * Default function that is called when visibility is changed on the widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
         * @method _afterHostVisibleChangeModal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
         * @param {EventFacade} e The event facade of the change
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
        _afterHostVisibleChangeModal : function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
            this._uiSetHostVisibleModal(e.newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
         * Default function that is called when z-index is changed on the widget.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
         * @method _afterHostZIndexChangeModal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
         * @param {EventFacade} e The event facade of the change
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
        _afterHostZIndexChangeModal : function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
            this._uiSetHostZIndexModal(e.newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
         * Returns a boolean representing whether the current widget is in a "nested modality" state.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
         * This is done by checking the number of widgets currently on the stack.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
         * @method isNested
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
         * @public
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
        isNested: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
            var length = WidgetModal.STACK.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
            retval = (length > 1) ? true : false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
            return retval;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
         * Repositions the mask in the DOM for nested modality cases.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
         * @method _repositionMask
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
         * @param {Widget} nextElem The Y.Widget instance that will be visible in the stack once the current widget is closed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
        _repositionMask: function(nextElem) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
            var currentModal = this.get('modal'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
                nextModal    = nextElem.get('modal'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
                maskNode     = this.get('maskNode'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
                bb, bbParent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
            //if this is modal and host is not modal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
            if (currentModal && !nextModal) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
                //leave the mask where it is, since the host is not modal.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
                maskNode.remove();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
                this.fire(MaskHide);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
            //if the main widget is not modal but the host is modal, or both of them are modal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
            else if ((!currentModal && nextModal) || (currentModal && nextModal)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
                //then remove the mask off DOM, reposition it, and reinsert it into the DOM
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
                maskNode.remove();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
                this.fire(MaskHide);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
                bb = nextElem.get(BOUNDING_BOX);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
                bbParent = bb.get('parentNode') || Y.one('body');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
                bbParent.insert(maskNode, bbParent.get('firstChild'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
                this.fire(MaskShow);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
         * Resyncs the mask in the viewport for browsers that don't support fixed positioning
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
         * @method _resyncMask
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
         * @param {Widget} nextElem The Y.Widget instance that will be visible in the stack once the current widget is closed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
         * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
        _resyncMask: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
            var o       = e.currentTarget,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
                offsetX = o.get('docScrollX'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
                offsetY = o.get('docScrollY'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
                w       = o.get('innerWidth') || o.get('winWidth'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
                h       = o.get('innerHeight') || o.get('winHeight'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
                mask    = this.get('maskNode');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
            mask.setStyles({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
                "top": offsetY + "px",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
                "left": offsetX + "px",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
                "width": w + 'px',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
                "height": h + 'px'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
         * Default function called when focusOn Attribute is changed. Remove existing listeners and create new listeners.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
         * @method _afterFocusOnChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
        _afterFocusOnChange : function(e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
            this._detachUIHandlesModal();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
            if (this.get(VISIBLE)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
                this._attachUIHandlesModal();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
    Y.WidgetModality = WidgetModal;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
}, '@VERSION@', {"requires": ["base-build", "event-outside", "widget"], "skinnable": true});