mercury-rails 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +152 -0
  3. data/VERSION +1 -0
  4. data/app/assets/images/mercury/button.png +0 -0
  5. data/app/assets/images/mercury/clippy.png +0 -0
  6. data/app/assets/images/mercury/default-snippet.png +0 -0
  7. data/app/assets/images/mercury/loading-dark.gif +0 -0
  8. data/app/assets/images/mercury/loading-light.gif +0 -0
  9. data/app/assets/images/mercury/search-icon.png +0 -0
  10. data/app/assets/images/mercury/toolbar/editable/buttons.png +0 -0
  11. data/app/assets/images/mercury/toolbar/markupable/buttons.png +0 -0
  12. data/app/assets/images/mercury/toolbar/primary/_expander.png +0 -0
  13. data/app/assets/images/mercury/toolbar/primary/_pressed.png +0 -0
  14. data/app/assets/images/mercury/toolbar/primary/historypanel.png +0 -0
  15. data/app/assets/images/mercury/toolbar/primary/insertcharacter.png +0 -0
  16. data/app/assets/images/mercury/toolbar/primary/insertlink.png +0 -0
  17. data/app/assets/images/mercury/toolbar/primary/insertmedia.png +0 -0
  18. data/app/assets/images/mercury/toolbar/primary/inserttable.png +0 -0
  19. data/app/assets/images/mercury/toolbar/primary/inspectorpanel.png +0 -0
  20. data/app/assets/images/mercury/toolbar/primary/notespanel.png +0 -0
  21. data/app/assets/images/mercury/toolbar/primary/objectspanel.png +0 -0
  22. data/app/assets/images/mercury/toolbar/primary/preview.png +0 -0
  23. data/app/assets/images/mercury/toolbar/primary/redo.png +0 -0
  24. data/app/assets/images/mercury/toolbar/primary/save.png +0 -0
  25. data/app/assets/images/mercury/toolbar/primary/todospanel.png +0 -0
  26. data/app/assets/images/mercury/toolbar/primary/undo.png +0 -0
  27. data/app/assets/images/mercury/toolbar/snippetable/buttons.png +0 -0
  28. data/app/assets/javascripts/mercury.js +30 -0
  29. data/app/assets/javascripts/mercury/dialog.js.coffee +75 -0
  30. data/app/assets/javascripts/mercury/dialogs/backcolor.js.coffee +6 -0
  31. data/app/assets/javascripts/mercury/dialogs/forecolor.js.coffee +6 -0
  32. data/app/assets/javascripts/mercury/dialogs/formatblock.js.coffee +4 -0
  33. data/app/assets/javascripts/mercury/dialogs/objectspanel.js.coffee +10 -0
  34. data/app/assets/javascripts/mercury/dialogs/style.js.coffee +4 -0
  35. data/app/assets/javascripts/mercury/history_buffer.js.coffee +30 -0
  36. data/app/assets/javascripts/mercury/mercury.js.coffee +293 -0
  37. data/app/assets/javascripts/mercury/modal.js.coffee +177 -0
  38. data/app/assets/javascripts/mercury/modals/htmleditor.js.coffee +10 -0
  39. data/app/assets/javascripts/mercury/modals/insertcharacter.js.coffee +4 -0
  40. data/app/assets/javascripts/mercury/modals/insertlink.js.coffee +92 -0
  41. data/app/assets/javascripts/mercury/modals/insertmedia.js.coffee +72 -0
  42. data/app/assets/javascripts/mercury/modals/insertsnippet.js.coffee +11 -0
  43. data/app/assets/javascripts/mercury/modals/inserttable.js.coffee +56 -0
  44. data/app/assets/javascripts/mercury/native_extensions.js.coffee +47 -0
  45. data/app/assets/javascripts/mercury/page_editor.js.coffee +139 -0
  46. data/app/assets/javascripts/mercury/palette.js.coffee +29 -0
  47. data/app/assets/javascripts/mercury/panel.js.coffee +97 -0
  48. data/app/assets/javascripts/mercury/region.js.coffee +103 -0
  49. data/app/assets/javascripts/mercury/regions/editable.js.coffee +546 -0
  50. data/app/assets/javascripts/mercury/regions/markupable.js.coffee +380 -0
  51. data/app/assets/javascripts/mercury/regions/snippetable.js.coffee +127 -0
  52. data/app/assets/javascripts/mercury/select.js.coffee +40 -0
  53. data/app/assets/javascripts/mercury/snippet.js.coffee +92 -0
  54. data/app/assets/javascripts/mercury/snippet_toolbar.js.coffee +69 -0
  55. data/app/assets/javascripts/mercury/statusbar.js.coffee +25 -0
  56. data/app/assets/javascripts/mercury/table_editor.js.coffee +266 -0
  57. data/app/assets/javascripts/mercury/toolbar.button.js.coffee +152 -0
  58. data/app/assets/javascripts/mercury/toolbar.button_group.js.coffee +42 -0
  59. data/app/assets/javascripts/mercury/toolbar.expander.js.coffee +56 -0
  60. data/app/assets/javascripts/mercury/toolbar.js.coffee +72 -0
  61. data/app/assets/javascripts/mercury/tooltip.js.coffee +67 -0
  62. data/app/assets/javascripts/mercury/uploader.js.coffee +213 -0
  63. data/app/assets/javascripts/mercury/websocket.js.coffee +34 -0
  64. data/app/assets/stylesheets/mercury.css +31 -0
  65. data/app/assets/stylesheets/mercury/dialog.scss +178 -0
  66. data/app/assets/stylesheets/mercury/mercury.scss +119 -0
  67. data/app/assets/stylesheets/mercury/modal.scss +192 -0
  68. data/app/assets/stylesheets/mercury/statusbar.scss +23 -0
  69. data/app/assets/stylesheets/mercury/toolbar.scss +417 -0
  70. data/app/assets/stylesheets/mercury/tooltip.scss +26 -0
  71. data/app/assets/stylesheets/mercury/uploader.scss +109 -0
  72. data/app/controllers/images_controller.rb +19 -0
  73. data/app/controllers/mercury_controller.rb +20 -0
  74. data/app/models/image.rb +14 -0
  75. data/app/views/layouts/mercury.html.haml +12 -0
  76. data/app/views/mercury/modals/character.html.haml +252 -0
  77. data/app/views/mercury/modals/htmleditor.html.haml +8 -0
  78. data/app/views/mercury/modals/link.html.haml +31 -0
  79. data/app/views/mercury/modals/media.html.haml +33 -0
  80. data/app/views/mercury/modals/sanitizer.html.haml +4 -0
  81. data/app/views/mercury/modals/table.html.haml +49 -0
  82. data/app/views/mercury/palettes/backcolor.html.haml +79 -0
  83. data/app/views/mercury/palettes/forecolor.html.haml +79 -0
  84. data/app/views/mercury/panels/history.html.haml +0 -0
  85. data/app/views/mercury/panels/notes.html.haml +0 -0
  86. data/app/views/mercury/panels/snippets.html.haml +10 -0
  87. data/app/views/mercury/selects/formatblock.html.haml +10 -0
  88. data/app/views/mercury/selects/style.html.haml +4 -0
  89. data/app/views/mercury/snippets/example.html.haml +2 -0
  90. data/app/views/mercury/snippets/example_options.html.haml +16 -0
  91. data/config/engine.rb +6 -0
  92. data/config/routes.rb +15 -0
  93. data/db/migrate/20110526035601_create_images.rb +11 -0
  94. data/features/editing/basic.feature +11 -0
  95. data/features/step_definitions/debug_steps.rb +14 -0
  96. data/features/step_definitions/web_steps.rb +211 -0
  97. data/features/support/env.rb +46 -0
  98. data/features/support/paths.rb +35 -0
  99. data/features/support/selectors.rb +42 -0
  100. data/lib/mercury-rails.rb +4 -0
  101. data/log/.gitkeep +0 -0
  102. data/mercury-rails.gemspec +230 -0
  103. data/spec/javascripts/mercury/dialog_spec.js.coffee +258 -0
  104. data/spec/javascripts/mercury/history_buffer_spec.js.coffee +79 -0
  105. data/spec/javascripts/mercury/mercury_spec.js.coffee +52 -0
  106. data/spec/javascripts/mercury/native_extensions_spec.js.coffee +66 -0
  107. data/spec/javascripts/mercury/page_editor_spec.js.coffee +435 -0
  108. data/spec/javascripts/mercury/palette_spec.js.coffee +51 -0
  109. data/spec/javascripts/mercury/panel_spec.js.coffee +147 -0
  110. data/spec/javascripts/mercury/region_spec.js.coffee +261 -0
  111. data/spec/javascripts/mercury/regions/_editable_.js.coffee +0 -0
  112. data/spec/javascripts/mercury/regions/_markupable_.js.coffee +0 -0
  113. data/spec/javascripts/mercury/regions/snippetable_spec.js.coffee +368 -0
  114. data/spec/javascripts/mercury/select_spec.js.coffee +51 -0
  115. data/spec/javascripts/mercury/snippet_spec.js.coffee +246 -0
  116. data/spec/javascripts/mercury/snippet_toolbar_spec.js.coffee +186 -0
  117. data/spec/javascripts/mercury/statusbar_spec.js.coffee +78 -0
  118. data/spec/javascripts/mercury/table_editor_spec.js.coffee +192 -0
  119. data/spec/javascripts/mercury/toolbar.button_group_spec.js.coffee +92 -0
  120. data/spec/javascripts/mercury/toolbar.button_spec.js.coffee +341 -0
  121. data/spec/javascripts/mercury/toolbar.expander_spec.js.coffee +120 -0
  122. data/spec/javascripts/mercury/toolbar_spec.js.coffee +152 -0
  123. data/spec/javascripts/mercury/tooltip_spec.js.coffee +188 -0
  124. data/spec/javascripts/mercury/uploader_spec.js.coffee +512 -0
  125. data/spec/javascripts/responses/blank.html +1 -0
  126. data/spec/javascripts/spec_helper.js +513 -0
  127. data/spec/javascripts/templates/mercury/dialog.html +2 -0
  128. data/spec/javascripts/templates/mercury/page_editor.html +24 -0
  129. data/spec/javascripts/templates/mercury/palette.html +16 -0
  130. data/spec/javascripts/templates/mercury/panel.html +16 -0
  131. data/spec/javascripts/templates/mercury/region.html +2 -0
  132. data/spec/javascripts/templates/mercury/regions/snippetable.html +4 -0
  133. data/spec/javascripts/templates/mercury/select.html +16 -0
  134. data/spec/javascripts/templates/mercury/snippet.html +1 -0
  135. data/spec/javascripts/templates/mercury/snippet_toolbar.html +16 -0
  136. data/spec/javascripts/templates/mercury/statusbar.html +7 -0
  137. data/spec/javascripts/templates/mercury/table_editor.html +65 -0
  138. data/spec/javascripts/templates/mercury/toolbar.button.html +64 -0
  139. data/spec/javascripts/templates/mercury/toolbar.button_group.html +9 -0
  140. data/spec/javascripts/templates/mercury/toolbar.expander.html +18 -0
  141. data/spec/javascripts/templates/mercury/toolbar.html +10 -0
  142. data/spec/javascripts/templates/mercury/tooltip.html +12 -0
  143. data/spec/javascripts/templates/mercury/uploader.html +11 -0
  144. data/vendor/assets/javascripts/jquery-1.6.js +8865 -0
  145. data/vendor/assets/javascripts/jquery-ui-1.8.13.custom.min.js +249 -0
  146. data/vendor/assets/javascripts/jquery-ui-1.8.13.sortable.custom.js +1078 -0
  147. data/vendor/assets/javascripts/jquery.easing.js +173 -0
  148. data/vendor/assets/javascripts/jquery.json2.js +178 -0
  149. data/vendor/assets/javascripts/jquery.serialize_object.js +16 -0
  150. data/vendor/assets/javascripts/jquery.ujs.js +289 -0
  151. data/vendor/assets/javascripts/liquidmetal.js +88 -0
  152. data/vendor/assets/javascripts/showdown.js +1362 -0
  153. 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
+ };