| 11 | | var addEvent = window.attachEvent ? function (eventName, func, b) { window.attachEvent('on'+eventName, func); } |
| 12 | | : window.addEventListener; |
| | 8 | var addEvent = function (target, e, func, b) { |
| | 9 | if (target.attachEvent) { |
| | 10 | target.attachEvent('on'+e, func); |
| | 11 | } else { |
| | 12 | target.addEventListener(e, func, b); |
| | 13 | } |
| | 14 | }; |
| | 46 | function clickableCodeArea () { |
| | 47 | var start = "//Executable"; |
| | 48 | var codes = $X("//pre[starts-with(normalize-space(.), '"+start+"')]"); |
| | 49 | for (var i = 0; i < codes.length; i++) { |
| | 50 | var e = codes[i]; |
| | 51 | var js = $X("string(.)", e); |
| | 52 | var a = document.createElement('a'); |
| | 53 | a.innerHTML = "Click to execute." |
| | 54 | addEvent(a, 'click', function() { |
| | 55 | eval(js); |
| | 56 | }, false); |
| | 57 | var s = a.style; |
| | 58 | s.fontWeight = 'bold'; |
| | 59 | s.border = "1px solid #ccc"; |
| | 60 | s.display = "block"; |
| | 61 | s.width = "10em"; |
| | 62 | s.padding = "0.2em"; |
| | 63 | s.margin = "0 auto 0.2em 0"; |
| | 64 | s.textAlign = "center"; |
| | 65 | a.href = 'javascript:void(0)'; |
| | 66 | e.parentNode.insertBefore(a, e); |
| | 67 | } |
| | 68 | } |
| | 69 | |
| | 70 | addEvent(window, 'load', function () { |
| | 71 | addJumpToReposLink(); |
| | 72 | clickableCodeArea(); |
| | 73 | }, false); |
| | 74 | |
| | 76 | |
| | 77 | // extend version of $X |
| | 78 | // $X(exp); |
| | 79 | // $X(exp, context); |
| | 80 | // $X(exp, type); |
| | 81 | // $X(exp, context, type); |
| | 82 | function $X (exp, context, type /* want type */) { |
| | 83 | if (typeof context == "function") { |
| | 84 | type = context; |
| | 85 | context = null; |
| | 86 | } |
| | 87 | if (!context) context = document; |
| | 88 | var exp = document.createExpression(exp, function (prefix) { |
| | 89 | var o = document.createNSResolver(context)(prefix); |
| | 90 | return o ? o : (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : ""; |
| | 91 | }); |
| | 92 | |
| | 93 | if (type) { |
| | 94 | switch (type) { |
| | 95 | case String: |
| | 96 | return exp.evaluate( |
| | 97 | context, |
| | 98 | XPathResult.STRING_TYPE, |
| | 99 | null |
| | 100 | ).stringValue; |
| | 101 | case Number: |
| | 102 | return exp.evaluate( |
| | 103 | context, |
| | 104 | XPathResult.NUMBER_TYPE, |
| | 105 | null |
| | 106 | ).numberValue; |
| | 107 | case Boolean: |
| | 108 | return exp.evaluate( |
| | 109 | context, |
| | 110 | XPathResult.BOOLEAN_TYPE, |
| | 111 | null |
| | 112 | ).booleanValue; |
| | 113 | case Array: |
| | 114 | var result = exp.evaluate( |
| | 115 | context, |
| | 116 | XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, |
| | 117 | null |
| | 118 | ); |
| | 119 | var ret = []; |
| | 120 | for (var i = 0, len = result.snapshotLength; i < len; i++) { |
| | 121 | ret.push(result.snapshotItem(i)); |
| | 122 | } |
| | 123 | return ret; |
| | 124 | } |
| | 125 | } else { |
| | 126 | var result = exp.evaluate(context, XPathResult.ANY_TYPE, null); |
| | 127 | switch (result.resultType) { |
| | 128 | case XPathResult.STRING_TYPE : return result.stringValue; |
| | 129 | case XPathResult.NUMBER_TYPE : return result.numberValue; |
| | 130 | case XPathResult.BOOLEAN_TYPE: return result.booleanValue; |
| | 131 | case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: { |
| | 132 | // not ensure the order. |
| | 133 | var ret = []; |
| | 134 | var i = null; |
| | 135 | while (i = result.iterateNext()) { |
| | 136 | ret.push(i); |
| | 137 | } |
| | 138 | return ret; |
| | 139 | } |
| | 140 | } |
| | 141 | return null; |
| | 142 | } |
| | 143 | } |