opal 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (306) hide show
  1. data/.gitignore +10 -1
  2. data/.gitmodules +0 -0
  3. data/Opalfile +371 -0
  4. data/README.md +45 -0
  5. data/Rakefile +237 -34
  6. data/VERSION +1 -1
  7. data/bin/opal +13 -0
  8. data/demos/apps/browser_demo/index.html +11 -0
  9. data/demos/apps/browser_demo/lib/browser_demo.rb +31 -0
  10. data/demos/apps/simple_opal/Opalfile +13 -0
  11. data/demos/apps/simple_opal/index.html +11 -0
  12. data/demos/apps/simple_opal/lib/app_controller.rb +62 -0
  13. data/demos/apps/simple_opal/lib/main_window.rb +146 -0
  14. data/demos/browser/request/index.html +52 -0
  15. data/demos/browser/request/request.rb +48 -0
  16. data/gen/browser/__PROJECT_NAME__/index.html +10 -0
  17. data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +1 -0
  18. data/lib/opal.rb +48 -3
  19. data/lib/opal/builders/base.rb +50 -0
  20. data/lib/opal/builders/css.rb +46 -0
  21. data/lib/opal/builders/javascript.rb +44 -0
  22. data/lib/opal/builders/opal.rb +79 -0
  23. data/lib/opal/builders/ruby.rb +50 -0
  24. data/lib/opal/builders/ruby/generate.rb +1851 -0
  25. data/lib/opal/builders/ruby/nodes.rb +210 -0
  26. data/lib/opal/builders/ruby/ruby.rb +916 -0
  27. data/lib/opal/builders/ruby/ruby_parser.rb +6008 -0
  28. data/lib/opal/builders/ruby/ruby_parser.rb.y +1451 -0
  29. data/lib/opal/models/build_item.rb +104 -0
  30. data/lib/opal/models/hash_struct.rb +40 -0
  31. data/lib/opal/models/project.rb +215 -0
  32. data/lib/opal/models/struct_accessors.rb +58 -0
  33. data/lib/opal/models/target.rb +176 -0
  34. data/lib/opal/opal/env/console.rb +66 -0
  35. data/lib/opal/opal/env/fs.rb +98 -0
  36. data/lib/opal/opal/env/object.rb +48 -0
  37. data/lib/opal/opal/environment.rb +139 -0
  38. data/lib/opal/opal/gen.rb +62 -0
  39. data/lib/opal/opal/opal.rb +68 -0
  40. data/lib/opal/opal/repl.rb +38 -0
  41. data/lib/opal/opalfile/dsl.rb +62 -0
  42. data/lib/opal/opalfile/opalfile.rb +133 -0
  43. data/lib/opal/opalfile/task.rb +96 -0
  44. data/lib/opal/opalfile/task_manager.rb +63 -0
  45. data/lib/opal/opalfile/task_scope.rb +52 -0
  46. data/lib/opal/rack/app_server.rb +119 -0
  47. data/opals/aristo/README.md +16 -0
  48. data/opals/browser/Opalfile +11 -0
  49. data/opals/browser/README.md +146 -0
  50. data/opals/browser/SIZZLE_LICESNSE.txt +148 -0
  51. data/opals/browser/lib/browser.rb +118 -0
  52. data/opals/browser/lib/browser/builder.rb +41 -0
  53. data/opals/browser/lib/browser/canvas_context.rb +115 -0
  54. data/opals/browser/lib/browser/dimensions.rb +50 -0
  55. data/opals/browser/lib/browser/document.rb +146 -0
  56. data/opals/browser/lib/browser/element.rb +487 -0
  57. data/opals/browser/lib/browser/element/attributes.rb +88 -0
  58. data/opals/browser/lib/browser/element/css.rb +290 -0
  59. data/opals/browser/lib/browser/element/form.rb +146 -0
  60. data/opals/browser/lib/browser/event/dom_events.rb +81 -0
  61. data/opals/browser/lib/browser/event/event.rb +177 -0
  62. data/opals/browser/lib/browser/event/trigger_events.rb +53 -0
  63. data/opals/browser/lib/browser/geometry.rb +97 -0
  64. data/opals/browser/lib/browser/json.rb +32 -0
  65. data/opals/browser/lib/browser/json_parse.js +321 -0
  66. data/opals/browser/lib/browser/request/request.rb +201 -0
  67. data/opals/browser/lib/browser/sizzle.js +1068 -0
  68. data/opals/browser/lib/browser/string.rb +42 -0
  69. data/opals/browser/lib/browser/touch.rb +37 -0
  70. data/{runtime/yaml.js → opals/browser/lib/browser/vml_context.js} +8 -8
  71. data/opals/browser/lib/browser/window.rb +36 -0
  72. data/opals/browser/spec/browser/browser_detection_spec.rb +7 -0
  73. data/opals/browser/spec/document/aref_spec.rb +110 -0
  74. data/opals/browser/spec/document/ready_spec.rb +16 -0
  75. data/opals/browser/spec/element/body_spec.rb +11 -0
  76. data/opals/browser/spec/element/clear_spec.rb +26 -0
  77. data/opals/browser/spec/element/empty_spec.rb +29 -0
  78. data/opals/browser/spec/element/has_class_spec.rb +40 -0
  79. data/opals/browser/spec/element/hidden_spec.rb +23 -0
  80. data/opals/browser/spec/element/hide_spec.rb +31 -0
  81. data/opals/browser/spec/element/remove_spec.rb +25 -0
  82. data/opals/browser/spec/element/show_spec.rb +31 -0
  83. data/opals/browser/spec/element/style_spec.rb +69 -0
  84. data/opals/browser/spec/element/toggle_spec.rb +31 -0
  85. data/opals/browser/spec/element/visible_spec.rb +23 -0
  86. data/opals/browser/spec/spec_helper.rb +1 -0
  87. data/opals/cherry_kit/Opalfile +6 -0
  88. data/opals/cherry_kit/bin/cherry_kit.rb +11 -0
  89. data/opals/cherry_kit/lib/cherry_kit.rb +29 -0
  90. data/opals/foundation/Opalfile +11 -0
  91. data/opals/foundation/bin/foundation.rb +12 -0
  92. data/opals/foundation/lib/foundation.rb +32 -0
  93. data/opals/foundation/lib/foundation/__table_view_desktop/outline_view.rb +57 -0
  94. data/opals/foundation/lib/foundation/__table_view_desktop/table_column.rb +59 -0
  95. data/opals/foundation/lib/foundation/__table_view_desktop/table_header_view.rb +34 -0
  96. data/opals/foundation/lib/foundation/__table_view_desktop/table_view.rb +304 -0
  97. data/opals/foundation/lib/foundation/controllers/array_controller.rb +54 -0
  98. data/opals/foundation/lib/foundation/controllers/controller.rb +74 -0
  99. data/opals/foundation/lib/foundation/controllers/controller_selection_proxy.rb +67 -0
  100. data/opals/foundation/lib/foundation/controllers/object_controller.rb +145 -0
  101. data/opals/foundation/lib/foundation/controllers/view.rb +40 -0
  102. data/opals/foundation/lib/foundation/core/application.rb +476 -0
  103. data/opals/foundation/lib/foundation/core/attributes.rb +146 -0
  104. data/opals/foundation/lib/foundation/core/bindings.rb +125 -0
  105. data/opals/foundation/lib/foundation/core/builder.rb +101 -0
  106. data/opals/foundation/lib/foundation/core/event.rb +112 -0
  107. data/opals/foundation/lib/foundation/core/index_path.rb +49 -0
  108. data/opals/foundation/lib/foundation/core/index_set.rb +97 -0
  109. data/opals/foundation/lib/foundation/core/notification.rb +113 -0
  110. data/opals/foundation/lib/foundation/core/observable.rb +275 -0
  111. data/opals/foundation/lib/foundation/core/observable_array.rb +30 -0
  112. data/opals/foundation/lib/foundation/core/responder.rb +85 -0
  113. data/opals/foundation/lib/foundation/core/run_loop.rb +89 -0
  114. data/opals/foundation/lib/foundation/core/touch.rb +95 -0
  115. data/opals/foundation/lib/foundation/gestures/gesture_recognizer.rb +35 -0
  116. data/opals/foundation/lib/foundation/rendering/render_context.rb +100 -0
  117. data/opals/foundation/lib/foundation/rendering/renderer.rb +137 -0
  118. data/opals/foundation/lib/foundation/rendering/root_theme.rb +77 -0
  119. data/opals/foundation/lib/foundation/rendering/root_theme/button.rb +62 -0
  120. data/opals/foundation/lib/foundation/rendering/root_theme/control.rb +72 -0
  121. data/opals/foundation/lib/foundation/rendering/root_theme/label.rb +54 -0
  122. data/opals/foundation/lib/foundation/rendering/root_theme/scroller.rb +58 -0
  123. data/opals/foundation/lib/foundation/rendering/root_theme/slider.rb +72 -0
  124. data/opals/foundation/lib/foundation/rendering/root_theme/table_view.rb +97 -0
  125. data/opals/foundation/lib/foundation/rendering/root_theme/text_field.rb +55 -0
  126. data/opals/foundation/lib/foundation/rendering/root_theme/view.rb +81 -0
  127. data/opals/foundation/lib/foundation/rendering/theme.rb +38 -0
  128. data/opals/foundation/lib/foundation/table_view/cell.rb +39 -0
  129. data/opals/foundation/lib/foundation/table_view/table.rb +171 -0
  130. data/opals/foundation/lib/foundation/views/button.rb +63 -0
  131. data/opals/foundation/lib/foundation/views/checkbox.rb +28 -0
  132. data/opals/foundation/lib/foundation/views/clip.rb +47 -0
  133. data/opals/foundation/lib/foundation/views/control.rb +199 -0
  134. data/opals/foundation/lib/foundation/views/label.rb +54 -0
  135. data/opals/foundation/lib/foundation/views/scroll.rb +294 -0
  136. data/opals/foundation/lib/foundation/views/scroll_view_desktop.rb +152 -0
  137. data/opals/foundation/lib/foundation/views/scroller.rb +54 -0
  138. data/opals/foundation/lib/foundation/views/slider.rb +93 -0
  139. data/opals/foundation/lib/foundation/views/text_field.rb +83 -0
  140. data/opals/foundation/lib/foundation/views/view.rb +426 -0
  141. data/opals/foundation/lib/foundation/windows/window.rb +191 -0
  142. data/opals/foundation/resources/button/button.css +23 -0
  143. data/{runtime/init.js → opals/foundation/resources/foundation.css} +27 -33
  144. data/opals/foundation/resources/scroll/scroll.css +22 -0
  145. data/opals/foundation/resources/scroll_view/scroll_view.css +3 -0
  146. data/opals/foundation/resources/scroll_view/scroller.css +3 -0
  147. data/opals/foundation/resources/slider/regular/slider.css +3 -0
  148. data/opals/foundation/resources/slider/slider.css +27 -0
  149. data/opals/foundation/resources/table_view/outline_view.css +3 -0
  150. data/opals/foundation/resources/table_view/table_view.css +15 -0
  151. data/opals/foundation/resources/text_field/text_field.css +71 -0
  152. data/opals/foundation/spec/spec_helper.rb +1 -0
  153. data/opals/foundation/spec/system/attributes/get_attribute_spec.rb +69 -0
  154. data/opals/foundation/spec/system/attributes/get_path_spec.rb +44 -0
  155. data/opals/foundation/spec/system/attributes/set_path_spec.rb +24 -0
  156. data/opals/foundation/spec/system/attributes/set_spec.rb +58 -0
  157. data/opals/foundation/spec/system/bindings/bindings.rb +85 -0
  158. data/opals/foundation/spec/system/key_value_binding/bind_spec.rb +43 -0
  159. data/opals/foundation/spec/system/observable/dependant_keys_spec.rb +74 -0
  160. data/opals/foundation/spec/system/observable/observe_spec.rb +292 -0
  161. data/opals/foundation/spec/system/observable/remove_observer_spec.rb +60 -0
  162. data/opals/opal/Opalfile +14 -0
  163. data/opals/opal/spec/core/array/append_spec.rb +30 -0
  164. data/opals/opal/spec/core/array/assoc_spec.rb +29 -0
  165. data/opals/opal/spec/core/array/at_spec.rb +37 -0
  166. data/opals/opal/spec/core/array/clear_spec.rb +22 -0
  167. data/opals/opal/spec/core/array/collect_bang_spec.rb +27 -0
  168. data/opals/opal/spec/core/array/collect_spec.rb +27 -0
  169. data/opals/opal/spec/core/array/compact_spec.rb +15 -0
  170. data/opals/opal/spec/core/array/concat_spec.rb +15 -0
  171. data/opals/opal/spec/core/array/constructor_spec.rb +14 -0
  172. data/opals/opal/spec/core/array/each_spec.rb +9 -0
  173. data/opals/opal/spec/core/array/element_reference_spec.rb +4 -0
  174. data/opals/opal/spec/core/array/first_spec.rb +35 -0
  175. data/opals/opal/spec/core/array/include_spec.rb +9 -0
  176. data/opals/opal/spec/core/array/map_spec.rb +31 -0
  177. data/opals/opal/spec/core/builtin_constants/builtin_constants_spec.rb +7 -0
  178. data/opals/opal/spec/core/false/and_spec.rb +10 -0
  179. data/opals/opal/spec/core/false/inspect_spec.rb +6 -0
  180. data/opals/opal/spec/core/false/or_spec.rb +10 -0
  181. data/opals/opal/spec/core/false/to_s_spec.rb +6 -0
  182. data/opals/opal/spec/core/false/xor_spec.rb +10 -0
  183. data/opals/opal/spec/core/file/join_spec.rb +19 -0
  184. data/opals/opal/spec/core/kernel/instance_eval_spec.rb +0 -0
  185. data/opals/opal/spec/core/kernel/loop_spec.rb +24 -0
  186. data/opals/opal/spec/core/kernel/raise_spec.rb +0 -0
  187. data/opals/opal/spec/core/module/attr_accessor_spec.rb +28 -0
  188. data/opals/opal/spec/core/number/lt_spec.rb +12 -0
  189. data/opals/opal/spec/core/true/and_spec.rb +10 -0
  190. data/opals/opal/spec/core/true/inspect_spec.rb +6 -0
  191. data/opals/opal/spec/core/true/or_spec.rb +10 -0
  192. data/opals/opal/spec/core/true/to_s_spec.rb +6 -0
  193. data/opals/opal/spec/core/true/xor_spec.rb +10 -0
  194. data/opals/opal/spec/fixtures/super.rb +70 -0
  195. data/opals/opal/spec/language/____temp_remove_this.rb +12 -0
  196. data/opals/opal/spec/language/and_spec.rb +62 -0
  197. data/opals/opal/spec/language/array_spec.rb +52 -0
  198. data/opals/opal/spec/language/block_spec.rb +18 -0
  199. data/opals/opal/spec/language/break_spec.rb +36 -0
  200. data/opals/opal/spec/language/case_spec.rb +103 -0
  201. data/opals/opal/spec/language/def_spec.rb +11 -0
  202. data/opals/opal/spec/language/eigenclass_spec.rb +60 -0
  203. data/opals/opal/spec/language/hash_spec.rb +29 -0
  204. data/opals/opal/spec/language/if_spec.rb +54 -0
  205. data/opals/opal/spec/language/loop_spec.rb +11 -0
  206. data/opals/opal/spec/language/metaclass_spec.rb +21 -0
  207. data/opals/opal/spec/language/method_spec.rb +64 -0
  208. data/opals/opal/spec/language/next_spec.rb +25 -0
  209. data/opals/opal/spec/language/or_spec.rb +34 -0
  210. data/opals/opal/spec/language/redo_spec.rb +24 -0
  211. data/opals/opal/spec/language/rescue_spec.rb +20 -0
  212. data/opals/opal/spec/language/return_spec.rb +47 -0
  213. data/opals/opal/spec/language/string_spec.rb +25 -0
  214. data/opals/opal/spec/language/super_spec.rb +26 -0
  215. data/opals/opal/spec/language/until_spec.rb +157 -0
  216. data/opals/opal/spec/language/while_spec.rb +163 -0
  217. data/opals/opal/spec/spec_helper.rb +5 -0
  218. data/opals/runtime/Opalfile +68 -0
  219. data/opals/runtime/README.md +12 -0
  220. data/opals/runtime/docs/debugging.md +51 -0
  221. data/opals/runtime/lib/array.rb +1516 -0
  222. data/opals/runtime/lib/basic_object.rb +49 -0
  223. data/opals/runtime/lib/class.rb +54 -0
  224. data/opals/runtime/lib/dir.rb +36 -0
  225. data/opals/runtime/lib/error.rb +49 -0
  226. data/opals/runtime/lib/false_class.rb +52 -0
  227. data/opals/runtime/lib/file.rb +79 -0
  228. data/opals/runtime/lib/hash.rb +791 -0
  229. data/opals/runtime/lib/io.rb +39 -0
  230. data/opals/runtime/lib/kernel.rb +288 -0
  231. data/opals/runtime/lib/match_data.rb +36 -0
  232. data/opals/runtime/lib/module.rb +109 -0
  233. data/opals/runtime/lib/nil_class.rb +69 -0
  234. data/opals/runtime/lib/number.rb +398 -0
  235. data/opals/runtime/lib/proc.rb +77 -0
  236. data/opals/runtime/lib/range.rb +63 -0
  237. data/opals/runtime/lib/regexp.rb +111 -0
  238. data/opals/runtime/lib/ruby.rb +30 -0
  239. data/opals/runtime/lib/string.rb +328 -0
  240. data/opals/runtime/lib/symbol.rb +40 -0
  241. data/opals/runtime/lib/top_self.rb +33 -0
  242. data/opals/runtime/lib/true_class.rb +45 -0
  243. data/opals/runtime/runtime/browser.js +287 -0
  244. data/opals/runtime/runtime/debug.js +182 -0
  245. data/opals/runtime/runtime/opal.js +1010 -0
  246. data/opals/runtime/runtime/post_opal.js +1 -0
  247. data/opals/runtime/runtime/pre_opal.js +2 -0
  248. data/opals/runtime/runtime/server_side.js +50 -0
  249. data/opals/spec/LICENSE.txt +26 -0
  250. data/opals/spec/Opalfile +5 -0
  251. data/opals/spec/bin/spec.rb +43 -0
  252. data/opals/spec/lib/spec.rb +33 -0
  253. data/opals/spec/lib/spec/dsl.rb +41 -0
  254. data/opals/spec/lib/spec/example.rb +35 -0
  255. data/opals/spec/lib/spec/example/before_and_after_hooks.rb +81 -0
  256. data/opals/spec/lib/spec/example/errors.rb +42 -0
  257. data/opals/spec/lib/spec/example/example_group.rb +37 -0
  258. data/opals/spec/lib/spec/example/example_group_factory.rb +43 -0
  259. data/opals/spec/lib/spec/example/example_group_hierarchy.rb +45 -0
  260. data/opals/spec/lib/spec/example/example_group_methods.rb +142 -0
  261. data/opals/spec/lib/spec/example/example_group_proxy.rb +41 -0
  262. data/opals/spec/lib/spec/example/example_methods.rb +73 -0
  263. data/opals/spec/lib/spec/example/example_proxy.rb +48 -0
  264. data/opals/spec/lib/spec/expectations.rb +46 -0
  265. data/opals/spec/lib/spec/expectations/errors.rb +35 -0
  266. data/opals/spec/lib/spec/expectations/fail_with.rb +37 -0
  267. data/opals/spec/lib/spec/expectations/handler.rb +48 -0
  268. data/opals/spec/lib/spec/matchers.rb +50 -0
  269. data/opals/spec/lib/spec/matchers/be.rb +26 -0
  270. data/opals/spec/lib/spec/matchers/generated_descriptions.rb +47 -0
  271. data/opals/spec/lib/spec/matchers/operator_matcher.rb +66 -0
  272. data/opals/spec/lib/spec/runner.rb +48 -0
  273. data/opals/spec/lib/spec/runner/example_group_runner.rb +71 -0
  274. data/opals/spec/lib/spec/runner/formatter/html_formatter.rb +100 -0
  275. data/opals/spec/lib/spec/runner/formatter/terminal_formatter.rb +82 -0
  276. data/opals/spec/lib/spec/runner/options.rb +63 -0
  277. data/opals/spec/lib/spec/runner/reporter.rb +123 -0
  278. data/opals/spec/resources/index.html +25 -0
  279. data/opals/spec/resources/spec.css +132 -0
  280. data/spec/cherry_kit/iseq_spec.rb +38 -0
  281. data/spec/spec_helper.rb +16 -0
  282. data/spec/vienna_spec.rb +7 -0
  283. data/yard/index.html +43 -0
  284. data/yard/style.css +765 -0
  285. metadata +312 -49
  286. data/docs/jarv.rdoc +0 -27
  287. data/runtime/array.js +0 -153
  288. data/runtime/class.js +0 -469
  289. data/runtime/compar.js +0 -73
  290. data/runtime/dir.js +0 -115
  291. data/runtime/enum.js +0 -74
  292. data/runtime/file.js +0 -165
  293. data/runtime/gem.js +0 -241
  294. data/runtime/hash.js +0 -181
  295. data/runtime/load.js +0 -251
  296. data/runtime/module.js +0 -98
  297. data/runtime/number.js +0 -148
  298. data/runtime/object.js +0 -522
  299. data/runtime/opal.js +0 -200
  300. data/runtime/parse.js +0 -2218
  301. data/runtime/range.js +0 -56
  302. data/runtime/re.js +0 -91
  303. data/runtime/string.js +0 -199
  304. data/runtime/variable.js +0 -184
  305. data/runtime/vm.js +0 -1150
  306. data/tasks/build.rb +0 -16
@@ -0,0 +1,201 @@
1
+ #
2
+ # request.rb
3
+ # vienna
4
+ #
5
+ # Created by Adam Beynon.
6
+ # Copyright 2010 Adam Beynon.
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #
26
+
27
+ require 'browser/event/trigger_events'
28
+
29
+ # Request class
30
+ #
31
+ # ## Events
32
+ #
33
+ # ### request
34
+ #
35
+ # Triggered when request is initially sent.
36
+ #
37
+ # ### complete
38
+ #
39
+ # Triggered when the request completes. Last callback to be triggered (it is
40
+ # fired after :success/:failure)
41
+ #
42
+ # ### cancel
43
+ #
44
+ # Triggered if request cancels
45
+ #
46
+ # ### success
47
+ #
48
+ # Triggered if the event completes successfully
49
+ #
50
+ # ### failure
51
+ #
52
+ # Triggered if the request failed (got a response, but it was an error code)
53
+ #
54
+ class Request
55
+
56
+ include Event::TriggerEvents
57
+
58
+ OPTIONS = {
59
+ :url => '',
60
+ :data => {},
61
+ # :headers => {
62
+ # 'X-Requested-With' => 'XMLHttpRequest',
63
+ # 'Accept' =>' text/javascript, text/html, application/xml, text/xml, */*'
64
+ # },
65
+ :async => true,
66
+ :format => nil,
67
+ :method => 'POST',
68
+ :link => 'ignore',
69
+ :is_success => nil,
70
+ :emulation => true,
71
+ :url_encoded => true,
72
+ :encoding => 'utf-8',
73
+ :eval_scripts => false,
74
+ :eval_response => false,
75
+ :timeout => 0,
76
+ :no_cache => false
77
+ }
78
+
79
+ # Get the current status of the request
80
+ attr_reader :status
81
+
82
+ attr_reader :text
83
+
84
+ def initialize(options = {})
85
+ `#{self}.__xhr__ = opal.request();`
86
+ @options = OPTIONS.merge options
87
+ @headers = @options[:headers]
88
+ @running = false
89
+ @status = 0
90
+ @text = ""
91
+ end
92
+
93
+ # FIXME: Do we want lowercase? good practice to use uppercase?
94
+ %W{get post put delete GET POST PUT DELETE}.each do |method|
95
+ define_method(method) do |data|
96
+ send :data => data, :method => method
97
+ end
98
+ end
99
+
100
+ # Sends the request with the given data and options. Can also take a block
101
+ # that acts as the on :complete proc callback handler.
102
+ #
103
+ # @example
104
+ # request = Request.new :url => 'clients.html, :method => 'get'
105
+ #
106
+ # @param [Hash] options to set on receiver before sending
107
+ # @return [Request] returns receiver
108
+ def send(options = {}, &block)
109
+ @running = true
110
+
111
+
112
+ method = :post
113
+
114
+ url = options[:url] || ""
115
+
116
+ request = self
117
+ `#{self}.__xhr__.onreadystatechange = function() {
118
+ #{request}.$state_change();
119
+ };`
120
+
121
+ `#{self}.__xhr__.open(#{method.to_s}.toUpperCase(), #{url}, true);`
122
+
123
+ trigger :request, self
124
+
125
+ `#{self}.__xhr__.send(null);`
126
+ end
127
+
128
+ # Returns +true+ if the +Request+ is running, +false+ otherwise
129
+ #
130
+ # @example
131
+ # req = Request.new
132
+ # req.running? # => false
133
+ # req.send
134
+ # req.running? # => true
135
+ #
136
+ # @return [true, false]
137
+ def running?
138
+ @running
139
+ end
140
+
141
+ # Returns +true+ if the request succeeded, +false+ otherwise
142
+ #
143
+ # @return [true, false]
144
+ def success?
145
+ `return (#{@status} >= 200 && #{@status} < 300) ? #{true} : #{false};`
146
+ end
147
+
148
+ # Returns +true+ if the request failed, +false+ otherwise
149
+ #
150
+ # @return [true, false]
151
+ def failed?
152
+ !success?
153
+ end
154
+
155
+ def state_change
156
+ # only handle state change when request is done (state 4)
157
+ `if (#{self}.__xhr__.readyState !== 4 || !#{@running}.r) return;`
158
+
159
+ `#{self}.__xhr__.onreadystatechange = function() { };`
160
+
161
+ @running = false
162
+ @status = 0
163
+
164
+ begin
165
+ @status = `#{self}.__xhr__.status`
166
+ rescue Exception => e
167
+ # warning?
168
+ puts "warning"
169
+ end
170
+
171
+ puts "our status is now #{@status}"
172
+
173
+ # should be:
174
+ # @status = `#{@xhr}.status` rescue nil
175
+
176
+ if success?
177
+ # puts "success #{@status}"
178
+ @text = `#{self}.__xhr__.responseText || ''`
179
+
180
+ trigger :success, self
181
+ trigger :complete, self
182
+ else
183
+ `console.log(#{@status});`
184
+ puts "aww :( #{@status}"
185
+
186
+ trigger :failure, self
187
+ trigger :complete, self
188
+ end
189
+ end
190
+
191
+ def cancel
192
+ return self unless @running
193
+ @running = false
194
+ `#{self}.__xhr__.abort();`
195
+ `#{self}.__xhr__.onreadystatechange = function() {};`
196
+ `#{self}.__xhr__ = opal.request();`
197
+ trigger :cancel
198
+ self
199
+ end
200
+
201
+ end
@@ -0,0 +1,1068 @@
1
+ /*!
2
+ * Sizzle CSS Selector Engine - v1.0
3
+ * Copyright 2009, The Dojo Foundation
4
+ * Released under the MIT, BSD, and GPL Licenses.
5
+ * More information: http://sizzlejs.com/
6
+ */
7
+ (function(){
8
+
9
+ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
10
+ done = 0,
11
+ toString = Object.prototype.toString,
12
+ hasDuplicate = false,
13
+ baseHasDuplicate = true;
14
+
15
+ // Here we check if the JavaScript engine is using some sort of
16
+ // optimization where it does not always call our comparision
17
+ // function. If that is the case, discard the hasDuplicate value.
18
+ // Thus far that includes Google Chrome.
19
+ [0, 0].sort(function(){
20
+ baseHasDuplicate = false;
21
+ return 0;
22
+ });
23
+
24
+ var Sizzle = function(selector, context, results, seed) {
25
+ results = results || [];
26
+ context = context || document;
27
+
28
+ var origContext = context;
29
+
30
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
31
+ return [];
32
+ }
33
+
34
+ if ( !selector || typeof selector !== "string" ) {
35
+ return results;
36
+ }
37
+
38
+ var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
39
+ soFar = selector, ret, cur, pop, i;
40
+
41
+ // Reset the position of the chunker regexp (start from head)
42
+ do {
43
+ chunker.exec("");
44
+ m = chunker.exec(soFar);
45
+
46
+ if ( m ) {
47
+ soFar = m[3];
48
+
49
+ parts.push( m[1] );
50
+
51
+ if ( m[2] ) {
52
+ extra = m[3];
53
+ break;
54
+ }
55
+ }
56
+ } while ( m );
57
+
58
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
59
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
60
+ set = posProcess( parts[0] + parts[1], context );
61
+ } else {
62
+ set = Expr.relative[ parts[0] ] ?
63
+ [ context ] :
64
+ Sizzle( parts.shift(), context );
65
+
66
+ while ( parts.length ) {
67
+ selector = parts.shift();
68
+
69
+ if ( Expr.relative[ selector ] ) {
70
+ selector += parts.shift();
71
+ }
72
+
73
+ set = posProcess( selector, set );
74
+ }
75
+ }
76
+ } else {
77
+ // Take a shortcut and set the context if the root selector is an ID
78
+ // (but not if it'll be faster if the inner selector is an ID)
79
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
80
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
81
+ ret = Sizzle.find( parts.shift(), context, contextXML );
82
+ context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
83
+ }
84
+
85
+ if ( context ) {
86
+ ret = seed ?
87
+ { expr: parts.pop(), set: makeArray(seed) } :
88
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
89
+ set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
90
+
91
+ if ( parts.length > 0 ) {
92
+ checkSet = makeArray(set);
93
+ } else {
94
+ prune = false;
95
+ }
96
+
97
+ while ( parts.length ) {
98
+ cur = parts.pop();
99
+ pop = cur;
100
+
101
+ if ( !Expr.relative[ cur ] ) {
102
+ cur = "";
103
+ } else {
104
+ pop = parts.pop();
105
+ }
106
+
107
+ if ( pop == null ) {
108
+ pop = context;
109
+ }
110
+
111
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
112
+ }
113
+ } else {
114
+ checkSet = parts = [];
115
+ }
116
+ }
117
+
118
+ if ( !checkSet ) {
119
+ checkSet = set;
120
+ }
121
+
122
+ if ( !checkSet ) {
123
+ Sizzle.error( cur || selector );
124
+ }
125
+
126
+ if ( toString.call(checkSet) === "[object Array]" ) {
127
+ if ( !prune ) {
128
+ results.push.apply( results, checkSet );
129
+ } else if ( context && context.nodeType === 1 ) {
130
+ for ( i = 0; checkSet[i] != null; i++ ) {
131
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
132
+ results.push( set[i] );
133
+ }
134
+ }
135
+ } else {
136
+ for ( i = 0; checkSet[i] != null; i++ ) {
137
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
138
+ results.push( set[i] );
139
+ }
140
+ }
141
+ }
142
+ } else {
143
+ makeArray( checkSet, results );
144
+ }
145
+
146
+ if ( extra ) {
147
+ Sizzle( extra, origContext, results, seed );
148
+ Sizzle.uniqueSort( results );
149
+ }
150
+
151
+ return results;
152
+ };
153
+
154
+ Sizzle.uniqueSort = function(results){
155
+ if ( sortOrder ) {
156
+ hasDuplicate = baseHasDuplicate;
157
+ results.sort(sortOrder);
158
+
159
+ if ( hasDuplicate ) {
160
+ for ( var i = 1; i < results.length; i++ ) {
161
+ if ( results[i] === results[i-1] ) {
162
+ results.splice(i--, 1);
163
+ }
164
+ }
165
+ }
166
+ }
167
+
168
+ return results;
169
+ };
170
+
171
+ Sizzle.matches = function(expr, set){
172
+ return Sizzle(expr, null, null, set);
173
+ };
174
+
175
+ Sizzle.find = function(expr, context, isXML){
176
+ var set;
177
+
178
+ if ( !expr ) {
179
+ return [];
180
+ }
181
+
182
+ for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
183
+ var type = Expr.order[i], match;
184
+
185
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
186
+ var left = match[1];
187
+ match.splice(1,1);
188
+
189
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
190
+ match[1] = (match[1] || "").replace(/\\/g, "");
191
+ set = Expr.find[ type ]( match, context, isXML );
192
+ if ( set != null ) {
193
+ expr = expr.replace( Expr.match[ type ], "" );
194
+ break;
195
+ }
196
+ }
197
+ }
198
+ }
199
+
200
+ if ( !set ) {
201
+ set = context.getElementsByTagName("*");
202
+ }
203
+
204
+ return {set: set, expr: expr};
205
+ };
206
+
207
+ Sizzle.filter = function(expr, set, inplace, not){
208
+ var old = expr, result = [], curLoop = set, match, anyFound,
209
+ isXMLFilter = set && set[0] && isXML(set[0]);
210
+
211
+ while ( expr && set.length ) {
212
+ for ( var type in Expr.filter ) {
213
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
214
+ var filter = Expr.filter[ type ], found, item, left = match[1];
215
+ anyFound = false;
216
+
217
+ match.splice(1,1);
218
+
219
+ if ( left.substr( left.length - 1 ) === "\\" ) {
220
+ continue;
221
+ }
222
+
223
+ if ( curLoop === result ) {
224
+ result = [];
225
+ }
226
+
227
+ if ( Expr.preFilter[ type ] ) {
228
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
229
+
230
+ if ( !match ) {
231
+ anyFound = found = true;
232
+ } else if ( match === true ) {
233
+ continue;
234
+ }
235
+ }
236
+
237
+ if ( match ) {
238
+ for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
239
+ if ( item ) {
240
+ found = filter( item, match, i, curLoop );
241
+ var pass = not ^ !!found;
242
+
243
+ if ( inplace && found != null ) {
244
+ if ( pass ) {
245
+ anyFound = true;
246
+ } else {
247
+ curLoop[i] = false;
248
+ }
249
+ } else if ( pass ) {
250
+ result.push( item );
251
+ anyFound = true;
252
+ }
253
+ }
254
+ }
255
+ }
256
+
257
+ if ( found !== undefined ) {
258
+ if ( !inplace ) {
259
+ curLoop = result;
260
+ }
261
+
262
+ expr = expr.replace( Expr.match[ type ], "" );
263
+
264
+ if ( !anyFound ) {
265
+ return [];
266
+ }
267
+
268
+ break;
269
+ }
270
+ }
271
+ }
272
+
273
+ // Improper expression
274
+ if ( expr === old ) {
275
+ if ( anyFound == null ) {
276
+ Sizzle.error( expr );
277
+ } else {
278
+ break;
279
+ }
280
+ }
281
+
282
+ old = expr;
283
+ }
284
+
285
+ return curLoop;
286
+ };
287
+
288
+ Sizzle.error = function( msg ) {
289
+ throw "Syntax error, unrecognized expression: " + msg;
290
+ };
291
+
292
+ var Expr = Sizzle.selectors = {
293
+ order: [ "ID", "NAME", "TAG" ],
294
+ match: {
295
+ ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
296
+ CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
297
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
298
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
299
+ TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
300
+ CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
301
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
302
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
303
+ },
304
+ leftMatch: {},
305
+ attrMap: {
306
+ "class": "className",
307
+ "for": "htmlFor"
308
+ },
309
+ attrHandle: {
310
+ href: function(elem){
311
+ return elem.getAttribute("href");
312
+ }
313
+ },
314
+ relative: {
315
+ "+": function(checkSet, part){
316
+ var isPartStr = typeof part === "string",
317
+ isTag = isPartStr && !/\W/.test(part),
318
+ isPartStrNotTag = isPartStr && !isTag;
319
+
320
+ if ( isTag ) {
321
+ part = part.toLowerCase();
322
+ }
323
+
324
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
325
+ if ( (elem = checkSet[i]) ) {
326
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
327
+
328
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
329
+ elem || false :
330
+ elem === part;
331
+ }
332
+ }
333
+
334
+ if ( isPartStrNotTag ) {
335
+ Sizzle.filter( part, checkSet, true );
336
+ }
337
+ },
338
+ ">": function(checkSet, part){
339
+ var isPartStr = typeof part === "string",
340
+ elem, i = 0, l = checkSet.length;
341
+
342
+ if ( isPartStr && !/\W/.test(part) ) {
343
+ part = part.toLowerCase();
344
+
345
+ for ( ; i < l; i++ ) {
346
+ elem = checkSet[i];
347
+ if ( elem ) {
348
+ var parent = elem.parentNode;
349
+ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
350
+ }
351
+ }
352
+ } else {
353
+ for ( ; i < l; i++ ) {
354
+ elem = checkSet[i];
355
+ if ( elem ) {
356
+ checkSet[i] = isPartStr ?
357
+ elem.parentNode :
358
+ elem.parentNode === part;
359
+ }
360
+ }
361
+
362
+ if ( isPartStr ) {
363
+ Sizzle.filter( part, checkSet, true );
364
+ }
365
+ }
366
+ },
367
+ "": function(checkSet, part, isXML){
368
+ var doneName = done++, checkFn = dirCheck, nodeCheck;
369
+
370
+ if ( typeof part === "string" && !/\W/.test(part) ) {
371
+ part = part.toLowerCase();
372
+ nodeCheck = part;
373
+ checkFn = dirNodeCheck;
374
+ }
375
+
376
+ checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
377
+ },
378
+ "~": function(checkSet, part, isXML){
379
+ var doneName = done++, checkFn = dirCheck, nodeCheck;
380
+
381
+ if ( typeof part === "string" && !/\W/.test(part) ) {
382
+ part = part.toLowerCase();
383
+ nodeCheck = part;
384
+ checkFn = dirNodeCheck;
385
+ }
386
+
387
+ checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
388
+ }
389
+ },
390
+ find: {
391
+ ID: function(match, context, isXML){
392
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
393
+ var m = context.getElementById(match[1]);
394
+ return m ? [m] : [];
395
+ }
396
+ },
397
+ NAME: function(match, context){
398
+ if ( typeof context.getElementsByName !== "undefined" ) {
399
+ var ret = [], results = context.getElementsByName(match[1]);
400
+
401
+ for ( var i = 0, l = results.length; i < l; i++ ) {
402
+ if ( results[i].getAttribute("name") === match[1] ) {
403
+ ret.push( results[i] );
404
+ }
405
+ }
406
+
407
+ return ret.length === 0 ? null : ret;
408
+ }
409
+ },
410
+ TAG: function(match, context){
411
+ return context.getElementsByTagName(match[1]);
412
+ }
413
+ },
414
+ preFilter: {
415
+ CLASS: function(match, curLoop, inplace, result, not, isXML){
416
+ match = " " + match[1].replace(/\\/g, "") + " ";
417
+
418
+ if ( isXML ) {
419
+ return match;
420
+ }
421
+
422
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
423
+ if ( elem ) {
424
+ if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
425
+ if ( !inplace ) {
426
+ result.push( elem );
427
+ }
428
+ } else if ( inplace ) {
429
+ curLoop[i] = false;
430
+ }
431
+ }
432
+ }
433
+
434
+ return false;
435
+ },
436
+ ID: function(match){
437
+ return match[1].replace(/\\/g, "");
438
+ },
439
+ TAG: function(match, curLoop){
440
+ return match[1].toLowerCase();
441
+ },
442
+ CHILD: function(match){
443
+ if ( match[1] === "nth" ) {
444
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
445
+ var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
446
+ match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
447
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
448
+
449
+ // calculate the numbers (first)n+(last) including if they are negative
450
+ match[2] = (test[1] + (test[2] || 1)) - 0;
451
+ match[3] = test[3] - 0;
452
+ }
453
+
454
+ // TODO: Move to normal caching system
455
+ match[0] = done++;
456
+
457
+ return match;
458
+ },
459
+ ATTR: function(match, curLoop, inplace, result, not, isXML){
460
+ var name = match[1].replace(/\\/g, "");
461
+
462
+ if ( !isXML && Expr.attrMap[name] ) {
463
+ match[1] = Expr.attrMap[name];
464
+ }
465
+
466
+ if ( match[2] === "~=" ) {
467
+ match[4] = " " + match[4] + " ";
468
+ }
469
+
470
+ return match;
471
+ },
472
+ PSEUDO: function(match, curLoop, inplace, result, not){
473
+ if ( match[1] === "not" ) {
474
+ // If we're dealing with a complex expression, or a simple one
475
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
476
+ match[3] = Sizzle(match[3], null, null, curLoop);
477
+ } else {
478
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
479
+ if ( !inplace ) {
480
+ result.push.apply( result, ret );
481
+ }
482
+ return false;
483
+ }
484
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
485
+ return true;
486
+ }
487
+
488
+ return match;
489
+ },
490
+ POS: function(match){
491
+ match.unshift( true );
492
+ return match;
493
+ }
494
+ },
495
+ filters: {
496
+ enabled: function(elem){
497
+ return elem.disabled === false && elem.type !== "hidden";
498
+ },
499
+ disabled: function(elem){
500
+ return elem.disabled === true;
501
+ },
502
+ checked: function(elem){
503
+ return elem.checked === true;
504
+ },
505
+ selected: function(elem){
506
+ // Accessing this property makes selected-by-default
507
+ // options in Safari work properly
508
+ elem.parentNode.selectedIndex;
509
+ return elem.selected === true;
510
+ },
511
+ parent: function(elem){
512
+ return !!elem.firstChild;
513
+ },
514
+ empty: function(elem){
515
+ return !elem.firstChild;
516
+ },
517
+ has: function(elem, i, match){
518
+ return !!Sizzle( match[3], elem ).length;
519
+ },
520
+ header: function(elem){
521
+ return (/h\d/i).test( elem.nodeName );
522
+ },
523
+ text: function(elem){
524
+ return "text" === elem.type;
525
+ },
526
+ radio: function(elem){
527
+ return "radio" === elem.type;
528
+ },
529
+ checkbox: function(elem){
530
+ return "checkbox" === elem.type;
531
+ },
532
+ file: function(elem){
533
+ return "file" === elem.type;
534
+ },
535
+ password: function(elem){
536
+ return "password" === elem.type;
537
+ },
538
+ submit: function(elem){
539
+ return "submit" === elem.type;
540
+ },
541
+ image: function(elem){
542
+ return "image" === elem.type;
543
+ },
544
+ reset: function(elem){
545
+ return "reset" === elem.type;
546
+ },
547
+ button: function(elem){
548
+ return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
549
+ },
550
+ input: function(elem){
551
+ return (/input|select|textarea|button/i).test(elem.nodeName);
552
+ }
553
+ },
554
+ setFilters: {
555
+ first: function(elem, i){
556
+ return i === 0;
557
+ },
558
+ last: function(elem, i, match, array){
559
+ return i === array.length - 1;
560
+ },
561
+ even: function(elem, i){
562
+ return i % 2 === 0;
563
+ },
564
+ odd: function(elem, i){
565
+ return i % 2 === 1;
566
+ },
567
+ lt: function(elem, i, match){
568
+ return i < match[3] - 0;
569
+ },
570
+ gt: function(elem, i, match){
571
+ return i > match[3] - 0;
572
+ },
573
+ nth: function(elem, i, match){
574
+ return match[3] - 0 === i;
575
+ },
576
+ eq: function(elem, i, match){
577
+ return match[3] - 0 === i;
578
+ }
579
+ },
580
+ filter: {
581
+ PSEUDO: function(elem, match, i, array){
582
+ var name = match[1], filter = Expr.filters[ name ];
583
+
584
+ if ( filter ) {
585
+ return filter( elem, i, match, array );
586
+ } else if ( name === "contains" ) {
587
+ return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
588
+ } else if ( name === "not" ) {
589
+ var not = match[3];
590
+
591
+ for ( var j = 0, l = not.length; j < l; j++ ) {
592
+ if ( not[j] === elem ) {
593
+ return false;
594
+ }
595
+ }
596
+
597
+ return true;
598
+ } else {
599
+ Sizzle.error( "Syntax error, unrecognized expression: " + name );
600
+ }
601
+ },
602
+ CHILD: function(elem, match){
603
+ var type = match[1], node = elem;
604
+ switch (type) {
605
+ case 'only':
606
+ case 'first':
607
+ while ( (node = node.previousSibling) ) {
608
+ if ( node.nodeType === 1 ) {
609
+ return false;
610
+ }
611
+ }
612
+ if ( type === "first" ) {
613
+ return true;
614
+ }
615
+ node = elem;
616
+ case 'last':
617
+ while ( (node = node.nextSibling) ) {
618
+ if ( node.nodeType === 1 ) {
619
+ return false;
620
+ }
621
+ }
622
+ return true;
623
+ case 'nth':
624
+ var first = match[2], last = match[3];
625
+
626
+ if ( first === 1 && last === 0 ) {
627
+ return true;
628
+ }
629
+
630
+ var doneName = match[0],
631
+ parent = elem.parentNode;
632
+
633
+ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
634
+ var count = 0;
635
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
636
+ if ( node.nodeType === 1 ) {
637
+ node.nodeIndex = ++count;
638
+ }
639
+ }
640
+ parent.sizcache = doneName;
641
+ }
642
+
643
+ var diff = elem.nodeIndex - last;
644
+ if ( first === 0 ) {
645
+ return diff === 0;
646
+ } else {
647
+ return ( diff % first === 0 && diff / first >= 0 );
648
+ }
649
+ }
650
+ },
651
+ ID: function(elem, match){
652
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
653
+ },
654
+ TAG: function(elem, match){
655
+ return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
656
+ },
657
+ CLASS: function(elem, match){
658
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
659
+ .indexOf( match ) > -1;
660
+ },
661
+ ATTR: function(elem, match){
662
+ var name = match[1],
663
+ result = Expr.attrHandle[ name ] ?
664
+ Expr.attrHandle[ name ]( elem ) :
665
+ elem[ name ] != null ?
666
+ elem[ name ] :
667
+ elem.getAttribute( name ),
668
+ value = result + "",
669
+ type = match[2],
670
+ check = match[4];
671
+
672
+ return result == null ?
673
+ type === "!=" :
674
+ type === "=" ?
675
+ value === check :
676
+ type === "*=" ?
677
+ value.indexOf(check) >= 0 :
678
+ type === "~=" ?
679
+ (" " + value + " ").indexOf(check) >= 0 :
680
+ !check ?
681
+ value && result !== false :
682
+ type === "!=" ?
683
+ value !== check :
684
+ type === "^=" ?
685
+ value.indexOf(check) === 0 :
686
+ type === "$=" ?
687
+ value.substr(value.length - check.length) === check :
688
+ type === "|=" ?
689
+ value === check || value.substr(0, check.length + 1) === check + "-" :
690
+ false;
691
+ },
692
+ POS: function(elem, match, i, array){
693
+ var name = match[2], filter = Expr.setFilters[ name ];
694
+
695
+ if ( filter ) {
696
+ return filter( elem, i, match, array );
697
+ }
698
+ }
699
+ }
700
+ };
701
+
702
+ var origPOS = Expr.match.POS,
703
+ fescape = function(all, num){
704
+ return "\\" + (num - 0 + 1);
705
+ };
706
+
707
+ for ( var type in Expr.match ) {
708
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
709
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
710
+ }
711
+
712
+ var makeArray = function(array, results) {
713
+ array = Array.prototype.slice.call( array, 0 );
714
+
715
+ if ( results ) {
716
+ results.push.apply( results, array );
717
+ return results;
718
+ }
719
+
720
+ return array;
721
+ };
722
+
723
+ // Perform a simple check to determine if the browser is capable of
724
+ // converting a NodeList to an array using builtin methods.
725
+ // Also verifies that the returned array holds DOM nodes
726
+ // (which is not the case in the Blackberry browser)
727
+ try {
728
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
729
+
730
+ // Provide a fallback method if it does not work
731
+ } catch(e){
732
+ makeArray = function(array, results) {
733
+ var ret = results || [], i = 0;
734
+
735
+ if ( toString.call(array) === "[object Array]" ) {
736
+ Array.prototype.push.apply( ret, array );
737
+ } else {
738
+ if ( typeof array.length === "number" ) {
739
+ for ( var l = array.length; i < l; i++ ) {
740
+ ret.push( array[i] );
741
+ }
742
+ } else {
743
+ for ( ; array[i]; i++ ) {
744
+ ret.push( array[i] );
745
+ }
746
+ }
747
+ }
748
+
749
+ return ret;
750
+ };
751
+ }
752
+
753
+ var sortOrder;
754
+
755
+ if ( document.documentElement.compareDocumentPosition ) {
756
+ sortOrder = function( a, b ) {
757
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
758
+ if ( a == b ) {
759
+ hasDuplicate = true;
760
+ }
761
+ return a.compareDocumentPosition ? -1 : 1;
762
+ }
763
+
764
+ var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
765
+ if ( ret === 0 ) {
766
+ hasDuplicate = true;
767
+ }
768
+ return ret;
769
+ };
770
+ } else if ( "sourceIndex" in document.documentElement ) {
771
+ sortOrder = function( a, b ) {
772
+ if ( !a.sourceIndex || !b.sourceIndex ) {
773
+ if ( a == b ) {
774
+ hasDuplicate = true;
775
+ }
776
+ return a.sourceIndex ? -1 : 1;
777
+ }
778
+
779
+ var ret = a.sourceIndex - b.sourceIndex;
780
+ if ( ret === 0 ) {
781
+ hasDuplicate = true;
782
+ }
783
+ return ret;
784
+ };
785
+ } else if ( document.createRange ) {
786
+ sortOrder = function( a, b ) {
787
+ if ( !a.ownerDocument || !b.ownerDocument ) {
788
+ if ( a == b ) {
789
+ hasDuplicate = true;
790
+ }
791
+ return a.ownerDocument ? -1 : 1;
792
+ }
793
+
794
+ var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
795
+ aRange.setStart(a, 0);
796
+ aRange.setEnd(a, 0);
797
+ bRange.setStart(b, 0);
798
+ bRange.setEnd(b, 0);
799
+ var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
800
+ if ( ret === 0 ) {
801
+ hasDuplicate = true;
802
+ }
803
+ return ret;
804
+ };
805
+ }
806
+
807
+ // Utility function for retreiving the text value of an array of DOM nodes
808
+ function getText( elems ) {
809
+ var ret = "", elem;
810
+
811
+ for ( var i = 0; elems[i]; i++ ) {
812
+ elem = elems[i];
813
+
814
+ // Get the text from text nodes and CDATA nodes
815
+ if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
816
+ ret += elem.nodeValue;
817
+
818
+ // Traverse everything else, except comment nodes
819
+ } else if ( elem.nodeType !== 8 ) {
820
+ ret += getText( elem.childNodes );
821
+ }
822
+ }
823
+
824
+ return ret;
825
+ }
826
+
827
+ // Check to see if the browser returns elements by name when
828
+ // querying by getElementById (and provide a workaround)
829
+ (function(){
830
+ // We're going to inject a fake input element with a specified name
831
+ var form = document.createElement("div"),
832
+ id = "script" + (new Date()).getTime();
833
+ form.innerHTML = "<a name='" + id + "'/>";
834
+
835
+ // Inject it into the root element, check its status, and remove it quickly
836
+ var root = document.documentElement;
837
+ root.insertBefore( form, root.firstChild );
838
+
839
+ // The workaround has to do additional checks after a getElementById
840
+ // Which slows things down for other browsers (hence the branching)
841
+ if ( document.getElementById( id ) ) {
842
+ Expr.find.ID = function(match, context, isXML){
843
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
844
+ var m = context.getElementById(match[1]);
845
+ return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
846
+ }
847
+ };
848
+
849
+ Expr.filter.ID = function(elem, match){
850
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
851
+ return elem.nodeType === 1 && node && node.nodeValue === match;
852
+ };
853
+ }
854
+
855
+ root.removeChild( form );
856
+ root = form = null; // release memory in IE
857
+ })();
858
+
859
+ (function(){
860
+ // Check to see if the browser returns only elements
861
+ // when doing getElementsByTagName("*")
862
+
863
+ // Create a fake element
864
+ var div = document.createElement("div");
865
+ div.appendChild( document.createComment("") );
866
+
867
+ // Make sure no comments are found
868
+ if ( div.getElementsByTagName("*").length > 0 ) {
869
+ Expr.find.TAG = function(match, context){
870
+ var results = context.getElementsByTagName(match[1]);
871
+
872
+ // Filter out possible comments
873
+ if ( match[1] === "*" ) {
874
+ var tmp = [];
875
+
876
+ for ( var i = 0; results[i]; i++ ) {
877
+ if ( results[i].nodeType === 1 ) {
878
+ tmp.push( results[i] );
879
+ }
880
+ }
881
+
882
+ results = tmp;
883
+ }
884
+
885
+ return results;
886
+ };
887
+ }
888
+
889
+ // Check to see if an attribute returns normalized href attributes
890
+ div.innerHTML = "<a href='#'></a>";
891
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
892
+ div.firstChild.getAttribute("href") !== "#" ) {
893
+ Expr.attrHandle.href = function(elem){
894
+ return elem.getAttribute("href", 2);
895
+ };
896
+ }
897
+
898
+ div = null; // release memory in IE
899
+ })();
900
+
901
+ if ( document.querySelectorAll ) {
902
+ (function(){
903
+ var oldSizzle = Sizzle, div = document.createElement("div");
904
+ div.innerHTML = "<p class='TEST'></p>";
905
+
906
+ // Safari can't handle uppercase or unicode characters when
907
+ // in quirks mode.
908
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
909
+ return;
910
+ }
911
+
912
+ Sizzle = function(query, context, extra, seed){
913
+ context = context || document;
914
+
915
+ // Only use querySelectorAll on non-XML documents
916
+ // (ID selectors don't work in non-HTML documents)
917
+ if ( !seed && context.nodeType === 9 && !isXML(context) ) {
918
+ try {
919
+ return makeArray( context.querySelectorAll(query), extra );
920
+ } catch(e){}
921
+ }
922
+
923
+ return oldSizzle(query, context, extra, seed);
924
+ };
925
+
926
+ for ( var prop in oldSizzle ) {
927
+ Sizzle[ prop ] = oldSizzle[ prop ];
928
+ }
929
+
930
+ div = null; // release memory in IE
931
+ })();
932
+ }
933
+
934
+ (function(){
935
+ var div = document.createElement("div");
936
+
937
+ div.innerHTML = "<div class='test e'></div><div class='test'></div>";
938
+
939
+ // Opera can't find a second classname (in 9.6)
940
+ // Also, make sure that getElementsByClassName actually exists
941
+ if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
942
+ return;
943
+ }
944
+
945
+ // Safari caches class attributes, doesn't catch changes (in 3.2)
946
+ div.lastChild.className = "e";
947
+
948
+ if ( div.getElementsByClassName("e").length === 1 ) {
949
+ return;
950
+ }
951
+
952
+ Expr.order.splice(1, 0, "CLASS");
953
+ Expr.find.CLASS = function(match, context, isXML) {
954
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
955
+ return context.getElementsByClassName(match[1]);
956
+ }
957
+ };
958
+
959
+ div = null; // release memory in IE
960
+ })();
961
+
962
+ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
963
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
964
+ var elem = checkSet[i];
965
+ if ( elem ) {
966
+ elem = elem[dir];
967
+ var match = false;
968
+
969
+ while ( elem ) {
970
+ if ( elem.sizcache === doneName ) {
971
+ match = checkSet[elem.sizset];
972
+ break;
973
+ }
974
+
975
+ if ( elem.nodeType === 1 && !isXML ){
976
+ elem.sizcache = doneName;
977
+ elem.sizset = i;
978
+ }
979
+
980
+ if ( elem.nodeName.toLowerCase() === cur ) {
981
+ match = elem;
982
+ break;
983
+ }
984
+
985
+ elem = elem[dir];
986
+ }
987
+
988
+ checkSet[i] = match;
989
+ }
990
+ }
991
+ }
992
+
993
+ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
994
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
995
+ var elem = checkSet[i];
996
+ if ( elem ) {
997
+ elem = elem[dir];
998
+ var match = false;
999
+
1000
+ while ( elem ) {
1001
+ if ( elem.sizcache === doneName ) {
1002
+ match = checkSet[elem.sizset];
1003
+ break;
1004
+ }
1005
+
1006
+ if ( elem.nodeType === 1 ) {
1007
+ if ( !isXML ) {
1008
+ elem.sizcache = doneName;
1009
+ elem.sizset = i;
1010
+ }
1011
+ if ( typeof cur !== "string" ) {
1012
+ if ( elem === cur ) {
1013
+ match = true;
1014
+ break;
1015
+ }
1016
+
1017
+ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
1018
+ match = elem;
1019
+ break;
1020
+ }
1021
+ }
1022
+
1023
+ elem = elem[dir];
1024
+ }
1025
+
1026
+ checkSet[i] = match;
1027
+ }
1028
+ }
1029
+ }
1030
+
1031
+ var contains = document.compareDocumentPosition ? function(a, b){
1032
+ return !!(a.compareDocumentPosition(b) & 16);
1033
+ } : function(a, b){
1034
+ return a !== b && (a.contains ? a.contains(b) : true);
1035
+ };
1036
+
1037
+ var isXML = function(elem){
1038
+ // documentElement is verified for cases where it doesn't yet exist
1039
+ // (such as loading iframes in IE - #4833)
1040
+ var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
1041
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
1042
+ };
1043
+
1044
+ var posProcess = function(selector, context){
1045
+ var tmpSet = [], later = "", match,
1046
+ root = context.nodeType ? [context] : context;
1047
+
1048
+ // Position selectors must be done after the filter
1049
+ // And so must :not(positional) so we move all PSEUDOs to the end
1050
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
1051
+ later += match[0];
1052
+ selector = selector.replace( Expr.match.PSEUDO, "" );
1053
+ }
1054
+
1055
+ selector = Expr.relative[selector] ? selector + "*" : selector;
1056
+
1057
+ for ( var i = 0, l = root.length; i < l; i++ ) {
1058
+ Sizzle( selector, root[i], tmpSet );
1059
+ }
1060
+
1061
+ return Sizzle.filter( later, tmpSet );
1062
+ };
1063
+
1064
+ // EXPOSE
1065
+
1066
+ window.Sizzle = Sizzle;
1067
+
1068
+ })();