diamonds 0.1.5

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 (180) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +36 -0
  3. data/lib/diamonds.rb +74 -0
  4. data/lib/diamonds/Gemfile +28 -0
  5. data/lib/diamonds/README.md +254 -0
  6. data/lib/diamonds/Rakefile +5 -0
  7. data/lib/diamonds/apps/application.rb +15 -0
  8. data/lib/diamonds/apps/library.rb +321 -0
  9. data/lib/diamonds/apps/user_app.rb +5 -0
  10. data/lib/diamonds/config.ru +98 -0
  11. data/lib/diamonds/db/mysiteDB Back.sqlite3 +0 -0
  12. data/lib/diamonds/db/mysiteDB.sqlite3 +0 -0
  13. data/lib/diamonds/gems/auto_launch_browser.rb +22 -0
  14. data/lib/diamonds/gems/io.rb +146 -0
  15. data/lib/diamonds/gems/ruby_to_js.rb +173 -0
  16. data/lib/diamonds/gems/server_utils.rb +96 -0
  17. data/lib/diamonds/lib/opal-browser.rb +1 -0
  18. data/lib/diamonds/lib/opal/browser.rb +4 -0
  19. data/lib/diamonds/opal-browser.gemspec +21 -0
  20. data/lib/diamonds/opal/browser.rb +11 -0
  21. data/lib/diamonds/opal/browser/animation_frame.rb +111 -0
  22. data/lib/diamonds/opal/browser/canvas.rb +321 -0
  23. data/lib/diamonds/opal/browser/canvas/data.rb +63 -0
  24. data/lib/diamonds/opal/browser/canvas/gradient.rb +27 -0
  25. data/lib/diamonds/opal/browser/canvas/style.rb +113 -0
  26. data/lib/diamonds/opal/browser/canvas/text.rb +45 -0
  27. data/lib/diamonds/opal/browser/console.rb +103 -0
  28. data/lib/diamonds/opal/browser/cookies.rb +133 -0
  29. data/lib/diamonds/opal/browser/css.rb +24 -0
  30. data/lib/diamonds/opal/browser/css/declaration.rb +83 -0
  31. data/lib/diamonds/opal/browser/css/rule.rb +48 -0
  32. data/lib/diamonds/opal/browser/css/rule/style.rb +16 -0
  33. data/lib/diamonds/opal/browser/css/style_sheet.rb +83 -0
  34. data/lib/diamonds/opal/browser/css/unit.rb +188 -0
  35. data/lib/diamonds/opal/browser/database/sql.rb +194 -0
  36. data/lib/diamonds/opal/browser/delay.rb +78 -0
  37. data/lib/diamonds/opal/browser/dom.rb +84 -0
  38. data/lib/diamonds/opal/browser/dom/attribute.rb +26 -0
  39. data/lib/diamonds/opal/browser/dom/builder.rb +88 -0
  40. data/lib/diamonds/opal/browser/dom/cdata.rb +9 -0
  41. data/lib/diamonds/opal/browser/dom/character_data.rb +73 -0
  42. data/lib/diamonds/opal/browser/dom/comment.rb +9 -0
  43. data/lib/diamonds/opal/browser/dom/document.rb +149 -0
  44. data/lib/diamonds/opal/browser/dom/document_fragment.rb +7 -0
  45. data/lib/diamonds/opal/browser/dom/element.rb +474 -0
  46. data/lib/diamonds/opal/browser/dom/element/attributes.rb +87 -0
  47. data/lib/diamonds/opal/browser/dom/element/data.rb +67 -0
  48. data/lib/diamonds/opal/browser/dom/element/image.rb +23 -0
  49. data/lib/diamonds/opal/browser/dom/element/input.rb +28 -0
  50. data/lib/diamonds/opal/browser/dom/element/offset.rb +89 -0
  51. data/lib/diamonds/opal/browser/dom/element/position.rb +46 -0
  52. data/lib/diamonds/opal/browser/dom/element/scroll.rb +136 -0
  53. data/lib/diamonds/opal/browser/dom/element/select.rb +36 -0
  54. data/lib/diamonds/opal/browser/dom/element/size.rb +34 -0
  55. data/lib/diamonds/opal/browser/dom/element/template.rb +9 -0
  56. data/lib/diamonds/opal/browser/dom/element/textarea.rb +24 -0
  57. data/lib/diamonds/opal/browser/dom/mutation_observer.rb +178 -0
  58. data/lib/diamonds/opal/browser/dom/node.rb +464 -0
  59. data/lib/diamonds/opal/browser/dom/node_set.rb +110 -0
  60. data/lib/diamonds/opal/browser/dom/text.rb +36 -0
  61. data/lib/diamonds/opal/browser/effects.rb +50 -0
  62. data/lib/diamonds/opal/browser/event.rb +253 -0
  63. data/lib/diamonds/opal/browser/event/animation.rb +38 -0
  64. data/lib/diamonds/opal/browser/event/audio_processing.rb +33 -0
  65. data/lib/diamonds/opal/browser/event/base.rb +430 -0
  66. data/lib/diamonds/opal/browser/event/before_unload.rb +15 -0
  67. data/lib/diamonds/opal/browser/event/clipboard.rb +28 -0
  68. data/lib/diamonds/opal/browser/event/close.rb +47 -0
  69. data/lib/diamonds/opal/browser/event/composition.rb +50 -0
  70. data/lib/diamonds/opal/browser/event/custom.rb +65 -0
  71. data/lib/diamonds/opal/browser/event/device_light.rb +23 -0
  72. data/lib/diamonds/opal/browser/event/device_motion.rb +51 -0
  73. data/lib/diamonds/opal/browser/event/device_orientation.rb +48 -0
  74. data/lib/diamonds/opal/browser/event/device_proximity.rb +33 -0
  75. data/lib/diamonds/opal/browser/event/drag.rb +119 -0
  76. data/lib/diamonds/opal/browser/event/focus.rb +39 -0
  77. data/lib/diamonds/opal/browser/event/gamepad.rb +60 -0
  78. data/lib/diamonds/opal/browser/event/hash_change.rb +28 -0
  79. data/lib/diamonds/opal/browser/event/keyboard.rb +115 -0
  80. data/lib/diamonds/opal/browser/event/message.rb +70 -0
  81. data/lib/diamonds/opal/browser/event/mouse.rb +254 -0
  82. data/lib/diamonds/opal/browser/event/page_transition.rb +23 -0
  83. data/lib/diamonds/opal/browser/event/pop_state.rb +33 -0
  84. data/lib/diamonds/opal/browser/event/progress.rb +43 -0
  85. data/lib/diamonds/opal/browser/event/sensor.rb +15 -0
  86. data/lib/diamonds/opal/browser/event/storage.rb +43 -0
  87. data/lib/diamonds/opal/browser/event/touch.rb +60 -0
  88. data/lib/diamonds/opal/browser/event/ui.rb +38 -0
  89. data/lib/diamonds/opal/browser/event/wheel.rb +49 -0
  90. data/lib/diamonds/opal/browser/event_source.rb +70 -0
  91. data/lib/diamonds/opal/browser/history.rb +90 -0
  92. data/lib/diamonds/opal/browser/http.rb +169 -0
  93. data/lib/diamonds/opal/browser/http/binary.rb +58 -0
  94. data/lib/diamonds/opal/browser/http/headers.rb +109 -0
  95. data/lib/diamonds/opal/browser/http/request.rb +344 -0
  96. data/lib/diamonds/opal/browser/http/response.rb +115 -0
  97. data/lib/diamonds/opal/browser/immediate.rb +163 -0
  98. data/lib/diamonds/opal/browser/interval.rb +111 -0
  99. data/lib/diamonds/opal/browser/location.rb +87 -0
  100. data/lib/diamonds/opal/browser/navigator.rb +173 -0
  101. data/lib/diamonds/opal/browser/screen.rb +66 -0
  102. data/lib/diamonds/opal/browser/socket.rb +123 -0
  103. data/lib/diamonds/opal/browser/storage.rb +252 -0
  104. data/lib/diamonds/opal/browser/support.rb +287 -0
  105. data/lib/diamonds/opal/browser/utils.rb +74 -0
  106. data/lib/diamonds/opal/browser/version.rb +3 -0
  107. data/lib/diamonds/opal/browser/window.rb +120 -0
  108. data/lib/diamonds/opal/browser/window/scroll.rb +59 -0
  109. data/lib/diamonds/opal/browser/window/size.rb +59 -0
  110. data/lib/diamonds/opal/browser/window/view.rb +36 -0
  111. data/lib/diamonds/opal/opal-browser.rb +1 -0
  112. data/lib/diamonds/public/__OPAL_SOURCE_MAPS__/application.map +0 -0
  113. data/lib/diamonds/public/javascripts/font-awesome/HELP-US-OUT.txt +7 -0
  114. data/lib/diamonds/public/javascripts/font-awesome/css/font-awesome.css +2026 -0
  115. data/lib/diamonds/public/javascripts/font-awesome/css/font-awesome.min.css +1 -0
  116. data/lib/diamonds/public/javascripts/font-awesome/fonts/FontAwesome.otf +0 -0
  117. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  118. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.svg +640 -0
  119. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  120. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  121. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  122. data/lib/diamonds/public/javascripts/font-awesome/less/animated.less +34 -0
  123. data/lib/diamonds/public/javascripts/font-awesome/less/bordered-pulled.less +25 -0
  124. data/lib/diamonds/public/javascripts/font-awesome/less/core.less +12 -0
  125. data/lib/diamonds/public/javascripts/font-awesome/less/fixed-width.less +6 -0
  126. data/lib/diamonds/public/javascripts/font-awesome/less/font-awesome.less +17 -0
  127. data/lib/diamonds/public/javascripts/font-awesome/less/icons.less +677 -0
  128. data/lib/diamonds/public/javascripts/font-awesome/less/larger.less +13 -0
  129. data/lib/diamonds/public/javascripts/font-awesome/less/list.less +19 -0
  130. data/lib/diamonds/public/javascripts/font-awesome/less/mixins.less +26 -0
  131. data/lib/diamonds/public/javascripts/font-awesome/less/path.less +15 -0
  132. data/lib/diamonds/public/javascripts/font-awesome/less/rotated-flipped.less +20 -0
  133. data/lib/diamonds/public/javascripts/font-awesome/less/stacked.less +20 -0
  134. data/lib/diamonds/public/javascripts/font-awesome/less/variables.less +688 -0
  135. data/lib/diamonds/public/javascripts/font-awesome/scss/_animated.scss +34 -0
  136. data/lib/diamonds/public/javascripts/font-awesome/scss/_bordered-pulled.scss +25 -0
  137. data/lib/diamonds/public/javascripts/font-awesome/scss/_core.scss +12 -0
  138. data/lib/diamonds/public/javascripts/font-awesome/scss/_fixed-width.scss +6 -0
  139. data/lib/diamonds/public/javascripts/font-awesome/scss/_icons.scss +677 -0
  140. data/lib/diamonds/public/javascripts/font-awesome/scss/_larger.scss +13 -0
  141. data/lib/diamonds/public/javascripts/font-awesome/scss/_list.scss +19 -0
  142. data/lib/diamonds/public/javascripts/font-awesome/scss/_mixins.scss +26 -0
  143. data/lib/diamonds/public/javascripts/font-awesome/scss/_path.scss +15 -0
  144. data/lib/diamonds/public/javascripts/font-awesome/scss/_rotated-flipped.scss +20 -0
  145. data/lib/diamonds/public/javascripts/font-awesome/scss/_stacked.scss +20 -0
  146. data/lib/diamonds/public/javascripts/font-awesome/scss/_variables.scss +688 -0
  147. data/lib/diamonds/public/javascripts/font-awesome/scss/font-awesome.scss +17 -0
  148. data/lib/diamonds/public/javascripts/jquery-2.1.4.min.js +4 -0
  149. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  150. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  151. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_flat_10_000000_40x100.png +0 -0
  152. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  153. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  154. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  155. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  156. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  157. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  158. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
  159. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_228ef1_256x240.png +0 -0
  160. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_ef8c08_256x240.png +0 -0
  161. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_ffd27a_256x240.png +0 -0
  162. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  163. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.min.css +7 -0
  164. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.min.js +13 -0
  165. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.structure.min.css +5 -0
  166. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.theme.min.css +5 -0
  167. data/lib/diamonds/public/javascripts/jquery.js +4 -0
  168. data/lib/diamonds/public/javascripts/jquery.ui.touch-punch.min.js +11 -0
  169. data/lib/diamonds/public/javascripts/ne pas utiliser version en retard jeezs_editor.js b/data/lib/diamonds/public/javascripts/ne pas utiliser version en retard → jeezs_editor.js +0 -0
  170. data/lib/diamonds/public/javascripts/standalone.js +2316 -0
  171. data/lib/diamonds/public/javascripts/standalone.min.js +1 -0
  172. data/lib/diamonds/public/javascripts/wysiwyg-editor.min.css +1 -0
  173. data/lib/diamonds/public/javascripts/wysiwyg-editor.min.js +1 -0
  174. data/lib/diamonds/public/javascripts/wysiwyg.min.js +1 -0
  175. data/lib/diamonds/user_app/main.rb +45 -0
  176. data/lib/diamonds/version.rb +3 -0
  177. data/lib/diamonds/views/index.erb +35 -0
  178. data/lib/diamonds/views/javascripts/jeezs_editor.js.erb +365 -0
  179. data/lib/diamonds/views/stylesheets/main.css.erb +244 -0
  180. metadata +490 -0
@@ -0,0 +1,110 @@
1
+ module Browser; module DOM
2
+
3
+ # Allows manipulation of a set of {Node}s.
4
+ class NodeSet
5
+ # Create a new {NodeSet} from the given nodes.
6
+ #
7
+ # Note that the nodes are flattened and converted with DOM automatically,
8
+ # this means you can pass {NodeSet}s and {Native::Array}s as well.
9
+ def self.[](*nodes)
10
+ new(nodes.flatten.map { |x| DOM(Native.convert(x)) }.uniq)
11
+ end
12
+
13
+ def initialize(literal)
14
+ @literal = literal
15
+ end
16
+
17
+ # Any other method will be called on every node in the set.
18
+ def method_missing(name, *args, &block)
19
+ unless @literal.respond_to? name
20
+ each {|el|
21
+ el.__send__(name, *args, &block)
22
+ }
23
+
24
+ return self
25
+ end
26
+
27
+ result = @literal.__send__ name, *args, &block
28
+
29
+ if `result === #@literal`
30
+ self
31
+ elsif Array === result
32
+ NodeSet.new(result)
33
+ else
34
+ result
35
+ end
36
+ end
37
+
38
+ # Get the first node matching the given CSS selectors.
39
+ #
40
+ # @param rules [Array<String>] the CSS selectors to match with
41
+ #
42
+ # @return [Node?]
43
+ def at_css(*rules)
44
+ each {|node|
45
+ if node = node.at_css(*rules)
46
+ return node
47
+ end
48
+ }
49
+
50
+ nil
51
+ end
52
+
53
+ # Get the first node matching the given XPath.
54
+ #
55
+ # @param paths [Array<String>] the XPath to match with
56
+ #
57
+ # @return [Node?]
58
+ def at_xpath(*paths)
59
+ each {|node|
60
+ if node = node.at_xpath(*paths)
61
+ return node
62
+ end
63
+ }
64
+
65
+ nil
66
+ end
67
+
68
+ # Query for children matching the given CSS selector.
69
+ #
70
+ # @param selector [String] the CSS selector
71
+ #
72
+ # @return [NodeSet]
73
+ def css(path)
74
+ NodeSet[@literal.map {|node|
75
+ node.css(path)
76
+ }]
77
+ end
78
+
79
+ # Create another {NodeSet} with all the nodes that match the given
80
+ # expression.
81
+ #
82
+ # @param expression [String] a CSS selector
83
+ #
84
+ # @return [NodeSet] the new {NodeSet} with the matching nodes
85
+ def filter(expression)
86
+ @literal.select { |node| node =~ expression }
87
+ end
88
+
89
+ # Search for multiple selectors
90
+ def search(*what)
91
+ NodeSet[@literal.map { |node| node.search(*what) }]
92
+ end
93
+
94
+ # Query for children matching the given XPath.
95
+ #
96
+ # @param path [String] the XPath
97
+ #
98
+ # @return [NodeSet]
99
+ def xpath(path)
100
+ NodeSet[@literal.map {|node|
101
+ node.xpath(path)
102
+ }]
103
+ end
104
+
105
+ def to_ary
106
+ @literal
107
+ end
108
+ end
109
+
110
+ end; end
@@ -0,0 +1,36 @@
1
+ module Browser; module DOM
2
+
3
+ # Encapsulates a text node.
4
+ #
5
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/Text
6
+ class Text < CharacterData
7
+ # (see Document#create_text)
8
+ def self.create(*args)
9
+ $document.create_text(*args)
10
+ end
11
+
12
+ # @!attribute [r] whole
13
+ # @return [String] the whole text
14
+ #
15
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/Text.wholeText
16
+ def whole
17
+ `#@native.wholeText`
18
+ end
19
+
20
+ # Split the text node at a given offset.
21
+ #
22
+ # @param offset [Integer] the offset where to split the text node
23
+ #
24
+ # @return [Text] the newly created text node
25
+ #
26
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/Text.splitText
27
+ def split(offset)
28
+ DOM(`#@native.splitText(offset)`)
29
+ end
30
+
31
+ def inspect
32
+ "#<DOM::Text: #{data}>"
33
+ end
34
+ end
35
+
36
+ end; end
@@ -0,0 +1,50 @@
1
+ module Browser; module DOM
2
+
3
+ class Document < Element
4
+ # @!attribute [r] active_element
5
+ # @return [Element] the element with focus
6
+ def active_element
7
+ DOM(`#@native.activeElement`)
8
+ end
9
+ end
10
+
11
+ class Element
12
+ # Show the element.
13
+ #
14
+ # @param what [Symbol] how to display it
15
+ def show(what = :block)
16
+ style[:display] = what
17
+ end
18
+
19
+ # Hide the element.
20
+ def hide
21
+ style[:display] = :none
22
+ end
23
+
24
+ # Toggle the visibility of the element, hide it if it's shown, show it if
25
+ # it's hidden.
26
+ def toggle
27
+ if style![:display] == :none
28
+ show
29
+ else
30
+ hide
31
+ end
32
+ end
33
+
34
+ # Set the focus on the element.
35
+ def focus
36
+ `#@native.focus()`
37
+ end
38
+
39
+ # Blur the focus from the element.
40
+ def blur
41
+ `#@native.blur()`
42
+ end
43
+
44
+ # Check if the element is focused.
45
+ def focused?
46
+ `#@native.hasFocus`
47
+ end
48
+ end
49
+
50
+ end; end
@@ -0,0 +1,253 @@
1
+ require 'browser/event/base'
2
+ require 'browser/event/ui'
3
+ require 'browser/event/mouse'
4
+ require 'browser/event/keyboard'
5
+ require 'browser/event/focus'
6
+ require 'browser/event/wheel'
7
+ require 'browser/event/composition'
8
+ require 'browser/event/animation'
9
+ require 'browser/event/audio_processing'
10
+ require 'browser/event/before_unload'
11
+ require 'browser/event/composition'
12
+ require 'browser/event/clipboard'
13
+ require 'browser/event/device_light'
14
+ require 'browser/event/device_motion'
15
+ require 'browser/event/device_orientation'
16
+ require 'browser/event/device_proximity'
17
+ require 'browser/event/drag'
18
+ require 'browser/event/gamepad'
19
+ require 'browser/event/hash_change'
20
+ require 'browser/event/progress'
21
+ require 'browser/event/page_transition'
22
+ require 'browser/event/pop_state'
23
+ require 'browser/event/storage'
24
+ require 'browser/event/touch'
25
+ require 'browser/event/sensor'
26
+ require 'browser/event/custom'
27
+ require 'browser/event/message'
28
+ require 'browser/event/close'
29
+
30
+ module Browser
31
+
32
+ class Event
33
+ def self.aliases
34
+ @aliases ||= {
35
+ 'dom:load' => 'DOMContentLoaded',
36
+ 'hover' => 'mouse:over'
37
+ }
38
+ end
39
+
40
+ def self.name_for(name)
41
+ (aliases[name] || name).gsub(?:, '')
42
+ end
43
+
44
+ def self.class_for(name)
45
+ case name_for(name)
46
+ when 'animationend', 'animationiteration', 'animationstart'
47
+ Animation
48
+
49
+ when 'audioprocess'
50
+ AudioProcessing
51
+
52
+ when 'beforeunload'
53
+ BeforeUnload
54
+
55
+ when 'compositionend', 'compositionstart', 'compositionupdate'
56
+ Composition
57
+
58
+ when 'copy', 'cut'
59
+ Clipboard
60
+
61
+ when 'devicelight'
62
+ DeviceLight
63
+
64
+ when 'devicemotion'
65
+ DeviceMotion
66
+
67
+ when 'deviceorientation'
68
+ DeviceOrientation
69
+
70
+ when 'deviceproximity'
71
+ DeviceProximity
72
+
73
+ when 'drag', 'dragend', 'dragleave', 'dragover', 'dragstart', 'drop'
74
+ Drag
75
+
76
+ when 'gamepadconnected', 'gamepaddisconnected'
77
+ Gamepad
78
+
79
+ when 'hashchange'
80
+ HashChange
81
+
82
+ when 'progress', 'load', 'loadend', 'loadstart'
83
+ Progress
84
+
85
+ when 'pagehide', 'pageshow'
86
+ PageTransition
87
+
88
+ when 'popstate'
89
+ PopState
90
+
91
+ when 'storage'
92
+ Storage
93
+
94
+ when 'touchcancel', 'touchend', 'touchleave', 'touchmove', 'touchstart'
95
+ Touch
96
+
97
+ when 'compassneedscalibration', 'userproximity'
98
+ Sensor
99
+
100
+ when 'message'
101
+ Message
102
+
103
+ when 'close'
104
+ Close
105
+
106
+ when 'click', 'contextmenu', 'dblclick', 'mousedown', 'mouseenter',
107
+ 'mouseleave', 'mousemove', 'mouseout', 'mouseover', 'mouseup',
108
+ 'show'
109
+ Mouse
110
+
111
+ when 'keydown', 'keypress', 'keyup'
112
+ Keyboard
113
+
114
+ when 'blur', 'focus', 'focusin', 'focusout'
115
+ Focus
116
+
117
+ when 'wheel'
118
+ Wheel
119
+
120
+ when 'abort', 'afterprint', 'beforeprint', 'cached', 'canplay',
121
+ 'canplaythrough', 'change', 'chargingchange', 'chargingtimechange',
122
+ 'checking', 'close', 'dischargingtimechange', 'DOMContentLoaded',
123
+ 'downloading', 'durationchange', 'emptied', 'ended', 'error',
124
+ 'fullscreenchange', 'fullscreenerror', 'input', 'invalid',
125
+ 'levelchange', 'loadeddata', 'loadedmetadata', 'noupdate', 'obsolete',
126
+ 'offline', 'online', 'open', 'orientationchange', 'pause',
127
+ 'pointerlockchange', 'pointerlockerror', 'play', 'playing',
128
+ 'ratechange', 'readystatechange', 'reset', 'seeked', 'seeking',
129
+ 'stalled', 'submit', 'success', 'suspend', 'timeupdate', 'updateready',
130
+ 'visibilitychange', 'volumechange', 'waiting'
131
+ Event
132
+
133
+ else
134
+ Custom
135
+ end
136
+ end
137
+
138
+ def self.supported?
139
+ true
140
+ end
141
+
142
+ def self.create(name, *args, &block)
143
+ name = name_for(name)
144
+ klass = class_for(name)
145
+
146
+ event = klass.new(klass.construct(name, klass.const_get(:Definition).new(&block)))
147
+ event.arguments = args
148
+
149
+ event
150
+ end
151
+
152
+ if Browser.supports? 'Event.constructor'
153
+ def self.construct(name, desc)
154
+ `new Event(#{name}, #{desc})`
155
+ end
156
+ elsif Browser.supports? 'Event.create'
157
+ def self.construct(name, desc)
158
+ %x{
159
+ var event = document.createEvent("HTMLEvents");
160
+ event.initEvent(name, desc.bubbles, desc.cancelable);
161
+
162
+ #{return Native(`event`).merge!(desc)};
163
+ }
164
+ end
165
+ elsif Browser.supports? 'Event.createObject'
166
+ def self.construct(name, desc)
167
+ Native(`document.createEventObject()`) \
168
+ .merge!(desc) \
169
+ .merge!(`{ type: name }`) \
170
+ .to_n
171
+ end
172
+ else
173
+ def self.construct(name, desc)
174
+ Native(desc).merge!(`{ type: name }`).to_n
175
+ end
176
+ end
177
+
178
+ def self.new(value, callback = nil)
179
+ return super unless self == Event
180
+
181
+ klass = class_for(callback ? callback.name : `value.type`)
182
+
183
+ if klass == Event
184
+ super
185
+ else
186
+ klass.new(value, callback)
187
+ end
188
+ end
189
+
190
+ attr_reader :callback
191
+ attr_writer :on
192
+
193
+ def initialize(event, callback = nil)
194
+ super(event)
195
+
196
+ @callback = callback
197
+ end
198
+
199
+ def name
200
+ `#@native.type`
201
+ end
202
+
203
+ def on
204
+ @on || Target.convert(`#@native.currentTarget`)
205
+ end
206
+
207
+ def target
208
+ Target.convert(`#@native.srcElement || #@native.target`)
209
+ end
210
+
211
+ def arguments
212
+ `#@native.arguments || []`
213
+ end
214
+
215
+ def arguments=(args)
216
+ `#@native.arguments = #{args}`
217
+ end
218
+
219
+ alias_native :bubbles?, :bubbles
220
+ alias_native :cancelable?, :cancelable
221
+ alias_native :data
222
+ alias_native :phase, :eventPhase
223
+ alias_native :at, :timeStamp
224
+
225
+ def off
226
+ @callback.off if @callback
227
+ end
228
+
229
+ def stopped?
230
+ `!!#@native.stopped`
231
+ end
232
+
233
+ def stop
234
+ `#@native.stopPropagation()` if defined?(`#@native.stopPropagation`)
235
+ `#@native.stopped = true`
236
+ end
237
+
238
+ def prevent
239
+ `#@native.preventDefault()` if defined?(`#@native.preventDefault`)
240
+ `#@native.prevented = true`
241
+ end
242
+
243
+ def prevented?
244
+ `!!#@native.prevented`
245
+ end
246
+
247
+ def stop!
248
+ prevent
249
+ stop
250
+ end
251
+ end
252
+
253
+ end