mercury-rails 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README.rdoc +152 -0
- data/VERSION +1 -0
- data/app/assets/images/mercury/button.png +0 -0
- data/app/assets/images/mercury/clippy.png +0 -0
- data/app/assets/images/mercury/default-snippet.png +0 -0
- data/app/assets/images/mercury/loading-dark.gif +0 -0
- data/app/assets/images/mercury/loading-light.gif +0 -0
- data/app/assets/images/mercury/search-icon.png +0 -0
- data/app/assets/images/mercury/toolbar/editable/buttons.png +0 -0
- data/app/assets/images/mercury/toolbar/markupable/buttons.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/_expander.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/_pressed.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/historypanel.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/insertcharacter.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/insertlink.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/insertmedia.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/inserttable.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/inspectorpanel.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/notespanel.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/objectspanel.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/preview.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/redo.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/save.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/todospanel.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/undo.png +0 -0
- data/app/assets/images/mercury/toolbar/snippetable/buttons.png +0 -0
- data/app/assets/javascripts/mercury.js +30 -0
- data/app/assets/javascripts/mercury/dialog.js.coffee +75 -0
- data/app/assets/javascripts/mercury/dialogs/backcolor.js.coffee +6 -0
- data/app/assets/javascripts/mercury/dialogs/forecolor.js.coffee +6 -0
- data/app/assets/javascripts/mercury/dialogs/formatblock.js.coffee +4 -0
- data/app/assets/javascripts/mercury/dialogs/objectspanel.js.coffee +10 -0
- data/app/assets/javascripts/mercury/dialogs/style.js.coffee +4 -0
- data/app/assets/javascripts/mercury/history_buffer.js.coffee +30 -0
- data/app/assets/javascripts/mercury/mercury.js.coffee +293 -0
- data/app/assets/javascripts/mercury/modal.js.coffee +177 -0
- data/app/assets/javascripts/mercury/modals/htmleditor.js.coffee +10 -0
- data/app/assets/javascripts/mercury/modals/insertcharacter.js.coffee +4 -0
- data/app/assets/javascripts/mercury/modals/insertlink.js.coffee +92 -0
- data/app/assets/javascripts/mercury/modals/insertmedia.js.coffee +72 -0
- data/app/assets/javascripts/mercury/modals/insertsnippet.js.coffee +11 -0
- data/app/assets/javascripts/mercury/modals/inserttable.js.coffee +56 -0
- data/app/assets/javascripts/mercury/native_extensions.js.coffee +47 -0
- data/app/assets/javascripts/mercury/page_editor.js.coffee +139 -0
- data/app/assets/javascripts/mercury/palette.js.coffee +29 -0
- data/app/assets/javascripts/mercury/panel.js.coffee +97 -0
- data/app/assets/javascripts/mercury/region.js.coffee +103 -0
- data/app/assets/javascripts/mercury/regions/editable.js.coffee +546 -0
- data/app/assets/javascripts/mercury/regions/markupable.js.coffee +380 -0
- data/app/assets/javascripts/mercury/regions/snippetable.js.coffee +127 -0
- data/app/assets/javascripts/mercury/select.js.coffee +40 -0
- data/app/assets/javascripts/mercury/snippet.js.coffee +92 -0
- data/app/assets/javascripts/mercury/snippet_toolbar.js.coffee +69 -0
- data/app/assets/javascripts/mercury/statusbar.js.coffee +25 -0
- data/app/assets/javascripts/mercury/table_editor.js.coffee +266 -0
- data/app/assets/javascripts/mercury/toolbar.button.js.coffee +152 -0
- data/app/assets/javascripts/mercury/toolbar.button_group.js.coffee +42 -0
- data/app/assets/javascripts/mercury/toolbar.expander.js.coffee +56 -0
- data/app/assets/javascripts/mercury/toolbar.js.coffee +72 -0
- data/app/assets/javascripts/mercury/tooltip.js.coffee +67 -0
- data/app/assets/javascripts/mercury/uploader.js.coffee +213 -0
- data/app/assets/javascripts/mercury/websocket.js.coffee +34 -0
- data/app/assets/stylesheets/mercury.css +31 -0
- data/app/assets/stylesheets/mercury/dialog.scss +178 -0
- data/app/assets/stylesheets/mercury/mercury.scss +119 -0
- data/app/assets/stylesheets/mercury/modal.scss +192 -0
- data/app/assets/stylesheets/mercury/statusbar.scss +23 -0
- data/app/assets/stylesheets/mercury/toolbar.scss +417 -0
- data/app/assets/stylesheets/mercury/tooltip.scss +26 -0
- data/app/assets/stylesheets/mercury/uploader.scss +109 -0
- data/app/controllers/images_controller.rb +19 -0
- data/app/controllers/mercury_controller.rb +20 -0
- data/app/models/image.rb +14 -0
- data/app/views/layouts/mercury.html.haml +12 -0
- data/app/views/mercury/modals/character.html.haml +252 -0
- data/app/views/mercury/modals/htmleditor.html.haml +8 -0
- data/app/views/mercury/modals/link.html.haml +31 -0
- data/app/views/mercury/modals/media.html.haml +33 -0
- data/app/views/mercury/modals/sanitizer.html.haml +4 -0
- data/app/views/mercury/modals/table.html.haml +49 -0
- data/app/views/mercury/palettes/backcolor.html.haml +79 -0
- data/app/views/mercury/palettes/forecolor.html.haml +79 -0
- data/app/views/mercury/panels/history.html.haml +0 -0
- data/app/views/mercury/panels/notes.html.haml +0 -0
- data/app/views/mercury/panels/snippets.html.haml +10 -0
- data/app/views/mercury/selects/formatblock.html.haml +10 -0
- data/app/views/mercury/selects/style.html.haml +4 -0
- data/app/views/mercury/snippets/example.html.haml +2 -0
- data/app/views/mercury/snippets/example_options.html.haml +16 -0
- data/config/engine.rb +6 -0
- data/config/routes.rb +15 -0
- data/db/migrate/20110526035601_create_images.rb +11 -0
- data/features/editing/basic.feature +11 -0
- data/features/step_definitions/debug_steps.rb +14 -0
- data/features/step_definitions/web_steps.rb +211 -0
- data/features/support/env.rb +46 -0
- data/features/support/paths.rb +35 -0
- data/features/support/selectors.rb +42 -0
- data/lib/mercury-rails.rb +4 -0
- data/log/.gitkeep +0 -0
- data/mercury-rails.gemspec +230 -0
- data/spec/javascripts/mercury/dialog_spec.js.coffee +258 -0
- data/spec/javascripts/mercury/history_buffer_spec.js.coffee +79 -0
- data/spec/javascripts/mercury/mercury_spec.js.coffee +52 -0
- data/spec/javascripts/mercury/native_extensions_spec.js.coffee +66 -0
- data/spec/javascripts/mercury/page_editor_spec.js.coffee +435 -0
- data/spec/javascripts/mercury/palette_spec.js.coffee +51 -0
- data/spec/javascripts/mercury/panel_spec.js.coffee +147 -0
- data/spec/javascripts/mercury/region_spec.js.coffee +261 -0
- data/spec/javascripts/mercury/regions/_editable_.js.coffee +0 -0
- data/spec/javascripts/mercury/regions/_markupable_.js.coffee +0 -0
- data/spec/javascripts/mercury/regions/snippetable_spec.js.coffee +368 -0
- data/spec/javascripts/mercury/select_spec.js.coffee +51 -0
- data/spec/javascripts/mercury/snippet_spec.js.coffee +246 -0
- data/spec/javascripts/mercury/snippet_toolbar_spec.js.coffee +186 -0
- data/spec/javascripts/mercury/statusbar_spec.js.coffee +78 -0
- data/spec/javascripts/mercury/table_editor_spec.js.coffee +192 -0
- data/spec/javascripts/mercury/toolbar.button_group_spec.js.coffee +92 -0
- data/spec/javascripts/mercury/toolbar.button_spec.js.coffee +341 -0
- data/spec/javascripts/mercury/toolbar.expander_spec.js.coffee +120 -0
- data/spec/javascripts/mercury/toolbar_spec.js.coffee +152 -0
- data/spec/javascripts/mercury/tooltip_spec.js.coffee +188 -0
- data/spec/javascripts/mercury/uploader_spec.js.coffee +512 -0
- data/spec/javascripts/responses/blank.html +1 -0
- data/spec/javascripts/spec_helper.js +513 -0
- data/spec/javascripts/templates/mercury/dialog.html +2 -0
- data/spec/javascripts/templates/mercury/page_editor.html +24 -0
- data/spec/javascripts/templates/mercury/palette.html +16 -0
- data/spec/javascripts/templates/mercury/panel.html +16 -0
- data/spec/javascripts/templates/mercury/region.html +2 -0
- data/spec/javascripts/templates/mercury/regions/snippetable.html +4 -0
- data/spec/javascripts/templates/mercury/select.html +16 -0
- data/spec/javascripts/templates/mercury/snippet.html +1 -0
- data/spec/javascripts/templates/mercury/snippet_toolbar.html +16 -0
- data/spec/javascripts/templates/mercury/statusbar.html +7 -0
- data/spec/javascripts/templates/mercury/table_editor.html +65 -0
- data/spec/javascripts/templates/mercury/toolbar.button.html +64 -0
- data/spec/javascripts/templates/mercury/toolbar.button_group.html +9 -0
- data/spec/javascripts/templates/mercury/toolbar.expander.html +18 -0
- data/spec/javascripts/templates/mercury/toolbar.html +10 -0
- data/spec/javascripts/templates/mercury/tooltip.html +12 -0
- data/spec/javascripts/templates/mercury/uploader.html +11 -0
- data/vendor/assets/javascripts/jquery-1.6.js +8865 -0
- data/vendor/assets/javascripts/jquery-ui-1.8.13.custom.min.js +249 -0
- data/vendor/assets/javascripts/jquery-ui-1.8.13.sortable.custom.js +1078 -0
- data/vendor/assets/javascripts/jquery.easing.js +173 -0
- data/vendor/assets/javascripts/jquery.json2.js +178 -0
- data/vendor/assets/javascripts/jquery.serialize_object.js +16 -0
- data/vendor/assets/javascripts/jquery.ujs.js +289 -0
- data/vendor/assets/javascripts/liquidmetal.js +88 -0
- data/vendor/assets/javascripts/showdown.js +1362 -0
- metadata +364 -0
@@ -0,0 +1 @@
|
|
1
|
+
blank
|
@@ -0,0 +1,513 @@
|
|
1
|
+
require('/assets/vendor.js');
|
2
|
+
|
3
|
+
jasmine.simulate = {
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Simulates a key event using the given event information to populate
|
7
|
+
* the generated event object. This method does browser-equalizing
|
8
|
+
* calculations to account for differences in the DOM and IE event models
|
9
|
+
* as well as different browser quirks. Note: keydown causes Safari 2.x to
|
10
|
+
* crash.
|
11
|
+
*
|
12
|
+
* @param {HTMLElement} target The target of the given event.
|
13
|
+
* @param {String} type The type of event to fire. This can be any one of
|
14
|
+
* the following: keyup, keydown, and keypress.
|
15
|
+
* @param {Boolean} bubbles (Optional) Indicates if the event can be
|
16
|
+
* bubbled up. DOM Level 3 specifies that all key events bubble by
|
17
|
+
* default. The default is true.
|
18
|
+
* @param {Boolean} cancelable (Optional) Indicates if the event can be
|
19
|
+
* canceled using preventDefault(). DOM Level 3 specifies that all
|
20
|
+
* key events can be cancelled. The default
|
21
|
+
* is true.
|
22
|
+
* @param {Window} view (Optional) The view containing the target. This is
|
23
|
+
* typically the window object. The default is window.
|
24
|
+
* @param {Boolean} ctrlKey (Optional) Indicates if one of the CTRL keys
|
25
|
+
* is pressed while the event is firing. The default is false.
|
26
|
+
* @param {Boolean} altKey (Optional) Indicates if one of the ALT keys
|
27
|
+
* is pressed while the event is firing. The default is false.
|
28
|
+
* @param {Boolean} shiftKey (Optional) Indicates if one of the SHIFT keys
|
29
|
+
* is pressed while the event is firing. The default is false.
|
30
|
+
* @param {Boolean} metaKey (Optional) Indicates if one of the META keys
|
31
|
+
* is pressed while the event is firing. The default is false.
|
32
|
+
* @param {int} keyCode (Optional) The code for the key that is in use.
|
33
|
+
* The default is 0.
|
34
|
+
* @param {int} charCode (Optional) The Unicode code for the character
|
35
|
+
* associated with the key being used. The default is 0.
|
36
|
+
* @static
|
37
|
+
*/
|
38
|
+
keyEvent: function (target, type, bubbles, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, keyCode, charCode) {
|
39
|
+
if (!target) throw('simulateKeyEvent(): Invalid target.');
|
40
|
+
if (typeof(type) != 'string') throw('simulateKeyEvent(): Event type must be a string.');
|
41
|
+
|
42
|
+
type = type.toLowerCase();
|
43
|
+
switch(type) {
|
44
|
+
case 'keyup':
|
45
|
+
case 'keydown':
|
46
|
+
case 'keypress':
|
47
|
+
break;
|
48
|
+
case 'textevent': // DOM Level 3
|
49
|
+
type = 'keypress';
|
50
|
+
break;
|
51
|
+
default: throw("simulateKeyEvent(): Event type '" + type + "' not supported.");
|
52
|
+
}
|
53
|
+
|
54
|
+
// setup default values
|
55
|
+
if (typeof(bubbles) == 'undefined') bubbles = true; // all key events bubble
|
56
|
+
if (typeof(cancelable) == 'undefined') cancelable = true; // all key events can be cancelled
|
57
|
+
if (typeof(view) == 'undefined') view = window;
|
58
|
+
if (typeof(ctrlKey) == 'undefined') ctrlKey = false;
|
59
|
+
if (typeof(altKey) == 'undefined') altKey = false;
|
60
|
+
if (typeof(shiftKey) == 'undefined') shiftKey = false;
|
61
|
+
if (typeof(metaKey) == 'undefined') metaKey = false;
|
62
|
+
if (typeof(keyCode) == 'undefined') keyCode = 0;
|
63
|
+
if (typeof(charCode) == 'undefined') charCode = 0;
|
64
|
+
|
65
|
+
// try to create a mouse event
|
66
|
+
var customEvent = null;
|
67
|
+
|
68
|
+
// check for DOM-compliant browsers first
|
69
|
+
if (typeof(document.createEvent) == 'function') {
|
70
|
+
try {
|
71
|
+
customEvent = document.createEvent('KeyEvents');
|
72
|
+
// Interesting problem: Firefox implemented a non-standard version
|
73
|
+
// of initKeyEvent() based on DOM Level 2 specs. Key event was
|
74
|
+
// removed from DOM Level 2 and re-introduced in DOM Level 3 with a
|
75
|
+
// different interface. Firefox is the only browser with any
|
76
|
+
// implementation of Key Events, so for now, assume it's Firefox if
|
77
|
+
// the above line doesn't error.
|
78
|
+
// TODO: Decipher between Firefox's implementation and a correct one.
|
79
|
+
customEvent.initKeyEvent(type, bubbles, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, keyCode, charCode);
|
80
|
+
} catch (ex) {
|
81
|
+
// If we got here, that means key events aren't officially supported.
|
82
|
+
// Safari/WebKit is a real problem now. WebKit 522 won't let you set
|
83
|
+
// keyCode, charCode, or other properties if you use a UIEvent, so we
|
84
|
+
// first must try to create a generic event. The fun part is that
|
85
|
+
// this will throw an error on Safari 2.x. The end result is that we
|
86
|
+
// need another try...catch statement just to deal with this mess.
|
87
|
+
try {
|
88
|
+
// try to create generic event - will fail in Safari 2.x
|
89
|
+
customEvent = document.createEvent('Events');
|
90
|
+
} catch (uierror) {
|
91
|
+
// the above failed, so create a UIEvent for Safari 2.x
|
92
|
+
customEvent = document.createEvent('UIEvents');
|
93
|
+
} finally {
|
94
|
+
customEvent.initEvent(type, bubbles, cancelable);
|
95
|
+
customEvent.view = view;
|
96
|
+
customEvent.altKey = altKey;
|
97
|
+
customEvent.ctrlKey = ctrlKey;
|
98
|
+
customEvent.shiftKey = shiftKey;
|
99
|
+
customEvent.metaKey = metaKey;
|
100
|
+
customEvent.keyCode = keyCode;
|
101
|
+
customEvent.charCode = charCode;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
// fire the event
|
105
|
+
target.dispatchEvent(customEvent);
|
106
|
+
} else if (typeof(document.createEventObject) == 'object') {
|
107
|
+
//create an IE event object
|
108
|
+
customEvent = document.createEventObject();
|
109
|
+
customEvent.bubbles = bubbles;
|
110
|
+
customEvent.cancelable = cancelable;
|
111
|
+
customEvent.view = view;
|
112
|
+
customEvent.ctrlKey = ctrlKey;
|
113
|
+
customEvent.altKey = altKey;
|
114
|
+
customEvent.shiftKey = shiftKey;
|
115
|
+
customEvent.metaKey = metaKey;
|
116
|
+
|
117
|
+
// IE doesn't support charCode explicitly. CharCode should take
|
118
|
+
// precedence over any keyCode value for accurate representation.
|
119
|
+
customEvent.keyCode = (charCode > 0) ? charCode : keyCode;
|
120
|
+
|
121
|
+
// fire the event
|
122
|
+
target.fireEvent('on' + type, customEvent);
|
123
|
+
} else {
|
124
|
+
throw('simulateKeyEvent(): No event simulation framework present.');
|
125
|
+
}
|
126
|
+
},
|
127
|
+
|
128
|
+
/**
|
129
|
+
* Simulates a mouse event using the given event information to populate
|
130
|
+
* the generated event object. This method does browser-equalizing
|
131
|
+
* calculations to account for differences in the DOM and IE event models
|
132
|
+
* as well as different browser quirks.
|
133
|
+
*
|
134
|
+
* @param {HTMLElement} target The target of the given event.
|
135
|
+
* @param {String} type The type of event to fire. This can be any one of
|
136
|
+
* the following: click, dblclick, mousedown, mouseup, mouseout,
|
137
|
+
* mouseover, and mousemove.
|
138
|
+
* @param {Boolean} bubbles (Optional) Indicates if the event can be
|
139
|
+
* bubbled up. DOM Level 2 specifies that all mouse events bubble by
|
140
|
+
* default. The default is true.
|
141
|
+
* @param {Boolean} cancelable (Optional) Indicates if the event can be
|
142
|
+
* canceled using preventDefault(). DOM Level 2 specifies that all
|
143
|
+
* mouse events except mousemove can be cancelled. The default
|
144
|
+
* is true for all events except mousemove, for which the default
|
145
|
+
* is false.
|
146
|
+
* @param {Window} view (Optional) The view containing the target. This is
|
147
|
+
* typically the window object. The default is window.
|
148
|
+
* @param {int} detail (Optional) The number of times the mouse button has
|
149
|
+
* been used. The default value is 1.
|
150
|
+
* @param {int} screenX (Optional) The x-coordinate on the screen at which
|
151
|
+
* point the event occured. The default is 0.
|
152
|
+
* @param {int} screenY (Optional) The y-coordinate on the screen at which
|
153
|
+
* point the event occured. The default is 0.
|
154
|
+
* @param {int} clientX (Optional) The x-coordinate on the client at which
|
155
|
+
* point the event occured. The default is 0.
|
156
|
+
* @param {int} clientY (Optional) The y-coordinate on the client at which
|
157
|
+
* point the event occured. The default is 0.
|
158
|
+
* @param {Boolean} ctrlKey (Optional) Indicates if one of the CTRL keys
|
159
|
+
* is pressed while the event is firing. The default is false.
|
160
|
+
* @param {Boolean} altKey (Optional) Indicates if one of the ALT keys
|
161
|
+
* is pressed while the event is firing. The default is false.
|
162
|
+
* @param {Boolean} shiftKey (Optional) Indicates if one of the SHIFT keys
|
163
|
+
* is pressed while the event is firing. The default is false.
|
164
|
+
* @param {Boolean} metaKey (Optional) Indicates if one of the META keys
|
165
|
+
* is pressed while the event is firing. The default is false.
|
166
|
+
* @param {int} button (Optional) The button being pressed while the event
|
167
|
+
* is executing. The value should be 0 for the primary mouse button
|
168
|
+
* (typically the left button), 1 for the terciary mouse button
|
169
|
+
* (typically the middle button), and 2 for the secondary mouse button
|
170
|
+
* (typically the right button). The default is 0.
|
171
|
+
* @param {HTMLElement} relatedTarget (Optional) For mouseout events,
|
172
|
+
* this is the element that the mouse has moved to. For mouseover
|
173
|
+
* events, this is the element that the mouse has moved from. This
|
174
|
+
* argument is ignored for all other events. The default is null.
|
175
|
+
* @static
|
176
|
+
*/
|
177
|
+
mouseEvent: function(target, type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
|
178
|
+
if (!target) throw('simulateMouseEvent(): Invalid target.');
|
179
|
+
if (typeof(type) != 'string') throw('simulateMouseEvent(): Event type must be a string.');
|
180
|
+
|
181
|
+
type = type.toLowerCase();
|
182
|
+
switch(type){
|
183
|
+
case 'mouseover':
|
184
|
+
case 'mouseout':
|
185
|
+
case 'mousedown':
|
186
|
+
case 'mouseup':
|
187
|
+
case 'click':
|
188
|
+
case 'dblclick':
|
189
|
+
case 'mousemove':
|
190
|
+
break;
|
191
|
+
default: throw("simulateMouseEvent(): Event type '" + type + "' not supported.");
|
192
|
+
}
|
193
|
+
|
194
|
+
//setup default values
|
195
|
+
if (typeof(bubbles) == 'undefined') bubbles = true; // all mouse events bubble
|
196
|
+
if (typeof(cancelable) == 'undefined') cancelable = (type != "mousemove"); // mousemove is the only one that can't be cancelled
|
197
|
+
if (typeof(view) == 'undefined') view = window; // view is typically window
|
198
|
+
if (typeof(detail) == 'undefined') detail = 1; // number of mouse clicks must be at least one
|
199
|
+
if (typeof(screenX) == 'undefined') screenX = 0;
|
200
|
+
if (typeof(screenY) == 'undefined') screenY = 0;
|
201
|
+
if (typeof(clientX) == 'undefined') clientX = 0;
|
202
|
+
if (typeof(clientY) == 'undefined') clientY = 0;
|
203
|
+
if (typeof(ctrlKey) == 'undefined') ctrlKey = false;
|
204
|
+
if (typeof(altKey) == 'undefined') altKey = false;
|
205
|
+
if (typeof(shiftKey) == 'undefined') shiftKey = false;
|
206
|
+
if (typeof(metaKey) == 'undefined') metaKey = false;
|
207
|
+
if (typeof(button) == 'undefined') button = 0;
|
208
|
+
|
209
|
+
// try to create a mouse event
|
210
|
+
var customEvent = null;
|
211
|
+
|
212
|
+
// check for DOM-compliant browsers first
|
213
|
+
if (typeof(document.createEvent) == 'function') {
|
214
|
+
customEvent = document.createEvent("MouseEvents");
|
215
|
+
|
216
|
+
// Safari 2.x (WebKit 418) still doesn't implement initMouseEvent()
|
217
|
+
if (customEvent.initMouseEvent) {
|
218
|
+
customEvent.initMouseEvent(type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
|
219
|
+
} else {
|
220
|
+
// the closest thing available in Safari 2.x is UIEvents
|
221
|
+
customEvent = document.createEvent("UIEvents");
|
222
|
+
customEvent.initEvent(type, bubbles, cancelable);
|
223
|
+
customEvent.view = view;
|
224
|
+
customEvent.detail = detail;
|
225
|
+
customEvent.screenX = screenX;
|
226
|
+
customEvent.screenY = screenY;
|
227
|
+
customEvent.clientX = clientX;
|
228
|
+
customEvent.clientY = clientY;
|
229
|
+
customEvent.ctrlKey = ctrlKey;
|
230
|
+
customEvent.altKey = altKey;
|
231
|
+
customEvent.metaKey = metaKey;
|
232
|
+
customEvent.shiftKey = shiftKey;
|
233
|
+
customEvent.button = button;
|
234
|
+
customEvent.relatedTarget = relatedTarget;
|
235
|
+
}
|
236
|
+
|
237
|
+
// Check to see if relatedTarget has been assigned. Firefox versions
|
238
|
+
// less than 2.0 don't allow it to be assigned via initMouseEvent()
|
239
|
+
// and the property is readonly after event creation, so in order to
|
240
|
+
// keep YAHOO.util.getRelatedTarget() working, assign to the IE
|
241
|
+
// proprietary toElement property for mouseout event and fromElement
|
242
|
+
// property for mouseover event.
|
243
|
+
if (relatedTarget && !customEvent.relatedTarget) {
|
244
|
+
if (type == "mouseout") {
|
245
|
+
customEvent.toElement = relatedTarget;
|
246
|
+
} else if (type == "mouseover") {
|
247
|
+
customEvent.fromElement = relatedTarget;
|
248
|
+
}
|
249
|
+
}
|
250
|
+
|
251
|
+
//fire the event
|
252
|
+
target.dispatchEvent(customEvent);
|
253
|
+
} else if (typeof(document.createEventObject) == 'object') {
|
254
|
+
//create an IE event object
|
255
|
+
customEvent = document.createEventObject();
|
256
|
+
customEvent.bubbles = bubbles;
|
257
|
+
customEvent.cancelable = cancelable;
|
258
|
+
customEvent.view = view;
|
259
|
+
customEvent.detail = detail;
|
260
|
+
customEvent.screenX = screenX;
|
261
|
+
customEvent.screenY = screenY;
|
262
|
+
customEvent.clientX = clientX;
|
263
|
+
customEvent.clientY = clientY;
|
264
|
+
customEvent.ctrlKey = ctrlKey;
|
265
|
+
customEvent.altKey = altKey;
|
266
|
+
customEvent.metaKey = metaKey;
|
267
|
+
customEvent.shiftKey = shiftKey;
|
268
|
+
//fix button property for IE's wacky implementation
|
269
|
+
switch(button) {
|
270
|
+
case 0: customEvent.button = 1; break;
|
271
|
+
case 1: customEvent.button = 4; break;
|
272
|
+
case 2: break; // leave as is
|
273
|
+
default: customEvent.button = 0;
|
274
|
+
}
|
275
|
+
// Have to use relatedTarget because IE won't allow assignment to
|
276
|
+
// toElement or fromElement on generic events. This keeps
|
277
|
+
// YAHOO.util.customEvent.getRelatedTarget() functional.
|
278
|
+
customEvent.relatedTarget = relatedTarget;
|
279
|
+
|
280
|
+
//fire the event
|
281
|
+
target.fireEvent("on" + type, customEvent);
|
282
|
+
} else {
|
283
|
+
throw('simulateMouseEvent(): No event simulation framework present.');
|
284
|
+
}
|
285
|
+
},
|
286
|
+
|
287
|
+
//--------------------------------------------------------------------------
|
288
|
+
// Mouse events
|
289
|
+
//--------------------------------------------------------------------------
|
290
|
+
|
291
|
+
/**
|
292
|
+
* Simulates a mouse event on a particular element.
|
293
|
+
*
|
294
|
+
* @param {HTMLElement} target The element to click on.
|
295
|
+
* @param {String} type The type of event to fire. This can be any one of
|
296
|
+
* the following: click, dblclick, mousedown, mouseup, mouseout,
|
297
|
+
* mouseover, and mousemove.
|
298
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
299
|
+
* @static
|
300
|
+
*/
|
301
|
+
fireMouseEvent: function(type, target, options) {
|
302
|
+
options = options || {};
|
303
|
+
this.mouseEvent(target, type, options.bubbles,
|
304
|
+
options.cancelable, options.view, options.detail, options.screenX,
|
305
|
+
options.screenY, options.clientX, options.clientY, options.ctrlKey,
|
306
|
+
options.altKey, options.shiftKey, options.metaKey, options.button,
|
307
|
+
options.relatedTarget);
|
308
|
+
},
|
309
|
+
|
310
|
+
/**
|
311
|
+
* Simulates a click on a particular element.
|
312
|
+
*
|
313
|
+
* @param {HTMLElement} target The element to click on.
|
314
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
315
|
+
* @static
|
316
|
+
*/
|
317
|
+
click: function(target, options) {
|
318
|
+
try {
|
319
|
+
this.fireMouseEvent('click', target, options);
|
320
|
+
} catch(e) {
|
321
|
+
alert(e);
|
322
|
+
}
|
323
|
+
},
|
324
|
+
|
325
|
+
/**
|
326
|
+
* Simulates a double click on a particular element.
|
327
|
+
*
|
328
|
+
* @param {HTMLElement} target The element to double click on.
|
329
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
330
|
+
* @static
|
331
|
+
*/
|
332
|
+
dblclick: function(target, options) {
|
333
|
+
this.fireMouseEvent('dblclick', target, options);
|
334
|
+
},
|
335
|
+
|
336
|
+
/**
|
337
|
+
* Simulates a mousedown on a particular element.
|
338
|
+
*
|
339
|
+
* @param {HTMLElement} target The element to act on.
|
340
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
341
|
+
* @static
|
342
|
+
*/
|
343
|
+
mousedown: function(target, options) {
|
344
|
+
this.fireMouseEvent('mousedown', target, options);
|
345
|
+
},
|
346
|
+
|
347
|
+
/**
|
348
|
+
* Simulates a mousemove on a particular element.
|
349
|
+
*
|
350
|
+
* @param {HTMLElement} target The element to act on.
|
351
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
352
|
+
* @static
|
353
|
+
*/
|
354
|
+
mousemove: function(target, options) {
|
355
|
+
this.fireMouseEvent('mousemove', target, options);
|
356
|
+
},
|
357
|
+
|
358
|
+
/**
|
359
|
+
* Simulates a mouseout event on a particular element. Use 'relatedTarget'
|
360
|
+
* on the options object to specify where the mouse moved to.
|
361
|
+
*
|
362
|
+
* Quirks: Firefox less than 2.0 doesn't set relatedTarget properly, so
|
363
|
+
* toElement is assigned in its place. IE doesn't allow toElement to be
|
364
|
+
* be assigned, so relatedTarget is assigned in its place. Both of these
|
365
|
+
* concessions allow YAHOO.util.Event.getRelatedTarget() to work correctly
|
366
|
+
* in both browsers.
|
367
|
+
*
|
368
|
+
* @param {HTMLElement} target The element to act on.
|
369
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
370
|
+
* @static
|
371
|
+
*/
|
372
|
+
mouseout: function(target, options) {
|
373
|
+
this.fireMouseEvent('mouseout', target, options);
|
374
|
+
},
|
375
|
+
|
376
|
+
/**
|
377
|
+
* Simulates a mouseover event on a particular element. Use 'relatedTarget'
|
378
|
+
* on the options object to specify where the mouse moved from.
|
379
|
+
*
|
380
|
+
* Quirks: Firefox less than 2.0 doesn't set relatedTarget properly, so
|
381
|
+
* fromElement is assigned in its place. IE doesn't allow fromElement to be
|
382
|
+
* be assigned, so relatedTarget is assigned in its place. Both of these
|
383
|
+
* concessions allow YAHOO.util.Event.getRelatedTarget() to work correctly
|
384
|
+
* in both browsers.
|
385
|
+
*
|
386
|
+
* @param {HTMLElement} target The element to act on.
|
387
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
388
|
+
* @static
|
389
|
+
*/
|
390
|
+
mouseover: function(target, options) {
|
391
|
+
this.fireMouseEvent('mouseover', target, options);
|
392
|
+
},
|
393
|
+
|
394
|
+
/**
|
395
|
+
* Simulates a mouseup on a particular element.
|
396
|
+
*
|
397
|
+
* @param {HTMLElement} target The element to act on.
|
398
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
399
|
+
* @static
|
400
|
+
*/
|
401
|
+
mouseup: function(target, options) {
|
402
|
+
this.fireMouseEvent('mouseup', target, options);
|
403
|
+
},
|
404
|
+
|
405
|
+
//--------------------------------------------------------------------------
|
406
|
+
// Key events
|
407
|
+
//--------------------------------------------------------------------------
|
408
|
+
|
409
|
+
/**
|
410
|
+
* Fires an event that normally would be fired by the keyboard (keyup,
|
411
|
+
* keydown, keypress). Make sure to specify either keyCode or charCode as
|
412
|
+
* an option.
|
413
|
+
*
|
414
|
+
* @param {String} type The type of event ("keyup", "keydown" or "keypress").
|
415
|
+
* @param {HTMLElement} target The target of the event.
|
416
|
+
* @param {Object} options Options for the event. Either keyCode or charCode are required.
|
417
|
+
* @static
|
418
|
+
*/
|
419
|
+
fireKeyEvent: function(type, target, options) {
|
420
|
+
options = options || {};
|
421
|
+
this.keyEvent(target, type, options.bubbles,
|
422
|
+
options.cancelable, options.view, options.ctrlKey,
|
423
|
+
options.altKey, options.shiftKey, options.metaKey,
|
424
|
+
options.keyCode, options.charCode);
|
425
|
+
},
|
426
|
+
|
427
|
+
/**
|
428
|
+
* Simulates a keydown event on a particular element.
|
429
|
+
*
|
430
|
+
* @param {HTMLElement} target The element to act on.
|
431
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
432
|
+
* @static
|
433
|
+
*/
|
434
|
+
keydown: function(target, options) {
|
435
|
+
this.fireKeyEvent('keydown', target, options);
|
436
|
+
},
|
437
|
+
|
438
|
+
/**
|
439
|
+
* Simulates a keypress on a particular element.
|
440
|
+
*
|
441
|
+
* @param {HTMLElement} target The element to act on.
|
442
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
443
|
+
* @static
|
444
|
+
*/
|
445
|
+
keypress: function(target, options) {
|
446
|
+
this.fireKeyEvent('keypress', target, options);
|
447
|
+
},
|
448
|
+
|
449
|
+
/**
|
450
|
+
* Simulates a keyup event on a particular element.
|
451
|
+
*
|
452
|
+
* @param {HTMLElement} target The element to act on.
|
453
|
+
* @param {Object} options Additional event options (use DOM standard names).
|
454
|
+
* @static
|
455
|
+
*/
|
456
|
+
keyup: function(target, options) {
|
457
|
+
this.fireKeyEvent('keyup', target, options);
|
458
|
+
},
|
459
|
+
|
460
|
+
//--------------------------------------------------------------------------
|
461
|
+
// Other events
|
462
|
+
//--------------------------------------------------------------------------
|
463
|
+
|
464
|
+
/**
|
465
|
+
* Emulates a selection.. This doesn't simulate moving the mouse to make a
|
466
|
+
* selection, or using the arrow keys with shift, but it does create a
|
467
|
+
* selection that contains whatever target element you pass to it.
|
468
|
+
*
|
469
|
+
* @param {HTMLElement} target The element to select.
|
470
|
+
* @static
|
471
|
+
*/
|
472
|
+
selection: function(target, contentWindow) {
|
473
|
+
contentWindow = contentWindow || window;
|
474
|
+
var selection = contentWindow.getSelection();
|
475
|
+
var range = contentWindow.document.createRange();
|
476
|
+
range.selectNode(target);
|
477
|
+
selection.removeAllRanges();
|
478
|
+
selection.addRange(range);
|
479
|
+
return selection;
|
480
|
+
},
|
481
|
+
|
482
|
+
/**
|
483
|
+
* Emulates pressing the tab button.
|
484
|
+
*
|
485
|
+
* @param {HTMLElement} target The element to press tab in.
|
486
|
+
* @static
|
487
|
+
*/
|
488
|
+
tab: function(target) {
|
489
|
+
this.keydown(target, {keyCode: 9});
|
490
|
+
},
|
491
|
+
|
492
|
+
/**
|
493
|
+
* Executes a focus event
|
494
|
+
* -- not simulated, but it seems like the right place to put it.
|
495
|
+
*
|
496
|
+
* @param {HTMLElement} target The element to act on.
|
497
|
+
* @static
|
498
|
+
*/
|
499
|
+
focus: function(target) {
|
500
|
+
target.focus();
|
501
|
+
},
|
502
|
+
|
503
|
+
/**
|
504
|
+
* Executes a focus event
|
505
|
+
* -- not simulated, but it seems like the right place to put it.
|
506
|
+
*
|
507
|
+
* @param {HTMLElement} target The element to act on.
|
508
|
+
* @static
|
509
|
+
*/
|
510
|
+
blur: function(target) {
|
511
|
+
target.blur();
|
512
|
+
}
|
513
|
+
};
|