clipboardSwf is configured.
+ */
+ copyToClipboard : function(highlighter)
+ {
+ var flashDiv, flashSwf,
+ highlighterId = highlighter.id
+ ;
+
+ this.create = function()
+ {
+ var config = sh.config;
+
+ // disable functionality if running locally
+ if (config.clipboardSwf == null)
+ return null;
+
+ function params(list)
+ {
+ var result = '';
+
+ for (var name in list)
+ result += "";
+
+ return result;
+ };
+
+ function attributes(list)
+ {
+ var result = '';
+
+ for (var name in list)
+ result += " " + name + "='" + list[name] + "'";
+
+ return result;
+ };
+
+ var args1 = {
+ width : config.toolbarItemWidth,
+ height : config.toolbarItemHeight,
+ id : highlighterId + '_clipboard',
+ type : 'application/x-shockwave-flash',
+ title : sh.config.strings.copyToClipboard
+ },
+
+ // these arguments are used in IE's collection
+ args2 = {
+ allowScriptAccess : 'always',
+ wmode : 'transparent',
+ flashVars : 'highlighterId=' + highlighterId,
+ menu : 'false'
+ },
+ swf = config.clipboardSwf,
+ html
+ ;
+
+ if (/msie/i.test(navigator.userAgent))
+ {
+ html = ''
+ ;
+ }
+ else
+ {
+ html = ''
+ ;
+ }
+
+ flashDiv = document.createElement('div');
+ flashDiv.innerHTML = html;
+
+ return flashDiv;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var command = args.command;
+
+ switch (command)
+ {
+ case 'get':
+ var code = sh.utils.unindent(
+ sh.utils.fixInputString(highlighter.originalCode)
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/&/g, '&')
+ );
+
+ if(window.clipboardData)
+ // will fall through to the confirmation because there isn't a break
+ window.clipboardData.setData('text', code);
+ else
+ return sh.utils.unindent(code);
+
+ case 'ok':
+ sh.utils.alert(sh.config.strings.copyToClipboardConfirmation);
+ break;
+
+ case 'error':
+ sh.utils.alert(args.message);
+ break;
+ }
+ };
+ },
+
+ /** Command to print the colored source code. */
+ printSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.print;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var iframe = document.createElement('IFRAME'),
+ doc = null
+ ;
+
+ // make sure there is never more than one hidden iframe created by SH
+ if (sh.vars.printFrame != null)
+ document.body.removeChild(sh.vars.printFrame);
+
+ sh.vars.printFrame = iframe;
+
+ // this hides the iframe
+ iframe.style.cssText = 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;';
+
+ document.body.appendChild(iframe);
+ doc = iframe.contentWindow.document;
+
+ copyStyles(doc, window.document);
+ doc.write(' tag with given style applied to it.
+ *
+ * @param {String} str Input string.
+ * @param {String} css Style name to apply to the string.
+ * @return {String} Returns input string with each line surrounded by tag.
+ */
+ decorate: function(str, css)
+ {
+ if (str == null || str.length == 0 || str == '\n')
+ return str;
+
+ // helixoft
+ // str = str.replace(/... to them so that
+ // leading spaces aren't included.
+ if (css != null && css.match("skipTag$")!="skipTag") // skipTag test added by Helixoft
+ str = sh.utils.eachLine(str, function(line)
+ {
+ if (line.length == 0)
+ return '';
+
+ var spaces = '';
+
+ line = line.replace(/^( | )+/, function(s)
+ {
+ spaces = s;
+ return '';
+ });
+
+ if (line.length == 0)
+ return spaces;
+
+ return spaces + '' + line + '';
+ });
+
+ return str;
+ },
+
+ /**
+ * Pads number with zeros until it's length is the same as given length.
+ *
+ * @param {Number} number Number to pad.
+ * @param {Number} length Max string length with.
+ * @return {String} Returns a string padded with proper amount of '0'.
+ */
+ padNumber : function(number, length)
+ {
+ var result = number.toString();
+
+ while (result.length < length)
+ result = '0' + result;
+
+ return result;
+ },
+
+ /**
+ * Measures width of a single space character.
+ * @return {Number} Returns width of a single space character.
+ */
+ measureSpace : function()
+ {
+ var container = document.createElement('div'),
+ span,
+ result = 0,
+ body = document.body,
+ id = sh.utils.guid('measureSpace'),
+
+ // variable names will be compressed, so it's better than a plain string
+ divOpen = 'regexList collection.
+ * @return {Array} Returns a list of Match objects.
+ */
+ getMatches: function(code, regexInfo)
+ {
+ function defaultAdd(match, regexInfo)
+ {
+ return [new sh.Match(match[0], match.index, regexInfo.css)];
+ };
+
+ var index = 0,
+ match = null,
+ result = [],
+ func = regexInfo.func ? regexInfo.func : defaultAdd
+ ;
+
+ while((match = regexInfo.regex.exec(code)) != null)
+ result = result.concat(func(match, regexInfo));
+
+ return result;
+ },
+
+ processUrls: function(code)
+ {
+ var lt = '<',
+ gt = '>'
+ ;
+
+ return code.replace(sh.regexLib.url, function(m)
+ {
+ var suffix = '', prefix = '';
+
+ // We include < and > in the URL for the common cases like ' + lineNumber + ' | ' : '')
+ + ''
+ + (spaces != null ? '' + spaces.replace(' ', ' ') + '' : '')
+ + line
+ + ' | '
+ + '
.*?)" +
+ "(?" + regexGroup.right.source + ")",
+ "sgi"
+ )
+ };
+ }
+}; // end of Highlighter
+
+return sh;
+}(); // end of anonymous function
+
+
+/**
+ * XRegExp 0.6.1
+ * (c) 2007-2008 Steven Levithan
+ *
+ * MIT License
+ *
+ * provides an augmented, cross-browser implementation of regular expressions
+ * including support for additional modifiers and syntax. several convenience
+ * methods and a recursive-construct parser are also included.
+ */
+
+// prevent running twice, which would break references to native globals
+if (!window.XRegExp) {
+// anonymous function to avoid global variables
+(function () {
+// copy various native globals for reference. can't use the name ``native``
+// because it's a reserved JavaScript keyword.
+var real = {
+ exec: RegExp.prototype.exec,
+ match: String.prototype.match,
+ replace: String.prototype.replace,
+ split: String.prototype.split
+ },
+ /* regex syntax parsing with support for all the necessary cross-
+ browser and context issues (escapings, character classes, etc.) */
+ lib = {
+ part: /(?:[^\\([#\s.]+|\\(?!k<[\w$]+>|[pP]{[^}]+})[\S\s]?|\((?=\?(?!#|<[\w$]+>)))+|(\()(?:\?(?:(#)[^)]*\)|<([$\w]+)>))?|\\(?:k<([\w$]+)>|[pP]{([^}]+)})|(\[\^?)|([\S\s])/g,
+ replaceVar: /(?:[^$]+|\$(?![1-9$&`']|{[$\w]+}))+|\$(?:([1-9]\d*|[$&`'])|{([$\w]+)})/g,
+ extended: /^(?:\s+|#.*)+/,
+ quantifier: /^(?:[?*+]|{\d+(?:,\d*)?})/,
+ classLeft: /&&\[\^?/g,
+ classRight: /]/g
+ },
+ indexOf = function (array, item, from) {
+ for (var i = from || 0; i < array.length; i++)
+ if (array[i] === item) return i;
+ return -1;
+ },
+ brokenExecUndef = /()??/.exec("")[1] !== undefined,
+ plugins = {};
+
+/**
+ * Accepts a pattern and flags, returns a new, extended RegExp object.
+ * differs from a native regex in that additional flags and syntax are
+ * supported and browser inconsistencies are ameliorated.
+ * @ignore
+ */
+XRegExp = function (pattern, flags) {
+ if (pattern instanceof RegExp) {
+ if (flags !== undefined)
+ throw TypeError("can't supply flags when constructing one RegExp from another");
+ return pattern.addFlags(); // new copy
+ }
+
+ var flags = flags || "",
+ singleline = flags.indexOf("s") > -1,
+ extended = flags.indexOf("x") > -1,
+ hasNamedCapture = false,
+ captureNames = [],
+ output = [],
+ part = lib.part,
+ match, cc, len, index, regex;
+
+ part.lastIndex = 0; // in case the last XRegExp compilation threw an error (unbalanced character class)
+
+ while (match = real.exec.call(part, pattern)) {
+ // comment pattern. this check must come before the capturing group check,
+ // because both match[1] and match[2] will be non-empty.
+ if (match[2]) {
+ // keep tokens separated unless the following token is a quantifier
+ if (!lib.quantifier.test(pattern.slice(part.lastIndex)))
+ output.push("(?:)");
+ // capturing group
+ } else if (match[1]) {
+ captureNames.push(match[3] || null);
+ if (match[3])
+ hasNamedCapture = true;
+ output.push("(");
+ // named backreference
+ } else if (match[4]) {
+ index = indexOf(captureNames, match[4]);
+ // keep backreferences separate from subsequent literal numbers
+ // preserve backreferences to named groups that are undefined at this point as literal strings
+ output.push(index > -1 ?
+ "\\" + (index + 1) + (isNaN(pattern.charAt(part.lastIndex)) ? "" : "(?:)") :
+ match[0]
+ );
+ // unicode element (requires plugin)
+ } else if (match[5]) {
+ output.push(plugins.unicode ?
+ plugins.unicode.get(match[5], match[0].charAt(1) === "P") :
+ match[0]
+ );
+ // character class opening delimiter ("[" or "[^")
+ // (non-native unicode elements are not supported within character classes)
+ } else if (match[6]) {
+ if (pattern.charAt(part.lastIndex) === "]") {
+ // for cross-browser compatibility with ECMA-262 v3 behavior,
+ // convert [] to (?!) and [^] to [\S\s].
+ output.push(match[6] === "[" ? "(?!)" : "[\\S\\s]");
+ part.lastIndex++;
+ } else {
+ // parse the character class with support for inner escapes and
+ // ES4's infinitely nesting intersection syntax ([&&[^&&[]]]).
+ cc = XRegExp.matchRecursive("&&" + pattern.slice(match.index), lib.classLeft, lib.classRight, "", {escapeChar: "\\"})[0];
+ output.push(match[6] + cc + "]");
+ part.lastIndex += cc.length + 1;
+ }
+ // dot ("."), pound sign ("#"), or whitespace character
+ } else if (match[7]) {
+ if (singleline && match[7] === ".") {
+ output.push("[\\S\\s]");
+ } else if (extended && lib.extended.test(match[7])) {
+ len = real.exec.call(lib.extended, pattern.slice(part.lastIndex - 1))[0].length;
+ // keep tokens separated unless the following token is a quantifier
+ if (!lib.quantifier.test(pattern.slice(part.lastIndex - 1 + len)))
+ output.push("(?:)");
+ part.lastIndex += len - 1;
+ } else {
+ output.push(match[7]);
+ }
+ } else {
+ output.push(match[0]);
+ }
+ }
+
+ regex = RegExp(output.join(""), real.replace.call(flags, /[sx]+/g, ""));
+ regex._x = {
+ source: pattern,
+ captureNames: hasNamedCapture ? captureNames : null
+ };
+ return regex;
+};
+
+/**
+ * Barebones plugin support for now (intentionally undocumented)
+ * @ignore
+ * @param {Object} name
+ * @param {Object} o
+ */
+XRegExp.addPlugin = function (name, o) {
+ plugins[name] = o;
+};
+
+/**
+ * Adds named capture support, with values returned as ``result.name``.
+ *
+ * Also fixes two cross-browser issues, following the ECMA-262 v3 spec:
+ * - captured values for non-participating capturing groups should be returned
+ * as ``undefined``, rather than the empty string.
+ * - the regex's ``lastIndex`` should not be incremented after zero-length
+ * matches.
+ * @ignore
+ */
+RegExp.prototype.exec = function (str) {
+ var match = real.exec.call(this, str),
+ name, i, r2;
+ if (match) {
+ // fix browsers whose exec methods don't consistently return
+ // undefined for non-participating capturing groups
+ if (brokenExecUndef && match.length > 1) {
+ // r2 doesn't need /g or /y, but they shouldn't hurt
+ r2 = new RegExp("^" + this.source + "$(?!\\s)", this.getNativeFlags());
+ real.replace.call(match[0], r2, function () {
+ for (i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === undefined) match[i] = undefined;
+ }
+ });
+ }
+ // attach named capture properties
+ if (this._x && this._x.captureNames) {
+ for (i = 1; i < match.length; i++) {
+ name = this._x.captureNames[i - 1];
+ if (name) match[name] = match[i];
+ }
+ }
+ // fix browsers that increment lastIndex after zero-length matches
+ if (this.global && this.lastIndex > (match.index + match[0].length))
+ this.lastIndex--;
+ }
+ return match;
+};
+})(); // end anonymous function
+} // end if(!window.XRegExp)
+
+/**
+ * intentionally undocumented
+ * @ignore
+ */
+RegExp.prototype.getNativeFlags = function () {
+ return (this.global ? "g" : "") +
+ (this.ignoreCase ? "i" : "") +
+ (this.multiline ? "m" : "") +
+ (this.extended ? "x" : "") +
+ (this.sticky ? "y" : "");
+};
+
+/**
+ * Accepts flags; returns a new XRegExp object generated by recompiling
+ * the regex with the additional flags (may include non-native flags).
+ * The original regex object is not altered.
+ * @ignore
+ */
+RegExp.prototype.addFlags = function (flags) {
+ var regex = new XRegExp(this.source, (flags || "") + this.getNativeFlags());
+ if (this._x) {
+ regex._x = {
+ source: this._x.source,
+ captureNames: this._x.captureNames ? this._x.captureNames.slice(0) : null
+ };
+ }
+ return regex;
+};
+
+/**
+ * Accepts a context object and string; returns the result of calling
+ * ``exec`` with the provided string. the context is ignored but is
+ * accepted for congruity with ``Function.prototype.call``.
+ * @ignore
+ */
+RegExp.prototype.call = function (context, str) {
+ return this.exec(str);
+};
+
+/**
+ * Accepts a context object and arguments array; returns the result of
+ * calling ``exec`` with the first value in the arguments array. the context
+ * is ignored but is accepted for congruity with ``Function.prototype.apply``.
+ * @ignore
+ */
+RegExp.prototype.apply = function (context, args) {
+ return this.exec(args[0]);
+};
+
+/**
+ * Accepts a pattern and flags; returns an XRegExp object. if the pattern
+ * and flag combination has previously been cached, the cached copy is
+ * returned, otherwise the new object is cached.
+ * @ignore
+ */
+XRegExp.cache = function (pattern, flags) {
+ var key = "/" + pattern + "/" + (flags || "");
+ return XRegExp.cache[key] || (XRegExp.cache[key] = new XRegExp(pattern, flags));
+};
+
+/**
+ * Accepts a string; returns the string with regex metacharacters escaped.
+ * the returned string can safely be used within a regex to match a literal
+ * string. escaped characters are [, ], {, }, (, ), -, *, +, ?, ., \, ^, $,
+ * |, #, [comma], and whitespace.
+ * @ignore
+ */
+XRegExp.escape = function (str) {
+ return str.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, "\\$&");
+};
+
+/**
+ * Accepts a string to search, left and right delimiters as regex pattern
+ * strings, optional regex flags (may include non-native s, x, and y flags),
+ * and an options object which allows setting an escape character and changing
+ * the return format from an array of matches to a two-dimensional array of
+ * string parts with extended position data. returns an array of matches
+ * (optionally with extended data), allowing nested instances of left and right
+ * delimiters. use the g flag to return all matches, otherwise only the first
+ * is returned. if delimiters are unbalanced within the subject data, an error
+ * is thrown.
+ *
+ * This function admittedly pushes the boundaries of what can be accomplished
+ * sensibly without a "real" parser. however, by doing so it provides flexible
+ * and powerful recursive parsing capabilities with minimal code weight.
+ *
+ * Warning: the ``escapeChar`` option is considered experimental and might be
+ * changed or removed in future versions of XRegExp.
+ *
+ * unsupported features:
+ * - backreferences within delimiter patterns when using ``escapeChar``.
+ * - although providing delimiters as regex objects adds the minor feature of
+ * independent delimiter flags, it introduces other limitations and is only
+ * intended to be done by the ``XRegExp`` constructor (which can't call
+ * itself while building a regex).
+ *
+ * @ignore
+ */
+XRegExp.matchRecursive = function (str, left, right, flags, options) {
+ var options = options || {},
+ escapeChar = options.escapeChar,
+ vN = options.valueNames,
+ flags = flags || "",
+ global = flags.indexOf("g") > -1,
+ ignoreCase = flags.indexOf("i") > -1,
+ multiline = flags.indexOf("m") > -1,
+ sticky = flags.indexOf("y") > -1,
+ /* sticky mode has its own handling in this function, which means you
+ can use flag "y" even in browsers which don't support it natively */
+ flags = flags.replace(/y/g, ""),
+ left = left instanceof RegExp ? (left.global ? left : left.addFlags("g")) : new XRegExp(left, "g" + flags),
+ right = right instanceof RegExp ? (right.global ? right : right.addFlags("g")) : new XRegExp(right, "g" + flags),
+ output = [],
+ openTokens = 0,
+ delimStart = 0,
+ delimEnd = 0,
+ lastOuterEnd = 0,
+ outerStart, innerStart, leftMatch, rightMatch, escaped, esc;
+
+ if (escapeChar) {
+ if (escapeChar.length > 1) throw SyntaxError("can't supply more than one escape character");
+ if (multiline) throw TypeError("can't supply escape character when using the multiline flag");
+ escaped = XRegExp.escape(escapeChar);
+ /* Escape pattern modifiers:
+ /g - not needed here
+ /i - included
+ /m - **unsupported**, throws error
+ /s - handled by XRegExp when delimiters are provided as strings
+ /x - handled by XRegExp when delimiters are provided as strings
+ /y - not needed here; supported by other handling in this function
+ */
+ esc = new RegExp(
+ "^(?:" + escaped + "[\\S\\s]|(?:(?!" + left.source + "|" + right.source + ")[^" + escaped + "])+)+",
+ ignoreCase ? "i" : ""
+ );
+ }
+
+ while (true) {
+ /* advance the starting search position to the end of the last delimiter match.
+ a couple special cases are also covered:
+ - if using an escape character, advance to the next delimiter's starting position,
+ skipping any escaped characters
+ - first time through, reset lastIndex in case delimiters were provided as regexes
+ */
+ left.lastIndex = right.lastIndex = delimEnd +
+ (escapeChar ? (esc.exec(str.slice(delimEnd)) || [""])[0].length : 0);
+
+ leftMatch = left.exec(str);
+ rightMatch = right.exec(str);
+
+ // only keep the result which matched earlier in the string
+ if (leftMatch && rightMatch) {
+ if (leftMatch.index <= rightMatch.index)
+ rightMatch = null;
+ else leftMatch = null;
+ }
+
+ /* paths*:
+ leftMatch | rightMatch | openTokens | result
+ 1 | 0 | 1 | ...
+ 1 | 0 | 0 | ...
+ 0 | 1 | 1 | ...
+ 0 | 1 | 0 | throw
+ 0 | 0 | 1 | throw
+ 0 | 0 | 0 | break
+ * - does not include the sticky mode special case
+ - the loop ends after the first completed match if not in global mode
+ */
+
+ if (leftMatch || rightMatch) {
+ delimStart = (leftMatch || rightMatch).index;
+ delimEnd = (leftMatch ? left : right).lastIndex;
+ } else if (!openTokens) {
+ break;
+ }
+
+ if (sticky && !openTokens && delimStart > lastOuterEnd)
+ break;
+
+ if (leftMatch) {
+ if (!openTokens++) {
+ outerStart = delimStart;
+ innerStart = delimEnd;
+ }
+ } else if (rightMatch && openTokens) {
+ if (!--openTokens) {
+ if (vN) {
+ if (vN[0] && outerStart > lastOuterEnd)
+ output.push([vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart]);
+ if (vN[1]) output.push([vN[1], str.slice(outerStart, innerStart), outerStart, innerStart]);
+ if (vN[2]) output.push([vN[2], str.slice(innerStart, delimStart), innerStart, delimStart]);
+ if (vN[3]) output.push([vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd]);
+ } else {
+ output.push(str.slice(innerStart, delimStart));
+ }
+ lastOuterEnd = delimEnd;
+ if (!global)
+ break;
+ }
+ } else {
+ // reset lastIndex in case delimiters were provided as regexes
+ left.lastIndex = right.lastIndex = 0;
+ throw Error("subject data contains unbalanced delimiters");
+ }
+
+ // if the delimiter matched an empty string, advance delimEnd to avoid an infinite loop
+ if (delimStart === delimEnd)
+ delimEnd++;
+ }
+
+ if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd)
+ output.push([vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length]);
+
+ // reset lastIndex in case delimiters were provided as regexes
+ left.lastIndex = right.lastIndex = 0;
+
+ return output;
+};
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/scripts/shLegacy.js b/API_NetFramework/VSdoc/SyntaxHighlighter/scripts/shLegacy.js
new file mode 100644
index 00000000..fb307510
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/scripts/shLegacy.js
@@ -0,0 +1,30 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1 y={d:{}};y.d={F:6(S,l,q,k,m,n){6 J(z,Y){1 V=16 15("^"+Y+"\\\\[(?\\\\w+)\\\\]$","14"),x=2;h(1 i=0;i.
+ */
+//
+// Begin anonymous function. This is used to contain local scope variables without polutting global scope.
+//
+if (!window.SyntaxHighlighter) var SyntaxHighlighter = function() {
+
+// Shortcut object which will be assigned to the SyntaxHighlighter variable.
+// This is a shorthand for local reference in order to avoid long namespace
+// references to SyntaxHighlighter.whatever...
+var sh = {
+ defaults : {
+ /** Additional CSS class names to be added to highlighter elements. */
+ 'class-name' : '',
+
+ /** First line number. */
+ 'first-line' : 1,
+
+ /**
+ * Pads line numbers. Possible values are:
+ *
+ * false - don't pad line numbers.
+ * true - automaticaly pad numbers with minimum required number of leading zeroes.
+ * [int] - length up to which pad line numbers.
+ */
+ 'pad-line-numbers' : true,
+
+ /** Lines to highlight. */
+ 'highlight' : null,
+
+ /** Enables or disables smart tabs. */
+ 'smart-tabs' : true,
+
+ /** Gets or sets tab size. */
+ 'tab-size' : 4,
+
+ /** Enables or disables gutter. */
+ 'gutter' : true,
+
+ /** Enables or disables toolbar. */
+ 'toolbar' : true,
+
+ /** Forces code view to be collapsed. */
+ 'collapse' : false,
+
+ /** Enables or disables automatic links. */
+ 'auto-links' : true,
+
+ /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */
+ 'light' : false,
+
+ /** Enables or disables automatic line wrapping. */
+ 'wrap-lines' : true,
+
+ 'html-script' : false
+ },
+
+ config : {
+ /** Enables use of tags. */
+ useScriptTags : true,
+
+ /** Path to the copy to clipboard SWF file. */
+ clipboardSwf : null,
+
+ /** Width of an item in the toolbar. */
+ toolbarItemWidth : 16,
+
+ /** Height of an item in the toolbar. */
+ toolbarItemHeight : 16,
+
+ /** Blogger mode flag. */
+ bloggerMode : false,
+
+ stripBrs : false,
+
+ /** Name of the tag that SyntaxHighlighter will automatically look for. */
+ tagName : 'pre',
+
+ strings : {
+ expandSource : 'show source',
+ viewSource : 'view source',
+ copyToClipboard : 'copy to clipboard',
+ copyToClipboardConfirmation : 'The code is in your clipboard now',
+ print : 'print',
+ help : '?',
+ alert: 'SyntaxHighlighter\n\n',
+ noBrush : 'Can\'t find brush for: ',
+ brushNotHtmlScript : 'Brush wasn\'t configured for html-script option: ',
+
+ // this is populated by the build script
+ aboutDialog : 'About SyntaxHighlighter SyntaxHighlighterversion 2.1.364 (October 15 2009)If you like this script, please donate to keep development active!JavaScript code syntax highlighter.Copyright 2004-2009 Alex Gorbatchev.'
+ },
+
+ /** If true, output will show HTML produces instead. */
+ debug : false
+ },
+
+ /** Internal 'global' variables. */
+ vars : {
+ discoveredBrushes : null,
+ spaceWidth : null,
+ printFrame : null,
+ highlighters : {}
+ },
+
+ /** This object is populated by user included external brush files. */
+ brushes : {},
+
+ /** Common regular expressions. */
+ regexLib : {
+ multiLineCComments : /\/\*[\s\S]*?\*\//gm,
+ singleLineCComments : /\/\/.*$/gm,
+ singleLinePerlComments : /#.*$/gm,
+ doubleQuotedString : /"([^\\"\n]|\\.)*"/g,
+ singleQuotedString : /'([^\\'\n]|\\.)*'/g,
+ multiLineDoubleQuotedString : /"([^\\"]|\\.)*"/g,
+ multiLineSingleQuotedString : /'([^\\']|\\.)*'/g,
+ xmlComments : /(<|<)!--[\s\S]*?--(>|>)/gm,
+ url : /<\w+:\/\/[\w-.\/?%&=@:;]*>|\w+:\/\/[\w-.\/?%&=@:;]*/g,
+
+ /** = ?> tags. */
+ phpScriptTags : { left: /(<|<)\?=?/g, right: /\?(>|>)/g },
+
+ /** <%= %> tags. */
+ aspScriptTags : { left: /(<|<)%=?/g, right: /%(>|>)/g },
+
+ /** tags. */
+ scriptScriptTags : { left: /(<|<)\s*script.*?(>|>)/gi, right: /(<|<)\/\s*script\s*(>|>)/gi }
+ },
+
+ toolbar : {
+ /**
+ * Creates new toolbar for a highlighter.
+ * @param {Highlighter} highlighter Target highlighter.
+ */
+ create : function(highlighter)
+ {
+ var div = document.createElement('DIV'),
+ items = sh.toolbar.items
+ ;
+
+ div.className = 'toolbar';
+
+ for (var name in items)
+ {
+ var constructor = items[name],
+ command = new constructor(highlighter),
+ element = command.create()
+ ;
+
+ highlighter.toolbarCommands[name] = command;
+
+ if (element == null)
+ continue;
+
+ if (typeof(element) == 'string')
+ element = sh.toolbar.createButton(element, highlighter.id, name);
+
+ element.className += 'item ' + name;
+ div.appendChild(element);
+ }
+
+ return div;
+ },
+
+ /**
+ * Create a standard anchor button for the toolbar.
+ * @param {String} label Label text to display.
+ * @param {String} highlighterId Highlighter ID that this button would belong to.
+ * @param {String} commandName Command name that would be executed.
+ * @return {Element} Returns an 'A' element.
+ */
+ createButton : function(label, highlighterId, commandName)
+ {
+ var a = document.createElement('a'),
+ style = a.style,
+ config = sh.config,
+ width = config.toolbarItemWidth,
+ height = config.toolbarItemHeight
+ ;
+
+ a.href = '#' + commandName;
+ a.title = label;
+ a.highlighterId = highlighterId;
+ a.commandName = commandName;
+ a.innerHTML = label;
+
+ if (isNaN(width) == false)
+ style.width = width + 'px';
+
+ if (isNaN(height) == false)
+ style.height = height + 'px';
+
+ a.onclick = function(e)
+ {
+ try
+ {
+ sh.toolbar.executeCommand(
+ this,
+ e || window.event,
+ this.highlighterId,
+ this.commandName
+ );
+ }
+ catch(e)
+ {
+ sh.utils.alert(e.message);
+ }
+
+ return false;
+ };
+
+ return a;
+ },
+
+ /**
+ * Executes a toolbar command.
+ * @param {Element} sender Sender element.
+ * @param {MouseEvent} event Original mouse event object.
+ * @param {String} highlighterId Highlighter DIV element ID.
+ * @param {String} commandName Name of the command to execute.
+ * @return {Object} Passes out return value from command execution.
+ */
+ executeCommand : function(sender, event, highlighterId, commandName, args)
+ {
+ var highlighter = sh.vars.highlighters[highlighterId],
+ command
+ ;
+
+ if (highlighter == null || (command = highlighter.toolbarCommands[commandName]) == null)
+ return null;
+
+ return command.execute(sender, event, args);
+ },
+
+ /** Collection of toolbar items. */
+ items : {
+ expandSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ if (highlighter.getParam('collapse') != true)
+ return;
+
+ return sh.config.strings.expandSource;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var div = highlighter.div;
+
+ sender.parentNode.removeChild(sender);
+ div.className = div.className.replace('collapsed', '');
+ };
+ },
+
+ /**
+ * Command to open a new window and display the original unformatted source code inside.
+ */
+ viewSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.viewSource;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var code = sh.utils.fixInputString(highlighter.originalCode).replace(/' + code + '');
+ wnd.document.close();
+ };
+ },
+
+ /**
+ * Command to copy the original source code in to the clipboard.
+ * Uses Flash method if clipboardSwf is configured.
+ */
+ copyToClipboard : function(highlighter)
+ {
+ var flashDiv, flashSwf,
+ highlighterId = highlighter.id
+ ;
+
+ this.create = function()
+ {
+ var config = sh.config;
+
+ // disable functionality if running locally
+ if (config.clipboardSwf == null)
+ return null;
+
+ function params(list)
+ {
+ var result = '';
+
+ for (var name in list)
+ result += "";
+
+ return result;
+ };
+
+ function attributes(list)
+ {
+ var result = '';
+
+ for (var name in list)
+ result += " " + name + "='" + list[name] + "'";
+
+ return result;
+ };
+
+ var args1 = {
+ width : config.toolbarItemWidth,
+ height : config.toolbarItemHeight,
+ id : highlighterId + '_clipboard',
+ type : 'application/x-shockwave-flash',
+ title : sh.config.strings.copyToClipboard
+ },
+
+ // these arguments are used in IE's collection
+ args2 = {
+ allowScriptAccess : 'always',
+ wmode : 'transparent',
+ flashVars : 'highlighterId=' + highlighterId,
+ menu : 'false'
+ },
+ swf = config.clipboardSwf,
+ html
+ ;
+
+ if (/msie/i.test(navigator.userAgent))
+ {
+ html = ''
+ ;
+ }
+ else
+ {
+ html = ''
+ ;
+ }
+
+ flashDiv = document.createElement('div');
+ flashDiv.innerHTML = html;
+
+ return flashDiv;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var command = args.command;
+
+ switch (command)
+ {
+ case 'get':
+ var code = sh.utils.unindent(
+ sh.utils.fixInputString(highlighter.originalCode)
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/&/g, '&')
+ );
+
+ if(window.clipboardData)
+ // will fall through to the confirmation because there isn't a break
+ window.clipboardData.setData('text', code);
+ else
+ return sh.utils.unindent(code);
+
+ case 'ok':
+ sh.utils.alert(sh.config.strings.copyToClipboardConfirmation);
+ break;
+
+ case 'error':
+ sh.utils.alert(args.message);
+ break;
+ }
+ };
+ },
+
+ /** Command to print the colored source code. */
+ printSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.print;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var iframe = document.createElement('IFRAME'),
+ doc = null
+ ;
+
+ // make sure there is never more than one hidden iframe created by SH
+ if (sh.vars.printFrame != null)
+ document.body.removeChild(sh.vars.printFrame);
+
+ sh.vars.printFrame = iframe;
+
+ // this hides the iframe
+ iframe.style.cssText = 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;';
+
+ document.body.appendChild(iframe);
+ doc = iframe.contentWindow.document;
+
+ copyStyles(doc, window.document);
+ doc.write('' + highlighter.div.innerHTML + '');
+ doc.close();
+
+ iframe.contentWindow.focus();
+ iframe.contentWindow.print();
+
+ function copyStyles(destDoc, sourceDoc)
+ {
+ var links = sourceDoc.getElementsByTagName('link');
+
+ for(var i = 0; i < links.length; i++)
+ if(links[i].rel.toLowerCase() == 'stylesheet' && /shCore\.css$/.test(links[i].href))
+ destDoc.write('');
+ };
+ };
+ },
+
+ /** Command to display the about dialog window. */
+ about : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.help;
+ };
+
+ this.execute = function(sender, event)
+ {
+ var wnd = sh.utils.popup('', '_blank', 500, 250, 'scrollbars=0'),
+ doc = wnd.document
+ ;
+
+ doc.write(sh.config.strings.aboutDialog);
+ doc.close();
+ wnd.focus();
+ };
+ }
+ }
+ },
+
+ utils : {
+ /**
+ * Finds an index of element in the array.
+ * @ignore
+ * @param {Object} searchElement
+ * @param {Number} fromIndex
+ * @return {Number} Returns index of element if found; -1 otherwise.
+ */
+ indexOf : function(array, searchElement, fromIndex)
+ {
+ fromIndex = Math.max(fromIndex || 0, 0);
+
+ for (var i = fromIndex; i < array.length; i++)
+ if(array[i] == searchElement)
+ return i;
+
+ return -1;
+ },
+
+ /**
+ * Generates a unique element ID.
+ */
+ guid : function(prefix)
+ {
+ return prefix + Math.round(Math.random() * 1000000).toString();
+ },
+
+ /**
+ * Merges two objects. Values from obj2 override values in obj1.
+ * Function is NOT recursive and works only for one dimensional objects.
+ * @param {Object} obj1 First object.
+ * @param {Object} obj2 Second object.
+ * @return {Object} Returns combination of both objects.
+ */
+ merge: function(obj1, obj2)
+ {
+ var result = {}, name;
+
+ for (name in obj1)
+ result[name] = obj1[name];
+
+ for (name in obj2)
+ result[name] = obj2[name];
+
+ return result;
+ },
+
+ /**
+ * Attempts to convert string to boolean.
+ * @param {String} value Input string.
+ * @return {Boolean} Returns true if input was "true", false if input was "false" and value otherwise.
+ */
+ toBoolean: function(value)
+ {
+ switch (value)
+ {
+ case "true":
+ return true;
+
+ case "false":
+ return false;
+ }
+
+ return value;
+ },
+
+ /**
+ * Opens up a centered popup window.
+ * @param {String} url URL to open in the window.
+ * @param {String} name Popup name.
+ * @param {int} width Popup width.
+ * @param {int} height Popup height.
+ * @param {String} options window.open() options.
+ * @return {Window} Returns window instance.
+ */
+ popup: function(url, name, width, height, options)
+ {
+ var x = (screen.width - width) / 2,
+ y = (screen.height - height) / 2
+ ;
+
+ options += ', left=' + x +
+ ', top=' + y +
+ ', width=' + width +
+ ', height=' + height
+ ;
+ options = options.replace(/^,/, '');
+
+ var win = window.open(url, name, options);
+ win.focus();
+ return win;
+ },
+
+ /**
+ * Adds event handler to the target object.
+ * @param {Object} obj Target object.
+ * @param {String} type Name of the event.
+ * @param {Function} func Handling function.
+ */
+ addEvent: function(obj, type, func)
+ {
+ if (obj.attachEvent)
+ {
+ obj['e' + type + func] = func;
+ obj[type + func] = function()
+ {
+ obj['e' + type + func](window.event);
+ }
+ obj.attachEvent('on' + type, obj[type + func]);
+ }
+ else
+ {
+ obj.addEventListener(type, func, false);
+ }
+ },
+
+ /**
+ * Displays an alert.
+ * @param {String} str String to display.
+ */
+ alert: function(str)
+ {
+ alert(sh.config.strings.alert + str)
+ },
+
+ /**
+ * Finds a brush by its alias.
+ *
+ * @param {String} alias Brush alias.
+ * @param {Boolean} alert Suppresses the alert if false.
+ * @return {Brush} Returns bursh constructor if found, null otherwise.
+ */
+ findBrush: function(alias, alert)
+ {
+ var brushes = sh.vars.discoveredBrushes,
+ result = null
+ ;
+
+ if (brushes == null)
+ {
+ brushes = {};
+
+ // Find all brushes
+ for (var brush in sh.brushes)
+ {
+ var aliases = sh.brushes[brush].aliases;
+
+ if (aliases == null)
+ continue;
+
+ // keep the brush name
+ sh.brushes[brush].name = brush.toLowerCase();
+
+ for (var i = 0; i < aliases.length; i++)
+ brushes[aliases[i]] = brush;
+ }
+
+ sh.vars.discoveredBrushes = brushes;
+ }
+
+ result = sh.brushes[brushes[alias]];
+
+ if (result == null && alert != false)
+ sh.utils.alert(sh.config.strings.noBrush + alias);
+
+ return result;
+ },
+
+ /**
+ * Executes a callback on each line and replaces each line with result from the callback.
+ * @param {Object} str Input string.
+ * @param {Object} callback Callback function taking one string argument and returning a string.
+ */
+ eachLine: function(str, callback)
+ {
+ var lines = str.split('\n');
+
+ for (var i = 0; i < lines.length; i++)
+ lines[i] = callback(lines[i]);
+
+ return lines.join('\n');
+ },
+
+ /**
+ * This is a special trim which only removes first and last empty lines
+ * and doesn't affect valid leading space on the first line.
+ *
+ * @param {String} str Input string
+ * @return {String} Returns string without empty first and last lines.
+ */
+ trimFirstAndLastLines: function(str)
+ {
+ return str.replace(/^[ ]*[\n]+|[\n]*[ ]*$/g, '');
+ },
+
+ /**
+ * Parses key/value pairs into hash object.
+ *
+ * Understands the following formats:
+ * - name: word;
+ * - name: [word, word];
+ * - name: "string";
+ * - name: 'string';
+ *
+ * For example:
+ * name1: value; name2: [value, value]; name3: 'value'
+ *
+ * @param {String} str Input string.
+ * @return {Object} Returns deserialized object.
+ */
+ parseParams: function(str)
+ {
+ var match,
+ result = {},
+ arrayRegex = new XRegExp("^\\[(?(.*?))\\]$"),
+ regex = new XRegExp(
+ "(?[\\w-]+)" +
+ "\\s*:\\s*" +
+ "(?" +
+ "[\\w-%#]+|" + // word
+ "\\[.*?\\]|" + // [] array
+ '".*?"|' + // "" string
+ "'.*?'" + // '' string
+ ")\\s*;?",
+ "g"
+ )
+ ;
+
+ while ((match = regex.exec(str)) != null)
+ {
+ var value = match.value
+ .replace(/^['"]|['"]$/g, '') // strip quotes from end of strings
+ ;
+
+ // try to parse array value
+ if (value != null && arrayRegex.test(value))
+ {
+ var m = arrayRegex.exec(value);
+ value = m.values.length > 0 ? m.values.split(/\s*,\s*/) : [];
+ }
+
+ result[match.name] = value;
+ }
+
+ return result;
+ },
+
+ /**
+ * Wraps each line of the string into tag with given style applied to it.
+ *
+ * @param {String} str Input string.
+ * @param {String} css Style name to apply to the string.
+ * @return {String} Returns input string with each line surrounded by tag.
+ */
+ decorate: function(str, css)
+ {
+ if (str == null || str.length == 0 || str == '\n')
+ return str;
+
+ str = str.replace(/... ' + line + '';
+ });
+
+ return str;
+ },
+
+ /**
+ * Pads number with zeros until it's length is the same as given length.
+ *
+ * @param {Number} number Number to pad.
+ * @param {Number} length Max string length with.
+ * @return {String} Returns a string padded with proper amount of '0'.
+ */
+ padNumber : function(number, length)
+ {
+ var result = number.toString();
+
+ while (result.length < length)
+ result = '0' + result;
+
+ return result;
+ },
+
+ /**
+ * Measures width of a single space character.
+ * @return {Number} Returns width of a single space character.
+ */
+ measureSpace : function()
+ {
+ var container = document.createElement('div'),
+ span,
+ result = 0,
+ body = document.body,
+ id = sh.utils.guid('measureSpace'),
+
+ // variable names will be compressed, so it's better than a plain string
+ divOpen = 'regexList collection.
+ * @return {Array} Returns a list of Match objects.
+ */
+ getMatches: function(code, regexInfo)
+ {
+ function defaultAdd(match, regexInfo)
+ {
+ return [new sh.Match(match[0], match.index, regexInfo.css)];
+ };
+
+ var index = 0,
+ match = null,
+ result = [],
+ func = regexInfo.func ? regexInfo.func : defaultAdd
+ ;
+
+ while((match = regexInfo.regex.exec(code)) != null)
+ result = result.concat(func(match, regexInfo));
+
+ return result;
+ },
+
+ processUrls: function(code)
+ {
+ var lt = '<',
+ gt = '>'
+ ;
+
+ return code.replace(sh.regexLib.url, function(m)
+ {
+ var suffix = '', prefix = '';
+
+ // We include < and > in the URL for the common cases like ' + lineNumber + ' | ' : '')
+ + ''
+ + (spaces != null ? '' + spaces.replace(' ', ' ') + '' : '')
+ + line
+ + ' | '
+ + '
.*?)" +
+ "(?" + regexGroup.right.source + ")",
+ "sgi"
+ )
+ };
+ }
+}; // end of Highlighter
+
+return sh;
+}(); // end of anonymous function
+
+
+/**
+ * XRegExp 0.6.1
+ * (c) 2007-2008 Steven Levithan
+ *
+ * MIT License
+ *
+ * provides an augmented, cross-browser implementation of regular expressions
+ * including support for additional modifiers and syntax. several convenience
+ * methods and a recursive-construct parser are also included.
+ */
+
+// prevent running twice, which would break references to native globals
+if (!window.XRegExp) {
+// anonymous function to avoid global variables
+(function () {
+// copy various native globals for reference. can't use the name ``native``
+// because it's a reserved JavaScript keyword.
+var real = {
+ exec: RegExp.prototype.exec,
+ match: String.prototype.match,
+ replace: String.prototype.replace,
+ split: String.prototype.split
+ },
+ /* regex syntax parsing with support for all the necessary cross-
+ browser and context issues (escapings, character classes, etc.) */
+ lib = {
+ part: /(?:[^\\([#\s.]+|\\(?!k<[\w$]+>|[pP]{[^}]+})[\S\s]?|\((?=\?(?!#|<[\w$]+>)))+|(\()(?:\?(?:(#)[^)]*\)|<([$\w]+)>))?|\\(?:k<([\w$]+)>|[pP]{([^}]+)})|(\[\^?)|([\S\s])/g,
+ replaceVar: /(?:[^$]+|\$(?![1-9$&`']|{[$\w]+}))+|\$(?:([1-9]\d*|[$&`'])|{([$\w]+)})/g,
+ extended: /^(?:\s+|#.*)+/,
+ quantifier: /^(?:[?*+]|{\d+(?:,\d*)?})/,
+ classLeft: /&&\[\^?/g,
+ classRight: /]/g
+ },
+ indexOf = function (array, item, from) {
+ for (var i = from || 0; i < array.length; i++)
+ if (array[i] === item) return i;
+ return -1;
+ },
+ brokenExecUndef = /()??/.exec("")[1] !== undefined,
+ plugins = {};
+
+/**
+ * Accepts a pattern and flags, returns a new, extended RegExp object.
+ * differs from a native regex in that additional flags and syntax are
+ * supported and browser inconsistencies are ameliorated.
+ * @ignore
+ */
+XRegExp = function (pattern, flags) {
+ if (pattern instanceof RegExp) {
+ if (flags !== undefined)
+ throw TypeError("can't supply flags when constructing one RegExp from another");
+ return pattern.addFlags(); // new copy
+ }
+
+ var flags = flags || "",
+ singleline = flags.indexOf("s") > -1,
+ extended = flags.indexOf("x") > -1,
+ hasNamedCapture = false,
+ captureNames = [],
+ output = [],
+ part = lib.part,
+ match, cc, len, index, regex;
+
+ part.lastIndex = 0; // in case the last XRegExp compilation threw an error (unbalanced character class)
+
+ while (match = real.exec.call(part, pattern)) {
+ // comment pattern. this check must come before the capturing group check,
+ // because both match[1] and match[2] will be non-empty.
+ if (match[2]) {
+ // keep tokens separated unless the following token is a quantifier
+ if (!lib.quantifier.test(pattern.slice(part.lastIndex)))
+ output.push("(?:)");
+ // capturing group
+ } else if (match[1]) {
+ captureNames.push(match[3] || null);
+ if (match[3])
+ hasNamedCapture = true;
+ output.push("(");
+ // named backreference
+ } else if (match[4]) {
+ index = indexOf(captureNames, match[4]);
+ // keep backreferences separate from subsequent literal numbers
+ // preserve backreferences to named groups that are undefined at this point as literal strings
+ output.push(index > -1 ?
+ "\\" + (index + 1) + (isNaN(pattern.charAt(part.lastIndex)) ? "" : "(?:)") :
+ match[0]
+ );
+ // unicode element (requires plugin)
+ } else if (match[5]) {
+ output.push(plugins.unicode ?
+ plugins.unicode.get(match[5], match[0].charAt(1) === "P") :
+ match[0]
+ );
+ // character class opening delimiter ("[" or "[^")
+ // (non-native unicode elements are not supported within character classes)
+ } else if (match[6]) {
+ if (pattern.charAt(part.lastIndex) === "]") {
+ // for cross-browser compatibility with ECMA-262 v3 behavior,
+ // convert [] to (?!) and [^] to [\S\s].
+ output.push(match[6] === "[" ? "(?!)" : "[\\S\\s]");
+ part.lastIndex++;
+ } else {
+ // parse the character class with support for inner escapes and
+ // ES4's infinitely nesting intersection syntax ([&&[^&&[]]]).
+ cc = XRegExp.matchRecursive("&&" + pattern.slice(match.index), lib.classLeft, lib.classRight, "", {escapeChar: "\\"})[0];
+ output.push(match[6] + cc + "]");
+ part.lastIndex += cc.length + 1;
+ }
+ // dot ("."), pound sign ("#"), or whitespace character
+ } else if (match[7]) {
+ if (singleline && match[7] === ".") {
+ output.push("[\\S\\s]");
+ } else if (extended && lib.extended.test(match[7])) {
+ len = real.exec.call(lib.extended, pattern.slice(part.lastIndex - 1))[0].length;
+ // keep tokens separated unless the following token is a quantifier
+ if (!lib.quantifier.test(pattern.slice(part.lastIndex - 1 + len)))
+ output.push("(?:)");
+ part.lastIndex += len - 1;
+ } else {
+ output.push(match[7]);
+ }
+ } else {
+ output.push(match[0]);
+ }
+ }
+
+ regex = RegExp(output.join(""), real.replace.call(flags, /[sx]+/g, ""));
+ regex._x = {
+ source: pattern,
+ captureNames: hasNamedCapture ? captureNames : null
+ };
+ return regex;
+};
+
+/**
+ * Barebones plugin support for now (intentionally undocumented)
+ * @ignore
+ * @param {Object} name
+ * @param {Object} o
+ */
+XRegExp.addPlugin = function (name, o) {
+ plugins[name] = o;
+};
+
+/**
+ * Adds named capture support, with values returned as ``result.name``.
+ *
+ * Also fixes two cross-browser issues, following the ECMA-262 v3 spec:
+ * - captured values for non-participating capturing groups should be returned
+ * as ``undefined``, rather than the empty string.
+ * - the regex's ``lastIndex`` should not be incremented after zero-length
+ * matches.
+ * @ignore
+ */
+RegExp.prototype.exec = function (str) {
+ var match = real.exec.call(this, str),
+ name, i, r2;
+ if (match) {
+ // fix browsers whose exec methods don't consistently return
+ // undefined for non-participating capturing groups
+ if (brokenExecUndef && match.length > 1) {
+ // r2 doesn't need /g or /y, but they shouldn't hurt
+ r2 = new RegExp("^" + this.source + "$(?!\\s)", this.getNativeFlags());
+ real.replace.call(match[0], r2, function () {
+ for (i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === undefined) match[i] = undefined;
+ }
+ });
+ }
+ // attach named capture properties
+ if (this._x && this._x.captureNames) {
+ for (i = 1; i < match.length; i++) {
+ name = this._x.captureNames[i - 1];
+ if (name) match[name] = match[i];
+ }
+ }
+ // fix browsers that increment lastIndex after zero-length matches
+ if (this.global && this.lastIndex > (match.index + match[0].length))
+ this.lastIndex--;
+ }
+ return match;
+};
+})(); // end anonymous function
+} // end if(!window.XRegExp)
+
+/**
+ * intentionally undocumented
+ * @ignore
+ */
+RegExp.prototype.getNativeFlags = function () {
+ return (this.global ? "g" : "") +
+ (this.ignoreCase ? "i" : "") +
+ (this.multiline ? "m" : "") +
+ (this.extended ? "x" : "") +
+ (this.sticky ? "y" : "");
+};
+
+/**
+ * Accepts flags; returns a new XRegExp object generated by recompiling
+ * the regex with the additional flags (may include non-native flags).
+ * The original regex object is not altered.
+ * @ignore
+ */
+RegExp.prototype.addFlags = function (flags) {
+ var regex = new XRegExp(this.source, (flags || "") + this.getNativeFlags());
+ if (this._x) {
+ regex._x = {
+ source: this._x.source,
+ captureNames: this._x.captureNames ? this._x.captureNames.slice(0) : null
+ };
+ }
+ return regex;
+};
+
+/**
+ * Accepts a context object and string; returns the result of calling
+ * ``exec`` with the provided string. the context is ignored but is
+ * accepted for congruity with ``Function.prototype.call``.
+ * @ignore
+ */
+RegExp.prototype.call = function (context, str) {
+ return this.exec(str);
+};
+
+/**
+ * Accepts a context object and arguments array; returns the result of
+ * calling ``exec`` with the first value in the arguments array. the context
+ * is ignored but is accepted for congruity with ``Function.prototype.apply``.
+ * @ignore
+ */
+RegExp.prototype.apply = function (context, args) {
+ return this.exec(args[0]);
+};
+
+/**
+ * Accepts a pattern and flags; returns an XRegExp object. if the pattern
+ * and flag combination has previously been cached, the cached copy is
+ * returned, otherwise the new object is cached.
+ * @ignore
+ */
+XRegExp.cache = function (pattern, flags) {
+ var key = "/" + pattern + "/" + (flags || "");
+ return XRegExp.cache[key] || (XRegExp.cache[key] = new XRegExp(pattern, flags));
+};
+
+/**
+ * Accepts a string; returns the string with regex metacharacters escaped.
+ * the returned string can safely be used within a regex to match a literal
+ * string. escaped characters are [, ], {, }, (, ), -, *, +, ?, ., \, ^, $,
+ * |, #, [comma], and whitespace.
+ * @ignore
+ */
+XRegExp.escape = function (str) {
+ return str.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, "\\$&");
+};
+
+/**
+ * Accepts a string to search, left and right delimiters as regex pattern
+ * strings, optional regex flags (may include non-native s, x, and y flags),
+ * and an options object which allows setting an escape character and changing
+ * the return format from an array of matches to a two-dimensional array of
+ * string parts with extended position data. returns an array of matches
+ * (optionally with extended data), allowing nested instances of left and right
+ * delimiters. use the g flag to return all matches, otherwise only the first
+ * is returned. if delimiters are unbalanced within the subject data, an error
+ * is thrown.
+ *
+ * This function admittedly pushes the boundaries of what can be accomplished
+ * sensibly without a "real" parser. however, by doing so it provides flexible
+ * and powerful recursive parsing capabilities with minimal code weight.
+ *
+ * Warning: the ``escapeChar`` option is considered experimental and might be
+ * changed or removed in future versions of XRegExp.
+ *
+ * unsupported features:
+ * - backreferences within delimiter patterns when using ``escapeChar``.
+ * - although providing delimiters as regex objects adds the minor feature of
+ * independent delimiter flags, it introduces other limitations and is only
+ * intended to be done by the ``XRegExp`` constructor (which can't call
+ * itself while building a regex).
+ *
+ * @ignore
+ */
+XRegExp.matchRecursive = function (str, left, right, flags, options) {
+ var options = options || {},
+ escapeChar = options.escapeChar,
+ vN = options.valueNames,
+ flags = flags || "",
+ global = flags.indexOf("g") > -1,
+ ignoreCase = flags.indexOf("i") > -1,
+ multiline = flags.indexOf("m") > -1,
+ sticky = flags.indexOf("y") > -1,
+ /* sticky mode has its own handling in this function, which means you
+ can use flag "y" even in browsers which don't support it natively */
+ flags = flags.replace(/y/g, ""),
+ left = left instanceof RegExp ? (left.global ? left : left.addFlags("g")) : new XRegExp(left, "g" + flags),
+ right = right instanceof RegExp ? (right.global ? right : right.addFlags("g")) : new XRegExp(right, "g" + flags),
+ output = [],
+ openTokens = 0,
+ delimStart = 0,
+ delimEnd = 0,
+ lastOuterEnd = 0,
+ outerStart, innerStart, leftMatch, rightMatch, escaped, esc;
+
+ if (escapeChar) {
+ if (escapeChar.length > 1) throw SyntaxError("can't supply more than one escape character");
+ if (multiline) throw TypeError("can't supply escape character when using the multiline flag");
+ escaped = XRegExp.escape(escapeChar);
+ /* Escape pattern modifiers:
+ /g - not needed here
+ /i - included
+ /m - **unsupported**, throws error
+ /s - handled by XRegExp when delimiters are provided as strings
+ /x - handled by XRegExp when delimiters are provided as strings
+ /y - not needed here; supported by other handling in this function
+ */
+ esc = new RegExp(
+ "^(?:" + escaped + "[\\S\\s]|(?:(?!" + left.source + "|" + right.source + ")[^" + escaped + "])+)+",
+ ignoreCase ? "i" : ""
+ );
+ }
+
+ while (true) {
+ /* advance the starting search position to the end of the last delimiter match.
+ a couple special cases are also covered:
+ - if using an escape character, advance to the next delimiter's starting position,
+ skipping any escaped characters
+ - first time through, reset lastIndex in case delimiters were provided as regexes
+ */
+ left.lastIndex = right.lastIndex = delimEnd +
+ (escapeChar ? (esc.exec(str.slice(delimEnd)) || [""])[0].length : 0);
+
+ leftMatch = left.exec(str);
+ rightMatch = right.exec(str);
+
+ // only keep the result which matched earlier in the string
+ if (leftMatch && rightMatch) {
+ if (leftMatch.index <= rightMatch.index)
+ rightMatch = null;
+ else leftMatch = null;
+ }
+
+ /* paths*:
+ leftMatch | rightMatch | openTokens | result
+ 1 | 0 | 1 | ...
+ 1 | 0 | 0 | ...
+ 0 | 1 | 1 | ...
+ 0 | 1 | 0 | throw
+ 0 | 0 | 1 | throw
+ 0 | 0 | 0 | break
+ * - does not include the sticky mode special case
+ - the loop ends after the first completed match if not in global mode
+ */
+
+ if (leftMatch || rightMatch) {
+ delimStart = (leftMatch || rightMatch).index;
+ delimEnd = (leftMatch ? left : right).lastIndex;
+ } else if (!openTokens) {
+ break;
+ }
+
+ if (sticky && !openTokens && delimStart > lastOuterEnd)
+ break;
+
+ if (leftMatch) {
+ if (!openTokens++) {
+ outerStart = delimStart;
+ innerStart = delimEnd;
+ }
+ } else if (rightMatch && openTokens) {
+ if (!--openTokens) {
+ if (vN) {
+ if (vN[0] && outerStart > lastOuterEnd)
+ output.push([vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart]);
+ if (vN[1]) output.push([vN[1], str.slice(outerStart, innerStart), outerStart, innerStart]);
+ if (vN[2]) output.push([vN[2], str.slice(innerStart, delimStart), innerStart, delimStart]);
+ if (vN[3]) output.push([vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd]);
+ } else {
+ output.push(str.slice(innerStart, delimStart));
+ }
+ lastOuterEnd = delimEnd;
+ if (!global)
+ break;
+ }
+ } else {
+ // reset lastIndex in case delimiters were provided as regexes
+ left.lastIndex = right.lastIndex = 0;
+ throw Error("subject data contains unbalanced delimiters");
+ }
+
+ // if the delimiter matched an empty string, advance delimEnd to avoid an infinite loop
+ if (delimStart === delimEnd)
+ delimEnd++;
+ }
+
+ if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd)
+ output.push([vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length]);
+
+ // reset lastIndex in case delimiters were provided as regexes
+ left.lastIndex = right.lastIndex = 0;
+
+ return output;
+};
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/src/shCore_helixoft.js b/API_NetFramework/VSdoc/SyntaxHighlighter/src/shCore_helixoft.js
new file mode 100644
index 00000000..5893060a
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/src/shCore_helixoft.js
@@ -0,0 +1,2085 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+
+ /* modified by Helixoft */
+
+//
+// Begin anonymous function. This is used to contain local scope variables without polutting global scope.
+//
+if (!window.SyntaxHighlighter) var SyntaxHighlighter = function() {
+
+// Shortcut object which will be assigned to the SyntaxHighlighter variable.
+// This is a shorthand for local reference in order to avoid long namespace
+// references to SyntaxHighlighter.whatever...
+var sh = {
+ defaults : {
+ /** Additional CSS class names to be added to highlighter elements. */
+ 'class-name' : '',
+
+ /** First line number. */
+ 'first-line' : 1,
+
+ /**
+ * Pads line numbers. Possible values are:
+ *
+ * false - don't pad line numbers.
+ * true - automaticaly pad numbers with minimum required number of leading zeroes.
+ * [int] - length up to which pad line numbers.
+ */
+ 'pad-line-numbers' : true,
+
+ /** Lines to highlight. */
+ 'highlight' : null,
+
+ /** Enables or disables smart tabs. */
+ 'smart-tabs' : false, // helixoft change
+
+ /** Gets or sets tab size. */
+ 'tab-size' : 4,
+
+ /** Enables or disables gutter. */
+ 'gutter' : false, // helixoft change
+
+ /** Enables or disables toolbar. */
+ 'toolbar' : false, // helixoft change
+
+ /** Forces code view to be collapsed. */
+ 'collapse' : false,
+
+ /** Enables or disables automatic links. */
+ 'auto-links' : false, // helixoft change
+
+ /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */
+ 'light' : false,
+
+ /** Enables or disables automatic line wrapping. */
+ 'wrap-lines' : false, // helixoft change
+
+ 'html-script' : false
+ },
+
+ config : {
+ /** Enables use of tags. */
+ useScriptTags : true,
+
+ /** Path to the copy to clipboard SWF file. */
+ clipboardSwf : null,
+
+ /** Width of an item in the toolbar. */
+ toolbarItemWidth : 16,
+
+ /** Height of an item in the toolbar. */
+ toolbarItemHeight : 16,
+
+ /** Blogger mode flag. */
+ // helixoft
+ // bloggerMode : false,
+ bloggerMode : true,
+ // helixoft end
+
+ stripBrs : false,
+
+ /** Name of the tag that SyntaxHighlighter will automatically look for. */
+ tagName : 'pre',
+
+ strings : {
+ expandSource : 'show source',
+ viewSource : 'view source',
+ copyToClipboard : 'copy to clipboard',
+ copyToClipboardConfirmation : 'The code is in your clipboard now',
+ print : 'print',
+ help : '?',
+ alert: 'SyntaxHighlighter\n\n',
+ noBrush : 'Can\'t find brush for: ',
+ brushNotHtmlScript : 'Brush wasn\'t configured for html-script option: ',
+
+ // this is populated by the build script
+ aboutDialog : 'About SyntaxHighlighter SyntaxHighlighterversion 2.1.364 (October 15 2009)If you like this script, please donate to keep development active!JavaScript code syntax highlighter.Copyright 2004-2009 Alex Gorbatchev.'
+ },
+
+ /** If true, output will show HTML produces instead. */
+ debug : false
+ },
+
+ /** Internal 'global' variables. */
+ vars : {
+ discoveredBrushes : null,
+ spaceWidth : null,
+ printFrame : null,
+ highlighters : {}
+ },
+
+ /** This object is populated by user included external brush files. */
+ brushes : {},
+
+ /** Common regular expressions. */
+ regexLib : {
+ multiLineCComments : /\/\*[\s\S]*?\*\//gm,
+ singleLineCComments : /\/\/.*$/gm,
+ singleLinePerlComments : /#.*$/gm,
+ doubleQuotedString : /"([^\\"\n]|\\.)*"/g,
+ singleQuotedString : /'([^\\'\n]|\\.)*'/g,
+ multiLineDoubleQuotedString : /"([^\\"]|\\.)*"/g,
+ multiLineSingleQuotedString : /'([^\\']|\\.)*'/g,
+ xmlComments : /(<|<)!--[\s\S]*?--(>|>)/gm,
+ url : /<\w+:\/\/[\w-.\/?%&=@:;]*>|\w+:\/\/[\w-.\/?%&=@:;]*/g,
+
+ /** = ?> tags. */
+ phpScriptTags : { left: /(<|<)\?=?/g, right: /\?(>|>)/g },
+
+ /** <%= %> tags. */
+ aspScriptTags : { left: /(<|<)%=?/g, right: /%(>|>)/g },
+
+ /** tags. */
+ scriptScriptTags : { left: /(<|<)\s*script.*?(>|>)/gi, right: /(<|<)\/\s*script\s*(>|>)/gi }
+ },
+
+ toolbar : {
+ /**
+ * Creates new toolbar for a highlighter.
+ * @param {Highlighter} highlighter Target highlighter.
+ */
+ create : function(highlighter)
+ {
+ var div = document.createElement('DIV'),
+ items = sh.toolbar.items
+ ;
+
+ div.className = 'toolbar';
+
+ for (var name in items)
+ {
+ var constructor = items[name],
+ command = new constructor(highlighter),
+ element = command.create()
+ ;
+
+ highlighter.toolbarCommands[name] = command;
+
+ if (element == null)
+ continue;
+
+ if (typeof(element) == 'string')
+ element = sh.toolbar.createButton(element, highlighter.id, name);
+
+ element.className += 'item ' + name;
+ div.appendChild(element);
+ }
+
+ return div;
+ },
+
+ /**
+ * Create a standard anchor button for the toolbar.
+ * @param {String} label Label text to display.
+ * @param {String} highlighterId Highlighter ID that this button would belong to.
+ * @param {String} commandName Command name that would be executed.
+ * @return {Element} Returns an 'A' element.
+ */
+ createButton : function(label, highlighterId, commandName)
+ {
+ var a = document.createElement('a'),
+ style = a.style,
+ config = sh.config,
+ width = config.toolbarItemWidth,
+ height = config.toolbarItemHeight
+ ;
+
+ a.href = '#' + commandName;
+ a.title = label;
+ a.highlighterId = highlighterId;
+ a.commandName = commandName;
+ a.innerHTML = label;
+
+ if (isNaN(width) == false)
+ style.width = width + 'px';
+
+ if (isNaN(height) == false)
+ style.height = height + 'px';
+
+ a.onclick = function(e)
+ {
+ try
+ {
+ sh.toolbar.executeCommand(
+ this,
+ e || window.event,
+ this.highlighterId,
+ this.commandName
+ );
+ }
+ catch(e)
+ {
+ sh.utils.alert(e.message);
+ }
+
+ return false;
+ };
+
+ return a;
+ },
+
+ /**
+ * Executes a toolbar command.
+ * @param {Element} sender Sender element.
+ * @param {MouseEvent} event Original mouse event object.
+ * @param {String} highlighterId Highlighter DIV element ID.
+ * @param {String} commandName Name of the command to execute.
+ * @return {Object} Passes out return value from command execution.
+ */
+ executeCommand : function(sender, event, highlighterId, commandName, args)
+ {
+ var highlighter = sh.vars.highlighters[highlighterId],
+ command
+ ;
+
+ if (highlighter == null || (command = highlighter.toolbarCommands[commandName]) == null)
+ return null;
+
+ return command.execute(sender, event, args);
+ },
+
+ /** Collection of toolbar items. */
+ items : {
+ expandSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ if (highlighter.getParam('collapse') != true)
+ return;
+
+ return sh.config.strings.expandSource;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var div = highlighter.div;
+
+ sender.parentNode.removeChild(sender);
+ div.className = div.className.replace('collapsed', '');
+ };
+ },
+
+ /**
+ * Command to open a new window and display the original unformatted source code inside.
+ */
+ viewSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.viewSource;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var code = sh.utils.fixInputString(highlighter.originalCode).replace(/' + code + '');
+ wnd.document.close();
+ };
+ },
+
+ /**
+ * Command to copy the original source code in to the clipboard.
+ * Uses Flash method if clipboardSwf is configured.
+ */
+ copyToClipboard : function(highlighter)
+ {
+ var flashDiv, flashSwf,
+ highlighterId = highlighter.id
+ ;
+
+ this.create = function()
+ {
+ var config = sh.config;
+
+ // disable functionality if running locally
+ if (config.clipboardSwf == null)
+ return null;
+
+ function params(list)
+ {
+ var result = '';
+
+ for (var name in list)
+ result += "";
+
+ return result;
+ };
+
+ function attributes(list)
+ {
+ var result = '';
+
+ for (var name in list)
+ result += " " + name + "='" + list[name] + "'";
+
+ return result;
+ };
+
+ var args1 = {
+ width : config.toolbarItemWidth,
+ height : config.toolbarItemHeight,
+ id : highlighterId + '_clipboard',
+ type : 'application/x-shockwave-flash',
+ title : sh.config.strings.copyToClipboard
+ },
+
+ // these arguments are used in IE's collection
+ args2 = {
+ allowScriptAccess : 'always',
+ wmode : 'transparent',
+ flashVars : 'highlighterId=' + highlighterId,
+ menu : 'false'
+ },
+ swf = config.clipboardSwf,
+ html
+ ;
+
+ if (/msie/i.test(navigator.userAgent))
+ {
+ html = ''
+ ;
+ }
+ else
+ {
+ html = ''
+ ;
+ }
+
+ flashDiv = document.createElement('div');
+ flashDiv.innerHTML = html;
+
+ return flashDiv;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var command = args.command;
+
+ switch (command)
+ {
+ case 'get':
+ var code = sh.utils.unindent(
+ sh.utils.fixInputString(highlighter.originalCode)
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/&/g, '&')
+ );
+
+ if(window.clipboardData)
+ // will fall through to the confirmation because there isn't a break
+ window.clipboardData.setData('text', code);
+ else
+ return sh.utils.unindent(code);
+
+ case 'ok':
+ sh.utils.alert(sh.config.strings.copyToClipboardConfirmation);
+ break;
+
+ case 'error':
+ sh.utils.alert(args.message);
+ break;
+ }
+ };
+ },
+
+ /** Command to print the colored source code. */
+ printSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.print;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var iframe = document.createElement('IFRAME'),
+ doc = null
+ ;
+
+ // make sure there is never more than one hidden iframe created by SH
+ if (sh.vars.printFrame != null)
+ document.body.removeChild(sh.vars.printFrame);
+
+ sh.vars.printFrame = iframe;
+
+ // this hides the iframe
+ iframe.style.cssText = 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;';
+
+ document.body.appendChild(iframe);
+ doc = iframe.contentWindow.document;
+
+ copyStyles(doc, window.document);
+ doc.write('' + highlighter.div.innerHTML + '');
+ doc.close();
+
+ iframe.contentWindow.focus();
+ iframe.contentWindow.print();
+
+ function copyStyles(destDoc, sourceDoc)
+ {
+ var links = sourceDoc.getElementsByTagName('link');
+
+ for(var i = 0; i < links.length; i++)
+ if(links[i].rel.toLowerCase() == 'stylesheet' && /shCore\.css$/.test(links[i].href))
+ destDoc.write('');
+ };
+ };
+ },
+
+ /** Command to display the about dialog window. */
+ about : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.help;
+ };
+
+ this.execute = function(sender, event)
+ {
+ var wnd = sh.utils.popup('', '_blank', 500, 250, 'scrollbars=0'),
+ doc = wnd.document
+ ;
+
+ doc.write(sh.config.strings.aboutDialog);
+ doc.close();
+ wnd.focus();
+ };
+ }
+ }
+ },
+
+ utils : {
+ /**
+ * Finds an index of element in the array.
+ * @ignore
+ * @param {Object} searchElement
+ * @param {Number} fromIndex
+ * @return {Number} Returns index of element if found; -1 otherwise.
+ */
+ indexOf : function(array, searchElement, fromIndex)
+ {
+ fromIndex = Math.max(fromIndex || 0, 0);
+
+ for (var i = fromIndex; i < array.length; i++)
+ if(array[i] == searchElement)
+ return i;
+
+ return -1;
+ },
+
+ /**
+ * Generates a unique element ID.
+ */
+ guid : function(prefix)
+ {
+ return prefix + Math.round(Math.random() * 1000000).toString();
+ },
+
+ /**
+ * Merges two objects. Values from obj2 override values in obj1.
+ * Function is NOT recursive and works only for one dimensional objects.
+ * @param {Object} obj1 First object.
+ * @param {Object} obj2 Second object.
+ * @return {Object} Returns combination of both objects.
+ */
+ merge: function(obj1, obj2)
+ {
+ var result = {}, name;
+
+ for (name in obj1)
+ result[name] = obj1[name];
+
+ for (name in obj2)
+ result[name] = obj2[name];
+
+ return result;
+ },
+
+ /**
+ * Attempts to convert string to boolean.
+ * @param {String} value Input string.
+ * @return {Boolean} Returns true if input was "true", false if input was "false" and value otherwise.
+ */
+ toBoolean: function(value)
+ {
+ switch (value)
+ {
+ case "true":
+ return true;
+
+ case "false":
+ return false;
+ }
+
+ return value;
+ },
+
+ /**
+ * Opens up a centered popup window.
+ * @param {String} url URL to open in the window.
+ * @param {String} name Popup name.
+ * @param {int} width Popup width.
+ * @param {int} height Popup height.
+ * @param {String} options window.open() options.
+ * @return {Window} Returns window instance.
+ */
+ popup: function(url, name, width, height, options)
+ {
+ var x = (screen.width - width) / 2,
+ y = (screen.height - height) / 2
+ ;
+
+ options += ', left=' + x +
+ ', top=' + y +
+ ', width=' + width +
+ ', height=' + height
+ ;
+ options = options.replace(/^,/, '');
+
+ var win = window.open(url, name, options);
+ win.focus();
+ return win;
+ },
+
+ /**
+ * Adds event handler to the target object.
+ * @param {Object} obj Target object.
+ * @param {String} type Name of the event.
+ * @param {Function} func Handling function.
+ */
+ addEvent: function(obj, type, func)
+ {
+ if (obj.attachEvent)
+ {
+ obj['e' + type + func] = func;
+ obj[type + func] = function()
+ {
+ obj['e' + type + func](window.event);
+ }
+ obj.attachEvent('on' + type, obj[type + func]);
+ }
+ else
+ {
+ obj.addEventListener(type, func, false);
+ }
+ },
+
+ /**
+ * Displays an alert.
+ * @param {String} str String to display.
+ */
+ alert: function(str)
+ {
+ alert(sh.config.strings.alert + str)
+ },
+
+ /**
+ * Finds a brush by its alias.
+ *
+ * @param {String} alias Brush alias.
+ * @param {Boolean} alert Suppresses the alert if false.
+ * @return {Brush} Returns bursh constructor if found, null otherwise.
+ */
+ findBrush: function(alias, alert)
+ {
+ var brushes = sh.vars.discoveredBrushes,
+ result = null
+ ;
+
+ if (brushes == null)
+ {
+ brushes = {};
+
+ // Find all brushes
+ for (var brush in sh.brushes)
+ {
+ var aliases = sh.brushes[brush].aliases;
+
+ if (aliases == null)
+ continue;
+
+ // keep the brush name
+ sh.brushes[brush].name = brush.toLowerCase();
+
+ for (var i = 0; i < aliases.length; i++)
+ brushes[aliases[i]] = brush;
+ }
+
+ sh.vars.discoveredBrushes = brushes;
+ }
+
+ result = sh.brushes[brushes[alias]];
+
+ if (result == null && alert != false)
+ sh.utils.alert(sh.config.strings.noBrush + alias);
+
+ return result;
+ },
+
+ /**
+ * Executes a callback on each line and replaces each line with result from the callback.
+ * @param {Object} str Input string.
+ * @param {Object} callback Callback function taking one string argument and returning a string.
+ */
+ eachLine: function(str, callback)
+ {
+ var lines = str.split('\n');
+
+ for (var i = 0; i < lines.length; i++)
+ lines[i] = callback(lines[i]);
+
+ return lines.join('\n');
+ },
+
+ /**
+ * This is a special trim which only removes first and last empty lines
+ * and doesn't affect valid leading space on the first line.
+ *
+ * @param {String} str Input string
+ * @return {String} Returns string without empty first and last lines.
+ */
+ trimFirstAndLastLines: function(str)
+ {
+ return str.replace(/^[ ]*[\n]+|[\n]*[ ]*$/g, '');
+ },
+
+ /**
+ * Parses key/value pairs into hash object.
+ *
+ * Understands the following formats:
+ * - name: word;
+ * - name: [word, word];
+ * - name: "string";
+ * - name: 'string';
+ *
+ * For example:
+ * name1: value; name2: [value, value]; name3: 'value'
+ *
+ * @param {String} str Input string.
+ * @return {Object} Returns deserialized object.
+ */
+ parseParams: function(str)
+ {
+ var match,
+ result = {},
+ arrayRegex = new XRegExp("^\\[(?(.*?))\\]$"),
+ regex = new XRegExp(
+ "(?[\\w-]+)" +
+ "\\s*:\\s*" +
+ "(?" +
+ "[\\w-%#]+|" + // word
+ "\\[.*?\\]|" + // [] array
+ '".*?"|' + // "" string
+ "'.*?'" + // '' string
+ ")\\s*;?",
+ "g"
+ )
+ ;
+
+ while ((match = regex.exec(str)) != null)
+ {
+ var value = match.value
+ .replace(/^['"]|['"]$/g, '') // strip quotes from end of strings
+ ;
+
+ // try to parse array value
+ if (value != null && arrayRegex.test(value))
+ {
+ var m = arrayRegex.exec(value);
+ value = m.values.length > 0 ? m.values.split(/\s*,\s*/) : [];
+ }
+
+ result[match.name] = value;
+ }
+
+ return result;
+ },
+
+ /**
+ * Wraps each line of the string into tag with given style applied to it.
+ *
+ * @param {String} str Input string.
+ * @param {String} css Style name to apply to the string.
+ * @return {String} Returns input string with each line surrounded by tag.
+ */
+ decorate: function(str, css)
+ {
+ if (str == null || str.length == 0 || str == '\n')
+ return str;
+
+ // helixoft
+ // str = str.replace(/... ' + line + '';
+ });
+
+ return str;
+ },
+
+ /**
+ * Pads number with zeros until it's length is the same as given length.
+ *
+ * @param {Number} number Number to pad.
+ * @param {Number} length Max string length with.
+ * @return {String} Returns a string padded with proper amount of '0'.
+ */
+ padNumber : function(number, length)
+ {
+ var result = number.toString();
+
+ while (result.length < length)
+ result = '0' + result;
+
+ return result;
+ },
+
+ /**
+ * Measures width of a single space character.
+ * @return {Number} Returns width of a single space character.
+ */
+ measureSpace : function()
+ {
+ var container = document.createElement('div'),
+ span,
+ result = 0,
+ body = document.body,
+ id = sh.utils.guid('measureSpace'),
+
+ // variable names will be compressed, so it's better than a plain string
+ divOpen = 'regexList collection.
+ * @return {Array} Returns a list of Match objects.
+ */
+ getMatches: function(code, regexInfo)
+ {
+ function defaultAdd(match, regexInfo)
+ {
+ return [new sh.Match(match[0], match.index, regexInfo.css)];
+ };
+
+ var index = 0,
+ match = null,
+ result = [],
+ func = regexInfo.func ? regexInfo.func : defaultAdd
+ ;
+
+ while((match = regexInfo.regex.exec(code)) != null)
+ result = result.concat(func(match, regexInfo));
+
+ return result;
+ },
+
+ processUrls: function(code)
+ {
+ var lt = '<',
+ gt = '>'
+ ;
+
+ return code.replace(sh.regexLib.url, function(m)
+ {
+ var suffix = '', prefix = '';
+
+ // We include < and > in the URL for the common cases like ' + lineNumber + ' | ' : '')
+ + ''
+ + (spaces != null ? '' + spaces.replace(' ', ' ') + '' : '')
+ + line
+ + ' | '
+ + '
.*?)" +
+ "(?" + regexGroup.right.source + ")",
+ "sgi"
+ )
+ };
+ }
+}; // end of Highlighter
+
+return sh;
+}(); // end of anonymous function
+
+
+/**
+ * XRegExp 0.6.1
+ * (c) 2007-2008 Steven Levithan
+ *
+ * MIT License
+ *
+ * provides an augmented, cross-browser implementation of regular expressions
+ * including support for additional modifiers and syntax. several convenience
+ * methods and a recursive-construct parser are also included.
+ */
+
+// prevent running twice, which would break references to native globals
+if (!window.XRegExp) {
+// anonymous function to avoid global variables
+(function () {
+// copy various native globals for reference. can't use the name ``native``
+// because it's a reserved JavaScript keyword.
+var real = {
+ exec: RegExp.prototype.exec,
+ match: String.prototype.match,
+ replace: String.prototype.replace,
+ split: String.prototype.split
+ },
+ /* regex syntax parsing with support for all the necessary cross-
+ browser and context issues (escapings, character classes, etc.) */
+ lib = {
+ part: /(?:[^\\([#\s.]+|\\(?!k<[\w$]+>|[pP]{[^}]+})[\S\s]?|\((?=\?(?!#|<[\w$]+>)))+|(\()(?:\?(?:(#)[^)]*\)|<([$\w]+)>))?|\\(?:k<([\w$]+)>|[pP]{([^}]+)})|(\[\^?)|([\S\s])/g,
+ replaceVar: /(?:[^$]+|\$(?![1-9$&`']|{[$\w]+}))+|\$(?:([1-9]\d*|[$&`'])|{([$\w]+)})/g,
+ extended: /^(?:\s+|#.*)+/,
+ quantifier: /^(?:[?*+]|{\d+(?:,\d*)?})/,
+ classLeft: /&&\[\^?/g,
+ classRight: /]/g
+ },
+ indexOf = function (array, item, from) {
+ for (var i = from || 0; i < array.length; i++)
+ if (array[i] === item) return i;
+ return -1;
+ },
+ brokenExecUndef = /()??/.exec("")[1] !== undefined,
+ plugins = {};
+
+/**
+ * Accepts a pattern and flags, returns a new, extended RegExp object.
+ * differs from a native regex in that additional flags and syntax are
+ * supported and browser inconsistencies are ameliorated.
+ * @ignore
+ */
+XRegExp = function (pattern, flags) {
+ if (pattern instanceof RegExp) {
+ if (flags !== undefined)
+ throw TypeError("can't supply flags when constructing one RegExp from another");
+ return pattern.addFlags(); // new copy
+ }
+
+ var flags = flags || "",
+ singleline = flags.indexOf("s") > -1,
+ extended = flags.indexOf("x") > -1,
+ hasNamedCapture = false,
+ captureNames = [],
+ output = [],
+ part = lib.part,
+ match, cc, len, index, regex;
+
+ part.lastIndex = 0; // in case the last XRegExp compilation threw an error (unbalanced character class)
+
+ while (match = real.exec.call(part, pattern)) {
+ // comment pattern. this check must come before the capturing group check,
+ // because both match[1] and match[2] will be non-empty.
+ if (match[2]) {
+ // keep tokens separated unless the following token is a quantifier
+ if (!lib.quantifier.test(pattern.slice(part.lastIndex)))
+ output.push("(?:)");
+ // capturing group
+ } else if (match[1]) {
+ captureNames.push(match[3] || null);
+ if (match[3])
+ hasNamedCapture = true;
+ output.push("(");
+ // named backreference
+ } else if (match[4]) {
+ index = indexOf(captureNames, match[4]);
+ // keep backreferences separate from subsequent literal numbers
+ // preserve backreferences to named groups that are undefined at this point as literal strings
+ output.push(index > -1 ?
+ "\\" + (index + 1) + (isNaN(pattern.charAt(part.lastIndex)) ? "" : "(?:)") :
+ match[0]
+ );
+ // unicode element (requires plugin)
+ } else if (match[5]) {
+ output.push(plugins.unicode ?
+ plugins.unicode.get(match[5], match[0].charAt(1) === "P") :
+ match[0]
+ );
+ // character class opening delimiter ("[" or "[^")
+ // (non-native unicode elements are not supported within character classes)
+ } else if (match[6]) {
+ if (pattern.charAt(part.lastIndex) === "]") {
+ // for cross-browser compatibility with ECMA-262 v3 behavior,
+ // convert [] to (?!) and [^] to [\S\s].
+ output.push(match[6] === "[" ? "(?!)" : "[\\S\\s]");
+ part.lastIndex++;
+ } else {
+ // parse the character class with support for inner escapes and
+ // ES4's infinitely nesting intersection syntax ([&&[^&&[]]]).
+ cc = XRegExp.matchRecursive("&&" + pattern.slice(match.index), lib.classLeft, lib.classRight, "", {escapeChar: "\\"})[0];
+ output.push(match[6] + cc + "]");
+ part.lastIndex += cc.length + 1;
+ }
+ // dot ("."), pound sign ("#"), or whitespace character
+ } else if (match[7]) {
+ if (singleline && match[7] === ".") {
+ output.push("[\\S\\s]");
+ } else if (extended && lib.extended.test(match[7])) {
+ len = real.exec.call(lib.extended, pattern.slice(part.lastIndex - 1))[0].length;
+ // keep tokens separated unless the following token is a quantifier
+ if (!lib.quantifier.test(pattern.slice(part.lastIndex - 1 + len)))
+ output.push("(?:)");
+ part.lastIndex += len - 1;
+ } else {
+ output.push(match[7]);
+ }
+ } else {
+ output.push(match[0]);
+ }
+ }
+
+ regex = RegExp(output.join(""), real.replace.call(flags, /[sx]+/g, ""));
+ regex._x = {
+ source: pattern,
+ captureNames: hasNamedCapture ? captureNames : null
+ };
+ return regex;
+};
+
+/**
+ * Barebones plugin support for now (intentionally undocumented)
+ * @ignore
+ * @param {Object} name
+ * @param {Object} o
+ */
+XRegExp.addPlugin = function (name, o) {
+ plugins[name] = o;
+};
+
+/**
+ * Adds named capture support, with values returned as ``result.name``.
+ *
+ * Also fixes two cross-browser issues, following the ECMA-262 v3 spec:
+ * - captured values for non-participating capturing groups should be returned
+ * as ``undefined``, rather than the empty string.
+ * - the regex's ``lastIndex`` should not be incremented after zero-length
+ * matches.
+ * @ignore
+ */
+RegExp.prototype.exec = function (str) {
+ var match = real.exec.call(this, str),
+ name, i, r2;
+ if (match) {
+ // fix browsers whose exec methods don't consistently return
+ // undefined for non-participating capturing groups
+ if (brokenExecUndef && match.length > 1) {
+ // r2 doesn't need /g or /y, but they shouldn't hurt
+ r2 = new RegExp("^" + this.source + "$(?!\\s)", this.getNativeFlags());
+ real.replace.call(match[0], r2, function () {
+ for (i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === undefined) match[i] = undefined;
+ }
+ });
+ }
+ // attach named capture properties
+ if (this._x && this._x.captureNames) {
+ for (i = 1; i < match.length; i++) {
+ name = this._x.captureNames[i - 1];
+ if (name) match[name] = match[i];
+ }
+ }
+ // fix browsers that increment lastIndex after zero-length matches
+ if (this.global && this.lastIndex > (match.index + match[0].length))
+ this.lastIndex--;
+ }
+ return match;
+};
+})(); // end anonymous function
+} // end if(!window.XRegExp)
+
+/**
+ * intentionally undocumented
+ * @ignore
+ */
+RegExp.prototype.getNativeFlags = function () {
+ return (this.global ? "g" : "") +
+ (this.ignoreCase ? "i" : "") +
+ (this.multiline ? "m" : "") +
+ (this.extended ? "x" : "") +
+ (this.sticky ? "y" : "");
+};
+
+/**
+ * Accepts flags; returns a new XRegExp object generated by recompiling
+ * the regex with the additional flags (may include non-native flags).
+ * The original regex object is not altered.
+ * @ignore
+ */
+RegExp.prototype.addFlags = function (flags) {
+ var regex = new XRegExp(this.source, (flags || "") + this.getNativeFlags());
+ if (this._x) {
+ regex._x = {
+ source: this._x.source,
+ captureNames: this._x.captureNames ? this._x.captureNames.slice(0) : null
+ };
+ }
+ return regex;
+};
+
+/**
+ * Accepts a context object and string; returns the result of calling
+ * ``exec`` with the provided string. the context is ignored but is
+ * accepted for congruity with ``Function.prototype.call``.
+ * @ignore
+ */
+RegExp.prototype.call = function (context, str) {
+ return this.exec(str);
+};
+
+/**
+ * Accepts a context object and arguments array; returns the result of
+ * calling ``exec`` with the first value in the arguments array. the context
+ * is ignored but is accepted for congruity with ``Function.prototype.apply``.
+ * @ignore
+ */
+RegExp.prototype.apply = function (context, args) {
+ return this.exec(args[0]);
+};
+
+/**
+ * Accepts a pattern and flags; returns an XRegExp object. if the pattern
+ * and flag combination has previously been cached, the cached copy is
+ * returned, otherwise the new object is cached.
+ * @ignore
+ */
+XRegExp.cache = function (pattern, flags) {
+ var key = "/" + pattern + "/" + (flags || "");
+ return XRegExp.cache[key] || (XRegExp.cache[key] = new XRegExp(pattern, flags));
+};
+
+/**
+ * Accepts a string; returns the string with regex metacharacters escaped.
+ * the returned string can safely be used within a regex to match a literal
+ * string. escaped characters are [, ], {, }, (, ), -, *, +, ?, ., \, ^, $,
+ * |, #, [comma], and whitespace.
+ * @ignore
+ */
+XRegExp.escape = function (str) {
+ return str.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, "\\$&");
+};
+
+/**
+ * Accepts a string to search, left and right delimiters as regex pattern
+ * strings, optional regex flags (may include non-native s, x, and y flags),
+ * and an options object which allows setting an escape character and changing
+ * the return format from an array of matches to a two-dimensional array of
+ * string parts with extended position data. returns an array of matches
+ * (optionally with extended data), allowing nested instances of left and right
+ * delimiters. use the g flag to return all matches, otherwise only the first
+ * is returned. if delimiters are unbalanced within the subject data, an error
+ * is thrown.
+ *
+ * This function admittedly pushes the boundaries of what can be accomplished
+ * sensibly without a "real" parser. however, by doing so it provides flexible
+ * and powerful recursive parsing capabilities with minimal code weight.
+ *
+ * Warning: the ``escapeChar`` option is considered experimental and might be
+ * changed or removed in future versions of XRegExp.
+ *
+ * unsupported features:
+ * - backreferences within delimiter patterns when using ``escapeChar``.
+ * - although providing delimiters as regex objects adds the minor feature of
+ * independent delimiter flags, it introduces other limitations and is only
+ * intended to be done by the ``XRegExp`` constructor (which can't call
+ * itself while building a regex).
+ *
+ * @ignore
+ */
+XRegExp.matchRecursive = function (str, left, right, flags, options) {
+ var options = options || {},
+ escapeChar = options.escapeChar,
+ vN = options.valueNames,
+ flags = flags || "",
+ global = flags.indexOf("g") > -1,
+ ignoreCase = flags.indexOf("i") > -1,
+ multiline = flags.indexOf("m") > -1,
+ sticky = flags.indexOf("y") > -1,
+ /* sticky mode has its own handling in this function, which means you
+ can use flag "y" even in browsers which don't support it natively */
+ flags = flags.replace(/y/g, ""),
+ left = left instanceof RegExp ? (left.global ? left : left.addFlags("g")) : new XRegExp(left, "g" + flags),
+ right = right instanceof RegExp ? (right.global ? right : right.addFlags("g")) : new XRegExp(right, "g" + flags),
+ output = [],
+ openTokens = 0,
+ delimStart = 0,
+ delimEnd = 0,
+ lastOuterEnd = 0,
+ outerStart, innerStart, leftMatch, rightMatch, escaped, esc;
+
+ if (escapeChar) {
+ if (escapeChar.length > 1) throw SyntaxError("can't supply more than one escape character");
+ if (multiline) throw TypeError("can't supply escape character when using the multiline flag");
+ escaped = XRegExp.escape(escapeChar);
+ /* Escape pattern modifiers:
+ /g - not needed here
+ /i - included
+ /m - **unsupported**, throws error
+ /s - handled by XRegExp when delimiters are provided as strings
+ /x - handled by XRegExp when delimiters are provided as strings
+ /y - not needed here; supported by other handling in this function
+ */
+ esc = new RegExp(
+ "^(?:" + escaped + "[\\S\\s]|(?:(?!" + left.source + "|" + right.source + ")[^" + escaped + "])+)+",
+ ignoreCase ? "i" : ""
+ );
+ }
+
+ while (true) {
+ /* advance the starting search position to the end of the last delimiter match.
+ a couple special cases are also covered:
+ - if using an escape character, advance to the next delimiter's starting position,
+ skipping any escaped characters
+ - first time through, reset lastIndex in case delimiters were provided as regexes
+ */
+ left.lastIndex = right.lastIndex = delimEnd +
+ (escapeChar ? (esc.exec(str.slice(delimEnd)) || [""])[0].length : 0);
+
+ leftMatch = left.exec(str);
+ rightMatch = right.exec(str);
+
+ // only keep the result which matched earlier in the string
+ if (leftMatch && rightMatch) {
+ if (leftMatch.index <= rightMatch.index)
+ rightMatch = null;
+ else leftMatch = null;
+ }
+
+ /* paths*:
+ leftMatch | rightMatch | openTokens | result
+ 1 | 0 | 1 | ...
+ 1 | 0 | 0 | ...
+ 0 | 1 | 1 | ...
+ 0 | 1 | 0 | throw
+ 0 | 0 | 1 | throw
+ 0 | 0 | 0 | break
+ * - does not include the sticky mode special case
+ - the loop ends after the first completed match if not in global mode
+ */
+
+ if (leftMatch || rightMatch) {
+ delimStart = (leftMatch || rightMatch).index;
+ delimEnd = (leftMatch ? left : right).lastIndex;
+ } else if (!openTokens) {
+ break;
+ }
+
+ if (sticky && !openTokens && delimStart > lastOuterEnd)
+ break;
+
+ if (leftMatch) {
+ if (!openTokens++) {
+ outerStart = delimStart;
+ innerStart = delimEnd;
+ }
+ } else if (rightMatch && openTokens) {
+ if (!--openTokens) {
+ if (vN) {
+ if (vN[0] && outerStart > lastOuterEnd)
+ output.push([vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart]);
+ if (vN[1]) output.push([vN[1], str.slice(outerStart, innerStart), outerStart, innerStart]);
+ if (vN[2]) output.push([vN[2], str.slice(innerStart, delimStart), innerStart, delimStart]);
+ if (vN[3]) output.push([vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd]);
+ } else {
+ output.push(str.slice(innerStart, delimStart));
+ }
+ lastOuterEnd = delimEnd;
+ if (!global)
+ break;
+ }
+ } else {
+ // reset lastIndex in case delimiters were provided as regexes
+ left.lastIndex = right.lastIndex = 0;
+ throw Error("subject data contains unbalanced delimiters");
+ }
+
+ // if the delimiter matched an empty string, advance delimEnd to avoid an infinite loop
+ if (delimStart === delimEnd)
+ delimEnd++;
+ }
+
+ if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd)
+ output.push([vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length]);
+
+ // reset lastIndex in case delimiters were provided as regexes
+ left.lastIndex = right.lastIndex = 0;
+
+ return output;
+};
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/src/shLegacy.js b/API_NetFramework/VSdoc/SyntaxHighlighter/src/shLegacy.js
new file mode 100644
index 00000000..21490c4d
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/src/shLegacy.js
@@ -0,0 +1,172 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+var dp = {
+ SyntaxHighlighter : {}
+};
+
+dp.SyntaxHighlighter = {
+ parseParams: function(
+ input,
+ showGutter,
+ showControls,
+ collapseAll,
+ firstLine,
+ showColumns
+ )
+ {
+ function getValue(list, name)
+ {
+ var regex = new XRegExp('^' + name + '\\[(?\\w+)\\]$', 'gi'),
+ match = null
+ ;
+
+ for (var i = 0; i < list.length; i++)
+ if ((match = regex.exec(list[i])) != null)
+ return match.value;
+
+ return null;
+ };
+
+ function defaultValue(value, def)
+ {
+ return value != null ? value : def;
+ };
+
+ function asString(value)
+ {
+ return value != null ? value.toString() : null;
+ };
+
+ var parts = input.split(':'),
+ brushName = parts[0],
+ options = {},
+ straight = { 'true' : 'true' }
+ reverse = { 'true' : 'false' },
+ result = null,
+ defaults = SyntaxHighlighter.defaults
+ ;
+
+ for (var i in parts)
+ options[parts[i]] = 'true';
+
+ showGutter = asString(defaultValue(showGutter, defaults.gutter));
+ showControls = asString(defaultValue(showControls, defaults.toolbar));
+ collapseAll = asString(defaultValue(collapseAll, defaults.collapse));
+ showColumns = asString(defaultValue(showColumns, defaults.ruler));
+ firstLine = asString(defaultValue(firstLine, defaults['first-line']));
+
+ result = {
+ brush : brushName,
+ gutter : defaultValue(reverse[options.nogutter], showGutter),
+ toolbar : defaultValue(reverse[options.nocontrols], showControls),
+ collapse : defaultValue(straight[options.collapse], collapseAll),
+ ruler : defaultValue(straight[options.showcolumns], showColumns),
+ 'first-line' : defaultValue(getValue(parts, 'firstline'), firstLine)
+ };
+
+ return result;
+ },
+
+ HighlightAll: function(
+ name,
+ showGutter /* optional */,
+ showControls /* optional */,
+ collapseAll /* optional */,
+ firstLine /* optional */,
+ showColumns /* optional */
+ )
+ {
+ function findValue()
+ {
+ var a = arguments;
+
+ for (var i = 0; i < a.length; i++)
+ {
+ if (a[i] === null)
+ continue;
+
+ if (typeof(a[i]) == 'string' && a[i] != '')
+ return a[i] + '';
+
+ if (typeof(a[i]) == 'object' && a[i].value != '')
+ return a[i].value + '';
+ }
+
+ return null;
+ };
+
+ function findTagsByName(list, name, tagName)
+ {
+ var tags = document.getElementsByTagName(tagName);
+
+ for (var i = 0; i < tags.length; i++)
+ if (tags[i].getAttribute('name') == name)
+ list.push(tags[i]);
+ }
+
+ var elements = [],
+ highlighter = null,
+ registered = {},
+ propertyName = 'innerHTML'
+ ;
+
+ // for some reason IE doesn't find by name, however it does see them just fine by tag name...
+ findTagsByName(elements, name, 'pre');
+ findTagsByName(elements, name, 'textarea');
+
+ if (elements.length === 0)
+ return;
+
+ for (var i = 0; i < elements.length; i++)
+ {
+ var element = elements[i],
+ params = findValue(
+ element.attributes['class'], element.className,
+ element.attributes['language'], element.language
+ ),
+ language = ''
+ ;
+
+ if (params === null)
+ continue;
+
+ params = dp.SyntaxHighlighter.parseParams(
+ params,
+ showGutter,
+ showControls,
+ collapseAll,
+ firstLine,
+ showColumns
+ );
+
+ SyntaxHighlighter.highlight(params, element);
+ }
+ }
+};
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/help.png b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/help.png
new file mode 100644
index 00000000..5c870176
Binary files /dev/null and b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/help.png differ
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/magnifier.png b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/magnifier.png
new file mode 100644
index 00000000..cf3d97f7
Binary files /dev/null and b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/magnifier.png differ
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/page_white_code.png b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/page_white_code.png
new file mode 100644
index 00000000..0c76bd12
Binary files /dev/null and b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/page_white_code.png differ
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/page_white_copy.png b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/page_white_copy.png
new file mode 100644
index 00000000..a9f31a27
Binary files /dev/null and b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/page_white_copy.png differ
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/printer.png b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/printer.png
new file mode 100644
index 00000000..a350d187
Binary files /dev/null and b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/printer.png differ
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shCore.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shCore.css
new file mode 100644
index 00000000..42062b4d
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shCore.css
@@ -0,0 +1,330 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+.syntaxhighlighter,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody
+{
+ margin: 0 !important;
+ padding: 0 !important;
+ border: 0 !important;
+ outline: 0 !important;
+ background: none !important;
+ text-align: left !important;
+ float: none !important;
+ vertical-align: baseline !important;
+ position: static !important;
+ left: auto !important;
+ top: auto !important;
+ right: auto !important;
+ bottom: auto !important;
+ height: auto !important;
+ width: auto !important;
+ line-height: 1.1em !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important; /* For IE8, FF & WebKit */
+ min-height: auto !important; /* For IE7 */
+}
+
+.syntaxhighlighter
+{
+ width: 99% !important; /* 99% fixes IE8 horizontal scrollbar */
+ margin: 1em 0 1em 0 !important;
+ padding: 1px !important; /* adds a little border on top and bottom */
+ position: relative !important;
+}
+
+.syntaxhighlighter .bold
+{
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter .italic
+{
+ font-style: italic !important;
+}
+
+.syntaxhighlighter .line
+{
+}
+
+.syntaxhighlighter .no-wrap .line .content
+{
+ white-space: pre !important;
+}
+
+.syntaxhighlighter .line table
+{
+ border-collapse: collapse !important;
+}
+
+.syntaxhighlighter .line td
+{
+ vertical-align: top !important;
+}
+
+.syntaxhighlighter .line .number
+{
+ width: 3em !important;
+}
+
+.syntaxhighlighter .line .number code
+{
+ width: 2.7em !important;
+ padding-right: .3em !important;
+ text-align: right !important;
+ display: block !important;
+}
+
+.syntaxhighlighter .line .content
+{
+ padding-left: .5em !important;
+}
+
+.syntaxhighlighter .line .spaces
+{
+}
+
+/* Disable border and margin on the lines when no gutter option is set */
+.syntaxhighlighter.nogutter .line .content
+{
+ border-left: none !important;
+}
+
+.syntaxhighlighter .bar
+{
+ display: none !important;
+}
+
+.syntaxhighlighter .bar.show
+{
+ display: block !important;
+}
+
+.syntaxhighlighter.collapsed .bar
+{
+ display: block !important;
+}
+
+/* Adjust some properties when collapsed */
+
+.syntaxhighlighter.collapsed .lines
+{
+ display: none !important;
+}
+
+.syntaxhighlighter .lines.no-wrap
+{
+ overflow: auto !important;
+ overflow-y: hidden !important;
+}
+
+/* Styles for the toolbar */
+
+.syntaxhighlighter .toolbar
+{
+ position: absolute !important;
+ right: 0px !important;
+ top: 0px !important;
+ font-size: 1px !important;
+ padding: 8px 8px 8px 0 !important; /* in px because images don't scale with ems */
+}
+
+.syntaxhighlighter.collapsed .toolbar
+{
+ font-size: 80% !important;
+ padding: .2em 0 .5em .5em !important;
+ position: static !important;
+}
+
+.syntaxhighlighter .toolbar a.item,
+.syntaxhighlighter .toolbar .item
+{
+ display: block !important;
+ float: left !important;
+ margin-left: 8px !important;
+ background-repeat: no-repeat !important;
+ overflow: hidden !important;
+ text-indent: -5000px !important;
+}
+
+.syntaxhighlighter.collapsed .toolbar .item
+{
+ display: none !important;
+}
+
+.syntaxhighlighter.collapsed .toolbar .item.expandSource
+{
+ background-image: url(magnifier.png) !important;
+ display: inline !important;
+ text-indent: 0 !important;
+ width: auto !important;
+ float: none !important;
+ height: 16px !important;
+ padding-left: 20px !important;
+}
+
+.syntaxhighlighter .toolbar .item.viewSource
+{
+ background-image: url(page_white_code.png) !important;
+}
+
+.syntaxhighlighter .toolbar .item.printSource
+{
+ background-image: url(printer.png) !important;
+}
+
+.syntaxhighlighter .toolbar .item.copyToClipboard
+{
+ text-indent: 0 !important;
+ background: none !important;
+ overflow: visible !important;
+}
+
+.syntaxhighlighter .toolbar .item.about
+{
+ background-image: url(help.png) !important;
+}
+
+/**
+ * Print view.
+ * Colors are based on the default theme without background.
+ */
+
+.syntaxhighlighter.printing,
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content,
+{
+ background: none !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter.printing .line .number
+{
+ color: #bbb !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter.printing .line .content
+{
+ color: #000 !important;
+}
+
+/* Toolbar when visible */
+.syntaxhighlighter.printing .toolbar
+{
+ display: none !important;
+}
+
+.syntaxhighlighter.printing a
+{
+ text-decoration: none !important;
+}
+
+.syntaxhighlighter.printing .plain,
+.syntaxhighlighter.printing .plain a
+{
+ color: #000 !important;
+}
+
+.syntaxhighlighter.printing .comments,
+.syntaxhighlighter.printing .comments a
+{
+ color: #008200 !important;
+}
+
+.syntaxhighlighter.printing .string,
+.syntaxhighlighter.printing .string a
+{
+ color: blue !important;
+}
+
+.syntaxhighlighter.printing .keyword
+{
+ color: #069 !important;
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter.printing .preprocessor
+{
+ color: gray !important;
+}
+
+.syntaxhighlighter.printing .variable
+{
+ color: #a70 !important;
+}
+
+.syntaxhighlighter.printing .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter.printing .functions
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter.printing .constants
+{
+ color: #0066CC !important;
+}
+
+.syntaxhighlighter.printing .script
+{
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter.printing .color1,
+.syntaxhighlighter.printing .color1 a
+{
+ color: #808080 !important;
+}
+
+.syntaxhighlighter.printing .color2,
+.syntaxhighlighter.printing .color2 a
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter.printing .color3,
+.syntaxhighlighter.printing .color3 a
+{
+ color: red !important;
+}
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeDefault.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeDefault.css
new file mode 100644
index 00000000..3fef10d2
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeDefault.css
@@ -0,0 +1,173 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+/************************************
+ * Default Syntax Highlighter theme.
+ *
+ * Interface elements.
+ ************************************/
+
+.syntaxhighlighter
+{
+ background-color: #fff !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ color: black !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2
+{
+ background-color: #e0e0e0 !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #afafaf !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 3px solid #6CE26C !important;
+ color: #000 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1
+{
+ background-color: #fff !important;
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2
+{
+ background-color: #F8F8F8 !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #F8F8F8 !important;
+ border: #E7E5DC solid 1px !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #a0a0a0 !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: red !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #000 !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: #008200 !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: blue !important;
+}
+
+.syntaxhighlighter .keyword
+{
+ color: #069 !important;
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: gray !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #a70 !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #0066CC !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: yellow !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #808080 !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: red !important;
+}
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeDjango.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeDjango.css
new file mode 100644
index 00000000..80a8b41b
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeDjango.css
@@ -0,0 +1,176 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+/**
+ * Django SyntaxHighlighter theme
+ */
+
+/************************************
+ * Interface elements.
+ ************************************/
+
+.syntaxhighlighter
+{
+ background-color: #0B2F20 !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #497958 !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 3px solid #41A83E !important;
+ color: #B9BDB6 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1
+{
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2
+{
+ background-color: #0a2b1d !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ background-color: #336442 !important;
+ color: #fff !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2
+{
+ background-color: #336442 !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #245032 !important;
+ border: #0B2F20 solid 1px !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #C4B14A !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: #FFE862 !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #F8F8F8 !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: #336442 !important;
+ font-style: italic !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: #9DF39F !important;
+}
+
+.syntaxhighlighter .keyword
+{
+ color: #96DD3B !important;
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: #91BB9E !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #FFAA3E !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #F7E741 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #FFAA3E !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #E0E8FF !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: #497958 !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #EB939A !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #91BB9E !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: #EDEF7D !important;
+}
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeEclipse.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeEclipse.css
new file mode 100644
index 00000000..b9cfba07
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeEclipse.css
@@ -0,0 +1,190 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+/**
+ * Eclipse IDE SyntaxHighlighter color theme
+ * (C) Code-House
+ * http://blog.code-house.org/2009/10/xml-i-adnotacje-kod-ogolnego-przeznaczenia-i-jpa/
+ */
+
+.syntaxhighlighter
+{
+ background-color: #fff !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ background-color: #c3defe !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2
+{
+ background-color: #c3defe !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #787878 !important;
+ background-color: #fff !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 1px solid #d4d0c8 !important;
+ color: #000 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1
+{
+ background-color: #fff !important;
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2
+{
+ background-color: #fff !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #F8F8F8 !important;
+ border: #E7E5DC solid 1px !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #a0a0a0 !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: red !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #000 !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: #3f5fbf !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: #2a00ff !important;
+}
+
+.syntaxhighlighter .keyword
+{
+ color: #7f0055 !important;
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: #646464 !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #a70 !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #0066CC !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: yellow !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #808080 !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: red !important;
+}
+
+
+.xml .keyword {
+ color: #3f7f7f !important;
+ font-weight: normal !important;
+}
+
+.xml .color1,
+.xml .color1 a{
+ color: #7f007f !important;
+}
+
+.xml .string {
+ font-style: italic !important;
+ color: #2a00ff !important;
+}
\ No newline at end of file
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeEmacs.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeEmacs.css
new file mode 100644
index 00000000..ee940c99
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeEmacs.css
@@ -0,0 +1,175 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+/**
+ * Emacs SyntaxHighlighter theme based on theme by Joshua Emmons
+ * http://www.skia.net/
+ */
+
+/************************************
+ * Interface elements.
+ ************************************/
+
+.syntaxhighlighter
+{
+ background-color: #000000 !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #D3D3D3 !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 3px solid #990000 !important;
+ color: #B9BDB6 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1
+{
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2
+{
+ background-color: #0f0f0f !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ background-color: #435A5F !important;
+ color: #fff !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2
+{
+ background-color: #435A5F !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #000000 !important;
+ border: #000000 solid 1px !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #646763 !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: #9CCFF4 !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #D3D3D3 !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: #FF7D27 !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: #FF9E7B !important;
+}
+
+.syntaxhighlighter .keyword
+{
+ color: #00FFFF !important;
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: #AEC4DE !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #FFAA3E !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #81CEF9 !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #FF9E7B !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: #990000 !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #EBDB8D !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #FF7D27 !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: #AEC4DE !important;
+}
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeFadeToGrey.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeFadeToGrey.css
new file mode 100644
index 00000000..879b474c
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeFadeToGrey.css
@@ -0,0 +1,177 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+/**
+ * Fade to Grey SyntaxHighlighter theme based on theme by Brasten Sager
+ * http://www.ibrasten.com/
+ */
+
+/************************************
+ * Interface elements.
+ ************************************/
+
+.syntaxhighlighter
+{
+ background-color: #121212 !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #C3C3C3 !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 3px solid #3185B9 !important;
+ color: #B9BDB6 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1
+{
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2
+{
+ background-color: #000000 !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ background-color: #3A3A00 !important;
+ color: #fff !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2
+{
+ background-color: #3A3A00 !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #000000 !important;
+ border: #000000 solid 1px !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #808080 !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: #96DAFF !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #FFFFFF !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: #696854 !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: #E3E658 !important;
+}
+
+.syntaxhighlighter .keyword
+{
+ color: #D01D33 !important;
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: #435A5F !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #898989 !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #AAAAAA !important;
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #96DAFF !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: #C3C3C3 !important;
+ color: #000 !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #FFC074 !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #4A8CDB !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: #96DAFF !important;
+}
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeMidnight.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeMidnight.css
new file mode 100644
index 00000000..faf61854
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeMidnight.css
@@ -0,0 +1,175 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+/**
+ * Midnight SyntaxHighlighter theme based on theme by J.D. Myers
+ * http://webdesign.lsnjd.com/
+ */
+
+/************************************
+ * Interface elements.
+ ************************************/
+
+.syntaxhighlighter
+{
+ background-color: #0F192A !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #38566F !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 3px solid #435A5F !important;
+ color: #B9BDB6 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1
+{
+ background-color: #0F192A !important;
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2
+{
+ background-color: #0F192A !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ background-color: #253E5A !important;
+ color: #fff !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2
+{
+ background-color: #253E5A !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #0F192A !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #38566F !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: #8AA6C1 !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #D1EDFF !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: #428BDD !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: #1DC116 !important;
+}
+
+.syntaxhighlighter .keyword
+{
+ color: #B43D3D !important;
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: #8AA6C1 !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #FFAA3E !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #F7E741 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #FFAA3E !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #E0E8FF !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: #404040 !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #F8BB00 !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #FFFFFF !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: #FFAA3E !important;
+}
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeMsdnLW.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeMsdnLW.css
new file mode 100644
index 00000000..e4f0f057
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeMsdnLW.css
@@ -0,0 +1,209 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+
+/************************************
+ * MSDN lightweight Syntax Highlighter theme.
+ *
+ * by Helixoft
+ ************************************/
+
+.syntaxhighlighter,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody
+{
+ line-height: normal !important;
+ font-family: Consolas,Courier,monospace !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+}
+
+.syntaxhighlighter
+{
+ margin: 0.3em 0 0.4em 0 !important;
+}
+
+
+.syntaxhighlighter
+{
+ background-color: transparent !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ color: black !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2
+{
+ background-color: #e0e0e0 !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #afafaf !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 0px !important;
+ color: #000 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1
+{
+ background-color: transparent !important;
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2
+{
+ background-color: transparent !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #F8F8F8 !important;
+ border: #E7E5DC solid 1px !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #a0a0a0 !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: red !important;
+}
+
+
+.syntaxhighlighter a,
+.syntaxhighlighter a:link,
+.syntaxhighlighter a:visited
+{
+ text-decoration: underline !important;
+ color: #0000FF !important;
+}
+
+.syntaxhighlighter a:hover
+{
+ text-decoration: none !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #000 !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: rgb(0,128,0) !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: rgb(163,21,21) !important;
+}
+
+.syntaxhighlighter .keyword,
+.syntaxhighlighter .keyword a
+{
+ color: #0000FF !important;
+ /*font-weight: bold !important;*/
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: #0000FF !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #a70 !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #000 !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #0066CC !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: yellow !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #0000FF !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: red !important;
+}
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeRDark.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeRDark.css
new file mode 100644
index 00000000..e87cdc1e
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeRDark.css
@@ -0,0 +1,175 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+/**
+ * RDark SyntaxHighlighter theme based on theme by Radu Dineiu
+ * http://www.vim.org/scripts/script.php?script_id=1732
+ */
+
+/************************************
+ * Interface elements.
+ ************************************/
+
+.syntaxhighlighter
+{
+ background-color: #1B2426 !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #B9BDB6 !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 3px solid #435A5F !important;
+ color: #B9BDB6 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1
+{
+ background-color: #1B2426 !important;
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2
+{
+ background-color: #1B2426 !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ background-color: #435A5F !important;
+ color: #fff !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2
+{
+ background-color: #435A5F !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #1B2426 !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #646763 !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: #E0E8FF !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #B9BDB6 !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: #878A85 !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: #5CE638 !important;
+}
+
+.syntaxhighlighter .keyword
+{
+ color: #5BA1CF !important;
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: #435A5F !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #FFAA3E !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #FFAA3E !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #E0E8FF !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: #435A5F !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #E0E8FF !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #FFFFFF !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: #FFAA3E !important;
+}
diff --git a/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeVS.css b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeVS.css
new file mode 100644
index 00000000..50ba9d95
--- /dev/null
+++ b/API_NetFramework/VSdoc/SyntaxHighlighter/styles/shThemeVS.css
@@ -0,0 +1,208 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.1.364 (October 15 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+
+/************************************
+ * Visual Studio Syntax Highlighter theme.
+ *
+ * by Helixoft
+ ************************************/
+
+.syntaxhighlighter,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody
+{
+ font-family: Monospace, Courier New, Courier !important;
+ line-height: normal !important;
+}
+
+.syntaxhighlighter
+{
+ font-size: 105% !important;
+ margin: 0.3em 0 0.4em 0 !important;
+}
+
+
+.syntaxhighlighter
+{
+ background-color: transparent !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ color: black !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2
+{
+ background-color: #e0e0e0 !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #afafaf !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 0px !important;
+ color: #000 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1
+{
+ background-color: transparent !important;
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2
+{
+ background-color: transparent !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #F8F8F8 !important;
+ border: #E7E5DC solid 1px !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #a0a0a0 !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: red !important;
+}
+
+
+.syntaxhighlighter a,
+.syntaxhighlighter a:link,
+.syntaxhighlighter a:visited
+{
+ text-decoration: underline !important;
+ color: #0000FF !important;
+}
+
+.syntaxhighlighter a:hover
+{
+ text-decoration: none !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #000 !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: rgb(0,128,0) !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: rgb(163,21,21) !important;
+}
+
+.syntaxhighlighter .keyword,
+.syntaxhighlighter .keyword a
+{
+ color: #0000FF !important;
+ /*font-weight: bold !important;*/
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: #0000FF !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #a70 !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #000 !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #0066CC !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: yellow !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #0000FF !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: red !important;
+}
diff --git a/API_NetFramework/VSdoc/index.html b/API_NetFramework/VSdoc/index.html
new file mode 100644
index 00000000..4ae448fd
--- /dev/null
+++ b/API_NetFramework/VSdoc/index.html
@@ -0,0 +1,14 @@
+
+
+
+ Default page
+
+
+
+
+
+
+ Go to default page
+
+
+
\ No newline at end of file
diff --git a/API_NetFramework/VSdoc/index.html_rename b/API_NetFramework/VSdoc/index.html_rename
new file mode 100644
index 00000000..4ae448fd
--- /dev/null
+++ b/API_NetFramework/VSdoc/index.html_rename
@@ -0,0 +1,14 @@
+
+
+
+ Default page
+
+
+
+
+
+
+ Go to default page
+
+
+
\ No newline at end of file
diff --git a/API_NetFramework/VSdoc/msdn2019/chm_msdn2019.css b/API_NetFramework/VSdoc/msdn2019/chm_msdn2019.css
new file mode 100644
index 00000000..2cefe14c
--- /dev/null
+++ b/API_NetFramework/VSdoc/msdn2019/chm_msdn2019.css
@@ -0,0 +1,141 @@
+/* CHM (IE11) overrides for msdn2019.css */
+
+/*********** Apply the values of the CSS variables from msdn2019.css explicitly. The CSS variables are not supported in IE 11 used by CHM viewer. */
+/*#region Common */
+
+a {
+ color: #1364c4;
+}
+
+a:visited {
+ color: #1364c4;
+}
+
+/*#endregion Common */
+
+
+
+/*#region HEADER */
+
+
+#header-top-container {
+ background-color: #e3e3e3;
+}
+
+/*#endregion HEADER end */
+
+
+.metadata {
+ color: #5e5e5e;
+}
+
+
+div#footer {
+ background-color: #e3e3e3;
+}
+
+.alert {
+ background-color: #d7eaf8;
+ border: 1px solid #d7eaf8;
+}
+
+/*#region Tables in main text */
+
+div#mainSection table {
+ border: 1px #cccccc solid;
+}
+
+
+div#mainSection table th {
+ border: 1px #cccccc solid;
+ background-color: #e3e3e3;
+}
+
+div#mainSection table td {
+ border: 1px #cccccc solid;
+}
+
+
+/* members list table, no vertical borders*/
+
+div#mainSection table.memberListTable {
+ border-top: 0px #e3e3e3 none;
+ border-bottom: 1px #e3e3e3 solid;
+ border-left: 0px #e3e3e3 none;
+ border-right: 0px #e3e3e3 none;
+}
+
+div#mainSection table.memberListTable th {
+ border-top: 0px #e3e3e3 none;
+ border-bottom: 1px #e3e3e3 solid;
+ border-left: 0px #e3e3e3 none;
+ border-right: 0px #e3e3e3 none;
+}
+
+div #mainSection table.memberListTable td {
+ border-top: 1px #e3e3e3 solid;
+ border-bottom: 1px #e3e3e3 solid;
+ border-left: 0px #e3e3e3 none;
+ border-right: 0px #e3e3e3 none;
+}
+
+
+
+/*#endregion */
+
+
+/*#region Code snippets */
+
+.codeSnippetTabs {
+ height: 1.5rem;
+}
+
+.codeSnippetTab {
+ height: 1.5rem;
+ border-top: 1px solid #e3e3e3;
+ border-bottom: 0px none #e3e3e3;
+ border-left: 1px solid #e3e3e3;
+}
+
+.csFirstTab {
+ border-left: 0px solid #e3e3e3;
+}
+
+.codeSnippetTabLeftCorner, .codeSnippetTabLeftCornerActive {
+ height: 1.5rem;
+ border-top: 1px solid #e3e3e3;
+ border-bottom: 0px none #e3e3e3;
+ border-left: 1px solid #e3e3e3;
+}
+
+.codeSnippetTabRightCorner, .codeSnippetTabRightCornerActive {
+ height: 1.5rem;
+ border-top: 1px solid #e3e3e3;
+ border-bottom: 0px none #e3e3e3;
+ border-right: 1px solid #e3e3e3;
+}
+
+.codeSnippetCodeCollection {
+ border-top: solid 1px #e3e3e3;
+ border-right: solid 1px #e3e3e3;
+ border-bottom: solid 1px #e3e3e3;
+ border-left: solid 1px #e3e3e3;
+}
+
+.codeSnippetToolbar {
+ top: calc(1.5rem * -1);
+}
+
+
+/*#endregion Code snippets */
+
+
+
+/************ Hide breadcrumbs */
+#header-breadcrumbs {
+ display:none;
+}
+
+#headerLinks {
+ display: none;
+}
diff --git a/API_NetFramework/VSdoc/msdn2019/chm_msdn2019.js b/API_NetFramework/VSdoc/msdn2019/chm_msdn2019.js
new file mode 100644
index 00000000..0b3b77b7
--- /dev/null
+++ b/API_NetFramework/VSdoc/msdn2019/chm_msdn2019.js
@@ -0,0 +1,993 @@
+// #region PAGE INIT ***********************
+
+
+// Event handler attachment
+function registerEventHandler(element, event, handler) {
+ if (element.addEventListener) {
+ element.addEventListener(event, handler, false);
+ } else if (element.attachEvent) {
+ element.attachEvent('on' + event, handler);
+ } else {
+ element[event] = handler;
+ }
+}
+
+
+// Event handler detachment
+function unregisterEventHandler(element, event, handler) {
+ if (typeof element.removeEventListener === "function")
+ element.removeEventListener(event, handler, false);
+ else
+ element.detachEvent("on" + event, handler);
+}
+
+/**
+ * Scroll handler.
+ * @type {function()}
+ */
+function scrollHandler() {
+ inPageTocElementMakeStickyOnScroll();
+}
+
+
+registerEventHandler(window, 'load', init);
+registerEventHandler(window, 'scroll', scrollHandler);
+
+
+/**
+ * Internal in-page sections TOC.
+ * */
+var inPageToc;
+
+
+function init() {
+ try {
+ fixMoniker();
+ mergeCodeSnippets();
+ loadLangFilter();
+ showSelectedLanguages();
+ inPageToc = new InternalToc(); // generate in-page TOC
+ inPageTocElementInitSticky();
+ }
+ catch (e) {
+ var msg = e.message;
+ if (e.stack) {
+ msg = msg + "/n" + e.stack;
+ }
+ (console.error || console.log).call(console, msg);
+ }
+}
+
+
+// #endregion PAGE INIT ***********************
+
+
+// #region INTERNAL TOC **********************
+
+// position:sticky polyfill for IE 11
+
+/**
+ * Initialize position:sticky for #internal-toc-container.stickthis element.
+ * */
+function inPageTocElementInitSticky() {
+ inPageTocElement = document.querySelector('#internal-toc-container.stickthis');
+ inPageTocElementOffset = inPageTocElement.getBoundingClientRect();
+}
+
+var inPageTocElement;
+var inPageTocElementOffset;
+
+/**
+ * Simulate position:sticky for #internal-toc-container.stickthis element.
+ * */
+function inPageTocElementMakeStickyOnScroll() {
+ if (window.pageYOffset > inPageTocElementOffset.top) {
+ inPageTocElement.style.position = 'fixed';
+ inPageTocElement.style.top = 0;
+ } else {
+ inPageTocElement.style.position = 'relative';
+ inPageTocElement.style.top = '';
+ }
+}
+
+// #endregion INTERNAL TOC **********************
+
+
+// #region EXPAND / COLLAPSE SECTION *********************
+
+function toggleSection(sectionLinkElm) {
+ var sectionDiv = sectionLinkElm.parentNode.parentNode.parentNode;
+ if (hasElementClass(sectionDiv, "collapsed")) {
+ expandSection(sectionLinkElm);
+ } else {
+ collapseSection(sectionLinkElm);
+ }
+}
+
+function expandSection(sectionLinkElm) {
+ var sectionDiv = sectionLinkElm.parentNode.parentNode.parentNode;
+ removeClassFromElement(sectionDiv, "collapsed");
+ sectionLinkElm.setAttribute("title", "Collapse");
+}
+
+function collapseSection(sectionLinkElm) {
+ var sectionDiv = sectionLinkElm.parentNode.parentNode.parentNode;
+ addClassToElement(sectionDiv, "collapsed");
+ sectionLinkElm.setAttribute("title", "Expand");
+}
+
+// #endregion EXPAND / COLLAPSE SECTION ***********************
+
+
+
+// #region CODE SNIPPETS **********************
+
+/**
+ * Merges adjacent code snippets in different languages into
+ * single code collection with tabs.
+ */
+function mergeCodeSnippets() {
+ var allNodes = getElementAndTextNodes(document.body);
+ var parentCodeSnippet = null;
+ var i;
+
+ for (i = 0; i < allNodes.length; i++) {
+ var currentNode = allNodes[i];
+
+ var nextNode;
+ if (!parentCodeSnippet) {
+ // look for the first code snippet which will be a parent
+ if (hasElementClass(currentNode, "codeSnippetContainer")) {
+ parentCodeSnippet = currentNode;
+ // snippet found, move after it
+ nextNode = getNextNonChildElementOrTextNode(parentCodeSnippet);
+ while (allNodes[++i] !== nextNode && i < allNodes.length) { /*empty*/ }
+ i--;
+ }
+
+ } else {
+ // look for the next ADJACENT code snippet
+ if (hasElementClass(currentNode, "codeSnippetContainer")) {
+ // merge it with the parent
+ mergeTwoCodeSnippets(parentCodeSnippet, currentNode);
+ // move after adjacent snippet
+ nextNode = getNextNonChildElementOrTextNode(currentNode);
+ while (allNodes[++i] !== nextNode && i < allNodes.length) { /*empty*/ }
+ i--;
+ } else {
+ // or look for the non-whitespace text
+ if (currentNode.nodeType === TEXT_NODE || currentNode.nodeType === CDATA_SECTION_NODE) {
+ if (currentNode.nodeValue.trim() !== "") {
+ // found non empty text after parent snippet, don't merge and find next parent
+ parentCodeSnippet = null;
+ }
+ }
+ }
+ }
+
+ }
+}
+
+
+var ELEMENT_NODE = 1;
+var TEXT_NODE = 3;
+var CDATA_SECTION_NODE = 4;
+
+/**
+ * Returns all elements and text nodes under the root.
+ * Recursion is not used due to performance reasons.
+ *
+ * @param {HTMLElement} root - The root node.
+ * @returns {Array} All elements and text nodes under the root.
+ */
+function getElementAndTextNodes(root) {
+ var result = [];
+
+ var node = root.childNodes[0];
+ while (node !== null) {
+ switch (node.nodeType) {
+ case ELEMENT_NODE:
+ case TEXT_NODE:
+ case CDATA_SECTION_NODE:
+ result.push(node);
+ break;
+ }
+
+ if (node.hasChildNodes()) {
+ node = node.firstChild;
+ }
+ else {
+ while (node.nextSibling === null && node !== root) {
+ node = node.parentNode;
+ }
+ node = node.nextSibling;
+ }
+ }
+
+ return result;
+}
+
+
+/**
+ * Merges two separate snippets together. The child snippet
+ * becomes a part of the parent snippet. Tabs and visibility
+ * are adjusted accordingly.
+ * @param {Node} parentSnippet The parent snippet to merge.
+ * @param {Node} childSnippet The child snippet to merge.
+ */
+function mergeTwoCodeSnippets(parentSnippet, childSnippet) {
+ var childCode = getDivWithClass(childSnippet, "codeSnippetCode");
+ var parentCodeCollection = getDivWithClass(parentSnippet, "codeSnippetCodeCollection");
+ if (childCode && parentCodeCollection) {
+ // remove existing lang code in parent, if any
+ var lang = getLangOfCodeSnippetCode(childCode);
+ if (lang) {
+ var existingCode = getCodeSnippetCodeByLang(parentSnippet, lang);
+ if (existingCode) {
+ existingCode.parentNode.removeChild(existingCode);
+ }
+ }
+ // move child code to the parent
+ childCode.parentNode.removeChild(childCode);
+ parentCodeCollection.appendChild(childCode);
+ showHideTag(childSnippet, false);
+
+ // correct the tabs (bold or normal for N/A lang)
+ var csCode, tab, i;
+ var tabsDiv = getDivWithClass(parentSnippet, "codeSnippetTabs");
+ var langs = ["codeVB", "codeCsharp", "codeCpp", "codeFsharp", "codeJScript"];
+
+ for (i = 0; i < langs.length; i++) {
+ lang = langs[i];
+ csCode = getCodeSnippetCodeByLang(parentCodeCollection, lang);
+ tab = getDivWithClass(tabsDiv, lang);
+ if (csCode) {
+ // lang exists
+ removeClassFromElement(tab, "csNaTab");
+ } else {
+ // lang doesn't exist
+ addClassToElement(tab, "csNaTab");
+ }
+ }
+ }
+}
+
+
+/**
+ * Gets a language of DIV with codeSnippetCode class.
+ * @param {HTMLElement} elm The element with code to inspect.
+ * @return {string} The language code: "codeVB", "codeCsharp", "codeCpp", "codeFsharp", "codeJScript" or null.
+ */
+function getLangOfCodeSnippetCode(elm) {
+ if (hasElementClass(elm, "codeVB")) {
+ return "codeVB";
+ } else if (hasElementClass(elm, "codeCsharp")) {
+ return "codeCsharp";
+ } else if (hasElementClass(elm, "codeCpp")) {
+ return "codeCpp";
+ } else if (hasElementClass(elm, "codeFsharp")) {
+ return "codeFsharp";
+ } else if (hasElementClass(elm, "codeJScript")) {
+ return "codeJScript";
+ } else {
+ return null;
+ }
+}
+
+
+/**
+ * Gets a DIV with codeSnippetCode class with specified language class.
+ * @param {HTMLElement} containerSnippet The code container element.
+ * @param {string} lang The required language code.
+ * @returns {HTMLElement} The found code element. Null if not found.
+ */
+function getCodeSnippetCodeByLang(containerSnippet, lang) {
+ var divTags = containerSnippet.getElementsByTagName("div");
+ var i;
+ for (i = 0; i < divTags.length; i++) {
+ if (hasElementClasses(divTags[i], new Array("codeSnippetCode", lang))) {
+ return divTags[i];
+ }
+ }
+ return null;
+}
+
+
+/**
+ * Gets the next node which is not a child of specified element and
+ * is whether an element or text node.
+ * @param {Node} nod The base HTML node for which the search will be done.
+ * @returns {Node} The node found or null.
+ * @remark Unlike nextSibling property, this method returns also text nodes.
+ * Moreover, if there is no next sibling, this method goes higher in the hierarchy
+ * and finds the next node.
+ */
+function getNextNonChildElementOrTextNode(nod) {
+ // try next sibling first
+ var res = nod;
+ while ((res = res.nextSibling) !== null) {
+ switch (res.nodeType) {
+ case ELEMENT_NODE:
+ case TEXT_NODE:
+ case CDATA_SECTION_NODE:
+ return res;
+ }
+ }
+
+ // no sibling element or text found, try higher
+ if (nod.parentNode) {
+ return getNextNonChildElementOrTextNode(nod.parentNode);
+ } else {
+ // no node found
+ return null;
+ }
+}
+
+// #endregion CODE SNIPPETS **********************
+
+
+// #region COMMON UTILS **********************
+
+
+/**
+ * Gets the first DIV element which has the specified class.
+ * @param {HTMLElement} parentElm The element where to start searching.
+ * @param {string} className The class name to be found.
+ * @returns {HTMLElement} The found DIV element or null if not found.
+ */
+function getDivWithClass(parentElm, className) {
+ var divTags = parentElm.getElementsByTagName("div");
+ var i;
+ for (i = 0; i < divTags.length; i++) {
+ if (hasElementClass(divTags[i], className)) {
+ return divTags[i];
+ }
+ }
+ return null;
+}
+
+
+/**
+ * Determines whether an element contains specified CSS class.
+ * @param {HTMLElement} elm The element to test.
+ * @param {string} className The class name to be tested.
+ * @returns {boolean} A value indicating whether the element contains the class.
+*/
+function hasElementClass(elm, className) {
+ if (elm.className) {
+ var classes = elm.className.split(" ");
+ className = className.toLowerCase();
+ var i;
+ for (i = 0; i < classes.length; i++) {
+ if (classes[i].toLowerCase() === className) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+
+/**
+ * Determines whether an element contains all specified CSS classes.
+ * @param {HTMLElement} elm The element to test.
+ * @param {Array} classNames An array of class names.
+ * @returns {boolean} A value indicating whether the element contains the classes.
+ */
+function hasElementClasses(elm, classNames) {
+ if (elm.className) {
+ var classes = elm.className.split(" ");
+ var i, j, found;
+ found = 0;
+ for (j = 0; j < classNames.length; j++) {
+ var className = classNames[j].toLowerCase();
+ for (i = 0; i < classes.length; i++) {
+ var elmClass = classes[i].toLowerCase();
+ if (elmClass === className) {
+ found++;
+ break;
+ }
+ }
+ }
+ if (found === classNames.length) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+/**
+ * Removes specified CSS class from an element, if any.
+ * @param {HTMLElement} elm The element to process.
+ * @param {string} className The class name to be removed.
+ */
+function removeClassFromElement(elm, className) {
+ if (elm === null) return;
+ if (elm.className) {
+ var classes = elm.className.split(" ");
+ className = className.toLowerCase();
+ var i;
+ for (i = classes.length - 1; i >= 0; i--) {
+ if (classes[i].toLowerCase() === className) {
+ classes.splice(i, 1);
+ }
+ }
+ elm.className = classes.join(" ");
+ }
+}
+
+
+/**
+ * Adds specified CSS class to an element.
+ * @param {HTMLElement} elm The element to process.
+ * @param {string} className The class name to be added.
+ */
+function addClassToElement(elm, className) {
+ if (elm === null) return;
+ if (elm.className) {
+ var classes = elm.className.split(" ");
+ var classNameLow = className.toLowerCase();
+ var i;
+ for (i = classes.length - 1; i >= 0; i--) {
+ if (classes[i].toLowerCase() === classNameLow) {
+ // class already exists
+ return;
+ }
+ }
+ classes[classes.length] = className;
+ elm.className = classes.join(" ");
+ } else {
+ elm.className = className;
+ }
+}
+
+/**
+ * Super fast trim. Faster than pure regex solution.
+ * @returns {string} The trimmed version of the original string.
+ */
+String.prototype.trim = function () {
+ var str = this.replace(/^\s\s*/, ''),
+ ws = /\s/,
+ i = str.length;
+ while (ws.test(str.charAt(--i)));
+ return str.slice(0, i + 1);
+};
+
+
+/**
+ * Gets the specified query parameter value.
+ * @param {string} name Parameter name.
+ * @param {string} url Optional.
+ * @returns {string} The parameter value, an empty string if parameter is present without a value, null id parameter not present.
+ */
+function getQueryParameterByName(name, url) {
+ //const urlParams = new URLSearchParams(window.location.search); // not supported by IE, not a problem?
+ //const myParam = urlParams.get('myParam');
+
+ if (!url) url = window.location.href;
+ name = name.replace(/[\[\]]/g, '\\$&');
+ var regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)'),
+ results = regex.exec(url);
+ if (!results) return null;
+ if (!results[2]) return '';
+ return decodeURIComponent(results[2].replace(/\+/g, ' '));
+}
+
+
+/**
+ * Gets the value of a CSS Custom Property (starting with --).
+ * Pass in an element and its CSS Custom Property that you want the value of.
+ * Optionally, you can determine what datatype you get back.
+ *
+ * @param {String} propertyName The name of the custom CSS property, including the leading --.
+ * @param {String} [castAs='string'] The datatype name of the value to be retrieved. Available values are:
+ * 'number', 'int', 'float', 'boolean', 'bool'. Any other or omitted value returns string.
+ * @param {HTMLELement} [element=document.documentElement] The element with the CSS property.
+ * Can be omitted if the property is global, defined inside the ':root { --MyProperty }' rule.
+ * @returns {*} The value of the specified CSS Custom Property.
+ */
+const getCssCustomProperty = function (propertyName, castAs, element) {
+ castAs = castAs || 'string'; // default value if parameter not passed
+ element = element || document.documentElement; // default value if parameter not passed
+
+ // CSS variables are not supported in IE 11 used in CHM.
+ //let response = getComputedStyle(element).getPropertyValue(propertyName);
+ // Instead, use the following representation:
+ //.propertyName_without--prefix:after{
+ // content: value;
+ //}
+ propertyName = propertyName.substr(2); // remove -- prefix
+ let response = getStyleRuleValue('.' + propertyName + '::after', 'content');
+ if (response === null) {
+ return "";
+ }
+
+ // Tidy up the string if there's something to work with
+ if (response.length) {
+ response = response.replace(/\'|"/g, '').trim();
+ }
+
+ // Convert the response into a whatever type we wanted
+ switch (castAs) {
+ case 'number':
+ case 'int':
+ return parseInt(response, 10);
+ case 'float':
+ return parseFloat(response, 10);
+ case 'boolean':
+ case 'bool':
+ return response === 'true' || response === '1';
+ }
+
+ // Return the string response by default
+ return response;
+};
+
+
+function getStyleRuleValue(selector, style) {
+ let value = null;
+ selector = selector.toLowerCase();
+ for (let i = 0; i < document.styleSheets.length; i++) {
+ const mysheet = document.styleSheets[i];
+ const myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
+ for (let j = 0; j < myrules.length; j++) {
+ if (myrules[j].selectorText &&
+ myrules[j].selectorText.toLowerCase() === selector) {
+ value = myrules[j].style[style];
+ }
+ }
+ }
+ return value;
+}
+
+// #endregion COMMON UTILS **********************
+
+
+
+// #region LANGUAGE FILTER **********************
+
+// Specifies which language tab is shown as default for the first time.
+// Possible values: "codeVB", "codeCsharp", "codeCpp", "codeFsharp", "codeJScript"
+var DEFAULT_LANGUAGE_TO_SHOW = "codeCsharp";
+var languageToShow = DEFAULT_LANGUAGE_TO_SHOW;
+
+function loadLangFilter() {
+ languageToShow = loadSetting("languageToShow", DEFAULT_LANGUAGE_TO_SHOW);
+}
+
+
+function saveLangFilter() {
+ saveSetting("languageToShow", languageToShow);
+}
+
+
+/**
+ * Hides/shows the language sections according to language filter
+ * @param {string} langCode "VB", "Csharp", "Cpp", "Fsharp", "JScript"
+ */
+function CodeSnippet_SetLanguage(langCode) {
+ languageToShow = "code" + langCode;
+ showSelectedLanguages();
+ saveLangFilter();
+}
+
+
+/**
+ * Gets all code snippets. A snippet is a DIV with class="codeSnippetContainer".
+ * @returns {Array} The found code snippets.
+ */
+function getAllCodeSnippets() {
+ var divTags = document.getElementsByTagName("div");
+ var snippets = new Array();
+ var i, j;
+ j = 0;
+ for (i = 0; i < divTags.length; i++) {
+ if (hasElementClass(divTags[i], "codeSnippetContainer")) {
+ snippets[j++] = divTags[i];
+ }
+ }
+ return snippets;
+}
+
+
+/**
+ * Hides/shows the language sections according to the language filter.
+ */
+function showSelectedLanguages() {
+ try {
+ var snippets = getAllCodeSnippets();
+ var i, j, divs, codeCollection, snippet;
+
+ for (i = 0; i < snippets.length; i++) {
+ snippet = snippets[i];
+ if (snippet.style.display !== "none") {
+ var langIsNA = false;
+
+ // set the tabs (active/inactive)
+ var tabsDiv = getDivWithClass(snippet, "codeSnippetTabs");
+ // reset corners
+ var leftCorner, rightCorner;
+ leftCorner = getDivWithClass(tabsDiv, "codeSnippetTabLeftCorner");
+ if (!leftCorner) {
+ leftCorner = getDivWithClass(tabsDiv, "codeSnippetTabLeftCornerActive");
+ }
+ rightCorner = getDivWithClass(tabsDiv, "codeSnippetTabRightCorner");
+ if (!rightCorner) {
+ rightCorner = getDivWithClass(tabsDiv, "codeSnippetTabRightCornerActive");
+ }
+ removeClassFromElement(leftCorner, "codeSnippetTabLeftCornerActive");
+ addClassToElement(leftCorner, "codeSnippetTabLeftCorner");
+ removeClassFromElement(rightCorner, "codeSnippetTabRightCornerActive");
+ addClassToElement(rightCorner, "codeSnippetTabRightCorner");
+
+ // get the tabs
+ divs = tabsDiv.getElementsByTagName("div");
+ var tab;
+ var tabDivs = new Array();
+ for (j = 0; j < divs.length; j++) {
+ if (hasElementClass(divs[j], "codeSnippetTab")) {
+ // it's a tab
+ tab = divs[j];
+ tabDivs[tabDivs.length] = tab;
+ }
+ }
+
+ // activate/deactivate the tabs
+ var tabLink;
+ var visibleTabs = new Array();
+ for (j = 0; j < tabDivs.length; j++) {
+ tab = tabDivs[j];
+
+ if (hasElementClass(tab, languageToShow)) {
+ addClassToElement(tab, "csActiveTab");
+ tabLink = tab.getElementsByTagName("a")[0];
+ tabLink.removeAttribute("href");
+ langIsNA = hasElementClass(tab, "csNaTab");
+ } else {
+ removeClassFromElement(tab, "csActiveTab");
+ var shortLang = getLangOfCodeSnippetCode(tab).substring(4);
+ tabLink = tab.getElementsByTagName("a")[0];
+ tabLink.setAttribute("href", "javascript: CodeSnippet_SetLanguage('" + shortLang + "');");
+ }
+
+ // get visible tabs; invisible tabs are: with not supported lang AND not active
+ if (!(hasElementClass(tab, "csNaTab") && !hasElementClass(tab, "csActiveTab"))) {
+ // tab is visible
+ visibleTabs[visibleTabs.length] = tab;
+ }
+ }
+
+ // fix some styles (first, last) of visible tabs and corners
+ for (j = 0; j < visibleTabs.length; j++) {
+ tab = visibleTabs[j];
+
+ removeClassFromElement(tab, "csFirstTab");
+ removeClassFromElement(tab, "csLastTab");
+ if (j === 0) {
+ addClassToElement(tab, "csFirstTab");
+ if (hasElementClass(tab, "csActiveTab")) {
+ removeClassFromElement(leftCorner, "codeSnippetTabLeftCorner");
+ addClassToElement(leftCorner, "codeSnippetTabLeftCornerActive");
+ }
+ }
+ if (j === visibleTabs.length - 1) {
+ addClassToElement(tab, "csLastTab");
+ if (hasElementClass(tab, "csActiveTab")) {
+ removeClassFromElement(rightCorner, "codeSnippetTabRightCorner");
+ addClassToElement(rightCorner, "codeSnippetTabRightCornerActive");
+ }
+ }
+ }
+
+ // show/hide code block
+ codeCollection = getDivWithClass(snippet, "codeSnippetCodeCollection");
+ divs = codeCollection.getElementsByTagName("div");
+ for (j = 0; j < divs.length; j++) {
+ if (hasElementClass(divs[j], "codeSnippetCode")) {
+ // it's a code block
+ if (langIsNA) {
+ showHideTag(divs[j], hasElementClass(divs[j], "codeNA"));
+ } else {
+ showHideTag(divs[j], hasElementClass(divs[j], languageToShow));
+ }
+ }
+ }
+
+ }
+ }
+
+ } catch (ex) {
+ // empty
+ }
+}
+
+
+function showHideTag(tag, visible) {
+ try {
+ if (visible) {
+ tag.style.display = "";
+ } else {
+ tag.style.display = "none";
+ }
+ } catch (e) {
+ /*empty*/
+ }
+}
+
+// #endregion LANGUAGE FILTER **********************
+
+
+
+// #region COPY CODE ***************************
+
+function CopyCode(item) {
+ try {
+ // get the visible code block div
+ var codeCollection = item.parentNode.parentNode;
+ var divs = codeCollection.getElementsByTagName("div");
+ var i, shownCode;
+ for (i = 0; i < divs.length; i++) {
+ if (hasElementClass(divs[i], "codeSnippetCode")) {
+ // it's a code block
+ if (divs[i].style.display !== "none") {
+ shownCode = divs[i];
+ break;
+ }
+ }
+ }
+
+ if (shownCode) {
+ // get code and remove
+ var code;
+ code = shownCode.innerHTML;
+ code = code.replace(/
/gi, "\n");
+ code = code.replace(/<\/td>/gi, "\n"); // syntax highlighter removes \n chars and puts each line in separate
+ code = code.trim(); // remove leading spaces which are unwanted in FF
+ // get plain text
+ var tmpDiv = document.createElement('div');
+ tmpDiv.innerHTML = code;
+
+ if (typeof tmpDiv.textContent !== "undefined") {
+ // standards compliant
+ code = tmpDiv.textContent;
+ }
+ else if (typeof tmpDiv.innerText !== "undefined") {
+ // IE only
+ code = tmpDiv.innerText;
+ }
+
+ try {
+ // works in IE only
+ window.clipboardData.setData("Text", code);
+ } catch (ex) {
+ popCodeWindow(code);
+ }
+ }
+ } catch (e) {
+ /*empty*/
+ }
+}
+
+
+function popCodeWindow(code) {
+ try {
+ var codeWindow = window.open("",
+ "Copy the selected code",
+ "location=0,status=0,toolbar=0,menubar =0,directories=0,resizable=1,scrollbars=1,height=400, width=400");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("Copy the selected code ");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln('');
+ codeWindow.document.writeln(escapeHTML(code));
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("");
+ // the selectNode function below, converted by http://www.howtocreate.co.uk/tutorials/jsexamples/syntax/prepareInline.html
+ var ftn = "function selectNode (node) {\n\tvar selection, range, doc, win;\n\tif ((doc = node.ownerDocument) && \n\t\t(win = doc.defaultView) && \n\t\ttypeof win.getSelection != \'undefined\' && \n\t\ttypeof doc.createRange != \'undefined\' && \n\t\t(selection = window.getSelection()) && \n\t\ttypeof selection.removeAllRanges != \'undefined\') {\n\t\t\t\n\t\trange = doc.createRange();\n\t\trange.selectNode(node);\n selection.removeAllRanges();\n selection.addRange(range);\n\t} else if (document.body && \n\t\t\ttypeof document.body.createTextRange != \'undefined\' && \n\t\t\t(range = document.body.createTextRange())) {\n \n\t\t \trange.moveToElementText(node);\n \trange.select();\n }\n} ";
+ codeWindow.document.writeln(ftn);
+ codeWindow.document.writeln("selectNode(document.getElementById('code_text')); ");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("");
+ codeWindow.document.close();
+ } catch (ex) { /*empty*/ }
+}
+
+
+function escapeHTML(str) {
+ return str.replace(/&/g, "&").
+ replace(/>/g, ">").
+ replace(/ li {
+ display: none;
+ margin: 0px;
+}
+
+#header-breadcrumbs ul > li::after, #header-breadcrumbs ul > li::before {
+ display: inline-block;
+ margin: 0 6px;
+ color: rgba(0, 0, 0, 0.3);
+}
+
+@media print,screen and (min-width:768px) {
+ #header-breadcrumbs ul > li:not(:last-of-type)::after {
+ content: "/";
+ }
+
+ #header-breadcrumbs ul > li {
+ display: inline-block;
+ }
+
+ /* A placeholder that sets the final height, when the breadcrumbs are not loaded yet.
+ This is to prevent the rendered content from jumping up and down when breadcrumbs are displayed.
+ */
+ #header-breadcrumbs:empty::before {
+ content: "\00a0";
+ display: inline-block; /*from rule #header-breadcrumbs ul > li */
+ padding: .25rem 0; /*from rule #header-breadcrumbs ul */
+ font-size: .875rem; /*from rule #header-breadcrumbs ul */
+ }
+
+}
+
+/*#endregion HEADER end */
+
+
+.metadata {
+ color: var(--text-subtle);
+ font-size: .875rem;
+ margin-bottom: 24px;
+}
+
+/*#region SECTION */
+
+div.section_container div.section_heading a {
+ background: url(expanded.png) no-repeat scroll 0px 14px;
+ padding-left: 15px;
+ text-decoration: none;
+ outline: none;
+ /*color: #3f529c;*/
+ color: #000;
+}
+
+div.section_container.collapsed div.section_heading a {
+ background: url(collapsed.png) no-repeat scroll 0px 11px;
+ padding-left: 13px;
+}
+
+div.section {
+ clear: both;
+ margin-left: 0px;
+ padding-bottom: 2px;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+div.section_container.collapsed div.section {
+ display: none;
+}
+
+div.section_heading {
+ margin-top: 32px;
+ margin-bottom: 14px;
+}
+
+div.section_heading span {
+ font-size: 1.75rem;
+ line-height: 1.3em;
+ margin-bottom: 12px;
+ font-family: 'Segoe UI Semibold','Segoe UI','Lucida Grande',Verdana,Arial,Helvetica,sans-serif;
+ color: #000;
+ float: left;
+}
+
+
+div.section_heading div {
+ padding-top: 12px;
+}
+
+
+#mainBody #syntaxSection p {
+ margin-top: 2px;
+ /* padding-bottom: 0px; */
+}
+
+/*#endregion SECTION */
+
+div#footer {
+ font-size: .875rem;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-left: 0px;
+ margin-right: 0px;
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+ padding-left: 5px;
+ padding-right: 2px;
+ background-color: var(--secondary-background);
+}
+
+.subHeading {
+ font-size: 1rem;
+ margin-top: 36px;
+ margin-bottom: 6px;
+}
+
+.alert {
+ word-wrap: break-word;
+ background-color: var(--alert-box-background);
+ border: 1px solid var(--alert-box-background);
+ border-radius: 6px;
+ /*color: var(--theme-text);*/
+ display: block;
+ font-size: 1rem;
+ margin-top: 1rem;
+ /*outline-color: var(--theme-text);*/
+ padding: 1rem;
+ position: relative;
+ transition: height .5s ease-in,opacity .5s ease-in;
+ word-break: break-word;
+}
+
+/*#region Tables in main text */
+
+div#mainSection table {
+ font-size: .875rem;
+ border: 1px var(--table-border) solid;
+ width: 100%;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ border-collapse: collapse;
+}
+
+div#mainSection table tr {
+ vertical-align: top;
+}
+
+div#mainSection table th {
+ border: 1px var(--table-border) solid;
+ background-color: var(--secondary-background);
+ padding: 4px;
+ text-align: left;
+ /*height: 21px;*/
+ font-family: 'Segoe UI',Verdana,Arial;
+ font-size: 1rem;
+ color: #000000;
+ font-style: normal;
+ font-weight: normal;
+}
+
+div#mainSection table td {
+ border: 1px var(--table-border) solid;
+ background-color: #ffffff;
+ line-height: 140%;
+ padding: 4px;
+ margin: 1px;
+}
+
+div#mainSection td > p:first-child, div#mainSection th > p:first-child {
+ margin-top: 0rem;
+}
+
+/* members list table, no vertical borders*/
+div#mainSection table td.imageCell {
+ white-space: nowrap;
+}
+
+div#mainSection table.memberListTable {
+ border-top: 0px var(--border) none;
+ border-bottom: 1px var(--border) solid;
+ border-left: 0px var(--border) none;
+ border-right: 0px var(--border) none;
+}
+
+div#mainSection table.memberListTable th {
+ background-color: transparent;
+ padding: 0.7rem 0.7rem 0.7rem 0;
+ border-top: 0px var(--border) none;
+ border-bottom: 1px var(--border) solid;
+ border-left: 0px var(--border) none;
+ border-right: 0px var(--border) none;
+}
+
+div #mainSection table.memberListTable td {
+ padding: 0.7rem 0.7rem 0.7rem 0;
+ border-top: 1px var(--border) solid;
+ border-bottom: 1px var(--border) solid;
+ border-left: 0px var(--border) none;
+ border-right: 0px var(--border) none;
+}
+
+table.memberListTable tr th:first-child, table.memberListTable tr td:first-child { /*icon column*/
+ width: 50px;
+ /* set display: none, if you want to hide the icons */
+ /*display: none;*/
+}
+
+table.memberListTable.enumItemsListTable tr th:first-child, table.memberListTable.enumItemsListTable tr td:first-child { /*icon column*/
+ /* set display: none, if you want to hide the icons */
+ display: none;
+}
+
+
+/*#endregion */
+
+
+span.parameter {
+}
+
+/* images */
+span.img-container {
+ display: inline-block;
+ /* To make the image a block element with a horizontal scrollbar if needed, use the following:*/
+ /*display: block;
+ overflow: auto;*/
+}
+
+
+
+
+/* diagrams */
+.class-diagram img {
+ border: none;
+}
+
+
+/*#region Code snippets */
+.codeSnippetContainer {
+ margin-top: 1rem;
+}
+
+.codeSnippetTabs {
+ width: auto;
+ height: var(--tab-height);
+ padding: 0px;
+ border: 0px #ffffff none;
+ font-size: .8rem;
+}
+
+.codeSnippetTab {
+ height: var(--tab-height);
+ float: left;
+ width: auto;
+ border-top: 1px solid var(--border);
+ border-bottom: 0px none var(--border);
+ border-left: 1px solid var(--border);
+ padding: 0px 8px 0px 8px;
+ background-color: #F2F2F2;
+ /*align content to bottom*/
+ display: flex;
+ justify-content: flex-end;
+ align-items: flex-end;
+}
+
+.csFirstTab {
+ border-left: 0px solid var(--border);
+}
+
+.csActiveTab {
+ background-color: #ffffff;
+}
+
+.csNaTab {
+ display: none;
+}
+
+.csNaTab.csActiveTab {
+ display: block;
+}
+
+
+.codeSnippetTabLeftCorner, .codeSnippetTabLeftCornerActive {
+ height: var(--tab-height);
+ width: 0px; /* 6px; */
+ padding: 0px;
+ border-top: 1px solid var(--border);
+ border-bottom: 0px none var(--border);
+ border-left: 1px solid var(--border);
+ border-right: 0px #ffffff none;
+ float: left;
+}
+
+.codeSnippetTabRightCorner, .codeSnippetTabRightCornerActive {
+ height: var(--tab-height);
+ width: 0px; /* 6px; */
+ padding: 0px;
+ border-top: 1px solid var(--border);
+ border-bottom: 0px none var(--border);
+ border-right: 1px solid var(--border);
+ border-left: 0px #ffffff none;
+ float: left;
+}
+
+.codeSnippetTabs a {
+ /*font-weight: bold;*/
+}
+
+.codeSnippetTabs .csNaTab a {
+ /*font-weight: normal;*/
+}
+
+.codeSnippetTabs a, .codeSnippetTabs a:link, .codeSnippetTabs a:visited, .codeSnippetTabs a:active {
+ color: #34547a;
+ text-decoration: none;
+}
+
+.codeSnippetTabs a:hover {
+ color: #888888;
+}
+
+.codeSnippetTabs .csActiveTab a {
+ color: #000;
+ font-weight: 600;
+ font-size: 1rem;
+}
+
+.codeSnippetCodeCollection {
+ border-top: solid 1px var(--border);
+ border-right: solid 1px var(--border);
+ border-bottom: solid 1px var(--border);
+ border-left: solid 1px var(--border);
+ margin-bottom: 12px;
+ /*position: relative;
+ top: -3px;*/
+}
+
+.codeSnippetToolbar {
+ float: right;
+ top: calc(var(--tab-height) * -1);
+ position: relative;
+ background-color: #fff;
+ padding-left: 4px;
+ padding-right: 4px;
+ width: auto;
+ height: 0;
+ font-size: .8rem;
+}
+
+.codeSnippetToolbar a, .codeSnippetToolbar a:link, .codeSnippetToolbar a:visited, .codeSnippetToolbar a:active {
+ margin-left: 5px;
+ margin-right: 5px;
+ text-decoration: none;
+ color: #000;
+ background-color: #fff;
+ font-family: 'Segoe UI',Verdana,Arial;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.codeSnippetToolbar a:hover {
+ color: #e66a38;
+}
+
+.codeSnippetCode {
+ padding: 16px;
+ margin: 0px;
+ background-color: #FAFAFA;
+}
+
+monospace, code, kbd, pre, samp {
+ font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,sans-serif !important;
+}
+
+
+/* override Syntaxhighlighter font size */
+code, pre {
+ font-size: .875rem;
+}
+
+.codeSnippetContainer .syntaxhighlighter,
+.codeSnippetContainer .syntaxhighlighter div,
+.codeSnippetContainer .syntaxhighlighter code,
+.codeSnippetContainer .syntaxhighlighter table,
+.codeSnippetContainer .syntaxhighlighter table td,
+.codeSnippetContainer .syntaxhighlighter table tr,
+.codeSnippetContainer .syntaxhighlighter table tbody {
+ font-size: .875rem !important;
+}
+
+
+
+/*not used input fact, overridden by highlighter*/
+.codeSnippetCode pre {
+ padding: 5px;
+ margin: 0px;
+ font-family: Consolas,Courier,monospace;
+ font-style: normal;
+ font-weight: normal;
+ word-wrap: break-word;
+ overflow-x: auto;
+ overflow-y: auto;
+}
+
+
+/*#endregion Code snippets */
+
+
+
+/*#region MSDN-like formatting */
+
+
+dl {
+ margin-top: 15px;
+ margin-bottom: 5px;
+ padding-left: 1px;
+}
+
+
+dd {
+ margin-left: 0px;
+ padding-left: 2em;
+}
+
+dl.parameterList {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ margin: 0;
+}
+
+dl.parameterList dt {
+ display: inline-block;
+ font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,sans-serif;
+ font-weight: 600;
+ padding: 0 6px 2px;
+}
+
+dl.parameterList dd {
+ margin-left: 12px;
+ padding-left: 0em;
+}
+
+ul {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-left: 17px;
+ list-style-type: disc;
+}
+
+ul ul {
+ margin-bottom: 4px;
+ margin-left: 17px;
+ margin-top: 3px;
+ list-style-type: disc;
+}
+
+ol {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-left: 28px;
+ list-style-type: decimal;
+}
+
+ol ol {
+ margin-bottom: 4px;
+ margin-left: 28px;
+ margin-top: 3px;
+ list-style-type: lower-alpha;
+}
+
+li {
+ margin-top: -2px;
+ margin-bottom: 3px;
+}
+
+
+dd p {
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+div.tableSection p {
+ margin-top: 1px;
+ margin-bottom: 4px;
+}
+
+li p {
+ margin-top: 2px;
+ margin-bottom: 2px;
+}
+
+div.section dl {
+ margin-top: 24px;
+ margin-bottom: 1px;
+ padding-left: 1px;
+}
+
+div.section .subHeading + dl { /* e.g. the first parameter description */
+ margin-top: 8px;
+}
+
+div.section dd p {
+ margin-top: 2px;
+ margin-bottom: 2px;
+}
+
+#mainBody p, #mainBody ol, #mainBody ul {
+ margin-top: 1rem;
+}
+
+/*#endregion */
diff --git a/API_NetFramework/VSdoc/msdn2019/msdn2019.js b/API_NetFramework/VSdoc/msdn2019/msdn2019.js
new file mode 100644
index 00000000..39ae7c07
--- /dev/null
+++ b/API_NetFramework/VSdoc/msdn2019/msdn2019.js
@@ -0,0 +1,1244 @@
+// #region PAGE INIT ***********************
+
+
+// Event handler attachment
+function registerEventHandler(element, event, handler) {
+ if (element.addEventListener) {
+ element.addEventListener(event, handler, false);
+ } else if (element.attachEvent) {
+ element.attachEvent('on' + event, handler);
+ } else {
+ element[event] = handler;
+ }
+}
+
+
+// Event handler detachment
+function unregisterEventHandler(element, event, handler) {
+ if (typeof element.removeEventListener === "function")
+ element.removeEventListener(event, handler, false);
+ else
+ element.detachEvent("on" + event, handler);
+}
+
+
+/**
+ * Scroll handler.
+ * @type {function()}
+ */
+function scrollHandler() {
+ fitTocHeightToViewport();
+}
+
+
+function resizeHandler() {
+ fitTocHeightToViewport();
+}
+
+registerEventHandler(window, 'load', init);
+registerEventHandler(window, 'scroll', scrollHandler);
+registerEventHandler(window, 'resize', resizeHandler);
+
+
+/**
+ * Internal in-page sections TOC.
+ * */
+var inPageToc;
+
+
+function init() {
+ try {
+ fixMoniker();
+ mergeCodeSnippets();
+ loadLangFilter();
+ showSelectedLanguages();
+ initSearchControls();
+ inPageToc = new InternalToc(); // generate in-page TOC
+ var breadcrumbsPromise = loadAndDisplayBreadcrumbs();
+ breadcrumbsPromise.then(() => expandBreadcrumbsInToc(breadcrumbs));
+ }
+ catch (e) {
+ var msg = e.message;
+ if (e.stack) {
+ msg = msg + "/n" + e.stack;
+ }
+ (console.error || console.log).call(console, msg);
+ }
+}
+
+
+var scriptArray = []; //array of loaded url:script
+/**
+ * Loads a JS script if it is not loaded yet.
+ *
+ * @param {string} url The URL of the JS script to be loaded.
+ * @returns {Promise} A promise that returns a value indicating whether this function
+ * loaded the script. False if the script was already loaded before.
+ */
+function loadScriptOnce(url) {
+ return new Promise(function (resolve, reject) {
+
+ if (scriptArray[url] === undefined) {
+ //the array doesn't have such url
+
+ var script = document.createElement('script');
+ script.src = url;
+ var head = document.getElementsByTagName('head')[0];
+ var done = false;
+
+ script.onload = script.onreadystatechange = function () {
+ if (!done && (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete')) {
+ done = true;
+ script.onload = script.onreadystatechange = null;
+ //head.removeChild(script);
+
+ scriptArray[url] = script;
+ resolve(true);
+ }
+ };
+ script.onerror = () => reject(new Error("Script load error: " + url));
+
+ head.appendChild(script);
+ } else {
+ // resolve immediately
+ resolve(false);
+ }
+
+ });
+}
+
+
+/**
+ * Ensures that the TOC is always fully visible, i.e. its height is adjusted.
+ * */
+function fitTocHeightToViewport() {
+ var tocContainer = document.getElementById("toc-container");
+ if (!tocContainer) {
+ return;
+ }
+
+ var vpHeight = document.documentElement.clientHeight;
+ var vpWidth = document.documentElement.clientWidth;
+ var viewPortRect = {
+ left: 0,
+ top: 0,
+ right: vpWidth-1,
+ bottom: vpHeight-1,
+ width: vpWidth,
+ height: vpHeight,
+ x: 0,
+ y: 0
+ };
+ var headerVisibleHeight = 0;
+ var footerVisibleHeight = 0;
+ var elm;
+
+ elm = document.getElementById("header");
+ if (elm) {
+ let interSect = getRectIntersection(viewPortRect, elm.getBoundingClientRect());
+ if (interSect) {
+ headerVisibleHeight = interSect.height;
+ }
+ }
+
+ elm = document.getElementById("footer");
+ if (elm) {
+ let interSect = getRectIntersection(viewPortRect, elm.getBoundingClientRect());
+ if (interSect) {
+ footerVisibleHeight = interSect.height;
+ }
+ }
+
+ // If header nor footer are visible, CSS works fine and the TOC height is OK.
+ // remove any previously explicitly set max-height
+ if (headerVisibleHeight === 0 && footerVisibleHeight === 0) {
+ tocContainer.style.removeProperty("max-height");
+ return;
+ }
+
+ var tocRect = tocContainer.getBoundingClientRect();
+ // header or footer is visible
+ // Check if top and bottom of the TOC are visible.
+ if (tocRect.top < 0 || tocRect.bottom > viewPortRect.bottom) {
+ //console.info("not visible");
+ //console.info("header " + headerVisibleHeight);
+ //console.info("footer " + footerVisibleHeight);
+ tocContainer.style.maxHeight = (viewPortRect.height - headerVisibleHeight - footerVisibleHeight - 15) + "px";
+ }
+
+}
+
+
+/**
+ * Gets the intersection of two rectangles.
+ *
+ * @param {ClientRect} rect1 Rectangle 1.
+ * @param {ClientRect} rect2 Rectangle 2.
+ * @returns {ClientRect} null if no intersection
+ */
+function getRectIntersection(rect1, rect2) {
+ var isNoOverlapX = rect1.right < rect2.left || rect1.left > rect2.right;
+ var isNoOverlapY = rect1.bottom < rect2.top || rect1.top > rect2.bottom;
+
+ if (isNoOverlapX || isNoOverlapY) {
+ return null;
+ }
+
+ var resLeft = Math.max(rect1.left, rect2.left);
+ var resRight = Math.min(rect1.right, rect2.right);
+ var resTop = Math.max(rect1.top, rect2.top);
+ var resBottom = Math.min(rect1.bottom, rect2.bottom);
+
+ return {
+ left: resLeft,
+ top: resTop,
+ right: resRight,
+ bottom: resBottom,
+ width: resRight - resLeft + 1,
+ height: resBottom - resTop + 1,
+ x: resLeft,
+ y: resTop
+ };
+}
+
+
+function initSearchControls() {
+ var searchContainer = document.getElementById("search-bar-container");
+ if (!searchContainer) {
+ return;
+ }
+ var searchForm = document.getElementById("search-bar");
+ if (!searchForm) {
+ return;
+ }
+ var searchBox = document.getElementById("HeaderSearchInput");
+ if (!searchBox) {
+ return;
+ }
+ var searchBtn = document.getElementById("btn-search");
+ if (!searchBtn) {
+ return;
+ }
+ var cancelSearchBtn = document.getElementById("cancel-search"); //
+ if (!cancelSearchBtn) {
+ return;
+ }
+
+ // 'executeSearch' function
+ let executeSearch = function () {
+ //alert("Searching");
+ console.info("Searching");
+ searchForm.submit();
+ };
+
+ // 'executeSearch' function
+ let hideSearchBox = function () {
+ removeClassFromElement(searchContainer, "search-focused");
+ };
+
+ // 'showAndFocusSearchBox' function
+ let showAndFocusSearchBox = function () {
+ addClassToElement(searchContainer, "search-focused");
+ searchBox.focus();
+ };
+
+ // 'showAndFocusSearchBox' function
+ let isSearchBoxHidden = function () {
+ return !hasElementClass(searchContainer, "search-focused");
+ };
+
+ // "Search" button
+ registerEventHandler(searchBtn, "click",
+ function (e) {
+ if (!isSearchBoxHidden()) {
+ executeSearch();
+ return;
+ }
+ e.preventDefault();
+ e.stopPropagation();
+ showAndFocusSearchBox();
+ });
+
+
+ // "Cancel" search button
+ registerEventHandler(cancelSearchBtn, "click",
+ function () {
+ hideSearchBox();
+ });
+
+ registerEventHandler(cancelSearchBtn, "keydown",
+ function (e) {
+ e.preventDefault();
+ // 27 ESC
+ // 13 ENTER
+ // 9 TAB
+ e.keyCode === 27 || e.keyCode === 13 ? hideSearchBox() : e.keyCode === 9 && searchBox.focus();
+ });
+
+ // search box
+ registerEventHandler(searchBox, "keydown",
+ function (e) {
+ switch (e.keyCode) {
+ case 9:
+ case 27:
+ hideSearchBox();
+ break;
+ case 13:
+ executeSearch();
+ break;
+ }
+ });
+
+ registerEventHandler(searchBox, "blur",
+ function (e) {
+ if (e.relatedTarget === searchBtn) {
+ // search btn received the focus
+ return;
+ }
+ hideSearchBox();
+ });
+
+}
+
+// #endregion PAGE INIT ***********************
+
+
+// #region BREADCRUMBS **********************
+
+var breadcrumbs;
+
+/**
+ * @returns {Promise} A promise that is resolved after the 'breadcrumbs' variable is retrieved and displayed.
+ */
+function loadAndDisplayBreadcrumbs() {
+ var filename = location.pathname.replace(/\\/g, "/");
+ filename = filename.substring(filename.lastIndexOf('/') + 1);
+ //var filenameWithoutExtension = filename;
+ //var extension = "";
+ //var i = filename.lastIndexOf('.');
+ //if (i !== -1) {
+ // filenameWithoutExtension = filename.substring(0, i);
+ // extension = filename.substring(i);
+ //}
+
+ // get breadcrumbs js file
+ var scriptFile = "toc--/" + filename + ".js";
+ return loadScriptOnce(scriptFile)
+ .then(script => DisplayBreadcrumbs());
+}
+
+
+function DisplayBreadcrumbs() {
+ if (breadcrumbs) {
+ let breadcrumbsDiv = document.getElementById("header-breadcrumbs");
+ let ulElm = document.createElement("ul");
+ breadcrumbsDiv.appendChild(ulElm);
+
+ // breadcrumbs is an array of topic definitions. A single TOC item has format: ['Id', 'Text', 'Url']
+ for (i = 0; i < breadcrumbs.length; i++) {
+ let tocNode = breadcrumbs[i];
+ let id = tocNode[0];
+ let text = tocNode[1];
+ let url = tocNode[2];
+
+ if (!(i === 0 && url === "" && text === "")) {
+ // not a virtual root
+ let liElm = document.createElement("li");
+ if (url !== "") {
+ let a1 = document.createElement('a');
+ a1.href = url;
+ //a1.innerHTML = text;
+ a1.appendChild(document.createTextNode(text)); // safe way of setting un-escaped text
+
+ liElm.appendChild(a1);
+ } else {
+ //liElm.innerHTML = text;
+ liElm.appendChild(document.createTextNode(text)); // safe way of setting un-escaped text
+ }
+
+ ulElm.appendChild(liElm);
+ }
+
+ }
+ }
+}
+
+
+// #endregion BREADCRUMBS **********************
+
+
+
+// #region EXPAND / COLLAPSE SECTION *********************
+
+function toggleSection(sectionLinkElm) {
+ var sectionDiv = sectionLinkElm.parentNode.parentNode.parentNode;
+ if (hasElementClass(sectionDiv, "collapsed")) {
+ expandSection(sectionLinkElm);
+ } else {
+ collapseSection(sectionLinkElm);
+ }
+}
+
+function expandSection(sectionLinkElm) {
+ var sectionDiv = sectionLinkElm.parentNode.parentNode.parentNode;
+ removeClassFromElement(sectionDiv, "collapsed");
+ sectionLinkElm.setAttribute("title", "Collapse");
+}
+
+function collapseSection(sectionLinkElm) {
+ var sectionDiv = sectionLinkElm.parentNode.parentNode.parentNode;
+ addClassToElement(sectionDiv, "collapsed");
+ sectionLinkElm.setAttribute("title", "Expand");
+}
+
+// #endregion EXPAND / COLLAPSE SECTION ***********************
+
+
+
+// #region CODE SNIPPETS **********************
+
+/**
+ * Merges adjacent code snippets in different languages into
+ * single code collection with tabs.
+ */
+function mergeCodeSnippets() {
+ var allNodes = getElementAndTextNodes(document.body);
+ var parentCodeSnippet = null;
+ var i;
+
+ for (i = 0; i < allNodes.length; i++) {
+ var currentNode = allNodes[i];
+
+ var nextNode;
+ if (!parentCodeSnippet) {
+ // look for the first code snippet which will be a parent
+ if (hasElementClass(currentNode, "codeSnippetContainer")) {
+ parentCodeSnippet = currentNode;
+ // snippet found, move after it
+ nextNode = getNextNonChildElementOrTextNode(parentCodeSnippet);
+ while (allNodes[++i] !== nextNode && i < allNodes.length) { /*empty*/ }
+ i--;
+ }
+
+ } else {
+ // look for the next ADJACENT code snippet
+ if (hasElementClass(currentNode, "codeSnippetContainer")) {
+ // merge it with the parent
+ mergeTwoCodeSnippets(parentCodeSnippet, currentNode);
+ // move after adjacent snippet
+ nextNode = getNextNonChildElementOrTextNode(currentNode);
+ while (allNodes[++i] !== nextNode && i < allNodes.length) { /*empty*/ }
+ i--;
+ } else {
+ // or look for the non-whitespace text
+ if (currentNode.nodeType === TEXT_NODE || currentNode.nodeType === CDATA_SECTION_NODE) {
+ if (currentNode.nodeValue.trim() !== "") {
+ // found non empty text after parent snippet, don't merge and find next parent
+ parentCodeSnippet = null;
+ }
+ }
+ }
+ }
+
+ }
+}
+
+
+var ELEMENT_NODE = 1;
+var TEXT_NODE = 3;
+var CDATA_SECTION_NODE = 4;
+
+/**
+ * Returns all elements and text nodes under the root.
+ * Recursion is not used due to performance reasons.
+ *
+ * @param {HTMLElement} root - The root node.
+ * @returns {Array} All elements and text nodes under the root.
+ */
+function getElementAndTextNodes(root) {
+ var result = [];
+
+ var node = root.childNodes[0];
+ while (node !== null) {
+ switch (node.nodeType) {
+ case ELEMENT_NODE:
+ case TEXT_NODE:
+ case CDATA_SECTION_NODE:
+ result.push(node);
+ break;
+ }
+
+ if (node.hasChildNodes()) {
+ node = node.firstChild;
+ }
+ else {
+ while (node.nextSibling === null && node !== root) {
+ node = node.parentNode;
+ }
+ if (node !== root) {
+ node = node.nextSibling;
+ } else {
+ node = null;
+ }
+ }
+ }
+
+ return result;
+}
+
+
+/**
+ * Merges two separate snippets together. The child snippet
+ * becomes a part of the parent snippet. Tabs and visibility
+ * are adjusted accordingly.
+ * @param {Node} parentSnippet The parent snippet to merge.
+ * @param {Node} childSnippet The child snippet to merge.
+ */
+function mergeTwoCodeSnippets(parentSnippet, childSnippet) {
+ var childCode = getDivWithClass(childSnippet, "codeSnippetCode");
+ var parentCodeCollection = getDivWithClass(parentSnippet, "codeSnippetCodeCollection");
+ if (childCode && parentCodeCollection) {
+ // remove existing lang code in parent, if any
+ var lang = getLangOfCodeSnippetCode(childCode);
+ if (lang) {
+ var existingCode = getCodeSnippetCodeByLang(parentSnippet, lang);
+ if (existingCode) {
+ existingCode.parentNode.removeChild(existingCode);
+ }
+ }
+ // move child code to the parent
+ childCode.parentNode.removeChild(childCode);
+ parentCodeCollection.appendChild(childCode);
+ showHideTag(childSnippet, false);
+
+ // correct the tabs (bold or normal for N/A lang)
+ var csCode, tab, i;
+ var tabsDiv = getDivWithClass(parentSnippet, "codeSnippetTabs");
+ var langs = ["codeVB", "codeCsharp", "codeCpp", "codeFsharp", "codeJScript"];
+
+ for (i = 0; i < langs.length; i++) {
+ lang = langs[i];
+ csCode = getCodeSnippetCodeByLang(parentCodeCollection, lang);
+ tab = getDivWithClass(tabsDiv, lang);
+ if (csCode) {
+ // lang exists
+ removeClassFromElement(tab, "csNaTab");
+ } else {
+ // lang doesn't exist
+ addClassToElement(tab, "csNaTab");
+ }
+ }
+ }
+}
+
+
+/**
+ * Gets a language of DIV with codeSnippetCode class.
+ * @param {HTMLElement} elm The element with code to inspect.
+ * @return {string} The language code: "codeVB", "codeCsharp", "codeCpp", "codeFsharp", "codeJScript" or null.
+ */
+function getLangOfCodeSnippetCode(elm) {
+ if (hasElementClass(elm, "codeVB")) {
+ return "codeVB";
+ } else if (hasElementClass(elm, "codeCsharp")) {
+ return "codeCsharp";
+ } else if (hasElementClass(elm, "codeCpp")) {
+ return "codeCpp";
+ } else if (hasElementClass(elm, "codeFsharp")) {
+ return "codeFsharp";
+ } else if (hasElementClass(elm, "codeJScript")) {
+ return "codeJScript";
+ } else {
+ return null;
+ }
+}
+
+
+/**
+ * Gets a DIV with codeSnippetCode class with specified language class.
+ * @param {HTMLElement} containerSnippet The code container element.
+ * @param {string} lang The required language code.
+ * @returns {HTMLElement} The found code element. Null if not found.
+ */
+function getCodeSnippetCodeByLang(containerSnippet, lang) {
+ var divTags = containerSnippet.getElementsByTagName("div");
+ var i;
+ for (i = 0; i < divTags.length; i++) {
+ if (hasElementClasses(divTags[i], new Array("codeSnippetCode", lang))) {
+ return divTags[i];
+ }
+ }
+ return null;
+}
+
+
+/**
+ * Gets the next node which is not a child of specified element and
+ * is whether an element or text node.
+ * @param {Node} nod The base HTML node for which the search will be done.
+ * @returns {Node} The node found or null.
+ * @remark Unlike nextSibling property, this method returns also text nodes.
+ * Moreover, if there is no next sibling, this method goes higher in the hierarchy
+ * and finds the next node.
+ */
+function getNextNonChildElementOrTextNode(nod) {
+ // try next sibling first
+ var res = nod;
+ while ((res = res.nextSibling) !== null) {
+ switch (res.nodeType) {
+ case ELEMENT_NODE:
+ case TEXT_NODE:
+ case CDATA_SECTION_NODE:
+ return res;
+ }
+ }
+
+ // no sibling element or text found, try higher
+ if (nod.parentNode) {
+ return getNextNonChildElementOrTextNode(nod.parentNode);
+ } else {
+ // no node found
+ return null;
+ }
+}
+
+// #endregion CODE SNIPPETS **********************
+
+
+// #region COMMON UTILS **********************
+
+
+/**
+ * Gets the first DIV element which has the specified class.
+ * @param {HTMLElement} parentElm The element where to start searching.
+ * @param {string} className The class name to be found.
+ * @returns {HTMLElement} The found DIV element or null if not found.
+ */
+function getDivWithClass(parentElm, className) {
+ var divTags = parentElm.getElementsByTagName("div");
+ var i;
+ for (i = 0; i < divTags.length; i++) {
+ if (hasElementClass(divTags[i], className)) {
+ return divTags[i];
+ }
+ }
+ return null;
+}
+
+
+/**
+ * Determines whether an element contains specified CSS class.
+ * @param {HTMLElement} elm The element to test.
+ * @param {string} className The class name to be tested.
+ * @returns {boolean} A value indicating whether the element contains the class.
+*/
+function hasElementClass(elm, className) {
+ if (elm.className) {
+ var classes = elm.className.split(" ");
+ className = className.toLowerCase();
+ var i;
+ for (i = 0; i < classes.length; i++) {
+ if (classes[i].toLowerCase() === className) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+
+/**
+ * Determines whether an element contains all specified CSS classes.
+ * @param {HTMLElement} elm The element to test.
+ * @param {Array} classNames An array of class names.
+ * @returns {boolean} A value indicating whether the element contains the classes.
+ */
+function hasElementClasses(elm, classNames) {
+ if (elm.className) {
+ var classes = elm.className.split(" ");
+ var i, j, found;
+ found = 0;
+ for (j = 0; j < classNames.length; j++) {
+ var className = classNames[j].toLowerCase();
+ for (i = 0; i < classes.length; i++) {
+ var elmClass = classes[i].toLowerCase();
+ if (elmClass === className) {
+ found++;
+ break;
+ }
+ }
+ }
+ if (found === classNames.length) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+/**
+ * Removes specified CSS class from an element, if any.
+ * @param {HTMLElement} elm The element to process.
+ * @param {string} className The class name to be removed.
+ */
+function removeClassFromElement(elm, className) {
+ if (elm === null) return;
+ if (elm.className) {
+ var classes = elm.className.split(" ");
+ className = className.toLowerCase();
+ var i;
+ for (i = classes.length - 1; i >= 0; i--) {
+ if (classes[i].toLowerCase() === className) {
+ classes.splice(i, 1);
+ }
+ }
+ elm.className = classes.join(" ");
+ }
+}
+
+
+/**
+ * Adds specified CSS class to an element.
+ * @param {HTMLElement} elm The element to process.
+ * @param {string} className The class name to be added.
+ */
+function addClassToElement(elm, className) {
+ if (elm === null) return;
+ if (elm.className) {
+ var classes = elm.className.split(" ");
+ var classNameLow = className.toLowerCase();
+ var i;
+ for (i = classes.length - 1; i >= 0; i--) {
+ if (classes[i].toLowerCase() === classNameLow) {
+ // class already exists
+ return;
+ }
+ }
+ classes[classes.length] = className;
+ elm.className = classes.join(" ");
+ } else {
+ elm.className = className;
+ }
+}
+
+/**
+ * Super fast trim. Faster than pure regex solution.
+ * @returns {string} The trimmed version of the original string.
+ */
+String.prototype.trim = function () {
+ var str = this.replace(/^\s\s*/, ''),
+ ws = /\s/,
+ i = str.length;
+ while (ws.test(str.charAt(--i)));
+ return str.slice(0, i + 1);
+};
+
+
+/**
+ * Gets the specified query parameter value.
+ * @param {string} name Parameter name.
+ * @param {string} url Optional.
+ * @returns {string} The parameter value, an empty string if parameter is present without a value, null id parameter not present.
+ */
+function getQueryParameterByName(name, url) {
+ //const urlParams = new URLSearchParams(window.location.search); // not supported by IE, not a problem?
+ //const myParam = urlParams.get('myParam');
+
+ if (!url) url = window.location.href;
+ name = name.replace(/[\[\]]/g, '\\$&');
+ var regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)'),
+ results = regex.exec(url);
+ if (!results) return null;
+ if (!results[2]) return '';
+ return decodeURIComponent(results[2].replace(/\+/g, ' '));
+}
+
+
+/**
+ * Gets the value of a CSS Custom Property (starting with --).
+ * Pass in an element and its CSS Custom Property that you want the value of.
+ * Optionally, you can determine what datatype you get back.
+ *
+ * @param {String} propertyName The name of the custom CSS property, including the leading --.
+ * @param {String} [castAs='string'] The datatype name of the value to be retrieved. Available values are:
+ * 'number', 'int', 'float', 'boolean', 'bool'. Any other or omitted value returns string.
+ * @param {HTMLELement} [element=document.documentElement] The element with the CSS property.
+ * Can be omitted if the property is global, defined inside the ':root { --MyProperty }' rule.
+ * @returns {*} The value of the specified CSS Custom Property.
+ */
+const getCssCustomProperty = (propertyName, castAs = 'string', element = document.documentElement) => {
+ let response = getComputedStyle(element).getPropertyValue(propertyName);
+
+ // Tidy up the string if there's something to work with
+ if (response.length) {
+ response = response.replace(/\'|"/g, '').trim();
+ }
+
+ // Convert the response into a whatever type we wanted
+ switch (castAs) {
+ case 'number':
+ case 'int':
+ return parseInt(response, 10);
+ case 'float':
+ return parseFloat(response, 10);
+ case 'boolean':
+ case 'bool':
+ return response === 'true' || response === '1';
+ }
+
+ // Return the string response by default
+ return response;
+};
+
+
+
+// #endregion COMMON UTILS **********************
+
+
+
+// #region LANGUAGE FILTER **********************
+
+// Specifies which language tab is shown as default for the first time.
+// Possible values: "codeVB", "codeCsharp", "codeCpp", "codeFsharp", "codeJScript"
+var DEFAULT_LANGUAGE_TO_SHOW = "codeCsharp";
+var languageToShow = DEFAULT_LANGUAGE_TO_SHOW;
+
+function loadLangFilter() {
+ languageToShow = loadSetting("languageToShow", DEFAULT_LANGUAGE_TO_SHOW);
+}
+
+
+function saveLangFilter() {
+ saveSetting("languageToShow", languageToShow);
+}
+
+
+/**
+ * Hides/shows the language sections according to language filter
+ * @param {string} langCode "VB", "Csharp", "Cpp", "Fsharp", "JScript"
+ */
+function CodeSnippet_SetLanguage(langCode) {
+ languageToShow = "code" + langCode;
+ showSelectedLanguages();
+ saveLangFilter();
+}
+
+
+/**
+ * Gets all code snippets. A snippet is a DIV with class="codeSnippetContainer".
+ * @returns {Array} The found code snippets.
+ */
+function getAllCodeSnippets() {
+ var divTags = document.getElementsByTagName("div");
+ var snippets = new Array();
+ var i, j;
+ j = 0;
+ for (i = 0; i < divTags.length; i++) {
+ if (hasElementClass(divTags[i], "codeSnippetContainer")) {
+ snippets[j++] = divTags[i];
+ }
+ }
+ return snippets;
+}
+
+
+/**
+ * Hides/shows the language sections according to the language filter.
+ */
+function showSelectedLanguages() {
+ try {
+ var snippets = getAllCodeSnippets();
+ var i, j, divs, codeCollection, snippet;
+
+ for (i = 0; i < snippets.length; i++) {
+ snippet = snippets[i];
+ if (snippet.style.display !== "none") {
+ var langIsNA = false;
+
+ // set the tabs (active/inactive)
+ var tabsDiv = getDivWithClass(snippet, "codeSnippetTabs");
+ // reset corners
+ var leftCorner, rightCorner;
+ leftCorner = getDivWithClass(tabsDiv, "codeSnippetTabLeftCorner");
+ if (!leftCorner) {
+ leftCorner = getDivWithClass(tabsDiv, "codeSnippetTabLeftCornerActive");
+ }
+ rightCorner = getDivWithClass(tabsDiv, "codeSnippetTabRightCorner");
+ if (!rightCorner) {
+ rightCorner = getDivWithClass(tabsDiv, "codeSnippetTabRightCornerActive");
+ }
+ removeClassFromElement(leftCorner, "codeSnippetTabLeftCornerActive");
+ addClassToElement(leftCorner, "codeSnippetTabLeftCorner");
+ removeClassFromElement(rightCorner, "codeSnippetTabRightCornerActive");
+ addClassToElement(rightCorner, "codeSnippetTabRightCorner");
+
+ // get the tabs
+ divs = tabsDiv.getElementsByTagName("div");
+ var tab;
+ var tabDivs = new Array();
+ for (j = 0; j < divs.length; j++) {
+ if (hasElementClass(divs[j], "codeSnippetTab")) {
+ // it's a tab
+ tab = divs[j];
+ tabDivs[tabDivs.length] = tab;
+ }
+ }
+
+ // activate/deactivate the tabs
+ var tabLink;
+ var visibleTabs = new Array();
+ for (j = 0; j < tabDivs.length; j++) {
+ tab = tabDivs[j];
+
+ if (hasElementClass(tab, languageToShow)) {
+ addClassToElement(tab, "csActiveTab");
+ tabLink = tab.getElementsByTagName("a")[0];
+ tabLink.removeAttribute("href");
+ langIsNA = hasElementClass(tab, "csNaTab");
+ } else {
+ removeClassFromElement(tab, "csActiveTab");
+ var shortLang = getLangOfCodeSnippetCode(tab).substring(4);
+ tabLink = tab.getElementsByTagName("a")[0];
+ tabLink.setAttribute("href", "javascript: CodeSnippet_SetLanguage('" + shortLang + "');");
+ }
+
+ // get visible tabs; invisible tabs are: with not supported lang AND not active
+ if (!(hasElementClass(tab, "csNaTab") && !hasElementClass(tab, "csActiveTab"))) {
+ // tab is visible
+ visibleTabs[visibleTabs.length] = tab;
+ }
+ }
+
+ // fix some styles (first, last) of visible tabs and corners
+ for (j = 0; j < visibleTabs.length; j++) {
+ tab = visibleTabs[j];
+
+ removeClassFromElement(tab, "csFirstTab");
+ removeClassFromElement(tab, "csLastTab");
+ if (j === 0) {
+ addClassToElement(tab, "csFirstTab");
+ if (hasElementClass(tab, "csActiveTab")) {
+ removeClassFromElement(leftCorner, "codeSnippetTabLeftCorner");
+ addClassToElement(leftCorner, "codeSnippetTabLeftCornerActive");
+ }
+ }
+ if (j === visibleTabs.length - 1) {
+ addClassToElement(tab, "csLastTab");
+ if (hasElementClass(tab, "csActiveTab")) {
+ removeClassFromElement(rightCorner, "codeSnippetTabRightCorner");
+ addClassToElement(rightCorner, "codeSnippetTabRightCornerActive");
+ }
+ }
+ }
+
+ // show/hide code block
+ codeCollection = getDivWithClass(snippet, "codeSnippetCodeCollection");
+ divs = codeCollection.getElementsByTagName("div");
+ for (j = 0; j < divs.length; j++) {
+ if (hasElementClass(divs[j], "codeSnippetCode")) {
+ // it's a code block
+ if (langIsNA) {
+ showHideTag(divs[j], hasElementClass(divs[j], "codeNA"));
+ } else {
+ showHideTag(divs[j], hasElementClass(divs[j], languageToShow));
+ }
+ }
+ }
+
+ }
+ }
+
+ } catch (ex) {
+ // empty
+ }
+}
+
+
+function showHideTag(tag, visible) {
+ try {
+ if (visible) {
+ tag.style.display = "";
+ } else {
+ tag.style.display = "none";
+ }
+ } catch (e) {
+ /*empty*/
+ }
+}
+
+// #endregion LANGUAGE FILTER **********************
+
+
+
+// #region COPY CODE ***************************
+
+function CopyCode(item) {
+ try {
+ // get the visible code block div
+ var codeCollection = item.parentNode.parentNode;
+ var divs = codeCollection.getElementsByTagName("div");
+ var i, shownCode;
+ for (i = 0; i < divs.length; i++) {
+ if (hasElementClass(divs[i], "codeSnippetCode")) {
+ // it's a code block
+ if (divs[i].style.display !== "none") {
+ shownCode = divs[i];
+ break;
+ }
+ }
+ }
+
+ if (shownCode) {
+ // get code and remove
+ var code;
+ code = shownCode.innerHTML;
+ code = code.replace(/
/gi, "\n");
+ code = code.replace(/<\/td>/gi, " \n"); // syntax highlighter removes \n chars and puts each line in separate
+ code = code.trim(); // remove leading spaces which are unwanted in FF
+ // get plain text
+ var tmpDiv = document.createElement('div');
+ tmpDiv.innerHTML = code;
+
+ if (typeof tmpDiv.textContent !== "undefined") {
+ // standards compliant
+ code = tmpDiv.textContent;
+ }
+ else if (typeof tmpDiv.innerText !== "undefined") {
+ // IE only
+ code = tmpDiv.innerText;
+ }
+
+ try {
+ // works in IE only
+ window.clipboardData.setData("Text", code);
+ } catch (ex) {
+ popCodeWindow(code);
+ }
+ }
+ } catch (e) {
+ /*empty*/
+ }
+}
+
+
+function popCodeWindow(code) {
+ try {
+ var codeWindow = window.open("",
+ "Copy the selected code",
+ "location=0,status=0,toolbar=0,menubar =0,directories=0,resizable=1,scrollbars=1,height=400, width=400");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("Copy the selected code ");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln('');
+ codeWindow.document.writeln(escapeHTML(code));
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("");
+ // the selectNode function below, converted by http://www.howtocreate.co.uk/tutorials/jsexamples/syntax/prepareInline.html
+ var ftn = "function selectNode (node) {\n\tvar selection, range, doc, win;\n\tif ((doc = node.ownerDocument) && \n\t\t(win = doc.defaultView) && \n\t\ttypeof win.getSelection != \'undefined\' && \n\t\ttypeof doc.createRange != \'undefined\' && \n\t\t(selection = window.getSelection()) && \n\t\ttypeof selection.removeAllRanges != \'undefined\') {\n\t\t\t\n\t\trange = doc.createRange();\n\t\trange.selectNode(node);\n selection.removeAllRanges();\n selection.addRange(range);\n\t} else if (document.body && \n\t\t\ttypeof document.body.createTextRange != \'undefined\' && \n\t\t\t(range = document.body.createTextRange())) {\n \n\t\t \trange.moveToElementText(node);\n \trange.select();\n }\n} ";
+ codeWindow.document.writeln(ftn);
+ codeWindow.document.writeln("selectNode(document.getElementById('code_text')); ");
+ codeWindow.document.writeln("");
+ codeWindow.document.writeln("");
+ codeWindow.document.close();
+ } catch (ex) { /*empty*/ }
+}
+
+
+function escapeHTML(str) {
+ return str.replace(/&/g, "&").
+ replace(/>/g, ">").
+ replace(/>}
+ * */
+var search_result = [];
+
+/**
+ * The array of document details for displayed search results. It is read from one large summaries s_all.sj file.
+ * Used when readCommonTitlesFile = true.
+ * A single document info has format: search_result['DocumentId'] = ['Url','Title','Summary'].
+ *
+ * @type {Array>}
+ * */
+var _s = [];
+
+/**
+ * The count of results shown in one step. -1 means unlimited.
+ * @type {number}
+ * */
+var paginationSize = 25;
+
+/**
+ * Indicates whether topic titles and summaries are read from one common large file 's_all.js'
+ * or whether each title will be loaded from its own file named 's_TOPIC-ID.js'.
+ *
+ * With a huge index, e.g. 20000 topics, the single common file may be quite large. But still it is better
+ * solution, because each loading of a small file with just sibgle topic takes about 100ms, which is 2.5 seconds for 25 results.
+ *
+ * @type {boolean}
+ * */
+var readCommonTitlesFile = true;
+
+/**
+ * The search terms from the user.
+ * @var {Array.} qterms
+ */
+
+
+/**
+ * Normalizes dots and spaces in a search query string.
+ * @param {string} text The search query text.
+ * @returns {string} Normalized search text.
+ */
+function stripSpaces(text) {
+ // return text.replace(/^\W+/,'').replace(/\W+$/,'');
+ text = text.replace(/\./g, ' '); // replace dots with spaces
+ return text.split(" ").join(" "); // remove multiple spaces
+}
+
+/**
+ * Gets a search match bitmap where a bit at the specified position is set to 1.
+ * A search match bitmap indicates, for which search term (qterm) a match was found
+ * for a specific document.
+ *
+ * @param {number} setbit A zero-based index of the bit to set to 1.
+ * @param {number} size A size of bitmap, which is the count of the qterms.
+ * @returns {Array.} The bitmap with one bit set.
+ */
+function get_bitmap(setbit, size) {
+ var map = {};
+ for (let i = 0; i < size; ++i) {
+ map[i] = 0;
+ }
+ map[setbit] = 1;
+ return map;
+}
+
+/**
+ * Fills the 'qterms' global variable with the terms from the 'search' query.
+ * */
+function getQtermsFromUrlQuery() {
+ // extract all search terms
+ var query = getQueryParameterByName("search");
+ if (!query || query === "") {
+ return;
+ }
+ var terms = stripSpaces(query.toLowerCase());
+
+ qterms = [];
+ var chunks = terms.split(" ");
+ for (let i in chunks) {
+ if (chunks[i]) {
+ qterms[qterms.length] = chunks[i];
+ }
+ }
+}
+
+/**
+ * Executes a search according to the 'search' query parameter.
+ *
+ * */
+function search() {
+ // extract all search terms
+ getQtermsFromUrlQuery();
+
+ /**
+ * For each document ID that has some match, contains a bitmap of matched terms and cumulative relevance.
+ * @type {Object., relevance:number} >} */
+ var candidates = {};
+
+ for (let qtermIndex in qterms) {
+ /** @type {string} */
+ let term = qterms[qtermIndex];
+ let onlyWholeWord = false;
+ // Read the user setting, whether he wants to always match whole words, even if no quotes around are used.
+ // The user can define it in the CSS, e.g. in vsdocman_overrides.css:
+ // :root {
+ // --searchAlwaysWholeWord: true;
+ // }
+ onlyWholeWord = getCssCustomProperty("--searchAlwaysWholeWord", "boolean");
+ if (term.length > 2 && term.startsWith("\"") && term.endsWith("\"")) {
+ term = term.substr(1, term.length - 2);
+ onlyWholeWord = true;
+ }
+
+ // index= "term1":"[[docId1, relevance1],.., [docIdN, relevanceN]]", ..., "term5":"[[docId1, relevance1],.., [docIdN, relevanceN]]""
+
+ // whole words
+ let termDocs=index[term]; // serialized string (instead of a direct array) for much faster parsing of search_index.js
+ if (termDocs !== undefined) {
+ termDocs = JSON.parse(termDocs); // deserialize
+ for (let i in termDocs) {
+ let docId = termDocs[i][0];
+ let relevance = termDocs[i][1];
+ if (candidates[docId] === undefined) {
+ candidates[docId] = {};
+ candidates[docId].matchBitmap = get_bitmap(qtermIndex, qterms.length);
+ candidates[docId].relevance = relevance;
+ }
+ else {
+ candidates[docId].matchBitmap[qtermIndex] = 1;
+ candidates[docId].relevance += relevance;
+ }
+ }
+ }
+
+ // parts of words
+ if (!onlyWholeWord) {
+ for (let indexedTerm in index) {
+ if (indexedTerm.indexOf(term) >= 0) {
+ termDocs = index[indexedTerm]; // serialized string (instead of a direct array) for much faster parsing of search_index.js
+ termDocs = JSON.parse(termDocs); // deserialize
+ for (let i in termDocs) {
+ let docId = termDocs[i][0];
+ let relevance = termDocs[i][1];
+ if (candidates[docId] === undefined) {
+ candidates[docId] = {};
+ candidates[docId].matchBitmap = get_bitmap(qtermIndex, qterms.length);
+ candidates[docId].relevance = relevance;
+ }
+ else {
+ candidates[docId].matchBitmap[qtermIndex] = 1;
+ candidates[docId].relevance += relevance;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ let results = [];
+ // sort by relevance in descending order
+ let sortedDocIds = [];
+ for (let key in candidates) sortedDocIds.push(key);
+ sortedDocIds.sort(function (a, b) {
+ return candidates[b].relevance - candidates[a].relevance;
+ });
+ for (let i = 0; i < sortedDocIds.length; i++) {
+ let docIndex = sortedDocIds[i];
+ let on = 1;
+ for (let i in qterms) {
+ on = on && candidates[docIndex].matchBitmap[i];
+ }
+ if (on) {
+ results.push(docIndex);
+ }
+ }
+ let resultsCount = results.length;
+
+ document.getElementById("search-results-heading-count").appendChild(document.createTextNode(resultsCount)); // safe way of setting un-escaped text
+ let sPhrase = getQueryParameterByName("search");
+ sPhrase = "\"" + sPhrase + "\"";
+ document.getElementById("search-results-heading-phrase").appendChild(document.createTextNode(sPhrase)); // safe way of setting un-escaped text
+
+ var appendPromise = loadAndAppendSearchResultItems(results, 0, paginationSize);
+}
+
+
+/**
+ * For specified file indexes range, loads and displays the search results.
+ * @param {Array.} docIds The doc IDs (assigned by the indexer) of all search results.
+ * @param {number} from The index of the first item to append in the docIndexes.
+ * @param {number} count The count of items to append from the docIndexes.
+ * @returns {Promise} A promise that is resolved when the result is displayed. The value is the last file index appended.
+ */
+function loadAndAppendSearchResultItems(docIds, from, count) {
+ var appendPromise = Promise.resolve(); //immediately resolving promise
+ for (let i = from; i < from + count && i < docIds.length; i++) {
+ appendPromise = appendPromise.then(() => loadAndAppendSearchResultItem(docIds[i]));
+ }
+
+ appendPromise = appendPromise.then(() => {
+ if (docIds.length > from + count) {
+ showHidePaginationControls(true, docIds, from+count, count);
+ } else {
+ showHidePaginationControls(false, docIds, 0, 0);
+ }
+ return 0; // return anything
+ });
+
+ return appendPromise;
+}
+
+
+/**
+ * Shows or hide pagination links.
+ * @param {boolean} show Show or hide.
+ * @param {Array.} docIds The doc IDs (assigned by the indexer) of all search results.
+ * @param {number} nextFrom The index of the next item to append in the docIndexes when the NEXT link is pressed.
+ * @param {number} count The count of items to append from the docIndexes when the NEXT link is pressed..
+ */
+function showHidePaginationControls(show, docIds, nextFrom, count) {
+ let paginationDiv = document.getElementById("search-results-pagination");
+ if (!paginationDiv) {
+ if (show) {
+ // create
+ let parent = document.getElementById("search-results-section");
+ paginationDiv = document.createElement('div');
+ paginationDiv.id = "search-results-pagination";
+ parent.appendChild(paginationDiv);
+
+ let a = document.createElement('a');
+ a.id = "search-pagination-next";
+ a.href = "";
+ a.appendChild(document.createTextNode("Next " + paginationSize + " >>")); // safe way of setting un-escaped text
+ paginationDiv.appendChild(a);
+
+ a = document.createElement('a');
+ a.id = "search-pagination-all";
+ a.href = "";
+ a.appendChild(document.createTextNode("All >>")); // safe way of setting un-escaped text
+ paginationDiv.appendChild(a);
+
+ } else {
+ return;
+ }
+ }
+
+ if (show) {
+ paginationDiv.classList.add("visible");
+ // update click actions
+ let a = document.getElementById("search-pagination-next");
+ a.onclick = function () {
+ loadAndAppendSearchResultItems(docIds, nextFrom, count);
+ return false;
+ };
+
+ a = document.getElementById("search-pagination-all");
+ a.onclick = function () {
+ loadAndAppendSearchResultItems(docIds, nextFrom, docIds.length - nextFrom);
+ return false;
+ };
+ } else {
+ paginationDiv.classList.remove("visible");
+ }
+}
+
+
+/**
+ * For a specified file index, loads and displays the search result.
+ * @param {number} fileIndex The search index (assigned by the indexer) of the result file.
+ * @returns {Promise} A promise that is resolved when the result is displayed. The value is fileIndex.
+ */
+function loadAndAppendSearchResultItem(fileIndex) {
+ if (readCommonTitlesFile) {
+ // Read the search result details from one common large file which contains all topics.
+ // This method is much faster over network, but the 's_all.js' file may be quite large
+ // for many, e.g. 20000, topics. So the first search will be slower, then the file will be cached.
+
+ // ensure the file info is loaded
+ return loadScriptOnce("search--/s_all.js")
+ .then(
+ function (scriptWasLoadedNow) {
+ // the loaded script defines all search results as _s[fileIndex]
+ let url = _s[fileIndex][0];
+ let title = _s[fileIndex][1];
+ let summary = _s[fileIndex][2];
+ appendSearchResultItem(url, title, summary);
+ return fileIndex;
+ });
+
+ } else {
+ // Read the search result details from a separate small file, one for each topic.
+ // This method is fast for local pages, but is slow on network, as each load of
+ // a small file takes about 100ms.
+
+ // ensure the file info is loaded
+ return loadScriptOnce("search--/s_" + fileIndex + ".js")
+ .then(
+ function (scriptWasLoadedNow) {
+ // the loaded script defines search_result[fileIndex]
+ let url = search_result[fileIndex][0];
+ let title = search_result[fileIndex][1];
+ let summary = search_result[fileIndex][2];
+ appendSearchResultItem(url, title, summary);
+ return fileIndex;
+ });
+
+ }
+
+}
+
+/**
+ * Appends specified search result to the list of results.
+ * @param {string} url The URL of the search result.
+ * @param {string} title The title of the search result.
+ * @param {string} summary The summary of the search result, if any.
+ */
+function appendSearchResultItem(url, title, summary) {
+ var containerElm = document.getElementById("search-results-container");
+ if (!containerElm) {
+ return;
+ }
+
+ var div = document.createElement('div');
+ div.className = "search-result-item";
+
+ var div2 = document.createElement('div');
+ div2.className = "search-result-title";
+ div.appendChild(div2);
+
+ var a = document.createElement('a');
+ a.href = url;
+ //a.appendChild(document.createTextNode(title)); // safe way of setting un-escaped text
+ a.innerHTML = title; // 'title' is already HTML encoded
+ div2.appendChild(a);
+
+ div2 = document.createElement('div');
+ div2.className = "search-result-summary";
+ div2.appendChild(document.createTextNode(summary)); // safe way of setting un-escaped text
+ div.appendChild(div2);
+
+ containerElm.appendChild(div);
+}
+
+
+function highlightSearchTerms() {
+ try {
+ colors = ['yellow', 'lightgreen', 'gold', 'orange', 'magenta', 'lightblue'];
+ getQtermsFromUrlQuery();
+ if (qterms !== undefined) {
+ for (let i in qterms) {
+ document.body.innerHTML = doHighlight(document.body.innerHTML, qterms[i], colors[i % colors.length]);
+ }
+ }
+ } catch (ex) { ; }
+}
+
+// from http://www.nsftools.com/misc/SearchAndHighlight.htm
+
+/*
+ * This is the function that actually highlights a text string by
+ * adding HTML tags before and after all occurrences of the search
+ * term. You can pass your own tags if you'd like, or if the
+ * highlightStartTag or highlightEndTag parameters are omitted or
+ * are empty strings then the default tags will be used.
+ */
+function doHighlight(bodyText, searchTerm, color, highlightStartTag, highlightEndTag) {
+ // the highlightStartTag and highlightEndTag parameters are optional
+ if (!highlightStartTag || !highlightEndTag) {
+ highlightStartTag = "";
+ highlightEndTag = "";
+ }
+
+ // find all occurrences of the search term in the given text,
+ // and add some "highlight" tags to them (we're not using a
+ // regular expression search, because we want to filter out
+ // matches that occur within HTML tags and script blocks, so
+ // we have to do a little extra validation)
+ var newText = "";
+ var i = -1;
+ var lcSearchTerm = searchTerm.toLowerCase();
+ var lcBodyText = bodyText.toLowerCase();
+
+ while (bodyText.length > 0) {
+ i = lcBodyText.indexOf(lcSearchTerm, i + 1);
+ if (i < 0) {
+ newText += bodyText;
+ bodyText = "";
+ } else {
+ // skip anything inside an HTML tag
+ if (bodyText.lastIndexOf(">", i) >= bodyText.lastIndexOf("<", i)) {
+ // skip anything inside a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Search results for
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+