rubinium 0.1.1

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 (161) hide show
  1. data/CHANGES +7 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +137 -0
  4. data/Rakefile +139 -0
  5. data/TODO +7 -0
  6. data/doc/examples/rtc_site_live.rb +12 -0
  7. data/doc/examples/rts_main.rb +9 -0
  8. data/doc/examples/rts_shared_code.rb +25 -0
  9. data/lib/rubinium.rb +9 -0
  10. data/lib/rubinium/string.rb +3 -0
  11. data/lib/rubinium/test_base.rb +80 -0
  12. data/lib/rubinium/test_suite.rb +53 -0
  13. data/lib/rubinium/validator.rb +16 -0
  14. data/test/selenium_tests/test_click.rb +22 -0
  15. data/test/selenium_tests/test_open.rb +11 -0
  16. data/test/tc_file_creation.rb +60 -0
  17. data/test/ts_rubinium.rb +1 -0
  18. data/vendor/selenium-0.6.0/install-readme.txt +9 -0
  19. data/vendor/selenium-0.6.0/selenium/SeleneseRunner.html +253 -0
  20. data/vendor/selenium-0.6.0/selenium/SeleniumLog.html +61 -0
  21. data/vendor/selenium-0.6.0/selenium/TestRunner-splash.html +55 -0
  22. data/vendor/selenium-0.6.0/selenium/TestRunner.hta +146 -0
  23. data/vendor/selenium-0.6.0/selenium/TestRunner.html +146 -0
  24. data/vendor/selenium-0.6.0/selenium/devtests/TestClickInFrame.html +58 -0
  25. data/vendor/selenium-0.6.0/selenium/devtests/TestOpenInFrame.html +48 -0
  26. data/vendor/selenium-0.6.0/selenium/devtests/TestOpenInNewWindow.html +78 -0
  27. data/vendor/selenium-0.6.0/selenium/devtests/TestOpenMeta.html +43 -0
  28. data/vendor/selenium-0.6.0/selenium/devtests/TestSuite.html +39 -0
  29. data/vendor/selenium-0.6.0/selenium/devtests/meta/page.html +5 -0
  30. data/vendor/selenium-0.6.0/selenium/dom-images/butmin.gif +0 -0
  31. data/vendor/selenium-0.6.0/selenium/dom-images/butplus.gif +0 -0
  32. data/vendor/selenium-0.6.0/selenium/dom-styles/default.css +298 -0
  33. data/vendor/selenium-0.6.0/selenium/domviewer.html +16 -0
  34. data/vendor/selenium-0.6.0/selenium/html-xpath/carnation.jpg +0 -0
  35. data/vendor/selenium-0.6.0/selenium/html-xpath/example.html +75 -0
  36. data/vendor/selenium-0.6.0/selenium/html-xpath/html-xpath-patched.js +657 -0
  37. data/vendor/selenium-0.6.0/selenium/html-xpath/html-xpath.js +610 -0
  38. data/vendor/selenium-0.6.0/selenium/html-xpath/license.txt +504 -0
  39. data/vendor/selenium-0.6.0/selenium/html-xpath/rainbow.jpg +0 -0
  40. data/vendor/selenium-0.6.0/selenium/htmlutils.js +283 -0
  41. data/vendor/selenium-0.6.0/selenium/index.html +60 -0
  42. data/vendor/selenium-0.6.0/selenium/jsmock/mock-tests.html +205 -0
  43. data/vendor/selenium-0.6.0/selenium/jsmock/mock.js +124 -0
  44. data/vendor/selenium-0.6.0/selenium/selenium-api.js +683 -0
  45. data/vendor/selenium-0.6.0/selenium/selenium-browserbot.js +930 -0
  46. data/vendor/selenium-0.6.0/selenium/selenium-commandhandlers.js +286 -0
  47. data/vendor/selenium-0.6.0/selenium/selenium-domviewer.js +188 -0
  48. data/vendor/selenium-0.6.0/selenium/selenium-executionloop.js +250 -0
  49. data/vendor/selenium-0.6.0/selenium/selenium-fitrunner.js +597 -0
  50. data/vendor/selenium-0.6.0/selenium/selenium-logging.js +88 -0
  51. data/vendor/selenium-0.6.0/selenium/selenium-logo.png +0 -0
  52. data/vendor/selenium-0.6.0/selenium/selenium-tableparser.js +50 -0
  53. data/vendor/selenium-0.6.0/selenium/selenium.css +211 -0
  54. data/vendor/selenium-0.6.0/selenium/tests/ErrorCheckingTestSuite.html +36 -0
  55. data/vendor/selenium-0.6.0/selenium/tests/GoogleTestSearch.html +69 -0
  56. data/vendor/selenium-0.6.0/selenium/tests/GoogleTestSuite.html +32 -0
  57. data/vendor/selenium-0.6.0/selenium/tests/JsUnitSuite.html +38 -0
  58. data/vendor/selenium-0.6.0/selenium/tests/TestClick.html +128 -0
  59. data/vendor/selenium-0.6.0/selenium/tests/TestClickJavascriptHref.html +115 -0
  60. data/vendor/selenium-0.6.0/selenium/tests/TestCommandError.html +79 -0
  61. data/vendor/selenium-0.6.0/selenium/tests/TestConfirmations.html +77 -0
  62. data/vendor/selenium-0.6.0/selenium/tests/TestErrorChecking.html +71 -0
  63. data/vendor/selenium-0.6.0/selenium/tests/TestFailingAssert.html +59 -0
  64. data/vendor/selenium-0.6.0/selenium/tests/TestFailingVerifications.html +198 -0
  65. data/vendor/selenium-0.6.0/selenium/tests/TestFocusOnBlur.html +53 -0
  66. data/vendor/selenium-0.6.0/selenium/tests/TestGoBack.html +81 -0
  67. data/vendor/selenium-0.6.0/selenium/tests/TestImplicitLocators.html +81 -0
  68. data/vendor/selenium-0.6.0/selenium/tests/TestJavascriptParameters.html +91 -0
  69. data/vendor/selenium-0.6.0/selenium/tests/TestLocators.html +161 -0
  70. data/vendor/selenium-0.6.0/selenium/tests/TestModalDialog.html +58 -0
  71. data/vendor/selenium-0.6.0/selenium/tests/TestModalDialogDialog.html +48 -0
  72. data/vendor/selenium-0.6.0/selenium/tests/TestOpen.html +66 -0
  73. data/vendor/selenium-0.6.0/selenium/tests/TestPatternMatching.html +127 -0
  74. data/vendor/selenium-0.6.0/selenium/tests/TestPause.html +78 -0
  75. data/vendor/selenium-0.6.0/selenium/tests/TestPrompting.html +82 -0
  76. data/vendor/selenium-0.6.0/selenium/tests/TestProxy.html +62 -0
  77. data/vendor/selenium-0.6.0/selenium/tests/TestSelect.html +111 -0
  78. data/vendor/selenium-0.6.0/selenium/tests/TestSelectWindow.html +106 -0
  79. data/vendor/selenium-0.6.0/selenium/tests/TestStore.html +165 -0
  80. data/vendor/selenium-0.6.0/selenium/tests/TestSuite-InternetExplorer.html +79 -0
  81. data/vendor/selenium-0.6.0/selenium/tests/TestSuite-Konqueror.html +75 -0
  82. data/vendor/selenium-0.6.0/selenium/tests/TestSuite-Safari.html +75 -0
  83. data/vendor/selenium-0.6.0/selenium/tests/TestSuite.html +75 -0
  84. data/vendor/selenium-0.6.0/selenium/tests/TestType.html +79 -0
  85. data/vendor/selenium-0.6.0/selenium/tests/TestUserExtensions.html +81 -0
  86. data/vendor/selenium-0.6.0/selenium/tests/TestVerifications.html +164 -0
  87. data/vendor/selenium-0.6.0/selenium/tests/TestVerifyAlerts.html +80 -0
  88. data/vendor/selenium-0.6.0/selenium/tests/TestVerifyAlertsFailures.html +108 -0
  89. data/vendor/selenium-0.6.0/selenium/tests/TestVerifyConfirmationFailures.html +86 -0
  90. data/vendor/selenium-0.6.0/selenium/tests/TestVerifyEditable.html +70 -0
  91. data/vendor/selenium-0.6.0/selenium/tests/TestVerifyEditableFailures.html +95 -0
  92. data/vendor/selenium-0.6.0/selenium/tests/TestVisibility.html +91 -0
  93. data/vendor/selenium-0.6.0/selenium/tests/TestVisibilityFailures.html +131 -0
  94. data/vendor/selenium-0.6.0/selenium/tests/TestWait.html +112 -0
  95. data/vendor/selenium-0.6.0/selenium/tests/TestWaitFor.html +63 -0
  96. data/vendor/selenium-0.6.0/selenium/tests/TestWaitInPopupWindow.html +94 -0
  97. data/vendor/selenium-0.6.0/selenium/tests/TestXPathLocators.html +98 -0
  98. data/vendor/selenium-0.6.0/selenium/tests/browserbot/alert-handling-tests.html +79 -0
  99. data/vendor/selenium-0.6.0/selenium/tests/browserbot/assert-tests.html +113 -0
  100. data/vendor/selenium-0.6.0/selenium/tests/browserbot/browserbot-tests.html +123 -0
  101. data/vendor/selenium-0.6.0/selenium/tests/browserbot/command-factory-tests.html +290 -0
  102. data/vendor/selenium-0.6.0/selenium/tests/browserbot/command-handler-tests.html +115 -0
  103. data/vendor/selenium-0.6.0/selenium/tests/browserbot/confirm-handling-tests.html +97 -0
  104. data/vendor/selenium-0.6.0/selenium/tests/browserbot/error-checking-command-tests.html +198 -0
  105. data/vendor/selenium-0.6.0/selenium/tests/browserbot/event-bubble-tests.html +106 -0
  106. data/vendor/selenium-0.6.0/selenium/tests/browserbot/optionlocator-tests.html +180 -0
  107. data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-accessor-tests.html +65 -0
  108. data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-action-tests.html +200 -0
  109. data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-attribute-tests.html +98 -0
  110. data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-locator-tests-include.html +33 -0
  111. data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-locator-tests.html +258 -0
  112. data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-property-tests.html +49 -0
  113. data/vendor/selenium-0.6.0/selenium/tests/browserbot/pattern-matcher-tests.html +66 -0
  114. data/vendor/selenium-0.6.0/selenium/tests/browserbot/selenium-api-tests.html +412 -0
  115. data/vendor/selenium-0.6.0/selenium/tests/browserbot/selenium-parameter-tests.html +98 -0
  116. data/vendor/selenium-0.6.0/selenium/tests/browserbot/suite.html +52 -0
  117. data/vendor/selenium-0.6.0/selenium/tests/browserbot/testloop-handle-error-tests.html +74 -0
  118. data/vendor/selenium-0.6.0/selenium/tests/events/TestButtonEvents.html +72 -0
  119. data/vendor/selenium-0.6.0/selenium/tests/events/TestCheckboxEvents.html +107 -0
  120. data/vendor/selenium-0.6.0/selenium/tests/events/TestFireEvents.html +75 -0
  121. data/vendor/selenium-0.6.0/selenium/tests/events/TestLinkEvents.html +43 -0
  122. data/vendor/selenium-0.6.0/selenium/tests/events/TestRadioEvents.html +149 -0
  123. data/vendor/selenium-0.6.0/selenium/tests/events/TestSelectEvents.html +122 -0
  124. data/vendor/selenium-0.6.0/selenium/tests/events/TestTextEvents.html +87 -0
  125. data/vendor/selenium-0.6.0/selenium/tests/events/readme.txt +26 -0
  126. data/vendor/selenium-0.6.0/selenium/tests/html/banner.gif +0 -0
  127. data/vendor/selenium-0.6.0/selenium/tests/html/test_async_event.html +36 -0
  128. data/vendor/selenium-0.6.0/selenium/tests/html/test_click_javascript_page.html +34 -0
  129. data/vendor/selenium-0.6.0/selenium/tests/html/test_click_page1.html +31 -0
  130. data/vendor/selenium-0.6.0/selenium/tests/html/test_click_page2.html +30 -0
  131. data/vendor/selenium-0.6.0/selenium/tests/html/test_confirm.html +34 -0
  132. data/vendor/selenium-0.6.0/selenium/tests/html/test_dummy_page.html +26 -0
  133. data/vendor/selenium-0.6.0/selenium/tests/html/test_editable.html +36 -0
  134. data/vendor/selenium-0.6.0/selenium/tests/html/test_focus_on_blur.html +33 -0
  135. data/vendor/selenium-0.6.0/selenium/tests/html/test_form_events.html +98 -0
  136. data/vendor/selenium-0.6.0/selenium/tests/html/test_framed_page.html +7 -0
  137. data/vendor/selenium-0.6.0/selenium/tests/html/test_just_text.html +22 -0
  138. data/vendor/selenium-0.6.0/selenium/tests/html/test_locators.html +34 -0
  139. data/vendor/selenium-0.6.0/selenium/tests/html/test_modal_dialog.html +29 -0
  140. data/vendor/selenium-0.6.0/selenium/tests/html/test_modal_dialog_dialog.html +35 -0
  141. data/vendor/selenium-0.6.0/selenium/tests/html/test_open.html +23 -0
  142. data/vendor/selenium-0.6.0/selenium/tests/html/test_prompt.html +34 -0
  143. data/vendor/selenium-0.6.0/selenium/tests/html/test_reload_onchange_page.html +32 -0
  144. data/vendor/selenium-0.6.0/selenium/tests/html/test_select.html +35 -0
  145. data/vendor/selenium-0.6.0/selenium/tests/html/test_select_window.html +29 -0
  146. data/vendor/selenium-0.6.0/selenium/tests/html/test_select_window_popup.html +28 -0
  147. data/vendor/selenium-0.6.0/selenium/tests/html/test_slowloading_page.html +27 -0
  148. data/vendor/selenium-0.6.0/selenium/tests/html/test_store_value.html +23 -0
  149. data/vendor/selenium-0.6.0/selenium/tests/html/test_type_page1.html +37 -0
  150. data/vendor/selenium-0.6.0/selenium/tests/html/test_type_page2.html +61 -0
  151. data/vendor/selenium-0.6.0/selenium/tests/html/test_verifications.html +42 -0
  152. data/vendor/selenium-0.6.0/selenium/tests/html/test_verify_alert.html +46 -0
  153. data/vendor/selenium-0.6.0/selenium/tests/html/test_visibility.html +53 -0
  154. data/vendor/selenium-0.6.0/selenium/tests/readme.txt +1 -0
  155. data/vendor/selenium-0.6.0/selenium/tests/tableparser/tableparser-tests.html +122 -0
  156. data/vendor/selenium-0.6.0/selenium/tests/tinyWebServer.py +70 -0
  157. data/vendor/selenium-0.6.0/selenium/user-extensions.js.sample +62 -0
  158. data/vendor/selenium-0.6.0/selenium/version.txt +1 -0
  159. data/vendor/selenium-0.6.0/selenium/xmlextras.js +153 -0
  160. data/vendor/selenium-0.6.0/selenium/xpath.js +3910 -0
  161. metadata +216 -0
@@ -0,0 +1 @@
1
+ Create a TestSuite.html page, and a number of test pages here. Read the docs!
@@ -0,0 +1,122 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+ "http://www.w3.org/TR/html4/loose.dtd">
3
+
4
+ <!--
5
+ Copyright 2004 ThoughtWorks, Inc
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+ -->
19
+ <html>
20
+ <head>
21
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
22
+ <title>JsUnit Utility Tests</title>
23
+ <link rel="stylesheet" type="text/css" href="jsunit/css/jsUnitStyle.css">
24
+ <script language="JavaScript" type="text/javascript" src="/jsunit/app/jsUnitCore.js"></script>
25
+ <script language="JavaScript" type="text/javascript" src="/jsmock/mock.js"></script>
26
+ <script language="JavaScript" type="text/javascript" src="/selenium-commandhandlers.js"></script>
27
+ <script language="JavaScript" type="text/javascript" src="/selenium-tableparser.js"></script>
28
+ <script language="JavaScript" type="text/javascript" src="/htmlutils.js"></script>
29
+ <script language="JavaScript" type="text/javascript">
30
+
31
+ ///////////////////// HTML TABLE PARSING /////////////////////
32
+ function setUp() {
33
+ tableParser = new TableParser();
34
+ }
35
+
36
+ function assertCommand(expectedName, expectedTarget, expectedValue, command) {
37
+ assertEquals(expectedName, command.command);
38
+ assertEquals(expectedTarget, command.target);
39
+ assertEquals(expectedValue, command.value);
40
+ }
41
+
42
+ function testShouldParseOneArgHtmlTableRowToJavascript() {
43
+ var row = document.getElementsByTagName("table")[0].rows[1]
44
+ var command = tableParser.createCommandFromHtmlRow(row);
45
+ assertCommand("click", "someButton", "", command);
46
+ }
47
+
48
+ function testShouldParseTwoArgHtmlTableRowToJavascript() {
49
+ var row = document.getElementsByTagName("table")[0].rows[2]
50
+ var command = tableParser.createCommandFromHtmlRow(row);
51
+ assertCommand("verifyText", "someButton", "Click me!", command);
52
+ }
53
+
54
+ function testShouldFailWithBadWikiRowFormat() {
55
+ var row = document.getElementsByTagName("table")[0].rows[3]
56
+ try {
57
+ tableParser.createCommandFromHtmlRow(row)
58
+ fail("Should fail")
59
+ } catch(expected) {
60
+ assertEquals("Bad HTML row format. Rows must have 3 coumns, but had 4", expected.message)
61
+ }
62
+ }
63
+
64
+ ///////////////////// WIKI TABLE PARSING /////////////////////
65
+
66
+ function testShouldParseOneArgWikiTableRowToJavascript() {
67
+ var wikiRow = "| click | someButton ||"
68
+ var command = tableParser.createCommandFromWikiRow(wikiRow);
69
+ assertCommand("click", "someButton", "", command);
70
+ }
71
+
72
+ function testShouldParseTwoArgWikiTableRowToJavascript() {
73
+ var wikiRow = "| verifyText | someButton |Click me!|"
74
+ var command = tableParser.createCommandFromWikiRow(wikiRow);
75
+ assertCommand("verifyText", "someButton", "Click me!", command);
76
+ }
77
+
78
+ function testShouldFailWithBadWikiRowFormat() {
79
+ var wikiRow = "| verifyText | someButton |Click me!||"
80
+ try {
81
+ tableParser.createCommandFromWikiRow(wikiRow);
82
+ fail("Should fail")
83
+ } catch(expected) {
84
+ assertEquals("Bad wiki row format:| verifyText | someButton |Click me!||", expected.message)
85
+ }
86
+ }
87
+ </script>
88
+ </head>
89
+
90
+ <body>
91
+ <h1>TableParser Tests</h1>
92
+
93
+ <p>This page contains tests for TableParser. To see them, take a look at the source. To run them, load this file via JsUnit's testRunner.html</p>
94
+
95
+ <input id="someField"/>
96
+
97
+ <table cellpadding="1" cellspacing="1" border="1">
98
+ <tbody>
99
+ <tr>
100
+ <td rowspan="1" colspan="3">Test Type<br>
101
+ </td>
102
+ </tr>
103
+ <tr>
104
+ <td>click</td>
105
+ <td>someButton</td>
106
+ <td>&nbsp;</td>
107
+ </tr>
108
+ <tr>
109
+ <td>verifyText</td>
110
+ <td>someButton</td>
111
+ <td>Click me!</td>
112
+ </tr>
113
+ <tr>
114
+ <td>this</td>
115
+ <td>is</td>
116
+ <td>a bad</td>
117
+ <td>row</td>
118
+ </tr>
119
+ </tbody>
120
+ </table>
121
+ </body>
122
+ </html>
@@ -0,0 +1,70 @@
1
+ # Copyright 2004 ThoughtWorks, Inc
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ # minimal web server.
17
+ # serves files relative to the current directory.
18
+ # cgi-bin directory serves Python CGIs.
19
+
20
+ import BaseHTTPServer
21
+ import CGIHTTPServer
22
+ import time
23
+ import httplib
24
+ import sys
25
+
26
+ PORT = 8000
27
+
28
+ class HTTPHandler(CGIHTTPServer.CGIHTTPRequestHandler):
29
+ """
30
+ Simple Web Server that can handle query strings in a request URL and can be stopped with a request
31
+
32
+ """
33
+
34
+ quitRequestReceived = False
35
+
36
+ def do_GET(self):
37
+ # SimpleHTTPServer doesn't know how to handle query strings in
38
+ # 'GET' requests, so we're processing them here:
39
+ if self.path.find('?') != -1:
40
+ self.path, self.query_string = self.path.split('?', 1)
41
+ else:
42
+ self.query_string = ''
43
+
44
+ # Add a delay before serving up the slow-loading test page
45
+ if self.path.find('test_slowloading_page') != -1:
46
+ time.sleep(0.3)
47
+
48
+ # Carry on with the rest of the processing...
49
+ CGIHTTPServer.CGIHTTPRequestHandler.do_GET(self)
50
+
51
+ def do_QUIT(self):
52
+ self.send_response(200)
53
+ self.end_headers()
54
+ HTTPHandler.quitRequestReceived = True
55
+
56
+ if __name__ == '__main__':
57
+ port = PORT
58
+ if len(sys.argv) > 1:
59
+ port = int(sys.argv[1])
60
+
61
+ server_address = ('', port)
62
+ httpd = BaseHTTPServer.HTTPServer(server_address, HTTPHandler)
63
+
64
+ print "serving at port", port
65
+ print "To access the Selenium test suite, open"
66
+ print " http://localhost:%s/index.html" % port
67
+
68
+ while not HTTPHandler.quitRequestReceived :
69
+ httpd.handle_request()
70
+
@@ -0,0 +1,62 @@
1
+ /*
2
+ * By default, Selenium looks for a file called "user-extensions.js", and loads and javascript
3
+ * code found in that file. This file is a sample of what that file could look like.
4
+ *
5
+ * user-extensions.js provides a convenient location for adding extensions to Selenium, like
6
+ * new actions, checks and locator-strategies.
7
+ * By default, this file does not exist. Users can create this file and place their extension code
8
+ * in this common location, removing the need to modify the Selenium sources, and hopefully assisting
9
+ * with the upgrade process.
10
+ */
11
+
12
+ // The following examples try to give an indication of how Selenium can be extended with javascript.
13
+
14
+ // All do* methods on the Selenium prototype are added as actions.
15
+ // Eg add a typeRepeated action to Selenium, which types the text twice into a text box.
16
+ // The typeTwiceAndWait command will be available automatically
17
+ Selenium.prototype.doTypeRepeated = function(locator, text) {
18
+ // All locator-strategies are automatically handled by "findElement"
19
+ var element = this.page().findElement(locator);
20
+
21
+ // Create the text to type
22
+ var valueToType = text + text;
23
+
24
+ // Replace the element text with the new text
25
+ this.page().replaceText(element, valueToType);
26
+ };
27
+
28
+ // All assert* methods on the Selenium prototype are added as checks.
29
+ // Eg add a assertValueRepeated check, that makes sure that the element value
30
+ // consists of the supplied text repeated.
31
+ // The verify version will be available automatically.
32
+ Selenium.prototype.assertValueRepeated = function(locator, text) {
33
+ // All locator-strategies are automatically handled by "findElement"
34
+ var element = this.page().findElement(locator);
35
+
36
+ // Create the text to verify
37
+ var expectedValue = text + text;
38
+
39
+ // Get the actual element value
40
+ var actualValue = element.value;
41
+
42
+ // Make sure the actual value matches the expected
43
+ this.assertMatches(expectedValue, actualValue);
44
+ };
45
+
46
+ // All locateElementBy* methods are added as locator-strategies.
47
+ // Eg add a "valuerepeated=" locator, that finds the first element with the supplied value, repeated.
48
+ // The "inDocument" is a the document you are searching.
49
+ PageBot.prototype.locateElementByValueRepeated = function(text, inDocument) {
50
+ // Create the text to search for
51
+ var expectedValue = text + text;
52
+
53
+ // Loop through all elements, looking for ones that have a value === our expected value
54
+ var allElements = inDocument.getElementsByTagName("*");
55
+ for (var i = 0; i < allElements.length; i++) {
56
+ var testElement = allElements[i];
57
+ if (testElement.value && testElement.value === expectedValue) {
58
+ return testElement;
59
+ }
60
+ }
61
+ return null;
62
+ };
@@ -0,0 +1,153 @@
1
+ // This is a third party JavaScript library from
2
+ // http://webfx.eae.net/dhtml/xmlextras/xmlextras.html
3
+ // i.e. This has not been written by ThoughtWorks.
4
+
5
+ //<script>
6
+ //////////////////
7
+ // Helper Stuff //
8
+ //////////////////
9
+
10
+ // used to find the Automation server name
11
+ function getDomDocumentPrefix() {
12
+ if (getDomDocumentPrefix.prefix)
13
+ return getDomDocumentPrefix.prefix;
14
+
15
+ var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
16
+ var o;
17
+ for (var i = 0; i < prefixes.length; i++) {
18
+ try {
19
+ // try to create the objects
20
+ o = new ActiveXObject(prefixes[i] + ".DomDocument");
21
+ return getDomDocumentPrefix.prefix = prefixes[i];
22
+ }
23
+ catch (ex) {};
24
+ }
25
+
26
+ throw new Error("Could not find an installed XML parser");
27
+ }
28
+
29
+ function getXmlHttpPrefix() {
30
+ if (getXmlHttpPrefix.prefix)
31
+ return getXmlHttpPrefix.prefix;
32
+
33
+ var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
34
+ var o;
35
+ for (var i = 0; i < prefixes.length; i++) {
36
+ try {
37
+ // try to create the objects
38
+ o = new ActiveXObject(prefixes[i] + ".XmlHttp");
39
+ return getXmlHttpPrefix.prefix = prefixes[i];
40
+ }
41
+ catch (ex) {};
42
+ }
43
+
44
+ throw new Error("Could not find an installed XML parser");
45
+ }
46
+
47
+ //////////////////////////
48
+ // Start the Real stuff //
49
+ //////////////////////////
50
+
51
+
52
+ // XmlHttp factory
53
+ function XmlHttp() {}
54
+
55
+ XmlHttp.create = function () {
56
+ try {
57
+ if (window.XMLHttpRequest) {
58
+ var req = new XMLHttpRequest();
59
+
60
+ // some versions of Moz do not support the readyState property
61
+ // and the onreadystate event so we patch it!
62
+ if (req.readyState == null) {
63
+ req.readyState = 1;
64
+ req.addEventListener("load", function () {
65
+ req.readyState = 4;
66
+ if (typeof req.onreadystatechange == "function")
67
+ req.onreadystatechange();
68
+ }, false);
69
+ }
70
+
71
+ return req;
72
+ }
73
+ if (window.ActiveXObject) {
74
+ return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
75
+ }
76
+ }
77
+ catch (ex) {}
78
+ // fell through
79
+ throw new Error("Your browser does not support XmlHttp objects");
80
+ };
81
+
82
+ // XmlDocument factory
83
+ function XmlDocument() {}
84
+
85
+ XmlDocument.create = function () {
86
+ try {
87
+ // DOM2
88
+ if (document.implementation && document.implementation.createDocument) {
89
+ var doc = document.implementation.createDocument("", "", null);
90
+
91
+ // some versions of Moz do not support the readyState property
92
+ // and the onreadystate event so we patch it!
93
+ if (doc.readyState == null) {
94
+ doc.readyState = 1;
95
+ doc.addEventListener("load", function () {
96
+ doc.readyState = 4;
97
+ if (typeof doc.onreadystatechange == "function")
98
+ doc.onreadystatechange();
99
+ }, false);
100
+ }
101
+
102
+ return doc;
103
+ }
104
+ if (window.ActiveXObject)
105
+ return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
106
+ }
107
+ catch (ex) {}
108
+ throw new Error("Your browser does not support XmlDocument objects");
109
+ };
110
+
111
+ // Create the loadXML method and xml getter for Mozilla
112
+ if (window.DOMParser &&
113
+ window.XMLSerializer &&
114
+ window.Node && Node.prototype && Node.prototype.__defineGetter__) {
115
+
116
+ // XMLDocument did not extend the Document interface in some versions
117
+ // of Mozilla. Extend both!
118
+ //XMLDocument.prototype.loadXML =
119
+ Document.prototype.loadXML = function (s) {
120
+
121
+ // parse the string to a new doc
122
+ var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
123
+
124
+ // remove all initial children
125
+ while (this.hasChildNodes())
126
+ this.removeChild(this.lastChild);
127
+
128
+ // insert and import nodes
129
+ for (var i = 0; i < doc2.childNodes.length; i++) {
130
+ this.appendChild(this.importNode(doc2.childNodes[i], true));
131
+ }
132
+ };
133
+
134
+
135
+ /*
136
+ * xml getter
137
+ *
138
+ * This serializes the DOM tree to an XML String
139
+ *
140
+ * Usage: var sXml = oNode.xml
141
+ *
142
+ */
143
+ // XMLDocument did not extend the Document interface in some versions
144
+ // of Mozilla. Extend both!
145
+ /*
146
+ XMLDocument.prototype.__defineGetter__("xml", function () {
147
+ return (new XMLSerializer()).serializeToString(this);
148
+ });
149
+ */
150
+ Document.prototype.__defineGetter__("xml", function () {
151
+ return (new XMLSerializer()).serializeToString(this);
152
+ });
153
+ }
@@ -0,0 +1,3910 @@
1
+ /*
2
+ * xpath.js
3
+ *
4
+ * An XPath 1.0 library for JavaScript.
5
+ *
6
+ * Cameron McCormack <cam (at) mcc.id.au>
7
+ *
8
+ * This work is licensed under the Creative Commons Attribution-ShareAlike
9
+ * License. To view a copy of this license, visit
10
+ * http://creativecommons.org/licenses/by-sa/2.0/ or send a letter to Creative
11
+ * Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
12
+ *
13
+ * Revision 13: May 3, 2005
14
+ * Node tests are case insensitive now if working in an HTML DOM.
15
+ *
16
+ * Revision 12: April 26, 2005
17
+ * Updated licence. Slight code changes to enable use of Dean
18
+ * Edwards' script compression, http://dean.edwards.name/packer/ .
19
+ *
20
+ * Revision 11: April 23, 2005
21
+ * Fixed bug with 'and' and 'or' operators, fix thanks to
22
+ * Sandy McArthur <sandy (at) mcarthur.org>.
23
+ *
24
+ * Revision 10: April 15, 2005
25
+ * Added support for a virtual root node, supposedly helpful for
26
+ * implementing XForms. Fixed problem with QName node tests and
27
+ * the parent axis.
28
+ *
29
+ * Revision 9: March 17, 2005
30
+ * Namespace resolver tweaked so using the document node as the context
31
+ * for namespace lookups is equivalent to using the document element.
32
+ *
33
+ * Revision 8: February 13, 2005
34
+ * Handle implicit declaration of 'xmlns' namespace prefix.
35
+ * Fixed bug when comparing nodesets.
36
+ * Instance data can now be associated with a FunctionResolver, and
37
+ * workaround for MSXML not supporting 'localName' and 'getElementById',
38
+ * thanks to Grant Gongaware.
39
+ * Fix a few problems when the context node is the root node.
40
+ *
41
+ * Revision 7: February 11, 2005
42
+ * Default namespace resolver fix from Grant Gongaware
43
+ * <grant (at) gongaware.com>.
44
+ *
45
+ * Revision 6: February 10, 2005
46
+ * Fixed bug in 'number' function.
47
+ *
48
+ * Revision 5: February 9, 2005
49
+ * Fixed bug where text nodes not getting converted to string values.
50
+ *
51
+ * Revision 4: January 21, 2005
52
+ * Bug in 'name' function, fix thanks to Bill Edney.
53
+ * Fixed incorrect processing of namespace nodes.
54
+ * Fixed NamespaceResolver to resolve 'xml' namespace.
55
+ * Implemented union '|' operator.
56
+ *
57
+ * Revision 3: January 14, 2005
58
+ * Fixed bug with nodeset comparisons, bug lexing < and >.
59
+ *
60
+ * Revision 2: October 26, 2004
61
+ * QName node test namespace handling fixed. Few other bug fixes.
62
+ *
63
+ * Revision 1: August 13, 2004
64
+ * Bug fixes from William J. Edney <bedney (at) technicalpursuit.com>.
65
+ * Added minimal licence.
66
+ *
67
+ * Initial version: June 14, 2004
68
+ */
69
+
70
+ // XPathParser ///////////////////////////////////////////////////////////////
71
+
72
+ XPathParser.prototype = new Object();
73
+ XPathParser.prototype.constructor = XPathParser;
74
+ XPathParser.superclass = Object.prototype;
75
+
76
+ function XPathParser() {
77
+ this.init();
78
+ }
79
+
80
+ XPathParser.prototype.init = function() {
81
+ this.reduceActions = [];
82
+
83
+ this.reduceActions[3] = function(rhs) {
84
+ return new OrOperation(rhs[0], rhs[2]);
85
+ };
86
+ this.reduceActions[5] = function(rhs) {
87
+ return new AndOperation(rhs[0], rhs[2]);
88
+ };
89
+ this.reduceActions[7] = function(rhs) {
90
+ return new EqualsOperation(rhs[0], rhs[2]);
91
+ };
92
+ this.reduceActions[8] = function(rhs) {
93
+ return new NotEqualOperation(rhs[0], rhs[2]);
94
+ };
95
+ this.reduceActions[10] = function(rhs) {
96
+ return new LessThanOperation(rhs[0], rhs[2]);
97
+ };
98
+ this.reduceActions[11] = function(rhs) {
99
+ return new GreaterThanOperation(rhs[0], rhs[2]);
100
+ };
101
+ this.reduceActions[12] = function(rhs) {
102
+ return new LessThanOrEqualOperation(rhs[0], rhs[2]);
103
+ };
104
+ this.reduceActions[13] = function(rhs) {
105
+ return new GreaterThanOrEqualOperation(rhs[0], rhs[2]);
106
+ };
107
+ this.reduceActions[15] = function(rhs) {
108
+ return new PlusOperation(rhs[0], rhs[2]);
109
+ };
110
+ this.reduceActions[16] = function(rhs) {
111
+ return new MinusOperation(rhs[0], rhs[2]);
112
+ };
113
+ this.reduceActions[18] = function(rhs) {
114
+ return new MultiplyOperation(rhs[0], rhs[2]);
115
+ };
116
+ this.reduceActions[19] = function(rhs) {
117
+ return new DivOperation(rhs[0], rhs[2]);
118
+ };
119
+ this.reduceActions[20] = function(rhs) {
120
+ return new ModOperation(rhs[0], rhs[2]);
121
+ };
122
+ this.reduceActions[22] = function(rhs) {
123
+ return new UnaryMinusOperation(rhs[1]);
124
+ };
125
+ this.reduceActions[24] = function(rhs) {
126
+ return new BarOperation(rhs[0], rhs[2]);
127
+ };
128
+ this.reduceActions[25] = function(rhs) {
129
+ return new PathExpr(undefined, undefined, rhs[0]);
130
+ };
131
+ this.reduceActions[27] = function(rhs) {
132
+ rhs[0].locationPath = rhs[2];
133
+ return rhs[0];
134
+ };
135
+ this.reduceActions[28] = function(rhs) {
136
+ rhs[0].locationPath = rhs[2];
137
+ rhs[0].locationPath.steps.unshift(new Step(Step.DESCENDANTORSELF, new NodeTest(NodeTest.NODE, undefined), []));
138
+ return rhs[0];
139
+ };
140
+ this.reduceActions[29] = function(rhs) {
141
+ return new PathExpr(rhs[0], [], undefined);
142
+ };
143
+ this.reduceActions[30] = function(rhs) {
144
+ if (Utilities.instance_of(rhs[0], PathExpr)) {
145
+ if (rhs[0].filterPredicates == undefined) {
146
+ rhs[0].filterPredicates = [];
147
+ }
148
+ rhs[0].filterPredicates.push(rhs[1]);
149
+ return rhs[0];
150
+ } else {
151
+ return new PathExpr(rhs[0], [rhs[1]], undefined);
152
+ }
153
+ };
154
+ this.reduceActions[32] = function(rhs) {
155
+ return rhs[1];
156
+ };
157
+ this.reduceActions[33] = function(rhs) {
158
+ return new XString(rhs[0]);
159
+ };
160
+ this.reduceActions[34] = function(rhs) {
161
+ return new XNumber(rhs[0]);
162
+ };
163
+ this.reduceActions[36] = function(rhs) {
164
+ return new FunctionCall(rhs[0], []);
165
+ };
166
+ this.reduceActions[37] = function(rhs) {
167
+ return new FunctionCall(rhs[0], rhs[2]);
168
+ };
169
+ this.reduceActions[38] = function(rhs) {
170
+ return [ rhs[0] ];
171
+ };
172
+ this.reduceActions[39] = function(rhs) {
173
+ rhs[2].unshift(rhs[0]);
174
+ return rhs[2];
175
+ };
176
+ this.reduceActions[43] = function(rhs) {
177
+ return new LocationPath(true, []);
178
+ };
179
+ this.reduceActions[44] = function(rhs) {
180
+ rhs[1].absolute = true;
181
+ return rhs[1];
182
+ };
183
+ this.reduceActions[46] = function(rhs) {
184
+ return new LocationPath(false, [ rhs[0] ]);
185
+ };
186
+ this.reduceActions[47] = function(rhs) {
187
+ rhs[0].steps.push(rhs[2]);
188
+ return rhs[0];
189
+ };
190
+ this.reduceActions[49] = function(rhs) {
191
+ return new Step(rhs[0], rhs[1], []);
192
+ };
193
+ this.reduceActions[50] = function(rhs) {
194
+ return new Step(Step.CHILD, rhs[0], []);
195
+ };
196
+ this.reduceActions[51] = function(rhs) {
197
+ return new Step(rhs[0], rhs[1], rhs[2]);
198
+ };
199
+ this.reduceActions[52] = function(rhs) {
200
+ return new Step(Step.CHILD, rhs[0], rhs[1]);
201
+ };
202
+ this.reduceActions[54] = function(rhs) {
203
+ return [ rhs[0] ];
204
+ };
205
+ this.reduceActions[55] = function(rhs) {
206
+ rhs[1].unshift(rhs[0]);
207
+ return rhs[1];
208
+ };
209
+ this.reduceActions[56] = function(rhs) {
210
+ if (rhs[0] == "ancestor") {
211
+ return Step.ANCESTOR;
212
+ } else if (rhs[0] == "ancestor-or-self") {
213
+ return Step.ANCESTORORSELF;
214
+ } else if (rhs[0] == "attribute") {
215
+ return Step.ATTRIBUTE;
216
+ } else if (rhs[0] == "child") {
217
+ return Step.CHILD;
218
+ } else if (rhs[0] == "descendant") {
219
+ return Step.DESCENDANT;
220
+ } else if (rhs[0] == "descendant-or-self") {
221
+ return Step.DESCENDANTORSELF;
222
+ } else if (rhs[0] == "following") {
223
+ return Step.FOLLOWING;
224
+ } else if (rhs[0] == "following-sibling") {
225
+ return Step.FOLLOWINGSIBLING;
226
+ } else if (rhs[0] == "namespace") {
227
+ return Step.NAMESPACE;
228
+ } else if (rhs[0] == "parent") {
229
+ return Step.PARENT;
230
+ } else if (rhs[0] == "preceding") {
231
+ return Step.PRECEDING;
232
+ } else if (rhs[0] == "preceding-sibling") {
233
+ return Step.PRECEDINGSIBLING;
234
+ } else if (rhs[0] == "self") {
235
+ return Step.SELF;
236
+ }
237
+ return -1;
238
+ };
239
+ this.reduceActions[57] = function(rhs) {
240
+ return Step.ATTRIBUTE;
241
+ };
242
+ this.reduceActions[59] = function(rhs) {
243
+ if (rhs[0] == "comment") {
244
+ return new NodeTest(NodeTest.COMMENT, undefined);
245
+ } else if (rhs[0] == "text") {
246
+ return new NodeTest(NodeTest.TEXT, undefined);
247
+ } else if (rhs[0] == "processing-instruction") {
248
+ return new NodeTest(NodeTest.PI, undefined);
249
+ } else if (rhs[0] == "node") {
250
+ return new NodeTest(NodeTest.NODE, undefined);
251
+ }
252
+ return new NodeTest(-1, undefined);
253
+ };
254
+ this.reduceActions[60] = function(rhs) {
255
+ return new NodeTest(NodeTest.PI, rhs[2]);
256
+ };
257
+ this.reduceActions[61] = function(rhs) {
258
+ return rhs[1];
259
+ };
260
+ this.reduceActions[63] = function(rhs) {
261
+ rhs[1].absolute = true;
262
+ rhs[1].steps.unshift(new Step(Step.DESCENDANTORSELF, new NodeTest(NodeTest.NODE, undefined), []));
263
+ return rhs[1];
264
+ };
265
+ this.reduceActions[64] = function(rhs) {
266
+ rhs[0].steps.push(new Step(Step.DESCENDANTORSELF, new NodeTest(NodeTest.NODE, undefined), []));
267
+ rhs[0].steps.push(rhs[2]);
268
+ return rhs[0];
269
+ };
270
+ this.reduceActions[65] = function(rhs) {
271
+ return new Step(Step.SELF, new NodeTest(NodeTest.NODE, undefined), []);
272
+ };
273
+ this.reduceActions[66] = function(rhs) {
274
+ return new Step(Step.PARENT, new NodeTest(NodeTest.NODE, undefined), []);
275
+ };
276
+ this.reduceActions[67] = function(rhs) {
277
+ return new VariableReference(rhs[1]);
278
+ };
279
+ this.reduceActions[68] = function(rhs) {
280
+ return new NodeTest(NodeTest.NAMETESTANY, undefined);
281
+ };
282
+ this.reduceActions[69] = function(rhs) {
283
+ return new NodeTest(NodeTest.NAMETESTPREFIXANY, rhs[0].substring(0, rhs[0].indexOf(":") - 1));
284
+ };
285
+ this.reduceActions[70] = function(rhs) {
286
+ return new NodeTest(NodeTest.NAMETESTQNAME, rhs[0]);
287
+ };
288
+ };
289
+
290
+ XPathParser.actionTable = [
291
+ " s s sssssssss s ss s ss",
292
+ " s ",
293
+ "r rrrrrrrrr rrrrrrr rr r ",
294
+ " rrrrr ",
295
+ " s s sssssssss s ss s ss",
296
+ "rs rrrrrrrr s sssssrrrrrr rrs rs ",
297
+ " s s sssssssss s ss s ss",
298
+ " s ",
299
+ " s ",
300
+ "r rrrrrrrrr rrrrrrr rr rr ",
301
+ "r rrrrrrrrr rrrrrrr rr rr ",
302
+ "r rrrrrrrrr rrrrrrr rr rr ",
303
+ "r rrrrrrrrr rrrrrrr rr rr ",
304
+ "r rrrrrrrrr rrrrrrr rr rr ",
305
+ " s ",
306
+ " s ",
307
+ " s s sssss s s ",
308
+ "r rrrrrrrrr rrrrrrr rr r ",
309
+ "a ",
310
+ "r s rr r ",
311
+ "r sr rr r ",
312
+ "r s rr s rr r ",
313
+ "r rssrr rss rr r ",
314
+ "r rrrrr rrrss rr r ",
315
+ "r rrrrrsss rrrrr rr r ",
316
+ "r rrrrrrrr rrrrr rr r ",
317
+ "r rrrrrrrr rrrrrs rr r ",
318
+ "r rrrrrrrr rrrrrr rr r ",
319
+ "r rrrrrrrr rrrrrr rr r ",
320
+ "r srrrrrrrr rrrrrrs rr sr ",
321
+ "r srrrrrrrr rrrrrrs rr r ",
322
+ "r rrrrrrrrr rrrrrrr rr rr ",
323
+ "r rrrrrrrrr rrrrrrr rr rr ",
324
+ "r rrrrrrrrr rrrrrrr rr rr ",
325
+ "r rrrrrrrr rrrrrr rr r ",
326
+ "r rrrrrrrr rrrrrr rr r ",
327
+ "r rrrrrrrrr rrrrrrr rr r ",
328
+ "r rrrrrrrrr rrrrrrr rr r ",
329
+ " sssss ",
330
+ "r rrrrrrrrr rrrrrrr rr sr ",
331
+ "r rrrrrrrrr rrrrrrr rr r ",
332
+ "r rrrrrrrrr rrrrrrr rr rr ",
333
+ "r rrrrrrrrr rrrrrrr rr rr ",
334
+ " s ",
335
+ "r srrrrrrrr rrrrrrs rr r ",
336
+ "r rrrrrrrr rrrrr rr r ",
337
+ " s ",
338
+ " s ",
339
+ " rrrrr ",
340
+ " s s sssssssss s sss s ss",
341
+ "r srrrrrrrr rrrrrrs rr r ",
342
+ " s s sssssssss s ss s ss",
343
+ " s s sssssssss s ss s ss",
344
+ " s s sssssssss s ss s ss",
345
+ " s s sssssssss s ss s ss",
346
+ " s s sssssssss s ss s ss",
347
+ " s s sssssssss s ss s ss",
348
+ " s s sssssssss s ss s ss",
349
+ " s s sssssssss s ss s ss",
350
+ " s s sssssssss s ss s ss",
351
+ " s s sssssssss s ss s ss",
352
+ " s s sssssssss s ss s ss",
353
+ " s s sssssssss s ss s ss",
354
+ " s s sssssssss s ss s ss",
355
+ " s s sssssssss ss s ss",
356
+ " s s sssssssss s ss s ss",
357
+ " s s sssss s s ",
358
+ " s s sssss s s ",
359
+ "r rrrrrrrrr rrrrrrr rr rr ",
360
+ " s s sssss s s ",
361
+ " s s sssss s s ",
362
+ "r rrrrrrrrr rrrrrrr rr sr ",
363
+ "r rrrrrrrrr rrrrrrr rr sr ",
364
+ "r rrrrrrrrr rrrrrrr rr r ",
365
+ "r rrrrrrrrr rrrrrrr rr rr ",
366
+ " s ",
367
+ "r rrrrrrrrr rrrrrrr rr rr ",
368
+ "r rrrrrrrrr rrrrrrr rr rr ",
369
+ " rr ",
370
+ " s ",
371
+ " rs ",
372
+ "r sr rr r ",
373
+ "r s rr s rr r ",
374
+ "r rssrr rss rr r ",
375
+ "r rssrr rss rr r ",
376
+ "r rrrrr rrrss rr r ",
377
+ "r rrrrr rrrss rr r ",
378
+ "r rrrrr rrrss rr r ",
379
+ "r rrrrr rrrss rr r ",
380
+ "r rrrrrsss rrrrr rr r ",
381
+ "r rrrrrsss rrrrr rr r ",
382
+ "r rrrrrrrr rrrrr rr r ",
383
+ "r rrrrrrrr rrrrr rr r ",
384
+ "r rrrrrrrr rrrrr rr r ",
385
+ "r rrrrrrrr rrrrrr rr r ",
386
+ " r ",
387
+ " s ",
388
+ "r srrrrrrrr rrrrrrs rr r ",
389
+ "r srrrrrrrr rrrrrrs rr r ",
390
+ "r rrrrrrrrr rrrrrrr rr r ",
391
+ "r rrrrrrrrr rrrrrrr rr r ",
392
+ "r rrrrrrrrr rrrrrrr rr r ",
393
+ "r rrrrrrrrr rrrrrrr rr r ",
394
+ "r rrrrrrrrr rrrrrrr rr rr ",
395
+ "r rrrrrrrrr rrrrrrr rr rr ",
396
+ " s s sssssssss s ss s ss",
397
+ "r rrrrrrrrr rrrrrrr rr rr ",
398
+ " r "
399
+ ];
400
+
401
+ XPathParser.actionTableNumber = [
402
+ " 1 0 /.-,+*)(' & %$ # \"!",
403
+ " J ",
404
+ "a aaaaaaaaa aaaaaaa aa a ",
405
+ " YYYYY ",
406
+ " 1 0 /.-,+*)(' & %$ # \"!",
407
+ "K1 KKKKKKKK . +*)('KKKKKK KK# K\" ",
408
+ " 1 0 /.-,+*)(' & %$ # \"!",
409
+ " N ",
410
+ " O ",
411
+ "e eeeeeeeee eeeeeee ee ee ",
412
+ "f fffffffff fffffff ff ff ",
413
+ "d ddddddddd ddddddd dd dd ",
414
+ "B BBBBBBBBB BBBBBBB BB BB ",
415
+ "A AAAAAAAAA AAAAAAA AA AA ",
416
+ " P ",
417
+ " Q ",
418
+ " 1 . +*)(' # \" ",
419
+ "b bbbbbbbbb bbbbbbb bb b ",
420
+ " ",
421
+ "! S !! ! ",
422
+ "\" T\" \"\" \" ",
423
+ "$ V $$ U $$ $ ",
424
+ "& &ZY&& &XW && & ",
425
+ ") ))))) )))\\[ )) ) ",
426
+ ". ....._^] ..... .. . ",
427
+ "1 11111111 11111 11 1 ",
428
+ "5 55555555 55555` 55 5 ",
429
+ "7 77777777 777777 77 7 ",
430
+ "9 99999999 999999 99 9 ",
431
+ ": c:::::::: ::::::b :: a: ",
432
+ "I fIIIIIIII IIIIIIe II I ",
433
+ "= ========= ======= == == ",
434
+ "? ????????? ??????? ?? ?? ",
435
+ "C CCCCCCCCC CCCCCCC CC CC ",
436
+ "J JJJJJJJJ JJJJJJ JJ J ",
437
+ "M MMMMMMMM MMMMMM MM M ",
438
+ "N NNNNNNNNN NNNNNNN NN N ",
439
+ "P PPPPPPPPP PPPPPPP PP P ",
440
+ " +*)(' ",
441
+ "R RRRRRRRRR RRRRRRR RR aR ",
442
+ "U UUUUUUUUU UUUUUUU UU U ",
443
+ "Z ZZZZZZZZZ ZZZZZZZ ZZ ZZ ",
444
+ "c ccccccccc ccccccc cc cc ",
445
+ " j ",
446
+ "L fLLLLLLLL LLLLLLe LL L ",
447
+ "6 66666666 66666 66 6 ",
448
+ " k ",
449
+ " l ",
450
+ " XXXXX ",
451
+ " 1 0 /.-,+*)(' & %$m # \"!",
452
+ "_ f________ ______e __ _ ",
453
+ " 1 0 /.-,+*)(' & %$ # \"!",
454
+ " 1 0 /.-,+*)(' & %$ # \"!",
455
+ " 1 0 /.-,+*)(' & %$ # \"!",
456
+ " 1 0 /.-,+*)(' & %$ # \"!",
457
+ " 1 0 /.-,+*)(' & %$ # \"!",
458
+ " 1 0 /.-,+*)(' & %$ # \"!",
459
+ " 1 0 /.-,+*)(' & %$ # \"!",
460
+ " 1 0 /.-,+*)(' & %$ # \"!",
461
+ " 1 0 /.-,+*)(' & %$ # \"!",
462
+ " 1 0 /.-,+*)(' & %$ # \"!",
463
+ " 1 0 /.-,+*)(' & %$ # \"!",
464
+ " 1 0 /.-,+*)(' & %$ # \"!",
465
+ " 1 0 /.-,+*)(' & %$ # \"!",
466
+ " 1 0 /.-,+*)(' %$ # \"!",
467
+ " 1 0 /.-,+*)(' & %$ # \"!",
468
+ " 1 . +*)(' # \" ",
469
+ " 1 . +*)(' # \" ",
470
+ "> >>>>>>>>> >>>>>>> >> >> ",
471
+ " 1 . +*)(' # \" ",
472
+ " 1 . +*)(' # \" ",
473
+ "Q QQQQQQQQQ QQQQQQQ QQ aQ ",
474
+ "V VVVVVVVVV VVVVVVV VV aV ",
475
+ "T TTTTTTTTT TTTTTTT TT T ",
476
+ "@ @@@@@@@@@ @@@@@@@ @@ @@ ",
477
+ " \x87 ",
478
+ "[ [[[[[[[[[ [[[[[[[ [[ [[ ",
479
+ "D DDDDDDDDD DDDDDDD DD DD ",
480
+ " HH ",
481
+ " \x88 ",
482
+ " F\x89 ",
483
+ "# T# ## # ",
484
+ "% V %% U %% % ",
485
+ "' 'ZY'' 'XW '' ' ",
486
+ "( (ZY(( (XW (( ( ",
487
+ "+ +++++ +++\\[ ++ + ",
488
+ "* ***** ***\\[ ** * ",
489
+ "- ----- ---\\[ -- - ",
490
+ ", ,,,,, ,,,\\[ ,, , ",
491
+ "0 00000_^] 00000 00 0 ",
492
+ "/ /////_^] ///// // / ",
493
+ "2 22222222 22222 22 2 ",
494
+ "3 33333333 33333 33 3 ",
495
+ "4 44444444 44444 44 4 ",
496
+ "8 88888888 888888 88 8 ",
497
+ " ^ ",
498
+ " \x8a ",
499
+ "; f;;;;;;;; ;;;;;;e ;; ; ",
500
+ "< f<<<<<<<< <<<<<<e << < ",
501
+ "O OOOOOOOOO OOOOOOO OO O ",
502
+ "` ````````` ``````` `` ` ",
503
+ "S SSSSSSSSS SSSSSSS SS S ",
504
+ "W WWWWWWWWW WWWWWWW WW W ",
505
+ "\\ \\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\ \\\\ \\\\ ",
506
+ "E EEEEEEEEE EEEEEEE EE EE ",
507
+ " 1 0 /.-,+*)(' & %$ # \"!",
508
+ "] ]]]]]]]]] ]]]]]]] ]] ]] ",
509
+ " G "
510
+ ];
511
+
512
+ XPathParser.gotoTable = [
513
+ "3456789:;<=>?@ AB CDEFGH IJ ",
514
+ " ",
515
+ " ",
516
+ " ",
517
+ "L456789:;<=>?@ AB CDEFGH IJ ",
518
+ " M EFGH IJ ",
519
+ " N;<=>?@ AB CDEFGH IJ ",
520
+ " ",
521
+ " ",
522
+ " ",
523
+ " ",
524
+ " ",
525
+ " ",
526
+ " ",
527
+ " ",
528
+ " ",
529
+ " S EFGH IJ ",
530
+ " ",
531
+ " ",
532
+ " ",
533
+ " ",
534
+ " ",
535
+ " ",
536
+ " ",
537
+ " ",
538
+ " ",
539
+ " ",
540
+ " ",
541
+ " ",
542
+ " e ",
543
+ " ",
544
+ " ",
545
+ " ",
546
+ " ",
547
+ " ",
548
+ " ",
549
+ " ",
550
+ " ",
551
+ " h J ",
552
+ " i j ",
553
+ " ",
554
+ " ",
555
+ " ",
556
+ " ",
557
+ " ",
558
+ " ",
559
+ " ",
560
+ " ",
561
+ " ",
562
+ "o456789:;<=>?@ ABpqCDEFGH IJ ",
563
+ " ",
564
+ " r6789:;<=>?@ AB CDEFGH IJ ",
565
+ " s789:;<=>?@ AB CDEFGH IJ ",
566
+ " t89:;<=>?@ AB CDEFGH IJ ",
567
+ " u89:;<=>?@ AB CDEFGH IJ ",
568
+ " v9:;<=>?@ AB CDEFGH IJ ",
569
+ " w9:;<=>?@ AB CDEFGH IJ ",
570
+ " x9:;<=>?@ AB CDEFGH IJ ",
571
+ " y9:;<=>?@ AB CDEFGH IJ ",
572
+ " z:;<=>?@ AB CDEFGH IJ ",
573
+ " {:;<=>?@ AB CDEFGH IJ ",
574
+ " |;<=>?@ AB CDEFGH IJ ",
575
+ " };<=>?@ AB CDEFGH IJ ",
576
+ " ~;<=>?@ AB CDEFGH IJ ",
577
+ " \x7f=>?@ AB CDEFGH IJ ",
578
+ "\x80456789:;<=>?@ AB CDEFGH IJ\x81",
579
+ " \x82 EFGH IJ ",
580
+ " \x83 EFGH IJ ",
581
+ " ",
582
+ " \x84 GH IJ ",
583
+ " \x85 GH IJ ",
584
+ " i \x86 ",
585
+ " i \x87 ",
586
+ " ",
587
+ " ",
588
+ " ",
589
+ " ",
590
+ " ",
591
+ " ",
592
+ " ",
593
+ " ",
594
+ " ",
595
+ " ",
596
+ " ",
597
+ " ",
598
+ " ",
599
+ " ",
600
+ " ",
601
+ " ",
602
+ " ",
603
+ " ",
604
+ " ",
605
+ " ",
606
+ " ",
607
+ " ",
608
+ " ",
609
+ " ",
610
+ " ",
611
+ " ",
612
+ " ",
613
+ " ",
614
+ " ",
615
+ " ",
616
+ " ",
617
+ " ",
618
+ "o456789:;<=>?@ AB\x8cqCDEFGH IJ ",
619
+ " ",
620
+ " "
621
+ ];
622
+
623
+ XPathParser.productions = [
624
+ [1, 1, 2],
625
+ [2, 1, 3],
626
+ [3, 1, 4],
627
+ [3, 3, 3, -9, 4],
628
+ [4, 1, 5],
629
+ [4, 3, 4, -8, 5],
630
+ [5, 1, 6],
631
+ [5, 3, 5, -22, 6],
632
+ [5, 3, 5, -5, 6],
633
+ [6, 1, 7],
634
+ [6, 3, 6, -23, 7],
635
+ [6, 3, 6, -24, 7],
636
+ [6, 3, 6, -6, 7],
637
+ [6, 3, 6, -7, 7],
638
+ [7, 1, 8],
639
+ [7, 3, 7, -25, 8],
640
+ [7, 3, 7, -26, 8],
641
+ [8, 1, 9],
642
+ [8, 3, 8, -12, 9],
643
+ [8, 3, 8, -11, 9],
644
+ [8, 3, 8, -10, 9],
645
+ [9, 1, 10],
646
+ [9, 2, -26, 9],
647
+ [10, 1, 11],
648
+ [10, 3, 10, -27, 11],
649
+ [11, 1, 12],
650
+ [11, 1, 13],
651
+ [11, 3, 13, -28, 14],
652
+ [11, 3, 13, -4, 14],
653
+ [13, 1, 15],
654
+ [13, 2, 13, 16],
655
+ [15, 1, 17],
656
+ [15, 3, -29, 2, -30],
657
+ [15, 1, -15],
658
+ [15, 1, -16],
659
+ [15, 1, 18],
660
+ [18, 3, -13, -29, -30],
661
+ [18, 4, -13, -29, 19, -30],
662
+ [19, 1, 20],
663
+ [19, 3, 20, -31, 19],
664
+ [20, 1, 2],
665
+ [12, 1, 14],
666
+ [12, 1, 21],
667
+ [21, 1, -28],
668
+ [21, 2, -28, 14],
669
+ [21, 1, 22],
670
+ [14, 1, 23],
671
+ [14, 3, 14, -28, 23],
672
+ [14, 1, 24],
673
+ [23, 2, 25, 26],
674
+ [23, 1, 26],
675
+ [23, 3, 25, 26, 27],
676
+ [23, 2, 26, 27],
677
+ [23, 1, 28],
678
+ [27, 1, 16],
679
+ [27, 2, 16, 27],
680
+ [25, 2, -14, -3],
681
+ [25, 1, -32],
682
+ [26, 1, 29],
683
+ [26, 3, -20, -29, -30],
684
+ [26, 4, -21, -29, -15, -30],
685
+ [16, 3, -33, 30, -34],
686
+ [30, 1, 2],
687
+ [22, 2, -4, 14],
688
+ [24, 3, 14, -4, 23],
689
+ [28, 1, -35],
690
+ [28, 1, -2],
691
+ [17, 2, -36, -18],
692
+ [29, 1, -17],
693
+ [29, 1, -19],
694
+ [29, 1, -18]
695
+ ];
696
+
697
+ XPathParser.DOUBLEDOT = 2;
698
+ XPathParser.DOUBLECOLON = 3;
699
+ XPathParser.DOUBLESLASH = 4;
700
+ XPathParser.NOTEQUAL = 5;
701
+ XPathParser.LESSTHANOREQUAL = 6;
702
+ XPathParser.GREATERTHANOREQUAL = 7;
703
+ XPathParser.AND = 8;
704
+ XPathParser.OR = 9;
705
+ XPathParser.MOD = 10;
706
+ XPathParser.DIV = 11;
707
+ XPathParser.MULTIPLYOPERATOR = 12;
708
+ XPathParser.FUNCTIONNAME = 13;
709
+ XPathParser.AXISNAME = 14;
710
+ XPathParser.LITERAL = 15;
711
+ XPathParser.NUMBER = 16;
712
+ XPathParser.ASTERISKNAMETEST = 17;
713
+ XPathParser.QNAME = 18;
714
+ XPathParser.NCNAMECOLONASTERISK = 19;
715
+ XPathParser.NODETYPE = 20;
716
+ XPathParser.PROCESSINGINSTRUCTIONWITHLITERAL = 21;
717
+ XPathParser.EQUALS = 22;
718
+ XPathParser.LESSTHAN = 23;
719
+ XPathParser.GREATERTHAN = 24;
720
+ XPathParser.PLUS = 25;
721
+ XPathParser.MINUS = 26;
722
+ XPathParser.BAR = 27;
723
+ XPathParser.SLASH = 28;
724
+ XPathParser.LEFTPARENTHESIS = 29;
725
+ XPathParser.RIGHTPARENTHESIS = 30;
726
+ XPathParser.COMMA = 31;
727
+ XPathParser.AT = 32;
728
+ XPathParser.LEFTBRACKET = 33;
729
+ XPathParser.RIGHTBRACKET = 34;
730
+ XPathParser.DOT = 35;
731
+ XPathParser.DOLLAR = 36;
732
+
733
+ XPathParser.prototype.tokenize = function(s1) {
734
+ var types = [];
735
+ var values = [];
736
+ var s = s1 + '\0';
737
+
738
+ var pos = 0;
739
+ var c = s.charAt(pos++);
740
+ while (1) {
741
+ while (c == ' ' || c == '\t' || c == '\r' || c == '\n') {
742
+ c = s.charAt(pos++);
743
+ }
744
+ if (c == '\0' || pos >= s.length) {
745
+ break;
746
+ }
747
+
748
+ if (c == '(') {
749
+ types.push(XPathParser.LEFTPARENTHESIS);
750
+ values.push(c);
751
+ c = s.charAt(pos++);
752
+ continue;
753
+ }
754
+ if (c == ')') {
755
+ types.push(XPathParser.RIGHTPARENTHESIS);
756
+ values.push(c);
757
+ c = s.charAt(pos++);
758
+ continue;
759
+ }
760
+ if (c == '[') {
761
+ types.push(XPathParser.LEFTBRACKET);
762
+ values.push(c);
763
+ c = s.charAt(pos++);
764
+ continue;
765
+ }
766
+ if (c == ']') {
767
+ types.push(XPathParser.RIGHTBRACKET);
768
+ values.push(c);
769
+ c = s.charAt(pos++);
770
+ continue;
771
+ }
772
+ if (c == '@') {
773
+ types.push(XPathParser.AT);
774
+ values.push(c);
775
+ c = s.charAt(pos++);
776
+ continue;
777
+ }
778
+ if (c == ',') {
779
+ types.push(XPathParser.COMMA);
780
+ values.push(c);
781
+ c = s.charAt(pos++);
782
+ continue;
783
+ }
784
+ if (c == '|') {
785
+ types.push(XPathParser.BAR);
786
+ values.push(c);
787
+ c = s.charAt(pos++);
788
+ continue;
789
+ }
790
+ if (c == '+') {
791
+ types.push(XPathParser.PLUS);
792
+ values.push(c);
793
+ c = s.charAt(pos++);
794
+ continue;
795
+ }
796
+ if (c == '-') {
797
+ types.push(XPathParser.MINUS);
798
+ values.push(c);
799
+ c = s.charAt(pos++);
800
+ continue;
801
+ }
802
+ if (c == '=') {
803
+ types.push(XPathParser.EQUALS);
804
+ values.push(c);
805
+ c = s.charAt(pos++);
806
+ continue;
807
+ }
808
+ if (c == '$') {
809
+ types.push(XPathParser.DOLLAR);
810
+ values.push(c);
811
+ c = s.charAt(pos++);
812
+ continue;
813
+ }
814
+
815
+ if (c == '.') {
816
+ c = s.charAt(pos++);
817
+ if (c == '.') {
818
+ types.push(XPathParser.DOUBLEDOT);
819
+ values.push("..");
820
+ c = s.charAt(pos++);
821
+ continue;
822
+ }
823
+ if (c >= '0' && c <= '9') {
824
+ var number = "." + c;
825
+ c = s.charAt(pos++);
826
+ while (c >= '0' && c <= '9') {
827
+ number += c;
828
+ c = s.charAt(pos++);
829
+ }
830
+ types.push(XPathParser.NUMBER);
831
+ values.push(number);
832
+ continue;
833
+ }
834
+ types.push(XPathParser.DOT);
835
+ values.push('.');
836
+ continue;
837
+ }
838
+
839
+ if (c == '\'' || c == '"') {
840
+ var delimiter = c;
841
+ var literal = "";
842
+ while ((c = s.charAt(pos++)) != delimiter) {
843
+ literal += c;
844
+ }
845
+ types.push(XPathParser.LITERAL);
846
+ values.push(literal);
847
+ c = s.charAt(pos++);
848
+ continue;
849
+ }
850
+
851
+ if (c >= '0' && c <= '9') {
852
+ var number = c;
853
+ c = s.charAt(pos++);
854
+ while (c >= '0' && c <= '9') {
855
+ number += c;
856
+ c = s.charAt(pos++);
857
+ }
858
+ if (c == '.') {
859
+ if (s.charAt(pos) >= '0' && s.charAt(pos) <= '9') {
860
+ number += c;
861
+ number += s.charAt(pos++);
862
+ c = s.charAt(pos++);
863
+ while (c >= '0' && c <= '9') {
864
+ number += c;
865
+ c = s.charAt(pos++);
866
+ }
867
+ }
868
+ }
869
+ types.push(XPathParser.NUMBER);
870
+ values.push(number);
871
+ continue;
872
+ }
873
+
874
+ if (c == '*') {
875
+ if (types.length > 0) {
876
+ var last = types[types.length - 1];
877
+ if (last != XPathParser.AT
878
+ && last != XPathParser.DOUBLECOLON
879
+ && last != XPathParser.LEFTPARENTHESIS
880
+ && last != XPathParser.LEFTBRACKET
881
+ && last != XPathParser.AND
882
+ && last != XPathParser.OR
883
+ && last != XPathParser.MOD
884
+ && last != XPathParser.DIV
885
+ && last != XPathParser.MULTIPLYOPERATOR
886
+ && last != XPathParser.SLASH
887
+ && last != XPathParser.DOUBLESLASH
888
+ && last != XPathParser.BAR
889
+ && last != XPathParser.PLUS
890
+ && last != XPathParser.MINUS
891
+ && last != XPathParser.EQUALS
892
+ && last != XPathParser.NOTEQUAL
893
+ && last != XPathParser.LESSTHAN
894
+ && last != XPathParser.LESSTHANOREQUAL
895
+ && last != XPathParser.GREATERTHAN
896
+ && last != XPathParser.GREATERTHANOREQUAL) {
897
+ types.push(XPathParser.MULTIPLYOPERATOR);
898
+ values.push(c);
899
+ c = s.charAt(pos++);
900
+ continue;
901
+ }
902
+ }
903
+ types.push(XPathParser.ASTERISKNAMETEST);
904
+ values.push(c);
905
+ c = s.charAt(pos++);
906
+ continue;
907
+ }
908
+
909
+ if (c == ':') {
910
+ if (s.charAt(pos) == ':') {
911
+ types.push(XPathParser.DOUBLECOLON);
912
+ values.push("::");
913
+ pos++;
914
+ c = s.charAt(pos++);
915
+ continue;
916
+ }
917
+ }
918
+
919
+ if (c == '/') {
920
+ c = s.charAt(pos++);
921
+ if (c == '/') {
922
+ types.push(XPathParser.DOUBLESLASH);
923
+ values.push("//");
924
+ c = s.charAt(pos++);
925
+ continue;
926
+ }
927
+ types.push(XPathParser.SLASH);
928
+ values.push('/');
929
+ continue;
930
+ }
931
+
932
+ if (c == '!') {
933
+ if (s.charAt(pos) == '=') {
934
+ types.push(XPathParser.NOTEQUAL);
935
+ values.push("!=");
936
+ pos++;
937
+ c = s.charAt(pos++);
938
+ continue;
939
+ }
940
+ }
941
+
942
+ if (c == '<') {
943
+ if (s.charAt(pos) == '=') {
944
+ types.push(XPathParser.LESSTHANOREQUAL);
945
+ values.push("<=");
946
+ pos++;
947
+ c = s.charAt(pos++);
948
+ continue;
949
+ }
950
+ types.push(XPathParser.LESSTHAN);
951
+ values.push('<');
952
+ c = s.charAt(pos++);
953
+ continue;
954
+ }
955
+
956
+ if (c == '>') {
957
+ if (s.charAt(pos) == '=') {
958
+ types.push(XPathParser.GREATERTHANOREQUAL);
959
+ values.push(">=");
960
+ pos++;
961
+ c = s.charAt(pos++);
962
+ continue;
963
+ }
964
+ types.push(XPathParser.GREATERTHAN);
965
+ values.push('>');
966
+ c = s.charAt(pos++);
967
+ continue;
968
+ }
969
+
970
+ if (c == '_' || Utilities.isLetter(c.charCodeAt(0))) {
971
+ var name = c;
972
+ c = s.charAt(pos++);
973
+ while (Utilities.isNCNameChar(c.charCodeAt(0))) {
974
+ name += c;
975
+ c = s.charAt(pos++);
976
+ }
977
+ if (types.length > 0) {
978
+ var last = types[types.length - 1];
979
+ if (last != XPathParser.AT
980
+ && last != XPathParser.DOUBLECOLON
981
+ && last != XPathParser.LEFTPARENTHESIS
982
+ && last != XPathParser.LEFTBRACKET
983
+ && last != XPathParser.AND
984
+ && last != XPathParser.OR
985
+ && last != XPathParser.MOD
986
+ && last != XPathParser.DIV
987
+ && last != XPathParser.MULTIPLYOPERATOR
988
+ && last != XPathParser.SLASH
989
+ && last != XPathParser.DOUBLESLASH
990
+ && last != XPathParser.BAR
991
+ && last != XPathParser.PLUS
992
+ && last != XPathParser.MINUS
993
+ && last != XPathParser.EQUALS
994
+ && last != XPathParser.NOTEQUAL
995
+ && last != XPathParser.LESSTHAN
996
+ && last != XPathParser.LESSTHANOREQUAL
997
+ && last != XPathParser.GREATERTHAN
998
+ && last != XPathParser.GREATERTHANOREQUAL) {
999
+ if (name == "and") {
1000
+ types.push(XPathParser.AND);
1001
+ values.push(name);
1002
+ continue;
1003
+ }
1004
+ if (name == "or") {
1005
+ types.push(XPathParser.OR);
1006
+ values.push(name);
1007
+ continue;
1008
+ }
1009
+ if (name == "mod") {
1010
+ types.push(XPathParser.MOD);
1011
+ values.push(name);
1012
+ continue;
1013
+ }
1014
+ if (name == "div") {
1015
+ types.push(XPathParser.DIV);
1016
+ values.push(name);
1017
+ continue;
1018
+ }
1019
+ }
1020
+ }
1021
+ if (c == ':') {
1022
+ if (s.charAt(pos) == '*') {
1023
+ types.push(XPathParser.NCNAMECOLONASTERISK);
1024
+ values.push(name + ":*");
1025
+ pos++;
1026
+ c = s.charAt(pos++);
1027
+ continue;
1028
+ }
1029
+ if (s.charAt(pos) == '_' || Utilities.isLetter(s.charCodeAt(pos))) {
1030
+ name += ':';
1031
+ c = s.charAt(pos++);
1032
+ while (Utilities.isNCNameChar(c.charCodeAt(0))) {
1033
+ name += c;
1034
+ c = s.charAt(pos++);
1035
+ }
1036
+ if (c == '(') {
1037
+ types.push(XPathParser.FUNCTIONNAME);
1038
+ values.push(name);
1039
+ continue;
1040
+ }
1041
+ types.push(XPathParser.QNAME);
1042
+ values.push(name);
1043
+ continue;
1044
+ }
1045
+ if (s.charAt(pos) == ':') {
1046
+ types.push(XPathParser.AXISNAME);
1047
+ values.push(name);
1048
+ continue;
1049
+ }
1050
+ }
1051
+ if (c == '(') {
1052
+ if (name == "comment" || name == "text" || name == "node") {
1053
+ types.push(XPathParser.NODETYPE);
1054
+ values.push(name);
1055
+ continue;
1056
+ }
1057
+ if (name == "processing-instruction") {
1058
+ if (s.charAt(pos) == ')') {
1059
+ types.push(XPathParser.NODETYPE);
1060
+ } else {
1061
+ types.push(XPathParser.PROCESSINGINSTRUCTIONWITHLITERAL);
1062
+ }
1063
+ values.push(name);
1064
+ continue;
1065
+ }
1066
+ types.push(XPathParser.FUNCTIONNAME);
1067
+ values.push(name);
1068
+ continue;
1069
+ }
1070
+ types.push(XPathParser.QNAME);
1071
+ values.push(name);
1072
+ continue;
1073
+ }
1074
+
1075
+ throw new Error("Unexpected character " + c);
1076
+ }
1077
+ types.push(1);
1078
+ values.push("[EOF]");
1079
+ return [types, values];
1080
+ };
1081
+
1082
+ XPathParser.SHIFT = 's';
1083
+ XPathParser.REDUCE = 'r';
1084
+ XPathParser.ACCEPT = 'a';
1085
+
1086
+ XPathParser.prototype.parse = function(s) {
1087
+ var types;
1088
+ var values;
1089
+ var res = this.tokenize(s);
1090
+ if (res == undefined) {
1091
+ return undefined;
1092
+ }
1093
+ types = res[0];
1094
+ values = res[1];
1095
+ var tokenPos = 0;
1096
+ var state = [];
1097
+ var tokenType = [];
1098
+ var tokenValue = [];
1099
+ var s;
1100
+ var a;
1101
+ var t;
1102
+
1103
+ state.push(0);
1104
+ tokenType.push(1);
1105
+ tokenValue.push("_S");
1106
+
1107
+ a = types[tokenPos];
1108
+ t = values[tokenPos++];
1109
+ while (1) {
1110
+ s = state[state.length - 1];
1111
+ switch (XPathParser.actionTable[s].charAt(a - 1)) {
1112
+ case XPathParser.SHIFT:
1113
+ tokenType.push(-a);
1114
+ tokenValue.push(t);
1115
+ state.push(XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32);
1116
+ a = types[tokenPos];
1117
+ t = values[tokenPos++];
1118
+ break;
1119
+ case XPathParser.REDUCE:
1120
+ var num = XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][1];
1121
+ var rhs = [];
1122
+ for (var i = 0; i < num; i++) {
1123
+ tokenType.pop();
1124
+ rhs.unshift(tokenValue.pop());
1125
+ state.pop();
1126
+ }
1127
+ var s_ = state[state.length - 1];
1128
+ tokenType.push(XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][0]);
1129
+ if (this.reduceActions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32] == undefined) {
1130
+ tokenValue.push(rhs[0]);
1131
+ } else {
1132
+ tokenValue.push(this.reduceActions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32](rhs));
1133
+ }
1134
+ state.push(XPathParser.gotoTable[s_].charCodeAt(XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][0] - 2) - 33);
1135
+ break;
1136
+ case XPathParser.ACCEPT:
1137
+ return new XPath(tokenValue.pop());
1138
+ default:
1139
+ throw new Error("XPath parse error");
1140
+ }
1141
+ }
1142
+ };
1143
+
1144
+ // XPath /////////////////////////////////////////////////////////////////////
1145
+
1146
+ XPath.prototype = new Object();
1147
+ XPath.prototype.constructor = XPath;
1148
+ XPath.superclass = Object.prototype;
1149
+
1150
+ function XPath(e) {
1151
+ this.expression = e;
1152
+ }
1153
+
1154
+ XPath.prototype.toString = function() {
1155
+ return this.expression.toString();
1156
+ };
1157
+
1158
+ XPath.prototype.evaluate = function(c) {
1159
+ c.contextNode = c.expressionContextNode;
1160
+ c.contextSize = 1;
1161
+ c.contextPosition = 1;
1162
+ c.caseInsensitive = false;
1163
+ if (c.contextNode != null) {
1164
+ var doc = c.contextNode;
1165
+ if (doc.nodeType != 9 /*Node.DOCUMENT_NODE*/) {
1166
+ doc = doc.ownerDocument;
1167
+ }
1168
+ c.caseInsensitive = doc.implementation == null
1169
+ || doc.implementation.hasFeature("HTML", "2.0");
1170
+ }
1171
+ return this.expression.evaluate(c);
1172
+ };
1173
+
1174
+ XPath.XML_NAMESPACE_URI = "http://www.w3.org/XML/1998/namespace";
1175
+ XPath.XMLNS_NAMESPACE_URI = "http://www.w3.org/2000/xmlns/";
1176
+
1177
+ // Expression ////////////////////////////////////////////////////////////////
1178
+
1179
+ Expression.prototype = new Object();
1180
+ Expression.prototype.constructor = Expression;
1181
+ Expression.superclass = Object.prototype;
1182
+
1183
+ function Expression() {
1184
+ }
1185
+
1186
+ Expression.prototype.init = function() {
1187
+ };
1188
+
1189
+ Expression.prototype.toString = function() {
1190
+ return "<Expression>";
1191
+ };
1192
+
1193
+ Expression.prototype.evaluate = function(c) {
1194
+ throw new Error("Could not evaluate expression.");
1195
+ };
1196
+
1197
+ // UnaryOperation ////////////////////////////////////////////////////////////
1198
+
1199
+ UnaryOperation.prototype = new Expression();
1200
+ UnaryOperation.prototype.constructor = UnaryOperation;
1201
+ UnaryOperation.superclass = Expression.prototype;
1202
+
1203
+ function UnaryOperation(rhs) {
1204
+ if (arguments.length > 0) {
1205
+ this.init(rhs);
1206
+ }
1207
+ }
1208
+
1209
+ UnaryOperation.prototype.init = function(rhs) {
1210
+ this.rhs = rhs;
1211
+ };
1212
+
1213
+ // UnaryMinusOperation ///////////////////////////////////////////////////////
1214
+
1215
+ UnaryMinusOperation.prototype = new UnaryOperation();
1216
+ UnaryMinusOperation.prototype.constructor = UnaryMinusOperation;
1217
+ UnaryMinusOperation.superclass = UnaryOperation.prototype;
1218
+
1219
+ function UnaryMinusOperation(rhs) {
1220
+ if (arguments.length > 0) {
1221
+ this.init(rhs);
1222
+ }
1223
+ }
1224
+
1225
+ UnaryMinusOperation.prototype.init = function(rhs) {
1226
+ UnaryMinusOperation.superclass.init.call(this, rhs);
1227
+ };
1228
+
1229
+ UnaryMinusOperation.prototype.evaluate = function(c) {
1230
+ return this.rhs.evaluate(c).number().negate();
1231
+ };
1232
+
1233
+ UnaryMinusOperation.prototype.toString = function() {
1234
+ return "-" + this.rhs.toString();
1235
+ };
1236
+
1237
+ // BinaryOperation ///////////////////////////////////////////////////////////
1238
+
1239
+ BinaryOperation.prototype = new Expression();
1240
+ BinaryOperation.prototype.constructor = BinaryOperation;
1241
+ BinaryOperation.superclass = Expression.prototype;
1242
+
1243
+ function BinaryOperation(lhs, rhs) {
1244
+ if (arguments.length > 0) {
1245
+ this.init(lhs, rhs);
1246
+ }
1247
+ }
1248
+
1249
+ BinaryOperation.prototype.init = function(lhs, rhs) {
1250
+ this.lhs = lhs;
1251
+ this.rhs = rhs;
1252
+ };
1253
+
1254
+ // OrOperation ///////////////////////////////////////////////////////////////
1255
+
1256
+ OrOperation.prototype = new BinaryOperation();
1257
+ OrOperation.prototype.constructor = OrOperation;
1258
+ OrOperation.superclass = BinaryOperation.prototype;
1259
+
1260
+ function OrOperation(lhs, rhs) {
1261
+ if (arguments.length > 0) {
1262
+ this.init(lhs, rhs);
1263
+ }
1264
+ }
1265
+
1266
+ OrOperation.prototype.init = function(lhs, rhs) {
1267
+ OrOperation.superclass.init.call(this, lhs, rhs);
1268
+ };
1269
+
1270
+ OrOperation.prototype.toString = function() {
1271
+ return "(" + this.lhs.toString() + " or " + this.rhs.toString() + ")";
1272
+ };
1273
+
1274
+ OrOperation.prototype.evaluate = function(c) {
1275
+ var b = this.lhs.evaluate(c).bool();
1276
+ if (b.booleanValue()) {
1277
+ return b;
1278
+ }
1279
+ return this.rhs.evaluate(c).bool();
1280
+ };
1281
+
1282
+ // AndOperation //////////////////////////////////////////////////////////////
1283
+
1284
+ AndOperation.prototype = new BinaryOperation();
1285
+ AndOperation.prototype.constructor = AndOperation;
1286
+ AndOperation.superclass = BinaryOperation.prototype;
1287
+
1288
+ function AndOperation(lhs, rhs) {
1289
+ if (arguments.length > 0) {
1290
+ this.init(lhs, rhs);
1291
+ }
1292
+ }
1293
+
1294
+ AndOperation.prototype.init = function(lhs, rhs) {
1295
+ AndOperation.superclass.init.call(this, lhs, rhs);
1296
+ };
1297
+
1298
+ AndOperation.prototype.toString = function() {
1299
+ return "(" + this.lhs.toString() + " and " + this.rhs.toString() + ")";
1300
+ };
1301
+
1302
+ AndOperation.prototype.evaluate = function(c) {
1303
+ var b = this.lhs.evaluate(c).bool();
1304
+ if (!b.booleanValue()) {
1305
+ return b;
1306
+ }
1307
+ return this.rhs.evaluate(c).bool();
1308
+ };
1309
+
1310
+ // EqualsOperation ///////////////////////////////////////////////////////////
1311
+
1312
+ EqualsOperation.prototype = new BinaryOperation();
1313
+ EqualsOperation.prototype.constructor = EqualsOperation;
1314
+ EqualsOperation.superclass = BinaryOperation.prototype;
1315
+
1316
+ function EqualsOperation(lhs, rhs) {
1317
+ if (arguments.length > 0) {
1318
+ this.init(lhs, rhs);
1319
+ }
1320
+ }
1321
+
1322
+ EqualsOperation.prototype.init = function(lhs, rhs) {
1323
+ EqualsOperation.superclass.init.call(this, lhs, rhs);
1324
+ };
1325
+
1326
+ EqualsOperation.prototype.toString = function() {
1327
+ return "(" + this.lhs.toString() + " = " + this.rhs.toString() + ")";
1328
+ };
1329
+
1330
+ EqualsOperation.prototype.evaluate = function(c) {
1331
+ return this.lhs.evaluate(c).equals(this.rhs.evaluate(c));
1332
+ };
1333
+
1334
+ // NotEqualOperation /////////////////////////////////////////////////////////
1335
+
1336
+ NotEqualOperation.prototype = new BinaryOperation();
1337
+ NotEqualOperation.prototype.constructor = NotEqualOperation;
1338
+ NotEqualOperation.superclass = BinaryOperation.prototype;
1339
+
1340
+ function NotEqualOperation(lhs, rhs) {
1341
+ if (arguments.length > 0) {
1342
+ this.init(lhs, rhs);
1343
+ }
1344
+ }
1345
+
1346
+ NotEqualOperation.prototype.init = function(lhs, rhs) {
1347
+ NotEqualOperation.superclass.init.call(this, lhs, rhs);
1348
+ };
1349
+
1350
+ NotEqualOperation.prototype.toString = function() {
1351
+ return "(" + this.lhs.toString() + " != " + this.rhs.toString() + ")";
1352
+ };
1353
+
1354
+ NotEqualOperation.prototype.evaluate = function(c) {
1355
+ return this.lhs.evaluate(c).notequal(this.rhs.evaluate(c));
1356
+ };
1357
+
1358
+ // LessThanOperation /////////////////////////////////////////////////////////
1359
+
1360
+ LessThanOperation.prototype = new BinaryOperation();
1361
+ LessThanOperation.prototype.constructor = LessThanOperation;
1362
+ LessThanOperation.superclass = BinaryOperation.prototype;
1363
+
1364
+ function LessThanOperation(lhs, rhs) {
1365
+ if (arguments.length > 0) {
1366
+ this.init(lhs, rhs);
1367
+ }
1368
+ }
1369
+
1370
+ LessThanOperation.prototype.init = function(lhs, rhs) {
1371
+ LessThanOperation.superclass.init.call(this, lhs, rhs);
1372
+ };
1373
+
1374
+ LessThanOperation.prototype.evaluate = function(c) {
1375
+ return this.lhs.evaluate(c).lessthan(this.rhs.evaluate(c));
1376
+ };
1377
+
1378
+ LessThanOperation.prototype.toString = function() {
1379
+ return "(" + this.lhs.toString() + " < " + this.rhs.toString() + ")";
1380
+ };
1381
+
1382
+ // GreaterThanOperation //////////////////////////////////////////////////////
1383
+
1384
+ GreaterThanOperation.prototype = new BinaryOperation();
1385
+ GreaterThanOperation.prototype.constructor = GreaterThanOperation;
1386
+ GreaterThanOperation.superclass = BinaryOperation.prototype;
1387
+
1388
+ function GreaterThanOperation(lhs, rhs) {
1389
+ if (arguments.length > 0) {
1390
+ this.init(lhs, rhs);
1391
+ }
1392
+ }
1393
+
1394
+ GreaterThanOperation.prototype.init = function(lhs, rhs) {
1395
+ GreaterThanOperation.superclass.init.call(this, lhs, rhs);
1396
+ };
1397
+
1398
+ GreaterThanOperation.prototype.evaluate = function(c) {
1399
+ return this.lhs.evaluate(c).greaterthan(this.rhs.evaluate(c));
1400
+ };
1401
+
1402
+ GreaterThanOperation.prototype.toString = function() {
1403
+ return "(" + this.lhs.toString() + " > " + this.rhs.toString() + ")";
1404
+ };
1405
+
1406
+ // LessThanOrEqualOperation //////////////////////////////////////////////////
1407
+
1408
+ LessThanOrEqualOperation.prototype = new BinaryOperation();
1409
+ LessThanOrEqualOperation.prototype.constructor = LessThanOrEqualOperation;
1410
+ LessThanOrEqualOperation.superclass = BinaryOperation.prototype;
1411
+
1412
+ function LessThanOrEqualOperation(lhs, rhs) {
1413
+ if (arguments.length > 0) {
1414
+ this.init(lhs, rhs);
1415
+ }
1416
+ }
1417
+
1418
+ LessThanOrEqualOperation.prototype.init = function(lhs, rhs) {
1419
+ LessThanOrEqualOperation.superclass.init.call(this, lhs, rhs);
1420
+ };
1421
+
1422
+ LessThanOrEqualOperation.prototype.evaluate = function(c) {
1423
+ return this.lhs.evaluate(c).lessthanorequal(this.rhs.evaluate(c));
1424
+ };
1425
+
1426
+ LessThanOrEqualOperation.prototype.toString = function() {
1427
+ return "(" + this.lhs.toString() + " <= " + this.rhs.toString() + ")";
1428
+ };
1429
+
1430
+ // GreaterThanOrEqualOperation ///////////////////////////////////////////////
1431
+
1432
+ GreaterThanOrEqualOperation.prototype = new BinaryOperation();
1433
+ GreaterThanOrEqualOperation.prototype.constructor = GreaterThanOrEqualOperation;
1434
+ GreaterThanOrEqualOperation.superclass = BinaryOperation.prototype;
1435
+
1436
+ function GreaterThanOrEqualOperation(lhs, rhs) {
1437
+ if (arguments.length > 0) {
1438
+ this.init(lhs, rhs);
1439
+ }
1440
+ }
1441
+
1442
+ GreaterThanOrEqualOperation.prototype.init = function(lhs, rhs) {
1443
+ GreaterThanOrEqualOperation.superclass.init.call(this, lhs, rhs);
1444
+ };
1445
+
1446
+ GreaterThanOrEqualOperation.prototype.evaluate = function(c) {
1447
+ return this.lhs.evaluate(c).greaterthanorequal(this.rhs.evaluate(c));
1448
+ };
1449
+
1450
+ GreaterThanOrEqualOperation.prototype.toString = function() {
1451
+ return "(" + this.lhs.toString() + " >= " + this.rhs.toString() + ")";
1452
+ };
1453
+
1454
+ // PlusOperation /////////////////////////////////////////////////////////////
1455
+
1456
+ PlusOperation.prototype = new BinaryOperation();
1457
+ PlusOperation.prototype.constructor = PlusOperation;
1458
+ PlusOperation.superclass = BinaryOperation.prototype;
1459
+
1460
+ function PlusOperation(lhs, rhs) {
1461
+ if (arguments.length > 0) {
1462
+ this.init(lhs, rhs);
1463
+ }
1464
+ }
1465
+
1466
+ PlusOperation.prototype.init = function(lhs, rhs) {
1467
+ PlusOperation.superclass.init.call(this, lhs, rhs);
1468
+ };
1469
+
1470
+ PlusOperation.prototype.evaluate = function(c) {
1471
+ return this.lhs.evaluate(c).number().plus(this.rhs.evaluate(c).number());
1472
+ };
1473
+
1474
+ PlusOperation.prototype.toString = function() {
1475
+ return "(" + this.lhs.toString() + " + " + this.rhs.toString() + ")";
1476
+ };
1477
+
1478
+ // MinusOperation ////////////////////////////////////////////////////////////
1479
+
1480
+ MinusOperation.prototype = new BinaryOperation();
1481
+ MinusOperation.prototype.constructor = MinusOperation;
1482
+ MinusOperation.superclass = BinaryOperation.prototype;
1483
+
1484
+ function MinusOperation(lhs, rhs) {
1485
+ if (arguments.length > 0) {
1486
+ this.init(lhs, rhs);
1487
+ }
1488
+ }
1489
+
1490
+ MinusOperation.prototype.init = function(lhs, rhs) {
1491
+ MinusOperation.superclass.init.call(this, lhs, rhs);
1492
+ };
1493
+
1494
+ MinusOperation.prototype.evaluate = function(c) {
1495
+ return this.lhs.evaluate(c).number().minus(this.rhs.evaluate(c).number());
1496
+ };
1497
+
1498
+ MinusOperation.prototype.toString = function() {
1499
+ return "(" + this.lhs.toString() + " - " + this.rhs.toString() + ")";
1500
+ };
1501
+
1502
+ // MultiplyOperation /////////////////////////////////////////////////////////
1503
+
1504
+ MultiplyOperation.prototype = new BinaryOperation();
1505
+ MultiplyOperation.prototype.constructor = MultiplyOperation;
1506
+ MultiplyOperation.superclass = BinaryOperation.prototype;
1507
+
1508
+ function MultiplyOperation(lhs, rhs) {
1509
+ if (arguments.length > 0) {
1510
+ this.init(lhs, rhs);
1511
+ }
1512
+ }
1513
+
1514
+ MultiplyOperation.prototype.init = function(lhs, rhs) {
1515
+ MultiplyOperation.superclass.init.call(this, lhs, rhs);
1516
+ };
1517
+
1518
+ MultiplyOperation.prototype.evaluate = function(c) {
1519
+ return this.lhs.evaluate(c).number().multiply(this.rhs.evaluate(c).number());
1520
+ };
1521
+
1522
+ MultiplyOperation.prototype.toString = function() {
1523
+ return "(" + this.lhs.toString() + " * " + this.rhs.toString() + ")";
1524
+ };
1525
+
1526
+ // DivOperation //////////////////////////////////////////////////////////////
1527
+
1528
+ DivOperation.prototype = new BinaryOperation();
1529
+ DivOperation.prototype.constructor = DivOperation;
1530
+ DivOperation.superclass = BinaryOperation.prototype;
1531
+
1532
+ function DivOperation(lhs, rhs) {
1533
+ if (arguments.length > 0) {
1534
+ this.init(lhs, rhs);
1535
+ }
1536
+ }
1537
+
1538
+ DivOperation.prototype.init = function(lhs, rhs) {
1539
+ DivOperation.superclass.init.call(this, lhs, rhs);
1540
+ };
1541
+
1542
+ DivOperation.prototype.evaluate = function(c) {
1543
+ return this.lhs.evaluate(c).number().div(this.rhs.evaluate(c).number());
1544
+ };
1545
+
1546
+ DivOperation.prototype.toString = function() {
1547
+ return "(" + this.lhs.toString() + " div " + this.rhs.toString() + ")";
1548
+ };
1549
+
1550
+ // ModOperation //////////////////////////////////////////////////////////////
1551
+
1552
+ ModOperation.prototype = new BinaryOperation();
1553
+ ModOperation.prototype.constructor = ModOperation;
1554
+ ModOperation.superclass = BinaryOperation.prototype;
1555
+
1556
+ function ModOperation(lhs, rhs) {
1557
+ if (arguments.length > 0) {
1558
+ this.init(lhs, rhs);
1559
+ }
1560
+ }
1561
+
1562
+ ModOperation.prototype.init = function(lhs, rhs) {
1563
+ ModOperation.superclass.init.call(this, lhs, rhs);
1564
+ };
1565
+
1566
+ ModOperation.prototype.evaluate = function(c) {
1567
+ return this.lhs.evaluate(c).number().mod(this.rhs.evaluate(c).number());
1568
+ };
1569
+
1570
+ ModOperation.prototype.toString = function() {
1571
+ return "(" + this.lhs.toString() + " mod " + this.rhs.toString() + ")";
1572
+ };
1573
+
1574
+ // BarOperation //////////////////////////////////////////////////////////////
1575
+
1576
+ BarOperation.prototype = new BinaryOperation();
1577
+ BarOperation.prototype.constructor = BarOperation;
1578
+ BarOperation.superclass = BinaryOperation.prototype;
1579
+
1580
+ function BarOperation(lhs, rhs) {
1581
+ if (arguments.length > 0) {
1582
+ this.init(lhs, rhs);
1583
+ }
1584
+ }
1585
+
1586
+ BarOperation.prototype.init = function(lhs, rhs) {
1587
+ BarOperation.superclass.init.call(this, lhs, rhs);
1588
+ };
1589
+
1590
+ BarOperation.prototype.evaluate = function(c) {
1591
+ return this.lhs.evaluate(c).nodeset().union(this.rhs.evaluate(c).nodeset());
1592
+ };
1593
+
1594
+ BarOperation.prototype.toString = function() {
1595
+ return this.lhs.toString() + " | " + this.rhs.toString();
1596
+ };
1597
+
1598
+ // PathExpr //////////////////////////////////////////////////////////////////
1599
+
1600
+ PathExpr.prototype = new Expression();
1601
+ PathExpr.prototype.constructor = PathExpr;
1602
+ PathExpr.superclass = Expression.prototype;
1603
+
1604
+ function PathExpr(filter, filterPreds, locpath) {
1605
+ if (arguments.length > 0) {
1606
+ this.init(filter, filterPreds, locpath);
1607
+ }
1608
+ }
1609
+
1610
+ PathExpr.prototype.init = function(filter, filterPreds, locpath) {
1611
+ PathExpr.superclass.init.call(this);
1612
+ this.filter = filter;
1613
+ this.filterPredicates = filterPreds;
1614
+ this.locationPath = locpath;
1615
+ };
1616
+
1617
+ PathExpr.prototype.evaluate = function(c) {
1618
+ var nodes;
1619
+ var xpc = new XPathContext();
1620
+ xpc.variableResolver = c.variableResolver;
1621
+ xpc.functionResolver = c.functionResolver;
1622
+ xpc.namespaceResolver = c.namespaceResolver;
1623
+ xpc.expressionContextNode = c.expressionContextNode;
1624
+ xpc.virtualRoot = c.virtualRoot;
1625
+ xpc.caseInsensitive = c.caseInsensitive;
1626
+ if (this.filter == null) {
1627
+ nodes = [ c.contextNode ];
1628
+ } else {
1629
+ var ns = this.filter.evaluate(c);
1630
+ if (!Utilities.instance_of(ns, XNodeSet)) {
1631
+ if (this.filterPredicates != null && this.filterPredicates.length > 0 || this.locationPath != null) {
1632
+ throw new Error("Path expression filter must evaluate to a nodset if predicates or location path are used");
1633
+ }
1634
+ return ns;
1635
+ }
1636
+ nodes = ns.toArray();
1637
+ if (this.filterPredicates != null) {
1638
+ // apply each of the predicates in turn
1639
+ for (var j = 0; j < this.filterPredicates.length; j++) {
1640
+ var pred = this.filterPredicates[j];
1641
+ var newNodes = [];
1642
+ xpc.contextSize = nodes.length;
1643
+ for (xpc.contextPosition = 1; xpc.contextPosition <= xpc.contextSize; xpc.contextPosition++) {
1644
+ xpc.contextNode = nodes[xpc.contextPosition - 1];
1645
+ if (this.predicateMatches(pred, xpc)) {
1646
+ newNodes.push(xpc.contextNode);
1647
+ }
1648
+ }
1649
+ nodes = newNodes;
1650
+ }
1651
+ }
1652
+ }
1653
+ if (this.locationPath != null) {
1654
+ if (this.locationPath.absolute) {
1655
+ if (nodes[0].nodeType != 9 /*Node.DOCUMENT_NODE*/) {
1656
+ if (xpc.virtualRoot != null) {
1657
+ nodes = [ xpc.virtualRoot ];
1658
+ } else {
1659
+ nodes = [ nodes[0].ownerDocument ];
1660
+ }
1661
+ } else {
1662
+ nodes = [ nodes[0] ];
1663
+ }
1664
+ }
1665
+ for (var i = 0; i < this.locationPath.steps.length; i++) {
1666
+ var step = this.locationPath.steps[i];
1667
+ var newNodes = [];
1668
+ for (var j = 0; j < nodes.length; j++) {
1669
+ xpc.contextNode = nodes[j];
1670
+ switch (step.axis) {
1671
+ case Step.ANCESTOR:
1672
+ // look at all the ancestor nodes
1673
+ if (xpc.contextNode === xpc.virtualRoot) {
1674
+ break;
1675
+ }
1676
+ var m;
1677
+ if (xpc.contextNode.nodeType == 2 /*Node.ATTRIBUTE_NODE*/) {
1678
+ m = this.getOwnerElement(xpc.contextNode);
1679
+ } else {
1680
+ m = xpc.contextNode.parentNode;
1681
+ }
1682
+ while (m != null) {
1683
+ if (step.nodeTest.matches(m, xpc)) {
1684
+ newNodes.push(m);
1685
+ }
1686
+ if (m === xpc.virtualRoot) {
1687
+ break;
1688
+ }
1689
+ m = m.parentNode;
1690
+ }
1691
+ break;
1692
+
1693
+ case Step.ANCESTORORSELF:
1694
+ // look at all the ancestor nodes and the current node
1695
+ for (var m = xpc.contextNode; m != null; m = m.nodeType == 2 /*Node.ATTRIBUTE_NODE*/ ? this.getOwnerElement(m) : m.parentNode) {
1696
+ if (step.nodeTest.matches(m, xpc)) {
1697
+ newNodes.push(m);
1698
+ }
1699
+ if (m === xpc.virtualRoot) {
1700
+ break;
1701
+ }
1702
+ }
1703
+ break;
1704
+
1705
+ case Step.ATTRIBUTE:
1706
+ // look at the attributes
1707
+ var nnm = xpc.contextNode.attributes;
1708
+ if (nnm != null) {
1709
+ for (var k = 0; k < nnm.length; k++) {
1710
+ var m = nnm.item(k);
1711
+ if (step.nodeTest.matches(m, xpc)) {
1712
+ newNodes.push(m);
1713
+ }
1714
+ }
1715
+ }
1716
+ break;
1717
+
1718
+ case Step.CHILD:
1719
+ // look at all child elements
1720
+ for (var m = xpc.contextNode.firstChild; m != null; m = m.nextSibling) {
1721
+ if (step.nodeTest.matches(m, xpc)) {
1722
+ newNodes.push(m);
1723
+ }
1724
+ }
1725
+ break;
1726
+
1727
+ case Step.DESCENDANT:
1728
+ // look at all descendant nodes
1729
+ var st = [ xpc.contextNode.firstChild ];
1730
+ while (st.length > 0) {
1731
+ for (var m = st.pop(); m != null; ) {
1732
+ if (step.nodeTest.matches(m, xpc)) {
1733
+ newNodes.push(m);
1734
+ }
1735
+ if (m.firstChild != null) {
1736
+ st.push(m.nextSibling);
1737
+ m = m.firstChild;
1738
+ } else {
1739
+ m = m.nextSibling;
1740
+ }
1741
+ }
1742
+ }
1743
+ break;
1744
+
1745
+ case Step.DESCENDANTORSELF:
1746
+ // look at self
1747
+ if (step.nodeTest.matches(xpc.contextNode, xpc)) {
1748
+ newNodes.push(xpc.contextNode);
1749
+ }
1750
+ // look at all descendant nodes
1751
+ var st = [ xpc.contextNode.firstChild ];
1752
+ while (st.length > 0) {
1753
+ for (var m = st.pop(); m != null; ) {
1754
+ if (step.nodeTest.matches(m, xpc)) {
1755
+ newNodes.push(m);
1756
+ }
1757
+ if (m.firstChild != null) {
1758
+ st.push(m.nextSibling);
1759
+ m = m.firstChild;
1760
+ } else {
1761
+ m = m.nextSibling;
1762
+ }
1763
+ }
1764
+ }
1765
+ break;
1766
+
1767
+ case Step.FOLLOWING:
1768
+ if (xpc.contextNode === xpc.virtualRoot) {
1769
+ break;
1770
+ }
1771
+ var st = [];
1772
+ if (xpc.contextNode.firstChild != null) {
1773
+ st.unshift(xpc.contextNode.firstChild);
1774
+ } else {
1775
+ st.unshift(xpc.contextNode.nextSibling);
1776
+ }
1777
+ for (var m = xpc.contextNode.parentNode; m != null && m.nodeType != 9 /*Node.DOCUMENT_NODE*/ && m !== xpc.virtualRoot; m = m.parentNode) {
1778
+ st.unshift(m.nextSibling);
1779
+ }
1780
+ do {
1781
+ for (var m = st.pop(); m != null; ) {
1782
+ if (step.nodeTest.matches(m, xpc)) {
1783
+ newNodes.push(m);
1784
+ }
1785
+ if (m.firstChild != null) {
1786
+ st.push(m.nextSibling);
1787
+ m = m.firstChild;
1788
+ } else {
1789
+ m = m.nextSibling;
1790
+ }
1791
+ }
1792
+ } while (st.length > 0);
1793
+ break;
1794
+
1795
+ case Step.FOLLOWINGSIBLING:
1796
+ if (xpc.contextNode === xpc.virtualRoot) {
1797
+ break;
1798
+ }
1799
+ for (var m = xpc.contextNode.nextSibling; m != null; m = m.nextSibling) {
1800
+ if (step.nodeTest.matches(m, xpc)) {
1801
+ newNodes.push(m);
1802
+ }
1803
+ }
1804
+ break;
1805
+
1806
+ case Step.NAMESPACE:
1807
+ var n = {};
1808
+ if (xpc.contextNode.nodeType == 1 /*Node.ELEMENT_NODE*/) {
1809
+ n["xml"] = XPath.XML_NAMESPACE_URI;
1810
+ n["xmlns"] = XPath.XMLNS_NAMESPACE_URI;
1811
+ for (var m = xpc.contextNode; m != null && m.nodeType == 1 /*Node.ELEMENT_NODE*/; m = m.parentNode) {
1812
+ for (var k = 0; k < m.attributes.length; k++) {
1813
+ var attr = m.attributes.item(k);
1814
+ var nm = String(attr.name);
1815
+ if (nm == "xmlns") {
1816
+ if (n[""] == undefined) {
1817
+ n[""] = attr.value;
1818
+ }
1819
+ } else if (nm.length > 6 && nm.substring(0, 6) == "xmlns:") {
1820
+ var pre = nm.substring(6, nm.length);
1821
+ if (n[pre] == undefined) {
1822
+ n[pre] = attr.value;
1823
+ }
1824
+ }
1825
+ }
1826
+ }
1827
+ for (var pre in n) {
1828
+ var nsn = new NamespaceNode(pre, n[pre], xpc.contextNode);
1829
+ if (step.nodeTest.matches(nsn, xpc)) {
1830
+ newNodes.push(nsn);
1831
+ }
1832
+ }
1833
+ }
1834
+ break;
1835
+
1836
+ case Step.PARENT:
1837
+ m = null;
1838
+ if (xpc.contextNode !== xpc.virtualRoot) {
1839
+ if (xpc.contextNode.nodeType == 2 /*Node.ATTRIBUTE_NODE*/) {
1840
+ m = this.getOwnerElement(xpc.contextNode);
1841
+ } else {
1842
+ m = xpc.contextNode.parentNode;
1843
+ }
1844
+ }
1845
+ if (m != null && step.nodeTest.matches(m, xpc)) {
1846
+ newNodes.push(m);
1847
+ }
1848
+ break;
1849
+
1850
+ case Step.PRECEDING:
1851
+ var st;
1852
+ if (xpc.virtualRoot != null) {
1853
+ st = [ xpc.virtualRoot ];
1854
+ } else {
1855
+ st = xpc.contextNode.nodeType == 9 /*Node.DOCUMENT_NODE*/
1856
+ ? [ xpc.contextNode ]
1857
+ : [ xpc.contextNode.ownerDocument ];
1858
+ }
1859
+ outer: while (st.length > 0) {
1860
+ for (var m = st.pop(); m != null; ) {
1861
+ if (m == xpc.contextNode) {
1862
+ break outer;
1863
+ }
1864
+ if (step.nodeTest.matches(m, xpc)) {
1865
+ newNodes.unshift(m);
1866
+ }
1867
+ if (m.firstChild != null) {
1868
+ st.push(m.nextSibling);
1869
+ m = m.firstChild;
1870
+ } else {
1871
+ m = m.nextSibling;
1872
+ }
1873
+ }
1874
+ }
1875
+ break;
1876
+
1877
+ case Step.PRECEDINGSIBLING:
1878
+ if (xpc.contextNode === xpc.virtualRoot) {
1879
+ break;
1880
+ }
1881
+ for (var m = xpc.contextNode.previousSibling; m != null; m = m.previousSibling) {
1882
+ if (step.nodeTest.matches(m, xpc)) {
1883
+ newNodes.push(m);
1884
+ }
1885
+ }
1886
+ break;
1887
+
1888
+ case Step.SELF:
1889
+ if (step.nodeTest.matches(xpc.contextNode, xpc)) {
1890
+ newNodes.push(xpc.contextNode);
1891
+ }
1892
+ break;
1893
+
1894
+ default:
1895
+ }
1896
+ }
1897
+ nodes = newNodes;
1898
+ // apply each of the predicates in turn
1899
+ for (var j = 0; j < step.predicates.length; j++) {
1900
+ var pred = step.predicates[j];
1901
+ var newNodes = [];
1902
+ xpc.contextSize = nodes.length;
1903
+ for (xpc.contextPosition = 1; xpc.contextPosition <= xpc.contextSize; xpc.contextPosition++) {
1904
+ xpc.contextNode = nodes[xpc.contextPosition - 1];
1905
+ if (this.predicateMatches(pred, xpc)) {
1906
+ newNodes.push(xpc.contextNode);
1907
+ } else {
1908
+ }
1909
+ }
1910
+ nodes = newNodes;
1911
+ }
1912
+ }
1913
+ }
1914
+ var ns = new XNodeSet();
1915
+ ns.addArray(nodes);
1916
+ return ns;
1917
+ };
1918
+
1919
+ PathExpr.prototype.predicateMatches = function(pred, c) {
1920
+ var res = pred.evaluate(c);
1921
+ if (Utilities.instance_of(res, XNumber)) {
1922
+ return c.contextPosition == res.numberValue();
1923
+ }
1924
+ return res.booleanValue();
1925
+ };
1926
+
1927
+ PathExpr.prototype.toString = function() {
1928
+ if (this.filter != undefined) {
1929
+ var s = this.filter.toString();
1930
+ if (Utilities.instance_of(this.filter, XString)) {
1931
+ s = "'" + s + "'";
1932
+ }
1933
+ if (this.filterPredicates != undefined) {
1934
+ for (var i = 0; i < this.filterPredicates.length; i++) {
1935
+ s = s + "[" + this.filterPredicates[i].toString() + "]";
1936
+ }
1937
+ }
1938
+ if (this.locationPath != undefined) {
1939
+ if (!this.locationPath.absolute) {
1940
+ s += "/";
1941
+ }
1942
+ s += this.locationPath.toString();
1943
+ }
1944
+ return s;
1945
+ }
1946
+ return this.locationPath.toString();
1947
+ };
1948
+
1949
+ PathExpr.prototype.getOwnerElement = function(n) {
1950
+ // DOM 2 has ownerElement
1951
+ if (n.ownerElement) {
1952
+ return n.ownerElement;
1953
+ }
1954
+ // DOM 1 Internet Explorer can use selectSingleNode (ironically)
1955
+ if (n.selectSingleNode) {
1956
+ return n.selectSingleNode("..");
1957
+ }
1958
+ // Other DOM 1 implementations must use this egregious search
1959
+ var doc = n.nodeType == 9 /*Node.DOCUMENT_NODE*/
1960
+ ? n
1961
+ : n.ownerDocument;
1962
+ var elts = doc.getElementsByTagName("*");
1963
+ for (var i = 0; i < elts.length; i++) {
1964
+ var elt = elts.item(i);
1965
+ var nnm = elt.attributes;
1966
+ for (var j = 0; j < nnm.length; j++) {
1967
+ var an = nnm.item(j);
1968
+ if (an === n) {
1969
+ return elt;
1970
+ }
1971
+ }
1972
+ }
1973
+ return null;
1974
+ };
1975
+
1976
+ // LocationPath //////////////////////////////////////////////////////////////
1977
+
1978
+ LocationPath.prototype = new Object();
1979
+ LocationPath.prototype.constructor = LocationPath;
1980
+ LocationPath.superclass = Object.prototype;
1981
+
1982
+ function LocationPath(abs, steps) {
1983
+ if (arguments.length > 0) {
1984
+ this.init(abs, steps);
1985
+ }
1986
+ }
1987
+
1988
+ LocationPath.prototype.init = function(abs, steps) {
1989
+ this.absolute = abs;
1990
+ this.steps = steps;
1991
+ };
1992
+
1993
+ LocationPath.prototype.toString = function() {
1994
+ var s;
1995
+ if (this.absolute) {
1996
+ s = "/";
1997
+ } else {
1998
+ s = "";
1999
+ }
2000
+ for (var i = 0; i < this.steps.length; i++) {
2001
+ if (i != 0) {
2002
+ s += "/";
2003
+ }
2004
+ s += this.steps[i].toString();
2005
+ }
2006
+ return s;
2007
+ };
2008
+
2009
+ // Step //////////////////////////////////////////////////////////////////////
2010
+
2011
+ Step.prototype = new Object();
2012
+ Step.prototype.constructor = Step;
2013
+ Step.superclass = Object.prototype;
2014
+
2015
+ function Step(axis, nodetest, preds) {
2016
+ if (arguments.length > 0) {
2017
+ this.init(axis, nodetest, preds);
2018
+ }
2019
+ }
2020
+
2021
+ Step.prototype.init = function(axis, nodetest, preds) {
2022
+ this.axis = axis;
2023
+ this.nodeTest = nodetest;
2024
+ this.predicates = preds;
2025
+ };
2026
+
2027
+ Step.prototype.toString = function() {
2028
+ var s;
2029
+ switch (this.axis) {
2030
+ case Step.ANCESTOR:
2031
+ s = "ancestor";
2032
+ break;
2033
+ case Step.ANCESTORORSELF:
2034
+ s = "ancestor-or-self";
2035
+ break;
2036
+ case Step.ATTRIBUTE:
2037
+ s = "attribute";
2038
+ break;
2039
+ case Step.CHILD:
2040
+ s = "child";
2041
+ break;
2042
+ case Step.DESCENDANT:
2043
+ s = "descendant";
2044
+ break;
2045
+ case Step.DESCENDANTORSELF:
2046
+ s = "descendant-or-self";
2047
+ break;
2048
+ case Step.FOLLOWING:
2049
+ s = "following";
2050
+ break;
2051
+ case Step.FOLLOWINGSIBLING:
2052
+ s = "following-sibling";
2053
+ break;
2054
+ case Step.NAMESPACE:
2055
+ s = "namespace";
2056
+ break;
2057
+ case Step.PARENT:
2058
+ s = "parent";
2059
+ break;
2060
+ case Step.PRECEDING:
2061
+ s = "preceding";
2062
+ break;
2063
+ case Step.PRECEDINGSIBLING:
2064
+ s = "preceding-sibling";
2065
+ break;
2066
+ case Step.SELF:
2067
+ s = "self";
2068
+ break;
2069
+ }
2070
+ s += "::";
2071
+ s += this.nodeTest.toString();
2072
+ for (var i = 0; i < this.predicates.length; i++) {
2073
+ s += "[" + this.predicates[i].toString() + "]";
2074
+ }
2075
+ return s;
2076
+ };
2077
+
2078
+ Step.ANCESTOR = 0;
2079
+ Step.ANCESTORORSELF = 1;
2080
+ Step.ATTRIBUTE = 2;
2081
+ Step.CHILD = 3;
2082
+ Step.DESCENDANT = 4;
2083
+ Step.DESCENDANTORSELF = 5;
2084
+ Step.FOLLOWING = 6;
2085
+ Step.FOLLOWINGSIBLING = 7;
2086
+ Step.NAMESPACE = 8;
2087
+ Step.PARENT = 9;
2088
+ Step.PRECEDING = 10;
2089
+ Step.PRECEDINGSIBLING = 11;
2090
+ Step.SELF = 12;
2091
+
2092
+ // NodeTest //////////////////////////////////////////////////////////////////
2093
+
2094
+ NodeTest.prototype = new Object();
2095
+ NodeTest.prototype.constructor = NodeTest;
2096
+ NodeTest.superclass = Object.prototype;
2097
+
2098
+ function NodeTest(type, value) {
2099
+ if (arguments.length > 0) {
2100
+ this.init(type, value);
2101
+ }
2102
+ }
2103
+
2104
+ NodeTest.prototype.init = function(type, value) {
2105
+ this.type = type;
2106
+ this.value = value;
2107
+ };
2108
+
2109
+ NodeTest.prototype.toString = function() {
2110
+ switch (this.type) {
2111
+ case NodeTest.NAMETESTANY:
2112
+ return "*";
2113
+ case NodeTest.NAMETESTPREFIXANY:
2114
+ return this.value + ":*";
2115
+ case NodeTest.NAMETESTQNAME:
2116
+ return this.value;
2117
+ case NodeTest.COMMENT:
2118
+ return "comment()";
2119
+ case NodeTest.TEXT:
2120
+ return "text()";
2121
+ case NodeTest.PI:
2122
+ if (this.value != undefined) {
2123
+ return "processing-instruction(\"" + this.value + "\")";
2124
+ }
2125
+ return "processing-instruction()";
2126
+ case NodeTest.NODE:
2127
+ return "node()";
2128
+ }
2129
+ return "<unknown nodetest type>";
2130
+ };
2131
+
2132
+ NodeTest.prototype.matches = function(n, xpc) {
2133
+ switch (this.type) {
2134
+ case NodeTest.NAMETESTANY:
2135
+ if (n.nodeType == 2 /*Node.ATTRIBUTE_NODE*/
2136
+ || n.nodeType == 1 /*Node.ELEMENT_NODE*/
2137
+ || n.nodeType == NodeTest.NAMESPACE_NODE) {
2138
+ return true;
2139
+ }
2140
+ return false;
2141
+ case NodeTest.NAMETESTPREFIXANY:
2142
+ if ((n.nodeType == 2 /*Node.ATTRIBUTE_NODE*/ || n.nodeType == 1 /*Node.ELEMENT_NODE*/)
2143
+ && n.namespaceURI == xpc.namespaceResolver.getNamespace(this.value, xpc.expressionContextNode)) {
2144
+ return true;
2145
+ }
2146
+ return false;
2147
+ case NodeTest.NAMETESTQNAME:
2148
+ if (n.nodeType == 2 /*Node.ATTRIBUTE_NODE*/
2149
+ || n.nodeType == 1 /*Node.ELEMENT_NODE*/
2150
+ || n.nodeType == NodeTest.NAMESPACE_NODE) {
2151
+ var test = Utilities.resolveQName(this.value, xpc.namespaceResolver, xpc.expressionContextNode, false);
2152
+ test[0] = String(test[0]);
2153
+ if (test[0] == "") {
2154
+ test[0] = null;
2155
+ }
2156
+ var node = Utilities.resolveQName(n.nodeName, xpc.namespaceResolver, xpc.contextNode, true);
2157
+ node[0] = String(node[0]);
2158
+ if (node[0] == "") {
2159
+ node[0] = null;
2160
+ }
2161
+ if (xpc.caseInsensitive) {
2162
+ return test[0] == node[0] && String(test[1]).toLowerCase() == String(node[1]).toLowerCase();
2163
+ }
2164
+ return test[0] == node[0] && test[1] == node[1];
2165
+ }
2166
+ return false;
2167
+ case NodeTest.COMMENT:
2168
+ return n.nodeType == 8 /*Node.COMMENT_NODE*/;
2169
+ case NodeTest.TEXT:
2170
+ return n.nodeType == 3 /*Node.TEXT_NODE*/ || n.nodeType == 4 /*Node.CDATA_SECTION_NODE*/;
2171
+ case NodeTest.PI:
2172
+ return n.nodeType == 7 /*Node.PROCESSING_INSTRUCTION_NODE*/
2173
+ && (this.value == null || n.nodeName == this.value);
2174
+ case NodeTest.NODE:
2175
+ return n.nodeType == 9 /*Node.DOCUMENT_NODE*/
2176
+ || n.nodeType == 1 /*Node.ELEMENT_NODE*/
2177
+ || n.nodeType == 2 /*Node.ATTRIBUTE_NODE*/
2178
+ || n.nodeType == 3 /*Node.TEXT_NODE*/
2179
+ || n.nodeType == 4 /*Node.CDATA_SECTION_NODE*/
2180
+ || n.nodeType == 8 /*Node.COMMENT_NODE*/
2181
+ || n.nodeType == 7 /*Node.PROCESSING_INSTRUCTION_NODE*/;
2182
+ }
2183
+ return false;
2184
+ };
2185
+
2186
+ NodeTest.NAMETESTANY = 0;
2187
+ NodeTest.NAMETESTPREFIXANY = 1;
2188
+ NodeTest.NAMETESTQNAME = 2;
2189
+ NodeTest.COMMENT = 3;
2190
+ NodeTest.TEXT = 4;
2191
+ NodeTest.PI = 5;
2192
+ NodeTest.NODE = 6;
2193
+
2194
+ NodeTest.NAMESPACE_NODE = 1024;
2195
+
2196
+ // VariableReference /////////////////////////////////////////////////////////
2197
+
2198
+ VariableReference.prototype = new Expression();
2199
+ VariableReference.prototype.constructor = VariableReference;
2200
+ VariableReference.superclass = Expression.prototype;
2201
+
2202
+ function VariableReference(v) {
2203
+ if (arguments.length > 0) {
2204
+ this.init(v);
2205
+ }
2206
+ }
2207
+
2208
+ VariableReference.prototype.init = function(v) {
2209
+ this.variable = v;
2210
+ };
2211
+
2212
+ VariableReference.prototype.toString = function() {
2213
+ return "$" + this.variable;
2214
+ };
2215
+
2216
+ VariableReference.prototype.evaluate = function(c) {
2217
+ return c.variableResolver.getVariable(this.variable, c);
2218
+ };
2219
+
2220
+ // FunctionCall //////////////////////////////////////////////////////////////
2221
+
2222
+ FunctionCall.prototype = new Expression();
2223
+ FunctionCall.prototype.constructor = FunctionCall;
2224
+ FunctionCall.superclass = Expression.prototype;
2225
+
2226
+ function FunctionCall(fn, args) {
2227
+ if (arguments.length > 0) {
2228
+ this.init(fn, args);
2229
+ }
2230
+ }
2231
+
2232
+ FunctionCall.prototype.init = function(fn, args) {
2233
+ this.functionName = fn;
2234
+ this.arguments = args;
2235
+ };
2236
+
2237
+ FunctionCall.prototype.toString = function() {
2238
+ var s = this.functionName + "(";
2239
+ for (var i = 0; i < this.arguments.length; i++) {
2240
+ if (i > 0) {
2241
+ s += ", ";
2242
+ }
2243
+ s += this.arguments[i].toString();
2244
+ }
2245
+ return s + ")";
2246
+ };
2247
+
2248
+ FunctionCall.prototype.evaluate = function(c) {
2249
+ var f = c.functionResolver.getFunction(this.functionName, c);
2250
+ if (f == undefined) {
2251
+ throw new Error("Unknown function " + this.functionName);
2252
+ }
2253
+ var a = [c].concat(this.arguments);
2254
+ return f.apply(c.functionResolver.thisArg, a);
2255
+ };
2256
+
2257
+ // XString ///////////////////////////////////////////////////////////////////
2258
+
2259
+ XString.prototype = new Expression();
2260
+ XString.prototype.constructor = XString;
2261
+ XString.superclass = Expression.prototype;
2262
+
2263
+ function XString(s) {
2264
+ if (arguments.length > 0) {
2265
+ this.init(s);
2266
+ }
2267
+ }
2268
+
2269
+ XString.prototype.init = function(s) {
2270
+ this.str = s;
2271
+ };
2272
+
2273
+ XString.prototype.toString = function() {
2274
+ return this.str;
2275
+ };
2276
+
2277
+ XString.prototype.evaluate = function(c) {
2278
+ return this;
2279
+ };
2280
+
2281
+ XString.prototype.string = function() {
2282
+ return this;
2283
+ };
2284
+
2285
+ XString.prototype.number = function() {
2286
+ return new XNumber(this.str);
2287
+ };
2288
+
2289
+ XString.prototype.bool = function() {
2290
+ return new XBoolean(this.str);
2291
+ };
2292
+
2293
+ XString.prototype.nodeset = function() {
2294
+ throw new Error("Cannot convert string to nodeset");
2295
+ };
2296
+
2297
+ XString.prototype.stringValue = function() {
2298
+ return this.str;
2299
+ };
2300
+
2301
+ XString.prototype.numberValue = function() {
2302
+ return this.number().numberValue();
2303
+ };
2304
+
2305
+ XString.prototype.booleanValue = function() {
2306
+ return this.bool().booleanValue();
2307
+ };
2308
+
2309
+ XString.prototype.equals = function(r) {
2310
+ if (Utilities.instance_of(r, XBoolean)) {
2311
+ return this.bool().equals(r);
2312
+ }
2313
+ if (Utilities.instance_of(r, XNumber)) {
2314
+ return this.number().equals(r);
2315
+ }
2316
+ if (Utilities.instance_of(r, XNodeSet)) {
2317
+ return r.compareWithString(this, Operators.equals);
2318
+ }
2319
+ return new XBoolean(this.str == r.str);
2320
+ };
2321
+
2322
+ XString.prototype.notequal = function(r) {
2323
+ if (Utilities.instance_of(r, XBoolean)) {
2324
+ return this.bool().notequal(r);
2325
+ }
2326
+ if (Utilities.instance_of(r, XNumber)) {
2327
+ return this.number().notequal(r);
2328
+ }
2329
+ if (Utilities.instance_of(r, XNodeSet)) {
2330
+ return r.compareWithString(this, Operators.notequal);
2331
+ }
2332
+ return new XBoolean(this.str != r.str);
2333
+ };
2334
+
2335
+ XString.prototype.lessthan = function(r) {
2336
+ if (Utilities.instance_of(r, XNodeSet)) {
2337
+ return r.compareWithNumber(this.number(), Operators.greaterthanorequal);
2338
+ }
2339
+ return this.number().lessthan(r.number());
2340
+ };
2341
+
2342
+ XString.prototype.greaterthan = function(r) {
2343
+ if (Utilities.instance_of(r, XNodeSet)) {
2344
+ return r.compareWithNumber(this.number(), Operators.lessthanorequal);
2345
+ }
2346
+ return this.number().greaterthan(r.number());
2347
+ };
2348
+
2349
+ XString.prototype.lessthanorequal = function(r) {
2350
+ if (Utilities.instance_of(r, XNodeSet)) {
2351
+ return r.compareWithNumber(this.number(), Operators.greaterthan);
2352
+ }
2353
+ return this.number().lessthanorequal(r.number());
2354
+ };
2355
+
2356
+ XString.prototype.greaterthanorequal = function(r) {
2357
+ if (Utilities.instance_of(r, XNodeSet)) {
2358
+ return r.compareWithNumber(this.number(), Operators.lessthan);
2359
+ }
2360
+ return this.number().greaterthanorequal(r.number());
2361
+ };
2362
+
2363
+ // XNumber ///////////////////////////////////////////////////////////////////
2364
+
2365
+ XNumber.prototype = new Expression();
2366
+ XNumber.prototype.constructor = XNumber;
2367
+ XNumber.superclass = Expression.prototype;
2368
+
2369
+ function XNumber(n) {
2370
+ if (arguments.length > 0) {
2371
+ this.init(n);
2372
+ }
2373
+ }
2374
+
2375
+ XNumber.prototype.init = function(n) {
2376
+ this.num = Number(n);
2377
+ };
2378
+
2379
+ XNumber.prototype.toString = function() {
2380
+ return this.num;
2381
+ };
2382
+
2383
+ XNumber.prototype.evaluate = function(c) {
2384
+ return this;
2385
+ };
2386
+
2387
+ XNumber.prototype.string = function() {
2388
+ return new XString(this.num);
2389
+ };
2390
+
2391
+ XNumber.prototype.number = function() {
2392
+ return this;
2393
+ };
2394
+
2395
+ XNumber.prototype.bool = function() {
2396
+ return new XBoolean(this.num);
2397
+ };
2398
+
2399
+ XNumber.prototype.nodeset = function() {
2400
+ throw new Error("Cannot convert number to nodeset");
2401
+ };
2402
+
2403
+ XNumber.prototype.stringValue = function() {
2404
+ return this.string().stringValue();
2405
+ };
2406
+
2407
+ XNumber.prototype.numberValue = function() {
2408
+ return this.num;
2409
+ };
2410
+
2411
+ XNumber.prototype.booleanValue = function() {
2412
+ return this.bool().booleanValue();
2413
+ };
2414
+
2415
+ XNumber.prototype.negate = function() {
2416
+ return new XNumber(-this.num);
2417
+ };
2418
+
2419
+ XNumber.prototype.equals = function(r) {
2420
+ if (Utilities.instance_of(r, XBoolean)) {
2421
+ return this.bool().equals(r);
2422
+ }
2423
+ if (Utilities.instance_of(r, XString)) {
2424
+ return this.equals(r.number());
2425
+ }
2426
+ if (Utilities.instance_of(r, XNodeSet)) {
2427
+ return r.compareWithNumber(this, Operators.equals);
2428
+ }
2429
+ return new XBoolean(this.num == r.num);
2430
+ };
2431
+
2432
+ XNumber.prototype.notequal = function(r) {
2433
+ if (Utilities.instance_of(r, XBoolean)) {
2434
+ return this.bool().notequal(r);
2435
+ }
2436
+ if (Utilities.instance_of(r, XString)) {
2437
+ return this.notequal(r.number());
2438
+ }
2439
+ if (Utilities.instance_of(r, XNodeSet)) {
2440
+ return r.compareWithNumber(this, Operators.notequal);
2441
+ }
2442
+ return new XBoolean(this.num != r.num);
2443
+ };
2444
+
2445
+ XNumber.prototype.lessthan = function(r) {
2446
+ if (Utilities.instance_of(r, XNodeSet)) {
2447
+ return r.compareWithNumber(this, Operators.greaterthanorequal);
2448
+ }
2449
+ if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {
2450
+ return this.lessthan(r.number());
2451
+ }
2452
+ return new XBoolean(this.num < r.num);
2453
+ };
2454
+
2455
+ XNumber.prototype.greaterthan = function(r) {
2456
+ if (Utilities.instance_of(r, XNodeSet)) {
2457
+ return r.compareWithNumber(this, Operators.lessthanorequal);
2458
+ }
2459
+ if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {
2460
+ return this.greaterthan(r.number());
2461
+ }
2462
+ return new XBoolean(this.num > r.num);
2463
+ };
2464
+
2465
+ XNumber.prototype.lessthanorequal = function(r) {
2466
+ if (Utilities.instance_of(r, XNodeSet)) {
2467
+ return r.compareWithNumber(this, Operators.greaterthan);
2468
+ }
2469
+ if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {
2470
+ return this.lessthanorequal(r.number());
2471
+ }
2472
+ return new XBoolean(this.num <= r.num);
2473
+ };
2474
+
2475
+ XNumber.prototype.greaterthanorequal = function(r) {
2476
+ if (Utilities.instance_of(r, XNodeSet)) {
2477
+ return r.compareWithNumber(this, Operators.lessthan);
2478
+ }
2479
+ if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {
2480
+ return this.greaterthanorequal(r.number());
2481
+ }
2482
+ return new XBoolean(this.num >= r.num);
2483
+ };
2484
+
2485
+ XNumber.prototype.plus = function(r) {
2486
+ return new XNumber(this.num + r.num);
2487
+ };
2488
+
2489
+ XNumber.prototype.minus = function(r) {
2490
+ return new XNumber(this.num - r.num);
2491
+ };
2492
+
2493
+ XNumber.prototype.multiply = function(r) {
2494
+ return new XNumber(this.num * r.num);
2495
+ };
2496
+
2497
+ XNumber.prototype.div = function(r) {
2498
+ return new XNumber(this.num / r.num);
2499
+ };
2500
+
2501
+ XNumber.prototype.mod = function(r) {
2502
+ return new XNumber(this.num % r.num);
2503
+ };
2504
+
2505
+ // XBoolean //////////////////////////////////////////////////////////////////
2506
+
2507
+ XBoolean.prototype = new Expression();
2508
+ XBoolean.prototype.constructor = XBoolean;
2509
+ XBoolean.superclass = Expression.prototype;
2510
+
2511
+ function XBoolean(b) {
2512
+ if (arguments.length > 0) {
2513
+ this.init(b);
2514
+ }
2515
+ }
2516
+
2517
+ XBoolean.prototype.init = function(b) {
2518
+ this.b = Boolean(b);
2519
+ };
2520
+
2521
+ XBoolean.prototype.toString = function() {
2522
+ return this.b.toString();
2523
+ };
2524
+
2525
+ XBoolean.prototype.evaluate = function(c) {
2526
+ return this;
2527
+ };
2528
+
2529
+ XBoolean.prototype.string = function() {
2530
+ return new XString(this.b);
2531
+ };
2532
+
2533
+ XBoolean.prototype.number = function() {
2534
+ return new XNumber(this.b);
2535
+ };
2536
+
2537
+ XBoolean.prototype.bool = function() {
2538
+ return this;
2539
+ };
2540
+
2541
+ XBoolean.prototype.nodeset = function() {
2542
+ throw new Error("Cannot convert boolean to nodeset");
2543
+ };
2544
+
2545
+ XBoolean.prototype.stringValue = function() {
2546
+ return this.string().stringValue();
2547
+ };
2548
+
2549
+ XBoolean.prototype.numberValue = function() {
2550
+ return this.num().numberValue();
2551
+ };
2552
+
2553
+ XBoolean.prototype.booleanValue = function() {
2554
+ return this.b;
2555
+ };
2556
+
2557
+ XBoolean.prototype.not = function() {
2558
+ return new XBoolean(!this.b);
2559
+ };
2560
+
2561
+ XBoolean.prototype.equals = function(r) {
2562
+ if (Utilities.instance_of(r, XString) || Utilities.instance_of(r, XNumber)) {
2563
+ return this.equals(r.bool());
2564
+ }
2565
+ if (Utilities.instance_of(r, XNodeSet)) {
2566
+ return r.compareWithBoolean(this, Operators.equals);
2567
+ }
2568
+ return new XBoolean(this.b == r.b);
2569
+ };
2570
+
2571
+ XBoolean.prototype.notequal = function(r) {
2572
+ if (Utilities.instance_of(r, XString) || Utilities.instance_of(r, XNumber)) {
2573
+ return this.notequal(r.bool());
2574
+ }
2575
+ if (Utilities.instance_of(r, XNodeSet)) {
2576
+ return r.compareWithBoolean(this, Operators.notequal);
2577
+ }
2578
+ return new XBoolean(this.b != r.b);
2579
+ };
2580
+
2581
+ XBoolean.prototype.lessthan = function(r) {
2582
+ if (Utilities.instance_of(r, XNodeSet)) {
2583
+ return r.compareWithNumber(this.number(), Operators.greaterthanorequal);
2584
+ }
2585
+ return this.number().lessthan(r.number());
2586
+ };
2587
+
2588
+ XBoolean.prototype.greaterthan = function(r) {
2589
+ if (Utilities.instance_of(r, XNodeSet)) {
2590
+ return r.compareWithNumber(this.number(), Operators.lessthanorequal);
2591
+ }
2592
+ return this.number().greaterthan(r.number());
2593
+ };
2594
+
2595
+ XBoolean.prototype.lessthanorequal = function(r) {
2596
+ if (Utilities.instance_of(r, XNodeSet)) {
2597
+ return r.compareWithNumber(this.number(), Operators.greaterthan);
2598
+ }
2599
+ return this.number().lessthanorequal(r.number());
2600
+ };
2601
+
2602
+ XBoolean.prototype.greaterthanorequal = function(r) {
2603
+ if (Utilities.instance_of(r, XNodeSet)) {
2604
+ return r.compareWithNumber(this.number(), Operators.lessthan);
2605
+ }
2606
+ return this.number().greaterthanorequal(r.number());
2607
+ };
2608
+
2609
+ // XNodeSet //////////////////////////////////////////////////////////////////
2610
+
2611
+ XNodeSet.prototype = new Expression();
2612
+ XNodeSet.prototype.constructor = XNodeSet;
2613
+ XNodeSet.superclass = Expression.prototype;
2614
+
2615
+ function XNodeSet() {
2616
+ this.init();
2617
+ }
2618
+
2619
+ XNodeSet.prototype.init = function() {
2620
+ this.tree = null;
2621
+ this.size = 0;
2622
+ };
2623
+
2624
+ XNodeSet.prototype.toString = function() {
2625
+ var p = this.first();
2626
+ if (p == null) {
2627
+ return "";
2628
+ }
2629
+ return this.stringForNode(p);
2630
+ };
2631
+
2632
+ XNodeSet.prototype.evaluate = function(c) {
2633
+ return this;
2634
+ };
2635
+
2636
+ XNodeSet.prototype.string = function() {
2637
+ return new XString(this.toString());
2638
+ };
2639
+
2640
+ XNodeSet.prototype.stringValue = function() {
2641
+ return this.toString();
2642
+ };
2643
+
2644
+ XNodeSet.prototype.number = function() {
2645
+ return new XNumber(this.string());
2646
+ };
2647
+
2648
+ XNodeSet.prototype.numberValue = function() {
2649
+ return Number(this.string());
2650
+ };
2651
+
2652
+ XNodeSet.prototype.bool = function() {
2653
+ return new XBoolean(this.tree != null);
2654
+ };
2655
+
2656
+ XNodeSet.prototype.booleanValue = function() {
2657
+ return this.tree != null;
2658
+ };
2659
+
2660
+ XNodeSet.prototype.nodeset = function() {
2661
+ return this;
2662
+ };
2663
+
2664
+ XNodeSet.prototype.stringForNode = function(n) {
2665
+ if (n.nodeType == 9 /*Node.DOCUMENT_NODE*/) {
2666
+ n = n.documentElement;
2667
+ }
2668
+ if (n.nodeType == 1 /*Node.ELEMENT_NODE*/) {
2669
+ return this.stringForNodeRec(n);
2670
+ }
2671
+ if (n.isNamespaceNode) {
2672
+ return n.namespace;
2673
+ }
2674
+ return n.nodeValue;
2675
+ };
2676
+
2677
+ XNodeSet.prototype.stringForNodeRec = function(n) {
2678
+ var s = "";
2679
+ for (var n2 = n.firstChild; n2 != null; n2 = n2.nextSibling) {
2680
+ if (n2.nodeType == 3 /*Node.TEXT_NODE*/) {
2681
+ s += n2.nodeValue;
2682
+ } else if (n2.nodeType == 1 /*Node.ELEMENT_NODE*/) {
2683
+ s += this.stringForNodeRec(n2);
2684
+ }
2685
+ }
2686
+ return s;
2687
+ };
2688
+
2689
+ XNodeSet.prototype.first = function() {
2690
+ var p = this.tree;
2691
+ if (p == null) {
2692
+ return null;
2693
+ }
2694
+ while (p.left != null) {
2695
+ p = p.left;
2696
+ }
2697
+ return p.node;
2698
+ };
2699
+
2700
+ XNodeSet.prototype.add = function(n) {
2701
+ if (this.tree == null) {
2702
+ this.tree = new Object();
2703
+ this.tree.node = n;
2704
+ this.tree.left = null;
2705
+ this.tree.right = null;
2706
+ this.size = 1;
2707
+ return;
2708
+ }
2709
+
2710
+ var p = this.tree;
2711
+ while (1) {
2712
+ var o = this.order(n, p.node);
2713
+ if (o == 0) {
2714
+ return;
2715
+ }
2716
+ if (o > 0) {
2717
+ if (p.right == null) {
2718
+ p.right = new Object();
2719
+ p.right.node = n;
2720
+ p.right.left = null;
2721
+ p.right.right = null;
2722
+ this.size++;
2723
+ return;
2724
+ }
2725
+ p = p.right;
2726
+ } else {
2727
+ if (p.left == null) {
2728
+ p.left = new Object();
2729
+ p.left.node = n;
2730
+ p.left.left = null;
2731
+ p.left.right = null;
2732
+ this.size++;
2733
+ return;
2734
+ }
2735
+ p = p.left;
2736
+ }
2737
+ }
2738
+ };
2739
+
2740
+ XNodeSet.prototype.addArray = function(ns) {
2741
+ for (var i = 0; i < ns.length; i++) {
2742
+ this.add(ns[i]);
2743
+ }
2744
+ };
2745
+
2746
+ XNodeSet.prototype.toArray = function() {
2747
+ var a = [];
2748
+ this.toArrayRec(this.tree, a);
2749
+ return a;
2750
+ };
2751
+
2752
+ XNodeSet.prototype.toArrayRec = function(t, a) {
2753
+ if (t != null) {
2754
+ this.toArrayRec(t.left, a);
2755
+ a.push(t.node);
2756
+ this.toArrayRec(t.right, a);
2757
+ }
2758
+ };
2759
+
2760
+ XNodeSet.prototype.order = function(n1, n2) {
2761
+ if (n1 == n2) {
2762
+ return 0;
2763
+ }
2764
+ var d1 = 0;
2765
+ var d2 = 0;
2766
+ for (var m1 = n1; m1 != null; m1 = m1.parentNode) {
2767
+ d1++;
2768
+ }
2769
+ for (var m2 = n2; m2 != null; m2 = m2.parentNode) {
2770
+ d2++;
2771
+ }
2772
+ if (d1 > d2) {
2773
+ while (d1 > d2) {
2774
+ n1 = n1.parentNode;
2775
+ d1--;
2776
+ }
2777
+ if (n1 == n2) {
2778
+ return 1;
2779
+ }
2780
+ } else if (d2 > d1) {
2781
+ while (d2 > d1) {
2782
+ n2 = n2.parentNode;
2783
+ d2--;
2784
+ }
2785
+ if (n1 == n2) {
2786
+ return -1;
2787
+ }
2788
+ }
2789
+ while (n1.parentNode != n2.parentNode) {
2790
+ n1 = n1.parentNode;
2791
+ n2 = n2.parentNode;
2792
+ }
2793
+ while (n1.previousSibling != null && n2.previousSibling != null) {
2794
+ n1 = n1.previousSibling;
2795
+ n2 = n2.previousSibling;
2796
+ }
2797
+ if (n1.previousSibling == null) {
2798
+ return -1;
2799
+ }
2800
+ return 1;
2801
+ };
2802
+
2803
+ XNodeSet.prototype.compareWithString = function(r, o) {
2804
+ var a = this.toArray();
2805
+ for (var i = 0; i < a.length; i++) {
2806
+ var n = a[i];
2807
+ var l = new XString(this.stringForNode(n));
2808
+ var res = o(l, r);
2809
+ if (res.booleanValue()) {
2810
+ return res;
2811
+ }
2812
+ }
2813
+ return new XBoolean(false);
2814
+ };
2815
+
2816
+ XNodeSet.prototype.compareWithNumber = function(r, o) {
2817
+ var a = this.toArray();
2818
+ for (var i = 0; i < a.length; i++) {
2819
+ var n = a[i];
2820
+ var l = new XNumber(this.stringForNode(n));
2821
+ var res = o(l, r);
2822
+ if (res.booleanValue()) {
2823
+ return res;
2824
+ }
2825
+ }
2826
+ return new XBoolean(false);
2827
+ };
2828
+
2829
+ XNodeSet.prototype.compareWithBoolean = function(r, o) {
2830
+ return o(this.bool(), r);
2831
+ };
2832
+
2833
+ XNodeSet.prototype.compareWithNodeSet = function(r, o) {
2834
+ var a = this.toArray();
2835
+ for (var i = 0; i < a.length; i++) {
2836
+ var n = a[i];
2837
+ var l = new XString(this.stringForNode(n));
2838
+ var b = r.toArray();
2839
+ for (var j = 0; j < b.length; j++) {
2840
+ var n2 = b[j];
2841
+ var r = new XString(this.stringForNode(n2));
2842
+ var res = o(l, r);
2843
+ if (res.booleanValue()) {
2844
+ return res;
2845
+ }
2846
+ }
2847
+ }
2848
+ return new XBoolean(false);
2849
+ };
2850
+
2851
+ XNodeSet.prototype.equals = function(r) {
2852
+ if (Utilities.instance_of(r, XString)) {
2853
+ return this.compareWithString(r, Operators.equals);
2854
+ }
2855
+ if (Utilities.instance_of(r, XNumber)) {
2856
+ return this.compareWithNumber(r, Operators.equals);
2857
+ }
2858
+ if (Utilities.instance_of(r, XBoolean)) {
2859
+ return this.compareWithBoolean(r, Operators.equals);
2860
+ }
2861
+ return this.compareWithNodeSet(r, Operators.equals);
2862
+ };
2863
+
2864
+ XNodeSet.prototype.notequal = function(r) {
2865
+ if (Utilities.instance_of(r, XString)) {
2866
+ return this.compareWithString(r, Operators.notequal);
2867
+ }
2868
+ if (Utilities.instance_of(r, XNumber)) {
2869
+ return this.compareWithNumber(r, Operators.notequal);
2870
+ }
2871
+ if (Utilities.instance_of(r, XBoolean)) {
2872
+ return this.compareWithBoolean(r, Operators.notequal);
2873
+ }
2874
+ return this.compareWithNodeSet(r, Operators.notequal);
2875
+ };
2876
+
2877
+ XNodeSet.prototype.lessthan = function(r) {
2878
+ if (Utilities.instance_of(r, XString)) {
2879
+ return this.compareWithNumber(r.number(), Operators.lessthan);
2880
+ }
2881
+ if (Utilities.instance_of(r, XNumber)) {
2882
+ return this.compareWithNumber(r, Operators.lessthan);
2883
+ }
2884
+ if (Utilities.instance_of(r, XBoolean)) {
2885
+ return this.compareWithBoolean(r, Operators.lessthan);
2886
+ }
2887
+ return this.compareWithNodeSet(r, Operators.lessthan);
2888
+ };
2889
+
2890
+ XNodeSet.prototype.greaterthan = function(r) {
2891
+ if (Utilities.instance_of(r, XString)) {
2892
+ return this.compareWithNumber(r.number(), Operators.greaterthan);
2893
+ }
2894
+ if (Utilities.instance_of(r, XNumber)) {
2895
+ return this.compareWithNumber(r, Operators.greaterthan);
2896
+ }
2897
+ if (Utilities.instance_of(r, XBoolean)) {
2898
+ return this.compareWithBoolean(r, Operators.greaterthan);
2899
+ }
2900
+ return this.compareWithNodeSet(r, Operators.greaterthan);
2901
+ };
2902
+
2903
+ XNodeSet.prototype.lessthanorequal = function(r) {
2904
+ if (Utilities.instance_of(r, XString)) {
2905
+ return this.compareWithNumber(r.number(), Operators.lessthanorequal);
2906
+ }
2907
+ if (Utilities.instance_of(r, XNumber)) {
2908
+ return this.compareWithNumber(r, Operators.lessthanorequal);
2909
+ }
2910
+ if (Utilities.instance_of(r, XBoolean)) {
2911
+ return this.compareWithBoolean(r, Operators.lessthanorequal);
2912
+ }
2913
+ return this.compareWithNodeSet(r, Operators.lessthanorequal);
2914
+ };
2915
+
2916
+ XNodeSet.prototype.greaterthanorequal = function(r) {
2917
+ if (Utilities.instance_of(r, XString)) {
2918
+ return this.compareWithNumber(r.number(), Operators.greaterthanorequal);
2919
+ }
2920
+ if (Utilities.instance_of(r, XNumber)) {
2921
+ return this.compareWithNumber(r, Operators.greaterthanorequal);
2922
+ }
2923
+ if (Utilities.instance_of(r, XBoolean)) {
2924
+ return this.compareWithBoolean(r, Operators.greaterthanorequal);
2925
+ }
2926
+ return this.compareWithNodeSet(r, Operators.greaterthanorequal);
2927
+ };
2928
+
2929
+ XNodeSet.prototype.union = function(r) {
2930
+ var ns = new XNodeSet();
2931
+ ns.tree = this.tree;
2932
+ ns.size = this.size;
2933
+ ns.addArray(r.toArray());
2934
+ return ns;
2935
+ };
2936
+
2937
+ // NamespaceNode /////////////////////////////////////////////////////////////
2938
+
2939
+ NamespaceNode.prototype = new Object();
2940
+ NamespaceNode.prototype.constructor = NamespaceNode;
2941
+ NamespaceNode.superclass = Object.prototype;
2942
+
2943
+ function NamespaceNode(pre, ns, p) {
2944
+ this.isNamespaceNode = true;
2945
+ this.prefix = pre;
2946
+ this.namespace = ns;
2947
+ this.parentNode = p;
2948
+ this.localName = pre;
2949
+ this.nodeType = NodeTest.NAMESPACE_NODE;
2950
+ }
2951
+
2952
+ NamespaceNode.prototype.toString = function() {
2953
+ return "{ \"" + this.prefix + "\", \"" + this.namespace + "\" }";
2954
+ };
2955
+
2956
+ // Operators /////////////////////////////////////////////////////////////////
2957
+
2958
+ var Operators = new Object();
2959
+
2960
+ Operators.equals = function(l, r) {
2961
+ return l.equals(r);
2962
+ };
2963
+
2964
+ Operators.notequal = function(l, r) {
2965
+ return l.notequal(r);
2966
+ };
2967
+
2968
+ Operators.lessthan = function(l, r) {
2969
+ return l.lessthan(r);
2970
+ };
2971
+
2972
+ Operators.greaterthan = function(l, r) {
2973
+ return l.greaterthan(r);
2974
+ };
2975
+
2976
+ Operators.lessthanorequal = function(l, r) {
2977
+ return l.lessthanorequal(r);
2978
+ };
2979
+
2980
+ Operators.greaterthanorequal = function(l, r) {
2981
+ return l.greaterthanorequal(r);
2982
+ };
2983
+
2984
+ // XPathContext //////////////////////////////////////////////////////////////
2985
+
2986
+ XPathContext.prototype = new Object();
2987
+ XPathContext.prototype.constructor = XPathContext;
2988
+ XPathContext.superclass = Object.prototype;
2989
+
2990
+ function XPathContext(vr, nr, fr) {
2991
+ this.variableResolver = vr != null ? vr : new VariableResolver();
2992
+ this.namespaceResolver = nr != null ? nr : new NamespaceResolver();
2993
+ this.functionResolver = fr != null ? fr : new FunctionResolver();
2994
+ }
2995
+
2996
+ // VariableResolver //////////////////////////////////////////////////////////
2997
+
2998
+ VariableResolver.prototype = new Object();
2999
+ VariableResolver.prototype.constructor = VariableResolver;
3000
+ VariableResolver.superclass = Object.prototype;
3001
+
3002
+ function VariableResolver() {
3003
+ }
3004
+
3005
+ VariableResolver.prototype.getVariable = function(vn, c) {
3006
+ var parts = Utilities.splitQName(vn);
3007
+ if (parts[0] != null) {
3008
+ parts[0] = c.namespaceResolver.getNamespace(parts[0], c.expressionContextNode);
3009
+ }
3010
+ return this.getVariableWithName(parts[0], parts[1], c.expressionContextNode);
3011
+ };
3012
+
3013
+ VariableResolver.prototype.getVariableWithName = function(ns, ln, c) {
3014
+ return null;
3015
+ };
3016
+
3017
+ // FunctionResolver //////////////////////////////////////////////////////////
3018
+
3019
+ FunctionResolver.prototype = new Object();
3020
+ FunctionResolver.prototype.constructor = FunctionResolver;
3021
+ FunctionResolver.superclass = Object.prototype;
3022
+
3023
+ function FunctionResolver(thisArg) {
3024
+ this.thisArg = thisArg != null ? thisArg : Functions;
3025
+ this.functions = new Object();
3026
+ this.addStandardFunctions();
3027
+ }
3028
+
3029
+ FunctionResolver.prototype.addStandardFunctions = function() {
3030
+ this.functions["{}last"] = Functions.last;
3031
+ this.functions["{}position"] = Functions.position;
3032
+ this.functions["{}count"] = Functions.count;
3033
+ this.functions["{}id"] = Functions.id;
3034
+ this.functions["{}local-name"] = Functions.localName;
3035
+ this.functions["{}namespace-uri"] = Functions.namespaceURI;
3036
+ this.functions["{}name"] = Functions.name;
3037
+ this.functions["{}string"] = Functions.string;
3038
+ this.functions["{}concat"] = Functions.concat;
3039
+ this.functions["{}starts-with"] = Functions.startsWith;
3040
+ this.functions["{}contains"] = Functions.contains;
3041
+ this.functions["{}substring-before"] = Functions.substringBefore;
3042
+ this.functions["{}substring-after"] = Functions.substringAfter;
3043
+ this.functions["{}substring"] = Functions.substring;
3044
+ this.functions["{}string-length"] = Functions.stringLength;
3045
+ this.functions["{}normalize-space"] = Functions.normalizeSpace;
3046
+ this.functions["{}translate"] = Functions.translate;
3047
+ this.functions["{}boolean"] = Functions.boolean_;
3048
+ this.functions["{}not"] = Functions.not;
3049
+ this.functions["{}true"] = Functions.true_;
3050
+ this.functions["{}false"] = Functions.false_;
3051
+ this.functions["{}lang"] = Functions.lang;
3052
+ this.functions["{}number"] = Functions.number;
3053
+ this.functions["{}sum"] = Functions.sum;
3054
+ this.functions["{}floor"] = Functions.floor;
3055
+ this.functions["{}ceiling"] = Functions.ceiling;
3056
+ this.functions["{}round"] = Functions.round;
3057
+ };
3058
+
3059
+ FunctionResolver.prototype.addFunction = function(ns, ln, f) {
3060
+ this.functions["{" + ns + "}" + ln] = f;
3061
+ };
3062
+
3063
+ FunctionResolver.prototype.getFunction = function(fn, c) {
3064
+ var parts = Utilities.resolveQName(fn, c.namespaceResolver, c.contextNode, false);
3065
+ return this.getFunctionWithName(parts[0], parts[1], c.contextNode);
3066
+ };
3067
+
3068
+ FunctionResolver.prototype.getFunctionWithName = function(ns, ln, c) {
3069
+ return this.functions["{" + ns + "}" + ln];
3070
+ };
3071
+
3072
+ // NamespaceResolver /////////////////////////////////////////////////////////
3073
+
3074
+ NamespaceResolver.prototype = new Object();
3075
+ NamespaceResolver.prototype.constructor = NamespaceResolver;
3076
+ NamespaceResolver.superclass = Object.prototype;
3077
+
3078
+ function NamespaceResolver() {
3079
+ }
3080
+
3081
+ NamespaceResolver.prototype.getNamespace = function(prefix, n) {
3082
+ if (prefix == "xml") {
3083
+ return XPath.XML_NAMESPACE_URI;
3084
+ } else if (prefix == "xmlns") {
3085
+ return XPath.XMLNS_NAMESPACE_URI;
3086
+ }
3087
+ if (n.nodeType == 9 /*Node.DOCUMENT_NODE*/) {
3088
+ n = n.documentElement;
3089
+ } else if (n.nodeType != 1 /*Node.ELEMENT_NODE*/) {
3090
+ n = n.parentNode;
3091
+ }
3092
+ while (n != null && n.nodeType == 1 /*Node.ELEMENT_NODE*/) {
3093
+ var nnm = n.attributes;
3094
+ for (var i = 0; i < nnm.length; i++) {
3095
+ var a = nnm.item(i);
3096
+ var aname = a.nodeName;
3097
+ if (aname == "xmlns" && prefix == ""
3098
+ || aname == "xmlns:" + prefix) {
3099
+ return a.nodeValue;
3100
+ }
3101
+ }
3102
+ n = n.parentNode;
3103
+ }
3104
+ return null;
3105
+ };
3106
+
3107
+ // Functions /////////////////////////////////////////////////////////////////
3108
+
3109
+ Functions = new Object();
3110
+
3111
+ Functions.last = function() {
3112
+ var c = arguments[0];
3113
+ if (arguments.length != 1) {
3114
+ throw new Error("Function last expects ()");
3115
+ }
3116
+ return new XNumber(c.contextSize);
3117
+ };
3118
+
3119
+ Functions.position = function() {
3120
+ var c = arguments[0];
3121
+ if (arguments.length != 1) {
3122
+ throw new Error("Function position expects ()");
3123
+ }
3124
+ return new XNumber(c.contextPosition);
3125
+ };
3126
+
3127
+ Functions.count = function() {
3128
+ var c = arguments[0];
3129
+ var ns;
3130
+ if (arguments.length != 2 || !Utilities.instance_of(ns = arguments[1].evaluate(c), XNodeSet)) {
3131
+ throw new Error("Function count expects (node-set)");
3132
+ }
3133
+ return new XNumber(ns.size);
3134
+ };
3135
+
3136
+ Functions.id = function() {
3137
+ var c = arguments[0];
3138
+ var id;
3139
+ if (arguments.length != 2) {
3140
+ throw new Error("Function id expects (object)");
3141
+ }
3142
+ id = arguments[1].evaluate(c);
3143
+ if (Utilities.instance_of(id, XNodeSet)) {
3144
+ id = id.toArray().join(" ");
3145
+ } else {
3146
+ id = id.stringValue();
3147
+ }
3148
+ var ids = id.split(/[\x0d\x0a\x09\x20]+/);
3149
+ var count = 0;
3150
+ var ns = new XNodeSet();
3151
+ var doc = c.contextNode.nodeType == 9 /*Node.DOCUMENT_NODE*/
3152
+ ? c.contextNode
3153
+ : c.contextNode.ownerDocument;
3154
+ for (var i = 0; i < ids.length; i++) {
3155
+ var n;
3156
+ if (doc.getElementById) {
3157
+ n = doc.getElementById(ids[i]);
3158
+ } else {
3159
+ n = Utilities.getElementById(doc, ids[i]);
3160
+ }
3161
+ if (n != null) {
3162
+ ns.add(n);
3163
+ count++;
3164
+ }
3165
+ }
3166
+ return ns;
3167
+ };
3168
+
3169
+ Functions.localName = function() {
3170
+ var c = arguments[0];
3171
+ var n;
3172
+ if (arguments.length == 1) {
3173
+ n = c.contextNode;
3174
+ } else if (arguments.length == 2) {
3175
+ n = arguments[1].evaluate(c).first();
3176
+ } else {
3177
+ throw new Error("Function local-name expects (node-set?)");
3178
+ }
3179
+ if (n == null) {
3180
+ return new XString("");
3181
+ }
3182
+ return new XString(n.localName ? n.localName : n.baseName);
3183
+ };
3184
+
3185
+ Functions.namespaceURI = function() {
3186
+ var c = arguments[0];
3187
+ var n;
3188
+ if (arguments.length == 1) {
3189
+ n = c.contextNode;
3190
+ } else if (arguments.length == 2) {
3191
+ n = arguments[1].evaluate(c).first();
3192
+ } else {
3193
+ throw new Error("Function namespace-uri expects (node-set?)");
3194
+ }
3195
+ if (n == null) {
3196
+ return new XString("");
3197
+ }
3198
+ return new XString(n.namespaceURI);
3199
+ };
3200
+
3201
+ Functions.name = function() {
3202
+ var c = arguments[0];
3203
+ var n;
3204
+ if (arguments.length == 1) {
3205
+ n = c.contextNode;
3206
+ } else if (arguments.length == 2) {
3207
+ n = arguments[1].evaluate(c).first();
3208
+ } else {
3209
+ throw new Error("Function name expects (node-set?)");
3210
+ }
3211
+ if (n == null) {
3212
+ return new XString("");
3213
+ }
3214
+ if (n.nodeType == 1 /*Node.ELEMENT_NODE*/ || n.nodeType == 2 /*Node.ATTRIBUTE_NODE*/) {
3215
+ return new XString(n.nodeName);
3216
+ } else if (n.localName == null) {
3217
+ return new XString("");
3218
+ } else {
3219
+ return new XString(n.localName);
3220
+ }
3221
+ };
3222
+
3223
+ Functions.string = function() {
3224
+ var c = arguments[0];
3225
+ if (arguments.length == 1) {
3226
+ return XNodeSet.prototype.stringForNode(c.contextNode);
3227
+ } else if (arguments.length == 2) {
3228
+ return arguments[1].evaluate(c).string();
3229
+ }
3230
+ throw new Error("Function string expects (object?)");
3231
+ };
3232
+
3233
+ Functions.concat = function() {
3234
+ var c = arguments[0];
3235
+ if (arguments.length < 3) {
3236
+ throw new Error("Function concat expects (string, string, string*)");
3237
+ }
3238
+ var s = "";
3239
+ for (var i = 1; i < arguments.length; i++) {
3240
+ s += arguments[i].evaluate(c).stringValue();
3241
+ }
3242
+ return new XString(s);
3243
+ };
3244
+
3245
+ Functions.startsWith = function() {
3246
+ var c = arguments[0];
3247
+ if (arguments.length != 3) {
3248
+ throw new Error("Function startsWith expects (string, string)");
3249
+ }
3250
+ var s1 = arguments[1].evaluate(c).stringValue();
3251
+ var s2 = arguments[2].evaluate(c).stringValue();
3252
+ return new XBoolean(s1.substring(0, s2.length) == prefix);
3253
+ };
3254
+
3255
+ Functions.contains = function() {
3256
+ var c = arguments[0];
3257
+ if (arguments.length != 3) {
3258
+ throw new Error("Function contains expects (string, string)");
3259
+ }
3260
+ var s1 = arguments[1].evaluate(c).stringValue();
3261
+ var s2 = arguments[2].evaluate(c).stringValue();
3262
+ return new XBoolean(s1.indexOf(s2) != -1);
3263
+ };
3264
+
3265
+ Functions.substringBefore = function() {
3266
+ var c = arguments[0];
3267
+ if (arguments.length != 3) {
3268
+ throw new Error("Function substring-before expects (string, string)");
3269
+ }
3270
+ var s1 = arguments[1].evaluate(c).stringValue();
3271
+ var s2 = arguments[2].evaluate(c).stringValue();
3272
+ return new XString(s1.substring(0, s1.indexOf(s2)));
3273
+ };
3274
+
3275
+ Functions.substringAfter = function() {
3276
+ var c = arguments[0];
3277
+ if (arguments.length != 3) {
3278
+ throw new Error("Function substring-after expects (string, string)");
3279
+ }
3280
+ var s1 = arguments[1].evaluate(c).stringValue();
3281
+ var s2 = arguments[2].evaluate(c).stringValue();
3282
+ if (s2.length == 0) {
3283
+ return new XString(s1);
3284
+ }
3285
+ var i = s1.indexOf(s2);
3286
+ if (i == -1) {
3287
+ return new XString("");
3288
+ }
3289
+ return new XString(s1.substring(s1.indexOf(s2) + 1));
3290
+ };
3291
+
3292
+ Functions.substring = function() {
3293
+ var c = arguments[0];
3294
+ if (!(arguments.length == 3 || arguments.length == 4)) {
3295
+ throw new Error("Function substring expects (string, number, number?)");
3296
+ }
3297
+ var s = arguments[1].evaluate(c).stringValue();
3298
+ var n1 = Math.round(arguments[2].evaluate(c).numberValue()) - 1;
3299
+ var n2 = arguments.length == 4 ? n1 + Math.round(arguments[3].evaluate(c).numberValue()) : undefined;
3300
+ return new XString(s.substring(n1, n2));
3301
+ };
3302
+
3303
+ Functions.stringLength = function() {
3304
+ var c = arguments[0];
3305
+ var s;
3306
+ if (arguments.length == 2) {
3307
+ s = XNodeSet.prototype.stringForNode(c.contextNode);
3308
+ } else if (arguments.length == 3) {
3309
+ s = arguments[1].evaluate(c).stringValue();
3310
+ } else {
3311
+ throw new Error("Function string-length expects (string?)");
3312
+ }
3313
+ return new XNumber(s.length);
3314
+ };
3315
+
3316
+ Functions.normalizeSpace = function() {
3317
+ var c = arguments[0];
3318
+ var s;
3319
+ if (arguments.length == 1) {
3320
+ s = XNodeSet.prototype.stringForNode(c.contextNode);
3321
+ } else if (arguments.length == 2) {
3322
+ s = arguments[1].evaluate(c).stringValue();
3323
+ } else {
3324
+ throw new Error("Function normalize-space expects (string?)");
3325
+ }
3326
+ var i = 0;
3327
+ var j = s.length - 1;
3328
+ while (Utilities.isSpace(s.charCodeAt(j))) {
3329
+ j--;
3330
+ }
3331
+ var t = "";
3332
+ while (i <= j && Utilities.isSpace(s.charCodeAt(i))) {
3333
+ i++;
3334
+ }
3335
+ while (i <= j) {
3336
+ if (Utilities.isSpace(s.charCodeAt(i))) {
3337
+ t += " ";
3338
+ while (i <= j && Utilities.isSpace(s.charCodeAt(i))) {
3339
+ i++;
3340
+ }
3341
+ } else {
3342
+ t += s.charAt(i);
3343
+ i++;
3344
+ }
3345
+ }
3346
+ return new XString(t);
3347
+ };
3348
+
3349
+ Functions.translate = function() {
3350
+ var c = arguments[0];
3351
+ if (arguments.length != 4) {
3352
+ throw new Error("Function translate expects (string, string, string)");
3353
+ }
3354
+ var s1 = arguments[1].evaluate(c).stringValue();
3355
+ var s2 = arguments[2].evaluate(c).stringValue();
3356
+ var s3 = arguments[3].evaluate(c).stringValue();
3357
+ var map = [];
3358
+ for (var i = 0; i < s2.length; i++) {
3359
+ var j = s2.charCodeAt(i);
3360
+ if (map[j] == undefined) {
3361
+ var k = i > s3.length ? "" : s3.charAt(i);
3362
+ map[j] = k;
3363
+ }
3364
+ }
3365
+ var t = "";
3366
+ for (var i = 0; i < s1.length; i++) {
3367
+ var c = s1.charCodeAt(i);
3368
+ var r = map[c];
3369
+ if (r == undefined) {
3370
+ t += s1.charAt(i);
3371
+ } else {
3372
+ t += r;
3373
+ }
3374
+ }
3375
+ return new XString(t);
3376
+ };
3377
+
3378
+ Functions.boolean_ = function() {
3379
+ var c = arguments[0];
3380
+ if (arguments.length != 2) {
3381
+ throw new Error("Function boolean expects (object)");
3382
+ }
3383
+ return arguments[1].evaluate(c).bool();
3384
+ };
3385
+
3386
+ Functions.not = function() {
3387
+ var c = arguments[0];
3388
+ if (arguments.length != 2) {
3389
+ throw new Error("Function not expects (object)");
3390
+ }
3391
+ return arguments[1].evaluate(c).bool().not();
3392
+ };
3393
+
3394
+ Functions.true_ = function() {
3395
+ if (arguments.length != 1) {
3396
+ throw new Error("Function true expects ()");
3397
+ }
3398
+ return new XBoolean(true);
3399
+ };
3400
+
3401
+ Functions.false_ = function() {
3402
+ if (arguments.length != 1) {
3403
+ throw new Error("Function false expects ()");
3404
+ }
3405
+ return new XBoolean(false);
3406
+ };
3407
+
3408
+ Functions.lang = function() {
3409
+ var c = arguments[0];
3410
+ if (arguments.length != 2) {
3411
+ throw new Error("Function lang expects (string)");
3412
+ }
3413
+ var lang;
3414
+ for (var n = c.contextNode; n != null && n.nodeType != 9 /*Node.DOCUMENT_NODE*/; n = n.parentNode) {
3415
+ var a = n.getAttributeNS(XPath.XML_NAMESPACE_URI, "lang");
3416
+ if (a != null) {
3417
+ lang = String(a);
3418
+ break;
3419
+ }
3420
+ }
3421
+ if (lang == null) {
3422
+ return new XBoolean(false);
3423
+ }
3424
+ var s = arguments[1].evaluate(c).stringValue();
3425
+ return new XBoolean(lang.substring(0, s.length) == s
3426
+ && (lang.length == s.length || lang.charAt(s.length) == '-'));
3427
+ };
3428
+
3429
+ Functions.number = function() {
3430
+ var c = arguments[0];
3431
+ if (!(arguments.length == 1 || arguments.length == 2)) {
3432
+ throw new Error("Function number expects (object?)");
3433
+ }
3434
+ if (arguments.length == 1) {
3435
+ return new XNumber(XNodeSet.prototype.stringForNode(c.contextNode));
3436
+ }
3437
+ return arguments[1].evaluate(c).number();
3438
+ };
3439
+
3440
+ Functions.sum = function() {
3441
+ var c = arguments[0];
3442
+ var ns;
3443
+ if (arguments.length != 2 || !Utilities.instance_of((ns = arguments[1].evaluate(c)), XNodeSet)) {
3444
+ throw new Error("Function sum expects (node-set)");
3445
+ }
3446
+ ns = ns.toArray();
3447
+ var n = 0;
3448
+ for (var i = 0; i < ns.length; i++) {
3449
+ n += new XNumber(XNodeSet.prototype.stringForNode(ns[i])).numberValue();
3450
+ }
3451
+ return new XNumber(n);
3452
+ };
3453
+
3454
+ Functions.floor = function() {
3455
+ var c = arguments[0];
3456
+ if (arguments.length != 2) {
3457
+ throw new Error("Function floor expects (number)");
3458
+ }
3459
+ return new XNumber(Math.floor(arguments[1].evaluate(c).numberValue()));
3460
+ };
3461
+
3462
+ Functions.ceiling = function() {
3463
+ var c = arguments[0];
3464
+ if (arguments.length != 2) {
3465
+ throw new Error("Function ceiling expects (number)");
3466
+ }
3467
+ return new XNumber(Math.ceil(arguments[1].evaluate(c).numberValue()));
3468
+ };
3469
+
3470
+ Functions.round = function() {
3471
+ var c = arguments[0];
3472
+ if (arguments.length != 2) {
3473
+ throw new Error("Function round expects (number)");
3474
+ }
3475
+ return new XNumber(Math.round(arguments[1].evaluate(c).numberValue()));
3476
+ };
3477
+
3478
+ // Utilities /////////////////////////////////////////////////////////////////
3479
+
3480
+ Utilities = new Object();
3481
+
3482
+ Utilities.splitQName = function(qn) {
3483
+ var i = qn.indexOf(":");
3484
+ if (i == -1) {
3485
+ return [ null, qn ];
3486
+ }
3487
+ return [ qn.substring(0, i), qn.substring(i + 1) ];
3488
+ };
3489
+
3490
+ Utilities.resolveQName = function(qn, nr, n, useDefault) {
3491
+ var parts = Utilities.splitQName(qn);
3492
+ if (parts[0] != null) {
3493
+ parts[0] = nr.getNamespace(parts[0], n);
3494
+ } else {
3495
+ if (useDefault) {
3496
+ parts[0] = nr.getNamespace("", n);
3497
+ if (parts[0] == null) {
3498
+ parts[0] = "";
3499
+ }
3500
+ } else {
3501
+ parts[0] = "";
3502
+ }
3503
+ }
3504
+ return parts;
3505
+ };
3506
+
3507
+ Utilities.isSpace = function(c) {
3508
+ return c == 0x9 || c == 0xd || c == 0xa || c == 0x20;
3509
+ };
3510
+
3511
+ Utilities.isLetter = function(c) {
3512
+ return c >= 0x0041 && c <= 0x005A ||
3513
+ c >= 0x0061 && c <= 0x007A ||
3514
+ c >= 0x00C0 && c <= 0x00D6 ||
3515
+ c >= 0x00D8 && c <= 0x00F6 ||
3516
+ c >= 0x00F8 && c <= 0x00FF ||
3517
+ c >= 0x0100 && c <= 0x0131 ||
3518
+ c >= 0x0134 && c <= 0x013E ||
3519
+ c >= 0x0141 && c <= 0x0148 ||
3520
+ c >= 0x014A && c <= 0x017E ||
3521
+ c >= 0x0180 && c <= 0x01C3 ||
3522
+ c >= 0x01CD && c <= 0x01F0 ||
3523
+ c >= 0x01F4 && c <= 0x01F5 ||
3524
+ c >= 0x01FA && c <= 0x0217 ||
3525
+ c >= 0x0250 && c <= 0x02A8 ||
3526
+ c >= 0x02BB && c <= 0x02C1 ||
3527
+ c == 0x0386 ||
3528
+ c >= 0x0388 && c <= 0x038A ||
3529
+ c == 0x038C ||
3530
+ c >= 0x038E && c <= 0x03A1 ||
3531
+ c >= 0x03A3 && c <= 0x03CE ||
3532
+ c >= 0x03D0 && c <= 0x03D6 ||
3533
+ c == 0x03DA ||
3534
+ c == 0x03DC ||
3535
+ c == 0x03DE ||
3536
+ c == 0x03E0 ||
3537
+ c >= 0x03E2 && c <= 0x03F3 ||
3538
+ c >= 0x0401 && c <= 0x040C ||
3539
+ c >= 0x040E && c <= 0x044F ||
3540
+ c >= 0x0451 && c <= 0x045C ||
3541
+ c >= 0x045E && c <= 0x0481 ||
3542
+ c >= 0x0490 && c <= 0x04C4 ||
3543
+ c >= 0x04C7 && c <= 0x04C8 ||
3544
+ c >= 0x04CB && c <= 0x04CC ||
3545
+ c >= 0x04D0 && c <= 0x04EB ||
3546
+ c >= 0x04EE && c <= 0x04F5 ||
3547
+ c >= 0x04F8 && c <= 0x04F9 ||
3548
+ c >= 0x0531 && c <= 0x0556 ||
3549
+ c == 0x0559 ||
3550
+ c >= 0x0561 && c <= 0x0586 ||
3551
+ c >= 0x05D0 && c <= 0x05EA ||
3552
+ c >= 0x05F0 && c <= 0x05F2 ||
3553
+ c >= 0x0621 && c <= 0x063A ||
3554
+ c >= 0x0641 && c <= 0x064A ||
3555
+ c >= 0x0671 && c <= 0x06B7 ||
3556
+ c >= 0x06BA && c <= 0x06BE ||
3557
+ c >= 0x06C0 && c <= 0x06CE ||
3558
+ c >= 0x06D0 && c <= 0x06D3 ||
3559
+ c == 0x06D5 ||
3560
+ c >= 0x06E5 && c <= 0x06E6 ||
3561
+ c >= 0x0905 && c <= 0x0939 ||
3562
+ c == 0x093D ||
3563
+ c >= 0x0958 && c <= 0x0961 ||
3564
+ c >= 0x0985 && c <= 0x098C ||
3565
+ c >= 0x098F && c <= 0x0990 ||
3566
+ c >= 0x0993 && c <= 0x09A8 ||
3567
+ c >= 0x09AA && c <= 0x09B0 ||
3568
+ c == 0x09B2 ||
3569
+ c >= 0x09B6 && c <= 0x09B9 ||
3570
+ c >= 0x09DC && c <= 0x09DD ||
3571
+ c >= 0x09DF && c <= 0x09E1 ||
3572
+ c >= 0x09F0 && c <= 0x09F1 ||
3573
+ c >= 0x0A05 && c <= 0x0A0A ||
3574
+ c >= 0x0A0F && c <= 0x0A10 ||
3575
+ c >= 0x0A13 && c <= 0x0A28 ||
3576
+ c >= 0x0A2A && c <= 0x0A30 ||
3577
+ c >= 0x0A32 && c <= 0x0A33 ||
3578
+ c >= 0x0A35 && c <= 0x0A36 ||
3579
+ c >= 0x0A38 && c <= 0x0A39 ||
3580
+ c >= 0x0A59 && c <= 0x0A5C ||
3581
+ c == 0x0A5E ||
3582
+ c >= 0x0A72 && c <= 0x0A74 ||
3583
+ c >= 0x0A85 && c <= 0x0A8B ||
3584
+ c == 0x0A8D ||
3585
+ c >= 0x0A8F && c <= 0x0A91 ||
3586
+ c >= 0x0A93 && c <= 0x0AA8 ||
3587
+ c >= 0x0AAA && c <= 0x0AB0 ||
3588
+ c >= 0x0AB2 && c <= 0x0AB3 ||
3589
+ c >= 0x0AB5 && c <= 0x0AB9 ||
3590
+ c == 0x0ABD ||
3591
+ c == 0x0AE0 ||
3592
+ c >= 0x0B05 && c <= 0x0B0C ||
3593
+ c >= 0x0B0F && c <= 0x0B10 ||
3594
+ c >= 0x0B13 && c <= 0x0B28 ||
3595
+ c >= 0x0B2A && c <= 0x0B30 ||
3596
+ c >= 0x0B32 && c <= 0x0B33 ||
3597
+ c >= 0x0B36 && c <= 0x0B39 ||
3598
+ c == 0x0B3D ||
3599
+ c >= 0x0B5C && c <= 0x0B5D ||
3600
+ c >= 0x0B5F && c <= 0x0B61 ||
3601
+ c >= 0x0B85 && c <= 0x0B8A ||
3602
+ c >= 0x0B8E && c <= 0x0B90 ||
3603
+ c >= 0x0B92 && c <= 0x0B95 ||
3604
+ c >= 0x0B99 && c <= 0x0B9A ||
3605
+ c == 0x0B9C ||
3606
+ c >= 0x0B9E && c <= 0x0B9F ||
3607
+ c >= 0x0BA3 && c <= 0x0BA4 ||
3608
+ c >= 0x0BA8 && c <= 0x0BAA ||
3609
+ c >= 0x0BAE && c <= 0x0BB5 ||
3610
+ c >= 0x0BB7 && c <= 0x0BB9 ||
3611
+ c >= 0x0C05 && c <= 0x0C0C ||
3612
+ c >= 0x0C0E && c <= 0x0C10 ||
3613
+ c >= 0x0C12 && c <= 0x0C28 ||
3614
+ c >= 0x0C2A && c <= 0x0C33 ||
3615
+ c >= 0x0C35 && c <= 0x0C39 ||
3616
+ c >= 0x0C60 && c <= 0x0C61 ||
3617
+ c >= 0x0C85 && c <= 0x0C8C ||
3618
+ c >= 0x0C8E && c <= 0x0C90 ||
3619
+ c >= 0x0C92 && c <= 0x0CA8 ||
3620
+ c >= 0x0CAA && c <= 0x0CB3 ||
3621
+ c >= 0x0CB5 && c <= 0x0CB9 ||
3622
+ c == 0x0CDE ||
3623
+ c >= 0x0CE0 && c <= 0x0CE1 ||
3624
+ c >= 0x0D05 && c <= 0x0D0C ||
3625
+ c >= 0x0D0E && c <= 0x0D10 ||
3626
+ c >= 0x0D12 && c <= 0x0D28 ||
3627
+ c >= 0x0D2A && c <= 0x0D39 ||
3628
+ c >= 0x0D60 && c <= 0x0D61 ||
3629
+ c >= 0x0E01 && c <= 0x0E2E ||
3630
+ c == 0x0E30 ||
3631
+ c >= 0x0E32 && c <= 0x0E33 ||
3632
+ c >= 0x0E40 && c <= 0x0E45 ||
3633
+ c >= 0x0E81 && c <= 0x0E82 ||
3634
+ c == 0x0E84 ||
3635
+ c >= 0x0E87 && c <= 0x0E88 ||
3636
+ c == 0x0E8A ||
3637
+ c == 0x0E8D ||
3638
+ c >= 0x0E94 && c <= 0x0E97 ||
3639
+ c >= 0x0E99 && c <= 0x0E9F ||
3640
+ c >= 0x0EA1 && c <= 0x0EA3 ||
3641
+ c == 0x0EA5 ||
3642
+ c == 0x0EA7 ||
3643
+ c >= 0x0EAA && c <= 0x0EAB ||
3644
+ c >= 0x0EAD && c <= 0x0EAE ||
3645
+ c == 0x0EB0 ||
3646
+ c >= 0x0EB2 && c <= 0x0EB3 ||
3647
+ c == 0x0EBD ||
3648
+ c >= 0x0EC0 && c <= 0x0EC4 ||
3649
+ c >= 0x0F40 && c <= 0x0F47 ||
3650
+ c >= 0x0F49 && c <= 0x0F69 ||
3651
+ c >= 0x10A0 && c <= 0x10C5 ||
3652
+ c >= 0x10D0 && c <= 0x10F6 ||
3653
+ c == 0x1100 ||
3654
+ c >= 0x1102 && c <= 0x1103 ||
3655
+ c >= 0x1105 && c <= 0x1107 ||
3656
+ c == 0x1109 ||
3657
+ c >= 0x110B && c <= 0x110C ||
3658
+ c >= 0x110E && c <= 0x1112 ||
3659
+ c == 0x113C ||
3660
+ c == 0x113E ||
3661
+ c == 0x1140 ||
3662
+ c == 0x114C ||
3663
+ c == 0x114E ||
3664
+ c == 0x1150 ||
3665
+ c >= 0x1154 && c <= 0x1155 ||
3666
+ c == 0x1159 ||
3667
+ c >= 0x115F && c <= 0x1161 ||
3668
+ c == 0x1163 ||
3669
+ c == 0x1165 ||
3670
+ c == 0x1167 ||
3671
+ c == 0x1169 ||
3672
+ c >= 0x116D && c <= 0x116E ||
3673
+ c >= 0x1172 && c <= 0x1173 ||
3674
+ c == 0x1175 ||
3675
+ c == 0x119E ||
3676
+ c == 0x11A8 ||
3677
+ c == 0x11AB ||
3678
+ c >= 0x11AE && c <= 0x11AF ||
3679
+ c >= 0x11B7 && c <= 0x11B8 ||
3680
+ c == 0x11BA ||
3681
+ c >= 0x11BC && c <= 0x11C2 ||
3682
+ c == 0x11EB ||
3683
+ c == 0x11F0 ||
3684
+ c == 0x11F9 ||
3685
+ c >= 0x1E00 && c <= 0x1E9B ||
3686
+ c >= 0x1EA0 && c <= 0x1EF9 ||
3687
+ c >= 0x1F00 && c <= 0x1F15 ||
3688
+ c >= 0x1F18 && c <= 0x1F1D ||
3689
+ c >= 0x1F20 && c <= 0x1F45 ||
3690
+ c >= 0x1F48 && c <= 0x1F4D ||
3691
+ c >= 0x1F50 && c <= 0x1F57 ||
3692
+ c == 0x1F59 ||
3693
+ c == 0x1F5B ||
3694
+ c == 0x1F5D ||
3695
+ c >= 0x1F5F && c <= 0x1F7D ||
3696
+ c >= 0x1F80 && c <= 0x1FB4 ||
3697
+ c >= 0x1FB6 && c <= 0x1FBC ||
3698
+ c == 0x1FBE ||
3699
+ c >= 0x1FC2 && c <= 0x1FC4 ||
3700
+ c >= 0x1FC6 && c <= 0x1FCC ||
3701
+ c >= 0x1FD0 && c <= 0x1FD3 ||
3702
+ c >= 0x1FD6 && c <= 0x1FDB ||
3703
+ c >= 0x1FE0 && c <= 0x1FEC ||
3704
+ c >= 0x1FF2 && c <= 0x1FF4 ||
3705
+ c >= 0x1FF6 && c <= 0x1FFC ||
3706
+ c == 0x2126 ||
3707
+ c >= 0x212A && c <= 0x212B ||
3708
+ c == 0x212E ||
3709
+ c >= 0x2180 && c <= 0x2182 ||
3710
+ c >= 0x3041 && c <= 0x3094 ||
3711
+ c >= 0x30A1 && c <= 0x30FA ||
3712
+ c >= 0x3105 && c <= 0x312C ||
3713
+ c >= 0xAC00 && c <= 0xD7A3 ||
3714
+ c >= 0x4E00 && c <= 0x9FA5 ||
3715
+ c == 0x3007 ||
3716
+ c >= 0x3021 && c <= 0x3029;
3717
+ };
3718
+
3719
+ Utilities.isNCNameChar = function(c) {
3720
+ return c >= 0x0030 && c <= 0x0039
3721
+ || c >= 0x0660 && c <= 0x0669
3722
+ || c >= 0x06F0 && c <= 0x06F9
3723
+ || c >= 0x0966 && c <= 0x096F
3724
+ || c >= 0x09E6 && c <= 0x09EF
3725
+ || c >= 0x0A66 && c <= 0x0A6F
3726
+ || c >= 0x0AE6 && c <= 0x0AEF
3727
+ || c >= 0x0B66 && c <= 0x0B6F
3728
+ || c >= 0x0BE7 && c <= 0x0BEF
3729
+ || c >= 0x0C66 && c <= 0x0C6F
3730
+ || c >= 0x0CE6 && c <= 0x0CEF
3731
+ || c >= 0x0D66 && c <= 0x0D6F
3732
+ || c >= 0x0E50 && c <= 0x0E59
3733
+ || c >= 0x0ED0 && c <= 0x0ED9
3734
+ || c >= 0x0F20 && c <= 0x0F29
3735
+ || c == 0x002E
3736
+ || c == 0x002D
3737
+ || c == 0x005F
3738
+ || Utilities.isLetter(c)
3739
+ || c >= 0x0300 && c <= 0x0345
3740
+ || c >= 0x0360 && c <= 0x0361
3741
+ || c >= 0x0483 && c <= 0x0486
3742
+ || c >= 0x0591 && c <= 0x05A1
3743
+ || c >= 0x05A3 && c <= 0x05B9
3744
+ || c >= 0x05BB && c <= 0x05BD
3745
+ || c == 0x05BF
3746
+ || c >= 0x05C1 && c <= 0x05C2
3747
+ || c == 0x05C4
3748
+ || c >= 0x064B && c <= 0x0652
3749
+ || c == 0x0670
3750
+ || c >= 0x06D6 && c <= 0x06DC
3751
+ || c >= 0x06DD && c <= 0x06DF
3752
+ || c >= 0x06E0 && c <= 0x06E4
3753
+ || c >= 0x06E7 && c <= 0x06E8
3754
+ || c >= 0x06EA && c <= 0x06ED
3755
+ || c >= 0x0901 && c <= 0x0903
3756
+ || c == 0x093C
3757
+ || c >= 0x093E && c <= 0x094C
3758
+ || c == 0x094D
3759
+ || c >= 0x0951 && c <= 0x0954
3760
+ || c >= 0x0962 && c <= 0x0963
3761
+ || c >= 0x0981 && c <= 0x0983
3762
+ || c == 0x09BC
3763
+ || c == 0x09BE
3764
+ || c == 0x09BF
3765
+ || c >= 0x09C0 && c <= 0x09C4
3766
+ || c >= 0x09C7 && c <= 0x09C8
3767
+ || c >= 0x09CB && c <= 0x09CD
3768
+ || c == 0x09D7
3769
+ || c >= 0x09E2 && c <= 0x09E3
3770
+ || c == 0x0A02
3771
+ || c == 0x0A3C
3772
+ || c == 0x0A3E
3773
+ || c == 0x0A3F
3774
+ || c >= 0x0A40 && c <= 0x0A42
3775
+ || c >= 0x0A47 && c <= 0x0A48
3776
+ || c >= 0x0A4B && c <= 0x0A4D
3777
+ || c >= 0x0A70 && c <= 0x0A71
3778
+ || c >= 0x0A81 && c <= 0x0A83
3779
+ || c == 0x0ABC
3780
+ || c >= 0x0ABE && c <= 0x0AC5
3781
+ || c >= 0x0AC7 && c <= 0x0AC9
3782
+ || c >= 0x0ACB && c <= 0x0ACD
3783
+ || c >= 0x0B01 && c <= 0x0B03
3784
+ || c == 0x0B3C
3785
+ || c >= 0x0B3E && c <= 0x0B43
3786
+ || c >= 0x0B47 && c <= 0x0B48
3787
+ || c >= 0x0B4B && c <= 0x0B4D
3788
+ || c >= 0x0B56 && c <= 0x0B57
3789
+ || c >= 0x0B82 && c <= 0x0B83
3790
+ || c >= 0x0BBE && c <= 0x0BC2
3791
+ || c >= 0x0BC6 && c <= 0x0BC8
3792
+ || c >= 0x0BCA && c <= 0x0BCD
3793
+ || c == 0x0BD7
3794
+ || c >= 0x0C01 && c <= 0x0C03
3795
+ || c >= 0x0C3E && c <= 0x0C44
3796
+ || c >= 0x0C46 && c <= 0x0C48
3797
+ || c >= 0x0C4A && c <= 0x0C4D
3798
+ || c >= 0x0C55 && c <= 0x0C56
3799
+ || c >= 0x0C82 && c <= 0x0C83
3800
+ || c >= 0x0CBE && c <= 0x0CC4
3801
+ || c >= 0x0CC6 && c <= 0x0CC8
3802
+ || c >= 0x0CCA && c <= 0x0CCD
3803
+ || c >= 0x0CD5 && c <= 0x0CD6
3804
+ || c >= 0x0D02 && c <= 0x0D03
3805
+ || c >= 0x0D3E && c <= 0x0D43
3806
+ || c >= 0x0D46 && c <= 0x0D48
3807
+ || c >= 0x0D4A && c <= 0x0D4D
3808
+ || c == 0x0D57
3809
+ || c == 0x0E31
3810
+ || c >= 0x0E34 && c <= 0x0E3A
3811
+ || c >= 0x0E47 && c <= 0x0E4E
3812
+ || c == 0x0EB1
3813
+ || c >= 0x0EB4 && c <= 0x0EB9
3814
+ || c >= 0x0EBB && c <= 0x0EBC
3815
+ || c >= 0x0EC8 && c <= 0x0ECD
3816
+ || c >= 0x0F18 && c <= 0x0F19
3817
+ || c == 0x0F35
3818
+ || c == 0x0F37
3819
+ || c == 0x0F39
3820
+ || c == 0x0F3E
3821
+ || c == 0x0F3F
3822
+ || c >= 0x0F71 && c <= 0x0F84
3823
+ || c >= 0x0F86 && c <= 0x0F8B
3824
+ || c >= 0x0F90 && c <= 0x0F95
3825
+ || c == 0x0F97
3826
+ || c >= 0x0F99 && c <= 0x0FAD
3827
+ || c >= 0x0FB1 && c <= 0x0FB7
3828
+ || c == 0x0FB9
3829
+ || c >= 0x20D0 && c <= 0x20DC
3830
+ || c == 0x20E1
3831
+ || c >= 0x302A && c <= 0x302F
3832
+ || c == 0x3099
3833
+ || c == 0x309A
3834
+ || c == 0x00B7
3835
+ || c == 0x02D0
3836
+ || c == 0x02D1
3837
+ || c == 0x0387
3838
+ || c == 0x0640
3839
+ || c == 0x0E46
3840
+ || c == 0x0EC6
3841
+ || c == 0x3005
3842
+ || c >= 0x3031 && c <= 0x3035
3843
+ || c >= 0x309D && c <= 0x309E
3844
+ || c >= 0x30FC && c <= 0x30FE;
3845
+ };
3846
+
3847
+ Utilities.coalesceText = function(n) {
3848
+ for (var m = n.firstChild; m != null; m = m.nextSibling) {
3849
+ if (m.nodeType == 3 /*Node.TEXT_NODE*/ || m.nodeType == 4 /*Node.CDATA_SECTION_NODE*/) {
3850
+ var s = m.nodeValue;
3851
+ var first = m;
3852
+ m = m.nextSibling;
3853
+ while (m != null && (m.nodeType == 3 /*Node.TEXT_NODE*/ || m.nodeType == 4 /*Node.CDATA_SECTION_NODE*/)) {
3854
+ s += m.nodeValue;
3855
+ var del = m;
3856
+ m = m.nextSibling;
3857
+ del.parentNode.removeChild(del);
3858
+ }
3859
+ if (first.nodeType == 4 /*Node.CDATA_SECTION_NODE*/) {
3860
+ var p = first.parentNode;
3861
+ if (first.nextSibling == null) {
3862
+ p.removeChild(first);
3863
+ p.appendChild(p.ownerDocument.createTextNode(s));
3864
+ } else {
3865
+ var next = first.nextSibling;
3866
+ p.removeChild(first);
3867
+ p.insertBefore(p.ownerDocument.createTextNode(s), next);
3868
+ }
3869
+ } else {
3870
+ first.nodeValue = s;
3871
+ }
3872
+ if (m == null) {
3873
+ break;
3874
+ }
3875
+ } else if (m.nodeType == 1 /*Node.ELEMENT_NODE*/) {
3876
+ Utilities.coalesceText(m);
3877
+ }
3878
+ }
3879
+ };
3880
+
3881
+ Utilities.instance_of = function(o, c) {
3882
+ while (o != null) {
3883
+ if (o.constructor === c) {
3884
+ return true;
3885
+ }
3886
+ if (o === Object) {
3887
+ return false;
3888
+ }
3889
+ o = o.constructor.superclass;
3890
+ }
3891
+ return false;
3892
+ };
3893
+
3894
+ Utilities.getElementById = function(n, id) {
3895
+ // Note that this does not check the DTD to check for actual
3896
+ // attributes of type ID, so this may be a bit wrong.
3897
+ if (n.nodeType == 1 /*Node.ELEMENT_NODE*/) {
3898
+ if (n.getAttribute("id") == id
3899
+ || n.getAttributeNS(null, "id") == id) {
3900
+ return n;
3901
+ }
3902
+ }
3903
+ for (var m = n.firstChild; m != null; m = m.nextSibling) {
3904
+ var res = Utilities.getElementById(m, id);
3905
+ if (res != null) {
3906
+ return res;
3907
+ }
3908
+ }
3909
+ return null;
3910
+ };