function xpathParse(a){xpathdebug&&Log.write("XPath parse "+a);xpathParseInit();var b=xpathCacheLookup(a);if(b)return xpathdebug&&Log.write(" ... cached"),b;if(a.match(/^(\$|@)?\w+$/i))return b=makeSimpleExpr(a),xpathParseCache[a]=b,xpathdebug&&Log.write(" ... simple"),b;if(a.match(/^\w+(\/\w+)*$/i))return b=makeSimpleExpr2(a),xpathParseCache[a]=b,xpathdebug&&Log.write(" ... simple 2"),b;b=a;xpathdebug&&Timer.start("XPath parse",b);for(var c=[],d=null,e=null,f=!1,g=0,i=0,l=0;!f;){g++;for(var a=a.replace(/^\s*/, ""),e=d,h=d=null,k="",m=0;m<xpathTokenRules.length;++m){var j=xpathTokenRules[m].re.exec(a);i++;if(j&&0<j.length&&j[0].length>k.length){h=xpathTokenRules[m];k=j[0];break}}if(h&&(h==TOK_DIV||h==TOK_MOD||h==TOK_AND||h==TOK_OR)&&(!e||e.tag==TOK_AT||e.tag==TOK_DSLASH||e.tag==TOK_SLASH||e.tag==TOK_AXIS||e.tag==TOK_DOLLAR))h=TOK_QNAME;h?(a=a.substr(k.length),xpathdebug&&Log.write("token: "+k+" -- "+h.label),d={tag:h,match:k,prec:h.prec?h.prec:0,expr:makeTokenExpr(k)}):(xpathdebug&&Log.write("DONE"),f=!0); for(;xpathReduce(c,d);)l++,xpathdebug&&Log.write("stack: "+stackToString(c))}xpathdebug&&Log.write(stackToString(c));if(1!=c.length)throw"XPath parse error "+b+":\n"+stackToString(c);j=c[0].expr;xpathParseCache[b]=j;xpathdebug&&Timer.end("XPath parse",b);xpathdebug&&Log.write("XPath parse: "+g+" / "+i+" / "+l);return j}var xpathParseCache={};function xpathCacheLookup(a){return xpathParseCache[a]} function xpathReduce(a,b){var c=null;if(0<a.length){var d=xpathRules[a[a.length-1].tag.key];if(d)for(var e=0;e<d.length;++e){var f=d[e],g=xpathMatchStack(a,f[1]);if(g.length){c={tag:f[0],rule:f,match:g};c.prec=xpathGrammarPrecedence(c);break}}}if(c&&(!b||c.prec>b.prec||b.tag.left&&c.prec>=b.prec)){for(e=0;e<c.match.matchlength;++e)a.pop();xpathdebug&&Log.write("reduce "+c.tag.label+" "+c.prec+" ahead "+(b?b.tag.label+" "+b.prec+(b.tag.left?" left":""):" none "));d=mapExpr(c.match,function(a){return a.expr}); c.expr=c.rule[3].apply(null,d);a.push(c);c=!0}else b&&(xpathdebug&&Log.write("shift "+b.tag.label+" "+b.prec+(b.tag.left?" left":"")+" over "+(c?c.tag.label+" "+c.prec:" none")),a.push(b)),c=!1;return c} function xpathMatchStack(a,b){var c=a.length,d=b.length,e=[],f=e.matchlength=0;for(d-=1,c-=1;0<=d&&0<=c;--d,c-=f){var f=0,g=[];if(b[d]==Q_MM){d-=1;for(e.push(g);0<=c-f&&a[c-f].tag==b[d];)g.push(a[c-f]),f+=1,e.matchlength+=1}else if(b[d]==Q_01){d-=1;for(e.push(g);0<=c-f&&2>f&&a[c-f].tag==b[d];)g.push(a[c-f]),f+=1,e.matchlength+=1}else if(b[d]==Q_1M)if(d-=1,e.push(g),a[c].tag==b[d])for(;0<=c-f&&a[c-f].tag==b[d];)g.push(a[c-f]),f+=1,e.matchlength+=1;else return[];else if(a[c].tag==b[d])e.push(a[c]), f+=1,e.matchlength+=1;else return[];reverseInplace(g);g.expr=mapExpr(g,function(a){return a.expr})}reverseInplace(e);return-1==d?e:[]}function xpathTokenPrecedence(a){return a.prec||2} function xpathGrammarPrecedence(a){var b=0;if(a.rule)if(3<=a.rule.length&&0<=a.rule[2])b=a.rule[2];else for(var c=0;c<a.rule[1].length;++c)var d=xpathTokenPrecedence(a.rule[1][c]),b=Math.max(b,d);else if(a.tag)b=xpathTokenPrecedence(a.tag);else if(a.length)for(c=0;c<a.length;++c)d=xpathGrammarPrecedence(a[c]),b=Math.max(b,d);return b}function stackToString(a){for(var b="",c=0;c<a.length;++c)b&&(b+="\n"),b+=a[c].tag.label;return b} function ExprContext(a,b,c,d){this.node=a;this.position=b||0;this.nodelist=c||[a];this.variables={};this.parent=d||null;this.root=d?d.root:a.ownerDocument}ExprContext.prototype.clone=function(a,b,c){return new ExprContext(a||this.node,"undefined"!=typeof b?b:this.position,c||this.nodelist,this)};ExprContext.prototype.setVariable=function(a,b){this.variables[a]=b}; ExprContext.prototype.getVariable=function(a){return"undefined"!=typeof this.variables[a]?this.variables[a]:this.parent?this.parent.getVariable(a):null};ExprContext.prototype.setNode=function(a,b){this.node=a;this.position=b};function StringValue(a){this.value=a;this.type="string"}StringValue.prototype.stringValue=function(){return this.value};StringValue.prototype.booleanValue=function(){return 0<this.value.length};StringValue.prototype.numberValue=function(){return this.value-0}; StringValue.prototype.nodeSetValue=function(){throw this+" "+Error().stack;};function BooleanValue(a){this.value=a;this.type="boolean"}BooleanValue.prototype.stringValue=function(){return""+this.value};BooleanValue.prototype.booleanValue=function(){return this.value};BooleanValue.prototype.numberValue=function(){return this.value?1:0};BooleanValue.prototype.nodeSetValue=function(){throw this+" "+Error().stack;};function NumberValue(a){this.value=a;this.type="number"} NumberValue.prototype.stringValue=function(){return""+this.value};NumberValue.prototype.booleanValue=function(){return!!this.value};NumberValue.prototype.numberValue=function(){return this.value-0};NumberValue.prototype.nodeSetValue=function(){throw this+" "+Error().stack;};function NodeSetValue(a){this.value=a;this.type="node-set"}NodeSetValue.prototype.stringValue=function(){return 0==this.value.length?"":xmlValue(this.value[0])};NodeSetValue.prototype.booleanValue=function(){return 0<this.value.length}; NodeSetValue.prototype.numberValue=function(){return this.stringValue()-0};NodeSetValue.prototype.nodeSetValue=function(){return this.value};function TokenExpr(a){this.value=a}TokenExpr.prototype.evaluate=function(){return new StringValue(this.value)};function LocationExpr(){this.absolute=!1;this.steps=[]}LocationExpr.prototype.appendStep=function(a){this.steps.push(a)};LocationExpr.prototype.prependStep=function(a){var b=this.steps;this.steps=[a];for(a=0;a<b.length;++a)this.steps.push(b[a])}; LocationExpr.prototype.evaluate=function(a){var b=[];xPathStep(b,this.steps,0,this.absolute?a.root:a.node,a);return new NodeSetValue(b)};function xPathStep(a,b,c,d,e){for(var f=b[c],d=e.clone(d),f=f.evaluate(d).nodeSetValue(),d=0;d<f.length;++d)c==b.length-1?a.push(f[d]):xPathStep(a,b,c+1,f[d],e)}function StepExpr(a,b,c){this.axis=a;this.nodetest=b;this.predicate=c||[]}StepExpr.prototype.appendPredicate=function(a){this.predicate.push(a)}; StepExpr.prototype.evaluate=function(a){var b=a.node,c=[];if(this.axis==xpathAxis.ANCESTOR_OR_SELF){c.push(b);for(var d=b.parentNode;d;d=b.parentNode)c.push(d)}else if(this.axis==xpathAxis.ANCESTOR)for(d=b.parentNode;d;d=b.parentNode)c.push(d);else if(this.axis==xpathAxis.ATTRIBUTE)copyArray(c,b.attributes);else if(this.axis==xpathAxis.CHILD)copyArray(c,b.childNodes);else if(this.axis==xpathAxis.DESCENDANT_OR_SELF)c.push(b),xpathCollectDescendants(c,b);else if(this.axis==xpathAxis.DESCENDANT)xpathCollectDescendants(c, b);else if(this.axis==xpathAxis.FOLLOWING)for(d=b.parentNode;d;d=d.parentNode)for(b=d.nextSibling;b;b=b.nextSibling)c.push(b),xpathCollectDescendants(c,b);else if(this.axis==xpathAxis.FOLLOWING_SIBLING)for(d=b.nextSibling;d;d=b.nextSibling)c.push(d);else if(this.axis==xpathAxis.NAMESPACE)alert("not implemented: axis namespace");else if(this.axis==xpathAxis.PARENT)b.parentNode&&c.push(b.parentNode);else if(this.axis==xpathAxis.PRECEDING)for(d=b.parentNode;d;d=d.parentNode)for(b=d.previousSibling;b;b= b.previousSibling)c.push(b),xpathCollectDescendantsReverse(c,b);else if(this.axis==xpathAxis.PRECEDING_SIBLING)for(d=b.previousSibling;d;d=b.previousSibling)c.push(d);else if(this.axis==xpathAxis.SELF)c.push(b);else throw"ERROR -- NO SUCH AXIS: "+this.axis;for(var b=c,c=[],e=0;e<b.length;++e)d=b[e],this.nodetest.evaluate(a.clone(d,e,b)).booleanValue()&&c.push(d);for(e=0;e<this.predicate.length;++e)for(var b=c,c=[],f=0;f<b.length;++f)d=b[f],this.predicate[e].evaluate(a.clone(d,f,b)).booleanValue()&& c.push(d);return new NodeSetValue(c)};function NodeTestAny(){this.value=new BooleanValue(!0)}NodeTestAny.prototype.evaluate=function(){return this.value};function NodeTestElement(){}NodeTestElement.prototype.evaluate=function(a){return new BooleanValue(a.node.nodeType==DOM_ELEMENT_NODE)};function NodeTestText(){}NodeTestText.prototype.evaluate=function(a){return new BooleanValue(a.node.nodeType==DOM_TEXT_NODE)};function NodeTestComment(){} NodeTestComment.prototype.evaluate=function(a){return new BooleanValue(a.node.nodeType==DOM_COMMENT_NODE)};function NodeTestPI(a){this.target=a}NodeTestPI.prototype.evaluate=function(a){return new BooleanValue(a.node.nodeType==DOM_PROCESSING_INSTRUCTION_NODE&&(!this.target||a.node.nodeName==this.target))};function NodeTestNC(a){this.regex=RegExp("^"+a+":");this.nsprefix=a}NodeTestNC.prototype.evaluate=function(a){return new BooleanValue(this.regex.match(a.node.nodeName))}; function NodeTestName(a){this.name=a}NodeTestName.prototype.evaluate=function(a){return new BooleanValue(a.node.nodeName==this.name)};function PredicateExpr(a){this.expr=a}PredicateExpr.prototype.evaluate=function(a){var b=this.expr.evaluate(a);return"number"==b.type?new BooleanValue(a.position==b.numberValue()-1):new BooleanValue(b.booleanValue())};function FunctionCallExpr(a){this.name=a;this.args=[]}FunctionCallExpr.prototype.appendArg=function(a){this.args.push(a)}; FunctionCallExpr.prototype.evaluate=function(a){var b=""+this.name.value,c=this.xpathfunctions[b];if(c)return c.call(this,a);Log.write("XPath NO SUCH FUNCTION "+b);return new BooleanValue(!1)}; FunctionCallExpr.prototype.xpathfunctions={last:function(a){assert(0==this.args.length);return new NumberValue(a.nodelist.length)},position:function(a){assert(0==this.args.length);return new NumberValue(a.position+1)},count:function(a){assert(1==this.args.length);a=this.args[0].evaluate(a);return new NumberValue(a.nodeSetValue().length)},id:function(a){assert(1==this.args.length);var b=this.args.evaluate(a),c=[],d;if("node-set"==b.type){d=[];for(var e=0;e<b.length;++e)for(var f=xmlValue(b[e]).split(/\s+/), g=0;g<f.length;++g)d.push(f[g])}else d=b.split(/\s+/);a=a.node.ownerDocument;for(e=0;e<d.length;++e)(b=a.getElementById(d[e]))&&c.push(b);return new NodeSetValue(c)},"local-name":function(){alert("not implmented yet: XPath function local-name()")},"namespace-uri":function(){alert("not implmented yet: XPath function namespace-uri()")},name:function(a){assert(1==this.args.length||0==this.args.length);a=0==this.args.length?[a.node]:this.args[0].evaluate(a).nodeSetValue();return 0==a.length?new StringValue(""): new StringValue(a[0].nodeName)},string:function(a){assert(1==this.args.length||0==this.args.length);return 0==this.args.length?new StringValue((new NodeSetValue([a.node])).stringValue()):new StringValue(this.args[0].evaluate(a).stringValue())},concat:function(a){for(var b="",c=0;c<this.args.length;++c)b+=this.args[c].evaluate(a).stringValue();return new StringValue(b)},"starts-with":function(a){assert(2==this.args.length);var b=this.args[0].evaluate(a).stringValue(),a=this.args[1].evaluate(a).stringValue(); return new BooleanValue(0==b.indexOf(a))},contains:function(a){assert(2==this.args.length);var b=this.args[0].evaluate(a).stringValue(),a=this.args[1].evaluate(a).stringValue();return new BooleanValue(-1!=b.indexOf(a))},"substring-before":function(a){assert(2==this.args.length);var b=this.args[0].evaluate(a).stringValue(),a=this.args[1].evaluate(a).stringValue(),a=b.indexOf(a),b=-1==a?"":b.substr(0,a);return new StringValue(b)},"substring-after":function(a){assert(2==this.args.length);var b=this.args[0].evaluate(a).stringValue(), a=this.args[1].evaluate(a).stringValue(),c=b.indexOf(a),b=-1==c?"":b.substr(c+a.length);return new StringValue(b)},substring:function(a){assert(2==this.args.length||3==this.args.length);var b=this.args[0].evaluate(a).stringValue(),c=this.args[1].evaluate(a).numberValue();if(2==this.args.length)c=Math.max(0,Math.round(c)-1),b=b.substr(c);else var a=this.args[2].evaluate(a).numberValue(),d=Math.round(c)-1,c=Math.max(0,d),a=Math.round(a)-Math.max(0,-d),b=b.substr(c,a);return new StringValue(b)},"string-length":function(a){a= 0<this.args.length?this.args[0].evaluate(a).stringValue():(new NodeSetValue([a.node])).stringValue();return new NumberValue(a.length)},"normalize-space":function(a){a=0<this.args.length?this.args[0].evaluate(a).stringValue():(new NodeSetValue([a.node])).stringValue();a=a.replace(/^\s*/,"").replace(/\s*$/,"").replace(/\s+/g," ");return new StringValue(a)},translate:function(a){assert(3==this.args.length);for(var b=this.args[0].evaluate(a).stringValue(),c=this.args[1].evaluate(a).stringValue(),a=this.args[2].evaluate(a).stringValue(), d=0;d<c.length;++d)b=b.replace(RegExp(c.charAt(d),"g"),a.charAt(d));return new StringValue(b)},"boolean":function(a){assert(1==this.args.length);return new BooleanValue(this.args[0].evaluate(a).booleanValue())},not:function(a){assert(1==this.args.length);a=!this.args[0].evaluate(a).booleanValue();return new BooleanValue(a)},"true":function(){assert(0==this.args.length);return new BooleanValue(!0)},"false":function(){assert(0==this.args.length);return new BooleanValue(!1)},lang:function(a){assert(1== this.args.length);for(var b=this.args[0].evaluate(a).stringValue(),c,a=a.node;a&&a!=a.parentNode&&!(c=a.getAttribute("xml:lang"));)a=a.parentNode;return c?(b=RegExp("^"+b+"$","i"),new BooleanValue(c.match(b)||c.replace(/_.*$/,"").match(b))):new BooleanValue(!1)},number:function(a){assert(1==this.args.length||0==this.args.length);return 1==this.args.length?new NumberValue(this.args[0].evaluate(a).numberValue()):new NumberValue((new NodeSetValue([a.node])).numberValue())},sum:function(a){assert(1== this.args.length);for(var a=this.args[0].evaluate(a).nodeSetValue(),b=0,c=0;c<a.length;++c)b+=xmlValue(a[c])-0;return new NumberValue(b)},floor:function(a){assert(1==this.args.length);a=this.args[0].evaluate(a).numberValue();return new NumberValue(Math.floor(a))},ceiling:function(a){assert(1==this.args.length);a=this.args[0].evaluate(a).numberValue();return new NumberValue(Math.ceil(a))},round:function(a){assert(1==this.args.length);a=this.args[0].evaluate(a).numberValue();return new NumberValue(Math.round(a))}, "ext-join":function(a){assert(2==this.args.length);for(var b=this.args[0].evaluate(a).nodeSetValue(),a=this.args[1].evaluate(a).stringValue(),c="",d=0;d<b.length;++d)c&&(c+=a),c+=xmlValue(b[d]);return new StringValue(c)},"ext-if":function(a){assert(3==this.args.length);return this.args[0].evaluate(a).booleanValue()?this.args[1].evaluate(a):this.args[2].evaluate(a)},"ext-sprintf":function(a){assert(1<=this.args.length);for(var b=[],c=0;c<this.args.length;++c)b.push(this.args[c].evaluate(a).stringValue()); return new StringValue(sprintf.apply(null,b))},"ext-cardinal":function(a){assert(1<=this.args.length);for(var b=this.args[0].evaluate(a).numberValue(),c=[],d=0;d<b;++d)c.push(a.node);return new NodeSetValue(c)}};function UnionExpr(a,b){this.expr1=a;this.expr2=b}UnionExpr.prototype.evaluate=function(a){for(var b=this.expr1.evaluate(a).nodeSetValue(),a=this.expr2.evaluate(a).nodeSetValue(),c=b.length,d=0;d<a.length;++d){for(var e=0;e<c;++e)b[e]==a[d]&&(e=c);b.push(a[d])}return new NodeSetValue(a)}; function PathExpr(a,b){this.filter=a;this.rel=b}PathExpr.prototype.evaluate=function(a){for(var b=this.filter.evaluate(a).nodeSetValue(),c=[],d=0;d<b.length;++d)for(var e=this.rel.evaluate(a.clone(b[d],d,b)).nodeSetValue(),f=0;f<e.length;++f)c.push(e[f]);return new NodeSetValue(c)};function FilterExpr(a,b){this.expr=a;this.predicate=b} FilterExpr.prototype.evaluate=function(a){for(var b=this.expr.evaluate(a).nodeSetValue(),c=0;c<this.predicate.length;++c)for(var d=b,b=[],e=0;e<d.length;++e){var f=d[e];this.predicate[c].evaluate(a.clone(f,e,d)).booleanValue()&&b.push(f)}return new NodeSetValue(b)};function UnaryMinusExpr(a){this.expr=a}UnaryMinusExpr.prototype.evaluate=function(a){return new NumberValue(-this.expr.evaluate(a).numberValue())};function BinaryExpr(a,b,c){this.expr1=a;this.expr2=c;this.op=b} BinaryExpr.prototype.evaluate=function(a){var b;switch(this.op.value){case "or":b=new BooleanValue(this.expr1.evaluate(a).booleanValue()||this.expr2.evaluate(a).booleanValue());break;case "and":b=new BooleanValue(this.expr1.evaluate(a).booleanValue()&&this.expr2.evaluate(a).booleanValue());break;case "+":b=new NumberValue(this.expr1.evaluate(a).numberValue()+this.expr2.evaluate(a).numberValue());break;case "-":b=new NumberValue(this.expr1.evaluate(a).numberValue()-this.expr2.evaluate(a).numberValue()); break;case "*":b=new NumberValue(this.expr1.evaluate(a).numberValue()*this.expr2.evaluate(a).numberValue());break;case "mod":b=new NumberValue(this.expr1.evaluate(a).numberValue()%this.expr2.evaluate(a).numberValue());break;case "div":b=new NumberValue(this.expr1.evaluate(a).numberValue()/this.expr2.evaluate(a).numberValue());break;case "=":b=this.compare(a,function(a,b){return a==b});break;case "!=":b=this.compare(a,function(a,b){return a!=b});break;case "<":b=this.compare(a,function(a,b){return a< b});break;case "<=":b=this.compare(a,function(a,b){return a<=b});break;case ">":b=this.compare(a,function(a,b){return a>b});break;case ">=":b=this.compare(a,function(a,b){return a>=b});break;default:alert("BinaryExpr.evaluate: "+this.op.value)}return b}; BinaryExpr.prototype.compare=function(a,b){var c=this.expr1.evaluate(a),d=this.expr2.evaluate(a);if("node-set"==c.type&&"node-set"==d.type)for(var c=c.nodeSetValue(),e=d.nodeSetValue(),d=!1,f=0;f<c.length;++f)for(var g=0;g<e.length;++g){if(b(xmlValue(c[f]),xmlValue(e[g])))d=!0,g=e.length,f=c.length}else if("node-set"==c.type||"node-set"==d.type)if("number"==c.type){c=c.numberValue();e=d.nodeSetValue();d=!1;for(f=0;f<e.length;++f)if(g=xmlValue(e[f])-0,b(c,g)){d=!0;break}}else if("number"==d.type){e= c.nodeSetValue();c=d.numberValue();d=!1;for(f=0;f<e.length;++f)if(g=xmlValue(e[f])-0,b(g,c)){d=!0;break}}else if("string"==c.type){c=c.stringValue();e=d.nodeSetValue();d=!1;for(f=0;f<e.length;++f)if(g=xmlValue(e[f]),b(c,g)){d=!0;break}}else if("string"==d.type){e=c.nodeSetValue();c=d.stringValue();d=!1;for(f=0;f<e.length;++f)if(g=xmlValue(e[f]),b(g,c)){d=!0;break}}else d=b(c.booleanValue(),d.booleanValue());else d="boolean"==c.type||"boolean"==d.type?b(c.booleanValue(),d.booleanValue()):"number"== c.type||"number"==d.type?b(c.numberValue(),d.numberValue()):b(c.stringValue(),d.stringValue());return new BooleanValue(d)};function LiteralExpr(a){this.value=a}LiteralExpr.prototype.evaluate=function(){return new StringValue(this.value)};function NumberExpr(a){this.value=a}NumberExpr.prototype.evaluate=function(){return new NumberValue(this.value)};function VariableExpr(a){this.name=a}VariableExpr.prototype.evaluate=function(a){return a.getVariable(this.name)}; function makeTokenExpr(a){return new TokenExpr(a)}function passExpr(a){return a}function makeLocationExpr1(a,b){b.absolute=!0;return b}function makeLocationExpr2(a,b){b.absolute=!0;b.prependStep(makeAbbrevStep(a.value));return b}function makeLocationExpr3(){var a=new LocationExpr;a.appendStep(makeAbbrevStep("."));a.absolute=!0;return a}function makeLocationExpr4(a){var b=new LocationExpr;b.absolute=!0;b.appendStep(makeAbbrevStep(a.value));return b} function makeLocationExpr5(a){var b=new LocationExpr;b.appendStep(a);return b}function makeLocationExpr6(a,b,c){a.appendStep(c);return a}function makeLocationExpr7(a,b){a.appendStep(makeAbbrevStep(b.value));return a}function makeStepExpr1(a){return makeAbbrevStep(a.value)}function makeStepExpr2(a){return makeAbbrevStep(a.value)}function makeStepExpr3(a,b,c){return new StepExpr(a.value,c)}function makeStepExpr4(a,b){return new StepExpr("attribute",b)} function makeStepExpr5(a){return new StepExpr("child",a)}function makeStepExpr6(a,b){a.appendPredicate(b);return a}function makeAbbrevStep(a){switch(a){case "//":return new StepExpr("descendant-or-self",new NodeTestAny);case ".":return new StepExpr("self",new NodeTestAny);case "..":return new StepExpr("parent",new NodeTestAny)}}function makeNodeTestExpr1(){return new NodeTestElement}function makeNodeTestExpr2(a){return new NodeTestNC(a.value)} function makeNodeTestExpr3(a){return new NodeTestName(a.value)}function makeNodeTestExpr4(a){switch(a.value.replace(/\s*\($/,"")){case "node":return new NodeTestAny;case "text":return new NodeTestText;case "comment":return new NodeTestComment;case "processing-instruction":return new NodeTestPI}}function makeNodeTestExpr5(a,b){var c=a.replace(/\s*\($/,"");if("processing-instruction"!=c)throw c+" "+Error().stack;return new NodeTestPI(b.value)} function makePredicateExpr(a,b){return new PredicateExpr(b)}function makePrimaryExpr(a,b){return b}function makeFunctionCallExpr1(a){return new FunctionCallExpr(a)}function makeFunctionCallExpr2(a,b,c,d){a=new FunctionCallExpr(a);a.appendArg(c);for(c=0;c<d.length;++c)a.appendArg(d[c]);return a}function makeArgumentExpr(a,b){return b}function makeUnionExpr(a,b,c){return new UnionExpr(a,c)}function makePathExpr1(a,b,c){return new PathExpr(a,c)} function makePathExpr2(a,b,c){c.prependStep(makeAbbrevStep(b.value));return new PathExpr(a,c)}function makeFilterExpr(a,b){return 0<b.length?new FilterExpr(a,b):a}function makeUnaryMinusExpr(a,b){return new UnaryMinusExpr(b)}function makeBinaryExpr(a,b,c){return new BinaryExpr(a,b,c)}function makeLiteralExpr(a){a=a.value.substring(1,a.value.length-1);return new LiteralExpr(a)}function makeNumberExpr(a){return new NumberExpr(a.value)} function makeVariableReference(a,b){return new VariableExpr(b.value)}function makeSimpleExpr(a){if("$"==a.charAt(0))return new VariableExpr(a.substr(1));if("@"==a.charAt(0)){var a=new NodeTestName(a.substr(1)),a=new StepExpr("attribute",a),b=new LocationExpr;b.appendStep(a);return b}if(a.match(/^[0-9]+$/))return new NumberExpr(a);a=new NodeTestName(a);a=new StepExpr("child",a);b=new LocationExpr;b.appendStep(a);return b} function makeSimpleExpr2(a){for(var a=a.split("/"),b=new LocationExpr,c=0;c<a.length;c++){var d=new NodeTestName(a[c]),d=new StepExpr("child",d);b.appendStep(d)}return b} var xpathAxis={ANCESTOR_OR_SELF:"ancestor-or-self",ANCESTOR:"ancestor",ATTRIBUTE:"attribute",CHILD:"child",DESCENDANT_OR_SELF:"descendant-or-self",DESCENDANT:"descendant",FOLLOWING_SIBLING:"following-sibling",FOLLOWING:"following",NAMESPACE:"namespace",PARENT:"parent",PRECEDING_SIBLING:"preceding-sibling",PRECEDING:"preceding",SELF:"self"},xpathAxesRe=[xpathAxis.ANCESTOR_OR_SELF,xpathAxis.ANCESTOR,xpathAxis.ATTRIBUTE,xpathAxis.CHILD,xpathAxis.DESCENDANT_OR_SELF,xpathAxis.DESCENDANT,xpathAxis.FOLLOWING_SIBLING, xpathAxis.FOLLOWING,xpathAxis.NAMESPACE,xpathAxis.PARENT,xpathAxis.PRECEDING_SIBLING,xpathAxis.PRECEDING,xpathAxis.SELF].join("|"),TOK_PIPE={label:"|",prec:17,re:/^\|/},TOK_DSLASH={label:"//",prec:19,re:/^\/\//},TOK_SLASH={label:"/",prec:30,re:/^\//},TOK_AXIS={label:"::",prec:20,re:/^::/},TOK_COLON={label:":",prec:1E3,re:/^:/},TOK_AXISNAME={label:"[axis]",re:RegExp("^("+xpathAxesRe+")")},TOK_PARENO={label:"(",prec:34,re:/^\(/},TOK_PARENC={label:")",re:/^\)/},TOK_DDOT={label:"..",prec:34,re:/^\.\./}, TOK_DOT={label:".",prec:34,re:/^\./},TOK_AT={label:"@",prec:34,re:/^@/},TOK_COMMA={label:",",re:/^,/},TOK_OR={label:"or",prec:10,re:/^or\b/},TOK_AND={label:"and",prec:11,re:/^and\b/},TOK_EQ={label:"=",prec:12,re:/^=/},TOK_NEQ={label:"!=",prec:12,re:/^!=/},TOK_GE={label:">=",prec:13,re:/^>=/},TOK_GT={label:">",prec:13,re:/^>/},TOK_LE={label:"<=",prec:13,re:/^<=/},TOK_LT={label:"<",prec:13,re:/^</},TOK_PLUS={label:"+",prec:14,re:/^\+/,left:!0},TOK_MINUS={label:"-",prec:14,re:/^\-/,left:!0},TOK_DIV= {label:"div",prec:15,re:/^div\b/,left:!0},TOK_MOD={label:"mod",prec:15,re:/^mod\b/,left:!0},TOK_BRACKO={label:"[",prec:32,re:/^\[/},TOK_BRACKC={label:"]",re:/^\]/},TOK_DOLLAR={label:"$",re:/^\$/},TOK_NCNAME={label:"[ncname]",re:/^[a-z][-\w]*/i},TOK_ASTERISK={label:"*",prec:15,re:/^\*/,left:!0},TOK_LITERALQ={label:"[litq]",prec:20,re:/^'[^\']*'/},TOK_LITERALQQ={label:"[litqq]",prec:20,re:/^"[^\"]*"/},TOK_NUMBER={label:"[number]",prec:35,re:/^\d+(\.\d*)?/},TOK_QNAME={label:"[qname]",re:/^([a-z][-\w]*:)?[a-z][-\w]*/i}, TOK_NODEO={label:"[nodetest-start]",re:/^(processing-instruction|comment|text|node)\(/},xpathTokenRules=[TOK_DSLASH,TOK_SLASH,TOK_DDOT,TOK_DOT,TOK_AXIS,TOK_COLON,TOK_AXISNAME,TOK_NODEO,TOK_PARENO,TOK_PARENC,TOK_BRACKO,TOK_BRACKC,TOK_AT,TOK_COMMA,TOK_OR,TOK_AND,TOK_NEQ,TOK_EQ,TOK_GE,TOK_GT,TOK_LE,TOK_LT,TOK_PLUS,TOK_MINUS,TOK_ASTERISK,TOK_PIPE,TOK_MOD,TOK_DIV,TOK_LITERALQ,TOK_LITERALQQ,TOK_NUMBER,TOK_QNAME,TOK_NCNAME,TOK_DOLLAR],XPathLocationPath={label:"LocationPath"},XPathRelativeLocationPath={label:"RelativeLocationPath"}, XPathAbsoluteLocationPath={label:"AbsoluteLocationPath"},XPathStep={label:"Step"},XPathNodeTest={label:"NodeTest"},XPathPredicate={label:"Predicate"},XPathLiteral={label:"Literal"},XPathExpr={label:"Expr"},XPathPrimaryExpr={label:"PrimaryExpr"},XPathVariableReference={label:"Variablereference"},XPathNumber={label:"Number"},XPathFunctionCall={label:"FunctionCall"},XPathArgumentRemainder={label:"ArgumentRemainder"},XPathPathExpr={label:"PathExpr"},XPathUnionExpr={label:"UnionExpr"},XPathFilterExpr= {label:"FilterExpr"},XPathDigits={label:"Digits"},xpathNonTerminals=[XPathLocationPath,XPathRelativeLocationPath,XPathAbsoluteLocationPath,XPathStep,XPathNodeTest,XPathPredicate,XPathLiteral,XPathExpr,XPathPrimaryExpr,XPathVariableReference,XPathNumber,XPathFunctionCall,XPathArgumentRemainder,XPathPathExpr,XPathUnionExpr,XPathFilterExpr,XPathDigits],Q_01={label:"?"},Q_MM={label:"*"},Q_1M={label:"+"},ASSOC_LEFT=!0,xpathGrammarRules=[[XPathLocationPath,[XPathRelativeLocationPath],18,passExpr],[XPathLocationPath, [XPathAbsoluteLocationPath],18,passExpr],[XPathAbsoluteLocationPath,[TOK_SLASH,XPathRelativeLocationPath],18,makeLocationExpr1],[XPathAbsoluteLocationPath,[TOK_DSLASH,XPathRelativeLocationPath],18,makeLocationExpr2],[XPathAbsoluteLocationPath,[TOK_SLASH],0,makeLocationExpr3],[XPathAbsoluteLocationPath,[TOK_DSLASH],0,makeLocationExpr4],[XPathRelativeLocationPath,[XPathStep],31,makeLocationExpr5],[XPathRelativeLocationPath,[XPathRelativeLocationPath,TOK_SLASH,XPathStep],31,makeLocationExpr6],[XPathRelativeLocationPath, [XPathRelativeLocationPath,TOK_DSLASH,XPathStep],31,makeLocationExpr7],[XPathStep,[TOK_DOT],33,makeStepExpr1],[XPathStep,[TOK_DDOT],33,makeStepExpr2],[XPathStep,[TOK_AXISNAME,TOK_AXIS,XPathNodeTest],33,makeStepExpr3],[XPathStep,[TOK_AT,XPathNodeTest],33,makeStepExpr4],[XPathStep,[XPathNodeTest],33,makeStepExpr5],[XPathStep,[XPathStep,XPathPredicate],33,makeStepExpr6],[XPathNodeTest,[TOK_ASTERISK],33,makeNodeTestExpr1],[XPathNodeTest,[TOK_NCNAME,TOK_COLON,TOK_ASTERISK],33,makeNodeTestExpr2],[XPathNodeTest, [TOK_QNAME],33,makeNodeTestExpr3],[XPathNodeTest,[TOK_NODEO,TOK_PARENC],33,makeNodeTestExpr4],[XPathNodeTest,[TOK_NODEO,XPathLiteral,TOK_PARENC],33,makeNodeTestExpr5],[XPathPredicate,[TOK_BRACKO,XPathExpr,TOK_BRACKC],33,makePredicateExpr],[XPathPrimaryExpr,[XPathVariableReference],33,passExpr],[XPathPrimaryExpr,[TOK_PARENO,XPathExpr,TOK_PARENC],33,makePrimaryExpr],[XPathPrimaryExpr,[XPathLiteral],30,passExpr],[XPathPrimaryExpr,[XPathNumber],30,passExpr],[XPathPrimaryExpr,[XPathFunctionCall],30,passExpr], [XPathFunctionCall,[TOK_QNAME,TOK_PARENO,TOK_PARENC],-1,makeFunctionCallExpr1],[XPathFunctionCall,[TOK_QNAME,TOK_PARENO,XPathExpr,XPathArgumentRemainder,Q_MM,TOK_PARENC],-1,makeFunctionCallExpr2],[XPathArgumentRemainder,[TOK_COMMA,XPathExpr],-1,makeArgumentExpr],[XPathUnionExpr,[XPathPathExpr],20,passExpr],[XPathUnionExpr,[XPathUnionExpr,TOK_PIPE,XPathPathExpr],20,makeUnionExpr],[XPathPathExpr,[XPathLocationPath],20,passExpr],[XPathPathExpr,[XPathFilterExpr],19,passExpr],[XPathPathExpr,[XPathFilterExpr, TOK_SLASH,XPathRelativeLocationPath],20,makePathExpr1],[XPathPathExpr,[XPathFilterExpr,TOK_DSLASH,XPathRelativeLocationPath],20,makePathExpr2],[XPathFilterExpr,[XPathPrimaryExpr,XPathPredicate,Q_MM],20,makeFilterExpr],[XPathExpr,[XPathPrimaryExpr],16,passExpr],[XPathExpr,[XPathUnionExpr],16,passExpr],[XPathExpr,[TOK_MINUS,XPathExpr],-1,makeUnaryMinusExpr],[XPathExpr,[XPathExpr,TOK_OR,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_AND,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_EQ, XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_NEQ,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_LT,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_LE,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_GT,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_GE,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_PLUS,XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathExpr,[XPathExpr,TOK_MINUS,XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathExpr,[XPathExpr,TOK_ASTERISK, XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathExpr,[XPathExpr,TOK_DIV,XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathExpr,[XPathExpr,TOK_MOD,XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathLiteral,[TOK_LITERALQ],-1,makeLiteralExpr],[XPathLiteral,[TOK_LITERALQQ],-1,makeLiteralExpr],[XPathNumber,[TOK_NUMBER],-1,makeNumberExpr],[XPathVariableReference,[TOK_DOLLAR,TOK_QNAME],200,makeVariableReference]],xpathRules=[]; function xpathParseInit(){function a(a,b,c){a[b]||(a[b]=[]);a[b].push(c)}if(!xpathRules.length){xpathGrammarRules.sort(function(a,b){var c=a[1].length,d=b[1].length;return c<d?1:c>d?-1:0});for(var b=1,c=0;c<xpathNonTerminals.length;++c)xpathNonTerminals[c].key=b++;for(c=0;c<xpathTokenRules.length;++c)xpathTokenRules[c].key=b++;xpathdebug&&Log.write("XPath parse INIT: "+b+" rules");for(c=0;c<xpathGrammarRules.length;++c)for(var b=xpathGrammarRules[c],d=b[1],e=d.length-1;0<=e;--e)if(d[e]==Q_1M){a(xpathRules, d[e-1].key,b);break}else if(d[e]==Q_MM||d[e]==Q_01)a(xpathRules,d[e-1].key,b),--e;else{a(xpathRules,d[e].key,b);break}xpathdebug&&Log.write("XPath parse INIT: "+xpathRules.length+" rule bins");var f=0;mapExec(xpathRules,function(a){a&&(f+=a.length)});xpathdebug&&Log.write("XPath parse INIT: "+f/xpathRules.length+" average bin size")}}function xpathCollectDescendants(a,b){for(var c=b.firstChild;c;c=c.nextSibling)a.push(c),arguments.callee(a,c)} function xpathCollectDescendantsReverse(a,b){for(var c=b.lastChild;c;c=c.previousSibling)a.push(c),arguments.callee(a,c)}function xpathDomEval(a,b){return xpathParse(a).evaluate(new ExprContext(b))} function xpathSort(a,b){if(0!=b.length){for(var c=[],d=0;d<a.nodelist.length;++d){for(var e=a.nodelist[d],f={node:e,key:[]},e=a.clone(e,0,[e]),g=0;g<b.length;++g){var i=b[g],l=i.expr.evaluate(e),h;"text"==i.type?h=l.stringValue():"number"==i.type&&(h=l.numberValue());f.key.push({value:h,order:i.order})}f.key.push({value:d,order:"ascending"});c.push(f)}c.sort(xpathSortByKey);f=[];for(d=0;d<c.length;++d)f.push(c[d].node);a.nodelist=f;a.setNode(f[0],0)}} function xpathSortByKey(a,b){for(var c=0;c<a.key.length;++c){var d="descending"==a.key[c].order?-1:1;if(a.key[c].value>b.key[c].value)return 1*d;if(a.key[c].value<b.key[c].value)return-1*d}return 0}function el(a){return document.getElementById(a)}function px(a){return a+"px"}function stringSplit(a,b){var c=a.indexOf(b);if(-1==c)return[a];var d=[];for(d.push(a.substr(0,c));-1!=c;){var e=a.indexOf(b,c+1);-1!=e?d.push(a.substr(c+1,e-c-1)):d.push(a.substr(c+1));c=e}return d} function xmlValue(a){if(!a)return"";var b="";if(a.nodeType==DOM_TEXT_NODE||a.nodeType==DOM_CDATA_SECTION_NODE||a.nodeType==DOM_ATTRIBUTE_NODE)b+=a.nodeValue;else if(a.nodeType==DOM_ELEMENT_NODE||a.nodeType==DOM_DOCUMENT_NODE||a.nodeType==DOM_DOCUMENT_FRAGMENT_NODE)for(var c=0;c<a.childNodes.length;++c)b+=arguments.callee(a.childNodes[c]);return b} function xmlText(a){var b="";if(a.nodeType==DOM_TEXT_NODE)b+=xmlEscapeText(a.nodeValue);else if(a.nodeType==DOM_ELEMENT_NODE){for(var b=b+("<"+a.nodeName),c=0;c<a.attributes.length;++c){var d=a.attributes[c];d&&d.nodeName&&d.nodeValue&&(b+=" "+d.nodeName,b+='="'+xmlEscapeAttr(d.nodeValue)+'"')}if(0==a.childNodes.length)b+="/>";else{b+=">";for(c=0;c<a.childNodes.length;++c)b+=arguments.callee(a.childNodes[c]);b+="</"+a.nodeName+">"}}else if(a.nodeType==DOM_DOCUMENT_NODE||a.nodeType==DOM_DOCUMENT_FRAGMENT_NODE)for(c= 0;c<a.childNodes.length;++c)b+=arguments.callee(a.childNodes[c]);return b}function mapExec(a,b){for(var c=0;c<a.length;++c)b(a[c])}function mapExpr(a,b){for(var c=[],d=0;d<a.length;++d)c.push(b(a[d]));return c}function reverseInplace(a){for(var b=0;b<a.length/2;++b){var c=a[b],d=a.length-b-1;a[b]=a[d];a[d]=c}}function copyArray(a,b){for(var c=0;c<b.length;++c)a.push(b[c])}function assert(a){if(!a)throw"assertion failed";} var DOM_ELEMENT_NODE=1,DOM_ATTRIBUTE_NODE=2,DOM_TEXT_NODE=3,DOM_CDATA_SECTION_NODE=4,DOM_ENTITY_REFERENCE_NODE=5,DOM_ENTITY_NODE=6,DOM_PROCESSING_INSTRUCTION_NODE=7,DOM_COMMENT_NODE=8,DOM_DOCUMENT_NODE=9,DOM_DOCUMENT_TYPE_NODE=10,DOM_DOCUMENT_FRAGMENT_NODE=11,DOM_NOTATION_NODE=12,xpathdebug=!1,xsltdebug=!1;function xmlEscapeText(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function xmlEscapeAttr(a){return xmlEscapeText(a).replace(/\"/g,"&quot;")} function xmlEscapeTags(a){return a.replace(/</g,"&lt;").replace(/>/g,"&gt;")}var logging__=!0;function Log(){}Log.lines=[];Log.write=function(a){logging__&&(this.lines.push(xmlEscapeText(a)),this.show())};Log.writeXML=function(a){logging__&&(a=a.replace(/</g,"\n<"),this.lines.push(xmlEscapeText(a).replace(/\s*\n(\s|\n)*/g,"<br/>")),this.show())};Log.writeRaw=function(a){logging__&&(this.lines.push(a),this.show())};Log.clear=function(){if(logging__)this.div().innerHTML="",this.lines=[]}; Log.show=function(){var a=this.div();a.innerHTML+=this.lines.join("<br/>")+"<br/>";this.lines=[];a.scrollTop=a.scrollHeight}; Log.div=function(){var a=document.getElementById("log");if(!a)a=document.createElement("div"),a.id="log",a.style.position="absolute",a.style.right="5px",a.style.top="5px",a.style.width="250px",a.style.height="150px",a.style.overflow="auto",a.style.backgroundColor="#f0f0f0",a.style.border="1px solid gray",a.style.fontSize="10px",a.style.padding="5px",document.body.appendChild(a);return a};function Timer(){}Timer.start=function(){};Timer.end=function(){};
