src/cm/media/js/lib/yui/yui3-3.15.0/build/event-simulate/event-simulate.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('event-simulate', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
(function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
 * Simulate user interaction by generating native DOM events.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
 * @module event-simulate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
 * @requires event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
//shortcuts
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
var L   = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
    win = Y.config.win,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
    isFunction  = L.isFunction,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
    isString    = L.isString,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
    isBoolean   = L.isBoolean,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
    isObject    = L.isObject,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
    isNumber    = L.isNumber,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
    //mouse events supported
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
    mouseEvents = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
        click:      1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
        dblclick:   1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
        mouseover:  1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
        mouseout:   1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
        mousedown:  1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
        mouseup:    1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
        mousemove:  1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
        contextmenu:1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
    pointerEvents = (win && win.PointerEvent) ? {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
        pointerover:  1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
        pointerout:   1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
        pointerdown:  1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
        pointerup:    1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
        pointermove:  1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
    } : {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
        MSPointerOver:  1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
        MSPointerOut:   1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
        MSPointerDown:  1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
        MSPointerUp:    1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
        MSPointerMove:  1
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
    //key events supported
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    keyEvents   = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
        keydown:    1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
        keyup:      1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
        keypress:   1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
    //HTML events supported
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
    uiEvents  = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
        submit:     1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
        blur:       1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
        change:     1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
        focus:      1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
        resize:     1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
        scroll:     1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
        select:     1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
    //events that bubble by default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
    bubbleEvents = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
        scroll:     1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
        resize:     1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
        reset:      1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
        submit:     1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
        change:     1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
        select:     1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
        error:      1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
        abort:      1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
    //touch events supported
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
    touchEvents = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
        touchstart: 1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
        touchmove: 1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
        touchend: 1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
        touchcancel: 1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
    gestureEvents = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
        gesturestart: 1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
        gesturechange: 1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
        gestureend: 1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
//all key, mouse and touch events bubble
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
Y.mix(bubbleEvents, mouseEvents);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
Y.mix(bubbleEvents, keyEvents);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
Y.mix(bubbleEvents, touchEvents);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
/*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
 * Note: Intentionally not for YUIDoc generation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
 * Simulates a key event using the given event information to populate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
 * the generated event object. This method does browser-equalizing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
 * calculations to account for differences in the DOM and IE event models
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
 * as well as different browser quirks. Note: keydown causes Safari 2.x to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
 * crash.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
 * @method simulateKeyEvent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
 * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
 * @param {HTMLElement} target The target of the given event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
 * @param {String} type The type of event to fire. This can be any one of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
 *      the following: keyup, keydown, and keypress.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
 * @param {Boolean} [bubbles=true] Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
 *      bubbled up. DOM Level 3 specifies that all key events bubble by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
 *      default.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
 * @param {Boolean} [cancelable=true] Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
 *      canceled using preventDefault(). DOM Level 3 specifies that all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
 *      key events can be cancelled.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
 * @param {Window} [view=window] The view containing the target. This is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
 *      typically the window object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
 * @param {Boolean} [ctrlKey=false] Indicates if one of the CTRL keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
 *      is pressed while the event is firing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
 * @param {Boolean} [altKey=false] Indicates if one of the ALT keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
 *      is pressed while the event is firing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
 * @param {Boolean} [shiftKey=false] Indicates if one of the SHIFT keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
 *      is pressed while the event is firing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
 * @param {Boolean} [metaKey=false] Indicates if one of the META keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
 *      is pressed while the event is firing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
 * @param {Number} [keyCode=0] The code for the key that is in use.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
 * @param {Number} [charCode=0] The Unicode code for the character
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
 *      associated with the key being used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
function simulateKeyEvent(target /*:HTMLElement*/, type /*:String*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
                             bubbles /*:Boolean*/,  cancelable /*:Boolean*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
                             view /*:Window*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
                             ctrlKey /*:Boolean*/,    altKey /*:Boolean*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
                             shiftKey /*:Boolean*/,   metaKey /*:Boolean*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
                             keyCode /*:int*/,        charCode /*:int*/) /*:Void*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
{
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
    //check target
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
    if (!target){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
        Y.error("simulateKeyEvent(): Invalid target.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
    //check event type
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
    if (isString(type)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
        type = type.toLowerCase();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
        switch(type){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
            case "textevent": //DOM Level 3
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
                type = "keypress";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
            case "keyup":
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
            case "keydown":
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
            case "keypress":
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
            default:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
                Y.error("simulateKeyEvent(): Event type '" + type + "' not supported.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
        Y.error("simulateKeyEvent(): Event type must be a string.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
    //setup default values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
    if (!isBoolean(bubbles)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
        bubbles = true; //all key events bubble
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
    if (!isBoolean(cancelable)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
        cancelable = true; //all key events can be cancelled
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
    if (!isObject(view)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
        view = Y.config.win; //view is typically window
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
    if (!isBoolean(ctrlKey)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
        ctrlKey = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
    if (!isBoolean(altKey)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
        altKey = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
    if (!isBoolean(shiftKey)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
        shiftKey = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
    if (!isBoolean(metaKey)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
        metaKey = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
    if (!isNumber(keyCode)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
        keyCode = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
    if (!isNumber(charCode)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
        charCode = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
    //try to create a mouse event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
    var customEvent /*:MouseEvent*/ = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
    //check for DOM-compliant browsers first
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    if (isFunction(Y.config.doc.createEvent)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
        try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
            //try to create key event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
            customEvent = Y.config.doc.createEvent("KeyEvents");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
            /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
             * Interesting problem: Firefox implemented a non-standard
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
             * version of initKeyEvent() based on DOM Level 2 specs.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
             * Key event was removed from DOM Level 2 and re-introduced
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
             * in DOM Level 3 with a different interface. Firefox is the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
             * only browser with any implementation of Key Events, so for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
             * now, assume it's Firefox if the above line doesn't error.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
             */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
            // @TODO: Decipher between Firefox's implementation and a correct one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
            customEvent.initKeyEvent(type, bubbles, cancelable, view, ctrlKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
                altKey, shiftKey, metaKey, keyCode, charCode);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
        } catch (ex /*:Error*/){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
            /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
             * If it got here, that means key events aren't officially supported.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
             * Safari/WebKit is a real problem now. WebKit 522 won't let you
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
             * set keyCode, charCode, or other properties if you use a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
             * UIEvent, so we first must try to create a generic event. The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
             * fun part is that this will throw an error on Safari 2.x. The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
             * end result is that we need another try...catch statement just to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
             * deal with this mess.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
             */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
            try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
                //try to create generic event - will fail in Safari 2.x
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
                customEvent = Y.config.doc.createEvent("Events");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
            } catch (uierror /*:Error*/){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
                //the above failed, so create a UIEvent for Safari 2.x
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
                customEvent = Y.config.doc.createEvent("UIEvents");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
            } finally {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
                customEvent.initEvent(type, bubbles, cancelable);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
                //initialize
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
                customEvent.view = view;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
                customEvent.altKey = altKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
                customEvent.ctrlKey = ctrlKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
                customEvent.shiftKey = shiftKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
                customEvent.metaKey = metaKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
                customEvent.keyCode = keyCode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
                customEvent.charCode = charCode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
        //fire the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
        target.dispatchEvent(customEvent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
    } else if (isObject(Y.config.doc.createEventObject)){ //IE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
        //create an IE event object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
        customEvent = Y.config.doc.createEventObject();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
        //assign available properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
        customEvent.bubbles = bubbles;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
        customEvent.cancelable = cancelable;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
        customEvent.view = view;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
        customEvent.ctrlKey = ctrlKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
        customEvent.altKey = altKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
        customEvent.shiftKey = shiftKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
        customEvent.metaKey = metaKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
        /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
         * IE doesn't support charCode explicitly. CharCode should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
         * take precedence over any keyCode value for accurate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
         * representation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        customEvent.keyCode = (charCode > 0) ? charCode : keyCode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
        //fire the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
        target.fireEvent("on" + type, customEvent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
        Y.error("simulateKeyEvent(): No event simulation framework present.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
/*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
 * Note: Intentionally not for YUIDoc generation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
 * Simulates a mouse event using the given event information to populate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
 * the generated event object. This method does browser-equalizing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
 * calculations to account for differences in the DOM and IE event models
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
 * as well as different browser quirks.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
 * @method simulateMouseEvent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
 * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
 * @param {HTMLElement} target The target of the given event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
 * @param {String} type The type of event to fire. This can be any one of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
 *      the following: click, dblclick, mousedown, mouseup, mouseout,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
 *      mouseover, and mousemove.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
 * @param {Boolean} bubbles (Optional) Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
 *      bubbled up. DOM Level 2 specifies that all mouse events bubble by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
 *      default. The default is true.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
 * @param {Boolean} cancelable (Optional) Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
 *      canceled using preventDefault(). DOM Level 2 specifies that all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
 *      mouse events except mousemove can be cancelled. The default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
 *      is true for all events except mousemove, for which the default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
 *      is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
 * @param {Window} view (Optional) The view containing the target. This is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
 *      typically the window object. The default is window.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
 * @param {Number} detail (Optional) The number of times the mouse button has
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
 *      been used. The default value is 1.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
 * @param {Number} screenX (Optional) The x-coordinate on the screen at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
 * @param {Number} screenY (Optional) The y-coordinate on the screen at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
 * @param {Number} clientX (Optional) The x-coordinate on the client at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
 * @param {Number} clientY (Optional) The y-coordinate on the client at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
 * @param {Boolean} ctrlKey (Optional) Indicates if one of the CTRL keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
 * @param {Boolean} altKey (Optional) Indicates if one of the ALT keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
 * @param {Boolean} shiftKey (Optional) Indicates if one of the SHIFT keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
 * @param {Boolean} metaKey (Optional) Indicates if one of the META keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
 * @param {Number} button (Optional) The button being pressed while the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
 *      is executing. The value should be 0 for the primary mouse button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
 *      (typically the left button), 1 for the terciary mouse button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
 *      (typically the middle button), and 2 for the secondary mouse button
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
 *      (typically the right button). The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
 * @param {HTMLElement} relatedTarget (Optional) For mouseout events,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
 *      this is the element that the mouse has moved to. For mouseover
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
 *      events, this is the element that the mouse has moved from. This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
 *      argument is ignored for all other events. The default is null.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
function simulateMouseEvent(target /*:HTMLElement*/, type /*:String*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
                               bubbles /*:Boolean*/,  cancelable /*:Boolean*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
                               view /*:Window*/,        detail /*:int*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
                               screenX /*:int*/,        screenY /*:int*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
                               clientX /*:int*/,        clientY /*:int*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
                               ctrlKey /*:Boolean*/,    altKey /*:Boolean*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
                               shiftKey /*:Boolean*/,   metaKey /*:Boolean*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
                               button /*:int*/,         relatedTarget /*:HTMLElement*/) /*:Void*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
{
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
    //check target
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
    if (!target){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
        Y.error("simulateMouseEvent(): Invalid target.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
    if (isString(type)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
        //make sure it's a supported mouse event or an msPointerEvent.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
        if (!mouseEvents[type.toLowerCase()] && !pointerEvents[type]){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
            Y.error("simulateMouseEvent(): Event type '" + type + "' not supported.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
    else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
        Y.error("simulateMouseEvent(): Event type must be a string.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
    //setup default values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
    if (!isBoolean(bubbles)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
        bubbles = true; //all mouse events bubble
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
    if (!isBoolean(cancelable)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
        cancelable = (type !== "mousemove"); //mousemove is the only one that can't be cancelled
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
    if (!isObject(view)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
        view = Y.config.win; //view is typically window
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
    if (!isNumber(detail)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
        detail = 1;  //number of mouse clicks must be at least one
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
    if (!isNumber(screenX)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
        screenX = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
    if (!isNumber(screenY)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
        screenY = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
    if (!isNumber(clientX)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
        clientX = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
    if (!isNumber(clientY)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
        clientY = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
    if (!isBoolean(ctrlKey)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
        ctrlKey = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
    if (!isBoolean(altKey)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
        altKey = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
    if (!isBoolean(shiftKey)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
        shiftKey = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
    if (!isBoolean(metaKey)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
        metaKey = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
    if (!isNumber(button)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
        button = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
    relatedTarget = relatedTarget || null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
    //try to create a mouse event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
    var customEvent /*:MouseEvent*/ = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
    //check for DOM-compliant browsers first
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
    if (isFunction(Y.config.doc.createEvent)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
        customEvent = Y.config.doc.createEvent("MouseEvents");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
        //Safari 2.x (WebKit 418) still doesn't implement initMouseEvent()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
        if (customEvent.initMouseEvent){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
            customEvent.initMouseEvent(type, bubbles, cancelable, view, detail,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
                                 screenX, screenY, clientX, clientY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
                                 ctrlKey, altKey, shiftKey, metaKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
                                 button, relatedTarget);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
        } else { //Safari
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
            //the closest thing available in Safari 2.x is UIEvents
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
            customEvent = Y.config.doc.createEvent("UIEvents");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
            customEvent.initEvent(type, bubbles, cancelable);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
            customEvent.view = view;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
            customEvent.detail = detail;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
            customEvent.screenX = screenX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
            customEvent.screenY = screenY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
            customEvent.clientX = clientX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
            customEvent.clientY = clientY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
            customEvent.ctrlKey = ctrlKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
            customEvent.altKey = altKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
            customEvent.metaKey = metaKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
            customEvent.shiftKey = shiftKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
            customEvent.button = button;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
            customEvent.relatedTarget = relatedTarget;
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
        /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
         * Check to see if relatedTarget has been assigned. Firefox
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
         * versions less than 2.0 don't allow it to be assigned via
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
         * initMouseEvent() and the property is readonly after event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
         * creation, so in order to keep YAHOO.util.getRelatedTarget()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
         * working, assign to the IE proprietary toElement property
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
         * for mouseout event and fromElement property for mouseover
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
         * event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
        if (relatedTarget && !customEvent.relatedTarget){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
            if (type === "mouseout"){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
                customEvent.toElement = relatedTarget;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
            } else if (type === "mouseover"){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
                customEvent.fromElement = relatedTarget;
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
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
        //fire the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
        target.dispatchEvent(customEvent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
    } else if (isObject(Y.config.doc.createEventObject)){ //IE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
        //create an IE event object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
        customEvent = Y.config.doc.createEventObject();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
        //assign available properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
        customEvent.bubbles = bubbles;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
        customEvent.cancelable = cancelable;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
        customEvent.view = view;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
        customEvent.detail = detail;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
        customEvent.screenX = screenX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
        customEvent.screenY = screenY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
        customEvent.clientX = clientX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
        customEvent.clientY = clientY;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
        customEvent.ctrlKey = ctrlKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
        customEvent.altKey = altKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
        customEvent.metaKey = metaKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
        customEvent.shiftKey = shiftKey;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
        //fix button property for IE's wacky implementation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
        switch(button){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
            case 0:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
                customEvent.button = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
            case 1:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
                customEvent.button = 4;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
            case 2:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
                //leave as is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
            default:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
                customEvent.button = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
        /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
         * Have to use relatedTarget because IE won't allow assignment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
         * to toElement or fromElement on generic events. This keeps
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
         * YAHOO.util.customEvent.getRelatedTarget() functional.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
        customEvent.relatedTarget = relatedTarget;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
        //fire the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
        target.fireEvent("on" + type, customEvent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
        Y.error("simulateMouseEvent(): No event simulation framework present.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
    }
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
 * Note: Intentionally not for YUIDoc generation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
 * Simulates a UI event using the given event information to populate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
 * the generated event object. This method does browser-equalizing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
 * calculations to account for differences in the DOM and IE event models
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
 * as well as different browser quirks.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
 * @method simulateHTMLEvent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
 * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
 * @param {HTMLElement} target The target of the given event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
 * @param {String} type The type of event to fire. This can be any one of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
 *      the following: click, dblclick, mousedown, mouseup, mouseout,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
 *      mouseover, and mousemove.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
 * @param {Boolean} bubbles (Optional) Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
 *      bubbled up. DOM Level 2 specifies that all mouse events bubble by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
 *      default. The default is true.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
 * @param {Boolean} cancelable (Optional) Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
 *      canceled using preventDefault(). DOM Level 2 specifies that all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
 *      mouse events except mousemove can be cancelled. The default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
 *      is true for all events except mousemove, for which the default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
 *      is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
 * @param {Window} view (Optional) The view containing the target. This is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
 *      typically the window object. The default is window.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
 * @param {Number} detail (Optional) The number of times the mouse button has
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
 *      been used. The default value is 1.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
function simulateUIEvent(target /*:HTMLElement*/, type /*:String*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
                               bubbles /*:Boolean*/,  cancelable /*:Boolean*/,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
                               view /*:Window*/,        detail /*:int*/) /*:Void*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
{
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
    //check target
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
    if (!target){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
        Y.error("simulateUIEvent(): Invalid target.");
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
    //check event type
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
    if (isString(type)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
        type = type.toLowerCase();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
        //make sure it's a supported mouse event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
        if (!uiEvents[type]){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
            Y.error("simulateUIEvent(): Event type '" + type + "' not supported.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
        Y.error("simulateUIEvent(): Event type must be a string.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
    //try to create a mouse event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
    var customEvent = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
    //setup default values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
    if (!isBoolean(bubbles)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
        bubbles = (type in bubbleEvents);  //not all events bubble
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
    if (!isBoolean(cancelable)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
        cancelable = (type === "submit"); //submit is the only one that can be cancelled
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
    if (!isObject(view)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
        view = Y.config.win; //view is typically window
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
    if (!isNumber(detail)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
        detail = 1;  //usually not used but defaulted to this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
    //check for DOM-compliant browsers first
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
    if (isFunction(Y.config.doc.createEvent)){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
        //just a generic UI Event object is needed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
        customEvent = Y.config.doc.createEvent("UIEvents");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
        customEvent.initUIEvent(type, bubbles, cancelable, view, detail);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
        //fire the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
        target.dispatchEvent(customEvent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
    } else if (isObject(Y.config.doc.createEventObject)){ //IE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
        //create an IE event object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
        customEvent = Y.config.doc.createEventObject();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
        //assign available properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
        customEvent.bubbles = bubbles;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
        customEvent.cancelable = cancelable;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
        customEvent.view = view;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
        customEvent.detail = detail;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
        //fire the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
        target.fireEvent("on" + type, customEvent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
        Y.error("simulateUIEvent(): No event simulation framework present.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
/*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
 * (iOS only) This is for creating native DOM gesture events which only iOS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
 * v2.0+ is supporting.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
 * @method simulateGestureEvent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
 * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
 * @param {HTMLElement} target The target of the given event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
 * @param {String} type The type of event to fire. This can be any one of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
 *      the following: touchstart, touchmove, touchend, touchcancel.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
 * @param {Boolean} bubbles (Optional) Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
 *      bubbled up. DOM Level 2 specifies that all mouse events bubble by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
 *      default. The default is true.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
 * @param {Boolean} cancelable (Optional) Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
 *      canceled using preventDefault(). DOM Level 2 specifies that all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
 *      touch events except touchcancel can be cancelled. The default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
 *      is true for all events except touchcancel, for which the default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
 *      is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
 * @param {Window} view (Optional) The view containing the target. This is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
 *      typically the window object. The default is window.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
 * @param {Number} detail (Optional) Specifies some detail information about
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
 *      the event depending on the type of event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
 * @param {Number} screenX (Optional) The x-coordinate on the screen at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
 * @param {Number} screenY (Optional) The y-coordinate on the screen at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
 * @param {Number} clientX (Optional) The x-coordinate on the client at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
 * @param {Number} clientY (Optional) The y-coordinate on the client at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
 * @param {Boolean} ctrlKey (Optional) Indicates if one of the CTRL keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
 * @param {Boolean} altKey (Optional) Indicates if one of the ALT keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
 * @param {Boolean} shiftKey (Optional) Indicates if one of the SHIFT keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
 * @param {Boolean} metaKey (Optional) Indicates if one of the META keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
 * @param {Number} scale (iOS v2+ only) The distance between two fingers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
 *      since the start of an event as a multiplier of the initial distance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
 *      The default value is 1.0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
 * @param {Number} rotation (iOS v2+ only) The delta rotation since the start
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
 *      of an event, in degrees, where clockwise is positive and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
 *      counter-clockwise is negative. The default value is 0.0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
function simulateGestureEvent(target, type,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
    bubbles,            // boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
    cancelable,         // boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
    view,               // DOMWindow
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
    detail,             // long
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
    screenX, screenY,   // long
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
    clientX, clientY,   // long
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
    ctrlKey, altKey, shiftKey, metaKey, // boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
    scale,              // float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
    rotation            // float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
    var customEvent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
    if(!Y.UA.ios || Y.UA.ios<2.0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
        Y.error("simulateGestureEvent(): Native gesture DOM eventframe is not available in this platform.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
    // check taget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
    if (!target){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
        Y.error("simulateGestureEvent(): Invalid target.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
    //check event type
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
    if (Y.Lang.isString(type)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
        type = type.toLowerCase();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
        //make sure it's a supported touch event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
        if (!gestureEvents[type]){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
            Y.error("simulateTouchEvent(): Event type '" + type + "' not supported.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
        Y.error("simulateGestureEvent(): Event type must be a string.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
    // setup default values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
    if (!Y.Lang.isBoolean(bubbles)) { bubbles = true; } // bubble by default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
    if (!Y.Lang.isBoolean(cancelable)) { cancelable = true; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
    if (!Y.Lang.isObject(view))     { view = Y.config.win; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
    if (!Y.Lang.isNumber(detail))   { detail = 2; }     // usually not used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
    if (!Y.Lang.isNumber(screenX))  { screenX = 0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
    if (!Y.Lang.isNumber(screenY))  { screenY = 0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
    if (!Y.Lang.isNumber(clientX))  { clientX = 0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
    if (!Y.Lang.isNumber(clientY))  { clientY = 0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
    if (!Y.Lang.isBoolean(ctrlKey)) { ctrlKey = false; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
    if (!Y.Lang.isBoolean(altKey))  { altKey = false; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
    if (!Y.Lang.isBoolean(shiftKey)){ shiftKey = false; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
    if (!Y.Lang.isBoolean(metaKey)) { metaKey = false; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   688
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   689
    if (!Y.Lang.isNumber(scale)){ scale = 1.0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   690
    if (!Y.Lang.isNumber(rotation)){ rotation = 0.0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
    customEvent = Y.config.doc.createEvent("GestureEvent");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
    customEvent.initGestureEvent(type, bubbles, cancelable, view, detail,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
        screenX, screenY, clientX, clientY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
        ctrlKey, altKey, shiftKey, metaKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
        target, scale, rotation);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
    target.dispatchEvent(customEvent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
/*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
 * @method simulateTouchEvent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
 * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
 * @param {HTMLElement} target The target of the given event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   707
 * @param {String} type The type of event to fire. This can be any one of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   708
 *      the following: touchstart, touchmove, touchend, touchcancel.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   709
 * @param {Boolean} bubbles (Optional) Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   710
 *      bubbled up. DOM Level 2 specifies that all mouse events bubble by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   711
 *      default. The default is true.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   712
 * @param {Boolean} cancelable (Optional) Indicates if the event can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   713
 *      canceled using preventDefault(). DOM Level 2 specifies that all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   714
 *      touch events except touchcancel can be cancelled. The default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   715
 *      is true for all events except touchcancel, for which the default
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   716
 *      is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   717
 * @param {Window} view (Optional) The view containing the target. This is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   718
 *      typically the window object. The default is window.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   719
 * @param {Number} detail (Optional) Specifies some detail information about
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   720
 *      the event depending on the type of event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   721
 * @param {Number} screenX (Optional) The x-coordinate on the screen at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   722
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   723
 * @param {Number} screenY (Optional) The y-coordinate on the screen at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   724
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   725
 * @param {Number} clientX (Optional) The x-coordinate on the client at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   726
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   727
 * @param {Number} clientY (Optional) The y-coordinate on the client at which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   728
 *      point the event occured. The default is 0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   729
 * @param {Boolean} ctrlKey (Optional) Indicates if one of the CTRL keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   730
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   731
 * @param {Boolean} altKey (Optional) Indicates if one of the ALT keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   732
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   733
 * @param {Boolean} shiftKey (Optional) Indicates if one of the SHIFT keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   734
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   735
 * @param {Boolean} metaKey (Optional) Indicates if one of the META keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   736
 *      is pressed while the event is firing. The default is false.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   737
 * @param {TouchList} touches A collection of Touch objects representing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   738
 *      all touches associated with this event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   739
 * @param {TouchList} targetTouches A collection of Touch objects
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   740
 *      representing all touches associated with this target.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   741
 * @param {TouchList} changedTouches A collection of Touch objects
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   742
 *      representing all touches that changed in this event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   743
 * @param {Number} scale (iOS v2+ only) The distance between two fingers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   744
 *      since the start of an event as a multiplier of the initial distance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   745
 *      The default value is 1.0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   746
 * @param {Number} rotation (iOS v2+ only) The delta rotation since the start
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   747
 *      of an event, in degrees, where clockwise is positive and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   748
 *      counter-clockwise is negative. The default value is 0.0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   749
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   750
function simulateTouchEvent(target, type,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   751
    bubbles,            // boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   752
    cancelable,         // boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   753
    view,               // DOMWindow
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   754
    detail,             // long
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   755
    screenX, screenY,   // long
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   756
    clientX, clientY,   // long
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   757
    ctrlKey, altKey, shiftKey, metaKey, // boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   758
    touches,            // TouchList
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   759
    targetTouches,      // TouchList
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   760
    changedTouches,     // TouchList
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   761
    scale,              // float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   762
    rotation            // float
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   763
) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   764
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   765
    var customEvent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   766
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   767
    // check taget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   768
    if (!target){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   769
        Y.error("simulateTouchEvent(): Invalid target.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   770
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   771
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   772
    //check event type
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   773
    if (Y.Lang.isString(type)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   774
        type = type.toLowerCase();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   775
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   776
        //make sure it's a supported touch event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   777
        if (!touchEvents[type]){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   778
            Y.error("simulateTouchEvent(): Event type '" + type + "' not supported.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   779
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   780
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   781
        Y.error("simulateTouchEvent(): Event type must be a string.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   782
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   783
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   784
    // note that the caller is responsible to pass appropriate touch objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   785
    // check touch objects
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   786
    // Android(even 4.0) doesn't define TouchList yet
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   787
    /*if(type === 'touchstart' || type === 'touchmove') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   788
        if(!touches instanceof TouchList) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   789
            Y.error('simulateTouchEvent(): Invalid touches. It must be a TouchList');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   790
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   791
            if(touches.length === 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   792
                Y.error('simulateTouchEvent(): No touch object found.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   793
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   794
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   795
    } else if(type === 'touchend') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   796
        if(!changedTouches instanceof TouchList) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   797
            Y.error('simulateTouchEvent(): Invalid touches. It must be a TouchList');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   798
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   799
            if(changedTouches.length === 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   800
                Y.error('simulateTouchEvent(): No touch object found.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   801
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   802
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   803
    }*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   804
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   805
    if(type === 'touchstart' || type === 'touchmove') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   806
        if(touches.length === 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   807
            Y.error('simulateTouchEvent(): No touch object in touches');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   808
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   809
    } else if(type === 'touchend') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   810
        if(changedTouches.length === 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   811
            Y.error('simulateTouchEvent(): No touch object in changedTouches');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   812
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   813
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   814
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   815
    // setup default values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   816
    if (!Y.Lang.isBoolean(bubbles)) { bubbles = true; } // bubble by default.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   817
    if (!Y.Lang.isBoolean(cancelable)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   818
        cancelable = (type !== "touchcancel"); // touchcancel is not cancelled
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   819
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   820
    if (!Y.Lang.isObject(view))     { view = Y.config.win; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   821
    if (!Y.Lang.isNumber(detail))   { detail = 1; } // usually not used. defaulted to # of touch objects.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   822
    if (!Y.Lang.isNumber(screenX))  { screenX = 0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   823
    if (!Y.Lang.isNumber(screenY))  { screenY = 0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   824
    if (!Y.Lang.isNumber(clientX))  { clientX = 0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   825
    if (!Y.Lang.isNumber(clientY))  { clientY = 0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   826
    if (!Y.Lang.isBoolean(ctrlKey)) { ctrlKey = false; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   827
    if (!Y.Lang.isBoolean(altKey))  { altKey = false; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   828
    if (!Y.Lang.isBoolean(shiftKey)){ shiftKey = false; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   829
    if (!Y.Lang.isBoolean(metaKey)) { metaKey = false; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   830
    if (!Y.Lang.isNumber(scale))    { scale = 1.0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   831
    if (!Y.Lang.isNumber(rotation)) { rotation = 0.0; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   832
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   833
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   834
    //check for DOM-compliant browsers first
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   835
    if (Y.Lang.isFunction(Y.config.doc.createEvent)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   836
        if (Y.UA.android) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   837
            /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   838
                * Couldn't find android start version that supports touch event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   839
                * Assumed supported(btw APIs broken till icecream sandwitch)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   840
                * from the beginning.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   841
            */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   842
            if(Y.UA.android < 4.0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   843
                /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   844
                    * Touch APIs are broken in androids older than 4.0. We will use
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   845
                    * simulated touch apis for these versions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   846
                    * App developer still can listen for touch events. This events
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   847
                    * will be dispatched with touch event types.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   848
                    *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   849
                    * (Note) Used target for the relatedTarget. Need to verify if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   850
                    * it has a side effect.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   851
                */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   852
                customEvent = Y.config.doc.createEvent("MouseEvents");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   853
                customEvent.initMouseEvent(type, bubbles, cancelable, view, detail,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   854
                    screenX, screenY, clientX, clientY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   855
                    ctrlKey, altKey, shiftKey, metaKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   856
                    0, target);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   857
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   858
                customEvent.touches = touches;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   859
                customEvent.targetTouches = targetTouches;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   860
                customEvent.changedTouches = changedTouches;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   861
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   862
                customEvent = Y.config.doc.createEvent("TouchEvent");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   863
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   864
                // Andoroid isn't compliant W3C initTouchEvent method signature.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   865
                customEvent.initTouchEvent(touches, targetTouches, changedTouches,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   866
                    type, view,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   867
                    screenX, screenY, clientX, clientY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   868
                    ctrlKey, altKey, shiftKey, metaKey);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   869
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   870
        } else if (Y.UA.ios) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   871
            if(Y.UA.ios >= 2.0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   872
                customEvent = Y.config.doc.createEvent("TouchEvent");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   873
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   874
                // Available iOS 2.0 and later
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   875
                customEvent.initTouchEvent(type, bubbles, cancelable, view, detail,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   876
                    screenX, screenY, clientX, clientY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   877
                    ctrlKey, altKey, shiftKey, metaKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   878
                    touches, targetTouches, changedTouches,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   879
                    scale, rotation);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   880
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   881
                Y.error('simulateTouchEvent(): No touch event simulation framework present for iOS, '+Y.UA.ios+'.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   882
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   883
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   884
            Y.error('simulateTouchEvent(): Not supported agent yet, '+Y.UA.userAgent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   885
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   886
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   887
        //fire the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   888
        target.dispatchEvent(customEvent);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   889
    //} else if (Y.Lang.isObject(doc.createEventObject)){ // Windows Mobile/IE, support later
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   890
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   891
        Y.error('simulateTouchEvent(): No event simulation framework present.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   892
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   893
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   894
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   895
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   896
 * Simulates the event or gesture with the given name on a target.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   897
 * @param {HTMLElement} target The DOM element that's the target of the event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   898
 * @param {String} type The type of event or name of the supported gesture to simulate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   899
 *      (i.e., "click", "doubletap", "flick").
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   900
 * @param {Object} options (Optional) Extra options to copy onto the event object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   901
 *      For gestures, options are used to refine the gesture behavior.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   902
 * @for Event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   903
 * @method simulate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   904
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   905
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   906
Y.Event.simulate = function(target, type, options){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   907
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   908
    options = options || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   909
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   910
    if (mouseEvents[type] || pointerEvents[type]){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   911
        simulateMouseEvent(target, type, options.bubbles,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   912
            options.cancelable, options.view, options.detail, options.screenX,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   913
            options.screenY, options.clientX, options.clientY, options.ctrlKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   914
            options.altKey, options.shiftKey, options.metaKey, options.button,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   915
            options.relatedTarget);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   916
    } else if (keyEvents[type]){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   917
        simulateKeyEvent(target, type, options.bubbles,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   918
            options.cancelable, options.view, options.ctrlKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   919
            options.altKey, options.shiftKey, options.metaKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   920
            options.keyCode, options.charCode);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   921
    } else if (uiEvents[type]){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   922
        simulateUIEvent(target, type, options.bubbles,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   923
            options.cancelable, options.view, options.detail);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   924
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   925
    // touch low-level event simulation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   926
    } else if (touchEvents[type]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   927
        if((Y.config.win && ("ontouchstart" in Y.config.win)) && !(Y.UA.phantomjs) && !(Y.UA.chrome && Y.UA.chrome < 6)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   928
            simulateTouchEvent(target, type,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   929
                options.bubbles, options.cancelable, options.view, options.detail,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   930
                options.screenX, options.screenY, options.clientX, options.clientY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   931
                options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   932
                options.touches, options.targetTouches, options.changedTouches,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   933
                options.scale, options.rotation);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   934
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   935
            Y.error("simulate(): Event '" + type + "' can't be simulated. Use gesture-simulate module instead.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   936
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   937
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   938
    // ios gesture low-level event simulation (iOS v2+ only)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   939
    } else if(Y.UA.ios && Y.UA.ios >= 2.0 && gestureEvents[type]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   940
        simulateGestureEvent(target, type,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   941
            options.bubbles, options.cancelable, options.view, options.detail,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   942
            options.screenX, options.screenY, options.clientX, options.clientY,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   943
            options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   944
            options.scale, options.rotation);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   945
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   946
    // anything else
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   947
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   948
        Y.error("simulate(): Event '" + type + "' can't be simulated.");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   949
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   950
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   951
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   952
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   953
})();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   954
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   955
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   956
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   957
}, '@VERSION@', {"requires": ["event-base"]});