envjs19 0.3.8.20101029121421

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 (279) hide show
  1. data/.jslintrbrc +30 -0
  2. data/.project +17 -0
  3. data/CHANGELOG.rdoc +57 -0
  4. data/DTD/xhtml-lat1.ent +196 -0
  5. data/DTD/xhtml-special.ent +80 -0
  6. data/DTD/xhtml-symbol.ent +237 -0
  7. data/DTD/xhtml.soc +14 -0
  8. data/DTD/xhtml1-frameset.dtd +1235 -0
  9. data/DTD/xhtml1-strict.dtd +978 -0
  10. data/DTD/xhtml1-transitional.dtd +1201 -0
  11. data/DTD/xhtml1.dcl +192 -0
  12. data/Makefile +7 -0
  13. data/Manifest.txt +280 -0
  14. data/README.rdoc +65 -0
  15. data/Rakefile +196 -0
  16. data/Wakefile +11 -0
  17. data/bin/envjsrb +257 -0
  18. data/build.properties +9 -0
  19. data/build.xml +247 -0
  20. data/gm/jquery.js +6002 -0
  21. data/gm/mainx.js +2648 -0
  22. data/gm/sensx.js +135 -0
  23. data/gm/t.js +6 -0
  24. data/gm/x.html +76 -0
  25. data/htmlparser/BrowserTreeBuilder.java +456 -0
  26. data/htmlparser/README +34 -0
  27. data/htmlparser/build.sh +38 -0
  28. data/jsl/jsl +0 -0
  29. data/jsl/jsl.default.conf +129 -0
  30. data/jsl/jsl.exe +0 -0
  31. data/lib/envjs.rb +35 -0
  32. data/lib/envjs/event_loop.js +206 -0
  33. data/lib/envjs/net.rb +3 -0
  34. data/lib/envjs/net/cgi.rb +94 -0
  35. data/lib/envjs/net/file.rb +69 -0
  36. data/lib/envjs/options.rb +11 -0
  37. data/lib/envjs/runtime.rb +346 -0
  38. data/lib/envjs/tempfile.rb +24 -0
  39. data/licenses/GPL-LICENSE.txt +278 -0
  40. data/licenses/MIT-LICENSE.txt +20 -0
  41. data/src/base64.js +80 -0
  42. data/src/build.js +6 -0
  43. data/src/cruft/bad.html +24 -0
  44. data/src/cruft/dom.js +606 -0
  45. data/src/cruft/element.js +297 -0
  46. data/src/cruft/good.html +30 -0
  47. data/src/cruft/good.js +32 -0
  48. data/src/cruft/internal.js +81 -0
  49. data/src/cruft/parser.js +458 -0
  50. data/src/css/properties.js +293 -0
  51. data/src/css/rule.js +22 -0
  52. data/src/css/sizzle.js +717 -0
  53. data/src/css/stylesheet.js +52 -0
  54. data/src/dom/attr.js +55 -0
  55. data/src/dom/cdatasection.js +31 -0
  56. data/src/dom/characterdata.js +119 -0
  57. data/src/dom/comment.js +30 -0
  58. data/src/dom/doctype.js +9 -0
  59. data/src/dom/document.js +1023 -0
  60. data/src/dom/dom.js +134 -0
  61. data/src/dom/element.js +217 -0
  62. data/src/dom/entities.js +273 -0
  63. data/src/dom/exception.js +28 -0
  64. data/src/dom/fragment.js +37 -0
  65. data/src/dom/implementation.js +140 -0
  66. data/src/dom/instruction.js +51 -0
  67. data/src/dom/namednodemap.js +374 -0
  68. data/src/dom/namespace.js +50 -0
  69. data/src/dom/node.js +618 -0
  70. data/src/dom/nodelist.js +195 -0
  71. data/src/dom/parser.js +1207 -0
  72. data/src/dom/text.js +73 -0
  73. data/src/event/event.js +47 -0
  74. data/src/event/mouseevent.js +4 -0
  75. data/src/event/uievent.js +8 -0
  76. data/src/html/a.js +110 -0
  77. data/src/html/anchor.js +80 -0
  78. data/src/html/area.js +57 -0
  79. data/src/html/base.js +26 -0
  80. data/src/html/blockquote-q.js +19 -0
  81. data/src/html/body.js +19 -0
  82. data/src/html/button.js +21 -0
  83. data/src/html/canvas.js +14 -0
  84. data/src/html/col-colgroup.js +49 -0
  85. data/src/html/collection.js +72 -0
  86. data/src/html/cookie.js +153 -0
  87. data/src/html/del-ins.js +25 -0
  88. data/src/html/div.js +28 -0
  89. data/src/html/document.js +364 -0
  90. data/src/html/element.js +382 -0
  91. data/src/html/fieldset.js +19 -0
  92. data/src/html/form.js +484 -0
  93. data/src/html/frame.js +89 -0
  94. data/src/html/frameset.js +25 -0
  95. data/src/html/head.js +44 -0
  96. data/src/html/html.js +0 -0
  97. data/src/html/htmlparser.js +340 -0
  98. data/src/html/iframe.js +26 -0
  99. data/src/html/image.js +0 -0
  100. data/src/html/img.js +62 -0
  101. data/src/html/input-elements.js +307 -0
  102. data/src/html/input.js +65 -0
  103. data/src/html/label.js +26 -0
  104. data/src/html/legend.js +19 -0
  105. data/src/html/link.js +82 -0
  106. data/src/html/map.js +22 -0
  107. data/src/html/meta.js +37 -0
  108. data/src/html/object.js +89 -0
  109. data/src/html/optgroup.js +25 -0
  110. data/src/html/option.js +103 -0
  111. data/src/html/param.js +38 -0
  112. data/src/html/script.js +122 -0
  113. data/src/html/select.js +132 -0
  114. data/src/html/style.js +31 -0
  115. data/src/html/table.js +199 -0
  116. data/src/html/tbody-thead-tfoot.js +92 -0
  117. data/src/html/td-th.js +18 -0
  118. data/src/html/textarea.js +31 -0
  119. data/src/html/title.js +20 -0
  120. data/src/html/tr.js +114 -0
  121. data/src/intro.js +141 -0
  122. data/src/outro.js +70 -0
  123. data/src/parser/html5.detailed.js +10762 -0
  124. data/src/parser/html5.min.js +503 -0
  125. data/src/parser/html5.pretty.js +10815 -0
  126. data/src/parser/intro.js +42 -0
  127. data/src/parser/outro.js +9 -0
  128. data/src/platform/core.js +323 -0
  129. data/src/platform/johnson.js +484 -0
  130. data/src/platform/rhino.js +327 -0
  131. data/src/platform/static/intro.js +41 -0
  132. data/src/platform/static/outro.js +30 -0
  133. data/src/profile/aop.js +238 -0
  134. data/src/profile/profile.js +402 -0
  135. data/src/serializer/xml.js +21 -0
  136. data/src/svg/animatedstring.js +25 -0
  137. data/src/svg/document.js +25 -0
  138. data/src/svg/element.js +22 -0
  139. data/src/svg/locatable.js +17 -0
  140. data/src/svg/rect.js +18 -0
  141. data/src/svg/rectelement.js +24 -0
  142. data/src/svg/stylable.js +49 -0
  143. data/src/svg/svgelement.js +22 -0
  144. data/src/svg/transformable.js +15 -0
  145. data/src/window/css.js +15 -0
  146. data/src/window/dialog.js +16 -0
  147. data/src/window/document.js +28 -0
  148. data/src/window/event.js +265 -0
  149. data/src/window/history.js +62 -0
  150. data/src/window/location.js +156 -0
  151. data/src/window/navigator.js +48 -0
  152. data/src/window/screen.js +53 -0
  153. data/src/window/timer.js +21 -0
  154. data/src/window/window.js +284 -0
  155. data/src/window/xhr.js +135 -0
  156. data/src/xpath/expression.js +49 -0
  157. data/src/xpath/implementation.js +2505 -0
  158. data/src/xpath/result.js +67 -0
  159. data/src/xpath/util.js +551 -0
  160. data/src/xpath/xmltoken.js +149 -0
  161. data/src/xslt/COPYING +34 -0
  162. data/src/xslt/ajaxslt-0.8.1/AUTHORS +1 -0
  163. data/src/xslt/ajaxslt-0.8.1/ChangeLog +136 -0
  164. data/src/xslt/ajaxslt-0.8.1/Makefile +49 -0
  165. data/src/xslt/ajaxslt-0.8.1/README +102 -0
  166. data/src/xslt/ajaxslt-0.8.1/TODO +15 -0
  167. data/src/xslt/ajaxslt-0.8.1/dom.js +566 -0
  168. data/src/xslt/ajaxslt-0.8.1/dom_unittest.html +24 -0
  169. data/src/xslt/ajaxslt-0.8.1/dom_unittest.js +131 -0
  170. data/src/xslt/ajaxslt-0.8.1/simplelog.js +79 -0
  171. data/src/xslt/ajaxslt-0.8.1/test/xpath.html +18 -0
  172. data/src/xslt/ajaxslt-0.8.1/test/xpath_script.js +45 -0
  173. data/src/xslt/ajaxslt-0.8.1/test/xslt.html +58 -0
  174. data/src/xslt/ajaxslt-0.8.1/test/xslt_script.js +33 -0
  175. data/src/xslt/ajaxslt-0.8.1/unittestsuite.html +26 -0
  176. data/src/xslt/ajaxslt-0.8.1/xmltoken.js +149 -0
  177. data/src/xslt/ajaxslt-0.8.1/xmltoken_unittest.html +18 -0
  178. data/src/xslt/ajaxslt-0.8.1/xmltoken_unittest.js +811 -0
  179. data/src/xslt/ajaxslt-0.8.1/xpath_unittest.html +39 -0
  180. data/src/xslt/ajaxslt-0.8.1/xpath_unittest.js +557 -0
  181. data/src/xslt/ajaxslt-0.8.1/xpathdebug.js +234 -0
  182. data/src/xslt/ajaxslt-0.8.1/xslt_unittest.html +138 -0
  183. data/src/xslt/ajaxslt-0.8.1/xslt_unittest.js +68 -0
  184. data/src/xslt/implementation.js +625 -0
  185. data/src/xslt/processor.js +37 -0
  186. data/src/xslt/util.js +449 -0
  187. data/test/base64.js +80 -0
  188. data/test/call-load-test.js +15 -0
  189. data/test/data.js +45 -0
  190. data/test/debug.js +53 -0
  191. data/test/firebug/errorIcon.png +0 -0
  192. data/test/firebug/firebug.css +209 -0
  193. data/test/firebug/firebug.html +23 -0
  194. data/test/firebug/firebug.js +672 -0
  195. data/test/firebug/firebugx.js +10 -0
  196. data/test/firebug/infoIcon.png +0 -0
  197. data/test/firebug/warningIcon.png +0 -0
  198. data/test/fixtures/html/events.html +171 -0
  199. data/test/fixtures/html/iframe1.html +46 -0
  200. data/test/fixtures/html/iframe1a.html +46 -0
  201. data/test/fixtures/html/iframe2.html +45 -0
  202. data/test/fixtures/html/iframe3.html +28 -0
  203. data/test/fixtures/html/iframeN.html +57 -0
  204. data/test/fixtures/html/malformed.html +181 -0
  205. data/test/fixtures/html/scope.html +81 -0
  206. data/test/fixtures/html/trivial.html +19 -0
  207. data/test/fixtures/html/with_js.html +26 -0
  208. data/test/fixtures/images/icon-blue.png +0 -0
  209. data/test/fixtures/js/external_script.js +1 -0
  210. data/test/fixtures/js/script.js +1 -0
  211. data/test/fixtures/js/script_error.js +2 -0
  212. data/test/foo.html +8 -0
  213. data/test/foo.js +40 -0
  214. data/test/html/events.html +171 -0
  215. data/test/html/iframe1.html +46 -0
  216. data/test/html/iframe1a.html +46 -0
  217. data/test/html/iframe2.html +45 -0
  218. data/test/html/iframe3.html +30 -0
  219. data/test/html/iframeN.html +57 -0
  220. data/test/html/malformed.html +181 -0
  221. data/test/html/scope.html +87 -0
  222. data/test/html/script.js +1 -0
  223. data/test/html/trivial.html +19 -0
  224. data/test/html/with_js.html +26 -0
  225. data/test/index.html +328 -0
  226. data/test/java-prototype.js +9 -0
  227. data/test/jquery.js +6002 -0
  228. data/test/primary-tests.js +26 -0
  229. data/test/prototype-test.js +13 -0
  230. data/test/qunit.js +61 -0
  231. data/test/qunit/qunit/qunit.css +17 -0
  232. data/test/qunit/qunit/qunit.js +997 -0
  233. data/test/scope.html +19 -0
  234. data/test/scope.rb +24 -0
  235. data/test/smp/dmathieu/index.html +8 -0
  236. data/test/specs/dist/env.spec.js +1534 -0
  237. data/test/specs/envjs.spec.css +46 -0
  238. data/test/specs/parser/html.js +31 -0
  239. data/test/specs/parser/spec.html +40 -0
  240. data/test/specs/parser/xml.js +31 -0
  241. data/test/specs/qunit.bdd.js +210 -0
  242. data/test/specs/qunit.css +17 -0
  243. data/test/specs/qunit.js +997 -0
  244. data/test/specs/template/spec-0.js +31 -0
  245. data/test/specs/template/spec-1.js +31 -0
  246. data/test/specs/template/spec.html +40 -0
  247. data/test/specs/window/css.js +23 -0
  248. data/test/specs/window/dialog.js +25 -0
  249. data/test/specs/window/document.js +23 -0
  250. data/test/specs/window/event.js +25 -0
  251. data/test/specs/window/history.js +34 -0
  252. data/test/specs/window/location.js +34 -0
  253. data/test/specs/window/navigator.js +71 -0
  254. data/test/specs/window/screen.js +42 -0
  255. data/test/specs/window/spec.html +48 -0
  256. data/test/specs/window/timer.js +26 -0
  257. data/test/specs/window/window.js +53 -0
  258. data/test/specs/xhr/spec.html +47 -0
  259. data/test/specs/xhr/xhr.js +31 -0
  260. data/test/test.js +10 -0
  261. data/test/unit/dom.js +44 -0
  262. data/test/unit/elementmembers.js +92 -0
  263. data/test/unit/events.js +195 -0
  264. data/test/unit/fixtures/external_script.js +1 -0
  265. data/test/unit/form.js +40 -0
  266. data/test/unit/iframe.js +234 -0
  267. data/test/unit/insertion.js +23 -0
  268. data/test/unit/multi-window.js +212 -0
  269. data/test/unit/nu.validator.js +34 -0
  270. data/test/unit/onload.js +90 -0
  271. data/test/unit/parser.js +122 -0
  272. data/test/unit/prototypecompat.js +22 -0
  273. data/test/unit/proxy.js +6 -0
  274. data/test/unit/scope.js +209 -0
  275. data/test/unit/timer.js +115 -0
  276. data/test/unit/window.js +57 -0
  277. data/test/x.js +1 -0
  278. data/test/y.js +1 -0
  279. metadata +367 -0
@@ -0,0 +1,15 @@
1
+ -*- mode: text -*-
2
+
3
+ AJAXSLT TODO
4
+
5
+ - complete README: COMPLIANCE section
6
+
7
+ - add HOWTO section to README
8
+
9
+ - implement the W3C DOM binding for XPath and XSLT
10
+
11
+ - implement XPath extension functions conforming to the specification
12
+
13
+ - verify XPath support in IE
14
+
15
+ - Add more XSLT tests.
@@ -0,0 +1,566 @@
1
+ // Copyright 2005 Google Inc.
2
+ // All Rights Reserved
3
+ //
4
+ // Author: Steffen Meschkat <mesch@google.com>
5
+ //
6
+ // An XML parse and a minimal DOM implementation that just supportes
7
+ // the subset of the W3C DOM that is used in the XSLT implementation.
8
+
9
+ // NOTE: The split() method in IE omits empty result strings. This is
10
+ // utterly annoying. So we don't use it here.
11
+
12
+ // Resolve entities in XML text fragments. According to the DOM
13
+ // specification, the DOM is supposed to resolve entity references at
14
+ // the API level. I.e. no entity references are passed through the
15
+ // API. See "Entities and the DOM core", p.12, DOM 2 Core
16
+ // Spec. However, different browsers actually pass very different
17
+ // values at the API. See <http://mesch.nyc/test-xml-quote>.
18
+ function xmlResolveEntities(s) {
19
+
20
+ var parts = stringSplit(s, '&');
21
+
22
+ var ret = parts[0];
23
+ for (var i = 1; i < parts.length; ++i) {
24
+ var rp = parts[i].indexOf(';');
25
+ if (rp == -1) {
26
+ // no entity reference: just a & but no ;
27
+ ret += parts[i];
28
+ continue;
29
+ }
30
+
31
+ var entityName = parts[i].substring(0, rp);
32
+ var remainderText = parts[i].substring(rp + 1);
33
+
34
+ var ch;
35
+ switch (entityName) {
36
+ case 'lt':
37
+ ch = '<';
38
+ break;
39
+ case 'gt':
40
+ ch = '>';
41
+ break;
42
+ case 'amp':
43
+ ch = '&';
44
+ break;
45
+ case 'quot':
46
+ ch = '"';
47
+ break;
48
+ case 'apos':
49
+ ch = '\'';
50
+ break;
51
+ case 'nbsp':
52
+ ch = String.fromCharCode(160);
53
+ break;
54
+ default:
55
+ // Cool trick: let the DOM do the entity decoding. We assign
56
+ // the entity text through non-W3C DOM properties and read it
57
+ // through the W3C DOM. W3C DOM access is specified to resolve
58
+ // entities.
59
+ var span = domCreateElement(window.document, 'span');
60
+ span.innerHTML = '&' + entityName + '; ';
61
+ ch = span.childNodes[0].nodeValue.charAt(0);
62
+ }
63
+ ret += ch + remainderText;
64
+ }
65
+
66
+ return ret;
67
+ }
68
+
69
+ var XML10_TAGNAME_REGEXP = new RegExp('^(' + XML10_NAME + ')');
70
+ var XML10_ATTRIBUTE_REGEXP = new RegExp(XML10_ATTRIBUTE, 'g');
71
+
72
+ var XML11_TAGNAME_REGEXP = new RegExp('^(' + XML11_NAME + ')');
73
+ var XML11_ATTRIBUTE_REGEXP = new RegExp(XML11_ATTRIBUTE, 'g');
74
+
75
+ // Parses the given XML string with our custom, JavaScript XML parser. Written
76
+ // by Steffen Meschkat (mesch@google.com).
77
+ function xmlParse(xml) {
78
+ var regex_empty = /\/$/;
79
+
80
+ var regex_tagname;
81
+ var regex_attribute;
82
+ if (xml.match(/^<\?xml/)) {
83
+ // When an XML document begins with an XML declaration
84
+ // VersionInfo must appear.
85
+ if (xml.search(new RegExp(XML10_VERSION_INFO)) == 5) {
86
+ regex_tagname = XML10_TAGNAME_REGEXP;
87
+ regex_attribute = XML10_ATTRIBUTE_REGEXP;
88
+ } else if (xml.search(new RegExp(XML11_VERSION_INFO)) == 5) {
89
+ regex_tagname = XML11_TAGNAME_REGEXP;
90
+ regex_attribute = XML11_ATTRIBUTE_REGEXP;
91
+ } else {
92
+ // VersionInfo is missing, or unknown version number.
93
+ // TODO : Fallback to XML 1.0 or XML 1.1, or just return null?
94
+ alert('VersionInfo is missing, or unknown version number.');
95
+ }
96
+ } else {
97
+ // When an XML declaration is missing it's an XML 1.0 document.
98
+ regex_tagname = XML10_TAGNAME_REGEXP;
99
+ regex_attribute = XML10_ATTRIBUTE_REGEXP;
100
+ }
101
+
102
+ var xmldoc = new XDocument();
103
+ var root = xmldoc;
104
+
105
+ // For the record: in Safari, we would create native DOM nodes, but
106
+ // in Opera that is not possible, because the DOM only allows HTML
107
+ // element nodes to be created, so we have to do our own DOM nodes.
108
+
109
+ // xmldoc = document.implementation.createDocument('','',null);
110
+ // root = xmldoc; // .createDocumentFragment();
111
+ // NOTE(mesch): using the DocumentFragment instead of the Document
112
+ // crashes my Safari 1.2.4 (v125.12).
113
+ var stack = [];
114
+
115
+ var parent = root;
116
+ stack.push(parent);
117
+
118
+ // The token that delimits a section that contains markup as
119
+ // content: CDATA or comments.
120
+ var slurp = '';
121
+
122
+ var x = stringSplit(xml, '<');
123
+ for (var i = 1; i < x.length; ++i) {
124
+ var xx = stringSplit(x[i], '>');
125
+ var tag = xx[0];
126
+ var text = xmlResolveEntities(xx[1] || '');
127
+
128
+ if (slurp) {
129
+ // In a "slurp" section (CDATA or comment): only check for the
130
+ // end of the section, otherwise append the whole text.
131
+ var end = x[i].indexOf(slurp);
132
+ if (end != -1) {
133
+ var data = x[i].substring(0, end);
134
+ parent.nodeValue += '<' + data;
135
+ stack.pop();
136
+ parent = stack[stack.length-1];
137
+ text = x[i].substring(end + slurp.length);
138
+ slurp = '';
139
+ } else {
140
+ parent.nodeValue += '<' + x[i];
141
+ text = null;
142
+ }
143
+
144
+ } else if (tag.indexOf('![CDATA[') == 0) {
145
+ var start = '![CDATA['.length;
146
+ var end = x[i].indexOf(']]>');
147
+ if (end != -1) {
148
+ var data = x[i].substring(start, end);
149
+ var node = domCreateCDATASection(xmldoc, data);
150
+ domAppendChild(parent, node);
151
+ } else {
152
+ var data = x[i].substring(start);
153
+ text = null;
154
+ var node = domCreateCDATASection(xmldoc, data);
155
+ domAppendChild(parent, node);
156
+ parent = node;
157
+ stack.push(node);
158
+ slurp = ']]>';
159
+ }
160
+
161
+ } else if (tag.indexOf('!--') == 0) {
162
+ var start = '!--'.length;
163
+ var end = x[i].indexOf('-->');
164
+ if (end != -1) {
165
+ var data = x[i].substring(start, end);
166
+ var node = domCreateComment(xmldoc, data);
167
+ domAppendChild(parent, node);
168
+ } else {
169
+ var data = x[i].substring(start);
170
+ text = null;
171
+ var node = domCreateComment(xmldoc, data);
172
+ domAppendChild(parent, node);
173
+ parent = node;
174
+ stack.push(node);
175
+ slurp = '-->';
176
+ }
177
+
178
+ } else if (tag.charAt(0) == '/') {
179
+ stack.pop();
180
+ parent = stack[stack.length-1];
181
+
182
+ } else if (tag.charAt(0) == '?') {
183
+ // Ignore XML declaration and processing instructions
184
+ } else if (tag.charAt(0) == '!') {
185
+ // Ignore notation and comments
186
+ } else {
187
+ var empty = tag.match(regex_empty);
188
+ var tagname = regex_tagname.exec(tag)[1];
189
+ var node = domCreateElement(xmldoc, tagname);
190
+
191
+ var att;
192
+ while (att = regex_attribute.exec(tag)) {
193
+ var val = xmlResolveEntities(att[5] || att[7] || '');
194
+ domSetAttribute(node, att[1], val);
195
+ }
196
+
197
+ domAppendChild(parent, node);
198
+ if (!empty) {
199
+ parent = node;
200
+ stack.push(node);
201
+ }
202
+ }
203
+
204
+ if (text && parent != root) {
205
+ domAppendChild(parent, domCreateTextNode(xmldoc, text));
206
+ }
207
+ }
208
+
209
+ return root;
210
+ }
211
+
212
+ // Based on <http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/
213
+ // core.html#ID-1950641247>
214
+ var DOM_ELEMENT_NODE = 1;
215
+ var DOM_ATTRIBUTE_NODE = 2;
216
+ var DOM_TEXT_NODE = 3;
217
+ var DOM_CDATA_SECTION_NODE = 4;
218
+ var DOM_ENTITY_REFERENCE_NODE = 5;
219
+ var DOM_ENTITY_NODE = 6;
220
+ var DOM_PROCESSING_INSTRUCTION_NODE = 7;
221
+ var DOM_COMMENT_NODE = 8;
222
+ var DOM_DOCUMENT_NODE = 9;
223
+ var DOM_DOCUMENT_TYPE_NODE = 10;
224
+ var DOM_DOCUMENT_FRAGMENT_NODE = 11;
225
+ var DOM_NOTATION_NODE = 12;
226
+
227
+ // Traverses the element nodes in the DOM section underneath the given
228
+ // node and invokes the given callbacks as methods on every element
229
+ // node encountered. Function opt_pre is invoked before a node's
230
+ // children are traversed; opt_post is invoked after they are
231
+ // traversed. Traversal will not be continued if a callback function
232
+ // returns boolean false. NOTE(mesch): copied from
233
+ // <//google3/maps/webmaps/javascript/dom.js>.
234
+ function domTraverseElements(node, opt_pre, opt_post) {
235
+ var ret;
236
+ if (opt_pre) {
237
+ ret = opt_pre.call(null, node);
238
+ if (typeof ret == 'boolean' && !ret) {
239
+ return false;
240
+ }
241
+ }
242
+
243
+ for (var c = node.firstChild; c; c = c.nextSibling) {
244
+ if (c.nodeType == DOM_ELEMENT_NODE) {
245
+ ret = arguments.callee.call(this, c, opt_pre, opt_post);
246
+ if (typeof ret == 'boolean' && !ret) {
247
+ return false;
248
+ }
249
+ }
250
+ }
251
+
252
+ if (opt_post) {
253
+ ret = opt_post.call(null, node);
254
+ if (typeof ret == 'boolean' && !ret) {
255
+ return false;
256
+ }
257
+ }
258
+ }
259
+
260
+ // Our W3C DOM Node implementation. Note we call it XNode because we
261
+ // can't define the identifier Node. We do this mostly for Opera,
262
+ // where we can't reuse the HTML DOM for parsing our own XML, and for
263
+ // Safari, where it is too expensive to have the template processor
264
+ // operate on native DOM nodes.
265
+ function XNode(type, name, opt_value, opt_owner) {
266
+ this.attributes = [];
267
+ this.childNodes = [];
268
+
269
+ XNode.init.call(this, type, name, opt_value, opt_owner);
270
+ }
271
+
272
+ // Don't call as method, use apply() or call().
273
+ XNode.init = function(type, name, value, owner) {
274
+ this.nodeType = type - 0;
275
+ this.nodeName = '' + name;
276
+ this.nodeValue = '' + value;
277
+ this.ownerDocument = owner;
278
+
279
+ this.firstChild = null;
280
+ this.lastChild = null;
281
+ this.nextSibling = null;
282
+ this.previousSibling = null;
283
+ this.parentNode = null;
284
+ }
285
+
286
+ XNode.unused_ = [];
287
+
288
+ XNode.recycle = function(node) {
289
+ if (!node) {
290
+ return;
291
+ }
292
+
293
+ if (node.constructor == XDocument) {
294
+ XNode.recycle(node.documentElement);
295
+ return;
296
+ }
297
+
298
+ if (node.constructor != this) {
299
+ return;
300
+ }
301
+
302
+ XNode.unused_.push(node);
303
+ for (var a = 0; a < node.attributes.length; ++a) {
304
+ XNode.recycle(node.attributes[a]);
305
+ }
306
+ for (var c = 0; c < node.childNodes.length; ++c) {
307
+ XNode.recycle(node.childNodes[c]);
308
+ }
309
+ node.attributes.length = 0;
310
+ node.childNodes.length = 0;
311
+ XNode.init.call(node, 0, '', '', null);
312
+ }
313
+
314
+ XNode.create = function(type, name, value, owner) {
315
+ if (XNode.unused_.length > 0) {
316
+ var node = XNode.unused_.pop();
317
+ XNode.init.call(node, type, name, value, owner);
318
+ return node;
319
+ } else {
320
+ return new XNode(type, name, value, owner);
321
+ }
322
+ }
323
+
324
+ XNode.prototype.appendChild = function(node) {
325
+ // firstChild
326
+ if (this.childNodes.length == 0) {
327
+ this.firstChild = node;
328
+ }
329
+
330
+ // previousSibling
331
+ node.previousSibling = this.lastChild;
332
+
333
+ // nextSibling
334
+ node.nextSibling = null;
335
+ if (this.lastChild) {
336
+ this.lastChild.nextSibling = node;
337
+ }
338
+
339
+ // parentNode
340
+ node.parentNode = this;
341
+
342
+ // lastChild
343
+ this.lastChild = node;
344
+
345
+ // childNodes
346
+ this.childNodes.push(node);
347
+ }
348
+
349
+
350
+ XNode.prototype.replaceChild = function(newNode, oldNode) {
351
+ if (oldNode == newNode) {
352
+ return;
353
+ }
354
+
355
+ for (var i = 0; i < this.childNodes.length; ++i) {
356
+ if (this.childNodes[i] == oldNode) {
357
+ this.childNodes[i] = newNode;
358
+
359
+ var p = oldNode.parentNode;
360
+ oldNode.parentNode = null;
361
+ newNode.parentNode = p;
362
+
363
+ p = oldNode.previousSibling;
364
+ oldNode.previousSibling = null;
365
+ newNode.previousSibling = p;
366
+ if (newNode.previousSibling) {
367
+ newNode.previousSibling.nextSibling = newNode;
368
+ }
369
+
370
+ p = oldNode.nextSibling;
371
+ oldNode.nextSibling = null;
372
+ newNode.nextSibling = p;
373
+ if (newNode.nextSibling) {
374
+ newNode.nextSibling.previousSibling = newNode;
375
+ }
376
+
377
+ if (this.firstChild == oldNode) {
378
+ this.firstChild = newNode;
379
+ }
380
+
381
+ if (this.lastChild == oldNode) {
382
+ this.lastChild = newNode;
383
+ }
384
+
385
+ break;
386
+ }
387
+ }
388
+ }
389
+
390
+
391
+ XNode.prototype.insertBefore = function(newNode, oldNode) {
392
+ if (oldNode == newNode) {
393
+ return;
394
+ }
395
+
396
+ if (oldNode.parentNode != this) {
397
+ return;
398
+ }
399
+
400
+ if (newNode.parentNode) {
401
+ newNode.parentNode.removeChild(newNode);
402
+ }
403
+
404
+ var newChildren = [];
405
+ for (var i = 0; i < this.childNodes.length; ++i) {
406
+ var c = this.childNodes[i];
407
+ if (c == oldNode) {
408
+ newChildren.push(newNode);
409
+
410
+ newNode.parentNode = this;
411
+
412
+ newNode.previousSibling = oldNode.previousSibling;
413
+ oldNode.previousSibling = newNode;
414
+ if (newNode.previousSibling) {
415
+ newNode.previousSibling.nextSibling = newNode;
416
+ }
417
+
418
+ newNode.nextSibling = oldNode;
419
+
420
+ if (this.firstChild == oldNode) {
421
+ this.firstChild = newNode;
422
+ }
423
+ }
424
+ newChildren.push(c);
425
+ }
426
+ this.childNodes = newChildren;
427
+ }
428
+
429
+
430
+ XNode.prototype.removeChild = function(node) {
431
+ var newChildren = [];
432
+ for (var i = 0; i < this.childNodes.length; ++i) {
433
+ var c = this.childNodes[i];
434
+ if (c != node) {
435
+ newChildren.push(c);
436
+ } else {
437
+ if (c.previousSibling) {
438
+ c.previousSibling.nextSibling = c.nextSibling;
439
+ }
440
+ if (c.nextSibling) {
441
+ c.nextSibling.previousSibling = c.previousSibling;
442
+ }
443
+ if (this.firstChild == c) {
444
+ this.firstChild = c.nextSibling;
445
+ }
446
+ if (this.lastChild == c) {
447
+ this.lastChild = c.previousSibling;
448
+ }
449
+ }
450
+ }
451
+ this.childNodes = newChildren;
452
+ }
453
+
454
+
455
+ XNode.prototype.hasAttributes = function() {
456
+ return this.attributes.length > 0;
457
+ }
458
+
459
+
460
+ XNode.prototype.setAttribute = function(name, value) {
461
+ for (var i = 0; i < this.attributes.length; ++i) {
462
+ if (this.attributes[i].nodeName == name) {
463
+ this.attributes[i].nodeValue = '' + value;
464
+ return;
465
+ }
466
+ }
467
+ this.attributes.push(XNode.create(DOM_ATTRIBUTE_NODE, name, value, this));
468
+ }
469
+
470
+
471
+ XNode.prototype.getAttribute = function(name) {
472
+ for (var i = 0; i < this.attributes.length; ++i) {
473
+ if (this.attributes[i].nodeName == name) {
474
+ return this.attributes[i].nodeValue;
475
+ }
476
+ }
477
+ return null;
478
+ }
479
+
480
+
481
+ XNode.prototype.removeAttribute = function(name) {
482
+ var a = [];
483
+ for (var i = 0; i < this.attributes.length; ++i) {
484
+ if (this.attributes[i].nodeName != name) {
485
+ a.push(this.attributes[i]);
486
+ }
487
+ }
488
+ this.attributes = a;
489
+ }
490
+
491
+
492
+ XNode.prototype.getElementsByTagName = function(name) {
493
+ var ret = [];
494
+ var self = this;
495
+ if ("*" == name) {
496
+ domTraverseElements(this, function(node) {
497
+ if (self == node) return;
498
+ ret.push(node);
499
+ }, null);
500
+ } else {
501
+ domTraverseElements(this, function(node) {
502
+ if (self == node) return;
503
+ if (node.nodeName == name) {
504
+ ret.push(node);
505
+ }
506
+ }, null);
507
+ }
508
+ return ret;
509
+ }
510
+
511
+
512
+ XNode.prototype.getElementById = function(id) {
513
+ var ret = null;
514
+ domTraverseElements(this, function(node) {
515
+ if (node.getAttribute('id') == id) {
516
+ ret = node;
517
+ return false;
518
+ }
519
+ }, null);
520
+ return ret;
521
+ }
522
+
523
+
524
+ function XDocument() {
525
+ // NOTE(mesch): Acocording to the DOM Spec, ownerDocument of a
526
+ // document node is null.
527
+ XNode.call(this, DOM_DOCUMENT_NODE, '#document', null, null);
528
+ this.documentElement = null;
529
+ }
530
+
531
+ XDocument.prototype = new XNode(DOM_DOCUMENT_NODE, '#document');
532
+
533
+ XDocument.prototype.clear = function() {
534
+ XNode.recycle(this.documentElement);
535
+ this.documentElement = null;
536
+ }
537
+
538
+ XDocument.prototype.appendChild = function(node) {
539
+ XNode.prototype.appendChild.call(this, node);
540
+ this.documentElement = this.childNodes[0];
541
+ }
542
+
543
+ XDocument.prototype.createElement = function(name) {
544
+ return XNode.create(DOM_ELEMENT_NODE, name, null, this);
545
+ }
546
+
547
+ XDocument.prototype.createDocumentFragment = function() {
548
+ return XNode.create(DOM_DOCUMENT_FRAGMENT_NODE, '#document-fragment',
549
+ null, this);
550
+ }
551
+
552
+ XDocument.prototype.createTextNode = function(value) {
553
+ return XNode.create(DOM_TEXT_NODE, '#text', value, this);
554
+ }
555
+
556
+ XDocument.prototype.createAttribute = function(name) {
557
+ return XNode.create(DOM_ATTRIBUTE_NODE, name, null, this);
558
+ }
559
+
560
+ XDocument.prototype.createComment = function(data) {
561
+ return XNode.create(DOM_COMMENT_NODE, '#comment', data, this);
562
+ }
563
+
564
+ XDocument.prototype.createCDATASection = function(data) {
565
+ return XNode.create(DOM_CDATA_SECTION_NODE, '#cdata-section', data, this);
566
+ }