From 51b627ab2966cc9f81b827d8bfc05302fc77fcb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Tue, 29 Nov 2016 19:28:07 +0100 Subject: [PATCH 01/12] Added operation: "XPath expression" --- .gitignore | 1 + Gruntfile.js | 1 + src/js/config/Categories.js | 1 + src/js/config/OperationConfig.js | 18 + src/js/lib/jquery.xpath.js | 6380 ++++++++++++++++++++++++++++++ src/js/operations/Extract.js | 65 +- 6 files changed, 6464 insertions(+), 2 deletions(-) create mode 100644 src/js/lib/jquery.xpath.js diff --git a/.gitignore b/.gitignore index 482be5c7..77d1e64a 100755 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ build/dev docs/* !docs/*.conf.json !docs/*.ico +.idea/* \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index c968f125..bd3e327b 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -123,6 +123,7 @@ module.exports = function(grunt) { "src/js/lib/vkbeautify.js", "src/js/lib/Sortable.js", "src/js/lib/bootstrap-colorpicker.js", + 'src/js/lib/jquery.xpath.js', // Custom libraries "src/js/lib/canvas_components.js", diff --git a/src/js/config/Categories.js b/src/js/config/Categories.js index 02c2b1f5..5120e5c9 100755 --- a/src/js/config/Categories.js +++ b/src/js/config/Categories.js @@ -186,6 +186,7 @@ var Categories = [ "Extract file paths", "Extract dates", "Regular expression", + "XPath expression", ] }, { diff --git a/src/js/config/OperationConfig.js b/src/js/config/OperationConfig.js index f011a0b2..dec017e0 100755 --- a/src/js/config/OperationConfig.js +++ b/src/js/config/OperationConfig.js @@ -1893,6 +1893,24 @@ var OperationConfig = { }, ] }, + "XPath expression": { + description: "Extract information from an xml document with an XPath query", + run: Extract.run_xpath, + input_type: "string", + output_type: "string", + args: [ + { + name: "XPath", + type: "string", + value: Extract.XPATH_INITIAL + }, + { + name: "Result delimiter", + type: "binary_short_string", + value: Extract.XPATH_DELIMITER + } + ] + }, "From UNIX Timestamp": { description: "Converts a UNIX timestamp to a datetime string.

e.g. 978346800 becomes Mon 1 January 2001 11:00:00 UTC", run: DateTime.run_from_unix_timestamp, diff --git a/src/js/lib/jquery.xpath.js b/src/js/lib/jquery.xpath.js new file mode 100644 index 00000000..33f42221 --- /dev/null +++ b/src/js/lib/jquery.xpath.js @@ -0,0 +1,6380 @@ +/* + * jQuery XPath plugin v0.3.1 + * https://github.com/ilinsky/jquery-xpath + * Copyright 2015, Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * Includes xpath.js - XPath 2.0 implementation in JavaScript + * https://github.com/ilinsky/xpath.js + * Copyright 2015, Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + */ +(function () { + + +var cString = window.String, + cBoolean = window.Boolean, + cNumber = window.Number, + cObject = window.Object, + cArray = window.Array, + cRegExp = window.RegExp, + cDate = window.Date, + cFunction = window.Function, + cMath = window.Math, + cError = window.Error, + cSyntaxError= window.SyntaxError, + cTypeError = window.TypeError, + fIsNaN = window.isNaN, + fIsFinite = window.isFinite, + nNaN = window.NaN, + nInfinity = window.Infinity, + fWindow_btoa = window.btoa, + fWindow_atob = window.atob, + fWindow_parseInt= window.parseInt, + fString_trim =(function() { + return cString.prototype.trim ? function(sValue) {return cString(sValue).trim();} : function(sValue) { + return cString(sValue).replace(/^\s+|\s+$/g, ''); + }; + })(), + fArray_indexOf =(function() { + return cArray.prototype.indexOf ? function(aValue, vItem) {return aValue.indexOf(vItem);} : function(aValue, vItem) { + for (var nIndex = 0, nLength = aValue.length; nIndex < nLength; nIndex++) + if (aValue[nIndex] === vItem) + return nIndex; + return -1; + }; + })(); + +var sNS_XSD = "http://www.w3.org/2001/XMLSchema", + sNS_XPF = "http://www.w3.org/2005/xpath-functions", + sNS_XNS = "http://www.w3.org/2000/xmlns/", + sNS_XML = "http://www.w3.org/XML/1998/namespace"; + + +function cException(sCode + , sMessage + ) { + + this.code = sCode; + this.message = + sMessage || + oException_messages[sCode]; +}; + +cException.prototype = new cError; + + +var oException_messages = {}; +oException_messages["XPDY0002"] = "Evaluation of an expression relies on some part of the dynamic context that has not been assigned a value."; +oException_messages["XPST0003"] = "Expression is not a valid instance of the grammar"; +oException_messages["XPTY0004"] = "Type is not appropriate for the context in which the expression occurs"; +oException_messages["XPST0008"] = "Expression refers to an element name, attribute name, schema type name, namespace prefix, or variable name that is not defined in the static context"; +oException_messages["XPST0010"] = "Axis not supported"; +oException_messages["XPST0017"] = "Expanded QName and number of arguments in a function call do not match the name and arity of a function signature"; +oException_messages["XPTY0018"] = "The result of the last step in a path expression contains both nodes and atomic values"; +oException_messages["XPTY0019"] = "The result of a step (other than the last step) in a path expression contains an atomic value."; +oException_messages["XPTY0020"] = "In an axis step, the context item is not a node."; +oException_messages["XPST0051"] = "It is a static error if a QName that is used as an AtomicType in a SequenceType is not defined in the in-scope schema types as an atomic type."; +oException_messages["XPST0081"] = "A QName used in an expression contains a namespace prefix that cannot be expanded into a namespace URI by using the statically known namespaces."; +oException_messages["FORG0001"] = "Invalid value for cast/constructor."; +oException_messages["FORG0003"] = "fn:zero-or-one called with a sequence containing more than one item."; +oException_messages["FORG0004"] = "fn:one-or-more called with a sequence containing no items."; +oException_messages["FORG0005"] = "fn:exactly-one called with a sequence containing zero or more than one item."; +oException_messages["FORG0006"] = "Invalid argument type."; +oException_messages["FODC0001"] = "No context document."; +oException_messages["FORX0001"] = "Invalid regular expression flags."; +oException_messages["FOCA0002"] = "Invalid lexical value."; +oException_messages["FOCH0002"] = "Unsupported collation."; + +oException_messages["FONS0004"] = "No namespace found for prefix."; + + +function cLexer(sValue) { + var aMatch = sValue.match(/\$?(?:(?![0-9-])(?:[\w-]+|\*):)?(?![0-9-])(?:[\w-]+|\*)|\(:|:\)|\/\/|\.\.|::|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?|"[^"]*(?:""[^"]*)*"|'[^']*(?:''[^']*)*'|<<|>>|[!<>]=|(?![0-9-])[\w-]+:\*|\s+|./g); + if (aMatch) { + var nStack = 0; + for (var nIndex = 0, nLength = aMatch.length; nIndex < nLength; nIndex++) + if (aMatch[nIndex] == '(:') + nStack++; + else + if (aMatch[nIndex] == ':)' && nStack) + nStack--; + else + if (!nStack && !/^\s/.test(aMatch[nIndex])) + this[this.length++] = aMatch[nIndex]; + if (nStack) + throw new cException("XPST0003" + , "Unclosed comment" + ); + } +}; + +cLexer.prototype.index = 0; +cLexer.prototype.length = 0; + +cLexer.prototype.reset = function() { + this.index = 0; +}; + +cLexer.prototype.peek = function(nOffset) { + return this[this.index +(nOffset || 0)] || ''; +}; + +cLexer.prototype.next = function(nOffset) { + return(this.index+= nOffset || 1) < this.length; +}; + +cLexer.prototype.back = function(nOffset) { + return(this.index-= nOffset || 1) > 0; +}; + +cLexer.prototype.eof = function() { + return this.index >= this.length; +}; + + +function cDOMAdapter() { + +}; + +cDOMAdapter.prototype.isNode = function(oNode) { + return oNode &&!!oNode.nodeType; +}; + +cDOMAdapter.prototype.getProperty = function(oNode, sName) { + return oNode[sName]; +}; + +cDOMAdapter.prototype.isSameNode = function(oNode, oNode2) { + return oNode == oNode2; +}; + +cDOMAdapter.prototype.compareDocumentPosition = function(oNode, oNode2) { + return oNode.compareDocumentPosition(oNode2); +}; + +cDOMAdapter.prototype.lookupNamespaceURI = function(oNode, sPrefix) { + return oNode.lookupNamespaceURI(sPrefix); +}; + +cDOMAdapter.prototype.getElementById = function(oNode, sId) { + return oNode.getElementById(sId); +}; + +cDOMAdapter.prototype.getElementsByTagNameNS = function(oNode, sNameSpaceURI, sLocalName) { + return oNode.getElementsByTagNameNS(sNameSpaceURI, sLocalName); +}; + + +function cDynamicContext(oStaticContext, vItem, oScope, oDOMAdapter) { + this.staticContext = oStaticContext; + this.item = vItem; + this.scope = oScope || {}; + this.stack = {}; + this.DOMAdapter = oDOMAdapter || new cDOMAdapter; + var oDate = new cDate, + nOffset = oDate.getTimezoneOffset(); + this.dateTime = new cXSDateTime(oDate.getFullYear(), oDate.getMonth() + 1, oDate.getDate(), oDate.getHours(), oDate.getMinutes(), oDate.getSeconds() + oDate.getMilliseconds() / 1000, -nOffset); + this.timezone = new cXSDayTimeDuration(0, cMath.abs(~~(nOffset / 60)), cMath.abs(nOffset % 60), 0, nOffset > 0); +}; + +cDynamicContext.prototype.item = null; +cDynamicContext.prototype.position = 0; +cDynamicContext.prototype.size = 0; +cDynamicContext.prototype.scope = null; +cDynamicContext.prototype.stack = null; cDynamicContext.prototype.dateTime = null; +cDynamicContext.prototype.timezone = null; +cDynamicContext.prototype.staticContext = null; + +cDynamicContext.prototype.pushVariable = function(sName, vValue) { + if (!this.stack.hasOwnProperty(sName)) + this.stack[sName] = []; + this.stack[sName].push(this.scope[sName]); + this.scope[sName] = vValue; +}; + +cDynamicContext.prototype.popVariable = function(sName) { + if (this.stack.hasOwnProperty(sName)) { + this.scope[sName] = this.stack[sName].pop(); + if (!this.stack[sName].length) { + delete this.stack[sName]; + if (typeof this.scope[sName] == "undefined") + delete this.scope[sName]; + } + } +}; + + +function cStaticContext() { + this.dataTypes = {}; + this.documents = {}; + this.functions = {}; + this.collations = {}; + this.collections= {}; +}; + +cStaticContext.prototype.baseURI = null; +cStaticContext.prototype.dataTypes = null; +cStaticContext.prototype.documents = null; +cStaticContext.prototype.functions = null; +cStaticContext.prototype.defaultFunctionNamespace = null; +cStaticContext.prototype.collations = null; +cStaticContext.prototype.defaultCollationName = sNS_XPF + "/collation/codepoint"; +cStaticContext.prototype.collections = null; +cStaticContext.prototype.namespaceResolver = null; +cStaticContext.prototype.defaultElementNamespace = null; + +var rStaticContext_uri = /^(?:\{([^\}]+)\})?(.+)$/; +cStaticContext.prototype.setDataType = function(sUri, fFunction) { + var aMatch = sUri.match(rStaticContext_uri); + if (aMatch) + if (aMatch[1] != sNS_XSD) + this.dataTypes[sUri] = fFunction; +}; + +cStaticContext.prototype.getDataType = function(sUri) { + var aMatch = sUri.match(rStaticContext_uri); + if (aMatch) + return aMatch[1] == sNS_XSD ? hStaticContext_dataTypes[cRegExp.$2] : this.dataTypes[sUri]; +}; + +cStaticContext.prototype.setDocument = function(sUri, fFunction) { + this.documents[sUri] = fFunction; +}; + +cStaticContext.prototype.setFunction = function(sUri, fFunction) { + var aMatch = sUri.match(rStaticContext_uri); + if (aMatch) + if (aMatch[1] != sNS_XPF) + this.functions[sUri] = fFunction; +}; + +cStaticContext.prototype.getFunction = function(sUri) { + var aMatch = sUri.match(rStaticContext_uri); + if (aMatch) + return aMatch[1] == sNS_XPF ? hStaticContext_functions[cRegExp.$2] : this.functions[sUri]; +}; + +cStaticContext.prototype.setCollation = function(sUri, fFunction) { + this.collations[sUri] = fFunction; +}; + +cStaticContext.prototype.getCollation = function(sUri) { + return this.collations[sUri]; +}; + + +cStaticContext.prototype.setCollection = function(sUri, fFunction) { + this.collections[sUri] = fFunction; +}; + +cStaticContext.prototype.getURIForPrefix = function(sPrefix) { + var oResolver = this.namespaceResolver, + fResolver = oResolver && oResolver.lookupNamespaceURI ? oResolver.lookupNamespaceURI : oResolver, + sNameSpaceURI; + if (fResolver instanceof cFunction && (sNameSpaceURI = fResolver.call(oResolver, sPrefix))) + return sNameSpaceURI; + if (sPrefix == 'fn') + return sNS_XPF; + if (sPrefix == 'xs') + return sNS_XSD; + if (sPrefix == "xml") + return sNS_XML; + if (sPrefix == "xmlns") + return sNS_XNS; + throw new cException("XPST0081" + , "Prefix '" + sPrefix + "' has not been declared" + ); +}; + +cStaticContext.js2xs = function(vItem) { + if (typeof vItem == "boolean") + vItem = new cXSBoolean(vItem); + else + if (typeof vItem == "number") + vItem =(fIsNaN(vItem) ||!fIsFinite(vItem)) ? new cXSDouble(vItem) : fNumericLiteral_parseValue(cString(vItem)); + else + vItem = new cXSString(cString(vItem)); + return vItem; +}; + +cStaticContext.xs2js = function(vItem) { + if (vItem instanceof cXSBoolean) + vItem = vItem.valueOf(); + else + if (fXSAnyAtomicType_isNumeric(vItem)) + vItem = vItem.valueOf(); + else + vItem = vItem.toString(); + return vItem; +}; + +var hStaticContext_functions = {}, + hStaticContext_signatures = {}, + hStaticContext_dataTypes = {}, + hStaticContext_operators = {}; + +function fStaticContext_defineSystemFunction(sName, aParameters, fFunction) { + hStaticContext_functions[sName] = fFunction; + hStaticContext_signatures[sName] = aParameters; +}; + +function fStaticContext_defineSystemDataType(sName, fFunction) { + hStaticContext_dataTypes[sName] = fFunction; +}; + + +function cExpression(sExpression, oStaticContext) { + var oLexer = new cLexer(sExpression), + oExpr = fExpr_parse(oLexer, oStaticContext); + if (!oLexer.eof()) + throw new cException("XPST0003" + , "Unexpected token beyond end of query" + ); + if (!oExpr) + throw new cException("XPST0003" + , "Expected expression" + ); + this.internalExpression = oExpr; +}; + +cExpression.prototype.internalExpression = null; + +cExpression.prototype.evaluate = function(oContext) { + return this.internalExpression.evaluate(oContext); +}; + + +function cStringCollator() { + +}; + +cStringCollator.prototype.equals = function(sValue1, sValue2) { + throw "Not implemented"; +}; + +cStringCollator.prototype.compare = function(sValue1, sValue2) { + throw "Not implemented"; +}; + + +function cXSConstants(){}; + +cXSConstants.ANYSIMPLETYPE_DT = 1; +cXSConstants.STRING_DT = 2; +cXSConstants.BOOLEAN_DT = 3; +cXSConstants.DECIMAL_DT = 4; +cXSConstants.FLOAT_DT = 5; +cXSConstants.DOUBLE_DT = 6; +cXSConstants.DURATION_DT = 7; +cXSConstants.DATETIME_DT = 8; +cXSConstants.TIME_DT = 9; +cXSConstants.DATE_DT = 10; +cXSConstants.GYEARMONTH_DT = 11; +cXSConstants.GYEAR_DT = 12; +cXSConstants.GMONTHDAY_DT = 13; +cXSConstants.GDAY_DT = 14; +cXSConstants.GMONTH_DT = 15; +cXSConstants.HEXBINARY_DT = 16; +cXSConstants.BASE64BINARY_DT = 17; +cXSConstants.ANYURI_DT = 18; +cXSConstants.QNAME_DT = 19; +cXSConstants.NOTATION_DT = 20; +cXSConstants.NORMALIZEDSTRING_DT = 21; +cXSConstants.TOKEN_DT = 22; +cXSConstants.LANGUAGE_DT = 23; +cXSConstants.NMTOKEN_DT = 24; +cXSConstants.NAME_DT = 25; +cXSConstants.NCNAME_DT = 26; +cXSConstants.ID_DT = 27; +cXSConstants.IDREF_DT = 28; +cXSConstants.ENTITY_DT = 29; +cXSConstants.INTEGER_DT = 30; +cXSConstants.NONPOSITIVEINTEGER_DT = 31; +cXSConstants.NEGATIVEINTEGER_DT = 32; +cXSConstants.LONG_DT = 33; +cXSConstants.INT_DT = 34; +cXSConstants.SHORT_DT = 35; +cXSConstants.BYTE_DT = 36; +cXSConstants.NONNEGATIVEINTEGER_DT = 37; +cXSConstants.UNSIGNEDLONG_DT = 38; +cXSConstants.UNSIGNEDINT_DT = 39; +cXSConstants.UNSIGNEDSHORT_DT = 40; +cXSConstants.UNSIGNEDBYTE_DT = 41; +cXSConstants.POSITIVEINTEGER_DT = 42; +cXSConstants.LISTOFUNION_DT = 43; +cXSConstants.LIST_DT = 44; +cXSConstants.UNAVAILABLE_DT = 45; + +cXSConstants.DATETIMESTAMP_DT = 46; +cXSConstants.DAYMONTHDURATION_DT = 47; +cXSConstants.DAYTIMEDURATION_DT = 48; +cXSConstants.PRECISIONDECIMAL_DT = 49; +cXSConstants.ANYATOMICTYPE_DT = 50; +cXSConstants.ANYTYPE_DT = 51; + +cXSConstants.XT_YEARMONTHDURATION_DT=-1; +cXSConstants.XT_UNTYPEDATOMIC_DT =-2; + + +function cExpr() { + this.items = []; +}; + +cExpr.prototype.items = null; + +function fExpr_parse (oLexer, oStaticContext) { + var oItem; + if (oLexer.eof() ||!(oItem = fExprSingle_parse(oLexer, oStaticContext))) + return; + + var oExpr = new cExpr; + oExpr.items.push(oItem); + while (oLexer.peek() == ',') { + oLexer.next(); + if (oLexer.eof() ||!(oItem = fExprSingle_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected expression" + ); + oExpr.items.push(oItem); + } + return oExpr; +}; + +cExpr.prototype.evaluate = function(oContext) { + var oSequence = []; + for (var nIndex = 0, nLength = this.items.length; nIndex < nLength; nIndex++) + oSequence = hStaticContext_operators["concatenate"].call(oContext, oSequence, this.items[nIndex].evaluate(oContext)); + return oSequence; +}; + + +function cExprSingle() { + +}; + +function fExprSingle_parse (oLexer, oStaticContext) { + if (!oLexer.eof()) + return fIfExpr_parse(oLexer, oStaticContext) + || fForExpr_parse(oLexer, oStaticContext) + || fQuantifiedExpr_parse(oLexer, oStaticContext) + || fOrExpr_parse(oLexer, oStaticContext); +}; + + +function cForExpr() { + this.bindings = []; + this.returnExpr = null; +}; + +cForExpr.prototype.bindings = null; +cForExpr.prototype.returnExpr = null; + +function fForExpr_parse (oLexer, oStaticContext) { + if (oLexer.peek() == "for" && oLexer.peek(1).substr(0, 1) == '$') { + oLexer.next(); + + var oForExpr = new cForExpr, + oExpr; + do { + oForExpr.bindings.push(fSimpleForBinding_parse(oLexer, oStaticContext)); + } + while (oLexer.peek() == ',' && oLexer.next()); + + if (oLexer.peek() != "return") + throw new cException("XPST0003" + , "Expected 'return' token in for expression" + ); + + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected return statement operand in for expression" + ); + + oForExpr.returnExpr = oExpr; + return oForExpr; + } +}; + +cForExpr.prototype.evaluate = function (oContext) { + var oSequence = []; + (function(oSelf, nBinding) { + var oBinding = oSelf.bindings[nBinding++], + oSequence1 = oBinding.inExpr.evaluate(oContext), + sUri = (oBinding.namespaceURI ? '{' + oBinding.namespaceURI + '}' : '') + oBinding.localName; + for (var nIndex = 0, nLength = oSequence1.length; nIndex < nLength; nIndex++) { + oContext.pushVariable(sUri, oSequence1[nIndex]); + if (nBinding < oSelf.bindings.length) + arguments.callee(oSelf, nBinding); + else + oSequence = oSequence.concat(oSelf.returnExpr.evaluate(oContext)); + oContext.popVariable(sUri); + } + })(this, 0); + + return oSequence; +}; + +function cSimpleForBinding(sPrefix, sLocalName, sNameSpaceURI, oInExpr) { + this.prefix = sPrefix; + this.localName = sLocalName; + this.namespaceURI = sNameSpaceURI; + this.inExpr = oInExpr; +}; + +cSimpleForBinding.prototype.prefix = null; +cSimpleForBinding.prototype.localName = null; +cSimpleForBinding.prototype.namespaceURI = null; +cSimpleForBinding.prototype.inExpr = null; + +function fSimpleForBinding_parse (oLexer, oStaticContext) { + var aMatch = oLexer.peek().substr(1).match(rNameTest); + if (!aMatch) + throw new cException("XPST0003" + , "Expected binding in for expression" + ); + + if (aMatch[1] == '*' || aMatch[2] == '*') + throw new cException("XPST0003" + , "Illegal use of wildcard in for expression binding variable name" + ); + + oLexer.next(); + if (oLexer.peek() != "in") + throw new cException("XPST0003" + , "Expected 'in' token in for expression binding" + ); + + oLexer.next(); + var oExpr; + if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected in statement operand in for expression binding" + ); + + return new cSimpleForBinding(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) : null, oExpr); +}; + + +function cIfExpr(oCondExpr, oThenExpr, oElseExpr) { + this.condExpr = oCondExpr; + this.thenExpr = oThenExpr; + this.elseExpr = oElseExpr; +}; + +cIfExpr.prototype.condExpr = null; +cIfExpr.prototype.thenExpr = null; +cIfExpr.prototype.elseExpr = null; + +function fIfExpr_parse (oLexer, oStaticContext) { + var oCondExpr, + oThenExpr, + oElseExpr; + if (oLexer.peek() == "if" && oLexer.peek(1) == '(') { + oLexer.next(2); + if (oLexer.eof() ||!(oCondExpr = fExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected if statement operand in conditional expression" + ); + if (oLexer.peek() != ')') + throw new cException("XPST0003" + , "Expected ')' token in for expression" + ); + + oLexer.next(); + if (oLexer.peek() != "then") + throw new cException("XPST0003" + , "Expected 'then' token in conditional if expression" + ); + + oLexer.next(); + if (oLexer.eof() ||!(oThenExpr = fExprSingle_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected then statement operand in condional expression" + ); + + if (oLexer.peek() != "else") + throw new cException("XPST0003" + , "Expected 'else' token in conditional if expression" + ); + + oLexer.next(); + if (oLexer.eof() ||!(oElseExpr = fExprSingle_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected else statement operand in condional expression" + ); + return new cIfExpr(oCondExpr, oThenExpr, oElseExpr); + } +}; + +cIfExpr.prototype.evaluate = function (oContext) { + return this[fFunction_sequence_toEBV(this.condExpr.evaluate(oContext), oContext) ? "thenExpr" : "elseExpr"].evaluate(oContext); +}; + + +function cQuantifiedExpr(sQuantifier) { + this.quantifier = sQuantifier; + this.bindings = []; + this.satisfiesExpr = null; +}; + +cQuantifiedExpr.prototype.bindings = null; +cQuantifiedExpr.prototype.quantifier = null; +cQuantifiedExpr.prototype.satisfiesExpr = null; + +function fQuantifiedExpr_parse (oLexer, oStaticContext) { + var sQuantifier = oLexer.peek(); + if ((sQuantifier == "some" || sQuantifier == "every") && oLexer.peek(1).substr(0, 1) == '$') { + oLexer.next(); + + var oQuantifiedExpr = new cQuantifiedExpr(sQuantifier), + oExpr; + do { + oQuantifiedExpr.bindings.push(fSimpleQuantifiedBinding_parse(oLexer, oStaticContext)); + } + while (oLexer.peek() == ',' && oLexer.next()); + + if (oLexer.peek() != "satisfies") + throw new cException("XPST0003" + , "Expected 'satisfies' token in quantified expression" + ); + + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected satisfies statement operand in quantified expression" + ); + + oQuantifiedExpr.satisfiesExpr = oExpr; + return oQuantifiedExpr; + } +}; + +cQuantifiedExpr.prototype.evaluate = function (oContext) { + var bEvery = this.quantifier == "every", + bResult = bEvery ? true : false; + (function(oSelf, nBinding) { + var oBinding = oSelf.bindings[nBinding++], + oSequence1 = oBinding.inExpr.evaluate(oContext), + sUri = (oBinding.namespaceURI ? '{' + oBinding.namespaceURI + '}' : '') + oBinding.localName; + for (var nIndex = 0, nLength = oSequence1.length; (nIndex < nLength) && (bEvery ? bResult :!bResult); nIndex++) { + oContext.pushVariable(sUri, oSequence1[nIndex]); + if (nBinding < oSelf.bindings.length) + arguments.callee(oSelf, nBinding); + else + bResult = fFunction_sequence_toEBV(oSelf.satisfiesExpr.evaluate(oContext), oContext); + oContext.popVariable(sUri); + } + })(this, 0); + + return [new cXSBoolean(bResult)]; +}; + + + +function cSimpleQuantifiedBinding(sPrefix, sLocalName, sNameSpaceURI, oInExpr) { + this.prefix = sPrefix; + this.localName = sLocalName; + this.namespaceURI = sNameSpaceURI; + this.inExpr = oInExpr; +}; + +cSimpleQuantifiedBinding.prototype.prefix = null; +cSimpleQuantifiedBinding.prototype.localName = null; +cSimpleQuantifiedBinding.prototype.namespaceURI = null; +cSimpleQuantifiedBinding.prototype.inExpr = null; + +function fSimpleQuantifiedBinding_parse (oLexer, oStaticContext) { + var aMatch = oLexer.peek().substr(1).match(rNameTest); + if (!aMatch) + throw new cException("XPST0003" + , "Expected binding in quantified expression" + ); + + if (aMatch[1] == '*' || aMatch[2] == '*') + throw new cException("XPST0003" + , "Illegal use of wildcard in quantified expression binding variable name" + ); + + oLexer.next(); + if (oLexer.peek() != "in") + throw new cException("XPST0003" + , "Expected 'in' token in quantified expression binding" + ); + + oLexer.next(); + var oExpr; + if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected in statement operand in quantified expression binding" + ); + + return new cSimpleQuantifiedBinding(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) : null, oExpr); +}; + + +function cComparisonExpr(oLeft, oRight, sOperator) { + this.left = oLeft; + this.right = oRight; + this.operator = sOperator; +}; + +cComparisonExpr.prototype.left = null; +cComparisonExpr.prototype.right = null; +cComparisonExpr.prototype.operator = null; + +function fComparisonExpr_parse (oLexer, oStaticContext) { + var oExpr, + oRight; + if (oLexer.eof() ||!(oExpr = fRangeExpr_parse(oLexer, oStaticContext))) + return; + if (!(oLexer.peek() in hComparisonExpr_operators)) + return oExpr; + + var sOperator = oLexer.peek(); + oLexer.next(); + if (oLexer.eof() ||!(oRight = fRangeExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in comparison expression" + ); + return new cComparisonExpr(oExpr, oRight, sOperator); +}; + +cComparisonExpr.prototype.evaluate = function (oContext) { + var oResult = hComparisonExpr_operators[this.operator](this, oContext); + return oResult == null ? [] : [oResult]; +}; + +function fComparisonExpr_GeneralComp(oExpr, oContext) { + var oLeft = fFunction_sequence_atomize(oExpr.left.evaluate(oContext), oContext); + if (!oLeft.length) + return new cXSBoolean(false); + + var oRight = fFunction_sequence_atomize(oExpr.right.evaluate(oContext), oContext); + if (!oRight.length) + return new cXSBoolean(false); + + var bResult = false; + for (var nLeftIndex = 0, nLeftLength = oLeft.length, bLeft, vLeft; (nLeftIndex < nLeftLength) &&!bResult; nLeftIndex++) { + for (var nRightIndex = 0, nRightLength = oRight.length, bRight, vRight; (nRightIndex < nRightLength) &&!bResult; nRightIndex++) { + + vLeft = oLeft[nLeftIndex]; + vRight = oRight[nRightIndex]; + + bLeft = vLeft instanceof cXSUntypedAtomic; + bRight = vRight instanceof cXSUntypedAtomic; + + if (bLeft && bRight) { + vLeft = cXSString.cast(vLeft); + vRight = cXSString.cast(vRight); + } + else { + if (bLeft) { + if (vRight instanceof cXSDayTimeDuration) + vLeft = cXSDayTimeDuration.cast(vLeft); + else + if (vRight instanceof cXSYearMonthDuration) + vLeft = cXSYearMonthDuration.cast(vLeft); + else + if (vRight.primitiveKind) + vLeft = hStaticContext_dataTypes[vRight.primitiveKind].cast(vLeft); + } + else + if (bRight) { + if (vLeft instanceof cXSDayTimeDuration) + vRight = cXSDayTimeDuration.cast(vRight); + else + if (vLeft instanceof cXSYearMonthDuration) + vRight = cXSYearMonthDuration.cast(vRight); + else + if (vLeft.primitiveKind) + vRight = hStaticContext_dataTypes[vLeft.primitiveKind].cast(vRight); + } + + if (vLeft instanceof cXSAnyURI) + vLeft = cXSString.cast(vLeft); + if (vRight instanceof cXSAnyURI) + vRight = cXSString.cast(vRight); + } + + bResult = hComparisonExpr_ValueComp_operators[hComparisonExpr_GeneralComp_map[oExpr.operator]](vLeft, vRight, oContext).valueOf(); + } + } + return new cXSBoolean(bResult); +}; + +var hComparisonExpr_GeneralComp_map = { + '=': 'eq', + '!=': 'ne', + '>': 'gt', + '<': 'lt', + '>=': 'ge', + '<=': 'le' +}; + +function fComparisonExpr_ValueComp(oExpr, oContext) { + var oLeft = fFunction_sequence_atomize(oExpr.left.evaluate(oContext), oContext); + if (!oLeft.length) + return null; + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' + , "first operand of '" + oExpr.operator + "'" + ); + + var oRight = fFunction_sequence_atomize(oExpr.right.evaluate(oContext), oContext); + if (!oRight.length) + return null; + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + , "second operand of '" + oExpr.operator + "'" + ); + + var vLeft = oLeft[0], + vRight = oRight[0]; + + if (vLeft instanceof cXSUntypedAtomic) + vLeft = cXSString.cast(vLeft); + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSString.cast(vRight); + + if (vLeft instanceof cXSAnyURI) + vLeft = cXSString.cast(vLeft); + if (vRight instanceof cXSAnyURI) + vRight = cXSString.cast(vRight); + + return hComparisonExpr_ValueComp_operators[oExpr.operator](vLeft, vRight, oContext); +}; + +var hComparisonExpr_ValueComp_operators = {}; +hComparisonExpr_ValueComp_operators['eq'] = function(oLeft, oRight, oContext) { + var sOperator = ''; + + if (fXSAnyAtomicType_isNumeric(oLeft)) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "numeric-equal"; + } + else + if (oLeft instanceof cXSBoolean) { + if (oRight instanceof cXSBoolean) + sOperator = "boolean-equal"; + } + else + if (oLeft instanceof cXSString) { + if (oRight instanceof cXSString) + return hStaticContext_operators["numeric-equal"].call(oContext, hStaticContext_functions["compare"].call(oContext, oLeft, oRight), new cXSInteger(0)); + } + else + if (oLeft instanceof cXSDate) { + if (oRight instanceof cXSDate) + sOperator = "date-equal"; + } + else + if (oLeft instanceof cXSTime) { + if (oRight instanceof cXSTime) + sOperator = "time-equal"; + } + else + if (oLeft instanceof cXSDateTime) { + if (oRight instanceof cXSDateTime) + sOperator = "dateTime-equal"; + } + else + if (oLeft instanceof cXSDuration) { + if (oRight instanceof cXSDuration) + sOperator = "duration-equal"; + } + else + if (oLeft instanceof cXSGYearMonth) { + if (oRight instanceof cXSGYearMonth) + sOperator = "gYearMonth-equal"; + } + else + if (oLeft instanceof cXSGYear) { + if (oRight instanceof cXSGYear) + sOperator = "gYear-equal"; + } + else + if (oLeft instanceof cXSGMonthDay) { + if (oRight instanceof cXSGMonthDay) + sOperator = "gMonthDay-equal"; + } + else + if (oLeft instanceof cXSGMonth) { + if (oRight instanceof cXSGMonth) + sOperator = "gMonth-equal"; + } + else + if (oLeft instanceof cXSGDay) { + if (oRight instanceof cXSGDay) + sOperator = "gDay-equal"; + } + else + if (oLeft instanceof cXSQName) { + if (oRight instanceof cXSQName) + sOperator = "QName-equal"; + } + else + if (oLeft instanceof cXSHexBinary) { + if (oRight instanceof cXSHexBinary) + sOperator = "hexBinary-equal"; + } + else + if (oLeft instanceof cXSBase64Binary) { + if (oRight instanceof cXSBase64Binary) + sOperator = "base64Binary-equal"; + } + + if (sOperator) + return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); + + throw new cException("XPTY0004" + , "Cannot compare values of given types" + ); }; +hComparisonExpr_ValueComp_operators['ne'] = function(oLeft, oRight, oContext) { + return new cXSBoolean(!hComparisonExpr_ValueComp_operators['eq'](oLeft, oRight, oContext).valueOf()); +}; +hComparisonExpr_ValueComp_operators['gt'] = function(oLeft, oRight, oContext) { + var sOperator = ''; + + if (fXSAnyAtomicType_isNumeric(oLeft)) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "numeric-greater-than"; + } + else + if (oLeft instanceof cXSBoolean) { + if (oRight instanceof cXSBoolean) + sOperator = "boolean-greater-than"; + } + else + if (oLeft instanceof cXSString) { + if (oRight instanceof cXSString) + return hStaticContext_operators["numeric-greater-than"].call(oContext, hStaticContext_functions["compare"].call(oContext, oLeft, oRight), new cXSInteger(0)); + } + else + if (oLeft instanceof cXSDate) { + if (oRight instanceof cXSDate) + sOperator = "date-greater-than"; + } + else + if (oLeft instanceof cXSTime) { + if (oRight instanceof cXSTime) + sOperator = "time-greater-than"; + } + else + if (oLeft instanceof cXSDateTime) { + if (oRight instanceof cXSDateTime) + sOperator = "dateTime-greater-than"; + } + else + if (oLeft instanceof cXSYearMonthDuration) { + if (oRight instanceof cXSYearMonthDuration) + sOperator = "yearMonthDuration-greater-than"; + } + else + if (oLeft instanceof cXSDayTimeDuration) { + if (oRight instanceof cXSDayTimeDuration) + sOperator = "dayTimeDuration-greater-than"; + } + + if (sOperator) + return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); + + throw new cException("XPTY0004" + , "Cannot compare values of given types" + ); }; +hComparisonExpr_ValueComp_operators['lt'] = function(oLeft, oRight, oContext) { + var sOperator = ''; + + if (fXSAnyAtomicType_isNumeric(oLeft)) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "numeric-less-than"; + } + else + if (oLeft instanceof cXSBoolean) { + if (oRight instanceof cXSBoolean) + sOperator = "boolean-less-than"; + } + else + if (oLeft instanceof cXSString) { + if (oRight instanceof cXSString) + return hStaticContext_operators["numeric-less-than"].call(oContext, hStaticContext_functions["compare"].call(oContext, oLeft, oRight), new cXSInteger(0)); + } + else + if (oLeft instanceof cXSDate) { + if (oRight instanceof cXSDate) + sOperator = "date-less-than"; + } + else + if (oLeft instanceof cXSTime) { + if (oRight instanceof cXSTime) + sOperator = "time-less-than"; + } + else + if (oLeft instanceof cXSDateTime) { + if (oRight instanceof cXSDateTime) + sOperator = "dateTime-less-than"; + } + else + if (oLeft instanceof cXSYearMonthDuration) { + if (oRight instanceof cXSYearMonthDuration) + sOperator = "yearMonthDuration-less-than"; + } + else + if (oLeft instanceof cXSDayTimeDuration) { + if (oRight instanceof cXSDayTimeDuration) + sOperator = "dayTimeDuration-less-than"; + } + + if (sOperator) + return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); + + throw new cException("XPTY0004" + , "Cannot compare values of given types" + ); }; +hComparisonExpr_ValueComp_operators['ge'] = function(oLeft, oRight, oContext) { + var sOperator = ''; + + if (fXSAnyAtomicType_isNumeric(oLeft)) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "numeric-less-than"; + } + else + if (oLeft instanceof cXSBoolean) { + if (oRight instanceof cXSBoolean) + sOperator = "boolean-less-than"; + } + else + if (oLeft instanceof cXSString) { + if (oRight instanceof cXSString) + return hStaticContext_operators["numeric-greater-than"].call(oContext, hStaticContext_functions["compare"].call(oContext, oLeft, oRight), new cXSInteger(-1)); + } + else + if (oLeft instanceof cXSDate) { + if (oRight instanceof cXSDate) + sOperator = "date-less-than"; + } + else + if (oLeft instanceof cXSTime) { + if (oRight instanceof cXSTime) + sOperator = "time-less-than"; + } + else + if (oLeft instanceof cXSDateTime) { + if (oRight instanceof cXSDateTime) + sOperator = "dateTime-less-than"; + } + else + if (oLeft instanceof cXSYearMonthDuration) { + if (oRight instanceof cXSYearMonthDuration) + sOperator = "yearMonthDuration-less-than"; + } + else + if (oLeft instanceof cXSDayTimeDuration) { + if (oRight instanceof cXSDayTimeDuration) + sOperator = "dayTimeDuration-less-than"; + } + + if (sOperator) + return new cXSBoolean(!hStaticContext_operators[sOperator].call(oContext, oLeft, oRight).valueOf()); + + throw new cException("XPTY0004" + , "Cannot compare values of given types" + ); }; +hComparisonExpr_ValueComp_operators['le'] = function(oLeft, oRight, oContext) { + var sOperator = ''; + + if (fXSAnyAtomicType_isNumeric(oLeft)) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "numeric-greater-than"; + } + else + if (oLeft instanceof cXSBoolean) { + if (oRight instanceof cXSBoolean) + sOperator = "boolean-greater-than"; + } + else + if (oLeft instanceof cXSString) { + if (oRight instanceof cXSString) + return hStaticContext_operators["numeric-less-than"].call(oContext, hStaticContext_functions["compare"].call(oContext, oLeft, oRight), new cXSInteger(1)); + } + else + if (oLeft instanceof cXSDate) { + if (oRight instanceof cXSDate) + sOperator = "date-greater-than"; + } + else + if (oLeft instanceof cXSTime) { + if (oRight instanceof cXSTime) + sOperator = "time-greater-than"; + } + else + if (oLeft instanceof cXSDateTime) { + if (oRight instanceof cXSDateTime) + sOperator = "dateTime-greater-than"; + } + else + if (oLeft instanceof cXSYearMonthDuration) { + if (oRight instanceof cXSYearMonthDuration) + sOperator = "yearMonthDuration-greater-than"; + } + else + if (oLeft instanceof cXSDayTimeDuration) { + if (oRight instanceof cXSDayTimeDuration) + sOperator = "dayTimeDuration-greater-than"; + } + + if (sOperator) + return new cXSBoolean(!hStaticContext_operators[sOperator].call(oContext, oLeft, oRight).valueOf()); + + throw new cException("XPTY0004" + , "Cannot compare values of given types" + ); }; + +function fComparisonExpr_NodeComp(oExpr, oContext) { + var oLeft = oExpr.left.evaluate(oContext); + if (!oLeft.length) + return null; + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' + , "first operand of '" + oExpr.operator + "'" + ); + fFunctionCall_assertSequenceItemType(oContext, oLeft, cXTNode + , "first operand of '" + oExpr.operator + "'" + ); + + var oRight = oExpr.right.evaluate(oContext); + if (!oRight.length) + return null; + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + , "second operand of '" + oExpr.operator + "'" + ); + fFunctionCall_assertSequenceItemType(oContext, oRight, cXTNode + , "second operand of '" + oExpr.operator + "'" + ); + + return hComparisonExpr_NodeComp_operators[oExpr.operator](oLeft[0], oRight[0], oContext); +}; + +var hComparisonExpr_NodeComp_operators = {}; +hComparisonExpr_NodeComp_operators['is'] = function(oLeft, oRight, oContext) { + return hStaticContext_operators["is-same-node"].call(oContext, oLeft, oRight); +}; +hComparisonExpr_NodeComp_operators['>>'] = function(oLeft, oRight, oContext) { + return hStaticContext_operators["node-after"].call(oContext, oLeft, oRight); +}; +hComparisonExpr_NodeComp_operators['<<'] = function(oLeft, oRight, oContext) { + return hStaticContext_operators["node-before"].call(oContext, oLeft, oRight); +}; + +var hComparisonExpr_operators = { + '=': fComparisonExpr_GeneralComp, + '!=': fComparisonExpr_GeneralComp, + '<': fComparisonExpr_GeneralComp, + '<=': fComparisonExpr_GeneralComp, + '>': fComparisonExpr_GeneralComp, + '>=': fComparisonExpr_GeneralComp, + 'eq': fComparisonExpr_ValueComp, + 'ne': fComparisonExpr_ValueComp, + 'lt': fComparisonExpr_ValueComp, + 'le': fComparisonExpr_ValueComp, + 'gt': fComparisonExpr_ValueComp, + 'ge': fComparisonExpr_ValueComp, + 'is': fComparisonExpr_NodeComp, + '>>': fComparisonExpr_NodeComp, + '<<': fComparisonExpr_NodeComp +}; + + +function cAdditiveExpr(oExpr) { + this.left = oExpr; + this.items = []; +}; + +cAdditiveExpr.prototype.left = null; +cAdditiveExpr.prototype.items = null; + +var hAdditiveExpr_operators = {}; +hAdditiveExpr_operators['+'] = function(oLeft, oRight, oContext) { + var sOperator = '', + bReverse = false; + + if (fXSAnyAtomicType_isNumeric(oLeft)) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "numeric-add"; + } + else + if (oLeft instanceof cXSDate) { + if (oRight instanceof cXSYearMonthDuration) + sOperator = "add-yearMonthDuration-to-date"; + else + if (oRight instanceof cXSDayTimeDuration) + sOperator = "add-dayTimeDuration-to-date"; + } + else + if (oLeft instanceof cXSYearMonthDuration) { + if (oRight instanceof cXSDate) { + sOperator = "add-yearMonthDuration-to-date"; + bReverse = true; + } + else + if (oRight instanceof cXSDateTime) { + sOperator = "add-yearMonthDuration-to-dateTime"; + bReverse = true; + } + else + if (oRight instanceof cXSYearMonthDuration) + sOperator = "add-yearMonthDurations"; + } + else + if (oLeft instanceof cXSDayTimeDuration) { + if (oRight instanceof cXSDate) { + sOperator = "add-dayTimeDuration-to-date"; + bReverse = true; + } + else + if (oRight instanceof cXSTime) { + sOperator = "add-dayTimeDuration-to-time"; + bReverse = true; + } + else + if (oRight instanceof cXSDateTime) { + sOperator = "add-dayTimeDuration-to-dateTime"; + bReverse = true; + } + else + if (oRight instanceof cXSDayTimeDuration) + sOperator = "add-dayTimeDurations"; + } + else + if (oLeft instanceof cXSTime) { + if (oRight instanceof cXSDayTimeDuration) + sOperator = "add-dayTimeDuration-to-time"; + } + else + if (oLeft instanceof cXSDateTime) { + if (oRight instanceof cXSYearMonthDuration) + sOperator = "add-yearMonthDuration-to-dateTime"; + else + if (oRight instanceof cXSDayTimeDuration) + sOperator = "add-dayTimeDuration-to-dateTime"; + } + + if (sOperator) + return hStaticContext_operators[sOperator].call(oContext, bReverse ? oRight : oLeft, bReverse ? oLeft : oRight); + + throw new cException("XPTY0004" + , "Arithmetic operator is not defined for provided arguments" + ); }; +hAdditiveExpr_operators['-'] = function (oLeft, oRight, oContext) { + var sOperator = ''; + + if (fXSAnyAtomicType_isNumeric(oLeft)) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "numeric-subtract"; + } + else + if (oLeft instanceof cXSDate) { + if (oRight instanceof cXSDate) + sOperator = "subtract-dates"; + else + if (oRight instanceof cXSYearMonthDuration) + sOperator = "subtract-yearMonthDuration-from-date"; + else + if (oRight instanceof cXSDayTimeDuration) + sOperator = "subtract-dayTimeDuration-from-date"; + } + else + if (oLeft instanceof cXSTime) { + if (oRight instanceof cXSTime) + sOperator = "subtract-times"; + else + if (oRight instanceof cXSDayTimeDuration) + sOperator = "subtract-dayTimeDuration-from-time"; + } + else + if (oLeft instanceof cXSDateTime) { + if (oRight instanceof cXSDateTime) + sOperator = "subtract-dateTimes"; + else + if (oRight instanceof cXSYearMonthDuration) + sOperator = "subtract-yearMonthDuration-from-dateTime"; + else + if (oRight instanceof cXSDayTimeDuration) + sOperator = "subtract-dayTimeDuration-from-dateTime"; + } + else + if (oLeft instanceof cXSYearMonthDuration) { + if (oRight instanceof cXSYearMonthDuration) + sOperator = "subtract-yearMonthDurations"; + } + else + if (oLeft instanceof cXSDayTimeDuration) { + if (oRight instanceof cXSDayTimeDuration) + sOperator = "subtract-dayTimeDurations"; + } + + if (sOperator) + return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); + + throw new cException("XPTY0004" + , "Arithmetic operator is not defined for provided arguments" + ); }; + +function fAdditiveExpr_parse (oLexer, oStaticContext) { + var oExpr; + if (oLexer.eof() ||!(oExpr = fMultiplicativeExpr_parse(oLexer, oStaticContext))) + return; + if (!(oLexer.peek() in hAdditiveExpr_operators)) + return oExpr; + + var oAdditiveExpr = new cAdditiveExpr(oExpr), + sOperator; + while ((sOperator = oLexer.peek()) in hAdditiveExpr_operators) { + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fMultiplicativeExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in additive expression" + ); + oAdditiveExpr.items.push([sOperator, oExpr]); + } + return oAdditiveExpr; +}; + +cAdditiveExpr.prototype.evaluate = function (oContext) { + var oLeft = fFunction_sequence_atomize(this.left.evaluate(oContext), oContext); + + if (!oLeft.length) + return []; + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' + , "first operand of '" + this.items[0][0] + "'" + ); + + var vLeft = oLeft[0]; + if (vLeft instanceof cXSUntypedAtomic) + vLeft = cXSDouble.cast(vLeft); + for (var nIndex = 0, nLength = this.items.length, oRight, vRight; nIndex < nLength; nIndex++) { + oRight = fFunction_sequence_atomize(this.items[nIndex][1].evaluate(oContext), oContext); + + if (!oRight.length) + return []; + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + , "first operand of '" + this.items[nIndex][0] + "'" + ); + + vRight = oRight[0]; + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSDouble.cast(vRight); + vLeft = hAdditiveExpr_operators[this.items[nIndex][0]](vLeft, vRight, oContext); + } + return [vLeft]; +}; + + +function cMultiplicativeExpr(oExpr) { + this.left = oExpr; + this.items = []; +}; + +cMultiplicativeExpr.prototype.left = null; +cMultiplicativeExpr.prototype.items = null; + +var hMultiplicativeExpr_operators = {}; +hMultiplicativeExpr_operators['*'] = function (oLeft, oRight, oContext) { + var sOperator = '', + bReverse = false; + + if (fXSAnyAtomicType_isNumeric(oLeft)) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "numeric-multiply"; + else + if (oRight instanceof cXSYearMonthDuration) { + sOperator = "multiply-yearMonthDuration"; + bReverse = true; + } + else + if (oRight instanceof cXSDayTimeDuration) { + sOperator = "multiply-dayTimeDuration"; + bReverse = true; + } + } + else { + if (oLeft instanceof cXSYearMonthDuration) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "multiply-yearMonthDuration"; + } + else + if (oLeft instanceof cXSDayTimeDuration) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "multiply-dayTimeDuration"; + } + } + + if (sOperator) + return hStaticContext_operators[sOperator].call(oContext, bReverse ? oRight : oLeft, bReverse ? oLeft : oRight); + + throw new cException("XPTY0004" + , "Arithmetic operator is not defined for provided arguments" + ); }; +hMultiplicativeExpr_operators['div'] = function (oLeft, oRight, oContext) { + var sOperator = ''; + + if (fXSAnyAtomicType_isNumeric(oLeft)) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "numeric-divide"; + } + else + if (oLeft instanceof cXSYearMonthDuration) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "divide-yearMonthDuration"; + else + if (oRight instanceof cXSYearMonthDuration) + sOperator = "divide-yearMonthDuration-by-yearMonthDuration"; + } + else + if (oLeft instanceof cXSDayTimeDuration) { + if (fXSAnyAtomicType_isNumeric(oRight)) + sOperator = "divide-dayTimeDuration"; + else + if (oRight instanceof cXSDayTimeDuration) + sOperator = "divide-dayTimeDuration-by-dayTimeDuration"; + } + if (sOperator) + return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); + + throw new cException("XPTY0004" + , "Arithmetic operator is not defined for provided arguments" + ); }; +hMultiplicativeExpr_operators['idiv'] = function (oLeft, oRight, oContext) { + if (fXSAnyAtomicType_isNumeric(oLeft) && fXSAnyAtomicType_isNumeric(oRight)) + return hStaticContext_operators["numeric-integer-divide"].call(oContext, oLeft, oRight); + throw new cException("XPTY0004" + , "Arithmetic operator is not defined for provided arguments" + ); }; +hMultiplicativeExpr_operators['mod'] = function (oLeft, oRight, oContext) { + if (fXSAnyAtomicType_isNumeric(oLeft) && fXSAnyAtomicType_isNumeric(oRight)) + return hStaticContext_operators["numeric-mod"].call(oContext, oLeft, oRight); + throw new cException("XPTY0004" + , "Arithmetic operator is not defined for provided arguments" + ); }; + +function fMultiplicativeExpr_parse (oLexer, oStaticContext) { + var oExpr; + if (oLexer.eof() ||!(oExpr = fUnionExpr_parse(oLexer, oStaticContext))) + return; + if (!(oLexer.peek() in hMultiplicativeExpr_operators)) + return oExpr; + + var oMultiplicativeExpr = new cMultiplicativeExpr(oExpr), + sOperator; + while ((sOperator = oLexer.peek()) in hMultiplicativeExpr_operators) { + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fUnionExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in multiplicative expression" + ); + oMultiplicativeExpr.items.push([sOperator, oExpr]); + } + return oMultiplicativeExpr; +}; + +cMultiplicativeExpr.prototype.evaluate = function (oContext) { + var oLeft = fFunction_sequence_atomize(this.left.evaluate(oContext), oContext); + + if (!oLeft.length) + return []; + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' + , "first operand of '" + this.items[0][0] + "'" + ); + + var vLeft = oLeft[0]; + if (vLeft instanceof cXSUntypedAtomic) + vLeft = cXSDouble.cast(vLeft); + for (var nIndex = 0, nLength = this.items.length, oRight, vRight; nIndex < nLength; nIndex++) { + oRight = fFunction_sequence_atomize(this.items[nIndex][1].evaluate(oContext), oContext); + + if (!oRight.length) + return []; + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + , "second operand of '" + this.items[nIndex][0] + "'" + ); + + vRight = oRight[0]; + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSDouble.cast(vRight); + vLeft = hMultiplicativeExpr_operators[this.items[nIndex][0]](vLeft, vRight, oContext); + } + return [vLeft]; +}; + + +function cUnaryExpr(sOperator, oExpr) { + this.operator = sOperator; + this.expression = oExpr; +}; + +cUnaryExpr.prototype.operator = null; +cUnaryExpr.prototype.expression = null; + +var hUnaryExpr_operators = {}; +hUnaryExpr_operators['-'] = function(oRight, oContext) { + if (fXSAnyAtomicType_isNumeric(oRight)) + return hStaticContext_operators["numeric-unary-minus"].call(oContext, oRight); + throw new cException("XPTY0004" + , "Arithmetic operator is not defined for provided arguments" + ); }; +hUnaryExpr_operators['+'] = function(oRight, oContext) { + if (fXSAnyAtomicType_isNumeric(oRight)) + return hStaticContext_operators["numeric-unary-plus"].call(oContext, oRight); + throw new cException("XPTY0004" + , "Arithmetic operator is not defined for provided arguments" + ); }; + +function fUnaryExpr_parse (oLexer, oStaticContext) { + if (oLexer.eof()) + return; + if (!(oLexer.peek() in hUnaryExpr_operators)) + return fValueExpr_parse(oLexer, oStaticContext); + + var sOperator = '+', + oExpr; + while (oLexer.peek() in hUnaryExpr_operators) { + if (oLexer.peek() == '-') + sOperator = sOperator == '-' ? '+' : '-'; + oLexer.next(); + } + if (oLexer.eof() ||!(oExpr = fValueExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected operand in unary expression" + ); + return new cUnaryExpr(sOperator, oExpr); +}; + +cUnaryExpr.prototype.evaluate = function (oContext) { + var oRight = fFunction_sequence_atomize(this.expression.evaluate(oContext), oContext); + + if (!oRight.length) + return []; + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + , "second operand of '" + this.operator + "'" + ); + + var vRight = oRight[0]; + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSDouble.cast(vRight); + return [hUnaryExpr_operators[this.operator](vRight, oContext)]; +}; + + +function cValueExpr() { + +}; + +function fValueExpr_parse (oLexer, oStaticContext) { + return fPathExpr_parse(oLexer, oStaticContext); +}; + + +function cOrExpr(oExpr) { + this.left = oExpr; + this.items = []; +}; + +cOrExpr.prototype.left = null; +cOrExpr.prototype.items = null; + +function fOrExpr_parse (oLexer, oStaticContext) { + var oExpr; + if (oLexer.eof() ||!(oExpr = fAndExpr_parse(oLexer, oStaticContext))) + return; + if (oLexer.peek() != "or") + return oExpr; + + var oOrExpr = new cOrExpr(oExpr); + while (oLexer.peek() == "or") { + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fAndExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in logical expression" + ); + oOrExpr.items.push(oExpr); + } + return oOrExpr; +}; + +cOrExpr.prototype.evaluate = function (oContext) { + var bValue = fFunction_sequence_toEBV(this.left.evaluate(oContext), oContext); + for (var nIndex = 0, nLength = this.items.length; (nIndex < nLength) && !bValue; nIndex++) + bValue = fFunction_sequence_toEBV(this.items[nIndex].evaluate(oContext), oContext); + return [new cXSBoolean(bValue)]; +}; + + +function cAndExpr(oExpr) { + this.left = oExpr; + this.items = []; +}; + +cAndExpr.prototype.left = null; +cAndExpr.prototype.items = null; + +function fAndExpr_parse (oLexer, oStaticContext) { + var oExpr; + if (oLexer.eof() ||!(oExpr = fComparisonExpr_parse(oLexer, oStaticContext))) + return; + if (oLexer.peek() != "and") + return oExpr; + + var oAndExpr = new cAndExpr(oExpr); + while (oLexer.peek() == "and") { + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fComparisonExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in logical expression" + ); + oAndExpr.items.push(oExpr); + } + return oAndExpr; +}; + +cAndExpr.prototype.evaluate = function (oContext) { + var bValue = fFunction_sequence_toEBV(this.left.evaluate(oContext), oContext); + for (var nIndex = 0, nLength = this.items.length; (nIndex < nLength) && bValue; nIndex++) + bValue = fFunction_sequence_toEBV(this.items[nIndex].evaluate(oContext), oContext); + return [new cXSBoolean(bValue)]; +}; + + +function cStepExpr() { + +}; + +cStepExpr.prototype.predicates = null; + +function fStepExpr_parse (oLexer, oStaticContext) { + if (!oLexer.eof()) + return fFilterExpr_parse(oLexer, oStaticContext) + || fAxisStep_parse(oLexer, oStaticContext); +}; + +function fStepExpr_parsePredicates (oLexer, oStaticContext, oStep) { + var oExpr; + while (oLexer.peek() == '[') { + oLexer.next(); + + if (oLexer.eof() ||!(oExpr = fExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected expression in predicate" + ); + + oStep.predicates.push(oExpr); + + if (oLexer.peek() != ']') + throw new cException("XPST0003" + , "Expected ']' token in predicate" + ); + + oLexer.next(); + } +}; + +cStepExpr.prototype.applyPredicates = function(oSequence, oContext) { + var vContextItem = oContext.item, + nContextPosition= oContext.position, + nContextSize = oContext.size; + for (var nPredicateIndex = 0, oSequence1, nPredicateLength = this.predicates.length; nPredicateIndex < nPredicateLength; nPredicateIndex++) { + oSequence1 = oSequence; + oSequence = []; + for (var nIndex = 0, oSequence2, nLength = oSequence1.length; nIndex < nLength; nIndex++) { + oContext.item = oSequence1[nIndex]; + oContext.position = nIndex + 1; + oContext.size = nLength; + oSequence2 = this.predicates[nPredicateIndex].evaluate(oContext); + if (oSequence2.length == 1 && fXSAnyAtomicType_isNumeric(oSequence2[0])) { + if (oSequence2[0].valueOf() == nIndex + 1) + oSequence.push(oSequence1[nIndex]); + } + else + if (fFunction_sequence_toEBV(oSequence2, oContext)) + oSequence.push(oSequence1[nIndex]); + } + } + oContext.item = vContextItem; + oContext.position = nContextPosition; + oContext.size = nContextSize; + return oSequence; +}; + + +function cAxisStep(sAxis, oTest) { + this.axis = sAxis; + this.test = oTest; + this.predicates = []; +}; + +cAxisStep.prototype = new cStepExpr; + +cAxisStep.prototype.axis = null; +cAxisStep.prototype.test = null; + +var hAxisStep_axises = {}; +hAxisStep_axises["attribute"] = {}; +hAxisStep_axises["child"] = {}; +hAxisStep_axises["descendant"] = {}; +hAxisStep_axises["descendant-or-self"] = {}; +hAxisStep_axises["following"] = {}; +hAxisStep_axises["following-sibling"] = {}; +hAxisStep_axises["self"] = {}; +hAxisStep_axises["ancestor"] = {}; +hAxisStep_axises["ancestor-or-self"] = {}; +hAxisStep_axises["parent"] = {}; +hAxisStep_axises["preceding"] = {}; +hAxisStep_axises["preceding-sibling"] = {}; + +function fAxisStep_parse (oLexer, oStaticContext) { + var sAxis = oLexer.peek(), + oExpr, + oStep; + if (oLexer.peek(1) == '::') { + if (!(sAxis in hAxisStep_axises)) + throw new cException("XPST0003" + , "Unknown axis name: " + sAxis + ); + + oLexer.next(2); + if (oLexer.eof() ||!(oExpr = fNodeTest_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected node test expression in axis step" + ); + oStep = new cAxisStep(sAxis, oExpr); + } + else + if (sAxis == '..') { + oLexer.next(); + oStep = new cAxisStep("parent", new cKindTest("node")); + } + else + if (sAxis == '@') { + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fNodeTest_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected node test expression in axis step" + ); + oStep = new cAxisStep("attribute", oExpr); + } + else { + if (oLexer.eof() ||!(oExpr = fNodeTest_parse(oLexer, oStaticContext))) + return; + oStep = new cAxisStep(oExpr instanceof cKindTest && oExpr.name == "attribute" ? "attribute" : "child", oExpr); + } + fStepExpr_parsePredicates(oLexer, oStaticContext, oStep); + + return oStep; +}; + +cAxisStep.prototype.evaluate = function (oContext) { + var oItem = oContext.item; + + if (!oContext.DOMAdapter.isNode(oItem)) + throw new cException("XPTY0020"); + + var oSequence = [], + fGetProperty= oContext.DOMAdapter.getProperty, + nType = fGetProperty(oItem, "nodeType"); + + switch (this.axis) { + case "attribute": + if (nType == 1) + for (var aAttributes = fGetProperty(oItem, "attributes"), nIndex = 0, nLength = aAttributes.length; nIndex < nLength; nIndex++) + oSequence.push(aAttributes[nIndex]); + break; + + case "child": + for (var oNode = fGetProperty(oItem, "firstChild"); oNode; oNode = fGetProperty(oNode, "nextSibling")) + oSequence.push(oNode); + break; + + case "descendant-or-self": + oSequence.push(oItem); + case "descendant": + fAxisStep_getChildrenForward(fGetProperty(oItem, "firstChild"), oSequence, fGetProperty); + break; + + case "following": + for (var oParent = oItem, oSibling; oParent; oParent = fGetProperty(oParent, "parentNode")) + if (oSibling = fGetProperty(oParent, "nextSibling")) + fAxisStep_getChildrenForward(oSibling, oSequence, fGetProperty); + break; + + case "following-sibling": + for (var oNode = oItem; oNode = fGetProperty(oNode, "nextSibling");) + oSequence.push(oNode); + break; + + case "self": + oSequence.push(oItem); + break; + + case "ancestor-or-self": + oSequence.push(oItem); + case "ancestor": + for (var oNode = nType == 2 ? fGetProperty(oItem, "ownerElement") : oItem; oNode = fGetProperty(oNode, "parentNode");) + oSequence.push(oNode); + break; + + case "parent": + var oParent = nType == 2 ? fGetProperty(oItem, "ownerElement") : fGetProperty(oItem, "parentNode"); + if (oParent) + oSequence.push(oParent); + break; + + case "preceding": + for (var oParent = oItem, oSibling; oParent; oParent = fGetProperty(oParent, "parentNode")) + if (oSibling = fGetProperty(oParent, "previousSibling")) + fAxisStep_getChildrenBackward(oSibling, oSequence, fGetProperty); + break; + + case "preceding-sibling": + for (var oNode = oItem; oNode = fGetProperty(oNode, "previousSibling");) + oSequence.push(oNode); + break; + } + + if (oSequence.length && !(this.test instanceof cKindTest && this.test.name == "node")) { + var oSequence1 = oSequence; + oSequence = []; + for (var nIndex = 0, nLength = oSequence1.length; nIndex < nLength; nIndex++) { + if (this.test.test(oSequence1[nIndex], oContext)) + oSequence.push(oSequence1[nIndex]); + } + } + + if (oSequence.length && this.predicates.length) + oSequence = this.applyPredicates(oSequence, oContext); + + switch (this.axis) { + case "ancestor": + case "ancestor-or-self": + case "parent": + case "preceding": + case "preceding-sibling": + oSequence.reverse(); + } + + return oSequence; +}; + +function fAxisStep_getChildrenForward(oNode, oSequence, fGetProperty) { + for (var oChild; oNode; oNode = fGetProperty(oNode, "nextSibling")) { + oSequence.push(oNode); + if (oChild = fGetProperty(oNode, "firstChild")) + fAxisStep_getChildrenForward(oChild, oSequence, fGetProperty); + } +}; + +function fAxisStep_getChildrenBackward(oNode, oSequence, fGetProperty) { + for (var oChild; oNode; oNode = fGetProperty(oNode, "previousSibling")) { + if (oChild = fGetProperty(oNode, "lastChild")) + fAxisStep_getChildrenBackward(oChild, oSequence, fGetProperty); + oSequence.push(oNode); + } +}; + + +function cPathExpr() { + this.items = []; +}; + +cPathExpr.prototype.items = null; + +function fPathExpr_parse (oLexer, oStaticContext) { + if (oLexer.eof()) + return; + var sSingleSlash = '/', + sDoubleSlash = '/' + '/'; + + var oPathExpr = new cPathExpr(), + sSlash = oLexer.peek(), + oExpr; + if (sSlash == sDoubleSlash || sSlash == sSingleSlash) { + oLexer.next(); + oPathExpr.items.push(new cFunctionCall(null, "root", sNS_XPF)); + if (sSlash == sDoubleSlash) + oPathExpr.items.push(new cAxisStep("descendant-or-self", new cKindTest("node"))); + } + + if (oLexer.eof() ||!(oExpr = fStepExpr_parse(oLexer, oStaticContext))) { + if (sSlash == sSingleSlash) + return oPathExpr.items[0]; if (sSlash == sDoubleSlash) + throw new cException("XPST0003" + , "Expected path step expression" + ); + return; + } + oPathExpr.items.push(oExpr); + + while ((sSlash = oLexer.peek()) == sSingleSlash || sSlash == sDoubleSlash) { + if (sSlash == sDoubleSlash) + oPathExpr.items.push(new cAxisStep("descendant-or-self", new cKindTest("node"))); + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fStepExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected path step expression" + ); + oPathExpr.items.push(oExpr); + } + + if (oPathExpr.items.length == 1) + return oPathExpr.items[0]; + + return oPathExpr; +}; + +cPathExpr.prototype.evaluate = function (oContext) { + var vContextItem = oContext.item; + var oSequence = [vContextItem]; + for (var nItemIndex = 0, nItemLength = this.items.length, oSequence1; nItemIndex < nItemLength; nItemIndex++) { + oSequence1 = []; + for (var nIndex = 0, nLength = oSequence.length; nIndex < nLength; nIndex++) { + oContext.item = oSequence[nIndex]; + for (var nRightIndex = 0, oSequence2 = this.items[nItemIndex].evaluate(oContext), nRightLength = oSequence2.length; nRightIndex < nRightLength; nRightIndex++) + if ((nItemIndex < nItemLength - 1) && !oContext.DOMAdapter.isNode(oSequence2[nRightIndex])) + throw new cException("XPTY0019"); + else + if (fArray_indexOf(oSequence1, oSequence2[nRightIndex]) ==-1) + oSequence1.push(oSequence2[nRightIndex]); + } + oSequence = oSequence1; + }; + oContext.item = vContextItem; + return fFunction_sequence_order(oSequence, oContext); +}; + + +function cNodeTest() { + +}; + +function fNodeTest_parse (oLexer, oStaticContext) { + if (!oLexer.eof()) + return fKindTest_parse(oLexer, oStaticContext) + || fNameTest_parse(oLexer, oStaticContext); +}; + + +function cKindTest(sName) { + this.name = sName; + this.args = []; +}; + +cKindTest.prototype = new cNodeTest; + +cKindTest.prototype.name = null; +cKindTest.prototype.args = null; + +var hKindTest_names = {}; +hKindTest_names["document-node"] = {}; +hKindTest_names["element"] = {}; +hKindTest_names["attribute"] = {}; +hKindTest_names["processing-instruction"] = {}; +hKindTest_names["comment"] = {}; +hKindTest_names["text"] = {}; +hKindTest_names["node"] = {}; +hKindTest_names["schema-element"] = {}; +hKindTest_names["schema-attribute"] = {}; + +function fKindTest_parse (oLexer, oStaticContext) { + var sName = oLexer.peek(); + if (oLexer.peek(1) == '(') { + if (!(sName in hKindTest_names)) + throw new cException("XPST0003" + , "Unknown '" + sName + "' kind test" + ); + + oLexer.next(2); + var oTest = new cKindTest(sName); + if (oLexer.peek() != ')') { + if (sName == "document-node") { + } + else + if (sName == "element") { + } + else + if (sName == "attribute") { + } + else + if (sName == "processing-instruction") { + } + else + if (sName == "schema-attribute") { + } + else + if (sName == "schema-element") { + } + } + else { + if (sName == "schema-attribute") + throw new cException("XPST0003" + , "Expected attribute declaration in 'schema-attribute' kind test" + ); + else + if (sName == "schema-element") + throw new cException("XPST0003" + , "Expected element declaration in 'schema-element' kind test" + ); + } + + if (oLexer.peek() != ')') + throw new cException("XPST0003" + , "Expected ')' token in kind test" + ); + oLexer.next(); + + return oTest; + } +}; + +cKindTest.prototype.test = function (oNode, oContext) { + var fGetProperty = oContext.DOMAdapter.getProperty, + nType = oContext.DOMAdapter.isNode(oNode) ? fGetProperty(oNode, "nodeType") : 0; + switch (this.name) { + case "node": return !!nType; + case "attribute": if (nType != 2) return false; break; + case "document-node": return nType == 9; + case "element": return nType == 1; + case "processing-instruction": if (nType != 7) return false; break; + case "comment": return nType == 8; + case "text": return nType == 3 || nType == 4; + + case "schema-attribute": + throw "KindTest '" + "schema-attribute" + "' not implemented"; + + case "schema-element": + throw "KindTest '" + "schema-element" + "' not implemented"; + } + + if (nType == 2) + return fGetProperty(oNode, "prefix") != "xmlns" && fGetProperty(oNode, "localName") != "xmlns"; + if (nType == 7) + return fGetProperty(oNode, "target") != "xml"; + + return true; +}; + + +function cNameTest(sPrefix, sLocalName, sNameSpaceURI) { + this.prefix = sPrefix; + this.localName = sLocalName; + this.namespaceURI = sNameSpaceURI; +}; + +cNameTest.prototype = new cNodeTest; + +cNameTest.prototype.prefix = null; +cNameTest.prototype.localName = null; +cNameTest.prototype.namespaceURI = null; + +var rNameTest = /^(?:(?![0-9-])([\w-]+|\*)\:)?(?![0-9-])([\w-]+|\*)$/; +function fNameTest_parse (oLexer, oStaticContext) { + var aMatch = oLexer.peek().match(rNameTest); + if (aMatch) { + if (aMatch[1] == '*' && aMatch[2] == '*') + throw new cException("XPST0003" + , "Illegal use of *:* wildcard in name test" + ); + oLexer.next(); + return new cNameTest(aMatch[1] || null, aMatch[2], aMatch[1] ? aMatch[1] == '*' ? '*' : oStaticContext.getURIForPrefix(aMatch[1]) || null : oStaticContext.defaultElementNamespace); + } +}; + +cNameTest.prototype.test = function (oNode, oContext) { + var fGetProperty = oContext.DOMAdapter.getProperty, + nType = fGetProperty(oNode, "nodeType"); + if (nType == 1 || nType == 2) { + if (this.localName == '*') + return (nType == 1 || (fGetProperty(oNode, "prefix") != "xmlns" && fGetProperty(oNode, "localName") != "xmlns")) && (!this.prefix || fGetProperty(oNode, "namespaceURI") == this.namespaceURI); + if (this.localName == fGetProperty(oNode, "localName")) + return this.namespaceURI == '*' || (nType == 2 && !this.prefix && !fGetProperty(oNode, "prefix")) || fGetProperty(oNode, "namespaceURI") == this.namespaceURI; + } + return false; +}; + + +function cPrimaryExpr() { + +}; + +function fPrimaryExpr_parse (oLexer, oStaticContext) { + if (!oLexer.eof()) + return fContextItemExpr_parse(oLexer, oStaticContext) + || fParenthesizedExpr_parse(oLexer, oStaticContext) + || fFunctionCall_parse(oLexer, oStaticContext) + || fVarRef_parse(oLexer, oStaticContext) + || fLiteral_parse(oLexer, oStaticContext); +}; + + +function cParenthesizedExpr(oExpr) { + this.expression = oExpr; +}; + +function fParenthesizedExpr_parse (oLexer, oStaticContext) { + if (oLexer.peek() == '(') { + oLexer.next(); + var oExpr = null; + if (oLexer.peek() != ')') + oExpr = fExpr_parse(oLexer, oStaticContext); + + if (oLexer.peek() != ')') + throw new cException("XPST0003" + , "Expected ')' token in parenthesized expression" + ); + + oLexer.next(); + + return new cParenthesizedExpr(oExpr); + } +}; + +cParenthesizedExpr.prototype.evaluate = function (oContext) { + return this.expression ? this.expression.evaluate(oContext) : []; +}; + + +function cContextItemExpr() { + +}; + +function fContextItemExpr_parse (oLexer, oStaticContext) { + if (oLexer.peek() == '.') { + oLexer.next(); + return new cContextItemExpr; + } +}; + +cContextItemExpr.prototype.evaluate = function (oContext) { + if (oContext.item == null) + throw new cException("XPDY0002" + , "Dynamic context does not have context item initialized" + ); + return [oContext.item]; +}; + + +function cLiteral() { + +}; + +cLiteral.prototype.value = null; + +function fLiteral_parse (oLexer, oStaticContext) { + if (!oLexer.eof()) + return fNumericLiteral_parse(oLexer, oStaticContext) + || fStringLiteral_parse(oLexer, oStaticContext); +}; + +cLiteral.prototype.evaluate = function (oContext) { + return [this.value]; +}; + + +function cNumericLiteral(oValue) { + this.value = oValue; +}; + +cNumericLiteral.prototype = new cLiteral; + +var rNumericLiteral = /^[+\-]?(?:(?:(\d+)(?:\.(\d*))?)|(?:\.(\d+)))(?:[eE]([+-])?(\d+))?$/; +function fNumericLiteral_parse (oLexer, oStaticContext) { + var sValue = oLexer.peek(), + vValue = fNumericLiteral_parseValue(sValue); + if (vValue) { + oLexer.next(); + return new cNumericLiteral(vValue); + } +}; + +function fNumericLiteral_parseValue(sValue) { + var aMatch = sValue.match(rNumericLiteral); + if (aMatch) { + var cType = cXSInteger; + if (aMatch[5]) + cType = cXSDouble; + else + if (aMatch[2] || aMatch[3]) + cType = cXSDecimal; + return new cType(+sValue); + } +}; + + +function cStringLiteral(oValue) { + this.value = oValue; +}; + +cStringLiteral.prototype = new cLiteral; + +var rStringLiteral = /^'([^']*(?:''[^']*)*)'|"([^"]*(?:""[^"]*)*)"$/; +function fStringLiteral_parse (oLexer, oStaticContext) { + var aMatch = oLexer.peek().match(rStringLiteral); + if (aMatch) { + oLexer.next(); + return new cStringLiteral(new cXSString(aMatch[1] ? aMatch[1].replace("''", "'") : aMatch[2] ? aMatch[2].replace('""', '"') : '')); + } +}; + + +function cFilterExpr(oPrimary) { + this.expression = oPrimary; + this.predicates = []; +}; + +cFilterExpr.prototype = new cStepExpr; + +cFilterExpr.prototype.expression = null; + +function fFilterExpr_parse (oLexer, oStaticContext) { + var oExpr; + if (oLexer.eof() ||!(oExpr = fPrimaryExpr_parse(oLexer, oStaticContext))) + return; + + var oFilterExpr = new cFilterExpr(oExpr); + fStepExpr_parsePredicates(oLexer, oStaticContext, oFilterExpr); + + if (oFilterExpr.predicates.length == 0) + return oFilterExpr.expression; + + return oFilterExpr; +}; + +cFilterExpr.prototype.evaluate = function (oContext) { + var oSequence = this.expression.evaluate(oContext); + if (this.predicates.length && oSequence.length) + oSequence = this.applyPredicates(oSequence, oContext); + return oSequence; +}; + + +function cVarRef(sPrefix, sLocalName, sNameSpaceURI) { + this.prefix = sPrefix; + this.localName = sLocalName; + this.namespaceURI = sNameSpaceURI; +}; + +cVarRef.prototype.prefix = null; +cVarRef.prototype.localName = null; +cVarRef.prototype.namespaceURI = null; + +function fVarRef_parse (oLexer, oStaticContext) { + if (oLexer.peek().substr(0, 1) == '$') { + var aMatch = oLexer.peek().substr(1).match(rNameTest); + if (aMatch) { + if (aMatch[1] == '*' || aMatch[2] == '*') + throw new cException("XPST0003" + , "Illegal use of wildcard in var expression variable name" + ); + + var oVarRef = new cVarRef(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) : null); + oLexer.next(); + return oVarRef; + } + } +}; + +cVarRef.prototype.evaluate = function (oContext) { + var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName; + if (oContext.scope.hasOwnProperty(sUri)) + return [oContext.scope[sUri]]; + throw new cException("XPST0008" + , "Variable $" + (this.prefix ? this.prefix + ':' : '') + this.localName + " has not been declared" + ); +}; + + +function cFunctionCall(sPrefix, sLocalName, sNameSpaceURI) { + this.prefix = sPrefix; + this.localName = sLocalName; + this.namespaceURI = sNameSpaceURI; + this.args = []; +}; + +cFunctionCall.prototype.prefix = null; +cFunctionCall.prototype.localName = null; +cFunctionCall.prototype.namespaceURI = null; +cFunctionCall.prototype.args = null; + +function fFunctionCall_parse (oLexer, oStaticContext) { + var aMatch = oLexer.peek().match(rNameTest); + if (aMatch && oLexer.peek(1) == '(') { + if (!aMatch[1] && (aMatch[2] in hKindTest_names)) + return fAxisStep_parse(oLexer, oStaticContext); + if (aMatch[1] == '*' || aMatch[2] == '*') + throw new cException("XPST0003" + , "Illegal use of wildcard in function name" + ); + var oFunctionCallExpr = new cFunctionCall(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) || null : oStaticContext.defaultFunctionNamespace), + oExpr; + oLexer.next(2); + if (oLexer.peek() != ')') { + do { + if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected function call argument" + ); + oFunctionCallExpr.args.push(oExpr); + } + while (oLexer.peek() == ',' && oLexer.next()); + if (oLexer.peek() != ')') + throw new cException("XPST0003" + , "Expected ')' token in function call" + ); + } + oLexer.next(); + return oFunctionCallExpr; + } +}; + +cFunctionCall.prototype.evaluate = function (oContext) { + var aArguments = [], + aParameters, + fFunction; + + for (var nIndex = 0, nLength = this.args.length; nIndex < nLength; nIndex++) + aArguments.push(this.args[nIndex].evaluate(oContext)); + + var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName; + if (this.namespaceURI == sNS_XPF) { + if (fFunction = hStaticContext_functions[this.localName]) { + if (aParameters = hStaticContext_signatures[this.localName]) + fFunctionCall_prepare(this.localName, aParameters, fFunction, aArguments, oContext); + var vResult = fFunction.apply(oContext, aArguments); + return vResult == null ? [] : vResult instanceof cArray ? vResult : [vResult]; + } + throw new cException("XPST0017" + , "Unknown system function: " + sUri + '()' + ); + } + else + if (this.namespaceURI == sNS_XSD) { + if ((fFunction = hStaticContext_dataTypes[this.localName]) && this.localName != "NOTATION" && this.localName != "anyAtomicType") { + fFunctionCall_prepare(this.localName, [[cXSAnyAtomicType]], fFunction, aArguments, oContext); + return [fFunction.cast(aArguments[0])]; + } + throw new cException("XPST0017" + , "Unknown type constructor function: " + sUri + '()' + ); + } + else + if (fFunction = oContext.staticContext.getFunction(sUri)) { + var vResult = fFunction.apply(oContext, aArguments); + return vResult == null ? [] : vResult instanceof cArray ? vResult : [vResult]; + } + throw new cException("XPST0017" + , "Unknown user function: " + sUri + '()' + ); +}; + +var aFunctionCall_numbers = ["first", "second", "third", "fourth", "fifth"]; +function fFunctionCall_prepare(sName, aParameters, fFunction, aArguments, oContext) { + var oArgument, + nArgumentsLength = aArguments.length, + oParameter, + nParametersLength = aParameters.length, + nParametersRequired = 0; + + while ((nParametersRequired < aParameters.length) && !aParameters[nParametersRequired][2]) + nParametersRequired++; + + if (nArgumentsLength > nParametersLength) + throw new cException("XPST0017" + , "Function " + sName + "() must have " + (nParametersLength ? " no more than " : '') + nParametersLength + " argument" + (nParametersLength > 1 || !nParametersLength ? 's' : '') + ); + else + if (nArgumentsLength < nParametersRequired) + throw new cException("XPST0017" + , "Function " + sName + "() must have " + (nParametersRequired == nParametersLength ? "exactly" : "at least") + ' ' + nParametersRequired + " argument" + (nParametersLength > 1 ? 's' : '') + ); + + for (var nIndex = 0; nIndex < nArgumentsLength; nIndex++) { + oParameter = aParameters[nIndex]; + oArgument = aArguments[nIndex]; + fFunctionCall_assertSequenceCardinality(oContext, oArgument, oParameter[1] + , aFunctionCall_numbers[nIndex] + " argument of " + sName + '()' + ); + fFunctionCall_assertSequenceItemType(oContext, oArgument, oParameter[0] + , aFunctionCall_numbers[nIndex] + " argument of " + sName + '()' + ); + if (oParameter[1] != '+' && oParameter[1] != '*') + aArguments[nIndex] = oArgument.length ? oArgument[0] : null; + } +}; + +function fFunctionCall_assertSequenceItemType(oContext, oSequence, cItemType + , sSource + ) { + for (var nIndex = 0, nLength = oSequence.length, nNodeType, vItem; nIndex < nLength; nIndex++) { + vItem = oSequence[nIndex]; + if (cItemType == cXTNode || cItemType.prototype instanceof cXTNode) { + if (!oContext.DOMAdapter.isNode(vItem)) + throw new cException("XPTY0004" + , "Required item type of " + sSource + " is " + cItemType + ); + + if (cItemType != cXTNode) { + nNodeType = oContext.DOMAdapter.getProperty(vItem, "nodeType"); + if ([null, cXTElement, cXTAttribute, cXTText, cXTText, null, null, cXTProcessingInstruction, cXTComment, cXTDocument, null, null, null][nNodeType] != cItemType) + throw new cException("XPTY0004" + , "Required item type of " + sSource + " is " + cItemType + ); + } + } + else + if (cItemType == cXSAnyAtomicType || cItemType.prototype instanceof cXSAnyAtomicType) { + vItem = fFunction_sequence_atomize([vItem], oContext)[0]; + if (cItemType != cXSAnyAtomicType) { + if (vItem instanceof cXSUntypedAtomic) + vItem = cItemType.cast(vItem); + else + if (cItemType == cXSString) { + if (vItem instanceof cXSAnyURI) + vItem = cXSString.cast(vItem); + } + else + if (cItemType == cXSDouble) { + if (fXSAnyAtomicType_isNumeric(vItem)) + vItem = cItemType.cast(vItem); + } + } + if (!(vItem instanceof cItemType)) + throw new cException("XPTY0004" + , "Required item type of " + sSource + " is " + cItemType + ); + oSequence[nIndex] = vItem; + } + } +}; + +function fFunctionCall_assertSequenceCardinality(oContext, oSequence, sCardinality + , sSource + ) { + var nLength = oSequence.length; + if (sCardinality == '?') { if (nLength > 1) + throw new cException("XPTY0004" + , "Required cardinality of " + sSource + " is one or zero" + ); + } + else + if (sCardinality == '+') { if (nLength < 1) + throw new cException("XPTY0004" + , "Required cardinality of " + sSource + " is one or more" + ); + } + else + if (sCardinality != '*') { if (nLength != 1) + throw new cException("XPTY0004" + , "Required cardinality of " + sSource + " is exactly one" + ); + } +}; + + +function cIntersectExceptExpr(oExpr) { + this.left = oExpr; + this.items = []; +}; + +cIntersectExceptExpr.prototype.left = null; +cIntersectExceptExpr.prototype.items = null; + +function fIntersectExceptExpr_parse (oLexer, oStaticContext) { + var oExpr, + sOperator; + if (oLexer.eof() ||!(oExpr = fInstanceofExpr_parse(oLexer, oStaticContext))) + return; + if (!((sOperator = oLexer.peek()) == "intersect" || sOperator == "except")) + return oExpr; + + var oIntersectExceptExpr = new cIntersectExceptExpr(oExpr); + while ((sOperator = oLexer.peek()) == "intersect" || sOperator == "except") { + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fInstanceofExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in " + sOperator + " expression" + ); + oIntersectExceptExpr.items.push([sOperator, oExpr]); + } + return oIntersectExceptExpr; +}; + +cIntersectExceptExpr.prototype.evaluate = function (oContext) { + var oSequence = this.left.evaluate(oContext); + for (var nIndex = 0, nLength = this.items.length, oItem; nIndex < nLength; nIndex++) + oSequence = hStaticContext_operators[(oItem = this.items[nIndex])[0]].call(oContext, oSequence, oItem[1].evaluate(oContext)); + return oSequence; +}; + + +function cRangeExpr(oLeft, oRight) { + this.left = oLeft; + this.right = oRight; +}; + +cRangeExpr.prototype.left = null; +cRangeExpr.prototype.right = null; + +function fRangeExpr_parse (oLexer, oStaticContext) { + var oExpr, + oRight; + if (oLexer.eof() ||!(oExpr = fAdditiveExpr_parse(oLexer, oStaticContext))) + return; + if (oLexer.peek() != "to") + return oExpr; + + oLexer.next(); + if (oLexer.eof() ||!(oRight = fAdditiveExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in range expression" + ); + return new cRangeExpr(oExpr, oRight); +}; + +cRangeExpr.prototype.evaluate = function (oContext) { + var oLeft = this.left.evaluate(oContext); + if (!oLeft.length) + return []; + var sSource = "first operand of 'to'"; + + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' + , sSource + ); + fFunctionCall_assertSequenceItemType(oContext, oLeft, cXSInteger + , sSource + ); + + var oRight = this.right.evaluate(oContext); + if (!oRight.length) + return []; + + sSource = "second operand of 'to'"; + + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + , sSource + ); + fFunctionCall_assertSequenceItemType(oContext, oRight, cXSInteger + , sSource + ); + + return hStaticContext_operators["to"].call(oContext, oLeft[0], oRight[0]); +}; + + +function cUnionExpr(oExpr) { + this.left = oExpr; + this.items = []; +}; + +cUnionExpr.prototype.left = null; +cUnionExpr.prototype.items = null; + +function fUnionExpr_parse (oLexer, oStaticContext) { + var oExpr, + sOperator; + if (oLexer.eof() ||!(oExpr = fIntersectExceptExpr_parse(oLexer, oStaticContext))) + return; + if (!((sOperator = oLexer.peek()) == '|' || sOperator == "union")) + return oExpr; + + var oUnionExpr = new cUnionExpr(oExpr); + while ((sOperator = oLexer.peek()) == '|' || sOperator == "union") { + oLexer.next(); + if (oLexer.eof() ||!(oExpr = fIntersectExceptExpr_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in union expression" + ); + oUnionExpr.items.push(oExpr); + } + return oUnionExpr; +}; + +cUnionExpr.prototype.evaluate = function (oContext) { + var oSequence = this.left.evaluate(oContext); + for (var nIndex = 0, nLength = this.items.length; nIndex < nLength; nIndex++) + oSequence = hStaticContext_operators["union"].call(oContext, oSequence, this.items[nIndex].evaluate(oContext)); + return oSequence; +}; + + +function cInstanceofExpr(oExpr, oType) { + this.expression = oExpr; + this.type = oType; +}; + +cInstanceofExpr.prototype.expression = null; +cInstanceofExpr.prototype.type = null; + +function fInstanceofExpr_parse (oLexer, oStaticContext) { + var oExpr, + oType; + if (oLexer.eof() ||!(oExpr = fTreatExpr_parse(oLexer, oStaticContext))) + return; + + if (!(oLexer.peek() == "instance" && oLexer.peek(1) == "of")) + return oExpr; + + oLexer.next(2); + if (oLexer.eof() ||!(oType = fSequenceType_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in instance of expression" + ); + + return new cInstanceofExpr(oExpr, oType); +}; + +cInstanceofExpr.prototype.evaluate = function(oContext) { + var oSequence1 = this.expression.evaluate(oContext), + oItemType = this.type.itemType, + sOccurence = this.type.occurence; + if (!oItemType) + return [new cXSBoolean(!oSequence1.length)]; + if (!oSequence1.length) + return [new cXSBoolean(sOccurence == '?' || sOccurence == '*')]; + if (oSequence1.length != 1) + if (!(sOccurence == '+' || sOccurence == '*')) + return [new cXSBoolean(false)]; + + if (!oItemType.test) return [new cXSBoolean(true)]; + + var bValue = true; + for (var nIndex = 0, nLength = oSequence1.length; (nIndex < nLength) && bValue; nIndex++) + bValue = oItemType.test.test(oSequence1[nIndex], oContext); + return [new cXSBoolean(bValue)]; +}; + + +function cTreatExpr(oExpr, oType) { + this.expression = oExpr; + this.type = oType; +}; + +cTreatExpr.prototype.expression = null; +cTreatExpr.prototype.type = null; + +function fTreatExpr_parse (oLexer, oStaticContext) { + var oExpr, + oType; + if (oLexer.eof() ||!(oExpr = fCastableExpr_parse(oLexer, oStaticContext))) + return; + + if (!(oLexer.peek() == "treat" && oLexer.peek(1) == "as")) + return oExpr; + + oLexer.next(2); + if (oLexer.eof() ||!(oType = fSequenceType_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in treat expression" + ); + + return new cTreatExpr(oExpr, oType); +}; + +cTreatExpr.prototype.evaluate = function(oContext) { + var oSequence1 = this.expression.evaluate(oContext), + oItemType = this.type.itemType, + sOccurence = this.type.occurence; + if (!oItemType) { + if (oSequence1.length) + throw new cException("XPDY0050" + , "The only value allowed for the value in 'treat as' expression is an empty sequence" + ); + return oSequence1; + } + + if (!(sOccurence == '?' || sOccurence == '*')) + if (!oSequence1.length) + throw new cException("XPDY0050" + , "An empty sequence is not allowed as the value in 'treat as' expression" + ); + + if (!(sOccurence == '+' || sOccurence == '*')) + if (oSequence1.length != 1) + throw new cException("XPDY0050" + , "A sequence of more than one item is not allowed as the value in 'treat as' expression" + ); + + if (!oItemType.test) return oSequence1; + + for (var nIndex = 0, nLength = oSequence1.length; nIndex < nLength; nIndex++) + if (!oItemType.test.test(oSequence1[nIndex], oContext)) + throw new cException("XPDY0050" + , "Required item type of value in 'treat as' expression is " + (oItemType.test.prefix ? oItemType.test.prefix + ':' : '') + oItemType.test.localName + ); + + return oSequence1; +}; + + +function cCastableExpr(oExpr, oType) { + this.expression = oExpr; + this.type = oType; +}; + +cCastableExpr.prototype.expression = null; +cCastableExpr.prototype.type = null; + +function fCastableExpr_parse (oLexer, oStaticContext) { + var oExpr, + oType; + if (oLexer.eof() ||!(oExpr = fCastExpr_parse(oLexer, oStaticContext))) + return; + + if (!(oLexer.peek() == "castable" && oLexer.peek(1) == "as")) + return oExpr; + + oLexer.next(2); + if (oLexer.eof() ||!(oType = fSingleType_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in castable expression" + ); + + return new cCastableExpr(oExpr, oType); +}; + +cCastableExpr.prototype.evaluate = function(oContext) { + var oSequence1 = this.expression.evaluate(oContext), + oItemType = this.type.itemType, + sOccurence = this.type.occurence; + + if (oSequence1.length > 1) + return [new cXSBoolean(false)]; + else + if (!oSequence1.length) + return [new cXSBoolean(sOccurence == '?')]; + + try { + oItemType.cast(fFunction_sequence_atomize(oSequence1, oContext)[0]); + } + catch (e) { + if (e.code == "XPST0051") + throw e; + if (e.code == "XPST0017") + throw new cException("XPST0080" + , "No value is castable to " + (oItemType.prefix ? oItemType.prefix + ':' : '') + oItemType.localName + ); + return [new cXSBoolean(false)]; + } + + return [new cXSBoolean(true)]; +}; + + +function cCastExpr(oExpr, oType) { + this.expression = oExpr; + this.type = oType; +}; + +cCastExpr.prototype.expression = null; +cCastExpr.prototype.type = null; + +function fCastExpr_parse (oLexer, oStaticContext) { + var oExpr, + oType; + if (oLexer.eof() ||!(oExpr = fUnaryExpr_parse(oLexer, oStaticContext))) + return; + + if (!(oLexer.peek() == "cast" && oLexer.peek(1) == "as")) + return oExpr; + + oLexer.next(2); + if (oLexer.eof() ||!(oType = fSingleType_parse(oLexer, oStaticContext))) + throw new cException("XPST0003" + , "Expected second operand in cast expression" + ); + + return new cCastExpr(oExpr, oType); +}; + +cCastExpr.prototype.evaluate = function(oContext) { + var oSequence1 = this.expression.evaluate(oContext); + fFunctionCall_assertSequenceCardinality(oContext, oSequence1, this.type.occurence + , "'cast as' expression operand" + ); + if (!oSequence1.length) + return []; + return [this.type.itemType.cast(fFunction_sequence_atomize(oSequence1, oContext)[0], oContext)]; +}; + + +function cAtomicType(sPrefix, sLocalName, sNameSpaceURI) { + this.prefix = sPrefix; + this.localName = sLocalName; + this.namespaceURI = sNameSpaceURI; +}; + +cAtomicType.prototype.prefix = null; +cAtomicType.prototype.localName = null; +cAtomicType.prototype.namespaceURI = null; + +function fAtomicType_parse (oLexer, oStaticContext) { + var aMatch = oLexer.peek().match(rNameTest); + if (aMatch) { + if (aMatch[1] == '*' || aMatch[2] == '*') + throw new cException("XPST0003" + , "Illegal use of wildcard in type name" + ); + oLexer.next(); + return new cAtomicType(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) : null); + } +}; + +cAtomicType.prototype.test = function(vItem, oContext) { + var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName, + cType = this.namespaceURI == sNS_XSD ? hStaticContext_dataTypes[this.localName] : oContext.staticContext.getDataType(sUri); + if (cType) + return vItem instanceof cType; + throw new cException("XPST0051" + , "Unknown simple type " + (this.prefix ? this.prefix + ':' : '') + this.localName + ); +}; + +cAtomicType.prototype.cast = function(vItem, oContext) { + var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName, + cType = this.namespaceURI == sNS_XSD ? hStaticContext_dataTypes[this.localName] : oContext.staticContext.getDataType(sUri); + if (cType) + return cType.cast(vItem); + throw new cException("XPST0051" + , "Unknown atomic type " + (this.prefix ? this.prefix + ':' : '') + this.localName + ); +}; + + +function cItemType(oTest) { + this.test = oTest; +}; + +cItemType.prototype.test = null; + +function fItemType_parse (oLexer, oStaticContext) { + if (oLexer.eof()) + return; + + var oExpr; + if (oLexer.peek() == "item" && oLexer.peek(1) == '(') { + oLexer.next(2); + if (oLexer.peek() != ')') + throw new cException("XPST0003" + , "Expected ')' token in item type expression" + ); + oLexer.next(); + return new cItemType; + } + if (oExpr = fKindTest_parse(oLexer, oStaticContext)) + return new cItemType(oExpr); + if (oExpr = fAtomicType_parse(oLexer, oStaticContext)) + return new cItemType(oExpr); +}; + + +function cSequenceType(oItemType, sOccurence) { + this.itemType = oItemType || null; + this.occurence = sOccurence|| null; +}; + +cSequenceType.prototype.itemType = null; +cSequenceType.prototype.occurence = null; + +function fSequenceType_parse (oLexer, oStaticContext) { + if (oLexer.eof()) + return; + + if (oLexer.peek() == "empty-sequence" && oLexer.peek(1) == '(') { + oLexer.next(2); + if (oLexer.peek() != ')') + throw new cException("XPST0003" + , "Expected ')' token in sequence type" + ); + oLexer.next(); + return new cSequenceType; } + + var oExpr, + sOccurence; + if (!oLexer.eof() && (oExpr = fItemType_parse(oLexer, oStaticContext))) { + sOccurence = oLexer.peek(); + if (sOccurence == '?' || sOccurence == '*' || sOccurence == '+') + oLexer.next(); + else + sOccurence = null; + + return new cSequenceType(oExpr, sOccurence); + } +}; + + +function cSingleType(oItemType, sOccurence) { + this.itemType = oItemType || null; + this.occurence = sOccurence|| null; +}; + +cSingleType.prototype.itemType = null; +cSingleType.prototype.occurence = null; + +function fSingleType_parse (oLexer, oStaticContext) { + var oExpr, + sOccurence; + if (!oLexer.eof() && (oExpr = fAtomicType_parse(oLexer, oStaticContext))) { + sOccurence = oLexer.peek(); + if (sOccurence == '?') + oLexer.next(); + else + sOccurence = null; + + return new cSingleType(oExpr, sOccurence); + } +}; + + +function cXSAnyType() { + +}; + +cXSAnyType.prototype.builtInKind = cXSConstants.ANYTYPE_DT; + + +function cXSAnySimpleType() { + +}; + +cXSAnySimpleType.prototype = new cXSAnyType; + +cXSAnySimpleType.prototype.builtInKind = cXSConstants.ANYSIMPLETYPE_DT; +cXSAnySimpleType.prototype.primitiveKind= null; + +cXSAnySimpleType.PRIMITIVE_ANYURI = "anyURI"; cXSAnySimpleType.PRIMITIVE_BASE64BINARY = "base64Binary"; cXSAnySimpleType.PRIMITIVE_BOOLEAN = "boolean"; cXSAnySimpleType.PRIMITIVE_DATE = "date"; cXSAnySimpleType.PRIMITIVE_DATETIME = "dateTime"; cXSAnySimpleType.PRIMITIVE_DECIMAL = "decimal"; cXSAnySimpleType.PRIMITIVE_DOUBLE = "double"; cXSAnySimpleType.PRIMITIVE_DURATION = "duration"; cXSAnySimpleType.PRIMITIVE_FLOAT = "float"; cXSAnySimpleType.PRIMITIVE_GDAY = "gDay"; cXSAnySimpleType.PRIMITIVE_GMONTH = "gMonth"; cXSAnySimpleType.PRIMITIVE_GMONTHDAY = "gMonthDay"; cXSAnySimpleType.PRIMITIVE_GYEAR = "gYear"; cXSAnySimpleType.PRIMITIVE_GYEARMONTH = "gYearMonth"; cXSAnySimpleType.PRIMITIVE_HEXBINARY = "hexBinary"; cXSAnySimpleType.PRIMITIVE_NOTATION = "NOTATION"; cXSAnySimpleType.PRIMITIVE_QNAME = "QName"; cXSAnySimpleType.PRIMITIVE_STRING = "string"; cXSAnySimpleType.PRIMITIVE_TIME = "time"; + +function cXSAnyAtomicType() { + +}; + +cXSAnyAtomicType.prototype = new cXSAnySimpleType; +cXSAnyAtomicType.prototype.builtInKind = cXSConstants.ANYATOMICTYPE_DT; + +cXSAnyAtomicType.cast = function(vValue) { + throw new cException("XPST0017" + , "Abstract type used in constructor function xs:anyAtomicType" + ); }; + +function fXSAnyAtomicType_isNumeric(vItem) { + return vItem instanceof cXSFloat || vItem instanceof cXSDouble || vItem instanceof cXSDecimal; +}; + +fStaticContext_defineSystemDataType("anyAtomicType", cXSAnyAtomicType); + + +function cXSAnyURI(sScheme, sAuthority, sPath, sQuery, sFragment) { + this.scheme = sScheme; + this.authority = sAuthority; + this.path = sPath; + this.query = sQuery; + this.fragment = sFragment; +}; + +cXSAnyURI.prototype = new cXSAnyAtomicType; +cXSAnyURI.prototype.builtInKind = cXSConstants.ANYURI_DT; +cXSAnyURI.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_ANYURI; + +cXSAnyURI.prototype.scheme = null; +cXSAnyURI.prototype.authority = null; +cXSAnyURI.prototype.path = null; +cXSAnyURI.prototype.query = null; +cXSAnyURI.prototype.fragment = null; + +cXSAnyURI.prototype.toString = function() { + return (this.scheme ? this.scheme + ':' : '') + + (this.authority ? '/' + '/' + this.authority : '') + + (this.path ? this.path : '') + + (this.query ? '?' + this.query : '') + + (this.fragment ? '#' + this.fragment : ''); +}; + +var rXSAnyURI = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; cXSAnyURI.cast = function(vValue) { + if (vValue instanceof cXSAnyURI) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch; + if (aMatch = fString_trim(vValue).match(rXSAnyURI)) + return new cXSAnyURI(aMatch[2], aMatch[4], aMatch[5], aMatch[7], aMatch[9]); + throw new cException("FORG0001"); + } + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:anyURI can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("anyURI", cXSAnyURI); + + +function cXSBase64Binary(sValue) { + this.value = sValue; +}; + +cXSBase64Binary.prototype = new cXSAnyAtomicType; +cXSBase64Binary.prototype.builtInKind = cXSConstants.BASE64BINARY_DT; +cXSBase64Binary.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_BASE64BINARY; + +cXSBase64Binary.prototype.value = null; + +cXSBase64Binary.prototype.valueOf = function() { + return this.value; +}; + +cXSBase64Binary.prototype.toString = function() { + return this.value; +}; + +var rXSBase64Binary = /^((([A-Za-z0-9+\/]\s*){4})*(([A-Za-z0-9+\/]\s*){3}[A-Za-z0-9+\/]|([A-Za-z0-9+\/]\s*){2}[AEIMQUYcgkosw048]\s*=|[A-Za-z0-9+\/]\s*[AQgw]\s*=\s*=))?$/; +cXSBase64Binary.cast = function(vValue) { + if (vValue instanceof cXSBase64Binary) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSBase64Binary); + if (aMatch) + return new cXSBase64Binary(aMatch[0]); + throw new cException("FORG0001"); + } + if (vValue instanceof cXSHexBinary) { + var aMatch = vValue.valueOf().match(/.{2}/g), + aValue = []; + for (var nIndex = 0, nLength = aMatch.length; nIndex < nLength; nIndex++) + aValue.push(cString.fromCharCode(fWindow_parseInt(aMatch[nIndex], 16))); + return new cXSBase64Binary(fWindow_btoa(aValue.join(''))); + } + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:hexBinary can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("base64Binary", cXSBase64Binary); + + +function cXSBoolean(bValue) { + this.value = bValue; +}; + +cXSBoolean.prototype = new cXSAnyAtomicType; +cXSBoolean.prototype.builtInKind = cXSConstants.BOOLEAN_DT; +cXSBoolean.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_BOOLEAN; + +cXSBoolean.prototype.value = null; + +cXSBoolean.prototype.valueOf = function() { + return this.value; +}; + +cXSBoolean.prototype.toString = function() { + return cString(this.value); +}; + +var rXSBoolean = /^(0|1|true|false)$/; +cXSBoolean.cast = function(vValue) { + if (vValue instanceof cXSBoolean) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch; + if (aMatch = fString_trim(vValue).match(rXSBoolean)) + return new cXSBoolean(aMatch[1] == '1' || aMatch[1] == "true"); + throw new cException("FORG0001"); + } + if (fXSAnyAtomicType_isNumeric(vValue)) + return new cXSBoolean(vValue != 0); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:boolean can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("boolean", cXSBoolean); + + +function cXSDate(nYear, nMonth, nDay, nTimezone, bNegative) { + this.year = nYear; + this.month = nMonth; + this.day = nDay; + this.timezone = nTimezone; + this.negative = bNegative; +}; + +cXSDate.prototype = new cXSAnyAtomicType; +cXSDate.prototype.builtInKind = cXSConstants.DATE_DT; +cXSDate.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_DATE; + +cXSDate.prototype.year = null; +cXSDate.prototype.month = null; +cXSDate.prototype.day = null; +cXSDate.prototype.timezone = null; +cXSDate.prototype.negative = null; + +cXSDate.prototype.toString = function() { + return fXSDateTime_getDateComponent(this) + + fXSDateTime_getTZComponent(this); +}; + +var rXSDate = /^(-?)([1-9]\d\d\d+|0\d\d\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])(Z|([+\-])(0\d|1[0-4]):([0-5]\d))?$/; +cXSDate.cast = function(vValue) { + if (vValue instanceof cXSDate) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSDate); + if (aMatch) { + var nYear = +aMatch[2], + nMonth = +aMatch[3], + nDay = +aMatch[4]; + if (nDay - 1 < fXSDate_getDaysForYearMonth(nYear, nMonth)) + return new cXSDate( nYear, + nMonth, + nDay, + aMatch[5] ? aMatch[5] == 'Z' ? 0 : (aMatch[6] == '-' ? -1 : 1) * (aMatch[7] * 60 + aMatch[8] * 1) : null, + aMatch[1] == '-' + ); + throw new cException("FORG0001" + , "Invalid date '" + vValue + "' (Non-existent date)" + ); + } + throw new cException("FORG0001"); + } + if (vValue instanceof cXSDateTime) + return new cXSDate(vValue.year, vValue.month, vValue.day, vValue.timezone, vValue.negative); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:date can never succeed" + ); +}; + +var aXSDate_days = [31,28,31,30,31,30,31,31,30,31,30,31]; +function fXSDate_getDaysForYearMonth(nYear, nMonth) { + return nMonth == 2 && (nYear % 400 == 0 || nYear % 100 != 0 && nYear % 4 == 0) ? 29 : aXSDate_days[nMonth - 1]; +}; + +function fXSDate_normalize(oValue, bDay) { + if (!bDay) { + var nDay = fXSDate_getDaysForYearMonth(oValue.year, oValue.month); + if (oValue.day > nDay) { + while (oValue.day > nDay) { + oValue.month += 1; + if (oValue.month > 12) { + oValue.year += 1; + if (oValue.year == 0) + oValue.year = 1; + oValue.month = 1; + } + oValue.day -= nDay; + nDay = fXSDate_getDaysForYearMonth(oValue.year, oValue.month); + } + } + else + if (oValue.day < 1) { + while (oValue.day < 1) { + oValue.month -= 1; + if (oValue.month < 1) { + oValue.year -= 1; + if (oValue.year == 0) + oValue.year =-1; + oValue.month = 12; + } + nDay = fXSDate_getDaysForYearMonth(oValue.year, oValue.month); + oValue.day += nDay; + } + } + } + if (oValue.month > 12) { + oValue.year += ~~(oValue.month / 12); + if (oValue.year == 0) + oValue.year = 1; + oValue.month = oValue.month % 12; + } + else + if (oValue.month < 1) { + oValue.year += ~~(oValue.month / 12) - 1; + if (oValue.year == 0) + oValue.year =-1; + oValue.month = oValue.month % 12 + 12; + } + + return oValue; +}; + +fStaticContext_defineSystemDataType("date", cXSDate); + + +function cXSDateTime(nYear, nMonth, nDay, nHours, nMinutes, nSeconds, nTimezone, bNegative) { + this.year = nYear; + this.month = nMonth; + this.day = nDay; + this.hours = nHours; + this.minutes = nMinutes; + this.seconds = nSeconds; + this.timezone = nTimezone; + this.negative = bNegative; +}; + +cXSDateTime.prototype = new cXSAnyAtomicType; +cXSDateTime.prototype.builtInKind = cXSConstants.DATETIME_DT; +cXSDateTime.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_DATETIME; + +cXSDateTime.prototype.year = null; +cXSDateTime.prototype.month = null; +cXSDateTime.prototype.day = null; +cXSDateTime.prototype.hours = null; +cXSDateTime.prototype.minutes = null; +cXSDateTime.prototype.seconds = null; +cXSDateTime.prototype.timezone = null; +cXSDateTime.prototype.negative = null; + +cXSDateTime.prototype.toString = function() { + return fXSDateTime_getDateComponent(this) + + 'T' + + fXSDateTime_getTimeComponent(this) + + fXSDateTime_getTZComponent(this); +}; + +var rXSDateTime = /^(-?)([1-9]\d\d\d+|0\d\d\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])T(([01]\d|2[0-3]):([0-5]\d):([0-5]\d)(?:\.(\d+))?|(24:00:00)(?:\.(0+))?)(Z|([+\-])(0\d|1[0-4]):([0-5]\d))?$/; +cXSDateTime.cast = function(vValue) { + if (vValue instanceof cXSDateTime) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSDateTime); + if (aMatch) { + var nYear = +aMatch[2], + nMonth = +aMatch[3], + nDay = +aMatch[4], + bValue = !!aMatch[10]; + if (nDay - 1 < fXSDate_getDaysForYearMonth(nYear, nMonth)) + return fXSDateTime_normalize(new cXSDateTime( nYear, + nMonth, + nDay, + bValue ? 24 : +aMatch[6], + bValue ? 0 : +aMatch[7], + cNumber((bValue ? 0 : aMatch[8]) + '.' + (bValue ? 0 : aMatch[9] || 0)), + aMatch[12] ? aMatch[12] == 'Z' ? 0 : (aMatch[13] == '-' ? -1 : 1) * (aMatch[14] * 60 + aMatch[15] * 1) : null, + aMatch[1] == '-' + )); + throw new cException("FORG0001" + , "Invalid date '" + vValue + "' (Non-existent date)" + ); + } + throw new cException("FORG0001"); + } + if (vValue instanceof cXSDate) + return new cXSDateTime(vValue.year, vValue.month, vValue.day, 0, 0, 0, vValue.timezone, vValue.negative); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:dateTime can never succeed" + ); +}; + +function fXSDateTime_pad(vValue, nLength) { + var sValue = cString(vValue); + if (arguments.length < 2) + nLength = 2; + return (sValue.length < nLength + 1 ? new cArray(nLength + 1 - sValue.length).join('0') : '') + sValue; +}; + +function fXSDateTime_getTZComponent(oDateTime) { + var nTimezone = oDateTime.timezone; + return nTimezone == null + ? '' + : nTimezone + ? (nTimezone > 0 ? '+' : '-') + + fXSDateTime_pad(cMath.abs(~~(nTimezone / 60))) + + ':' + + fXSDateTime_pad(cMath.abs(nTimezone % 60)) + : 'Z'; +}; + +function fXSDateTime_getDateComponent(oDateTime) { + return (oDateTime.negative ? '-' : '') + + fXSDateTime_pad(oDateTime.year, 4) + + '-' + fXSDateTime_pad(oDateTime.month) + + '-' + fXSDateTime_pad(oDateTime.day); +}; + +function fXSDateTime_getTimeComponent(oDateTime) { + var aValue = cString(oDateTime.seconds).split('.'); + return fXSDateTime_pad(oDateTime.hours) + + ':' + fXSDateTime_pad(oDateTime.minutes) + + ':' + fXSDateTime_pad(aValue[0]) + + (aValue.length > 1 ? '.' + aValue[1] : ''); +}; + +function fXSDateTime_normalize(oValue) { + return fXSDate_normalize(fXSTime_normalize(oValue)); +}; + +fStaticContext_defineSystemDataType("dateTime", cXSDateTime); + + +function cXSDecimal(nValue) { + this.value = nValue; +}; + +cXSDecimal.prototype = new cXSAnyAtomicType; +cXSDecimal.prototype.builtInKind = cXSConstants.DECIMAL_DT; +cXSDecimal.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_DECIMAL; + +cXSDecimal.prototype.value = null; + +cXSDecimal.prototype.valueOf = function() { + return this.value; +}; + +cXSDecimal.prototype.toString = function() { + return cString(this.value); +}; + +var rXSDecimal = /^[+\-]?((\d+(\.\d*)?)|(\.\d+))$/; +cXSDecimal.cast = function(vValue) { + if (vValue instanceof cXSDecimal) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSDecimal); + if (aMatch) + return new cXSDecimal(+vValue); + throw new cException("FORG0001"); + } + if (vValue instanceof cXSBoolean) + return new cXSDecimal(vValue * 1); + if (fXSAnyAtomicType_isNumeric(vValue)) { + if (fIsNaN(vValue) || !fIsFinite(vValue)) + throw new cException("FOCA0002" + , "Cannot convert '" + vValue + "' to xs:decimal" + ); + return new cXSDecimal(+vValue); + } + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:decimal can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("decimal", cXSDecimal); + + +function cXSDouble(nValue) { + this.value = nValue; +}; + +cXSDouble.prototype = new cXSAnyAtomicType; +cXSDouble.prototype.builtInKind = cXSConstants.DOUBLE_DT; +cXSDouble.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_DOUBLE; + +cXSDouble.prototype.value = null; + +cXSDouble.prototype.valueOf = function() { + return this.value; +}; + +cXSDouble.prototype.toString = function() { + return cString(this.value); +}; + +var rXSDouble = /^([+\-]?((\d+(\.\d*)?)|(\.\d+))([eE][+\-]?\d+)?|(-?INF)|NaN)$/; +cXSDouble.cast = function(vValue) { + if (vValue instanceof cXSDouble) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSDouble); + if (aMatch) + return new cXSDouble(aMatch[7] ? +aMatch[7].replace("INF", "Infinity") : +vValue); + throw new cException("FORG0001"); + } + if (vValue instanceof cXSBoolean) + return new cXSDouble(vValue * 1); + if (fXSAnyAtomicType_isNumeric(vValue)) + return new cXSDouble(vValue.value); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:double can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("double", cXSDouble); + + +function cXSDuration(nYear, nMonth, nDay, nHours, nMinutes, nSeconds, bNegative) { + this.year = nYear; + this.month = nMonth; + this.day = nDay; + this.hours = nHours; + this.minutes = nMinutes; + this.seconds = nSeconds; + this.negative = bNegative; +}; + +cXSDuration.prototype = new cXSAnyAtomicType; +cXSDuration.prototype.builtInKind = cXSConstants.DURATION_DT; +cXSDuration.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_DURATION; + +cXSDuration.prototype.year = null; +cXSDuration.prototype.month = null; +cXSDuration.prototype.day = null; +cXSDuration.prototype.hours = null; +cXSDuration.prototype.minutes = null; +cXSDuration.prototype.seconds = null; +cXSDuration.prototype.negative = null; + +cXSDuration.prototype.toString = function() { + return (this.negative ? '-' : '') + 'P' + + ((fXSDuration_getYearMonthComponent(this) + fXSDuration_getDayTimeComponent(this)) || 'T0S'); +}; + +var rXSDuration = /^(-)?P(?:([0-9]+)Y)?(?:([0-9]+)M)?(?:([0-9]+)D)?(?:T(?:([0-9]+)H)?(?:([0-9]+)M)?(?:((?:(?:[0-9]+(?:.[0-9]*)?)|(?:.[0-9]+)))S)?)?$/; +cXSDuration.cast = function(vValue) { + if (vValue instanceof cXSYearMonthDuration) + return new cXSDuration(vValue.year, vValue.month, 0, 0, 0, 0, vValue.negative); + if (vValue instanceof cXSDayTimeDuration) + return new cXSDuration(0, 0, vValue.day, vValue.hours, vValue.minutes, vValue.seconds, vValue.negative); + if (vValue instanceof cXSDuration) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSDuration); + if (aMatch) + return fXSDuration_normalize(new cXSDuration(+aMatch[2] || 0, +aMatch[3] || 0, +aMatch[4] || 0, +aMatch[5] || 0, +aMatch[6] || 0, +aMatch[7] || 0, aMatch[1] == '-')); + throw new cException("FORG0001"); + } + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:duration can never succeed" + ); +}; + +function fXSDuration_getYearMonthComponent(oDuration) { + return (oDuration.year ? oDuration.year + 'Y' : '') + + (oDuration.month ? oDuration.month + 'M' : ''); +}; + +function fXSDuration_getDayTimeComponent(oDuration) { + return (oDuration.day ? oDuration.day + 'D' : '') + + (oDuration.hours || oDuration.minutes || oDuration.seconds + ? 'T' + + (oDuration.hours ? oDuration.hours + 'H' : '') + + (oDuration.minutes ? oDuration.minutes + 'M' : '') + + (oDuration.seconds ? oDuration.seconds + 'S' : '') + : ''); +}; + +function fXSDuration_normalize(oDuration) { + return fXSYearMonthDuration_normalize(fXSDayTimeDuration_normalize(oDuration)); +}; + +fStaticContext_defineSystemDataType("duration", cXSDuration); + + +function cXSFloat(nValue) { + this.value = nValue; +}; + +cXSFloat.prototype = new cXSAnyAtomicType; +cXSFloat.prototype.builtInKind = cXSConstants.FLOAT_DT; +cXSFloat.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_FLOAT; + +cXSFloat.prototype.value = null; + +cXSFloat.prototype.valueOf = function() { + return this.value; +}; + +cXSFloat.prototype.toString = function() { + return cString(this.value); +}; + +var rXSFloat = /^([+\-]?((\d+(\.\d*)?)|(\.\d+))([eE][+\-]?\d+)?|(-?INF)|NaN)$/; +cXSFloat.cast = function(vValue) { + if (vValue instanceof cXSFloat) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSFloat); + if (aMatch) + return new cXSFloat(aMatch[7] ? +aMatch[7].replace("INF", "Infinity") : +vValue); + throw new cException("FORG0001"); + } + if (vValue instanceof cXSBoolean) + return new cXSFloat(vValue * 1); + if (fXSAnyAtomicType_isNumeric(vValue)) + return new cXSFloat(vValue.value); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:float can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("float", cXSFloat); + + +function cXSGDay(nDay, nTimezone) { + this.day = nDay; + this.timezone = nTimezone; +}; + +cXSGDay.prototype = new cXSAnyAtomicType; +cXSGDay.prototype.builtInKind = cXSConstants.GDAY_DT; +cXSGDay.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_GDAY; + +cXSGDay.prototype.day = null; +cXSGDay.prototype.timezone = null; + +cXSGDay.prototype.toString = function() { + return '-' + + '-' + + '-' + fXSDateTime_pad(this.day) + + fXSDateTime_getTZComponent(this); +}; + +var rXSGDay = /^---(0[1-9]|[12]\d|3[01])(Z|([+\-])(0\d|1[0-4]):([0-5]\d))?$/; +cXSGDay.cast = function(vValue) { + if (vValue instanceof cXSGDay) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSGDay); + if (aMatch) { + var nDay = +aMatch[1]; + return new cXSGDay( nDay, + aMatch[2] ? aMatch[2] == 'Z' ? 0 : (aMatch[3] == '-' ? -1 : 1) * (aMatch[4] * 60 + aMatch[5] * 1) : null + ); + } + throw new cException("FORG0001"); + } + if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) + return new cXSGDay(vValue.day, vValue.timezone); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:gDay can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("gDay", cXSGDay); + + +function cXSGMonth(nMonth, nTimezone) { + this.month = nMonth; + this.timezone = nTimezone; +}; + +cXSGMonth.prototype = new cXSAnyAtomicType; +cXSGMonth.prototype.builtInKind = cXSConstants.GMONTH_DT; +cXSGMonth.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_GMONTH; + +cXSGMonth.prototype.month = null; +cXSGMonth.prototype.timezone = null; + +cXSGMonth.prototype.toString = function() { + return '-' + + '-' + fXSDateTime_pad(this.month) + + fXSDateTime_getTZComponent(this); +}; + +var rXSGMonth = /^--(0[1-9]|1[0-2])(Z|([+\-])(0\d|1[0-4]):([0-5]\d))?$/; +cXSGMonth.cast = function(vValue) { + if (vValue instanceof cXSGMonth) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSGMonth); + if (aMatch) { + var nMonth = +aMatch[1]; + return new cXSGMonth( nMonth, + aMatch[2] ? aMatch[2] == 'Z' ? 0 : (aMatch[3] == '-' ? -1 : 1) * (aMatch[4] * 60 + aMatch[5] * 1) : null + ); + } + throw new cException("FORG0001"); + } + if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) + return new cXSGMonth(vValue.month, vValue.timezone); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:gMonth can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("gMonth", cXSGMonth); + + +function cXSGMonthDay(nMonth, nDay, nTimezone) { + this.month = nMonth; + this.day = nDay; + this.timezone = nTimezone; +}; + +cXSGMonthDay.prototype = new cXSAnyAtomicType; +cXSGMonthDay.prototype.builtInKind = cXSConstants.GMONTHDAY_DT; +cXSGMonthDay.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_GMONTHDAY; + +cXSGMonthDay.prototype.month = null; +cXSGMonthDay.prototype.day = null; +cXSGMonthDay.prototype.timezone = null; + +cXSGMonthDay.prototype.toString = function() { + return '-' + + '-' + fXSDateTime_pad(this.month) + + '-' + fXSDateTime_pad(this.day) + + fXSDateTime_getTZComponent(this); +}; + +var rXSGMonthDay = /^--(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])(Z|([+\-])(0\d|1[0-4]):([0-5]\d))?$/; +cXSGMonthDay.cast = function(vValue) { + if (vValue instanceof cXSGMonthDay) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSGMonthDay); + if (aMatch) { + var nMonth = +aMatch[1], + nDay = +aMatch[2]; + if (nDay - 1 < fXSDate_getDaysForYearMonth(1976, nMonth)) + return new cXSGMonthDay( nMonth, + nDay, + aMatch[3] ? aMatch[3] == 'Z' ? 0 : (aMatch[4] == '-' ? -1 : 1) * (aMatch[5] * 60 + aMatch[6] * 1) : null + ); + throw new cException("FORG0001" + , "Invalid date '" + vValue + "' (Non-existent date)" + ); + } + throw new cException("FORG0001"); + } + if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) + return new cXSGMonthDay(vValue.month, vValue.day, vValue.timezone); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:gMonthDay can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("gMonthDay", cXSGMonthDay); + + +function cXSGYear(nYear, nTimezone) { + this.year = nYear; + this.timezone = nTimezone; +}; + +cXSGYear.prototype = new cXSAnyAtomicType; +cXSGYear.prototype.builtInKind = cXSConstants.GYEAR_DT; +cXSGYear.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_GYEAR; + +cXSGYear.prototype.year = null; +cXSGYear.prototype.timezone = null; + +cXSGYear.prototype.toString = function() { + return fXSDateTime_pad(this.year) + + fXSDateTime_getTZComponent(this); +}; + +var rXSGYear = /^-?([1-9]\d\d\d+|0\d\d\d)(Z|([+\-])(0\d|1[0-4]):([0-5]\d))?$/; +cXSGYear.cast = function(vValue) { + if (vValue instanceof cXSGYear) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSGYear); + if (aMatch) { + var nYear = +aMatch[1]; + return new cXSGYear( nYear, + aMatch[2] ? aMatch[2] == 'Z' ? 0 : (aMatch[3] == '-' ? -1 : 1) * (aMatch[4] * 60 + aMatch[5] * 1) : null + ); + } + throw new cException("FORG0001"); + } + if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) + return new cXSGYear(vValue.year, vValue.timezone); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:gYear can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("gYear", cXSGYear); + + +function cXSGYearMonth(nYear, nMonth, nTimezone) { + this.year = nYear; + this.month = nMonth; + this.timezone = nTimezone; +}; + +cXSGYearMonth.prototype = new cXSAnyAtomicType; +cXSGYearMonth.prototype.builtInKind = cXSConstants.GYEARMONTH_DT; +cXSGYearMonth.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_GYEARMONTH; + +cXSGYearMonth.prototype.year = null; +cXSGYearMonth.prototype.month = null; +cXSGYearMonth.prototype.timezone= null; + +cXSGYearMonth.prototype.toString = function() { + return fXSDateTime_pad(this.year) + + '-' + fXSDateTime_pad(this.month) + + fXSDateTime_getTZComponent(this); +}; + +var rXSGYearMonth = /^-?([1-9]\d\d\d+|0\d\d\d)-(0[1-9]|1[0-2])(Z|([+\-])(0\d|1[0-4]):([0-5]\d))?$/; +cXSGYearMonth.cast = function(vValue) { + if (vValue instanceof cXSGYearMonth) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSGYearMonth); + if (aMatch) { + var nYear = +aMatch[1], + nMonth = +aMatch[2]; + return new cXSGYearMonth( nYear, + nMonth, + aMatch[3] ? aMatch[3] == 'Z' ? 0 : (aMatch[4] == '-' ? -1 : 1) * (aMatch[5] * 60 + aMatch[6] * 1) : null + ); + } + throw new cException("FORG0001"); + } + if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) + return new cXSGYearMonth(vValue.year, vValue.month, vValue.timezone); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:gYearMonth can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("gYearMonth", cXSGYearMonth); + + +function cXSHexBinary(sValue) { + this.value = sValue; +}; + +cXSHexBinary.prototype = new cXSAnyAtomicType; +cXSHexBinary.prototype.builtInKind = cXSConstants.HEXBINARY_DT; +cXSHexBinary.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_HEXBINARY; + +cXSHexBinary.prototype.value = null; + +cXSHexBinary.prototype.valueOf = function() { + return this.value; +}; + +cXSHexBinary.prototype.toString = function() { + return this.value; +}; + +var rXSHexBinary = /^([0-9a-fA-F]{2})*$/; +cXSHexBinary.cast = function(vValue) { + if (vValue instanceof cXSHexBinary) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSHexBinary); + if (aMatch) + return new cXSHexBinary(aMatch[0].toUpperCase()); + throw new cException("FORG0001"); + } + if (vValue instanceof cXSBase64Binary) { + var sValue = fWindow_atob(vValue.valueOf()), + aValue = []; + for (var nIndex = 0, nLength = sValue.length, sLetter; nIndex < nLength; nIndex++) { + sLetter = sValue.charCodeAt(nIndex).toString(16); + aValue.push(new cArray(3 - sLetter.length).join('0') + sLetter); + } + return new cXSHexBinary(aValue.join('')); + } + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:hexBinary can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("hexBinary", cXSHexBinary); + + +function cXSNOTATION() { + +}; + +cXSNOTATION.prototype = new cXSAnyAtomicType; +cXSNOTATION.prototype.builtInKind = cXSConstants.NOTATION_DT; +cXSNOTATION.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_NOTATION; + +cXSNOTATION.cast = function(vValue) { + throw new cException("XPST0017" + , "Abstract type used in constructor function xs:NOTATION" + ); }; + +fStaticContext_defineSystemDataType("NOTATION", cXSNOTATION); + + + +function cXSQName(sPrefix, sLocalName, sNameSpaceURI) { + this.prefix = sPrefix; + this.localName = sLocalName; + this.namespaceURI = sNameSpaceURI; +}; + +cXSQName.prototype = new cXSAnyAtomicType; +cXSQName.prototype.builtInKind = cXSConstants.QNAME_DT; +cXSQName.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_QNAME; + +cXSQName.prototype.prefix = null; +cXSQName.prototype.localName = null; +cXSQName.prototype.namespaceURI = null; + +cXSQName.prototype.toString = function() { + return (this.prefix ? this.prefix + ':' : '') + this.localName; +}; + +var rXSQName = /^(?:(?![0-9-])([\w-]+)\:)?(?![0-9-])([\w-]+)$/; +cXSQName.cast = function(vValue) { + if (vValue instanceof cXSQName) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSQName); + if (aMatch) + return new cXSQName(aMatch[1] || null, aMatch[2], null); + throw new cException("FORG0001"); + } + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:QName can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("QName", cXSQName); + + +function cXSString(sValue) { + this.value = sValue; +}; + +cXSString.prototype = new cXSAnyAtomicType; + +cXSString.prototype.value = null; +cXSString.prototype.builtInKind = cXSConstants.STRING_DT; +cXSString.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_STRING; + +cXSString.prototype.valueOf = function() { + return this.value; +}; + +cXSString.prototype.toString = function() { + return this.value; +}; + +cXSString.cast = function(vValue) { + return new cXSString(cString(vValue)); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:string can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("string", cXSString); + + +function cXSTime(nHours, nMinutes, nSeconds, nTimezone) { + this.hours = nHours; + this.minutes = nMinutes; + this.seconds = nSeconds; + this.timezone = nTimezone; +}; + +cXSTime.prototype = new cXSAnyAtomicType; +cXSTime.prototype.builtInKind = cXSConstants.TIME_DT; +cXSTime.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_TIME; + +cXSTime.prototype.hours = null; +cXSTime.prototype.minutes = null; +cXSTime.prototype.seconds = null; +cXSTime.prototype.timezone = null; + +cXSTime.prototype.toString = function() { + return fXSDateTime_getTimeComponent(this) + + fXSDateTime_getTZComponent(this); +}; + +var rXSTime = /^(([01]\d|2[0-3]):([0-5]\d):([0-5]\d)(?:\.(\d+))?|(24:00:00)(?:\.(0+))?)(Z|([+\-])(0\d|1[0-4]):([0-5]\d))?$/; +cXSTime.cast = function(vValue) { + if (vValue instanceof cXSTime) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSTime); + if (aMatch) { + var bValue = !!aMatch[6]; + return new cXSTime(bValue ? 0 : +aMatch[2], + bValue ? 0 : +aMatch[3], + cNumber((bValue ? 0 : aMatch[4]) + '.' + (bValue ? 0 : aMatch[5] || 0)), + aMatch[8] ? aMatch[8] == 'Z' ? 0 : (aMatch[9] == '-' ? -1 : 1) * (aMatch[10] * 60 + aMatch[11] * 1) : null + ); + } + throw new cException("FORG0001"); + } + if (vValue instanceof cXSDateTime) + return new cXSTime(vValue.hours, vValue.minutes, vValue.seconds, vValue.timezone); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:time can never succeed" + ); +}; + +function fXSTime_normalize(oValue) { + if (oValue.seconds >= 60 || oValue.seconds < 0) { + oValue.minutes += ~~(oValue.seconds / 60) - (oValue.seconds < 0 && oValue.seconds % 60 ? 1 : 0); + oValue.seconds = oValue.seconds % 60 + (oValue.seconds < 0 && oValue.seconds % 60 ? 60 : 0); + } + if (oValue.minutes >= 60 || oValue.minutes < 0) { + oValue.hours += ~~(oValue.minutes / 60) - (oValue.minutes < 0 && oValue.minutes % 60 ? 1 : 0); + oValue.minutes = oValue.minutes % 60 + (oValue.minutes < 0 && oValue.minutes % 60 ? 60 : 0); + } + if (oValue.hours >= 24 || oValue.hours < 0) { + if (oValue instanceof cXSDateTime) + oValue.day += ~~(oValue.hours / 24) - (oValue.hours < 0 && oValue.hours % 24 ? 1 : 0); + oValue.hours = oValue.hours % 24 + (oValue.hours < 0 && oValue.hours % 24 ? 24 : 0); + } + return oValue; +}; + +fStaticContext_defineSystemDataType("time", cXSTime); + + +function cXSUntypedAtomic(sValue) { + this.value = sValue; +}; + +cXSUntypedAtomic.prototype = new cXSAnyAtomicType; +cXSUntypedAtomic.prototype.builtInKind = cXSConstants.XT_UNTYPEDATOMIC_DT; + +cXSUntypedAtomic.prototype.toString = function() { + return cString(this.value); +}; + +cXSUntypedAtomic.cast = function(vValue) { + if (vValue instanceof cXSUntypedAtomic) + return vValue; + + return new cXSUntypedAtomic(cString(vValue)); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:untypedAtomic can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("untypedAtomic", cXSUntypedAtomic); + + +function cXSYearMonthDuration(nYear, nMonth, bNegative) { + cXSDuration.call(this, nYear, nMonth, 0, 0, 0, 0, bNegative); +}; + +cXSYearMonthDuration.prototype = new cXSDuration; +cXSYearMonthDuration.prototype.builtInKind = cXSConstants.XT_YEARMONTHDURATION_DT; + +cXSYearMonthDuration.prototype.toString = function() { + return (this.negative ? '-' : '') + 'P' + + (fXSDuration_getYearMonthComponent(this) || '0M'); +}; + +var rXSYearMonthDuration = /^(-)?P(?:([0-9]+)Y)?(?:([0-9]+)M)?$/; +cXSYearMonthDuration.cast = function(vValue) { + if (vValue instanceof cXSYearMonthDuration) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSYearMonthDuration); + if (aMatch) + return fXSYearMonthDuration_normalize(new cXSYearMonthDuration(+aMatch[2] || 0, +aMatch[3] || 0, aMatch[1] == '-')); + throw new cException("FORG0001"); + } + if (vValue instanceof cXSDayTimeDuration) + return new cXSYearMonthDuration(0, 0); + if (vValue instanceof cXSDuration) + return new cXSYearMonthDuration(vValue.year, vValue.month, vValue.negative); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:yearMonthDuration can never succeed" + ); +}; + +function fXSYearMonthDuration_normalize(oDuration) { + if (oDuration.month >= 12) { + oDuration.year += ~~(oDuration.month / 12); + oDuration.month %= 12; + } + return oDuration; +}; + +fStaticContext_defineSystemDataType("yearMonthDuration", cXSYearMonthDuration); + + +function cXSDayTimeDuration(nDay, nHours, nMinutes, nSeconds, bNegative) { + cXSDuration.call(this, 0, 0, nDay, nHours, nMinutes, nSeconds, bNegative); +}; + +cXSDayTimeDuration.prototype = new cXSDuration; +cXSDayTimeDuration.prototype.builtInKind = cXSConstants.DAYTIMEDURATION_DT; + +cXSDayTimeDuration.prototype.toString = function() { + return (this.negative ? '-' : '') + 'P' + + (fXSDuration_getDayTimeComponent(this) || 'T0S'); +}; + +var rXSDayTimeDuration = /^(-)?P(?:([0-9]+)D)?(?:T(?:([0-9]+)H)?(?:([0-9]+)M)?(?:((?:(?:[0-9]+(?:.[0-9]*)?)|(?:.[0-9]+)))S)?)?$/; +cXSDayTimeDuration.cast = function(vValue) { + if (vValue instanceof cXSDayTimeDuration) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSDayTimeDuration); + if (aMatch) + return fXSDayTimeDuration_normalize(new cXSDayTimeDuration(+aMatch[2] || 0, +aMatch[3] || 0, +aMatch[4] || 0, +aMatch[5] || 0, aMatch[1] == '-')); + throw new cException("FORG0001"); + } + if (vValue instanceof cXSYearMonthDuration) + return new cXSDayTimeDuration(0, 0, 0, 0); + if (vValue instanceof cXSDuration) + return new cXSDayTimeDuration(vValue.day, vValue.hours, vValue.minutes, vValue.seconds, vValue.negative); + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:dayTimeDuration can never succeed" + ); +}; + +function fXSDayTimeDuration_normalize(oDuration) { + if (oDuration.seconds >= 60) { + oDuration.minutes += ~~(oDuration.seconds / 60); + oDuration.seconds %= 60; + } + if (oDuration.minutes >= 60) { + oDuration.hours += ~~(oDuration.minutes / 60); + oDuration.minutes %= 60; + } + if (oDuration.hours >= 24) { + oDuration.day += ~~(oDuration.hours / 24); + oDuration.hours %= 24; + } + return oDuration; +}; + +fStaticContext_defineSystemDataType("dayTimeDuration", cXSDayTimeDuration); + + +function cXSInteger(nValue) { + this.value = nValue; +}; + +cXSInteger.prototype = new cXSDecimal; +cXSInteger.prototype.builtInKind = cXSConstants.INTEGER_DT; + +var rXSInteger = /^[-+]?[0-9]+$/; +cXSInteger.cast = function(vValue) { + if (vValue instanceof cXSInteger) + return vValue; + if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { + var aMatch = fString_trim(vValue).match(rXSInteger); + if (aMatch) + return new cXSInteger(~~vValue); + throw new cException("FORG0001"); + } + if (vValue instanceof cXSBoolean) + return new cXSInteger(vValue * 1); + if (fXSAnyAtomicType_isNumeric(vValue)) { + if (fIsNaN(vValue) || !fIsFinite(vValue)) + throw new cException("FOCA0002" + , "Cannot convert '" + vValue + "' to xs:integer" + ); + return new cXSInteger(~~vValue); + } + throw new cException("XPTY0004" + , "Casting value '" + vValue + "' to xs:integer can never succeed" + ); +}; + +fStaticContext_defineSystemDataType("integer", cXSInteger); + + +function cXSNonPositiveInteger(nValue) { + this.value = nValue; +}; + +cXSNonPositiveInteger.prototype = new cXSInteger; +cXSNonPositiveInteger.prototype.builtInKind = cXSConstants.NONPOSITIVEINTEGER_DT; + +cXSNonPositiveInteger.cast = function(vValue) { + return new cXSNonPositiveInteger(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("nonPositiveInteger", cXSNonPositiveInteger); + + +function cXSNegativeInteger(nValue) { + this.value = nValue; +}; + +cXSNegativeInteger.prototype = new cXSNonPositiveInteger; +cXSNegativeInteger.prototype.builtInKind = cXSConstants.NEGATIVEINTEGER_DT; + +cXSNegativeInteger.cast = function(vValue) { + return new cXSNegativeInteger(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("negativeInteger", cXSNegativeInteger); + + +function cXSLong(nValue) { + this.value = nValue; +}; + +cXSLong.prototype = new cXSInteger; +cXSLong.prototype.builtInKind = cXSConstants.LONG_DT; + +cXSLong.cast = function(vValue) { + return new cXSLong(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("long", cXSLong); + + +function cXSInt(nValue) { + this.value = nValue; +}; + +cXSInt.prototype = new cXSLong; +cXSInt.prototype.builtInKind = cXSConstants.INT_DT; + +cXSInt.cast = function(vValue) { + return new cXSInt(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("int", cXSInt); + + +function cXSShort(nValue) { + this.value = nValue; +}; + +cXSShort.prototype = new cXSInt; +cXSShort.prototype.builtInKind = cXSConstants.SHORT_DT; + +cXSShort.cast = function(vValue) { + return new cXSShort(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("short", cXSShort); + + +function cXSByte(nValue) { + this.value = nValue; +}; + +cXSByte.prototype = new cXSShort; +cXSByte.prototype.builtInKind = cXSConstants.BYTE_DT; + +cXSByte.cast = function(vValue) { + return new cXSByte(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("byte", cXSByte); + + +function cXSNonNegativeInteger(nValue) { + this.value = nValue; +}; + +cXSNonNegativeInteger.prototype = new cXSInteger; +cXSNonNegativeInteger.prototype.builtInKind = cXSConstants.NONNEGATIVEINTEGER_DT; + +cXSNonNegativeInteger.cast = function(vValue) { + return new cXSNonNegativeInteger(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("nonNegativeInteger", cXSNonNegativeInteger); + + +function cXSPositiveInteger(nValue) { + this.value = nValue; +}; + +cXSPositiveInteger.prototype = new cXSNonNegativeInteger; +cXSPositiveInteger.prototype.builtInKind = cXSConstants.POSITIVEINTEGER_DT; + +cXSPositiveInteger.cast = function(vValue) { + return new cXSPositiveInteger(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("positiveInteger", cXSPositiveInteger); + + +function cXSUnsignedLong(nValue) { + this.value = nValue; +}; + +cXSUnsignedLong.prototype = new cXSNonNegativeInteger; +cXSUnsignedLong.prototype.builtInKind = cXSConstants.UNSIGNEDLONG_DT; + +cXSUnsignedLong.cast = function(vValue) { + return new cXSUnsignedLong(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("unsignedLong", cXSUnsignedLong); + + +function cXSUnsignedInt(nValue) { + this.value = nValue; +}; + +cXSUnsignedInt.prototype = new cXSNonNegativeInteger; +cXSUnsignedInt.prototype.builtInKind = cXSConstants.UNSIGNEDINT_DT; + +cXSUnsignedInt.cast = function(vValue) { + return new cXSUnsignedInt(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("unsignedInt", cXSUnsignedInt); + + +function cXSUnsignedShort(nValue) { + this.value = nValue; +}; + +cXSUnsignedShort.prototype = new cXSUnsignedInt; +cXSUnsignedShort.prototype.builtInKind = cXSConstants.UNSIGNEDSHORT_DT; + +cXSUnsignedShort.cast = function(vValue) { + return new cXSUnsignedShort(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("unsignedShort", cXSUnsignedShort); + + +function cXSUnsignedByte(nValue) { + this.value = nValue; +}; + +cXSUnsignedByte.prototype = new cXSUnsignedShort; +cXSUnsignedByte.prototype.builtInKind = cXSConstants.UNSIGNEDBYTE_DT; + +cXSUnsignedByte.cast = function(vValue) { + return new cXSUnsignedByte(cNumber(vValue)); +}; + +fStaticContext_defineSystemDataType("unsignedByte", cXSUnsignedByte); + + +function cXSNormalizedString(sValue) { + this.value = sValue; +}; + +cXSNormalizedString.prototype = new cXSString; +cXSNormalizedString.prototype.builtInKind = cXSConstants.NORMALIZEDSTRING_DT; + +cXSNormalizedString.cast = function(vValue) { + return new cXSNormalizedString(cString(vValue)); +}; + +fStaticContext_defineSystemDataType("normalizedString", cXSNormalizedString); + + +function cXSToken(sValue) { + this.value = sValue; +}; + +cXSToken.prototype = new cXSNormalizedString; +cXSToken.prototype.builtInKind = cXSConstants.TOKEN_DT; + +cXSToken.cast = function(vValue) { + return new cXSToken(cString(vValue)); +}; + +fStaticContext_defineSystemDataType("token", cXSToken); + + +function cXSName(sValue) { + this.value = sValue; +}; + +cXSName.prototype = new cXSToken; +cXSName.prototype.builtInKind = cXSConstants.NAME_DT; + +cXSName.cast = function(vValue) { + return new cXSName(cString(vValue)); +}; + +fStaticContext_defineSystemDataType("Name", cXSName); + + +function cXSNCName(sValue) { + this.value = sValue; +}; + +cXSNCName.prototype = new cXSName; +cXSNCName.prototype.builtInKind = cXSConstants.NCNAME_DT; + +cXSNCName.cast = function(vValue) { + return new cXSNCName(cString(vValue)); +}; + +fStaticContext_defineSystemDataType("NCName", cXSNCName); + + +function cXSENTITY(sValue) { + this.value = sValue; +}; + +cXSENTITY.prototype = new cXSNCName; +cXSENTITY.prototype.builtInKind = cXSConstants.ENTITY_DT; + +cXSENTITY.cast = function(vValue) { + return new cXSENTITY(cString(vValue)); +}; + +fStaticContext_defineSystemDataType("ENTITY", cXSENTITY); + + +function cXSID(sValue) { + this.value = sValue; +}; + +cXSID.prototype = new cXSNCName; +cXSID.prototype.builtInKind = cXSConstants.ID_DT; + +cXSID.cast = function(vValue) { + return new cXSID(cString(vValue)); +}; + +fStaticContext_defineSystemDataType("ID", cXSID); + + +function cXSLanguage(sValue) { + this.value = sValue; +}; + +cXSLanguage.prototype = new cXSToken; +cXSLanguage.prototype.builtInKind = cXSConstants.LANGUAGE_DT; + +cXSLanguage.cast = function(vValue) { + return new cXSLanguage(cString(vValue)); +}; + +fStaticContext_defineSystemDataType("language", cXSLanguage); + + +function cXSNMTOKEN(sValue) { + this.value = sValue; +}; + +cXSNMTOKEN.prototype = new cXSToken; +cXSNMTOKEN.prototype.builtInKind = cXSConstants.NMTOKEN_DT; + +cXSNMTOKEN.cast = function(vValue) { + return new cXSNMTOKEN(cString(vValue)); +}; + +fStaticContext_defineSystemDataType("NMTOKEN", cXSNMTOKEN); + + +function cXTItem() { + +}; + + +function cXTNode() { + +}; + +cXTNode.prototype = new cXTItem; + + + +function cXTAttribute() { + +}; + +cXTAttribute.prototype = new cXTNode; + + +function cXTComment() { + +}; + +cXTComment.prototype = new cXTNode; + + +function cXTDocument() { + +}; + +cXTDocument.prototype = new cXTNode; + + +function cXTElement() { + +}; + +cXTElement.prototype = new cXTNode; + + +function cXTProcessingInstruction() { + +}; + +cXTProcessingInstruction.prototype = new cXTNode; + + +function cXTText() { + +}; + +cXTText.prototype = new cXTNode; + + + +hStaticContext_operators["hexBinary-equal"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.valueOf() == oRight.valueOf()); +}; + +hStaticContext_operators["base64Binary-equal"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.valueOf() == oRight.valueOf()); +}; + + + + +hStaticContext_operators["boolean-equal"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.valueOf() == oRight.valueOf()); +}; + +hStaticContext_operators["boolean-less-than"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.valueOf() < oRight.valueOf()); +}; + +hStaticContext_operators["boolean-greater-than"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.valueOf() > oRight.valueOf()); +}; + + + + +hStaticContext_operators["yearMonthDuration-less-than"] = function(oLeft, oRight) { + return new cXSBoolean(fOperator_yearMonthDuration_toMonths(oLeft) < fOperator_yearMonthDuration_toMonths(oRight)); +}; + +hStaticContext_operators["yearMonthDuration-greater-than"] = function(oLeft, oRight) { + return new cXSBoolean(fOperator_yearMonthDuration_toMonths(oLeft) > fOperator_yearMonthDuration_toMonths(oRight)); +}; + +hStaticContext_operators["dayTimeDuration-less-than"] = function(oLeft, oRight) { + return new cXSBoolean(fOperator_dayTimeDuration_toSeconds(oLeft) < fOperator_dayTimeDuration_toSeconds(oRight)); +}; + +hStaticContext_operators["dayTimeDuration-greater-than"] = function(oLeft, oRight) { + return new cXSBoolean(fOperator_dayTimeDuration_toSeconds(oLeft) > fOperator_dayTimeDuration_toSeconds(oRight)); +}; + +hStaticContext_operators["duration-equal"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.negative == oRight.negative + && fOperator_yearMonthDuration_toMonths(oLeft) == fOperator_yearMonthDuration_toMonths(oRight) + && fOperator_dayTimeDuration_toSeconds(oLeft) == fOperator_dayTimeDuration_toSeconds(oRight)); +}; + +hStaticContext_operators["dateTime-equal"] = function(oLeft, oRight) { + return fOperator_compareDateTimes(oLeft, oRight, 'eq'); +}; + +hStaticContext_operators["dateTime-less-than"] = function(oLeft, oRight) { + return fOperator_compareDateTimes(oLeft, oRight, 'lt'); +}; + +hStaticContext_operators["dateTime-greater-than"] = function(oLeft, oRight) { + return fOperator_compareDateTimes(oLeft, oRight, 'gt'); +}; + +hStaticContext_operators["date-equal"] = function(oLeft, oRight) { + return fOperator_compareDates(oLeft, oRight, 'eq'); +}; + +hStaticContext_operators["date-less-than"] = function(oLeft, oRight) { + return fOperator_compareDates(oLeft, oRight, 'lt'); +}; + +hStaticContext_operators["date-greater-than"] = function(oLeft, oRight) { + return fOperator_compareDates(oLeft, oRight, 'gt'); +}; + +hStaticContext_operators["time-equal"] = function(oLeft, oRight) { + return fOperator_compareTimes(oLeft, oRight, 'eq'); +}; + +hStaticContext_operators["time-less-than"] = function(oLeft, oRight) { + return fOperator_compareTimes(oLeft, oRight, 'lt'); +}; + +hStaticContext_operators["time-greater-than"] = function(oLeft, oRight) { + return fOperator_compareTimes(oLeft, oRight, 'gt'); +}; + +hStaticContext_operators["gYearMonth-equal"] = function(oLeft, oRight) { + return fOperator_compareDateTimes( + new cXSDateTime(oLeft.year, oLeft.month, fXSDate_getDaysForYearMonth(oLeft.year, oLeft.month), 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), + new cXSDateTime(oRight.year, oRight.month, fXSDate_getDaysForYearMonth(oRight.year, oRight.month), 0, 0, 0, oRight.timezone == null ? this.timezone : oRight.timezone), + 'eq' + ); +}; + +hStaticContext_operators["gYear-equal"] = function(oLeft, oRight) { + return fOperator_compareDateTimes( + new cXSDateTime(oLeft.year, 1, 1, 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), + new cXSDateTime(oRight.year, 1, 1, 0, 0, 0, oRight.timezone == null ? this.timezone : oRight.timezone), + 'eq' + ); +}; + +hStaticContext_operators["gMonthDay-equal"] = function(oLeft, oRight) { + return fOperator_compareDateTimes( + new cXSDateTime(1972, oLeft.month, oLeft.day, 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), + new cXSDateTime(1972, oRight.month, oRight.day, 0, 0, 0, oRight.timezone == null ? this.timezone : oRight.timezone), + 'eq' + ); +}; + +hStaticContext_operators["gMonth-equal"] = function(oLeft, oRight) { + return fOperator_compareDateTimes( + new cXSDateTime(1972, oLeft.month, fXSDate_getDaysForYearMonth(1972, oRight.month), 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), + new cXSDateTime(1972, oRight.month, fXSDate_getDaysForYearMonth(1972, oRight.month), 0, 0, 0, oRight.timezone == null ? this.timezone : oRight.timezone), + 'eq' + ); +}; + +hStaticContext_operators["gDay-equal"] = function(oLeft, oRight) { + return fOperator_compareDateTimes( + new cXSDateTime(1972, 12, oLeft.day, 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), + new cXSDateTime(1972, 12, oRight.day, 0, 0, 0, oRight.timezone == null ? this.timezone : oRight.timezone), + 'eq' + ); +}; + +hStaticContext_operators["add-yearMonthDurations"] = function(oLeft, oRight) { + return fOperator_yearMonthDuration_fromMonths(fOperator_yearMonthDuration_toMonths(oLeft) + fOperator_yearMonthDuration_toMonths(oRight)); +}; + +hStaticContext_operators["subtract-yearMonthDurations"] = function(oLeft, oRight) { + return fOperator_yearMonthDuration_fromMonths(fOperator_yearMonthDuration_toMonths(oLeft) - fOperator_yearMonthDuration_toMonths(oRight)); +}; + +hStaticContext_operators["multiply-yearMonthDuration"] = function(oLeft, oRight) { + return fOperator_yearMonthDuration_fromMonths(fOperator_yearMonthDuration_toMonths(oLeft) * oRight); +}; + +hStaticContext_operators["divide-yearMonthDuration"] = function(oLeft, oRight) { + return fOperator_yearMonthDuration_fromMonths(fOperator_yearMonthDuration_toMonths(oLeft) / oRight); +}; + +hStaticContext_operators["divide-yearMonthDuration-by-yearMonthDuration"] = function(oLeft, oRight) { + return new cXSDecimal(fOperator_yearMonthDuration_toMonths(oLeft) / fOperator_yearMonthDuration_toMonths(oRight)); +}; + +hStaticContext_operators["add-dayTimeDurations"] = function(oLeft, oRight) { + return fOperator_dayTimeDuration_fromSeconds(fOperator_dayTimeDuration_toSeconds(oLeft) + fOperator_dayTimeDuration_toSeconds(oRight)); +}; + +hStaticContext_operators["subtract-dayTimeDurations"] = function(oLeft, oRight) { + return fOperator_dayTimeDuration_fromSeconds(fOperator_dayTimeDuration_toSeconds(oLeft) - fOperator_dayTimeDuration_toSeconds(oRight)); +}; + +hStaticContext_operators["multiply-dayTimeDuration"] = function(oLeft, oRight) { + return fOperator_dayTimeDuration_fromSeconds(fOperator_dayTimeDuration_toSeconds(oLeft) * oRight); +}; + +hStaticContext_operators["divide-dayTimeDuration"] = function(oLeft, oRight) { + return fOperator_dayTimeDuration_fromSeconds(fOperator_dayTimeDuration_toSeconds(oLeft) / oRight); +}; + +hStaticContext_operators["divide-dayTimeDuration-by-dayTimeDuration"] = function(oLeft, oRight) { + return new cXSDecimal(fOperator_dayTimeDuration_toSeconds(oLeft) / fOperator_dayTimeDuration_toSeconds(oRight)); +}; + +hStaticContext_operators["subtract-dateTimes"] = function(oLeft, oRight) { + return fOperator_dayTimeDuration_fromSeconds(fOperator_dateTime_toSeconds(oLeft) - fOperator_dateTime_toSeconds(oRight)); +}; + +hStaticContext_operators["subtract-dates"] = function(oLeft, oRight) { + return fOperator_dayTimeDuration_fromSeconds(fOperator_dateTime_toSeconds(oLeft) - fOperator_dateTime_toSeconds(oRight)); +}; + +hStaticContext_operators["subtract-times"] = function(oLeft, oRight) { + return fOperator_dayTimeDuration_fromSeconds(fOperator_time_toSeconds(oLeft) - fOperator_time_toSeconds(oRight)); +}; + +hStaticContext_operators["add-yearMonthDuration-to-dateTime"] = function(oLeft, oRight) { + return fOperator_addYearMonthDuration2DateTime(oLeft, oRight, '+'); +}; + +hStaticContext_operators["add-dayTimeDuration-to-dateTime"] = function(oLeft, oRight) { + return fOperator_addDayTimeDuration2DateTime(oLeft, oRight, '+'); +}; + +hStaticContext_operators["subtract-yearMonthDuration-from-dateTime"] = function(oLeft, oRight) { + return fOperator_addYearMonthDuration2DateTime(oLeft, oRight, '-'); +}; + +hStaticContext_operators["subtract-dayTimeDuration-from-dateTime"] = function(oLeft, oRight) { + return fOperator_addDayTimeDuration2DateTime(oLeft, oRight, '-'); +}; + +hStaticContext_operators["add-yearMonthDuration-to-date"] = function(oLeft, oRight) { + return fOperator_addYearMonthDuration2DateTime(oLeft, oRight, '+'); +}; + +hStaticContext_operators["add-dayTimeDuration-to-date"] = function(oLeft, oRight) { + return fOperator_addDayTimeDuration2DateTime(oLeft, oRight, '+'); +}; + +hStaticContext_operators["subtract-yearMonthDuration-from-date"] = function(oLeft, oRight) { + return fOperator_addYearMonthDuration2DateTime(oLeft, oRight, '-'); +}; + +hStaticContext_operators["subtract-dayTimeDuration-from-date"] = function(oLeft, oRight) { + return fOperator_addDayTimeDuration2DateTime(oLeft, oRight, '-'); +}; + +hStaticContext_operators["add-dayTimeDuration-to-time"] = function(oLeft, oRight) { + var oValue = new cXSTime(oLeft.hours, oLeft.minutes, oLeft.seconds, oLeft.timezone); + oValue.hours += oRight.hours; + oValue.minutes += oRight.minutes; + oValue.seconds += oRight.seconds; + return fXSTime_normalize(oValue); +}; + +hStaticContext_operators["subtract-dayTimeDuration-from-time"] = function(oLeft, oRight) { + var oValue = new cXSTime(oLeft.hours, oLeft.minutes, oLeft.seconds, oLeft.timezone); + oValue.hours -= oRight.hours; + oValue.minutes -= oRight.minutes; + oValue.seconds -= oRight.seconds; + return fXSTime_normalize(oValue); +}; + +function fOperator_compareTimes(oLeft, oRight, sComparator) { + var nLeft = fOperator_time_toSeconds(oLeft), + nRight = fOperator_time_toSeconds(oRight); + return new cXSBoolean(sComparator == 'lt' ? nLeft < nRight : sComparator == 'gt' ? nLeft > nRight : nLeft == nRight); +}; + +function fOperator_compareDates(oLeft, oRight, sComparator) { + return fOperator_compareDateTimes(cXSDateTime.cast(oLeft), cXSDateTime.cast(oRight), sComparator); +}; + +function fOperator_compareDateTimes(oLeft, oRight, sComparator) { + var oTimezone = new cXSDayTimeDuration(0, 0, 0, 0), + sLeft = fFunction_dateTime_adjustTimezone(oLeft, oTimezone).toString(), + sRight = fFunction_dateTime_adjustTimezone(oRight, oTimezone).toString(); + return new cXSBoolean(sComparator == 'lt' ? sLeft < sRight : sComparator == 'gt' ? sLeft > sRight : sLeft == sRight); +}; + +function fOperator_addYearMonthDuration2DateTime(oLeft, oRight, sOperator) { + var oValue; + if (oLeft instanceof cXSDate) + oValue = new cXSDate(oLeft.year, oLeft.month, oLeft.day, oLeft.timezone, oLeft.negative); + else + if (oLeft instanceof cXSDateTime) + oValue = new cXSDateTime(oLeft.year, oLeft.month, oLeft.day, oLeft.hours, oLeft.minutes, oLeft.seconds, oLeft.timezone, oLeft.negative); + oValue.year = oValue.year + oRight.year * (sOperator == '-' ?-1 : 1); + oValue.month = oValue.month + oRight.month * (sOperator == '-' ?-1 : 1); + fXSDate_normalize(oValue, true); + var nDay = fXSDate_getDaysForYearMonth(oValue.year, oValue.month); + if (oValue.day > nDay) + oValue.day = nDay; + return oValue; +}; + +function fOperator_addDayTimeDuration2DateTime(oLeft, oRight, sOperator) { + var oValue; + if (oLeft instanceof cXSDate) { + var nValue = (oRight.hours * 60 + oRight.minutes) * 60 + oRight.seconds; + oValue = new cXSDate(oLeft.year, oLeft.month, oLeft.day, oLeft.timezone, oLeft.negative); + oValue.day = oValue.day + oRight.day * (sOperator == '-' ?-1 : 1) - 1 * (nValue && sOperator == '-'); + fXSDate_normalize(oValue); + } + else + if (oLeft instanceof cXSDateTime) { + oValue = new cXSDateTime(oLeft.year, oLeft.month, oLeft.day, oLeft.hours, oLeft.minutes, oLeft.seconds, oLeft.timezone, oLeft.negative); + oValue.seconds = oValue.seconds + oRight.seconds * (sOperator == '-' ?-1 : 1); + oValue.minutes = oValue.minutes + oRight.minutes * (sOperator == '-' ?-1 : 1); + oValue.hours = oValue.hours + oRight.hours * (sOperator == '-' ?-1 : 1); + oValue.day = oValue.day + oRight.day * (sOperator == '-' ?-1 : 1); + fXSDateTime_normalize(oValue); + } + return oValue; +}; + +function fOperator_dayTimeDuration_toSeconds(oDuration) { + return (((oDuration.day * 24 + oDuration.hours) * 60 + oDuration.minutes) * 60 + oDuration.seconds) * (oDuration.negative ? -1 : 1); +}; + +function fOperator_dayTimeDuration_fromSeconds(nValue) { + var bNegative =(nValue = cMath.round(nValue)) < 0, + nDays = ~~((nValue = cMath.abs(nValue)) / 86400), + nHours = ~~((nValue -= nDays * 3600 * 24) / 3600), + nMinutes= ~~((nValue -= nHours * 3600) / 60), + nSeconds = nValue -= nMinutes * 60; + return new cXSDayTimeDuration(nDays, nHours, nMinutes, nSeconds, bNegative); +}; + +function fOperator_yearMonthDuration_toMonths(oDuration) { + return (oDuration.year * 12 + oDuration.month) * (oDuration.negative ? -1 : 1); +}; + +function fOperator_yearMonthDuration_fromMonths(nValue) { + var nNegative =(nValue = cMath.round(nValue)) < 0, + nYears = ~~((nValue = cMath.abs(nValue)) / 12), + nMonths = nValue -= nYears * 12; + return new cXSYearMonthDuration(nYears, nMonths, nNegative); +}; + +function fOperator_time_toSeconds(oTime) { + return oTime.seconds + (oTime.minutes - (oTime.timezone != null ? oTime.timezone % 60 : 0) + (oTime.hours - (oTime.timezone != null ? ~~(oTime.timezone / 60) : 0)) * 60) * 60; +}; + +function fOperator_dateTime_toSeconds(oValue) { + var oDate = new cDate((oValue.negative ? -1 : 1) * oValue.year, oValue.month, oValue.day, 0, 0, 0, 0); + if (oValue instanceof cXSDateTime) { + oDate.setHours(oValue.hours); + oDate.setMinutes(oValue.minutes); + oDate.setSeconds(oValue.seconds); + } + if (oValue.timezone != null) + oDate.setMinutes(oDate.getMinutes() - oValue.timezone); + return oDate.getTime() / 1000; +}; + + + + +hStaticContext_operators["is-same-node"] = function(oLeft, oRight) { + return new cXSBoolean(this.DOMAdapter.isSameNode(oLeft, oRight)); +}; + +hStaticContext_operators["node-before"] = function(oLeft, oRight) { + return new cXSBoolean(!!(this.DOMAdapter.compareDocumentPosition(oLeft, oRight) & 4)); +}; + +hStaticContext_operators["node-after"] = function(oLeft, oRight) { + return new cXSBoolean(!!(this.DOMAdapter.compareDocumentPosition(oLeft, oRight) & 2)); +}; + + + + + + + +function fFunctionCall_numeric_getPower(oLeft, oRight) { + if (fIsNaN(oLeft) || (cMath.abs(oLeft) == nInfinity) || fIsNaN(oRight) || (cMath.abs(oRight) == nInfinity)) + return 0; + var aLeft = cString(oLeft).match(rNumericLiteral), + aRight = cString(oRight).match(rNumericLiteral), + nPower = cMath.max(1, (aLeft[2] || aLeft[3] || '').length + (aLeft[5] || 0) * (aLeft[4] == '+' ?-1 : 1), (aRight[2] || aRight[3] || '').length + (aRight[5] || 0) * (aRight[4] == '+' ?-1 : 1)); + return nPower + (nPower % 2 ? 0 : 1); +}; + +hStaticContext_operators["numeric-add"] = function(oLeft, oRight) { + var nLeft = oLeft.valueOf(), + nRight = oRight.valueOf(), + nPower = cMath.pow(10, fFunctionCall_numeric_getPower(nLeft, nRight)); + return fOperator_numeric_getResultOfType(oLeft, oRight, ((nLeft * nPower) + (nRight * nPower))/nPower); +}; + +hStaticContext_operators["numeric-subtract"] = function(oLeft, oRight) { + var nLeft = oLeft.valueOf(), + nRight = oRight.valueOf(), + nPower = cMath.pow(10, fFunctionCall_numeric_getPower(nLeft, nRight)); + return fOperator_numeric_getResultOfType(oLeft, oRight, ((nLeft * nPower) - (nRight * nPower))/nPower); +}; + +hStaticContext_operators["numeric-multiply"] = function(oLeft, oRight) { + var nLeft = oLeft.valueOf(), + nRight = oRight.valueOf(), + nPower = cMath.pow(10, fFunctionCall_numeric_getPower(nLeft, nRight)); + return fOperator_numeric_getResultOfType(oLeft, oRight, ((nLeft * nPower) * (nRight * nPower))/(nPower * nPower)); +}; + +hStaticContext_operators["numeric-divide"] = function(oLeft, oRight) { + var nLeft = oLeft.valueOf(), + nRight = oRight.valueOf(), + nPower = cMath.pow(10, fFunctionCall_numeric_getPower(nLeft, nRight)); + return fOperator_numeric_getResultOfType(oLeft, oRight, (oLeft * nPower) / (oRight * nPower)); +}; + +hStaticContext_operators["numeric-integer-divide"] = function(oLeft, oRight) { + return new cXSInteger(~~(oLeft / oRight)); +}; + +hStaticContext_operators["numeric-mod"] = function(oLeft, oRight) { + var nLeft = oLeft.valueOf(), + nRight = oRight.valueOf(), + nPower = cMath.pow(10, fFunctionCall_numeric_getPower(nLeft, nRight)); + return fOperator_numeric_getResultOfType(oLeft, oRight, ((nLeft * nPower) % (nRight * nPower)) / nPower); +}; + +hStaticContext_operators["numeric-unary-plus"] = function(oRight) { + return oRight; +}; + +hStaticContext_operators["numeric-unary-minus"] = function(oRight) { + oRight.value *=-1; + return oRight; +}; + + +hStaticContext_operators["numeric-equal"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.valueOf() == oRight.valueOf()); +}; + +hStaticContext_operators["numeric-less-than"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.valueOf() < oRight.valueOf()); +}; + +hStaticContext_operators["numeric-greater-than"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.valueOf() > oRight.valueOf()); +}; + +function fOperator_numeric_getResultOfType(oLeft, oRight, nResult) { + return new (oLeft instanceof cXSInteger && oRight instanceof cXSInteger && nResult == cMath.round(nResult) ? cXSInteger : cXSDecimal)(nResult); +}; + + + + +hStaticContext_operators["QName-equal"] = function(oLeft, oRight) { + return new cXSBoolean(oLeft.localName == oRight.localName && oLeft.namespaceURI == oRight.namespaceURI); +}; + + + + +hStaticContext_operators["concatenate"] = function(oSequence1, oSequence2) { + return oSequence1.concat(oSequence2); +}; + +hStaticContext_operators["union"] = function(oSequence1, oSequence2) { + var oSequence = []; + for (var nIndex = 0, nLength = oSequence1.length, oItem; nIndex < nLength; nIndex++) { + if (!this.DOMAdapter.isNode(oItem = oSequence1[nIndex])) + throw new cException("XPTY0004" + , "Required item type of first operand of 'union' is node()" + ); if (fArray_indexOf(oSequence, oItem) ==-1) + oSequence.push(oItem); + } + for (var nIndex = 0, nLength = oSequence2.length, oItem; nIndex < nLength; nIndex++) { + if (!this.DOMAdapter.isNode(oItem = oSequence2[nIndex])) + throw new cException("XPTY0004" + , "Required item type of second operand of 'union' is node()" + ); if (fArray_indexOf(oSequence, oItem) ==-1) + oSequence.push(oItem); + } + return fFunction_sequence_order(oSequence, this); +}; + +hStaticContext_operators["intersect"] = function(oSequence1, oSequence2) { + var oSequence = []; + for (var nIndex = 0, nLength = oSequence1.length, oItem, bFound; nIndex < nLength; nIndex++) { + if (!this.DOMAdapter.isNode(oItem = oSequence1[nIndex])) + throw new cException("XPTY0004" + , "Required item type of second operand of 'intersect' is node()" + ); bFound = false; + for (var nRightIndex = 0, nRightLength = oSequence2.length;(nRightIndex < nRightLength) && !bFound; nRightIndex++) { + if (!this.DOMAdapter.isNode(oSequence2[nRightIndex])) + throw new cException("XPTY0004" + , "Required item type of first operand of 'intersect' is node()" + ); + bFound = this.DOMAdapter.isSameNode(oSequence2[nRightIndex], oItem); + } + if (bFound && fArray_indexOf(oSequence, oItem) ==-1) + oSequence.push(oItem); + } + return fFunction_sequence_order(oSequence, this); +}; + +hStaticContext_operators["except"] = function(oSequence1, oSequence2) { + var oSequence = []; + for (var nIndex = 0, nLength = oSequence1.length, oItem, bFound; nIndex < nLength; nIndex++) { + if (!this.DOMAdapter.isNode(oItem = oSequence1[nIndex])) + throw new cException("XPTY0004" + , "Required item type of second operand of 'except' is node()" + ); bFound = false; + for (var nRightIndex = 0, nRightLength = oSequence2.length;(nRightIndex < nRightLength) && !bFound; nRightIndex++) { + if (!this.DOMAdapter.isNode(oSequence2[nRightIndex])) + throw new cException("XPTY0004" + , "Required item type of first operand of 'except' is node()" + ); + bFound = this.DOMAdapter.isSameNode(oSequence2[nRightIndex], oItem); + } + if (!bFound && fArray_indexOf(oSequence, oItem) ==-1) + oSequence.push(oItem); + } + return fFunction_sequence_order(oSequence, this); +}; + +hStaticContext_operators["to"] = function(oLeft, oRight) { + var oSequence = []; + for (var nIndex = oLeft.valueOf(), nLength = oRight.valueOf(); nIndex <= nLength; nIndex++) + oSequence.push(new cXSInteger(nIndex)); + return oSequence; +}; + + + + +fStaticContext_defineSystemFunction("node-name", [[cXTNode, '?']], function(oNode) { + if (oNode != null) { + var fGetProperty = this.DOMAdapter.getProperty; + switch (fGetProperty(oNode, "nodeType")) { + case 1: case 2: return new cXSQName(fGetProperty(oNode, "prefix"), fGetProperty(oNode, "localName"), fGetProperty(oNode, "namespaceURI")); + case 5: throw "Not implemented"; + case 6: throw "Not implemented"; + case 7: return new cXSQName(null, fGetProperty(oNode, "target"), null); + case 10: return new cXSQName(null, fGetProperty(oNode, "name"), null); + } + } + return null; +}); + +fStaticContext_defineSystemFunction("nilled", [[cXTNode, '?']], function(oNode) { + if (oNode != null) { + if (this.DOMAdapter.getProperty(oNode, "nodeType") == 1) + return new cXSBoolean(false); } + return null; +}); + +fStaticContext_defineSystemFunction("string", [[cXTItem, '?', true]], function(oItem) { + if (!arguments.length) { + if (!this.item) + throw new cException("XPDY0002"); + oItem = this.item; + } + return oItem == null ? new cXSString('') : cXSString.cast(fFunction_sequence_atomize([oItem], this)[0]); +}); + +fStaticContext_defineSystemFunction("data", [[cXTItem, '*']], function(oSequence1) { + return fFunction_sequence_atomize(oSequence1, this); +}); + +fStaticContext_defineSystemFunction("base-uri", [[cXTNode, '?', true]], function(oNode) { + if (!arguments.length) { + if (!this.DOMAdapter.isNode(this.item)) + throw new cException("XPTY0004" + , "base-uri() function called when the context item is not a node" + ); + oNode = this.item; + } + return cXSAnyURI.cast(new cXSString(this.DOMAdapter.getProperty(oNode, "baseURI") || '')); +}); + +fStaticContext_defineSystemFunction("document-uri", [[cXTNode, '?']], function(oNode) { + if (oNode != null) { + var fGetProperty = this.DOMAdapter.getProperty; + if (fGetProperty(oNode, "nodeType") == 9) + return cXSAnyURI.cast(new cXSString(fGetProperty(oNode, "documentURI") || '')); + } + return null; +}); + + + + +fStaticContext_defineSystemFunction("resolve-uri", [[cXSString, '?'], [cXSString, '', true]], function(sUri, sBaseUri) { + var sBaseUri; + if (arguments.length < 2) { + if (!this.DOMAdapter.isNode(this.item)) + throw new cException("XPTY0004" + , "resolve-uri() function called when the context item is not a node" + ); + sBaseUri = new cXSString(this.DOMAdapter.getProperty(this.item, "baseURI") || ''); + } + + if (sUri == null) + return null; + + if (sUri.valueOf() == '' || sUri.valueOf().charAt(0) == '#') + return cXSAnyURI.cast(sBaseUri); + + var oUri = cXSAnyURI.cast(sUri); + if (oUri.scheme) + return oUri; + + var oBaseUri = cXSAnyURI.cast(sBaseUri); + oUri.scheme = oBaseUri.scheme; + + if (!oUri.authority) { + oUri.authority = oBaseUri.authority; + + if (oUri.path.charAt(0) != '/') { + var aUriSegments = oUri.path.split('/'), + aBaseUriSegments = oBaseUri.path.split('/'); + aBaseUriSegments.pop(); + + var nBaseUriStart = aBaseUriSegments[0] == '' ? 1 : 0; + for (var nIndex = 0, nLength = aUriSegments.length; nIndex < nLength; nIndex++) { + if (aUriSegments[nIndex] == '..') { + if (aBaseUriSegments.length > nBaseUriStart) + aBaseUriSegments.pop(); + else { + aBaseUriSegments.push(aUriSegments[nIndex]); + nBaseUriStart++; + } + } + else + if (aUriSegments[nIndex] != '.') + aBaseUriSegments.push(aUriSegments[nIndex]); + } + if (aUriSegments[--nIndex] == '..' || aUriSegments[nIndex] == '.') + aBaseUriSegments.push(''); + oUri.path = aBaseUriSegments.join('/'); + } + } + + return oUri; +}); + + + + +fStaticContext_defineSystemFunction("true", [], function() { + return new cXSBoolean(true); +}); + +fStaticContext_defineSystemFunction("false", [], function() { + return new cXSBoolean(false); +}); + +fStaticContext_defineSystemFunction("not", [[cXTItem, '*']], function(oSequence1) { + return new cXSBoolean(!fFunction_sequence_toEBV(oSequence1, this)); +}); + + + +fStaticContext_defineSystemFunction("position", [], function() { + return new cXSInteger(this.position); +}); + +fStaticContext_defineSystemFunction("last", [], function() { + return new cXSInteger(this.size); +}); + +fStaticContext_defineSystemFunction("current-dateTime", [], function() { + return this.dateTime; +}); + +fStaticContext_defineSystemFunction("current-date", [], function() { + return cXSDate.cast(this.dateTime); +}); + +fStaticContext_defineSystemFunction("current-time", [], function() { + return cXSTime.cast(this.dateTime); +}); + +fStaticContext_defineSystemFunction("implicit-timezone", [], function() { + return this.timezone; +}); + +fStaticContext_defineSystemFunction("default-collation", [], function() { + return new cXSString(this.staticContext.defaultCollationName); +}); + +fStaticContext_defineSystemFunction("static-base-uri", [], function() { + return cXSAnyURI.cast(new cXSString(this.staticContext.baseURI || '')); +}); + + + + +fStaticContext_defineSystemFunction("years-from-duration", [[cXSDuration, '?']], function(oDuration) { + return fFunction_duration_getComponent(oDuration, "year"); +}); + +fStaticContext_defineSystemFunction("months-from-duration", [[cXSDuration, '?']], function(oDuration) { + return fFunction_duration_getComponent(oDuration, "month"); +}); + +fStaticContext_defineSystemFunction("days-from-duration", [[cXSDuration, '?']], function(oDuration) { + return fFunction_duration_getComponent(oDuration, "day"); +}); + +fStaticContext_defineSystemFunction("hours-from-duration", [[cXSDuration, '?']], function(oDuration) { + return fFunction_duration_getComponent(oDuration, "hours"); +}); + +fStaticContext_defineSystemFunction("minutes-from-duration", [[cXSDuration, '?']], function(oDuration) { + return fFunction_duration_getComponent(oDuration, "minutes"); +}); + +fStaticContext_defineSystemFunction("seconds-from-duration", [[cXSDuration, '?']], function(oDuration) { + return fFunction_duration_getComponent(oDuration, "seconds"); +}); + +fStaticContext_defineSystemFunction("year-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { + return fFunction_dateTime_getComponent(oDateTime, "year"); +}); + +fStaticContext_defineSystemFunction("month-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { + return fFunction_dateTime_getComponent(oDateTime, "month"); +}); + +fStaticContext_defineSystemFunction("day-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { + return fFunction_dateTime_getComponent(oDateTime, "day"); +}); + +fStaticContext_defineSystemFunction("hours-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { + return fFunction_dateTime_getComponent(oDateTime, "hours"); +}); + +fStaticContext_defineSystemFunction("minutes-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { + return fFunction_dateTime_getComponent(oDateTime, "minutes"); +}); + +fStaticContext_defineSystemFunction("seconds-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { + return fFunction_dateTime_getComponent(oDateTime, "seconds"); +}); + +fStaticContext_defineSystemFunction("timezone-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { + return fFunction_dateTime_getComponent(oDateTime, "timezone"); +}); + +fStaticContext_defineSystemFunction("year-from-date", [[cXSDate, '?']], function(oDate) { + return fFunction_dateTime_getComponent(oDate, "year"); +}); + +fStaticContext_defineSystemFunction("month-from-date", [[cXSDate, '?']], function(oDate) { + return fFunction_dateTime_getComponent(oDate, "month"); +}); + +fStaticContext_defineSystemFunction("day-from-date", [[cXSDate, '?']], function(oDate) { + return fFunction_dateTime_getComponent(oDate, "day"); +}); + +fStaticContext_defineSystemFunction("timezone-from-date", [[cXSDate, '?']], function(oDate) { + return fFunction_dateTime_getComponent(oDate, "timezone"); +}); + +fStaticContext_defineSystemFunction("hours-from-time", [[cXSTime, '?']], function(oTime) { + return fFunction_dateTime_getComponent(oTime, "hours"); +}); + +fStaticContext_defineSystemFunction("minutes-from-time", [[cXSTime, '?']], function(oTime) { + return fFunction_dateTime_getComponent(oTime, "minutes"); +}); + +fStaticContext_defineSystemFunction("seconds-from-time", [[cXSTime, '?']], function(oTime) { + return fFunction_dateTime_getComponent(oTime, "seconds"); +}); + +fStaticContext_defineSystemFunction("timezone-from-time", [[cXSTime, '?']], function(oTime) { + return fFunction_dateTime_getComponent(oTime, "timezone"); +}); + + +fStaticContext_defineSystemFunction("adjust-dateTime-to-timezone", [[cXSDateTime, '?'], [cXSDayTimeDuration, '?', true]], function(oDateTime, oDayTimeDuration) { + return fFunction_dateTime_adjustTimezone(oDateTime, arguments.length > 1 && oDayTimeDuration != null ? arguments.length > 1 ? oDayTimeDuration : this.timezone : null); +}); + +fStaticContext_defineSystemFunction("adjust-date-to-timezone", [[cXSDate, '?'], [cXSDayTimeDuration, '?', true]], function(oDate, oDayTimeDuration) { + return fFunction_dateTime_adjustTimezone(oDate, arguments.length > 1 && oDayTimeDuration != null ? arguments.length > 1 ? oDayTimeDuration : this.timezone : null); +}); + +fStaticContext_defineSystemFunction("adjust-time-to-timezone", [[cXSTime, '?'], [cXSDayTimeDuration, '?', true]], function(oTime, oDayTimeDuration) { + return fFunction_dateTime_adjustTimezone(oTime, arguments.length > 1 && oDayTimeDuration != null ? arguments.length > 1 ? oDayTimeDuration : this.timezone : null); +}); + +function fFunction_duration_getComponent(oDuration, sName) { + if (oDuration == null) + return null; + + var nValue = oDuration[sName] * (oDuration.negative ?-1 : 1); + return sName == "seconds" ? new cXSDecimal(nValue) : new cXSInteger(nValue); +}; + +function fFunction_dateTime_getComponent(oDateTime, sName) { + if (oDateTime == null) + return null; + + if (sName == "timezone") { + var nTimezone = oDateTime.timezone; + if (nTimezone == null) + return null; + return new cXSDayTimeDuration(0, cMath.abs(~~(nTimezone / 60)), cMath.abs(nTimezone % 60), 0, nTimezone < 0); + } + else { + var nValue = oDateTime[sName]; + if (!(oDateTime instanceof cXSDate)) { + if (sName == "hours") + if (nValue == 24) + nValue = 0; + } + if (!(oDateTime instanceof cXSTime)) + nValue *= oDateTime.negative ?-1 : 1; + return sName == "seconds" ? new cXSDecimal(nValue) : new cXSInteger(nValue); + } +}; + +function fFunction_dateTime_adjustTimezone(oDateTime, oTimezone) { + if (oDateTime == null) + return null; + + var oValue; + if (oDateTime instanceof cXSDate) + oValue = new cXSDate(oDateTime.year, oDateTime.month, oDateTime.day, oDateTime.timezone, oDateTime.negative); + else + if (oDateTime instanceof cXSTime) + oValue = new cXSTime(oDateTime.hours, oDateTime.minutes, oDateTime.seconds, oDateTime.timezone, oDateTime.negative); + else + oValue = new cXSDateTime(oDateTime.year, oDateTime.month, oDateTime.day, oDateTime.hours, oDateTime.minutes, oDateTime.seconds, oDateTime.timezone, oDateTime.negative); + + if (oTimezone == null) + oValue.timezone = null; + else { + var nTimezone = fOperator_dayTimeDuration_toSeconds(oTimezone) / 60; + if (oDateTime.timezone != null) { + var nDiff = nTimezone - oDateTime.timezone; + if (oDateTime instanceof cXSDate) { + if (nDiff < 0) + oValue.day--; + } + else { + oValue.minutes += nDiff % 60; + oValue.hours += ~~(nDiff / 60); + } + fXSDateTime_normalize(oValue); + } + oValue.timezone = nTimezone; + } + return oValue; +}; + + + + +fStaticContext_defineSystemFunction("name", [[cXTNode, '?', true]], function(oNode) { + if (!arguments.length) { + if (!this.DOMAdapter.isNode(this.item)) + throw new cException("XPTY0004" + , "name() function called when the context item is not a node" + ); + oNode = this.item; + } + else + if (oNode == null) + return new cXSString(''); + var vValue = hStaticContext_functions["node-name"].call(this, oNode); + return new cXSString(vValue == null ? '' : vValue.toString()); +}); + +fStaticContext_defineSystemFunction("local-name", [[cXTNode, '?', true]], function(oNode) { + if (!arguments.length) { + if (!this.DOMAdapter.isNode(this.item)) + throw new cException("XPTY0004" + , "local-name() function called when the context item is not a node" + ); + oNode = this.item; + } + else + if (oNode == null) + return new cXSString(''); + return new cXSString(this.DOMAdapter.getProperty(oNode, "localName") || ''); +}); + +fStaticContext_defineSystemFunction("namespace-uri", [[cXTNode, '?', true]], function(oNode) { + if (!arguments.length) { + if (!this.DOMAdapter.isNode(this.item)) + throw new cException("XPTY0004" + , "namespace-uri() function called when the context item is not a node" + ); + oNode = this.item; + } + else + if (oNode == null) + return cXSAnyURI.cast(new cXSString('')); + return cXSAnyURI.cast(new cXSString(this.DOMAdapter.getProperty(oNode, "namespaceURI") || '')); +}); + +fStaticContext_defineSystemFunction("number", [[cXSAnyAtomicType, '?', true]], function(oItem) { + if (!arguments.length) { + if (!this.item) + throw new cException("XPDY0002"); + oItem = fFunction_sequence_atomize([this.item], this)[0]; + } + + var vValue = new cXSDouble(nNaN); + if (oItem != null) { + try { + vValue = cXSDouble.cast(oItem); + } + catch (e) { + + } + } + return vValue; +}); + +fStaticContext_defineSystemFunction("lang", [[cXSString, '?'], [cXTNode, '', true]], function(sLang, oNode) { + if (arguments.length < 2) { + if (!this.DOMAdapter.isNode(this.item)) + throw new cException("XPTY0004" + , "lang() function called when the context item is not a node" + ); + oNode = this.item; + } + + var fGetProperty = this.DOMAdapter.getProperty; + if (fGetProperty(oNode, "nodeType") == 2) + oNode = fGetProperty(oNode, "ownerElement"); + + for (var aAttributes; oNode; oNode = fGetProperty(oNode, "parentNode")) + if (aAttributes = fGetProperty(oNode, "attributes")) + for (var nIndex = 0, nLength = aAttributes.length; nIndex < nLength; nIndex++) + if (fGetProperty(aAttributes[nIndex], "nodeName") == "xml:lang") + return new cXSBoolean(fGetProperty(aAttributes[nIndex], "value").replace(/-.+/, '').toLowerCase() == sLang.valueOf().replace(/-.+/, '').toLowerCase()); + return new cXSBoolean(false); +}); + +fStaticContext_defineSystemFunction("root", [[cXTNode, '?', true]], function(oNode) { + if (!arguments.length) { + if (!this.DOMAdapter.isNode(this.item)) + throw new cException("XPTY0004" + , "root() function called when the context item is not a node" + ); + oNode = this.item; + } + else + if (oNode == null) + return null; + + var fGetProperty = this.DOMAdapter.getProperty; + + if (fGetProperty(oNode, "nodeType") == 2) + oNode = fGetProperty(oNode, "ownerElement"); + + for (var oParent = oNode; oParent; oParent = fGetProperty(oNode, "parentNode")) + oNode = oParent; + + return oNode; +}); + + + + +fStaticContext_defineSystemFunction("abs", [[cXSDouble, '?']], function(oValue) { + return new cXSDecimal(cMath.abs(oValue)); +}); + +fStaticContext_defineSystemFunction("ceiling", [[cXSDouble, '?']], function(oValue) { + return new cXSDecimal(cMath.ceil(oValue)); +}); + +fStaticContext_defineSystemFunction("floor", [[cXSDouble, '?']], function(oValue) { + return new cXSDecimal(cMath.floor(oValue)); +}); + +fStaticContext_defineSystemFunction("round", [[cXSDouble, '?']], function(oValue) { + return new cXSDecimal(cMath.round(oValue)); +}); + +fStaticContext_defineSystemFunction("round-half-to-even", [[cXSDouble, '?'], [cXSInteger, '', true]], function(oValue, oPrecision) { + var nPrecision = arguments.length > 1 ? oPrecision.valueOf() : 0; + + if (nPrecision < 0) { + var oPower = new cXSInteger(cMath.pow(10,-nPrecision)), + nRounded= cMath.round(hStaticContext_operators["numeric-divide"].call(this, oValue, oPower)), + oRounded= new cXSInteger(nRounded); + nDecimal= cMath.abs(hStaticContext_operators["numeric-subtract"].call(this, oRounded, hStaticContext_operators["numeric-divide"].call(this, oValue, oPower))); + return hStaticContext_operators["numeric-multiply"].call(this, hStaticContext_operators["numeric-add"].call(this, oRounded, new cXSDecimal(nDecimal == 0.5 && nRounded % 2 ?-1 : 0)), oPower); + } + else { + var oPower = new cXSInteger(cMath.pow(10, nPrecision)), + nRounded= cMath.round(hStaticContext_operators["numeric-multiply"].call(this, oValue, oPower)), + oRounded= new cXSInteger(nRounded); + nDecimal= cMath.abs(hStaticContext_operators["numeric-subtract"].call(this, oRounded, hStaticContext_operators["numeric-multiply"].call(this, oValue, oPower))); + return hStaticContext_operators["numeric-divide"].call(this, hStaticContext_operators["numeric-add"].call(this, oRounded, new cXSDecimal(nDecimal == 0.5 && nRounded % 2 ?-1 : 0)), oPower); + } +}); + + + + +fStaticContext_defineSystemFunction("resolve-QName", [[cXSString, '?'], [cXTElement]], function(oQName, oElement) { + if (oQName == null) + return null; + + var sQName = oQName.valueOf(), + aMatch = sQName.match(rXSQName); + if (!aMatch) + throw new cException("FOCA0002" + , "Invalid QName '" + sQName + "'" + ); + + var sPrefix = aMatch[1] || null, + sLocalName = aMatch[2], + sNameSpaceURI = this.DOMAdapter.lookupNamespaceURI(oElement, sPrefix); + if (sPrefix != null &&!sNameSpaceURI) + throw new cException("FONS0004" + , "Namespace prefix '" + sPrefix + "' has not been declared" + ); + + return new cXSQName(sPrefix, sLocalName, sNameSpaceURI || null); +}); + +fStaticContext_defineSystemFunction("QName", [[cXSString, '?'], [cXSString]], function(oUri, oQName) { + var sQName = oQName.valueOf(), + aMatch = sQName.match(rXSQName); + + if (!aMatch) + throw new cException("FOCA0002" + , "Invalid QName '" + sQName + "'" + ); + + return new cXSQName(aMatch[1] || null, aMatch[2] || null, oUri == null ? '' : oUri.valueOf()); +}); + +fStaticContext_defineSystemFunction("prefix-from-QName", [[cXSQName, '?']], function(oQName) { + if (oQName != null) { + if (oQName.prefix) + return new cXSNCName(oQName.prefix); + } + return null; +}); + +fStaticContext_defineSystemFunction("local-name-from-QName", [[cXSQName, '?']], function(oQName) { + if (oQName == null) + return null; + + return new cXSNCName(oQName.localName); +}); + +fStaticContext_defineSystemFunction("namespace-uri-from-QName", [[cXSQName, '?']], function(oQName) { + if (oQName == null) + return null; + + return cXSAnyURI.cast(new cXSString(oQName.namespaceURI || '')); +}); + +fStaticContext_defineSystemFunction("namespace-uri-for-prefix", [[cXSString, '?'], [cXTElement]], function(oPrefix, oElement) { + var sPrefix = oPrefix == null ? '' : oPrefix.valueOf(), + sNameSpaceURI = this.DOMAdapter.lookupNamespaceURI(oElement, sPrefix || null); + + return sNameSpaceURI == null ? null : cXSAnyURI.cast(new cXSString(sNameSpaceURI)); +}); + +fStaticContext_defineSystemFunction("in-scope-prefixes", [[cXTElement]], function(oElement) { + throw "Function '" + "in-scope-prefixes" + "' not implemented"; +}); + + + + +fStaticContext_defineSystemFunction("boolean", [[cXTItem, '*']], function(oSequence1) { + return new cXSBoolean(fFunction_sequence_toEBV(oSequence1, this)); +}); + +fStaticContext_defineSystemFunction("index-of", [[cXSAnyAtomicType, '*'], [cXSAnyAtomicType], [cXSString, '', true]], function(oSequence1, oSearch, oCollation) { + if (!oSequence1.length || oSearch == null) + return []; + + + var vLeft = oSearch; + if (vLeft instanceof cXSUntypedAtomic) + vLeft = cXSString.cast(vLeft); + + var oSequence = []; + for (var nIndex = 0, nLength = oSequence1.length, vRight; nIndex < nLength; nIndex++) { + vRight = oSequence1[nIndex]; + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSString.cast(vRight); + if (vRight.valueOf() === vLeft.valueOf()) + oSequence.push(new cXSInteger(nIndex + 1)); + } + + return oSequence; +}); + +fStaticContext_defineSystemFunction("empty", [[cXTItem, '*']], function(oSequence1) { + return new cXSBoolean(!oSequence1.length); +}); + +fStaticContext_defineSystemFunction("exists", [[cXTItem, '*']], function(oSequence1) { + return new cXSBoolean(!!oSequence1.length); +}); + +fStaticContext_defineSystemFunction("distinct-values", [[cXSAnyAtomicType, '*'], [cXSString, '', true]], function(oSequence1, oCollation) { + if (!oSequence1.length) + return null; + + var oSequence = []; + for (var nIndex = 0, nLength = oSequence1.length, vLeft; nIndex < nLength; nIndex++) { + vLeft = oSequence1[nIndex]; + if (vLeft instanceof cXSUntypedAtomic) + vLeft = cXSString.cast(vLeft); + for (var nRightIndex = 0, nRightLength = oSequence.length, vRight, bFound = false; (nRightIndex < nRightLength) &&!bFound; nRightIndex++) { + vRight = oSequence[nRightIndex]; + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSString.cast(vRight); + if (vRight.valueOf() === vLeft.valueOf()) + bFound = true; + } + if (!bFound) + oSequence.push(oSequence1[nIndex]); + } + + return oSequence; +}); + +fStaticContext_defineSystemFunction("insert-before", [[cXTItem, '*'], [cXSInteger], [cXTItem, '*']], function(oSequence1, oPosition, oSequence3) { + if (!oSequence1.length) + return oSequence3; + if (!oSequence3.length) + return oSequence1; + + var nLength = oSequence1.length, + nPosition = oPosition.valueOf(); + if (nPosition < 1) + nPosition = 1; + else + if (nPosition > nLength) + nPosition = nLength + 1; + + var oSequence = []; + for (var nIndex = 0; nIndex < nLength; nIndex++) { + if (nPosition == nIndex + 1) + oSequence = oSequence.concat(oSequence3); + oSequence.push(oSequence1[nIndex]); + } + if (nPosition == nIndex + 1) + oSequence = oSequence.concat(oSequence3); + + return oSequence; +}); + +fStaticContext_defineSystemFunction("remove", [[cXTItem, '*'], [cXSInteger]], function(oSequence1, oPosition) { + if (!oSequence1.length) + return []; + + var nLength = oSequence1.length, + nPosition = oPosition.valueOf(); + + if (nPosition < 1 || nPosition > nLength) + return oSequence1; + + var oSequence = []; + for (var nIndex = 0; nIndex < nLength; nIndex++) + if (nPosition != nIndex + 1) + oSequence.push(oSequence1[nIndex]); + + return oSequence; +}); + +fStaticContext_defineSystemFunction("reverse", [[cXTItem, '*']], function(oSequence1) { + oSequence1.reverse(); + + return oSequence1; +}); + +fStaticContext_defineSystemFunction("subsequence", [[cXTItem, '*'], [cXSDouble, ''], [cXSDouble, '', true]], function(oSequence1, oStart, oLength) { + var nPosition = cMath.round(oStart), + nLength = arguments.length > 2 ? cMath.round(oLength) : oSequence1.length - nPosition + 1; + + return oSequence1.slice(nPosition - 1, nPosition - 1 + nLength); +}); + +fStaticContext_defineSystemFunction("unordered", [[cXTItem, '*']], function(oSequence1) { + return oSequence1; +}); + + +fStaticContext_defineSystemFunction("zero-or-one", [[cXTItem, '*']], function(oSequence1) { + if (oSequence1.length > 1) + throw new cException("FORG0003"); + + return oSequence1; +}); + +fStaticContext_defineSystemFunction("one-or-more", [[cXTItem, '*']], function(oSequence1) { + if (!oSequence1.length) + throw new cException("FORG0004"); + + return oSequence1; +}); + +fStaticContext_defineSystemFunction("exactly-one", [[cXTItem, '*']], function(oSequence1) { + if (oSequence1.length != 1) + throw new cException("FORG0005"); + + return oSequence1; +}); + + +fStaticContext_defineSystemFunction("deep-equal", [[cXTItem, '*'], [cXTItem, '*'], [cXSString, '', true]], function(oSequence1, oSequence2, oCollation) { + throw "Function '" + "deep-equal" + "' not implemented"; +}); + + +fStaticContext_defineSystemFunction("count", [[cXTItem, '*']], function(oSequence1) { + return new cXSInteger(oSequence1.length); +}); + +fStaticContext_defineSystemFunction("avg", [[cXSAnyAtomicType, '*']], function(oSequence1) { + if (!oSequence1.length) + return null; + + try { + var vValue = oSequence1[0]; + if (vValue instanceof cXSUntypedAtomic) + vValue = cXSDouble.cast(vValue); + for (var nIndex = 1, nLength = oSequence1.length, vRight; nIndex < nLength; nIndex++) { + vRight = oSequence1[nIndex]; + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSDouble.cast(vRight); + vValue = hAdditiveExpr_operators['+'](vValue, vRight, this); + } + return hMultiplicativeExpr_operators['div'](vValue, new cXSInteger(nLength), this); + } + catch (e) { + throw e.code != "XPTY0004" ? e : new cException("FORG0006" + , "Input to avg() contains a mix of types" + ); + } +}); + +fStaticContext_defineSystemFunction("max", [[cXSAnyAtomicType, '*'], [cXSString, '', true]], function(oSequence1, oCollation) { + if (!oSequence1.length) + return null; + + + try { + var vValue = oSequence1[0]; + for (var nIndex = 1, nLength = oSequence1.length; nIndex < nLength; nIndex++) + if (hComparisonExpr_ValueComp_operators['ge'](oSequence1[nIndex], vValue, this).valueOf()) + vValue = oSequence1[nIndex]; + return vValue; + } + catch (e) { + throw e.code != "XPTY0004" ? e : new cException("FORG0006" + , "Input to max() contains a mix of not comparable values" + ); + } +}); + +fStaticContext_defineSystemFunction("min", [[cXSAnyAtomicType, '*'], [cXSString, '', true]], function(oSequence1, oCollation) { + if (!oSequence1.length) + return null; + + + try { + var vValue = oSequence1[0]; + for (var nIndex = 1, nLength = oSequence1.length; nIndex < nLength; nIndex++) + if (hComparisonExpr_ValueComp_operators['le'](oSequence1[nIndex], vValue, this).valueOf()) + vValue = oSequence1[nIndex]; + return vValue; + } + catch (e) { + throw e.code != "XPTY0004" ? e : new cException("FORG0006" + , "Input to min() contains a mix of not comparable values" + ); + } +}); + +fStaticContext_defineSystemFunction("sum", [[cXSAnyAtomicType, '*'], [cXSAnyAtomicType, '?', true]], function(oSequence1, oZero) { + if (!oSequence1.length) { + if (arguments.length > 1) + return oZero; + else + return new cXSDouble(0); + + return null; + } + + + try { + var vValue = oSequence1[0]; + if (vValue instanceof cXSUntypedAtomic) + vValue = cXSDouble.cast(vValue); + for (var nIndex = 1, nLength = oSequence1.length, vRight; nIndex < nLength; nIndex++) { + vRight = oSequence1[nIndex]; + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSDouble.cast(vRight); + vValue = hAdditiveExpr_operators['+'](vValue, vRight, this); + } + return vValue; + } + catch (e) { + throw e.code != "XPTY0004" ? e : new cException("FORG0006" + , "Input to sum() contains a mix of types" + ); + } +}); + + +fStaticContext_defineSystemFunction("id", [[cXSString, '*'], [cXTNode, '', true]], function(oSequence1, oNode) { + if (arguments.length < 2) { + if (!this.DOMAdapter.isNode(this.item)) + throw new cException("XPTY0004" + , "id() function called when the context item is not a node" + ); + oNode = this.item; + } + + var oDocument = hStaticContext_functions["root"].call(this, oNode); + if (this.DOMAdapter.getProperty(oDocument, "nodeType") != 9) + throw new cException("FODC0001"); + + var oSequence = []; + for (var nIndex = 0; nIndex < oSequence1.length; nIndex++) + for (var nRightIndex = 0, aValue = fString_trim(oSequence1[nIndex]).split(/\s+/), nRightLength = aValue.length; nRightIndex < nRightLength; nRightIndex++) + if ((oNode = this.DOMAdapter.getElementById(oDocument, aValue[nRightIndex])) && fArray_indexOf(oSequence, oNode) ==-1) + oSequence.push(oNode); + return fFunction_sequence_order(oSequence, this); +}); + +fStaticContext_defineSystemFunction("idref", [[cXSString, '*'], [cXTNode, '', true]], function(oSequence1, oNode) { + throw "Function '" + "idref" + "' not implemented"; +}); + +fStaticContext_defineSystemFunction("doc", [[cXSString, '?', true]], function(oUri) { + throw "Function '" + "doc" + "' not implemented"; +}); + +fStaticContext_defineSystemFunction("doc-available", [[cXSString, '?', true]], function(oUri) { + throw "Function '" + "doc-available" + "' not implemented"; +}); + +fStaticContext_defineSystemFunction("collection", [[cXSString, '?', true]], function(oUri) { + throw "Function '" + "collection" + "' not implemented"; +}); + +fStaticContext_defineSystemFunction("element-with-id", [[cXSString, '*'], [cXTNode, '', true]], function(oSequence1, oNode) { + throw "Function '" + "element-with-id" + "' not implemented"; +}); + +function fFunction_sequence_toEBV(oSequence1, oContext) { + if (!oSequence1.length) + return false; + + var oItem = oSequence1[0]; + if (oContext.DOMAdapter.isNode(oItem)) + return true; + + if (oSequence1.length == 1) { + if (oItem instanceof cXSBoolean) + return oItem.value.valueOf(); + if (oItem instanceof cXSString) + return !!oItem.valueOf().length; + if (fXSAnyAtomicType_isNumeric(oItem)) + return !(fIsNaN(oItem.valueOf()) || oItem.valueOf() == 0); + + throw new cException("FORG0006" + , "Effective boolean value is defined only for sequences containing booleans, strings, numbers, URIs, or nodes" + ); + } + + throw new cException("FORG0006" + , "Effective boolean value is not defined for a sequence of two or more items" + ); +}; + +function fFunction_sequence_atomize(oSequence1, oContext) { + var oSequence = []; + for (var nIndex = 0, nLength = oSequence1.length, oItem, vItem; nIndex < nLength; nIndex++) { + oItem = oSequence1[nIndex]; + vItem = null; + if (oItem == null) + vItem = null; + else + if (oContext.DOMAdapter.isNode(oItem)) { + var fGetProperty = oContext.DOMAdapter.getProperty; + switch (fGetProperty(oItem, "nodeType")) { + case 1: vItem = new cXSUntypedAtomic(fGetProperty(oItem, "textContent")); + break; + case 2: vItem = new cXSUntypedAtomic(fGetProperty(oItem, "value")); + break; + case 3: case 4: case 8: vItem = new cXSUntypedAtomic(fGetProperty(oItem, "data")); + break; + case 7: vItem = new cXSUntypedAtomic(fGetProperty(oItem, "data")); + break; + case 9: var oNode = fGetProperty(oItem, "documentElement"); + vItem = new cXSUntypedAtomic(oNode ? fGetProperty(oNode, "textContent") : ''); + break; + } + } + else + if (oItem instanceof cXSAnyAtomicType) + vItem = oItem; + + if (vItem != null) + oSequence.push(vItem); + } + + return oSequence; +}; + +function fFunction_sequence_order(oSequence1, oContext) { + return oSequence1.sort(function(oNode, oNode2) { + var nPosition = oContext.DOMAdapter.compareDocumentPosition(oNode, oNode2); + return nPosition & 2 ? 1 : nPosition & 4 ?-1 : 0; + }); +}; + + + + +fStaticContext_defineSystemFunction("codepoints-to-string", [[cXSInteger, '*']], function(oSequence1) { + var aValue = []; + for (var nIndex = 0, nLength = oSequence1.length; nIndex < nLength; nIndex++) + aValue.push(cString.fromCharCode(oSequence1[nIndex])); + + return new cXSString(aValue.join('')); +}); + +fStaticContext_defineSystemFunction("string-to-codepoints", [[cXSString, '?']], function(oValue) { + if (oValue == null) + return null; + + var sValue = oValue.valueOf(); + if (sValue == '') + return []; + + var oSequence = []; + for (var nIndex = 0, nLength = sValue.length; nIndex < nLength; nIndex++) + oSequence.push(new cXSInteger(sValue.charCodeAt(nIndex))); + + return oSequence; +}); + +fStaticContext_defineSystemFunction("compare", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue1, oValue2, oCollation) { + if (oValue1 == null || oValue2 == null) + return null; + + var sCollation = this.staticContext.defaultCollationName, + vCollation; + if (arguments.length > 2) + sCollation = oCollation.valueOf(); + + vCollation = sCollation == sNS_XPF + "/collation/codepoint" ? oCodepointStringCollator : this.staticContext.getCollation(sCollation); + if (!vCollation) + throw new cException("FOCH0002" + , "Unknown collation " + '{' + sCollation + '}' + ); + + return new cXSInteger(vCollation.compare(oValue1.valueOf(), oValue2.valueOf())); +}); + +fStaticContext_defineSystemFunction("codepoint-equal", [[cXSString, '?'], [cXSString, '?']], function(oValue1, oValue2) { + if (oValue1 == null || oValue2 == null) + return null; + + + return new cXSBoolean(oValue1.valueOf() == oValue2.valueOf()); +}); + + +fStaticContext_defineSystemFunction("concat", null, function() { + if (arguments.length < 2) + throw new cException("XPST0017" + , "Function concat() must have at least 2 arguments" + ); + + var aValue = []; + for (var nIndex = 0, nLength = arguments.length, oSequence; nIndex < nLength; nIndex++) { + oSequence = arguments[nIndex]; + fFunctionCall_assertSequenceCardinality(this, oSequence, '?' + , "each argument of concat()" + ); + if (oSequence.length) + aValue[aValue.length] = cXSString.cast(fFunction_sequence_atomize(oSequence, this)[0]).valueOf(); + } + + return new cXSString(aValue.join('')); +}); + +fStaticContext_defineSystemFunction("string-join", [[cXSString, '*'], [cXSString]], function(oSequence1, oValue) { + return new cXSString(oSequence1.join(oValue)); +}); + +fStaticContext_defineSystemFunction("substring", [[cXSString, '?'], [cXSDouble], [cXSDouble, '', true]], function(oValue, oStart, oLength) { + var sValue = oValue == null ? '' : oValue.valueOf(), + nStart = cMath.round(oStart) - 1, + nEnd = arguments.length > 2 ? nStart + cMath.round(oLength) : sValue.length; + + return new cXSString(nEnd > nStart ? sValue.substring(nStart, nEnd) : ''); +}); + +fStaticContext_defineSystemFunction("string-length", [[cXSString, '?', true]], function(oValue) { + if (!arguments.length) { + if (!this.item) + throw new cException("XPDY0002"); + oValue = cXSString.cast(fFunction_sequence_atomize([this.item], this)[0]); + } + return new cXSInteger(oValue == null ? 0 : oValue.valueOf().length); +}); + +fStaticContext_defineSystemFunction("normalize-space", [[cXSString, '?', true]], function(oValue) { + if (!arguments.length) { + if (!this.item) + throw new cException("XPDY0002"); + oValue = cXSString.cast(fFunction_sequence_atomize([this.item], this)[0]); + } + return new cXSString(oValue == null ? '' : fString_trim(oValue).replace(/\s\s+/g, ' ')); +}); + +fStaticContext_defineSystemFunction("normalize-unicode", [[cXSString, '?'], [cXSString, '', true]], function(oValue, oNormalization) { + throw "Function '" + "normalize-unicode" + "' not implemented"; +}); + +fStaticContext_defineSystemFunction("upper-case", [[cXSString, '?']], function(oValue) { + return new cXSString(oValue == null ? '' : oValue.valueOf().toUpperCase()); +}); + +fStaticContext_defineSystemFunction("lower-case", [[cXSString, '?']], function(oValue) { + return new cXSString(oValue == null ? '' : oValue.valueOf().toLowerCase()); +}); + +fStaticContext_defineSystemFunction("translate", [[cXSString, '?'], [cXSString], [cXSString]], function(oValue, oMap, oTranslate) { + if (oValue == null) + return new cXSString(''); + + var aValue = oValue.valueOf().split(''), + aMap = oMap.valueOf().split(''), + aTranslate = oTranslate.valueOf().split(''), + nTranslateLength = aTranslate.length, + aReturn = []; + for (var nIndex = 0, nLength = aValue.length, nPosition; nIndex < nLength; nIndex++) + if ((nPosition = aMap.indexOf(aValue[nIndex])) ==-1) + aReturn[aReturn.length] = aValue[nIndex]; + else + if (nPosition < nTranslateLength) + aReturn[aReturn.length] = aTranslate[nPosition]; + + return new cXSString(aReturn.join('')); +}); + +fStaticContext_defineSystemFunction("encode-for-uri", [[cXSString, '?']], function(oValue) { + return new cXSString(oValue == null ? '' : window.encodeURIComponent(oValue)); +}); + +fStaticContext_defineSystemFunction("iri-to-uri", [[cXSString, '?']], function(oValue) { + return new cXSString(oValue == null ? '' : window.encodeURI(window.decodeURI(oValue))); +}); + +fStaticContext_defineSystemFunction("escape-html-uri", [[cXSString, '?']], function(oValue) { + if (oValue == null || oValue.valueOf() == '') + return new cXSString(''); + var aValue = oValue.valueOf().split(''); + for (var nIndex = 0, nLength = aValue.length, nCode; nIndex < nLength; nIndex++) + if ((nCode = aValue[nIndex].charCodeAt(0)) < 32 || nCode > 126) + aValue[nIndex] = window.encodeURIComponent(aValue[nIndex]); + return new cXSString(aValue.join('')); +}); + + +fStaticContext_defineSystemFunction("contains", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + return new cXSBoolean((oValue == null ? '' : oValue.valueOf()).indexOf(oSearch == null ? '' : oSearch.valueOf()) >= 0); +}); + +fStaticContext_defineSystemFunction("starts-with", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + return new cXSBoolean((oValue == null ? '' : oValue.valueOf()).indexOf(oSearch == null ? '' : oSearch.valueOf()) == 0); +}); + +fStaticContext_defineSystemFunction("ends-with", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + var sValue = oValue == null ? '' : oValue.valueOf(), + sSearch = oSearch == null ? '' : oSearch.valueOf(); + + return new cXSBoolean(sValue.indexOf(sSearch) == sValue.length - sSearch.length); +}); + +fStaticContext_defineSystemFunction("substring-before", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + var sValue = oValue == null ? '' : oValue.valueOf(), + sSearch = oSearch == null ? '' : oSearch.valueOf(), + nPosition; + + return new cXSString((nPosition = sValue.indexOf(sSearch)) >= 0 ? sValue.substring(0, nPosition) : ''); +}); + +fStaticContext_defineSystemFunction("substring-after", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + var sValue = oValue == null ? '' : oValue.valueOf(), + sSearch = oSearch == null ? '' : oSearch.valueOf(), + nPosition; + + return new cXSString((nPosition = sValue.indexOf(sSearch)) >= 0 ? sValue.substring(nPosition + sSearch.length) : ''); +}); + + +function fFunction_string_createRegExp(sValue, sFlags) { + var d1 = '\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF', + d2 = '\u0370-\u037D\u037F-\u1FFF\u200C-\u200D', + d3 = '\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD', + c = 'A-Z_a-z\\-.0-9\u00B7' + d1 + '\u0300-\u036F' + d2 + '\u203F-\u2040' + d3, + i = 'A-Z_a-z' + d1 + d2 + d3; + + sValue = sValue + .replace(/\[\\i-\[:\]\]/g, '[' + i + ']') + .replace(/\[\\c-\[:\]\]/g, '[' + c + ']') + .replace(/\\i/g, '[:' + i + ']') + .replace(/\\I/g, '[^:' + i + ']') + .replace(/\\c/g, '[:' + c + ']') + .replace(/\\C/g, '[^:' + c + ']'); + + if (sFlags && !sFlags.match(/^[smix]+$/)) + throw new cException("FORX0001"); + var bFlagS = sFlags.indexOf('s') >= 0, + bFlagX = sFlags.indexOf('x') >= 0; + if (bFlagS || bFlagX) { + sFlags = sFlags.replace(/[sx]/g, ''); + var aValue = [], + rValue = /\s/; + for (var nIndex = 0, nLength = sValue.length, bValue = false, sCharCurr, sCharPrev = ''; nIndex < nLength; nIndex++) { + sCharCurr = sValue.charAt(nIndex); + if (sCharPrev != '\\') { + if (sCharCurr == '[') + bValue = true; + else + if (sCharCurr == ']') + bValue = false; + } + if (bValue || !(bFlagX && rValue.test(sCharCurr))) { + if (!bValue && (bFlagS && sCharCurr == '.' && sCharPrev != '\\')) + aValue[aValue.length] = '(?:.|\\s)'; + else + aValue[aValue.length] = sCharCurr; + } + sCharPrev = sCharCurr; + } + sValue = aValue.join(''); + } + + return new cRegExp(sValue, sFlags + 'g'); +}; + +fStaticContext_defineSystemFunction("matches", [[cXSString, '?'], [cXSString], [cXSString, '', true]], function(oValue, oPattern, oFlags) { + var sValue = oValue == null ? '' : oValue.valueOf(), + rRegExp = fFunction_string_createRegExp(oPattern.valueOf(), arguments.length > 2 ? oFlags.valueOf() : ''); + + return new cXSBoolean(rRegExp.test(sValue)); +}); + +fStaticContext_defineSystemFunction("replace", [[cXSString, '?'], [cXSString], [cXSString], [cXSString, '', true]], function(oValue, oPattern, oReplacement, oFlags) { + var sValue = oValue == null ? '' : oValue.valueOf(), + rRegExp = fFunction_string_createRegExp(oPattern.valueOf(), arguments.length > 3 ? oFlags.valueOf() : ''); + + return new cXSBoolean(sValue.replace(rRegExp, oReplacement.valueOf())); +}); + +fStaticContext_defineSystemFunction("tokenize", [[cXSString, '?'], [cXSString], [cXSString, '', true]], function(oValue, oPattern, oFlags) { + var sValue = oValue == null ? '' : oValue.valueOf(), + rRegExp = fFunction_string_createRegExp(oPattern.valueOf(), arguments.length > 2 ? oFlags.valueOf() : ''); + + var oSequence = []; + for (var nIndex = 0, aValue = sValue.split(rRegExp), nLength = aValue.length; nIndex < nLength; nIndex++) + oSequence.push(new cXSString(aValue[nIndex])); + + return oSequence; +}); + + + + +fStaticContext_defineSystemFunction("trace", [[cXTItem, '*'], [cXSString]], function(oSequence1, oLabel) { + var oConsole = window.console; + if (oConsole && oConsole.log) + oConsole.log(oLabel.valueOf(), oSequence1); + return oSequence1; +}); + + +var oCodepointStringCollator = new cStringCollator; + +oCodepointStringCollator.equals = function(sValue1, sValue2) { + return sValue1 == sValue2; +}; + +oCodepointStringCollator.compare = function(sValue1, sValue2) { + return sValue1 == sValue2 ? 0 : sValue1 > sValue2 ? 1 :-1; +}; + + +var cAttr = function() { + +}; + +cAttr.prototype.nodeType = 2; +cAttr.prototype.nodeName = +cAttr.prototype.nodeValue = +cAttr.prototype.ownerDocument = +cAttr.prototype.localName = +cAttr.prototype.namespaceURI = +cAttr.prototype.prefix = +cAttr.prototype.attributes = +cAttr.prototype.childNodes = +cAttr.prototype.firstChild = +cAttr.prototype.lastChild = +cAttr.prototype.previousSibling = +cAttr.prototype.nextSibling = +cAttr.prototype.parentNode = + +cAttr.prototype.name = +cAttr.prototype.specified = +cAttr.prototype.value = +cAttr.prototype.ownerElement = null; + + +function cLXDOMAdapter() { + +}; + +cLXDOMAdapter.prototype = new cDOMAdapter; + +var oLXDOMAdapter_staticContext = new cStaticContext; + +cLXDOMAdapter.prototype.getProperty = function(oNode, sName) { + if (sName in oNode) + return oNode[sName]; + + if (sName == "baseURI") { + var sBaseURI = '', + fResolveUri = oLXDOMAdapter_staticContext.getFunction('{' + "http://www.w3.org/2005/xpath-functions" + '}' + "resolve-uri"), + cXSString = oLXDOMAdapter_staticContext.getDataType('{' + "http://www.w3.org/2001/XMLSchema" + '}' + "string"); + + for (var oParent = oNode, sUri; oParent; oParent = oParent.parentNode) + if (oParent.nodeType == 1 && (sUri = oParent.getAttribute("xml:base"))) + sBaseURI = fResolveUri(new cXSString(sUri), new cXSString(sBaseURI)).toString(); + return sBaseURI; + } + else + if (sName == "textContent") { + var aText = []; + (function(oNode) { + for (var nIndex = 0, oChild; oChild = oNode.childNodes[nIndex]; nIndex++) + if (oChild.nodeType == 3 || oChild.nodeType == 4 ) + aText.push(oChild.data); + else + if (oChild.nodeType == 1 && oChild.firstChild) + arguments.callee(oChild); + })(oNode); + return aText.join(''); + } +}; + +cLXDOMAdapter.prototype.compareDocumentPosition = function(oNode, oChild) { + if ("compareDocumentPosition" in oNode) + return oNode.compareDocumentPosition(oChild); + + if (oChild == oNode) + return 0; + + var oAttr1 = null, + oAttr2 = null, + aAttributes, + oAttr, oElement, nIndex, nLength; + if (oNode.nodeType == 2 ) { + oAttr1 = oNode; + oNode = this.getProperty(oAttr1, "ownerElement"); + } + if (oChild.nodeType == 2 ) { + oAttr2 = oChild; + oChild = this.getProperty(oAttr2, "ownerElement"); + } + + if (oAttr1 && oAttr2 && oNode && oNode == oChild) { + for (nIndex = 0, aAttributes = this.getProperty(oNode, "attributes"), nLength = aAttributes.length; nIndex < nLength; nIndex++) { + oAttr = aAttributes[nIndex]; + if (oAttr == oAttr1) + return 32 | 4 ; + if (oAttr == oAttr2) + return 32 | 2 ; + } + } + + var aChain1 = [], nLength1, oNode1, + aChain2 = [], nLength2, oNode2; + if (oAttr1) + aChain1.push(oAttr1); + for (oElement = oNode; oElement; oElement = oElement.parentNode) + aChain1.push(oElement); + if (oAttr2) + aChain2.push(oAttr2); + for (oElement = oChild; oElement; oElement = oElement.parentNode) + aChain2.push(oElement); + if (((oNode.ownerDocument || oNode) != (oChild.ownerDocument || oChild)) || (aChain1[aChain1.length - 1] != aChain2[aChain2.length - 1])) + return 32 | 1 ; + for (nIndex = cMath.min(nLength1 = aChain1.length, nLength2 = aChain2.length); nIndex; --nIndex) + if ((oNode1 = aChain1[--nLength1]) != (oNode2 = aChain2[--nLength2])) { + if (oNode1.nodeType == 2 ) + return 4 ; + if (oNode2.nodeType == 2 ) + return 2 ; + if (!oNode2.nextSibling) + return 4 ; + if (!oNode1.nextSibling) + return 2 ; + for (oElement = oNode2.previousSibling; oElement; oElement = oElement.previousSibling) + if (oElement == oNode1) + return 4 ; + return 2 ; + } + return nLength1 < nLength2 ? 4 | 16 : 2 | 8 ; +}; + +cLXDOMAdapter.prototype.lookupNamespaceURI = function(oNode, sPrefix) { + if ("lookupNamespaceURI" in oNode) + return oNode.lookupNamespaceURI(sPrefix); + + for (; oNode && oNode.nodeType != 9 ; oNode = oNode.parentNode) + if (sPrefix == this.getProperty(oChild, "prefix")) + return this.getProperty(oNode, "namespaceURI"); + else + if (oNode.nodeType == 1) for (var oAttributes = this.getProperty(oNode, "attributes"), nIndex = 0, nLength = oAttributes.length, sName = "xmlns" + ':' + sPrefix; nIndex < nLength; nIndex++) + if (this.getProperty(oAttributes[nIndex], "nodeName") == sName) + return this.getProperty(oAttributes[nIndex], "value"); + return null; +}; + +cLXDOMAdapter.prototype.getElementsByTagNameNS = function(oNode, sNameSpaceURI, sLocalName) { + if ("getElementsByTagNameNS" in oNode) + return oNode.getElementsByTagNameNS(sNameSpaceURI, sLocalName); + + var aElements = [], + bNameSpaceURI = '*' == sNameSpaceURI, + bLocalName = '*' == sLocalName; + (function(oNode) { + for (var nIndex = 0, oChild; oChild = oNode.childNodes[nIndex]; nIndex++) + if (oChild.nodeType == 1) { if ((bLocalName || sLocalName == this.getProperty(oChild, "localName")) && (bNameSpaceURI || sNameSpaceURI == this.getProperty(oChild, "namespaceURI"))) + aElements[aElements.length] = oChild; + if (oChild.firstChild) + arguments.callee(oChild); + } + })(oNode); + return aElements; +}; + + +var oL2DOMAdapter = new cLXDOMAdapter; + + + +var oL2HTMLDOMAdapter = new cLXDOMAdapter; + +oL2HTMLDOMAdapter.getProperty = function(oNode, sName) { + if (sName == "localName") { + if (oNode.nodeType == 1) + return oNode.localName.toLowerCase(); + } + if (sName == "namespaceURI") + return oNode.nodeType == 1 ? "http://www.w3.org/1999/xhtml" : null; + return cLXDOMAdapter.prototype.getProperty.call(this, oNode, sName); +}; + + +var oMSHTMLDOMAdapter = new cLXDOMAdapter; + +oMSHTMLDOMAdapter.getProperty = function(oNode, sName) { + if (sName == "localName") { + if (oNode.nodeType == 1) + return oNode.nodeName.toLowerCase(); + } + if (sName == "prefix") + return null; + if (sName == "namespaceURI") + return oNode.nodeType == 1 ? "http://www.w3.org/1999/xhtml" : null; + if (sName == "textContent") + return oNode.innerText; + if (sName == "attributes" && oNode.nodeType == 1) { + var aAttributes = []; + for (var nIndex = 0, oAttributes = oNode.attributes, nLength = oAttributes.length, oNode2, oAttribute; nIndex < nLength; nIndex++) { + oNode2 = oAttributes[nIndex]; + if (oNode2.specified) { + oAttribute = new cAttr; + oAttribute.ownerElement = oNode; + oAttribute.ownerDocument= oNode.ownerDocument; + oAttribute.specified = true; + oAttribute.value = + oAttribute.nodeValue = oNode2.nodeValue; + oAttribute.name = + oAttribute.nodeName = + oAttribute.localName = oNode2.nodeName.toLowerCase(); + aAttributes[aAttributes.length] = oAttribute; + } + } + return aAttributes; + } + return cLXDOMAdapter.prototype.getProperty.call(this, oNode, sName); +}; + + +var oMSXMLDOMAdapter = new cLXDOMAdapter; + +oMSXMLDOMAdapter.getProperty = function(oNode, sName) { + if (sName == "localName") { + if (oNode.nodeType == 7) + return null; + if (oNode.nodeType == 1) + return oNode.baseName; + } + if (sName == "prefix" || sName == "namespaceURI") + return oNode[sName] || null; + if (sName == "textContent") + return oNode.text; + if (sName == "attributes" && oNode.nodeType == 1) { + var aAttributes = []; + for (var nIndex = 0, oAttributes = oNode.attributes, nLength = oAttributes.length, oNode2, oAttribute; nIndex < nLength; nIndex++) { + oNode2 = oAttributes[nIndex]; + if (oNode2.specified) { + oAttribute = new cAttr; + oAttribute.nodeType = 2; + oAttribute.ownerElement = oNode; + oAttribute.ownerDocument= oNode.ownerDocument; + oAttribute.specified = true; + oAttribute.value = + oAttribute.nodeValue = oNode2.nodeValue; + oAttribute.name = + oAttribute.nodeName = oNode2.nodeName; + oAttribute.localName = oNode2.baseName; + oAttribute.prefix = oNode2.prefix || null; + oAttribute.namespaceURI = oNode2.namespaceURI || null; + aAttributes[aAttributes.length] = oAttribute; + } + } + return aAttributes; + } + return cLXDOMAdapter.prototype.getProperty.call(this, oNode, sName); +}; + +oMSXMLDOMAdapter.getElementById = function(oDocument, sId) { + return oDocument.nodeFromID(sId); +}; + + + + +var cQuery = window.jQuery, + oDocument = window.document, + bOldMS = !!oDocument.namespaces && !oDocument.createElementNS, + bOldW3 = !bOldMS && oDocument.documentElement.namespaceURI != "http://www.w3.org/1999/xhtml"; + +var oHTMLStaticContext = new cStaticContext, + oXMLStaticContext = new cStaticContext; + +oHTMLStaticContext.baseURI = oDocument.location.href; +oHTMLStaticContext.defaultFunctionNamespace = "http://www.w3.org/2005/xpath-functions"; +oHTMLStaticContext.defaultElementNamespace = "http://www.w3.org/1999/xhtml"; + +oXMLStaticContext.defaultFunctionNamespace = oHTMLStaticContext.defaultFunctionNamespace; + +function fXPath_evaluate(oQuery, sExpression, fNSResolver) { + if (typeof sExpression == "undefined" || sExpression === null) + sExpression = ''; + + var oNode = oQuery[0]; + if (typeof oNode == "undefined") + oNode = null; + + var oStaticContext = oNode && (oNode.nodeType == 9 ? oNode : oNode.ownerDocument).createElement("div").tagName == "DIV" ? oHTMLStaticContext : oXMLStaticContext; + + oStaticContext.namespaceResolver = fNSResolver; + + var oExpression = new cExpression(cString(sExpression), oStaticContext); + + oStaticContext.namespaceResolver = null; + + var aSequence, + oSequence = new cQuery, + oAdapter = oL2DOMAdapter; + + if (bOldMS) + oAdapter = oStaticContext == oHTMLStaticContext ? oMSHTMLDOMAdapter : oMSXMLDOMAdapter; + else + if (bOldW3 && oStaticContext == oHTMLStaticContext) + oAdapter = oL2HTMLDOMAdapter; + + aSequence = oExpression.evaluate(new cDynamicContext(oStaticContext, oNode, null, oAdapter)); + for (var nIndex = 0, nLength = aSequence.length, oItem; nIndex < nLength; nIndex++) + oSequence.push(oAdapter.isNode(oItem = aSequence[nIndex]) ? oItem : cStaticContext.xs2js(oItem)); + + return oSequence; +}; + +var oObject = {}; +oObject.xpath = function(oQuery, sExpression, fNSResolver) { + return fXPath_evaluate(oQuery instanceof cQuery ? oQuery : new cQuery(oQuery), sExpression, fNSResolver); +}; +cQuery.extend(cQuery, oObject); + +oObject = {}; +oObject.xpath = function(sExpression, fNSResolver) { + return fXPath_evaluate(this, sExpression, fNSResolver); +}; +cQuery.extend(cQuery.prototype, oObject); + +})(); diff --git a/src/js/operations/Extract.js b/src/js/operations/Extract.js index fdab5591..01ebfd3a 100755 --- a/src/js/operations/Extract.js +++ b/src/js/operations/Extract.js @@ -10,7 +10,7 @@ var Extract = { /** - * Runs search operations across the input data using refular expressions. + * Runs search operations across the input data using regular expressions. * * @private * @param {string} input @@ -293,5 +293,66 @@ var Extract = { output += Extract.run_dates(input, []); return output; }, - + + /** + * @constant + * @default + */ + XPATH_INITIAL: "", + + /** + * @constant + * @default + */ + XPATH_DELIMITER: "\\n", + + /** + * Extract information (from an xml document) with an XPath query + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + run_xpath:function(input, args) { + var query = args[0]; + var delimiter = args[1]; + + try { + var xml = $.parseXML(input); + } catch (err) { + return "Invalid input XML."; + } + + try { + var result = $.xpath(xml, query); + } catch (err) { + return "Invalid XPath. Details:\n" + err.message; + } + + var serializer = new XMLSerializer(); + var output = ""; + for (var i = 0; i < result.length; i++) { + if (i > 0) output += delimiter; + + switch (result[i].nodeType) { + case Node.ELEMENT_NODE: + output += serializer.serializeToString(result[i]); + break; + case Node.ATTRIBUTE_NODE: + output += result[i].value; + break; + case Node.TEXT_NODE: + output += result[i].wholeText; + break; + case Node.COMMENT_NODE: + output += result[i].data; + break; + default: + throw new Error("Unknown Node Type: " + result[i].nodeType); + } + } + + return output; + } + }; From befb89ba761e71d0bc1bc87c8f98819b983404ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schw=C3=B6rer=20Mike?= Date: Wed, 30 Nov 2016 09:56:02 +0100 Subject: [PATCH 02/12] reverted .gitignore and no for-loop in run_xpath --- .gitignore | 1 - src/js/operations/Extract.js | 31 ++++++++++--------------------- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 77d1e64a..482be5c7 100755 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,3 @@ build/dev docs/* !docs/*.conf.json !docs/*.ico -.idea/* \ No newline at end of file diff --git a/src/js/operations/Extract.js b/src/js/operations/Extract.js index 01ebfd3a..41644762 100755 --- a/src/js/operations/Extract.js +++ b/src/js/operations/Extract.js @@ -330,29 +330,18 @@ var Extract = { } var serializer = new XMLSerializer(); - var output = ""; - for (var i = 0; i < result.length; i++) { - if (i > 0) output += delimiter; - - switch (result[i].nodeType) { - case Node.ELEMENT_NODE: - output += serializer.serializeToString(result[i]); - break; - case Node.ATTRIBUTE_NODE: - output += result[i].value; - break; - case Node.TEXT_NODE: - output += result[i].wholeText; - break; - case Node.COMMENT_NODE: - output += result[i].data; - break; - default: - throw new Error("Unknown Node Type: " + result[i].nodeType); + var nodeToString = function(node) { + const { nodeType, value, wholeText, data } = node; + switch (nodeType) { + case Node.ELEMENT_NODE: return serializer.serializeToString(node); + case Node.ATTRIBUTE_NODE: return value; + case Node.COMMENT_NODE: return data; + default: throw new Error(`Unknown Node Type: ${nodeType}`); } } - return output; + return Object.values(result).slice(0, -1) // all values except last (length) + .map(nodeToString) + .join(delimiter); } - }; From d5f84abb3baa8a2018dfaa826fdd169d52d4ba99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schw=C3=B6rer=20Mike?= Date: Wed, 30 Nov 2016 12:23:19 +0100 Subject: [PATCH 03/12] declare function as const and added Node.DOCUMENT_NODE --- src/js/operations/Extract.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/operations/Extract.js b/src/js/operations/Extract.js index 41644762..6ee0b071 100755 --- a/src/js/operations/Extract.js +++ b/src/js/operations/Extract.js @@ -330,12 +330,13 @@ var Extract = { } var serializer = new XMLSerializer(); - var nodeToString = function(node) { + const nodeToString = function(node) { const { nodeType, value, wholeText, data } = node; switch (nodeType) { case Node.ELEMENT_NODE: return serializer.serializeToString(node); case Node.ATTRIBUTE_NODE: return value; case Node.COMMENT_NODE: return data; + case Node.DOCUMENT_NODE: return serializer.serializeToString(node); default: throw new Error(`Unknown Node Type: ${nodeType}`); } } From 2db6f8f63c3165d57b1cd8c91984a5f2a3cf0c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schw=C3=B6rer=20Mike?= Date: Fri, 2 Dec 2016 12:49:49 +0100 Subject: [PATCH 04/12] added css_query operation --- src/js/config/Categories.js | 1 + src/js/config/OperationConfig.js | 18 ++++++++++ src/js/operations/Extract.js | 62 +++++++++++++++++++++++++++++--- 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/src/js/config/Categories.js b/src/js/config/Categories.js index 5120e5c9..09912a95 100755 --- a/src/js/config/Categories.js +++ b/src/js/config/Categories.js @@ -187,6 +187,7 @@ var Categories = [ "Extract dates", "Regular expression", "XPath expression", + "CSS selector", ] }, { diff --git a/src/js/config/OperationConfig.js b/src/js/config/OperationConfig.js index dec017e0..98539c3a 100755 --- a/src/js/config/OperationConfig.js +++ b/src/js/config/OperationConfig.js @@ -1911,6 +1911,24 @@ var OperationConfig = { } ] }, + "CSS selector": { + description: "Extract information from an HTML document with an CSS selector", + run: Extract.run_css_query, + input_type: "string", + output_type: "string", + args: [ + { + name: "CSS selector", + type: "string", + value: Extract.SELECTOR_INITIAL + }, + { + name: "Delimiter", + type: "binary_short_string", + value: Extract.CSS_QUERY_DELIMITER + }, + ] + }, "From UNIX Timestamp": { description: "Converts a UNIX timestamp to a datetime string.

e.g. 978346800 becomes Mon 1 January 2001 11:00:00 UTC", run: DateTime.run_from_unix_timestamp, diff --git a/src/js/operations/Extract.js b/src/js/operations/Extract.js index 6ee0b071..5582baee 100755 --- a/src/js/operations/Extract.js +++ b/src/js/operations/Extract.js @@ -314,8 +314,8 @@ var Extract = { * @returns {string} */ run_xpath:function(input, args) { - var query = args[0]; - var delimiter = args[1]; + const query = args[0]; + const delimiter = args[1]; try { var xml = $.parseXML(input); @@ -329,7 +329,7 @@ var Extract = { return "Invalid XPath. Details:\n" + err.message; } - var serializer = new XMLSerializer(); + const serializer = new XMLSerializer(); const nodeToString = function(node) { const { nodeType, value, wholeText, data } = node; switch (nodeType) { @@ -344,5 +344,59 @@ var Extract = { return Object.values(result).slice(0, -1) // all values except last (length) .map(nodeToString) .join(delimiter); - } + }, + + + /** + * @constant + * @default + */ + SELECTOR_INITIAL: "", + /** + * @constant + * @default + */ + CSS_QUERY_DELIMITER: "\\n", + + /** + * Extract information (from an hmtl document) with an css selector + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + run_css_query: function(input, args) { + const query = args[0]; + const delimiter = args[1]; + + try { + var html = $.parseHTML(input); + } catch (err) { + return "Invalid input HTML."; + } + + try { + var result = $(html).find(query); + } catch (err) { + return "Invalid CSS Selector. Details:\n" + err.message; + } + + const nodeToString = function(node) { + const { nodeType, value, wholeText, data } = node; + switch (nodeType) { + case Node.ELEMENT_NODE: return node.outerHTML; + case Node.ATTRIBUTE_NODE: return value; + case Node.COMMENT_NODE: return data; + case Node.TEXT_NODE: return wholeText; + case Node.DOCUMENT_NODE: return node.outerHTML; + default: throw new Error(`Unknown Node Type: ${nodeType}`); + } + } + + return Array.apply(null, Array(result.length)) + .map(function (_, i) {return result[i];}) + .map(nodeToString) + .join(delimiter); + }, + }; From 662805d11e781bfc4f442b82e079d96968401192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Mon, 5 Dec 2016 19:47:41 +0100 Subject: [PATCH 05/12] fixed a few jshint warnings and uglify:prod problems --- src/js/.jshintrc | 1 + src/js/operations/Extract.js | 38 +++++++++++++++++++----------------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/js/.jshintrc b/src/js/.jshintrc index 7dc0b5ac..d6ad3ca3 100755 --- a/src/js/.jshintrc +++ b/src/js/.jshintrc @@ -1,4 +1,5 @@ { + "esversion": 6, "strict": "implied", "multistr": true, "browser": true, diff --git a/src/js/operations/Extract.js b/src/js/operations/Extract.js index 5582baee..2dc346be 100755 --- a/src/js/operations/Extract.js +++ b/src/js/operations/Extract.js @@ -317,29 +317,30 @@ var Extract = { const query = args[0]; const delimiter = args[1]; + var xml; try { - var xml = $.parseXML(input); + xml = $.parseXML(input); } catch (err) { return "Invalid input XML."; } + var result; try { - var result = $.xpath(xml, query); + result = $.xpath(xml, query); } catch (err) { return "Invalid XPath. Details:\n" + err.message; } const serializer = new XMLSerializer(); const nodeToString = function(node) { - const { nodeType, value, wholeText, data } = node; - switch (nodeType) { + switch (node.nodeType) { case Node.ELEMENT_NODE: return serializer.serializeToString(node); - case Node.ATTRIBUTE_NODE: return value; - case Node.COMMENT_NODE: return data; + case Node.ATTRIBUTE_NODE: return node.value; + case Node.COMMENT_NODE: return node.data; case Node.DOCUMENT_NODE: return serializer.serializeToString(node); - default: throw new Error(`Unknown Node Type: ${nodeType}`); + default: throw new Error("Unknown Node Type: " + node.nodeType); } - } + }; return Object.values(result).slice(0, -1) // all values except last (length) .map(nodeToString) @@ -369,29 +370,30 @@ var Extract = { const query = args[0]; const delimiter = args[1]; + var html; try { - var html = $.parseHTML(input); + html = $.parseHTML(input); } catch (err) { return "Invalid input HTML."; } - + + var result; try { - var result = $(html).find(query); + result = $(html).find(query); } catch (err) { return "Invalid CSS Selector. Details:\n" + err.message; } const nodeToString = function(node) { - const { nodeType, value, wholeText, data } = node; - switch (nodeType) { + switch (node.nodeType) { case Node.ELEMENT_NODE: return node.outerHTML; - case Node.ATTRIBUTE_NODE: return value; - case Node.COMMENT_NODE: return data; - case Node.TEXT_NODE: return wholeText; + case Node.ATTRIBUTE_NODE: return node.value; + case Node.COMMENT_NODE: return node.ata; + case Node.TEXT_NODE: return node.wholeText; case Node.DOCUMENT_NODE: return node.outerHTML; - default: throw new Error(`Unknown Node Type: ${nodeType}`); + default: throw new Error("Unknown Node Type: " + node.nodeType); } - } + }; return Array.apply(null, Array(result.length)) .map(function (_, i) {return result[i];}) From dea16f63f555e34919c256e80db7d4d1701c4ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Fri, 16 Dec 2016 22:32:19 +0100 Subject: [PATCH 06/12] Small stuff to make eslint happy --- Gruntfile.js | 2 +- src/js/operations/Extract.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 05373d1b..8238e7a5 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -130,7 +130,7 @@ module.exports = function(grunt) { "src/js/lib/vkbeautify.js", "src/js/lib/Sortable.js", "src/js/lib/bootstrap-colorpicker.js", - 'src/js/lib/jquery.xpath.js', + "src/js/lib/jquery.xpath.js", // Custom libraries "src/js/lib/canvas_components.js", diff --git a/src/js/operations/Extract.js b/src/js/operations/Extract.js index 1ded1dc8..f84719e6 100755 --- a/src/js/operations/Extract.js +++ b/src/js/operations/Extract.js @@ -396,7 +396,7 @@ var Extract = { }; return Array.apply(null, Array(result.length)) - .map(function (_, i) {return result[i];}) + .map((_, i) => result[i]) .map(nodeToString) .join(delimiter); }, From 8db1b2fc79b6b3f770eb6f55686cfa125498a9f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Sat, 17 Dec 2016 00:33:47 +0100 Subject: [PATCH 07/12] switched from jquery.cpath.js to xpath.js --- Gruntfile.js | 2 +- src/js/lib/{jquery.xpath.js => xpath.js} | 3528 +++++++++++++++++----- src/js/operations/Extract.js | 16 +- 3 files changed, 2820 insertions(+), 726 deletions(-) rename src/js/lib/{jquery.xpath.js => xpath.js} (69%) diff --git a/Gruntfile.js b/Gruntfile.js index 8238e7a5..96f22d76 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -130,7 +130,7 @@ module.exports = function(grunt) { "src/js/lib/vkbeautify.js", "src/js/lib/Sortable.js", "src/js/lib/bootstrap-colorpicker.js", - "src/js/lib/jquery.xpath.js", + "src/js/lib/xpath.js", // Custom libraries "src/js/lib/canvas_components.js", diff --git a/src/js/lib/jquery.xpath.js b/src/js/lib/xpath.js similarity index 69% rename from src/js/lib/jquery.xpath.js rename to src/js/lib/xpath.js index 33f42221..4a1e3d7d 100644 --- a/src/js/lib/jquery.xpath.js +++ b/src/js/lib/xpath.js @@ -1,18 +1,13 @@ -/* - * jQuery XPath plugin v0.3.1 - * https://github.com/ilinsky/jquery-xpath - * Copyright 2015, Sergey Ilinsky +(function(){/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky * Dual licensed under the MIT and GPL licenses. * - * Includes xpath.js - XPath 2.0 implementation in JavaScript - * https://github.com/ilinsky/xpath.js - * Copyright 2015, Sergey Ilinsky - * Dual licensed under the MIT and GPL licenses. * */ -(function () { - +// Javascript objects var cString = window.String, cBoolean = window.Boolean, cNumber = window.Number, @@ -22,14 +17,17 @@ var cString = window.String, cDate = window.Date, cFunction = window.Function, cMath = window.Math, +// Error Objects cError = window.Error, cSyntaxError= window.SyntaxError, cTypeError = window.TypeError, +// misc fIsNaN = window.isNaN, fIsFinite = window.isFinite, nNaN = window.NaN, nInfinity = window.Infinity, - fWindow_btoa = window.btoa, + // Functions + fWindow_btoa = window.btoa, fWindow_atob = window.atob, fWindow_parseInt= window.parseInt, fString_trim =(function() { @@ -51,19 +49,28 @@ var sNS_XSD = "http://www.w3.org/2001/XMLSchema", sNS_XNS = "http://www.w3.org/2000/xmlns/", sNS_XML = "http://www.w3.org/XML/1998/namespace"; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cException(sCode - , sMessage + ) { this.code = sCode; this.message = - sMessage || + oException_messages[sCode]; }; cException.prototype = new cError; +// "http://www.w3.org/2005/xqt-errors" var oException_messages = {}; oException_messages["XPDY0002"] = "Evaluation of an expression relies on some part of the dynamic context that has not been assigned a value."; @@ -77,21 +84,34 @@ oException_messages["XPTY0019"] = "The result of a step (other than the last ste oException_messages["XPTY0020"] = "In an axis step, the context item is not a node."; oException_messages["XPST0051"] = "It is a static error if a QName that is used as an AtomicType in a SequenceType is not defined in the in-scope schema types as an atomic type."; oException_messages["XPST0081"] = "A QName used in an expression contains a namespace prefix that cannot be expanded into a namespace URI by using the statically known namespaces."; +// oException_messages["FORG0001"] = "Invalid value for cast/constructor."; oException_messages["FORG0003"] = "fn:zero-or-one called with a sequence containing more than one item."; oException_messages["FORG0004"] = "fn:one-or-more called with a sequence containing no items."; oException_messages["FORG0005"] = "fn:exactly-one called with a sequence containing zero or more than one item."; oException_messages["FORG0006"] = "Invalid argument type."; +// oException_messages["FODC0001"] = "No context document."; +// oException_messages["FORX0001"] = "Invalid regular expression flags."; +// oException_messages["FOCA0002"] = "Invalid lexical value."; +// oException_messages["FOCH0002"] = "Unsupported collation."; oException_messages["FONS0004"] = "No namespace found for prefix."; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cLexer(sValue) { - var aMatch = sValue.match(/\$?(?:(?![0-9-])(?:[\w-]+|\*):)?(?![0-9-])(?:[\w-]+|\*)|\(:|:\)|\/\/|\.\.|::|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?|"[^"]*(?:""[^"]*)*"|'[^']*(?:''[^']*)*'|<<|>>|[!<>]=|(?![0-9-])[\w-]+:\*|\s+|./g); + var aMatch = sValue.match(/\$?(?:(?![0-9-])(?:\w[\w.-]*|\*):)?(?![0-9-])(?:\w[\w.-]*|\*)|\(:|:\)|\/\/|\.\.|::|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?|"[^"]*(?:""[^"]*)*"|'[^']*(?:''[^']*)*'|<<|>>|[!<>]=|(?![0-9-])[\w-]+:\*|\s+|./g); if (aMatch) { var nStack = 0; for (var nIndex = 0, nLength = aMatch.length; nIndex < nLength; nIndex++) @@ -105,7 +125,7 @@ function cLexer(sValue) { this[this.length++] = aMatch[nIndex]; if (nStack) throw new cException("XPST0003" - , "Unclosed comment" + ); } }; @@ -133,11 +153,20 @@ cLexer.prototype.eof = function() { return this.index >= this.length; }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cDOMAdapter() { }; +// Custom members cDOMAdapter.prototype.isNode = function(oNode) { return oNode &&!!oNode.nodeType; }; @@ -146,6 +175,7 @@ cDOMAdapter.prototype.getProperty = function(oNode, sName) { return oNode[sName]; }; +// Standard members cDOMAdapter.prototype.isSameNode = function(oNode, oNode2) { return oNode == oNode2; }; @@ -158,22 +188,37 @@ cDOMAdapter.prototype.lookupNamespaceURI = function(oNode, sPrefix) { return oNode.lookupNamespaceURI(sPrefix); }; +// Document object members cDOMAdapter.prototype.getElementById = function(oNode, sId) { return oNode.getElementById(sId); }; +// Element/Document object members cDOMAdapter.prototype.getElementsByTagNameNS = function(oNode, sNameSpaceURI, sLocalName) { return oNode.getElementsByTagNameNS(sNameSpaceURI, sLocalName); }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cDynamicContext(oStaticContext, vItem, oScope, oDOMAdapter) { - this.staticContext = oStaticContext; - this.item = vItem; - this.scope = oScope || {}; + // + this.staticContext = oStaticContext; + // + this.item = vItem; + // + this.scope = oScope || {}; this.stack = {}; - this.DOMAdapter = oDOMAdapter || new cDOMAdapter; - var oDate = new cDate, + // + this.DOMAdapter = oDOMAdapter || new cDOMAdapter; + // + var oDate = new cDate, nOffset = oDate.getTimezoneOffset(); this.dateTime = new cXSDateTime(oDate.getFullYear(), oDate.getMonth() + 1, oDate.getDate(), oDate.getHours(), oDate.getMinutes(), oDate.getSeconds() + oDate.getMilliseconds() / 1000, -nOffset); this.timezone = new cXSDayTimeDuration(0, cMath.abs(~~(nOffset / 60)), cMath.abs(nOffset % 60), 0, nOffset > 0); @@ -182,11 +227,16 @@ function cDynamicContext(oStaticContext, vItem, oScope, oDOMAdapter) { cDynamicContext.prototype.item = null; cDynamicContext.prototype.position = 0; cDynamicContext.prototype.size = 0; +// cDynamicContext.prototype.scope = null; -cDynamicContext.prototype.stack = null; cDynamicContext.prototype.dateTime = null; +cDynamicContext.prototype.stack = null; // Variables stack +// +cDynamicContext.prototype.dateTime = null; cDynamicContext.prototype.timezone = null; +// cDynamicContext.prototype.staticContext = null; +// Stack management cDynamicContext.prototype.pushVariable = function(sName, vValue) { if (!this.stack.hasOwnProperty(sName)) this.stack[sName] = []; @@ -204,7 +254,14 @@ cDynamicContext.prototype.popVariable = function(sName) { } } }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cStaticContext() { this.dataTypes = {}; @@ -215,17 +272,24 @@ function cStaticContext() { }; cStaticContext.prototype.baseURI = null; +// cStaticContext.prototype.dataTypes = null; cStaticContext.prototype.documents = null; +// cStaticContext.prototype.functions = null; cStaticContext.prototype.defaultFunctionNamespace = null; +// cStaticContext.prototype.collations = null; cStaticContext.prototype.defaultCollationName = sNS_XPF + "/collation/codepoint"; +// cStaticContext.prototype.collections = null; +// cStaticContext.prototype.namespaceResolver = null; cStaticContext.prototype.defaultElementNamespace = null; +// var rStaticContext_uri = /^(?:\{([^\}]+)\})?(.+)$/; +// cStaticContext.prototype.setDataType = function(sUri, fFunction) { var aMatch = sUri.match(rStaticContext_uri); if (aMatch) @@ -236,13 +300,17 @@ cStaticContext.prototype.setDataType = function(sUri, fFunction) { cStaticContext.prototype.getDataType = function(sUri) { var aMatch = sUri.match(rStaticContext_uri); if (aMatch) - return aMatch[1] == sNS_XSD ? hStaticContext_dataTypes[cRegExp.$2] : this.dataTypes[sUri]; + return aMatch[1] == sNS_XSD ? hStaticContext_dataTypes[aMatch[2]] : this.dataTypes[sUri]; }; cStaticContext.prototype.setDocument = function(sUri, fFunction) { this.documents[sUri] = fFunction; }; +cStaticContext.prototype.getDocument = function(sUri) { + return this.documents[sUri]; +}; + cStaticContext.prototype.setFunction = function(sUri, fFunction) { var aMatch = sUri.match(rStaticContext_uri); if (aMatch) @@ -253,7 +321,7 @@ cStaticContext.prototype.setFunction = function(sUri, fFunction) { cStaticContext.prototype.getFunction = function(sUri) { var aMatch = sUri.match(rStaticContext_uri); if (aMatch) - return aMatch[1] == sNS_XPF ? hStaticContext_functions[cRegExp.$2] : this.functions[sUri]; + return aMatch[1] == sNS_XPF ? hStaticContext_functions[aMatch[2]] : this.functions[sUri]; }; cStaticContext.prototype.setCollation = function(sUri, fFunction) { @@ -264,11 +332,14 @@ cStaticContext.prototype.getCollation = function(sUri) { return this.collations[sUri]; }; - cStaticContext.prototype.setCollection = function(sUri, fFunction) { this.collections[sUri] = fFunction; }; +cStaticContext.prototype.getCollection = function(sUri) { + return this.collections[sUri]; +}; + cStaticContext.prototype.getURIForPrefix = function(sPrefix) { var oResolver = this.namespaceResolver, fResolver = oResolver && oResolver.lookupNamespaceURI ? oResolver.lookupNamespaceURI : oResolver, @@ -283,22 +354,28 @@ cStaticContext.prototype.getURIForPrefix = function(sPrefix) { return sNS_XML; if (sPrefix == "xmlns") return sNS_XNS; - throw new cException("XPST0081" - , "Prefix '" + sPrefix + "' has not been declared" + // + throw new cException("XPST0081" + ); }; +// Static members +//Converts non-null JavaScript object to XML Schema object cStaticContext.js2xs = function(vItem) { - if (typeof vItem == "boolean") + // Convert types from JavaScript to XPath 2.0 + if (typeof vItem == "boolean") vItem = new cXSBoolean(vItem); else if (typeof vItem == "number") vItem =(fIsNaN(vItem) ||!fIsFinite(vItem)) ? new cXSDouble(vItem) : fNumericLiteral_parseValue(cString(vItem)); else vItem = new cXSString(cString(vItem)); - return vItem; + // + return vItem; }; +// Converts non-null XML Schema object to JavaScript object cStaticContext.xs2js = function(vItem) { if (vItem instanceof cXSBoolean) vItem = vItem.valueOf(); @@ -307,44 +384,68 @@ cStaticContext.xs2js = function(vItem) { vItem = vItem.valueOf(); else vItem = vItem.toString(); - return vItem; + // + return vItem; }; +// System functions with signatures, operators and types var hStaticContext_functions = {}, hStaticContext_signatures = {}, hStaticContext_dataTypes = {}, hStaticContext_operators = {}; function fStaticContext_defineSystemFunction(sName, aParameters, fFunction) { - hStaticContext_functions[sName] = fFunction; - hStaticContext_signatures[sName] = aParameters; + // Register function + hStaticContext_functions[sName] = fFunction; + // Register signature + hStaticContext_signatures[sName] = aParameters; }; function fStaticContext_defineSystemDataType(sName, fFunction) { - hStaticContext_dataTypes[sName] = fFunction; + // Register dataType + hStaticContext_dataTypes[sName] = fFunction; }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cExpression(sExpression, oStaticContext) { var oLexer = new cLexer(sExpression), oExpr = fExpr_parse(oLexer, oStaticContext); - if (!oLexer.eof()) + // + if (!oLexer.eof()) throw new cException("XPST0003" - , "Unexpected token beyond end of query" + ); - if (!oExpr) + // + if (!oExpr) throw new cException("XPST0003" - , "Expected expression" + ); this.internalExpression = oExpr; }; cExpression.prototype.internalExpression = null; +// Public methods cExpression.prototype.evaluate = function(oContext) { return this.internalExpression.evaluate(oContext); }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cStringCollator() { @@ -357,10 +458,18 @@ cStringCollator.prototype.equals = function(sValue1, sValue2) { cStringCollator.prototype.compare = function(sValue1, sValue2) { throw "Not implemented"; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSConstants(){}; +// XML Schema 1.0 Datatypes cXSConstants.ANYSIMPLETYPE_DT = 1; cXSConstants.STRING_DT = 2; cXSConstants.BOOLEAN_DT = 3; @@ -407,6 +516,7 @@ cXSConstants.LISTOFUNION_DT = 43; cXSConstants.LIST_DT = 44; cXSConstants.UNAVAILABLE_DT = 45; +// XML Schema 1.1 Datatypes cXSConstants.DATETIMESTAMP_DT = 46; cXSConstants.DAYMONTHDURATION_DT = 47; cXSConstants.DAYTIMEDURATION_DT = 48; @@ -414,9 +524,18 @@ cXSConstants.PRECISIONDECIMAL_DT = 49; cXSConstants.ANYATOMICTYPE_DT = 50; cXSConstants.ANYTYPE_DT = 51; +// cXSConstants.XT_YEARMONTHDURATION_DT=-1; cXSConstants.XT_UNTYPEDATOMIC_DT =-2; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cExpr() { this.items = []; @@ -424,36 +543,47 @@ function cExpr() { cExpr.prototype.items = null; +// Static members function fExpr_parse (oLexer, oStaticContext) { var oItem; if (oLexer.eof() ||!(oItem = fExprSingle_parse(oLexer, oStaticContext))) return; - var oExpr = new cExpr; + // Create expression + var oExpr = new cExpr; oExpr.items.push(oItem); while (oLexer.peek() == ',') { oLexer.next(); if (oLexer.eof() ||!(oItem = fExprSingle_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected expression" + ); oExpr.items.push(oItem); } return oExpr; }; +// Public members cExpr.prototype.evaluate = function(oContext) { var oSequence = []; for (var nIndex = 0, nLength = this.items.length; nIndex < nLength; nIndex++) oSequence = hStaticContext_operators["concatenate"].call(oContext, oSequence, this.items[nIndex].evaluate(oContext)); return oSequence; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cExprSingle() { }; +// Static members function fExprSingle_parse (oLexer, oStaticContext) { if (!oLexer.eof()) return fIfExpr_parse(oLexer, oStaticContext) @@ -461,7 +591,14 @@ function fExprSingle_parse (oLexer, oStaticContext) { || fQuantifiedExpr_parse(oLexer, oStaticContext) || fOrExpr_parse(oLexer, oStaticContext); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cForExpr() { this.bindings = []; @@ -471,6 +608,7 @@ function cForExpr() { cForExpr.prototype.bindings = null; cForExpr.prototype.returnExpr = null; +// Static members function fForExpr_parse (oLexer, oStaticContext) { if (oLexer.peek() == "for" && oLexer.peek(1).substr(0, 1) == '$') { oLexer.next(); @@ -484,13 +622,13 @@ function fForExpr_parse (oLexer, oStaticContext) { if (oLexer.peek() != "return") throw new cException("XPST0003" - , "Expected 'return' token in for expression" + ); oLexer.next(); if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected return statement operand in for expression" + ); oForExpr.returnExpr = oExpr; @@ -498,6 +636,9 @@ function fForExpr_parse (oLexer, oStaticContext) { } }; +// Public members +// for $x in X, $y in Y, $z in Z return $x + $y + $z +// for $x in X return for $y in Y return for $z in Z return $x + $y + $z cForExpr.prototype.evaluate = function (oContext) { var oSequence = []; (function(oSelf, nBinding) { @@ -517,6 +658,7 @@ cForExpr.prototype.evaluate = function (oContext) { return oSequence; }; +// function cSimpleForBinding(sPrefix, sLocalName, sNameSpaceURI, oInExpr) { this.prefix = sPrefix; this.localName = sLocalName; @@ -533,30 +675,37 @@ function fSimpleForBinding_parse (oLexer, oStaticContext) { var aMatch = oLexer.peek().substr(1).match(rNameTest); if (!aMatch) throw new cException("XPST0003" - , "Expected binding in for expression" + ); if (aMatch[1] == '*' || aMatch[2] == '*') throw new cException("XPST0003" - , "Illegal use of wildcard in for expression binding variable name" + ); oLexer.next(); if (oLexer.peek() != "in") throw new cException("XPST0003" - , "Expected 'in' token in for expression binding" + ); oLexer.next(); var oExpr; if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected in statement operand in for expression binding" + ); return new cSimpleForBinding(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) : null, oExpr); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cIfExpr(oCondExpr, oThenExpr, oElseExpr) { this.condExpr = oCondExpr; @@ -568,51 +717,63 @@ cIfExpr.prototype.condExpr = null; cIfExpr.prototype.thenExpr = null; cIfExpr.prototype.elseExpr = null; +// Static members function fIfExpr_parse (oLexer, oStaticContext) { var oCondExpr, oThenExpr, oElseExpr; if (oLexer.peek() == "if" && oLexer.peek(1) == '(') { oLexer.next(2); - if (oLexer.eof() ||!(oCondExpr = fExpr_parse(oLexer, oStaticContext))) + // + if (oLexer.eof() ||!(oCondExpr = fExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected if statement operand in conditional expression" + ); - if (oLexer.peek() != ')') + // + if (oLexer.peek() != ')') throw new cException("XPST0003" - , "Expected ')' token in for expression" + ); oLexer.next(); if (oLexer.peek() != "then") throw new cException("XPST0003" - , "Expected 'then' token in conditional if expression" + ); oLexer.next(); if (oLexer.eof() ||!(oThenExpr = fExprSingle_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected then statement operand in condional expression" + ); if (oLexer.peek() != "else") throw new cException("XPST0003" - , "Expected 'else' token in conditional if expression" + ); oLexer.next(); if (oLexer.eof() ||!(oElseExpr = fExprSingle_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected else statement operand in condional expression" + ); - return new cIfExpr(oCondExpr, oThenExpr, oElseExpr); + // + return new cIfExpr(oCondExpr, oThenExpr, oElseExpr); } }; +// Public members cIfExpr.prototype.evaluate = function (oContext) { return this[fFunction_sequence_toEBV(this.condExpr.evaluate(oContext), oContext) ? "thenExpr" : "elseExpr"].evaluate(oContext); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cQuantifiedExpr(sQuantifier) { this.quantifier = sQuantifier; @@ -624,6 +785,7 @@ cQuantifiedExpr.prototype.bindings = null; cQuantifiedExpr.prototype.quantifier = null; cQuantifiedExpr.prototype.satisfiesExpr = null; +// Static members function fQuantifiedExpr_parse (oLexer, oStaticContext) { var sQuantifier = oLexer.peek(); if ((sQuantifier == "some" || sQuantifier == "every") && oLexer.peek(1).substr(0, 1) == '$') { @@ -638,13 +800,13 @@ function fQuantifiedExpr_parse (oLexer, oStaticContext) { if (oLexer.peek() != "satisfies") throw new cException("XPST0003" - , "Expected 'satisfies' token in quantified expression" + ); oLexer.next(); if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected satisfies statement operand in quantified expression" + ); oQuantifiedExpr.satisfiesExpr = oExpr; @@ -652,8 +814,10 @@ function fQuantifiedExpr_parse (oLexer, oStaticContext) { } }; +// Public members cQuantifiedExpr.prototype.evaluate = function (oContext) { - var bEvery = this.quantifier == "every", + // TODO: re-factor + var bEvery = this.quantifier == "every", bResult = bEvery ? true : false; (function(oSelf, nBinding) { var oBinding = oSelf.bindings[nBinding++], @@ -674,6 +838,7 @@ cQuantifiedExpr.prototype.evaluate = function (oContext) { +// function cSimpleQuantifiedBinding(sPrefix, sLocalName, sNameSpaceURI, oInExpr) { this.prefix = sPrefix; this.localName = sLocalName; @@ -690,30 +855,37 @@ function fSimpleQuantifiedBinding_parse (oLexer, oStaticContext) { var aMatch = oLexer.peek().substr(1).match(rNameTest); if (!aMatch) throw new cException("XPST0003" - , "Expected binding in quantified expression" + ); if (aMatch[1] == '*' || aMatch[2] == '*') throw new cException("XPST0003" - , "Illegal use of wildcard in quantified expression binding variable name" + ); oLexer.next(); if (oLexer.peek() != "in") throw new cException("XPST0003" - , "Expected 'in' token in quantified expression binding" + ); oLexer.next(); var oExpr; if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected in statement operand in quantified expression binding" + ); return new cSimpleQuantifiedBinding(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) : null, oExpr); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cComparisonExpr(oLeft, oRight, sOperator) { this.left = oLeft; @@ -725,6 +897,7 @@ cComparisonExpr.prototype.left = null; cComparisonExpr.prototype.right = null; cComparisonExpr.prototype.operator = null; +// Static members function fComparisonExpr_parse (oLexer, oStaticContext) { var oExpr, oRight; @@ -733,20 +906,23 @@ function fComparisonExpr_parse (oLexer, oStaticContext) { if (!(oLexer.peek() in hComparisonExpr_operators)) return oExpr; - var sOperator = oLexer.peek(); + // Comparison expression + var sOperator = oLexer.peek(); oLexer.next(); if (oLexer.eof() ||!(oRight = fRangeExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in comparison expression" + ); return new cComparisonExpr(oExpr, oRight, sOperator); }; +// Public members cComparisonExpr.prototype.evaluate = function (oContext) { var oResult = hComparisonExpr_operators[this.operator](this, oContext); return oResult == null ? [] : [oResult]; }; +// General comparison function fComparisonExpr_GeneralComp(oExpr, oContext) { var oLeft = fFunction_sequence_atomize(oExpr.left.evaluate(oContext), oContext); if (!oLeft.length) @@ -767,33 +943,40 @@ function fComparisonExpr_GeneralComp(oExpr, oContext) { bRight = vRight instanceof cXSUntypedAtomic; if (bLeft && bRight) { - vLeft = cXSString.cast(vLeft); + // cast xs:untypedAtomic to xs:string + vLeft = cXSString.cast(vLeft); vRight = cXSString.cast(vRight); } else { - if (bLeft) { - if (vRight instanceof cXSDayTimeDuration) + // + if (bLeft) { + // Special: durations + if (vRight instanceof cXSDayTimeDuration) vLeft = cXSDayTimeDuration.cast(vLeft); else if (vRight instanceof cXSYearMonthDuration) vLeft = cXSYearMonthDuration.cast(vLeft); else - if (vRight.primitiveKind) + // + if (vRight.primitiveKind) vLeft = hStaticContext_dataTypes[vRight.primitiveKind].cast(vLeft); } else if (bRight) { - if (vLeft instanceof cXSDayTimeDuration) + // Special: durations + if (vLeft instanceof cXSDayTimeDuration) vRight = cXSDayTimeDuration.cast(vRight); else if (vLeft instanceof cXSYearMonthDuration) vRight = cXSYearMonthDuration.cast(vRight); else - if (vLeft.primitiveKind) + // + if (vLeft.primitiveKind) vRight = hStaticContext_dataTypes[vLeft.primitiveKind].cast(vRight); } - if (vLeft instanceof cXSAnyURI) + // cast xs:anyURI to xs:string + if (vLeft instanceof cXSAnyURI) vLeft = cXSString.cast(vLeft); if (vRight instanceof cXSAnyURI) vRight = cXSString.cast(vRight); @@ -814,37 +997,44 @@ var hComparisonExpr_GeneralComp_map = { '<=': 'le' }; +// Value comparison function fComparisonExpr_ValueComp(oExpr, oContext) { var oLeft = fFunction_sequence_atomize(oExpr.left.evaluate(oContext), oContext); if (!oLeft.length) return null; - fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' - , "first operand of '" + oExpr.operator + "'" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' + ); var oRight = fFunction_sequence_atomize(oExpr.right.evaluate(oContext), oContext); if (!oRight.length) return null; - fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' - , "second operand of '" + oExpr.operator + "'" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + ); var vLeft = oLeft[0], vRight = oRight[0]; - if (vLeft instanceof cXSUntypedAtomic) + // cast xs:untypedAtomic to xs:string + if (vLeft instanceof cXSUntypedAtomic) vLeft = cXSString.cast(vLeft); if (vRight instanceof cXSUntypedAtomic) vRight = cXSString.cast(vRight); - if (vLeft instanceof cXSAnyURI) + // cast xs:anyURI to xs:string + if (vLeft instanceof cXSAnyURI) vLeft = cXSString.cast(vLeft); if (vRight instanceof cXSAnyURI) vRight = cXSString.cast(vRight); - return hComparisonExpr_ValueComp_operators[oExpr.operator](vLeft, vRight, oContext); + // + return hComparisonExpr_ValueComp_operators[oExpr.operator](vLeft, vRight, oContext); }; +// var hComparisonExpr_ValueComp_operators = {}; hComparisonExpr_ValueComp_operators['eq'] = function(oLeft, oRight, oContext) { var sOperator = ''; @@ -908,7 +1098,8 @@ hComparisonExpr_ValueComp_operators['eq'] = function(oLeft, oRight, oContext) { if (oRight instanceof cXSGDay) sOperator = "gDay-equal"; } - else + // skipped: xs:anyURI (covered by xs:string) + else if (oLeft instanceof cXSQName) { if (oRight instanceof cXSQName) sOperator = "QName-equal"; @@ -924,12 +1115,15 @@ hComparisonExpr_ValueComp_operators['eq'] = function(oLeft, oRight, oContext) { sOperator = "base64Binary-equal"; } - if (sOperator) + // Call operator function + if (sOperator) return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); - throw new cException("XPTY0004" - , "Cannot compare values of given types" - ); }; + // skipped: xs:NOTATION + throw new cException("XPTY0004" + + ); // Cannot compare {type1} to {type2} +}; hComparisonExpr_ValueComp_operators['ne'] = function(oLeft, oRight, oContext) { return new cXSBoolean(!hComparisonExpr_ValueComp_operators['eq'](oLeft, oRight, oContext).valueOf()); }; @@ -976,12 +1170,15 @@ hComparisonExpr_ValueComp_operators['gt'] = function(oLeft, oRight, oContext) { sOperator = "dayTimeDuration-greater-than"; } - if (sOperator) + // Call operator function + if (sOperator) return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); - throw new cException("XPTY0004" - , "Cannot compare values of given types" - ); }; + // skipped: xs:anyURI (covered by xs:string) + throw new cException("XPTY0004" + + ); // Cannot compare {type1} to {type2} +}; hComparisonExpr_ValueComp_operators['lt'] = function(oLeft, oRight, oContext) { var sOperator = ''; @@ -1025,12 +1222,15 @@ hComparisonExpr_ValueComp_operators['lt'] = function(oLeft, oRight, oContext) { sOperator = "dayTimeDuration-less-than"; } - if (sOperator) + // Call operator function + if (sOperator) return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); - throw new cException("XPTY0004" - , "Cannot compare values of given types" - ); }; + // skipped: xs:anyURI (covered by xs:string) + throw new cException("XPTY0004" + + ); // Cannot compare {type1} to {type2} +}; hComparisonExpr_ValueComp_operators['ge'] = function(oLeft, oRight, oContext) { var sOperator = ''; @@ -1074,12 +1274,15 @@ hComparisonExpr_ValueComp_operators['ge'] = function(oLeft, oRight, oContext) { sOperator = "dayTimeDuration-less-than"; } - if (sOperator) + // Call operator function + if (sOperator) return new cXSBoolean(!hStaticContext_operators[sOperator].call(oContext, oLeft, oRight).valueOf()); - throw new cException("XPTY0004" - , "Cannot compare values of given types" - ); }; + // skipped: xs:anyURI (covered by xs:string) + throw new cException("XPTY0004" + + ); // Cannot compare {type1} to {type2} +}; hComparisonExpr_ValueComp_operators['le'] = function(oLeft, oRight, oContext) { var sOperator = ''; @@ -1123,32 +1326,40 @@ hComparisonExpr_ValueComp_operators['le'] = function(oLeft, oRight, oContext) { sOperator = "dayTimeDuration-greater-than"; } - if (sOperator) + // Call operator function + if (sOperator) return new cXSBoolean(!hStaticContext_operators[sOperator].call(oContext, oLeft, oRight).valueOf()); - throw new cException("XPTY0004" - , "Cannot compare values of given types" - ); }; + // skipped: xs:anyURI (covered by xs:string) + throw new cException("XPTY0004" + ); // Cannot compare {type1} to {type2} +}; + +// Node comparison function fComparisonExpr_NodeComp(oExpr, oContext) { var oLeft = oExpr.left.evaluate(oContext); if (!oLeft.length) return null; - fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' - , "first operand of '" + oExpr.operator + "'" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' + ); - fFunctionCall_assertSequenceItemType(oContext, oLeft, cXTNode - , "first operand of '" + oExpr.operator + "'" + // Assert item type + fFunctionCall_assertSequenceItemType(oContext, oLeft, cXTNode + ); var oRight = oExpr.right.evaluate(oContext); if (!oRight.length) return null; - fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' - , "second operand of '" + oExpr.operator + "'" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + ); - fFunctionCall_assertSequenceItemType(oContext, oRight, cXTNode - , "second operand of '" + oExpr.operator + "'" + // Assert item type + fFunctionCall_assertSequenceItemType(oContext, oRight, cXTNode + ); return hComparisonExpr_NodeComp_operators[oExpr.operator](oLeft[0], oRight[0], oContext); @@ -1165,24 +1376,35 @@ hComparisonExpr_NodeComp_operators['<<'] = function(oLeft, oRight, oContext) { return hStaticContext_operators["node-before"].call(oContext, oLeft, oRight); }; +// Operators var hComparisonExpr_operators = { - '=': fComparisonExpr_GeneralComp, + // GeneralComp + '=': fComparisonExpr_GeneralComp, '!=': fComparisonExpr_GeneralComp, '<': fComparisonExpr_GeneralComp, '<=': fComparisonExpr_GeneralComp, '>': fComparisonExpr_GeneralComp, '>=': fComparisonExpr_GeneralComp, - 'eq': fComparisonExpr_ValueComp, + // ValueComp + 'eq': fComparisonExpr_ValueComp, 'ne': fComparisonExpr_ValueComp, 'lt': fComparisonExpr_ValueComp, 'le': fComparisonExpr_ValueComp, 'gt': fComparisonExpr_ValueComp, 'ge': fComparisonExpr_ValueComp, - 'is': fComparisonExpr_NodeComp, + // NodeComp + 'is': fComparisonExpr_NodeComp, '>>': fComparisonExpr_NodeComp, '<<': fComparisonExpr_NodeComp }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cAdditiveExpr(oExpr) { this.left = oExpr; @@ -1192,6 +1414,7 @@ function cAdditiveExpr(oExpr) { cAdditiveExpr.prototype.left = null; cAdditiveExpr.prototype.items = null; +// var hAdditiveExpr_operators = {}; hAdditiveExpr_operators['+'] = function(oLeft, oRight, oContext) { var sOperator = '', @@ -1258,12 +1481,15 @@ hAdditiveExpr_operators['+'] = function(oLeft, oRight, oContext) { sOperator = "add-dayTimeDuration-to-dateTime"; } - if (sOperator) + // Call operator function + if (sOperator) return hStaticContext_operators[sOperator].call(oContext, bReverse ? oRight : oLeft, bReverse ? oLeft : oRight); - throw new cException("XPTY0004" - , "Arithmetic operator is not defined for provided arguments" - ); }; + // + throw new cException("XPTY0004" + + ); // Arithmetic operator is not defined for arguments of types ({type1}, {type2}) +}; hAdditiveExpr_operators['-'] = function (oLeft, oRight, oContext) { var sOperator = ''; @@ -1312,13 +1538,17 @@ hAdditiveExpr_operators['-'] = function (oLeft, oRight, oContext) { sOperator = "subtract-dayTimeDurations"; } - if (sOperator) + // Call operator function + if (sOperator) return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); - throw new cException("XPTY0004" - , "Arithmetic operator is not defined for provided arguments" - ); }; + // + throw new cException("XPTY0004" + ); // Arithmetic operator is not defined for arguments of types ({type1}, {type2}) +}; + +// Static members function fAdditiveExpr_parse (oLexer, oStaticContext) { var oExpr; if (oLexer.eof() ||!(oExpr = fMultiplicativeExpr_parse(oLexer, oStaticContext))) @@ -1326,48 +1556,61 @@ function fAdditiveExpr_parse (oLexer, oStaticContext) { if (!(oLexer.peek() in hAdditiveExpr_operators)) return oExpr; - var oAdditiveExpr = new cAdditiveExpr(oExpr), + // Additive expression + var oAdditiveExpr = new cAdditiveExpr(oExpr), sOperator; while ((sOperator = oLexer.peek()) in hAdditiveExpr_operators) { oLexer.next(); if (oLexer.eof() ||!(oExpr = fMultiplicativeExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in additive expression" + ); oAdditiveExpr.items.push([sOperator, oExpr]); } return oAdditiveExpr; }; +// Public members cAdditiveExpr.prototype.evaluate = function (oContext) { var oLeft = fFunction_sequence_atomize(this.left.evaluate(oContext), oContext); if (!oLeft.length) return []; - fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' - , "first operand of '" + this.items[0][0] + "'" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' + ); var vLeft = oLeft[0]; if (vLeft instanceof cXSUntypedAtomic) - vLeft = cXSDouble.cast(vLeft); + vLeft = cXSDouble.cast(vLeft); // cast to xs:double + for (var nIndex = 0, nLength = this.items.length, oRight, vRight; nIndex < nLength; nIndex++) { oRight = fFunction_sequence_atomize(this.items[nIndex][1].evaluate(oContext), oContext); if (!oRight.length) return []; - fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' - , "first operand of '" + this.items[nIndex][0] + "'" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + ); vRight = oRight[0]; if (vRight instanceof cXSUntypedAtomic) - vRight = cXSDouble.cast(vRight); + vRight = cXSDouble.cast(vRight); // cast to xs:double + vLeft = hAdditiveExpr_operators[this.items[nIndex][0]](vLeft, vRight, oContext); } return [vLeft]; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cMultiplicativeExpr(oExpr) { this.left = oExpr; @@ -1377,6 +1620,7 @@ function cMultiplicativeExpr(oExpr) { cMultiplicativeExpr.prototype.left = null; cMultiplicativeExpr.prototype.items = null; +// var hMultiplicativeExpr_operators = {}; hMultiplicativeExpr_operators['*'] = function (oLeft, oRight, oContext) { var sOperator = '', @@ -1408,12 +1652,15 @@ hMultiplicativeExpr_operators['*'] = function (oLeft, oRight, oContext) { } } - if (sOperator) + // Call operator function + if (sOperator) return hStaticContext_operators[sOperator].call(oContext, bReverse ? oRight : oLeft, bReverse ? oLeft : oRight); - throw new cException("XPTY0004" - , "Arithmetic operator is not defined for provided arguments" - ); }; + // + throw new cException("XPTY0004" + + ); // Arithmetic operator is not defined for arguments of types ({type1}, {type2}) +}; hMultiplicativeExpr_operators['div'] = function (oLeft, oRight, oContext) { var sOperator = ''; @@ -1437,25 +1684,33 @@ hMultiplicativeExpr_operators['div'] = function (oLeft, oRight, oContext) { if (oRight instanceof cXSDayTimeDuration) sOperator = "divide-dayTimeDuration-by-dayTimeDuration"; } - if (sOperator) + // Call operator function + if (sOperator) return hStaticContext_operators[sOperator].call(oContext, oLeft, oRight); - throw new cException("XPTY0004" - , "Arithmetic operator is not defined for provided arguments" - ); }; + // + throw new cException("XPTY0004" + + ); // Arithmetic operator is not defined for arguments of types ({type1}, {type2}) +}; hMultiplicativeExpr_operators['idiv'] = function (oLeft, oRight, oContext) { if (fXSAnyAtomicType_isNumeric(oLeft) && fXSAnyAtomicType_isNumeric(oRight)) return hStaticContext_operators["numeric-integer-divide"].call(oContext, oLeft, oRight); - throw new cException("XPTY0004" - , "Arithmetic operator is not defined for provided arguments" - ); }; + // + throw new cException("XPTY0004" + + ); // Arithmetic operator is not defined for arguments of types ({type1}, {type2}) +}; hMultiplicativeExpr_operators['mod'] = function (oLeft, oRight, oContext) { if (fXSAnyAtomicType_isNumeric(oLeft) && fXSAnyAtomicType_isNumeric(oRight)) return hStaticContext_operators["numeric-mod"].call(oContext, oLeft, oRight); - throw new cException("XPTY0004" - , "Arithmetic operator is not defined for provided arguments" - ); }; + // + throw new cException("XPTY0004" + ); // Arithmetic operator is not defined for arguments of types ({type1}, {type2}) +}; + +// Static members function fMultiplicativeExpr_parse (oLexer, oStaticContext) { var oExpr; if (oLexer.eof() ||!(oExpr = fUnionExpr_parse(oLexer, oStaticContext))) @@ -1463,48 +1718,62 @@ function fMultiplicativeExpr_parse (oLexer, oStaticContext) { if (!(oLexer.peek() in hMultiplicativeExpr_operators)) return oExpr; - var oMultiplicativeExpr = new cMultiplicativeExpr(oExpr), + // Additive expression + var oMultiplicativeExpr = new cMultiplicativeExpr(oExpr), sOperator; while ((sOperator = oLexer.peek()) in hMultiplicativeExpr_operators) { oLexer.next(); if (oLexer.eof() ||!(oExpr = fUnionExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in multiplicative expression" + ); oMultiplicativeExpr.items.push([sOperator, oExpr]); } return oMultiplicativeExpr; }; +// Public members cMultiplicativeExpr.prototype.evaluate = function (oContext) { var oLeft = fFunction_sequence_atomize(this.left.evaluate(oContext), oContext); - if (!oLeft.length) + // + if (!oLeft.length) return []; - fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' - , "first operand of '" + this.items[0][0] + "'" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' + ); var vLeft = oLeft[0]; if (vLeft instanceof cXSUntypedAtomic) - vLeft = cXSDouble.cast(vLeft); + vLeft = cXSDouble.cast(vLeft); // cast to xs:double + for (var nIndex = 0, nLength = this.items.length, oRight, vRight; nIndex < nLength; nIndex++) { oRight = fFunction_sequence_atomize(this.items[nIndex][1].evaluate(oContext), oContext); if (!oRight.length) return []; - fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' - , "second operand of '" + this.items[nIndex][0] + "'" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + ); vRight = oRight[0]; if (vRight instanceof cXSUntypedAtomic) - vRight = cXSDouble.cast(vRight); + vRight = cXSDouble.cast(vRight); // cast to xs:double + vLeft = hMultiplicativeExpr_operators[this.items[nIndex][0]](vLeft, vRight, oContext); } return [vLeft]; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cUnaryExpr(sOperator, oExpr) { this.operator = sOperator; @@ -1514,27 +1783,35 @@ function cUnaryExpr(sOperator, oExpr) { cUnaryExpr.prototype.operator = null; cUnaryExpr.prototype.expression = null; +// var hUnaryExpr_operators = {}; hUnaryExpr_operators['-'] = function(oRight, oContext) { if (fXSAnyAtomicType_isNumeric(oRight)) return hStaticContext_operators["numeric-unary-minus"].call(oContext, oRight); - throw new cException("XPTY0004" - , "Arithmetic operator is not defined for provided arguments" - ); }; + // + throw new cException("XPTY0004" + + ); // Arithmetic operator is not defined for arguments of types ({type1}, {type2}) +}; hUnaryExpr_operators['+'] = function(oRight, oContext) { if (fXSAnyAtomicType_isNumeric(oRight)) return hStaticContext_operators["numeric-unary-plus"].call(oContext, oRight); - throw new cException("XPTY0004" - , "Arithmetic operator is not defined for provided arguments" - ); }; + // + throw new cException("XPTY0004" + ); // Arithmetic operator is not defined for arguments of types ({type1}, {type2}) +}; + +// Static members +// UnaryExpr := ("-" | "+")* ValueExpr function fUnaryExpr_parse (oLexer, oStaticContext) { if (oLexer.eof()) return; if (!(oLexer.peek() in hUnaryExpr_operators)) return fValueExpr_parse(oLexer, oStaticContext); - var sOperator = '+', + // Unary expression + var sOperator = '+', oExpr; while (oLexer.peek() in hUnaryExpr_operators) { if (oLexer.peek() == '-') @@ -1543,7 +1820,7 @@ function fUnaryExpr_parse (oLexer, oStaticContext) { } if (oLexer.eof() ||!(oExpr = fValueExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected operand in unary expression" + ); return new cUnaryExpr(sOperator, oExpr); }; @@ -1551,27 +1828,46 @@ function fUnaryExpr_parse (oLexer, oStaticContext) { cUnaryExpr.prototype.evaluate = function (oContext) { var oRight = fFunction_sequence_atomize(this.expression.evaluate(oContext), oContext); - if (!oRight.length) + // + if (!oRight.length) return []; - fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' - , "second operand of '" + this.operator + "'" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' + ); var vRight = oRight[0]; if (vRight instanceof cXSUntypedAtomic) - vRight = cXSDouble.cast(vRight); + vRight = cXSDouble.cast(vRight); // cast to xs:double + return [hUnaryExpr_operators[this.operator](vRight, oContext)]; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cValueExpr() { }; +// Static members function fValueExpr_parse (oLexer, oStaticContext) { return fPathExpr_parse(oLexer, oStaticContext); }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cOrExpr(oExpr) { this.left = oExpr; @@ -1581,6 +1877,7 @@ function cOrExpr(oExpr) { cOrExpr.prototype.left = null; cOrExpr.prototype.items = null; +// Static members function fOrExpr_parse (oLexer, oStaticContext) { var oExpr; if (oLexer.eof() ||!(oExpr = fAndExpr_parse(oLexer, oStaticContext))) @@ -1588,25 +1885,34 @@ function fOrExpr_parse (oLexer, oStaticContext) { if (oLexer.peek() != "or") return oExpr; - var oOrExpr = new cOrExpr(oExpr); + // Or expression + var oOrExpr = new cOrExpr(oExpr); while (oLexer.peek() == "or") { oLexer.next(); if (oLexer.eof() ||!(oExpr = fAndExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in logical expression" + ); oOrExpr.items.push(oExpr); } return oOrExpr; }; +// Public members cOrExpr.prototype.evaluate = function (oContext) { var bValue = fFunction_sequence_toEBV(this.left.evaluate(oContext), oContext); for (var nIndex = 0, nLength = this.items.length; (nIndex < nLength) && !bValue; nIndex++) bValue = fFunction_sequence_toEBV(this.items[nIndex].evaluate(oContext), oContext); return [new cXSBoolean(bValue)]; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cAndExpr(oExpr) { this.left = oExpr; @@ -1616,6 +1922,7 @@ function cAndExpr(oExpr) { cAndExpr.prototype.left = null; cAndExpr.prototype.items = null; +// Static members function fAndExpr_parse (oLexer, oStaticContext) { var oExpr; if (oLexer.eof() ||!(oExpr = fComparisonExpr_parse(oLexer, oStaticContext))) @@ -1623,25 +1930,34 @@ function fAndExpr_parse (oLexer, oStaticContext) { if (oLexer.peek() != "and") return oExpr; - var oAndExpr = new cAndExpr(oExpr); + // And expression + var oAndExpr = new cAndExpr(oExpr); while (oLexer.peek() == "and") { oLexer.next(); if (oLexer.eof() ||!(oExpr = fComparisonExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in logical expression" + ); oAndExpr.items.push(oExpr); } return oAndExpr; }; +// Public members cAndExpr.prototype.evaluate = function (oContext) { var bValue = fFunction_sequence_toEBV(this.left.evaluate(oContext), oContext); for (var nIndex = 0, nLength = this.items.length; (nIndex < nLength) && bValue; nIndex++) bValue = fFunction_sequence_toEBV(this.items[nIndex].evaluate(oContext), oContext); return [new cXSBoolean(bValue)]; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cStepExpr() { @@ -1649,6 +1965,7 @@ function cStepExpr() { cStepExpr.prototype.predicates = null; +// Static members function fStepExpr_parse (oLexer, oStaticContext) { if (!oLexer.eof()) return fFilterExpr_parse(oLexer, oStaticContext) @@ -1657,38 +1974,44 @@ function fStepExpr_parse (oLexer, oStaticContext) { function fStepExpr_parsePredicates (oLexer, oStaticContext, oStep) { var oExpr; - while (oLexer.peek() == '[') { + // Parse predicates + while (oLexer.peek() == '[') { oLexer.next(); if (oLexer.eof() ||!(oExpr = fExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected expression in predicate" + ); oStep.predicates.push(oExpr); if (oLexer.peek() != ']') throw new cException("XPST0003" - , "Expected ']' token in predicate" + ); oLexer.next(); } }; +// Public members cStepExpr.prototype.applyPredicates = function(oSequence, oContext) { var vContextItem = oContext.item, nContextPosition= oContext.position, nContextSize = oContext.size; - for (var nPredicateIndex = 0, oSequence1, nPredicateLength = this.predicates.length; nPredicateIndex < nPredicateLength; nPredicateIndex++) { + // + for (var nPredicateIndex = 0, oSequence1, nPredicateLength = this.predicates.length; nPredicateIndex < nPredicateLength; nPredicateIndex++) { oSequence1 = oSequence; oSequence = []; for (var nIndex = 0, oSequence2, nLength = oSequence1.length; nIndex < nLength; nIndex++) { - oContext.item = oSequence1[nIndex]; + // Set new context + oContext.item = oSequence1[nIndex]; oContext.position = nIndex + 1; oContext.size = nLength; - oSequence2 = this.predicates[nPredicateIndex].evaluate(oContext); - if (oSequence2.length == 1 && fXSAnyAtomicType_isNumeric(oSequence2[0])) { + // + oSequence2 = this.predicates[nPredicateIndex].evaluate(oContext); + // + if (oSequence2.length == 1 && fXSAnyAtomicType_isNumeric(oSequence2[0])) { if (oSequence2[0].valueOf() == nIndex + 1) oSequence.push(oSequence1[nIndex]); } @@ -1697,12 +2020,21 @@ cStepExpr.prototype.applyPredicates = function(oSequence, oContext) { oSequence.push(oSequence1[nIndex]); } } - oContext.item = vContextItem; + // Restore context + oContext.item = vContextItem; oContext.position = nContextPosition; oContext.size = nContextSize; - return oSequence; + // + return oSequence; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cAxisStep(sAxis, oTest) { this.axis = sAxis; @@ -1715,7 +2047,9 @@ cAxisStep.prototype = new cStepExpr; cAxisStep.prototype.axis = null; cAxisStep.prototype.test = null; +// var hAxisStep_axises = {}; +// Forward axis hAxisStep_axises["attribute"] = {}; hAxisStep_axises["child"] = {}; hAxisStep_axises["descendant"] = {}; @@ -1723,12 +2057,15 @@ hAxisStep_axises["descendant-or-self"] = {}; hAxisStep_axises["following"] = {}; hAxisStep_axises["following-sibling"] = {}; hAxisStep_axises["self"] = {}; +// hAxisStep_axises["namespace"] = {}; // deprecated in 2.0 +// Reverse axis hAxisStep_axises["ancestor"] = {}; hAxisStep_axises["ancestor-or-self"] = {}; hAxisStep_axises["parent"] = {}; hAxisStep_axises["preceding"] = {}; hAxisStep_axises["preceding-sibling"] = {}; +// Static members function fAxisStep_parse (oLexer, oStaticContext) { var sAxis = oLexer.peek(), oExpr, @@ -1736,15 +2073,16 @@ function fAxisStep_parse (oLexer, oStaticContext) { if (oLexer.peek(1) == '::') { if (!(sAxis in hAxisStep_axises)) throw new cException("XPST0003" - , "Unknown axis name: " + sAxis + ); oLexer.next(2); if (oLexer.eof() ||!(oExpr = fNodeTest_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected node test expression in axis step" + ); - oStep = new cAxisStep(sAxis, oExpr); + // + oStep = new cAxisStep(sAxis, oExpr); } else if (sAxis == '..') { @@ -1756,20 +2094,23 @@ function fAxisStep_parse (oLexer, oStaticContext) { oLexer.next(); if (oLexer.eof() ||!(oExpr = fNodeTest_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected node test expression in axis step" + ); - oStep = new cAxisStep("attribute", oExpr); + // + oStep = new cAxisStep("attribute", oExpr); } else { if (oLexer.eof() ||!(oExpr = fNodeTest_parse(oLexer, oStaticContext))) return; oStep = new cAxisStep(oExpr instanceof cKindTest && oExpr.name == "attribute" ? "attribute" : "child", oExpr); } - fStepExpr_parsePredicates(oLexer, oStaticContext, oStep); + // + fStepExpr_parsePredicates(oLexer, oStaticContext, oStep); return oStep; }; +// Public members cAxisStep.prototype.evaluate = function (oContext) { var oItem = oContext.item; @@ -1781,7 +2122,8 @@ cAxisStep.prototype.evaluate = function (oContext) { nType = fGetProperty(oItem, "nodeType"); switch (this.axis) { - case "attribute": + // Forward axis + case "attribute": if (nType == 1) for (var aAttributes = fGetProperty(oItem, "attributes"), nIndex = 0, nLength = aAttributes.length; nIndex < nLength; nIndex++) oSequence.push(aAttributes[nIndex]); @@ -1794,12 +2136,14 @@ cAxisStep.prototype.evaluate = function (oContext) { case "descendant-or-self": oSequence.push(oItem); - case "descendant": + // No break left intentionally + case "descendant": fAxisStep_getChildrenForward(fGetProperty(oItem, "firstChild"), oSequence, fGetProperty); break; case "following": - for (var oParent = oItem, oSibling; oParent; oParent = fGetProperty(oParent, "parentNode")) + // TODO: Attribute node context + for (var oParent = oItem, oSibling; oParent; oParent = fGetProperty(oParent, "parentNode")) if (oSibling = fGetProperty(oParent, "nextSibling")) fAxisStep_getChildrenForward(oSibling, oSequence, fGetProperty); break; @@ -1813,9 +2157,11 @@ cAxisStep.prototype.evaluate = function (oContext) { oSequence.push(oItem); break; - case "ancestor-or-self": + // Reverse axis + case "ancestor-or-self": oSequence.push(oItem); - case "ancestor": + // No break left intentionally + case "ancestor": for (var oNode = nType == 2 ? fGetProperty(oItem, "ownerElement") : oItem; oNode = fGetProperty(oNode, "parentNode");) oSequence.push(oNode); break; @@ -1827,7 +2173,8 @@ cAxisStep.prototype.evaluate = function (oContext) { break; case "preceding": - for (var oParent = oItem, oSibling; oParent; oParent = fGetProperty(oParent, "parentNode")) + // TODO: Attribute node context + for (var oParent = oItem, oSibling; oParent; oParent = fGetProperty(oParent, "parentNode")) if (oSibling = fGetProperty(oParent, "previousSibling")) fAxisStep_getChildrenBackward(oSibling, oSequence, fGetProperty); break; @@ -1838,7 +2185,8 @@ cAxisStep.prototype.evaluate = function (oContext) { break; } - if (oSequence.length && !(this.test instanceof cKindTest && this.test.name == "node")) { + // Apply test + if (oSequence.length && !(this.test instanceof cKindTest && this.test.name == "node")) { var oSequence1 = oSequence; oSequence = []; for (var nIndex = 0, nLength = oSequence1.length; nIndex < nLength; nIndex++) { @@ -1847,10 +2195,12 @@ cAxisStep.prototype.evaluate = function (oContext) { } } - if (oSequence.length && this.predicates.length) + // Apply predicates + if (oSequence.length && this.predicates.length) oSequence = this.applyPredicates(oSequence, oContext); - switch (this.axis) { + // Reverse results if reverse axis + switch (this.axis) { case "ancestor": case "ancestor-or-self": case "parent": @@ -1862,6 +2212,7 @@ cAxisStep.prototype.evaluate = function (oContext) { return oSequence; }; +// function fAxisStep_getChildrenForward(oNode, oSequence, fGetProperty) { for (var oChild; oNode; oNode = fGetProperty(oNode, "nextSibling")) { oSequence.push(oNode); @@ -1877,7 +2228,14 @@ function fAxisStep_getChildrenBackward(oNode, oSequence, fGetProperty) { oSequence.push(oNode); } }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cPathExpr() { this.items = []; @@ -1885,6 +2243,7 @@ function cPathExpr() { cPathExpr.prototype.items = null; +// Static members function fPathExpr_parse (oLexer, oStaticContext) { if (oLexer.eof()) return; @@ -1894,48 +2253,60 @@ function fPathExpr_parse (oLexer, oStaticContext) { var oPathExpr = new cPathExpr(), sSlash = oLexer.peek(), oExpr; - if (sSlash == sDoubleSlash || sSlash == sSingleSlash) { + // Parse first step + if (sSlash == sDoubleSlash || sSlash == sSingleSlash) { oLexer.next(); oPathExpr.items.push(new cFunctionCall(null, "root", sNS_XPF)); - if (sSlash == sDoubleSlash) + // + if (sSlash == sDoubleSlash) oPathExpr.items.push(new cAxisStep("descendant-or-self", new cKindTest("node"))); } - if (oLexer.eof() ||!(oExpr = fStepExpr_parse(oLexer, oStaticContext))) { + // + if (oLexer.eof() ||!(oExpr = fStepExpr_parse(oLexer, oStaticContext))) { if (sSlash == sSingleSlash) - return oPathExpr.items[0]; if (sSlash == sDoubleSlash) + return oPathExpr.items[0]; // '/' expression + if (sSlash == sDoubleSlash) throw new cException("XPST0003" - , "Expected path step expression" + ); return; } oPathExpr.items.push(oExpr); - while ((sSlash = oLexer.peek()) == sSingleSlash || sSlash == sDoubleSlash) { + // Parse other steps + while ((sSlash = oLexer.peek()) == sSingleSlash || sSlash == sDoubleSlash) { if (sSlash == sDoubleSlash) oPathExpr.items.push(new cAxisStep("descendant-or-self", new cKindTest("node"))); - oLexer.next(); + // + oLexer.next(); if (oLexer.eof() ||!(oExpr = fStepExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected path step expression" + ); - oPathExpr.items.push(oExpr); + // + oPathExpr.items.push(oExpr); } if (oPathExpr.items.length == 1) return oPathExpr.items[0]; - return oPathExpr; + // + return oPathExpr; }; +// Public members cPathExpr.prototype.evaluate = function (oContext) { var vContextItem = oContext.item; - var oSequence = [vContextItem]; + // + var oSequence = [vContextItem]; for (var nItemIndex = 0, nItemLength = this.items.length, oSequence1; nItemIndex < nItemLength; nItemIndex++) { oSequence1 = []; for (var nIndex = 0, nLength = oSequence.length; nIndex < nLength; nIndex++) { - oContext.item = oSequence[nIndex]; - for (var nRightIndex = 0, oSequence2 = this.items[nItemIndex].evaluate(oContext), nRightLength = oSequence2.length; nRightIndex < nRightLength; nRightIndex++) + // Set new context item + oContext.item = oSequence[nIndex]; + // + for (var nRightIndex = 0, oSequence2 = this.items[nItemIndex].evaluate(oContext), nRightLength = oSequence2.length; nRightIndex < nRightLength; nRightIndex++) if ((nItemIndex < nItemLength - 1) && !oContext.DOMAdapter.isNode(oSequence2[nRightIndex])) throw new cException("XPTY0019"); else @@ -1944,21 +2315,38 @@ cPathExpr.prototype.evaluate = function (oContext) { } oSequence = oSequence1; }; - oContext.item = vContextItem; - return fFunction_sequence_order(oSequence, oContext); + // Restore context item + oContext.item = vContextItem; + // + return fFunction_sequence_order(oSequence, oContext); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cNodeTest() { }; +// Static members function fNodeTest_parse (oLexer, oStaticContext) { if (!oLexer.eof()) return fKindTest_parse(oLexer, oStaticContext) || fNameTest_parse(oLexer, oStaticContext); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cKindTest(sName) { this.name = sName; @@ -1971,6 +2359,7 @@ cKindTest.prototype.name = null; cKindTest.prototype.args = null; var hKindTest_names = {}; +// hKindTest_names["document-node"] = {}; hKindTest_names["element"] = {}; hKindTest_names["attribute"] = {}; @@ -1978,53 +2367,70 @@ hKindTest_names["processing-instruction"] = {}; hKindTest_names["comment"] = {}; hKindTest_names["text"] = {}; hKindTest_names["node"] = {}; +// hKindTest_names["schema-element"] = {}; hKindTest_names["schema-attribute"] = {}; +// Static members function fKindTest_parse (oLexer, oStaticContext) { - var sName = oLexer.peek(); + var sName = oLexer.peek(), + oValue; if (oLexer.peek(1) == '(') { - if (!(sName in hKindTest_names)) + // + if (!(sName in hKindTest_names)) throw new cException("XPST0003" - , "Unknown '" + sName + "' kind test" + ); - oLexer.next(2); - var oTest = new cKindTest(sName); + // + oLexer.next(2); + // + var oTest = new cKindTest(sName); if (oLexer.peek() != ')') { if (sName == "document-node") { - } + // TODO: parse test further + } else if (sName == "element") { - } + // TODO: parse test further + } else if (sName == "attribute") { - } + // TODO: parse test further + } else if (sName == "processing-instruction") { - } + oValue = fStringLiteral_parse(oLexer, oStaticContext); + if (!oValue) { + oValue = new cStringLiteral(new cXSString(oLexer.peek())); + oLexer.next(); + } + oTest.args.push(oValue); + } else if (sName == "schema-attribute") { - } + // TODO: parse test further + } else if (sName == "schema-element") { - } + // TODO: parse test further + } } else { if (sName == "schema-attribute") throw new cException("XPST0003" - , "Expected attribute declaration in 'schema-attribute' kind test" + ); else if (sName == "schema-element") throw new cException("XPST0003" - , "Expected element declaration in 'schema-element' kind test" + ); } if (oLexer.peek() != ')') throw new cException("XPST0003" - , "Expected ')' token in kind test" + ); oLexer.next(); @@ -2032,11 +2438,14 @@ function fKindTest_parse (oLexer, oStaticContext) { } }; +// Public members cKindTest.prototype.test = function (oNode, oContext) { var fGetProperty = oContext.DOMAdapter.getProperty, - nType = oContext.DOMAdapter.isNode(oNode) ? fGetProperty(oNode, "nodeType") : 0; + nType = oContext.DOMAdapter.isNode(oNode) ? fGetProperty(oNode, "nodeType") : 0, + sTarget; switch (this.name) { - case "node": return !!nType; + // Node type test + case "node": return !!nType; case "attribute": if (nType != 2) return false; break; case "document-node": return nType == 9; case "element": return nType == 1; @@ -2044,21 +2453,33 @@ cKindTest.prototype.test = function (oNode, oContext) { case "comment": return nType == 8; case "text": return nType == 3 || nType == 4; - case "schema-attribute": + // Schema tests + case "schema-attribute": throw "KindTest '" + "schema-attribute" + "' not implemented"; case "schema-element": throw "KindTest '" + "schema-element" + "' not implemented"; } - if (nType == 2) + // Additional tests + if (nType == 2) return fGetProperty(oNode, "prefix") != "xmlns" && fGetProperty(oNode, "localName") != "xmlns"; - if (nType == 7) - return fGetProperty(oNode, "target") != "xml"; + if (nType == 7) { + sTarget = fGetProperty(oNode, "target"); + return this.args.length ? sTarget == this.args[0].value : sTarget != "xml"; + } return true; }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cNameTest(sPrefix, sLocalName, sNameSpaceURI) { this.prefix = sPrefix; @@ -2072,19 +2493,21 @@ cNameTest.prototype.prefix = null; cNameTest.prototype.localName = null; cNameTest.prototype.namespaceURI = null; -var rNameTest = /^(?:(?![0-9-])([\w-]+|\*)\:)?(?![0-9-])([\w-]+|\*)$/; +// Static members +var rNameTest = /^(?:(?![0-9-])(\w[\w.-]*|\*)\:)?(?![0-9-])(\w[\w.-]*|\*)$/; function fNameTest_parse (oLexer, oStaticContext) { var aMatch = oLexer.peek().match(rNameTest); if (aMatch) { if (aMatch[1] == '*' && aMatch[2] == '*') throw new cException("XPST0003" - , "Illegal use of *:* wildcard in name test" + ); oLexer.next(); return new cNameTest(aMatch[1] || null, aMatch[2], aMatch[1] ? aMatch[1] == '*' ? '*' : oStaticContext.getURIForPrefix(aMatch[1]) || null : oStaticContext.defaultElementNamespace); } }; +// Public members cNameTest.prototype.test = function (oNode, oContext) { var fGetProperty = oContext.DOMAdapter.getProperty, nType = fGetProperty(oNode, "nodeType"); @@ -2094,14 +2517,24 @@ cNameTest.prototype.test = function (oNode, oContext) { if (this.localName == fGetProperty(oNode, "localName")) return this.namespaceURI == '*' || (nType == 2 && !this.prefix && !fGetProperty(oNode, "prefix")) || fGetProperty(oNode, "namespaceURI") == this.namespaceURI; } - return false; + // + return false; }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cPrimaryExpr() { }; +// Static members function fPrimaryExpr_parse (oLexer, oStaticContext) { if (!oLexer.eof()) return fContextItemExpr_parse(oLexer, oStaticContext) @@ -2110,39 +2543,59 @@ function fPrimaryExpr_parse (oLexer, oStaticContext) { || fVarRef_parse(oLexer, oStaticContext) || fLiteral_parse(oLexer, oStaticContext); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cParenthesizedExpr(oExpr) { this.expression = oExpr; }; +// Static members function fParenthesizedExpr_parse (oLexer, oStaticContext) { if (oLexer.peek() == '(') { oLexer.next(); - var oExpr = null; + // Check if not empty (allowed) + var oExpr = null; if (oLexer.peek() != ')') oExpr = fExpr_parse(oLexer, oStaticContext); - if (oLexer.peek() != ')') + // + if (oLexer.peek() != ')') throw new cException("XPST0003" - , "Expected ')' token in parenthesized expression" + ); oLexer.next(); - return new cParenthesizedExpr(oExpr); + // + return new cParenthesizedExpr(oExpr); } }; +// Public members cParenthesizedExpr.prototype.evaluate = function (oContext) { return this.expression ? this.expression.evaluate(oContext) : []; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cContextItemExpr() { }; +// Static members function fContextItemExpr_parse (oLexer, oStaticContext) { if (oLexer.peek() == '.') { oLexer.next(); @@ -2150,14 +2603,23 @@ function fContextItemExpr_parse (oLexer, oStaticContext) { } }; +// Public members cContextItemExpr.prototype.evaluate = function (oContext) { if (oContext.item == null) throw new cException("XPDY0002" - , "Dynamic context does not have context item initialized" - ); - return [oContext.item]; -}; + ); + // + return [oContext.item]; +}; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cLiteral() { @@ -2165,16 +2627,25 @@ function cLiteral() { cLiteral.prototype.value = null; +// Static members function fLiteral_parse (oLexer, oStaticContext) { if (!oLexer.eof()) return fNumericLiteral_parse(oLexer, oStaticContext) || fStringLiteral_parse(oLexer, oStaticContext); }; +// Public members cLiteral.prototype.evaluate = function (oContext) { return [this.value]; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cNumericLiteral(oValue) { this.value = oValue; @@ -2182,6 +2653,7 @@ function cNumericLiteral(oValue) { cNumericLiteral.prototype = new cLiteral; +// Integer | Decimal | Double var rNumericLiteral = /^[+\-]?(?:(?:(\d+)(?:\.(\d*))?)|(?:\.(\d+)))(?:[eE]([+-])?(\d+))?$/; function fNumericLiteral_parse (oLexer, oStaticContext) { var sValue = oLexer.peek(), @@ -2204,7 +2676,14 @@ function fNumericLiteral_parseValue(sValue) { return new cType(+sValue); } }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cStringLiteral(oValue) { this.value = oValue; @@ -2220,7 +2699,14 @@ function fStringLiteral_parse (oLexer, oStaticContext) { return new cStringLiteral(new cXSString(aMatch[1] ? aMatch[1].replace("''", "'") : aMatch[2] ? aMatch[2].replace('""', '"') : '')); } }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cFilterExpr(oPrimary) { this.expression = oPrimary; @@ -2231,27 +2717,38 @@ cFilterExpr.prototype = new cStepExpr; cFilterExpr.prototype.expression = null; +// Static members function fFilterExpr_parse (oLexer, oStaticContext) { var oExpr; if (oLexer.eof() ||!(oExpr = fPrimaryExpr_parse(oLexer, oStaticContext))) return; var oFilterExpr = new cFilterExpr(oExpr); - fStepExpr_parsePredicates(oLexer, oStaticContext, oFilterExpr); + // Parse predicates + fStepExpr_parsePredicates(oLexer, oStaticContext, oFilterExpr); - if (oFilterExpr.predicates.length == 0) + // If no predicates found + if (oFilterExpr.predicates.length == 0) return oFilterExpr.expression; return oFilterExpr; }; +// Public members cFilterExpr.prototype.evaluate = function (oContext) { var oSequence = this.expression.evaluate(oContext); if (this.predicates.length && oSequence.length) oSequence = this.applyPredicates(oSequence, oContext); return oSequence; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cVarRef(sPrefix, sLocalName, sNameSpaceURI) { this.prefix = sPrefix; @@ -2263,14 +2760,15 @@ cVarRef.prototype.prefix = null; cVarRef.prototype.localName = null; cVarRef.prototype.namespaceURI = null; +// Static members function fVarRef_parse (oLexer, oStaticContext) { if (oLexer.peek().substr(0, 1) == '$') { var aMatch = oLexer.peek().substr(1).match(rNameTest); if (aMatch) { if (aMatch[1] == '*' || aMatch[2] == '*') throw new cException("XPST0003" - , "Illegal use of wildcard in var expression variable name" - ); + + ); var oVarRef = new cVarRef(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) : null); oLexer.next(); @@ -2279,15 +2777,24 @@ function fVarRef_parse (oLexer, oStaticContext) { } }; +// Public members cVarRef.prototype.evaluate = function (oContext) { var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName; if (oContext.scope.hasOwnProperty(sUri)) return [oContext.scope[sUri]]; - throw new cException("XPST0008" - , "Variable $" + (this.prefix ? this.prefix + ':' : '') + this.localName + " has not been declared" + // + throw new cException("XPST0008" + ); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cFunctionCall(sPrefix, sLocalName, sNameSpaceURI) { this.prefix = sPrefix; @@ -2301,30 +2808,36 @@ cFunctionCall.prototype.localName = null; cFunctionCall.prototype.namespaceURI = null; cFunctionCall.prototype.args = null; +// Static members function fFunctionCall_parse (oLexer, oStaticContext) { var aMatch = oLexer.peek().match(rNameTest); if (aMatch && oLexer.peek(1) == '(') { - if (!aMatch[1] && (aMatch[2] in hKindTest_names)) + // Reserved "functions" + if (!aMatch[1] && (aMatch[2] in hKindTest_names)) return fAxisStep_parse(oLexer, oStaticContext); - if (aMatch[1] == '*' || aMatch[2] == '*') + // Other functions + if (aMatch[1] == '*' || aMatch[2] == '*') throw new cException("XPST0003" - , "Illegal use of wildcard in function name" + ); var oFunctionCallExpr = new cFunctionCall(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) || null : oStaticContext.defaultFunctionNamespace), oExpr; oLexer.next(2); - if (oLexer.peek() != ')') { + // + if (oLexer.peek() != ')') { do { if (oLexer.eof() ||!(oExpr = fExprSingle_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected function call argument" + ); - oFunctionCallExpr.args.push(oExpr); + // + oFunctionCallExpr.args.push(oExpr); } while (oLexer.peek() == ',' && oLexer.next()); - if (oLexer.peek() != ')') + // + if (oLexer.peek() != ')') throw new cException("XPST0003" - , "Expected ')' token in function call" + ); } oLexer.next(); @@ -2332,43 +2845,54 @@ function fFunctionCall_parse (oLexer, oStaticContext) { } }; +// Public members cFunctionCall.prototype.evaluate = function (oContext) { var aArguments = [], aParameters, fFunction; - for (var nIndex = 0, nLength = this.args.length; nIndex < nLength; nIndex++) + // Evaluate arguments + for (var nIndex = 0, nLength = this.args.length; nIndex < nLength; nIndex++) aArguments.push(this.args[nIndex].evaluate(oContext)); var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName; - if (this.namespaceURI == sNS_XPF) { + // Call function + if (this.namespaceURI == sNS_XPF) { if (fFunction = hStaticContext_functions[this.localName]) { - if (aParameters = hStaticContext_signatures[this.localName]) + // Validate/Cast arguments + if (aParameters = hStaticContext_signatures[this.localName]) fFunctionCall_prepare(this.localName, aParameters, fFunction, aArguments, oContext); - var vResult = fFunction.apply(oContext, aArguments); - return vResult == null ? [] : vResult instanceof cArray ? vResult : [vResult]; + // + var vResult = fFunction.apply(oContext, aArguments); + // + return vResult == null ? [] : vResult instanceof cArray ? vResult : [vResult]; } throw new cException("XPST0017" - , "Unknown system function: " + sUri + '()' + ); } else if (this.namespaceURI == sNS_XSD) { if ((fFunction = hStaticContext_dataTypes[this.localName]) && this.localName != "NOTATION" && this.localName != "anyAtomicType") { - fFunctionCall_prepare(this.localName, [[cXSAnyAtomicType]], fFunction, aArguments, oContext); - return [fFunction.cast(aArguments[0])]; + // + fFunctionCall_prepare(this.localName, [[cXSAnyAtomicType, '?']], fFunction, aArguments, oContext); + // + return aArguments[0] === null ? [] : [fFunction.cast(aArguments[0])]; } throw new cException("XPST0017" - , "Unknown type constructor function: " + sUri + '()' + ); } else if (fFunction = oContext.staticContext.getFunction(sUri)) { - var vResult = fFunction.apply(oContext, aArguments); - return vResult == null ? [] : vResult instanceof cArray ? vResult : [vResult]; + // + var vResult = fFunction.apply(oContext, aArguments); + // + return vResult == null ? [] : vResult instanceof cArray ? vResult : [vResult]; } - throw new cException("XPST0017" - , "Unknown user function: " + sUri + '()' + // + throw new cException("XPST0017" + ); }; @@ -2380,27 +2904,31 @@ function fFunctionCall_prepare(sName, aParameters, fFunction, aArguments, oConte nParametersLength = aParameters.length, nParametersRequired = 0; - while ((nParametersRequired < aParameters.length) && !aParameters[nParametersRequired][2]) + // Determine amount of parameters required + while ((nParametersRequired < aParameters.length) && !aParameters[nParametersRequired][2]) nParametersRequired++; - if (nArgumentsLength > nParametersLength) + // Validate arguments length + if (nArgumentsLength > nParametersLength) throw new cException("XPST0017" - , "Function " + sName + "() must have " + (nParametersLength ? " no more than " : '') + nParametersLength + " argument" + (nParametersLength > 1 || !nParametersLength ? 's' : '') + ); else if (nArgumentsLength < nParametersRequired) throw new cException("XPST0017" - , "Function " + sName + "() must have " + (nParametersRequired == nParametersLength ? "exactly" : "at least") + ' ' + nParametersRequired + " argument" + (nParametersLength > 1 ? 's' : '') + ); for (var nIndex = 0; nIndex < nArgumentsLength; nIndex++) { oParameter = aParameters[nIndex]; oArgument = aArguments[nIndex]; - fFunctionCall_assertSequenceCardinality(oContext, oArgument, oParameter[1] - , aFunctionCall_numbers[nIndex] + " argument of " + sName + '()' + // Check sequence cardinality + fFunctionCall_assertSequenceCardinality(oContext, oArgument, oParameter[1] + ); - fFunctionCall_assertSequenceItemType(oContext, oArgument, oParameter[0] - , aFunctionCall_numbers[nIndex] + " argument of " + sName + '()' + // Check sequence items data types consistency + fFunctionCall_assertSequenceItemType(oContext, oArgument, oParameter[0] + ); if (oParameter[1] != '+' && oParameter[1] != '*') aArguments[nIndex] = oArgument.length ? oArgument[0] : null; @@ -2408,73 +2936,96 @@ function fFunctionCall_prepare(sName, aParameters, fFunction, aArguments, oConte }; function fFunctionCall_assertSequenceItemType(oContext, oSequence, cItemType - , sSource + ) { - for (var nIndex = 0, nLength = oSequence.length, nNodeType, vItem; nIndex < nLength; nIndex++) { + // + for (var nIndex = 0, nLength = oSequence.length, nNodeType, vItem; nIndex < nLength; nIndex++) { vItem = oSequence[nIndex]; - if (cItemType == cXTNode || cItemType.prototype instanceof cXTNode) { - if (!oContext.DOMAdapter.isNode(vItem)) + // Node types + if (cItemType == cXTNode || cItemType.prototype instanceof cXTNode) { + // Check if is node + if (!oContext.DOMAdapter.isNode(vItem)) throw new cException("XPTY0004" - , "Required item type of " + sSource + " is " + cItemType + ); - if (cItemType != cXTNode) { + // Check node type + if (cItemType != cXTNode) { nNodeType = oContext.DOMAdapter.getProperty(vItem, "nodeType"); if ([null, cXTElement, cXTAttribute, cXTText, cXTText, null, null, cXTProcessingInstruction, cXTComment, cXTDocument, null, null, null][nNodeType] != cItemType) throw new cException("XPTY0004" - , "Required item type of " + sSource + " is " + cItemType + ); } } else - if (cItemType == cXSAnyAtomicType || cItemType.prototype instanceof cXSAnyAtomicType) { - vItem = fFunction_sequence_atomize([vItem], oContext)[0]; - if (cItemType != cXSAnyAtomicType) { - if (vItem instanceof cXSUntypedAtomic) + // Atomic types + if (cItemType == cXSAnyAtomicType || cItemType.prototype instanceof cXSAnyAtomicType) { + // Atomize item + vItem = fFunction_sequence_atomize([vItem], oContext)[0]; + // Convert type if necessary + if (cItemType != cXSAnyAtomicType) { + // Cast item to expected type if it's type is xs:untypedAtomic + if (vItem instanceof cXSUntypedAtomic) vItem = cItemType.cast(vItem); - else - if (cItemType == cXSString) { + // Cast item to xs:string if it's type is xs:anyURI + else + if (cItemType == cXSString/* || cItemType.prototype instanceof cXSString*/) { if (vItem instanceof cXSAnyURI) vItem = cXSString.cast(vItem); } else - if (cItemType == cXSDouble) { + if (cItemType == cXSDouble/* || cItemType.prototype instanceof cXSDouble*/) { if (fXSAnyAtomicType_isNumeric(vItem)) vItem = cItemType.cast(vItem); } } - if (!(vItem instanceof cItemType)) + // Check type + if (!(vItem instanceof cItemType)) throw new cException("XPTY0004" - , "Required item type of " + sSource + " is " + cItemType + ); - oSequence[nIndex] = vItem; + // Write value back to sequence + oSequence[nIndex] = vItem; } } }; function fFunctionCall_assertSequenceCardinality(oContext, oSequence, sCardinality - , sSource + ) { var nLength = oSequence.length; - if (sCardinality == '?') { if (nLength > 1) + // Check cardinality + if (sCardinality == '?') { // =0 or 1 + if (nLength > 1) throw new cException("XPTY0004" - , "Required cardinality of " + sSource + " is one or zero" + ); } else - if (sCardinality == '+') { if (nLength < 1) + if (sCardinality == '+') { // =1+ + if (nLength < 1) throw new cException("XPTY0004" - , "Required cardinality of " + sSource + " is one or more" + ); } else - if (sCardinality != '*') { if (nLength != 1) + if (sCardinality != '*') { // =1 ('*' =0+) + if (nLength != 1) throw new cException("XPTY0004" - , "Required cardinality of " + sSource + " is exactly one" + ); } }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cIntersectExceptExpr(oExpr) { this.left = oExpr; @@ -2484,6 +3035,7 @@ function cIntersectExceptExpr(oExpr) { cIntersectExceptExpr.prototype.left = null; cIntersectExceptExpr.prototype.items = null; +// Static members function fIntersectExceptExpr_parse (oLexer, oStaticContext) { var oExpr, sOperator; @@ -2492,25 +3044,34 @@ function fIntersectExceptExpr_parse (oLexer, oStaticContext) { if (!((sOperator = oLexer.peek()) == "intersect" || sOperator == "except")) return oExpr; - var oIntersectExceptExpr = new cIntersectExceptExpr(oExpr); + // IntersectExcept expression + var oIntersectExceptExpr = new cIntersectExceptExpr(oExpr); while ((sOperator = oLexer.peek()) == "intersect" || sOperator == "except") { oLexer.next(); if (oLexer.eof() ||!(oExpr = fInstanceofExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in " + sOperator + " expression" + ); oIntersectExceptExpr.items.push([sOperator, oExpr]); } return oIntersectExceptExpr; }; +// Public members cIntersectExceptExpr.prototype.evaluate = function (oContext) { var oSequence = this.left.evaluate(oContext); for (var nIndex = 0, nLength = this.items.length, oItem; nIndex < nLength; nIndex++) oSequence = hStaticContext_operators[(oItem = this.items[nIndex])[0]].call(oContext, oSequence, oItem[1].evaluate(oContext)); return oSequence; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cRangeExpr(oLeft, oRight) { this.left = oLeft; @@ -2520,6 +3081,7 @@ function cRangeExpr(oLeft, oRight) { cRangeExpr.prototype.left = null; cRangeExpr.prototype.right = null; +// Static members function fRangeExpr_parse (oLexer, oStaticContext) { var oExpr, oRight; @@ -2528,43 +3090,54 @@ function fRangeExpr_parse (oLexer, oStaticContext) { if (oLexer.peek() != "to") return oExpr; - oLexer.next(); + // Range expression + oLexer.next(); if (oLexer.eof() ||!(oRight = fAdditiveExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in range expression" + ); return new cRangeExpr(oExpr, oRight); }; +// Public members cRangeExpr.prototype.evaluate = function (oContext) { - var oLeft = this.left.evaluate(oContext); + // + var oLeft = this.left.evaluate(oContext); if (!oLeft.length) return []; - var sSource = "first operand of 'to'"; + // + fFunctionCall_assertSequenceCardinality(oContext, oLeft, '?' - , sSource + ); fFunctionCall_assertSequenceItemType(oContext, oLeft, cXSInteger - , sSource + ); var oRight = this.right.evaluate(oContext); if (!oRight.length) return []; - sSource = "second operand of 'to'"; + fFunctionCall_assertSequenceCardinality(oContext, oRight, '?' - , sSource + ); fFunctionCall_assertSequenceItemType(oContext, oRight, cXSInteger - , sSource + ); return hStaticContext_operators["to"].call(oContext, oLeft[0], oRight[0]); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cUnionExpr(oExpr) { this.left = oExpr; @@ -2574,6 +3147,7 @@ function cUnionExpr(oExpr) { cUnionExpr.prototype.left = null; cUnionExpr.prototype.items = null; +// Static members function fUnionExpr_parse (oLexer, oStaticContext) { var oExpr, sOperator; @@ -2582,25 +3156,34 @@ function fUnionExpr_parse (oLexer, oStaticContext) { if (!((sOperator = oLexer.peek()) == '|' || sOperator == "union")) return oExpr; - var oUnionExpr = new cUnionExpr(oExpr); + // Union expression + var oUnionExpr = new cUnionExpr(oExpr); while ((sOperator = oLexer.peek()) == '|' || sOperator == "union") { oLexer.next(); if (oLexer.eof() ||!(oExpr = fIntersectExceptExpr_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in union expression" + ); oUnionExpr.items.push(oExpr); } return oUnionExpr; }; +// Public members cUnionExpr.prototype.evaluate = function (oContext) { var oSequence = this.left.evaluate(oContext); for (var nIndex = 0, nLength = this.items.length; nIndex < nLength; nIndex++) oSequence = hStaticContext_operators["union"].call(oContext, oSequence, this.items[nIndex].evaluate(oContext)); return oSequence; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cInstanceofExpr(oExpr, oType) { this.expression = oExpr; @@ -2622,7 +3205,7 @@ function fInstanceofExpr_parse (oLexer, oStaticContext) { oLexer.next(2); if (oLexer.eof() ||!(oType = fSequenceType_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in instance of expression" + ); return new cInstanceofExpr(oExpr, oType); @@ -2632,22 +3215,34 @@ cInstanceofExpr.prototype.evaluate = function(oContext) { var oSequence1 = this.expression.evaluate(oContext), oItemType = this.type.itemType, sOccurence = this.type.occurence; - if (!oItemType) + // Validate empty-sequence() + if (!oItemType) return [new cXSBoolean(!oSequence1.length)]; - if (!oSequence1.length) + // Validate cardinality + if (!oSequence1.length) return [new cXSBoolean(sOccurence == '?' || sOccurence == '*')]; if (oSequence1.length != 1) if (!(sOccurence == '+' || sOccurence == '*')) return [new cXSBoolean(false)]; - if (!oItemType.test) return [new cXSBoolean(true)]; + // Validate type + if (!oItemType.test) // item() + return [new cXSBoolean(true)]; var bValue = true; for (var nIndex = 0, nLength = oSequence1.length; (nIndex < nLength) && bValue; nIndex++) bValue = oItemType.test.test(oSequence1[nIndex], oContext); - return [new cXSBoolean(bValue)]; + // + return [new cXSBoolean(bValue)]; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cTreatExpr(oExpr, oType) { this.expression = oExpr; @@ -2669,7 +3264,7 @@ function fTreatExpr_parse (oLexer, oStaticContext) { oLexer.next(2); if (oLexer.eof() ||!(oType = fSequenceType_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in treat expression" + ); return new cTreatExpr(oExpr, oType); @@ -2679,37 +3274,49 @@ cTreatExpr.prototype.evaluate = function(oContext) { var oSequence1 = this.expression.evaluate(oContext), oItemType = this.type.itemType, sOccurence = this.type.occurence; - if (!oItemType) { + // Validate empty-sequence() + if (!oItemType) { if (oSequence1.length) throw new cException("XPDY0050" - , "The only value allowed for the value in 'treat as' expression is an empty sequence" + ); return oSequence1; } - if (!(sOccurence == '?' || sOccurence == '*')) + // Validate cardinality + if (!(sOccurence == '?' || sOccurence == '*')) if (!oSequence1.length) throw new cException("XPDY0050" - , "An empty sequence is not allowed as the value in 'treat as' expression" + ); if (!(sOccurence == '+' || sOccurence == '*')) if (oSequence1.length != 1) throw new cException("XPDY0050" - , "A sequence of more than one item is not allowed as the value in 'treat as' expression" + ); - if (!oItemType.test) return oSequence1; + // Validate type + if (!oItemType.test) // item() + return oSequence1; for (var nIndex = 0, nLength = oSequence1.length; nIndex < nLength; nIndex++) if (!oItemType.test.test(oSequence1[nIndex], oContext)) throw new cException("XPDY0050" - , "Required item type of value in 'treat as' expression is " + (oItemType.test.prefix ? oItemType.test.prefix + ':' : '') + oItemType.test.localName - ); - return oSequence1; + ); + + // + return oSequence1; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cCastableExpr(oExpr, oType) { this.expression = oExpr; @@ -2731,7 +3338,7 @@ function fCastableExpr_parse (oLexer, oStaticContext) { oLexer.next(2); if (oLexer.eof() ||!(oType = fSingleType_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in castable expression" + ); return new cCastableExpr(oExpr, oType); @@ -2748,7 +3355,8 @@ cCastableExpr.prototype.evaluate = function(oContext) { if (!oSequence1.length) return [new cXSBoolean(sOccurence == '?')]; - try { + // Try casting + try { oItemType.cast(fFunction_sequence_atomize(oSequence1, oContext)[0]); } catch (e) { @@ -2756,14 +3364,22 @@ cCastableExpr.prototype.evaluate = function(oContext) { throw e; if (e.code == "XPST0017") throw new cException("XPST0080" - , "No value is castable to " + (oItemType.prefix ? oItemType.prefix + ':' : '') + oItemType.localName + ); - return [new cXSBoolean(false)]; + // + return [new cXSBoolean(false)]; } return [new cXSBoolean(true)]; }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cCastExpr(oExpr, oType) { this.expression = oExpr; @@ -2785,7 +3401,7 @@ function fCastExpr_parse (oLexer, oStaticContext) { oLexer.next(2); if (oLexer.eof() ||!(oType = fSingleType_parse(oLexer, oStaticContext))) throw new cException("XPST0003" - , "Expected second operand in cast expression" + ); return new cCastExpr(oExpr, oType); @@ -2793,14 +3409,24 @@ function fCastExpr_parse (oLexer, oStaticContext) { cCastExpr.prototype.evaluate = function(oContext) { var oSequence1 = this.expression.evaluate(oContext); - fFunctionCall_assertSequenceCardinality(oContext, oSequence1, this.type.occurence - , "'cast as' expression operand" - ); - if (!oSequence1.length) - return []; - return [this.type.itemType.cast(fFunction_sequence_atomize(oSequence1, oContext)[0], oContext)]; -}; + // Validate cardinality + fFunctionCall_assertSequenceCardinality(oContext, oSequence1, this.type.occurence + ); + // + if (!oSequence1.length) + return []; + // + return [this.type.itemType.cast(fFunction_sequence_atomize(oSequence1, oContext)[0], oContext)]; +}; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cAtomicType(sPrefix, sLocalName, sNameSpaceURI) { this.prefix = sPrefix; @@ -2817,7 +3443,7 @@ function fAtomicType_parse (oLexer, oStaticContext) { if (aMatch) { if (aMatch[1] == '*' || aMatch[2] == '*') throw new cException("XPST0003" - , "Illegal use of wildcard in type name" + ); oLexer.next(); return new cAtomicType(aMatch[1] || null, aMatch[2], aMatch[1] ? oStaticContext.getURIForPrefix(aMatch[1]) : null); @@ -2825,25 +3451,36 @@ function fAtomicType_parse (oLexer, oStaticContext) { }; cAtomicType.prototype.test = function(vItem, oContext) { - var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName, + // Test + var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName, cType = this.namespaceURI == sNS_XSD ? hStaticContext_dataTypes[this.localName] : oContext.staticContext.getDataType(sUri); if (cType) return vItem instanceof cType; - throw new cException("XPST0051" - , "Unknown simple type " + (this.prefix ? this.prefix + ':' : '') + this.localName + // + throw new cException("XPST0051" + ); }; cAtomicType.prototype.cast = function(vItem, oContext) { - var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName, + // Cast + var sUri = (this.namespaceURI ? '{' + this.namespaceURI + '}' : '') + this.localName, cType = this.namespaceURI == sNS_XSD ? hStaticContext_dataTypes[this.localName] : oContext.staticContext.getDataType(sUri); if (cType) return cType.cast(vItem); - throw new cException("XPST0051" - , "Unknown atomic type " + (this.prefix ? this.prefix + ':' : '') + this.localName + // + throw new cException("XPST0051" + ); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cItemType(oTest) { this.test = oTest; @@ -2860,17 +3497,25 @@ function fItemType_parse (oLexer, oStaticContext) { oLexer.next(2); if (oLexer.peek() != ')') throw new cException("XPST0003" - , "Expected ')' token in item type expression" + ); oLexer.next(); return new cItemType; } - if (oExpr = fKindTest_parse(oLexer, oStaticContext)) + // Note! Following step should have been before previous as per spec + if (oExpr = fKindTest_parse(oLexer, oStaticContext)) return new cItemType(oExpr); if (oExpr = fAtomicType_parse(oLexer, oStaticContext)) return new cItemType(oExpr); }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cSequenceType(oItemType, sOccurence) { this.itemType = oItemType || null; @@ -2888,10 +3533,11 @@ function fSequenceType_parse (oLexer, oStaticContext) { oLexer.next(2); if (oLexer.peek() != ')') throw new cException("XPST0003" - , "Expected ')' token in sequence type" + ); oLexer.next(); - return new cSequenceType; } + return new cSequenceType; // empty sequence + } var oExpr, sOccurence; @@ -2905,7 +3551,14 @@ function fSequenceType_parse (oLexer, oStaticContext) { return new cSequenceType(oExpr, sOccurence); } }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cSingleType(oItemType, sOccurence) { this.itemType = oItemType || null; @@ -2928,14 +3581,28 @@ function fSingleType_parse (oLexer, oStaticContext) { return new cSingleType(oExpr, sOccurence); } }; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSAnyType() { }; cXSAnyType.prototype.builtInKind = cXSConstants.ANYTYPE_DT; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSAnySimpleType() { @@ -2946,7 +3613,34 @@ cXSAnySimpleType.prototype = new cXSAnyType; cXSAnySimpleType.prototype.builtInKind = cXSConstants.ANYSIMPLETYPE_DT; cXSAnySimpleType.prototype.primitiveKind= null; -cXSAnySimpleType.PRIMITIVE_ANYURI = "anyURI"; cXSAnySimpleType.PRIMITIVE_BASE64BINARY = "base64Binary"; cXSAnySimpleType.PRIMITIVE_BOOLEAN = "boolean"; cXSAnySimpleType.PRIMITIVE_DATE = "date"; cXSAnySimpleType.PRIMITIVE_DATETIME = "dateTime"; cXSAnySimpleType.PRIMITIVE_DECIMAL = "decimal"; cXSAnySimpleType.PRIMITIVE_DOUBLE = "double"; cXSAnySimpleType.PRIMITIVE_DURATION = "duration"; cXSAnySimpleType.PRIMITIVE_FLOAT = "float"; cXSAnySimpleType.PRIMITIVE_GDAY = "gDay"; cXSAnySimpleType.PRIMITIVE_GMONTH = "gMonth"; cXSAnySimpleType.PRIMITIVE_GMONTHDAY = "gMonthDay"; cXSAnySimpleType.PRIMITIVE_GYEAR = "gYear"; cXSAnySimpleType.PRIMITIVE_GYEARMONTH = "gYearMonth"; cXSAnySimpleType.PRIMITIVE_HEXBINARY = "hexBinary"; cXSAnySimpleType.PRIMITIVE_NOTATION = "NOTATION"; cXSAnySimpleType.PRIMITIVE_QNAME = "QName"; cXSAnySimpleType.PRIMITIVE_STRING = "string"; cXSAnySimpleType.PRIMITIVE_TIME = "time"; +cXSAnySimpleType.PRIMITIVE_ANYURI = "anyURI"; //18; +cXSAnySimpleType.PRIMITIVE_BASE64BINARY = "base64Binary"; // 17; +cXSAnySimpleType.PRIMITIVE_BOOLEAN = "boolean"; // 3; +cXSAnySimpleType.PRIMITIVE_DATE = "date"; // 10; +cXSAnySimpleType.PRIMITIVE_DATETIME = "dateTime"; // 8; +cXSAnySimpleType.PRIMITIVE_DECIMAL = "decimal"; // 4; +cXSAnySimpleType.PRIMITIVE_DOUBLE = "double"; // 6; +cXSAnySimpleType.PRIMITIVE_DURATION = "duration"; // 7; +cXSAnySimpleType.PRIMITIVE_FLOAT = "float"; // 5; +cXSAnySimpleType.PRIMITIVE_GDAY = "gDay"; // 14; +cXSAnySimpleType.PRIMITIVE_GMONTH = "gMonth"; // 15; +cXSAnySimpleType.PRIMITIVE_GMONTHDAY = "gMonthDay"; // 13; +cXSAnySimpleType.PRIMITIVE_GYEAR = "gYear"; // 12; +cXSAnySimpleType.PRIMITIVE_GYEARMONTH = "gYearMonth"; // 11; +cXSAnySimpleType.PRIMITIVE_HEXBINARY = "hexBinary"; // 16; +cXSAnySimpleType.PRIMITIVE_NOTATION = "NOTATION"; // 20; +cXSAnySimpleType.PRIMITIVE_QNAME = "QName"; // 19; +cXSAnySimpleType.PRIMITIVE_STRING = "string"; // 2; +cXSAnySimpleType.PRIMITIVE_TIME = "time"; // 9; + +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSAnyAtomicType() { @@ -2957,15 +3651,25 @@ cXSAnyAtomicType.prototype.builtInKind = cXSConstants.ANYATOMICTYPE_DT; cXSAnyAtomicType.cast = function(vValue) { throw new cException("XPST0017" - , "Abstract type used in constructor function xs:anyAtomicType" - ); }; + + ); // {http://www.w3.org/2001/XMLSchema}anyAtomicType +}; function fXSAnyAtomicType_isNumeric(vItem) { return vItem instanceof cXSFloat || vItem instanceof cXSDouble || vItem instanceof cXSDecimal; }; +// fStaticContext_defineSystemDataType("anyAtomicType", cXSAnyAtomicType); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSAnyURI(sScheme, sAuthority, sPath, sQuery, sFragment) { this.scheme = sScheme; @@ -2993,7 +3697,8 @@ cXSAnyURI.prototype.toString = function() { + (this.fragment ? '#' + this.fragment : ''); }; -var rXSAnyURI = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; cXSAnyURI.cast = function(vValue) { +var rXSAnyURI = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; // http://tools.ietf.org/html/rfc3986 +cXSAnyURI.cast = function(vValue) { if (vValue instanceof cXSAnyURI) return vValue; if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { @@ -3002,13 +3707,23 @@ var rXSAnyURI = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; return new cXSAnyURI(aMatch[2], aMatch[4], aMatch[5], aMatch[7], aMatch[9]); throw new cException("FORG0001"); } - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:anyURI can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("anyURI", cXSAnyURI); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSBase64Binary(sValue) { this.value = sValue; @@ -3045,13 +3760,23 @@ cXSBase64Binary.cast = function(vValue) { aValue.push(cString.fromCharCode(fWindow_parseInt(aMatch[nIndex], 16))); return new cXSBase64Binary(fWindow_btoa(aValue.join(''))); } - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:hexBinary can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("base64Binary", cXSBase64Binary); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSBoolean(bValue) { this.value = bValue; @@ -3083,13 +3808,23 @@ cXSBoolean.cast = function(vValue) { } if (fXSAnyAtomicType_isNumeric(vValue)) return new cXSBoolean(vValue != 0); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:boolean can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("boolean", cXSBoolean); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSDate(nYear, nMonth, nDay, nTimezone, bNegative) { this.year = nYear; @@ -3131,26 +3866,30 @@ cXSDate.cast = function(vValue) { aMatch[5] ? aMatch[5] == 'Z' ? 0 : (aMatch[6] == '-' ? -1 : 1) * (aMatch[7] * 60 + aMatch[8] * 1) : null, aMatch[1] == '-' ); - throw new cException("FORG0001" - , "Invalid date '" + vValue + "' (Non-existent date)" + // + throw new cException("FORG0001" + ); } throw new cException("FORG0001"); } if (vValue instanceof cXSDateTime) return new cXSDate(vValue.year, vValue.month, vValue.day, vValue.timezone, vValue.negative); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:date can never succeed" + // + throw new cException("XPTY0004" + ); }; +// Utilities var aXSDate_days = [31,28,31,30,31,30,31,31,30,31,30,31]; function fXSDate_getDaysForYearMonth(nYear, nMonth) { return nMonth == 2 && (nYear % 400 == 0 || nYear % 100 != 0 && nYear % 4 == 0) ? 29 : aXSDate_days[nMonth - 1]; }; function fXSDate_normalize(oValue, bDay) { - if (!bDay) { + // Adjust day for month/year + if (!bDay) { var nDay = fXSDate_getDaysForYearMonth(oValue.year, oValue.month); if (oValue.day > nDay) { while (oValue.day > nDay) { @@ -3180,7 +3919,9 @@ function fXSDate_normalize(oValue, bDay) { } } } - if (oValue.month > 12) { +//? else + // Adjust month + if (oValue.month > 12) { oValue.year += ~~(oValue.month / 12); if (oValue.year == 0) oValue.year = 1; @@ -3197,8 +3938,17 @@ function fXSDate_normalize(oValue, bDay) { return oValue; }; +// fStaticContext_defineSystemDataType("date", cXSDate); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSDateTime(nYear, nMonth, nDay, nHours, nMinutes, nSeconds, nTimezone, bNegative) { this.year = nYear; @@ -3252,19 +4002,22 @@ cXSDateTime.cast = function(vValue) { aMatch[12] ? aMatch[12] == 'Z' ? 0 : (aMatch[13] == '-' ? -1 : 1) * (aMatch[14] * 60 + aMatch[15] * 1) : null, aMatch[1] == '-' )); - throw new cException("FORG0001" - , "Invalid date '" + vValue + "' (Non-existent date)" + // + throw new cException("FORG0001" + ); } throw new cException("FORG0001"); } if (vValue instanceof cXSDate) return new cXSDateTime(vValue.year, vValue.month, vValue.day, 0, 0, 0, vValue.timezone, vValue.negative); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:dateTime can never succeed" + // + throw new cException("XPTY0004" + ); }; +// Utilities function fXSDateTime_pad(vValue, nLength) { var sValue = cString(vValue); if (arguments.length < 2) @@ -3303,8 +4056,17 @@ function fXSDateTime_normalize(oValue) { return fXSDate_normalize(fXSTime_normalize(oValue)); }; +// fStaticContext_defineSystemDataType("dateTime", cXSDateTime); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSDecimal(nValue) { this.value = nValue; @@ -3337,19 +4099,29 @@ cXSDecimal.cast = function(vValue) { if (vValue instanceof cXSBoolean) return new cXSDecimal(vValue * 1); if (fXSAnyAtomicType_isNumeric(vValue)) { - if (fIsNaN(vValue) || !fIsFinite(vValue)) - throw new cException("FOCA0002" - , "Cannot convert '" + vValue + "' to xs:decimal" - ); - return new cXSDecimal(+vValue); + if (!fIsNaN(vValue) && fIsFinite(vValue)) + return new cXSDecimal(+vValue); + throw new cException("FOCA0002" + + ); } - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:decimal can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("decimal", cXSDecimal); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSDouble(nValue) { this.value = nValue; @@ -3383,13 +4155,23 @@ cXSDouble.cast = function(vValue) { return new cXSDouble(vValue * 1); if (fXSAnyAtomicType_isNumeric(vValue)) return new cXSDouble(vValue.value); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:double can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("double", cXSDouble); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSDuration(nYear, nMonth, nDay, nHours, nMinutes, nSeconds, bNegative) { this.year = nYear; @@ -3420,23 +4202,25 @@ cXSDuration.prototype.toString = function() { var rXSDuration = /^(-)?P(?:([0-9]+)Y)?(?:([0-9]+)M)?(?:([0-9]+)D)?(?:T(?:([0-9]+)H)?(?:([0-9]+)M)?(?:((?:(?:[0-9]+(?:.[0-9]*)?)|(?:.[0-9]+)))S)?)?$/; cXSDuration.cast = function(vValue) { + if (vValue instanceof cXSDuration) + return vValue; if (vValue instanceof cXSYearMonthDuration) return new cXSDuration(vValue.year, vValue.month, 0, 0, 0, 0, vValue.negative); if (vValue instanceof cXSDayTimeDuration) return new cXSDuration(0, 0, vValue.day, vValue.hours, vValue.minutes, vValue.seconds, vValue.negative); - if (vValue instanceof cXSDuration) - return vValue; if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { var aMatch = fString_trim(vValue).match(rXSDuration); if (aMatch) return fXSDuration_normalize(new cXSDuration(+aMatch[2] || 0, +aMatch[3] || 0, +aMatch[4] || 0, +aMatch[5] || 0, +aMatch[6] || 0, +aMatch[7] || 0, aMatch[1] == '-')); throw new cException("FORG0001"); } - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:duration can never succeed" + // + throw new cException("XPTY0004" + ); }; +// Utilities function fXSDuration_getYearMonthComponent(oDuration) { return (oDuration.year ? oDuration.year + 'Y' : '') + (oDuration.month ? oDuration.month + 'M' : ''); @@ -3456,8 +4240,17 @@ function fXSDuration_normalize(oDuration) { return fXSYearMonthDuration_normalize(fXSDayTimeDuration_normalize(oDuration)); }; +// fStaticContext_defineSystemDataType("duration", cXSDuration); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSFloat(nValue) { this.value = nValue; @@ -3491,13 +4284,23 @@ cXSFloat.cast = function(vValue) { return new cXSFloat(vValue * 1); if (fXSAnyAtomicType_isNumeric(vValue)) return new cXSFloat(vValue.value); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:float can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("float", cXSFloat); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSGDay(nDay, nTimezone) { this.day = nDay; @@ -3534,13 +4337,22 @@ cXSGDay.cast = function(vValue) { } if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) return new cXSGDay(vValue.day, vValue.timezone); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:gDay can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("gDay", cXSGDay); - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSGMonth(nMonth, nTimezone) { this.month = nMonth; @@ -3576,13 +4388,22 @@ cXSGMonth.cast = function(vValue) { } if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) return new cXSGMonth(vValue.month, vValue.timezone); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:gMonth can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("gMonth", cXSGMonth); - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSGMonthDay(nMonth, nDay, nTimezone) { this.month = nMonth; @@ -3619,21 +4440,31 @@ cXSGMonthDay.cast = function(vValue) { nDay, aMatch[3] ? aMatch[3] == 'Z' ? 0 : (aMatch[4] == '-' ? -1 : 1) * (aMatch[5] * 60 + aMatch[6] * 1) : null ); - throw new cException("FORG0001" - , "Invalid date '" + vValue + "' (Non-existent date)" + // + throw new cException("FORG0001" + ); } throw new cException("FORG0001"); } if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) return new cXSGMonthDay(vValue.month, vValue.day, vValue.timezone); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:gMonthDay can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("gMonthDay", cXSGMonthDay); - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSGYear(nYear, nTimezone) { this.year = nYear; @@ -3668,13 +4499,22 @@ cXSGYear.cast = function(vValue) { } if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) return new cXSGYear(vValue.year, vValue.timezone); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:gYear can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("gYear", cXSGYear); - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSGYearMonth(nYear, nMonth, nTimezone) { this.year = nYear; @@ -3714,13 +4554,22 @@ cXSGYearMonth.cast = function(vValue) { } if (vValue instanceof cXSDate || vValue instanceof cXSDateTime) return new cXSGYearMonth(vValue.year, vValue.month, vValue.timezone); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:gYearMonth can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("gYearMonth", cXSGYearMonth); - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSHexBinary(sValue) { this.value = sValue; @@ -3759,13 +4608,23 @@ cXSHexBinary.cast = function(vValue) { } return new cXSHexBinary(aValue.join('')); } - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:hexBinary can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("hexBinary", cXSHexBinary); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSNOTATION() { @@ -3777,12 +4636,22 @@ cXSNOTATION.prototype.primitiveKind = cXSAnySimpleType.PRIMITIVE_NOTATION; cXSNOTATION.cast = function(vValue) { throw new cException("XPST0017" - , "Abstract type used in constructor function xs:NOTATION" - ); }; + ); // {http://www.w3.org/2001/XMLSchema}NOTATION +}; + +// fStaticContext_defineSystemDataType("NOTATION", cXSNOTATION); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSQName(sPrefix, sLocalName, sNameSpaceURI) { this.prefix = sPrefix; @@ -3802,7 +4671,7 @@ cXSQName.prototype.toString = function() { return (this.prefix ? this.prefix + ':' : '') + this.localName; }; -var rXSQName = /^(?:(?![0-9-])([\w-]+)\:)?(?![0-9-])([\w-]+)$/; +var rXSQName = /^(?:(?![0-9-])(\w[\w.-]*)\:)?(?![0-9-])(\w[\w.-]*)$/; cXSQName.cast = function(vValue) { if (vValue instanceof cXSQName) return vValue; @@ -3812,13 +4681,23 @@ cXSQName.cast = function(vValue) { return new cXSQName(aMatch[1] || null, aMatch[2], null); throw new cException("FORG0001"); } - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:QName can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("QName", cXSQName); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSString(sValue) { this.value = sValue; @@ -3840,13 +4719,23 @@ cXSString.prototype.toString = function() { cXSString.cast = function(vValue) { return new cXSString(cString(vValue)); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:string can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("string", cXSString); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSTime(nHours, nMinutes, nSeconds, nTimezone) { this.hours = nHours; @@ -3887,30 +4776,45 @@ cXSTime.cast = function(vValue) { } if (vValue instanceof cXSDateTime) return new cXSTime(vValue.hours, vValue.minutes, vValue.seconds, vValue.timezone); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:time can never succeed" + // + throw new cException("XPTY0004" + ); }; +// function fXSTime_normalize(oValue) { - if (oValue.seconds >= 60 || oValue.seconds < 0) { + // + if (oValue.seconds >= 60 || oValue.seconds < 0) { oValue.minutes += ~~(oValue.seconds / 60) - (oValue.seconds < 0 && oValue.seconds % 60 ? 1 : 0); oValue.seconds = oValue.seconds % 60 + (oValue.seconds < 0 && oValue.seconds % 60 ? 60 : 0); } - if (oValue.minutes >= 60 || oValue.minutes < 0) { + // + if (oValue.minutes >= 60 || oValue.minutes < 0) { oValue.hours += ~~(oValue.minutes / 60) - (oValue.minutes < 0 && oValue.minutes % 60 ? 1 : 0); oValue.minutes = oValue.minutes % 60 + (oValue.minutes < 0 && oValue.minutes % 60 ? 60 : 0); } - if (oValue.hours >= 24 || oValue.hours < 0) { + // + if (oValue.hours >= 24 || oValue.hours < 0) { if (oValue instanceof cXSDateTime) oValue.day += ~~(oValue.hours / 24) - (oValue.hours < 0 && oValue.hours % 24 ? 1 : 0); oValue.hours = oValue.hours % 24 + (oValue.hours < 0 && oValue.hours % 24 ? 24 : 0); } - return oValue; + // + return oValue; }; +// fStaticContext_defineSystemDataType("time", cXSTime); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSUntypedAtomic(sValue) { this.value = sValue; @@ -3928,13 +4832,23 @@ cXSUntypedAtomic.cast = function(vValue) { return vValue; return new cXSUntypedAtomic(cString(vValue)); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:untypedAtomic can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("untypedAtomic", cXSUntypedAtomic); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSYearMonthDuration(nYear, nMonth, bNegative) { cXSDuration.call(this, nYear, nMonth, 0, 0, 0, 0, bNegative); @@ -3962,11 +4876,13 @@ cXSYearMonthDuration.cast = function(vValue) { return new cXSYearMonthDuration(0, 0); if (vValue instanceof cXSDuration) return new cXSYearMonthDuration(vValue.year, vValue.month, vValue.negative); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:yearMonthDuration can never succeed" + // + throw new cException("XPTY0004" + ); }; +// function fXSYearMonthDuration_normalize(oDuration) { if (oDuration.month >= 12) { oDuration.year += ~~(oDuration.month / 12); @@ -3975,8 +4891,17 @@ function fXSYearMonthDuration_normalize(oDuration) { return oDuration; }; +// fStaticContext_defineSystemDataType("yearMonthDuration", cXSYearMonthDuration); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSDayTimeDuration(nDay, nHours, nMinutes, nSeconds, bNegative) { cXSDuration.call(this, 0, 0, nDay, nHours, nMinutes, nSeconds, bNegative); @@ -4004,11 +4929,13 @@ cXSDayTimeDuration.cast = function(vValue) { return new cXSDayTimeDuration(0, 0, 0, 0); if (vValue instanceof cXSDuration) return new cXSDayTimeDuration(vValue.day, vValue.hours, vValue.minutes, vValue.seconds, vValue.negative); - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:dayTimeDuration can never succeed" + // + throw new cException("XPTY0004" + ); }; +// Utilities function fXSDayTimeDuration_normalize(oDuration) { if (oDuration.seconds >= 60) { oDuration.minutes += ~~(oDuration.seconds / 60); @@ -4025,8 +4952,17 @@ function fXSDayTimeDuration_normalize(oDuration) { return oDuration; }; +// fStaticContext_defineSystemDataType("dayTimeDuration", cXSDayTimeDuration); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSInteger(nValue) { this.value = nValue; @@ -4038,29 +4974,39 @@ cXSInteger.prototype.builtInKind = cXSConstants.INTEGER_DT; var rXSInteger = /^[-+]?[0-9]+$/; cXSInteger.cast = function(vValue) { if (vValue instanceof cXSInteger) - return vValue; + return new cXSInteger(vValue.value); if (vValue instanceof cXSString || vValue instanceof cXSUntypedAtomic) { var aMatch = fString_trim(vValue).match(rXSInteger); if (aMatch) - return new cXSInteger(~~vValue); + return new cXSInteger(+vValue); throw new cException("FORG0001"); } if (vValue instanceof cXSBoolean) return new cXSInteger(vValue * 1); if (fXSAnyAtomicType_isNumeric(vValue)) { - if (fIsNaN(vValue) || !fIsFinite(vValue)) - throw new cException("FOCA0002" - , "Cannot convert '" + vValue + "' to xs:integer" - ); - return new cXSInteger(~~vValue); + if (!fIsNaN(vValue) && fIsFinite(vValue)) + return new cXSInteger(+vValue); + throw new cException("FOCA0002" + + ); } - throw new cException("XPTY0004" - , "Casting value '" + vValue + "' to xs:integer can never succeed" + // + throw new cException("XPTY0004" + ); }; +// fStaticContext_defineSystemDataType("integer", cXSInteger); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSNonPositiveInteger(nValue) { this.value = nValue; @@ -4070,11 +5016,31 @@ cXSNonPositiveInteger.prototype = new cXSInteger; cXSNonPositiveInteger.prototype.builtInKind = cXSConstants.NONPOSITIVEINTEGER_DT; cXSNonPositiveInteger.cast = function(vValue) { - return new cXSNonPositiveInteger(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value <= 0) + return new cXSNonPositiveInteger(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("nonPositiveInteger", cXSNonPositiveInteger); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSNegativeInteger(nValue) { this.value = nValue; @@ -4084,11 +5050,31 @@ cXSNegativeInteger.prototype = new cXSNonPositiveInteger; cXSNegativeInteger.prototype.builtInKind = cXSConstants.NEGATIVEINTEGER_DT; cXSNegativeInteger.cast = function(vValue) { - return new cXSNegativeInteger(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value <= -1) + return new cXSNegativeInteger(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("negativeInteger", cXSNegativeInteger); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSLong(nValue) { this.value = nValue; @@ -4098,11 +5084,31 @@ cXSLong.prototype = new cXSInteger; cXSLong.prototype.builtInKind = cXSConstants.LONG_DT; cXSLong.cast = function(vValue) { - return new cXSLong(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value <= 9223372036854775807 && oValue.value >= -9223372036854775808) + return new cXSLong(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("long", cXSLong); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSInt(nValue) { this.value = nValue; @@ -4112,11 +5118,31 @@ cXSInt.prototype = new cXSLong; cXSInt.prototype.builtInKind = cXSConstants.INT_DT; cXSInt.cast = function(vValue) { - return new cXSInt(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value <= 2147483647 && oValue.value >= -2147483648) + return new cXSInt(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("int", cXSInt); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSShort(nValue) { this.value = nValue; @@ -4126,11 +5152,31 @@ cXSShort.prototype = new cXSInt; cXSShort.prototype.builtInKind = cXSConstants.SHORT_DT; cXSShort.cast = function(vValue) { - return new cXSShort(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value <= 32767 && oValue.value >= -32768) + return new cXSShort(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("short", cXSShort); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSByte(nValue) { this.value = nValue; @@ -4140,11 +5186,31 @@ cXSByte.prototype = new cXSShort; cXSByte.prototype.builtInKind = cXSConstants.BYTE_DT; cXSByte.cast = function(vValue) { - return new cXSByte(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value <= 127 && oValue.value >= -128) + return new cXSByte(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("byte", cXSByte); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSNonNegativeInteger(nValue) { this.value = nValue; @@ -4154,11 +5220,31 @@ cXSNonNegativeInteger.prototype = new cXSInteger; cXSNonNegativeInteger.prototype.builtInKind = cXSConstants.NONNEGATIVEINTEGER_DT; cXSNonNegativeInteger.cast = function(vValue) { - return new cXSNonNegativeInteger(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value >= 0) + return new cXSNonNegativeInteger(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("nonNegativeInteger", cXSNonNegativeInteger); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSPositiveInteger(nValue) { this.value = nValue; @@ -4168,11 +5254,31 @@ cXSPositiveInteger.prototype = new cXSNonNegativeInteger; cXSPositiveInteger.prototype.builtInKind = cXSConstants.POSITIVEINTEGER_DT; cXSPositiveInteger.cast = function(vValue) { - return new cXSPositiveInteger(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value >= 1) + return new cXSPositiveInteger(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("positiveInteger", cXSPositiveInteger); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSUnsignedLong(nValue) { this.value = nValue; @@ -4182,11 +5288,31 @@ cXSUnsignedLong.prototype = new cXSNonNegativeInteger; cXSUnsignedLong.prototype.builtInKind = cXSConstants.UNSIGNEDLONG_DT; cXSUnsignedLong.cast = function(vValue) { - return new cXSUnsignedLong(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value >= 1 && oValue.value <= 18446744073709551615) + return new cXSUnsignedLong(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("unsignedLong", cXSUnsignedLong); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSUnsignedInt(nValue) { this.value = nValue; @@ -4196,11 +5322,31 @@ cXSUnsignedInt.prototype = new cXSNonNegativeInteger; cXSUnsignedInt.prototype.builtInKind = cXSConstants.UNSIGNEDINT_DT; cXSUnsignedInt.cast = function(vValue) { - return new cXSUnsignedInt(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value >= 1 && oValue.value <= 4294967295) + return new cXSUnsignedInt(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("unsignedInt", cXSUnsignedInt); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSUnsignedShort(nValue) { this.value = nValue; @@ -4210,11 +5356,31 @@ cXSUnsignedShort.prototype = new cXSUnsignedInt; cXSUnsignedShort.prototype.builtInKind = cXSConstants.UNSIGNEDSHORT_DT; cXSUnsignedShort.cast = function(vValue) { - return new cXSUnsignedShort(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value >= 1 && oValue.value <= 65535) + return new cXSUnsignedShort(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("unsignedShort", cXSUnsignedShort); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSUnsignedByte(nValue) { this.value = nValue; @@ -4224,11 +5390,31 @@ cXSUnsignedByte.prototype = new cXSUnsignedShort; cXSUnsignedByte.prototype.builtInKind = cXSConstants.UNSIGNEDBYTE_DT; cXSUnsignedByte.cast = function(vValue) { - return new cXSUnsignedByte(cNumber(vValue)); + var oValue; + try { + oValue = cXSInteger.cast(vValue); + } + catch (oError) { + throw oError; + } + // facet validation + if (oValue.value >= 1 && oValue.value <= 255) + return new cXSUnsignedByte(oValue.value); + // + throw new cException("FORG0001"); }; +// fStaticContext_defineSystemDataType("unsignedByte", cXSUnsignedByte); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSNormalizedString(sValue) { this.value = sValue; @@ -4241,8 +5427,17 @@ cXSNormalizedString.cast = function(vValue) { return new cXSNormalizedString(cString(vValue)); }; +// fStaticContext_defineSystemDataType("normalizedString", cXSNormalizedString); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSToken(sValue) { this.value = sValue; @@ -4255,8 +5450,17 @@ cXSToken.cast = function(vValue) { return new cXSToken(cString(vValue)); }; +// fStaticContext_defineSystemDataType("token", cXSToken); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSName(sValue) { this.value = sValue; @@ -4269,8 +5473,17 @@ cXSName.cast = function(vValue) { return new cXSName(cString(vValue)); }; +// fStaticContext_defineSystemDataType("Name", cXSName); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSNCName(sValue) { this.value = sValue; @@ -4283,8 +5496,17 @@ cXSNCName.cast = function(vValue) { return new cXSNCName(cString(vValue)); }; +// fStaticContext_defineSystemDataType("NCName", cXSNCName); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSENTITY(sValue) { this.value = sValue; @@ -4297,8 +5519,17 @@ cXSENTITY.cast = function(vValue) { return new cXSENTITY(cString(vValue)); }; +// fStaticContext_defineSystemDataType("ENTITY", cXSENTITY); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSID(sValue) { this.value = sValue; @@ -4311,8 +5542,40 @@ cXSID.cast = function(vValue) { return new cXSID(cString(vValue)); }; +// fStaticContext_defineSystemDataType("ID", cXSID); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ + +function cXSIDREF(sValue) { + this.value = sValue; +}; + +cXSIDREF.prototype = new cXSNCName; +cXSIDREF.prototype.builtInKind = cXSConstants.IDREF_DT; + +cXSIDREF.cast = function(vValue) { + return new cXSIDREF(cString(vValue)); +}; + +// +fStaticContext_defineSystemDataType("IDREF", cXSIDREF); + +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSLanguage(sValue) { this.value = sValue; @@ -4325,8 +5588,17 @@ cXSLanguage.cast = function(vValue) { return new cXSLanguage(cString(vValue)); }; +// fStaticContext_defineSystemDataType("language", cXSLanguage); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXSNMTOKEN(sValue) { this.value = sValue; @@ -4339,13 +5611,30 @@ cXSNMTOKEN.cast = function(vValue) { return new cXSNMTOKEN(cString(vValue)); }; +// fStaticContext_defineSystemDataType("NMTOKEN", cXSNMTOKEN); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXTItem() { }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXTNode() { @@ -4354,50 +5643,104 @@ function cXTNode() { cXTNode.prototype = new cXTItem; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXTAttribute() { }; cXTAttribute.prototype = new cXTNode; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXTComment() { }; cXTComment.prototype = new cXTNode; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXTDocument() { }; cXTDocument.prototype = new cXTNode; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXTElement() { }; cXTElement.prototype = new cXTNode; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXTProcessingInstruction() { }; cXTProcessingInstruction.prototype = new cXTNode; - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ function cXTText() { }; cXTText.prototype = new cXTNode; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ - - +/* + 12.1 Comparisons of base64Binary and hexBinary Values + op:hexBinary-equal + op:base64Binary-equal +*/ hStaticContext_operators["hexBinary-equal"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.valueOf() == oRight.valueOf()); }; @@ -4405,83 +5748,172 @@ hStaticContext_operators["hexBinary-equal"] = function(oLeft, oRight) { hStaticContext_operators["base64Binary-equal"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.valueOf() == oRight.valueOf()); }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 9.2 Operators on Boolean Values + op:boolean-equal + op:boolean-less-than + op:boolean-greater-than +*/ - - +// 9.2 Operators on Boolean Values +// op:boolean-equal($value1 as xs:boolean, $value2 as xs:boolean) as xs:boolean hStaticContext_operators["boolean-equal"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.valueOf() == oRight.valueOf()); }; +// op:boolean-less-than($arg1 as xs:boolean, $arg2 as xs:boolean) as xs:boolean hStaticContext_operators["boolean-less-than"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.valueOf() < oRight.valueOf()); }; +// op:boolean-greater-than($arg1 as xs:boolean, $arg2 as xs:boolean) as xs:boolean hStaticContext_operators["boolean-greater-than"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.valueOf() > oRight.valueOf()); }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ + +/* + 10.4 Comparison Operators on Duration, Date and Time Values + op:yearMonthDuration-less-than + op:yearMonthDuration-greater-than + op:dayTimeDuration-less-than + op:dayTimeDuration-greater-than + op:duration-equal + op:dateTime-equal + op:dateTime-less-than + op:dateTime-greater-than + op:date-equal + op:date-less-than + op:date-greater-than + op:time-equal + op:time-less-than + op:time-greater-than + op:gYearMonth-equal + op:gYear-equal + op:gMonthDay-equal + op:gMonth-equal + op:gDay-equal + + 10.6 Arithmetic Operators on Durations + op:add-yearMonthDurations + op:subtract-yearMonthDurations + op:multiply-yearMonthDuration + op:divide-yearMonthDuration + op:divide-yearMonthDuration-by-yearMonthDuration + op:add-dayTimeDurations + op:subtract-dayTimeDurations + op:multiply-dayTimeDuration + op:divide-dayTimeDuration + op:divide-dayTimeDuration-by-dayTimeDuration + 10.8 Arithmetic Operators on Durations, Dates and Times + op:subtract-dateTimes + op:subtract-dates + op:subtract-times + op:add-yearMonthDuration-to-dateTime + op:add-dayTimeDuration-to-dateTime + op:subtract-yearMonthDuration-from-dateTime + op:subtract-dayTimeDuration-from-dateTime + op:add-yearMonthDuration-to-date + op:add-dayTimeDuration-to-date + op:subtract-yearMonthDuration-from-date + op:subtract-dayTimeDuration-from-date + op:add-dayTimeDuration-to-time + op:subtract-dayTimeDuration-from-time +*/ +// 10.4 Comparison Operators on Duration, Date and Time Values +// op:yearMonthDuration-less-than($arg1 as xs:yearMonthDuration, $arg2 as xs:yearMonthDuration) as xs:boolean hStaticContext_operators["yearMonthDuration-less-than"] = function(oLeft, oRight) { return new cXSBoolean(fOperator_yearMonthDuration_toMonths(oLeft) < fOperator_yearMonthDuration_toMonths(oRight)); }; +// op:yearMonthDuration-greater-than($arg1 as xs:yearMonthDuration, $arg2 as xs:yearMonthDuration) as xs:boolean hStaticContext_operators["yearMonthDuration-greater-than"] = function(oLeft, oRight) { return new cXSBoolean(fOperator_yearMonthDuration_toMonths(oLeft) > fOperator_yearMonthDuration_toMonths(oRight)); }; +// op:dayTimeDuration-less-than($arg1 as dayTimeDuration, $arg2 as dayTimeDuration) as xs:boolean hStaticContext_operators["dayTimeDuration-less-than"] = function(oLeft, oRight) { return new cXSBoolean(fOperator_dayTimeDuration_toSeconds(oLeft) < fOperator_dayTimeDuration_toSeconds(oRight)); }; +// op:dayTimeDuration-greater-than($arg1 as dayTimeDuration, $arg2 as dayTimeDuration) as xs:boolean hStaticContext_operators["dayTimeDuration-greater-than"] = function(oLeft, oRight) { return new cXSBoolean(fOperator_dayTimeDuration_toSeconds(oLeft) > fOperator_dayTimeDuration_toSeconds(oRight)); }; +// op:duration-equal($arg1 as xs:duration, $arg2 as xs:duration) as xs:boolean hStaticContext_operators["duration-equal"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.negative == oRight.negative && fOperator_yearMonthDuration_toMonths(oLeft) == fOperator_yearMonthDuration_toMonths(oRight) && fOperator_dayTimeDuration_toSeconds(oLeft) == fOperator_dayTimeDuration_toSeconds(oRight)); }; +// op:dateTime-equal($arg1 as xs:dateTime, $arg2 as xs:dateTime) as xs:boolean hStaticContext_operators["dateTime-equal"] = function(oLeft, oRight) { return fOperator_compareDateTimes(oLeft, oRight, 'eq'); }; +// op:dateTime-less-than($arg1 as xs:dateTime, $arg2 as xs:dateTime) as xs:boolean hStaticContext_operators["dateTime-less-than"] = function(oLeft, oRight) { return fOperator_compareDateTimes(oLeft, oRight, 'lt'); }; +//op:dateTime-greater-than($arg1 as xs:dateTime, $arg2 as xs:dateTime) as xs:boolean hStaticContext_operators["dateTime-greater-than"] = function(oLeft, oRight) { return fOperator_compareDateTimes(oLeft, oRight, 'gt'); }; +// op:date-equal($arg1 as xs:date, $arg2 as xs:date) as xs:boolean hStaticContext_operators["date-equal"] = function(oLeft, oRight) { return fOperator_compareDates(oLeft, oRight, 'eq'); }; +// op:date-less-than($arg1 as xs:date, $arg2 as xs:date) as xs:boolean hStaticContext_operators["date-less-than"] = function(oLeft, oRight) { return fOperator_compareDates(oLeft, oRight, 'lt'); }; +// op:date-greater-than($arg1 as xs:date, $arg2 as xs:date) as xs:boolean hStaticContext_operators["date-greater-than"] = function(oLeft, oRight) { return fOperator_compareDates(oLeft, oRight, 'gt'); }; +// op:time-equal($arg1 as xs:time, $arg2 as xs:time) as xs:boolean hStaticContext_operators["time-equal"] = function(oLeft, oRight) { return fOperator_compareTimes(oLeft, oRight, 'eq'); }; +// op:time-less-than($arg1 as xs:time, $arg2 as xs:time) as xs:boolean hStaticContext_operators["time-less-than"] = function(oLeft, oRight) { return fOperator_compareTimes(oLeft, oRight, 'lt'); }; +// op:time-greater-than($arg1 as xs:time, $arg2 as xs:time) as xs:boolean hStaticContext_operators["time-greater-than"] = function(oLeft, oRight) { return fOperator_compareTimes(oLeft, oRight, 'gt'); }; +// op:gYearMonth-equal($arg1 as xs:gYearMonth, $arg2 as xs:gYearMonth) as xs:boolean hStaticContext_operators["gYearMonth-equal"] = function(oLeft, oRight) { return fOperator_compareDateTimes( new cXSDateTime(oLeft.year, oLeft.month, fXSDate_getDaysForYearMonth(oLeft.year, oLeft.month), 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), @@ -4490,6 +5922,7 @@ hStaticContext_operators["gYearMonth-equal"] = function(oLeft, oRight) { ); }; +// op:gYear-equal($arg1 as xs:gYear, $arg2 as xs:gYear) as xs:boolean hStaticContext_operators["gYear-equal"] = function(oLeft, oRight) { return fOperator_compareDateTimes( new cXSDateTime(oLeft.year, 1, 1, 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), @@ -4498,6 +5931,7 @@ hStaticContext_operators["gYear-equal"] = function(oLeft, oRight) { ); }; +// op:gMonthDay-equal($arg1 as xs:gMonthDay, $arg2 as xs:gMonthDay) as xs:boolean hStaticContext_operators["gMonthDay-equal"] = function(oLeft, oRight) { return fOperator_compareDateTimes( new cXSDateTime(1972, oLeft.month, oLeft.day, 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), @@ -4506,6 +5940,7 @@ hStaticContext_operators["gMonthDay-equal"] = function(oLeft, oRight) { ); }; +// op:gMonth-equal($arg1 as xs:gMonth, $arg2 as xs:gMonth) as xs:boolean hStaticContext_operators["gMonth-equal"] = function(oLeft, oRight) { return fOperator_compareDateTimes( new cXSDateTime(1972, oLeft.month, fXSDate_getDaysForYearMonth(1972, oRight.month), 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), @@ -4514,6 +5949,7 @@ hStaticContext_operators["gMonth-equal"] = function(oLeft, oRight) { ); }; +// op:gDay-equal($arg1 as xs:gDay, $arg2 as xs:gDay) as xs:boolean hStaticContext_operators["gDay-equal"] = function(oLeft, oRight) { return fOperator_compareDateTimes( new cXSDateTime(1972, 12, oLeft.day, 0, 0, 0, oLeft.timezone == null ? this.timezone : oLeft.timezone), @@ -4522,104 +5958,131 @@ hStaticContext_operators["gDay-equal"] = function(oLeft, oRight) { ); }; +// 10.6 Arithmetic Operators on Durations +// op:add-yearMonthDurations($arg1 as xs:yearMonthDuration, $arg2 as xs:yearMonthDuration) as xs:yearMonthDuration hStaticContext_operators["add-yearMonthDurations"] = function(oLeft, oRight) { return fOperator_yearMonthDuration_fromMonths(fOperator_yearMonthDuration_toMonths(oLeft) + fOperator_yearMonthDuration_toMonths(oRight)); }; +// op:subtract-yearMonthDurations($arg1 as xs:yearMonthDuration, $arg2 as xs:yearMonthDuration) as xs:yearMonthDuration hStaticContext_operators["subtract-yearMonthDurations"] = function(oLeft, oRight) { return fOperator_yearMonthDuration_fromMonths(fOperator_yearMonthDuration_toMonths(oLeft) - fOperator_yearMonthDuration_toMonths(oRight)); }; +// op:multiply-yearMonthDuration($arg1 as xs:yearMonthDuration, $arg2 as xs:double) as xs:yearMonthDuration hStaticContext_operators["multiply-yearMonthDuration"] = function(oLeft, oRight) { return fOperator_yearMonthDuration_fromMonths(fOperator_yearMonthDuration_toMonths(oLeft) * oRight); }; +// op:divide-yearMonthDuration($arg1 as xs:yearMonthDuration, $arg2 as xs:double) as xs:yearMonthDuration hStaticContext_operators["divide-yearMonthDuration"] = function(oLeft, oRight) { return fOperator_yearMonthDuration_fromMonths(fOperator_yearMonthDuration_toMonths(oLeft) / oRight); }; +// op:divide-yearMonthDuration-by-yearMonthDuration($arg1 as xs:yearMonthDuration, $arg2 as xs:yearMonthDuration) as xs:decimal hStaticContext_operators["divide-yearMonthDuration-by-yearMonthDuration"] = function(oLeft, oRight) { return new cXSDecimal(fOperator_yearMonthDuration_toMonths(oLeft) / fOperator_yearMonthDuration_toMonths(oRight)); }; +// op:add-dayTimeDurations($arg1 as xs:dayTimeDuration, $arg2 as xs:dayTimeDuration) as xs:dayTimeDuration hStaticContext_operators["add-dayTimeDurations"] = function(oLeft, oRight) { return fOperator_dayTimeDuration_fromSeconds(fOperator_dayTimeDuration_toSeconds(oLeft) + fOperator_dayTimeDuration_toSeconds(oRight)); }; +// op:subtract-dayTimeDurations($arg1 as xs:dayTimeDuration, $arg2 as xs:dayTimeDuration) as xs:dayTimeDuration hStaticContext_operators["subtract-dayTimeDurations"] = function(oLeft, oRight) { return fOperator_dayTimeDuration_fromSeconds(fOperator_dayTimeDuration_toSeconds(oLeft) - fOperator_dayTimeDuration_toSeconds(oRight)); }; +// op:multiply-dayTimeDurations($arg1 as xs:dayTimeDuration, $arg2 as xs:double) as xs:dayTimeDuration hStaticContext_operators["multiply-dayTimeDuration"] = function(oLeft, oRight) { return fOperator_dayTimeDuration_fromSeconds(fOperator_dayTimeDuration_toSeconds(oLeft) * oRight); }; +// op:divide-dayTimeDurations($arg1 as xs:dayTimeDuration, $arg2 as xs:double) as xs:dayTimeDuration hStaticContext_operators["divide-dayTimeDuration"] = function(oLeft, oRight) { return fOperator_dayTimeDuration_fromSeconds(fOperator_dayTimeDuration_toSeconds(oLeft) / oRight); }; +// op:divide-dayTimeDuration-by-dayTimeDuration($arg1 as xs:dayTimeDuration, $arg2 as xs:dayTimeDuration) as xs:decimal hStaticContext_operators["divide-dayTimeDuration-by-dayTimeDuration"] = function(oLeft, oRight) { return new cXSDecimal(fOperator_dayTimeDuration_toSeconds(oLeft) / fOperator_dayTimeDuration_toSeconds(oRight)); }; +// 10.8 Arithmetic Operators on Durations, Dates and Times +// op:subtract-dateTimes($arg1 as xs:dateTime, $arg2 as xs:dateTime) as xs:dayTimeDuration hStaticContext_operators["subtract-dateTimes"] = function(oLeft, oRight) { return fOperator_dayTimeDuration_fromSeconds(fOperator_dateTime_toSeconds(oLeft) - fOperator_dateTime_toSeconds(oRight)); }; +// op:subtract-dates($arg1 as xs:date, $arg2 as xs:date) as xs:dayTimeDuration hStaticContext_operators["subtract-dates"] = function(oLeft, oRight) { return fOperator_dayTimeDuration_fromSeconds(fOperator_dateTime_toSeconds(oLeft) - fOperator_dateTime_toSeconds(oRight)); }; +// op:subtract-times($arg1 as xs:time, $arg2 as xs:time) as xs:dayTimeDuration hStaticContext_operators["subtract-times"] = function(oLeft, oRight) { return fOperator_dayTimeDuration_fromSeconds(fOperator_time_toSeconds(oLeft) - fOperator_time_toSeconds(oRight)); }; +// op:add-yearMonthDuration-to-dateTime($arg1 as xs:dateTime, $arg2 as xs:yearMonthDuration) as xs:dateTime hStaticContext_operators["add-yearMonthDuration-to-dateTime"] = function(oLeft, oRight) { return fOperator_addYearMonthDuration2DateTime(oLeft, oRight, '+'); }; +// op:add-dayTimeDuration-to-dateTime($arg1 as xs:dateTime, $arg2 as xs:dayTimeDuration) as xs:dateTime hStaticContext_operators["add-dayTimeDuration-to-dateTime"] = function(oLeft, oRight) { return fOperator_addDayTimeDuration2DateTime(oLeft, oRight, '+'); }; +// op:subtract-yearMonthDuration-from-dateTime($arg1 as xs:dateTime, $arg2 as xs:yearMonthDuration) as xs:dateTime hStaticContext_operators["subtract-yearMonthDuration-from-dateTime"] = function(oLeft, oRight) { return fOperator_addYearMonthDuration2DateTime(oLeft, oRight, '-'); }; +// op:subtract-dayTimeDuration-from-dateTime($arg1 as xs:dateTime, $arg2 as xs:dayTimeDuration) as xs:dateTime hStaticContext_operators["subtract-dayTimeDuration-from-dateTime"] = function(oLeft, oRight) { return fOperator_addDayTimeDuration2DateTime(oLeft, oRight, '-'); }; +// op:add-yearMonthDuration-to-date($arg1 as xs:date, $arg2 as xs:yearMonthDuration) as xs:date hStaticContext_operators["add-yearMonthDuration-to-date"] = function(oLeft, oRight) { return fOperator_addYearMonthDuration2DateTime(oLeft, oRight, '+'); }; +// op:add-dayTimeDuration-to-date($arg1 as xs:date, $arg2 as xs:dayTimeDuration) as xs:date hStaticContext_operators["add-dayTimeDuration-to-date"] = function(oLeft, oRight) { return fOperator_addDayTimeDuration2DateTime(oLeft, oRight, '+'); }; +// op:subtract-yearMonthDuration-from-date($arg1 as xs:date, $arg2 as xs:yearMonthDuration) as xs:date hStaticContext_operators["subtract-yearMonthDuration-from-date"] = function(oLeft, oRight) { return fOperator_addYearMonthDuration2DateTime(oLeft, oRight, '-'); }; +// op:subtract-dayTimeDuration-from-date($arg1 as xs:date, $arg2 as xs:dayTimeDuration) as xs:date hStaticContext_operators["subtract-dayTimeDuration-from-date"] = function(oLeft, oRight) { return fOperator_addDayTimeDuration2DateTime(oLeft, oRight, '-'); }; +// op:add-dayTimeDuration-to-time($arg1 as xs:time, $arg2 as xs:dayTimeDuration) as xs:time hStaticContext_operators["add-dayTimeDuration-to-time"] = function(oLeft, oRight) { var oValue = new cXSTime(oLeft.hours, oLeft.minutes, oLeft.seconds, oLeft.timezone); oValue.hours += oRight.hours; oValue.minutes += oRight.minutes; oValue.seconds += oRight.seconds; - return fXSTime_normalize(oValue); + // + return fXSTime_normalize(oValue); }; +// op:subtract-dayTimeDuration-from-time($arg1 as xs:time, $arg2 as xs:dayTimeDuration) as xs:time hStaticContext_operators["subtract-dayTimeDuration-from-time"] = function(oLeft, oRight) { var oValue = new cXSTime(oLeft.hours, oLeft.minutes, oLeft.seconds, oLeft.timezone); oValue.hours -= oRight.hours; oValue.minutes -= oRight.minutes; oValue.seconds -= oRight.seconds; - return fXSTime_normalize(oValue); + // + return fXSTime_normalize(oValue); }; function fOperator_compareTimes(oLeft, oRight, sComparator) { @@ -4633,7 +6096,8 @@ function fOperator_compareDates(oLeft, oRight, sComparator) { }; function fOperator_compareDateTimes(oLeft, oRight, sComparator) { - var oTimezone = new cXSDayTimeDuration(0, 0, 0, 0), + // Adjust object time zone to Z and compare as strings + var oTimezone = new cXSDayTimeDuration(0, 0, 0, 0), sLeft = fFunction_dateTime_adjustTimezone(oLeft, oTimezone).toString(), sRight = fFunction_dateTime_adjustTimezone(oRight, oTimezone).toString(); return new cXSBoolean(sComparator == 'lt' ? sLeft < sRight : sComparator == 'gt' ? sLeft > sRight : sLeft == sRight); @@ -4646,13 +6110,17 @@ function fOperator_addYearMonthDuration2DateTime(oLeft, oRight, sOperator) { else if (oLeft instanceof cXSDateTime) oValue = new cXSDateTime(oLeft.year, oLeft.month, oLeft.day, oLeft.hours, oLeft.minutes, oLeft.seconds, oLeft.timezone, oLeft.negative); - oValue.year = oValue.year + oRight.year * (sOperator == '-' ?-1 : 1); + // + oValue.year = oValue.year + oRight.year * (sOperator == '-' ?-1 : 1); oValue.month = oValue.month + oRight.month * (sOperator == '-' ?-1 : 1); - fXSDate_normalize(oValue, true); - var nDay = fXSDate_getDaysForYearMonth(oValue.year, oValue.month); + // + fXSDate_normalize(oValue, true); + // Correct day if out of month range + var nDay = fXSDate_getDaysForYearMonth(oValue.year, oValue.month); if (oValue.day > nDay) oValue.day = nDay; - return oValue; + // + return oValue; }; function fOperator_addDayTimeDuration2DateTime(oLeft, oRight, sOperator) { @@ -4661,7 +6129,8 @@ function fOperator_addDayTimeDuration2DateTime(oLeft, oRight, sOperator) { var nValue = (oRight.hours * 60 + oRight.minutes) * 60 + oRight.seconds; oValue = new cXSDate(oLeft.year, oLeft.month, oLeft.day, oLeft.timezone, oLeft.negative); oValue.day = oValue.day + oRight.day * (sOperator == '-' ?-1 : 1) - 1 * (nValue && sOperator == '-'); - fXSDate_normalize(oValue); + // + fXSDate_normalize(oValue); } else if (oLeft instanceof cXSDateTime) { @@ -4670,11 +6139,13 @@ function fOperator_addDayTimeDuration2DateTime(oLeft, oRight, sOperator) { oValue.minutes = oValue.minutes + oRight.minutes * (sOperator == '-' ?-1 : 1); oValue.hours = oValue.hours + oRight.hours * (sOperator == '-' ?-1 : 1); oValue.day = oValue.day + oRight.day * (sOperator == '-' ?-1 : 1); - fXSDateTime_normalize(oValue); + // + fXSDateTime_normalize(oValue); } return oValue; }; +// xs:dayTimeDuration to/from seconds function fOperator_dayTimeDuration_toSeconds(oDuration) { return (((oDuration.day * 24 + oDuration.hours) * 60 + oDuration.minutes) * 60 + oDuration.seconds) * (oDuration.negative ? -1 : 1); }; @@ -4688,6 +6159,7 @@ function fOperator_dayTimeDuration_fromSeconds(nValue) { return new cXSDayTimeDuration(nDays, nHours, nMinutes, nSeconds, bNegative); }; +// xs:yearMonthDuration to/from months function fOperator_yearMonthDuration_toMonths(oDuration) { return (oDuration.year * 12 + oDuration.month) * (oDuration.negative ? -1 : 1); }; @@ -4699,10 +6171,12 @@ function fOperator_yearMonthDuration_fromMonths(nValue) { return new cXSYearMonthDuration(nYears, nMonths, nNegative); }; +// xs:time to seconds function fOperator_time_toSeconds(oTime) { return oTime.seconds + (oTime.minutes - (oTime.timezone != null ? oTime.timezone % 60 : 0) + (oTime.hours - (oTime.timezone != null ? ~~(oTime.timezone / 60) : 0)) * 60) * 60; }; +// This function unlike all other date-related functions rely on interpretor's dateTime handling function fOperator_dateTime_toSeconds(oValue) { var oDate = new cDate((oValue.negative ? -1 : 1) * oValue.year, oValue.month, oValue.day, 0, 0, 0, 0); if (oValue instanceof cXSDateTime) { @@ -4715,27 +6189,77 @@ function fOperator_dateTime_toSeconds(oValue) { return oDate.getTime() / 1000; }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 14 Functions and Operators on Nodes + op:is-same-node + op:node-before + op:node-after +*/ - +// 14 Operators on Nodes +// op:is-same-node($parameter1 as node(), $parameter2 as node()) as xs:boolean hStaticContext_operators["is-same-node"] = function(oLeft, oRight) { return new cXSBoolean(this.DOMAdapter.isSameNode(oLeft, oRight)); }; +// op:node-before($parameter1 as node(), $parameter2 as node()) as xs:boolean hStaticContext_operators["node-before"] = function(oLeft, oRight) { return new cXSBoolean(!!(this.DOMAdapter.compareDocumentPosition(oLeft, oRight) & 4)); }; +// op:node-after($parameter1 as node(), $parameter2 as node()) as xs:boolean hStaticContext_operators["node-after"] = function(oLeft, oRight) { return new cXSBoolean(!!(this.DOMAdapter.compareDocumentPosition(oLeft, oRight) & 2)); }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 13.1 Operators on NOTATION + op:NOTATION-equal +*/ +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 6.2 Operators on Numeric Values + op:numeric-add + op:numeric-subtract + op:numeric-multiply + op:numeric-divide + op:numeric-integer-divide + op:numeric-mod + op:numeric-unary-plus + op:numeric-unary-minus + 6.3 Comparison Operators on Numeric Values + op:numeric-equal + op:numeric-less-than + op:numeric-greater-than +*/ - - - +// 6.2 Operators on Numeric Values function fFunctionCall_numeric_getPower(oLeft, oRight) { if (fIsNaN(oLeft) || (cMath.abs(oLeft) == nInfinity) || fIsNaN(oRight) || (cMath.abs(oRight) == nInfinity)) return 0; @@ -4745,6 +6269,7 @@ function fFunctionCall_numeric_getPower(oLeft, oRight) { return nPower + (nPower % 2 ? 0 : 1); }; +// op:numeric-add($arg1 as numeric, $arg2 as numeric) as numeric hStaticContext_operators["numeric-add"] = function(oLeft, oRight) { var nLeft = oLeft.valueOf(), nRight = oRight.valueOf(), @@ -4752,6 +6277,7 @@ hStaticContext_operators["numeric-add"] = function(oLeft, oRight) { return fOperator_numeric_getResultOfType(oLeft, oRight, ((nLeft * nPower) + (nRight * nPower))/nPower); }; +// op:numeric-subtract($arg1 as numeric, $arg2 as numeric) as numeric hStaticContext_operators["numeric-subtract"] = function(oLeft, oRight) { var nLeft = oLeft.valueOf(), nRight = oRight.valueOf(), @@ -4759,6 +6285,7 @@ hStaticContext_operators["numeric-subtract"] = function(oLeft, oRight) { return fOperator_numeric_getResultOfType(oLeft, oRight, ((nLeft * nPower) - (nRight * nPower))/nPower); }; +// op:numeric-multiply($arg1 as numeric, $arg2 as numeric) as numeric hStaticContext_operators["numeric-multiply"] = function(oLeft, oRight) { var nLeft = oLeft.valueOf(), nRight = oRight.valueOf(), @@ -4766,6 +6293,7 @@ hStaticContext_operators["numeric-multiply"] = function(oLeft, oRight) { return fOperator_numeric_getResultOfType(oLeft, oRight, ((nLeft * nPower) * (nRight * nPower))/(nPower * nPower)); }; +// op:numeric-divide($arg1 as numeric, $arg2 as numeric) as numeric hStaticContext_operators["numeric-divide"] = function(oLeft, oRight) { var nLeft = oLeft.valueOf(), nRight = oRight.valueOf(), @@ -4773,10 +6301,13 @@ hStaticContext_operators["numeric-divide"] = function(oLeft, oRight) { return fOperator_numeric_getResultOfType(oLeft, oRight, (oLeft * nPower) / (oRight * nPower)); }; +// op:numeric-integer-divide($arg1 as numeric, $arg2 as numeric) as xs:integer hStaticContext_operators["numeric-integer-divide"] = function(oLeft, oRight) { - return new cXSInteger(~~(oLeft / oRight)); + var oValue = oLeft / oRight; + return new cXSInteger(cMath.floor(oValue) + (oValue < 0)); }; +// op:numeric-mod($arg1 as numeric, $arg2 as numeric) as numeric hStaticContext_operators["numeric-mod"] = function(oLeft, oRight) { var nLeft = oLeft.valueOf(), nRight = oRight.valueOf(), @@ -4784,24 +6315,30 @@ hStaticContext_operators["numeric-mod"] = function(oLeft, oRight) { return fOperator_numeric_getResultOfType(oLeft, oRight, ((nLeft * nPower) % (nRight * nPower)) / nPower); }; +// op:numeric-unary-plus($arg as numeric) as numeric hStaticContext_operators["numeric-unary-plus"] = function(oRight) { return oRight; }; +// op:numeric-unary-minus($arg as numeric) as numeric hStaticContext_operators["numeric-unary-minus"] = function(oRight) { oRight.value *=-1; return oRight; }; +// 6.3 Comparison Operators on Numeric Values +// op:numeric-equal($arg1 as numeric, $arg2 as numeric) as xs:boolean hStaticContext_operators["numeric-equal"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.valueOf() == oRight.valueOf()); }; +// op:numeric-less-than($arg1 as numeric, $arg2 as numeric) as xs:boolean hStaticContext_operators["numeric-less-than"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.valueOf() < oRight.valueOf()); }; +// op:numeric-greater-than($arg1 as numeric, $arg2 as numeric) as xs:boolean hStaticContext_operators["numeric-greater-than"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.valueOf() > oRight.valueOf()); }; @@ -4809,112 +6346,195 @@ hStaticContext_operators["numeric-greater-than"] = function(oLeft, oRight) { function fOperator_numeric_getResultOfType(oLeft, oRight, nResult) { return new (oLeft instanceof cXSInteger && oRight instanceof cXSInteger && nResult == cMath.round(nResult) ? cXSInteger : cXSDecimal)(nResult); }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 11.2 Functions and Operators Related to QNames + op:QName-equal +*/ - +// 11.2 Operators Related to QNames +// op:QName-equal($arg1 as xs:QName, $arg2 as xs:QName) as xs:boolean hStaticContext_operators["QName-equal"] = function(oLeft, oRight) { return new cXSBoolean(oLeft.localName == oRight.localName && oLeft.namespaceURI == oRight.namespaceURI); }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 15.1 General Functions and Operators on Sequences + op:concatenate + 15.3 Equals, Union, Intersection and Except + op:union + op:intersect + op:except + 15.5 Functions and Operators that Generate Sequences + op:to +*/ + +// 15.1 General Functions and Operators on Sequences +// op:concatenate($seq1 as item()*, $seq2 as item()*) as item()* hStaticContext_operators["concatenate"] = function(oSequence1, oSequence2) { return oSequence1.concat(oSequence2); }; +// 15.3 Equals, Union, Intersection and Except +// op:union($parameter1 as node()*, $parameter2 as node()*) as node()* hStaticContext_operators["union"] = function(oSequence1, oSequence2) { var oSequence = []; - for (var nIndex = 0, nLength = oSequence1.length, oItem; nIndex < nLength; nIndex++) { + // Process first collection + for (var nIndex = 0, nLength = oSequence1.length, oItem; nIndex < nLength; nIndex++) { if (!this.DOMAdapter.isNode(oItem = oSequence1[nIndex])) throw new cException("XPTY0004" - , "Required item type of first operand of 'union' is node()" - ); if (fArray_indexOf(oSequence, oItem) ==-1) + + ); // Required item type of second operand of 'intersect' is node(); supplied value has item type xs:integer + // + if (fArray_indexOf(oSequence, oItem) ==-1) oSequence.push(oItem); } - for (var nIndex = 0, nLength = oSequence2.length, oItem; nIndex < nLength; nIndex++) { + // Process second collection + for (var nIndex = 0, nLength = oSequence2.length, oItem; nIndex < nLength; nIndex++) { if (!this.DOMAdapter.isNode(oItem = oSequence2[nIndex])) throw new cException("XPTY0004" - , "Required item type of second operand of 'union' is node()" - ); if (fArray_indexOf(oSequence, oItem) ==-1) + + ); // Required item type of second operand of 'intersect' is node(); supplied value has item type xs:integer + // + if (fArray_indexOf(oSequence, oItem) ==-1) oSequence.push(oItem); } return fFunction_sequence_order(oSequence, this); }; +// op:intersect($parameter1 as node()*, $parameter2 as node()*) as node()* hStaticContext_operators["intersect"] = function(oSequence1, oSequence2) { var oSequence = []; for (var nIndex = 0, nLength = oSequence1.length, oItem, bFound; nIndex < nLength; nIndex++) { if (!this.DOMAdapter.isNode(oItem = oSequence1[nIndex])) throw new cException("XPTY0004" - , "Required item type of second operand of 'intersect' is node()" - ); bFound = false; + + ); // Required item type of second operand of 'intersect' is node(); supplied value has item type xs:integer + // + bFound = false; for (var nRightIndex = 0, nRightLength = oSequence2.length;(nRightIndex < nRightLength) && !bFound; nRightIndex++) { if (!this.DOMAdapter.isNode(oSequence2[nRightIndex])) throw new cException("XPTY0004" - , "Required item type of first operand of 'intersect' is node()" + ); bFound = this.DOMAdapter.isSameNode(oSequence2[nRightIndex], oItem); } - if (bFound && fArray_indexOf(oSequence, oItem) ==-1) + // + if (bFound && fArray_indexOf(oSequence, oItem) ==-1) oSequence.push(oItem); } return fFunction_sequence_order(oSequence, this); }; +// op:except($parameter1 as node()*, $parameter2 as node()*) as node()* hStaticContext_operators["except"] = function(oSequence1, oSequence2) { var oSequence = []; for (var nIndex = 0, nLength = oSequence1.length, oItem, bFound; nIndex < nLength; nIndex++) { if (!this.DOMAdapter.isNode(oItem = oSequence1[nIndex])) throw new cException("XPTY0004" - , "Required item type of second operand of 'except' is node()" - ); bFound = false; + + ); // Required item type of second operand of 'intersect' is node(); supplied value has item type xs:integer + // + bFound = false; for (var nRightIndex = 0, nRightLength = oSequence2.length;(nRightIndex < nRightLength) && !bFound; nRightIndex++) { if (!this.DOMAdapter.isNode(oSequence2[nRightIndex])) throw new cException("XPTY0004" - , "Required item type of first operand of 'except' is node()" + ); bFound = this.DOMAdapter.isSameNode(oSequence2[nRightIndex], oItem); } - if (!bFound && fArray_indexOf(oSequence, oItem) ==-1) + // + if (!bFound && fArray_indexOf(oSequence, oItem) ==-1) oSequence.push(oItem); } return fFunction_sequence_order(oSequence, this); }; +// 15.5 Functions and Operators that Generate Sequences +// op:to($firstval as xs:integer, $lastval as xs:integer) as xs:integer* hStaticContext_operators["to"] = function(oLeft, oRight) { var oSequence = []; for (var nIndex = oLeft.valueOf(), nLength = oRight.valueOf(); nIndex <= nLength; nIndex++) oSequence.push(new cXSInteger(nIndex)); - return oSequence; + // + return oSequence; }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 2 Accessors + node-name + nilled + string + data + base-uri + document-uri +*/ +// fn:node-name($arg as node()?) as xs:QName? fStaticContext_defineSystemFunction("node-name", [[cXTNode, '?']], function(oNode) { if (oNode != null) { var fGetProperty = this.DOMAdapter.getProperty; switch (fGetProperty(oNode, "nodeType")) { - case 1: case 2: return new cXSQName(fGetProperty(oNode, "prefix"), fGetProperty(oNode, "localName"), fGetProperty(oNode, "namespaceURI")); - case 5: throw "Not implemented"; - case 6: throw "Not implemented"; - case 7: return new cXSQName(null, fGetProperty(oNode, "target"), null); - case 10: return new cXSQName(null, fGetProperty(oNode, "name"), null); + case 1: // ELEMENT_NAME + case 2: // ATTRIBUTE_NODE + return new cXSQName(fGetProperty(oNode, "prefix"), fGetProperty(oNode, "localName"), fGetProperty(oNode, "namespaceURI")); + case 5: // ENTITY_REFERENCE_NODE + throw "Not implemented"; + case 6: // ENTITY_NODE + throw "Not implemented"; + case 7: // PROCESSING_INSTRUCTION_NODE + return new cXSQName(null, fGetProperty(oNode, "target"), null); + case 10: // DOCUMENT_TYPE_NODE + return new cXSQName(null, fGetProperty(oNode, "name"), null); } } - return null; + // + return null; }); +// fn:nilled($arg as node()?) as xs:boolean? fStaticContext_defineSystemFunction("nilled", [[cXTNode, '?']], function(oNode) { if (oNode != null) { if (this.DOMAdapter.getProperty(oNode, "nodeType") == 1) - return new cXSBoolean(false); } - return null; + return new cXSBoolean(false); // TODO: Determine if node is nilled + } + // + return null; }); -fStaticContext_defineSystemFunction("string", [[cXTItem, '?', true]], function(oItem) { +// fn:string() as xs:string +// fn:string($arg as item()?) as xs:string +fStaticContext_defineSystemFunction("string", [[cXTItem, '?', true]], function(/*[*/oItem/*]*/) { if (!arguments.length) { if (!this.item) throw new cException("XPDY0002"); @@ -4923,39 +6543,56 @@ fStaticContext_defineSystemFunction("string", [[cXTItem, '?', true]], function(o return oItem == null ? new cXSString('') : cXSString.cast(fFunction_sequence_atomize([oItem], this)[0]); }); +// fn:data($arg as item()*) as xs:anyAtomicType* fStaticContext_defineSystemFunction("data", [[cXTItem, '*']], function(oSequence1) { return fFunction_sequence_atomize(oSequence1, this); }); +// fn:base-uri() as xs:anyURI? +// fn:base-uri($arg as node()?) as xs:anyURI? fStaticContext_defineSystemFunction("base-uri", [[cXTNode, '?', true]], function(oNode) { if (!arguments.length) { if (!this.DOMAdapter.isNode(this.item)) throw new cException("XPTY0004" - , "base-uri() function called when the context item is not a node" + ); oNode = this.item; } - return cXSAnyURI.cast(new cXSString(this.DOMAdapter.getProperty(oNode, "baseURI") || '')); + // + return cXSAnyURI.cast(new cXSString(this.DOMAdapter.getProperty(oNode, "baseURI") || '')); }); +// fn:document-uri($arg as node()?) as xs:anyURI? fStaticContext_defineSystemFunction("document-uri", [[cXTNode, '?']], function(oNode) { if (oNode != null) { var fGetProperty = this.DOMAdapter.getProperty; if (fGetProperty(oNode, "nodeType") == 9) return cXSAnyURI.cast(new cXSString(fGetProperty(oNode, "documentURI") || '')); } - return null; + // + return null; }); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 8 Functions on anyURI + resolve-uri +*/ - - +// fn:resolve-uri($relative as xs:string?) as xs:anyURI? +// fn:resolve-uri($relative as xs:string?, $base as xs:string) as xs:anyURI? fStaticContext_defineSystemFunction("resolve-uri", [[cXSString, '?'], [cXSString, '', true]], function(sUri, sBaseUri) { - var sBaseUri; if (arguments.length < 2) { if (!this.DOMAdapter.isNode(this.item)) throw new cException("XPTY0004" - , "resolve-uri() function called when the context item is not a node" + ); sBaseUri = new cXSString(this.DOMAdapter.getProperty(this.item, "baseURI") || ''); } @@ -4963,7 +6600,8 @@ fStaticContext_defineSystemFunction("resolve-uri", [[cXSString, '?'], [cXSString if (sUri == null) return null; - if (sUri.valueOf() == '' || sUri.valueOf().charAt(0) == '#') + // + if (sUri.valueOf() == '' || sUri.valueOf().charAt(0) == '#') return cXSAnyURI.cast(sBaseUri); var oUri = cXSAnyURI.cast(sUri); @@ -4974,9 +6612,11 @@ fStaticContext_defineSystemFunction("resolve-uri", [[cXSString, '?'], [cXSString oUri.scheme = oBaseUri.scheme; if (!oUri.authority) { - oUri.authority = oBaseUri.authority; + // authority + oUri.authority = oBaseUri.authority; - if (oUri.path.charAt(0) != '/') { + // path + if (oUri.path.charAt(0) != '/') { var aUriSegments = oUri.path.split('/'), aBaseUriSegments = oBaseUri.path.split('/'); aBaseUriSegments.pop(); @@ -4997,162 +6637,277 @@ fStaticContext_defineSystemFunction("resolve-uri", [[cXSString, '?'], [cXSString } if (aUriSegments[--nIndex] == '..' || aUriSegments[nIndex] == '.') aBaseUriSegments.push(''); - oUri.path = aBaseUriSegments.join('/'); + // + oUri.path = aBaseUriSegments.join('/'); } } return oUri; }); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 9.1 Additional Boolean Constructor Functions + true + false + 9.3 Functions on Boolean Values + not +*/ - +// 9.1 Additional Boolean Constructor Functions +// fn:true() as xs:boolean fStaticContext_defineSystemFunction("true", [], function() { return new cXSBoolean(true); }); +// fn:false() as xs:boolean fStaticContext_defineSystemFunction("false", [], function() { return new cXSBoolean(false); }); +// 9.3 Functions on Boolean Values +// fn:not($arg as item()*) as xs:boolean fStaticContext_defineSystemFunction("not", [[cXTItem, '*']], function(oSequence1) { return new cXSBoolean(!fFunction_sequence_toEBV(oSequence1, this)); }); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 16 Context Functions + position + last + current-dateTime + current-date + current-time + implicit-timezone + default-collation + static-base-uri - +*/ +// fn:position() as xs:integer fStaticContext_defineSystemFunction("position", [], function() { return new cXSInteger(this.position); }); +// fn:last() as xs:integer fStaticContext_defineSystemFunction("last", [], function() { return new cXSInteger(this.size); }); +// fn:current-dateTime() as xs:dateTime (2004-05-12T18:17:15.125Z) fStaticContext_defineSystemFunction("current-dateTime", [], function() { return this.dateTime; }); +// fn:current-date() as xs:date (2004-05-12+01:00) fStaticContext_defineSystemFunction("current-date", [], function() { return cXSDate.cast(this.dateTime); }); +// fn:current-time() as xs:time (23:17:00.000-05:00) fStaticContext_defineSystemFunction("current-time", [], function() { return cXSTime.cast(this.dateTime); }); +// fn:implicit-timezone() as xs:dayTimeDuration fStaticContext_defineSystemFunction("implicit-timezone", [], function() { return this.timezone; }); +// fn:default-collation() as xs:string fStaticContext_defineSystemFunction("default-collation", [], function() { return new cXSString(this.staticContext.defaultCollationName); }); +// fn:static-base-uri() as xs:anyURI? fStaticContext_defineSystemFunction("static-base-uri", [], function() { return cXSAnyURI.cast(new cXSString(this.staticContext.baseURI || '')); }); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 10.5 Component Extraction Functions on Durations, Dates and Times + years-from-duration + months-from-duration + days-from-duration + hours-from-duration + minutes-from-duration + seconds-from-duration + year-from-dateTime + month-from-dateTime + day-from-dateTime + hours-from-dateTime + minutes-from-dateTime + seconds-from-dateTime + timezone-from-dateTime + year-from-date + month-from-date + day-from-date + timezone-from-date + hours-from-time + minutes-from-time + seconds-from-time + timezone-from-time + 10.7 Timezone Adjustment Functions on Dates and Time Values + adjust-dateTime-to-timezone + adjust-date-to-timezone + adjust-time-to-timezone +*/ - +// 10.5 Component Extraction Functions on Durations, Dates and Times +// functions on duration +// fn:years-from-duration($arg as xs:duration?) as xs:integer? fStaticContext_defineSystemFunction("years-from-duration", [[cXSDuration, '?']], function(oDuration) { return fFunction_duration_getComponent(oDuration, "year"); }); +// fn:months-from-duration($arg as xs:duration?) as xs:integer? fStaticContext_defineSystemFunction("months-from-duration", [[cXSDuration, '?']], function(oDuration) { return fFunction_duration_getComponent(oDuration, "month"); }); +// fn:days-from-duration($arg as xs:duration?) as xs:integer? fStaticContext_defineSystemFunction("days-from-duration", [[cXSDuration, '?']], function(oDuration) { return fFunction_duration_getComponent(oDuration, "day"); }); +// fn:hours-from-duration($arg as xs:duration?) as xs:integer? fStaticContext_defineSystemFunction("hours-from-duration", [[cXSDuration, '?']], function(oDuration) { return fFunction_duration_getComponent(oDuration, "hours"); }); +// fn:minutes-from-duration($arg as xs:duration?) as xs:integer? fStaticContext_defineSystemFunction("minutes-from-duration", [[cXSDuration, '?']], function(oDuration) { return fFunction_duration_getComponent(oDuration, "minutes"); }); +// fn:seconds-from-duration($arg as xs:duration?) as xs:decimal? fStaticContext_defineSystemFunction("seconds-from-duration", [[cXSDuration, '?']], function(oDuration) { return fFunction_duration_getComponent(oDuration, "seconds"); }); +// functions on dateTime +// fn:year-from-dateTime($arg as xs:dateTime?) as xs:integer? fStaticContext_defineSystemFunction("year-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { return fFunction_dateTime_getComponent(oDateTime, "year"); }); +// fn:month-from-dateTime($arg as xs:dateTime?) as xs:integer? fStaticContext_defineSystemFunction("month-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { return fFunction_dateTime_getComponent(oDateTime, "month"); }); +// fn:day-from-dateTime($arg as xs:dateTime?) as xs:integer? fStaticContext_defineSystemFunction("day-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { return fFunction_dateTime_getComponent(oDateTime, "day"); }); +// fn:hours-from-dateTime($arg as xs:dateTime?) as xs:integer? fStaticContext_defineSystemFunction("hours-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { return fFunction_dateTime_getComponent(oDateTime, "hours"); }); +// fn:minutes-from-dateTime($arg as xs:dateTime?) as xs:integer? fStaticContext_defineSystemFunction("minutes-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { return fFunction_dateTime_getComponent(oDateTime, "minutes"); }); +// fn:seconds-from-dateTime($arg as xs:dateTime?) as xs:decimal? fStaticContext_defineSystemFunction("seconds-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { return fFunction_dateTime_getComponent(oDateTime, "seconds"); }); +// fn:timezone-from-dateTime($arg as xs:dateTime?) as xs:dayTimeDuration? fStaticContext_defineSystemFunction("timezone-from-dateTime", [[cXSDateTime, '?']], function(oDateTime) { return fFunction_dateTime_getComponent(oDateTime, "timezone"); }); +// functions on date +// fn:year-from-date($arg as xs:date?) as xs:integer? fStaticContext_defineSystemFunction("year-from-date", [[cXSDate, '?']], function(oDate) { return fFunction_dateTime_getComponent(oDate, "year"); }); +// fn:month-from-date($arg as xs:date?) as xs:integer? fStaticContext_defineSystemFunction("month-from-date", [[cXSDate, '?']], function(oDate) { return fFunction_dateTime_getComponent(oDate, "month"); }); +// fn:day-from-date($arg as xs:date?) as xs:integer? fStaticContext_defineSystemFunction("day-from-date", [[cXSDate, '?']], function(oDate) { return fFunction_dateTime_getComponent(oDate, "day"); }); +// fn:timezone-from-date($arg as xs:date?) as xs:dayTimeDuration? fStaticContext_defineSystemFunction("timezone-from-date", [[cXSDate, '?']], function(oDate) { return fFunction_dateTime_getComponent(oDate, "timezone"); }); +// functions on time +// fn:hours-from-time($arg as xs:time?) as xs:integer? fStaticContext_defineSystemFunction("hours-from-time", [[cXSTime, '?']], function(oTime) { return fFunction_dateTime_getComponent(oTime, "hours"); }); +// fn:minutes-from-time($arg as xs:time?) as xs:integer? fStaticContext_defineSystemFunction("minutes-from-time", [[cXSTime, '?']], function(oTime) { return fFunction_dateTime_getComponent(oTime, "minutes"); }); +// fn:seconds-from-time($arg as xs:time?) as xs:decimal? fStaticContext_defineSystemFunction("seconds-from-time", [[cXSTime, '?']], function(oTime) { return fFunction_dateTime_getComponent(oTime, "seconds"); }); +// fn:timezone-from-time($arg as xs:time?) as xs:dayTimeDuration? fStaticContext_defineSystemFunction("timezone-from-time", [[cXSTime, '?']], function(oTime) { return fFunction_dateTime_getComponent(oTime, "timezone"); }); +// 10.7 Timezone Adjustment Functions on Dates and Time Values +// fn:adjust-dateTime-to-timezone($arg as xs:dateTime?) as xs:dateTime? +// fn:adjust-dateTime-to-timezone($arg as xs:dateTime?, $timezone as xs:dayTimeDuration?) as xs:dateTime? fStaticContext_defineSystemFunction("adjust-dateTime-to-timezone", [[cXSDateTime, '?'], [cXSDayTimeDuration, '?', true]], function(oDateTime, oDayTimeDuration) { return fFunction_dateTime_adjustTimezone(oDateTime, arguments.length > 1 && oDayTimeDuration != null ? arguments.length > 1 ? oDayTimeDuration : this.timezone : null); }); +// fn:adjust-date-to-timezone($arg as xs:date?) as xs:date? +// fn:adjust-date-to-timezone($arg as xs:date?, $timezone as xs:dayTimeDuration?) as xs:date? fStaticContext_defineSystemFunction("adjust-date-to-timezone", [[cXSDate, '?'], [cXSDayTimeDuration, '?', true]], function(oDate, oDayTimeDuration) { return fFunction_dateTime_adjustTimezone(oDate, arguments.length > 1 && oDayTimeDuration != null ? arguments.length > 1 ? oDayTimeDuration : this.timezone : null); }); +// fn:adjust-time-to-timezone($arg as xs:time?) as xs:time? +// fn:adjust-time-to-timezone($arg as xs:time?, $timezone as xs:dayTimeDuration?) as xs:time? fStaticContext_defineSystemFunction("adjust-time-to-timezone", [[cXSTime, '?'], [cXSDayTimeDuration, '?', true]], function(oTime, oDayTimeDuration) { return fFunction_dateTime_adjustTimezone(oTime, arguments.length > 1 && oDayTimeDuration != null ? arguments.length > 1 ? oDayTimeDuration : this.timezone : null); }); +// function fFunction_duration_getComponent(oDuration, sName) { if (oDuration == null) return null; @@ -5161,6 +6916,7 @@ function fFunction_duration_getComponent(oDuration, sName) { return sName == "seconds" ? new cXSDecimal(nValue) : new cXSInteger(nValue); }; +// function fFunction_dateTime_getComponent(oDateTime, sName) { if (oDateTime == null) return null; @@ -5184,11 +6940,13 @@ function fFunction_dateTime_getComponent(oDateTime, sName) { } }; +// function fFunction_dateTime_adjustTimezone(oDateTime, oTimezone) { if (oDateTime == null) return null; - var oValue; + // Create a copy + var oValue; if (oDateTime instanceof cXSDate) oValue = new cXSDate(oDateTime.year, oDateTime.month, oDateTime.day, oDateTime.timezone, oDateTime.negative); else @@ -5197,7 +6955,8 @@ function fFunction_dateTime_adjustTimezone(oDateTime, oTimezone) { else oValue = new cXSDateTime(oDateTime.year, oDateTime.month, oDateTime.day, oDateTime.hours, oDateTime.minutes, oDateTime.seconds, oDateTime.timezone, oDateTime.negative); - if (oTimezone == null) + // + if (oTimezone == null) oValue.timezone = null; else { var nTimezone = fOperator_dayTimeDuration_toSeconds(oTimezone) / 60; @@ -5211,67 +6970,97 @@ function fFunction_dateTime_adjustTimezone(oDateTime, oTimezone) { oValue.minutes += nDiff % 60; oValue.hours += ~~(nDiff / 60); } - fXSDateTime_normalize(oValue); + // + fXSDateTime_normalize(oValue); } oValue.timezone = nTimezone; } return oValue; }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 14 Functions and Operators on Nodes + name + local-name + namespace-uri + number + lang + root +*/ - +// 14 Functions on Nodes +// fn:name() as xs:string +// fn:name($arg as node()?) as xs:string fStaticContext_defineSystemFunction("name", [[cXTNode, '?', true]], function(oNode) { if (!arguments.length) { if (!this.DOMAdapter.isNode(this.item)) throw new cException("XPTY0004" - , "name() function called when the context item is not a node" + ); oNode = this.item; } else if (oNode == null) return new cXSString(''); - var vValue = hStaticContext_functions["node-name"].call(this, oNode); + // + var vValue = hStaticContext_functions["node-name"].call(this, oNode); return new cXSString(vValue == null ? '' : vValue.toString()); }); +// fn:local-name() as xs:string +// fn:local-name($arg as node()?) as xs:string fStaticContext_defineSystemFunction("local-name", [[cXTNode, '?', true]], function(oNode) { if (!arguments.length) { if (!this.DOMAdapter.isNode(this.item)) throw new cException("XPTY0004" - , "local-name() function called when the context item is not a node" + ); oNode = this.item; } else if (oNode == null) return new cXSString(''); - return new cXSString(this.DOMAdapter.getProperty(oNode, "localName") || ''); + // + return new cXSString(this.DOMAdapter.getProperty(oNode, "localName") || ''); }); +// fn:namespace-uri() as xs:anyURI +// fn:namespace-uri($arg as node()?) as xs:anyURI fStaticContext_defineSystemFunction("namespace-uri", [[cXTNode, '?', true]], function(oNode) { if (!arguments.length) { if (!this.DOMAdapter.isNode(this.item)) throw new cException("XPTY0004" - , "namespace-uri() function called when the context item is not a node" + ); oNode = this.item; } else if (oNode == null) return cXSAnyURI.cast(new cXSString('')); - return cXSAnyURI.cast(new cXSString(this.DOMAdapter.getProperty(oNode, "namespaceURI") || '')); + // + return cXSAnyURI.cast(new cXSString(this.DOMAdapter.getProperty(oNode, "namespaceURI") || '')); }); -fStaticContext_defineSystemFunction("number", [[cXSAnyAtomicType, '?', true]], function(oItem) { +// fn:number() as xs:double +// fn:number($arg as xs:anyAtomicType?) as xs:double +fStaticContext_defineSystemFunction("number", [[cXSAnyAtomicType, '?', true]], function(/*[*/oItem/*]*/) { if (!arguments.length) { if (!this.item) throw new cException("XPDY0002"); oItem = fFunction_sequence_atomize([this.item], this)[0]; } - var vValue = new cXSDouble(nNaN); + // If input item cannot be cast to xs:decimal, a NaN should be returned + var vValue = new cXSDouble(nNaN); if (oItem != null) { try { vValue = cXSDouble.cast(oItem); @@ -5283,11 +7072,13 @@ fStaticContext_defineSystemFunction("number", [[cXSAnyAtomicType, '?', true]], f return vValue; }); +// fn:lang($testlang as xs:string?) as xs:boolean +// fn:lang($testlang as xs:string?, $node as node()) as xs:boolean fStaticContext_defineSystemFunction("lang", [[cXSString, '?'], [cXTNode, '', true]], function(sLang, oNode) { if (arguments.length < 2) { if (!this.DOMAdapter.isNode(this.item)) throw new cException("XPTY0004" - , "lang() function called when the context item is not a node" + ); oNode = this.item; } @@ -5296,19 +7087,23 @@ fStaticContext_defineSystemFunction("lang", [[cXSString, '?'], [cXTNode, '', tru if (fGetProperty(oNode, "nodeType") == 2) oNode = fGetProperty(oNode, "ownerElement"); - for (var aAttributes; oNode; oNode = fGetProperty(oNode, "parentNode")) + // walk up the tree looking for xml:lang attribute + for (var aAttributes; oNode; oNode = fGetProperty(oNode, "parentNode")) if (aAttributes = fGetProperty(oNode, "attributes")) for (var nIndex = 0, nLength = aAttributes.length; nIndex < nLength; nIndex++) if (fGetProperty(aAttributes[nIndex], "nodeName") == "xml:lang") return new cXSBoolean(fGetProperty(aAttributes[nIndex], "value").replace(/-.+/, '').toLowerCase() == sLang.valueOf().replace(/-.+/, '').toLowerCase()); - return new cXSBoolean(false); + // + return new cXSBoolean(false); }); +// fn:root() as node() +// fn:root($arg as node()?) as node()? fStaticContext_defineSystemFunction("root", [[cXTNode, '?', true]], function(oNode) { if (!arguments.length) { if (!this.DOMAdapter.isNode(this.item)) throw new cException("XPTY0004" - , "root() function called when the context item is not a node" + ); oNode = this.item; } @@ -5318,7 +7113,8 @@ fStaticContext_defineSystemFunction("root", [[cXTNode, '?', true]], function(oNo var fGetProperty = this.DOMAdapter.getProperty; - if (fGetProperty(oNode, "nodeType") == 2) + // If context node is Attribute + if (fGetProperty(oNode, "nodeType") == 2) oNode = fGetProperty(oNode, "ownerElement"); for (var oParent = oNode; oParent; oParent = fGetProperty(oNode, "parentNode")) @@ -5327,29 +7123,52 @@ fStaticContext_defineSystemFunction("root", [[cXTNode, '?', true]], function(oNo return oNode; }); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 6.4 Functions on Numeric Values + abs + ceiling + floor + round + round-half-to-even +*/ - +// 6.4 Functions on Numeric Values +// fn:abs($arg as numeric?) as numeric? fStaticContext_defineSystemFunction("abs", [[cXSDouble, '?']], function(oValue) { return new cXSDecimal(cMath.abs(oValue)); }); +// fn:ceiling($arg as numeric?) as numeric? fStaticContext_defineSystemFunction("ceiling", [[cXSDouble, '?']], function(oValue) { return new cXSDecimal(cMath.ceil(oValue)); }); +// fn:floor($arg as numeric?) as numeric? fStaticContext_defineSystemFunction("floor", [[cXSDouble, '?']], function(oValue) { return new cXSDecimal(cMath.floor(oValue)); }); +// fn:round($arg as numeric?) as numeric? fStaticContext_defineSystemFunction("round", [[cXSDouble, '?']], function(oValue) { return new cXSDecimal(cMath.round(oValue)); }); +// fn:round-half-to-even($arg as numeric?) as numeric? +// fn:round-half-to-even($arg as numeric?, $precision as xs:integer) as numeric? fStaticContext_defineSystemFunction("round-half-to-even", [[cXSDouble, '?'], [cXSInteger, '', true]], function(oValue, oPrecision) { var nPrecision = arguments.length > 1 ? oPrecision.valueOf() : 0; - if (nPrecision < 0) { + // + if (nPrecision < 0) { var oPower = new cXSInteger(cMath.pow(10,-nPrecision)), nRounded= cMath.round(hStaticContext_operators["numeric-divide"].call(this, oValue, oPower)), oRounded= new cXSInteger(nRounded); @@ -5364,10 +7183,31 @@ fStaticContext_defineSystemFunction("round-half-to-even", [[cXSDouble, '?'], [cX return hStaticContext_operators["numeric-divide"].call(this, hStaticContext_operators["numeric-add"].call(this, oRounded, new cXSDecimal(nDecimal == 0.5 && nRounded % 2 ?-1 : 0)), oPower); } }); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 11.1 Additional Constructor Functions for QNames + resolve-QName + QName + 11.2 Functions and Operators Related to QNames + prefix-from-QName + local-name-from-QName + namespace-uri-from-QName + namespace-uri-for-prefix + in-scope-prefixes +*/ +// 11.1 Additional Constructor Functions for QNames +// fn:resolve-QName($qname as xs:string?, $element as element()) as xs:QName? fStaticContext_defineSystemFunction("resolve-QName", [[cXSString, '?'], [cXTElement]], function(oQName, oElement) { if (oQName == null) return null; @@ -5376,40 +7216,46 @@ fStaticContext_defineSystemFunction("resolve-QName", [[cXSString, '?'], [cXTElem aMatch = sQName.match(rXSQName); if (!aMatch) throw new cException("FOCA0002" - , "Invalid QName '" + sQName + "'" + ); var sPrefix = aMatch[1] || null, sLocalName = aMatch[2], sNameSpaceURI = this.DOMAdapter.lookupNamespaceURI(oElement, sPrefix); - if (sPrefix != null &&!sNameSpaceURI) + // + if (sPrefix != null &&!sNameSpaceURI) throw new cException("FONS0004" - , "Namespace prefix '" + sPrefix + "' has not been declared" + ); return new cXSQName(sPrefix, sLocalName, sNameSpaceURI || null); }); +// fn:QName($paramURI as xs:string?, $paramQName as xs:string) as xs:QName fStaticContext_defineSystemFunction("QName", [[cXSString, '?'], [cXSString]], function(oUri, oQName) { var sQName = oQName.valueOf(), aMatch = sQName.match(rXSQName); if (!aMatch) throw new cException("FOCA0002" - , "Invalid QName '" + sQName + "'" + ); return new cXSQName(aMatch[1] || null, aMatch[2] || null, oUri == null ? '' : oUri.valueOf()); }); +// 11.2 Functions Related to QNames +// fn:prefix-from-QName($arg as xs:QName?) as xs:NCName? fStaticContext_defineSystemFunction("prefix-from-QName", [[cXSQName, '?']], function(oQName) { if (oQName != null) { if (oQName.prefix) return new cXSNCName(oQName.prefix); } - return null; + // + return null; }); +// fn:local-name-from-QName($arg as xs:QName?) as xs:NCName? fStaticContext_defineSystemFunction("local-name-from-QName", [[cXSQName, '?']], function(oQName) { if (oQName == null) return null; @@ -5417,6 +7263,7 @@ fStaticContext_defineSystemFunction("local-name-from-QName", [[cXSQName, '?']], return new cXSNCName(oQName.localName); }); +// fn:namespace-uri-from-QName($arg as xs:QName?) as xs:anyURI? fStaticContext_defineSystemFunction("namespace-uri-from-QName", [[cXSQName, '?']], function(oQName) { if (oQName == null) return null; @@ -5424,6 +7271,7 @@ fStaticContext_defineSystemFunction("namespace-uri-from-QName", [[cXSQName, '?'] return cXSAnyURI.cast(new cXSString(oQName.namespaceURI || '')); }); +// fn:namespace-uri-for-prefix($prefix as xs:string?, $element as element()) as xs:anyURI? fStaticContext_defineSystemFunction("namespace-uri-for-prefix", [[cXSString, '?'], [cXTElement]], function(oPrefix, oElement) { var sPrefix = oPrefix == null ? '' : oPrefix.valueOf(), sNameSpaceURI = this.DOMAdapter.lookupNamespaceURI(oElement, sPrefix || null); @@ -5431,60 +7279,123 @@ fStaticContext_defineSystemFunction("namespace-uri-for-prefix", [[cXSString, '?' return sNameSpaceURI == null ? null : cXSAnyURI.cast(new cXSString(sNameSpaceURI)); }); +// fn:in-scope-prefixes($element as element()) as xs:string* fStaticContext_defineSystemFunction("in-scope-prefixes", [[cXTElement]], function(oElement) { throw "Function '" + "in-scope-prefixes" + "' not implemented"; }); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 15.1 General Functions and Operators on Sequences + boolean + index-of + empty + exists + distinct-values + insert-before + remove + reverse + subsequence + unordered + 15.2 Functions That Test the Cardinality of Sequences + zero-or-one + one-or-more + exactly-one + 15.3 Equals, Union, Intersection and Except + deep-equal + + 15.4 Aggregate Functions + count + avg + max + min + sum + + 15.5 Functions and Operators that Generate Sequences + id + idref + doc + doc-available + collection + element-with-id + +*/ + +// 15.1 General Functions and Operators on Sequences +// fn:boolean($arg as item()*) as xs:boolean fStaticContext_defineSystemFunction("boolean", [[cXTItem, '*']], function(oSequence1) { return new cXSBoolean(fFunction_sequence_toEBV(oSequence1, this)); }); +// fn:index-of($seqParam as xs:anyAtomicType*, $srchParam as xs:anyAtomicType) as xs:integer* +// fn:index-of($seqParam as xs:anyAtomicType*, $srchParam as xs:anyAtomicType, $collation as xs:string) as xs:integer* fStaticContext_defineSystemFunction("index-of", [[cXSAnyAtomicType, '*'], [cXSAnyAtomicType], [cXSString, '', true]], function(oSequence1, oSearch, oCollation) { if (!oSequence1.length || oSearch == null) return []; - + // TODO: Implement collation + var vLeft = oSearch; - if (vLeft instanceof cXSUntypedAtomic) + // Cast to XSString if Untyped + if (vLeft instanceof cXSUntypedAtomic) vLeft = cXSString.cast(vLeft); var oSequence = []; for (var nIndex = 0, nLength = oSequence1.length, vRight; nIndex < nLength; nIndex++) { vRight = oSequence1[nIndex]; - if (vRight instanceof cXSUntypedAtomic) + // Cast to XSString if Untyped + if (vRight instanceof cXSUntypedAtomic) vRight = cXSString.cast(vRight); - if (vRight.valueOf() === vLeft.valueOf()) + // + if (vRight.valueOf() === vLeft.valueOf()) oSequence.push(new cXSInteger(nIndex + 1)); } return oSequence; }); +// fn:empty($arg as item()*) as xs:boolean fStaticContext_defineSystemFunction("empty", [[cXTItem, '*']], function(oSequence1) { return new cXSBoolean(!oSequence1.length); }); +// fn:exists($arg as item()*) as xs:boolean fStaticContext_defineSystemFunction("exists", [[cXTItem, '*']], function(oSequence1) { return new cXSBoolean(!!oSequence1.length); }); +// fn:distinct-values($arg as xs:anyAtomicType*) as xs:anyAtomicType* +// fn:distinct-values($arg as xs:anyAtomicType*, $collation as xs:string) as xs:anyAtomicType* fStaticContext_defineSystemFunction("distinct-values", [[cXSAnyAtomicType, '*'], [cXSString, '', true]], function(oSequence1, oCollation) { + if (arguments.length > 1) + throw "Collation parameter in function '" + "distinct-values" + "' is not implemented"; + if (!oSequence1.length) return null; var oSequence = []; for (var nIndex = 0, nLength = oSequence1.length, vLeft; nIndex < nLength; nIndex++) { vLeft = oSequence1[nIndex]; - if (vLeft instanceof cXSUntypedAtomic) + // Cast to XSString if Untyped + if (vLeft instanceof cXSUntypedAtomic) vLeft = cXSString.cast(vLeft); for (var nRightIndex = 0, nRightLength = oSequence.length, vRight, bFound = false; (nRightIndex < nRightLength) &&!bFound; nRightIndex++) { vRight = oSequence[nRightIndex]; - if (vRight instanceof cXSUntypedAtomic) + // Cast to XSString if Untyped + if (vRight instanceof cXSUntypedAtomic) vRight = cXSString.cast(vRight); - if (vRight.valueOf() === vLeft.valueOf()) + // + if (vRight.valueOf() === vLeft.valueOf()) bFound = true; } if (!bFound) @@ -5494,6 +7405,7 @@ fStaticContext_defineSystemFunction("distinct-values", [[cXSAnyAtomicType, '*'], return oSequence; }); +// fn:insert-before($target as item()*, $position as xs:integer, $inserts as item()*) as item()* fStaticContext_defineSystemFunction("insert-before", [[cXTItem, '*'], [cXSInteger], [cXTItem, '*']], function(oSequence1, oPosition, oSequence3) { if (!oSequence1.length) return oSequence3; @@ -5520,6 +7432,7 @@ fStaticContext_defineSystemFunction("insert-before", [[cXTItem, '*'], [cXSIntege return oSequence; }); +// fn:remove($target as item()*, $position as xs:integer) as item()* fStaticContext_defineSystemFunction("remove", [[cXTItem, '*'], [cXSInteger]], function(oSequence1, oPosition) { if (!oSequence1.length) return []; @@ -5538,24 +7451,31 @@ fStaticContext_defineSystemFunction("remove", [[cXTItem, '*'], [cXSInteger]], fu return oSequence; }); +// fn:reverse($arg as item()*) as item()* fStaticContext_defineSystemFunction("reverse", [[cXTItem, '*']], function(oSequence1) { oSequence1.reverse(); return oSequence1; }); +// fn:subsequence($sourceSeq as item()*, $startingLoc as xs:double) as item()* +// fn:subsequence($sourceSeq as item()*, $startingLoc as xs:double, $length as xs:double) as item()* fStaticContext_defineSystemFunction("subsequence", [[cXTItem, '*'], [cXSDouble, ''], [cXSDouble, '', true]], function(oSequence1, oStart, oLength) { var nPosition = cMath.round(oStart), nLength = arguments.length > 2 ? cMath.round(oLength) : oSequence1.length - nPosition + 1; - return oSequence1.slice(nPosition - 1, nPosition - 1 + nLength); + // TODO: Handle out-of-range position and length values + return oSequence1.slice(nPosition - 1, nPosition - 1 + nLength); }); +// fn:unordered($sourceSeq as item()*) as item()* fStaticContext_defineSystemFunction("unordered", [[cXTItem, '*']], function(oSequence1) { return oSequence1; }); +// 15.2 Functions That Test the Cardinality of Sequences +// fn:zero-or-one($arg as item()*) as item()? fStaticContext_defineSystemFunction("zero-or-one", [[cXTItem, '*']], function(oSequence1) { if (oSequence1.length > 1) throw new cException("FORG0003"); @@ -5563,6 +7483,7 @@ fStaticContext_defineSystemFunction("zero-or-one", [[cXTItem, '*']], function(oS return oSequence1; }); +// fn:one-or-more($arg as item()*) as item()+ fStaticContext_defineSystemFunction("one-or-more", [[cXTItem, '*']], function(oSequence1) { if (!oSequence1.length) throw new cException("FORG0004"); @@ -5570,6 +7491,7 @@ fStaticContext_defineSystemFunction("one-or-more", [[cXTItem, '*']], function(oS return oSequence1; }); +// fn:exactly-one($arg as item()*) as item() fStaticContext_defineSystemFunction("exactly-one", [[cXTItem, '*']], function(oSequence1) { if (oSequence1.length != 1) throw new cException("FORG0005"); @@ -5578,20 +7500,27 @@ fStaticContext_defineSystemFunction("exactly-one", [[cXTItem, '*']], function(oS }); +// 15.3 Equals, Union, Intersection and Except +// fn:deep-equal($parameter1 as item()*, $parameter2 as item()*) as xs:boolean +// fn:deep-equal($parameter1 as item()*, $parameter2 as item()*, $collation as string) as xs:boolean fStaticContext_defineSystemFunction("deep-equal", [[cXTItem, '*'], [cXTItem, '*'], [cXSString, '', true]], function(oSequence1, oSequence2, oCollation) { throw "Function '" + "deep-equal" + "' not implemented"; }); +// 15.4 Aggregate Functions +// fn:count($arg as item()*) as xs:integer fStaticContext_defineSystemFunction("count", [[cXTItem, '*']], function(oSequence1) { return new cXSInteger(oSequence1.length); }); +// fn:avg($arg as xs:anyAtomicType*) as xs:anyAtomicType? fStaticContext_defineSystemFunction("avg", [[cXSAnyAtomicType, '*']], function(oSequence1) { if (!oSequence1.length) return null; - try { + // + try { var vValue = oSequence1[0]; if (vValue instanceof cXSUntypedAtomic) vValue = cXSDouble.cast(vValue); @@ -5604,50 +7533,75 @@ fStaticContext_defineSystemFunction("avg", [[cXSAnyAtomicType, '*']], function(o return hMultiplicativeExpr_operators['div'](vValue, new cXSInteger(nLength), this); } catch (e) { - throw e.code != "XPTY0004" ? e : new cException("FORG0006" - , "Input to avg() contains a mix of types" + // XPTY0004: Arithmetic operator is not defined for provided arguments + throw e.code != "XPTY0004" ? e : new cException("FORG0006" + ); } }); +// fn:max($arg as xs:anyAtomicType*) as xs:anyAtomicType? +// fn:max($arg as xs:anyAtomicType*, $collation as string) as xs:anyAtomicType? fStaticContext_defineSystemFunction("max", [[cXSAnyAtomicType, '*'], [cXSString, '', true]], function(oSequence1, oCollation) { if (!oSequence1.length) return null; - - try { + // TODO: Implement collation + + // + try { var vValue = oSequence1[0]; - for (var nIndex = 1, nLength = oSequence1.length; nIndex < nLength; nIndex++) - if (hComparisonExpr_ValueComp_operators['ge'](oSequence1[nIndex], vValue, this).valueOf()) - vValue = oSequence1[nIndex]; + if (vValue instanceof cXSUntypedAtomic) + vValue = cXSDouble.cast(vValue); + for (var nIndex = 1, nLength = oSequence1.length, vRight; nIndex < nLength; nIndex++) { + vRight = oSequence1[nIndex]; + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSDouble.cast(vRight); + if (hComparisonExpr_ValueComp_operators['ge'](vRight, vValue, this).valueOf()) + vValue = vRight; + } return vValue; } catch (e) { - throw e.code != "XPTY0004" ? e : new cException("FORG0006" - , "Input to max() contains a mix of not comparable values" + // XPTY0004: Cannot compare {type1} with {type2} + throw e.code != "XPTY0004" ? e : new cException("FORG0006" + ); } }); +// fn:min($arg as xs:anyAtomicType*) as xs:anyAtomicType? +// fn:min($arg as xs:anyAtomicType*, $collation as string) as xs:anyAtomicType? fStaticContext_defineSystemFunction("min", [[cXSAnyAtomicType, '*'], [cXSString, '', true]], function(oSequence1, oCollation) { if (!oSequence1.length) return null; - - try { + // TODO: Implement collation + + // + try { var vValue = oSequence1[0]; - for (var nIndex = 1, nLength = oSequence1.length; nIndex < nLength; nIndex++) - if (hComparisonExpr_ValueComp_operators['le'](oSequence1[nIndex], vValue, this).valueOf()) - vValue = oSequence1[nIndex]; + if (vValue instanceof cXSUntypedAtomic) + vValue = cXSDouble.cast(vValue); + for (var nIndex = 1, nLength = oSequence1.length, vRight; nIndex < nLength; nIndex++) { + vRight = oSequence1[nIndex]; + if (vRight instanceof cXSUntypedAtomic) + vRight = cXSDouble.cast(vRight); + if (hComparisonExpr_ValueComp_operators['le'](vRight, vValue, this).valueOf()) + vValue = vRight; + } return vValue; } catch (e) { - throw e.code != "XPTY0004" ? e : new cException("FORG0006" - , "Input to min() contains a mix of not comparable values" + // Cannot compare {type1} with {type2} + throw e.code != "XPTY0004" ? e : new cException("FORG0006" + ); } }); +// fn:sum($arg as xs:anyAtomicType*) as xs:anyAtomicType +// fn:sum($arg as xs:anyAtomicType*, $zero as xs:anyAtomicType?) as xs:anyAtomicType? fStaticContext_defineSystemFunction("sum", [[cXSAnyAtomicType, '*'], [cXSAnyAtomicType, '?', true]], function(oSequence1, oZero) { if (!oSequence1.length) { if (arguments.length > 1) @@ -5658,8 +7612,10 @@ fStaticContext_defineSystemFunction("sum", [[cXSAnyAtomicType, '*'], [cXSAnyAtom return null; } - - try { + // TODO: Implement collation + + // + try { var vValue = oSequence1[0]; if (vValue instanceof cXSUntypedAtomic) vValue = cXSDouble.cast(vValue); @@ -5672,54 +7628,70 @@ fStaticContext_defineSystemFunction("sum", [[cXSAnyAtomicType, '*'], [cXSAnyAtom return vValue; } catch (e) { - throw e.code != "XPTY0004" ? e : new cException("FORG0006" - , "Input to sum() contains a mix of types" + // XPTY0004: Arithmetic operator is not defined for provided arguments + throw e.code != "XPTY0004" ? e : new cException("FORG0006" + ); } }); +// 15.5 Functions and Operators that Generate Sequences +// fn:id($arg as xs:string*) as element()* +// fn:id($arg as xs:string*, $node as node()) as element()* fStaticContext_defineSystemFunction("id", [[cXSString, '*'], [cXTNode, '', true]], function(oSequence1, oNode) { if (arguments.length < 2) { if (!this.DOMAdapter.isNode(this.item)) throw new cException("XPTY0004" - , "id() function called when the context item is not a node" + ); oNode = this.item; } - var oDocument = hStaticContext_functions["root"].call(this, oNode); + // Get root node and check if it is Document + var oDocument = hStaticContext_functions["root"].call(this, oNode); if (this.DOMAdapter.getProperty(oDocument, "nodeType") != 9) throw new cException("FODC0001"); - var oSequence = []; + // Search for elements + var oSequence = []; for (var nIndex = 0; nIndex < oSequence1.length; nIndex++) for (var nRightIndex = 0, aValue = fString_trim(oSequence1[nIndex]).split(/\s+/), nRightLength = aValue.length; nRightIndex < nRightLength; nRightIndex++) if ((oNode = this.DOMAdapter.getElementById(oDocument, aValue[nRightIndex])) && fArray_indexOf(oSequence, oNode) ==-1) oSequence.push(oNode); - return fFunction_sequence_order(oSequence, this); + // + return fFunction_sequence_order(oSequence, this); }); +// fn:idref($arg as xs:string*) as node()* +// fn:idref($arg as xs:string*, $node as node()) as node()* fStaticContext_defineSystemFunction("idref", [[cXSString, '*'], [cXTNode, '', true]], function(oSequence1, oNode) { throw "Function '" + "idref" + "' not implemented"; }); +// fn:doc($uri as xs:string?) as document-node()? fStaticContext_defineSystemFunction("doc", [[cXSString, '?', true]], function(oUri) { throw "Function '" + "doc" + "' not implemented"; }); +// fn:doc-available($uri as xs:string?) as xs:boolean fStaticContext_defineSystemFunction("doc-available", [[cXSString, '?', true]], function(oUri) { throw "Function '" + "doc-available" + "' not implemented"; }); +// fn:collection() as node()* +// fn:collection($arg as xs:string?) as node()* fStaticContext_defineSystemFunction("collection", [[cXSString, '?', true]], function(oUri) { throw "Function '" + "collection" + "' not implemented"; }); +// fn:element-with-id($arg as xs:string*) as element()* +// fn:element-with-id($arg as xs:string*, $node as node()) as element()* fStaticContext_defineSystemFunction("element-with-id", [[cXSString, '*'], [cXTNode, '', true]], function(oSequence1, oNode) { throw "Function '" + "element-with-id" + "' not implemented"; }); +// EBV calculation function fFunction_sequence_toEBV(oSequence1, oContext) { if (!oSequence1.length) return false; @@ -5737,12 +7709,12 @@ function fFunction_sequence_toEBV(oSequence1, oContext) { return !(fIsNaN(oItem.valueOf()) || oItem.valueOf() == 0); throw new cException("FORG0006" - , "Effective boolean value is defined only for sequences containing booleans, strings, numbers, URIs, or nodes" + ); } throw new cException("FORG0006" - , "Effective boolean value is not defined for a sequence of two or more items" + ); }; @@ -5751,36 +7723,48 @@ function fFunction_sequence_atomize(oSequence1, oContext) { for (var nIndex = 0, nLength = oSequence1.length, oItem, vItem; nIndex < nLength; nIndex++) { oItem = oSequence1[nIndex]; vItem = null; - if (oItem == null) + // Untyped + if (oItem == null) vItem = null; - else + // Node type + else if (oContext.DOMAdapter.isNode(oItem)) { var fGetProperty = oContext.DOMAdapter.getProperty; switch (fGetProperty(oItem, "nodeType")) { - case 1: vItem = new cXSUntypedAtomic(fGetProperty(oItem, "textContent")); + case 1: // ELEMENT_NODE + vItem = new cXSUntypedAtomic(fGetProperty(oItem, "textContent")); break; - case 2: vItem = new cXSUntypedAtomic(fGetProperty(oItem, "value")); + case 2: // ATTRIBUTE_NODE + vItem = new cXSUntypedAtomic(fGetProperty(oItem, "value")); break; - case 3: case 4: case 8: vItem = new cXSUntypedAtomic(fGetProperty(oItem, "data")); + case 3: // TEXT_NODE + case 4: // CDATA_SECTION_NODE + case 8: // COMMENT_NODE + vItem = new cXSUntypedAtomic(fGetProperty(oItem, "data")); break; - case 7: vItem = new cXSUntypedAtomic(fGetProperty(oItem, "data")); + case 7: // PROCESSING_INSTRUCTION_NODE + vItem = new cXSUntypedAtomic(fGetProperty(oItem, "data")); break; - case 9: var oNode = fGetProperty(oItem, "documentElement"); + case 9: // DOCUMENT_NODE + var oNode = fGetProperty(oItem, "documentElement"); vItem = new cXSUntypedAtomic(oNode ? fGetProperty(oNode, "textContent") : ''); break; } } - else + // Base types + else if (oItem instanceof cXSAnyAtomicType) vItem = oItem; - if (vItem != null) + // + if (vItem != null) oSequence.push(vItem); } return oSequence; }; +// Orders items in sequence in document order function fFunction_sequence_order(oSequence1, oContext) { return oSequence1.sort(function(oNode, oNode2) { var nPosition = oContext.DOMAdapter.compareDocumentPosition(oNode, oNode2); @@ -5788,9 +7772,53 @@ function fFunction_sequence_order(oSequence1, oContext) { }); }; +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 7.2 Functions to Assemble and Disassemble Strings + codepoints-to-string + string-to-codepoints + 7.3 Equality and Comparison of Strings + compare + codepoint-equal + 7.4 Functions on String Values + concat + string-join + substring + string-length + normalize-space + normalize-unicode + upper-case + lower-case + translate + encode-for-uri + iri-to-uri + escape-html-uri + + 7.5 Functions Based on Substring Matching + contains + starts-with + ends-with + substring-before + substring-after + + 7.6 String Functions that Use Pattern Matching + matches + replace + tokenize +*/ + +// 7.2 Functions to Assemble and Disassemble Strings +// fn:codepoints-to-string($arg as xs:integer*) as xs:string fStaticContext_defineSystemFunction("codepoints-to-string", [[cXSInteger, '*']], function(oSequence1) { var aValue = []; for (var nIndex = 0, nLength = oSequence1.length; nIndex < nLength; nIndex++) @@ -5799,6 +7827,7 @@ fStaticContext_defineSystemFunction("codepoints-to-string", [[cXSInteger, '*']], return new cXSString(aValue.join('')); }); +// fn:string-to-codepoints($arg as xs:string?) as xs:integer* fStaticContext_defineSystemFunction("string-to-codepoints", [[cXSString, '?']], function(oValue) { if (oValue == null) return null; @@ -5814,6 +7843,9 @@ fStaticContext_defineSystemFunction("string-to-codepoints", [[cXSString, '?']], return oSequence; }); +// 7.3 Equality and Comparison of Strings +// fn:compare($comparand1 as xs:string?, $comparand2 as xs:string?) as xs:integer? +// fn:compare($comparand1 as xs:string?, $comparand2 as xs:string?, $collation as xs:string) as xs:integer? fStaticContext_defineSystemFunction("compare", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue1, oValue2, oCollation) { if (oValue1 == null || oValue2 == null) return null; @@ -5826,52 +7858,65 @@ fStaticContext_defineSystemFunction("compare", [[cXSString, '?'], [cXSString, '? vCollation = sCollation == sNS_XPF + "/collation/codepoint" ? oCodepointStringCollator : this.staticContext.getCollation(sCollation); if (!vCollation) throw new cException("FOCH0002" - , "Unknown collation " + '{' + sCollation + '}' + ); return new cXSInteger(vCollation.compare(oValue1.valueOf(), oValue2.valueOf())); }); +// fn:codepoint-equal($comparand1 as xs:string?, $comparand2 as xs:string?) as xs:boolean? fStaticContext_defineSystemFunction("codepoint-equal", [[cXSString, '?'], [cXSString, '?']], function(oValue1, oValue2) { if (oValue1 == null || oValue2 == null) return null; - + // TODO: Check if JS uses 'Unicode code point collation' here + return new cXSBoolean(oValue1.valueOf() == oValue2.valueOf()); }); +// 7.4 Functions on String Values +// fn:concat($arg1 as xs:anyAtomicType?, $arg2 as xs:anyAtomicType?, ...) as xs:string fStaticContext_defineSystemFunction("concat", null, function() { - if (arguments.length < 2) + // check arguments length + if (arguments.length < 2) throw new cException("XPST0017" - , "Function concat() must have at least 2 arguments" + ); var aValue = []; for (var nIndex = 0, nLength = arguments.length, oSequence; nIndex < nLength; nIndex++) { oSequence = arguments[nIndex]; - fFunctionCall_assertSequenceCardinality(this, oSequence, '?' - , "each argument of concat()" + // Assert cardinality + fFunctionCall_assertSequenceCardinality(this, oSequence, '?' + ); - if (oSequence.length) + // + if (oSequence.length) aValue[aValue.length] = cXSString.cast(fFunction_sequence_atomize(oSequence, this)[0]).valueOf(); } return new cXSString(aValue.join('')); }); +// fn:string-join($arg1 as xs:string*, $arg2 as xs:string) as xs:string fStaticContext_defineSystemFunction("string-join", [[cXSString, '*'], [cXSString]], function(oSequence1, oValue) { return new cXSString(oSequence1.join(oValue)); }); +// fn:substring($sourceString as xs:string?, $startingLoc as xs:double) as xs:string +// fn:substring($sourceString as xs:string?, $startingLoc as xs:double, $length as xs:double) as xs:string fStaticContext_defineSystemFunction("substring", [[cXSString, '?'], [cXSDouble], [cXSDouble, '', true]], function(oValue, oStart, oLength) { var sValue = oValue == null ? '' : oValue.valueOf(), nStart = cMath.round(oStart) - 1, nEnd = arguments.length > 2 ? nStart + cMath.round(oLength) : sValue.length; - return new cXSString(nEnd > nStart ? sValue.substring(nStart, nEnd) : ''); + // TODO: start can be negative + return new cXSString(nEnd > nStart ? sValue.substring(nStart, nEnd) : ''); }); +// fn:string-length() as xs:integer +// fn:string-length($arg as xs:string?) as xs:integer fStaticContext_defineSystemFunction("string-length", [[cXSString, '?', true]], function(oValue) { if (!arguments.length) { if (!this.item) @@ -5881,6 +7926,8 @@ fStaticContext_defineSystemFunction("string-length", [[cXSString, '?', true]], f return new cXSInteger(oValue == null ? 0 : oValue.valueOf().length); }); +// fn:normalize-space() as xs:string +// fn:normalize-space($arg as xs:string?) as xs:string fStaticContext_defineSystemFunction("normalize-space", [[cXSString, '?', true]], function(oValue) { if (!arguments.length) { if (!this.item) @@ -5890,18 +7937,23 @@ fStaticContext_defineSystemFunction("normalize-space", [[cXSString, '?', true]], return new cXSString(oValue == null ? '' : fString_trim(oValue).replace(/\s\s+/g, ' ')); }); +// fn:normalize-unicode($arg as xs:string?) as xs:string +// fn:normalize-unicode($arg as xs:string?, $normalizationForm as xs:string) as xs:string fStaticContext_defineSystemFunction("normalize-unicode", [[cXSString, '?'], [cXSString, '', true]], function(oValue, oNormalization) { throw "Function '" + "normalize-unicode" + "' not implemented"; }); +// fn:upper-case($arg as xs:string?) as xs:string fStaticContext_defineSystemFunction("upper-case", [[cXSString, '?']], function(oValue) { return new cXSString(oValue == null ? '' : oValue.valueOf().toUpperCase()); }); +// fn:lower-case($arg as xs:string?) as xs:string fStaticContext_defineSystemFunction("lower-case", [[cXSString, '?']], function(oValue) { return new cXSString(oValue == null ? '' : oValue.valueOf().toLowerCase()); }); +// fn:translate($arg as xs:string?, $mapString as xs:string, $transString as xs:string) as xs:string fStaticContext_defineSystemFunction("translate", [[cXSString, '?'], [cXSString], [cXSString]], function(oValue, oMap, oTranslate) { if (oValue == null) return new cXSString(''); @@ -5921,18 +7973,22 @@ fStaticContext_defineSystemFunction("translate", [[cXSString, '?'], [cXSString], return new cXSString(aReturn.join('')); }); +// fn:encode-for-uri($uri-part as xs:string?) as xs:string fStaticContext_defineSystemFunction("encode-for-uri", [[cXSString, '?']], function(oValue) { return new cXSString(oValue == null ? '' : window.encodeURIComponent(oValue)); }); +// fn:iri-to-uri($iri as xs:string?) as xs:string fStaticContext_defineSystemFunction("iri-to-uri", [[cXSString, '?']], function(oValue) { return new cXSString(oValue == null ? '' : window.encodeURI(window.decodeURI(oValue))); }); +// fn:escape-html-uri($uri as xs:string?) as xs:string fStaticContext_defineSystemFunction("escape-html-uri", [[cXSString, '?']], function(oValue) { if (oValue == null || oValue.valueOf() == '') return new cXSString(''); - var aValue = oValue.valueOf().split(''); + // Encode + var aValue = oValue.valueOf().split(''); for (var nIndex = 0, nLength = aValue.length, nCode; nIndex < nLength; nIndex++) if ((nCode = aValue[nIndex].charCodeAt(0)) < 32 || nCode > 126) aValue[nIndex] = window.encodeURIComponent(aValue[nIndex]); @@ -5940,22 +7996,40 @@ fStaticContext_defineSystemFunction("escape-html-uri", [[cXSString, '?']], funct }); +// 7.5 Functions Based on Substring Matching +// fn:contains($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean +// fn:contains($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:boolean fStaticContext_defineSystemFunction("contains", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + if (arguments.length > 2) + throw "Collation parameter in function '" + "contains" + "' is not implemented"; return new cXSBoolean((oValue == null ? '' : oValue.valueOf()).indexOf(oSearch == null ? '' : oSearch.valueOf()) >= 0); }); +// fn:starts-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean +// fn:starts-with($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:boolean fStaticContext_defineSystemFunction("starts-with", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + if (arguments.length > 2) + throw "Collation parameter in function '" + "starts-with" + "' is not implemented"; return new cXSBoolean((oValue == null ? '' : oValue.valueOf()).indexOf(oSearch == null ? '' : oSearch.valueOf()) == 0); }); +// fn:ends-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean +// fn:ends-with($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:boolean fStaticContext_defineSystemFunction("ends-with", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + if (arguments.length > 2) + throw "Collation parameter in function '" + "ends-with" + "' is not implemented"; var sValue = oValue == null ? '' : oValue.valueOf(), sSearch = oSearch == null ? '' : oSearch.valueOf(); return new cXSBoolean(sValue.indexOf(sSearch) == sValue.length - sSearch.length); }); +// fn:substring-before($arg1 as xs:string?, $arg2 as xs:string?) as xs:string +// fn:substring-before($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:string fStaticContext_defineSystemFunction("substring-before", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + if (arguments.length > 2) + throw "Collation parameter in function '" + "substring-before" + "' is not implemented"; + var sValue = oValue == null ? '' : oValue.valueOf(), sSearch = oSearch == null ? '' : oSearch.valueOf(), nPosition; @@ -5963,7 +8037,12 @@ fStaticContext_defineSystemFunction("substring-before", [[cXSString, '?'], [cXSS return new cXSString((nPosition = sValue.indexOf(sSearch)) >= 0 ? sValue.substring(0, nPosition) : ''); }); +// fn:substring-after($arg1 as xs:string?, $arg2 as xs:string?) as xs:string +// fn:substring-after($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:string fStaticContext_defineSystemFunction("substring-after", [[cXSString, '?'], [cXSString, '?'], [cXSString, '', true]], function(oValue, oSearch, oCollation) { + if (arguments.length > 2) + throw "Collation parameter in function '" + "substring-after" + "' is not implemented"; + var sValue = oValue == null ? '' : oValue.valueOf(), sSearch = oSearch == null ? '' : oSearch.valueOf(), nPosition; @@ -5972,6 +8051,7 @@ fStaticContext_defineSystemFunction("substring-after", [[cXSString, '?'], [cXSSt }); +// 7.6 String Functions that Use Pattern Matching function fFunction_string_createRegExp(sValue, sFlags) { var d1 = '\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF', d2 = '\u0370-\u037D\u037F-\u1FFF\u200C-\u200D', @@ -5987,12 +8067,15 @@ function fFunction_string_createRegExp(sValue, sFlags) { .replace(/\\c/g, '[:' + c + ']') .replace(/\\C/g, '[^:' + c + ']'); - if (sFlags && !sFlags.match(/^[smix]+$/)) - throw new cException("FORX0001"); + // Check if all flags are legal + if (sFlags && !sFlags.match(/^[smix]+$/)) + throw new cException("FORX0001"); // Invalid character '{%0}' in regular expression flags + var bFlagS = sFlags.indexOf('s') >= 0, bFlagX = sFlags.indexOf('x') >= 0; if (bFlagS || bFlagX) { - sFlags = sFlags.replace(/[sx]/g, ''); + // Strip 's' and 'x' from flags + sFlags = sFlags.replace(/[sx]/g, ''); var aValue = [], rValue = /\s/; for (var nIndex = 0, nLength = sValue.length, bValue = false, sCharCurr, sCharPrev = ''; nIndex < nLength; nIndex++) { @@ -6004,8 +8087,10 @@ function fFunction_string_createRegExp(sValue, sFlags) { if (sCharCurr == ']') bValue = false; } - if (bValue || !(bFlagX && rValue.test(sCharCurr))) { - if (!bValue && (bFlagS && sCharCurr == '.' && sCharPrev != '\\')) + // Replace '\s' for flag 'x' if not in [] + if (bValue || !(bFlagX && rValue.test(sCharCurr))) { + // Replace '.' for flag 's' if not in [] + if (!bValue && (bFlagS && sCharCurr == '.' && sCharPrev != '\\')) aValue[aValue.length] = '(?:.|\\s)'; else aValue[aValue.length] = sCharCurr; @@ -6018,6 +8103,8 @@ function fFunction_string_createRegExp(sValue, sFlags) { return new cRegExp(sValue, sFlags + 'g'); }; +// fn:matches($input as xs:string?, $pattern as xs:string) as xs:boolean +// fn:matches($input as xs:string?, $pattern as xs:string, $flags as xs:string) as xs:boolean fStaticContext_defineSystemFunction("matches", [[cXSString, '?'], [cXSString], [cXSString, '', true]], function(oValue, oPattern, oFlags) { var sValue = oValue == null ? '' : oValue.valueOf(), rRegExp = fFunction_string_createRegExp(oPattern.valueOf(), arguments.length > 2 ? oFlags.valueOf() : ''); @@ -6025,6 +8112,8 @@ fStaticContext_defineSystemFunction("matches", [[cXSString, '?'], [cXSString], [ return new cXSBoolean(rRegExp.test(sValue)); }); +// fn:replace($input as xs:string?, $pattern as xs:string, $replacement as xs:string) as xs:string +// fn:replace($input as xs:string?, $pattern as xs:string, $replacement as xs:string, $flags as xs:string) as xs:string fStaticContext_defineSystemFunction("replace", [[cXSString, '?'], [cXSString], [cXSString], [cXSString, '', true]], function(oValue, oPattern, oReplacement, oFlags) { var sValue = oValue == null ? '' : oValue.valueOf(), rRegExp = fFunction_string_createRegExp(oPattern.valueOf(), arguments.length > 3 ? oFlags.valueOf() : ''); @@ -6032,6 +8121,8 @@ fStaticContext_defineSystemFunction("replace", [[cXSString, '?'], [cXSString], return new cXSBoolean(sValue.replace(rRegExp, oReplacement.valueOf())); }); +// fn:tokenize($input as xs:string?, $pattern as xs:string) as xs:string* +// fn:tokenize($input as xs:string?, $pattern as xs:string, $flags as xs:string) as xs:string* fStaticContext_defineSystemFunction("tokenize", [[cXSString, '?'], [cXSString], [cXSString, '', true]], function(oValue, oPattern, oFlags) { var sValue = oValue == null ? '' : oValue.valueOf(), rRegExp = fFunction_string_createRegExp(oPattern.valueOf(), arguments.length > 2 ? oFlags.valueOf() : ''); @@ -6043,16 +8134,35 @@ fStaticContext_defineSystemFunction("tokenize", [[cXSString, '?'], [cXSString], return oSequence; }); +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ +/* + 4 The Trace Function + trace +*/ - +// fn:trace($value as item()*, $label as xs:string) as item()* fStaticContext_defineSystemFunction("trace", [[cXTItem, '*'], [cXSString]], function(oSequence1, oLabel) { var oConsole = window.console; if (oConsole && oConsole.log) oConsole.log(oLabel.valueOf(), oSequence1); return oSequence1; }); - +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ var oCodepointStringCollator = new cStringCollator; @@ -6063,33 +8173,6 @@ oCodepointStringCollator.equals = function(sValue1, sValue2) { oCodepointStringCollator.compare = function(sValue1, sValue2) { return sValue1 == sValue2 ? 0 : sValue1 > sValue2 ? 1 :-1; }; - - -var cAttr = function() { - -}; - -cAttr.prototype.nodeType = 2; -cAttr.prototype.nodeName = -cAttr.prototype.nodeValue = -cAttr.prototype.ownerDocument = -cAttr.prototype.localName = -cAttr.prototype.namespaceURI = -cAttr.prototype.prefix = -cAttr.prototype.attributes = -cAttr.prototype.childNodes = -cAttr.prototype.firstChild = -cAttr.prototype.lastChild = -cAttr.prototype.previousSibling = -cAttr.prototype.nextSibling = -cAttr.prototype.parentNode = - -cAttr.prototype.name = -cAttr.prototype.specified = -cAttr.prototype.value = -cAttr.prototype.ownerElement = null; - - function cLXDOMAdapter() { }; @@ -6219,24 +8302,6 @@ cLXDOMAdapter.prototype.getElementsByTagNameNS = function(oNode, sNameSpaceURI, return aElements; }; - -var oL2DOMAdapter = new cLXDOMAdapter; - - - -var oL2HTMLDOMAdapter = new cLXDOMAdapter; - -oL2HTMLDOMAdapter.getProperty = function(oNode, sName) { - if (sName == "localName") { - if (oNode.nodeType == 1) - return oNode.localName.toLowerCase(); - } - if (sName == "namespaceURI") - return oNode.nodeType == 1 ? "http://www.w3.org/1999/xhtml" : null; - return cLXDOMAdapter.prototype.getProperty.call(this, oNode, sName); -}; - - var oMSHTMLDOMAdapter = new cLXDOMAdapter; oMSHTMLDOMAdapter.getProperty = function(oNode, sName) { @@ -6315,66 +8380,87 @@ oMSXMLDOMAdapter.getElementById = function(oDocument, sId) { return oDocument.nodeFromID(sId); }; +function cEvaluator() { - - -var cQuery = window.jQuery, - oDocument = window.document, - bOldMS = !!oDocument.namespaces && !oDocument.createElementNS, - bOldW3 = !bOldMS && oDocument.documentElement.namespaceURI != "http://www.w3.org/1999/xhtml"; - -var oHTMLStaticContext = new cStaticContext, - oXMLStaticContext = new cStaticContext; - -oHTMLStaticContext.baseURI = oDocument.location.href; -oHTMLStaticContext.defaultFunctionNamespace = "http://www.w3.org/2005/xpath-functions"; -oHTMLStaticContext.defaultElementNamespace = "http://www.w3.org/1999/xhtml"; - -oXMLStaticContext.defaultFunctionNamespace = oHTMLStaticContext.defaultFunctionNamespace; - -function fXPath_evaluate(oQuery, sExpression, fNSResolver) { - if (typeof sExpression == "undefined" || sExpression === null) - sExpression = ''; - - var oNode = oQuery[0]; - if (typeof oNode == "undefined") - oNode = null; - - var oStaticContext = oNode && (oNode.nodeType == 9 ? oNode : oNode.ownerDocument).createElement("div").tagName == "DIV" ? oHTMLStaticContext : oXMLStaticContext; - - oStaticContext.namespaceResolver = fNSResolver; - - var oExpression = new cExpression(cString(sExpression), oStaticContext); - - oStaticContext.namespaceResolver = null; - - var aSequence, - oSequence = new cQuery, - oAdapter = oL2DOMAdapter; - - if (bOldMS) - oAdapter = oStaticContext == oHTMLStaticContext ? oMSHTMLDOMAdapter : oMSXMLDOMAdapter; - else - if (bOldW3 && oStaticContext == oHTMLStaticContext) - oAdapter = oL2HTMLDOMAdapter; - - aSequence = oExpression.evaluate(new cDynamicContext(oStaticContext, oNode, null, oAdapter)); - for (var nIndex = 0, nLength = aSequence.length, oItem; nIndex < nLength; nIndex++) - oSequence.push(oAdapter.isNode(oItem = aSequence[nIndex]) ? oItem : cStaticContext.xs2js(oItem)); - - return oSequence; }; -var oObject = {}; -oObject.xpath = function(oQuery, sExpression, fNSResolver) { - return fXPath_evaluate(oQuery instanceof cQuery ? oQuery : new cQuery(oQuery), sExpression, fNSResolver); -}; -cQuery.extend(cQuery, oObject); +cEvaluator.prototype.defaultOL2DOMAdapter = new cLXDOMAdapter; +cEvaluator.prototype.defaultOL2HTMLDOMAdapter = new cLXDOMAdapter; -oObject = {}; -oObject.xpath = function(sExpression, fNSResolver) { - return fXPath_evaluate(this, sExpression, fNSResolver); -}; -cQuery.extend(cQuery.prototype, oObject); +cEvaluator.prototype.defaultHTMLStaticContext = new cStaticContext; +cEvaluator.prototype.defaultHTMLStaticContext.baseURI = window.document.location.href; +cEvaluator.prototype.defaultHTMLStaticContext.defaultFunctionNamespace = "http://www.w3.org/2005/xpath-functions"; +cEvaluator.prototype.defaultHTMLStaticContext.defaultElementNamespace = "http://www.w3.org/1999/xhtml"; -})(); +cEvaluator.prototype.defaultXMLStaticContext = new cStaticContext; +cEvaluator.prototype.defaultXMLStaticContext.defaultFunctionNamespace = "http://www.w3.org/2005/xpath-functions"; + +cEvaluator.prototype.bOldMS = !!window.document.namespaces && !window.document.createElementNS; +cEvaluator.prototype.bOldW3 = !cEvaluator.prototype.bOldMS && window.document.documentElement.namespaceURI != "http://www.w3.org/1999/xhtml"; + +cEvaluator.prototype.defaultDOMAdapter = new cDOMAdapter; + +cEvaluator.prototype.compile = function(sExpression, oStaticContext) { + return new cExpression(sExpression, oStaticContext); +}; + +cEvaluator.prototype.evaluate = function(oQuery, sExpression, fNSResolver) { + if (! (oQuery instanceof window.jQuery)) + oQuery = new window.jQuery(oQuery) + + if (typeof sExpression == "undefined" || sExpression === null) + sExpression = ''; + + var oNode = oQuery[0]; + if (typeof oNode == "undefined") + oNode = null; + + var oStaticContext = oNode && (oNode.nodeType == 9 ? oNode : oNode.ownerDocument).createElement("div").tagName == "DIV" ? this.defaultHTMLStaticContext : this.defaultXMLStaticContext; + + oStaticContext.namespaceResolver = fNSResolver; + + var oExpression = new cExpression(cString(sExpression), oStaticContext); + + oStaticContext.namespaceResolver = null; + + var aSequence, + oSequence = new window.jQuery, + oAdapter = this.defaultOL2DOMAdapter; + + if (this.bOldMS) + oAdapter = oStaticContext == this.defaultHTMLStaticContext ? oMSHTMLDOMAdapter : oMSXMLDOMAdapter; + else + if (this.bOldW3 && oStaticContext == this.defaultHTMLStaticContext) + oAdapter = this.defaultOL2HTMLDOMAdapter; + + aSequence = oExpression.evaluate(new cDynamicContext(oStaticContext, oNode, null, oAdapter)); + for (var nIndex = 0, nLength = aSequence.length, oItem; nIndex < nLength; nIndex++) + oSequence.push(oAdapter.isNode(oItem = aSequence[nIndex]) ? oItem : cStaticContext.xs2js(oItem)); + + return oSequence; +}; + +/* + * XPath.js - Pure JavaScript implementation of XPath 2.0 parser and evaluator + * + * Copyright (c) 2012 Sergey Ilinsky + * Dual licensed under the MIT and GPL licenses. + * + * + */ + +var oXPathEvaluator = new cEvaluator, + oXPathClasses = oXPathEvaluator.classes = {}; + +// +oXPathClasses.Exception = cException; +oXPathClasses.Expression = cExpression; +oXPathClasses.DOMAdapter = cDOMAdapter; +oXPathClasses.StaticContext = cStaticContext; +oXPathClasses.DynamicContext= cDynamicContext; +oXPathClasses.StringCollator= cStringCollator; + +// Publish object +window.xpath = oXPathEvaluator; + +})() \ No newline at end of file diff --git a/src/js/operations/Extract.js b/src/js/operations/Extract.js index f84719e6..470b43c2 100755 --- a/src/js/operations/Extract.js +++ b/src/js/operations/Extract.js @@ -1,3 +1,5 @@ +/* globals xpath */ + /** * Identifier extraction operations. * @@ -309,6 +311,8 @@ var Extract = { /** * Extract information (from an xml document) with an XPath query * + * @author Mikescher (https://github.com/Mikescher | https://mikescher.com) + * * @param {string} input * @param {Object[]} args * @returns {string} @@ -326,7 +330,7 @@ var Extract = { var result; try { - result = $.xpath(xml, query); + result = xpath.evaluate(xml, query); } catch (err) { return "Invalid XPath. Details:\n" + err.message; } @@ -362,6 +366,8 @@ var Extract = { /** * Extract information (from an hmtl document) with an css selector * + * @author Mikescher (https://github.com/Mikescher | https://mikescher.com) + * * @param {string} input * @param {Object[]} args * @returns {string} @@ -376,7 +382,7 @@ var Extract = { } catch (err) { return "Invalid input HTML."; } - + var result; try { result = $(html).find(query); @@ -388,7 +394,7 @@ var Extract = { switch (node.nodeType) { case Node.ELEMENT_NODE: return node.outerHTML; case Node.ATTRIBUTE_NODE: return node.value; - case Node.COMMENT_NODE: return node.ata; + case Node.COMMENT_NODE: return node.data; case Node.TEXT_NODE: return node.wholeText; case Node.DOCUMENT_NODE: return node.outerHTML; default: throw new Error("Unknown Node Type: " + node.nodeType); @@ -396,7 +402,9 @@ var Extract = { }; return Array.apply(null, Array(result.length)) - .map((_, i) => result[i]) + .map(function(_, i) { + return result[i]; + }) .map(nodeToString) .join(delimiter); }, From 39d50093ae80d961f7ff138f844b34da153306ed Mon Sep 17 00:00:00 2001 From: n1474335 Date: Tue, 20 Dec 2016 18:49:25 +0000 Subject: [PATCH 08/12] Tweaks to 'XPath expression' and 'CSS selector' operations. Closes #13. --- build/prod/cyberchef.htm | 35 +++++---- build/prod/index.html | 2 +- build/prod/scripts.js | 31 +++++--- src/js/config/Categories.js | 2 + src/js/config/OperationConfig.js | 16 ++--- src/js/lib/xpath.js | 16 ++--- src/js/operations/Code.js | 117 ++++++++++++++++++++++++++++++- src/js/operations/Extract.js | 115 ------------------------------ src/static/stats.txt | 24 +++---- 9 files changed, 189 insertions(+), 169 deletions(-) mode change 100644 => 100755 src/js/lib/xpath.js diff --git a/build/prod/cyberchef.htm b/build/prod/cyberchef.htm index 538a7e35..ab9f4e68 100755 --- a/build/prod/cyberchef.htm +++ b/build/prod/cyberchef.htm @@ -91,11 +91,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -*/.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.clo,.opn,.pun{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}#content-wrapper{top:0;left:0;width:100%;height:100%}#banner{height:30px;text-align:center;line-height:30px}#wrapper{top:30px;bottom:0}div#operations,div#recipe{width:50%;height:100%}div#input,div#output{width:100%;height:50%}.title{padding:10px;height:43px}.textarea-wrapper{top:43px;bottom:0;width:100%;overflow:hidden}#output-html,textarea{width:100%;height:100%;border:none;padding:3px;-moz-padding-start:3px;-moz-padding-end:3px}#input-text,#output-html,#output-text{position:relative;border-width:0;margin:0;resize:none;background-color:transparent;white-space:pre-wrap;word-wrap:break-word}#output-html{display:none;overflow-y:auto;-moz-padding-start:1px}.split{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:auto;position:relative}.gutter.gutter-horizontal,.split.split-horizontal{height:100%;float:left}#input-highlighter,#output-highlighter{position:absolute;left:0;top:0;width:100%;height:100%;padding:3px;margin:0;overflow:hidden;letter-spacing:normal;white-space:pre-wrap;word-wrap:break-word;color:#fff;background-color:transparent;border:none}#op_list,#rec_list,.op_list{margin:0;padding:0;list-style-type:none}#op_list,#rec_list{position:absolute;top:43px;bottom:0;width:100%}.io-btn-group,.io-info{margin-top:-4px;float:right}#rec_list{bottom:120px;overflow:auto}.operation{cursor:pointer;padding:10px;list-style-type:none;position:relative}#controls{position:absolute;width:100%;height:120px;bottom:0;padding:10px}.io-info{margin-right:20px;height:30px;text-align:right;line-height:10px}.arg-group,.inline-args input[type=checkbox]{margin-top:10px}#input-info{line-height:15px}.arg-group{display:table;width:100%}.arg-group-text{display:block}.inline-args{float:left;width:auto;margin-right:30px;height:34px}.inline-args input[type=number]{width:100px}.arg-input{display:table-cell;width:100%;padding:6px 12px}.short-string{width:150px}select{display:block}.arg[disabled]{cursor:not-allowed;opacity:1}textarea.arg{width:100%;min-height:50px;height:70px;margin-top:5px;border:1px solid #ddd;resize:vertical}.arg-label{display:table-cell;width:1px;padding-right:10px;font-weight:400;white-space:pre}.title,optgroup{font-weight:700}.editable-option{position:relative;display:inline-block}.editable-option-input{position:absolute;top:1px;left:1px;width:calc(100% - 20px);height:calc(100% - 2px)!important;border:none!important}#operational-controls{width:65%;float:left;text-align:center}#bake-group{display:table;width:100%}#bake{display:table-cell;width:100%;border-top-right-radius:0;border-bottom-right-radius:0}#auto-bake-label{display:table-cell;padding:1px;line-height:1.35;width:60px;border-top-left-radius:0;border-bottom-left-radius:0;border-left:1px solid #5cb85c}#auto-bake-label:hover{border-left-color:#398439}#auto-bake-label div{font-size:10px;padding:2px}#extra-controls{float:right;width:35%;padding-left:10px}.op-icon{float:right;margin-left:10px;margin-top:3px}.recip-icons{position:absolute;top:13px;right:10px;height:16px}.recip-icon{margin-right:10px;vertical-align:baseline;float:right}.disable-icon{width:16px;height:16px;margin-top:-1px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAACfElEQVQ4y6WTPWgTYRjHf8nlfVvuoDVIP4Yuki4WHKoUqggFRUTsUEGkVG2hmCq6OnTwIxYHB+eijZOKdLNDW1pKKyGigh8dBHUJElxyBgx3vEnukvdyDrUhRXDxGR+e/+/583xEwjDkfyIGwNVTzURm4tYAMA6MAoN/0tvAMrA48uL+l2bx4w0iYRjSuHKC6OnTZLqHk8CcaZq9bW1tSCkBqNVq+L5PpVIpAHdGfr5LN9bXiT7Z2nGgteb1/qFkLBJZ6OjowHEc8vk8pVIJgHg8TldXF52dnb2u6y5s7R/iuF5JSyAKkLl4eyAMwznLsrBtm1wu99Z13amk+BFJih8R13WXANrb27EsizAM5zIXbw+wC9Baj0spe5VSFAqFt4ZhXJ6ufXuK55E5cDKVSCTGenp6yGazKKWQUvZqrcebgCAIRqWUOI6DEOLR1K8POapVMgfPpoC7u2LLspYcx0FKSRAEo60OBg3DwPd9Jr5vPqWvj8zh83vEwL2J75vnfN/HMAy01oPNNQZBQBAEO1OvVsl0D/8lTuZfpYDd7gRBQKuD7XK5jGmarB679PIv8deVFJUKq8cuTZqmSblcRmu93QpYVkohhMCyrLE94n2/UlSrbJy5kRBCXBNCoJRCa73cClh0XbfgeR6WZZHNZunv719KvnmeYnWVVxdmJ2Ox2DMhxFHP83Bdt6C1XgR2LvHzQDvvb84npZQL8Xgc0zSJRqN7br7RaFCpVCiVStRqtZmhh9fTh754TQdMr82nPc+bsW27UCwWUUpRr9ep1+sopSgWi9i2XfA8b2Z6bT6ttabp4GMi0uz0aXbhn890+MFM85mO5MIdwP/Eb1pMUCdctYRzAAAAAElFTkSuQmCC) no-repeat}.disable-icon-selected{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACFUlEQVR4XqWTP0tbURjGn9zY3mjBwsUhBQtS6XKxiNypIGZJ6SKYUYdaKWg7OrrE3pYO+Qit3dpFuuQO6lI7Z4nESQdjlJbkJh0MksSb3Jvk9H0gjZFu9YWH83LO7zn/3nNCSincJobAeP1sEDBFi6J50UyPy4l2RNuioz756Ts0tt1OB4jH2a52Ne2HGh9PwrJm2EcxZx/HyPRYMDgB2u02/N3d1c7w8BZMM1ptNJBPp3GwsUExB/s4RoYsPf0JOkFgdoH34YkJ/D48xC/HyTTOzl5ayWSIktwxqlVo0SjIkKWnP0Hg+4swjGitVMJFNpu5o+svptfXv6DZBDIZezoWS3Db3A0ZsvRcH8H354dGR9EoFHA3EvlorqycwvOAXM4G8Pav+f7YmEOGLD1gsIzl54+V+vBK/Yw9ZAv1LQW1FrdFSnKVfQTK5liPUfRI9I8ArqiPjLAF9vcHVybyzlpasgcZeq7voNXKNSsV3DMMXB4fp/8xLyzYuLri2DIZsvQM3sFOzXURiUR4zsQNcyrFleFVKpNyP2/IkKVnsArbF65bbkqplJSJZrl5x5qbs7G3h3artSyV+arr+lMyZOnpP2Wp6ZFos3R+vvUgCGDNzgKalkA4rECIr07662J2i0X4nrfJJ33jJT6Zmvpcr9XWCicn5WI+j7rrAmKgmLOPY2TI0sPgb8TBZOi/PpN1qnDr7/wH3jxgB/FKIXkAAAAASUVORK5CYII=) no-repeat}.breakpoint{float:right;width:14px;height:14px;background-color:#eee;border:1px solid #aaa}.breakpoint-selected{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEXIUkvzUVHzTEzzn5785eXrbW24BgbzWVnze3vzVVXzY2Pyion509PzbW3zXV1UMxj0l5f1srKbRTRgOxzJDg796ur74ODfIyP5zs6LLx3pNTXYGxuxdkVZNhn////sCC1eAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAABWSURBVBjTnc+7EoAgDERRTOQVxMEZFAf//z8FjAUFDbfb060QU2FwxngimxnCea3bjegSgz+0tguAfBgIy64QGfZQdg91dgAtqUZgnfz6IacYVWvu2AvR4wNAv0nxrAAAAABJRU5ErkJggg==) -2px -2px no-repeat #eee}.banner-right{float:right;margin-right:10px}#banner img{margin-bottom:2px;margin-left:8px}.category-title{display:block;padding:10px}.category{margin:0!important;border-radius:0!important;border:none}#search{border-radius:0;border:none}.loading_file{background:url(data:image/gif;base64,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) center center no-repeat #f5f5f5}#alert{position:fixed;width:30%;margin:30px auto;top:10px;left:0;right:0;z-index:2000;display:none}#alert a{text-decoration:underline}.option-item .bootstrap-switch{margin:15px 10px}.option-item button{margin:10px}.option-item input[type=number]{margin:15px 10px;width:80px;height:28px;padding:3px 10px;vertical-align:middle}.option-item select{margin:10px;display:inline-block}button img,span.btn img{margin-right:3px;margin-bottom:1px}#edit-favourites{float:right;margin-top:-5px}#edit-favourites-list{margin:10px}.about-img-left{float:left;margin:10px 20px 20px 0}.about-img-right{float:right;margin:10px 0 20px 20px}.save-link-options{float:right}.save-link-options input{margin-left:10px}#save-footer{border-top:none;margin-top:0}a:focus,button{outline:0;-moz-outline-style:none}.btn-default{border-color:#ddd}.btn-default:focus{background-color:#fff;border-color:#adadad}.btn-default:active,.btn-default:hover{background-color:#ebebeb;border-color:#adadad}.alert,.btn,.btn-lg,.dropdown-menu,.form-control,.modal-content,.nav-tabs>li>a,.popover,.tooltip-inner{border-radius:0!important}input[type=search]{-webkit-appearance:searchfield;box-shadow:none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.modal{overflow-y:auto}.form-control{background-color:transparent}code{border:0;white-space:pre-wrap}.bootstrap-switch,.bootstrap-switch-container,.bootstrap-switch-handle-off,.bootstrap-switch-handle-on,.bootstrap-switch-label,pre{border-radius:0!important}#banner,.title{border-bottom:1px solid #ddd}blockquote{font-size:inherit}.panel-body:after,.panel-body:before{content:""}.sortable-ghost{opacity:.6}.colorpicker-element{float:left;margin-right:15px}.colorpicker-color,.colorpicker-color div{height:100px}.word-wrap{white-space:pre!important;word-wrap:normal!important;overflow-x:scroll!important}.clearfix{height:0}.blur{color:transparent!important;text-shadow:rgba(0,0,0,.95) 0 0 10px!important}.no-select{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.konami{-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg);transform:rotate(180deg);-moz-transform:rotate(180deg)}.hl1,.hlyellow{background-color:#fff000}.hl2,.hlblue{background-color:#95dfff}.hl3,.hlred{background-color:#ffb6b6}.hl4,.hlorange{background-color:#fcf8e3}.hl5,.hlgreen{background-color:#8de768}.title{color:#424242;background-color:#fafafa}.gutter{background-color:#eee;background-repeat:no-repeat;background-position:50%}.gutter.gutter-horizontal{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAeCAYAAAAGos/EAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAlSURBVChTYzxz5sx/BiBgAhEgwPju3TtUEZZ79+6BGcNcDQMDACWJMFs4hNOSAAAAAElFTkSuQmCC);cursor:ew-resize}.gutter.gutter-vertical{background-image:url(data:image/png;base64,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);cursor:ns-resize}.operation{border:1px solid #999;border-top-width:0}.op_list .operation{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}#rec_list .operation{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.arg-input,select{height:34px;border:1px solid #ddd;background-color:#fff;color:#424242}#controls{border-top:1px solid #ddd;background-color:#fafafa}.textarea-wrapper div,.textarea-wrapper textarea{font-family:Consolas,monospace;font-size:inherit}.io-info{font-weight:400;font-size:8pt}.arg-title,.category-title{font-weight:700}.arg-input{font-size:15px;line-height:1.428571429}select{padding:6px 8px}.arg[disabled]{background-color:#eee}textarea.arg{color:#424242}.break{color:#b94a48!important;background-color:#f2dede!important;border-color:#eed3d7!important}.category-title{background-color:#fafafa;border-bottom:1px solid #eee}.category-title[aria-expanded=true],.category-title[href='#catFavourites']{border-bottom-color:#ddd}.category-title.collapsed{border-bottom-color:#eee}.category-title:hover{color:#3a87ad}#search{border-bottom:1px solid #e3e3e3}.dropping-file{border:5px dashed #3a87ad!important}.selected-op{color:#c09853!important;background-color:#fcf8e3!important;border-color:#fbeed5!important}.option-item input[type=number]{font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;border:1px solid #ccc}.favourites-hover{color:#468847;background-color:#dff0d8;border:2px dashed #468847!important;padding:8px 8px 9px}#edit-favourites-list{border:1px solid #bce8f1}#edit-favourites-list .operation{border-left:none;border-right:none}#edit-favourites-list .operation:last-child{border-bottom:none}.subtext{font-style:italic;font-size:13px;color:#999}#save-footer{border-bottom:1px solid #e5e5e5}.flow-control-op{color:#396f3a!important;background-color:#c7e4ba!important;border-color:#b3dba2!important}.flow-control-op.break{color:#94312f!important;background-color:#eabfbf!important;border-color:#e2aeb5!important}#support-modal textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}#load-text,#save-text{font-family:Consolas,monospace}button.dropdown-toggle{background-color:#f4f4f4}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background-color:#fafafa}::-webkit-scrollbar-thumb{background-color:#ccc}::-webkit-scrollbar-thumb:hover{background-color:#bbb}::-webkit-scrollbar-corner{background-color:#fafafa}.disabled{color:#999!important;background-color:#dfdfdf!important;border-color:#cdcdcd!important}.grey{color:#333;background-color:#f5f5f5;border-color:#ddd}.dark-blue{color:#fff;background-color:#428bca;border-color:#428bca}.red{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.amber{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.green{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.blue{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1} Edit
Operations
    Recipe
      Input
      Output
      Operations
        Recipe
          Input
          Output
          \ No newline at end of file +function(a){"function"==typeof define&&define.amd?define(a):"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=a():"undefined"!=typeof Package?Sortable=a():window.Sortable=a()}(function(){function a(a,b){if(!a||!a.nodeType||1!==a.nodeType)throw"Sortable: `el` must be HTMLElement, and not "+{}.toString.call(a);this.el=a,this.options=b=s({},b),a[M]=this;var c={group:Math.random(),sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(a.nodeName)?"li":">*",ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",ignore:"a, img",filter:null,animation:0,setData:function(a,b){a.setData("Text",b.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1};for(var d in c)!(d in b)&&(b[d]=c[d]);W(b);for(var f in this)"_"===f.charAt(0)&&(this[f]=this[f].bind(this));this.nativeDraggable=!b.forceFallback&&Q,e(a,"mousedown",this._onTapStart),e(a,"touchstart",this._onTapStart),this.nativeDraggable&&(e(a,"dragover",this),e(a,"dragenter",this)),U.push(this._onDragOver),b.store&&this.sort(b.store.get(this))}function b(a){w&&w.state!==a&&(h(w,"display",a?"none":""),!a&&w.state&&x.insertBefore(w,t),w.state=a)}function c(a,b,c){if(a){c=c||O;do if(">*"===b&&a.parentNode===c||q(a,b))return a;while(a!==c&&(a=a.parentNode))}return null}function d(a){a.dataTransfer&&(a.dataTransfer.dropEffect="move"),a.preventDefault()}function e(a,b,c){a.addEventListener(b,c,!1)}function f(a,b,c){a.removeEventListener(b,c,!1)}function g(a,b,c){if(a)if(a.classList)a.classList[c?"add":"remove"](b);else{var d=(" "+a.className+" ").replace(L," ").replace(" "+b+" "," ");a.className=(d+(c?" "+b:"")).replace(L," ")}}function h(a,b,c){var d=a&&a.style;if(d){if(void 0===c)return O.defaultView&&O.defaultView.getComputedStyle?c=O.defaultView.getComputedStyle(a,""):a.currentStyle&&(c=a.currentStyle),void 0===b?c:c[b];b in d||(b="-webkit-"+b),d[b]=c+("string"==typeof c?"":"px")}}function i(a,b,c){if(a){var d=a.getElementsByTagName(b),e=0,f=d.length;if(c)for(;e5||b.clientX-(d.right+d.width)>5)&&c}function o(a){for(var b=a.tagName+a.className+a.src+a.href+a.textContent,c=b.length,d=0;c--;)d+=b.charCodeAt(c);return d.toString(36)}function p(a,b){var c=0;if(!a||!a.parentNode)return-1;for(;a&&(a=a.previousElementSibling);)"TEMPLATE"!==a.nodeName.toUpperCase()&&q(a,b)&&c++;return c}function q(a,b){if(a){b=b.split(".");var c=b.shift().toUpperCase(),d=new RegExp("\\s("+b.join("|")+")(?=\\s)","g");return!(""!==c&&a.nodeName.toUpperCase()!=c||b.length&&((" "+a.className+" ").match(d)||[]).length!=b.length)}return!1}function r(a,b){var c,d;return function(){void 0===c&&(c=arguments,d=this,setTimeout(function(){1===c.length?a.call(d,c[0]):a.apply(d,c),c=void 0},b))}}function s(a,b){if(a&&b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}if("undefined"==typeof window||"undefined"==typeof window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K={},L=/\s+/g,M="Sortable"+(new Date).getTime(),N=window,O=N.document,P=N.parseInt,Q=!!("draggable"in O.createElement("div")),R=function(a){return a=O.createElement("x"),a.style.cssText="pointer-events:auto","auto"===a.style.pointerEvents}(),S=!1,T=Math.abs,U=([].slice,[]),V=r(function(a,b,c){if(c&&b.scroll){var d,e,f,g,h=b.scrollSensitivity,i=b.scrollSpeed,j=a.clientX,k=a.clientY,l=window.innerWidth,m=window.innerHeight;if(A!==c&&(z=b.scroll,A=c,z===!0)){z=c;do if(z.offsetWidth-1){for(;d--;)U[d]({clientX:I.clientX,clientY:I.clientY,target:a,rootEl:b});break}a=b}while(b=b.parentNode);R||h(v,"display","")}},_onTouchMove:function(b){if(H){a.active||this._dragStarted(),this._appendGhost();var c=b.touches?b.touches[0]:b,d=c.clientX-H.clientX,e=c.clientY-H.clientY,f=b.touches?"translate3d("+d+"px,"+e+"px,0)":"translate("+d+"px,"+e+"px)";J=!0,I=c,h(v,"webkitTransform",f),h(v,"mozTransform",f),h(v,"msTransform",f),h(v,"transform",f),b.preventDefault()}},_appendGhost:function(){if(!v){var a,b=t.getBoundingClientRect(),c=h(t),d=this.options;v=t.cloneNode(!0),g(v,d.ghostClass,!1),g(v,d.fallbackClass,!0),h(v,"top",b.top-P(c.marginTop,10)),h(v,"left",b.left-P(c.marginLeft,10)),h(v,"width",b.width),h(v,"height",b.height),h(v,"opacity","0.8"),h(v,"position","fixed"),h(v,"zIndex","100000"),h(v,"pointerEvents","none"),d.fallbackOnBody&&O.body.appendChild(v)||x.appendChild(v),a=v.getBoundingClientRect(),h(v,"width",2*b.width-a.width),h(v,"height",2*b.height-a.height)}},_onDragStart:function(a,b){var c=a.dataTransfer,d=this.options;this._offUpEvents(),"clone"==G.pull&&(w=t.cloneNode(!0),h(w,"display","none"),x.insertBefore(w,t)),b?("touch"===b?(e(O,"touchmove",this._onTouchMove),e(O,"touchend",this._onDrop),e(O,"touchcancel",this._onDrop)):(e(O,"mousemove",this._onTouchMove),e(O,"mouseup",this._onDrop)),this._loopId=setInterval(this._emulateDragOver,50)):(c&&(c.effectAllowed="move",d.setData&&d.setData.call(this,c,t)),e(O,"drop",this),setTimeout(this._dragStarted,0))},_onDragOver:function(a){var d,e,f,g=this.el,i=this.options,j=i.group,l=j.put,o=G===j,p=i.sort;if(void 0!==a.preventDefault&&(a.preventDefault(),!i.dragoverBubble&&a.stopPropagation()),J=!0,G&&!i.disabled&&(o?p||(f=!x.contains(t)):G.pull&&l&&(G.name===j.name||l.indexOf&&~l.indexOf(G.name)))&&(void 0===a.rootEl||a.rootEl===this.el)){if(V(a,i,this.el),S)return;if(d=c(a.target,i.draggable,g),e=t.getBoundingClientRect(),f)return b(!0),void(w||y?x.insertBefore(t,w||y):p||x.appendChild(t));if(0===g.children.length||g.children[0]===v||g===a.target&&(d=n(g,a))){if(d){if(d.animated)return;r=d.getBoundingClientRect()}b(o),k(x,g,t,e,d,r)!==!1&&(t.contains(g)||(g.appendChild(t),u=g),this._animate(e,t),d&&this._animate(r,d))}else if(d&&!d.animated&&d!==t&&void 0!==d.parentNode[M]){B!==d&&(B=d,C=h(d),D=h(d.parentNode));var q,r=d.getBoundingClientRect(),s=r.right-r.left,z=r.bottom-r.top,A=/left|right|inline/.test(C.cssFloat+C.display)||"flex"==D.display&&0===D["flex-direction"].indexOf("row"),E=d.offsetWidth>t.offsetWidth,F=d.offsetHeight>t.offsetHeight,H=(A?(a.clientX-r.left)/s:(a.clientY-r.top)/z)>.5,I=d.nextElementSibling,K=k(x,g,t,e,d,r);if(K!==!1){if(S=!0,setTimeout(m,30),b(o),1===K||K===-1)q=1===K;else if(A){var L=t.offsetTop,N=d.offsetTop;q=L===N?d.previousElementSibling===t&&!E||H&&E:N>L}else q=I!==t&&!F||H&&F;t.contains(g)||(q&&!I?g.appendChild(t):d.parentNode.insertBefore(t,q?I:d)),u=t.parentNode,this._animate(e,t),this._animate(r,d)}}}},_animate:function(a,b){var c=this.options.animation;if(c){var d=b.getBoundingClientRect();h(b,"transition","none"),h(b,"transform","translate3d("+(a.left-d.left)+"px,"+(a.top-d.top)+"px,0)"),b.offsetWidth,h(b,"transition","all "+c+"ms"),h(b,"transform","translate3d(0,0,0)"),clearTimeout(b.animated),b.animated=setTimeout(function(){h(b,"transition",""),h(b,"transform",""),b.animated=!1},c)}},_offUpEvents:function(){var a=this.el.ownerDocument;f(O,"touchmove",this._onTouchMove),f(a,"mouseup",this._onDrop),f(a,"touchend",this._onDrop),f(a,"touchcancel",this._onDrop)},_onDrop:function(b){var c=this.el,d=this.options;clearInterval(this._loopId),clearInterval(K.pid),clearTimeout(this._dragStartTimer),f(O,"mousemove",this._onTouchMove),this.nativeDraggable&&(f(O,"drop",this),f(c,"dragstart",this._onDragStart)),this._offUpEvents(),b&&(J&&(b.preventDefault(),!d.dropBubble&&b.stopPropagation()),v&&v.parentNode.removeChild(v),t&&(this.nativeDraggable&&f(t,"dragend",this),l(t),g(t,this.options.ghostClass,!1),g(t,this.options.chosenClass,!1),x!==u?(F=p(t,d.draggable),F>=0&&(j(null,u,"sort",t,x,E,F),j(this,x,"sort",t,x,E,F),j(null,u,"add",t,x,E,F),j(this,x,"remove",t,x,E,F))):(w&&w.parentNode.removeChild(w),t.nextSibling!==y&&(F=p(t,d.draggable),F>=0&&(j(this,x,"update",t,x,E,F),j(this,x,"sort",t,x,E,F)))),a.active&&(null!==F&&F!==-1||(F=E),j(this,x,"end",t,x,E,F),this.save()))),this._nulling()},_nulling:function(){x=t=u=v=y=w=z=A=H=I=J=F=B=C=G=a.active=null},handleEvent:function(a){var b=a.type;"dragover"===b||"dragenter"===b?t&&(this._onDragOver(a),d(a)):"drop"!==b&&"dragend"!==b||this._onDrop(a)},toArray:function(){for(var a,b=[],d=this.el.children,e=0,f=d.length,g=this.options;e0&&f<=1?f:2-f,f/=2,g>1&&(g=1),{h:isNaN(e)?0:e,s:isNaN(g)?0:g,l:isNaN(f)?0:f,a:isNaN(d)?0:d}},toAlias:function(a,b,c,d){var e=this.toHex(a,b,c,d);for(var f in this.colors)if(this.colors[f]===e)return f;return!1},RGBtoHSB:function(a,b,c,d){a/=255,b/=255,c/=255;var e,f,g,h;return g=Math.max(a,b,c),h=g-Math.min(a,b,c),e=0===h?null:g===a?(b-c)/h:g===b?(c-a)/h+2:(a-b)/h+4,e=(e+360)%6*60/360,f=0===h?0:h/g,{h:this._sanitizeNumber(e),s:f,b:g,a:this._sanitizeNumber(d)}},HueToRGB:function(a,b,c){return c<0?c+=1:c>1&&(c-=1),6*c<1?a+(b-a)*c*6:2*c<1?b:3*c<2?a+(b-a)*(2/3-c)*6:a},HSLtoRGB:function(a,b,c,d){b<0&&(b=0);var e;e=c<=.5?c*(1+b):c+b-c*b;var f=2*c-e,g=a+1/3,h=a,i=a-1/3,j=Math.round(255*this.HueToRGB(f,e,g)),k=Math.round(255*this.HueToRGB(f,e,h)),l=Math.round(255*this.HueToRGB(f,e,i));return[j,k,l,this._sanitizeNumber(d)]},toString:function(a){a=a||"rgba";var b=!1;switch(a){case"rgb":return b=this.toRGB(),this.rgbaIsTransparent(b)?"transparent":"rgb("+b.r+","+b.g+","+b.b+")";case"rgba":return b=this.toRGB(),"rgba("+b.r+","+b.g+","+b.b+","+b.a+")";case"hsl":return b=this.toHSL(),"hsl("+Math.round(360*b.h)+","+Math.round(100*b.s)+"%,"+Math.round(100*b.l)+"%)";case"hsla":return b=this.toHSL(),"hsla("+Math.round(360*b.h)+","+Math.round(100*b.s)+"%,"+Math.round(100*b.l)+"%,"+b.a+")";case"hex":return this.toHex();case"alias":return this.toAlias()||this.toHex();default:return b}},stringParsers:[{re:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,format:"rgb",parse:function(a){return[a[1],a[2],a[3],1]}},{re:/rgb\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/,format:"rgb",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],1]}},{re:/rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/hsl\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/,format:"hsl",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/hsla\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"hsla",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,format:"hex",parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16),1]}},{re:/#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,format:"hex",parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16),1]}}],colorNameToHex:function(a){return"undefined"!=typeof this.colors[a.toLowerCase()]&&this.colors[a.toLowerCase()]}};var c={horizontal:!1,inline:!1,color:!1,format:!1,input:"input",container:!1,component:".add-on, .input-group-addon",sliders:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setHue"},alpha:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setAlpha"}},slidersHorz:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:100,maxTop:0,callLeft:"setHue",callTop:!1},alpha:{maxLeft:100,maxTop:0,callLeft:"setAlpha",callTop:!1}},template:'
          Operations
            Recipe
              Input
              Output
              \ No newline at end of file +};ControlsWaiter.prototype.adjust_width=function(){var a=document.getElementById("controls"),b=document.getElementById("step"),c=document.getElementById("clr-breaks"),d=document.querySelector("#save img"),e=document.querySelector("#load img"),f=document.querySelector("#step img"),g=document.querySelector("#clr-recipe img"),h=document.querySelector("#clr-breaks img");a.clientWidth<470?b.childNodes[1].nodeValue=" Step":b.childNodes[1].nodeValue=" Step through",a.clientWidth<400?(d.style.display="none",e.style.display="none",f.style.display="none",g.style.display="none",h.style.display="none"):(d.style.display="inline",e.style.display="inline",f.style.display="inline",g.style.display="inline",h.style.display="inline"),a.clientWidth<330?c.childNodes[1].nodeValue=" Clear breaks":c.childNodes[1].nodeValue=" Clear breakpoints"},ControlsWaiter.prototype.set_auto_bake=function(a){var b=document.getElementById("auto-bake");b.checked!==a&&b.click()},ControlsWaiter.prototype.bake_click=function(){this.app.bake(),$("#output-text").selectRange(0)},ControlsWaiter.prototype.step_click=function(){this.app.bake(!0),$("#output-text").selectRange(0)},ControlsWaiter.prototype.auto_bake_change=function(){var a=document.getElementById("auto-bake-label"),b=document.getElementById("auto-bake");this.app.auto_bake_=b.checked,b.checked?(a.classList.remove("btn-default"),a.classList.add("btn-success")):(a.classList.remove("btn-success"),a.classList.add("btn-default"))},ControlsWaiter.prototype.clear_recipe_click=function(){this.manager.recipe.clear_recipe()},ControlsWaiter.prototype.clear_breaks_click=function(){for(var a=document.querySelectorAll("#rec_list li.operation .breakpoint"),b=0;b0,b=b&&f.length>0&&f.length<8e3,a&&(d+="?recipe="+encodeURIComponent(e)),a&&b?d+="&input="+encodeURIComponent(f):b&&(d+="?input="+encodeURIComponent(f)),d},ControlsWaiter.prototype.save_text_change=function(){try{var a=JSON.parse(document.getElementById("save-text").value);this.initialise_save_link(a)}catch(a){}},ControlsWaiter.prototype.save_click=function(){var a=this.app.get_recipe_config(),b=JSON.stringify(a).replace(/},{/g,"},\n{");document.getElementById("save-text").value=b,this.initialise_save_link(a),$("#save-modal").modal()},ControlsWaiter.prototype.slr_check_change=function(){this.initialise_save_link()},ControlsWaiter.prototype.sli_check_change=function(){this.initialise_save_link()},ControlsWaiter.prototype.load_click=function(){this.populate_load_recipes_list(),$("#load-modal").modal()},ControlsWaiter.prototype.save_button_click=function(){var a=document.getElementById("save-name").value,b=document.getElementById("save-text").value;if(!a)return void this.app.alert("Please enter a recipe name","danger",2e3);var c=localStorage.saved_recipes?JSON.parse(localStorage.saved_recipes):[],d=localStorage.recipe_id||0;c.push({id:++d,name:a,recipe:b}),localStorage.saved_recipes=JSON.stringify(c),localStorage.recipe_id=d,this.app.alert('Recipe saved as "'+a+'".',"success",2e3)},ControlsWaiter.prototype.populate_load_recipes_list=function(){for(var a=document.getElementById("load-name"),b=a.options.length;b--;)a.remove(b);var c=localStorage.saved_recipes?JSON.parse(localStorage.saved_recipes):[];for(b=0;bend: "+e+"
              length: "+f},HighlighterWaiter.prototype.remove_highlights=function(){document.getElementById("input-highlighter").innerHTML="",document.getElementById("output-highlighter").innerHTML="",document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML=""},HighlighterWaiter.prototype.generate_highlight_list=function(){for(var a=this.app.get_recipe_config(),b=[],c=0;c=0)return!1;var d="[start_highlight]",e=/\[start_highlight\]/g,f="[end_highlight]",g=/\[end_highlight\]/g,h=a.value;if(1===c.length){if(c[0].end/g,">").replace(/\n/g," ").replace(e,'').replace(g,"")+" ",b.style.width=a.clientWidth+"px",b.innerHTML=h,b.scrollTop=a.scrollTop,b.scrollLeft=a.scrollLeft};var HTMLApp=function(a,b,c,d){this.categories=a,this.operations=b,this.dfavourites=c,this.doptions=d,this.options=Utils.extend({},d),this.chef=new Chef,this.manager=new Manager(this),this.auto_bake_=!1,this.progress=0,this.ing_id=0,window.chef=this.chef};HTMLApp.prototype.setup=function(){document.dispatchEvent(this.manager.appstart),this.initialise_splitter(),this.load_local_storage(),this.populate_operations_list(),this.manager.setup(),this.reset_layout(),this.set_compile_message(),this.load_URI_params()},HTMLApp.prototype.handle_error=function(a){console.error(a);var b=a.display_str||a.toString();this.alert(b,"danger",this.options.error_timeout,!this.options.show_errors)},HTMLApp.prototype.bake=function(a){var b;try{b=this.chef.bake(this.get_input(),this.get_recipe_config(),this.options,this.progress,a)}catch(a){this.handle_error(a)}b&&(b.error&&this.handle_error(b.error),this.options=b.options,this.dish_str="html"===b.type?Utils.strip_html_tags(b.result,!0):b.result,this.progress=b.progress,this.manager.recipe.update_breakpoint_indicator(b.progress),this.manager.output.set(b.result,b.type,b.duration),b.duration>this.options.auto_bake_threshold&&this.auto_bake_&&(this.manager.controls.set_auto_bake(!1),this.alert("Baking took longer than "+this.options.auto_bake_threshold+"ms, Auto Bake has been disabled.","warning",5e3)))},HTMLApp.prototype.auto_bake=function(){this.auto_bake_&&this.bake()},HTMLApp.prototype.silent_bake=function(){var a=(new Date).getTime(),b=this.get_recipe_config();return this.auto_bake_&&this.chef.silent_bake(b),(new Date).getTime()-a},HTMLApp.prototype.get_input=function(){var a=this.manager.input.get();return sessionStorage.setItem("input_length",a.length),sessionStorage.setItem("input",a),a},HTMLApp.prototype.set_input=function(a){sessionStorage.setItem("input_length",a.length),sessionStorage.setItem("input",a),this.manager.input.set(a)},HTMLApp.prototype.populate_operations_list=function(){document.body.appendChild(document.getElementById("edit-favourites"));for(var a="",b=0;b2?JSON.parse(localStorage.favourites):this.dfavourites;a=this.valid_favourites(a),this.save_favourites(a);var b=this.categories.filter(function(a){return"Favourites"===a.name})[0];b?b.ops=a:this.categories.unshift({name:"Favourites",ops:a})},HTMLApp.prototype.valid_favourites=function(a){for(var b=[],c=0;c=0?void this.alert("'"+a+"' is already in your favourites","info",2e3):(b.push(a),this.save_favourites(b),this.load_favourites(),this.populate_operations_list(),void this.manager.recipe.initialise_operation_drag_n_drop())},HTMLApp.prototype.load_URI_params=function(){this.query_string=function(a){if(""===a)return{};for(var b={},c=0;c"):d[e].value=a[b].args[e];a[b].disabled&&c.querySelector(".disable-icon").click(),a[b].breakpoint&&c.querySelector(".breakpoint").click(),this.progress=0}},HTMLApp.prototype.reset_layout=function(){this.column_splitter.setSizes([20,30,50]),this.io_splitter.setSizes([50,50]),this.manager.controls.adjust_width()},HTMLApp.prototype.set_compile_message=function(){var a=new Date,b=Utils.fuzzy_time(a.getTime()-window.compile_time),c='Last build: '+b.substr(0,1).toUpperCase()+b.substr(1)+" ago";""!==window.compile_message&&(c+=" - "+window.compile_message),c+="",document.getElementById("notice").innerHTML=c},HTMLApp.prototype.alert=function(a,b,c,d){var e=new Date;if(console.log("["+e.toLocaleString()+"] "+a),!d){b=b||"danger",c=c||0;var f=document.getElementById("alert"),g=document.getElementById("alert-content");f.classList.remove("alert-danger"),f.classList.remove("alert-warning"),f.classList.remove("alert-info"),f.classList.remove("alert-success"),f.classList.add("alert-"+b),"block"===f.style.display?g.innerHTML+="

              ["+e.toLocaleTimeString()+"] "+a:g.innerHTML="["+e.toLocaleTimeString()+"] "+a,$("#alert").stop(),f.style.display="block",f.style.opacity=1,c>0&&(clearTimeout(this.alert_timeout),this.alert_timeout=setTimeout(function(){$("#alert").slideUp(100)},c))}},HTMLApp.prototype.confirm=function(a,b,c,d){d=d||this,document.getElementById("confirm-title").innerHTML=a,document.getElementById("confirm-body").innerHTML=b,document.getElementById("confirm-modal").style.display="block",this.confirm_closed=!1,$("#confirm-modal").modal().one("show.bs.modal",function(a){this.confirm_closed=!1}.bind(this)).one("click","#confirm-yes",function(){this.confirm_closed=!0,c.bind(d)(!0),$("#confirm-modal").modal("hide")}.bind(this)).one("hide.bs.modal",function(a){this.confirm_closed||c.bind(d)(!1),this.confirm_closed=!0}.bind(this))},HTMLApp.prototype.alert_close_click=function(){document.getElementById("alert").style.display="none"},HTMLApp.prototype.state_change=function(a){this.auto_bake(),this.options.update_url&&(this.last_state_url=this.manager.controls.generate_state_url(!0,!0),window.history.replaceState({},"CyberChef",this.last_state_url))},HTMLApp.prototype.pop_state=function(a){window.location.href.split("#")[0]!==this.last_state_url&&this.load_URI_params()},HTMLApp.prototype.call_api=function(a,b,c,d,e){b=b||"POST",c=c||{},d=d||void 0,e=e||"application/json";var f=null,g=!1;return $.ajax({url:a,async:!1,type:b,data:c,dataType:d,contentType:e,success:function(a){g=!0,f=a},error:function(a){g=!1,f=a}}),{success:g,response:f}};var HTMLCategory=function(a,b){this.name=a,this.selected=b,this.op_list=[]};HTMLCategory.prototype.add_operation=function(a){this.op_list.push(a)},HTMLCategory.prototype.to_html=function(){for(var a="cat"+this.name.replace(/[\s\/-:_]/g,""),b="
              "+this.name+"
                ",c=0;c 
              ";switch(d+="
              ",this.type){case"string":case"binary_string":case"byte_array":d+="";break;case"short_string":case"binary_short_string":d+="";break;case"toggle_string":for(d+="
              ";break;case"number":d+="";break;case"boolean":d+="",this.disable_args&&this.manager.add_dynamic_listener("#"+this.id,"click",this.toggle_disable_args,this);break;case"option":for(d+="";break;case"populate_option":for(d+="",this.manager.add_dynamic_listener("#"+this.id,"change",this.populate_option_change,this);break;case"editable_option":for(d+="
              ",d+="",d+="",d+="
              ",this.manager.add_dynamic_listener("#sel-"+this.id,"change",this.editable_option_change,this);break;case"text":d+=""}return d+="
              "},HTMLIngredient.prototype.toggle_disable_args=function(a){for(var b,c=a.target,d=c.parentNode.parentNode,e=d.querySelectorAll(".arg-group"),f=0;f"),this.description&&(b+=""),b+=""},HTMLOperation.prototype.to_full_html=function(){for(var a="
              "+this.name+"
              ",b=0;b=0&&(this.name=this.name.slice(0,b)+""+this.name.slice(b,b+a.length)+""+this.name.slice(b+a.length)),this.description&&c>=0&&(this.description=this.description.slice(0,c)+""+this.description.slice(c,c+a.length)+""+this.description.slice(c+a.length))};var InputWaiter=function(a,b){this.app=a,this.manager=b,this.bad_keys=[16,17,18,19,20,27,33,34,35,36,37,38,39,40,44,91,92,93,112,113,114,115,116,117,118,119,120,121,122,123,144,145]};InputWaiter.prototype.get=function(){return document.getElementById("input-text").value},InputWaiter.prototype.set=function(a){document.getElementById("input-text").value=a,window.dispatchEvent(this.manager.statechange)},InputWaiter.prototype.set_input_info=function(a,b){var c=a.toString().length;c=c<2?2:c;var d=Utils.pad(a.toString(),c," ").replace(/ /g," "),e=Utils.pad(b.toString(),c," ").replace(/ /g," ");document.getElementById("input-info").innerHTML="length: "+d+"
              lines: "+e},InputWaiter.prototype.input_change=function(a){this.manager.highlighter.remove_highlights(),this.app.progress=0;var b=this.get(),c=b.count("\n")+1;this.set_input_info(b.length,c),this.bad_keys.indexOf(a.keyCode)<0&&window.dispatchEvent(this.manager.statechange)},InputWaiter.prototype.input_dragover=function(a){return"move"!==a.dataTransfer.effectAllowed&&(a.stopPropagation(),a.preventDefault(),void a.target.classList.add("dropping-file"))},InputWaiter.prototype.input_dragleave=function(a){a.stopPropagation(),a.preventDefault(),a.target.classList.remove("dropping-file")},InputWaiter.prototype.input_drop=function(a){if("move"===a.dataTransfer.effectAllowed)return!1;a.stopPropagation(),a.preventDefault();var b=a.target,c=a.dataTransfer.files[0],d=a.dataTransfer.getData("Text"),e=new FileReader,f="",g=0,h=20480,i=function(){f.length>1e5&&this.app.auto_bake_&&(this.manager.controls.set_auto_bake(!1),this.app.alert("Turned off Auto Bake as the input is large","warning",5e3)),this.set(f);var a=this.app.get_recipe_config();a[0]&&"From Hex"===a[0].op||(a.unshift({op:"From Hex",args:["Space"]}),this.app.set_recipe_config(a)),b.classList.remove("loading_file")}.bind(this),j=function(){if(g>=c.size)return void i();b.value="Processing... "+Math.round(g/c.size*100)+"%";var a=c.slice(g,g+h);e.readAsArrayBuffer(a)};e.onload=function(a){var b=new Uint8Array(e.result);f+=Utils.to_hex_fast(b),g+=h,j()},b.classList.remove("dropping-file"),c?(b.classList.add("loading_file"),j()):d&&this.set(d)},InputWaiter.prototype.clear_io_click=function(){this.manager.highlighter.remove_highlights(),document.getElementById("input-text").value="",document.getElementById("output-text").value="",document.getElementById("input-info").innerHTML="",document.getElementById("output-info").innerHTML="",document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML="",window.dispatchEvent(this.manager.statechange)};var Manager=function(a){this.app=a,this.appstart=new CustomEvent("appstart",{bubbles:!0}),this.operationadd=new CustomEvent("operationadd",{bubbles:!0}),this.operationremove=new CustomEvent("operationremove",{bubbles:!0}),this.oplistcreate=new CustomEvent("oplistcreate",{bubbles:!0}),this.statechange=new CustomEvent("statechange",{bubbles:!0}),this.window=new WindowWaiter(this.app),this.controls=new ControlsWaiter(this.app,this),this.recipe=new RecipeWaiter(this.app,this),this.ops=new OperationsWaiter(this.app,this),this.input=new InputWaiter(this.app,this),this.output=new OutputWaiter(this.app,this),this.options=new OptionsWaiter(this.app),this.highlighter=new HighlighterWaiter(this.app),this.seasonal=new SeasonalWaiter(this.app,this), +this.dynamic_handlers={},this.initialise_event_listeners()};Manager.prototype.setup=function(){this.recipe.initialise_operation_drag_n_drop(),this.controls.auto_bake_change(),this.seasonal.load()},Manager.prototype.initialise_event_listeners=function(){window.addEventListener("resize",this.window.window_resize.bind(this.window)),window.addEventListener("blur",this.window.window_blur.bind(this.window)),window.addEventListener("focus",this.window.window_focus.bind(this.window)),window.addEventListener("statechange",this.app.state_change.bind(this.app)),window.addEventListener("popstate",this.app.pop_state.bind(this.app)),document.getElementById("bake").addEventListener("click",this.controls.bake_click.bind(this.controls)),document.getElementById("auto-bake").addEventListener("change",this.controls.auto_bake_change.bind(this.controls)),document.getElementById("step").addEventListener("click",this.controls.step_click.bind(this.controls)),document.getElementById("clr-recipe").addEventListener("click",this.controls.clear_recipe_click.bind(this.controls)),document.getElementById("clr-breaks").addEventListener("click",this.controls.clear_breaks_click.bind(this.controls)),document.getElementById("save").addEventListener("click",this.controls.save_click.bind(this.controls)),document.getElementById("save-button").addEventListener("click",this.controls.save_button_click.bind(this.controls)),document.getElementById("save-link-recipe-checkbox").addEventListener("change",this.controls.slr_check_change.bind(this.controls)),document.getElementById("save-link-input-checkbox").addEventListener("change",this.controls.sli_check_change.bind(this.controls)),document.getElementById("load").addEventListener("click",this.controls.load_click.bind(this.controls)),document.getElementById("load-delete-button").addEventListener("click",this.controls.load_delete_click.bind(this.controls)),document.getElementById("load-name").addEventListener("change",this.controls.load_name_change.bind(this.controls)),document.getElementById("load-button").addEventListener("click",this.controls.load_button_click.bind(this.controls)),this.add_multi_event_listener("#save-text","keyup paste",this.controls.save_text_change,this.controls),this.add_multi_event_listener("#search","keyup paste search",this.ops.search_operations,this.ops),this.add_dynamic_listener(".op_list li.operation","dblclick",this.ops.operation_dblclick,this.ops),document.getElementById("edit-favourites").addEventListener("click",this.ops.edit_favourites_click.bind(this.ops)),document.getElementById("save-favourites").addEventListener("click",this.ops.save_favourites_click.bind(this.ops)),document.getElementById("reset-favourites").addEventListener("click",this.ops.reset_favourites_click.bind(this.ops)),this.add_dynamic_listener(".op_list .op-icon","mouseover",this.ops.op_icon_mouseover,this.ops),this.add_dynamic_listener(".op_list .op-icon","mouseleave",this.ops.op_icon_mouseleave,this.ops),this.add_dynamic_listener(".op_list","oplistcreate",this.ops.op_list_create,this.ops),this.add_dynamic_listener("li.operation","operationadd",this.recipe.op_add.bind(this.recipe)),this.add_dynamic_listener(".arg","keyup",this.recipe.ing_change,this.recipe),this.add_dynamic_listener(".arg","change",this.recipe.ing_change,this.recipe),this.add_dynamic_listener(".disable-icon","click",this.recipe.disable_click,this.recipe),this.add_dynamic_listener(".breakpoint","click",this.recipe.breakpoint_click,this.recipe),this.add_dynamic_listener("#rec_list li.operation","dblclick",this.recipe.operation_dblclick,this.recipe),this.add_dynamic_listener("#rec_list li.operation > div","dblclick",this.recipe.operation_child_dblclick,this.recipe),this.add_dynamic_listener("#rec_list .input-group .dropdown-menu a","click",this.recipe.dropdown_toggle_click,this.recipe),this.add_dynamic_listener("#rec_list","operationremove",this.recipe.op_remove.bind(this.recipe)),this.add_multi_event_listener("#input-text","keyup paste",this.input.input_change,this.input),document.getElementById("reset-layout").addEventListener("click",this.app.reset_layout.bind(this.app)),document.getElementById("clr-io").addEventListener("click",this.input.clear_io_click.bind(this.input)),document.getElementById("input-text").addEventListener("dragover",this.input.input_dragover.bind(this.input)),document.getElementById("input-text").addEventListener("dragleave",this.input.input_dragleave.bind(this.input)),document.getElementById("input-text").addEventListener("drop",this.input.input_drop.bind(this.input)),document.getElementById("input-text").addEventListener("scroll",this.highlighter.input_scroll.bind(this.highlighter)),document.getElementById("input-text").addEventListener("mouseup",this.highlighter.input_mouseup.bind(this.highlighter)),document.getElementById("input-text").addEventListener("mousemove",this.highlighter.input_mousemove.bind(this.highlighter)),this.add_multi_event_listener("#input-text","mousedown dblclick select",this.highlighter.input_mousedown,this.highlighter),document.getElementById("save-to-file").addEventListener("click",this.output.save_click.bind(this.output)),document.getElementById("switch").addEventListener("click",this.output.switch_click.bind(this.output)),document.getElementById("undo-switch").addEventListener("click",this.output.undo_switch_click.bind(this.output)),document.getElementById("maximise-output").addEventListener("click",this.output.maximise_output_click.bind(this.output)),document.getElementById("output-text").addEventListener("scroll",this.highlighter.output_scroll.bind(this.highlighter)),document.getElementById("output-text").addEventListener("mouseup",this.highlighter.output_mouseup.bind(this.highlighter)),document.getElementById("output-text").addEventListener("mousemove",this.highlighter.output_mousemove.bind(this.highlighter)),document.getElementById("output-html").addEventListener("mouseup",this.highlighter.output_html_mouseup.bind(this.highlighter)),document.getElementById("output-html").addEventListener("mousemove",this.highlighter.output_html_mousemove.bind(this.highlighter)),this.add_multi_event_listener("#output-text","mousedown dblclick select",this.highlighter.output_mousedown,this.highlighter),this.add_multi_event_listener("#output-html","mousedown dblclick select",this.highlighter.output_html_mousedown,this.highlighter),document.getElementById("options").addEventListener("click",this.options.options_click.bind(this.options)),document.getElementById("reset-options").addEventListener("click",this.options.reset_options_click.bind(this.options)),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox",this.options.switch_change.bind(this.options)),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox",this.options.set_word_wrap.bind(this.options)),this.add_dynamic_listener(".option-item input[type=number]","keyup",this.options.number_change,this.options),this.add_dynamic_listener(".option-item input[type=number]","change",this.options.number_change,this.options),this.add_dynamic_listener(".option-item select","change",this.options.select_change,this.options),document.getElementById("alert-close").addEventListener("click",this.app.alert_close_click.bind(this.app))},Manager.prototype.add_listeners=function(a,b,c,d){d=d||this,[].forEach.call(document.querySelectorAll(a),function(a){a.addEventListener(b,c.bind(d))})},Manager.prototype.add_multi_event_listener=function(a,b,c,d){for(var e=b.split(" "),f=0;f-1&&(this.manager.recipe.add_operation(b[c].innerHTML),this.app.auto_bake()))),13===a.keyCode)a.preventDefault();else if(40===a.keyCode)a.preventDefault(),b=document.querySelectorAll("#search-results li"),b.length&&(c=this.get_selected_op(b),c>-1&&b[c].classList.remove("selected-op"),c===b.length-1&&(c=-1),b[c+1].classList.add("selected-op"));else if(38===a.keyCode)a.preventDefault(),b=document.querySelectorAll("#search-results li"),b.length&&(c=this.get_selected_op(b),c>-1&&b[c].classList.remove("selected-op"),0===c&&(c=b.length),b[c-1].classList.add("selected-op"));else{for(var d=document.getElementById("search-results"),e=a.target,f=e.value;d.firstChild;)$(d.firstChild).popover("destroy"),d.removeChild(d.firstChild);if($("#categories .in").collapse("hide"),f){for(var g=this.filter_operations(f,!0),h="",i=0;i=0||h>=0){var i=new HTMLOperation(e,this.app.operations[e],this.app,this.manager);b&&i.highlight_search_string(a,g,h),g<0?c.push(i):d.push(i)}}return d.concat(c)},OperationsWaiter.prototype.get_selected_op=function(a){for(var b=0;blength: "+e+"
              lines: "+f,document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML=""},OutputWaiter.prototype.save_click=function(){var a=Utils.to_base64(this.app.dish_str),b=window.prompt("Please enter a filename:","download.dat");if(b){var c=document.createElement("a");c.setAttribute("href","data:application/octet-stream;base64;charset=utf-8,"+a),c.setAttribute("download",b),c.style.display="none",document.body.appendChild(c),c.click(),c.remove()}},OutputWaiter.prototype.switch_click=function(){this.switch_orig_data=this.manager.input.get(),document.getElementById("undo-switch").disabled=!1,this.app.set_input(this.app.dish_str)},OutputWaiter.prototype.undo_switch_click=function(){this.app.set_input(this.switch_orig_data),document.getElementById("undo-switch").disabled=!0},OutputWaiter.prototype.maximise_output_click=function(a){var b=a.target;b.textContent.indexOf("Max")>=0?(this.app.column_splitter.collapse(0),this.app.column_splitter.collapse(1),this.app.io_splitter.collapse(0),b.innerHTML=" Restore"):(this.app.reset_layout(),b.innerHTML=" Max")};var RecipeWaiter=function(a,b){this.app=a,this.manager=b,this.remove_intent=!1};RecipeWaiter.prototype.initialise_operation_drag_n_drop=function(){var a=document.getElementById("rec_list");Sortable.create(a,{group:"recipe",sort:!0,animation:0,delay:0,filter:".arg-input,.arg",setData:function(a,b){a.setData("Text",b.querySelector(".arg-title").textContent)},onEnd:function(a){this.remove_intent&&(a.item.remove(),a.target.dispatchEvent(this.manager.operationremove))}.bind(this)}),Sortable.utils.on(a,"dragover",function(){this.remove_intent=!1}.bind(this)),Sortable.utils.on(a,"dragleave",function(){this.remove_intent=!0,this.app.progress=0}.bind(this)),Sortable.utils.on(a,"touchend",function(b){var c=b.changedTouches[0],d=document.elementFromPoint(c.clientX,c.clientY);this.remove_intent=!a.contains(d)}.bind(this)),document.querySelector("#categories a").addEventListener("dragover",this.fav_dragover.bind(this)),document.querySelector("#categories a").addEventListener("dragleave",this.fav_dragleave.bind(this)),document.querySelector("#categories a").addEventListener("drop",this.fav_drop.bind(this))},RecipeWaiter.prototype.create_sortable_seed_list=function(a){Sortable.create(a,{group:{name:"recipe",pull:"clone",put:!1},sort:!1,setData:function(a,b){a.setData("Text",b.textContent)},onStart:function(a){$(a.item).popover("destroy"),a.item.setAttribute("data-toggle","popover-disabled")},onEnd:this.op_sort_end.bind(this)})},RecipeWaiter.prototype.op_sort_end=function(a){return this.remove_intent?void("rec_list"===a.item.parentNode.id&&a.item.remove()):($(a.clone).popover(),$(a.clone).children("[data-toggle=popover]").popover(),void("rec_list"===a.item.parentNode.id&&(this.build_recipe_operation(a.item),a.item.dispatchEvent(this.manager.operationadd))))},RecipeWaiter.prototype.fav_dragover=function(a){return"move"===a.dataTransfer.effectAllowed&&(a.stopPropagation(),a.preventDefault(),void(a.target.className&&a.target.className.indexOf("category-title")>-1?a.target.classList.add("favourites-hover"):a.target.parentNode.className&&a.target.parentNode.className.indexOf("category-title")>-1?a.target.parentNode.classList.add("favourites-hover"):a.target.parentNode.parentNode.className&&a.target.parentNode.parentNode.className.indexOf("category-title")>-1&&a.target.parentNode.parentNode.classList.add("favourites-hover")))},RecipeWaiter.prototype.fav_dragleave=function(a){a.stopPropagation(),a.preventDefault(),document.querySelector("#categories a").classList.remove("favourites-hover")},RecipeWaiter.prototype.fav_drop=function(a){a.stopPropagation(),a.preventDefault(),a.target.classList.remove("favourites-hover");var b=a.dataTransfer.getData("Text");this.app.add_favourite(b)},RecipeWaiter.prototype.ing_change=function(){window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.disable_click=function(a){var b=a.target;"false"===b.getAttribute("disabled")?(b.setAttribute("disabled","true"),b.classList.add("disable-icon-selected"),b.parentNode.parentNode.classList.add("disabled")):(b.setAttribute("disabled","false"),b.classList.remove("disable-icon-selected"),b.parentNode.parentNode.classList.remove("disabled")),this.app.progress=0,window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.breakpoint_click=function(a){var b=a.target;"false"===b.getAttribute("break")?(b.setAttribute("break","true"),b.classList.add("breakpoint-selected")):(b.setAttribute("break","false"),b.classList.remove("breakpoint-selected")),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.operation_dblclick=function(a){a.target.remove(),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.operation_child_dblclick=function(a){a.target.parentNode.remove(),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.get_config=function(){for(var a,b,c,d,e,f=[],g=document.querySelectorAll("#rec_list li.operation"),h=0;h",this.ing_change()},RecipeWaiter.prototype.op_add=function(a){window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.op_remove=function(a){window.dispatchEvent(this.manager.statechange)};var SeasonalWaiter=function(a,b){this.app=a,this.manager=b};SeasonalWaiter.prototype.load=function(){var a=new Date;11===a.getMonth()&&a.getDate()>12&&(this.app.options.snow=!1,this.create_snow_option(),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox[option='snow']",this.let_it_snow.bind(this)),window.addEventListener("resize",this.let_it_snow.bind(this)),this.manager.add_listeners(".btn","click",this.shake_off_snow,this),25===a.getDate()&&this.let_it_snow()),this.kkeys=[],window.addEventListener("keydown",this.konami_code_listener.bind(this))},SeasonalWaiter.prototype.insert_spider_icons=function(){var a="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVQ4y2NgGJaAmYGBgVnf0oKJgYGBobWtXamqqoYTn2I4CI+LTzM2NTulpKbu+vPHz2dV5RWlluZmi3j5+KqFJSSEzpw8uQPdAEYYIzo5Kfjrl28rWFlZzjAzMYuEBQao3Lh+g+HGvbsMzExMDN++fWf4/PXLBzY2tqYNK1f2+4eHM2xcuRLigsT09Igf3384MTExbf767etBI319jU8fPsi+//jx/72HDxh5uLkZ7ty7y/Dz1687Avz8n2UUFR3Z2NjOySoqfmdhYGBg+PbtuwI7O8e5H79+8X379t357PnzYo+ePP7y6cuXc9++f69nYGRsvf/w4XdtLS2R799/bBUWFHr57sP7Jbs3b/ZkzswvUP3165fZ7z9//r988WIVAyPDr8tXr576+u3bpb9//7YwMjKeV1dV41NWVGoVEhDgPH761DJREeHaz1+/lqlpafUx6+jrRfz4+fPy+w8fTu/fsf3uw7t3L39+//4cv7DwGQYGhpdPbt9m4BcRFlNWVJC4fuvWASszs4C379792Ldt2xZBUdEdDP5hYSqQGIjDGa965uYKCalpZQwMDAxhMTG9DAwMDLaurhIkJY7A8IgGBgYGBgd3Dz2yUpeFo6O4rasrA9T24ZRxAAMTwMpgEJwLAAAAAElFTkSuQmCC",b="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACYVBMVEUAAAAcJSU2Pz85QkM9RUWEhIWMjI2MkJEcJSU2Pz85QkM9RUWWlpc9RUVXXl4cJSU2Pz85QkM8REU9RUVRWFh6ens9RUVCSkpNVFRdY2McJSU5QkM7REQ9RUVGTk5KUlJQVldcY2Rla2uTk5WampscJSVUWltZX2BrcHF1e3scJSUjLCw9RUVASEhFTU1HTk9bYWJeZGRma2xudHV1eHiZmZocJSUyOjpJUFFQVldSWlpTWVpXXl5YXl5rb3B9fX6RkZIcJSUmLy8tNTU9RUVFTU1IT1BOVldRV1hTWlp0enocJSUfKChJUFBWXV1hZ2hnbGwcJSVETExLUlJLU1NNVVVPVlZYXl9cY2RiaGlobW5rcXFyd3h0eHgcJSUpMTFDS0tQV1dRV1hSWFlWXF1bYWJma2tobW5uc3SsrK0cJSVJUFBMVFROVlZVW1xZX2BdYmNhZ2hjaGhla2tqcHBscHE4Pz9KUlJRWVlSWVlXXF1aYGFbYWFfZWZlampqbW4cJSUgKSkiKysuNjY0PD01PT07QkNES0tHTk5JUFBMUlNMU1NOU1ROVVVPVVZRVlZRV1dSWVlWXFxXXV5aX2BbYWFbYWJcYmJcYmNcY2RdYmNgZmZhZmdkaWpkampkamtlamtla2tma2tma2xnbG1obW5pbG1pb3Bqb3Brb3BtcXJudHVvcHFvcXJvc3NwcXNwdXVxc3RzeXl1eXp2eXl3ent6e3x+gYKAhISBg4SKi4yLi4yWlpeampudnZ6fn6CkpaanqKiur6+vr7C4uLm6urq6u7u8vLy9vb3Av8DR0dL2b74UAAAAgHRSTlMAEBAQEBAQECAgICAgMDBAQEBAQEBAUFBQUGBgYGBgYGBgYGBgcHBwcHCAgICAgICAgICAgICPj4+Pj4+Pj4+Pj5+fn5+fn5+fn5+vr6+vr6+/v7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f7+/v7+/v7+/v78x6RlYAAAGBSURBVDjLY2AYWUCSgUGAk4GBTdlUhQebvP7yjIgCPQbWzBMnjx5wwJSX37Rwfm1isqj9/iPHTuxYlyeMJi+yunfptBkZOw/uWj9h3vatcycu8eRGlldb3Vsts3ph/cFTh7fN3bCoe2Vf8+TZoQhTvBa6REozVC7cuPvQnmULJm1e2z+308eyJieEBSLPXbKQIUqQIczk+N6eNaumtnZMaWhaHM89m8XVCqJA02Y5w0xmga6yfVsamtrN4xoXNzS0JTHkK3CXy4EVFMumcxUy2LbENTVkZfEzMDAudtJyTmNwS2XQreAFyvOlK9louDNVaXurmjkGgnTMkWDgXswtNouFISEX6Awv+RihQi5OcYY4DtVARpCCFCMGhiJ1hjwFBpagEAaWEpFoC0WQOCOjFMRRwXYMDB4BDLJ+QLYsg7GBGjtasLnEMjCIrWBgyAZ7058FI9x1SoFEnTCDsCyIhynPILYYSFgbYpUDA5bpQBluXzxpI1yYAbd2sCMYRhwAAHB9ZPztbuMUAAAAAElFTkSuQmCC",c="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";document.querySelector("link[rel=icon]").setAttribute("href","data:image/png;base64,"+a),document.querySelector("#bake img").setAttribute("src","data:image/png;base64,"+b),document.querySelector(".about-img-left").setAttribute("src","data:image/png;base64,"+c)},SeasonalWaiter.prototype.insert_spider_text=function(){document.title=document.title.replace(/Cyber/g,"Spider"),SeasonalWaiter.tree_walk(document.body,function(a){3===a.nodeType&&(a.nodeValue=a.nodeValue.replace(/Cyber/g,"Spider"))},!0),SeasonalWaiter.tree_walk(document.getElementById("bake-group"),function(a){3===a.nodeType&&(a.nodeValue=a.nodeValue.replace(/Bake/g,"Spin"))},!0),document.querySelector("#recipe .title").innerHTML="Web"},SeasonalWaiter.prototype.create_snow_option=function(){var a=document.getElementById("options-body"),b=document.createElement("div");b.className="option-item",b.innerHTML=" Let it snow",a.appendChild(b),this.manager.options.load()},SeasonalWaiter.prototype.let_it_snow=function(){if($(document).snowfall("clear"),this.app.options.snow){var a={},b=navigator.userAgent.match(/Firefox\/(\d\d?)/);a=b&&parseInt(b[1],10)<30?{flakeCount:10,flakeColor:"#fff",flakePosition:"absolute",minSize:1,maxSize:2,minSpeed:1,maxSpeed:5,round:!1,shadow:!1,collection:!1,collectionHeight:20,deviceorientation:!0}:{flakeCount:35,flakeColor:"#fff",flakePosition:"absolute",minSize:5,maxSize:8,minSpeed:1,maxSpeed:5,round:!0,shadow:!0,collection:".btn",collectionHeight:20,deviceorientation:!0},$(document).snowfall(a)}},SeasonalWaiter.prototype.shake_off_snow=function(a){for(var b=a.target,c=b.getBoundingClientRect(),d=document.querySelectorAll("canvas.snowfall-canvas"),e=null,f=function(){h.clearRect(0,0,e.width,e.height),$(this).fadeIn()},g=0;g6e4&&this.app.silent_bake()};var main=function(){var a=["To Base64","From Base64","To Hex","From Hex","To Hexdump","From Hexdump","URL Decode","Regular expression","Entropy","Fork"],b={update_url:!0,show_highlighter:!0,treat_as_utf8:!0,word_wrap:!0,show_errors:!0,error_timeout:4e3,auto_bake_threshold:200,attempt_highlight:!0,snow:!1};document.removeEventListener("DOMContentLoaded",main,!1),window.app=new HTMLApp(Categories,OperationConfig,a,b),window.app.setup()};window.console=console||{log:function(){},error:function(){}},window.compile_time=moment.tz("Tue Dec 20 2016 20:17:20","ddd MMM D YYYY HH:mm:ss","UTC").valueOf(),window.compile_message="Merry Christmas! Have a look in the options panel for some festive flavour.",document.addEventListener("DOMContentLoaded",main,!1); \ No newline at end of file diff --git a/build/prod/images/maximise-16x16.png b/build/prod/images/maximise-16x16.png new file mode 100755 index 0000000000000000000000000000000000000000..be47e6ee11a3d4b555254345ac2225b837fd91ae GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^u-ntcF~s8Z*~^Apha3c2AL{RH?m8)WsanH-qH|=nA`8>Bs274x z?-raDJ6yIqv&KM&=Zw93OlKRt|YA&n} zXt{IoiqkrYKeK1)9(La48PC0gwS1S<0mk(@>dBdJ79Y*#NZ5GPyQe;y!ydJozf)z{dE$(p>3OC+FuDqKAcLo?pUXO@geCyl5nMn3 literal 0 HcmV?d00001 diff --git a/build/prod/index.html b/build/prod/index.html index abd8bafb..c1d70a4f 100755 --- a/build/prod/index.html +++ b/build/prod/index.html @@ -18,4 +18,4 @@ See the License for the specific language governing permissions and limitations under the License. --> -CyberChef Edit
              Operations
                Recipe
                  Input
                  Output
                  \ No newline at end of file +CyberChef Edit
                  Operations
                    Recipe
                      Input
                      Output
                      \ No newline at end of file diff --git a/build/prod/scripts.js b/build/prod/scripts.js index 5ce0d6ba..6e5e989d 100755 --- a/build/prod/scripts.js +++ b/build/prod/scripts.js @@ -52,7 +52,7 @@ function X509(){this.subjectPublicKeyRSA=null,this.subjectPublicKeyRSA_hN=null,t if(function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b=a.length,c=_.type(a);return"function"!==c&&!_.isWindow(a)&&(!(1!==a.nodeType||!b)||("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a))}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(ha.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=oa[a]={};return _.each(a.match(na)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ua,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:ta.test(c)?_.parseJSON(c):c)}catch(a){}sa.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Ka.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;c")).appendTo(b.documentElement),b=Na[0].contentDocument,b.write(),b.close(),c=t(a,b),Na.detach()),Oa[a]=c),c}function v(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||_.contains(a.ownerDocument,a)||(g=_.style(a,b)),Qa.test(g)&&Pa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function w(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function x(a,b){if(b in a)return b;for(var c=b[0].toUpperCase()+b.slice(1),d=b,e=Xa.length;e--;)if(b=Xa[e]+c,b in a)return b;return d}function y(a,b,c){var d=Ta.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=_.css(a,c+wa[f],!0,e)),d?("content"===c&&(g-=_.css(a,"padding"+wa[f],!0,e)),"margin"!==c&&(g-=_.css(a,"border"+wa[f]+"Width",!0,e))):(g+=_.css(a,"padding"+wa[f],!0,e),"padding"!==c&&(g+=_.css(a,"border"+wa[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g="border-box"===_.css(a,"boxSizing",!1,f);if(e<=0||null==e){if(e=v(a,b,f),(e<0||null==e)&&(e=a.style[b]),Qa.test(e))return e;d=g&&(Y.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a,b){for(var c,d,e,f=[],g=0,h=a.length;g=0&&c=0},isPlainObject:function(a){return"object"===_.type(a)&&!a.nodeType&&!_.isWindow(a)&&!(a.constructor&&!X.call(a.constructor.prototype,"isPrototypeOf"))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?V[W.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=_.trim(a),a&&(1===a.indexOf("use strict")?(b=Z.createElement("script"),b.text=a,Z.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(ba,"ms-").replace(ca,da)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.length,h=c(a);if(d){if(h)for(;fw.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[N]=!0,a}function e(a){var b=G.createElement("div");try{return!!a(b)}catch(a){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=a.length;d--;)w.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return d(function(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function k(a){return a&&typeof a.getElementsByTagName!==V&&a}function l(){}function m(a){for(var b=0,c=a.length,d="";b1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,c,d){for(var e=0,f=c.length;e-1&&(d[j]=!(g[j]=l))}}else t=q(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function s(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return ba.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==C)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];h1&&o(k),h>1&&m(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ia,"$1"),c,h0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],r=[],s=C,t=d||f&&w.find.TAG("*",j),u=P+=null==s?1:Math.random()||.1,v=t.length;for(j&&(C=g!==G&&g);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0;m=a[l++];)if(m(k,g,h)){i.push(k);break}j&&(P=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,r,g,h);if(d){if(n>0)for(;o--;)p[o]||r[o]||(r[o]=Z.call(i));r=q(r)}_.apply(i,r),j&&!d&&r.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(P=u,C=s),p};return e?d(g):g}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P=0,Q=0,R=c(),S=c(),T=c(),U=function(a,b){return a===b&&(E=!0),0},V="undefined",W=1<<31,X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,aa=Y.slice,ba=Y.indexOf||function(a){for(var b=0,c=this.length;b+~]|"+da+")"+da+"*"),la=new RegExp("="+da+"*([^\\]'\"]*?)"+da+"*\\]","g"),ma=new RegExp(ha),na=new RegExp("^"+fa+"$"),oa={ID:new RegExp("^#("+ea+")"),CLASS:new RegExp("^\\.("+ea+")"),TAG:new RegExp("^("+ea.replace("w","w*")+")"),ATTR:new RegExp("^"+ga),PSEUDO:new RegExp("^"+ha),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+da+"*(even|odd|(([+-]|)(\\d*)n|)"+da+"*(?:([+-]|)"+da+"*(\\d+)|))"+da+"*\\)|)","i"),bool:new RegExp("^(?:"+ca+")$","i"),needsContext:new RegExp("^"+da+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+da+"*((?:-\\d)?\\d*)"+da+"*\\)|)(?=[^-]|$)","i")},pa=/^(?:input|select|textarea|button)$/i,qa=/^h\d$/i,ra=/^[^{]+\{\s*\[native \w/,sa=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ta=/[+~]/,ua=/'|\\/g,va=new RegExp("\\\\([\\da-f]{1,6}"+da+"?|("+da+")|.)","ig"),wa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{_.apply(Y=aa.call(O.childNodes),O.childNodes),Y[O.childNodes.length].nodeType}catch(a){_={apply:Y.length?function(a,b){$.apply(a,aa.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}v=b.support={},y=b.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},F=b.setDocument=function(a){var b,c=a?a.ownerDocument||a:O,d=c.defaultView;return c!==G&&9===c.nodeType&&c.documentElement?(G=c,H=c.documentElement,I=!y(c),d&&d!==d.top&&(d.addEventListener?d.addEventListener("unload",function(){F()},!1):d.attachEvent&&d.attachEvent("onunload",function(){F()})),v.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),v.getElementsByTagName=e(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),v.getElementsByClassName=ra.test(c.getElementsByClassName)&&e(function(a){return a.innerHTML="
                      ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),v.getById=e(function(a){return H.appendChild(a).id=N,!c.getElementsByName||!c.getElementsByName(N).length}),v.getById?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&I){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(va,wa);return function(a){return a.getAttribute("id")===b}}):(delete w.find.ID,w.filter.ID=function(a){var b=a.replace(va,wa);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b}}),w.find.TAG=v.getElementsByTagName?function(a,b){if(typeof b.getElementsByTagName!==V)return b.getElementsByTagName(a)}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.CLASS=v.getElementsByClassName&&function(a,b){if(typeof b.getElementsByClassName!==V&&I)return b.getElementsByClassName(a)},K=[],J=[],(v.qsa=ra.test(c.querySelectorAll))&&(e(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&J.push("[*^$]="+da+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||J.push("\\["+da+"*(?:value|"+ca+")"),a.querySelectorAll(":checked").length||J.push(":checked")}),e(function(a){var b=c.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&J.push("name"+da+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||J.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),J.push(",.*:")})),(v.matchesSelector=ra.test(L=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&e(function(a){v.disconnectedMatch=L.call(a,"div"),L.call(a,"[s!='']:x"),K.push("!=",ha)}),J=J.length&&new RegExp(J.join("|")),K=K.length&&new RegExp(K.join("|")),b=ra.test(H.compareDocumentPosition),M=b||ra.test(H.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=b?function(a,b){if(a===b)return E=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!v.sortDetached&&b.compareDocumentPosition(a)===d?a===c||a.ownerDocument===O&&M(O,a)?-1:b===c||b.ownerDocument===O&&M(O,b)?1:D?ba.call(D,a)-ba.call(D,b):0:4&d?-1:1)}:function(a,b){if(a===b)return E=!0,0;var d,e=0,f=a.parentNode,h=b.parentNode,i=[a],j=[b];if(!f||!h)return a===c?-1:b===c?1:f?-1:h?1:D?ba.call(D,a)-ba.call(D,b):0;if(f===h)return g(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?g(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},c):G},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if((a.ownerDocument||a)!==G&&F(a),c=c.replace(la,"='$1']"),v.matchesSelector&&I&&(!K||!K.test(c))&&(!J||!J.test(c)))try{var d=L.call(a,c);if(d||v.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(a){}return b(c,G,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!==G&&F(a),M(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!==G&&F(a);var c=w.attrHandle[b.toLowerCase()],d=c&&X.call(w.attrHandle,b.toLowerCase())?c(a,b,!I):void 0;return void 0!==d?d:v.attributes||!I?a.getAttribute(b):(d=a.getAttributeNode(b))&&d.specified?d.value:null},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(E=!v.detectDuplicates,D=!v.sortStable&&a.slice(0),a.sort(U),E){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return D=null,a},x=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=x(b);return c},w=b.selectors={cacheLength:50,createPseudo:d,match:oa,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(va,wa),a[3]=(a[3]||a[4]||a[5]||"").replace(va,wa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return oa.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&ma.test(c)&&(b=z(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(va,wa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=R[a+" "];return b||(b=new RegExp("(^|"+da+")"+a+"("+da+"|$)"))&&R(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:!c||(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f+" ").indexOf(d)>-1:"|="===c&&(f===d||f.slice(0,d.length+1)===d+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===P&&j[1],m=j[0]===P&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[P,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===P)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[P,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,c){var e,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||b.error("unsupported pseudo: "+a);return f[N]?f(c):f.length>1?(e=[a,a,"",c],w.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=ba.call(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=A(a.replace(ia,"$1"));return e[N]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:d(function(a){return na.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(va,wa).toLowerCase(),function(b){var c;do if(c=I?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===H},focus:function(a){return a===G.activeElement&&(!G.hasFocus||G.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return qa.test(a.nodeName)},input:function(a){return pa.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:j(function(){return[0]}),last:j(function(a,b){return[b-1]}),eq:j(function(a,b,c){return[c<0?c+b:c]}),even:j(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:j(function(a,b,c){for(var d=c<0?c+b:c;++d2&&"ID"===(g=f[0]).type&&v.getById&&9===b.nodeType&&I&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(va,wa),b)||[])[0],!b)return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=oa.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(va,wa),ta.test(f[0].type)&&k(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return _.apply(c,d),c;break}}return(j||A(a,l))(d,b,!I,c,ta.test(a)&&k(b.parentNode)||b),c},v.sortStable=N.split("").sort(U).join("")===N,v.detectDuplicates=!!E,F(),v.sortDetached=e(function(a){return 1&a.compareDocumentPosition(G.createElement("div"))}),e(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),v.attributes&&e(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(ca,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);_.find=ea,_.expr=ea.selectors,_.expr[":"]=_.expr.pseudos,_.unique=ea.uniqueSort,_.text=ea.getText,_.isXMLDoc=ea.isXML,_.contains=ea.contains;var fa=_.expr.match.needsContext,ga=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,ha=/^.[^:#\[\.,]*$/;_.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?_.find.matchesSelector(d,a)?[d]:[]:_.find.matches(a,_.grep(b,function(a){return 1===a.nodeType}))},_.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(_(a).filter(function(){for(b=0;b1?_.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(d(this,a||[],!1))},not:function(a){return this.pushStack(d(this,a||[],!0))},is:function(a){return!!d(this,"string"==typeof a&&fa.test(a)?_(a):a||[],!1).length}});var ia,ja=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ka=_.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:ja.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||ia).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof _?b[0]:b,_.merge(this,_.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:Z,!0)),ga.test(c[1])&&_.isPlainObject(b))for(c in b)_.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=Z.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=Z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):_.isFunction(a)?"undefined"!=typeof ia.ready?ia.ready(a):a(_):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),_.makeArray(a,this))};ka.prototype=_.fn,ia=_(Z);var la=/^(?:parents|prev(?:Until|All))/,ma={children:!0,contents:!0,next:!0,prev:!0};_.extend({dir:function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&_(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),_.fn.extend({has:function(a){var b=_(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&_.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?_.unique(f):f)},index:function(a){return a?"string"==typeof a?U.call(_(a),this[0]):U.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(_.unique(_.merge(this.get(),_(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),_.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return _.dir(a,"parentNode")},parentsUntil:function(a,b,c){return _.dir(a,"parentNode",c)},next:function(a){return e(a,"nextSibling")},prev:function(a){return e(a,"previousSibling")},nextAll:function(a){return _.dir(a,"nextSibling")},prevAll:function(a){return _.dir(a,"previousSibling")},nextUntil:function(a,b,c){return _.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return _.dir(a,"previousSibling",c)},siblings:function(a){return _.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return _.sibling(a.firstChild)},contents:function(a){return a.contentDocument||_.merge([],a.childNodes)}},function(a,b){_.fn[a]=function(c,d){var e=_.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=_.filter(d,e)),this.length>1&&(ma[a]||_.unique(e),la.test(a)&&e.reverse()),this.pushStack(e)}});var na=/\S+/g,oa={};_.Callbacks=function(a){a="string"==typeof a?oa[a]||f(a):_.extend({},a);var b,c,d,e,g,h,i=[],j=!a.once&&[],k=function(f){for(b=a.memory&&f,c=!0,h=e||0,e=0,g=i.length,d=!0;i&&h-1;)i.splice(c,1),d&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return a?_.inArray(a,i)>-1:!(!i||!i.length)},empty:function(){return i=[],g=0,this},disable:function(){return i=j=b=void 0,this},disabled:function(){return!i},lock:function(){return j=void 0,b||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return!i||c&&!j||(b=b||[],b=[a,b.slice?b.slice():b],d?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!c}};return l},_.extend({Deferred:function(a){var b=[["resolve","done",_.Callbacks("once memory"),"resolved"],["reject","fail",_.Callbacks("once memory"),"rejected"],["notify","progress",_.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return _.Deferred(function(c){_.each(b,function(b,f){var g=_.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&_.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?_.extend(a,d):d}},e={};return d.pipe=d.then,_.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b,c,d,e=0,f=R.call(arguments),g=f.length,h=1!==g||a&&_.isFunction(a.promise)?g:0,i=1===h?a:_.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?R.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);e0||(pa.resolveWith(Z,[_]),_.fn.triggerHandler&&(_(Z).triggerHandler("ready"),_(Z).off("ready"))))}}),_.ready.promise=function(b){return pa||(pa=_.Deferred(),"complete"===Z.readyState?setTimeout(_.ready):(Z.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1))),pa.promise(b)},_.ready.promise();var qa=_.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===_.type(c)){e=!0;for(h in c)_.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,_.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(_(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){sa.remove(this,a)})}}),_.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=ra.get(a,b),c&&(!d||_.isArray(c)?d=ra.access(a,b,_.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=_.queue(a,b),d=c.length,e=c.shift(),f=_._queueHooks(a,b),g=function(){_.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return ra.get(a,c)||ra.access(a,c,{empty:_.Callbacks("once memory").add(function(){ra.remove(a,[b+"queue",c])})})}}),_.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",Y.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var za="undefined";Y.focusinBubbles="onfocusin"in a;var Aa=/^key/,Ba=/^(?:mouse|pointer|contextmenu)|click/,Ca=/^(?:focusinfocus|focusoutblur)$/,Da=/^([^.]*)(?:\.(.+)|)$/;_.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=ra.get(a);if(q)for(c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=_.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return typeof _!==za&&_.event.triggered!==b.type?_.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(na)||[""],j=b.length;j--;)h=Da.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=_.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=_.event.special[n]||{},k=_.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&_.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),_.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=ra.hasData(a)&&ra.get(a);if(q&&(i=q.events)){for(b=(b||"").match(na)||[""],j=b.length;j--;)if(h=Da.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=_.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||_.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)_.event.remove(a,n+b[j],c,d,!0);_.isEmptyObject(i)&&(delete q.handle,ra.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m=[d||Z],n=X.call(b,"type")?b.type:b,o=X.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||Z,3!==d.nodeType&&8!==d.nodeType&&!Ca.test(n+_.event.triggered)&&(n.indexOf(".")>=0&&(o=n.split("."),n=o.shift(),o.sort()),j=n.indexOf(":")<0&&"on"+n,b=b[_.expando]?b:new _.Event(n,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=o.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:_.makeArray(c,[b]),l=_.event.special[n]||{},e||!l.trigger||l.trigger.apply(d,c)!==!1)){if(!e&&!l.noBubble&&!_.isWindow(d)){for(i=l.delegateType||n,Ca.test(i+n)||(g=g.parentNode);g;g=g.parentNode)m.push(g),h=g;h===(d.ownerDocument||Z)&&m.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=m[f++])&&!b.isPropagationStopped();)b.type=f>1?i:l.bindType||n,k=(ra.get(g,"events")||{})[b.type]&&ra.get(g,"handle"),k&&k.apply(g,c),k=j&&g[j],k&&k.apply&&_.acceptData(g)&&(b.result=k.apply(g,c),b.result===!1&&b.preventDefault());return b.type=n,e||b.isDefaultPrevented()||l._default&&l._default.apply(m.pop(),c)!==!1||!_.acceptData(d)||j&&_.isFunction(d[n])&&!_.isWindow(d)&&(h=d[j],h&&(d[j]=null),_.event.triggered=n,d[n](),_.event.triggered=void 0,h&&(d[j]=h)),b.result}},dispatch:function(a){a=_.event.fix(a);var b,c,d,e,f,g=[],h=R.call(arguments),i=(ra.get(this,"events")||{})[a.type]||[],j=_.event.special[a.type]||{};if(h[0]=a,a.delegateTarget=this,!j.preDispatch||j.preDispatch.call(this,a)!==!1){for(g=_.event.handlers.call(this,a,i),b=0;(e=g[b++])&&!a.isPropagationStopped();)for(a.currentTarget=e.elem,c=0;(f=e.handlers[c++])&&!a.isImmediatePropagationStopped();)a.namespace_re&&!a.namespace_re.test(f.namespace)||(a.handleObj=f,a.data=f.data,d=((_.event.special[f.origType]||{}).handle||f.handler).apply(e.elem,h),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return j.postDispatch&&j.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;c=0:_.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,Fa=/<([\w:]+)/,Ga=/<|&#?\w+;/,Ha=/<(?:script|style|link)/i,Ia=/checked\s*(?:[^=]|=\s*.checked.)/i,Ja=/^$|\/(?:java|ecma)script/i,Ka=/^true\/(.*)/,La=/^\s*\s*$/g,Ma={option:[1,""],thead:[1,"","
                      "],col:[2,"","
                      "],tr:[2,"","
                      "],td:[3,"","
                      "],_default:[0,"",""]};Ma.optgroup=Ma.option,Ma.tbody=Ma.tfoot=Ma.colgroup=Ma.caption=Ma.thead,Ma.th=Ma.td,_.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=_.contains(a.ownerDocument,a);if(!(Y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||_.isXMLDoc(a)))for(g=r(h),f=r(a),d=0,e=f.length;d0&&p(g,!i&&r(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;m")+h[2],j=h[0];j--;)f=f.lastChild;_.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));for(k.textContent="",m=0;e=l[m++];)if((!d||_.inArray(e,d)===-1)&&(i=_.contains(e.ownerDocument,e),f=r(k.appendChild(e),"script"),i&&p(f),c))for(j=0;e=f[j++];)Ja.test(e.type||"")&&c.push(e);return k},cleanData:function(a){for(var b,c,d,e,f=_.event.special,g=0;void 0!==(c=a[g]);g++){if(_.acceptData(c)&&(e=c[ra.expando],e&&(b=ra.cache[e]))){if(b.events)for(d in b.events)f[d]?_.event.remove(c,d):_.removeEvent(c,d,b.handle);ra.cache[e]&&delete ra.cache[e]}delete sa.cache[c[sa.expando]]}}}),_.fn.extend({text:function(a){return qa(this,function(a){return void 0===a?_.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?_.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||_.cleanData(r(c)),c.parentNode&&(b&&_.contains(c.ownerDocument,c)&&p(r(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(_.cleanData(r(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return _.clone(this,a,b)})},html:function(a){return qa(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Ha.test(a)&&!Ma[(Fa.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ea,"<$1>");try{for(;c1&&"string"==typeof m&&!Y.checkClone&&Ia.test(m))return this.each(function(c){var d=k.eq(c);p&&(a[0]=m.call(this,c,d.html())),d.domManip(a,b)});if(j&&(c=_.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(e=_.map(r(c,"script"),n),f=e.length;i1)},show:function(){return B(this,!0)},hide:function(){return B(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){xa(this)?_(this).show():_(this).hide()})}}),_.Tween=C,C.prototype={constructor:C,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(_.cssNumber[c]?"":"px")},cur:function(){var a=C.propHooks[this.prop];return a&&a.get?a.get(this):C.propHooks._default.get(this)},run:function(a){var b,c=C.propHooks[this.prop];return this.options.duration?this.pos=b=_.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):C.propHooks._default.set(this),this}},C.prototype.init.prototype=C.prototype,C.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=_.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){_.fx.step[a.prop]?_.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[_.cssProps[a.prop]]||_.cssHooks[a.prop])?_.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},C.propHooks.scrollTop=C.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},_.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},_.fx=C.prototype.init,_.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=new RegExp("^(?:([+-])=|)("+va+")([a-z%]*)$","i"),ab=/queueHooks$/,bb=[G],cb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=_a.exec(b),f=e&&e[3]||(_.cssNumber[a]?"":"px"),g=(_.cssNumber[a]||"px"!==f&&+d)&&_a.exec(_.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,_.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};_.Animation=_.extend(I,{tweener:function(a,b){_.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;d1)},removeAttr:function(a){return this.each(function(){_.removeAttr(this,a)})}}),_.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===za?_.prop(a,b,c):(1===f&&_.isXMLDoc(a)||(b=b.toLowerCase(),d=_.attrHooks[b]||(_.expr.match.bool.test(b)?eb:db)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=_.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void _.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(na);if(f&&1===a.nodeType)for(;c=f[e++];)d=_.propFix[c]||c,_.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!Y.radioValue&&"radio"===b&&_.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),eb={set:function(a,b,c){return b===!1?_.removeAttr(a,c):a.setAttribute(c,c),c}},_.each(_.expr.match.bool.source.match(/\w+/g),function(a,b){var c=fb[b]||_.find.attr;fb[b]=function(a,b,d){var e,f;return d||(f=fb[b],fb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,fb[b]=f),e}});var gb=/^(?:input|select|textarea|button)$/i;_.fn.extend({prop:function(a,b){return qa(this,_.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[_.propFix[a]||a]})}}),_.extend({propFix:{for:"htmlFor",class:"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!_.isXMLDoc(a),f&&(b=_.propFix[b]||b,e=_.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||gb.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),Y.optSelected||(_.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),_.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){_.propFix[this.toLowerCase()]=this});var hb=/[\t\r\n\f]/g;_.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(na)||[];i=0;)d=d.replace(" "+e+" "," ");g=a?_.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):_.isFunction(a)?this.each(function(c){_(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if("string"===c)for(var b,d=0,e=_(this),f=a.match(na)||[];b=f[d++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else c!==za&&"boolean"!==c||(this.className&&ra.set(this,"__className__",this.className),this.className=this.className||a===!1?"":ra.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;c=0)return!0;return!1}});var ib=/\r/g;_.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=_.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,_(this).val()):a,null==e?e="":"number"==typeof e?e+="":_.isArray(e)&&(e=_.map(e,function(a){return null==a?"":a+""})),b=_.valHooks[this.type]||_.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=_.valHooks[e.type]||_.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ib,""):null==c?"":c)}}}),_.extend({valHooks:{option:{get:function(a){var b=_.find.attr(a,"value");return null!=b?b:_.trim(_.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||e<0,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),_.each(["radio","checkbox"],function(){_.valHooks[this]={set:function(a,b){if(_.isArray(b))return a.checked=_.inArray(_(a).val(),b)>=0}},Y.checkOn||(_.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),_.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){_.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),_.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var jb=_.now(),kb=/\?/;_.parseJSON=function(a){return JSON.parse(a+"")},_.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(a){b=void 0}return b&&!b.getElementsByTagName("parsererror").length||_.error("Invalid XML: "+a),b};var lb,mb,nb=/#.*$/,ob=/([?&])_=[^&]*/,pb=/^(.*?):[ \t]*([^\r\n]*)$/gm,qb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rb=/^(?:GET|HEAD)$/,sb=/^\/\//,tb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,ub={},vb={},wb="*/".concat("*");try{mb=location.href}catch(a){mb=Z.createElement("a"),mb.href="",mb=mb.href}lb=tb.exec(mb.toLowerCase())||[],_.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:mb,type:"GET",isLocal:qb.test(lb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":wb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":_.parseJSON,"text xml":_.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?L(L(a,_.ajaxSettings),b):L(_.ajaxSettings,a)},ajaxPrefilter:J(ub),ajaxTransport:J(vb),ajax:function(a,b){function c(a,b,c,g){var i,k,r,s,u,w=b;2!==t&&(t=2,h&&clearTimeout(h),d=void 0,f=g||"",v.readyState=a>0?4:0,i=a>=200&&a<300||304===a,c&&(s=M(l,v,c)),s=N(l,s,v,i),i?(l.ifModified&&(u=v.getResponseHeader("Last-Modified"),u&&(_.lastModified[e]=u),u=v.getResponseHeader("etag"),u&&(_.etag[e]=u)),204===a||"HEAD"===l.type?w="nocontent":304===a?w="notmodified":(w=s.state,k=s.data,r=s.error,i=!r)):(r=w,!a&&w||(w="error",a<0&&(a=0))),v.status=a,v.statusText=(b||w)+"",i?o.resolveWith(m,[k,w,v]):o.rejectWith(m,[v,w,r]),v.statusCode(q),q=void 0,j&&n.trigger(i?"ajaxSuccess":"ajaxError",[v,l,i?k:r]),p.fireWith(m,[v,w]),j&&(n.trigger("ajaxComplete",[v,l]),--_.active||_.event.trigger("ajaxStop")))}"object"==typeof a&&(b=a,a=void 0),b=b||{};var d,e,f,g,h,i,j,k,l=_.ajaxSetup({},b),m=l.context||l,n=l.context&&(m.nodeType||m.jquery)?_(m):_.event,o=_.Deferred(),p=_.Callbacks("once memory"),q=l.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!g)for(g={};b=pb.exec(f);)g[b[1].toLowerCase()]=b[2];b=g[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(t<2)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return d&&d.abort(b),c(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,l.url=((a||l.url||mb)+"").replace(nb,"").replace(sb,lb[1]+"//"),l.type=b.method||b.type||l.method||l.type,l.dataTypes=_.trim(l.dataType||"*").toLowerCase().match(na)||[""],null==l.crossDomain&&(i=tb.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]===lb[1]&&i[2]===lb[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(lb[3]||("http:"===lb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=_.param(l.data,l.traditional)),K(ub,l,b,v),2===t)return v;j=l.global,j&&0===_.active++&&_.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!rb.test(l.type),e=l.url,l.hasContent||(l.data&&(e=l.url+=(kb.test(e)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=ob.test(e)?e.replace(ob,"$1_="+jb++):e+(kb.test(e)?"&":"?")+"_="+jb++)),l.ifModified&&(_.lastModified[e]&&v.setRequestHeader("If-Modified-Since",_.lastModified[e]),_.etag[e]&&v.setRequestHeader("If-None-Match",_.etag[e])),(l.data&&l.hasContent&&l.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",l.contentType),v.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+wb+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)v.setRequestHeader(k,l.headers[k]);if(l.beforeSend&&(l.beforeSend.call(m,v,l)===!1||2===t))return v.abort();u="abort";for(k in{success:1,error:1,complete:1})v[k](l[k]);if(d=K(vb,l,b,v)){v.readyState=1,j&&n.trigger("ajaxSend",[v,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){v.abort("timeout")},l.timeout));try{t=1,d.send(r,c)}catch(a){if(!(t<2))throw a;c(-1,a)}}else c(-1,"No Transport");return v},getJSON:function(a,b,c){return _.get(a,b,c,"json")},getScript:function(a,b){return _.get(a,void 0,b,"script")}}),_.each(["get","post"],function(a,b){_[b]=function(a,c,d,e){return _.isFunction(c)&&(e=e||d,d=c,c=void 0),_.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){_.fn[b]=function(a){return this.on(b,a)}}),_._evalUrl=function(a){return _.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},_.fn.extend({wrapAll:function(a){var b;return _.isFunction(a)?this.each(function(b){_(this).wrapAll(a.call(this,b))}):(this[0]&&(b=_(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return _.isFunction(a)?this.each(function(b){_(this).wrapInner(a.call(this,b))}):this.each(function(){var b=_(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=_.isFunction(a);return this.each(function(c){_(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){_.nodeName(this,"body")||_(this).replaceWith(this.childNodes)}).end()}}),_.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},_.expr.filters.visible=function(a){return!_.expr.filters.hidden(a)};var xb=/%20/g,yb=/\[\]$/,zb=/\r?\n/g,Ab=/^(?:submit|button|image|reset|file)$/i,Bb=/^(?:input|select|textarea|keygen)/i;_.param=function(a,b){var c,d=[],e=function(a,b){b=_.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=_.ajaxSettings&&_.ajaxSettings.traditional),_.isArray(a)||a.jquery&&!_.isPlainObject(a))_.each(a,function(){e(this.name,this.value)});else for(c in a)O(c,a[c],b,e);return d.join("&").replace(xb,"+")},_.fn.extend({serialize:function(){return _.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=_.prop(this,"elements");return a?_.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!_(this).is(":disabled")&&Bb.test(this.nodeName)&&!Ab.test(a)&&(this.checked||!ya.test(a))}).map(function(a,b){var c=_(this).val();return null==c?null:_.isArray(c)?_.map(c,function(a){return{name:b.name,value:a.replace(zb,"\r\n")}}):{name:b.name,value:c.replace(zb,"\r\n")}}).get()}}),_.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Cb=0,Db={},Eb={0:200,1223:204},Fb=_.ajaxSettings.xhr();a.ActiveXObject&&_(a).on("unload",function(){for(var a in Db)Db[a]()}),Y.cors=!!Fb&&"withCredentials"in Fb,Y.ajax=Fb=!!Fb,_.ajaxTransport(function(a){var b;if(Y.cors||Fb&&!a.crossDomain)return{send:function(c,d){var e,f=a.xhr(),g=++Cb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Db[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Eb[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Db[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(a){if(b)throw a}},abort:function(){b&&b()}}}),_.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return _.globalEval(a),a}}}),_.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),_.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=_("
                      Operations
                        Recipe
                          Input
                          Output
                          Operations
                            Recipe
                              Input
                              Output
                              \ No newline at end of file +};ControlsWaiter.prototype.adjust_width=function(){var a=document.getElementById("controls"),b=document.getElementById("step"),c=document.getElementById("clr-breaks"),d=document.querySelector("#save img"),e=document.querySelector("#load img"),f=document.querySelector("#step img"),g=document.querySelector("#clr-recipe img"),h=document.querySelector("#clr-breaks img");a.clientWidth<470?b.childNodes[1].nodeValue=" Step":b.childNodes[1].nodeValue=" Step through",a.clientWidth<400?(d.style.display="none",e.style.display="none",f.style.display="none",g.style.display="none",h.style.display="none"):(d.style.display="inline",e.style.display="inline",f.style.display="inline",g.style.display="inline",h.style.display="inline"),a.clientWidth<330?c.childNodes[1].nodeValue=" Clear breaks":c.childNodes[1].nodeValue=" Clear breakpoints"},ControlsWaiter.prototype.set_auto_bake=function(a){var b=document.getElementById("auto-bake");b.checked!==a&&b.click()},ControlsWaiter.prototype.bake_click=function(){this.app.bake(),$("#output-text").selectRange(0)},ControlsWaiter.prototype.step_click=function(){this.app.bake(!0),$("#output-text").selectRange(0)},ControlsWaiter.prototype.auto_bake_change=function(){var a=document.getElementById("auto-bake-label"),b=document.getElementById("auto-bake");this.app.auto_bake_=b.checked,b.checked?(a.classList.remove("btn-default"),a.classList.add("btn-success")):(a.classList.remove("btn-success"),a.classList.add("btn-default"))},ControlsWaiter.prototype.clear_recipe_click=function(){this.manager.recipe.clear_recipe()},ControlsWaiter.prototype.clear_breaks_click=function(){for(var a=document.querySelectorAll("#rec_list li.operation .breakpoint"),b=0;b0,b=b&&f.length>0&&f.length<8e3,a&&(d+="?recipe="+encodeURIComponent(e)),a&&b?d+="&input="+encodeURIComponent(f):b&&(d+="?input="+encodeURIComponent(f)),d},ControlsWaiter.prototype.save_text_change=function(){try{var a=JSON.parse(document.getElementById("save-text").value);this.initialise_save_link(a)}catch(a){}},ControlsWaiter.prototype.save_click=function(){var a=this.app.get_recipe_config(),b=JSON.stringify(a).replace(/},{/g,"},\n{");document.getElementById("save-text").value=b,this.initialise_save_link(a),$("#save-modal").modal()},ControlsWaiter.prototype.slr_check_change=function(){this.initialise_save_link()},ControlsWaiter.prototype.sli_check_change=function(){this.initialise_save_link()},ControlsWaiter.prototype.load_click=function(){this.populate_load_recipes_list(),$("#load-modal").modal()},ControlsWaiter.prototype.save_button_click=function(){var a=document.getElementById("save-name").value,b=document.getElementById("save-text").value;if(!a)return void this.app.alert("Please enter a recipe name","danger",2e3);var c=localStorage.saved_recipes?JSON.parse(localStorage.saved_recipes):[],d=localStorage.recipe_id||0;c.push({id:++d,name:a,recipe:b}),localStorage.saved_recipes=JSON.stringify(c),localStorage.recipe_id=d,this.app.alert('Recipe saved as "'+a+'".',"success",2e3)},ControlsWaiter.prototype.populate_load_recipes_list=function(){for(var a=document.getElementById("load-name"),b=a.options.length;b--;)a.remove(b);var c=localStorage.saved_recipes?JSON.parse(localStorage.saved_recipes):[];for(b=0;bend: "+e+"
                              length: "+f},HighlighterWaiter.prototype.remove_highlights=function(){document.getElementById("input-highlighter").innerHTML="",document.getElementById("output-highlighter").innerHTML="",document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML=""},HighlighterWaiter.prototype.generate_highlight_list=function(){for(var a=this.app.get_recipe_config(),b=[],c=0;c=0)return!1;var d="[start_highlight]",e=/\[start_highlight\]/g,f="[end_highlight]",g=/\[end_highlight\]/g,h=a.value;if(1===c.length){if(c[0].end/g,">").replace(/\n/g," ").replace(e,'').replace(g,"")+" ",b.style.width=a.clientWidth+"px",b.innerHTML=h,b.scrollTop=a.scrollTop,b.scrollLeft=a.scrollLeft};var HTMLApp=function(a,b,c,d){this.categories=a,this.operations=b,this.dfavourites=c,this.doptions=d,this.options=Utils.extend({},d),this.chef=new Chef,this.manager=new Manager(this),this.auto_bake_=!1,this.progress=0,this.ing_id=0,window.chef=this.chef};HTMLApp.prototype.setup=function(){document.dispatchEvent(this.manager.appstart),this.initialise_splitter(),this.load_local_storage(),this.populate_operations_list(),this.manager.setup(),this.reset_layout(),this.set_compile_message(),this.load_URI_params()},HTMLApp.prototype.handle_error=function(a){console.error(a);var b=a.display_str||a.toString();this.alert(b,"danger",this.options.error_timeout,!this.options.show_errors)},HTMLApp.prototype.bake=function(a){var b;try{b=this.chef.bake(this.get_input(),this.get_recipe_config(),this.options,this.progress,a)}catch(a){this.handle_error(a)}b&&(b.error&&this.handle_error(b.error),this.options=b.options,this.dish_str="html"===b.type?Utils.strip_html_tags(b.result,!0):b.result,this.progress=b.progress,this.manager.recipe.update_breakpoint_indicator(b.progress),this.manager.output.set(b.result,b.type,b.duration),b.duration>this.options.auto_bake_threshold&&this.auto_bake_&&(this.manager.controls.set_auto_bake(!1),this.alert("Baking took longer than "+this.options.auto_bake_threshold+"ms, Auto Bake has been disabled.","warning",5e3)))},HTMLApp.prototype.auto_bake=function(){this.auto_bake_&&this.bake()},HTMLApp.prototype.silent_bake=function(){var a=(new Date).getTime(),b=this.get_recipe_config();return this.auto_bake_&&this.chef.silent_bake(b),(new Date).getTime()-a},HTMLApp.prototype.get_input=function(){var a=this.manager.input.get();return sessionStorage.setItem("input_length",a.length),sessionStorage.setItem("input",a),a},HTMLApp.prototype.set_input=function(a){sessionStorage.setItem("input_length",a.length),sessionStorage.setItem("input",a),this.manager.input.set(a)},HTMLApp.prototype.populate_operations_list=function(){document.body.appendChild(document.getElementById("edit-favourites"));for(var a="",b=0;b2?JSON.parse(localStorage.favourites):this.dfavourites;a=this.valid_favourites(a),this.save_favourites(a);var b=this.categories.filter(function(a){return"Favourites"===a.name})[0];b?b.ops=a:this.categories.unshift({name:"Favourites",ops:a})},HTMLApp.prototype.valid_favourites=function(a){for(var b=[],c=0;c=0?void this.alert("'"+a+"' is already in your favourites","info",2e3):(b.push(a),this.save_favourites(b),this.load_favourites(),this.populate_operations_list(),void this.manager.recipe.initialise_operation_drag_n_drop())},HTMLApp.prototype.load_URI_params=function(){this.query_string=function(a){if(""===a)return{};for(var b={},c=0;c"):d[e].value=a[b].args[e];a[b].disabled&&c.querySelector(".disable-icon").click(),a[b].breakpoint&&c.querySelector(".breakpoint").click(),this.progress=0}},HTMLApp.prototype.reset_layout=function(){this.column_splitter.setSizes([20,30,50]),this.io_splitter.setSizes([50,50]),this.manager.controls.adjust_width(),this.manager.output.adjust_width()},HTMLApp.prototype.set_compile_message=function(){var a=new Date,b=Utils.fuzzy_time(a.getTime()-window.compile_time),c='Last build: '+b.substr(0,1).toUpperCase()+b.substr(1)+" ago";""!==window.compile_message&&(c+=" - "+window.compile_message),c+="",document.getElementById("notice").innerHTML=c},HTMLApp.prototype.alert=function(a,b,c,d){var e=new Date;if(console.log("["+e.toLocaleString()+"] "+a),!d){b=b||"danger",c=c||0;var f=document.getElementById("alert"),g=document.getElementById("alert-content");f.classList.remove("alert-danger"),f.classList.remove("alert-warning"),f.classList.remove("alert-info"),f.classList.remove("alert-success"),f.classList.add("alert-"+b),"block"===f.style.display?g.innerHTML+="

                              ["+e.toLocaleTimeString()+"] "+a:g.innerHTML="["+e.toLocaleTimeString()+"] "+a,$("#alert").stop(),f.style.display="block",f.style.opacity=1,c>0&&(clearTimeout(this.alert_timeout),this.alert_timeout=setTimeout(function(){$("#alert").slideUp(100)},c))}},HTMLApp.prototype.confirm=function(a,b,c,d){d=d||this,document.getElementById("confirm-title").innerHTML=a,document.getElementById("confirm-body").innerHTML=b,document.getElementById("confirm-modal").style.display="block",this.confirm_closed=!1,$("#confirm-modal").modal().one("show.bs.modal",function(a){this.confirm_closed=!1}.bind(this)).one("click","#confirm-yes",function(){this.confirm_closed=!0,c.bind(d)(!0),$("#confirm-modal").modal("hide")}.bind(this)).one("hide.bs.modal",function(a){this.confirm_closed||c.bind(d)(!1),this.confirm_closed=!0}.bind(this))},HTMLApp.prototype.alert_close_click=function(){document.getElementById("alert").style.display="none"},HTMLApp.prototype.state_change=function(a){this.auto_bake(),this.options.update_url&&(this.last_state_url=this.manager.controls.generate_state_url(!0,!0),window.history.replaceState({},"CyberChef",this.last_state_url))},HTMLApp.prototype.pop_state=function(a){window.location.href.split("#")[0]!==this.last_state_url&&this.load_URI_params()},HTMLApp.prototype.call_api=function(a,b,c,d,e){b=b||"POST",c=c||{},d=d||void 0,e=e||"application/json";var f=null,g=!1;return $.ajax({url:a,async:!1,type:b,data:c,dataType:d,contentType:e,success:function(a){g=!0,f=a},error:function(a){g=!1,f=a}}),{success:g,response:f}};var HTMLCategory=function(a,b){this.name=a,this.selected=b,this.op_list=[]};HTMLCategory.prototype.add_operation=function(a){this.op_list.push(a)},HTMLCategory.prototype.to_html=function(){for(var a="cat"+this.name.replace(/[\s\/-:_]/g,""),b="
                              "+this.name+"
                                ",c=0;c 
                              ";switch(d+="
                              ",this.type){case"string":case"binary_string":case"byte_array":d+="";break;case"short_string":case"binary_short_string":d+="";break;case"toggle_string":for(d+="
                              ";break;case"number":d+="";break;case"boolean":d+="",this.disable_args&&this.manager.add_dynamic_listener("#"+this.id,"click",this.toggle_disable_args,this);break;case"option":for(d+="";break;case"populate_option":for(d+="",this.manager.add_dynamic_listener("#"+this.id,"change",this.populate_option_change,this);break;case"editable_option":for(d+="
                              ",d+="",d+="",d+="
                              ",this.manager.add_dynamic_listener("#sel-"+this.id,"change",this.editable_option_change,this);break;case"text":d+=""}return d+="
                              "},HTMLIngredient.prototype.toggle_disable_args=function(a){for(var b,c=a.target,d=c.parentNode.parentNode,e=d.querySelectorAll(".arg-group"),f=0;f"),this.description&&(b+=""),b+=""},HTMLOperation.prototype.to_full_html=function(){for(var a="
                              "+this.name+"
                              ",b=0;b=0&&(this.name=this.name.slice(0,b)+""+this.name.slice(b,b+a.length)+""+this.name.slice(b+a.length)),this.description&&c>=0&&(this.description=this.description.slice(0,c)+""+this.description.slice(c,c+a.length)+""+this.description.slice(c+a.length))};var InputWaiter=function(a,b){this.app=a,this.manager=b,this.bad_keys=[16,17,18,19,20,27,33,34,35,36,37,38,39,40,44,91,92,93,112,113,114,115,116,117,118,119,120,121,122,123,144,145]};InputWaiter.prototype.get=function(){return document.getElementById("input-text").value},InputWaiter.prototype.set=function(a){document.getElementById("input-text").value=a,window.dispatchEvent(this.manager.statechange)},InputWaiter.prototype.set_input_info=function(a,b){var c=a.toString().length;c=c<2?2:c;var d=Utils.pad(a.toString(),c," ").replace(/ /g," "),e=Utils.pad(b.toString(),c," ").replace(/ /g," ");document.getElementById("input-info").innerHTML="length: "+d+"
                              lines: "+e},InputWaiter.prototype.input_change=function(a){this.manager.highlighter.remove_highlights(),this.app.progress=0;var b=this.get(),c=b.count("\n")+1;this.set_input_info(b.length,c),this.bad_keys.indexOf(a.keyCode)<0&&window.dispatchEvent(this.manager.statechange)},InputWaiter.prototype.input_dragover=function(a){return"move"!==a.dataTransfer.effectAllowed&&(a.stopPropagation(),a.preventDefault(),void a.target.classList.add("dropping-file"))},InputWaiter.prototype.input_dragleave=function(a){a.stopPropagation(),a.preventDefault(),a.target.classList.remove("dropping-file")},InputWaiter.prototype.input_drop=function(a){if("move"===a.dataTransfer.effectAllowed)return!1;a.stopPropagation(),a.preventDefault();var b=a.target,c=a.dataTransfer.files[0],d=a.dataTransfer.getData("Text"),e=new FileReader,f="",g=0,h=20480,i=function(){f.length>1e5&&this.app.auto_bake_&&(this.manager.controls.set_auto_bake(!1),this.app.alert("Turned off Auto Bake as the input is large","warning",5e3)),this.set(f);var a=this.app.get_recipe_config();a[0]&&"From Hex"===a[0].op||(a.unshift({op:"From Hex",args:["Space"]}),this.app.set_recipe_config(a)),b.classList.remove("loading_file")}.bind(this),j=function(){if(g>=c.size)return void i();b.value="Processing... "+Math.round(g/c.size*100)+"%";var a=c.slice(g,g+h);e.readAsArrayBuffer(a)};e.onload=function(a){var b=new Uint8Array(e.result);f+=Utils.to_hex_fast(b),g+=h,j()},b.classList.remove("dropping-file"),c?(b.classList.add("loading_file"),j()):d&&this.set(d)},InputWaiter.prototype.clear_io_click=function(){this.manager.highlighter.remove_highlights(),document.getElementById("input-text").value="",document.getElementById("output-text").value="",document.getElementById("input-info").innerHTML="",document.getElementById("output-info").innerHTML="",document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML="",window.dispatchEvent(this.manager.statechange)};var Manager=function(a){this.app=a,this.appstart=new CustomEvent("appstart",{bubbles:!0}),this.operationadd=new CustomEvent("operationadd",{bubbles:!0}),this.operationremove=new CustomEvent("operationremove",{bubbles:!0}),this.oplistcreate=new CustomEvent("oplistcreate",{bubbles:!0}),this.statechange=new CustomEvent("statechange",{bubbles:!0}),this.window=new WindowWaiter(this.app),this.controls=new ControlsWaiter(this.app,this),this.recipe=new RecipeWaiter(this.app,this),this.ops=new OperationsWaiter(this.app,this),this.input=new InputWaiter(this.app,this),this.output=new OutputWaiter(this.app,this),this.options=new OptionsWaiter(this.app),this.highlighter=new HighlighterWaiter(this.app), +this.seasonal=new SeasonalWaiter(this.app,this),this.dynamic_handlers={},this.initialise_event_listeners()};Manager.prototype.setup=function(){this.recipe.initialise_operation_drag_n_drop(),this.controls.auto_bake_change(),this.seasonal.load()},Manager.prototype.initialise_event_listeners=function(){window.addEventListener("resize",this.window.window_resize.bind(this.window)),window.addEventListener("blur",this.window.window_blur.bind(this.window)),window.addEventListener("focus",this.window.window_focus.bind(this.window)),window.addEventListener("statechange",this.app.state_change.bind(this.app)),window.addEventListener("popstate",this.app.pop_state.bind(this.app)),document.getElementById("bake").addEventListener("click",this.controls.bake_click.bind(this.controls)),document.getElementById("auto-bake").addEventListener("change",this.controls.auto_bake_change.bind(this.controls)),document.getElementById("step").addEventListener("click",this.controls.step_click.bind(this.controls)),document.getElementById("clr-recipe").addEventListener("click",this.controls.clear_recipe_click.bind(this.controls)),document.getElementById("clr-breaks").addEventListener("click",this.controls.clear_breaks_click.bind(this.controls)),document.getElementById("save").addEventListener("click",this.controls.save_click.bind(this.controls)),document.getElementById("save-button").addEventListener("click",this.controls.save_button_click.bind(this.controls)),document.getElementById("save-link-recipe-checkbox").addEventListener("change",this.controls.slr_check_change.bind(this.controls)),document.getElementById("save-link-input-checkbox").addEventListener("change",this.controls.sli_check_change.bind(this.controls)),document.getElementById("load").addEventListener("click",this.controls.load_click.bind(this.controls)),document.getElementById("load-delete-button").addEventListener("click",this.controls.load_delete_click.bind(this.controls)),document.getElementById("load-name").addEventListener("change",this.controls.load_name_change.bind(this.controls)),document.getElementById("load-button").addEventListener("click",this.controls.load_button_click.bind(this.controls)),this.add_multi_event_listener("#save-text","keyup paste",this.controls.save_text_change,this.controls),this.add_multi_event_listener("#search","keyup paste search",this.ops.search_operations,this.ops),this.add_dynamic_listener(".op_list li.operation","dblclick",this.ops.operation_dblclick,this.ops),document.getElementById("edit-favourites").addEventListener("click",this.ops.edit_favourites_click.bind(this.ops)),document.getElementById("save-favourites").addEventListener("click",this.ops.save_favourites_click.bind(this.ops)),document.getElementById("reset-favourites").addEventListener("click",this.ops.reset_favourites_click.bind(this.ops)),this.add_dynamic_listener(".op_list .op-icon","mouseover",this.ops.op_icon_mouseover,this.ops),this.add_dynamic_listener(".op_list .op-icon","mouseleave",this.ops.op_icon_mouseleave,this.ops),this.add_dynamic_listener(".op_list","oplistcreate",this.ops.op_list_create,this.ops),this.add_dynamic_listener("li.operation","operationadd",this.recipe.op_add.bind(this.recipe)),this.add_dynamic_listener(".arg","keyup",this.recipe.ing_change,this.recipe),this.add_dynamic_listener(".arg","change",this.recipe.ing_change,this.recipe),this.add_dynamic_listener(".disable-icon","click",this.recipe.disable_click,this.recipe),this.add_dynamic_listener(".breakpoint","click",this.recipe.breakpoint_click,this.recipe),this.add_dynamic_listener("#rec_list li.operation","dblclick",this.recipe.operation_dblclick,this.recipe),this.add_dynamic_listener("#rec_list li.operation > div","dblclick",this.recipe.operation_child_dblclick,this.recipe),this.add_dynamic_listener("#rec_list .input-group .dropdown-menu a","click",this.recipe.dropdown_toggle_click,this.recipe),this.add_dynamic_listener("#rec_list","operationremove",this.recipe.op_remove.bind(this.recipe)),this.add_multi_event_listener("#input-text","keyup paste",this.input.input_change,this.input),document.getElementById("reset-layout").addEventListener("click",this.app.reset_layout.bind(this.app)),document.getElementById("clr-io").addEventListener("click",this.input.clear_io_click.bind(this.input)),document.getElementById("input-text").addEventListener("dragover",this.input.input_dragover.bind(this.input)),document.getElementById("input-text").addEventListener("dragleave",this.input.input_dragleave.bind(this.input)),document.getElementById("input-text").addEventListener("drop",this.input.input_drop.bind(this.input)),document.getElementById("input-text").addEventListener("scroll",this.highlighter.input_scroll.bind(this.highlighter)),document.getElementById("input-text").addEventListener("mouseup",this.highlighter.input_mouseup.bind(this.highlighter)),document.getElementById("input-text").addEventListener("mousemove",this.highlighter.input_mousemove.bind(this.highlighter)),this.add_multi_event_listener("#input-text","mousedown dblclick select",this.highlighter.input_mousedown,this.highlighter),document.getElementById("save-to-file").addEventListener("click",this.output.save_click.bind(this.output)),document.getElementById("switch").addEventListener("click",this.output.switch_click.bind(this.output)),document.getElementById("undo-switch").addEventListener("click",this.output.undo_switch_click.bind(this.output)),document.getElementById("maximise-output").addEventListener("click",this.output.maximise_output_click.bind(this.output)),document.getElementById("output-text").addEventListener("scroll",this.highlighter.output_scroll.bind(this.highlighter)),document.getElementById("output-text").addEventListener("mouseup",this.highlighter.output_mouseup.bind(this.highlighter)),document.getElementById("output-text").addEventListener("mousemove",this.highlighter.output_mousemove.bind(this.highlighter)),document.getElementById("output-html").addEventListener("mouseup",this.highlighter.output_html_mouseup.bind(this.highlighter)),document.getElementById("output-html").addEventListener("mousemove",this.highlighter.output_html_mousemove.bind(this.highlighter)),this.add_multi_event_listener("#output-text","mousedown dblclick select",this.highlighter.output_mousedown,this.highlighter),this.add_multi_event_listener("#output-html","mousedown dblclick select",this.highlighter.output_html_mousedown,this.highlighter),document.getElementById("options").addEventListener("click",this.options.options_click.bind(this.options)),document.getElementById("reset-options").addEventListener("click",this.options.reset_options_click.bind(this.options)),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox",this.options.switch_change.bind(this.options)),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox",this.options.set_word_wrap.bind(this.options)),this.add_dynamic_listener(".option-item input[type=number]","keyup",this.options.number_change,this.options),this.add_dynamic_listener(".option-item input[type=number]","change",this.options.number_change,this.options),this.add_dynamic_listener(".option-item select","change",this.options.select_change,this.options),document.getElementById("alert-close").addEventListener("click",this.app.alert_close_click.bind(this.app))},Manager.prototype.add_listeners=function(a,b,c,d){d=d||this,[].forEach.call(document.querySelectorAll(a),function(a){a.addEventListener(b,c.bind(d))})},Manager.prototype.add_multi_event_listener=function(a,b,c,d){for(var e=b.split(" "),f=0;f-1&&(this.manager.recipe.add_operation(b[c].innerHTML),this.app.auto_bake()))),13===a.keyCode)a.preventDefault();else if(40===a.keyCode)a.preventDefault(),b=document.querySelectorAll("#search-results li"),b.length&&(c=this.get_selected_op(b),c>-1&&b[c].classList.remove("selected-op"),c===b.length-1&&(c=-1),b[c+1].classList.add("selected-op"));else if(38===a.keyCode)a.preventDefault(),b=document.querySelectorAll("#search-results li"),b.length&&(c=this.get_selected_op(b),c>-1&&b[c].classList.remove("selected-op"),0===c&&(c=b.length),b[c-1].classList.add("selected-op"));else{for(var d=document.getElementById("search-results"),e=a.target,f=e.value;d.firstChild;)$(d.firstChild).popover("destroy"),d.removeChild(d.firstChild);if($("#categories .in").collapse("hide"),f){for(var g=this.filter_operations(f,!0),h="",i=0;i=0||h>=0){var i=new HTMLOperation(e,this.app.operations[e],this.app,this.manager);b&&i.highlight_search_string(a,g,h),g<0?c.push(i):d.push(i)}}return d.concat(c)},OperationsWaiter.prototype.get_selected_op=function(a){for(var b=0;blength: "+e+"
                              lines: "+f,document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML=""},OutputWaiter.prototype.adjust_width=function(){var a=document.getElementById("output"),b=document.getElementById("save-to-file"),c=document.getElementById("switch"),d=document.getElementById("undo-switch"),e=document.getElementById("maximise-output");a.clientWidth<680?(b.childNodes[1].nodeValue="",c.childNodes[1].nodeValue="",d.childNodes[1].nodeValue="",e.childNodes[1].nodeValue=""):(b.childNodes[1].nodeValue=" Save to file",c.childNodes[1].nodeValue=" Move output to input",d.childNodes[1].nodeValue=" Undo",e.childNodes[1].nodeValue="Maximise"===e.getAttribute("title")?" Max":" Restore")},OutputWaiter.prototype.save_click=function(){var a=Utils.to_base64(this.app.dish_str),b=window.prompt("Please enter a filename:","download.dat");if(b){var c=document.createElement("a");c.setAttribute("href","data:application/octet-stream;base64;charset=utf-8,"+a),c.setAttribute("download",b),c.style.display="none",document.body.appendChild(c),c.click(),c.remove()}},OutputWaiter.prototype.switch_click=function(){this.switch_orig_data=this.manager.input.get(),document.getElementById("undo-switch").disabled=!1,this.app.set_input(this.app.dish_str)},OutputWaiter.prototype.undo_switch_click=function(){this.app.set_input(this.switch_orig_data),document.getElementById("undo-switch").disabled=!0},OutputWaiter.prototype.maximise_output_click=function(a){var b="maximise-output"===a.target.id?a.target:a.target.parentNode;"Maximise"===b.getAttribute("title")?(this.app.column_splitter.collapse(0),this.app.column_splitter.collapse(1),this.app.io_splitter.collapse(0),b.setAttribute("title","Restore"),b.innerHTML=" Restore",this.adjust_width()):(b.setAttribute("title","Maximise"),b.innerHTML=" Max",this.app.reset_layout())};var RecipeWaiter=function(a,b){this.app=a,this.manager=b,this.remove_intent=!1};RecipeWaiter.prototype.initialise_operation_drag_n_drop=function(){var a=document.getElementById("rec_list");Sortable.create(a,{group:"recipe",sort:!0,animation:0,delay:0,filter:".arg-input,.arg",setData:function(a,b){a.setData("Text",b.querySelector(".arg-title").textContent)},onEnd:function(a){this.remove_intent&&(a.item.remove(),a.target.dispatchEvent(this.manager.operationremove))}.bind(this)}),Sortable.utils.on(a,"dragover",function(){this.remove_intent=!1}.bind(this)),Sortable.utils.on(a,"dragleave",function(){this.remove_intent=!0,this.app.progress=0}.bind(this)),Sortable.utils.on(a,"touchend",function(b){var c=b.changedTouches[0],d=document.elementFromPoint(c.clientX,c.clientY);this.remove_intent=!a.contains(d)}.bind(this)),document.querySelector("#categories a").addEventListener("dragover",this.fav_dragover.bind(this)),document.querySelector("#categories a").addEventListener("dragleave",this.fav_dragleave.bind(this)),document.querySelector("#categories a").addEventListener("drop",this.fav_drop.bind(this))},RecipeWaiter.prototype.create_sortable_seed_list=function(a){Sortable.create(a,{group:{name:"recipe",pull:"clone",put:!1},sort:!1,setData:function(a,b){a.setData("Text",b.textContent)},onStart:function(a){$(a.item).popover("destroy"),a.item.setAttribute("data-toggle","popover-disabled")},onEnd:this.op_sort_end.bind(this)})},RecipeWaiter.prototype.op_sort_end=function(a){return this.remove_intent?void("rec_list"===a.item.parentNode.id&&a.item.remove()):($(a.clone).popover(),$(a.clone).children("[data-toggle=popover]").popover(),void("rec_list"===a.item.parentNode.id&&(this.build_recipe_operation(a.item),a.item.dispatchEvent(this.manager.operationadd))))},RecipeWaiter.prototype.fav_dragover=function(a){return"move"===a.dataTransfer.effectAllowed&&(a.stopPropagation(),a.preventDefault(),void(a.target.className&&a.target.className.indexOf("category-title")>-1?a.target.classList.add("favourites-hover"):a.target.parentNode.className&&a.target.parentNode.className.indexOf("category-title")>-1?a.target.parentNode.classList.add("favourites-hover"):a.target.parentNode.parentNode.className&&a.target.parentNode.parentNode.className.indexOf("category-title")>-1&&a.target.parentNode.parentNode.classList.add("favourites-hover")))},RecipeWaiter.prototype.fav_dragleave=function(a){a.stopPropagation(),a.preventDefault(),document.querySelector("#categories a").classList.remove("favourites-hover")},RecipeWaiter.prototype.fav_drop=function(a){a.stopPropagation(),a.preventDefault(),a.target.classList.remove("favourites-hover");var b=a.dataTransfer.getData("Text");this.app.add_favourite(b)},RecipeWaiter.prototype.ing_change=function(){window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.disable_click=function(a){var b=a.target;"false"===b.getAttribute("disabled")?(b.setAttribute("disabled","true"),b.classList.add("disable-icon-selected"),b.parentNode.parentNode.classList.add("disabled")):(b.setAttribute("disabled","false"),b.classList.remove("disable-icon-selected"),b.parentNode.parentNode.classList.remove("disabled")),this.app.progress=0,window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.breakpoint_click=function(a){var b=a.target;"false"===b.getAttribute("break")?(b.setAttribute("break","true"),b.classList.add("breakpoint-selected")):(b.setAttribute("break","false"),b.classList.remove("breakpoint-selected")),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.operation_dblclick=function(a){a.target.remove(),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.operation_child_dblclick=function(a){a.target.parentNode.remove(),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.get_config=function(){for(var a,b,c,d,e,f=[],g=document.querySelectorAll("#rec_list li.operation"),h=0;h",this.ing_change()},RecipeWaiter.prototype.op_add=function(a){window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.op_remove=function(a){window.dispatchEvent(this.manager.statechange)};var SeasonalWaiter=function(a,b){this.app=a,this.manager=b};SeasonalWaiter.prototype.load=function(){var a=new Date;11===a.getMonth()&&a.getDate()>12&&(this.app.options.snow=!1,this.create_snow_option(),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox[option='snow']",this.let_it_snow.bind(this)),window.addEventListener("resize",this.let_it_snow.bind(this)),this.manager.add_listeners(".btn","click",this.shake_off_snow,this),25===a.getDate()&&this.let_it_snow()),this.kkeys=[],window.addEventListener("keydown",this.konami_code_listener.bind(this))},SeasonalWaiter.prototype.insert_spider_icons=function(){var a="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVQ4y2NgGJaAmYGBgVnf0oKJgYGBobWtXamqqoYTn2I4CI+LTzM2NTulpKbu+vPHz2dV5RWlluZmi3j5+KqFJSSEzpw8uQPdAEYYIzo5Kfjrl28rWFlZzjAzMYuEBQao3Lh+g+HGvbsMzExMDN++fWf4/PXLBzY2tqYNK1f2+4eHM2xcuRLigsT09Igf3384MTExbf767etBI319jU8fPsi+//jx/72HDxh5uLkZ7ty7y/Dz1687Avz8n2UUFR3Z2NjOySoqfmdhYGBg+PbtuwI7O8e5H79+8X379t357PnzYo+ePP7y6cuXc9++f69nYGRsvf/w4XdtLS2R799/bBUWFHr57sP7Jbs3b/ZkzswvUP3165fZ7z9//r988WIVAyPDr8tXr576+u3bpb9//7YwMjKeV1dV41NWVGoVEhDgPH761DJREeHaz1+/lqlpafUx6+jrRfz4+fPy+w8fTu/fsf3uw7t3L39+//4cv7DwGQYGhpdPbt9m4BcRFlNWVJC4fuvWASszs4C379792Ldt2xZBUdEdDP5hYSqQGIjDGa965uYKCalpZQwMDAxhMTG9DAwMDLaurhIkJY7A8IgGBgYGBgd3Dz2yUpeFo6O4rasrA9T24ZRxAAMTwMpgEJwLAAAAAElFTkSuQmCC",b="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACYVBMVEUAAAAcJSU2Pz85QkM9RUWEhIWMjI2MkJEcJSU2Pz85QkM9RUWWlpc9RUVXXl4cJSU2Pz85QkM8REU9RUVRWFh6ens9RUVCSkpNVFRdY2McJSU5QkM7REQ9RUVGTk5KUlJQVldcY2Rla2uTk5WampscJSVUWltZX2BrcHF1e3scJSUjLCw9RUVASEhFTU1HTk9bYWJeZGRma2xudHV1eHiZmZocJSUyOjpJUFFQVldSWlpTWVpXXl5YXl5rb3B9fX6RkZIcJSUmLy8tNTU9RUVFTU1IT1BOVldRV1hTWlp0enocJSUfKChJUFBWXV1hZ2hnbGwcJSVETExLUlJLU1NNVVVPVlZYXl9cY2RiaGlobW5rcXFyd3h0eHgcJSUpMTFDS0tQV1dRV1hSWFlWXF1bYWJma2tobW5uc3SsrK0cJSVJUFBMVFROVlZVW1xZX2BdYmNhZ2hjaGhla2tqcHBscHE4Pz9KUlJRWVlSWVlXXF1aYGFbYWFfZWZlampqbW4cJSUgKSkiKysuNjY0PD01PT07QkNES0tHTk5JUFBMUlNMU1NOU1ROVVVPVVZRVlZRV1dSWVlWXFxXXV5aX2BbYWFbYWJcYmJcYmNcY2RdYmNgZmZhZmdkaWpkampkamtlamtla2tma2tma2xnbG1obW5pbG1pb3Bqb3Brb3BtcXJudHVvcHFvcXJvc3NwcXNwdXVxc3RzeXl1eXp2eXl3ent6e3x+gYKAhISBg4SKi4yLi4yWlpeampudnZ6fn6CkpaanqKiur6+vr7C4uLm6urq6u7u8vLy9vb3Av8DR0dL2b74UAAAAgHRSTlMAEBAQEBAQECAgICAgMDBAQEBAQEBAUFBQUGBgYGBgYGBgYGBgcHBwcHCAgICAgICAgICAgICPj4+Pj4+Pj4+Pj5+fn5+fn5+fn5+vr6+vr6+/v7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f7+/v7+/v7+/v78x6RlYAAAGBSURBVDjLY2AYWUCSgUGAk4GBTdlUhQebvP7yjIgCPQbWzBMnjx5wwJSX37Rwfm1isqj9/iPHTuxYlyeMJi+yunfptBkZOw/uWj9h3vatcycu8eRGlldb3Vsts3ph/cFTh7fN3bCoe2Vf8+TZoQhTvBa6REozVC7cuPvQnmULJm1e2z+308eyJieEBSLPXbKQIUqQIczk+N6eNaumtnZMaWhaHM89m8XVCqJA02Y5w0xmga6yfVsamtrN4xoXNzS0JTHkK3CXy4EVFMumcxUy2LbENTVkZfEzMDAudtJyTmNwS2XQreAFyvOlK9louDNVaXurmjkGgnTMkWDgXswtNouFISEX6Awv+RihQi5OcYY4DtVARpCCFCMGhiJ1hjwFBpagEAaWEpFoC0WQOCOjFMRRwXYMDB4BDLJ+QLYsg7GBGjtasLnEMjCIrWBgyAZ7058FI9x1SoFEnTCDsCyIhynPILYYSFgbYpUDA5bpQBluXzxpI1yYAbd2sCMYRhwAAHB9ZPztbuMUAAAAAElFTkSuQmCC",c="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";document.querySelector("link[rel=icon]").setAttribute("href","data:image/png;base64,"+a),document.querySelector("#bake img").setAttribute("src","data:image/png;base64,"+b),document.querySelector(".about-img-left").setAttribute("src","data:image/png;base64,"+c)},SeasonalWaiter.prototype.insert_spider_text=function(){document.title=document.title.replace(/Cyber/g,"Spider"),SeasonalWaiter.tree_walk(document.body,function(a){3===a.nodeType&&(a.nodeValue=a.nodeValue.replace(/Cyber/g,"Spider"))},!0),SeasonalWaiter.tree_walk(document.getElementById("bake-group"),function(a){3===a.nodeType&&(a.nodeValue=a.nodeValue.replace(/Bake/g,"Spin"))},!0),document.querySelector("#recipe .title").innerHTML="Web"},SeasonalWaiter.prototype.create_snow_option=function(){var a=document.getElementById("options-body"),b=document.createElement("div");b.className="option-item",b.innerHTML=" Let it snow",a.appendChild(b),this.manager.options.load()},SeasonalWaiter.prototype.let_it_snow=function(){if($(document).snowfall("clear"),this.app.options.snow){var a={},b=navigator.userAgent.match(/Firefox\/(\d\d?)/);a=b&&parseInt(b[1],10)<30?{flakeCount:10,flakeColor:"#fff",flakePosition:"absolute",minSize:1,maxSize:2,minSpeed:1,maxSpeed:5,round:!1,shadow:!1,collection:!1,collectionHeight:20,deviceorientation:!0}:{flakeCount:35,flakeColor:"#fff",flakePosition:"absolute",minSize:5,maxSize:8,minSpeed:1,maxSpeed:5, +round:!0,shadow:!0,collection:".btn",collectionHeight:20,deviceorientation:!0},$(document).snowfall(a)}},SeasonalWaiter.prototype.shake_off_snow=function(a){for(var b=a.target,c=b.getBoundingClientRect(),d=document.querySelectorAll("canvas.snowfall-canvas"),e=null,f=function(){h.clearRect(0,0,e.width,e.height),$(this).fadeIn()},g=0;g6e4&&this.app.silent_bake()};var main=function(){var a=["To Base64","From Base64","To Hex","From Hex","To Hexdump","From Hexdump","URL Decode","Regular expression","Entropy","Fork"],b={update_url:!0,show_highlighter:!0,treat_as_utf8:!0,word_wrap:!0,show_errors:!0,error_timeout:4e3,auto_bake_threshold:200,attempt_highlight:!0,snow:!1};document.removeEventListener("DOMContentLoaded",main,!1),window.app=new HTMLApp(Categories,OperationConfig,a,b),window.app.setup()};window.console=console||{log:function(){},error:function(){}},window.compile_time=moment.tz("Wed Dec 21 2016 12:12:01","ddd MMM D YYYY HH:mm:ss","UTC").valueOf(),window.compile_message="Merry Christmas! Have a look in the options panel for some festive flavour.",document.addEventListener("DOMContentLoaded",main,!1); \ No newline at end of file diff --git a/build/prod/index.html b/build/prod/index.html index c1d70a4f..fabbe97f 100755 --- a/build/prod/index.html +++ b/build/prod/index.html @@ -18,4 +18,4 @@ See the License for the specific language governing permissions and limitations under the License. --> -CyberChef Edit
                              Operations
                                Recipe
                                  Input
                                  Output
                                  \ No newline at end of file +CyberChef Edit
                                  Operations
                                    Recipe
                                      Input
                                      Output
                                      \ No newline at end of file diff --git a/build/prod/scripts.js b/build/prod/scripts.js index 6e5e989d..43360cb9 100755 --- a/build/prod/scripts.js +++ b/build/prod/scripts.js @@ -272,6 +272,6 @@ _ipv4_cidr_range:function(a,b,c,d){var e="",f=IP._str_to_ipv4(a[1]),g=parseInt(a "06032b06010505070401":"caProtEncCert","06032b06010505070402":"signKeyPairTypes","06032b06010505070403":"encKeyPairTypes","06032b06010505070404":"preferredSymmAlg","06032b06010505070405":"caKeyUpdateInfo","06032b06010505070406":"currentCRL","06032b06010505073001":"ocsp","06032b06010505073002":"caIssuers","06032b06010505080101":"HMAC-MD5","06032b06010505080102":"HMAC-SHA","060360864801650201010a":"mosaicKeyManagementAlgorithm","060360864801650201010b":"sdnsKMandSigAlgorithm","060360864801650201010c":"mosaicKMandSigAlgorithm","060360864801650201010d":"SuiteASignatureAlgorithm","060360864801650201010e":"SuiteAConfidentialityAlgorithm","060360864801650201010f":"SuiteAIntegrityAlgorithm","06036086480186f84201":"cert-extension","06036086480186f842010a":"EntityLogo","06036086480186f842010b":"UserPicture","06036086480186f8420109":"HomePage-url","06036086480186f84202":"data-type","06036086480186f8420201":"GIF","06036086480186f8420202":"JPEG","06036086480186f8420203":"URL","06036086480186f8420204":"HTML","06036086480186f8420205":"netscape-cert-sequence","06036086480186f8420206":"netscape-cert-url","06036086480186f84203":"directory","06036086480186f8420401":"serverGatedCrypto","06036086480186f845010603":"Unknown Verisign extension","06036086480186f845010606":"Unknown Verisign extension","06036086480186f84501070101":"Verisign certificatePolicy","06036086480186f8450107010101":"Unknown Verisign policy qualifier","06036086480186f8450107010102":"Unknown Verisign policy qualifier","0603678105":"TCPA","060367810501":"tcpa_specVersion","060367810502":"tcpa_attribute","06036781050201":"tcpa_at_tpmManufacturer","0603678105020a":"tcpa_at_securityQualities","0603678105020b":"tcpa_at_tpmProtectionProfile","0603678105020c":"tcpa_at_tpmSecurityTarget","0603678105020d":"tcpa_at_foundationProtectionProfile","0603678105020e":"tcpa_at_foundationSecurityTarget","0603678105020f":"tcpa_at_tpmIdLabel","06036781050202":"tcpa_at_tpmModel","06036781050203":"tcpa_at_tpmVersion","06036781050204":"tcpa_at_platformManufacturer","06036781050205":"tcpa_at_platformModel","06036781050206":"tcpa_at_platformVersion","06036781050207":"tcpa_at_componentManufacturer","06036781050208":"tcpa_at_componentModel","06036781050209":"tcpa_at_componentVersion","060367810503":"tcpa_protocol","06036781050301":"tcpa_prtt_tpmIdProtocol","0603672a00":"contentType","0603672a0000":"PANData","0603672a0001":"PANToken","0603672a0002":"PANOnly","0603672a01":"msgExt","0603672a0a":"national","0603672a0a8140":"Japan","0603672a02":"field","0603672a0200":"fullName","0603672a0201":"givenName","0603672a020a":"amount","0603672a0202":"familyName","0603672a0203":"birthFamilyName","0603672a0204":"placeName","0603672a0205":"identificationNumber","0603672a0206":"month","0603672a0207":"date","0603672a02070b":"accountNumber","0603672a02070c":"passPhrase","0603672a0208":"address","0603672a0209":"telephone","0603672a03":"attribute","0603672a0300":"cert","0603672a030000":"rootKeyThumb","0603672a030001":"additionalPolicy","0603672a04":"algorithm","0603672a05":"policy","0603672a0500":"root","0603672a06":"module","0603672a07":"certExt","0603672a0700":"hashedRootKey","0603672a0701":"certificateType","0603672a0702":"merchantData","0603672a0703":"cardCertRequired","0603672a0704":"tunneling","0603672a0705":"setExtensions","0603672a0706":"setQualifier","0603672a08":"brand","0603672a0801":"IATA-ATA","0603672a081e":"Diners","0603672a0822":"AmericanExpress","0603672a0804":"VISA","0603672a0805":"MasterCard","0603672a08ae7b":"Novus","0603672a09":"vendor","0603672a0900":"GlobeSet","0603672a0901":"IBM","0603672a090a":"Griffin","0603672a090b":"Certicom","0603672a090c":"OSS","0603672a090d":"TenthMountain","0603672a090e":"Antares","0603672a090f":"ECC","0603672a0910":"Maithean","0603672a0911":"Netscape","0603672a0912":"Verisign","0603672a0913":"BlueMoney","0603672a0902":"CyberCash","0603672a0914":"Lacerte","0603672a0915":"Fujitsu","0603672a0916":"eLab","0603672a0917":"Entrust","0603672a0918":"VIAnet","0603672a0919":"III","0603672a091a":"OpenMarket","0603672a091b":"Lexem","0603672a091c":"Intertrader","0603672a091d":"Persimmon","0603672a0903":"Terisa","0603672a091e":"NABLE","0603672a091f":"espace-net","0603672a0920":"Hitachi","0603672a0921":"Microsoft","0603672a0922":"NEC","0603672a0923":"Mitsubishi","0603672a0924":"NCR","0603672a0925":"e-COMM","0603672a0926":"Gemplus","0603672a0904":"RSADSI","0603672a0905":"VeriFone","0603672a0906":"TrinTech","0603672a0907":"BankGate","0603672a0908":"GTE","0603672a0909":"CompuSource","0603551d01":"authorityKeyIdentifier","0603551d0a":"basicConstraints","0603551d0b":"nameConstraints","0603551d0c":"policyConstraints","0603551d0d":"basicConstraints","0603551d0e":"subjectKeyIdentifier","0603551d0f":"keyUsage","0603551d10":"privateKeyUsagePeriod","0603551d11":"subjectAltName","0603551d12":"issuerAltName","0603551d13":"basicConstraints","0603551d02":"keyAttributes","0603551d14":"cRLNumber","0603551d15":"cRLReason","0603551d16":"expirationDate","0603551d17":"instructionCode","0603551d18":"invalidityDate","0603551d1a":"issuingDistributionPoint","0603551d1b":"deltaCRLIndicator","0603551d1c":"issuingDistributionPoint","0603551d1d":"certificateIssuer","0603551d03":"certificatePolicies","0603551d1e":"nameConstraints","0603551d1f":"cRLDistributionPoints","0603551d20":"certificatePolicies","0603551d21":"policyMappings","0603551d22":"policyConstraints","0603551d23":"authorityKeyIdentifier","0603551d24":"policyConstraints","0603551d25":"extKeyUsage","0603551d04":"keyUsageRestriction","0603551d05":"policyMapping","0603551d06":"subtreesConstraint","0603551d07":"subjectAltName","0603551d08":"issuerAltName","0603551d09":"subjectDirectoryAttributes","0603550400":"objectClass","0603550401":"aliasObjectName","060355040d":"description","060355040e":"searchGuide","060355040f":"businessCategory","0603550410":"postalAddress","0603550411":"postalCode","0603550412":"postOfficeBox","0603550413":"physicalDeliveryOfficeName","0603550402":"knowledgeInformation","0603550415":"telexNumber","0603550416":"teletexTerminalIdentifier","0603550417":"facsimileTelephoneNumber","0603550418":"x121Address","0603550419":"internationalISDNNumber","060355041a":"registeredAddress","060355041b":"destinationIndicator","060355041c":"preferredDeliveryMehtod","060355041d":"presentationAddress","060355041e":"supportedApplicationContext","060355041f":"member","0603550420":"owner","0603550421":"roleOccupant","0603550422":"seeAlso","0603550423":"userPassword","0603550424":"userCertificate","0603550425":"caCertificate","0603550426":"authorityRevocationList","0603550427":"certificateRevocationList","0603550428":"crossCertificatePair","0603550429":"givenName","0603550405":"serialNumber","0603550434":"supportedAlgorithms","0603550435":"deltaRevocationList","060355043a":"crossCertificatePair","06035508":"X.500-Algorithms","0603550801":"X.500-Alg-Encryption","060355080101":"rsa","0603604c0101":"DPC"};var Punycode={IDN:!1,run_to_ascii:function(a,b){var c=b[0];return c?punycode.ToASCII(a):punycode.encode(a)},run_to_unicode:function(a,b){var c=b[0];return c?punycode.ToUnicode(a):punycode.decode(a)}},QuotedPrintable={run_to:function(a,b){var c=QuotedPrintable.mimeEncode(a);return c=c.replace(/\r?\n|\r/g,function(){return"\r\n"}).replace(/[\t ]+$/gm,function(a){return a.replace(/ /g,"=20").replace(/\t/g,"=09")}),QuotedPrintable._addSoftLinebreaks(c,"qp")},run_from:function(a,b){var c=a.replace(/\=(?:\r?\n|$)/g,"");return QuotedPrintable.mimeDecode(c)},mimeDecode:function(a){for(var b,c,d=(a.match(/\=[\da-fA-F]{2}/g)||[]).length,e=a.length-2*d,f=new Array(e),g=0,h=0,i=a.length;h=0;c--)if(b[c].length){if(1===b[c].length&&a===b[c][0])return!0;if(2===b[c].length&&a>=b[c][0]&&a<=b[c][1])return!0}return!1},_addSoftLinebreaks:function(a,b){var c=76;return b=(b||"base64").toString().toLowerCase().trim(),"qp"===b?this._addQPSoftLinebreaks(a,c):this._addBase64SoftLinebreaks(a,c)},_addBase64SoftLinebreaks:function(a,b){return a=(a||"").toString().trim(),a.replace(new RegExp(".{"+b+"}","g"),"$&\r\n").trim()},_addQPSoftLinebreaks:function(a,b){for(var c,d,e,f=0,g=a.length,h=Math.floor(b/3),i="";fb-h&&(c=e.substr(-h).match(/[ \t\.,!\?][^ \t\.,!\?]*$/)))e=e.substr(0,e.length-(c[0].length-1));else if("\r"===e.substr(-1))e=e.substr(0,e.length-1);else if(e.match(/\=[\da-f]{0,2}$/i))for((c=e.match(/\=[\da-f]{0,1}$/i))&&(e=e.substr(0,e.length-c[0].length));e.length>3&&e.length=192)););f+e.length=65&&c<=90?(c=(c-65+d)%26,e[h]=c+65):f&&c>=97&&c<=122&&(c=(c-97+d)%26,e[h]=c+97)}return e},ROT47_AMOUNT:47,run_rot47:function(a,b){var c,d=b[0],e=a;if(d){d<0&&(d=94-Math.abs(d)%94);for(var f=0;f=33&&c<=126&&(c=(c-33+d)%94,e[f]=c+33)}return e},_rotr:function(a){var b=(1&a)<<7;return a>>1|b},_rotl:function(a){var b=a>>7&1;return 255&(a<<1|b)},_rotr_whole:function(a,b){var c,d=0,e=[];b%=8;for(var f=0;f>>0;c=g>>b|d,d=(g&Math.pow(2,b)-1)<<8-b,e.push(c)}return e[0]|=d,e},_rotl_whole:function(a,b){var c,d=0,e=[];b%=8;for(var f=a.length-1;f>=0;f--){var g=a[f];c=255&(g<>8-b&Math.pow(2,b)-1,e[f]=c}return e[a.length-1]=e[a.length-1]|d,e}},SeqUtils={DELIMITER_OPTIONS:["Line feed","CRLF","Space","Comma","Semi-colon","Colon","Nothing (separate chars)"],SORT_REVERSE:!1,SORT_ORDER:["Alphabetical (case sensitive)","Alphabetical (case insensitive)","IP address"],run_sort:function(a,b){var c=Utils.char_rep[b[0]],d=b[1],e=b[2],f=a.split(c);return"Alphabetical (case sensitive)"===e?f=f.sort():"Alphabetical (case insensitive)"===e?f=f.sort(SeqUtils._case_insensitive_sort):"IP address"===e&&(f=f.sort(SeqUtils._ip_sort)),d&&f.reverse(),f.join(c)},run_unique:function(a,b){var c=Utils.char_rep[b[0]];return a.split(c).unique().join(c)},SEARCH_TYPE:["Regex","Extended (\\n, \\t, \\x...)","Simple string"],run_count:function(a,b){var c=b[0].string,d=b[0].option;if("Regex"!==d||!c)return c?(0===d.indexOf("Extended")&&(c=Utils.parse_escaped_chars(c)),a.count(c)):0;try{var e=new RegExp(c,"gi"),f=a.match(e);return f.length}catch(a){return 0}},REVERSE_BY:["Character","Line"],run_reverse:function(a,b){if("Line"===b[0]){for(var c=[],d=[],e=[],f=0;f()\\[\\]{}\\s\\x7F-\\xFF]*(?:[.!,?]+[^.!,?;"\\x27<>()\\[\\]{}\\s\\x7F-\\xFF]+)*)?'},{name:"Domain",value:"(?:(https?):\\/\\/)?([-\\w.]+)\\.(com|net|org|biz|info|co|uk|onion|int|mobi|name|edu|gov|mil|eu|ac|ae|af|de|ca|ch|cn|cy|es|gb|hk|il|in|io|tv|me|nl|no|nz|ro|ru|tr|us|az|ir|kz|uz|pk)+"},{name:"Windows file path",value:"([A-Za-z]):\\\\((?:[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)]{0,61}\\\\?)*[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)]{0,61})(\\.[A-Za-z\\d]{1,6})?"},{name:"UNIX file path",value:"(?:/[A-Za-z\\d.][A-Za-z\\d\\-.]{0,61})+"},{name:"MAC address",value:"[A-Fa-f\\d]{2}(?:[:-][A-Fa-f\\d]{2}){5}"},{name:"Date (yyyy-mm-dd)",value:"((?:19|20)\\d\\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])"},{name:"Date (dd/mm/yyyy)",value:"(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((?:19|20)\\d\\d)"},{name:"Date (mm/dd/yyyy)",value:"(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.]((?:19|20)\\d\\d)"},{name:"Strings",value:'[A-Za-z\\d/\\-:.,_$%\\x27"()<>= !\\[\\]{}@]{4,}'}],REGEX_CASE_INSENSITIVE:!0,REGEX_MULTILINE_MATCHING:!0,OUTPUT_FORMAT:["Highlight matches","List matches","List capture groups","List matches with capture groups"],DISPLAY_TOTAL:!1,run_regex:function(a,b){var c=b[1],d=b[2],e=b[3],f=b[4],g=b[5],h="g";if(d&&(h+="i"),e&&(h+="m"),!c||"^"===c||"$"===c)return Utils.escape_html(a);try{var i=new RegExp(c,h);switch(g){case"Highlight matches":return StrUtils._regex_highlight(a,i,f);case"List matches":return Utils.escape_html(StrUtils._regex_list(a,i,f,!0,!1));case"List capture groups":return Utils.escape_html(StrUtils._regex_list(a,i,f,!1,!0));case"List matches with capture groups":return Utils.escape_html(StrUtils._regex_list(a,i,f,!0,!0));default:return"Error: Invalid output format"}}catch(a){return"Invalid regex. Details: "+a.message}},CASE_SCOPE:["All","Word","Sentence","Paragraph"],run_upper:function(a,b){var c=b[0];switch(c){case"Word":return a.replace(/(\b\w)/gi,function(a){return a.toUpperCase()});case"Sentence":return a.replace(/(?:\.|^)\s*(\b\w)/gi,function(a){return a.toUpperCase()});case"Paragraph":return a.replace(/(?:\n|^)\s*(\b\w)/gi,function(a){return a.toUpperCase()});case"All":default:return a.toUpperCase()}},run_lower:function(a,b){return a.toLowerCase()},SEARCH_TYPE:["Regex","Extended (\\n, \\t, \\x...)","Simple string"],FIND_REPLACE_GLOBAL:!0,FIND_REPLACE_CASE:!1,FIND_REPLACE_MULTILINE:!0,run_find_replace:function(a,b){var c=b[0].string,d=b[0].option,e=b[1],f=b[2],g=b[3],h=b[4],i="";return f&&(i+="g"),g&&(i+="i"),h&&(i+="m"),"Regex"===d?c=new RegExp(c,i):0===d.indexOf("Extended")&&(c=Utils.parse_escaped_chars(c)),a.replace(c,e,i)},SPLIT_DELIM:",",DELIMITER_OPTIONS:["Line feed","CRLF","Space","Comma","Semi-colon","Colon","Nothing (separate chars)"],run_split:function(a,b){var c=b[0]||StrUtils.SPLIT_DELIM,d=Utils.char_rep[b[1]],e=a.split(c);return e.join(d)},DIFF_SAMPLE_DELIMITER:"\\n\\n",DIFF_BY:["Character","Word","Line","Sentence","CSS","JSON"],run_diff:function(a,b){var c,d=b[0],e=b[1],f=b[2],g=b[3],h=b[4],i=a.split(d),j="";if(!i||2!==i.length)return"Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?";switch(e){case"Character":c=JsDiff.diffChars(i[0],i[1]);break;case"Word":c=h?JsDiff.diffWords(i[0],i[1]):JsDiff.diffWordsWithSpace(i[0],i[1]);break;case"Line":c=h?JsDiff.diffTrimmedLines(i[0],i[1]):JsDiff.diffLines(i[0],i[1]);break;case"Sentence":c=JsDiff.diffSentences(i[0],i[1]);break;case"CSS":c=JsDiff.diffCss(i[0],i[1]);break;case"JSON":c=JsDiff.diffJson(i[0],i[1]);break;default:return"Invalid 'Diff by' option."}for(var k=0;k"+Utils.escape_html(c[k].value)+""):c[k].removed?g&&(j+=""+Utils.escape_html(c[k].value)+""):j+=Utils.escape_html(c[k].value);return j},OFF_CHK_SAMPLE_DELIMITER:"\\n\\n",run_offset_checker:function(a,b){var c,d=b[0],e=a.split(d),f=[],g=0,h=0,i=!1,j=!1;if(!e||e.length<2)return"Not enough samples, perhaps you need to modify the sample delimiter or add more data?";for(h=0;h"),h===e.length-1&&(j=!1)):(i&&!j?(f[h]+=""+Utils.escape_html(e[h][g]),e[h].length===g+1&&(f[h]+=""),h===e.length-1&&(j=!0)):!i&&j?(f[h]+=""+Utils.escape_html(e[h][g]),h===e.length-1&&(j=!1)):(f[h]+=Utils.escape_html(e[h][g]),j&&e[h].length===g+1&&(f[h]+="",e[h].length-1!==g&&(j=!1))),e[0].length-1===g&&(j&&(f[h]+=""),f[h]+=Utils.escape_html(e[h].substring(g+1))))}return f.join(d)},run_parse_escaped_string:function(a,b){return Utils.parse_escaped_chars(a)},_regex_highlight:function(a,b,c){for(var d,e="",f=1,g=0,h=0;d=b.exec(a);)e+=Utils.escape_html(a.slice(g,d.index)),e+=""+Utils.escape_html(d[0])+"",f=1===f?2:1,g=b.lastIndex,h++;return e+=Utils.escape_html(a.slice(g,a.length)),c&&(e="Total found: "+h+"\n\n"+e),e},_regex_list:function(a,b,c,d,e){for(var f,g="",h=0;f=b.exec(a);)if(h++,d&&(g+=f[0]+"\n"),e)for(var i=1;ih?g[i][0].length:h;for(i=0;i1&&g[i][1].length?" = "+g[i][1]+"\n":"\n"}return d}return"Invalid URI"},_encode_all_chars:function(a){return encodeURIComponent(a).replace(/!/g,"%21").replace(/#/g,"%23").replace(/'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\*/g,"%2A").replace(/\-/g,"%2D").replace(/\./g,"%2E").replace(/_/g,"%5F").replace(/~/g,"%7E")}},UUID={run_generate_v4:function(a,b){if("undefined"!=typeof window.crypto&&"undefined"!=typeof window.crypto.getRandomValues){var c=new Uint32Array(4),d=0;return window.crypto.getRandomValues(c),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=c[d>>3]>>d%8*4&15,e="x"===a?b:3&b|8;return d++,e.toString(16)})}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"===a?b:3&b|8;return c.toString(16)})}},Chef=function(){this.dish=new Dish};Chef.prototype.bake=function(a,b,c,d,e){var f=(new Date).getTime(),g=new Recipe(b),h=g.contains_flow_control(),i=!1;c.hasOwnProperty("attempt_highlight")&&(c.attempt_highlight=!0),h&&(c.attempt_highlight=!1),d>=b.length&&(d=0),e&&(g.set_breakpoint(d,!1),g.set_breakpoint(d+1,!0)),d>0&&h&&(g.remove_breaks_up_to(d),d=0),0===d&&this.dish.set(a,Dish.STRING);try{d=g.execute(this.dish,d)}catch(a){i=a,d=a.progress}return{result:this.dish.type===Dish.HTML?this.dish.get(Dish.HTML):this.dish.get(Dish.STRING),type:Dish.enum_lookup(this.dish.type),progress:d,options:c,duration:(new Date).getTime()-f,error:i}},Chef.prototype.silent_bake=function(a){var b=(new Date).getTime(),c=new Recipe(a),d=new Dish("",Dish.STRING);try{c.execute(d)}catch(a){}return(new Date).getTime()-b};var Dish=function(a,b){this.value=a||"string"==typeof a?a:null,this.type=b||Dish.BYTE_ARRAY};Dish.BYTE_ARRAY=0,Dish.STRING=1,Dish.NUMBER=2,Dish.HTML=3,Dish.type_enum=function(a){switch(a){case"byte_array":case"Byte array":return Dish.BYTE_ARRAY;case"string":case"String":return Dish.STRING;case"number":case"Number":return Dish.NUMBER;case"html":case"HTML":return Dish.HTML;default:throw"Invalid data type string. No matching enum."}},Dish.enum_lookup=function(a){switch(a){case Dish.BYTE_ARRAY:return"byte_array";case Dish.STRING:return"string";case Dish.NUMBER:return"number";case Dish.HTML:return"html";default:throw"Invalid data type enum. No matching type."}},Dish.prototype.set=function(a,b){if(this.value=a,this.type=b,!this.valid()){var c=Utils.truncate(JSON.stringify(this.value),13);throw"Data is not a valid "+Dish.enum_lookup(b)+": "+c}},Dish.prototype.get=function(a){return this.type!==a&&this.translate(a),this.value},Dish.prototype.translate=function(a){switch(this.type){case Dish.STRING:this.value=this.value?Utils.str_to_byte_array(this.value):[],this.type=Dish.BYTE_ARRAY;break;case Dish.NUMBER:this.value="number"==typeof this.value?Utils.str_to_byte_array(this.value.toString()):[],this.type=Dish.BYTE_ARRAY;break;case Dish.HTML:this.value=this.value?Utils.str_to_byte_array(Utils.strip_html_tags(this.value,!0)):[],this.type=Dish.BYTE_ARRAY}switch(a){case Dish.STRING:case Dish.HTML:this.value=this.value?Utils.byte_array_to_utf8(this.value):"",this.type=Dish.STRING;break;case Dish.NUMBER:this.value=this.value?parseFloat(Utils.byte_array_to_utf8(this.value)):0,this.type=Dish.NUMBER}},Dish.prototype.valid=function(){switch(this.type){case Dish.BYTE_ARRAY:if(!(this.value instanceof Array))return!1;for(var a=0;a255)return!1;return!0;case Dish.STRING:case Dish.HTML:return"string"==typeof this.value;case Dish.NUMBER:return"number"==typeof this.value;default:return!1}};const FlowControl={FORK_DELIM:"\\n",MERGE_DELIM:"\\n",run_fork:function(a){var b=a.op_list,c=b[a.progress].input_type,d=b[a.progress].output_type,e=a.dish.get(c),f=b[a.progress].get_ing_values(),g=f[0],h=f[1],i=[],j=[];e&&(j=e.split(g));for(var k=a.progress+1;k=d)throw"Reached maximum jumps, sorry!";return a.progress+=c,a.num_jumps++,a},run_cond_jump:function(a){var b=a.op_list[a.progress].get_ing_values(),c=a.dish,d=b[0],e=b[1],f=b[2];if(a.num_jumps>=f)throw"Reached maximum jumps, sorry!";return""!==d&&c.get(Dish.STRING).search(d)>-1&&(a.progress+=e,a.num_jumps++),a},run_return:function(a){return a.progress=a.op_list.length,a}};var Ingredient=function(a){this.name="",this.type="",this.value=null,a&&this._parse_config(a)};Ingredient.prototype._parse_config=function(a){this.name=a.name,this.type=a.type},Ingredient.prototype.get_config=function(){return this.value},Ingredient.prototype.set_value=function(a){this.value=Ingredient.prepare(a,this.type)},Ingredient.prepare=function(a,b){switch(b){case"binary_string":case"binary_short_string":case"editable_option":return Utils.parse_escaped_chars(a);case"byte_array":return"string"==typeof a?(a=a.replace(/\s+/g,""),Utils.hex_to_byte_array(a)):a;case"number":var c=parseFloat(a);if(isNaN(c)){var d=Utils.truncate(a.toString(),10);throw"Invalid ingredient value. Not a number: "+d}return c;default:return a}};var Operation=function(a,b){this.name=a,this.description="",this.input_type=-1,this.output_type=-1,this.run=null,this.highlight=null,this.highlight_reverse=null,this.breakpoint=!1,this.disabled=!1,this.ing_list=[],b&&this._parse_config(b)};Operation.prototype._parse_config=function(a){this.description=a.description,this.input_type=Dish.type_enum(a.input_type),this.output_type=Dish.type_enum(a.output_type),this.run=a.run,this.highlight=a.highlight,this.highlight_reverse=a.highlight_reverse,this.flow_control=a.flow_control;for(var b=0;b
                                      Message: "+i.message:i.display_str+=i.message,i}}return this.op_list.length},Recipe.prototype.to_string=function(){return JSON.stringify(this.get_config())},Recipe.prototype.from_string=function(a){var b=JSON.parse(a);this._parse_config(b)};const Categories=[{name:"Favourites",ops:[]},{name:"Data format",ops:["To Hexdump","From Hexdump","To Hex","From Hex","To Charcode","From Charcode","To Decimal","From Decimal","To Binary","From Binary","To Base64","From Base64","Show Base64 offsets","To Base32","From Base32","To Base","From Base","To HTML Entity","From HTML Entity","URL Encode","URL Decode","Unescape Unicode Characters","To Quoted Printable","From Quoted Printable","To Punycode","From Punycode","To Hex Content","From Hex Content","PEM to Hex","Hex to PEM","Parse ASN.1 hex string","Change IP format","Text encoding","Swap endianness"]},{name:"Encryption / Encoding",ops:["AES Encrypt","AES Decrypt","Blowfish Encrypt","Blowfish Decrypt","DES Encrypt","DES Decrypt","Triple DES Encrypt","Triple DES Decrypt","Rabbit Encrypt","Rabbit Decrypt","RC4","RC4 Drop","ROT13","ROT47","XOR","XOR Brute Force","Vigen\xe8re Encode","Vigen\xe8re Decode","Derive PBKDF2 key","Derive EVP key"]},{name:"Public Key",ops:["Parse X.509 certificate","Parse ASN.1 hex string","PEM to Hex","Hex to PEM","Hex to Object Identifier","Object Identifier to Hex"]},{name:"Logical operations",ops:["XOR","XOR Brute Force","OR","NOT","AND","ADD","SUB","Rotate left","Rotate right","ROT13"]},{name:"Networking",ops:["Strip HTTP headers","Parse User Agent","Parse IP range","Parse IPv6 address","Parse URI","URL Encode","URL Decode","Format MAC addresses","Change IP format","Group IP addresses"]},{name:"Language",ops:["Text encoding","Unescape Unicode Characters"]},{name:"Utils",ops:["Diff","Remove whitespace","Remove null bytes","To Upper case","To Lower case","Add line numbers","Remove line numbers","Reverse","Sort","Unique","Split","Count occurrences","Expand alphabet range","Parse escaped string","Drop bytes","Take bytes","Pad lines","Find / Replace","Regular expression","Offset checker","Convert distance","Convert area","Convert mass","Convert speed","Convert data units","Parse UNIX file permissions","Swap endianness","Parse colour code"]},{name:"Date / Time",ops:["Parse DateTime","Translate DateTime Format","From UNIX Timestamp","To UNIX Timestamp","Extract dates"]},{name:"Extractors",ops:["Strings","Extract IP addresses","Extract email addresses","Extract MAC addresses","Extract URLs","Extract domains","Extract file paths","Extract dates","Regular expression","XPath expression","CSS selector"] },{name:"Compression",ops:["Raw Deflate","Raw Inflate","Zlib Deflate","Zlib Inflate","Gzip","Gunzip","Zip","Unzip","Bzip2 Decompress"]},{name:"Hashing",ops:["Analyse hash","Generate all hashes","MD5","SHA1","SHA224","SHA256","SHA384","SHA512","SHA3","RIPEMD-160","HMAC","Fletcher-16 Checksum","Adler-32 Checksum","CRC-32 Checksum","TCP/IP Checksum"]},{name:"Code tidy",ops:["Syntax highlighter","Generic Code Beautify","JavaScript Parser","JavaScript Beautify","JavaScript Minify","JSON Beautify","JSON Minify","XML Beautify","XML Minify","SQL Beautify","SQL Minify","CSS Beautify","CSS Minify","XPath expression","CSS selector","Strip HTML tags","Diff"]},{name:"Other",ops:["Entropy","Frequency distribution","Detect File Type","Scan for Embedded Files","Generate UUID","Numberwang"]},{name:"Flow control",ops:["Fork","Merge","Jump","Conditional Jump","Return"]}],OperationConfig={Fork:{description:"Split the input data up based on the specified delimiter and run all subsequent operations on each branch separately.

                                      For example, to decode multiple Base64 strings, enter them all on separate lines then add the 'Fork' and 'From Base64' operations to the recipe. Each string will be decoded separately.",run:FlowControl.run_fork,input_type:"string",output_type:"string",flow_control:!0,args:[{name:"Split delimiter",type:"binary_short_string",value:FlowControl.FORK_DELIM},{name:"Merge delimiter",type:"binary_short_string",value:FlowControl.MERGE_DELIM}]},Merge:{description:"Consolidate all branches back into a single trunk. The opposite of Fork.",run:FlowControl.run_merge,input_type:"string",output_type:"string",flow_control:!0,args:[]},Jump:{description:"Jump forwards or backwards over the specified number of operations.",run:FlowControl.run_jump,input_type:"string",output_type:"string",flow_control:!0,args:[{name:"Number of operations to jump over",type:"number",value:FlowControl.JUMP_NUM},{name:"Maximum jumps (if jumping backwards)",type:"number",value:FlowControl.MAX_JUMPS}]},"Conditional Jump":{description:"Conditionally jump forwards or backwards over the specified number of operations based on whether the data matches the specified regular expression.",run:FlowControl.run_cond_jump,input_type:"string",output_type:"string",flow_control:!0,args:[{name:"Match (regex)",type:"string",value:""},{name:"Number of operations to jump over if match found",type:"number",value:FlowControl.JUMP_NUM},{name:"Maximum jumps (if jumping backwards)",type:"number",value:FlowControl.MAX_JUMPS}]},Return:{description:"End execution of operations at this point in the recipe.",run:FlowControl.run_return,input_type:"string",output_type:"string",flow_control:!0,args:[]},"From Base64":{description:"Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

                                      This operation decodes data from an ASCII Base64 string back into its raw format.

                                      e.g. aGVsbG8= becomes hello",run:Base64.run_from,highlight:Base64.highlight_from,highlight_reverse:Base64.highlight_to,input_type:"string",output_type:"byte_array",args:[{name:"Alphabet",type:"editable_option",value:Base64.ALPHABET_OPTIONS},{name:"Remove non‑alphabet chars",type:"boolean",value:Base64.REMOVE_NON_ALPH_CHARS}]},"To Base64":{description:"Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.

                                      This operation encodes data in an ASCII Base64 string.

                                      e.g. hello becomes aGVsbG8=",run:Base64.run_to,highlight:Base64.highlight_to,highlight_reverse:Base64.highlight_from,input_type:"byte_array",output_type:"string",args:[{name:"Alphabet",type:"editable_option",value:Base64.ALPHABET_OPTIONS}]},"From Base32":{description:"Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7.",run:Base64.run_from_32,input_type:"string",output_type:"byte_array",args:[{name:"Alphabet",type:"binary_string",value:Base64.BASE32_ALPHABET},{name:"Remove non‑alphabet chars",type:"boolean",value:Base64.REMOVE_NON_ALPH_CHARS}]},"To Base32":{description:"Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7.",run:Base64.run_to_32,input_type:"byte_array",output_type:"string",args:[{name:"Alphabet",type:"binary_string",value:Base64.BASE32_ALPHABET}]},"Show Base64 offsets":{description:"When a string is within a block of data and the whole block is Base64'd, the string itself could be represented in Base64 in three distinct ways depending on its offset within the block.

                                      This operation shows all possible offsets for a given string so that each possible encoding can be considered.",run:Base64.run_offsets,input_type:"byte_array",output_type:"html",args:[{name:"Alphabet",type:"binary_string",value:Base64.ALPHABET},{name:"Show variable chars and padding",type:"boolean",value:Base64.OFFSETS_SHOW_VARIABLE}]},XOR:{description:"XOR the input with the given key.
                                      e.g. fe023da5

                                      Options
                                      Null preserving: If the current byte is 0x00 or the same as the key, skip it.

                                      Scheme:
                                      • Standard - key is unchanged after each round
                                      • Input differential - key is set to the value of the previous unprocessed byte
                                      • Output differential - key is set to the value of the previous processed byte
                                      ",run:BitwiseOp.run_xor,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[{name:"Key",type:"toggle_string",value:"",toggle_values:BitwiseOp.KEY_FORMAT},{name:"Scheme",type:"option",value:BitwiseOp.XOR_SCHEME},{name:"Null preserving",type:"boolean",value:BitwiseOp.XOR_PRESERVE_NULLS}]},"XOR Brute Force":{description:"Enumerate all possible XOR solutions. Current maximum key length is 2 due to browser performance.

                                      Optionally enter a regex string that you expect to find in the plaintext to filter results (crib).",run:BitwiseOp.run_xor_brute,input_type:"byte_array",output_type:"string",args:[{name:"Key length",type:"option",value:BitwiseOp.XOR_BRUTE_KEY_LENGTH},{name:"Length of sample",type:"number",value:BitwiseOp.XOR_BRUTE_SAMPLE_LENGTH},{name:"Offset of sample",type:"number",value:BitwiseOp.XOR_BRUTE_SAMPLE_OFFSET},{name:"Null preserving",type:"boolean",value:BitwiseOp.XOR_PRESERVE_NULLS},{name:"Differential",type:"boolean",value:BitwiseOp.XOR_DIFFERENTIAL},{name:"Crib (known plaintext string)",type:"binary_string",value:""},{name:"Print key",type:"boolean",value:BitwiseOp.XOR_BRUTE_PRINT_KEY},{name:"Output as hex",type:"boolean",value:BitwiseOp.XOR_BRUTE_OUTPUT_HEX}]},NOT:{description:"Returns the inverse of each byte.",run:BitwiseOp.run_not,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[]},AND:{description:"AND the input with the given key.
                                      e.g. fe023da5",run:BitwiseOp.run_and,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[{name:"Key",type:"toggle_string",value:"",toggle_values:BitwiseOp.KEY_FORMAT}]},OR:{description:"OR the input with the given key.
                                      e.g. fe023da5",run:BitwiseOp.run_or,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[{name:"Key",type:"toggle_string",value:"",toggle_values:BitwiseOp.KEY_FORMAT}]},ADD:{description:"ADD the input with the given key (e.g. fe023da5), MOD 255",run:BitwiseOp.run_add,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[{name:"Key",type:"toggle_string",value:"",toggle_values:BitwiseOp.KEY_FORMAT}]},SUB:{description:"SUB the input with the given key (e.g. fe023da5), MOD 255",run:BitwiseOp.run_sub,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[{name:"Key",type:"toggle_string",value:"",toggle_values:BitwiseOp.KEY_FORMAT}]},"From Hex":{description:"Converts a hexadecimal byte string back into a its raw value.

                                      e.g. ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a becomes the UTF-8 encoded string \u0393\u03b5\u03b9\u03ac \u03c3\u03bf\u03c5",run:ByteRepr.run_from_hex,highlight:ByteRepr.highlight_from,highlight_reverse:ByteRepr.highlight_to,input_type:"string",output_type:"byte_array",args:[{name:"Delimiter",type:"option",value:ByteRepr.HEX_DELIM_OPTIONS}]},"To Hex":{description:"Converts the input string to hexadecimal bytes separated by the specified delimiter.

                                      e.g. The UTF-8 encoded string \u0393\u03b5\u03b9\u03ac \u03c3\u03bf\u03c5 becomes ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a",run:ByteRepr.run_to_hex,highlight:ByteRepr.highlight_to,highlight_reverse:ByteRepr.highlight_from,input_type:"byte_array",output_type:"string",args:[{name:"Delimiter",type:"option",value:ByteRepr.HEX_DELIM_OPTIONS}]},"From Charcode":{description:"Converts unicode character codes back into text.

                                      e.g. 0393 03b5 03b9 03ac 20 03c3 03bf 03c5 becomes \u0393\u03b5\u03b9\u03ac \u03c3\u03bf\u03c5",run:ByteRepr.run_from_charcode,highlight:ByteRepr.highlight_from,highlight_reverse:ByteRepr.highlight_to,input_type:"string",output_type:"byte_array",args:[{name:"Delimiter",type:"option",value:ByteRepr.DELIM_OPTIONS},{name:"Base",type:"number",value:ByteRepr.CHARCODE_BASE}]},"To Charcode":{description:"Converts text to its unicode character code equivalent.

                                      e.g. \u0393\u03b5\u03b9\u03ac \u03c3\u03bf\u03c5 becomes 0393 03b5 03b9 03ac 20 03c3 03bf 03c5",run:ByteRepr.run_to_charcode,highlight:ByteRepr.highlight_to,highlight_reverse:ByteRepr.highlight_from,input_type:"string",output_type:"string",args:[{name:"Delimiter",type:"option",value:ByteRepr.DELIM_OPTIONS},{name:"Base",type:"number",value:ByteRepr.CHARCODE_BASE}]},"From Binary":{description:"Converts a binary string back into its raw form.

                                      e.g. 01001000 01101001 becomes Hi",run:ByteRepr.run_from_binary,highlight:ByteRepr.highlight_from_binary,highlight_reverse:ByteRepr.highlight_to_binary,input_type:"string",output_type:"byte_array",args:[{name:"Delimiter",type:"option",value:ByteRepr.BIN_DELIM_OPTIONS}]},"To Binary":{description:"Displays the input data as a binary string.

                                      e.g. Hi becomes 01001000 01101001",run:ByteRepr.run_to_binary,highlight:ByteRepr.highlight_to_binary,highlight_reverse:ByteRepr.highlight_from_binary,input_type:"byte_array",output_type:"string",args:[{name:"Delimiter",type:"option",value:ByteRepr.BIN_DELIM_OPTIONS}]},"From Decimal":{description:"Converts the data from an ordinal integer array back into its raw form.

                                      e.g. 72 101 108 108 111 becomes Hello",run:ByteRepr.run_from_decimal,input_type:"string",output_type:"byte_array",args:[{name:"Delimiter",type:"option",value:ByteRepr.DELIM_OPTIONS}]},"To Decimal":{description:"Converts the input data to an ordinal integer array.

                                      e.g. Hello becomes 72 101 108 108 111",run:ByteRepr.run_to_decimal,input_type:"byte_array",output_type:"string",args:[{name:"Delimiter",type:"option",value:ByteRepr.DELIM_OPTIONS}]},"From Hexdump":{description:"Attempts to convert a hexdump back into raw data. This operation supports many different hexdump variations, but probably not all. Make sure you verify that the data it gives you is correct before continuing analysis.",run:Hexdump.run_from,highlight:Hexdump.highlight_from,highlight_reverse:Hexdump.highlight_to,input_type:"string",output_type:"byte_array",args:[]},"To Hexdump":{description:"Creates a hexdump of the input data, displaying both the hexademinal values of each byte and an ASCII representation alongside.",run:Hexdump.run_to,highlight:Hexdump.highlight_to,highlight_reverse:Hexdump.highlight_from,input_type:"byte_array",output_type:"string",args:[{name:"Width",type:"number",value:Hexdump.WIDTH},{name:"Upper case hex",type:"boolean",value:Hexdump.UPPER_CASE},{name:"Include final length",type:"boolean",value:Hexdump.INCLUDE_FINAL_LENGTH}]},"From Base":{description:"Converts a number to decimal from a given numerical base.",run:Base.run_from,input_type:"string",output_type:"number",args:[{name:"Radix",type:"number",value:Base.DEFAULT_RADIX}]},"To Base":{description:"Converts a decimal number to a given numerical base.",run:Base.run_to,input_type:"number",output_type:"string",args:[{name:"Radix",type:"number",value:Base.DEFAULT_RADIX}]},"From HTML Entity":{description:"Converts HTML entities back to characters

                                      e.g. &amp; becomes &",run:HTML.run_from_entity,input_type:"string",output_type:"string",args:[]},"To HTML Entity":{description:"Converts characters to HTML entities

                                      e.g. & becomes &amp;",run:HTML.run_to_entity,input_type:"string",output_type:"string",args:[{name:"Convert all characters",type:"boolean",value:HTML.CONVERT_ALL},{name:"Convert to",type:"option",value:HTML.CONVERT_OPTIONS}]},"Strip HTML tags":{description:"Removes all HTML tags from the input.",run:HTML.run_strip_tags,input_type:"string",output_type:"string",args:[{name:"Remove indentation",type:"boolean",value:HTML.REMOVE_INDENTATION},{name:"Remove excess line breaks",type:"boolean",value:HTML.REMOVE_LINE_BREAKS}]},"URL Decode":{description:"Converts URI/URL percent-encoded characters back to their raw values.

                                      e.g. %3d becomes =",run:URL_.run_from,input_type:"string",output_type:"string",args:[]},"URL Encode":{description:"Encodes problematic characters into percent-encoding, a format supported by URIs/URLs.

                                      e.g. = becomes %3d",run:URL_.run_to,input_type:"string",output_type:"string",args:[{name:"Encode all special chars",type:"boolean",value:URL_.ENCODE_ALL}]},"Parse URI":{description:"Pretty prints complicated Uniform Resource Identifier (URI) strings for ease of reading. Particularly useful for Uniform Resource Locators (URLs) with a lot of arguments.",run:URL_.run_parse,input_type:"string",output_type:"string",args:[]},"Unescape Unicode Characters":{description:"Converts unicode-escaped character notation back into raw characters.

                                      Supports the prefixes:
                                      • \\u
                                      • %u
                                      • U+
                                      e.g. \\u03c3\\u03bf\\u03c5 becomes \u03c3\u03bf\u03c5",run:Unicode.run_unescape,input_type:"string",output_type:"string",args:[{name:"Prefix",type:"option",value:Unicode.PREFIXES}]},"From Quoted Printable":{description:"Converts QP-encoded text back to standard text.",run:QuotedPrintable.run_from,input_type:"string",output_type:"byte_array",args:[]},"To Quoted Printable":{description:"Quoted-Printable, or QP encoding, is an encoding using printable ASCII characters (alphanumeric and the equals sign '=') to transmit 8-bit data over a 7-bit data path or, generally, over a medium which is not 8-bit clean. It is defined as a MIME content transfer encoding for use in e-mail.

                                      QP works by using the equals sign '=' as an escape character. It also limits line length to 76, as some software has limits on line length.",run:QuotedPrintable.run_to,input_type:"byte_array",output_type:"string",args:[]},"From Punycode":{description:"Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

                                      e.g. mnchen-3ya decodes to m\xfcnchen",run:Punycode.run_to_unicode,input_type:"string",output_type:"string",args:[{name:"Internationalised domain name",type:"boolean",value:Punycode.IDN}]},"To Punycode":{description:"Punycode is a way to represent Unicode with the limited character subset of ASCII supported by the Domain Name System.

                                      e.g. m\xfcnchen encodes to mnchen-3ya",run:Punycode.run_to_ascii,input_type:"string",output_type:"string",args:[{name:"Internationalised domain name",type:"boolean",value:Punycode.IDN}]},"From Hex Content":{description:"Translates hexadecimal bytes in text back to raw bytes.

                                      e.g. foo|3d|bar becomes foo=bar.",run:ByteRepr.run_from_hex_content,input_type:"string",output_type:"byte_array",args:[]},"To Hex Content":{description:"Converts special characters in a string to hexadecimal.

                                      e.g. foo=bar becomes foo|3d|bar.",run:ByteRepr.run_to_hex_content,input_type:"byte_array",output_type:"string",args:[{name:"Convert",type:"option",value:ByteRepr.HEX_CONTENT_CONVERT_WHICH},{name:"Print spaces between bytes",type:"boolean",value:ByteRepr.HEX_CONTENT_SPACES_BETWEEN_BYTES}]},"Change IP format":{description:"Convert an IP address from one format to another, e.g. 172.20.23.54 to ac141736",run:IP.run_change_ip_format,input_type:"string",output_type:"string",args:[{name:"Input format",type:"option",value:IP.IP_FORMAT_LIST},{name:"Output format",type:"option",value:IP.IP_FORMAT_LIST}]},"Parse IP range":{description:"Given a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0), this operation provides network information and enumerates all IP addresses in the range.

                                      IPv6 is supported but will not be enumerated.",run:IP.run_parse_ip_range,input_type:"string",output_type:"string",args:[{name:"Include network info",type:"boolean",value:IP.INCLUDE_NETWORK_INFO},{name:"Enumerate IP addresses",type:"boolean",value:IP.ENUMERATE_ADDRESSES},{name:"Allow large queries",type:"boolean",value:IP.ALLOW_LARGE_LIST}]},"Group IP addresses":{description:"Groups a list of IP addresses into subnets. Supports both IPv4 and IPv6 addresses.",run:IP.run_group_ips,input_type:"string",output_type:"string",args:[{name:"Delimiter",type:"option",value:IP.DELIM_OPTIONS},{name:"Subnet (CIDR)",type:"number",value:IP.GROUP_CIDR},{name:"Only show the subnets",type:"boolean",value:IP.GROUP_ONLY_SUBNET}]},"Parse IPv6 address":{description:"Displays the longhand and shorthand versions of a valid IPv6 address.

                                      Recognises all reserved ranges and parses encapsulated or tunnelled addresses including Teredo and 6to4.",run:IP.run_parse_ipv6,input_type:"string",output_type:"string",args:[]},"Text encoding":{description:"Translates the data between different character encodings.

                                      Supported charsets are:
                                      • UTF8
                                      • UTF16
                                      • UTF16LE (little-endian)
                                      • UTF16BE (big-endian)
                                      • Hex
                                      • Base64
                                      • Latin1 (ISO-8859-1)
                                      • Windows-1251
                                      ",run:CharEnc.run,input_type:"string",output_type:"string",args:[{name:"Input type",type:"option",value:CharEnc.IO_FORMAT},{name:"Output type",type:"option",value:CharEnc.IO_FORMAT}]},"AES Decrypt":{description:"To successfully decrypt AES, you need either:
                                      • The passphrase
                                      • Or the key and IV
                                      The IV should be the first 16 bytes of encrypted material.",run:Cipher.run_aes_dec,input_type:"string",output_type:"string",args:[{name:"Passphrase/Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"IV",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Salt",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Mode",type:"option",value:Cipher.MODES},{name:"Padding",type:"option",value:Cipher.PADDING},{name:"Input format",type:"option",value:Cipher.IO_FORMAT1},{name:"Output format",type:"option",value:Cipher.IO_FORMAT2}]},"AES Encrypt":{description:"Input: Either enter a passphrase (which will be used to derive a key using the OpenSSL KDF) or both the key and IV.

                                      Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.

                                      AES-128, AES-192, and AES-256 are supported. The variant will be chosen based on the size of the key passed in. If a passphrase is used, a 256-bit key will be generated.",run:Cipher.run_aes_enc,input_type:"string",output_type:"string",args:[{name:"Passphrase/Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"IV",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Salt",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Mode",type:"option",value:Cipher.MODES},{name:"Padding",type:"option",value:Cipher.PADDING},{name:"Output result",type:"option",value:Cipher.RESULT_TYPE},{name:"Output format",type:"option",value:Cipher.IO_FORMAT1}]},"DES Decrypt":{description:"To successfully decrypt DES, you need either:
                                      • The passphrase
                                      • Or the key and IV
                                      The IV should be the first 8 bytes of encrypted material.",run:Cipher.run_des_dec,input_type:"string",output_type:"string",args:[{name:"Passphrase/Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"IV",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Salt",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Mode",type:"option",value:Cipher.MODES},{name:"Padding",type:"option",value:Cipher.PADDING},{name:"Input format",type:"option",value:Cipher.IO_FORMAT1},{name:"Output format",type:"option",value:Cipher.IO_FORMAT2}]},"DES Encrypt":{description:"Input: Either enter a passphrase (which will be used to derive a key using the OpenSSL KDF) or both the key and IV.

                                      DES is a previously dominant algorithm for encryption, and was published as an official U.S. Federal Information Processing Standard (FIPS). It is now considered to be insecure due to its small key size.",run:Cipher.run_des_enc,input_type:"string",output_type:"string",args:[{name:"Passphrase/Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"IV",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Salt",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Mode",type:"option",value:Cipher.MODES},{name:"Padding",type:"option",value:Cipher.PADDING},{name:"Output result",type:"option",value:Cipher.RESULT_TYPE},{name:"Output format",type:"option",value:Cipher.IO_FORMAT1}]},"Triple DES Decrypt":{description:"To successfully decrypt Triple DES, you need either:
                                      • The passphrase
                                      • Or the key and IV
                                      The IV should be the first 8 bytes of encrypted material.",run:Cipher.run_triple_des_dec,input_type:"string",output_type:"string",args:[{name:"Passphrase/Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"IV",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Salt",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Mode",type:"option",value:Cipher.MODES},{name:"Padding",type:"option",value:Cipher.PADDING},{name:"Input format",type:"option",value:Cipher.IO_FORMAT1},{name:"Output format",type:"option",value:Cipher.IO_FORMAT2}]},"Triple DES Encrypt":{description:"Input: Either enter a passphrase (which will be used to derive a key using the OpenSSL KDF) or both the key and IV.

                                      Triple DES applies DES three times to each block to increase key size.",run:Cipher.run_triple_des_enc,input_type:"string",output_type:"string",args:[{name:"Passphrase/Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"IV",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Salt",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Mode",type:"option",value:Cipher.MODES},{name:"Padding",type:"option",value:Cipher.PADDING},{name:"Output result",type:"option",value:Cipher.RESULT_TYPE},{name:"Output format",type:"option",value:Cipher.IO_FORMAT1}]},"Blowfish Decrypt":{description:"Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.",run:Cipher.run_blowfish_dec,input_type:"string",output_type:"string",args:[{name:"Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"Mode",type:"option",value:Cipher.BLOWFISH_MODES},{name:"Input format",type:"option",value:Cipher.IO_FORMAT3}]},"Blowfish Encrypt":{description:"Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.",run:Cipher.run_blowfish_enc,input_type:"string",output_type:"string",args:[{name:"Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"Mode",type:"option",value:Cipher.BLOWFISH_MODES},{name:"Output format",type:"option",value:Cipher.IO_FORMAT3}]},"Rabbit Decrypt":{description:"To successfully decrypt Rabbit, you need either:
                                      • The passphrase
                                      • Or the key and IV (This is currently broken. You need the key and salt at the moment.)
                                      The IV should be the first 8 bytes of encrypted material.",run:Cipher.run_rabbit_dec,input_type:"string",output_type:"string",args:[{name:"Passphrase/Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"IV",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Salt",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Mode",type:"option",value:Cipher.MODES},{name:"Padding",type:"option",value:Cipher.PADDING},{name:"Input format",type:"option",value:Cipher.IO_FORMAT1},{name:"Output format",type:"option",value:Cipher.IO_FORMAT2}]},"Rabbit Encrypt":{description:"Input: Either enter a passphrase (which will be used to derive a key using the OpenSSL KDF) or both the key and IV.

                                      Rabbit is a high-performance stream cipher and a finalist in the eSTREAM Portfolio. It is one of the four designs selected after a 3 1/2 year process where 22 designs were evaluated.",run:Cipher.run_rabbit_enc,input_type:"string",output_type:"string",args:[{name:"Passphrase/Key",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"IV",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Salt",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT1},{name:"Mode",type:"option",value:Cipher.MODES},{name:"Padding",type:"option",value:Cipher.PADDING},{name:"Output result",type:"option",value:Cipher.RESULT_TYPE},{name:"Output format",type:"option",value:Cipher.IO_FORMAT1}]},RC4:{description:"RC4 is a widely-used stream cipher. It is used in popular protocols such as SSL and WEP. Although remarkable for its simplicity and speed, the algorithm's history doesn't inspire confidence in its security.",run:Cipher.run_rc4,highlight:!0,highlight_reverse:!0,input_type:"string",output_type:"string",args:[{name:"Passphrase",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"Input format",type:"option",value:Cipher.IO_FORMAT4},{name:"Output format",type:"option",value:Cipher.IO_FORMAT4}]},"RC4 Drop":{description:"It was discovered that the first few bytes of the RC4 keystream are strongly non-random and leak information about the key. We can defend against this attack by discarding the initial portion of the keystream. This modified algorithm is traditionally called RC4-drop.",run:Cipher.run_rc4drop,highlight:!0,highlight_reverse:!0,input_type:"string",output_type:"string",args:[{name:"Passphrase",type:"toggle_string",value:"",toggle_values:Cipher.IO_FORMAT2},{name:"Input format",type:"option",value:Cipher.IO_FORMAT4},{name:"Output format",type:"option",value:Cipher.IO_FORMAT4},{name:"Number of bytes to drop",type:"number",value:Cipher.RC4DROP_BYTES}]},"Derive PBKDF2 key":{description:"PBKDF2 is a password-based key derivation function. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

                                      A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

                                      Enter your passphrase as the input and then set the relevant options to generate a key.",run:Cipher.run_pbkdf2,input_type:"string",output_type:"string",args:[{name:"Key size",type:"number",value:Cipher.KDF_KEY_SIZE},{name:"Iterations",type:"number",value:Cipher.KDF_ITERATIONS},{name:"Salt (hex)",type:"string",value:""},{name:"Input format",type:"option",value:Cipher.IO_FORMAT2},{name:"Output format",type:"option",value:Cipher.IO_FORMAT3}]},"Derive EVP key":{description:"EVP is a password-based key derivation function used extensively in OpenSSL. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.

                                      A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.

                                      Enter your passphrase as the input and then set the relevant options to generate a key.",run:Cipher.run_evpkdf,input_type:"string",output_type:"string",args:[{name:"Key size",type:"number",value:Cipher.KDF_KEY_SIZE},{name:"Iterations",type:"number",value:Cipher.KDF_ITERATIONS},{name:"Salt (hex)",type:"string",value:""},{name:"Input format",type:"option",value:Cipher.IO_FORMAT2},{name:"Output format",type:"option",value:Cipher.IO_FORMAT3}]},"Vigen\xe8re Encode":{description:"The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution.",run:Cipher.run_vigenere_enc,highlight:!0,highlight_reverse:!0,input_type:"string",output_type:"string",args:[{name:"Key",type:"string",value:""}]},"Vigen\xe8re Decode":{description:"The Vigenere cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution.",run:Cipher.run_vigenere_dec,highlight:!0,highlight_reverse:!0,input_type:"string",output_type:"string",args:[{name:"Key",type:"string",value:""}]},"Rotate right":{description:"Rotates each byte to the right by the number of bits specified. Currently only supports 8-bit values.",run:Rotate.run_rotr,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[{name:"Number of bits",type:"number",value:Rotate.ROTATE_AMOUNT},{name:"Rotate as a whole",type:"boolean",value:Rotate.ROTATE_WHOLE}]},"Rotate left":{description:"Rotates each byte to the left by the number of bits specified. Currently only supports 8-bit values.",run:Rotate.run_rotl,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[{name:"Number of bits",type:"number",value:Rotate.ROTATE_AMOUNT},{name:"Rotate as a whole",type:"boolean",value:Rotate.ROTATE_WHOLE}]},ROT13:{description:"A simple caesar substitution cipher which rotates alphabet characters by the specified amount (default 13).",run:Rotate.run_rot13,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[{name:"Rotate lower case chars",type:"boolean",value:Rotate.ROT13_LOWERCASE},{name:"Rotate upper case chars",type:"boolean",value:Rotate.ROT13_UPPERCASE},{name:"Amount",type:"number",value:Rotate.ROT13_AMOUNT}]},ROT47:{description:"A slightly more complex variation of a caesar cipher, which includes ASCII characters from 33 '!' to 126 '~'. Default rotation: 47.",run:Rotate.run_rot47,highlight:!0,highlight_reverse:!0,input_type:"byte_array",output_type:"byte_array",args:[{name:"Amount", type:"number",value:Rotate.ROT47_AMOUNT}]},"Strip HTTP headers":{description:"Removes HTTP headers from a request or response by looking for the first instance of a double newline.",run:HTTP.run_strip_headers,input_type:"string",output_type:"string",args:[]},"Parse User Agent":{description:"Attempts to identify and categorise information contained in a user-agent string.",run:HTTP.run_parse_user_agent,input_type:"string",output_type:"string",args:[]},"Format MAC addresses":{description:"Displays given MAC addresses in multiple different formats.

                                      Expects addresses in a list separated by newlines, spaces or commas.

                                      WARNING: There are no validity checks.",run:MAC.run_format,input_type:"string",output_type:"string",args:[{name:"Output case",type:"option",value:MAC.OUTPUT_CASE},{name:"No delimiter",type:"boolean",value:MAC.NO_DELIM},{name:"Dash delimiter",type:"boolean",value:MAC.DASH_DELIM},{name:"Colon delimiter",type:"boolean",value:MAC.COLON_DELIM},{name:"Cisco style",type:"boolean",value:MAC.CISCO_STYLE}]},"Offset checker":{description:"Compares multiple inputs (separated by the specified delimiter) and highlights matching characters which appear at the same position in all samples.",run:StrUtils.run_offset_checker,input_type:"string",output_type:"html",args:[{name:"Sample delimiter",type:"binary_string",value:StrUtils.OFF_CHK_SAMPLE_DELIMITER}]},"Remove whitespace":{description:"Optionally removes all spaces, carriage returns, line feeds, tabs and form feeds from the input data.

                                      This operation also supports the removal of full stops which are sometimes used to represent non-printable bytes in ASCII output.",run:Tidy.run_remove_whitespace,input_type:"string",output_type:"string",args:[{name:"Spaces",type:"boolean",value:Tidy.REMOVE_SPACES},{name:"Carriage returns (\\r)",type:"boolean",value:Tidy.REMOVE_CARIAGE_RETURNS},{name:"Line feeds (\\n)",type:"boolean",value:Tidy.REMOVE_LINE_FEEDS},{name:"Tabs",type:"boolean",value:Tidy.REMOVE_TABS},{name:"Form feeds (\\f)",type:"boolean",value:Tidy.REMOVE_FORM_FEEDS},{name:"Full stops",type:"boolean",value:Tidy.REMOVE_FULL_STOPS}]},"Remove null bytes":{description:"Removes all null bytes (0x00) from the input.",run:Tidy.run_remove_nulls,input_type:"byte_array",output_type:"byte_array",args:[]},"Drop bytes":{description:"Cuts the specified number of bytes out of the data.",run:Tidy.run_drop_bytes,input_type:"byte_array",output_type:"byte_array",args:[{name:"Start",type:"number",value:Tidy.DROP_START},{name:"Length",type:"number",value:Tidy.DROP_LENGTH},{name:"Apply to each line",type:"boolean",value:Tidy.APPLY_TO_EACH_LINE}]},"Take bytes":{description:"Takes a slice of the specified number of bytes from the data.",run:Tidy.run_take_bytes,input_type:"byte_array",output_type:"byte_array",args:[{name:"Start",type:"number",value:Tidy.TAKE_START},{name:"Length",type:"number",value:Tidy.TAKE_LENGTH},{name:"Apply to each line",type:"boolean",value:Tidy.APPLY_TO_EACH_LINE}]},"Pad lines":{description:"Add the specified number of the specified character to the beginning or end of each line",run:Tidy.run_pad,input_type:"string",output_type:"string",args:[{name:"Position",type:"option",value:Tidy.PAD_POSITION},{name:"Length",type:"number",value:Tidy.PAD_LENGTH},{name:"Character",type:"binary_short_string",value:Tidy.PAD_CHAR}]},Reverse:{description:"Reverses the input string.",run:SeqUtils.run_reverse,input_type:"byte_array",output_type:"byte_array",args:[{name:"By",type:"option",value:SeqUtils.REVERSE_BY}]},Sort:{description:"Alphabetically sorts strings separated by the specified delimiter.

                                      The IP address option supports IPv4 only.",run:SeqUtils.run_sort,input_type:"string",output_type:"string",args:[{name:"Delimiter",type:"option",value:SeqUtils.DELIMITER_OPTIONS},{name:"Reverse",type:"boolean",value:SeqUtils.SORT_REVERSE},{name:"Order",type:"option",value:SeqUtils.SORT_ORDER}]},Unique:{description:"Removes duplicate strings from the input.",run:SeqUtils.run_unique,input_type:"string",output_type:"string",args:[{name:"Delimiter",type:"option",value:SeqUtils.DELIMITER_OPTIONS}]},"Count occurrences":{description:"Counts the number of times the provided string occurs in the input.",run:SeqUtils.run_count,input_type:"string",output_type:"number",args:[{name:"Search string",type:"toggle_string",value:"",toggle_values:SeqUtils.SEARCH_TYPE}]},"Add line numbers":{description:"Adds line numbers to the output.",run:SeqUtils.run_add_line_numbers,input_type:"string",output_type:"string",args:[]},"Remove line numbers":{description:"Removes line numbers from the output if they can be trivially detected.",run:SeqUtils.run_remove_line_numbers,input_type:"string",output_type:"string",args:[]},"Find / Replace":{description:"Replaces all occurrences of the first string with the second.

                                      The three match options are only relevant to regex search strings.",run:StrUtils.run_find_replace,manual_bake:!0,input_type:"string",output_type:"string",args:[{name:"Find",type:"toggle_string",value:"",toggle_values:StrUtils.SEARCH_TYPE},{name:"Replace",type:"binary_string",value:""},{name:"Global match",type:"boolean",value:StrUtils.FIND_REPLACE_GLOBAL},{name:"Case insensitive",type:"boolean",value:StrUtils.FIND_REPLACE_CASE},{name:"Multiline matching",type:"boolean",value:StrUtils.FIND_REPLACE_MULTILINE}]},"To Upper case":{description:"Converts the input string to upper case, optionally limiting scope to only the first character in each word, sentence or paragraph.",run:StrUtils.run_upper,highlight:!0,highlight_reverse:!0,input_type:"string",output_type:"string",args:[{name:"Scope",type:"option",value:StrUtils.CASE_SCOPE}]},"To Lower case":{description:"Converts every character in the input to lower case.",run:StrUtils.run_lower,highlight:!0,highlight_reverse:!0,input_type:"string",output_type:"string",args:[]},Split:{description:"Splits a string into sections around a given delimiter.",run:StrUtils.run_split,input_type:"string",output_type:"string",args:[{name:"Split delimiter",type:"binary_short_string",value:StrUtils.SPLIT_DELIM},{name:"Join delimiter",type:"option",value:StrUtils.DELIMITER_OPTIONS}]},Strings:{description:"Extracts all strings from the input.",run:Extract.run_strings,input_type:"string",output_type:"string",args:[{name:"Minimum length",type:"number",value:Extract.MIN_STRING_LEN},{name:"Display total",type:"boolean",value:Extract.DISPLAY_TOTAL}]},"Extract IP addresses":{description:"Extracts all IPv4 and IPv6 addresses.

                                      Warning: Given a string 710.65.0.456, this will match 10.65.0.45 so always check the original input!",run:Extract.run_ip,input_type:"string",output_type:"string",args:[{name:"IPv4",type:"boolean",value:Extract.INCLUDE_IPV4},{name:"IPv6",type:"boolean",value:Extract.INCLUDE_IPV6},{name:"Remove local IPv4 addresses",type:"boolean",value:Extract.REMOVE_LOCAL},{name:"Display total",type:"boolean",value:Extract.DISPLAY_TOTAL}]},"Extract email addresses":{description:"Extracts all email addresses from the input.",run:Extract.run_email,input_type:"string",output_type:"string",args:[{name:"Display total",type:"boolean",value:Extract.DISPLAY_TOTAL}]},"Extract MAC addresses":{description:"Extracts all Media Access Control (MAC) addresses from the input.",run:Extract.run_mac,input_type:"string",output_type:"string",args:[{name:"Display total",type:"boolean",value:Extract.DISPLAY_TOTAL}]},"Extract URLs":{description:"Extracts Uniform Resource Locators (URLs) from the input. The protocol (http, ftp etc.) is required otherwise there will be far too many false positives.",run:Extract.run_urls,input_type:"string",output_type:"string",args:[{name:"Display total",type:"boolean",value:Extract.DISPLAY_TOTAL}]},"Extract domains":{description:"Extracts domain names with common Top-Level Domains (TLDs).
                                      Note that this will not include paths. Use Extract URLs to find entire URLs.",run:Extract.run_domains,input_type:"string",output_type:"string",args:[{name:"Display total",type:"boolean",value:Extract.DISPLAY_TOTAL}]},"Extract file paths":{description:"Extracts anything that looks like a Windows or UNIX file path.

                                      Note that if UNIX is selected, there will likely be a lot of false positives.",run:Extract.run_file_paths,input_type:"string",output_type:"string",args:[{name:"Windows",type:"boolean",value:Extract.INCLUDE_WIN_PATH},{name:"UNIX",type:"boolean",value:Extract.INCLUDE_UNIX_PATH},{name:"Display total",type:"boolean",value:Extract.DISPLAY_TOTAL}]},"Extract dates":{description:"Extracts dates in the following formats
                                      • yyyy-mm-dd
                                      • dd/mm/yyyy
                                      • mm/dd/yyyy
                                      Dividers can be any of /, -, . or space",run:Extract.run_dates,input_type:"string",output_type:"string",args:[{name:"Display total",type:"boolean",value:Extract.DISPLAY_TOTAL}]},"Regular expression":{description:"Define your own regular expression to search the input data with, optionally choosing from a list of pre-defined patterns.",run:StrUtils.run_regex,manual_bake:!0,input_type:"string",output_type:"html",args:[{name:"Built in regexes",type:"populate_option",value:StrUtils.REGEX_PRE_POPULATE,target:1},{name:"Regex",type:"text",value:""},{name:"Case insensitive",type:"boolean",value:StrUtils.REGEX_CASE_INSENSITIVE},{name:"Multiline matching",type:"boolean",value:StrUtils.REGEX_MULTILINE_MATCHING},{name:"Display total",type:"boolean",value:StrUtils.DISPLAY_TOTAL},{name:"Output format",type:"option",value:StrUtils.OUTPUT_FORMAT}]},"XPath expression":{description:"Extract information from an XML document with an XPath query",run:Code.run_xpath,input_type:"string",output_type:"string",args:[{name:"XPath",type:"string",value:Code.XPATH_INITIAL},{name:"Result delimiter",type:"binary_short_string",value:Code.XPATH_DELIMITER}]},"CSS selector":{description:"Extract information from an HTML document with a CSS selector",run:Code.run_css_query,input_type:"string",output_type:"string",args:[{name:"CSS selector",type:"string",value:Code.CSS_SELECTOR_INITIAL},{name:"Delimiter",type:"binary_short_string",value:Code.CSS_QUERY_DELIMITER}]},"From UNIX Timestamp":{description:"Converts a UNIX timestamp to a datetime string.

                                      e.g. 978346800 becomes Mon 1 January 2001 11:00:00 UTC",run:DateTime.run_from_unix_timestamp,input_type:"number",output_type:"string",args:[{name:"Units",type:"option",value:DateTime.UNITS}]},"To UNIX Timestamp":{description:"Parses a datetime string and returns the corresponding UNIX timestamp.

                                      e.g. Mon 1 January 2001 11:00:00 UTC becomes 978346800",run:DateTime.run_to_unix_timestamp,input_type:"string",output_type:"number",args:[{name:"Units",type:"option",value:DateTime.UNITS}]},"Translate DateTime Format":{description:"Parses a datetime string in one format and re-writes it in another.

                                      Run with no input to see the relevant format string examples.",run:DateTime.run_translate_format,input_type:"string",output_type:"html",args:[{name:"Built in formats",type:"populate_option",value:DateTime.DATETIME_FORMATS,target:1},{name:"Input format string",type:"binary_string",value:DateTime.INPUT_FORMAT_STRING},{name:"Input timezone",type:"option",value:DateTime.TIMEZONES},{name:"Output format string",type:"binary_string",value:DateTime.OUTPUT_FORMAT_STRING},{name:"Output timezone",type:"option",value:DateTime.TIMEZONES}]},"Parse DateTime":{description:"Parses a DateTime string in your specified format and displays it in whichever timezone you choose with the following information:
                                      • Date
                                      • Time
                                      • Period (AM/PM)
                                      • Timezone
                                      • UTC offset
                                      • Daylight Saving Time
                                      • Leap year
                                      • Days in this month
                                      • Day of year
                                      • Week number
                                      • Quarter
                                      Run with no input to see format string examples if required.",run:DateTime.run_parse,input_type:"string",output_type:"html",args:[{name:"Built in formats",type:"populate_option",value:DateTime.DATETIME_FORMATS,target:1},{name:"Input format string",type:"binary_string",value:DateTime.INPUT_FORMAT_STRING},{name:"Input timezone",type:"option",value:DateTime.TIMEZONES}]},"Convert distance":{description:"Converts a unit of distance to another format.",run:Convert.run_distance,input_type:"number",output_type:"number",args:[{name:"Input units",type:"option",value:Convert.DISTANCE_UNITS},{name:"Output units",type:"option",value:Convert.DISTANCE_UNITS}]},"Convert area":{description:"Converts a unit of area to another format.",run:Convert.run_area,input_type:"number",output_type:"number",args:[{name:"Input units",type:"option",value:Convert.AREA_UNITS},{name:"Output units",type:"option",value:Convert.AREA_UNITS}]},"Convert mass":{description:"Converts a unit of mass to another format.",run:Convert.run_mass,input_type:"number",output_type:"number",args:[{name:"Input units",type:"option",value:Convert.MASS_UNITS},{name:"Output units",type:"option",value:Convert.MASS_UNITS}]},"Convert speed":{description:"Converts a unit of speed to another format.",run:Convert.run_speed,input_type:"number",output_type:"number",args:[{name:"Input units",type:"option",value:Convert.SPEED_UNITS},{name:"Output units",type:"option",value:Convert.SPEED_UNITS}]},"Convert data units":{description:"Converts a unit of data to another format.",run:Convert.run_data_size,input_type:"number",output_type:"number",args:[{name:"Input units",type:"option",value:Convert.DATA_UNITS},{name:"Output units",type:"option",value:Convert.DATA_UNITS}]},"Raw Deflate":{description:"Compresses data using the deflate algorithm with no headers.",run:Compress.run_raw_deflate,input_type:"byte_array",output_type:"byte_array",args:[{name:"Compression type",type:"option",value:Compress.COMPRESSION_TYPE}]},"Raw Inflate":{description:"Decompresses data which has been compressed using the deflate algorithm with no headers.",run:Compress.run_raw_inflate,input_type:"byte_array",output_type:"byte_array",args:[{name:"Start index",type:"number",value:Compress.INFLATE_INDEX},{name:"Initial output buffer size",type:"number",value:Compress.INFLATE_BUFFER_SIZE},{name:"Buffer expansion type",type:"option",value:Compress.INFLATE_BUFFER_TYPE},{name:"Resize buffer after decompression",type:"boolean",value:Compress.INFLATE_RESIZE},{name:"Verify result",type:"boolean",value:Compress.INFLATE_VERIFY}]},"Zlib Deflate":{description:"Compresses data using the deflate algorithm adding zlib headers.",run:Compress.run_zlib_deflate,input_type:"byte_array",output_type:"byte_array",args:[{name:"Compression type",type:"option",value:Compress.COMPRESSION_TYPE}]},"Zlib Inflate":{description:"Decompresses data which has been compressed using the deflate algorithm with zlib headers.",run:Compress.run_zlib_inflate,input_type:"byte_array",output_type:"byte_array",args:[{name:"Start index",type:"number",value:Compress.INFLATE_INDEX},{name:"Initial output buffer size",type:"number",value:Compress.INFLATE_BUFFER_SIZE},{name:"Buffer expansion type",type:"option",value:Compress.INFLATE_BUFFER_TYPE},{name:"Resize buffer after decompression",type:"boolean",value:Compress.INFLATE_RESIZE},{name:"Verify result",type:"boolean",value:Compress.INFLATE_VERIFY}]},Gzip:{description:"Compresses data using the deflate algorithm with gzip headers.",run:Compress.run_gzip,input_type:"byte_array",output_type:"byte_array",args:[{name:"Compression type",type:"option",value:Compress.COMPRESSION_TYPE},{name:"Filename (optional)",type:"string",value:""},{name:"Comment (optional)",type:"string",value:""},{name:"Include file checksum",type:"boolean",value:Compress.GZIP_CHECKSUM}]},Gunzip:{description:"Decompresses data which has been compressed using the deflate algorithm with gzip headers.",run:Compress.run_gunzip,input_type:"byte_array",output_type:"byte_array",args:[]},Zip:{description:"Compresses data using the PKZIP algorithm with the given filename.

                                      No support for multiple files at this time.",run:Compress.run_pkzip,input_type:"byte_array",output_type:"byte_array",args:[{name:"Filename",type:"string",value:Compress.PKZIP_FILENAME},{name:"Comment",type:"string",value:""},{name:"Password",type:"binary_string",value:""},{name:"Compression method",type:"option",value:Compress.COMPRESSION_METHOD},{name:"Operating system",type:"option",value:Compress.OS},{name:"Compression type",type:"option",value:Compress.COMPRESSION_TYPE}]},Unzip:{description:"Decompresses data using the PKZIP algorithm and displays it per file, with support for passwords.",run:Compress.run_pkunzip,input_type:"byte_array",output_type:"html",args:[{name:"Password",type:"binary_string",value:""},{name:"Verify result",type:"boolean",value:Compress.PKUNZIP_VERIFY}]},"Bzip2 Decompress":{description:"Decompresses data using the Bzip2 algorithm.",run:Compress.run_bzip2_decompress,input_type:"byte_array",output_type:"string",args:[]},"Generic Code Beautify":{description:"Attempts to pretty print C-style languages such as C, C++, C#, Java, PHP, JavaScript etc.

                                      This will not do a perfect job, and the resulting code may not work any more. This operation is designed purely to make obfuscated or minified code more easy to read and understand.

                                      Things which will not work properly:
                                      • For loop formatting
                                      • Do-While loop formatting
                                      • Switch/Case indentation
                                      • Certain bit shift operators
                                      ",run:Code.run_generic_beautify,input_type:"string",output_type:"string",args:[]},"JavaScript Parser":{description:"Returns an Abstract Syntax Tree for valid JavaScript code.",run:JS.run_parse,input_type:"string",output_type:"string",args:[{name:"Location info",type:"boolean",value:JS.PARSE_LOC},{name:"Range info",type:"boolean",value:JS.PARSE_RANGE},{name:"Include tokens array",type:"boolean",value:JS.PARSE_TOKENS},{name:"Include comments array",type:"boolean",value:JS.PARSE_COMMENT},{name:"Report errors and try to continue",type:"boolean",value:JS.PARSE_TOLERANT}]},"JavaScript Beautify":{description:"Parses and pretty prints valid JavaScript code. Also works with JavaScript Object Notation (JSON).",run:JS.run_beautify,input_type:"string",output_type:"string",args:[{name:"Indent string",type:"binary_short_string",value:JS.BEAUTIFY_INDENT},{name:"Quotes",type:"option",value:JS.BEAUTIFY_QUOTES},{name:"Semicolons before closing braces",type:"boolean",value:JS.BEAUTIFY_SEMICOLONS},{name:"Include comments",type:"boolean",value:JS.BEAUTIFY_COMMENT}]},"JavaScript Minify":{description:"Compresses JavaScript code.",run:JS.run_minify,input_type:"string",output_type:"string",args:[]},"XML Beautify":{description:"Indents and prettifies eXtensible Markup Language (XML) code.",run:Code.run_xml_beautify,input_type:"string",output_type:"string",args:[{name:"Indent string",type:"binary_short_string",value:Code.BEAUTIFY_INDENT}]},"JSON Beautify":{description:"Indents and prettifies JavaScript Object Notation (JSON) code.",run:Code.run_json_beautify,input_type:"string",output_type:"string",args:[{name:"Indent string",type:"binary_short_string",value:Code.BEAUTIFY_INDENT}]},"CSS Beautify":{description:"Indents and prettifies Cascading Style Sheets (CSS) code.",run:Code.run_css_beautify,input_type:"string",output_type:"string",args:[{name:"Indent string",type:"binary_short_string",value:Code.BEAUTIFY_INDENT}]},"SQL Beautify":{description:"Indents and prettifies Structured Query Language (SQL) code.",run:Code.run_sql_beautify,input_type:"string",output_type:"string",args:[{name:"Indent string",type:"binary_short_string",value:Code.BEAUTIFY_INDENT}]},"XML Minify":{description:"Compresses eXtensible Markup Language (XML) code.",run:Code.run_xml_minify,input_type:"string",output_type:"string",args:[{name:"Preserve comments",type:"boolean",value:Code.PRESERVE_COMMENTS}]},"JSON Minify":{description:"Compresses JavaScript Object Notation (JSON) code.",run:Code.run_json_minify,input_type:"string",output_type:"string",args:[]},"CSS Minify":{description:"Compresses Cascading Style Sheets (CSS) code.",run:Code.run_css_minify,input_type:"string",output_type:"string",args:[{name:"Preserve comments",type:"boolean",value:Code.PRESERVE_COMMENTS}]},"SQL Minify":{description:"Compresses Structured Query Language (SQL) code.",run:Code.run_sql_minify,input_type:"string",output_type:"string",args:[]},"Analyse hash":{description:"Tries to determine information about a given hash and suggests which algorithm may have been used to generate it based on its length.",run:Hash.run_analyse,input_type:"string",output_type:"string",args:[]},MD5:{description:"MD5 (Message-Digest 5) is a widely used hash function. It has been used in a variety of security applications and is also commonly used to check the integrity of files.

                                      However, MD5 is not collision resistant and it isn't suitable for applications like SSL/TLS certificates or digital signatures that rely on this property.",run:Hash.run_md5,input_type:"string",output_type:"string",args:[]},SHA1:{description:"The SHA (Secure Hash Algorithm) hash functions were designed by the NSA. SHA-1 is the most established of the existing SHA hash functions and it is used in a variety of security applications and protocols.

                                      However, SHA-1's collision resistance has been weakening as new attacks are discovered or improved.",run:Hash.run_sha1,input_type:"string",output_type:"string",args:[]},SHA224:{description:"SHA-224 is largely identical to SHA-256 but is truncated to 224 bytes.",run:Hash.run_sha224,input_type:"string",output_type:"string",args:[]},SHA256:{description:"SHA-256 is one of the four variants in the SHA-2 set. It isn't as widely used as SHA-1, though it provides much better security.",run:Hash.run_sha256,input_type:"string",output_type:"string",args:[]},SHA384:{description:"SHA-384 is largely identical to SHA-512 but is truncated to 384 bytes.",run:Hash.run_sha384,input_type:"string",output_type:"string",args:[]},SHA512:{description:"SHA-512 is largely identical to SHA-256 but operates on 64-bit words rather than 32.",run:Hash.run_sha512,input_type:"string",output_type:"string",args:[]},SHA3:{description:"This is an implementation of Keccak[c=2d]. SHA3 functions based on different implementations of Keccak will give different results.",run:Hash.run_sha3,input_type:"string",output_type:"string",args:[{name:"Output length",type:"option",value:Hash.SHA3_LENGTH}]},"RIPEMD-160":{description:"RIPEMD (RACE Integrity Primitives Evaluation Message Digest) is a family of cryptographic hash functions developed in Leuven, Belgium, by Hans Dobbertin, Antoon Bosselaers and Bart Preneel at the COSIC research group at the Katholieke Universiteit Leuven, and first published in 1996.

                                      RIPEMD was based upon the design principles used in MD4, and is similar in performance to the more popular SHA-1.

                                      RIPEMD-160 is an improved, 160-bit version of the original RIPEMD, and the most common version in the family.",run:Hash.run_ripemd160,input_type:"string",output_type:"string",args:[]},HMAC:{description:"Keyed-Hash Message Authentication Codes (HMAC) are a mechanism for message authentication using cryptographic hash functions.",run:Hash.run_hmac,input_type:"string",output_type:"string",args:[{name:"Password",type:"binary_string",value:""},{name:"Hashing function",type:"option",value:Hash.HMAC_FUNCTIONS}]},"Fletcher-16 Checksum":{description:"The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.

                                      The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques.",run:Checksum.run_fletcher16,input_type:"byte_array",output_type:"string",args:[]},"Adler-32 Checksum":{description:"Adler-32 is a checksum algorithm which was invented by Mark Adler in 1995, and is a modification of the Fletcher checksum. Compared to a cyclic redundancy check of the same length, it trades reliability for speed (preferring the latter).

                                      Adler-32 is more reliable than Fletcher-16, and slightly less reliable than Fletcher-32.",run:Checksum.run_adler32,input_type:"byte_array",output_type:"string",args:[]},"CRC-32 Checksum":{description:"A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data.

                                      The CRC was invented by W. Wesley Peterson in 1961; the 32-bit CRC function of Ethernet and many other standards is the work of several researchers and was published in 1975.",run:Checksum.run_crc32,input_type:"byte_array",output_type:"string",args:[]},"Generate all hashes":{description:"Generates all available hashes and checksums for the input.",run:Hash.run_all,input_type:"string",output_type:"string",args:[]},Entropy:{description:"Calculates the Shannon entropy of the input data which gives an idea of its randomness. 8 is the maximum.",run:Entropy.run_entropy,input_type:"byte_array",output_type:"html",args:[{name:"Chunk size",type:"number",value:Entropy.CHUNK_SIZE}]},"Frequency distribution":{description:"Displays the distribution of bytes in the data as a graph.",run:Entropy.run_freq_distrib,input_type:"byte_array",output_type:"html",args:[{name:"Show 0%'s",type:"boolean",value:Entropy.FREQ_ZEROS}]},Numberwang:{description:"Based on the popular gameshow by Mitchell and Webb.",run:Numberwang.run,input_type:"string",output_type:"string",args:[]},"Parse X.509 certificate":{description:"X.509 is an ITU-T standard for a public key infrastructure (PKI) and Privilege Management Infrastructure (PMI). It is commonly involved with SSL/TLS security.

                                      This operation displays the contents of a certificate in a human readable format, similar to the openssl command line tool.",run:PublicKey.run_parse_x509,input_type:"string",output_type:"string",args:[{name:"Input format",type:"option",value:PublicKey.X509_INPUT_FORMAT}]},"PEM to Hex":{description:"Converts PEM (Privacy Enhanced Mail) format to a hexadecimal DER (Distinguished Encoding Rules) string.",run:PublicKey.run_pem_to_hex,input_type:"string",output_type:"string",args:[]},"Hex to PEM":{description:"Converts a hexadecimal DER (Distinguished Encoding Rules) string into PEM (Privacy Enhanced Mail) format.",run:PublicKey.run_hex_to_pem,input_type:"string",output_type:"string",args:[{name:"Header string",type:"string",value:PublicKey.PEM_HEADER_STRING}]},"Hex to Object Identifier":{description:"Converts a hexadecimal string into an object identifier (OID).",run:PublicKey.run_hex_to_object_identifier,input_type:"string",output_type:"string",args:[]},"Object Identifier to Hex":{description:"Converts an object identifier (OID) into a hexadecimal string.",run:PublicKey.run_object_identifier_to_hex,input_type:"string",output_type:"string",args:[]},"Parse ASN.1 hex string":{description:"Abstract Syntax Notation One (ASN.1) is a standard and notation that describes rules and structures for representing, encoding, transmitting, and decoding data in telecommunications and computer networking.

                                      This operation parses arbitrary ASN.1 data and presents the resulting tree.",run:PublicKey.run_parse_asn1_hex_string,input_type:"string",output_type:"string",args:[{name:"Starting index",type:"number",value:0},{name:"Truncate octet strings longer than",type:"number",value:PublicKey.ASN1_TRUNCATE_LENGTH}]},"Detect File Type":{description:"Attempts to guess the MIME (Multipurpose Internet Mail Extensions) type of the data based on 'magic bytes'.

                                      Currently supports the following file types: 7z, amr, avi, bmp, bz2, class, cr2, crx, dex, dmg, doc, elf, eot, epub, exe, flac, flv, gif, gz, ico, iso, jpg, jxr, m4a, m4v, mid, mkv, mov, mp3, mp4, mpg, ogg, otf, pdf, png, ppt, ps, psd, rar, rtf, sqlite, swf, tar, tar.z, tif, ttf, utf8, vmdk, wav, webm, webp, wmv, woff, woff2, xls, xz, zip.",run:FileType.run_detect,input_type:"byte_array",output_type:"string",args:[]},"Scan for Embedded Files":{description:"Scans the data for potential embedded files by looking for magic bytes at all offsets. This operation is prone to false positives.

                                      WARNING: Files over about 100KB in size will take a VERY long time to process.",run:FileType.run_scan_for_embedded_files,input_type:"byte_array",output_type:"string",args:[{name:"Ignore common byte sequences",type:"boolean",value:FileType.IGNORE_COMMON_BYTE_SEQUENCES}]},"Expand alphabet range":{description:"Expand an alphabet range string into a list of the characters in that range.

                                      e.g. a-z becomes abcdefghijklmnopqrstuvwxyz.",run:SeqUtils.run_expand_alph_range,input_type:"string",output_type:"string",args:[{name:"Delimiter",type:"binary_string",value:""}]},Diff:{description:"Compares two inputs (separated by the specified delimiter) and highlights the differences between them.",run:StrUtils.run_diff,input_type:"string",output_type:"html",args:[{name:"Sample delimiter",type:"binary_string",value:StrUtils.DIFF_SAMPLE_DELIMITER},{name:"Diff by",type:"option",value:StrUtils.DIFF_BY},{name:"Show added",type:"boolean",value:!0},{name:"Show removed",type:"boolean",value:!0},{name:"Ignore whitespace (relevant for word and line)",type:"boolean",value:!1}]},"Parse UNIX file permissions":{description:"Given a UNIX/Linux file permission string in octal or textual format, this operation explains which permissions are granted to which user groups.

                                      Input should be in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format.",run:OS.run_parse_unix_perms,input_type:"string",output_type:"string",args:[]},"Swap endianness":{description:"Switches the data from big-endian to little-endian or vice-versa. Data can be read in as hexadecimal or raw bytes. It will be returned in the same format as it is entered.",run:Endian.run_swap_endianness,highlight:!0,highlight_reverse:!0,input_type:"string",output_type:"string",args:[{name:"Data format",type:"option",value:Endian.DATA_FORMAT},{name:"Word length (bytes)",type:"number",value:Endian.WORD_LENGTH},{name:"Pad incomplete words",type:"boolean",value:Endian.PAD_INCOMPLETE_WORDS}]},"Syntax highlighter":{description:"Adds syntax highlighting to a range of source code languages. Note that this will not indent the code. Use one of the 'Beautify' operations for that.",run:Code.run_syntax_highlight,highlight:!0,highlight_reverse:!0,input_type:"string",output_type:"html",args:[{name:"Language/File extension",type:"option",value:Code.LANGUAGES},{name:"Display line numbers",type:"boolean",value:Code.LINE_NUMS}]},"Parse escaped string":{description:"Replaces escaped characters with the bytes they represent.

                                      e.g.Hello\\nWorld becomes Hello
                                      World
                                      ",run:StrUtils.run_parse_escaped_string,input_type:"string",output_type:"string",args:[]},"TCP/IP Checksum":{description:"Calculates the checksum for a TCP (Transport Control Protocol) or IP (Internet Protocol) header from an input of raw bytes.",run:Checksum.run_tcp_ip,input_type:"byte_array",output_type:"string",args:[]},"Parse colour code":{description:"Converts a colour code in a standard format to other standard formats and displays the colour itself.

                                      Example inputs
                                      • #d9edf7
                                      • rgba(217,237,247,1)
                                      • hsla(200,65%,91%,1)
                                      • cmyk(0.12, 0.04, 0.00, 0.03)
                                      ",run:HTML.run_parse_colour_code,input_type:"string",output_type:"html",args:[]},"Generate UUID":{description:"Generates an RFC 4122 version 4 compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

                                      A version 4 UUID relies on random numbers, in this case generated using window.crypto if available and falling back to Math.random if not.",run:UUID.run_generate_v4,input_type:"string",output_type:"string",args:[]}};var ControlsWaiter=function(a,b){this.app=a,this.manager=b; -};ControlsWaiter.prototype.adjust_width=function(){var a=document.getElementById("controls"),b=document.getElementById("step"),c=document.getElementById("clr-breaks"),d=document.querySelector("#save img"),e=document.querySelector("#load img"),f=document.querySelector("#step img"),g=document.querySelector("#clr-recipe img"),h=document.querySelector("#clr-breaks img");a.clientWidth<470?b.childNodes[1].nodeValue=" Step":b.childNodes[1].nodeValue=" Step through",a.clientWidth<400?(d.style.display="none",e.style.display="none",f.style.display="none",g.style.display="none",h.style.display="none"):(d.style.display="inline",e.style.display="inline",f.style.display="inline",g.style.display="inline",h.style.display="inline"),a.clientWidth<330?c.childNodes[1].nodeValue=" Clear breaks":c.childNodes[1].nodeValue=" Clear breakpoints"},ControlsWaiter.prototype.set_auto_bake=function(a){var b=document.getElementById("auto-bake");b.checked!==a&&b.click()},ControlsWaiter.prototype.bake_click=function(){this.app.bake(),$("#output-text").selectRange(0)},ControlsWaiter.prototype.step_click=function(){this.app.bake(!0),$("#output-text").selectRange(0)},ControlsWaiter.prototype.auto_bake_change=function(){var a=document.getElementById("auto-bake-label"),b=document.getElementById("auto-bake");this.app.auto_bake_=b.checked,b.checked?(a.classList.remove("btn-default"),a.classList.add("btn-success")):(a.classList.remove("btn-success"),a.classList.add("btn-default"))},ControlsWaiter.prototype.clear_recipe_click=function(){this.manager.recipe.clear_recipe()},ControlsWaiter.prototype.clear_breaks_click=function(){for(var a=document.querySelectorAll("#rec_list li.operation .breakpoint"),b=0;b0,b=b&&f.length>0&&f.length<8e3,a&&(d+="?recipe="+encodeURIComponent(e)),a&&b?d+="&input="+encodeURIComponent(f):b&&(d+="?input="+encodeURIComponent(f)),d},ControlsWaiter.prototype.save_text_change=function(){try{var a=JSON.parse(document.getElementById("save-text").value);this.initialise_save_link(a)}catch(a){}},ControlsWaiter.prototype.save_click=function(){var a=this.app.get_recipe_config(),b=JSON.stringify(a).replace(/},{/g,"},\n{");document.getElementById("save-text").value=b,this.initialise_save_link(a),$("#save-modal").modal()},ControlsWaiter.prototype.slr_check_change=function(){this.initialise_save_link()},ControlsWaiter.prototype.sli_check_change=function(){this.initialise_save_link()},ControlsWaiter.prototype.load_click=function(){this.populate_load_recipes_list(),$("#load-modal").modal()},ControlsWaiter.prototype.save_button_click=function(){var a=document.getElementById("save-name").value,b=document.getElementById("save-text").value;if(!a)return void this.app.alert("Please enter a recipe name","danger",2e3);var c=localStorage.saved_recipes?JSON.parse(localStorage.saved_recipes):[],d=localStorage.recipe_id||0;c.push({id:++d,name:a,recipe:b}),localStorage.saved_recipes=JSON.stringify(c),localStorage.recipe_id=d,this.app.alert('Recipe saved as "'+a+'".',"success",2e3)},ControlsWaiter.prototype.populate_load_recipes_list=function(){for(var a=document.getElementById("load-name"),b=a.options.length;b--;)a.remove(b);var c=localStorage.saved_recipes?JSON.parse(localStorage.saved_recipes):[];for(b=0;bend: "+e+"
                                      length: "+f},HighlighterWaiter.prototype.remove_highlights=function(){document.getElementById("input-highlighter").innerHTML="",document.getElementById("output-highlighter").innerHTML="",document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML=""},HighlighterWaiter.prototype.generate_highlight_list=function(){for(var a=this.app.get_recipe_config(),b=[],c=0;c=0)return!1;var d="[start_highlight]",e=/\[start_highlight\]/g,f="[end_highlight]",g=/\[end_highlight\]/g,h=a.value;if(1===c.length){if(c[0].end/g,">").replace(/\n/g," ").replace(e,'').replace(g,"")+" ",b.style.width=a.clientWidth+"px",b.innerHTML=h,b.scrollTop=a.scrollTop,b.scrollLeft=a.scrollLeft};var HTMLApp=function(a,b,c,d){this.categories=a,this.operations=b,this.dfavourites=c,this.doptions=d,this.options=Utils.extend({},d),this.chef=new Chef,this.manager=new Manager(this),this.auto_bake_=!1,this.progress=0,this.ing_id=0,window.chef=this.chef};HTMLApp.prototype.setup=function(){document.dispatchEvent(this.manager.appstart),this.initialise_splitter(),this.load_local_storage(),this.populate_operations_list(),this.manager.setup(),this.reset_layout(),this.set_compile_message(),this.load_URI_params()},HTMLApp.prototype.handle_error=function(a){console.error(a);var b=a.display_str||a.toString();this.alert(b,"danger",this.options.error_timeout,!this.options.show_errors)},HTMLApp.prototype.bake=function(a){var b;try{b=this.chef.bake(this.get_input(),this.get_recipe_config(),this.options,this.progress,a)}catch(a){this.handle_error(a)}b&&(b.error&&this.handle_error(b.error),this.options=b.options,this.dish_str="html"===b.type?Utils.strip_html_tags(b.result,!0):b.result,this.progress=b.progress,this.manager.recipe.update_breakpoint_indicator(b.progress),this.manager.output.set(b.result,b.type,b.duration),b.duration>this.options.auto_bake_threshold&&this.auto_bake_&&(this.manager.controls.set_auto_bake(!1),this.alert("Baking took longer than "+this.options.auto_bake_threshold+"ms, Auto Bake has been disabled.","warning",5e3)))},HTMLApp.prototype.auto_bake=function(){this.auto_bake_&&this.bake()},HTMLApp.prototype.silent_bake=function(){var a=(new Date).getTime(),b=this.get_recipe_config();return this.auto_bake_&&this.chef.silent_bake(b),(new Date).getTime()-a},HTMLApp.prototype.get_input=function(){var a=this.manager.input.get();return sessionStorage.setItem("input_length",a.length),sessionStorage.setItem("input",a),a},HTMLApp.prototype.set_input=function(a){sessionStorage.setItem("input_length",a.length),sessionStorage.setItem("input",a),this.manager.input.set(a)},HTMLApp.prototype.populate_operations_list=function(){document.body.appendChild(document.getElementById("edit-favourites"));for(var a="",b=0;b2?JSON.parse(localStorage.favourites):this.dfavourites;a=this.valid_favourites(a),this.save_favourites(a);var b=this.categories.filter(function(a){return"Favourites"===a.name})[0];b?b.ops=a:this.categories.unshift({name:"Favourites",ops:a})},HTMLApp.prototype.valid_favourites=function(a){for(var b=[],c=0;c=0?void this.alert("'"+a+"' is already in your favourites","info",2e3):(b.push(a),this.save_favourites(b),this.load_favourites(),this.populate_operations_list(),void this.manager.recipe.initialise_operation_drag_n_drop())},HTMLApp.prototype.load_URI_params=function(){this.query_string=function(a){if(""===a)return{};for(var b={},c=0;c"):d[e].value=a[b].args[e];a[b].disabled&&c.querySelector(".disable-icon").click(),a[b].breakpoint&&c.querySelector(".breakpoint").click(),this.progress=0}},HTMLApp.prototype.reset_layout=function(){this.column_splitter.setSizes([20,30,50]),this.io_splitter.setSizes([50,50]),this.manager.controls.adjust_width()},HTMLApp.prototype.set_compile_message=function(){var a=new Date,b=Utils.fuzzy_time(a.getTime()-window.compile_time),c='Last build: '+b.substr(0,1).toUpperCase()+b.substr(1)+" ago";""!==window.compile_message&&(c+=" - "+window.compile_message),c+="",document.getElementById("notice").innerHTML=c},HTMLApp.prototype.alert=function(a,b,c,d){var e=new Date;if(console.log("["+e.toLocaleString()+"] "+a),!d){b=b||"danger",c=c||0;var f=document.getElementById("alert"),g=document.getElementById("alert-content");f.classList.remove("alert-danger"),f.classList.remove("alert-warning"),f.classList.remove("alert-info"),f.classList.remove("alert-success"),f.classList.add("alert-"+b),"block"===f.style.display?g.innerHTML+="

                                      ["+e.toLocaleTimeString()+"] "+a:g.innerHTML="["+e.toLocaleTimeString()+"] "+a,$("#alert").stop(),f.style.display="block",f.style.opacity=1,c>0&&(clearTimeout(this.alert_timeout),this.alert_timeout=setTimeout(function(){$("#alert").slideUp(100)},c))}},HTMLApp.prototype.confirm=function(a,b,c,d){d=d||this,document.getElementById("confirm-title").innerHTML=a,document.getElementById("confirm-body").innerHTML=b,document.getElementById("confirm-modal").style.display="block",this.confirm_closed=!1,$("#confirm-modal").modal().one("show.bs.modal",function(a){this.confirm_closed=!1}.bind(this)).one("click","#confirm-yes",function(){this.confirm_closed=!0,c.bind(d)(!0),$("#confirm-modal").modal("hide")}.bind(this)).one("hide.bs.modal",function(a){this.confirm_closed||c.bind(d)(!1),this.confirm_closed=!0}.bind(this))},HTMLApp.prototype.alert_close_click=function(){document.getElementById("alert").style.display="none"},HTMLApp.prototype.state_change=function(a){this.auto_bake(),this.options.update_url&&(this.last_state_url=this.manager.controls.generate_state_url(!0,!0),window.history.replaceState({},"CyberChef",this.last_state_url))},HTMLApp.prototype.pop_state=function(a){window.location.href.split("#")[0]!==this.last_state_url&&this.load_URI_params()},HTMLApp.prototype.call_api=function(a,b,c,d,e){b=b||"POST",c=c||{},d=d||void 0,e=e||"application/json";var f=null,g=!1;return $.ajax({url:a,async:!1,type:b,data:c,dataType:d,contentType:e,success:function(a){g=!0,f=a},error:function(a){g=!1,f=a}}),{success:g,response:f}};var HTMLCategory=function(a,b){this.name=a,this.selected=b,this.op_list=[]};HTMLCategory.prototype.add_operation=function(a){this.op_list.push(a)},HTMLCategory.prototype.to_html=function(){for(var a="cat"+this.name.replace(/[\s\/-:_]/g,""),b="
                                      "+this.name+"
                                        ",c=0;c 
                                      ";switch(d+="
                                      ",this.type){case"string":case"binary_string":case"byte_array":d+="";break;case"short_string":case"binary_short_string":d+="";break;case"toggle_string":for(d+="
                                      ";break;case"number":d+="";break;case"boolean":d+="",this.disable_args&&this.manager.add_dynamic_listener("#"+this.id,"click",this.toggle_disable_args,this);break;case"option":for(d+="";break;case"populate_option":for(d+="",this.manager.add_dynamic_listener("#"+this.id,"change",this.populate_option_change,this);break;case"editable_option":for(d+="
                                      ",d+="",d+="",d+="
                                      ",this.manager.add_dynamic_listener("#sel-"+this.id,"change",this.editable_option_change,this);break;case"text":d+=""}return d+="
                                      "},HTMLIngredient.prototype.toggle_disable_args=function(a){for(var b,c=a.target,d=c.parentNode.parentNode,e=d.querySelectorAll(".arg-group"),f=0;f"),this.description&&(b+=""),b+=""},HTMLOperation.prototype.to_full_html=function(){for(var a="
                                      "+this.name+"
                                      ",b=0;b=0&&(this.name=this.name.slice(0,b)+""+this.name.slice(b,b+a.length)+""+this.name.slice(b+a.length)),this.description&&c>=0&&(this.description=this.description.slice(0,c)+""+this.description.slice(c,c+a.length)+""+this.description.slice(c+a.length))};var InputWaiter=function(a,b){this.app=a,this.manager=b,this.bad_keys=[16,17,18,19,20,27,33,34,35,36,37,38,39,40,44,91,92,93,112,113,114,115,116,117,118,119,120,121,122,123,144,145]};InputWaiter.prototype.get=function(){return document.getElementById("input-text").value},InputWaiter.prototype.set=function(a){document.getElementById("input-text").value=a,window.dispatchEvent(this.manager.statechange)},InputWaiter.prototype.set_input_info=function(a,b){var c=a.toString().length;c=c<2?2:c;var d=Utils.pad(a.toString(),c," ").replace(/ /g," "),e=Utils.pad(b.toString(),c," ").replace(/ /g," ");document.getElementById("input-info").innerHTML="length: "+d+"
                                      lines: "+e},InputWaiter.prototype.input_change=function(a){this.manager.highlighter.remove_highlights(),this.app.progress=0;var b=this.get(),c=b.count("\n")+1;this.set_input_info(b.length,c),this.bad_keys.indexOf(a.keyCode)<0&&window.dispatchEvent(this.manager.statechange)},InputWaiter.prototype.input_dragover=function(a){return"move"!==a.dataTransfer.effectAllowed&&(a.stopPropagation(),a.preventDefault(),void a.target.classList.add("dropping-file"))},InputWaiter.prototype.input_dragleave=function(a){a.stopPropagation(),a.preventDefault(),a.target.classList.remove("dropping-file")},InputWaiter.prototype.input_drop=function(a){if("move"===a.dataTransfer.effectAllowed)return!1;a.stopPropagation(),a.preventDefault();var b=a.target,c=a.dataTransfer.files[0],d=a.dataTransfer.getData("Text"),e=new FileReader,f="",g=0,h=20480,i=function(){f.length>1e5&&this.app.auto_bake_&&(this.manager.controls.set_auto_bake(!1),this.app.alert("Turned off Auto Bake as the input is large","warning",5e3)),this.set(f);var a=this.app.get_recipe_config();a[0]&&"From Hex"===a[0].op||(a.unshift({op:"From Hex",args:["Space"]}),this.app.set_recipe_config(a)),b.classList.remove("loading_file")}.bind(this),j=function(){if(g>=c.size)return void i();b.value="Processing... "+Math.round(g/c.size*100)+"%";var a=c.slice(g,g+h);e.readAsArrayBuffer(a)};e.onload=function(a){var b=new Uint8Array(e.result);f+=Utils.to_hex_fast(b),g+=h,j()},b.classList.remove("dropping-file"),c?(b.classList.add("loading_file"),j()):d&&this.set(d)},InputWaiter.prototype.clear_io_click=function(){this.manager.highlighter.remove_highlights(),document.getElementById("input-text").value="",document.getElementById("output-text").value="",document.getElementById("input-info").innerHTML="",document.getElementById("output-info").innerHTML="",document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML="",window.dispatchEvent(this.manager.statechange)};var Manager=function(a){this.app=a,this.appstart=new CustomEvent("appstart",{bubbles:!0}),this.operationadd=new CustomEvent("operationadd",{bubbles:!0}),this.operationremove=new CustomEvent("operationremove",{bubbles:!0}),this.oplistcreate=new CustomEvent("oplistcreate",{bubbles:!0}),this.statechange=new CustomEvent("statechange",{bubbles:!0}),this.window=new WindowWaiter(this.app),this.controls=new ControlsWaiter(this.app,this),this.recipe=new RecipeWaiter(this.app,this),this.ops=new OperationsWaiter(this.app,this),this.input=new InputWaiter(this.app,this),this.output=new OutputWaiter(this.app,this),this.options=new OptionsWaiter(this.app),this.highlighter=new HighlighterWaiter(this.app),this.seasonal=new SeasonalWaiter(this.app,this), -this.dynamic_handlers={},this.initialise_event_listeners()};Manager.prototype.setup=function(){this.recipe.initialise_operation_drag_n_drop(),this.controls.auto_bake_change(),this.seasonal.load()},Manager.prototype.initialise_event_listeners=function(){window.addEventListener("resize",this.window.window_resize.bind(this.window)),window.addEventListener("blur",this.window.window_blur.bind(this.window)),window.addEventListener("focus",this.window.window_focus.bind(this.window)),window.addEventListener("statechange",this.app.state_change.bind(this.app)),window.addEventListener("popstate",this.app.pop_state.bind(this.app)),document.getElementById("bake").addEventListener("click",this.controls.bake_click.bind(this.controls)),document.getElementById("auto-bake").addEventListener("change",this.controls.auto_bake_change.bind(this.controls)),document.getElementById("step").addEventListener("click",this.controls.step_click.bind(this.controls)),document.getElementById("clr-recipe").addEventListener("click",this.controls.clear_recipe_click.bind(this.controls)),document.getElementById("clr-breaks").addEventListener("click",this.controls.clear_breaks_click.bind(this.controls)),document.getElementById("save").addEventListener("click",this.controls.save_click.bind(this.controls)),document.getElementById("save-button").addEventListener("click",this.controls.save_button_click.bind(this.controls)),document.getElementById("save-link-recipe-checkbox").addEventListener("change",this.controls.slr_check_change.bind(this.controls)),document.getElementById("save-link-input-checkbox").addEventListener("change",this.controls.sli_check_change.bind(this.controls)),document.getElementById("load").addEventListener("click",this.controls.load_click.bind(this.controls)),document.getElementById("load-delete-button").addEventListener("click",this.controls.load_delete_click.bind(this.controls)),document.getElementById("load-name").addEventListener("change",this.controls.load_name_change.bind(this.controls)),document.getElementById("load-button").addEventListener("click",this.controls.load_button_click.bind(this.controls)),this.add_multi_event_listener("#save-text","keyup paste",this.controls.save_text_change,this.controls),this.add_multi_event_listener("#search","keyup paste search",this.ops.search_operations,this.ops),this.add_dynamic_listener(".op_list li.operation","dblclick",this.ops.operation_dblclick,this.ops),document.getElementById("edit-favourites").addEventListener("click",this.ops.edit_favourites_click.bind(this.ops)),document.getElementById("save-favourites").addEventListener("click",this.ops.save_favourites_click.bind(this.ops)),document.getElementById("reset-favourites").addEventListener("click",this.ops.reset_favourites_click.bind(this.ops)),this.add_dynamic_listener(".op_list .op-icon","mouseover",this.ops.op_icon_mouseover,this.ops),this.add_dynamic_listener(".op_list .op-icon","mouseleave",this.ops.op_icon_mouseleave,this.ops),this.add_dynamic_listener(".op_list","oplistcreate",this.ops.op_list_create,this.ops),this.add_dynamic_listener("li.operation","operationadd",this.recipe.op_add.bind(this.recipe)),this.add_dynamic_listener(".arg","keyup",this.recipe.ing_change,this.recipe),this.add_dynamic_listener(".arg","change",this.recipe.ing_change,this.recipe),this.add_dynamic_listener(".disable-icon","click",this.recipe.disable_click,this.recipe),this.add_dynamic_listener(".breakpoint","click",this.recipe.breakpoint_click,this.recipe),this.add_dynamic_listener("#rec_list li.operation","dblclick",this.recipe.operation_dblclick,this.recipe),this.add_dynamic_listener("#rec_list li.operation > div","dblclick",this.recipe.operation_child_dblclick,this.recipe),this.add_dynamic_listener("#rec_list .input-group .dropdown-menu a","click",this.recipe.dropdown_toggle_click,this.recipe),this.add_dynamic_listener("#rec_list","operationremove",this.recipe.op_remove.bind(this.recipe)),this.add_multi_event_listener("#input-text","keyup paste",this.input.input_change,this.input),document.getElementById("reset-layout").addEventListener("click",this.app.reset_layout.bind(this.app)),document.getElementById("clr-io").addEventListener("click",this.input.clear_io_click.bind(this.input)),document.getElementById("input-text").addEventListener("dragover",this.input.input_dragover.bind(this.input)),document.getElementById("input-text").addEventListener("dragleave",this.input.input_dragleave.bind(this.input)),document.getElementById("input-text").addEventListener("drop",this.input.input_drop.bind(this.input)),document.getElementById("input-text").addEventListener("scroll",this.highlighter.input_scroll.bind(this.highlighter)),document.getElementById("input-text").addEventListener("mouseup",this.highlighter.input_mouseup.bind(this.highlighter)),document.getElementById("input-text").addEventListener("mousemove",this.highlighter.input_mousemove.bind(this.highlighter)),this.add_multi_event_listener("#input-text","mousedown dblclick select",this.highlighter.input_mousedown,this.highlighter),document.getElementById("save-to-file").addEventListener("click",this.output.save_click.bind(this.output)),document.getElementById("switch").addEventListener("click",this.output.switch_click.bind(this.output)),document.getElementById("undo-switch").addEventListener("click",this.output.undo_switch_click.bind(this.output)),document.getElementById("maximise-output").addEventListener("click",this.output.maximise_output_click.bind(this.output)),document.getElementById("output-text").addEventListener("scroll",this.highlighter.output_scroll.bind(this.highlighter)),document.getElementById("output-text").addEventListener("mouseup",this.highlighter.output_mouseup.bind(this.highlighter)),document.getElementById("output-text").addEventListener("mousemove",this.highlighter.output_mousemove.bind(this.highlighter)),document.getElementById("output-html").addEventListener("mouseup",this.highlighter.output_html_mouseup.bind(this.highlighter)),document.getElementById("output-html").addEventListener("mousemove",this.highlighter.output_html_mousemove.bind(this.highlighter)),this.add_multi_event_listener("#output-text","mousedown dblclick select",this.highlighter.output_mousedown,this.highlighter),this.add_multi_event_listener("#output-html","mousedown dblclick select",this.highlighter.output_html_mousedown,this.highlighter),document.getElementById("options").addEventListener("click",this.options.options_click.bind(this.options)),document.getElementById("reset-options").addEventListener("click",this.options.reset_options_click.bind(this.options)),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox",this.options.switch_change.bind(this.options)),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox",this.options.set_word_wrap.bind(this.options)),this.add_dynamic_listener(".option-item input[type=number]","keyup",this.options.number_change,this.options),this.add_dynamic_listener(".option-item input[type=number]","change",this.options.number_change,this.options),this.add_dynamic_listener(".option-item select","change",this.options.select_change,this.options),document.getElementById("alert-close").addEventListener("click",this.app.alert_close_click.bind(this.app))},Manager.prototype.add_listeners=function(a,b,c,d){d=d||this,[].forEach.call(document.querySelectorAll(a),function(a){a.addEventListener(b,c.bind(d))})},Manager.prototype.add_multi_event_listener=function(a,b,c,d){for(var e=b.split(" "),f=0;f-1&&(this.manager.recipe.add_operation(b[c].innerHTML),this.app.auto_bake()))),13===a.keyCode)a.preventDefault();else if(40===a.keyCode)a.preventDefault(),b=document.querySelectorAll("#search-results li"),b.length&&(c=this.get_selected_op(b),c>-1&&b[c].classList.remove("selected-op"),c===b.length-1&&(c=-1),b[c+1].classList.add("selected-op"));else if(38===a.keyCode)a.preventDefault(),b=document.querySelectorAll("#search-results li"),b.length&&(c=this.get_selected_op(b),c>-1&&b[c].classList.remove("selected-op"),0===c&&(c=b.length),b[c-1].classList.add("selected-op"));else{for(var d=document.getElementById("search-results"),e=a.target,f=e.value;d.firstChild;)$(d.firstChild).popover("destroy"),d.removeChild(d.firstChild);if($("#categories .in").collapse("hide"),f){for(var g=this.filter_operations(f,!0),h="",i=0;i=0||h>=0){var i=new HTMLOperation(e,this.app.operations[e],this.app,this.manager);b&&i.highlight_search_string(a,g,h),g<0?c.push(i):d.push(i)}}return d.concat(c)},OperationsWaiter.prototype.get_selected_op=function(a){for(var b=0;blength: "+e+"
                                      lines: "+f,document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML=""},OutputWaiter.prototype.save_click=function(){var a=Utils.to_base64(this.app.dish_str),b=window.prompt("Please enter a filename:","download.dat");if(b){var c=document.createElement("a");c.setAttribute("href","data:application/octet-stream;base64;charset=utf-8,"+a),c.setAttribute("download",b),c.style.display="none",document.body.appendChild(c),c.click(),c.remove()}},OutputWaiter.prototype.switch_click=function(){this.switch_orig_data=this.manager.input.get(),document.getElementById("undo-switch").disabled=!1,this.app.set_input(this.app.dish_str)},OutputWaiter.prototype.undo_switch_click=function(){this.app.set_input(this.switch_orig_data),document.getElementById("undo-switch").disabled=!0},OutputWaiter.prototype.maximise_output_click=function(a){var b=a.target;b.textContent.indexOf("Max")>=0?(this.app.column_splitter.collapse(0),this.app.column_splitter.collapse(1),this.app.io_splitter.collapse(0),b.innerHTML=" Restore"):(this.app.reset_layout(),b.innerHTML=" Max")};var RecipeWaiter=function(a,b){this.app=a,this.manager=b,this.remove_intent=!1};RecipeWaiter.prototype.initialise_operation_drag_n_drop=function(){var a=document.getElementById("rec_list");Sortable.create(a,{group:"recipe",sort:!0,animation:0,delay:0,filter:".arg-input,.arg",setData:function(a,b){a.setData("Text",b.querySelector(".arg-title").textContent)},onEnd:function(a){this.remove_intent&&(a.item.remove(),a.target.dispatchEvent(this.manager.operationremove))}.bind(this)}),Sortable.utils.on(a,"dragover",function(){this.remove_intent=!1}.bind(this)),Sortable.utils.on(a,"dragleave",function(){this.remove_intent=!0,this.app.progress=0}.bind(this)),Sortable.utils.on(a,"touchend",function(b){var c=b.changedTouches[0],d=document.elementFromPoint(c.clientX,c.clientY);this.remove_intent=!a.contains(d)}.bind(this)),document.querySelector("#categories a").addEventListener("dragover",this.fav_dragover.bind(this)),document.querySelector("#categories a").addEventListener("dragleave",this.fav_dragleave.bind(this)),document.querySelector("#categories a").addEventListener("drop",this.fav_drop.bind(this))},RecipeWaiter.prototype.create_sortable_seed_list=function(a){Sortable.create(a,{group:{name:"recipe",pull:"clone",put:!1},sort:!1,setData:function(a,b){a.setData("Text",b.textContent)},onStart:function(a){$(a.item).popover("destroy"),a.item.setAttribute("data-toggle","popover-disabled")},onEnd:this.op_sort_end.bind(this)})},RecipeWaiter.prototype.op_sort_end=function(a){return this.remove_intent?void("rec_list"===a.item.parentNode.id&&a.item.remove()):($(a.clone).popover(),$(a.clone).children("[data-toggle=popover]").popover(),void("rec_list"===a.item.parentNode.id&&(this.build_recipe_operation(a.item),a.item.dispatchEvent(this.manager.operationadd))))},RecipeWaiter.prototype.fav_dragover=function(a){return"move"===a.dataTransfer.effectAllowed&&(a.stopPropagation(),a.preventDefault(),void(a.target.className&&a.target.className.indexOf("category-title")>-1?a.target.classList.add("favourites-hover"):a.target.parentNode.className&&a.target.parentNode.className.indexOf("category-title")>-1?a.target.parentNode.classList.add("favourites-hover"):a.target.parentNode.parentNode.className&&a.target.parentNode.parentNode.className.indexOf("category-title")>-1&&a.target.parentNode.parentNode.classList.add("favourites-hover")))},RecipeWaiter.prototype.fav_dragleave=function(a){a.stopPropagation(),a.preventDefault(),document.querySelector("#categories a").classList.remove("favourites-hover")},RecipeWaiter.prototype.fav_drop=function(a){a.stopPropagation(),a.preventDefault(),a.target.classList.remove("favourites-hover");var b=a.dataTransfer.getData("Text");this.app.add_favourite(b)},RecipeWaiter.prototype.ing_change=function(){window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.disable_click=function(a){var b=a.target;"false"===b.getAttribute("disabled")?(b.setAttribute("disabled","true"),b.classList.add("disable-icon-selected"),b.parentNode.parentNode.classList.add("disabled")):(b.setAttribute("disabled","false"),b.classList.remove("disable-icon-selected"),b.parentNode.parentNode.classList.remove("disabled")),this.app.progress=0,window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.breakpoint_click=function(a){var b=a.target;"false"===b.getAttribute("break")?(b.setAttribute("break","true"),b.classList.add("breakpoint-selected")):(b.setAttribute("break","false"),b.classList.remove("breakpoint-selected")),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.operation_dblclick=function(a){a.target.remove(),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.operation_child_dblclick=function(a){a.target.parentNode.remove(),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.get_config=function(){for(var a,b,c,d,e,f=[],g=document.querySelectorAll("#rec_list li.operation"),h=0;h",this.ing_change()},RecipeWaiter.prototype.op_add=function(a){window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.op_remove=function(a){window.dispatchEvent(this.manager.statechange)};var SeasonalWaiter=function(a,b){this.app=a,this.manager=b};SeasonalWaiter.prototype.load=function(){var a=new Date;11===a.getMonth()&&a.getDate()>12&&(this.app.options.snow=!1,this.create_snow_option(),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox[option='snow']",this.let_it_snow.bind(this)),window.addEventListener("resize",this.let_it_snow.bind(this)),this.manager.add_listeners(".btn","click",this.shake_off_snow,this),25===a.getDate()&&this.let_it_snow()),this.kkeys=[],window.addEventListener("keydown",this.konami_code_listener.bind(this))},SeasonalWaiter.prototype.insert_spider_icons=function(){var a="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVQ4y2NgGJaAmYGBgVnf0oKJgYGBobWtXamqqoYTn2I4CI+LTzM2NTulpKbu+vPHz2dV5RWlluZmi3j5+KqFJSSEzpw8uQPdAEYYIzo5Kfjrl28rWFlZzjAzMYuEBQao3Lh+g+HGvbsMzExMDN++fWf4/PXLBzY2tqYNK1f2+4eHM2xcuRLigsT09Igf3384MTExbf767etBI319jU8fPsi+//jx/72HDxh5uLkZ7ty7y/Dz1687Avz8n2UUFR3Z2NjOySoqfmdhYGBg+PbtuwI7O8e5H79+8X379t357PnzYo+ePP7y6cuXc9++f69nYGRsvf/w4XdtLS2R799/bBUWFHr57sP7Jbs3b/ZkzswvUP3165fZ7z9//r988WIVAyPDr8tXr576+u3bpb9//7YwMjKeV1dV41NWVGoVEhDgPH761DJREeHaz1+/lqlpafUx6+jrRfz4+fPy+w8fTu/fsf3uw7t3L39+//4cv7DwGQYGhpdPbt9m4BcRFlNWVJC4fuvWASszs4C379792Ldt2xZBUdEdDP5hYSqQGIjDGa965uYKCalpZQwMDAxhMTG9DAwMDLaurhIkJY7A8IgGBgYGBgd3Dz2yUpeFo6O4rasrA9T24ZRxAAMTwMpgEJwLAAAAAElFTkSuQmCC",b="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACYVBMVEUAAAAcJSU2Pz85QkM9RUWEhIWMjI2MkJEcJSU2Pz85QkM9RUWWlpc9RUVXXl4cJSU2Pz85QkM8REU9RUVRWFh6ens9RUVCSkpNVFRdY2McJSU5QkM7REQ9RUVGTk5KUlJQVldcY2Rla2uTk5WampscJSVUWltZX2BrcHF1e3scJSUjLCw9RUVASEhFTU1HTk9bYWJeZGRma2xudHV1eHiZmZocJSUyOjpJUFFQVldSWlpTWVpXXl5YXl5rb3B9fX6RkZIcJSUmLy8tNTU9RUVFTU1IT1BOVldRV1hTWlp0enocJSUfKChJUFBWXV1hZ2hnbGwcJSVETExLUlJLU1NNVVVPVlZYXl9cY2RiaGlobW5rcXFyd3h0eHgcJSUpMTFDS0tQV1dRV1hSWFlWXF1bYWJma2tobW5uc3SsrK0cJSVJUFBMVFROVlZVW1xZX2BdYmNhZ2hjaGhla2tqcHBscHE4Pz9KUlJRWVlSWVlXXF1aYGFbYWFfZWZlampqbW4cJSUgKSkiKysuNjY0PD01PT07QkNES0tHTk5JUFBMUlNMU1NOU1ROVVVPVVZRVlZRV1dSWVlWXFxXXV5aX2BbYWFbYWJcYmJcYmNcY2RdYmNgZmZhZmdkaWpkampkamtlamtla2tma2tma2xnbG1obW5pbG1pb3Bqb3Brb3BtcXJudHVvcHFvcXJvc3NwcXNwdXVxc3RzeXl1eXp2eXl3ent6e3x+gYKAhISBg4SKi4yLi4yWlpeampudnZ6fn6CkpaanqKiur6+vr7C4uLm6urq6u7u8vLy9vb3Av8DR0dL2b74UAAAAgHRSTlMAEBAQEBAQECAgICAgMDBAQEBAQEBAUFBQUGBgYGBgYGBgYGBgcHBwcHCAgICAgICAgICAgICPj4+Pj4+Pj4+Pj5+fn5+fn5+fn5+vr6+vr6+/v7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f7+/v7+/v7+/v78x6RlYAAAGBSURBVDjLY2AYWUCSgUGAk4GBTdlUhQebvP7yjIgCPQbWzBMnjx5wwJSX37Rwfm1isqj9/iPHTuxYlyeMJi+yunfptBkZOw/uWj9h3vatcycu8eRGlldb3Vsts3ph/cFTh7fN3bCoe2Vf8+TZoQhTvBa6REozVC7cuPvQnmULJm1e2z+308eyJieEBSLPXbKQIUqQIczk+N6eNaumtnZMaWhaHM89m8XVCqJA02Y5w0xmga6yfVsamtrN4xoXNzS0JTHkK3CXy4EVFMumcxUy2LbENTVkZfEzMDAudtJyTmNwS2XQreAFyvOlK9louDNVaXurmjkGgnTMkWDgXswtNouFISEX6Awv+RihQi5OcYY4DtVARpCCFCMGhiJ1hjwFBpagEAaWEpFoC0WQOCOjFMRRwXYMDB4BDLJ+QLYsg7GBGjtasLnEMjCIrWBgyAZ7058FI9x1SoFEnTCDsCyIhynPILYYSFgbYpUDA5bpQBluXzxpI1yYAbd2sCMYRhwAAHB9ZPztbuMUAAAAAElFTkSuQmCC",c="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";document.querySelector("link[rel=icon]").setAttribute("href","data:image/png;base64,"+a),document.querySelector("#bake img").setAttribute("src","data:image/png;base64,"+b),document.querySelector(".about-img-left").setAttribute("src","data:image/png;base64,"+c)},SeasonalWaiter.prototype.insert_spider_text=function(){document.title=document.title.replace(/Cyber/g,"Spider"),SeasonalWaiter.tree_walk(document.body,function(a){3===a.nodeType&&(a.nodeValue=a.nodeValue.replace(/Cyber/g,"Spider"))},!0),SeasonalWaiter.tree_walk(document.getElementById("bake-group"),function(a){3===a.nodeType&&(a.nodeValue=a.nodeValue.replace(/Bake/g,"Spin"))},!0),document.querySelector("#recipe .title").innerHTML="Web"},SeasonalWaiter.prototype.create_snow_option=function(){var a=document.getElementById("options-body"),b=document.createElement("div");b.className="option-item",b.innerHTML=" Let it snow",a.appendChild(b),this.manager.options.load()},SeasonalWaiter.prototype.let_it_snow=function(){if($(document).snowfall("clear"),this.app.options.snow){var a={},b=navigator.userAgent.match(/Firefox\/(\d\d?)/);a=b&&parseInt(b[1],10)<30?{flakeCount:10,flakeColor:"#fff",flakePosition:"absolute",minSize:1,maxSize:2,minSpeed:1,maxSpeed:5,round:!1,shadow:!1,collection:!1,collectionHeight:20,deviceorientation:!0}:{flakeCount:35,flakeColor:"#fff",flakePosition:"absolute",minSize:5,maxSize:8,minSpeed:1,maxSpeed:5,round:!0,shadow:!0,collection:".btn",collectionHeight:20,deviceorientation:!0},$(document).snowfall(a)}},SeasonalWaiter.prototype.shake_off_snow=function(a){for(var b=a.target,c=b.getBoundingClientRect(),d=document.querySelectorAll("canvas.snowfall-canvas"),e=null,f=function(){h.clearRect(0,0,e.width,e.height),$(this).fadeIn()},g=0;g6e4&&this.app.silent_bake()};var main=function(){var a=["To Base64","From Base64","To Hex","From Hex","To Hexdump","From Hexdump","URL Decode","Regular expression","Entropy","Fork"],b={update_url:!0,show_highlighter:!0,treat_as_utf8:!0,word_wrap:!0,show_errors:!0,error_timeout:4e3,auto_bake_threshold:200,attempt_highlight:!0,snow:!1};document.removeEventListener("DOMContentLoaded",main,!1),window.app=new HTMLApp(Categories,OperationConfig,a,b),window.app.setup()};window.console=console||{log:function(){},error:function(){}},window.compile_time=moment.tz("Tue Dec 20 2016 20:17:20","ddd MMM D YYYY HH:mm:ss","UTC").valueOf(),window.compile_message="Merry Christmas! Have a look in the options panel for some festive flavour.",document.addEventListener("DOMContentLoaded",main,!1); \ No newline at end of file +};ControlsWaiter.prototype.adjust_width=function(){var a=document.getElementById("controls"),b=document.getElementById("step"),c=document.getElementById("clr-breaks"),d=document.querySelector("#save img"),e=document.querySelector("#load img"),f=document.querySelector("#step img"),g=document.querySelector("#clr-recipe img"),h=document.querySelector("#clr-breaks img");a.clientWidth<470?b.childNodes[1].nodeValue=" Step":b.childNodes[1].nodeValue=" Step through",a.clientWidth<400?(d.style.display="none",e.style.display="none",f.style.display="none",g.style.display="none",h.style.display="none"):(d.style.display="inline",e.style.display="inline",f.style.display="inline",g.style.display="inline",h.style.display="inline"),a.clientWidth<330?c.childNodes[1].nodeValue=" Clear breaks":c.childNodes[1].nodeValue=" Clear breakpoints"},ControlsWaiter.prototype.set_auto_bake=function(a){var b=document.getElementById("auto-bake");b.checked!==a&&b.click()},ControlsWaiter.prototype.bake_click=function(){this.app.bake(),$("#output-text").selectRange(0)},ControlsWaiter.prototype.step_click=function(){this.app.bake(!0),$("#output-text").selectRange(0)},ControlsWaiter.prototype.auto_bake_change=function(){var a=document.getElementById("auto-bake-label"),b=document.getElementById("auto-bake");this.app.auto_bake_=b.checked,b.checked?(a.classList.remove("btn-default"),a.classList.add("btn-success")):(a.classList.remove("btn-success"),a.classList.add("btn-default"))},ControlsWaiter.prototype.clear_recipe_click=function(){this.manager.recipe.clear_recipe()},ControlsWaiter.prototype.clear_breaks_click=function(){for(var a=document.querySelectorAll("#rec_list li.operation .breakpoint"),b=0;b0,b=b&&f.length>0&&f.length<8e3,a&&(d+="?recipe="+encodeURIComponent(e)),a&&b?d+="&input="+encodeURIComponent(f):b&&(d+="?input="+encodeURIComponent(f)),d},ControlsWaiter.prototype.save_text_change=function(){try{var a=JSON.parse(document.getElementById("save-text").value);this.initialise_save_link(a)}catch(a){}},ControlsWaiter.prototype.save_click=function(){var a=this.app.get_recipe_config(),b=JSON.stringify(a).replace(/},{/g,"},\n{");document.getElementById("save-text").value=b,this.initialise_save_link(a),$("#save-modal").modal()},ControlsWaiter.prototype.slr_check_change=function(){this.initialise_save_link()},ControlsWaiter.prototype.sli_check_change=function(){this.initialise_save_link()},ControlsWaiter.prototype.load_click=function(){this.populate_load_recipes_list(),$("#load-modal").modal()},ControlsWaiter.prototype.save_button_click=function(){var a=document.getElementById("save-name").value,b=document.getElementById("save-text").value;if(!a)return void this.app.alert("Please enter a recipe name","danger",2e3);var c=localStorage.saved_recipes?JSON.parse(localStorage.saved_recipes):[],d=localStorage.recipe_id||0;c.push({id:++d,name:a,recipe:b}),localStorage.saved_recipes=JSON.stringify(c),localStorage.recipe_id=d,this.app.alert('Recipe saved as "'+a+'".',"success",2e3)},ControlsWaiter.prototype.populate_load_recipes_list=function(){for(var a=document.getElementById("load-name"),b=a.options.length;b--;)a.remove(b);var c=localStorage.saved_recipes?JSON.parse(localStorage.saved_recipes):[];for(b=0;bend: "+e+"
                                      length: "+f},HighlighterWaiter.prototype.remove_highlights=function(){document.getElementById("input-highlighter").innerHTML="",document.getElementById("output-highlighter").innerHTML="",document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML=""},HighlighterWaiter.prototype.generate_highlight_list=function(){for(var a=this.app.get_recipe_config(),b=[],c=0;c=0)return!1;var d="[start_highlight]",e=/\[start_highlight\]/g,f="[end_highlight]",g=/\[end_highlight\]/g,h=a.value;if(1===c.length){if(c[0].end/g,">").replace(/\n/g," ").replace(e,'').replace(g,"")+" ",b.style.width=a.clientWidth+"px",b.innerHTML=h,b.scrollTop=a.scrollTop,b.scrollLeft=a.scrollLeft};var HTMLApp=function(a,b,c,d){this.categories=a,this.operations=b,this.dfavourites=c,this.doptions=d,this.options=Utils.extend({},d),this.chef=new Chef,this.manager=new Manager(this),this.auto_bake_=!1,this.progress=0,this.ing_id=0,window.chef=this.chef};HTMLApp.prototype.setup=function(){document.dispatchEvent(this.manager.appstart),this.initialise_splitter(),this.load_local_storage(),this.populate_operations_list(),this.manager.setup(),this.reset_layout(),this.set_compile_message(),this.load_URI_params()},HTMLApp.prototype.handle_error=function(a){console.error(a);var b=a.display_str||a.toString();this.alert(b,"danger",this.options.error_timeout,!this.options.show_errors)},HTMLApp.prototype.bake=function(a){var b;try{b=this.chef.bake(this.get_input(),this.get_recipe_config(),this.options,this.progress,a)}catch(a){this.handle_error(a)}b&&(b.error&&this.handle_error(b.error),this.options=b.options,this.dish_str="html"===b.type?Utils.strip_html_tags(b.result,!0):b.result,this.progress=b.progress,this.manager.recipe.update_breakpoint_indicator(b.progress),this.manager.output.set(b.result,b.type,b.duration),b.duration>this.options.auto_bake_threshold&&this.auto_bake_&&(this.manager.controls.set_auto_bake(!1),this.alert("Baking took longer than "+this.options.auto_bake_threshold+"ms, Auto Bake has been disabled.","warning",5e3)))},HTMLApp.prototype.auto_bake=function(){this.auto_bake_&&this.bake()},HTMLApp.prototype.silent_bake=function(){var a=(new Date).getTime(),b=this.get_recipe_config();return this.auto_bake_&&this.chef.silent_bake(b),(new Date).getTime()-a},HTMLApp.prototype.get_input=function(){var a=this.manager.input.get();return sessionStorage.setItem("input_length",a.length),sessionStorage.setItem("input",a),a},HTMLApp.prototype.set_input=function(a){sessionStorage.setItem("input_length",a.length),sessionStorage.setItem("input",a),this.manager.input.set(a)},HTMLApp.prototype.populate_operations_list=function(){document.body.appendChild(document.getElementById("edit-favourites"));for(var a="",b=0;b2?JSON.parse(localStorage.favourites):this.dfavourites;a=this.valid_favourites(a),this.save_favourites(a);var b=this.categories.filter(function(a){return"Favourites"===a.name})[0];b?b.ops=a:this.categories.unshift({name:"Favourites",ops:a})},HTMLApp.prototype.valid_favourites=function(a){for(var b=[],c=0;c=0?void this.alert("'"+a+"' is already in your favourites","info",2e3):(b.push(a),this.save_favourites(b),this.load_favourites(),this.populate_operations_list(),void this.manager.recipe.initialise_operation_drag_n_drop())},HTMLApp.prototype.load_URI_params=function(){this.query_string=function(a){if(""===a)return{};for(var b={},c=0;c"):d[e].value=a[b].args[e];a[b].disabled&&c.querySelector(".disable-icon").click(),a[b].breakpoint&&c.querySelector(".breakpoint").click(),this.progress=0}},HTMLApp.prototype.reset_layout=function(){this.column_splitter.setSizes([20,30,50]),this.io_splitter.setSizes([50,50]),this.manager.controls.adjust_width(),this.manager.output.adjust_width()},HTMLApp.prototype.set_compile_message=function(){var a=new Date,b=Utils.fuzzy_time(a.getTime()-window.compile_time),c='Last build: '+b.substr(0,1).toUpperCase()+b.substr(1)+" ago";""!==window.compile_message&&(c+=" - "+window.compile_message),c+="",document.getElementById("notice").innerHTML=c},HTMLApp.prototype.alert=function(a,b,c,d){var e=new Date;if(console.log("["+e.toLocaleString()+"] "+a),!d){b=b||"danger",c=c||0;var f=document.getElementById("alert"),g=document.getElementById("alert-content");f.classList.remove("alert-danger"),f.classList.remove("alert-warning"),f.classList.remove("alert-info"),f.classList.remove("alert-success"),f.classList.add("alert-"+b),"block"===f.style.display?g.innerHTML+="

                                      ["+e.toLocaleTimeString()+"] "+a:g.innerHTML="["+e.toLocaleTimeString()+"] "+a,$("#alert").stop(),f.style.display="block",f.style.opacity=1,c>0&&(clearTimeout(this.alert_timeout),this.alert_timeout=setTimeout(function(){$("#alert").slideUp(100)},c))}},HTMLApp.prototype.confirm=function(a,b,c,d){d=d||this,document.getElementById("confirm-title").innerHTML=a,document.getElementById("confirm-body").innerHTML=b,document.getElementById("confirm-modal").style.display="block",this.confirm_closed=!1,$("#confirm-modal").modal().one("show.bs.modal",function(a){this.confirm_closed=!1}.bind(this)).one("click","#confirm-yes",function(){this.confirm_closed=!0,c.bind(d)(!0),$("#confirm-modal").modal("hide")}.bind(this)).one("hide.bs.modal",function(a){this.confirm_closed||c.bind(d)(!1),this.confirm_closed=!0}.bind(this))},HTMLApp.prototype.alert_close_click=function(){document.getElementById("alert").style.display="none"},HTMLApp.prototype.state_change=function(a){this.auto_bake(),this.options.update_url&&(this.last_state_url=this.manager.controls.generate_state_url(!0,!0),window.history.replaceState({},"CyberChef",this.last_state_url))},HTMLApp.prototype.pop_state=function(a){window.location.href.split("#")[0]!==this.last_state_url&&this.load_URI_params()},HTMLApp.prototype.call_api=function(a,b,c,d,e){b=b||"POST",c=c||{},d=d||void 0,e=e||"application/json";var f=null,g=!1;return $.ajax({url:a,async:!1,type:b,data:c,dataType:d,contentType:e,success:function(a){g=!0,f=a},error:function(a){g=!1,f=a}}),{success:g,response:f}};var HTMLCategory=function(a,b){this.name=a,this.selected=b,this.op_list=[]};HTMLCategory.prototype.add_operation=function(a){this.op_list.push(a)},HTMLCategory.prototype.to_html=function(){for(var a="cat"+this.name.replace(/[\s\/-:_]/g,""),b="
                                      "+this.name+"
                                        ",c=0;c 
                                      ";switch(d+="
                                      ",this.type){case"string":case"binary_string":case"byte_array":d+="";break;case"short_string":case"binary_short_string":d+="";break;case"toggle_string":for(d+="
                                      ";break;case"number":d+="";break;case"boolean":d+="",this.disable_args&&this.manager.add_dynamic_listener("#"+this.id,"click",this.toggle_disable_args,this);break;case"option":for(d+="";break;case"populate_option":for(d+="",this.manager.add_dynamic_listener("#"+this.id,"change",this.populate_option_change,this);break;case"editable_option":for(d+="
                                      ",d+="",d+="",d+="
                                      ",this.manager.add_dynamic_listener("#sel-"+this.id,"change",this.editable_option_change,this);break;case"text":d+=""}return d+="
                                      "},HTMLIngredient.prototype.toggle_disable_args=function(a){for(var b,c=a.target,d=c.parentNode.parentNode,e=d.querySelectorAll(".arg-group"),f=0;f"),this.description&&(b+=""),b+=""},HTMLOperation.prototype.to_full_html=function(){for(var a="
                                      "+this.name+"
                                      ",b=0;b=0&&(this.name=this.name.slice(0,b)+""+this.name.slice(b,b+a.length)+""+this.name.slice(b+a.length)),this.description&&c>=0&&(this.description=this.description.slice(0,c)+""+this.description.slice(c,c+a.length)+""+this.description.slice(c+a.length))};var InputWaiter=function(a,b){this.app=a,this.manager=b,this.bad_keys=[16,17,18,19,20,27,33,34,35,36,37,38,39,40,44,91,92,93,112,113,114,115,116,117,118,119,120,121,122,123,144,145]};InputWaiter.prototype.get=function(){return document.getElementById("input-text").value},InputWaiter.prototype.set=function(a){document.getElementById("input-text").value=a,window.dispatchEvent(this.manager.statechange)},InputWaiter.prototype.set_input_info=function(a,b){var c=a.toString().length;c=c<2?2:c;var d=Utils.pad(a.toString(),c," ").replace(/ /g," "),e=Utils.pad(b.toString(),c," ").replace(/ /g," ");document.getElementById("input-info").innerHTML="length: "+d+"
                                      lines: "+e},InputWaiter.prototype.input_change=function(a){this.manager.highlighter.remove_highlights(),this.app.progress=0;var b=this.get(),c=b.count("\n")+1;this.set_input_info(b.length,c),this.bad_keys.indexOf(a.keyCode)<0&&window.dispatchEvent(this.manager.statechange)},InputWaiter.prototype.input_dragover=function(a){return"move"!==a.dataTransfer.effectAllowed&&(a.stopPropagation(),a.preventDefault(),void a.target.classList.add("dropping-file"))},InputWaiter.prototype.input_dragleave=function(a){a.stopPropagation(),a.preventDefault(),a.target.classList.remove("dropping-file")},InputWaiter.prototype.input_drop=function(a){if("move"===a.dataTransfer.effectAllowed)return!1;a.stopPropagation(),a.preventDefault();var b=a.target,c=a.dataTransfer.files[0],d=a.dataTransfer.getData("Text"),e=new FileReader,f="",g=0,h=20480,i=function(){f.length>1e5&&this.app.auto_bake_&&(this.manager.controls.set_auto_bake(!1),this.app.alert("Turned off Auto Bake as the input is large","warning",5e3)),this.set(f);var a=this.app.get_recipe_config();a[0]&&"From Hex"===a[0].op||(a.unshift({op:"From Hex",args:["Space"]}),this.app.set_recipe_config(a)),b.classList.remove("loading_file")}.bind(this),j=function(){if(g>=c.size)return void i();b.value="Processing... "+Math.round(g/c.size*100)+"%";var a=c.slice(g,g+h);e.readAsArrayBuffer(a)};e.onload=function(a){var b=new Uint8Array(e.result);f+=Utils.to_hex_fast(b),g+=h,j()},b.classList.remove("dropping-file"),c?(b.classList.add("loading_file"),j()):d&&this.set(d)},InputWaiter.prototype.clear_io_click=function(){this.manager.highlighter.remove_highlights(),document.getElementById("input-text").value="",document.getElementById("output-text").value="",document.getElementById("input-info").innerHTML="",document.getElementById("output-info").innerHTML="",document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML="",window.dispatchEvent(this.manager.statechange)};var Manager=function(a){this.app=a,this.appstart=new CustomEvent("appstart",{bubbles:!0}),this.operationadd=new CustomEvent("operationadd",{bubbles:!0}),this.operationremove=new CustomEvent("operationremove",{bubbles:!0}),this.oplistcreate=new CustomEvent("oplistcreate",{bubbles:!0}),this.statechange=new CustomEvent("statechange",{bubbles:!0}),this.window=new WindowWaiter(this.app),this.controls=new ControlsWaiter(this.app,this),this.recipe=new RecipeWaiter(this.app,this),this.ops=new OperationsWaiter(this.app,this),this.input=new InputWaiter(this.app,this),this.output=new OutputWaiter(this.app,this),this.options=new OptionsWaiter(this.app),this.highlighter=new HighlighterWaiter(this.app), +this.seasonal=new SeasonalWaiter(this.app,this),this.dynamic_handlers={},this.initialise_event_listeners()};Manager.prototype.setup=function(){this.recipe.initialise_operation_drag_n_drop(),this.controls.auto_bake_change(),this.seasonal.load()},Manager.prototype.initialise_event_listeners=function(){window.addEventListener("resize",this.window.window_resize.bind(this.window)),window.addEventListener("blur",this.window.window_blur.bind(this.window)),window.addEventListener("focus",this.window.window_focus.bind(this.window)),window.addEventListener("statechange",this.app.state_change.bind(this.app)),window.addEventListener("popstate",this.app.pop_state.bind(this.app)),document.getElementById("bake").addEventListener("click",this.controls.bake_click.bind(this.controls)),document.getElementById("auto-bake").addEventListener("change",this.controls.auto_bake_change.bind(this.controls)),document.getElementById("step").addEventListener("click",this.controls.step_click.bind(this.controls)),document.getElementById("clr-recipe").addEventListener("click",this.controls.clear_recipe_click.bind(this.controls)),document.getElementById("clr-breaks").addEventListener("click",this.controls.clear_breaks_click.bind(this.controls)),document.getElementById("save").addEventListener("click",this.controls.save_click.bind(this.controls)),document.getElementById("save-button").addEventListener("click",this.controls.save_button_click.bind(this.controls)),document.getElementById("save-link-recipe-checkbox").addEventListener("change",this.controls.slr_check_change.bind(this.controls)),document.getElementById("save-link-input-checkbox").addEventListener("change",this.controls.sli_check_change.bind(this.controls)),document.getElementById("load").addEventListener("click",this.controls.load_click.bind(this.controls)),document.getElementById("load-delete-button").addEventListener("click",this.controls.load_delete_click.bind(this.controls)),document.getElementById("load-name").addEventListener("change",this.controls.load_name_change.bind(this.controls)),document.getElementById("load-button").addEventListener("click",this.controls.load_button_click.bind(this.controls)),this.add_multi_event_listener("#save-text","keyup paste",this.controls.save_text_change,this.controls),this.add_multi_event_listener("#search","keyup paste search",this.ops.search_operations,this.ops),this.add_dynamic_listener(".op_list li.operation","dblclick",this.ops.operation_dblclick,this.ops),document.getElementById("edit-favourites").addEventListener("click",this.ops.edit_favourites_click.bind(this.ops)),document.getElementById("save-favourites").addEventListener("click",this.ops.save_favourites_click.bind(this.ops)),document.getElementById("reset-favourites").addEventListener("click",this.ops.reset_favourites_click.bind(this.ops)),this.add_dynamic_listener(".op_list .op-icon","mouseover",this.ops.op_icon_mouseover,this.ops),this.add_dynamic_listener(".op_list .op-icon","mouseleave",this.ops.op_icon_mouseleave,this.ops),this.add_dynamic_listener(".op_list","oplistcreate",this.ops.op_list_create,this.ops),this.add_dynamic_listener("li.operation","operationadd",this.recipe.op_add.bind(this.recipe)),this.add_dynamic_listener(".arg","keyup",this.recipe.ing_change,this.recipe),this.add_dynamic_listener(".arg","change",this.recipe.ing_change,this.recipe),this.add_dynamic_listener(".disable-icon","click",this.recipe.disable_click,this.recipe),this.add_dynamic_listener(".breakpoint","click",this.recipe.breakpoint_click,this.recipe),this.add_dynamic_listener("#rec_list li.operation","dblclick",this.recipe.operation_dblclick,this.recipe),this.add_dynamic_listener("#rec_list li.operation > div","dblclick",this.recipe.operation_child_dblclick,this.recipe),this.add_dynamic_listener("#rec_list .input-group .dropdown-menu a","click",this.recipe.dropdown_toggle_click,this.recipe),this.add_dynamic_listener("#rec_list","operationremove",this.recipe.op_remove.bind(this.recipe)),this.add_multi_event_listener("#input-text","keyup paste",this.input.input_change,this.input),document.getElementById("reset-layout").addEventListener("click",this.app.reset_layout.bind(this.app)),document.getElementById("clr-io").addEventListener("click",this.input.clear_io_click.bind(this.input)),document.getElementById("input-text").addEventListener("dragover",this.input.input_dragover.bind(this.input)),document.getElementById("input-text").addEventListener("dragleave",this.input.input_dragleave.bind(this.input)),document.getElementById("input-text").addEventListener("drop",this.input.input_drop.bind(this.input)),document.getElementById("input-text").addEventListener("scroll",this.highlighter.input_scroll.bind(this.highlighter)),document.getElementById("input-text").addEventListener("mouseup",this.highlighter.input_mouseup.bind(this.highlighter)),document.getElementById("input-text").addEventListener("mousemove",this.highlighter.input_mousemove.bind(this.highlighter)),this.add_multi_event_listener("#input-text","mousedown dblclick select",this.highlighter.input_mousedown,this.highlighter),document.getElementById("save-to-file").addEventListener("click",this.output.save_click.bind(this.output)),document.getElementById("switch").addEventListener("click",this.output.switch_click.bind(this.output)),document.getElementById("undo-switch").addEventListener("click",this.output.undo_switch_click.bind(this.output)),document.getElementById("maximise-output").addEventListener("click",this.output.maximise_output_click.bind(this.output)),document.getElementById("output-text").addEventListener("scroll",this.highlighter.output_scroll.bind(this.highlighter)),document.getElementById("output-text").addEventListener("mouseup",this.highlighter.output_mouseup.bind(this.highlighter)),document.getElementById("output-text").addEventListener("mousemove",this.highlighter.output_mousemove.bind(this.highlighter)),document.getElementById("output-html").addEventListener("mouseup",this.highlighter.output_html_mouseup.bind(this.highlighter)),document.getElementById("output-html").addEventListener("mousemove",this.highlighter.output_html_mousemove.bind(this.highlighter)),this.add_multi_event_listener("#output-text","mousedown dblclick select",this.highlighter.output_mousedown,this.highlighter),this.add_multi_event_listener("#output-html","mousedown dblclick select",this.highlighter.output_html_mousedown,this.highlighter),document.getElementById("options").addEventListener("click",this.options.options_click.bind(this.options)),document.getElementById("reset-options").addEventListener("click",this.options.reset_options_click.bind(this.options)),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox",this.options.switch_change.bind(this.options)),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox",this.options.set_word_wrap.bind(this.options)),this.add_dynamic_listener(".option-item input[type=number]","keyup",this.options.number_change,this.options),this.add_dynamic_listener(".option-item input[type=number]","change",this.options.number_change,this.options),this.add_dynamic_listener(".option-item select","change",this.options.select_change,this.options),document.getElementById("alert-close").addEventListener("click",this.app.alert_close_click.bind(this.app))},Manager.prototype.add_listeners=function(a,b,c,d){d=d||this,[].forEach.call(document.querySelectorAll(a),function(a){a.addEventListener(b,c.bind(d))})},Manager.prototype.add_multi_event_listener=function(a,b,c,d){for(var e=b.split(" "),f=0;f-1&&(this.manager.recipe.add_operation(b[c].innerHTML),this.app.auto_bake()))),13===a.keyCode)a.preventDefault();else if(40===a.keyCode)a.preventDefault(),b=document.querySelectorAll("#search-results li"),b.length&&(c=this.get_selected_op(b),c>-1&&b[c].classList.remove("selected-op"),c===b.length-1&&(c=-1),b[c+1].classList.add("selected-op"));else if(38===a.keyCode)a.preventDefault(),b=document.querySelectorAll("#search-results li"),b.length&&(c=this.get_selected_op(b),c>-1&&b[c].classList.remove("selected-op"),0===c&&(c=b.length),b[c-1].classList.add("selected-op"));else{for(var d=document.getElementById("search-results"),e=a.target,f=e.value;d.firstChild;)$(d.firstChild).popover("destroy"),d.removeChild(d.firstChild);if($("#categories .in").collapse("hide"),f){for(var g=this.filter_operations(f,!0),h="",i=0;i=0||h>=0){var i=new HTMLOperation(e,this.app.operations[e],this.app,this.manager);b&&i.highlight_search_string(a,g,h),g<0?c.push(i):d.push(i)}}return d.concat(c)},OperationsWaiter.prototype.get_selected_op=function(a){for(var b=0;blength: "+e+"
                                      lines: "+f,document.getElementById("input-selection-info").innerHTML="",document.getElementById("output-selection-info").innerHTML=""},OutputWaiter.prototype.adjust_width=function(){var a=document.getElementById("output"),b=document.getElementById("save-to-file"),c=document.getElementById("switch"),d=document.getElementById("undo-switch"),e=document.getElementById("maximise-output");a.clientWidth<680?(b.childNodes[1].nodeValue="",c.childNodes[1].nodeValue="",d.childNodes[1].nodeValue="",e.childNodes[1].nodeValue=""):(b.childNodes[1].nodeValue=" Save to file",c.childNodes[1].nodeValue=" Move output to input",d.childNodes[1].nodeValue=" Undo",e.childNodes[1].nodeValue="Maximise"===e.getAttribute("title")?" Max":" Restore")},OutputWaiter.prototype.save_click=function(){var a=Utils.to_base64(this.app.dish_str),b=window.prompt("Please enter a filename:","download.dat");if(b){var c=document.createElement("a");c.setAttribute("href","data:application/octet-stream;base64;charset=utf-8,"+a),c.setAttribute("download",b),c.style.display="none",document.body.appendChild(c),c.click(),c.remove()}},OutputWaiter.prototype.switch_click=function(){this.switch_orig_data=this.manager.input.get(),document.getElementById("undo-switch").disabled=!1,this.app.set_input(this.app.dish_str)},OutputWaiter.prototype.undo_switch_click=function(){this.app.set_input(this.switch_orig_data),document.getElementById("undo-switch").disabled=!0},OutputWaiter.prototype.maximise_output_click=function(a){var b="maximise-output"===a.target.id?a.target:a.target.parentNode;"Maximise"===b.getAttribute("title")?(this.app.column_splitter.collapse(0),this.app.column_splitter.collapse(1),this.app.io_splitter.collapse(0),b.setAttribute("title","Restore"),b.innerHTML=" Restore",this.adjust_width()):(b.setAttribute("title","Maximise"),b.innerHTML=" Max",this.app.reset_layout())};var RecipeWaiter=function(a,b){this.app=a,this.manager=b,this.remove_intent=!1};RecipeWaiter.prototype.initialise_operation_drag_n_drop=function(){var a=document.getElementById("rec_list");Sortable.create(a,{group:"recipe",sort:!0,animation:0,delay:0,filter:".arg-input,.arg",setData:function(a,b){a.setData("Text",b.querySelector(".arg-title").textContent)},onEnd:function(a){this.remove_intent&&(a.item.remove(),a.target.dispatchEvent(this.manager.operationremove))}.bind(this)}),Sortable.utils.on(a,"dragover",function(){this.remove_intent=!1}.bind(this)),Sortable.utils.on(a,"dragleave",function(){this.remove_intent=!0,this.app.progress=0}.bind(this)),Sortable.utils.on(a,"touchend",function(b){var c=b.changedTouches[0],d=document.elementFromPoint(c.clientX,c.clientY);this.remove_intent=!a.contains(d)}.bind(this)),document.querySelector("#categories a").addEventListener("dragover",this.fav_dragover.bind(this)),document.querySelector("#categories a").addEventListener("dragleave",this.fav_dragleave.bind(this)),document.querySelector("#categories a").addEventListener("drop",this.fav_drop.bind(this))},RecipeWaiter.prototype.create_sortable_seed_list=function(a){Sortable.create(a,{group:{name:"recipe",pull:"clone",put:!1},sort:!1,setData:function(a,b){a.setData("Text",b.textContent)},onStart:function(a){$(a.item).popover("destroy"),a.item.setAttribute("data-toggle","popover-disabled")},onEnd:this.op_sort_end.bind(this)})},RecipeWaiter.prototype.op_sort_end=function(a){return this.remove_intent?void("rec_list"===a.item.parentNode.id&&a.item.remove()):($(a.clone).popover(),$(a.clone).children("[data-toggle=popover]").popover(),void("rec_list"===a.item.parentNode.id&&(this.build_recipe_operation(a.item),a.item.dispatchEvent(this.manager.operationadd))))},RecipeWaiter.prototype.fav_dragover=function(a){return"move"===a.dataTransfer.effectAllowed&&(a.stopPropagation(),a.preventDefault(),void(a.target.className&&a.target.className.indexOf("category-title")>-1?a.target.classList.add("favourites-hover"):a.target.parentNode.className&&a.target.parentNode.className.indexOf("category-title")>-1?a.target.parentNode.classList.add("favourites-hover"):a.target.parentNode.parentNode.className&&a.target.parentNode.parentNode.className.indexOf("category-title")>-1&&a.target.parentNode.parentNode.classList.add("favourites-hover")))},RecipeWaiter.prototype.fav_dragleave=function(a){a.stopPropagation(),a.preventDefault(),document.querySelector("#categories a").classList.remove("favourites-hover")},RecipeWaiter.prototype.fav_drop=function(a){a.stopPropagation(),a.preventDefault(),a.target.classList.remove("favourites-hover");var b=a.dataTransfer.getData("Text");this.app.add_favourite(b)},RecipeWaiter.prototype.ing_change=function(){window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.disable_click=function(a){var b=a.target;"false"===b.getAttribute("disabled")?(b.setAttribute("disabled","true"),b.classList.add("disable-icon-selected"),b.parentNode.parentNode.classList.add("disabled")):(b.setAttribute("disabled","false"),b.classList.remove("disable-icon-selected"),b.parentNode.parentNode.classList.remove("disabled")),this.app.progress=0,window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.breakpoint_click=function(a){var b=a.target;"false"===b.getAttribute("break")?(b.setAttribute("break","true"),b.classList.add("breakpoint-selected")):(b.setAttribute("break","false"),b.classList.remove("breakpoint-selected")),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.operation_dblclick=function(a){a.target.remove(),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.operation_child_dblclick=function(a){a.target.parentNode.remove(),window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.get_config=function(){for(var a,b,c,d,e,f=[],g=document.querySelectorAll("#rec_list li.operation"),h=0;h",this.ing_change()},RecipeWaiter.prototype.op_add=function(a){window.dispatchEvent(this.manager.statechange)},RecipeWaiter.prototype.op_remove=function(a){window.dispatchEvent(this.manager.statechange)};var SeasonalWaiter=function(a,b){this.app=a,this.manager=b};SeasonalWaiter.prototype.load=function(){var a=new Date;11===a.getMonth()&&a.getDate()>12&&(this.app.options.snow=!1,this.create_snow_option(),$(document).on("switchChange.bootstrapSwitch",".option-item input:checkbox[option='snow']",this.let_it_snow.bind(this)),window.addEventListener("resize",this.let_it_snow.bind(this)),this.manager.add_listeners(".btn","click",this.shake_off_snow,this),25===a.getDate()&&this.let_it_snow()),this.kkeys=[],window.addEventListener("keydown",this.konami_code_listener.bind(this))},SeasonalWaiter.prototype.insert_spider_icons=function(){var a="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVQ4y2NgGJaAmYGBgVnf0oKJgYGBobWtXamqqoYTn2I4CI+LTzM2NTulpKbu+vPHz2dV5RWlluZmi3j5+KqFJSSEzpw8uQPdAEYYIzo5Kfjrl28rWFlZzjAzMYuEBQao3Lh+g+HGvbsMzExMDN++fWf4/PXLBzY2tqYNK1f2+4eHM2xcuRLigsT09Igf3384MTExbf767etBI319jU8fPsi+//jx/72HDxh5uLkZ7ty7y/Dz1687Avz8n2UUFR3Z2NjOySoqfmdhYGBg+PbtuwI7O8e5H79+8X379t357PnzYo+ePP7y6cuXc9++f69nYGRsvf/w4XdtLS2R799/bBUWFHr57sP7Jbs3b/ZkzswvUP3165fZ7z9//r988WIVAyPDr8tXr576+u3bpb9//7YwMjKeV1dV41NWVGoVEhDgPH761DJREeHaz1+/lqlpafUx6+jrRfz4+fPy+w8fTu/fsf3uw7t3L39+//4cv7DwGQYGhpdPbt9m4BcRFlNWVJC4fuvWASszs4C379792Ldt2xZBUdEdDP5hYSqQGIjDGa965uYKCalpZQwMDAxhMTG9DAwMDLaurhIkJY7A8IgGBgYGBgd3Dz2yUpeFo6O4rasrA9T24ZRxAAMTwMpgEJwLAAAAAElFTkSuQmCC",b="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACYVBMVEUAAAAcJSU2Pz85QkM9RUWEhIWMjI2MkJEcJSU2Pz85QkM9RUWWlpc9RUVXXl4cJSU2Pz85QkM8REU9RUVRWFh6ens9RUVCSkpNVFRdY2McJSU5QkM7REQ9RUVGTk5KUlJQVldcY2Rla2uTk5WampscJSVUWltZX2BrcHF1e3scJSUjLCw9RUVASEhFTU1HTk9bYWJeZGRma2xudHV1eHiZmZocJSUyOjpJUFFQVldSWlpTWVpXXl5YXl5rb3B9fX6RkZIcJSUmLy8tNTU9RUVFTU1IT1BOVldRV1hTWlp0enocJSUfKChJUFBWXV1hZ2hnbGwcJSVETExLUlJLU1NNVVVPVlZYXl9cY2RiaGlobW5rcXFyd3h0eHgcJSUpMTFDS0tQV1dRV1hSWFlWXF1bYWJma2tobW5uc3SsrK0cJSVJUFBMVFROVlZVW1xZX2BdYmNhZ2hjaGhla2tqcHBscHE4Pz9KUlJRWVlSWVlXXF1aYGFbYWFfZWZlampqbW4cJSUgKSkiKysuNjY0PD01PT07QkNES0tHTk5JUFBMUlNMU1NOU1ROVVVPVVZRVlZRV1dSWVlWXFxXXV5aX2BbYWFbYWJcYmJcYmNcY2RdYmNgZmZhZmdkaWpkampkamtlamtla2tma2tma2xnbG1obW5pbG1pb3Bqb3Brb3BtcXJudHVvcHFvcXJvc3NwcXNwdXVxc3RzeXl1eXp2eXl3ent6e3x+gYKAhISBg4SKi4yLi4yWlpeampudnZ6fn6CkpaanqKiur6+vr7C4uLm6urq6u7u8vLy9vb3Av8DR0dL2b74UAAAAgHRSTlMAEBAQEBAQECAgICAgMDBAQEBAQEBAUFBQUGBgYGBgYGBgYGBgcHBwcHCAgICAgICAgICAgICPj4+Pj4+Pj4+Pj5+fn5+fn5+fn5+vr6+vr6+/v7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f7+/v7+/v7+/v78x6RlYAAAGBSURBVDjLY2AYWUCSgUGAk4GBTdlUhQebvP7yjIgCPQbWzBMnjx5wwJSX37Rwfm1isqj9/iPHTuxYlyeMJi+yunfptBkZOw/uWj9h3vatcycu8eRGlldb3Vsts3ph/cFTh7fN3bCoe2Vf8+TZoQhTvBa6REozVC7cuPvQnmULJm1e2z+308eyJieEBSLPXbKQIUqQIczk+N6eNaumtnZMaWhaHM89m8XVCqJA02Y5w0xmga6yfVsamtrN4xoXNzS0JTHkK3CXy4EVFMumcxUy2LbENTVkZfEzMDAudtJyTmNwS2XQreAFyvOlK9louDNVaXurmjkGgnTMkWDgXswtNouFISEX6Awv+RihQi5OcYY4DtVARpCCFCMGhiJ1hjwFBpagEAaWEpFoC0WQOCOjFMRRwXYMDB4BDLJ+QLYsg7GBGjtasLnEMjCIrWBgyAZ7058FI9x1SoFEnTCDsCyIhynPILYYSFgbYpUDA5bpQBluXzxpI1yYAbd2sCMYRhwAAHB9ZPztbuMUAAAAAElFTkSuQmCC",c="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";document.querySelector("link[rel=icon]").setAttribute("href","data:image/png;base64,"+a),document.querySelector("#bake img").setAttribute("src","data:image/png;base64,"+b),document.querySelector(".about-img-left").setAttribute("src","data:image/png;base64,"+c)},SeasonalWaiter.prototype.insert_spider_text=function(){document.title=document.title.replace(/Cyber/g,"Spider"),SeasonalWaiter.tree_walk(document.body,function(a){3===a.nodeType&&(a.nodeValue=a.nodeValue.replace(/Cyber/g,"Spider"))},!0),SeasonalWaiter.tree_walk(document.getElementById("bake-group"),function(a){3===a.nodeType&&(a.nodeValue=a.nodeValue.replace(/Bake/g,"Spin"))},!0),document.querySelector("#recipe .title").innerHTML="Web"},SeasonalWaiter.prototype.create_snow_option=function(){var a=document.getElementById("options-body"),b=document.createElement("div");b.className="option-item",b.innerHTML=" Let it snow",a.appendChild(b),this.manager.options.load()},SeasonalWaiter.prototype.let_it_snow=function(){if($(document).snowfall("clear"),this.app.options.snow){var a={},b=navigator.userAgent.match(/Firefox\/(\d\d?)/);a=b&&parseInt(b[1],10)<30?{flakeCount:10,flakeColor:"#fff",flakePosition:"absolute",minSize:1,maxSize:2,minSpeed:1,maxSpeed:5,round:!1,shadow:!1,collection:!1,collectionHeight:20,deviceorientation:!0}:{flakeCount:35,flakeColor:"#fff",flakePosition:"absolute",minSize:5,maxSize:8,minSpeed:1,maxSpeed:5, +round:!0,shadow:!0,collection:".btn",collectionHeight:20,deviceorientation:!0},$(document).snowfall(a)}},SeasonalWaiter.prototype.shake_off_snow=function(a){for(var b=a.target,c=b.getBoundingClientRect(),d=document.querySelectorAll("canvas.snowfall-canvas"),e=null,f=function(){h.clearRect(0,0,e.width,e.height),$(this).fadeIn()},g=0;g6e4&&this.app.silent_bake()};var main=function(){var a=["To Base64","From Base64","To Hex","From Hex","To Hexdump","From Hexdump","URL Decode","Regular expression","Entropy","Fork"],b={update_url:!0,show_highlighter:!0,treat_as_utf8:!0,word_wrap:!0,show_errors:!0,error_timeout:4e3,auto_bake_threshold:200,attempt_highlight:!0,snow:!1};document.removeEventListener("DOMContentLoaded",main,!1),window.app=new HTMLApp(Categories,OperationConfig,a,b),window.app.setup()};window.console=console||{log:function(){},error:function(){}},window.compile_time=moment.tz("Wed Dec 21 2016 12:12:01","ddd MMM D YYYY HH:mm:ss","UTC").valueOf(),window.compile_message="Merry Christmas! Have a look in the options panel for some festive flavour.",document.addEventListener("DOMContentLoaded",main,!1); \ No newline at end of file diff --git a/src/html/index.html b/src/html/index.html index 50a2d2d0..57d78d74 100755 --- a/src/html/index.html +++ b/src/html/index.html @@ -114,10 +114,10 @@
                                      Output
                                      - - - - + + + +
                                      diff --git a/src/js/views/html/HTMLApp.js b/src/js/views/html/HTMLApp.js index b2fe6626..4440a88b 100755 --- a/src/js/views/html/HTMLApp.js +++ b/src/js/views/html/HTMLApp.js @@ -207,9 +207,12 @@ HTMLApp.prototype.populate_operations_list = function() { HTMLApp.prototype.initialise_splitter = function() { this.column_splitter = Split(["#operations", "#recipe", "#IO"], { sizes: [20, 30, 50], - minSize: [240, 325, 500], + minSize: [240, 325, 440], gutterSize: 4, - onDrag: this.manager.controls.adjust_width.bind(this.manager.controls) + onDrag: function() { + this.manager.controls.adjust_width(); + this.manager.output.adjust_width(); + }.bind(this) }); this.io_splitter = Split(["#input", "#output"], { @@ -467,6 +470,7 @@ HTMLApp.prototype.reset_layout = function() { this.io_splitter.setSizes([50, 50]); this.manager.controls.adjust_width(); + this.manager.output.adjust_width(); }; diff --git a/src/js/views/html/OutputWaiter.js b/src/js/views/html/OutputWaiter.js index da05dc8e..38f93708 100755 --- a/src/js/views/html/OutputWaiter.js +++ b/src/js/views/html/OutputWaiter.js @@ -95,6 +95,32 @@ OutputWaiter.prototype.set_output_info = function(length, lines, duration) { }; +/** + * Adjusts the display properties of the output buttons so that they fit within the current width + * without wrapping or overflowing. + */ +OutputWaiter.prototype.adjust_width = function() { + var output = document.getElementById("output"), + save_to_file = document.getElementById("save-to-file"), + switch_io = document.getElementById("switch"), + undo_switch = document.getElementById("undo-switch"), + maximise_output = document.getElementById("maximise-output"); + + if (output.clientWidth < 680) { + save_to_file.childNodes[1].nodeValue = ""; + switch_io.childNodes[1].nodeValue = ""; + undo_switch.childNodes[1].nodeValue = ""; + maximise_output.childNodes[1].nodeValue = ""; + } else { + save_to_file.childNodes[1].nodeValue = " Save to file"; + switch_io.childNodes[1].nodeValue = " Move output to input"; + undo_switch.childNodes[1].nodeValue = " Undo"; + maximise_output.childNodes[1].nodeValue = + maximise_output.getAttribute("title") === "Maximise" ? " Max" : " Restore"; + } +}; + + /** * Handler for save click events. * Saves the current output to a file, downloaded as a URL octet stream. @@ -144,16 +170,19 @@ OutputWaiter.prototype.undo_switch_click = function() { * Resizes the output frame to be as large as possible, or restores it to its original size. */ OutputWaiter.prototype.maximise_output_click = function(e) { - var el = e.target; - - if (el.textContent.indexOf("Max") >= 0) { + var el = e.target.id === "maximise-output" ? e.target : e.target.parentNode; + + if (el.getAttribute("title") === "Maximise") { this.app.column_splitter.collapse(0); this.app.column_splitter.collapse(1); this.app.io_splitter.collapse(0); + el.setAttribute("title", "Restore"); el.innerHTML = " Restore"; + this.adjust_width(); } else { - this.app.reset_layout(); + el.setAttribute("title", "Maximise"); el.innerHTML = " Max"; + this.app.reset_layout(); } }; diff --git a/src/static/stats.txt b/src/static/stats.txt index 8f261e4d..9251e6cf 100644 --- a/src/static/stats.txt +++ b/src/static/stats.txt @@ -1,9 +1,9 @@ 206 source files -113322 lines +113355 lines 4.2M size 137 JavaScript source files -104164 lines +104197 lines 3.7M size 79 third party JavaScript source files @@ -11,7 +11,7 @@ 3.0M size 58 first party JavaScript source files -19112 lines +19145 lines 724K size 3.4M uncompressed JavaScript size From ef464ab57c97dd3147aed3bd0ffce2c21de18110 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Wed, 21 Dec 2016 14:09:46 +0000 Subject: [PATCH 12/12] Added 'Substitute' operation. --- build/prod/cyberchef.htm | 24 ++++++++++----------- build/prod/index.html | 2 +- build/prod/scripts.js | 20 ++++++++--------- src/js/config/Categories.js | 1 + src/js/config/OperationConfig.js | 18 ++++++++++++++++ src/js/operations/Cipher.js | 37 ++++++++++++++++++++++++++++++++ src/static/stats.txt | 8 +++---- 7 files changed, 83 insertions(+), 27 deletions(-) diff --git a/build/prod/cyberchef.htm b/build/prod/cyberchef.htm index b2534f74..7f8177c7 100755 --- a/build/prod/cyberchef.htm +++ b/build/prod/cyberchef.htm @@ -91,11 +91,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -*/.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.clo,.opn,.pun{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}#content-wrapper{top:0;left:0;width:100%;height:100%}#banner{height:30px;text-align:center;line-height:30px}#wrapper{top:30px;bottom:0}div#operations,div#recipe{width:50%;height:100%}div#input,div#output{width:100%;height:50%}.title{padding:10px;height:43px}.textarea-wrapper{top:43px;bottom:0;width:100%;overflow:hidden}#output-html,textarea{width:100%;height:100%;border:none;padding:3px;-moz-padding-start:3px;-moz-padding-end:3px}#input-text,#output-html,#output-text{position:relative;border-width:0;margin:0;resize:none;background-color:transparent;white-space:pre-wrap;word-wrap:break-word}#output-html{display:none;overflow-y:auto;-moz-padding-start:1px}.split{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:auto;position:relative}.gutter.gutter-horizontal,.split.split-horizontal{height:100%;float:left}#input-highlighter,#output-highlighter{position:absolute;left:0;top:0;width:100%;height:100%;padding:3px;margin:0;overflow:hidden;letter-spacing:normal;white-space:pre-wrap;word-wrap:break-word;color:#fff;background-color:transparent;border:none}#op_list,#rec_list,.op_list{margin:0;padding:0;list-style-type:none}#op_list,#rec_list{position:absolute;top:43px;bottom:0;width:100%}.io-btn-group,.io-info{margin-top:-4px;float:right}#rec_list{bottom:120px;overflow:auto}.operation{cursor:pointer;padding:10px;list-style-type:none;position:relative}#controls{position:absolute;width:100%;height:120px;bottom:0;padding:10px}.io-info{margin-right:20px;height:30px;text-align:right;line-height:10px}.arg-group,.inline-args input[type=checkbox]{margin-top:10px}#input-info{line-height:15px}.arg-group{display:table;width:100%}.arg-group-text{display:block}.inline-args{float:left;width:auto;margin-right:30px;height:34px}.inline-args input[type=number]{width:100px}.arg-input{display:table-cell;width:100%;padding:6px 12px}.short-string{width:150px}select{display:block}.arg[disabled]{cursor:not-allowed;opacity:1}textarea.arg{width:100%;min-height:50px;height:70px;margin-top:5px;border:1px solid #ddd;resize:vertical}.arg-label{display:table-cell;width:1px;padding-right:10px;font-weight:400;white-space:pre}.title,optgroup{font-weight:700}.editable-option{position:relative;display:inline-block}.editable-option-input{position:absolute;top:1px;left:1px;width:calc(100% - 20px);height:calc(100% - 2px)!important;border:none!important}#operational-controls{width:65%;float:left;text-align:center}#bake-group{display:table;width:100%}#bake{display:table-cell;width:100%;border-top-right-radius:0;border-bottom-right-radius:0}#auto-bake-label{display:table-cell;padding:1px;line-height:1.35;width:60px;border-top-left-radius:0;border-bottom-left-radius:0;border-left:1px solid #5cb85c}#auto-bake-label:hover{border-left-color:#398439}#auto-bake-label div{font-size:10px;padding:2px}#extra-controls{float:right;width:35%;padding-left:10px}.op-icon{float:right;margin-left:10px;margin-top:3px}.recip-icons{position:absolute;top:13px;right:10px;height:16px}.recip-icon{margin-right:10px;vertical-align:baseline;float:right}.disable-icon{width:16px;height:16px;margin-top:-1px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAACfElEQVQ4y6WTPWgTYRjHf8nlfVvuoDVIP4Yuki4WHKoUqggFRUTsUEGkVG2hmCq6OnTwIxYHB+eijZOKdLNDW1pKKyGigh8dBHUJElxyBgx3vEnukvdyDrUhRXDxGR+e/+/583xEwjDkfyIGwNVTzURm4tYAMA6MAoN/0tvAMrA48uL+l2bx4w0iYRjSuHKC6OnTZLqHk8CcaZq9bW1tSCkBqNVq+L5PpVIpAHdGfr5LN9bXiT7Z2nGgteb1/qFkLBJZ6OjowHEc8vk8pVIJgHg8TldXF52dnb2u6y5s7R/iuF5JSyAKkLl4eyAMwznLsrBtm1wu99Z13amk+BFJih8R13WXANrb27EsizAM5zIXbw+wC9Baj0spe5VSFAqFt4ZhXJ6ufXuK55E5cDKVSCTGenp6yGazKKWQUvZqrcebgCAIRqWUOI6DEOLR1K8POapVMgfPpoC7u2LLspYcx0FKSRAEo60OBg3DwPd9Jr5vPqWvj8zh83vEwL2J75vnfN/HMAy01oPNNQZBQBAEO1OvVsl0D/8lTuZfpYDd7gRBQKuD7XK5jGmarB679PIv8deVFJUKq8cuTZqmSblcRmu93QpYVkohhMCyrLE94n2/UlSrbJy5kRBCXBNCoJRCa73cClh0XbfgeR6WZZHNZunv719KvnmeYnWVVxdmJ2Ox2DMhxFHP83Bdt6C1XgR2LvHzQDvvb84npZQL8Xgc0zSJRqN7br7RaFCpVCiVStRqtZmhh9fTh754TQdMr82nPc+bsW27UCwWUUpRr9ep1+sopSgWi9i2XfA8b2Z6bT6ttabp4GMi0uz0aXbhn890+MFM85mO5MIdwP/Eb1pMUCdctYRzAAAAAElFTkSuQmCC) no-repeat}.disable-icon-selected{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACFUlEQVR4XqWTP0tbURjGn9zY3mjBwsUhBQtS6XKxiNypIGZJ6SKYUYdaKWg7OrrE3pYO+Qit3dpFuuQO6lI7Z4nESQdjlJbkJh0MksSb3Jvk9H0gjZFu9YWH83LO7zn/3nNCSincJobAeP1sEDBFi6J50UyPy4l2RNuioz756Ts0tt1OB4jH2a52Ne2HGh9PwrJm2EcxZx/HyPRYMDgB2u02/N3d1c7w8BZMM1ptNJBPp3GwsUExB/s4RoYsPf0JOkFgdoH34YkJ/D48xC/HyTTOzl5ayWSIktwxqlVo0SjIkKWnP0Hg+4swjGitVMJFNpu5o+svptfXv6DZBDIZezoWS3Db3A0ZsvRcH8H354dGR9EoFHA3EvlorqycwvOAXM4G8Pav+f7YmEOGLD1gsIzl54+V+vBK/Yw9ZAv1LQW1FrdFSnKVfQTK5liPUfRI9I8ArqiPjLAF9vcHVybyzlpasgcZeq7voNXKNSsV3DMMXB4fp/8xLyzYuLri2DIZsvQM3sFOzXURiUR4zsQNcyrFleFVKpNyP2/IkKVnsArbF65bbkqplJSJZrl5x5qbs7G3h3artSyV+arr+lMyZOnpP2Wp6ZFos3R+vvUgCGDNzgKalkA4rECIr07662J2i0X4nrfJJ33jJT6Zmvpcr9XWCicn5WI+j7rrAmKgmLOPY2TI0sPgb8TBZOi/PpN1qnDr7/wH3jxgB/FKIXkAAAAASUVORK5CYII=) no-repeat}.breakpoint{float:right;width:14px;height:14px;background-color:#eee;border:1px solid #aaa}.breakpoint-selected{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEXIUkvzUVHzTEzzn5785eXrbW24BgbzWVnze3vzVVXzY2Pyion509PzbW3zXV1UMxj0l5f1srKbRTRgOxzJDg796ur74ODfIyP5zs6LLx3pNTXYGxuxdkVZNhn////sCC1eAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAABWSURBVBjTnc+7EoAgDERRTOQVxMEZFAf//z8FjAUFDbfb060QU2FwxngimxnCea3bjegSgz+0tguAfBgIy64QGfZQdg91dgAtqUZgnfz6IacYVWvu2AvR4wNAv0nxrAAAAABJRU5ErkJggg==) -2px -2px no-repeat #eee}.banner-right{float:right;margin-right:10px}#banner img{margin-bottom:2px;margin-left:8px}.category-title{display:block;padding:10px}.category{margin:0!important;border-radius:0!important;border:none}#search{border-radius:0;border:none}.loading_file{background:url(data:image/gif;base64,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) center center no-repeat #f5f5f5}#alert{position:fixed;width:30%;margin:30px auto;top:10px;left:0;right:0;z-index:2000;display:none}#alert a{text-decoration:underline}.option-item .bootstrap-switch{margin:15px 10px}.option-item button{margin:10px}.option-item input[type=number]{margin:15px 10px;width:80px;height:28px;padding:3px 10px;vertical-align:middle}.option-item select{margin:10px;display:inline-block}button img,span.btn img{margin-right:3px;margin-bottom:1px}#edit-favourites{float:right;margin-top:-5px}#edit-favourites-list{margin:10px}.about-img-left{float:left;margin:10px 20px 20px 0}.about-img-right{float:right;margin:10px 0 20px 20px}.save-link-options{float:right}.save-link-options input{margin-left:10px}#save-footer{border-top:none;margin-top:0}a:focus,button{outline:0;-moz-outline-style:none}.btn-default{border-color:#ddd}.btn-default:focus{background-color:#fff;border-color:#adadad}.btn-default:active,.btn-default:hover{background-color:#ebebeb;border-color:#adadad}.alert,.btn,.btn-lg,.dropdown-menu,.form-control,.modal-content,.nav-tabs>li>a,.popover,.tooltip-inner{border-radius:0!important}input[type=search]{-webkit-appearance:searchfield;box-shadow:none}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.modal{overflow-y:auto}.form-control{background-color:transparent}code{border:0;white-space:pre-wrap}.bootstrap-switch,.bootstrap-switch-container,.bootstrap-switch-handle-off,.bootstrap-switch-handle-on,.bootstrap-switch-label,pre{border-radius:0!important}#banner,.title{border-bottom:1px solid #ddd}blockquote{font-size:inherit}.panel-body:after,.panel-body:before{content:""}.sortable-ghost{opacity:.6}.colorpicker-element{float:left;margin-right:15px}.colorpicker-color,.colorpicker-color div{height:100px}.word-wrap{white-space:pre!important;word-wrap:normal!important;overflow-x:scroll!important}.clearfix{height:0}.blur{color:transparent!important;text-shadow:rgba(0,0,0,.95) 0 0 10px!important}.no-select{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.konami{-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg);transform:rotate(180deg);-moz-transform:rotate(180deg)}.hl1,.hlyellow{background-color:#fff000}.hl2,.hlblue{background-color:#95dfff}.hl3,.hlred{background-color:#ffb6b6}.hl4,.hlorange{background-color:#fcf8e3}.hl5,.hlgreen{background-color:#8de768}.title{color:#424242;background-color:#fafafa}.gutter{background-color:#eee;background-repeat:no-repeat;background-position:50%}.gutter.gutter-horizontal{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAeCAYAAAAGos/EAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAlSURBVChTYzxz5sx/BiBgAhEgwPju3TtUEZZ79+6BGcNcDQMDACWJMFs4hNOSAAAAAElFTkSuQmCC);cursor:ew-resize}.gutter.gutter-vertical{background-image:url(data:image/png;base64,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);cursor:ns-resize}.operation{border:1px solid #999;border-top-width:0}.op_list .operation{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}#rec_list .operation{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.arg-input,select{height:34px;border:1px solid #ddd;background-color:#fff;color:#424242}#controls{border-top:1px solid #ddd;background-color:#fafafa}.textarea-wrapper div,.textarea-wrapper textarea{font-family:Consolas,monospace;font-size:inherit}.io-info{font-weight:400;font-size:8pt}.arg-title,.category-title{font-weight:700}.arg-input{font-size:15px;line-height:1.428571429}select{padding:6px 8px}.arg[disabled]{background-color:#eee}textarea.arg{color:#424242}.break{color:#b94a48!important;background-color:#f2dede!important;border-color:#eed3d7!important}.category-title{background-color:#fafafa;border-bottom:1px solid #eee}.category-title[aria-expanded=true],.category-title[href='#catFavourites']{border-bottom-color:#ddd}.category-title.collapsed{border-bottom-color:#eee}.category-title:hover{color:#3a87ad}#search{border-bottom:1px solid #e3e3e3}.dropping-file{border:5px dashed #3a87ad!important}.selected-op{color:#c09853!important;background-color:#fcf8e3!important;border-color:#fbeed5!important}.option-item input[type=number]{font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;border:1px solid #ccc}.favourites-hover{color:#468847;background-color:#dff0d8;border:2px dashed #468847!important;padding:8px 8px 9px}#edit-favourites-list{border:1px solid #bce8f1}#edit-favourites-list .operation{border-left:none;border-right:none}#edit-favourites-list .operation:last-child{border-bottom:none}.subtext{font-style:italic;font-size:13px;color:#999}#save-footer{border-bottom:1px solid #e5e5e5}.flow-control-op{color:#396f3a!important;background-color:#c7e4ba!important;border-color:#b3dba2!important}.flow-control-op.break{color:#94312f!important;background-color:#eabfbf!important;border-color:#e2aeb5!important}#support-modal textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}#load-text,#save-text{font-family:Consolas,monospace}button.dropdown-toggle{background-color:#f4f4f4}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background-color:#fafafa}::-webkit-scrollbar-thumb{background-color:#ccc}::-webkit-scrollbar-thumb:hover{background-color:#bbb}::-webkit-scrollbar-corner{background-color:#fafafa}.disabled{color:#999!important;background-color:#dfdfdf!important;border-color:#cdcdcd!important}.grey{color:#333;background-color:#f5f5f5;border-color:#ddd}.dark-blue{color:#fff;background-color:#428bca;border-color:#428bca}.red{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.amber{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.green{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.blue{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1} Edit
                                      Operations
                                        Recipe
                                          Input
                                          Output
                                          Operations
                                            Recipe
                                              Input
                                              Output
                                              \ No newline at end of file +},pad_right:function(a,b,c){return c=c||" ",a.lengthb&&(a=a.slice(0,b-c.length)+c),a},hex:function(a,b){return a="string"==typeof a?Utils.ord(a):a,b=b||2,Utils.pad(a.toString(16),b)},bin:function(a,b){return a="string"==typeof a?Utils.ord(a):a,b=b||8,Utils.pad(a.toString(2),b)},printable:function(a,b){window&&window.app&&!window.app.options.treat_as_utf8&&(a=Utils.byte_array_to_chars(Utils.str_to_byte_array(a)));var c=/[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g,d=/[\x09-\x10\x0D\u2028\u2029]/g;return a=a.replace(c,"."),b||(a=a.replace(d,".")),a},parse_escaped_chars:function(a){return a.replace(/(\\)?\\([nrtbf]|x[\da-f]{2})/g,function(a,b,c){if("\\"===b)return"\\"+c;switch(c[0]){case"n":return"\n";case"r":return"\r";case"t":return"\t";case"b":return"\b";case"f":return"\f";case"x":return Utils.chr(parseInt(c.substr(1),16))}})},expand_alph_range:function(a){for(var b=[],c=0;c255)return Utils.str_to_utf8_byte_array(a);return c},str_to_utf8_byte_array:function(a){var b=CryptoJS.enc.Utf8.parse(a),c=Utils.word_array_to_byte_array(b);return a.length!==b.sigBytes&&(window.app.options.attempt_highlight=!1),c},str_to_charcode:function(a){for(var b=new Array(a.length),c=a.length;c--;)b[c]=a.charCodeAt(c);return b},byte_array_to_utf8:function(a){try{for(var b=[],c=0;c>>2]|=a[c]<<24-c%4*8;var d=new CryptoJS.lib.WordArray.init(b,a.length),e=CryptoJS.enc.Utf8.stringify(d);return e.length!==d.sigBytes&&(window.app.options.attempt_highlight=!1),e}catch(b){return Utils.byte_array_to_chars(a)}},byte_array_to_chars:function(a){if(!a)return"";for(var b="",c=0;c>>2]>>>24-d%4*8&255);return c},UNIC_WIN1251_MAP:{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,34:34,35:35,36:36,37:37,38:38,39:39,40:40,41:41,42:42,43:43,44:44,45:45,46:46,47:47,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,58:58,59:59,60:60,61:61,62:62,63:63,64:64,65:65,66:66,67:67,68:68,69:69,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,82:82,83:83,84:84,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99,100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,1027:129,8225:135,1046:198,8222:132,1047:199,1168:165,1048:200,1113:154,1049:201,1045:197,1050:202,1028:170,160:160,1040:192,1051:203,164:164,166:166,167:167,169:169,171:171,172:172,173:173,174:174,1053:205,176:176,177:177,1114:156,181:181,182:182,183:183,8221:148,187:187,1029:189,1056:208,1057:209,1058:210,8364:136,1112:188,1115:158,1059:211,1060:212,1030:178,1061:213,1062:214,1063:215,1116:157,1064:216,1065:217,1031:175,1066:218,1067:219,1068:220,1069:221,1070:222,1032:163,8226:149,1071:223,1072:224,8482:153,1073:225,8240:137,1118:162,1074:226,1110:179,8230:133,1075:227,1033:138,1076:228,1077:229,8211:150,1078:230,1119:159,1079:231,1042:194,1080:232,1034:140,1025:168,1081:233,1082:234,8212:151,1083:235,1169:180,1084:236,1052:204,1085:237,1035:142,1086:238,1087:239,1088:240,1089:241,1090:242,1036:141,1041:193,1091:243,1092:244,8224:134,1093:245,8470:185,1094:246,1054:206,1095:247,1096:248,8249:139,1097:249,1098:250,1044:196,1099:251,1111:191,1055:207,1100:252,1038:161,8220:147,1101:253,8250:155,1102:254,8216:145,1103:255,1043:195,1105:184,1039:143,1026:128,1106:144,8218:130,1107:131,8217:146,1108:186,1109:190},WIN1251_UNIC_MAP:{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,34:34,35:35,36:36,37:37,38:38,39:39,40:40,41:41,42:42,43:43,44:44,45:45,46:46,47:47,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,58:58,59:59,60:60,61:61,62:62,63:63,64:64,65:65,66:66,67:67,68:68,69:69,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,82:82,83:83,84:84,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99,100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,160:160,164:164,166:166,167:167,169:169,171:171,172:172,173:173,174:174,176:176,177:177,181:181,182:182,183:183,187:187,168:1025,128:1026,129:1027,170:1028,189:1029,178:1030,175:1031,163:1032,138:1033,140:1034,142:1035,141:1036,161:1038,143:1039,192:1040,193:1041,194:1042,195:1043,196:1044,197:1045,198:1046,199:1047,200:1048,201:1049,202:1050,203:1051,204:1052,205:1053,206:1054,207:1055,208:1056,209:1057,210:1058,211:1059,212:1060,213:1061,214:1062,215:1063,216:1064,217:1065,218:1066,219:1067,220:1068,221:1069,222:1070,223:1071,224:1072,225:1073,226:1074,227:1075,228:1076,229:1077,230:1078,231:1079,232:1080,233:1081,234:1082,235:1083,236:1084,237:1085,238:1086,239:1087,240:1088,241:1089,242:1090,243:1091,244:1092,245:1093,246:1094,247:1095,248:1096,249:1097,250:1098,251:1099,252:1100,253:1101,254:1102,255:1103,184:1105,144:1106,131:1107,186:1108,190:1109,179:1110,191:1111,188:1112,154:1113,156:1114,158:1115,157:1116,162:1118,159:1119,165:1168,180:1169,150:8211,151:8212,145:8216,146:8217,130:8218,147:8220,148:8221,132:8222,134:8224,135:8225,149:8226,133:8230,137:8240,139:8249,155:8250,136:8364,185:8470,153:8482},unicode_to_win1251:function(a){for(var b=[],c=0;c>2,g=(3&c)<<4|d>>4,h=(15&d)<<2|e>>6,i=63&e,isNaN(d)?h=i=64:isNaN(e)&&(i=64),j+=b.charAt(f)+b.charAt(g)+b.charAt(h)+b.charAt(i);return j},from_base64:function(a,b,c,d){if(c=c||"string",!a)return"string"===c?"":[];b=b?Utils.expand_alph_range(b).join(""):"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",void 0===d&&(d=!0);var e,f,g,h,i,j,k,l=[],m=0;if(d){var n=new RegExp("[^"+b.replace(/[\[\]\\\-^$]/g,"\\$&")+"]","g");a=a.replace(n,"")}for(;m>4,f=(15&i)<<4|j>>2,g=(3&j)<<6|k,l.push(e),64!==j&&l.push(f),64!==k&&l.push(g);return"string"===c?Utils.byte_array_to_utf8(l):l},to_hex:function(a,b,c){if(!a)return"";b="string"==typeof b?b:" ",c=c||2;for(var d="",e=0;e>>4).toString(16)),b.push((15&a[c]).toString(16));return b.join("")},from_hex:function(a,b,c){if(b=b||(a.indexOf(" ")>=0?"Space":"None"),c=c||2,"None"!==b){var d=Utils.regex_rep[b];a=a.replace(d,"")}for(var e=[],f=0;f]*>.*<\/(script|style)>/gim,"")),a.replace(/<[^>\n]+>/g,"")},escape_html:function(a){return a.replace(/>>3]|=parseInt(a.substr(d,2),16)<<24-d%8*4;return new CryptoJS.lib.WordArray.init(c,b/2)};var Base={DEFAULT_RADIX:36,run_to:function(a,b){if(!a)throw"Error: Input must be a number";var c=b[0]||Base.DEFAULT_RADIX;if(c<2||c>36)throw"Error: Radix argument must be between 2 and 36";return a.toString(c)},run_from:function(a,b){var c=b[0]||Base.DEFAULT_RADIX;if(c<2||c>36)throw"Error: Radix argument must be between 2 and 36";return parseInt(a.replace(/\s/g,""),c)}},Base64={ALPHABET:"A-Za-z0-9+/=",ALPHABET_OPTIONS:[{name:"Standard: A-Za-z0-9+/=",value:"A-Za-z0-9+/="},{name:"URL safe: A-Za-z0-9-_",value:"A-Za-z0-9-_"},{name:"Filename safe: A-Za-z0-9+-=",value:"A-Za-z0-9+\\-="},{name:"itoa64: ./0-9A-Za-z=",value:"./0-9A-Za-z="},{name:"XML: A-Za-z0-9_.",value:"A-Za-z0-9_."},{name:"y64: A-Za-z0-9._-",value:"A-Za-z0-9._-"},{name:"z64: 0-9a-zA-Z+/=",value:"0-9a-zA-Z+/="},{name:"Radix-64: 0-9A-Za-z+/=",value:"0-9A-Za-z+/="},{name:"Uuencoding: [space]-_",value:" -_"},{name:"Xxencoding: +-0-9A-Za-z",value:"+\\-0-9A-Za-z"},{name:"BinHex: !-,-0-689@A-NP-VX-Z[`a-fh-mp-r",value:"!-,-0-689@A-NP-VX-Z[`a-fh-mp-r"},{name:"ROT13: N-ZA-Mn-za-m0-9+/=",value:"N-ZA-Mn-za-m0-9+/="}],run_to:function(a,b){var c=b[0]||Base64.ALPHABET;return Utils.to_base64(a,c)},REMOVE_NON_ALPH_CHARS:!0,run_from:function(a,b){var c=b[0]||Base64.ALPHABET,d=b[1];return Utils.from_base64(a,c,"byte_array",d)},BASE32_ALPHABET:"A-Z2-7=",run_to_32:function(a,b){if(!a)return"";for(var c,d,e,f,g,h,i,j,k,l,m,n,o,p=b[0]?Utils.expand_alph_range(b[0]).join(""):"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",q="",r=0;r>3,i=(7&c)<<2|d>>6,j=d>>1&31,k=(1&d)<<4|e>>4,l=(15&e)<<1|f>>7,m=f>>2&63,n=(3&f)<<3|g>>5,o=31&g,isNaN(d)?j=k=l=m=n=o=32:isNaN(e)?l=m=n=o=32:isNaN(f)?m=n=o=32:isNaN(g)&&(o=32),q+=p.charAt(h)+p.charAt(i)+p.charAt(j)+p.charAt(k)+p.charAt(l)+p.charAt(m)+p.charAt(n)+p.charAt(o);return q},run_from_32:function(a,b){if(!a)return[];var c,d,e,f,g,h,i,j,k,l,m,n,o,p=b[0]?Utils.expand_alph_range(b[0]).join(""):"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",q=b[0],r=[],s=0;if(q){var t=new RegExp("[^"+p.replace(/[\]\\\-^]/g,"\\$&")+"]","g");a=a.replace(t,"")}for(;s>2,d=(3&i)<<6|j<<1|k>>4,e=(15&k)<<4|l>>1,f=(1&l)<<7|m<<2|n>>3,g=(7&n)<<5|o,r.push(c),(i&!0||32!==j)&&r.push(d),(k&!0||32!==l)&&r.push(e),(l&!0||32!==m)&&r.push(f),(n&!0||32!==o)&&r.push(g);return r},SHOW_IN_BINARY:!1,OFFSETS_SHOW_VARIABLE:!0,run_offsets:function(a,b){var c=b[0]||Base64.ALPHABET,d=b[1],e=Utils.to_base64(a,c),f=Utils.to_base64([0].concat(a),c),g=Utils.to_base64([0,0].concat(a),c),h=e.indexOf("="),i=f.indexOf("="),j=g.indexOf("="),k=" \ No newline at end of file diff --git a/build/prod/index.html b/build/prod/index.html index fabbe97f..7aea87fa 100755 --- a/build/prod/index.html +++ b/build/prod/index.html @@ -18,4 +18,4 @@ See the License for the specific language governing permissions and limitations under the License. --> -CyberChef Edit
                                              Operations
                                                Recipe
                                                  Input
                                                  Output
                                                  \ No newline at end of file +CyberChef Edit
                                                  Operations
                                                    Recipe
                                                      Input
                                                      Output
                                                      \ No newline at end of file diff --git a/build/prod/scripts.js b/build/prod/scripts.js index 43360cb9..7c89770a 100755 --- a/build/prod/scripts.js +++ b/build/prod/scripts.js @@ -265,13 +265,13 @@ function(a){"function"==typeof define&&define.amd?define(a):"undefined"!=typeof function(){function a(a){this.code=a,this.message=Vc[a]}function b(b){var c=b.match(/\$?(?:(?![0-9-])(?:\w[\w.-]*|\*):)?(?![0-9-])(?:\w[\w.-]*|\*)|\(:|:\)|\/\/|\.\.|::|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?|"[^"]*(?:""[^"]*)*"|'[^']*(?:''[^']*)*'|<<|>>|[!<>]=|(?![0-9-])[\w-]+:\*|\s+|./g);if(c){for(var d=0,e=0,f=c.length;e0)}function e(){this.dataTypes={},this.documents={},this.functions={},this.collations={},this.collections={}}function f(a,b,c){Xc[a]=c,Yc[a]=b}function g(a,b){Zc[a]=b}function h(c,d){var e=new b(c),f=l(e,d);if(!e.eof())throw new a("XPST0003");if(!f)throw new a("XPST0003");this.internalExpression=f}function i(){}function j(){}function k(){this.items=[]}function l(b,c){var d;if(!b.eof()&&(d=m(b,c))){var e=new k;for(e.items.push(d);","==b.peek();){if(b.next(),b.eof()||!(d=m(b,c)))throw new a("XPST0003");e.items.push(d)}return e}}function m(a,b){if(!a.eof())return s(a,b)||o(a,b)||u(a,b)||K(a,b)}function n(){this.bindings=[],this.returnExpr=null}function o(b,c){if("for"==b.peek()&&"$"==b.peek(1).substr(0,1)){b.next();var d,e=new n;do e.bindings.push(q(b,c));while(","==b.peek()&&b.next());if("return"!=b.peek())throw new a("XPST0003");if(b.next(),b.eof()||!(d=m(b,c)))throw new a("XPST0003");return e.returnExpr=d,e}}function p(a,b,c,d){this.prefix=a,this.localName=b,this.namespaceURI=c,this.inExpr=d}function q(b,c){var d=b.peek().substr(1).match(id);if(!d)throw new a("XPST0003");if("*"==d[1]||"*"==d[2])throw new a("XPST0003");if(b.next(),"in"!=b.peek())throw new a("XPST0003");b.next();var e;if(b.eof()||!(e=m(b,c)))throw new a("XPST0003");return new p(d[1]||null,d[2],d[1]?c.getURIForPrefix(d[1]):null,e)}function r(a,b,c){this.condExpr=a,this.thenExpr=b,this.elseExpr=c}function s(b,c){var d,e,f;if("if"==b.peek()&&"("==b.peek(1)){if(b.next(2),b.eof()||!(d=l(b,c)))throw new a("XPST0003");if(")"!=b.peek())throw new a("XPST0003");if(b.next(),"then"!=b.peek())throw new a("XPST0003");if(b.next(),b.eof()||!(e=m(b,c)))throw new a("XPST0003");if("else"!=b.peek())throw new a("XPST0003");if(b.next(),b.eof()||!(f=m(b,c)))throw new a("XPST0003");return new r(d,e,f)}}function t(a){this.quantifier=a,this.bindings=[],this.satisfiesExpr=null}function u(b,c){var d=b.peek();if(("some"==d||"every"==d)&&"$"==b.peek(1).substr(0,1)){b.next();var e,f=new t(d);do f.bindings.push(w(b,c));while(","==b.peek()&&b.next());if("satisfies"!=b.peek())throw new a("XPST0003");if(b.next(),b.eof()||!(e=m(b,c)))throw new a("XPST0003");return f.satisfiesExpr=e,f}}function v(a,b,c,d){this.prefix=a,this.localName=b,this.namespaceURI=c,this.inExpr=d}function w(b,c){var d=b.peek().substr(1).match(id);if(!d)throw new a("XPST0003");if("*"==d[1]||"*"==d[2])throw new a("XPST0003");if(b.next(),"in"!=b.peek())throw new a("XPST0003");b.next();var e;if(b.eof()||!(e=m(b,c)))throw new a("XPST0003");return new v(d[1]||null,d[2],d[1]?c.getURIForPrefix(d[1]):null,e)}function x(a,b,c){this.left=a,this.right=b,this.operator=c}function y(b,c){var d,e;if(!b.eof()&&(d=ya(b,c))){if(!(b.peek()in cd))return d;var f=b.peek();if(b.next(),b.eof()||!(e=ya(b,c)))throw new a("XPST0003");return new x(d,e,f)}}function z(a,b){var c=vc(a.left.evaluate(b),b);if(!c.length)return new Xa(!1);var d=vc(a.right.evaluate(b),b);if(!d.length)return new Xa(!1);for(var e,f,g=!1,h=0,i=c.length;hj)throw new a("XPST0017");if(i1)throw new a("XPTY0004")}else if("+"==d){if(e<1)throw new a("XPTY0004")}else if("*"!=d&&1!=e)throw new a("XPTY0004")}function va(a){this.left=a,this.items=[]}function wa(b,c){var d,e;if(!b.eof()&&(d=Ca(b,c))){if("intersect"!=(e=b.peek())&&"except"!=e)return d;for(var f=new va(d);"intersect"==(e=b.peek())||"except"==e;){if(b.next(),b.eof()||!(d=Ca(b,c)))throw new a("XPST0003");f.items.push([e,d])}return f}}function xa(a,b){this.left=a,this.right=b}function ya(b,c){var d,e;if(!b.eof()&&(d=D(b,c))){if("to"!=b.peek())return d;if(b.next(),b.eof()||!(e=D(b,c)))throw new a("XPST0003");return new xa(d,e)}}function za(a){this.left=a,this.items=[]}function Aa(b,c){var d,e;if(!b.eof()&&(d=wa(b,c))){if("|"!=(e=b.peek())&&"union"!=e)return d;for(var f=new za(d);"|"==(e=b.peek())||"union"==e;){if(b.next(),b.eof()||!(d=wa(b,c)))throw new a("XPST0003");f.items.push(d)}return f}}function Ba(a,b){this.expression=a,this.type=b}function Ca(b,c){var d,e;if(!b.eof()&&(d=Ea(b,c))){if("instance"!=b.peek()||"of"!=b.peek(1))return d;if(b.next(2),b.eof()||!(e=Oa(b,c)))throw new a("XPST0003");return new Ba(d,e)}}function Da(a,b){this.expression=a,this.type=b}function Ea(b,c){var d,e;if(!b.eof()&&(d=Ga(b,c))){if("treat"!=b.peek()||"as"!=b.peek(1))return d;if(b.next(2),b.eof()||!(e=Oa(b,c)))throw new a("XPST0003");return new Da(d,e)}}function Fa(a,b){this.expression=a,this.type=b}function Ga(b,c){var d,e;if(!b.eof()&&(d=Ia(b,c))){if("castable"!=b.peek()||"as"!=b.peek(1))return d;if(b.next(2),b.eof()||!(e=Qa(b,c)))throw new a("XPST0003");return new Fa(d,e)}}function Ha(a,b){this.expression=a,this.type=b}function Ia(b,c){var d,e;if(!b.eof()&&(d=H(b,c))){if("cast"!=b.peek()||"as"!=b.peek(1))return d;if(b.next(2),b.eof()||!(e=Qa(b,c)))throw new a("XPST0003");return new Ha(d,e)}}function Ja(a,b,c){this.prefix=a,this.localName=b,this.namespaceURI=c}function Ka(b,c){var d=b.peek().match(id);if(d){if("*"==d[1]||"*"==d[2])throw new a("XPST0003");return b.next(),new Ja(d[1]||null,d[2],d[1]?c.getURIForPrefix(d[1]):null)}}function La(a){this.test=a}function Ma(b,c){if(!b.eof()){var d;if("item"==b.peek()&&"("==b.peek(1)){if(b.next(2),")"!=b.peek())throw new a("XPST0003");return b.next(),new La}return(d=Z(b,c))?new La(d):(d=Ka(b,c))?new La(d):void 0}}function Na(a,b){this.itemType=a||null,this.occurence=b||null}function Oa(b,c){if(!b.eof()){if("empty-sequence"==b.peek()&&"("==b.peek(1)){if(b.next(2),")"!=b.peek())throw new a("XPST0003");return b.next(),new Na}var d,e;return!b.eof()&&(d=Ma(b,c))?(e=b.peek(),"?"==e||"*"==e||"+"==e?b.next():e=null,new Na(d,e)):void 0}}function Pa(a,b){this.itemType=a||null,this.occurence=b||null}function Qa(a,b){var c,d;if(!a.eof()&&(c=Ka(a,b)))return d=a.peek(),"?"==d?a.next():d=null,new Pa(c,d)}function Ra(){}function Sa(){}function Ta(){}function Ua(a){return a instanceof lb||a instanceof gb||a instanceof fb}function Va(a,b,c,d,e){this.scheme=a,this.authority=b,this.path=c,this.query=d,this.fragment=e}function Wa(a){this.value=a}function Xa(a){this.value=a}function Ya(a,b,c,d,e){this.year=a,this.month=b,this.day=c,this.timezone=d,this.negative=e}function Za(a,b){return 2==b&&(a%400==0||a%100!=0&&a%4==0)?29:pd[b-1]}function $a(a,b){if(!b){var c=Za(a.year,a.month);if(a.day>c)for(;a.day>c;)a.month+=1,a.month>12&&(a.year+=1,0==a.year&&(a.year=1),a.month=1),a.day-=c,c=Za(a.year,a.month);else if(a.day<1)for(;a.day<1;)a.month-=1,a.month<1&&(a.year-=1,0==a.year&&(a.year=-1),a.month=12),c=Za(a.year,a.month),a.day+=c}return a.month>12?(a.year+=~~(a.month/12),0==a.year&&(a.year=1),a.month=a.month%12):a.month<1&&(a.year+=~~(a.month/12)-1,0==a.year&&(a.year=-1),a.month=a.month%12+12),a}function _a(a,b,c,d,e,f,g,h){this.year=a,this.month=b,this.day=c,this.hours=d,this.minutes=e,this.seconds=f,this.timezone=g,this.negative=h}function ab(a,b){var c=Ac(a);return arguments.length<2&&(b=2),(c.length0?"+":"-")+ab(Gc.abs(~~(b/60)))+":"+ab(Gc.abs(b%60)):"Z"}function cb(a){return(a.negative?"-":"")+ab(a.year,4)+"-"+ab(a.month)+"-"+ab(a.day)}function db(a){var b=Ac(a.seconds).split(".");return ab(a.hours)+":"+ab(a.minutes)+":"+ab(b[0])+(b.length>1?"."+b[1]:"")}function eb(a){return $a(wb(a))}function fb(a){this.value=a}function gb(a){this.value=a}function hb(a,b,c,d,e,f,g){this.year=a,this.month=b,this.day=c,this.hours=d,this.minutes=e,this.seconds=f,this.negative=g}function ib(a){return(a.year?a.year+"Y":"")+(a.month?a.month+"M":"")}function jb(a){return(a.day?a.day+"D":"")+(a.hours||a.minutes||a.seconds?"T"+(a.hours?a.hours+"H":"")+(a.minutes?a.minutes+"M":"")+(a.seconds?a.seconds+"S":""):"")}function kb(a){return zb(Bb(a))}function lb(a){this.value=a}function mb(a,b){this.day=a,this.timezone=b}function nb(a,b){this.month=a,this.timezone=b}function ob(a,b,c){this.month=a,this.day=b,this.timezone=c}function pb(a,b){this.year=a,this.timezone=b}function qb(a,b,c){this.year=a,this.month=b,this.timezone=c}function rb(a){this.value=a}function sb(){}function tb(a,b,c){this.prefix=a,this.localName=b,this.namespaceURI=c}function ub(a){this.value=a}function vb(a,b,c,d){this.hours=a,this.minutes=b,this.seconds=c,this.timezone=d}function wb(a){return(a.seconds>=60||a.seconds<0)&&(a.minutes+=~~(a.seconds/60)-(a.seconds<0&&a.seconds%60?1:0),a.seconds=a.seconds%60+(a.seconds<0&&a.seconds%60?60:0)),(a.minutes>=60||a.minutes<0)&&(a.hours+=~~(a.minutes/60)-(a.minutes<0&&a.minutes%60?1:0),a.minutes=a.minutes%60+(a.minutes<0&&a.minutes%60?60:0)),(a.hours>=24||a.hours<0)&&(a instanceof _a&&(a.day+=~~(a.hours/24)-(a.hours<0&&a.hours%24?1:0)),a.hours=a.hours%24+(a.hours<0&&a.hours%24?24:0)),a}function xb(a){this.value=a}function yb(a,b,c){hb.call(this,a,b,0,0,0,0,c)}function zb(a){return a.month>=12&&(a.year+=~~(a.month/12),a.month%=12),a}function Ab(a,b,c,d,e){hb.call(this,0,0,a,b,c,d,e)}function Bb(a){return a.seconds>=60&&(a.minutes+=~~(a.seconds/60),a.seconds%=60),a.minutes>=60&&(a.hours+=~~(a.minutes/60),a.minutes%=60),a.hours>=24&&(a.day+=~~(a.hours/24),a.hours%=24),a}function Cb(a){this.value=a}function Db(a){this.value=a}function Eb(a){this.value=a}function Fb(a){this.value=a}function Gb(a){this.value=a}function Hb(a){this.value=a}function Ib(a){this.value=a}function Jb(a){this.value=a}function Kb(a){this.value=a}function Lb(a){this.value=a}function Mb(a){this.value=a}function Nb(a){this.value=a}function Ob(a){this.value=a}function Pb(a){this.value=a}function Qb(a){this.value=a}function Rb(a){this.value=a}function Sb(a){this.value=a}function Tb(a){this.value=a}function Ub(a){this.value=a}function Vb(a){this.value=a}function Wb(a){this.value=a}function Xb(a){this.value=a}function Yb(){}function Zb(){}function $b(){}function _b(){}function ac(){}function bc(){}function cc(){}function dc(){}function ec(a,b,c){var d=nc(a),e=nc(b);return new Xa("lt"==c?de:d==e)}function fc(a,b,c){return gc(_a.cast(a),_a.cast(b),c)}function gc(a,b,c){var d=new Ab(0,0,0,0),e=tc(a,d).toString(),f=tc(b,d).toString();return new Xa("lt"==c?ef:e==f)}function hc(a,b,c){var d;a instanceof Ya?d=new Ya(a.year,a.month,a.day,a.timezone,a.negative):a instanceof _a&&(d=new _a(a.year,a.month,a.day,a.hours,a.minutes,a.seconds,a.timezone,a.negative)),d.year=d.year+b.year*("-"==c?-1:1),d.month=d.month+b.month*("-"==c?-1:1),$a(d,!0);var e=Za(d.year,d.month);return d.day>e&&(d.day=e),d}function ic(a,b,c){var d;if(a instanceof Ya){var e=60*(60*b.hours+b.minutes)+b.seconds;d=new Ya(a.year,a.month,a.day,a.timezone,a.negative),d.day=d.day+b.day*("-"==c?-1:1)-1*(e&&"-"==c),$a(d)}else a instanceof _a&&(d=new _a(a.year,a.month,a.day,a.hours,a.minutes,a.seconds,a.timezone,a.negative),d.seconds=d.seconds+b.seconds*("-"==c?-1:1),d.minutes=d.minutes+b.minutes*("-"==c?-1:1),d.hours=d.hours+b.hours*("-"==c?-1:1),d.day=d.day+b.day*("-"==c?-1:1),eb(d));return d}function jc(a){return(60*(60*(24*a.day+a.hours)+a.minutes)+a.seconds)*(a.negative?-1:1)}function kc(a){var b=(a=Gc.round(a))<0,c=~~((a=Gc.abs(a))/86400),d=~~((a-=3600*c*24)/3600),e=~~((a-=3600*d)/60),f=a-=60*e;return new Ab(c,d,e,f,b)}function lc(a){return(12*a.year+a.month)*(a.negative?-1:1)}function mc(a){var b=(a=Gc.round(a))<0,c=~~((a=Gc.abs(a))/12),d=a-=12*c;return new yb(c,d,b)}function nc(a){return a.seconds+60*(a.minutes-(null!=a.timezone?a.timezone%60:0)+60*(a.hours-(null!=a.timezone?~~(a.timezone/60):0)))}function oc(a){var b=new Ec((a.negative?-1:1)*a.year,a.month,a.day,0,0,0,0);return a instanceof _a&&(b.setHours(a.hours),b.setMinutes(a.minutes),b.setSeconds(a.seconds)),null!=a.timezone&&b.setMinutes(b.getMinutes()-a.timezone),b.getTime()/1e3}function pc(a,b){if(Ic(a)||Gc.abs(a)==Lc||Ic(b)||Gc.abs(b)==Lc)return 0;var c=Ac(a).match(jd),d=Ac(b).match(jd),e=Gc.max(1,(c[2]||c[3]||"").length+(c[5]||0)*("+"==c[4]?-1:1),(d[2]||d[3]||"").length+(d[5]||0)*("+"==d[4]?-1:1));return e+(e%2?0:1)}function qc(a,b,c){return new(a instanceof Cb&&b instanceof Cb&&c==Gc.round(c)?Cb:fb)(c)}function rc(a,b){if(null==a)return null;var c=a[b]*(a.negative?-1:1);return"seconds"==b?new fb(c):new Cb(c)}function sc(a,b){if(null==a)return null;if("timezone"==b){var c=a.timezone;return null==c?null:new Ab(0,Gc.abs(~~(c/60)),Gc.abs(c%60),0,c<0)}var d=a[b];return a instanceof Ya||"hours"==b&&24==d&&(d=0),a instanceof vb||(d*=a.negative?-1:1),"seconds"==b?new fb(d):new Cb(d)}function tc(a,b){if(null==a)return null;var c;if(c=a instanceof Ya?new Ya(a.year,a.month,a.day,a.timezone,a.negative):a instanceof vb?new vb(a.hours,a.minutes,a.seconds,a.timezone,a.negative):new _a(a.year,a.month,a.day,a.hours,a.minutes,a.seconds,a.timezone,a.negative),null==b)c.timezone=null;else{var d=jc(b)/60;if(null!=a.timezone){var e=d-a.timezone;a instanceof Ya?e<0&&c.day--:(c.minutes+=e%60,c.hours+=~~(e/60)),eb(c)}c.timezone=d}return c}function uc(b,c){if(!b.length)return!1;var d=b[0];if(c.DOMAdapter.isNode(d))return!0;if(1==b.length){if(d instanceof Xa)return d.value.valueOf();if(d instanceof ub)return!!d.valueOf().length;if(Ua(d))return!(Ic(d.valueOf())||0==d.valueOf());throw new a("FORG0006")}throw new a("FORG0006")}function vc(a,b){for(var c,d,e=[],f=0,g=a.length;f=0,j=c.indexOf("x")>=0;if(i||j){c=c.replace(/[sx]/g,"");for(var k,l=[],m=/\s/,n=0,o=b.length,p=!1,q="";n0},b.prototype.eof=function(){return this.index>=this.length},c.prototype.isNode=function(a){return a&&!!a.nodeType},c.prototype.getProperty=function(a,b){return a[b]},c.prototype.isSameNode=function(a,b){return a==b},c.prototype.compareDocumentPosition=function(a,b){return a.compareDocumentPosition(b)},c.prototype.lookupNamespaceURI=function(a,b){return a.lookupNamespaceURI(b)},c.prototype.getElementById=function(a,b){return a.getElementById(b)},c.prototype.getElementsByTagNameNS=function(a,b,c){return a.getElementsByTagNameNS(b,c)},d.prototype.item=null,d.prototype.position=0,d.prototype.size=0,d.prototype.scope=null,d.prototype.stack=null,d.prototype.dateTime=null,d.prototype.timezone=null,d.prototype.staticContext=null,d.prototype.pushVariable=function(a,b){this.stack.hasOwnProperty(a)||(this.stack[a]=[]),this.stack[a].push(this.scope[a]),this.scope[a]=b},d.prototype.popVariable=function(a){this.stack.hasOwnProperty(a)&&(this.scope[a]=this.stack[a].pop(),this.stack[a].length||(delete this.stack[a],"undefined"==typeof this.scope[a]&&delete this.scope[a]))},e.prototype.baseURI=null,e.prototype.dataTypes=null,e.prototype.documents=null,e.prototype.functions=null,e.prototype.defaultFunctionNamespace=null,e.prototype.collations=null,e.prototype.defaultCollationName=Sc+"/collation/codepoint",e.prototype.collections=null,e.prototype.namespaceResolver=null,e.prototype.defaultElementNamespace=null;var Wc=/^(?:\{([^\}]+)\})?(.+)$/;e.prototype.setDataType=function(a,b){var c=a.match(Wc);c&&c[1]!=Rc&&(this.dataTypes[a]=b)},e.prototype.getDataType=function(a){var b=a.match(Wc);if(b)return b[1]==Rc?Zc[b[2]]:this.dataTypes[a]},e.prototype.setDocument=function(a,b){this.documents[a]=b},e.prototype.getDocument=function(a){return this.documents[a]},e.prototype.setFunction=function(a,b){var c=a.match(Wc);c&&c[1]!=Sc&&(this.functions[a]=b)},e.prototype.getFunction=function(a){var b=a.match(Wc);if(b)return b[1]==Sc?Xc[b[2]]:this.functions[a]},e.prototype.setCollation=function(a,b){this.collations[a]=b},e.prototype.getCollation=function(a){return this.collations[a]},e.prototype.setCollection=function(a,b){this.collections[a]=b},e.prototype.getCollection=function(a){return this.collections[a]},e.prototype.getURIForPrefix=function(b){var c,d=this.namespaceResolver,e=d&&d.lookupNamespaceURI?d.lookupNamespaceURI:d;if(e instanceof Fc&&(c=e.call(d,b)))return c;if("fn"==b)return Sc;if("xs"==b)return Rc;if("xml"==b)return Uc;if("xmlns"==b)return Tc;throw new a("XPST0081")},e.js2xs=function(a){return a="boolean"==typeof a?new Xa(a):"number"==typeof a?Ic(a)||!Jc(a)?new gb(a):ja(Ac(a)):new ub(Ac(a))},e.xs2js=function(a){return a=a instanceof Xa?a.valueOf():Ua(a)?a.valueOf():a.toString()};var Xc={},Yc={},Zc={},$c={};h.prototype.internalExpression=null,h.prototype.evaluate=function(a){return this.internalExpression.evaluate(a)},i.prototype.equals=function(a,b){throw"Not implemented"},i.prototype.compare=function(a,b){throw"Not implemented"},j.ANYSIMPLETYPE_DT=1,j.STRING_DT=2,j.BOOLEAN_DT=3,j.DECIMAL_DT=4,j.FLOAT_DT=5,j.DOUBLE_DT=6,j.DURATION_DT=7,j.DATETIME_DT=8,j.TIME_DT=9,j.DATE_DT=10,j.GYEARMONTH_DT=11,j.GYEAR_DT=12,j.GMONTHDAY_DT=13,j.GDAY_DT=14,j.GMONTH_DT=15,j.HEXBINARY_DT=16,j.BASE64BINARY_DT=17,j.ANYURI_DT=18,j.QNAME_DT=19,j.NOTATION_DT=20,j.NORMALIZEDSTRING_DT=21,j.TOKEN_DT=22,j.LANGUAGE_DT=23,j.NMTOKEN_DT=24,j.NAME_DT=25,j.NCNAME_DT=26,j.ID_DT=27,j.IDREF_DT=28,j.ENTITY_DT=29,j.INTEGER_DT=30,j.NONPOSITIVEINTEGER_DT=31,j.NEGATIVEINTEGER_DT=32,j.LONG_DT=33,j.INT_DT=34,j.SHORT_DT=35,j.BYTE_DT=36,j.NONNEGATIVEINTEGER_DT=37,j.UNSIGNEDLONG_DT=38,j.UNSIGNEDINT_DT=39,j.UNSIGNEDSHORT_DT=40,j.UNSIGNEDBYTE_DT=41,j.POSITIVEINTEGER_DT=42,j.LISTOFUNION_DT=43,j.LIST_DT=44,j.UNAVAILABLE_DT=45,j.DATETIMESTAMP_DT=46,j.DAYMONTHDURATION_DT=47,j.DAYTIMEDURATION_DT=48,j.PRECISIONDECIMAL_DT=49,j.ANYATOMICTYPE_DT=50,j.ANYTYPE_DT=51,j.XT_YEARMONTHDURATION_DT=-1,j.XT_UNTYPEDATOMIC_DT=-2,k.prototype.items=null,k.prototype.evaluate=function(a){for(var b=[],c=0,d=this.items.length;c":"gt","<":"lt",">=":"ge","<=":"le"},ad={};ad.eq=function(b,c,d){var e="";if(Ua(b))Ua(c)&&(e="numeric-equal");else if(b instanceof Xa)c instanceof Xa&&(e="boolean-equal");else if(b instanceof ub){if(c instanceof ub)return $c["numeric-equal"].call(d,Xc.compare.call(d,b,c),new Cb(0))}else b instanceof Ya?c instanceof Ya&&(e="date-equal"):b instanceof vb?c instanceof vb&&(e="time-equal"):b instanceof _a?c instanceof _a&&(e="dateTime-equal"):b instanceof hb?c instanceof hb&&(e="duration-equal"):b instanceof qb?c instanceof qb&&(e="gYearMonth-equal"):b instanceof pb?c instanceof pb&&(e="gYear-equal"):b instanceof ob?c instanceof ob&&(e="gMonthDay-equal"):b instanceof nb?c instanceof nb&&(e="gMonth-equal"):b instanceof mb?c instanceof mb&&(e="gDay-equal"):b instanceof tb?c instanceof tb&&(e="QName-equal"):b instanceof rb?c instanceof rb&&(e="hexBinary-equal"):b instanceof Wa&&c instanceof Wa&&(e="base64Binary-equal");if(e)return $c[e].call(d,b,c);throw new a("XPTY0004")},ad.ne=function(a,b,c){return new Xa(!ad.eq(a,b,c).valueOf())},ad.gt=function(b,c,d){var e="";if(Ua(b))Ua(c)&&(e="numeric-greater-than");else if(b instanceof Xa)c instanceof Xa&&(e="boolean-greater-than");else if(b instanceof ub){if(c instanceof ub)return $c["numeric-greater-than"].call(d,Xc.compare.call(d,b,c),new Cb(0))}else b instanceof Ya?c instanceof Ya&&(e="date-greater-than"):b instanceof vb?c instanceof vb&&(e="time-greater-than"):b instanceof _a?c instanceof _a&&(e="dateTime-greater-than"):b instanceof yb?c instanceof yb&&(e="yearMonthDuration-greater-than"):b instanceof Ab&&c instanceof Ab&&(e="dayTimeDuration-greater-than"); if(e)return $c[e].call(d,b,c);throw new a("XPTY0004")},ad.lt=function(b,c,d){var e="";if(Ua(b))Ua(c)&&(e="numeric-less-than");else if(b instanceof Xa)c instanceof Xa&&(e="boolean-less-than");else if(b instanceof ub){if(c instanceof ub)return $c["numeric-less-than"].call(d,Xc.compare.call(d,b,c),new Cb(0))}else b instanceof Ya?c instanceof Ya&&(e="date-less-than"):b instanceof vb?c instanceof vb&&(e="time-less-than"):b instanceof _a?c instanceof _a&&(e="dateTime-less-than"):b instanceof yb?c instanceof yb&&(e="yearMonthDuration-less-than"):b instanceof Ab&&c instanceof Ab&&(e="dayTimeDuration-less-than");if(e)return $c[e].call(d,b,c);throw new a("XPTY0004")},ad.ge=function(b,c,d){var e="";if(Ua(b))Ua(c)&&(e="numeric-less-than");else if(b instanceof Xa)c instanceof Xa&&(e="boolean-less-than");else if(b instanceof ub){if(c instanceof ub)return $c["numeric-greater-than"].call(d,Xc.compare.call(d,b,c),new Cb(-1))}else b instanceof Ya?c instanceof Ya&&(e="date-less-than"):b instanceof vb?c instanceof vb&&(e="time-less-than"):b instanceof _a?c instanceof _a&&(e="dateTime-less-than"):b instanceof yb?c instanceof yb&&(e="yearMonthDuration-less-than"):b instanceof Ab&&c instanceof Ab&&(e="dayTimeDuration-less-than");if(e)return new Xa(!$c[e].call(d,b,c).valueOf());throw new a("XPTY0004")},ad.le=function(b,c,d){var e="";if(Ua(b))Ua(c)&&(e="numeric-greater-than");else if(b instanceof Xa)c instanceof Xa&&(e="boolean-greater-than");else if(b instanceof ub){if(c instanceof ub)return $c["numeric-less-than"].call(d,Xc.compare.call(d,b,c),new Cb(1))}else b instanceof Ya?c instanceof Ya&&(e="date-greater-than"):b instanceof vb?c instanceof vb&&(e="time-greater-than"):b instanceof _a?c instanceof _a&&(e="dateTime-greater-than"):b instanceof yb?c instanceof yb&&(e="yearMonthDuration-greater-than"):b instanceof Ab&&c instanceof Ab&&(e="dayTimeDuration-greater-than");if(e)return new Xa(!$c[e].call(d,b,c).valueOf());throw new a("XPTY0004")};var bd={};bd.is=function(a,b,c){return $c["is-same-node"].call(c,a,b)},bd[">>"]=function(a,b,c){return $c["node-after"].call(c,a,b)},bd["<<"]=function(a,b,c){return $c["node-before"].call(c,a,b)};var cd={"=":z,"!=":z,"<":z,"<=":z,">":z,">=":z,eq:A,ne:A,lt:A,le:A,gt:A,ge:A,is:B,">>":B,"<<":B};C.prototype.left=null,C.prototype.items=null;var dd={};dd["+"]=function(b,c,d){var e="",f=!1;if(Ua(b)?Ua(c)&&(e="numeric-add"):b instanceof Ya?c instanceof yb?e="add-yearMonthDuration-to-date":c instanceof Ab&&(e="add-dayTimeDuration-to-date"):b instanceof yb?c instanceof Ya?(e="add-yearMonthDuration-to-date",f=!0):c instanceof _a?(e="add-yearMonthDuration-to-dateTime",f=!0):c instanceof yb&&(e="add-yearMonthDurations"):b instanceof Ab?c instanceof Ya?(e="add-dayTimeDuration-to-date",f=!0):c instanceof vb?(e="add-dayTimeDuration-to-time",f=!0):c instanceof _a?(e="add-dayTimeDuration-to-dateTime",f=!0):c instanceof Ab&&(e="add-dayTimeDurations"):b instanceof vb?c instanceof Ab&&(e="add-dayTimeDuration-to-time"):b instanceof _a&&(c instanceof yb?e="add-yearMonthDuration-to-dateTime":c instanceof Ab&&(e="add-dayTimeDuration-to-dateTime")),e)return $c[e].call(d,f?c:b,f?b:c);throw new a("XPTY0004")},dd["-"]=function(b,c,d){var e="";if(Ua(b)?Ua(c)&&(e="numeric-subtract"):b instanceof Ya?c instanceof Ya?e="subtract-dates":c instanceof yb?e="subtract-yearMonthDuration-from-date":c instanceof Ab&&(e="subtract-dayTimeDuration-from-date"):b instanceof vb?c instanceof vb?e="subtract-times":c instanceof Ab&&(e="subtract-dayTimeDuration-from-time"):b instanceof _a?c instanceof _a?e="subtract-dateTimes":c instanceof yb?e="subtract-yearMonthDuration-from-dateTime":c instanceof Ab&&(e="subtract-dayTimeDuration-from-dateTime"):b instanceof yb?c instanceof yb&&(e="subtract-yearMonthDurations"):b instanceof Ab&&c instanceof Ab&&(e="subtract-dayTimeDurations"),e)return $c[e].call(d,b,c);throw new a("XPTY0004")},C.prototype.evaluate=function(a){var b=vc(this.left.evaluate(a),a);if(!b.length)return[];ua(a,b,"?");var c=b[0];c instanceof xb&&(c=gb.cast(c));for(var d,e,f=0,g=this.items.length;f1)return[new Xa(!1)];if(!c.length)return[new Xa("?"==e)];try{d.cast(vc(c,b)[0])}catch(b){if("XPST0051"==b.code)throw b;if("XPST0017"==b.code)throw new a("XPST0080");return[new Xa(!1)]}return[new Xa(!0)]},Ha.prototype.expression=null,Ha.prototype.type=null,Ha.prototype.evaluate=function(a){var b=this.expression.evaluate(a);return ua(a,b,this.type.occurence),b.length?[this.type.itemType.cast(vc(b,a)[0],a)]:[]},Ja.prototype.prefix=null,Ja.prototype.localName=null,Ja.prototype.namespaceURI=null,Ja.prototype.test=function(b,c){var d=(this.namespaceURI?"{"+this.namespaceURI+"}":"")+this.localName,e=this.namespaceURI==Rc?Zc[this.localName]:c.staticContext.getDataType(d);if(e)return b instanceof e;throw new a("XPST0051")},Ja.prototype.cast=function(b,c){var d=(this.namespaceURI?"{"+this.namespaceURI+"}":"")+this.localName,e=this.namespaceURI==Rc?Zc[this.localName]:c.staticContext.getDataType(d);if(e)return e.cast(b);throw new a("XPST0051")},La.prototype.test=null,Na.prototype.itemType=null,Na.prototype.occurence=null,Pa.prototype.itemType=null,Pa.prototype.occurence=null,Ra.prototype.builtInKind=j.ANYTYPE_DT,Sa.prototype=new Ra,Sa.prototype.builtInKind=j.ANYSIMPLETYPE_DT,Sa.prototype.primitiveKind=null,Sa.PRIMITIVE_ANYURI="anyURI",Sa.PRIMITIVE_BASE64BINARY="base64Binary",Sa.PRIMITIVE_BOOLEAN="boolean",Sa.PRIMITIVE_DATE="date",Sa.PRIMITIVE_DATETIME="dateTime",Sa.PRIMITIVE_DECIMAL="decimal",Sa.PRIMITIVE_DOUBLE="double",Sa.PRIMITIVE_DURATION="duration",Sa.PRIMITIVE_FLOAT="float",Sa.PRIMITIVE_GDAY="gDay",Sa.PRIMITIVE_GMONTH="gMonth",Sa.PRIMITIVE_GMONTHDAY="gMonthDay",Sa.PRIMITIVE_GYEAR="gYear",Sa.PRIMITIVE_GYEARMONTH="gYearMonth",Sa.PRIMITIVE_HEXBINARY="hexBinary",Sa.PRIMITIVE_NOTATION="NOTATION",Sa.PRIMITIVE_QNAME="QName",Sa.PRIMITIVE_STRING="string",Sa.PRIMITIVE_TIME="time",Ta.prototype=new Sa,Ta.prototype.builtInKind=j.ANYATOMICTYPE_DT,Ta.cast=function(b){throw new a("XPST0017")},g("anyAtomicType",Ta),Va.prototype=new Ta,Va.prototype.builtInKind=j.ANYURI_DT,Va.prototype.primitiveKind=Sa.PRIMITIVE_ANYURI,Va.prototype.scheme=null,Va.prototype.authority=null,Va.prototype.path=null,Va.prototype.query=null,Va.prototype.fragment=null,Va.prototype.toString=function(){return(this.scheme?this.scheme+":":"")+(this.authority?"//"+this.authority:"")+(this.path?this.path:"")+(this.query?"?"+this.query:"")+(this.fragment?"#"+this.fragment:"")};var ld=/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;Va.cast=function(b){if(b instanceof Va)return b;if(b instanceof ub||b instanceof xb){var c;if(c=Pc(b).match(ld))return new Va(c[2],c[4],c[5],c[7],c[9]);throw new a("FORG0001")}throw new a("XPTY0004")},g("anyURI",Va),Wa.prototype=new Ta,Wa.prototype.builtInKind=j.BASE64BINARY_DT,Wa.prototype.primitiveKind=Sa.PRIMITIVE_BASE64BINARY,Wa.prototype.value=null,Wa.prototype.valueOf=function(){return this.value},Wa.prototype.toString=function(){return this.value};var md=/^((([A-Za-z0-9+\/]\s*){4})*(([A-Za-z0-9+\/]\s*){3}[A-Za-z0-9+\/]|([A-Za-z0-9+\/]\s*){2}[AEIMQUYcgkosw048]\s*=|[A-Za-z0-9+\/]\s*[AQgw]\s*=\s*=))?$/;Wa.cast=function(b){if(b instanceof Wa)return b;if(b instanceof ub||b instanceof xb){var c=Pc(b).match(md);if(c)return new Wa(c[0]);throw new a("FORG0001")}if(b instanceof rb){for(var c=b.valueOf().match(/.{2}/g),d=[],e=0,f=c.length;e=-0x8000000000000000)return new Fb(c.value);throw new a("FORG0001")},g("long",Fb),Gb.prototype=new Fb,Gb.prototype.builtInKind=j.INT_DT,Gb.cast=function(b){var c;try{c=Cb.cast(b)}catch(a){throw a}if(c.value<=2147483647&&c.value>=-2147483648)return new Gb(c.value);throw new a("FORG0001")},g("int",Gb),Hb.prototype=new Gb,Hb.prototype.builtInKind=j.SHORT_DT,Hb.cast=function(b){var c;try{c=Cb.cast(b)}catch(a){throw a}if(c.value<=32767&&c.value>=-32768)return new Hb(c.value);throw new a("FORG0001")},g("short",Hb),Ib.prototype=new Hb,Ib.prototype.builtInKind=j.BYTE_DT,Ib.cast=function(b){var c;try{c=Cb.cast(b)}catch(a){throw a}if(c.value<=127&&c.value>=-128)return new Ib(c.value);throw new a("FORG0001")},g("byte",Ib),Jb.prototype=new Cb,Jb.prototype.builtInKind=j.NONNEGATIVEINTEGER_DT,Jb.cast=function(b){var c;try{c=Cb.cast(b)}catch(a){throw a}if(c.value>=0)return new Jb(c.value);throw new a("FORG0001")},g("nonNegativeInteger",Jb),Kb.prototype=new Jb,Kb.prototype.builtInKind=j.POSITIVEINTEGER_DT,Kb.cast=function(b){var c;try{c=Cb.cast(b)}catch(a){throw a}if(c.value>=1)return new Kb(c.value);throw new a("FORG0001")},g("positiveInteger",Kb),Lb.prototype=new Jb,Lb.prototype.builtInKind=j.UNSIGNEDLONG_DT,Lb.cast=function(b){var c;try{c=Cb.cast(b)}catch(a){throw a}if(c.value>=1&&c.value<=0x10000000000000000)return new Lb(c.value);throw new a("FORG0001")},g("unsignedLong",Lb),Mb.prototype=new Jb,Mb.prototype.builtInKind=j.UNSIGNEDINT_DT,Mb.cast=function(b){var c;try{c=Cb.cast(b)}catch(a){throw a}if(c.value>=1&&c.value<=4294967295)return new Mb(c.value);throw new a("FORG0001")},g("unsignedInt",Mb),Nb.prototype=new Mb,Nb.prototype.builtInKind=j.UNSIGNEDSHORT_DT,Nb.cast=function(b){var c;try{c=Cb.cast(b)}catch(a){throw a}if(c.value>=1&&c.value<=65535)return new Nb(c.value);throw new a("FORG0001")},g("unsignedShort",Nb),Ob.prototype=new Nb,Ob.prototype.builtInKind=j.UNSIGNEDBYTE_DT, Ob.cast=function(b){var c;try{c=Cb.cast(b)}catch(a){throw a}if(c.value>=1&&c.value<=255)return new Ob(c.value);throw new a("FORG0001")},g("unsignedByte",Ob),Pb.prototype=new ub,Pb.prototype.builtInKind=j.NORMALIZEDSTRING_DT,Pb.cast=function(a){return new Pb(Ac(a))},g("normalizedString",Pb),Qb.prototype=new Pb,Qb.prototype.builtInKind=j.TOKEN_DT,Qb.cast=function(a){return new Qb(Ac(a))},g("token",Qb),Rb.prototype=new Qb,Rb.prototype.builtInKind=j.NAME_DT,Rb.cast=function(a){return new Rb(Ac(a))},g("Name",Rb),Sb.prototype=new Rb,Sb.prototype.builtInKind=j.NCNAME_DT,Sb.cast=function(a){return new Sb(Ac(a))},g("NCName",Sb),Tb.prototype=new Sb,Tb.prototype.builtInKind=j.ENTITY_DT,Tb.cast=function(a){return new Tb(Ac(a))},g("ENTITY",Tb),Ub.prototype=new Sb,Ub.prototype.builtInKind=j.ID_DT,Ub.cast=function(a){return new Ub(Ac(a))},g("ID",Ub),Vb.prototype=new Sb,Vb.prototype.builtInKind=j.IDREF_DT,Vb.cast=function(a){return new Vb(Ac(a))},g("IDREF",Vb),Wb.prototype=new Qb,Wb.prototype.builtInKind=j.LANGUAGE_DT,Wb.cast=function(a){return new Wb(Ac(a))},g("language",Wb),Xb.prototype=new Qb,Xb.prototype.builtInKind=j.NMTOKEN_DT,Xb.cast=function(a){return new Xb(Ac(a))},g("NMTOKEN",Xb),Zb.prototype=new Yb,$b.prototype=new Zb,_b.prototype=new Zb,ac.prototype=new Zb,bc.prototype=new Zb,cc.prototype=new Zb,dc.prototype=new Zb,$c["hexBinary-equal"]=function(a,b){return new Xa(a.valueOf()==b.valueOf())},$c["base64Binary-equal"]=function(a,b){return new Xa(a.valueOf()==b.valueOf())},$c["boolean-equal"]=function(a,b){return new Xa(a.valueOf()==b.valueOf())},$c["boolean-less-than"]=function(a,b){return new Xa(a.valueOf()b.valueOf())},$c["yearMonthDuration-less-than"]=function(a,b){return new Xa(lc(a)lc(b))},$c["dayTimeDuration-less-than"]=function(a,b){return new Xa(jc(a)jc(b))},$c["duration-equal"]=function(a,b){return new Xa(a.negative==b.negative&&lc(a)==lc(b)&&jc(a)==jc(b))},$c["dateTime-equal"]=function(a,b){return gc(a,b,"eq")},$c["dateTime-less-than"]=function(a,b){return gc(a,b,"lt")},$c["dateTime-greater-than"]=function(a,b){return gc(a,b,"gt")},$c["date-equal"]=function(a,b){return fc(a,b,"eq")},$c["date-less-than"]=function(a,b){return fc(a,b,"lt")},$c["date-greater-than"]=function(a,b){return fc(a,b,"gt")},$c["time-equal"]=function(a,b){return ec(a,b,"eq")},$c["time-less-than"]=function(a,b){return ec(a,b,"lt")},$c["time-greater-than"]=function(a,b){return ec(a,b,"gt")},$c["gYearMonth-equal"]=function(a,b){return gc(new _a(a.year,a.month,Za(a.year,a.month),0,0,0,null==a.timezone?this.timezone:a.timezone),new _a(b.year,b.month,Za(b.year,b.month),0,0,0,null==b.timezone?this.timezone:b.timezone),"eq")},$c["gYear-equal"]=function(a,b){return gc(new _a(a.year,1,1,0,0,0,null==a.timezone?this.timezone:a.timezone),new _a(b.year,1,1,0,0,0,null==b.timezone?this.timezone:b.timezone),"eq")},$c["gMonthDay-equal"]=function(a,b){return gc(new _a(1972,a.month,a.day,0,0,0,null==a.timezone?this.timezone:a.timezone),new _a(1972,b.month,b.day,0,0,0,null==b.timezone?this.timezone:b.timezone),"eq")},$c["gMonth-equal"]=function(a,b){return gc(new _a(1972,a.month,Za(1972,b.month),0,0,0,null==a.timezone?this.timezone:a.timezone),new _a(1972,b.month,Za(1972,b.month),0,0,0,null==b.timezone?this.timezone:b.timezone),"eq")},$c["gDay-equal"]=function(a,b){return gc(new _a(1972,12,a.day,0,0,0,null==a.timezone?this.timezone:a.timezone),new _a(1972,12,b.day,0,0,0,null==b.timezone?this.timezone:b.timezone),"eq")},$c["add-yearMonthDurations"]=function(a,b){return mc(lc(a)+lc(b))},$c["subtract-yearMonthDurations"]=function(a,b){return mc(lc(a)-lc(b))},$c["multiply-yearMonthDuration"]=function(a,b){return mc(lc(a)*b)},$c["divide-yearMonthDuration"]=function(a,b){return mc(lc(a)/b)},$c["divide-yearMonthDuration-by-yearMonthDuration"]=function(a,b){return new fb(lc(a)/lc(b))},$c["add-dayTimeDurations"]=function(a,b){return kc(jc(a)+jc(b))},$c["subtract-dayTimeDurations"]=function(a,b){return kc(jc(a)-jc(b))},$c["multiply-dayTimeDuration"]=function(a,b){return kc(jc(a)*b)},$c["divide-dayTimeDuration"]=function(a,b){return kc(jc(a)/b)},$c["divide-dayTimeDuration-by-dayTimeDuration"]=function(a,b){return new fb(jc(a)/jc(b))},$c["subtract-dateTimes"]=function(a,b){return kc(oc(a)-oc(b))},$c["subtract-dates"]=function(a,b){return kc(oc(a)-oc(b))},$c["subtract-times"]=function(a,b){return kc(nc(a)-nc(b))},$c["add-yearMonthDuration-to-dateTime"]=function(a,b){return hc(a,b,"+")},$c["add-dayTimeDuration-to-dateTime"]=function(a,b){return ic(a,b,"+")},$c["subtract-yearMonthDuration-from-dateTime"]=function(a,b){return hc(a,b,"-")},$c["subtract-dayTimeDuration-from-dateTime"]=function(a,b){return ic(a,b,"-")},$c["add-yearMonthDuration-to-date"]=function(a,b){return hc(a,b,"+")},$c["add-dayTimeDuration-to-date"]=function(a,b){return ic(a,b,"+")},$c["subtract-yearMonthDuration-from-date"]=function(a,b){return hc(a,b,"-")},$c["subtract-dayTimeDuration-from-date"]=function(a,b){return ic(a,b,"-")},$c["add-dayTimeDuration-to-time"]=function(a,b){var c=new vb(a.hours,a.minutes,a.seconds,a.timezone);return c.hours+=b.hours,c.minutes+=b.minutes,c.seconds+=b.seconds,wb(c)},$c["subtract-dayTimeDuration-from-time"]=function(a,b){var c=new vb(a.hours,a.minutes,a.seconds,a.timezone);return c.hours-=b.hours,c.minutes-=b.minutes,c.seconds-=b.seconds,wb(c)},$c["is-same-node"]=function(a,b){return new Xa(this.DOMAdapter.isSameNode(a,b))},$c["node-before"]=function(a,b){return new Xa(!!(4&this.DOMAdapter.compareDocumentPosition(a,b)))},$c["node-after"]=function(a,b){return new Xa(!!(2&this.DOMAdapter.compareDocumentPosition(a,b)))},$c["numeric-add"]=function(a,b){var c=a.valueOf(),d=b.valueOf(),e=Gc.pow(10,pc(c,d));return qc(a,b,(c*e+d*e)/e)},$c["numeric-subtract"]=function(a,b){var c=a.valueOf(),d=b.valueOf(),e=Gc.pow(10,pc(c,d));return qc(a,b,(c*e-d*e)/e)},$c["numeric-multiply"]=function(a,b){var c=a.valueOf(),d=b.valueOf(),e=Gc.pow(10,pc(c,d));return qc(a,b,c*e*(d*e)/(e*e))},$c["numeric-divide"]=function(a,b){var c=a.valueOf(),d=b.valueOf(),e=Gc.pow(10,pc(c,d));return qc(a,b,a*e/(b*e))},$c["numeric-integer-divide"]=function(a,b){var c=a/b;return new Cb(Gc.floor(c)+(c<0))},$c["numeric-mod"]=function(a,b){var c=a.valueOf(),d=b.valueOf(),e=Gc.pow(10,pc(c,d));return qc(a,b,c*e%(d*e)/e)},$c["numeric-unary-plus"]=function(a){return a},$c["numeric-unary-minus"]=function(a){return a.value*=-1,a},$c["numeric-equal"]=function(a,b){return new Xa(a.valueOf()==b.valueOf())},$c["numeric-less-than"]=function(a,b){return new Xa(a.valueOf()b.valueOf())},$c["QName-equal"]=function(a,b){return new Xa(a.localName==b.localName&&a.namespaceURI==b.namespaceURI)},$c.concatenate=function(a,b){return a.concat(b)},$c.union=function(b,c){for(var d,e=[],f=0,g=b.length;fh?g.pop():(g.push(f[i]),h++):"."!=f[i]&&g.push(f[i]);".."!=f[--i]&&"."!=f[i]||g.push(""),d.path=g.join("/")}return d}),f("true",[],function(){return new Xa(!0)}),f("false",[],function(){return new Xa(!1)}),f("not",[[Yb,"*"]],function(a){return new Xa(!uc(a,this))}),f("position",[],function(){return new Cb(this.position)}),f("last",[],function(){return new Cb(this.size)}),f("current-dateTime",[],function(){return this.dateTime}),f("current-date",[],function(){return Ya.cast(this.dateTime)}),f("current-time",[],function(){return vb.cast(this.dateTime)}),f("implicit-timezone",[],function(){return this.timezone}),f("default-collation",[],function(){return new ub(this.staticContext.defaultCollationName)}),f("static-base-uri",[],function(){return Va.cast(new ub(this.staticContext.baseURI||""))}),f("years-from-duration",[[hb,"?"]],function(a){return rc(a,"year")}),f("months-from-duration",[[hb,"?"]],function(a){return rc(a,"month")}),f("days-from-duration",[[hb,"?"]],function(a){return rc(a,"day")}),f("hours-from-duration",[[hb,"?"]],function(a){return rc(a,"hours")}),f("minutes-from-duration",[[hb,"?"]],function(a){return rc(a,"minutes")}),f("seconds-from-duration",[[hb,"?"]],function(a){return rc(a,"seconds")}),f("year-from-dateTime",[[_a,"?"]],function(a){return sc(a,"year")}),f("month-from-dateTime",[[_a,"?"]],function(a){return sc(a,"month")}),f("day-from-dateTime",[[_a,"?"]],function(a){return sc(a,"day")}),f("hours-from-dateTime",[[_a,"?"]],function(a){return sc(a,"hours")}),f("minutes-from-dateTime",[[_a,"?"]],function(a){return sc(a,"minutes")}),f("seconds-from-dateTime",[[_a,"?"]],function(a){return sc(a,"seconds")}),f("timezone-from-dateTime",[[_a,"?"]],function(a){return sc(a,"timezone")}),f("year-from-date",[[Ya,"?"]],function(a){return sc(a,"year")}),f("month-from-date",[[Ya,"?"]],function(a){return sc(a,"month")}),f("day-from-date",[[Ya,"?"]],function(a){return sc(a,"day")}),f("timezone-from-date",[[Ya,"?"]],function(a){return sc(a,"timezone")}),f("hours-from-time",[[vb,"?"]],function(a){return sc(a,"hours")}),f("minutes-from-time",[[vb,"?"]],function(a){return sc(a,"minutes")}),f("seconds-from-time",[[vb,"?"]],function(a){return sc(a,"seconds")}),f("timezone-from-time",[[vb,"?"]],function(a){return sc(a,"timezone")}),f("adjust-dateTime-to-timezone",[[_a,"?"],[Ab,"?",!0]],function(a,b){return tc(a,arguments.length>1&&null!=b?arguments.length>1?b:this.timezone:null)});f("adjust-date-to-timezone",[[Ya,"?"],[Ab,"?",!0]],function(a,b){return tc(a,arguments.length>1&&null!=b?arguments.length>1?b:this.timezone:null)});f("adjust-time-to-timezone",[[vb,"?"],[Ab,"?",!0]],function(a,b){return tc(a,arguments.length>1&&null!=b?arguments.length>1?b:this.timezone:null)}),f("name",[[Zb,"?",!0]],function(b){if(arguments.length){if(null==b)return new ub("")}else{if(!this.DOMAdapter.isNode(this.item))throw new a("XPTY0004");b=this.item}var c=Xc["node-name"].call(this,b);return new ub(null==c?"":c.toString())}),f("local-name",[[Zb,"?",!0]],function(b){if(arguments.length){if(null==b)return new ub("")}else{if(!this.DOMAdapter.isNode(this.item))throw new a("XPTY0004");b=this.item}return new ub(this.DOMAdapter.getProperty(b,"localName")||"")}),f("namespace-uri",[[Zb,"?",!0]],function(b){if(arguments.length){if(null==b)return Va.cast(new ub(""))}else{if(!this.DOMAdapter.isNode(this.item))throw new a("XPTY0004");b=this.item}return Va.cast(new ub(this.DOMAdapter.getProperty(b,"namespaceURI")||""))}),f("number",[[Ta,"?",!0]],function(b){if(!arguments.length){if(!this.item)throw new a("XPDY0002");b=vc([this.item],this)[0]}var c=new gb(Kc);if(null!=b)try{c=gb.cast(b)}catch(a){}return c}),f("lang",[[ub,"?"],[Zb,"",!0]],function(b,c){if(arguments.length<2){if(!this.DOMAdapter.isNode(this.item))throw new a("XPTY0004");c=this.item}var d=this.DOMAdapter.getProperty;2==d(c,"nodeType")&&(c=d(c,"ownerElement"));for(var e;c;c=d(c,"parentNode"))if(e=d(c,"attributes"))for(var f=0,g=e.length;f1?b.valueOf():0;if(c<0){var d=new Cb(Gc.pow(10,-c)),e=Gc.round($c["numeric-divide"].call(this,a,d)),f=new Cb(e);return nDecimal=Gc.abs($c["numeric-subtract"].call(this,f,$c["numeric-divide"].call(this,a,d))),$c["numeric-multiply"].call(this,$c["numeric-add"].call(this,f,new fb(.5==nDecimal&&e%2?-1:0)),d)}var d=new Cb(Gc.pow(10,c)),e=Gc.round($c["numeric-multiply"].call(this,a,d)),f=new Cb(e);return nDecimal=Gc.abs($c["numeric-subtract"].call(this,f,$c["numeric-multiply"].call(this,a,d))),$c["numeric-divide"].call(this,$c["numeric-add"].call(this,f,new fb(.5==nDecimal&&e%2?-1:0)),d)}),f("resolve-QName",[[ub,"?"],[bc]],function(b,c){if(null==b)return null;var d=b.valueOf(),e=d.match(Bd);if(!e)throw new a("FOCA0002");var f=e[1]||null,g=e[2],h=this.DOMAdapter.lookupNamespaceURI(c,f);if(null!=f&&!h)throw new a("FONS0004");return new tb(f,g,h||null)}),f("QName",[[ub,"?"],[ub]],function(b,c){var d=c.valueOf(),e=d.match(Bd);if(!e)throw new a("FOCA0002");return new tb(e[1]||null,e[2]||null,null==b?"":b.valueOf())}),f("prefix-from-QName",[[tb,"?"]],function(a){return null!=a&&a.prefix?new Sb(a.prefix):null}),f("local-name-from-QName",[[tb,"?"]],function(a){return null==a?null:new Sb(a.localName)}),f("namespace-uri-from-QName",[[tb,"?"]],function(a){return null==a?null:Va.cast(new ub(a.namespaceURI||""))}),f("namespace-uri-for-prefix",[[ub,"?"],[bc]],function(a,b){var c=null==a?"":a.valueOf(),d=this.DOMAdapter.lookupNamespaceURI(b,c||null);return null==d?null:Va.cast(new ub(d))}),f("in-scope-prefixes",[[bc]],function(a){throw"Function 'in-scope-prefixes' not implemented"}),f("boolean",[[Yb,"*"]],function(a){return new Xa(uc(a,this))}),f("index-of",[[Ta,"*"],[Ta],[ub,"",!0]],function(a,b,c){if(!a.length||null==b)return[];var d=b;d instanceof xb&&(d=ub.cast(d));for(var e,f=[],g=0,h=a.length;g1)throw"Collation parameter in function 'distinct-values' is not implemented";if(!a.length)return null;for(var c,d=[],e=0,f=a.length;ed&&(e=d+1);for(var f=[],g=0;gc)return a;for(var e=[],f=0;f2?Gc.round(c):a.length-d+1;return a.slice(d-1,d-1+e)}),f("unordered",[[Yb,"*"]],function(a){return a}),f("zero-or-one",[[Yb,"*"]],function(b){if(b.length>1)throw new a("FORG0003");return b}),f("one-or-more",[[Yb,"*"]],function(b){if(!b.length)throw new a("FORG0004");return b}),f("exactly-one",[[Yb,"*"]],function(b){if(1!=b.length)throw new a("FORG0005");return b}),f("deep-equal",[[Yb,"*"],[Yb,"*"],[ub,"",!0]],function(a,b,c){throw"Function 'deep-equal' not implemented"}),f("count",[[Yb,"*"]],function(a){return new Cb(a.length)}),f("avg",[[Ta,"*"]],function(b){if(!b.length)return null;try{var c=b[0];c instanceof xb&&(c=gb.cast(c));for(var d,e=1,f=b.length;e1?c:new gb(0);try{var d=b[0];d instanceof xb&&(d=gb.cast(d));for(var e,f=1,g=b.length;f2&&(f=d.valueOf()),e=f==Sc+"/collation/codepoint"?Gd:this.staticContext.getCollation(f),!e)throw new a("FOCH0002");return new Cb(e.compare(b.valueOf(),c.valueOf()))}),f("codepoint-equal",[[ub,"?"],[ub,"?"]],function(a,b){return null==a||null==b?null:new Xa(a.valueOf()==b.valueOf())}),f("concat",null,function(){if(arguments.length<2)throw new a("XPST0017");for(var b,c=[],d=0,e=arguments.length;d2?e+Gc.round(c):d.length;return new ub(f>e?d.substring(e,f):"")}),f("string-length",[[ub,"?",!0]],function(b){if(!arguments.length){if(!this.item)throw new a("XPDY0002");b=ub.cast(vc([this.item],this)[0])}return new Cb(null==b?0:b.valueOf().length)}),f("normalize-space",[[ub,"?",!0]],function(b){if(!arguments.length){if(!this.item)throw new a("XPDY0002");b=ub.cast(vc([this.item],this)[0])}return new ub(null==b?"":Pc(b).replace(/\s\s+/g," "))}),f("normalize-unicode",[[ub,"?"],[ub,"",!0]],function(a,b){throw"Function 'normalize-unicode' not implemented"}),f("upper-case",[[ub,"?"]],function(a){return new ub(null==a?"":a.valueOf().toUpperCase())}),f("lower-case",[[ub,"?"]],function(a){return new ub(null==a?"":a.valueOf().toLowerCase())}),f("translate",[[ub,"?"],[ub],[ub]],function(a,b,c){if(null==a)return new ub("");for(var d,e=a.valueOf().split(""),f=b.valueOf().split(""),g=c.valueOf().split(""),h=g.length,i=[],j=0,k=e.length;j126)&&(c[d]=window.encodeURIComponent(c[d]));return new ub(c.join(""))}),f("contains",[[ub,"?"],[ub,"?"],[ub,"",!0]],function(a,b,c){if(arguments.length>2)throw"Collation parameter in function 'contains' is not implemented";return new Xa((null==a?"":a.valueOf()).indexOf(null==b?"":b.valueOf())>=0)}),f("starts-with",[[ub,"?"],[ub,"?"],[ub,"",!0]],function(a,b,c){if(arguments.length>2)throw"Collation parameter in function 'starts-with' is not implemented";return new Xa(0==(null==a?"":a.valueOf()).indexOf(null==b?"":b.valueOf()))}),f("ends-with",[[ub,"?"],[ub,"?"],[ub,"",!0]],function(a,b,c){if(arguments.length>2)throw"Collation parameter in function 'ends-with' is not implemented";var d=null==a?"":a.valueOf(),e=null==b?"":b.valueOf();return new Xa(d.indexOf(e)==d.length-e.length)}),f("substring-before",[[ub,"?"],[ub,"?"],[ub,"",!0]],function(a,b,c){if(arguments.length>2)throw"Collation parameter in function 'substring-before' is not implemented";var d,e=null==a?"":a.valueOf(),f=null==b?"":b.valueOf();return new ub((d=e.indexOf(f))>=0?e.substring(0,d):"")}),f("substring-after",[[ub,"?"],[ub,"?"],[ub,"",!0]],function(a,b,c){if(arguments.length>2)throw"Collation parameter in function 'substring-after' is not implemented";var d,e=null==a?"":a.valueOf(),f=null==b?"":b.valueOf();return new ub((d=e.indexOf(f))>=0?e.substring(d+f.length):"")}),f("matches",[[ub,"?"],[ub],[ub,"",!0]],function(a,b,c){var d=null==a?"":a.valueOf(),e=xc(b.valueOf(),arguments.length>2?c.valueOf():"");return new Xa(e.test(d))}),f("replace",[[ub,"?"],[ub],[ub],[ub,"",!0]],function(a,b,c,d){var e=null==a?"":a.valueOf(),f=xc(b.valueOf(),arguments.length>3?d.valueOf():"");return new Xa(e.replace(f,c.valueOf()))}),f("tokenize",[[ub,"?"],[ub],[ub,"",!0]],function(a,b,c){for(var d=null==a?"":a.valueOf(),e=xc(b.valueOf(),arguments.length>2?c.valueOf():""),f=[],g=0,h=d.split(e),i=h.length;gb?1:-1},yc.prototype=new c;var Hd=new e;yc.prototype.getProperty=function(a,b){if(b in a)return a[b];if("baseURI"==b){for(var c,d="",e=Hd.getFunction("{http://www.w3.org/2005/xpath-functions}resolve-uri"),f=Hd.getDataType("{http://www.w3.org/2001/XMLSchema}string"),g=a;g;g=g.parentNode)1==g.nodeType&&(c=g.getAttribute("xml:base"))&&(d=e(new f(c),new f(d)).toString());return d}if("textContent"==b){var h=[];return function(a){for(var b,c=0;b=a.childNodes[c];c++)3==b.nodeType||4==b.nodeType?h.push(b.data):1==b.nodeType&&b.firstChild&&arguments.callee(b)}(a),h.join("")}},yc.prototype.compareDocumentPosition=function(a,b){if("compareDocumentPosition"in a)return a.compareDocumentPosition(b);if(b==a)return 0;var c,d,e,f,g,h=null,i=null;if(2==a.nodeType&&(h=a,a=this.getProperty(h,"ownerElement")),2==b.nodeType&&(i=b,b=this.getProperty(i,"ownerElement")),h&&i&&a&&a==b)for(f=0,c=this.getProperty(a,"attributes"),g=c.length;fMath.round(a.width/50))&&(e=Math.round(a.width/50)),(!f||f>Math.round(a.width/50))&&(f=Math.round(a.height/50));var h=a.getContext("2d"),i=.08*a.width,j=.03*a.width,k=.08*a.height,l=.15*a.height,m=a.height-k-l,n=a.width-i-j,o=k+m,p=k;h.font=g+"px Arial",h.lineWidth="1.0",h.strokeStyle="#444",CanvasComponents.draw_line(h,i,o,n+i,o),CanvasComponents.draw_line(h,i,o,i,p);var q=.003*n,r=(n-q*b.length)/b.length,s=i+q,t=Math.max.apply(Math,b);h.fillStyle="green";for(var u=0;u=b.length)for(var u=0;u<=b.length;u++)h.fillText(u,s,o+.3*l),s+=r+q;else for(var u=0;u<=e;u++){var w=Math.ceil(b.length/e*u);s=n/e*u+i,h.fillText(w,s,o+.3*l)}h.textAlign="right";var x;if(f>=t)for(var u=0;u<=t;u++)x=o-u/t*m+g/3,h.fillText(u,.8*i,x);else for(var u=0;u<=f;u++){var w=Math.ceil(t/f*u);x=o-w/t*m+g/3,h.fillText(w,.8*i,x)}if(c&&(h.textAlign="center",h.fillText(c,n/2+i,o+.8*l)),d){h.save();var y=.3*i,z=m/2+k;h.translate(y,z),h.rotate(-Math.PI/2),h.textAlign="center",h.fillText(d,0,0),h.restore()}},draw_scale_bar:function(a,b,c,d){var e=a.getContext("2d"),f=.01*a.width,g=.01*a.width,h=.1*a.height,i=.3*a.height,j=a.height-h-i,k=a.width-f-g,l=b/c;e.strokeRect(f,h,k,j);var m=e.createLinearGradient(f,0,k+f,0);m.addColorStop(0,"green"),m.addColorStop(.5,"gold"),m.addColorStop(1,"red"),e.fillStyle=m,e.fillRect(f,h,k*l,j);var n,o,p,q;e.fillStyle="black",e.textAlign="center",e.font="13px Arial";for(var r=0;r=.9*c?(e.textAlign="right",n=p):d[r].max<=.1*c?e.textAlign="left":n+=(p-n)/2,o=h+j+.8*i,e.fillText(d[r].label,n,o)}},Utils={chr:function(a){return String.fromCharCode(a)},ord:function(a){return a.charCodeAt(0)},pad_left:function(a,b,c){c=c||"0";var d=c.length-(b-a.length);return d=d<0?0:d,a.lengthb&&(a=a.slice(0,b-c.length)+c),a},hex:function(a,b){return a="string"==typeof a?Utils.ord(a):a,b=b||2,Utils.pad(a.toString(16),b)},bin:function(a,b){return a="string"==typeof a?Utils.ord(a):a,b=b||8,Utils.pad(a.toString(2),b)},printable:function(a,b){window&&window.app&&!window.app.options.treat_as_utf8&&(a=Utils.byte_array_to_chars(Utils.str_to_byte_array(a)));var c=/[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g,d=/[\x09-\x10\x0D\u2028\u2029]/g;return a=a.replace(c,"."),b||(a=a.replace(d,".")),a},parse_escaped_chars:function(a){return a.replace(/(\\)?\\([nrtbf]|x[\da-f]{2})/g,function(a,b,c){if("\\"===b)return"\\"+c;switch(c[0]){case"n":return"\n";case"r":return"\r";case"t":return"\t";case"b":return"\b";case"f":return"\f";case"x":return Utils.chr(parseInt(c.substr(1),16))}})},expand_alph_range:function(a){for(var b=[],c=0;c255)return Utils.str_to_utf8_byte_array(a);return c},str_to_utf8_byte_array:function(a){var b=CryptoJS.enc.Utf8.parse(a),c=Utils.word_array_to_byte_array(b);return a.length!==b.sigBytes&&(window.app.options.attempt_highlight=!1),c},str_to_charcode:function(a){for(var b=new Array(a.length),c=a.length;c--;)b[c]=a.charCodeAt(c);return b},byte_array_to_utf8:function(a){try{for(var b=[],c=0;c>>2]|=a[c]<<24-c%4*8;var d=new CryptoJS.lib.WordArray.init(b,a.length),e=CryptoJS.enc.Utf8.stringify(d);return e.length!==d.sigBytes&&(window.app.options.attempt_highlight=!1),e}catch(b){return Utils.byte_array_to_chars(a)}},byte_array_to_chars:function(a){if(!a)return"";for(var b="",c=0;c>>2]>>>24-d%4*8&255);return c},UNIC_WIN1251_MAP:{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,34:34,35:35,36:36,37:37,38:38,39:39,40:40,41:41,42:42,43:43,44:44,45:45,46:46,47:47,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,58:58,59:59,60:60,61:61,62:62,63:63,64:64,65:65,66:66,67:67,68:68,69:69,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,82:82,83:83,84:84,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99,100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,1027:129,8225:135,1046:198,8222:132,1047:199,1168:165,1048:200,1113:154,1049:201,1045:197,1050:202,1028:170,160:160,1040:192,1051:203,164:164,166:166,167:167,169:169,171:171,172:172,173:173,174:174,1053:205,176:176,177:177,1114:156,181:181,182:182,183:183,8221:148,187:187,1029:189,1056:208,1057:209,1058:210,8364:136,1112:188,1115:158,1059:211,1060:212,1030:178,1061:213,1062:214,1063:215,1116:157,1064:216,1065:217,1031:175,1066:218,1067:219,1068:220,1069:221,1070:222,1032:163,8226:149,1071:223,1072:224,8482:153,1073:225,8240:137,1118:162,1074:226,1110:179,8230:133,1075:227,1033:138,1076:228,1077:229,8211:150,1078:230,1119:159,1079:231,1042:194,1080:232,1034:140,1025:168,1081:233,1082:234,8212:151,1083:235,1169:180,1084:236,1052:204,1085:237,1035:142,1086:238,1087:239,1088:240,1089:241,1090:242,1036:141,1041:193,1091:243,1092:244,8224:134,1093:245,8470:185,1094:246,1054:206,1095:247,1096:248,8249:139,1097:249,1098:250,1044:196,1099:251,1111:191,1055:207,1100:252,1038:161,8220:147,1101:253,8250:155,1102:254,8216:145,1103:255,1043:195,1105:184,1039:143,1026:128,1106:144,8218:130,1107:131,8217:146,1108:186,1109:190},WIN1251_UNIC_MAP:{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,34:34,35:35,36:36,37:37,38:38,39:39,40:40,41:41,42:42,43:43,44:44,45:45,46:46,47:47,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,58:58,59:59,60:60,61:61,62:62,63:63,64:64,65:65,66:66,67:67,68:68,69:69,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,82:82,83:83,84:84,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99,100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,160:160,164:164,166:166,167:167,169:169,171:171,172:172,173:173,174:174,176:176,177:177,181:181,182:182,183:183,187:187,168:1025,128:1026,129:1027,170:1028,189:1029,178:1030,175:1031,163:1032,138:1033,140:1034,142:1035,141:1036,161:1038,143:1039,192:1040,193:1041,194:1042,195:1043,196:1044,197:1045,198:1046,199:1047,200:1048,201:1049,202:1050,203:1051,204:1052,205:1053,206:1054,207:1055,208:1056,209:1057,210:1058,211:1059,212:1060,213:1061,214:1062,215:1063,216:1064,217:1065,218:1066,219:1067,220:1068,221:1069,222:1070,223:1071,224:1072,225:1073,226:1074,227:1075,228:1076,229:1077,230:1078,231:1079,232:1080,233:1081,234:1082,235:1083,236:1084,237:1085,238:1086,239:1087,240:1088,241:1089,242:1090,243:1091,244:1092,245:1093,246:1094,247:1095,248:1096,249:1097,250:1098,251:1099,252:1100,253:1101,254:1102,255:1103,184:1105,144:1106,131:1107,186:1108,190:1109,179:1110,191:1111,188:1112,154:1113,156:1114,158:1115,157:1116,162:1118,159:1119,165:1168,180:1169,150:8211,151:8212,145:8216,146:8217,130:8218,147:8220,148:8221,132:8222,134:8224,135:8225,149:8226,133:8230,137:8240,139:8249,155:8250,136:8364,185:8470,153:8482},unicode_to_win1251:function(a){for(var b=[],c=0;c>2,g=(3&c)<<4|d>>4,h=(15&d)<<2|e>>6,i=63&e,isNaN(d)?h=i=64:isNaN(e)&&(i=64),j+=b.charAt(f)+b.charAt(g)+b.charAt(h)+b.charAt(i);return j},from_base64:function(a,b,c,d){if(c=c||"string",!a)return"string"===c?"":[];b=b?Utils.expand_alph_range(b).join(""):"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",void 0===d&&(d=!0);var e,f,g,h,i,j,k,l=[],m=0;if(d){var n=new RegExp("[^"+b.replace(/[\[\]\\\-^$]/g,"\\$&")+"]","g");a=a.replace(n,"")}for(;m>4,f=(15&i)<<4|j>>2,g=(3&j)<<6|k,l.push(e),64!==j&&l.push(f),64!==k&&l.push(g);return"string"===c?Utils.byte_array_to_utf8(l):l},to_hex:function(a,b,c){if(!a)return"";b="string"==typeof b?b:" ",c=c||2;for(var d="",e=0;e>>4).toString(16)),b.push((15&a[c]).toString(16));return b.join("")},from_hex:function(a,b,c){if(b=b||(a.indexOf(" ")>=0?"Space":"None"),c=c||2,"None"!==b){var d=Utils.regex_rep[b];a=a.replace(d,"")}for(var e=[],f=0;f]*>.*<\/(script|style)>/gim,"")),a.replace(/<[^>\n]+>/g,"")},escape_html:function(a){return a.replace(/>>3]|=parseInt(a.substr(d,2),16)<<24-d%8*4;return new CryptoJS.lib.WordArray.init(c,b/2)};var Base={DEFAULT_RADIX:36,run_to:function(a,b){if(!a)throw"Error: Input must be a number";var c=b[0]||Base.DEFAULT_RADIX;if(c<2||c>36)throw"Error: Radix argument must be between 2 and 36";return a.toString(c)},run_from:function(a,b){var c=b[0]||Base.DEFAULT_RADIX;if(c<2||c>36)throw"Error: Radix argument must be between 2 and 36";return parseInt(a.replace(/\s/g,""),c)}},Base64={ALPHABET:"A-Za-z0-9+/=",ALPHABET_OPTIONS:[{name:"Standard: A-Za-z0-9+/=",value:"A-Za-z0-9+/="},{name:"URL safe: A-Za-z0-9-_",value:"A-Za-z0-9-_"},{name:"Filename safe: A-Za-z0-9+-=",value:"A-Za-z0-9+\\-="},{name:"itoa64: ./0-9A-Za-z=",value:"./0-9A-Za-z="},{name:"XML: A-Za-z0-9_.",value:"A-Za-z0-9_."},{name:"y64: A-Za-z0-9._-",value:"A-Za-z0-9._-"},{name:"z64: 0-9a-zA-Z+/=",value:"0-9a-zA-Z+/="},{name:"Radix-64: 0-9A-Za-z+/=",value:"0-9A-Za-z+/="},{name:"Uuencoding: [space]-_",value:" -_"},{name:"Xxencoding: +-0-9A-Za-z",value:"+\\-0-9A-Za-z"},{name:"BinHex: !-,-0-689@A-NP-VX-Z[`a-fh-mp-r",value:"!-,-0-689@A-NP-VX-Z[`a-fh-mp-r"},{name:"ROT13: N-ZA-Mn-za-m0-9+/=",value:"N-ZA-Mn-za-m0-9+/="}],run_to:function(a,b){var c=b[0]||Base64.ALPHABET;return Utils.to_base64(a,c)},REMOVE_NON_ALPH_CHARS:!0,run_from:function(a,b){var c=b[0]||Base64.ALPHABET,d=b[1];return Utils.from_base64(a,c,"byte_array",d)},BASE32_ALPHABET:"A-Z2-7=",run_to_32:function(a,b){if(!a)return"";for(var c,d,e,f,g,h,i,j,k,l,m,n,o,p=b[0]?Utils.expand_alph_range(b[0]).join(""):"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",q="",r=0;r>3,i=(7&c)<<2|d>>6,j=d>>1&31,k=(1&d)<<4|e>>4,l=(15&e)<<1|f>>7,m=f>>2&63,n=(3&f)<<3|g>>5,o=31&g,isNaN(d)?j=k=l=m=n=o=32:isNaN(e)?l=m=n=o=32:isNaN(f)?m=n=o=32:isNaN(g)&&(o=32),q+=p.charAt(h)+p.charAt(i)+p.charAt(j)+p.charAt(k)+p.charAt(l)+p.charAt(m)+p.charAt(n)+p.charAt(o);return q},run_from_32:function(a,b){if(!a)return[];var c,d,e,f,g,h,i,j,k,l,m,n,o,p=b[0]?Utils.expand_alph_range(b[0]).join(""):"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",q=b[0],r=[],s=0;if(q){var t=new RegExp("[^"+p.replace(/[\]\\\-^]/g,"\\$&")+"]","g");a=a.replace(t,"")}for(;s>2,d=(3&i)<<6|j<<1|k>>4,e=(15&k)<<4|l>>1,f=(1&l)<<7|m<<2|n>>3,g=(7&n)<<5|o,r.push(c),(i&!0||32!==j)&&r.push(d),(k&!0||32!==l)&&r.push(e),(l&!0||32!==m)&&r.push(f),(n&!0||32!==o)&&r.push(g);return r},SHOW_IN_BINARY:!1,OFFSETS_SHOW_VARIABLE:!0,run_offsets:function(a,b){var c=b[0]||Base64.ALPHABET,d=b[1],e=Utils.to_base64(a,c),f=Utils.to_base64([0].concat(a),c),g=Utils.to_base64([0,0].concat(a),c),h=e.indexOf("="),i=f.indexOf("="),j=g.indexOf("="),k="