mercury-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ };