comparison lib/GeoTemCo/platin.js @ 2:35c11979b58b

added current version of platin
author Dirk Wintergruen <dwinter@mpiwg-berlin.mpg.de>
date Tue, 02 Jun 2015 13:52:44 +0200
parents ea066ce001bd
children 1b6cde0e4b83
comparison
equal deleted inserted replaced
1:ea066ce001bd 2:35c11979b58b
18301 done(); 18301 done();
18302 }); 18302 });
18303 }; 18303 };
18304 18304
18305 })(jQuery); 18305 })(jQuery);
18306 /*globals jQuery, define, exports, require, window, document, postMessage */
18307 (function (factory) {
18308 "use strict";
18309 if (typeof define === 'function' && define.amd) {
18310 define(['jquery'], factory);
18311 }
18312 else if(typeof exports === 'object') {
18313 factory(require('jquery'));
18314 }
18315 else {
18316 factory(jQuery);
18317 }
18318 }(function ($, undefined) {
18319 "use strict";
18320 /*!
18321 * jsTree 3.0.9
18322 * http://jstree.com/
18323 *
18324 * Copyright (c) 2014 Ivan Bozhanov (http://vakata.com)
18325 *
18326 * Licensed same as jquery - under the terms of the MIT License
18327 * http://www.opensource.org/licenses/mit-license.php
18328 */
18329 /*!
18330 * if using jslint please allow for the jQuery global and use following options:
18331 * jslint: browser: true, ass: true, bitwise: true, continue: true, nomen: true, plusplus: true, regexp: true, unparam: true, todo: true, white: true
18332 */
18333
18334 // prevent another load? maybe there is a better way?
18335 if($.jstree) {
18336 return;
18337 }
18338
18339 /**
18340 * ### jsTree core functionality
18341 */
18342
18343 // internal variables
18344 var instance_counter = 0,
18345 ccp_node = false,
18346 ccp_mode = false,
18347 ccp_inst = false,
18348 themes_loaded = [],
18349 src = $('script:last').attr('src'),
18350 _d = document, _node = _d.createElement('LI'), _temp1, _temp2;
18351
18352 _node.setAttribute('role', 'treeitem');
18353 _temp1 = _d.createElement('I');
18354 _temp1.className = 'jstree-icon jstree-ocl';
18355 _temp1.setAttribute('role', 'presentation');
18356 _node.appendChild(_temp1);
18357 _temp1 = _d.createElement('A');
18358 _temp1.className = 'jstree-anchor';
18359 _temp1.setAttribute('href','#');
18360 _temp1.setAttribute('tabindex','-1');
18361 _temp2 = _d.createElement('I');
18362 _temp2.className = 'jstree-icon jstree-themeicon';
18363 _temp2.setAttribute('role', 'presentation');
18364 _temp1.appendChild(_temp2);
18365 _node.appendChild(_temp1);
18366 _temp1 = _temp2 = null;
18367
18368
18369 /**
18370 * holds all jstree related functions and variables, including the actual class and methods to create, access and manipulate instances.
18371 * @name $.jstree
18372 */
18373 $.jstree = {
18374 /**
18375 * specifies the jstree version in use
18376 * @name $.jstree.version
18377 */
18378 version : '3.0.9',
18379 /**
18380 * holds all the default options used when creating new instances
18381 * @name $.jstree.defaults
18382 */
18383 defaults : {
18384 /**
18385 * configure which plugins will be active on an instance. Should be an array of strings, where each element is a plugin name. The default is `[]`
18386 * @name $.jstree.defaults.plugins
18387 */
18388 plugins : []
18389 },
18390 /**
18391 * stores all loaded jstree plugins (used internally)
18392 * @name $.jstree.plugins
18393 */
18394 plugins : {},
18395 path : src && src.indexOf('/') !== -1 ? src.replace(/\/[^\/]+$/,'') : '',
18396 idregex : /[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g
18397 };
18398 /**
18399 * creates a jstree instance
18400 * @name $.jstree.create(el [, options])
18401 * @param {DOMElement|jQuery|String} el the element to create the instance on, can be jQuery extended or a selector
18402 * @param {Object} options options for this instance (extends `$.jstree.defaults`)
18403 * @return {jsTree} the new instance
18404 */
18405 $.jstree.create = function (el, options) {
18406 var tmp = new $.jstree.core(++instance_counter),
18407 opt = options;
18408 options = $.extend(true, {}, $.jstree.defaults, options);
18409 if(opt && opt.plugins) {
18410 options.plugins = opt.plugins;
18411 }
18412 $.each(options.plugins, function (i, k) {
18413 if(i !== 'core') {
18414 tmp = tmp.plugin(k, options[k]);
18415 }
18416 });
18417 tmp.init(el, options);
18418 return tmp;
18419 };
18420 /**
18421 * remove all traces of jstree from the DOM and destroy all instances
18422 * @name $.jstree.destroy()
18423 */
18424 $.jstree.destroy = function () {
18425 $('.jstree:jstree').jstree('destroy');
18426 $(document).off('.jstree');
18427 };
18428 /**
18429 * the jstree class constructor, used only internally
18430 * @private
18431 * @name $.jstree.core(id)
18432 * @param {Number} id this instance's index
18433 */
18434 $.jstree.core = function (id) {
18435 this._id = id;
18436 this._cnt = 0;
18437 this._wrk = null;
18438 this._data = {
18439 core : {
18440 themes : {
18441 name : false,
18442 dots : false,
18443 icons : false
18444 },
18445 selected : [],
18446 last_error : {},
18447 working : false,
18448 worker_queue : [],
18449 focused : null
18450 }
18451 };
18452 };
18453 /**
18454 * get a reference to an existing instance
18455 *
18456 * __Examples__
18457 *
18458 * // provided a container with an ID of "tree", and a nested node with an ID of "branch"
18459 * // all of there will return the same instance
18460 * $.jstree.reference('tree');
18461 * $.jstree.reference('#tree');
18462 * $.jstree.reference($('#tree'));
18463 * $.jstree.reference(document.getElementByID('tree'));
18464 * $.jstree.reference('branch');
18465 * $.jstree.reference('#branch');
18466 * $.jstree.reference($('#branch'));
18467 * $.jstree.reference(document.getElementByID('branch'));
18468 *
18469 * @name $.jstree.reference(needle)
18470 * @param {DOMElement|jQuery|String} needle
18471 * @return {jsTree|null} the instance or `null` if not found
18472 */
18473 $.jstree.reference = function (needle) {
18474 var tmp = null,
18475 obj = null;
18476 if(needle && needle.id) { needle = needle.id; }
18477
18478 if(!obj || !obj.length) {
18479 try { obj = $(needle); } catch (ignore) { }
18480 }
18481 if(!obj || !obj.length) {
18482 try { obj = $('#' + needle.replace($.jstree.idregex,'\\$&')); } catch (ignore) { }
18483 }
18484 if(obj && obj.length && (obj = obj.closest('.jstree')).length && (obj = obj.data('jstree'))) {
18485 tmp = obj;
18486 }
18487 else {
18488 $('.jstree').each(function () {
18489 var inst = $(this).data('jstree');
18490 if(inst && inst._model.data[needle]) {
18491 tmp = inst;
18492 return false;
18493 }
18494 });
18495 }
18496 return tmp;
18497 };
18498 /**
18499 * Create an instance, get an instance or invoke a command on a instance.
18500 *
18501 * If there is no instance associated with the current node a new one is created and `arg` is used to extend `$.jstree.defaults` for this new instance. There would be no return value (chaining is not broken).
18502 *
18503 * If there is an existing instance and `arg` is a string the command specified by `arg` is executed on the instance, with any additional arguments passed to the function. If the function returns a value it will be returned (chaining could break depending on function).
18504 *
18505 * If there is an existing instance and `arg` is not a string the instance itself is returned (similar to `$.jstree.reference`).
18506 *
18507 * In any other case - nothing is returned and chaining is not broken.
18508 *
18509 * __Examples__
18510 *
18511 * $('#tree1').jstree(); // creates an instance
18512 * $('#tree2').jstree({ plugins : [] }); // create an instance with some options
18513 * $('#tree1').jstree('open_node', '#branch_1'); // call a method on an existing instance, passing additional arguments
18514 * $('#tree2').jstree(); // get an existing instance (or create an instance)
18515 * $('#tree2').jstree(true); // get an existing instance (will not create new instance)
18516 * $('#branch_1').jstree().select_node('#branch_1'); // get an instance (using a nested element and call a method)
18517 *
18518 * @name $().jstree([arg])
18519 * @param {String|Object} arg
18520 * @return {Mixed}
18521 */
18522 $.fn.jstree = function (arg) {
18523 // check for string argument
18524 var is_method = (typeof arg === 'string'),
18525 args = Array.prototype.slice.call(arguments, 1),
18526 result = null;
18527 if(arg === true && !this.length) { return false; }
18528 this.each(function () {
18529 // get the instance (if there is one) and method (if it exists)
18530 var instance = $.jstree.reference(this),
18531 method = is_method && instance ? instance[arg] : null;
18532 // if calling a method, and method is available - execute on the instance
18533 result = is_method && method ?
18534 method.apply(instance, args) :
18535 null;
18536 // if there is no instance and no method is being called - create one
18537 if(!instance && !is_method && (arg === undefined || $.isPlainObject(arg))) {
18538 $(this).data('jstree', new $.jstree.create(this, arg));
18539 }
18540 // if there is an instance and no method is called - return the instance
18541 if( (instance && !is_method) || arg === true ) {
18542 result = instance || false;
18543 }
18544 // if there was a method call which returned a result - break and return the value
18545 if(result !== null && result !== undefined) {
18546 return false;
18547 }
18548 });
18549 // if there was a method call with a valid return value - return that, otherwise continue the chain
18550 return result !== null && result !== undefined ?
18551 result : this;
18552 };
18553 /**
18554 * used to find elements containing an instance
18555 *
18556 * __Examples__
18557 *
18558 * $('div:jstree').each(function () {
18559 * $(this).jstree('destroy');
18560 * });
18561 *
18562 * @name $(':jstree')
18563 * @return {jQuery}
18564 */
18565 $.expr[':'].jstree = $.expr.createPseudo(function(search) {
18566 return function(a) {
18567 return $(a).hasClass('jstree') &&
18568 $(a).data('jstree') !== undefined;
18569 };
18570 });
18571
18572 /**
18573 * stores all defaults for the core
18574 * @name $.jstree.defaults.core
18575 */
18576 $.jstree.defaults.core = {
18577 /**
18578 * data configuration
18579 *
18580 * If left as `false` the HTML inside the jstree container element is used to populate the tree (that should be an unordered list with list items).
18581 *
18582 * You can also pass in a HTML string or a JSON array here.
18583 *
18584 * It is possible to pass in a standard jQuery-like AJAX config and jstree will automatically determine if the response is JSON or HTML and use that to populate the tree.
18585 * In addition to the standard jQuery ajax options here you can suppy functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node is being loaded, the return value of those functions will be used.
18586 *
18587 * The last option is to specify a function, that function will receive the node being loaded as argument and a second param which is a function which should be called with the result.
18588 *
18589 * __Examples__
18590 *
18591 * // AJAX
18592 * $('#tree').jstree({
18593 * 'core' : {
18594 * 'data' : {
18595 * 'url' : '/get/children/',
18596 * 'data' : function (node) {
18597 * return { 'id' : node.id };
18598 * }
18599 * }
18600 * });
18601 *
18602 * // direct data
18603 * $('#tree').jstree({
18604 * 'core' : {
18605 * 'data' : [
18606 * 'Simple root node',
18607 * {
18608 * 'id' : 'node_2',
18609 * 'text' : 'Root node with options',
18610 * 'state' : { 'opened' : true, 'selected' : true },
18611 * 'children' : [ { 'text' : 'Child 1' }, 'Child 2']
18612 * }
18613 * ]
18614 * });
18615 *
18616 * // function
18617 * $('#tree').jstree({
18618 * 'core' : {
18619 * 'data' : function (obj, callback) {
18620 * callback.call(this, ['Root 1', 'Root 2']);
18621 * }
18622 * });
18623 *
18624 * @name $.jstree.defaults.core.data
18625 */
18626 data : false,
18627 /**
18628 * configure the various strings used throughout the tree
18629 *
18630 * You can use an object where the key is the string you need to replace and the value is your replacement.
18631 * Another option is to specify a function which will be called with an argument of the needed string and should return the replacement.
18632 * If left as `false` no replacement is made.
18633 *
18634 * __Examples__
18635 *
18636 * $('#tree').jstree({
18637 * 'core' : {
18638 * 'strings' : {
18639 * 'Loading ...' : 'Please wait ...'
18640 * }
18641 * }
18642 * });
18643 *
18644 * @name $.jstree.defaults.core.strings
18645 */
18646 strings : false,
18647 /**
18648 * determines what happens when a user tries to modify the structure of the tree
18649 * If left as `false` all operations like create, rename, delete, move or copy are prevented.
18650 * You can set this to `true` to allow all interactions or use a function to have better control.
18651 *
18652 * __Examples__
18653 *
18654 * $('#tree').jstree({
18655 * 'core' : {
18656 * 'check_callback' : function (operation, node, node_parent, node_position, more) {
18657 * // operation can be 'create_node', 'rename_node', 'delete_node', 'move_node' or 'copy_node'
18658 * // in case of 'rename_node' node_position is filled with the new node name
18659 * return operation === 'rename_node' ? true : false;
18660 * }
18661 * }
18662 * });
18663 *
18664 * @name $.jstree.defaults.core.check_callback
18665 */
18666 check_callback : false,
18667 /**
18668 * a callback called with a single object parameter in the instance's scope when something goes wrong (operation prevented, ajax failed, etc)
18669 * @name $.jstree.defaults.core.error
18670 */
18671 error : $.noop,
18672 /**
18673 * the open / close animation duration in milliseconds - set this to `false` to disable the animation (default is `200`)
18674 * @name $.jstree.defaults.core.animation
18675 */
18676 animation : 200,
18677 /**
18678 * a boolean indicating if multiple nodes can be selected
18679 * @name $.jstree.defaults.core.multiple
18680 */
18681 multiple : true,
18682 /**
18683 * theme configuration object
18684 * @name $.jstree.defaults.core.themes
18685 */
18686 themes : {
18687 /**
18688 * the name of the theme to use (if left as `false` the default theme is used)
18689 * @name $.jstree.defaults.core.themes.name
18690 */
18691 name : false,
18692 /**
18693 * the URL of the theme's CSS file, leave this as `false` if you have manually included the theme CSS (recommended). You can set this to `true` too which will try to autoload the theme.
18694 * @name $.jstree.defaults.core.themes.url
18695 */
18696 url : false,
18697 /**
18698 * the location of all jstree themes - only used if `url` is set to `true`
18699 * @name $.jstree.defaults.core.themes.dir
18700 */
18701 dir : false,
18702 /**
18703 * a boolean indicating if connecting dots are shown
18704 * @name $.jstree.defaults.core.themes.dots
18705 */
18706 dots : true,
18707 /**
18708 * a boolean indicating if node icons are shown
18709 * @name $.jstree.defaults.core.themes.icons
18710 */
18711 icons : true,
18712 /**
18713 * a boolean indicating if the tree background is striped
18714 * @name $.jstree.defaults.core.themes.stripes
18715 */
18716 stripes : false,
18717 /**
18718 * a string (or boolean `false`) specifying the theme variant to use (if the theme supports variants)
18719 * @name $.jstree.defaults.core.themes.variant
18720 */
18721 variant : false,
18722 /**
18723 * a boolean specifying if a reponsive version of the theme should kick in on smaller screens (if the theme supports it). Defaults to `false`.
18724 * @name $.jstree.defaults.core.themes.responsive
18725 */
18726 responsive : false
18727 },
18728 /**
18729 * if left as `true` all parents of all selected nodes will be opened once the tree loads (so that all selected nodes are visible to the user)
18730 * @name $.jstree.defaults.core.expand_selected_onload
18731 */
18732 expand_selected_onload : true,
18733 /**
18734 * if left as `true` web workers will be used to parse incoming JSON data where possible, so that the UI will not be blocked by large requests. Workers are however about 30% slower. Defaults to `true`
18735 * @name $.jstree.defaults.core.worker
18736 */
18737 worker : true,
18738 /**
18739 * Force node text to plain text (and escape HTML). Defaults to `false`
18740 * @name $.jstree.defaults.core.force_text
18741 */
18742 force_text : false,
18743 /**
18744 * Should the node should be toggled if the text is double clicked . Defaults to `true`
18745 * @name $.jstree.defaults.core.dblclick_toggle
18746 */
18747 dblclick_toggle : true
18748 };
18749 $.jstree.core.prototype = {
18750 /**
18751 * used to decorate an instance with a plugin. Used internally.
18752 * @private
18753 * @name plugin(deco [, opts])
18754 * @param {String} deco the plugin to decorate with
18755 * @param {Object} opts options for the plugin
18756 * @return {jsTree}
18757 */
18758 plugin : function (deco, opts) {
18759 var Child = $.jstree.plugins[deco];
18760 if(Child) {
18761 this._data[deco] = {};
18762 Child.prototype = this;
18763 return new Child(opts, this);
18764 }
18765 return this;
18766 },
18767 /**
18768 * used to decorate an instance with a plugin. Used internally.
18769 * @private
18770 * @name init(el, optons)
18771 * @param {DOMElement|jQuery|String} el the element we are transforming
18772 * @param {Object} options options for this instance
18773 * @trigger init.jstree, loading.jstree, loaded.jstree, ready.jstree, changed.jstree
18774 */
18775 init : function (el, options) {
18776 this._model = {
18777 data : {
18778 '#' : {
18779 id : '#',
18780 parent : null,
18781 parents : [],
18782 children : [],
18783 children_d : [],
18784 state : { loaded : false }
18785 }
18786 },
18787 changed : [],
18788 force_full_redraw : false,
18789 redraw_timeout : false,
18790 default_state : {
18791 loaded : true,
18792 opened : false,
18793 selected : false,
18794 disabled : false
18795 }
18796 };
18797
18798 this.element = $(el).addClass('jstree jstree-' + this._id);
18799 this.settings = options;
18800
18801 this._data.core.ready = false;
18802 this._data.core.loaded = false;
18803 this._data.core.rtl = (this.element.css("direction") === "rtl");
18804 this.element[this._data.core.rtl ? 'addClass' : 'removeClass']("jstree-rtl");
18805 this.element.attr('role','tree');
18806 if(this.settings.core.multiple) {
18807 this.element.attr('aria-multiselectable', true);
18808 }
18809 if(!this.element.attr('tabindex')) {
18810 this.element.attr('tabindex','0');
18811 }
18812
18813 this.bind();
18814 /**
18815 * triggered after all events are bound
18816 * @event
18817 * @name init.jstree
18818 */
18819 this.trigger("init");
18820
18821 this._data.core.original_container_html = this.element.find(" > ul > li").clone(true);
18822 this._data.core.original_container_html
18823 .find("li").addBack()
18824 .contents().filter(function() {
18825 return this.nodeType === 3 && (!this.nodeValue || /^\s+$/.test(this.nodeValue));
18826 })
18827 .remove();
18828 this.element.html("<"+"ul class='jstree-container-ul jstree-children' role='group'><"+"li id='j"+this._id+"_loading' class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='tree-item'><i class='jstree-icon jstree-ocl'></i><"+"a class='jstree-anchor' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>" + this.get_string("Loading ...") + "</a></li></ul>");
18829 this.element.attr('aria-activedescendant','j' + this._id + '_loading');
18830 this._data.core.li_height = this.get_container_ul().children("li").first().height() || 24;
18831 /**
18832 * triggered after the loading text is shown and before loading starts
18833 * @event
18834 * @name loading.jstree
18835 */
18836 this.trigger("loading");
18837 this.load_node('#');
18838 },
18839 /**
18840 * destroy an instance
18841 * @name destroy()
18842 * @param {Boolean} keep_html if not set to `true` the container will be emptied, otherwise the current DOM elements will be kept intact
18843 */
18844 destroy : function (keep_html) {
18845 if(this._wrk) {
18846 try {
18847 window.URL.revokeObjectURL(this._wrk);
18848 this._wrk = null;
18849 }
18850 catch (ignore) { }
18851 }
18852 if(!keep_html) { this.element.empty(); }
18853 this.teardown();
18854 },
18855 /**
18856 * part of the destroying of an instance. Used internally.
18857 * @private
18858 * @name teardown()
18859 */
18860 teardown : function () {
18861 this.unbind();
18862 this.element
18863 .removeClass('jstree')
18864 .removeData('jstree')
18865 .find("[class^='jstree']")
18866 .addBack()
18867 .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });
18868 this.element = null;
18869 },
18870 /**
18871 * bind all events. Used internally.
18872 * @private
18873 * @name bind()
18874 */
18875 bind : function () {
18876 var word = '',
18877 tout = null,
18878 was_click = 0;
18879 this.element
18880 .on("dblclick.jstree", function () {
18881 if(document.selection && document.selection.empty) {
18882 document.selection.empty();
18883 }
18884 else {
18885 if(window.getSelection) {
18886 var sel = window.getSelection();
18887 try {
18888 sel.removeAllRanges();
18889 sel.collapse();
18890 } catch (ignore) { }
18891 }
18892 }
18893 })
18894 .on("mousedown.jstree", $.proxy(function (e) {
18895 if(e.target === this.element[0]) {
18896 e.preventDefault(); // prevent losing focus when clicking scroll arrows (FF, Chrome)
18897 was_click = +(new Date()); // ie does not allow to prevent losing focus
18898 }
18899 }, this))
18900 .on("mousedown.jstree", ".jstree-ocl", function (e) {
18901 e.preventDefault(); // prevent any node inside from losing focus when clicking the open/close icon
18902 })
18903 .on("click.jstree", ".jstree-ocl", $.proxy(function (e) {
18904 this.toggle_node(e.target);
18905 }, this))
18906 .on("dblclick.jstree", ".jstree-anchor", $.proxy(function (e) {
18907 if(this.settings.core.dblclick_toggle) {
18908 this.toggle_node(e.target);
18909 }
18910 }, this))
18911 .on("click.jstree", ".jstree-anchor", $.proxy(function (e) {
18912 e.preventDefault();
18913 if(e.currentTarget !== document.activeElement) { $(e.currentTarget).focus(); }
18914 this.activate_node(e.currentTarget, e);
18915 }, this))
18916 .on('keydown.jstree', '.jstree-anchor', $.proxy(function (e) {
18917 if(e.target.tagName === "INPUT") { return true; }
18918 var o = null;
18919 if(this._data.core.rtl) {
18920 if(e.which === 37) { e.which = 39; }
18921 else if(e.which === 39) { e.which = 37; }
18922 }
18923 switch(e.which) {
18924 case 32: // aria defines space only with Ctrl
18925 if(e.ctrlKey) {
18926 e.type = "click";
18927 $(e.currentTarget).trigger(e);
18928 }
18929 break;
18930 case 13: // enter
18931 e.type = "click";
18932 $(e.currentTarget).trigger(e);
18933 break;
18934 case 37: // right
18935 e.preventDefault();
18936 if(this.is_open(e.currentTarget)) {
18937 this.close_node(e.currentTarget);
18938 }
18939 else {
18940 o = this.get_parent(e.currentTarget);
18941 if(o && o.id !== '#') { this.get_node(o, true).children('.jstree-anchor').focus(); }
18942 }
18943 break;
18944 case 38: // up
18945 e.preventDefault();
18946 o = this.get_prev_dom(e.currentTarget);
18947 if(o && o.length) { o.children('.jstree-anchor').focus(); }
18948 break;
18949 case 39: // left
18950 e.preventDefault();
18951 if(this.is_closed(e.currentTarget)) {
18952 this.open_node(e.currentTarget, function (o) { this.get_node(o, true).children('.jstree-anchor').focus(); });
18953 }
18954 else if (this.is_open(e.currentTarget)) {
18955 o = this.get_node(e.currentTarget, true).children('.jstree-children')[0];
18956 if(o) { $(this._firstChild(o)).children('.jstree-anchor').focus(); }
18957 }
18958 break;
18959 case 40: // down
18960 e.preventDefault();
18961 o = this.get_next_dom(e.currentTarget);
18962 if(o && o.length) { o.children('.jstree-anchor').focus(); }
18963 break;
18964 case 106: // aria defines * on numpad as open_all - not very common
18965 this.open_all();
18966 break;
18967 case 36: // home
18968 e.preventDefault();
18969 o = this._firstChild(this.get_container_ul()[0]);
18970 if(o) { $(o).children('.jstree-anchor').filter(':visible').focus(); }
18971 break;
18972 case 35: // end
18973 e.preventDefault();
18974 this.element.find('.jstree-anchor').filter(':visible').last().focus();
18975 break;
18976 /*
18977 // delete
18978 case 46:
18979 e.preventDefault();
18980 o = this.get_node(e.currentTarget);
18981 if(o && o.id && o.id !== '#') {
18982 o = this.is_selected(o) ? this.get_selected() : o;
18983 this.delete_node(o);
18984 }
18985 break;
18986 // f2
18987 case 113:
18988 e.preventDefault();
18989 o = this.get_node(e.currentTarget);
18990 if(o && o.id && o.id !== '#') {
18991 // this.edit(o);
18992 }
18993 break;
18994 default:
18995 // console.log(e.which);
18996 break;
18997 */
18998 }
18999 }, this))
19000 .on("load_node.jstree", $.proxy(function (e, data) {
19001 if(data.status) {
19002 if(data.node.id === '#' && !this._data.core.loaded) {
19003 this._data.core.loaded = true;
19004 if(this._firstChild(this.get_container_ul()[0])) {
19005 this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id);
19006 }
19007 /**
19008 * triggered after the root node is loaded for the first time
19009 * @event
19010 * @name loaded.jstree
19011 */
19012 this.trigger("loaded");
19013 }
19014 if(!this._data.core.ready) {
19015 setTimeout($.proxy(function() {
19016 if(!this.get_container_ul().find('.jstree-loading').length) {
19017 this._data.core.ready = true;
19018 if(this._data.core.selected.length) {
19019 if(this.settings.core.expand_selected_onload) {
19020 var tmp = [], i, j;
19021 for(i = 0, j = this._data.core.selected.length; i < j; i++) {
19022 tmp = tmp.concat(this._model.data[this._data.core.selected[i]].parents);
19023 }
19024 tmp = $.vakata.array_unique(tmp);
19025 for(i = 0, j = tmp.length; i < j; i++) {
19026 this.open_node(tmp[i], false, 0);
19027 }
19028 }
19029 this.trigger('changed', { 'action' : 'ready', 'selected' : this._data.core.selected });
19030 }
19031 /**
19032 * triggered after all nodes are finished loading
19033 * @event
19034 * @name ready.jstree
19035 */
19036 this.trigger("ready");
19037 }
19038 }, this), 0);
19039 }
19040 }
19041 }, this))
19042 // quick searching when the tree is focused
19043 .on('keypress.jstree', $.proxy(function (e) {
19044 if(e.target.tagName === "INPUT") { return true; }
19045 if(tout) { clearTimeout(tout); }
19046 tout = setTimeout(function () {
19047 word = '';
19048 }, 500);
19049
19050 var chr = String.fromCharCode(e.which).toLowerCase(),
19051 col = this.element.find('.jstree-anchor').filter(':visible'),
19052 ind = col.index(document.activeElement) || 0,
19053 end = false;
19054 word += chr;
19055
19056 // match for whole word from current node down (including the current node)
19057 if(word.length > 1) {
19058 col.slice(ind).each($.proxy(function (i, v) {
19059 if($(v).text().toLowerCase().indexOf(word) === 0) {
19060 $(v).focus();
19061 end = true;
19062 return false;
19063 }
19064 }, this));
19065 if(end) { return; }
19066
19067 // match for whole word from the beginning of the tree
19068 col.slice(0, ind).each($.proxy(function (i, v) {
19069 if($(v).text().toLowerCase().indexOf(word) === 0) {
19070 $(v).focus();
19071 end = true;
19072 return false;
19073 }
19074 }, this));
19075 if(end) { return; }
19076 }
19077 // list nodes that start with that letter (only if word consists of a single char)
19078 if(new RegExp('^' + chr + '+$').test(word)) {
19079 // search for the next node starting with that letter
19080 col.slice(ind + 1).each($.proxy(function (i, v) {
19081 if($(v).text().toLowerCase().charAt(0) === chr) {
19082 $(v).focus();
19083 end = true;
19084 return false;
19085 }
19086 }, this));
19087 if(end) { return; }
19088
19089 // search from the beginning
19090 col.slice(0, ind + 1).each($.proxy(function (i, v) {
19091 if($(v).text().toLowerCase().charAt(0) === chr) {
19092 $(v).focus();
19093 end = true;
19094 return false;
19095 }
19096 }, this));
19097 if(end) { return; }
19098 }
19099 }, this))
19100 // THEME RELATED
19101 .on("init.jstree", $.proxy(function () {
19102 var s = this.settings.core.themes;
19103 this._data.core.themes.dots = s.dots;
19104 this._data.core.themes.stripes = s.stripes;
19105 this._data.core.themes.icons = s.icons;
19106 this.set_theme(s.name || "default", s.url);
19107 this.set_theme_variant(s.variant);
19108 }, this))
19109 .on("loading.jstree", $.proxy(function () {
19110 this[ this._data.core.themes.dots ? "show_dots" : "hide_dots" ]();
19111 this[ this._data.core.themes.icons ? "show_icons" : "hide_icons" ]();
19112 this[ this._data.core.themes.stripes ? "show_stripes" : "hide_stripes" ]();
19113 }, this))
19114 .on('blur.jstree', '.jstree-anchor', $.proxy(function (e) {
19115 this._data.core.focused = null;
19116 $(e.currentTarget).filter('.jstree-hovered').mouseleave();
19117 this.element.attr('tabindex', '0');
19118 }, this))
19119 .on('focus.jstree', '.jstree-anchor', $.proxy(function (e) {
19120 var tmp = this.get_node(e.currentTarget);
19121 if(tmp && tmp.id) {
19122 this._data.core.focused = tmp.id;
19123 }
19124 this.element.find('.jstree-hovered').not(e.currentTarget).mouseleave();
19125 $(e.currentTarget).mouseenter();
19126 this.element.attr('tabindex', '-1');
19127 }, this))
19128 .on('focus.jstree', $.proxy(function () {
19129 if(+(new Date()) - was_click > 500 && !this._data.core.focused) {
19130 was_click = 0;
19131 this.get_node(this.element.attr('aria-activedescendant'), true).find('> .jstree-anchor').focus();
19132 }
19133 }, this))
19134 .on('mouseenter.jstree', '.jstree-anchor', $.proxy(function (e) {
19135 this.hover_node(e.currentTarget);
19136 }, this))
19137 .on('mouseleave.jstree', '.jstree-anchor', $.proxy(function (e) {
19138 this.dehover_node(e.currentTarget);
19139 }, this));
19140 },
19141 /**
19142 * part of the destroying of an instance. Used internally.
19143 * @private
19144 * @name unbind()
19145 */
19146 unbind : function () {
19147 this.element.off('.jstree');
19148 $(document).off('.jstree-' + this._id);
19149 },
19150 /**
19151 * trigger an event. Used internally.
19152 * @private
19153 * @name trigger(ev [, data])
19154 * @param {String} ev the name of the event to trigger
19155 * @param {Object} data additional data to pass with the event
19156 */
19157 trigger : function (ev, data) {
19158 if(!data) {
19159 data = {};
19160 }
19161 data.instance = this;
19162 this.element.triggerHandler(ev.replace('.jstree','') + '.jstree', data);
19163 },
19164 /**
19165 * returns the jQuery extended instance container
19166 * @name get_container()
19167 * @return {jQuery}
19168 */
19169 get_container : function () {
19170 return this.element;
19171 },
19172 /**
19173 * returns the jQuery extended main UL node inside the instance container. Used internally.
19174 * @private
19175 * @name get_container_ul()
19176 * @return {jQuery}
19177 */
19178 get_container_ul : function () {
19179 return this.element.children(".jstree-children").first();
19180 },
19181 /**
19182 * gets string replacements (localization). Used internally.
19183 * @private
19184 * @name get_string(key)
19185 * @param {String} key
19186 * @return {String}
19187 */
19188 get_string : function (key) {
19189 var a = this.settings.core.strings;
19190 if($.isFunction(a)) { return a.call(this, key); }
19191 if(a && a[key]) { return a[key]; }
19192 return key;
19193 },
19194 /**
19195 * gets the first child of a DOM node. Used internally.
19196 * @private
19197 * @name _firstChild(dom)
19198 * @param {DOMElement} dom
19199 * @return {DOMElement}
19200 */
19201 _firstChild : function (dom) {
19202 dom = dom ? dom.firstChild : null;
19203 while(dom !== null && dom.nodeType !== 1) {
19204 dom = dom.nextSibling;
19205 }
19206 return dom;
19207 },
19208 /**
19209 * gets the next sibling of a DOM node. Used internally.
19210 * @private
19211 * @name _nextSibling(dom)
19212 * @param {DOMElement} dom
19213 * @return {DOMElement}
19214 */
19215 _nextSibling : function (dom) {
19216 dom = dom ? dom.nextSibling : null;
19217 while(dom !== null && dom.nodeType !== 1) {
19218 dom = dom.nextSibling;
19219 }
19220 return dom;
19221 },
19222 /**
19223 * gets the previous sibling of a DOM node. Used internally.
19224 * @private
19225 * @name _previousSibling(dom)
19226 * @param {DOMElement} dom
19227 * @return {DOMElement}
19228 */
19229 _previousSibling : function (dom) {
19230 dom = dom ? dom.previousSibling : null;
19231 while(dom !== null && dom.nodeType !== 1) {
19232 dom = dom.previousSibling;
19233 }
19234 return dom;
19235 },
19236 /**
19237 * get the JSON representation of a node (or the actual jQuery extended DOM node) by using any input (child DOM element, ID string, selector, etc)
19238 * @name get_node(obj [, as_dom])
19239 * @param {mixed} obj
19240 * @param {Boolean} as_dom
19241 * @return {Object|jQuery}
19242 */
19243 get_node : function (obj, as_dom) {
19244 if(obj && obj.id) {
19245 obj = obj.id;
19246 }
19247 var dom;
19248 try {
19249 if(this._model.data[obj]) {
19250 obj = this._model.data[obj];
19251 }
19252 else if(typeof obj === "string" && this._model.data[obj.replace(/^#/, '')]) {
19253 obj = this._model.data[obj.replace(/^#/, '')];
19254 }
19255 else if(typeof obj === "string" && (dom = $('#' + obj.replace($.jstree.idregex,'\\$&'), this.element)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) {
19256 obj = this._model.data[dom.closest('.jstree-node').attr('id')];
19257 }
19258 else if((dom = $(obj, this.element)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) {
19259 obj = this._model.data[dom.closest('.jstree-node').attr('id')];
19260 }
19261 else if((dom = $(obj, this.element)).length && dom.hasClass('jstree')) {
19262 obj = this._model.data['#'];
19263 }
19264 else {
19265 return false;
19266 }
19267
19268 if(as_dom) {
19269 obj = obj.id === '#' ? this.element : $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element);
19270 }
19271 return obj;
19272 } catch (ex) { return false; }
19273 },
19274 /**
19275 * get the path to a node, either consisting of node texts, or of node IDs, optionally glued together (otherwise an array)
19276 * @name get_path(obj [, glue, ids])
19277 * @param {mixed} obj the node
19278 * @param {String} glue if you want the path as a string - pass the glue here (for example '/'), if a falsy value is supplied here, an array is returned
19279 * @param {Boolean} ids if set to true build the path using ID, otherwise node text is used
19280 * @return {mixed}
19281 */
19282 get_path : function (obj, glue, ids) {
19283 obj = obj.parents ? obj : this.get_node(obj);
19284 if(!obj || obj.id === '#' || !obj.parents) {
19285 return false;
19286 }
19287 var i, j, p = [];
19288 p.push(ids ? obj.id : obj.text);
19289 for(i = 0, j = obj.parents.length; i < j; i++) {
19290 p.push(ids ? obj.parents[i] : this.get_text(obj.parents[i]));
19291 }
19292 p = p.reverse().slice(1);
19293 return glue ? p.join(glue) : p;
19294 },
19295 /**
19296 * get the next visible node that is below the `obj` node. If `strict` is set to `true` only sibling nodes are returned.
19297 * @name get_next_dom(obj [, strict])
19298 * @param {mixed} obj
19299 * @param {Boolean} strict
19300 * @return {jQuery}
19301 */
19302 get_next_dom : function (obj, strict) {
19303 var tmp;
19304 obj = this.get_node(obj, true);
19305 if(obj[0] === this.element[0]) {
19306 tmp = this._firstChild(this.get_container_ul()[0]);
19307 while (tmp && tmp.offsetHeight === 0) {
19308 tmp = this._nextSibling(tmp);
19309 }
19310 return tmp ? $(tmp) : false;
19311 }
19312 if(!obj || !obj.length) {
19313 return false;
19314 }
19315 if(strict) {
19316 tmp = obj[0];
19317 do {
19318 tmp = this._nextSibling(tmp);
19319 } while (tmp && tmp.offsetHeight === 0);
19320 return tmp ? $(tmp) : false;
19321 }
19322 if(obj.hasClass("jstree-open")) {
19323 tmp = this._firstChild(obj.children('.jstree-children')[0]);
19324 while (tmp && tmp.offsetHeight === 0) {
19325 tmp = this._nextSibling(tmp);
19326 }
19327 if(tmp !== null) {
19328 return $(tmp);
19329 }
19330 }
19331 tmp = obj[0];
19332 do {
19333 tmp = this._nextSibling(tmp);
19334 } while (tmp && tmp.offsetHeight === 0);
19335 if(tmp !== null) {
19336 return $(tmp);
19337 }
19338 return obj.parentsUntil(".jstree",".jstree-node").next(".jstree-node:visible").first();
19339 },
19340 /**
19341 * get the previous visible node that is above the `obj` node. If `strict` is set to `true` only sibling nodes are returned.
19342 * @name get_prev_dom(obj [, strict])
19343 * @param {mixed} obj
19344 * @param {Boolean} strict
19345 * @return {jQuery}
19346 */
19347 get_prev_dom : function (obj, strict) {
19348 var tmp;
19349 obj = this.get_node(obj, true);
19350 if(obj[0] === this.element[0]) {
19351 tmp = this.get_container_ul()[0].lastChild;
19352 while (tmp && tmp.offsetHeight === 0) {
19353 tmp = this._previousSibling(tmp);
19354 }
19355 return tmp ? $(tmp) : false;
19356 }
19357 if(!obj || !obj.length) {
19358 return false;
19359 }
19360 if(strict) {
19361 tmp = obj[0];
19362 do {
19363 tmp = this._previousSibling(tmp);
19364 } while (tmp && tmp.offsetHeight === 0);
19365 return tmp ? $(tmp) : false;
19366 }
19367 tmp = obj[0];
19368 do {
19369 tmp = this._previousSibling(tmp);
19370 } while (tmp && tmp.offsetHeight === 0);
19371 if(tmp !== null) {
19372 obj = $(tmp);
19373 while(obj.hasClass("jstree-open")) {
19374 obj = obj.children(".jstree-children").first().children(".jstree-node:visible:last");
19375 }
19376 return obj;
19377 }
19378 tmp = obj[0].parentNode.parentNode;
19379 return tmp && tmp.className && tmp.className.indexOf('jstree-node') !== -1 ? $(tmp) : false;
19380 },
19381 /**
19382 * get the parent ID of a node
19383 * @name get_parent(obj)
19384 * @param {mixed} obj
19385 * @return {String}
19386 */
19387 get_parent : function (obj) {
19388 obj = this.get_node(obj);
19389 if(!obj || obj.id === '#') {
19390 return false;
19391 }
19392 return obj.parent;
19393 },
19394 /**
19395 * get a jQuery collection of all the children of a node (node must be rendered)
19396 * @name get_children_dom(obj)
19397 * @param {mixed} obj
19398 * @return {jQuery}
19399 */
19400 get_children_dom : function (obj) {
19401 obj = this.get_node(obj, true);
19402 if(obj[0] === this.element[0]) {
19403 return this.get_container_ul().children(".jstree-node");
19404 }
19405 if(!obj || !obj.length) {
19406 return false;
19407 }
19408 return obj.children(".jstree-children").children(".jstree-node");
19409 },
19410 /**
19411 * checks if a node has children
19412 * @name is_parent(obj)
19413 * @param {mixed} obj
19414 * @return {Boolean}
19415 */
19416 is_parent : function (obj) {
19417 obj = this.get_node(obj);
19418 return obj && (obj.state.loaded === false || obj.children.length > 0);
19419 },
19420 /**
19421 * checks if a node is loaded (its children are available)
19422 * @name is_loaded(obj)
19423 * @param {mixed} obj
19424 * @return {Boolean}
19425 */
19426 is_loaded : function (obj) {
19427 obj = this.get_node(obj);
19428 return obj && obj.state.loaded;
19429 },
19430 /**
19431 * check if a node is currently loading (fetching children)
19432 * @name is_loading(obj)
19433 * @param {mixed} obj
19434 * @return {Boolean}
19435 */
19436 is_loading : function (obj) {
19437 obj = this.get_node(obj);
19438 return obj && obj.state && obj.state.loading;
19439 },
19440 /**
19441 * check if a node is opened
19442 * @name is_open(obj)
19443 * @param {mixed} obj
19444 * @return {Boolean}
19445 */
19446 is_open : function (obj) {
19447 obj = this.get_node(obj);
19448 return obj && obj.state.opened;
19449 },
19450 /**
19451 * check if a node is in a closed state
19452 * @name is_closed(obj)
19453 * @param {mixed} obj
19454 * @return {Boolean}
19455 */
19456 is_closed : function (obj) {
19457 obj = this.get_node(obj);
19458 return obj && this.is_parent(obj) && !obj.state.opened;
19459 },
19460 /**
19461 * check if a node has no children
19462 * @name is_leaf(obj)
19463 * @param {mixed} obj
19464 * @return {Boolean}
19465 */
19466 is_leaf : function (obj) {
19467 return !this.is_parent(obj);
19468 },
19469 /**
19470 * loads a node (fetches its children using the `core.data` setting). Multiple nodes can be passed to by using an array.
19471 * @name load_node(obj [, callback])
19472 * @param {mixed} obj
19473 * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives two arguments - the node and a boolean status
19474 * @return {Boolean}
19475 * @trigger load_node.jstree
19476 */
19477 load_node : function (obj, callback) {
19478 var k, l, i, j, c;
19479 if($.isArray(obj)) {
19480 this._load_nodes(obj.slice(), callback);
19481 return true;
19482 }
19483 obj = this.get_node(obj);
19484 if(!obj) {
19485 if(callback) { callback.call(this, obj, false); }
19486 return false;
19487 }
19488 // if(obj.state.loading) { } // the node is already loading - just wait for it to load and invoke callback? but if called implicitly it should be loaded again?
19489 if(obj.state.loaded) {
19490 obj.state.loaded = false;
19491 for(k = 0, l = obj.children_d.length; k < l; k++) {
19492 for(i = 0, j = obj.parents.length; i < j; i++) {
19493 this._model.data[obj.parents[i]].children_d = $.vakata.array_remove_item(this._model.data[obj.parents[i]].children_d, obj.children_d[k]);
19494 }
19495 if(this._model.data[obj.children_d[k]].state.selected) {
19496 c = true;
19497 this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.children_d[k]);
19498 }
19499 delete this._model.data[obj.children_d[k]];
19500 }
19501 obj.children = [];
19502 obj.children_d = [];
19503 if(c) {
19504 this.trigger('changed', { 'action' : 'load_node', 'node' : obj, 'selected' : this._data.core.selected });
19505 }
19506 }
19507 obj.state.loading = true;
19508 this.get_node(obj, true).addClass("jstree-loading").attr('aria-busy',true);
19509 this._load_node(obj, $.proxy(function (status) {
19510 obj = this._model.data[obj.id];
19511 obj.state.loading = false;
19512 obj.state.loaded = status;
19513 var dom = this.get_node(obj, true);
19514 if(obj.state.loaded && !obj.children.length && dom && dom.length && !dom.hasClass('jstree-leaf')) {
19515 dom.removeClass('jstree-closed jstree-open').addClass('jstree-leaf');
19516 }
19517 dom.removeClass("jstree-loading").attr('aria-busy',false);
19518 /**
19519 * triggered after a node is loaded
19520 * @event
19521 * @name load_node.jstree
19522 * @param {Object} node the node that was loading
19523 * @param {Boolean} status was the node loaded successfully
19524 */
19525 this.trigger('load_node', { "node" : obj, "status" : status });
19526 if(callback) {
19527 callback.call(this, obj, status);
19528 }
19529 }, this));
19530 return true;
19531 },
19532 /**
19533 * load an array of nodes (will also load unavailable nodes as soon as the appear in the structure). Used internally.
19534 * @private
19535 * @name _load_nodes(nodes [, callback])
19536 * @param {array} nodes
19537 * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - the array passed to _load_nodes
19538 */
19539 _load_nodes : function (nodes, callback, is_callback) {
19540 var r = true,
19541 c = function () { this._load_nodes(nodes, callback, true); },
19542 m = this._model.data, i, j;
19543 for(i = 0, j = nodes.length; i < j; i++) {
19544 if(m[nodes[i]] && (!m[nodes[i]].state.loaded || !is_callback)) {
19545 if(!this.is_loading(nodes[i])) {
19546 this.load_node(nodes[i], c);
19547 }
19548 r = false;
19549 }
19550 }
19551 if(r) {
19552 if(callback && !callback.done) {
19553 callback.call(this, nodes);
19554 callback.done = true;
19555 }
19556 }
19557 },
19558 /**
19559 * loads all unloaded nodes
19560 * @name load_all([obj, callback])
19561 * @param {mixed} obj the node to load recursively, omit to load all nodes in the tree
19562 * @param {function} callback a function to be executed once loading all the nodes is complete,
19563 * @trigger load_all.jstree
19564 */
19565 load_all : function (obj, callback) {
19566 if(!obj) { obj = '#'; }
19567 obj = this.get_node(obj);
19568 if(!obj) { return false; }
19569 var to_load = [],
19570 m = this._model.data,
19571 c = m[obj.id].children_d,
19572 i, j;
19573 if(obj.state && !obj.state.loaded) {
19574 to_load.push(obj.id);
19575 }
19576 for(i = 0, j = c.length; i < j; i++) {
19577 if(m[c[i]] && m[c[i]].state && !m[c[i]].state.loaded) {
19578 to_load.push(c[i]);
19579 }
19580 }
19581 if(to_load.length) {
19582 this._load_nodes(to_load, function () {
19583 this.load_all(obj, callback);
19584 });
19585 }
19586 else {
19587 /**
19588 * triggered after a load_all call completes
19589 * @event
19590 * @name load_all.jstree
19591 * @param {Object} node the recursively loaded node
19592 */
19593 if(callback) { callback.call(this, obj); }
19594 this.trigger('load_all', { "node" : obj });
19595 }
19596 },
19597 /**
19598 * handles the actual loading of a node. Used only internally.
19599 * @private
19600 * @name _load_node(obj [, callback])
19601 * @param {mixed} obj
19602 * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - a boolean status
19603 * @return {Boolean}
19604 */
19605 _load_node : function (obj, callback) {
19606 var s = this.settings.core.data, t;
19607 // use original HTML
19608 if(!s) {
19609 if(obj.id === '#') {
19610 return this._append_html_data(obj, this._data.core.original_container_html.clone(true), function (status) {
19611 callback.call(this, status);
19612 });
19613 }
19614 else {
19615 return callback.call(this, false);
19616 }
19617 // return callback.call(this, obj.id === '#' ? this._append_html_data(obj, this._data.core.original_container_html.clone(true)) : false);
19618 }
19619 if($.isFunction(s)) {
19620 return s.call(this, obj, $.proxy(function (d) {
19621 if(d === false) {
19622 callback.call(this, false);
19623 }
19624 this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d, function (status) {
19625 callback.call(this, status);
19626 });
19627 // return d === false ? callback.call(this, false) : callback.call(this, this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d));
19628 }, this));
19629 }
19630 if(typeof s === 'object') {
19631 if(s.url) {
19632 s = $.extend(true, {}, s);
19633 if($.isFunction(s.url)) {
19634 s.url = s.url.call(this, obj);
19635 }
19636 if($.isFunction(s.data)) {
19637 s.data = s.data.call(this, obj);
19638 }
19639 return $.ajax(s)
19640 .done($.proxy(function (d,t,x) {
19641 var type = x.getResponseHeader('Content-Type');
19642 if(type.indexOf('json') !== -1 || typeof d === "object") {
19643 return this._append_json_data(obj, d, function (status) { callback.call(this, status); });
19644 //return callback.call(this, this._append_json_data(obj, d));
19645 }
19646 if(type.indexOf('html') !== -1 || typeof d === "string") {
19647 return this._append_html_data(obj, $(d), function (status) { callback.call(this, status); });
19648 // return callback.call(this, this._append_html_data(obj, $(d)));
19649 }
19650 this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : x }) };
19651 this.settings.core.error.call(this, this._data.core.last_error);
19652 return callback.call(this, false);
19653 }, this))
19654 .fail($.proxy(function (f) {
19655 callback.call(this, false);
19656 this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : f }) };
19657 this.settings.core.error.call(this, this._data.core.last_error);
19658 }, this));
19659 }
19660 t = ($.isArray(s) || $.isPlainObject(s)) ? JSON.parse(JSON.stringify(s)) : s;
19661 if(obj.id === '#') {
19662 return this._append_json_data(obj, t, function (status) {
19663 callback.call(this, status);
19664 });
19665 }
19666 else {
19667 this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_05', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) };
19668 this.settings.core.error.call(this, this._data.core.last_error);
19669 return callback.call(this, false);
19670 }
19671 //return callback.call(this, (obj.id === "#" ? this._append_json_data(obj, t) : false) );
19672 }
19673 if(typeof s === 'string') {
19674 if(obj.id === '#') {
19675 return this._append_html_data(obj, $(s), function (status) {
19676 callback.call(this, status);
19677 });
19678 }
19679 else {
19680 this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_06', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) };
19681 this.settings.core.error.call(this, this._data.core.last_error);
19682 return callback.call(this, false);
19683 }
19684 //return callback.call(this, (obj.id === "#" ? this._append_html_data(obj, $(s)) : false) );
19685 }
19686 return callback.call(this, false);
19687 },
19688 /**
19689 * adds a node to the list of nodes to redraw. Used only internally.
19690 * @private
19691 * @name _node_changed(obj [, callback])
19692 * @param {mixed} obj
19693 */
19694 _node_changed : function (obj) {
19695 obj = this.get_node(obj);
19696 if(obj) {
19697 this._model.changed.push(obj.id);
19698 }
19699 },
19700 /**
19701 * appends HTML content to the tree. Used internally.
19702 * @private
19703 * @name _append_html_data(obj, data)
19704 * @param {mixed} obj the node to append to
19705 * @param {String} data the HTML string to parse and append
19706 * @trigger model.jstree, changed.jstree
19707 */
19708 _append_html_data : function (dom, data, cb) {
19709 dom = this.get_node(dom);
19710 dom.children = [];
19711 dom.children_d = [];
19712 var dat = data.is('ul') ? data.children() : data,
19713 par = dom.id,
19714 chd = [],
19715 dpc = [],
19716 m = this._model.data,
19717 p = m[par],
19718 s = this._data.core.selected.length,
19719 tmp, i, j;
19720 dat.each($.proxy(function (i, v) {
19721 tmp = this._parse_model_from_html($(v), par, p.parents.concat());
19722 if(tmp) {
19723 chd.push(tmp);
19724 dpc.push(tmp);
19725 if(m[tmp].children_d.length) {
19726 dpc = dpc.concat(m[tmp].children_d);
19727 }
19728 }
19729 }, this));
19730 p.children = chd;
19731 p.children_d = dpc;
19732 for(i = 0, j = p.parents.length; i < j; i++) {
19733 m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
19734 }
19735 /**
19736 * triggered when new data is inserted to the tree model
19737 * @event
19738 * @name model.jstree
19739 * @param {Array} nodes an array of node IDs
19740 * @param {String} parent the parent ID of the nodes
19741 */
19742 this.trigger('model', { "nodes" : dpc, 'parent' : par });
19743 if(par !== '#') {
19744 this._node_changed(par);
19745 this.redraw();
19746 }
19747 else {
19748 this.get_container_ul().children('.jstree-initial-node').remove();
19749 this.redraw(true);
19750 }
19751 if(this._data.core.selected.length !== s) {
19752 this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected });
19753 }
19754 cb.call(this, true);
19755 },
19756 /**
19757 * appends JSON content to the tree. Used internally.
19758 * @private
19759 * @name _append_json_data(obj, data)
19760 * @param {mixed} obj the node to append to
19761 * @param {String} data the JSON object to parse and append
19762 * @param {Boolean} force_processing internal param - do not set
19763 * @trigger model.jstree, changed.jstree
19764 */
19765 _append_json_data : function (dom, data, cb, force_processing) {
19766 dom = this.get_node(dom);
19767 dom.children = [];
19768 dom.children_d = [];
19769 // *%$@!!!
19770 if(data.d) {
19771 data = data.d;
19772 if(typeof data === "string") {
19773 data = JSON.parse(data);
19774 }
19775 }
19776 if(!$.isArray(data)) { data = [data]; }
19777 var w = null,
19778 args = {
19779 'df' : this._model.default_state,
19780 'dat' : data,
19781 'par' : dom.id,
19782 'm' : this._model.data,
19783 't_id' : this._id,
19784 't_cnt' : this._cnt,
19785 'sel' : this._data.core.selected
19786 },
19787 func = function (data, undefined) {
19788 if(data.data) { data = data.data; }
19789 var dat = data.dat,
19790 par = data.par,
19791 chd = [],
19792 dpc = [],
19793 add = [],
19794 df = data.df,
19795 t_id = data.t_id,
19796 t_cnt = data.t_cnt,
19797 m = data.m,
19798 p = m[par],
19799 sel = data.sel,
19800 tmp, i, j, rslt,
19801 parse_flat = function (d, p, ps) {
19802 if(!ps) { ps = []; }
19803 else { ps = ps.concat(); }
19804 if(p) { ps.unshift(p); }
19805 var tid = d.id.toString(),
19806 i, j, c, e,
19807 tmp = {
19808 id : tid,
19809 text : d.text || '',
19810 icon : d.icon !== undefined ? d.icon : true,
19811 parent : p,
19812 parents : ps,
19813 children : d.children || [],
19814 children_d : d.children_d || [],
19815 data : d.data,
19816 state : { },
19817 li_attr : { id : false },
19818 a_attr : { href : '#' },
19819 original : false
19820 };
19821 for(i in df) {
19822 if(df.hasOwnProperty(i)) {
19823 tmp.state[i] = df[i];
19824 }
19825 }
19826 if(d && d.data && d.data.jstree && d.data.jstree.icon) {
19827 tmp.icon = d.data.jstree.icon;
19828 }
19829 if(d && d.data) {
19830 tmp.data = d.data;
19831 if(d.data.jstree) {
19832 for(i in d.data.jstree) {
19833 if(d.data.jstree.hasOwnProperty(i)) {
19834 tmp.state[i] = d.data.jstree[i];
19835 }
19836 }
19837 }
19838 }
19839 if(d && typeof d.state === 'object') {
19840 for (i in d.state) {
19841 if(d.state.hasOwnProperty(i)) {
19842 tmp.state[i] = d.state[i];
19843 }
19844 }
19845 }
19846 if(d && typeof d.li_attr === 'object') {
19847 for (i in d.li_attr) {
19848 if(d.li_attr.hasOwnProperty(i)) {
19849 tmp.li_attr[i] = d.li_attr[i];
19850 }
19851 }
19852 }
19853 if(!tmp.li_attr.id) {
19854 tmp.li_attr.id = tid;
19855 }
19856 if(d && typeof d.a_attr === 'object') {
19857 for (i in d.a_attr) {
19858 if(d.a_attr.hasOwnProperty(i)) {
19859 tmp.a_attr[i] = d.a_attr[i];
19860 }
19861 }
19862 }
19863 if(d && d.children && d.children === true) {
19864 tmp.state.loaded = false;
19865 tmp.children = [];
19866 tmp.children_d = [];
19867 }
19868 m[tmp.id] = tmp;
19869 for(i = 0, j = tmp.children.length; i < j; i++) {
19870 c = parse_flat(m[tmp.children[i]], tmp.id, ps);
19871 e = m[c];
19872 tmp.children_d.push(c);
19873 if(e.children_d.length) {
19874 tmp.children_d = tmp.children_d.concat(e.children_d);
19875 }
19876 }
19877 delete d.data;
19878 delete d.children;
19879 m[tmp.id].original = d;
19880 if(tmp.state.selected) {
19881 add.push(tmp.id);
19882 }
19883 return tmp.id;
19884 },
19885 parse_nest = function (d, p, ps) {
19886 if(!ps) { ps = []; }
19887 else { ps = ps.concat(); }
19888 if(p) { ps.unshift(p); }
19889 var tid = false, i, j, c, e, tmp;
19890 do {
19891 tid = 'j' + t_id + '_' + (++t_cnt);
19892 } while(m[tid]);
19893
19894 tmp = {
19895 id : false,
19896 text : typeof d === 'string' ? d : '',
19897 icon : typeof d === 'object' && d.icon !== undefined ? d.icon : true,
19898 parent : p,
19899 parents : ps,
19900 children : [],
19901 children_d : [],
19902 data : null,
19903 state : { },
19904 li_attr : { id : false },
19905 a_attr : { href : '#' },
19906 original : false
19907 };
19908 for(i in df) {
19909 if(df.hasOwnProperty(i)) {
19910 tmp.state[i] = df[i];
19911 }
19912 }
19913 if(d && d.id) { tmp.id = d.id.toString(); }
19914 if(d && d.text) { tmp.text = d.text; }
19915 if(d && d.data && d.data.jstree && d.data.jstree.icon) {
19916 tmp.icon = d.data.jstree.icon;
19917 }
19918 if(d && d.data) {
19919 tmp.data = d.data;
19920 if(d.data.jstree) {
19921 for(i in d.data.jstree) {
19922 if(d.data.jstree.hasOwnProperty(i)) {
19923 tmp.state[i] = d.data.jstree[i];
19924 }
19925 }
19926 }
19927 }
19928 if(d && typeof d.state === 'object') {
19929 for (i in d.state) {
19930 if(d.state.hasOwnProperty(i)) {
19931 tmp.state[i] = d.state[i];
19932 }
19933 }
19934 }
19935 if(d && typeof d.li_attr === 'object') {
19936 for (i in d.li_attr) {
19937 if(d.li_attr.hasOwnProperty(i)) {
19938 tmp.li_attr[i] = d.li_attr[i];
19939 }
19940 }
19941 }
19942 if(tmp.li_attr.id && !tmp.id) {
19943 tmp.id = tmp.li_attr.id.toString();
19944 }
19945 if(!tmp.id) {
19946 tmp.id = tid;
19947 }
19948 if(!tmp.li_attr.id) {
19949 tmp.li_attr.id = tmp.id;
19950 }
19951 if(d && typeof d.a_attr === 'object') {
19952 for (i in d.a_attr) {
19953 if(d.a_attr.hasOwnProperty(i)) {
19954 tmp.a_attr[i] = d.a_attr[i];
19955 }
19956 }
19957 }
19958 if(d && d.children && d.children.length) {
19959 for(i = 0, j = d.children.length; i < j; i++) {
19960 c = parse_nest(d.children[i], tmp.id, ps);
19961 e = m[c];
19962 tmp.children.push(c);
19963 if(e.children_d.length) {
19964 tmp.children_d = tmp.children_d.concat(e.children_d);
19965 }
19966 }
19967 tmp.children_d = tmp.children_d.concat(tmp.children);
19968 }
19969 if(d && d.children && d.children === true) {
19970 tmp.state.loaded = false;
19971 tmp.children = [];
19972 tmp.children_d = [];
19973 }
19974 delete d.data;
19975 delete d.children;
19976 tmp.original = d;
19977 m[tmp.id] = tmp;
19978 if(tmp.state.selected) {
19979 add.push(tmp.id);
19980 }
19981 return tmp.id;
19982 };
19983
19984 if(dat.length && dat[0].id !== undefined && dat[0].parent !== undefined) {
19985 // Flat JSON support (for easy import from DB):
19986 // 1) convert to object (foreach)
19987 for(i = 0, j = dat.length; i < j; i++) {
19988 if(!dat[i].children) {
19989 dat[i].children = [];
19990 }
19991 m[dat[i].id.toString()] = dat[i];
19992 }
19993 // 2) populate children (foreach)
19994 for(i = 0, j = dat.length; i < j; i++) {
19995 m[dat[i].parent.toString()].children.push(dat[i].id.toString());
19996 // populate parent.children_d
19997 p.children_d.push(dat[i].id.toString());
19998 }
19999 // 3) normalize && populate parents and children_d with recursion
20000 for(i = 0, j = p.children.length; i < j; i++) {
20001 tmp = parse_flat(m[p.children[i]], par, p.parents.concat());
20002 dpc.push(tmp);
20003 if(m[tmp].children_d.length) {
20004 dpc = dpc.concat(m[tmp].children_d);
20005 }
20006 }
20007 for(i = 0, j = p.parents.length; i < j; i++) {
20008 m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
20009 }
20010 // ?) three_state selection - p.state.selected && t - (if three_state foreach(dat => ch) -> foreach(parents) if(parent.selected) child.selected = true;
20011 rslt = {
20012 'cnt' : t_cnt,
20013 'mod' : m,
20014 'sel' : sel,
20015 'par' : par,
20016 'dpc' : dpc,
20017 'add' : add
20018 };
20019 }
20020 else {
20021 for(i = 0, j = dat.length; i < j; i++) {
20022 tmp = parse_nest(dat[i], par, p.parents.concat());
20023 if(tmp) {
20024 chd.push(tmp);
20025 dpc.push(tmp);
20026 if(m[tmp].children_d.length) {
20027 dpc = dpc.concat(m[tmp].children_d);
20028 }
20029 }
20030 }
20031 p.children = chd;
20032 p.children_d = dpc;
20033 for(i = 0, j = p.parents.length; i < j; i++) {
20034 m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
20035 }
20036 rslt = {
20037 'cnt' : t_cnt,
20038 'mod' : m,
20039 'sel' : sel,
20040 'par' : par,
20041 'dpc' : dpc,
20042 'add' : add
20043 };
20044 }
20045 if(typeof window === 'undefined' || typeof window.document === 'undefined') {
20046 postMessage(rslt);
20047 }
20048 else {
20049 return rslt;
20050 }
20051 },
20052 rslt = function (rslt, worker) {
20053 this._cnt = rslt.cnt;
20054 this._model.data = rslt.mod; // breaks the reference in load_node - careful
20055
20056 if(worker) {
20057 var i, j, a = rslt.add, r = rslt.sel, s = this._data.core.selected.slice(), m = this._model.data;
20058 // if selection was changed while calculating in worker
20059 if(r.length !== s.length || $.vakata.array_unique(r.concat(s)).length !== r.length) {
20060 // deselect nodes that are no longer selected
20061 for(i = 0, j = r.length; i < j; i++) {
20062 if($.inArray(r[i], a) === -1 && $.inArray(r[i], s) === -1) {
20063 m[r[i]].state.selected = false;
20064 }
20065 }
20066 // select nodes that were selected in the mean time
20067 for(i = 0, j = s.length; i < j; i++) {
20068 if($.inArray(s[i], r) === -1) {
20069 m[s[i]].state.selected = true;
20070 }
20071 }
20072 }
20073 }
20074 if(rslt.add.length) {
20075 this._data.core.selected = this._data.core.selected.concat(rslt.add);
20076 }
20077
20078 this.trigger('model', { "nodes" : rslt.dpc, 'parent' : rslt.par });
20079
20080 if(rslt.par !== '#') {
20081 this._node_changed(rslt.par);
20082 this.redraw();
20083 }
20084 else {
20085 // this.get_container_ul().children('.jstree-initial-node').remove();
20086 this.redraw(true);
20087 }
20088 if(rslt.add.length) {
20089 this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected });
20090 }
20091 cb.call(this, true);
20092 };
20093 if(this.settings.core.worker && window.Blob && window.URL && window.Worker) {
20094 try {
20095 if(this._wrk === null) {
20096 this._wrk = window.URL.createObjectURL(
20097 new window.Blob(
20098 ['self.onmessage = ' + func.toString()],
20099 {type:"text/javascript"}
20100 )
20101 );
20102 }
20103 if(!this._data.core.working || force_processing) {
20104 this._data.core.working = true;
20105 w = new window.Worker(this._wrk);
20106 w.onmessage = $.proxy(function (e) {
20107 rslt.call(this, e.data, true);
20108 try { w.terminate(); w = null; } catch(ignore) { }
20109 if(this._data.core.worker_queue.length) {
20110 this._append_json_data.apply(this, this._data.core.worker_queue.shift());
20111 }
20112 else {
20113 this._data.core.working = false;
20114 }
20115 }, this);
20116 if(!args.par) {
20117 if(this._data.core.worker_queue.length) {
20118 this._append_json_data.apply(this, this._data.core.worker_queue.shift());
20119 }
20120 else {
20121 this._data.core.working = false;
20122 }
20123 }
20124 else {
20125 w.postMessage(args);
20126 }
20127 }
20128 else {
20129 this._data.core.worker_queue.push([dom, data, cb, true]);
20130 }
20131 }
20132 catch(e) {
20133 rslt.call(this, func(args), false);
20134 if(this._data.core.worker_queue.length) {
20135 this._append_json_data.apply(this, this._data.core.worker_queue.shift());
20136 }
20137 else {
20138 this._data.core.working = false;
20139 }
20140 }
20141 }
20142 else {
20143 rslt.call(this, func(args), false);
20144 }
20145 },
20146 /**
20147 * parses a node from a jQuery object and appends them to the in memory tree model. Used internally.
20148 * @private
20149 * @name _parse_model_from_html(d [, p, ps])
20150 * @param {jQuery} d the jQuery object to parse
20151 * @param {String} p the parent ID
20152 * @param {Array} ps list of all parents
20153 * @return {String} the ID of the object added to the model
20154 */
20155 _parse_model_from_html : function (d, p, ps) {
20156 if(!ps) { ps = []; }
20157 else { ps = [].concat(ps); }
20158 if(p) { ps.unshift(p); }
20159 var c, e, m = this._model.data,
20160 data = {
20161 id : false,
20162 text : false,
20163 icon : true,
20164 parent : p,
20165 parents : ps,
20166 children : [],
20167 children_d : [],
20168 data : null,
20169 state : { },
20170 li_attr : { id : false },
20171 a_attr : { href : '#' },
20172 original : false
20173 }, i, tmp, tid;
20174 for(i in this._model.default_state) {
20175 if(this._model.default_state.hasOwnProperty(i)) {
20176 data.state[i] = this._model.default_state[i];
20177 }
20178 }
20179 tmp = $.vakata.attributes(d, true);
20180 $.each(tmp, function (i, v) {
20181 v = $.trim(v);
20182 if(!v.length) { return true; }
20183 data.li_attr[i] = v;
20184 if(i === 'id') {
20185 data.id = v.toString();
20186 }
20187 });
20188 tmp = d.children('a').first();
20189 if(tmp.length) {
20190 tmp = $.vakata.attributes(tmp, true);
20191 $.each(tmp, function (i, v) {
20192 v = $.trim(v);
20193 if(v.length) {
20194 data.a_attr[i] = v;
20195 }
20196 });
20197 }
20198 tmp = d.children("a").first().length ? d.children("a").first().clone() : d.clone();
20199 tmp.children("ins, i, ul").remove();
20200 tmp = tmp.html();
20201 tmp = $('<div />').html(tmp);
20202 data.text = this.settings.core.force_text ? tmp.text() : tmp.html();
20203 tmp = d.data();
20204 data.data = tmp ? $.extend(true, {}, tmp) : null;
20205 data.state.opened = d.hasClass('jstree-open');
20206 data.state.selected = d.children('a').hasClass('jstree-clicked');
20207 data.state.disabled = d.children('a').hasClass('jstree-disabled');
20208 if(data.data && data.data.jstree) {
20209 for(i in data.data.jstree) {
20210 if(data.data.jstree.hasOwnProperty(i)) {
20211 data.state[i] = data.data.jstree[i];
20212 }
20213 }
20214 }
20215 tmp = d.children("a").children(".jstree-themeicon");
20216 if(tmp.length) {
20217 data.icon = tmp.hasClass('jstree-themeicon-hidden') ? false : tmp.attr('rel');
20218 }
20219 if(data.state.icon) {
20220 data.icon = data.state.icon;
20221 }
20222 tmp = d.children("ul").children("li");
20223 do {
20224 tid = 'j' + this._id + '_' + (++this._cnt);
20225 } while(m[tid]);
20226 data.id = data.li_attr.id ? data.li_attr.id.toString() : tid;
20227 if(tmp.length) {
20228 tmp.each($.proxy(function (i, v) {
20229 c = this._parse_model_from_html($(v), data.id, ps);
20230 e = this._model.data[c];
20231 data.children.push(c);
20232 if(e.children_d.length) {
20233 data.children_d = data.children_d.concat(e.children_d);
20234 }
20235 }, this));
20236 data.children_d = data.children_d.concat(data.children);
20237 }
20238 else {
20239 if(d.hasClass('jstree-closed')) {
20240 data.state.loaded = false;
20241 }
20242 }
20243 if(data.li_attr['class']) {
20244 data.li_attr['class'] = data.li_attr['class'].replace('jstree-closed','').replace('jstree-open','');
20245 }
20246 if(data.a_attr['class']) {
20247 data.a_attr['class'] = data.a_attr['class'].replace('jstree-clicked','').replace('jstree-disabled','');
20248 }
20249 m[data.id] = data;
20250 if(data.state.selected) {
20251 this._data.core.selected.push(data.id);
20252 }
20253 return data.id;
20254 },
20255 /**
20256 * parses a node from a JSON object (used when dealing with flat data, which has no nesting of children, but has id and parent properties) and appends it to the in memory tree model. Used internally.
20257 * @private
20258 * @name _parse_model_from_flat_json(d [, p, ps])
20259 * @param {Object} d the JSON object to parse
20260 * @param {String} p the parent ID
20261 * @param {Array} ps list of all parents
20262 * @return {String} the ID of the object added to the model
20263 */
20264 _parse_model_from_flat_json : function (d, p, ps) {
20265 if(!ps) { ps = []; }
20266 else { ps = ps.concat(); }
20267 if(p) { ps.unshift(p); }
20268 var tid = d.id.toString(),
20269 m = this._model.data,
20270 df = this._model.default_state,
20271 i, j, c, e,
20272 tmp = {
20273 id : tid,
20274 text : d.text || '',
20275 icon : d.icon !== undefined ? d.icon : true,
20276 parent : p,
20277 parents : ps,
20278 children : d.children || [],
20279 children_d : d.children_d || [],
20280 data : d.data,
20281 state : { },
20282 li_attr : { id : false },
20283 a_attr : { href : '#' },
20284 original : false
20285 };
20286 for(i in df) {
20287 if(df.hasOwnProperty(i)) {
20288 tmp.state[i] = df[i];
20289 }
20290 }
20291 if(d && d.data && d.data.jstree && d.data.jstree.icon) {
20292 tmp.icon = d.data.jstree.icon;
20293 }
20294 if(d && d.data) {
20295 tmp.data = d.data;
20296 if(d.data.jstree) {
20297 for(i in d.data.jstree) {
20298 if(d.data.jstree.hasOwnProperty(i)) {
20299 tmp.state[i] = d.data.jstree[i];
20300 }
20301 }
20302 }
20303 }
20304 if(d && typeof d.state === 'object') {
20305 for (i in d.state) {
20306 if(d.state.hasOwnProperty(i)) {
20307 tmp.state[i] = d.state[i];
20308 }
20309 }
20310 }
20311 if(d && typeof d.li_attr === 'object') {
20312 for (i in d.li_attr) {
20313 if(d.li_attr.hasOwnProperty(i)) {
20314 tmp.li_attr[i] = d.li_attr[i];
20315 }
20316 }
20317 }
20318 if(!tmp.li_attr.id) {
20319 tmp.li_attr.id = tid;
20320 }
20321 if(d && typeof d.a_attr === 'object') {
20322 for (i in d.a_attr) {
20323 if(d.a_attr.hasOwnProperty(i)) {
20324 tmp.a_attr[i] = d.a_attr[i];
20325 }
20326 }
20327 }
20328 if(d && d.children && d.children === true) {
20329 tmp.state.loaded = false;
20330 tmp.children = [];
20331 tmp.children_d = [];
20332 }
20333 m[tmp.id] = tmp;
20334 for(i = 0, j = tmp.children.length; i < j; i++) {
20335 c = this._parse_model_from_flat_json(m[tmp.children[i]], tmp.id, ps);
20336 e = m[c];
20337 tmp.children_d.push(c);
20338 if(e.children_d.length) {
20339 tmp.children_d = tmp.children_d.concat(e.children_d);
20340 }
20341 }
20342 delete d.data;
20343 delete d.children;
20344 m[tmp.id].original = d;
20345 if(tmp.state.selected) {
20346 this._data.core.selected.push(tmp.id);
20347 }
20348 return tmp.id;
20349 },
20350 /**
20351 * parses a node from a JSON object and appends it to the in memory tree model. Used internally.
20352 * @private
20353 * @name _parse_model_from_json(d [, p, ps])
20354 * @param {Object} d the JSON object to parse
20355 * @param {String} p the parent ID
20356 * @param {Array} ps list of all parents
20357 * @return {String} the ID of the object added to the model
20358 */
20359 _parse_model_from_json : function (d, p, ps) {
20360 if(!ps) { ps = []; }
20361 else { ps = ps.concat(); }
20362 if(p) { ps.unshift(p); }
20363 var tid = false, i, j, c, e, m = this._model.data, df = this._model.default_state, tmp;
20364 do {
20365 tid = 'j' + this._id + '_' + (++this._cnt);
20366 } while(m[tid]);
20367
20368 tmp = {
20369 id : false,
20370 text : typeof d === 'string' ? d : '',
20371 icon : typeof d === 'object' && d.icon !== undefined ? d.icon : true,
20372 parent : p,
20373 parents : ps,
20374 children : [],
20375 children_d : [],
20376 data : null,
20377 state : { },
20378 li_attr : { id : false },
20379 a_attr : { href : '#' },
20380 original : false
20381 };
20382 for(i in df) {
20383 if(df.hasOwnProperty(i)) {
20384 tmp.state[i] = df[i];
20385 }
20386 }
20387 if(d && d.id) { tmp.id = d.id.toString(); }
20388 if(d && d.text) { tmp.text = d.text; }
20389 if(d && d.data && d.data.jstree && d.data.jstree.icon) {
20390 tmp.icon = d.data.jstree.icon;
20391 }
20392 if(d && d.data) {
20393 tmp.data = d.data;
20394 if(d.data.jstree) {
20395 for(i in d.data.jstree) {
20396 if(d.data.jstree.hasOwnProperty(i)) {
20397 tmp.state[i] = d.data.jstree[i];
20398 }
20399 }
20400 }
20401 }
20402 if(d && typeof d.state === 'object') {
20403 for (i in d.state) {
20404 if(d.state.hasOwnProperty(i)) {
20405 tmp.state[i] = d.state[i];
20406 }
20407 }
20408 }
20409 if(d && typeof d.li_attr === 'object') {
20410 for (i in d.li_attr) {
20411 if(d.li_attr.hasOwnProperty(i)) {
20412 tmp.li_attr[i] = d.li_attr[i];
20413 }
20414 }
20415 }
20416 if(tmp.li_attr.id && !tmp.id) {
20417 tmp.id = tmp.li_attr.id.toString();
20418 }
20419 if(!tmp.id) {
20420 tmp.id = tid;
20421 }
20422 if(!tmp.li_attr.id) {
20423 tmp.li_attr.id = tmp.id;
20424 }
20425 if(d && typeof d.a_attr === 'object') {
20426 for (i in d.a_attr) {
20427 if(d.a_attr.hasOwnProperty(i)) {
20428 tmp.a_attr[i] = d.a_attr[i];
20429 }
20430 }
20431 }
20432 if(d && d.children && d.children.length) {
20433 for(i = 0, j = d.children.length; i < j; i++) {
20434 c = this._parse_model_from_json(d.children[i], tmp.id, ps);
20435 e = m[c];
20436 tmp.children.push(c);
20437 if(e.children_d.length) {
20438 tmp.children_d = tmp.children_d.concat(e.children_d);
20439 }
20440 }
20441 tmp.children_d = tmp.children_d.concat(tmp.children);
20442 }
20443 if(d && d.children && d.children === true) {
20444 tmp.state.loaded = false;
20445 tmp.children = [];
20446 tmp.children_d = [];
20447 }
20448 delete d.data;
20449 delete d.children;
20450 tmp.original = d;
20451 m[tmp.id] = tmp;
20452 if(tmp.state.selected) {
20453 this._data.core.selected.push(tmp.id);
20454 }
20455 return tmp.id;
20456 },
20457 /**
20458 * redraws all nodes that need to be redrawn. Used internally.
20459 * @private
20460 * @name _redraw()
20461 * @trigger redraw.jstree
20462 */
20463 _redraw : function () {
20464 var nodes = this._model.force_full_redraw ? this._model.data['#'].children.concat([]) : this._model.changed.concat([]),
20465 f = document.createElement('UL'), tmp, i, j, fe = this._data.core.focused;
20466 for(i = 0, j = nodes.length; i < j; i++) {
20467 tmp = this.redraw_node(nodes[i], true, this._model.force_full_redraw);
20468 if(tmp && this._model.force_full_redraw) {
20469 f.appendChild(tmp);
20470 }
20471 }
20472 if(this._model.force_full_redraw) {
20473 f.className = this.get_container_ul()[0].className;
20474 f.setAttribute('role','group');
20475 this.element.empty().append(f);
20476 //this.get_container_ul()[0].appendChild(f);
20477 }
20478 if(fe !== null) {
20479 tmp = this.get_node(fe, true);
20480 if(tmp && tmp.length && tmp.children('.jstree-anchor')[0] !== document.activeElement) {
20481 tmp.children('.jstree-anchor').focus();
20482 }
20483 else {
20484 this._data.core.focused = null;
20485 }
20486 }
20487 this._model.force_full_redraw = false;
20488 this._model.changed = [];
20489 /**
20490 * triggered after nodes are redrawn
20491 * @event
20492 * @name redraw.jstree
20493 * @param {array} nodes the redrawn nodes
20494 */
20495 this.trigger('redraw', { "nodes" : nodes });
20496 },
20497 /**
20498 * redraws all nodes that need to be redrawn or optionally - the whole tree
20499 * @name redraw([full])
20500 * @param {Boolean} full if set to `true` all nodes are redrawn.
20501 */
20502 redraw : function (full) {
20503 if(full) {
20504 this._model.force_full_redraw = true;
20505 }
20506 //if(this._model.redraw_timeout) {
20507 // clearTimeout(this._model.redraw_timeout);
20508 //}
20509 //this._model.redraw_timeout = setTimeout($.proxy(this._redraw, this),0);
20510 this._redraw();
20511 },
20512 /**
20513 * redraws a single node's children. Used internally.
20514 * @private
20515 * @name draw_children(node)
20516 * @param {mixed} node the node whose children will be redrawn
20517 */
20518 draw_children : function (node) {
20519 var obj = this.get_node(node),
20520 i = false,
20521 j = false,
20522 k = false,
20523 d = document;
20524 if(!obj) { return false; }
20525 if(obj.id === '#') { return this.redraw(true); }
20526 node = this.get_node(node, true);
20527 if(!node || !node.length) { return false; } // TODO: quick toggle
20528
20529 node.children('.jstree-children').remove();
20530 node = node[0];
20531 if(obj.children.length && obj.state.loaded) {
20532 k = d.createElement('UL');
20533 k.setAttribute('role', 'group');
20534 k.className = 'jstree-children';
20535 for(i = 0, j = obj.children.length; i < j; i++) {
20536 k.appendChild(this.redraw_node(obj.children[i], true, true));
20537 }
20538 node.appendChild(k);
20539 }
20540 },
20541 /**
20542 * redraws a single node. Used internally.
20543 * @private
20544 * @name redraw_node(node, deep, is_callback, force_render)
20545 * @param {mixed} node the node to redraw
20546 * @param {Boolean} deep should child nodes be redrawn too
20547 * @param {Boolean} is_callback is this a recursion call
20548 * @param {Boolean} force_render should children of closed parents be drawn anyway
20549 */
20550 redraw_node : function (node, deep, is_callback, force_render) {
20551 var obj = this.get_node(node),
20552 par = false,
20553 ind = false,
20554 old = false,
20555 i = false,
20556 j = false,
20557 k = false,
20558 c = '',
20559 d = document,
20560 m = this._model.data,
20561 f = false,
20562 s = false,
20563 tmp = null,
20564 t = 0,
20565 l = 0;
20566 if(!obj) { return false; }
20567 if(obj.id === '#') { return this.redraw(true); }
20568 deep = deep || obj.children.length === 0;
20569 node = !document.querySelector ? document.getElementById(obj.id) : this.element[0].querySelector('#' + ("0123456789".indexOf(obj.id[0]) !== -1 ? '\\3' + obj.id[0] + ' ' + obj.id.substr(1).replace($.jstree.idregex,'\\$&') : obj.id.replace($.jstree.idregex,'\\$&')) ); //, this.element);
20570 if(!node) {
20571 deep = true;
20572 //node = d.createElement('LI');
20573 if(!is_callback) {
20574 par = obj.parent !== '#' ? $('#' + obj.parent.replace($.jstree.idregex,'\\$&'), this.element)[0] : null;
20575 if(par !== null && (!par || !m[obj.parent].state.opened)) {
20576 return false;
20577 }
20578 ind = $.inArray(obj.id, par === null ? m['#'].children : m[obj.parent].children);
20579 }
20580 }
20581 else {
20582 node = $(node);
20583 if(!is_callback) {
20584 par = node.parent().parent()[0];
20585 if(par === this.element[0]) {
20586 par = null;
20587 }
20588 ind = node.index();
20589 }
20590 // m[obj.id].data = node.data(); // use only node's data, no need to touch jquery storage
20591 if(!deep && obj.children.length && !node.children('.jstree-children').length) {
20592 deep = true;
20593 }
20594 if(!deep) {
20595 old = node.children('.jstree-children')[0];
20596 }
20597 f = node.children('.jstree-anchor')[0] === document.activeElement;
20598 node.remove();
20599 //node = d.createElement('LI');
20600 //node = node[0];
20601 }
20602 node = _node.cloneNode(true);
20603 // node is DOM, deep is boolean
20604
20605 c = 'jstree-node ';
20606 for(i in obj.li_attr) {
20607 if(obj.li_attr.hasOwnProperty(i)) {
20608 if(i === 'id') { continue; }
20609 if(i !== 'class') {
20610 node.setAttribute(i, obj.li_attr[i]);
20611 }
20612 else {
20613 c += obj.li_attr[i];
20614 }
20615 }
20616 }
20617 if(!obj.a_attr.id) {
20618 obj.a_attr.id = obj.id + '_anchor';
20619 }
20620 node.setAttribute('aria-selected', !!obj.state.selected);
20621 node.setAttribute('aria-level', obj.parents.length);
20622 node.setAttribute('aria-labelledby', obj.a_attr.id);
20623 if(obj.state.disabled) {
20624 node.setAttribute('aria-disabled', true);
20625 }
20626
20627 if(obj.state.loaded && !obj.children.length) {
20628 c += ' jstree-leaf';
20629 }
20630 else {
20631 c += obj.state.opened && obj.state.loaded ? ' jstree-open' : ' jstree-closed';
20632 node.setAttribute('aria-expanded', (obj.state.opened && obj.state.loaded) );
20633 }
20634 if(obj.parent !== null && m[obj.parent].children[m[obj.parent].children.length - 1] === obj.id) {
20635 c += ' jstree-last';
20636 }
20637 node.id = obj.id;
20638 node.className = c;
20639 c = ( obj.state.selected ? ' jstree-clicked' : '') + ( obj.state.disabled ? ' jstree-disabled' : '');
20640 for(j in obj.a_attr) {
20641 if(obj.a_attr.hasOwnProperty(j)) {
20642 if(j === 'href' && obj.a_attr[j] === '#') { continue; }
20643 if(j !== 'class') {
20644 node.childNodes[1].setAttribute(j, obj.a_attr[j]);
20645 }
20646 else {
20647 c += ' ' + obj.a_attr[j];
20648 }
20649 }
20650 }
20651 if(c.length) {
20652 node.childNodes[1].className = 'jstree-anchor ' + c;
20653 }
20654 if((obj.icon && obj.icon !== true) || obj.icon === false) {
20655 if(obj.icon === false) {
20656 node.childNodes[1].childNodes[0].className += ' jstree-themeicon-hidden';
20657 }
20658 else if(obj.icon.indexOf('/') === -1 && obj.icon.indexOf('.') === -1) {
20659 node.childNodes[1].childNodes[0].className += ' ' + obj.icon + ' jstree-themeicon-custom';
20660 }
20661 else {
20662 node.childNodes[1].childNodes[0].style.backgroundImage = 'url('+obj.icon+')';
20663 node.childNodes[1].childNodes[0].style.backgroundPosition = 'center center';
20664 node.childNodes[1].childNodes[0].style.backgroundSize = 'auto';
20665 node.childNodes[1].childNodes[0].className += ' jstree-themeicon-custom';
20666 }
20667 }
20668
20669 if(this.settings.core.force_text) {
20670 node.childNodes[1].appendChild(d.createTextNode(obj.text));
20671 }
20672 else {
20673 node.childNodes[1].innerHTML += obj.text;
20674 }
20675
20676
20677 if(deep && obj.children.length && (obj.state.opened || force_render) && obj.state.loaded) {
20678 k = d.createElement('UL');
20679 k.setAttribute('role', 'group');
20680 k.className = 'jstree-children';
20681 for(i = 0, j = obj.children.length; i < j; i++) {
20682 k.appendChild(this.redraw_node(obj.children[i], deep, true));
20683 }
20684 node.appendChild(k);
20685 }
20686 if(old) {
20687 node.appendChild(old);
20688 }
20689 if(!is_callback) {
20690 // append back using par / ind
20691 if(!par) {
20692 par = this.element[0];
20693 }
20694 for(i = 0, j = par.childNodes.length; i < j; i++) {
20695 if(par.childNodes[i] && par.childNodes[i].className && par.childNodes[i].className.indexOf('jstree-children') !== -1) {
20696 tmp = par.childNodes[i];
20697 break;
20698 }
20699 }
20700 if(!tmp) {
20701 tmp = d.createElement('UL');
20702 tmp.setAttribute('role', 'group');
20703 tmp.className = 'jstree-children';
20704 par.appendChild(tmp);
20705 }
20706 par = tmp;
20707
20708 if(ind < par.childNodes.length) {
20709 par.insertBefore(node, par.childNodes[ind]);
20710 }
20711 else {
20712 par.appendChild(node);
20713 }
20714 if(f) {
20715 t = this.element[0].scrollTop;
20716 l = this.element[0].scrollLeft;
20717 node.childNodes[1].focus();
20718 this.element[0].scrollTop = t;
20719 this.element[0].scrollLeft = l;
20720 }
20721 }
20722 if(obj.state.opened && !obj.state.loaded) {
20723 obj.state.opened = false;
20724 setTimeout($.proxy(function () {
20725 this.open_node(obj.id, false, 0);
20726 }, this), 0);
20727 }
20728 return node;
20729 },
20730 /**
20731 * opens a node, revaling its children. If the node is not loaded it will be loaded and opened once ready.
20732 * @name open_node(obj [, callback, animation])
20733 * @param {mixed} obj the node to open
20734 * @param {Function} callback a function to execute once the node is opened
20735 * @param {Number} animation the animation duration in milliseconds when opening the node (overrides the `core.animation` setting). Use `false` for no animation.
20736 * @trigger open_node.jstree, after_open.jstree, before_open.jstree
20737 */
20738 open_node : function (obj, callback, animation) {
20739 var t1, t2, d, t;
20740 if($.isArray(obj)) {
20741 obj = obj.slice();
20742 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
20743 this.open_node(obj[t1], callback, animation);
20744 }
20745 return true;
20746 }
20747 obj = this.get_node(obj);
20748 if(!obj || obj.id === '#') {
20749 return false;
20750 }
20751 animation = animation === undefined ? this.settings.core.animation : animation;
20752 if(!this.is_closed(obj)) {
20753 if(callback) {
20754 callback.call(this, obj, false);
20755 }
20756 return false;
20757 }
20758 if(!this.is_loaded(obj)) {
20759 if(this.is_loading(obj)) {
20760 return setTimeout($.proxy(function () {
20761 this.open_node(obj, callback, animation);
20762 }, this), 500);
20763 }
20764 this.load_node(obj, function (o, ok) {
20765 return ok ? this.open_node(o, callback, animation) : (callback ? callback.call(this, o, false) : false);
20766 });
20767 }
20768 else {
20769 d = this.get_node(obj, true);
20770 t = this;
20771 if(d.length) {
20772 if(animation && d.children(".jstree-children").length) {
20773 d.children(".jstree-children").stop(true, true);
20774 }
20775 if(obj.children.length && !this._firstChild(d.children('.jstree-children')[0])) {
20776 this.draw_children(obj);
20777 //d = this.get_node(obj, true);
20778 }
20779 if(!animation) {
20780 this.trigger('before_open', { "node" : obj });
20781 d[0].className = d[0].className.replace('jstree-closed', 'jstree-open');
20782 d[0].setAttribute("aria-expanded", true);
20783 }
20784 else {
20785 this.trigger('before_open', { "node" : obj });
20786 d
20787 .children(".jstree-children").css("display","none").end()
20788 .removeClass("jstree-closed").addClass("jstree-open").attr("aria-expanded", true)
20789 .children(".jstree-children").stop(true, true)
20790 .slideDown(animation, function () {
20791 this.style.display = "";
20792 t.trigger("after_open", { "node" : obj });
20793 });
20794 }
20795 }
20796 obj.state.opened = true;
20797 if(callback) {
20798 callback.call(this, obj, true);
20799 }
20800 if(!d.length) {
20801 /**
20802 * triggered when a node is about to be opened (if the node is supposed to be in the DOM, it will be, but it won't be visible yet)
20803 * @event
20804 * @name before_open.jstree
20805 * @param {Object} node the opened node
20806 */
20807 this.trigger('before_open', { "node" : obj });
20808 }
20809 /**
20810 * triggered when a node is opened (if there is an animation it will not be completed yet)
20811 * @event
20812 * @name open_node.jstree
20813 * @param {Object} node the opened node
20814 */
20815 this.trigger('open_node', { "node" : obj });
20816 if(!animation || !d.length) {
20817 /**
20818 * triggered when a node is opened and the animation is complete
20819 * @event
20820 * @name after_open.jstree
20821 * @param {Object} node the opened node
20822 */
20823 this.trigger("after_open", { "node" : obj });
20824 }
20825 }
20826 },
20827 /**
20828 * opens every parent of a node (node should be loaded)
20829 * @name _open_to(obj)
20830 * @param {mixed} obj the node to reveal
20831 * @private
20832 */
20833 _open_to : function (obj) {
20834 obj = this.get_node(obj);
20835 if(!obj || obj.id === '#') {
20836 return false;
20837 }
20838 var i, j, p = obj.parents;
20839 for(i = 0, j = p.length; i < j; i+=1) {
20840 if(i !== '#') {
20841 this.open_node(p[i], false, 0);
20842 }
20843 }
20844 return $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element);
20845 },
20846 /**
20847 * closes a node, hiding its children
20848 * @name close_node(obj [, animation])
20849 * @param {mixed} obj the node to close
20850 * @param {Number} animation the animation duration in milliseconds when closing the node (overrides the `core.animation` setting). Use `false` for no animation.
20851 * @trigger close_node.jstree, after_close.jstree
20852 */
20853 close_node : function (obj, animation) {
20854 var t1, t2, t, d;
20855 if($.isArray(obj)) {
20856 obj = obj.slice();
20857 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
20858 this.close_node(obj[t1], animation);
20859 }
20860 return true;
20861 }
20862 obj = this.get_node(obj);
20863 if(!obj || obj.id === '#') {
20864 return false;
20865 }
20866 if(this.is_closed(obj)) {
20867 return false;
20868 }
20869 animation = animation === undefined ? this.settings.core.animation : animation;
20870 t = this;
20871 d = this.get_node(obj, true);
20872 if(d.length) {
20873 if(!animation) {
20874 d[0].className = d[0].className.replace('jstree-open', 'jstree-closed');
20875 d.attr("aria-expanded", false).children('.jstree-children').remove();
20876 }
20877 else {
20878 d
20879 .children(".jstree-children").attr("style","display:block !important").end()
20880 .removeClass("jstree-open").addClass("jstree-closed").attr("aria-expanded", false)
20881 .children(".jstree-children").stop(true, true).slideUp(animation, function () {
20882 this.style.display = "";
20883 d.children('.jstree-children').remove();
20884 t.trigger("after_close", { "node" : obj });
20885 });
20886 }
20887 }
20888 obj.state.opened = false;
20889 /**
20890 * triggered when a node is closed (if there is an animation it will not be complete yet)
20891 * @event
20892 * @name close_node.jstree
20893 * @param {Object} node the closed node
20894 */
20895 this.trigger('close_node',{ "node" : obj });
20896 if(!animation || !d.length) {
20897 /**
20898 * triggered when a node is closed and the animation is complete
20899 * @event
20900 * @name after_close.jstree
20901 * @param {Object} node the closed node
20902 */
20903 this.trigger("after_close", { "node" : obj });
20904 }
20905 },
20906 /**
20907 * toggles a node - closing it if it is open, opening it if it is closed
20908 * @name toggle_node(obj)
20909 * @param {mixed} obj the node to toggle
20910 */
20911 toggle_node : function (obj) {
20912 var t1, t2;
20913 if($.isArray(obj)) {
20914 obj = obj.slice();
20915 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
20916 this.toggle_node(obj[t1]);
20917 }
20918 return true;
20919 }
20920 if(this.is_closed(obj)) {
20921 return this.open_node(obj);
20922 }
20923 if(this.is_open(obj)) {
20924 return this.close_node(obj);
20925 }
20926 },
20927 /**
20928 * opens all nodes within a node (or the tree), revaling their children. If the node is not loaded it will be loaded and opened once ready.
20929 * @name open_all([obj, animation, original_obj])
20930 * @param {mixed} obj the node to open recursively, omit to open all nodes in the tree
20931 * @param {Number} animation the animation duration in milliseconds when opening the nodes, the default is no animation
20932 * @param {jQuery} reference to the node that started the process (internal use)
20933 * @trigger open_all.jstree
20934 */
20935 open_all : function (obj, animation, original_obj) {
20936 if(!obj) { obj = '#'; }
20937 obj = this.get_node(obj);
20938 if(!obj) { return false; }
20939 var dom = obj.id === '#' ? this.get_container_ul() : this.get_node(obj, true), i, j, _this;
20940 if(!dom.length) {
20941 for(i = 0, j = obj.children_d.length; i < j; i++) {
20942 if(this.is_closed(this._model.data[obj.children_d[i]])) {
20943 this._model.data[obj.children_d[i]].state.opened = true;
20944 }
20945 }
20946 return this.trigger('open_all', { "node" : obj });
20947 }
20948 original_obj = original_obj || dom;
20949 _this = this;
20950 dom = this.is_closed(obj) ? dom.find('.jstree-closed').addBack() : dom.find('.jstree-closed');
20951 dom.each(function () {
20952 _this.open_node(
20953 this,
20954 function(node, status) { if(status && this.is_parent(node)) { this.open_all(node, animation, original_obj); } },
20955 animation || 0
20956 );
20957 });
20958 if(original_obj.find('.jstree-closed').length === 0) {
20959 /**
20960 * triggered when an `open_all` call completes
20961 * @event
20962 * @name open_all.jstree
20963 * @param {Object} node the opened node
20964 */
20965 this.trigger('open_all', { "node" : this.get_node(original_obj) });
20966 }
20967 },
20968 /**
20969 * closes all nodes within a node (or the tree), revaling their children
20970 * @name close_all([obj, animation])
20971 * @param {mixed} obj the node to close recursively, omit to close all nodes in the tree
20972 * @param {Number} animation the animation duration in milliseconds when closing the nodes, the default is no animation
20973 * @trigger close_all.jstree
20974 */
20975 close_all : function (obj, animation) {
20976 if(!obj) { obj = '#'; }
20977 obj = this.get_node(obj);
20978 if(!obj) { return false; }
20979 var dom = obj.id === '#' ? this.get_container_ul() : this.get_node(obj, true),
20980 _this = this, i, j;
20981 if(!dom.length) {
20982 for(i = 0, j = obj.children_d.length; i < j; i++) {
20983 this._model.data[obj.children_d[i]].state.opened = false;
20984 }
20985 return this.trigger('close_all', { "node" : obj });
20986 }
20987 dom = this.is_open(obj) ? dom.find('.jstree-open').addBack() : dom.find('.jstree-open');
20988 $(dom.get().reverse()).each(function () { _this.close_node(this, animation || 0); });
20989 /**
20990 * triggered when an `close_all` call completes
20991 * @event
20992 * @name close_all.jstree
20993 * @param {Object} node the closed node
20994 */
20995 this.trigger('close_all', { "node" : obj });
20996 },
20997 /**
20998 * checks if a node is disabled (not selectable)
20999 * @name is_disabled(obj)
21000 * @param {mixed} obj
21001 * @return {Boolean}
21002 */
21003 is_disabled : function (obj) {
21004 obj = this.get_node(obj);
21005 return obj && obj.state && obj.state.disabled;
21006 },
21007 /**
21008 * enables a node - so that it can be selected
21009 * @name enable_node(obj)
21010 * @param {mixed} obj the node to enable
21011 * @trigger enable_node.jstree
21012 */
21013 enable_node : function (obj) {
21014 var t1, t2;
21015 if($.isArray(obj)) {
21016 obj = obj.slice();
21017 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
21018 this.enable_node(obj[t1]);
21019 }
21020 return true;
21021 }
21022 obj = this.get_node(obj);
21023 if(!obj || obj.id === '#') {
21024 return false;
21025 }
21026 obj.state.disabled = false;
21027 this.get_node(obj,true).children('.jstree-anchor').removeClass('jstree-disabled').attr('aria-disabled', false);
21028 /**
21029 * triggered when an node is enabled
21030 * @event
21031 * @name enable_node.jstree
21032 * @param {Object} node the enabled node
21033 */
21034 this.trigger('enable_node', { 'node' : obj });
21035 },
21036 /**
21037 * disables a node - so that it can not be selected
21038 * @name disable_node(obj)
21039 * @param {mixed} obj the node to disable
21040 * @trigger disable_node.jstree
21041 */
21042 disable_node : function (obj) {
21043 var t1, t2;
21044 if($.isArray(obj)) {
21045 obj = obj.slice();
21046 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
21047 this.disable_node(obj[t1]);
21048 }
21049 return true;
21050 }
21051 obj = this.get_node(obj);
21052 if(!obj || obj.id === '#') {
21053 return false;
21054 }
21055 obj.state.disabled = true;
21056 this.get_node(obj,true).children('.jstree-anchor').addClass('jstree-disabled').attr('aria-disabled', true);
21057 /**
21058 * triggered when an node is disabled
21059 * @event
21060 * @name disable_node.jstree
21061 * @param {Object} node the disabled node
21062 */
21063 this.trigger('disable_node', { 'node' : obj });
21064 },
21065 /**
21066 * called when a node is selected by the user. Used internally.
21067 * @private
21068 * @name activate_node(obj, e)
21069 * @param {mixed} obj the node
21070 * @param {Object} e the related event
21071 * @trigger activate_node.jstree, changed.jstree
21072 */
21073 activate_node : function (obj, e) {
21074 if(this.is_disabled(obj)) {
21075 return false;
21076 }
21077
21078 // ensure last_clicked is still in the DOM, make it fresh (maybe it was moved?) and make sure it is still selected, if not - make last_clicked the last selected node
21079 this._data.core.last_clicked = this._data.core.last_clicked && this._data.core.last_clicked.id !== undefined ? this.get_node(this._data.core.last_clicked.id) : null;
21080 if(this._data.core.last_clicked && !this._data.core.last_clicked.state.selected) { this._data.core.last_clicked = null; }
21081 if(!this._data.core.last_clicked && this._data.core.selected.length) { this._data.core.last_clicked = this.get_node(this._data.core.selected[this._data.core.selected.length - 1]); }
21082
21083 if(!this.settings.core.multiple || (!e.metaKey && !e.ctrlKey && !e.shiftKey) || (e.shiftKey && (!this._data.core.last_clicked || !this.get_parent(obj) || this.get_parent(obj) !== this._data.core.last_clicked.parent ) )) {
21084 if(!this.settings.core.multiple && (e.metaKey || e.ctrlKey || e.shiftKey) && this.is_selected(obj)) {
21085 this.deselect_node(obj, false, e);
21086 }
21087 else {
21088 this.deselect_all(true);
21089 this.select_node(obj, false, false, e);
21090 this._data.core.last_clicked = this.get_node(obj);
21091 }
21092 }
21093 else {
21094 if(e.shiftKey) {
21095 var o = this.get_node(obj).id,
21096 l = this._data.core.last_clicked.id,
21097 p = this.get_node(this._data.core.last_clicked.parent).children,
21098 c = false,
21099 i, j;
21100 for(i = 0, j = p.length; i < j; i += 1) {
21101 // separate IFs work whem o and l are the same
21102 if(p[i] === o) {
21103 c = !c;
21104 }
21105 if(p[i] === l) {
21106 c = !c;
21107 }
21108 if(c || p[i] === o || p[i] === l) {
21109 this.select_node(p[i], true, false, e);
21110 }
21111 else {
21112 this.deselect_node(p[i], true, e);
21113 }
21114 }
21115 this.trigger('changed', { 'action' : 'select_node', 'node' : this.get_node(obj), 'selected' : this._data.core.selected, 'event' : e });
21116 }
21117 else {
21118 if(!this.is_selected(obj)) {
21119 this.select_node(obj, false, false, e);
21120 }
21121 else {
21122 this.deselect_node(obj, false, e);
21123 }
21124 }
21125 }
21126 /**
21127 * triggered when an node is clicked or intercated with by the user
21128 * @event
21129 * @name activate_node.jstree
21130 * @param {Object} node
21131 */
21132 this.trigger('activate_node', { 'node' : this.get_node(obj) });
21133 },
21134 /**
21135 * applies the hover state on a node, called when a node is hovered by the user. Used internally.
21136 * @private
21137 * @name hover_node(obj)
21138 * @param {mixed} obj
21139 * @trigger hover_node.jstree
21140 */
21141 hover_node : function (obj) {
21142 obj = this.get_node(obj, true);
21143 if(!obj || !obj.length || obj.children('.jstree-hovered').length) {
21144 return false;
21145 }
21146 var o = this.element.find('.jstree-hovered'), t = this.element;
21147 if(o && o.length) { this.dehover_node(o); }
21148
21149 obj.children('.jstree-anchor').addClass('jstree-hovered');
21150 /**
21151 * triggered when an node is hovered
21152 * @event
21153 * @name hover_node.jstree
21154 * @param {Object} node
21155 */
21156 this.trigger('hover_node', { 'node' : this.get_node(obj) });
21157 setTimeout(function () { t.attr('aria-activedescendant', obj[0].id); }, 0);
21158 },
21159 /**
21160 * removes the hover state from a nodecalled when a node is no longer hovered by the user. Used internally.
21161 * @private
21162 * @name dehover_node(obj)
21163 * @param {mixed} obj
21164 * @trigger dehover_node.jstree
21165 */
21166 dehover_node : function (obj) {
21167 obj = this.get_node(obj, true);
21168 if(!obj || !obj.length || !obj.children('.jstree-hovered').length) {
21169 return false;
21170 }
21171 obj.children('.jstree-anchor').removeClass('jstree-hovered');
21172 /**
21173 * triggered when an node is no longer hovered
21174 * @event
21175 * @name dehover_node.jstree
21176 * @param {Object} node
21177 */
21178 this.trigger('dehover_node', { 'node' : this.get_node(obj) });
21179 },
21180 /**
21181 * select a node
21182 * @name select_node(obj [, supress_event, prevent_open])
21183 * @param {mixed} obj an array can be used to select multiple nodes
21184 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
21185 * @param {Boolean} prevent_open if set to `true` parents of the selected node won't be opened
21186 * @trigger select_node.jstree, changed.jstree
21187 */
21188 select_node : function (obj, supress_event, prevent_open, e) {
21189 var dom, t1, t2, th;
21190 if($.isArray(obj)) {
21191 obj = obj.slice();
21192 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
21193 this.select_node(obj[t1], supress_event, prevent_open, e);
21194 }
21195 return true;
21196 }
21197 obj = this.get_node(obj);
21198 if(!obj || obj.id === '#') {
21199 return false;
21200 }
21201 dom = this.get_node(obj, true);
21202 if(!obj.state.selected) {
21203 obj.state.selected = true;
21204 this._data.core.selected.push(obj.id);
21205 if(!prevent_open) {
21206 dom = this._open_to(obj);
21207 }
21208 if(dom && dom.length) {
21209 dom.attr('aria-selected', true).children('.jstree-anchor').addClass('jstree-clicked');
21210 }
21211 /**
21212 * triggered when an node is selected
21213 * @event
21214 * @name select_node.jstree
21215 * @param {Object} node
21216 * @param {Array} selected the current selection
21217 * @param {Object} event the event (if any) that triggered this select_node
21218 */
21219 this.trigger('select_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
21220 if(!supress_event) {
21221 /**
21222 * triggered when selection changes
21223 * @event
21224 * @name changed.jstree
21225 * @param {Object} node
21226 * @param {Object} action the action that caused the selection to change
21227 * @param {Array} selected the current selection
21228 * @param {Object} event the event (if any) that triggered this changed event
21229 */
21230 this.trigger('changed', { 'action' : 'select_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
21231 }
21232 }
21233 },
21234 /**
21235 * deselect a node
21236 * @name deselect_node(obj [, supress_event])
21237 * @param {mixed} obj an array can be used to deselect multiple nodes
21238 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
21239 * @trigger deselect_node.jstree, changed.jstree
21240 */
21241 deselect_node : function (obj, supress_event, e) {
21242 var t1, t2, dom;
21243 if($.isArray(obj)) {
21244 obj = obj.slice();
21245 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
21246 this.deselect_node(obj[t1], supress_event, e);
21247 }
21248 return true;
21249 }
21250 obj = this.get_node(obj);
21251 if(!obj || obj.id === '#') {
21252 return false;
21253 }
21254 dom = this.get_node(obj, true);
21255 if(obj.state.selected) {
21256 obj.state.selected = false;
21257 this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.id);
21258 if(dom.length) {
21259 dom.attr('aria-selected', false).children('.jstree-anchor').removeClass('jstree-clicked');
21260 }
21261 /**
21262 * triggered when an node is deselected
21263 * @event
21264 * @name deselect_node.jstree
21265 * @param {Object} node
21266 * @param {Array} selected the current selection
21267 * @param {Object} event the event (if any) that triggered this deselect_node
21268 */
21269 this.trigger('deselect_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
21270 if(!supress_event) {
21271 this.trigger('changed', { 'action' : 'deselect_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
21272 }
21273 }
21274 },
21275 /**
21276 * select all nodes in the tree
21277 * @name select_all([supress_event])
21278 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
21279 * @trigger select_all.jstree, changed.jstree
21280 */
21281 select_all : function (supress_event) {
21282 var tmp = this._data.core.selected.concat([]), i, j;
21283 this._data.core.selected = this._model.data['#'].children_d.concat();
21284 for(i = 0, j = this._data.core.selected.length; i < j; i++) {
21285 if(this._model.data[this._data.core.selected[i]]) {
21286 this._model.data[this._data.core.selected[i]].state.selected = true;
21287 }
21288 }
21289 this.redraw(true);
21290 /**
21291 * triggered when all nodes are selected
21292 * @event
21293 * @name select_all.jstree
21294 * @param {Array} selected the current selection
21295 */
21296 this.trigger('select_all', { 'selected' : this._data.core.selected });
21297 if(!supress_event) {
21298 this.trigger('changed', { 'action' : 'select_all', 'selected' : this._data.core.selected, 'old_selection' : tmp });
21299 }
21300 },
21301 /**
21302 * deselect all selected nodes
21303 * @name deselect_all([supress_event])
21304 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
21305 * @trigger deselect_all.jstree, changed.jstree
21306 */
21307 deselect_all : function (supress_event) {
21308 var tmp = this._data.core.selected.concat([]), i, j;
21309 for(i = 0, j = this._data.core.selected.length; i < j; i++) {
21310 if(this._model.data[this._data.core.selected[i]]) {
21311 this._model.data[this._data.core.selected[i]].state.selected = false;
21312 }
21313 }
21314 this._data.core.selected = [];
21315 this.element.find('.jstree-clicked').removeClass('jstree-clicked').parent().attr('aria-selected', false);
21316 /**
21317 * triggered when all nodes are deselected
21318 * @event
21319 * @name deselect_all.jstree
21320 * @param {Object} node the previous selection
21321 * @param {Array} selected the current selection
21322 */
21323 this.trigger('deselect_all', { 'selected' : this._data.core.selected, 'node' : tmp });
21324 if(!supress_event) {
21325 this.trigger('changed', { 'action' : 'deselect_all', 'selected' : this._data.core.selected, 'old_selection' : tmp });
21326 }
21327 },
21328 /**
21329 * checks if a node is selected
21330 * @name is_selected(obj)
21331 * @param {mixed} obj
21332 * @return {Boolean}
21333 */
21334 is_selected : function (obj) {
21335 obj = this.get_node(obj);
21336 if(!obj || obj.id === '#') {
21337 return false;
21338 }
21339 return obj.state.selected;
21340 },
21341 /**
21342 * get an array of all selected nodes
21343 * @name get_selected([full])
21344 * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
21345 * @return {Array}
21346 */
21347 get_selected : function (full) {
21348 return full ? $.map(this._data.core.selected, $.proxy(function (i) { return this.get_node(i); }, this)) : this._data.core.selected.slice();
21349 },
21350 /**
21351 * get an array of all top level selected nodes (ignoring children of selected nodes)
21352 * @name get_top_selected([full])
21353 * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
21354 * @return {Array}
21355 */
21356 get_top_selected : function (full) {
21357 var tmp = this.get_selected(true),
21358 obj = {}, i, j, k, l;
21359 for(i = 0, j = tmp.length; i < j; i++) {
21360 obj[tmp[i].id] = tmp[i];
21361 }
21362 for(i = 0, j = tmp.length; i < j; i++) {
21363 for(k = 0, l = tmp[i].children_d.length; k < l; k++) {
21364 if(obj[tmp[i].children_d[k]]) {
21365 delete obj[tmp[i].children_d[k]];
21366 }
21367 }
21368 }
21369 tmp = [];
21370 for(i in obj) {
21371 if(obj.hasOwnProperty(i)) {
21372 tmp.push(i);
21373 }
21374 }
21375 return full ? $.map(tmp, $.proxy(function (i) { return this.get_node(i); }, this)) : tmp;
21376 },
21377 /**
21378 * get an array of all bottom level selected nodes (ignoring selected parents)
21379 * @name get_bottom_selected([full])
21380 * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
21381 * @return {Array}
21382 */
21383 get_bottom_selected : function (full) {
21384 var tmp = this.get_selected(true),
21385 obj = [], i, j;
21386 for(i = 0, j = tmp.length; i < j; i++) {
21387 if(!tmp[i].children.length) {
21388 obj.push(tmp[i].id);
21389 }
21390 }
21391 return full ? $.map(obj, $.proxy(function (i) { return this.get_node(i); }, this)) : obj;
21392 },
21393 /**
21394 * gets the current state of the tree so that it can be restored later with `set_state(state)`. Used internally.
21395 * @name get_state()
21396 * @private
21397 * @return {Object}
21398 */
21399 get_state : function () {
21400 var state = {
21401 'core' : {
21402 'open' : [],
21403 'scroll' : {
21404 'left' : this.element.scrollLeft(),
21405 'top' : this.element.scrollTop()
21406 },
21407 /*!
21408 'themes' : {
21409 'name' : this.get_theme(),
21410 'icons' : this._data.core.themes.icons,
21411 'dots' : this._data.core.themes.dots
21412 },
21413 */
21414 'selected' : []
21415 }
21416 }, i;
21417 for(i in this._model.data) {
21418 if(this._model.data.hasOwnProperty(i)) {
21419 if(i !== '#') {
21420 if(this._model.data[i].state.opened) {
21421 state.core.open.push(i);
21422 }
21423 if(this._model.data[i].state.selected) {
21424 state.core.selected.push(i);
21425 }
21426 }
21427 }
21428 }
21429 return state;
21430 },
21431 /**
21432 * sets the state of the tree. Used internally.
21433 * @name set_state(state [, callback])
21434 * @private
21435 * @param {Object} state the state to restore
21436 * @param {Function} callback an optional function to execute once the state is restored.
21437 * @trigger set_state.jstree
21438 */
21439 set_state : function (state, callback) {
21440 if(state) {
21441 if(state.core) {
21442 var res, n, t, _this;
21443 if(state.core.open) {
21444 if(!$.isArray(state.core.open)) {
21445 delete state.core.open;
21446 this.set_state(state, callback);
21447 return false;
21448 }
21449 res = true;
21450 n = false;
21451 t = this;
21452 $.each(state.core.open.concat([]), function (i, v) {
21453 n = t.get_node(v);
21454 if(n) {
21455 if(t.is_loaded(v)) {
21456 if(t.is_closed(v)) {
21457 t.open_node(v, false, 0);
21458 }
21459 if(state && state.core && state.core.open) {
21460 $.vakata.array_remove_item(state.core.open, v);
21461 }
21462 }
21463 else {
21464 if(!t.is_loading(v)) {
21465 t.open_node(v, $.proxy(function (o, s) {
21466 if(!s && state && state.core && state.core.open) {
21467 $.vakata.array_remove_item(state.core.open, o.id);
21468 }
21469 this.set_state(state, callback);
21470 }, t), 0);
21471 }
21472 // there will be some async activity - so wait for it
21473 res = false;
21474 }
21475 }
21476 });
21477 if(res) {
21478 delete state.core.open;
21479 this.set_state(state, callback);
21480 }
21481 return false;
21482 }
21483 if(state.core.scroll) {
21484 if(state.core.scroll && state.core.scroll.left !== undefined) {
21485 this.element.scrollLeft(state.core.scroll.left);
21486 }
21487 if(state.core.scroll && state.core.scroll.top !== undefined) {
21488 this.element.scrollTop(state.core.scroll.top);
21489 }
21490 delete state.core.scroll;
21491 this.set_state(state, callback);
21492 return false;
21493 }
21494 /*!
21495 if(state.core.themes) {
21496 if(state.core.themes.name) {
21497 this.set_theme(state.core.themes.name);
21498 }
21499 if(typeof state.core.themes.dots !== 'undefined') {
21500 this[ state.core.themes.dots ? "show_dots" : "hide_dots" ]();
21501 }
21502 if(typeof state.core.themes.icons !== 'undefined') {
21503 this[ state.core.themes.icons ? "show_icons" : "hide_icons" ]();
21504 }
21505 delete state.core.themes;
21506 delete state.core.open;
21507 this.set_state(state, callback);
21508 return false;
21509 }
21510 */
21511 if(state.core.selected) {
21512 _this = this;
21513 this.deselect_all();
21514 $.each(state.core.selected, function (i, v) {
21515 _this.select_node(v);
21516 });
21517 delete state.core.selected;
21518 this.set_state(state, callback);
21519 return false;
21520 }
21521 if($.isEmptyObject(state.core)) {
21522 delete state.core;
21523 this.set_state(state, callback);
21524 return false;
21525 }
21526 }
21527 if($.isEmptyObject(state)) {
21528 state = null;
21529 if(callback) { callback.call(this); }
21530 /**
21531 * triggered when a `set_state` call completes
21532 * @event
21533 * @name set_state.jstree
21534 */
21535 this.trigger('set_state');
21536 return false;
21537 }
21538 return true;
21539 }
21540 return false;
21541 },
21542 /**
21543 * refreshes the tree - all nodes are reloaded with calls to `load_node`.
21544 * @name refresh()
21545 * @param {Boolean} skip_loading an option to skip showing the loading indicator
21546 * @param {Mixed} forget_state if set to `true` state will not be reapplied, if set to a function (receiving the current state as argument) the result of that function will be used as state
21547 * @trigger refresh.jstree
21548 */
21549 refresh : function (skip_loading, forget_state) {
21550 this._data.core.state = forget_state === true ? {} : this.get_state();
21551 if(forget_state && $.isFunction(forget_state)) { this._data.core.state = forget_state.call(this, this._data.core.state); }
21552 this._cnt = 0;
21553 this._model.data = {
21554 '#' : {
21555 id : '#',
21556 parent : null,
21557 parents : [],
21558 children : [],
21559 children_d : [],
21560 state : { loaded : false }
21561 }
21562 };
21563 var c = this.get_container_ul()[0].className;
21564 if(!skip_loading) {
21565 this.element.html("<"+"ul class='"+c+"' role='group'><"+"li class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='treeitem' id='j"+this._id+"_loading'><i class='jstree-icon jstree-ocl'></i><"+"a class='jstree-anchor' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>" + this.get_string("Loading ...") + "</a></li></ul>");
21566 this.element.attr('aria-activedescendant','j'+this._id+'_loading');
21567 }
21568 this.load_node('#', function (o, s) {
21569 if(s) {
21570 this.get_container_ul()[0].className = c;
21571 if(this._firstChild(this.get_container_ul()[0])) {
21572 this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id);
21573 }
21574 this.set_state($.extend(true, {}, this._data.core.state), function () {
21575 /**
21576 * triggered when a `refresh` call completes
21577 * @event
21578 * @name refresh.jstree
21579 */
21580 this.trigger('refresh');
21581 });
21582 }
21583 this._data.core.state = null;
21584 });
21585 },
21586 /**
21587 * refreshes a node in the tree (reload its children) all opened nodes inside that node are reloaded with calls to `load_node`.
21588 * @name refresh_node(obj)
21589 * @param {mixed} obj the node
21590 * @trigger refresh_node.jstree
21591 */
21592 refresh_node : function (obj) {
21593 obj = this.get_node(obj);
21594 if(!obj || obj.id === '#') { return false; }
21595 var opened = [], to_load = [], s = this._data.core.selected.concat([]);
21596 to_load.push(obj.id);
21597 if(obj.state.opened === true) { opened.push(obj.id); }
21598 this.get_node(obj, true).find('.jstree-open').each(function() { opened.push(this.id); });
21599 this._load_nodes(to_load, $.proxy(function (nodes) {
21600 this.open_node(opened, false, 0);
21601 this.select_node(this._data.core.selected);
21602 /**
21603 * triggered when a node is refreshed
21604 * @event
21605 * @name refresh_node.jstree
21606 * @param {Object} node - the refreshed node
21607 * @param {Array} nodes - an array of the IDs of the nodes that were reloaded
21608 */
21609 this.trigger('refresh_node', { 'node' : obj, 'nodes' : nodes });
21610 }, this));
21611 },
21612 /**
21613 * set (change) the ID of a node
21614 * @name set_id(obj, id)
21615 * @param {mixed} obj the node
21616 * @param {String} id the new ID
21617 * @return {Boolean}
21618 */
21619 set_id : function (obj, id) {
21620 obj = this.get_node(obj);
21621 if(!obj || obj.id === '#') { return false; }
21622 var i, j, m = this._model.data;
21623 id = id.toString();
21624 // update parents (replace current ID with new one in children and children_d)
21625 m[obj.parent].children[$.inArray(obj.id, m[obj.parent].children)] = id;
21626 for(i = 0, j = obj.parents.length; i < j; i++) {
21627 m[obj.parents[i]].children_d[$.inArray(obj.id, m[obj.parents[i]].children_d)] = id;
21628 }
21629 // update children (replace current ID with new one in parent and parents)
21630 for(i = 0, j = obj.children.length; i < j; i++) {
21631 m[obj.children[i]].parent = id;
21632 }
21633 for(i = 0, j = obj.children_d.length; i < j; i++) {
21634 m[obj.children_d[i]].parents[$.inArray(obj.id, m[obj.children_d[i]].parents)] = id;
21635 }
21636 i = $.inArray(obj.id, this._data.core.selected);
21637 if(i !== -1) { this._data.core.selected[i] = id; }
21638 // update model and obj itself (obj.id, this._model.data[KEY])
21639 i = this.get_node(obj.id, true);
21640 if(i) {
21641 i.attr('id', id);
21642 }
21643 delete m[obj.id];
21644 obj.id = id;
21645 m[id] = obj;
21646 return true;
21647 },
21648 /**
21649 * get the text value of a node
21650 * @name get_text(obj)
21651 * @param {mixed} obj the node
21652 * @return {String}
21653 */
21654 get_text : function (obj) {
21655 obj = this.get_node(obj);
21656 return (!obj || obj.id === '#') ? false : obj.text;
21657 },
21658 /**
21659 * set the text value of a node. Used internally, please use `rename_node(obj, val)`.
21660 * @private
21661 * @name set_text(obj, val)
21662 * @param {mixed} obj the node, you can pass an array to set the text on multiple nodes
21663 * @param {String} val the new text value
21664 * @return {Boolean}
21665 * @trigger set_text.jstree
21666 */
21667 set_text : function (obj, val) {
21668 var t1, t2;
21669 if($.isArray(obj)) {
21670 obj = obj.slice();
21671 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
21672 this.set_text(obj[t1], val);
21673 }
21674 return true;
21675 }
21676 obj = this.get_node(obj);
21677 if(!obj || obj.id === '#') { return false; }
21678 obj.text = val;
21679 if(this.get_node(obj, true).length) {
21680 this.redraw_node(obj.id);
21681 }
21682 /**
21683 * triggered when a node text value is changed
21684 * @event
21685 * @name set_text.jstree
21686 * @param {Object} obj
21687 * @param {String} text the new value
21688 */
21689 this.trigger('set_text',{ "obj" : obj, "text" : val });
21690 return true;
21691 },
21692 /**
21693 * gets a JSON representation of a node (or the whole tree)
21694 * @name get_json([obj, options])
21695 * @param {mixed} obj
21696 * @param {Object} options
21697 * @param {Boolean} options.no_state do not return state information
21698 * @param {Boolean} options.no_id do not return ID
21699 * @param {Boolean} options.no_children do not include children
21700 * @param {Boolean} options.no_data do not include node data
21701 * @param {Boolean} options.flat return flat JSON instead of nested
21702 * @return {Object}
21703 */
21704 get_json : function (obj, options, flat) {
21705 obj = this.get_node(obj || '#');
21706 if(!obj) { return false; }
21707 if(options && options.flat && !flat) { flat = []; }
21708 var tmp = {
21709 'id' : obj.id,
21710 'text' : obj.text,
21711 'icon' : this.get_icon(obj),
21712 'li_attr' : $.extend(true, {}, obj.li_attr),
21713 'a_attr' : $.extend(true, {}, obj.a_attr),
21714 'state' : {},
21715 'data' : options && options.no_data ? false : $.extend(true, {}, obj.data)
21716 //( this.get_node(obj, true).length ? this.get_node(obj, true).data() : obj.data ),
21717 }, i, j;
21718 if(options && options.flat) {
21719 tmp.parent = obj.parent;
21720 }
21721 else {
21722 tmp.children = [];
21723 }
21724 if(!options || !options.no_state) {
21725 for(i in obj.state) {
21726 if(obj.state.hasOwnProperty(i)) {
21727 tmp.state[i] = obj.state[i];
21728 }
21729 }
21730 }
21731 if(options && options.no_id) {
21732 delete tmp.id;
21733 if(tmp.li_attr && tmp.li_attr.id) {
21734 delete tmp.li_attr.id;
21735 }
21736 if(tmp.a_attr && tmp.a_attr.id) {
21737 delete tmp.a_attr.id;
21738 }
21739 }
21740 if(options && options.flat && obj.id !== '#') {
21741 flat.push(tmp);
21742 }
21743 if(!options || !options.no_children) {
21744 for(i = 0, j = obj.children.length; i < j; i++) {
21745 if(options && options.flat) {
21746 this.get_json(obj.children[i], options, flat);
21747 }
21748 else {
21749 tmp.children.push(this.get_json(obj.children[i], options));
21750 }
21751 }
21752 }
21753 return options && options.flat ? flat : (obj.id === '#' ? tmp.children : tmp);
21754 },
21755 /**
21756 * create a new node (do not confuse with load_node)
21757 * @name create_node([obj, node, pos, callback, is_loaded])
21758 * @param {mixed} par the parent node (to create a root node use either "#" (string) or `null`)
21759 * @param {mixed} node the data for the new node (a valid JSON object, or a simple string with the name)
21760 * @param {mixed} pos the index at which to insert the node, "first" and "last" are also supported, default is "last"
21761 * @param {Function} callback a function to be called once the node is created
21762 * @param {Boolean} is_loaded internal argument indicating if the parent node was succesfully loaded
21763 * @return {String} the ID of the newly create node
21764 * @trigger model.jstree, create_node.jstree
21765 */
21766 create_node : function (par, node, pos, callback, is_loaded) {
21767 if(par === null) { par = "#"; }
21768 par = this.get_node(par);
21769 if(!par) { return false; }
21770 pos = pos === undefined ? "last" : pos;
21771 if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
21772 return this.load_node(par, function () { this.create_node(par, node, pos, callback, true); });
21773 }
21774 if(!node) { node = { "text" : this.get_string('New node') }; }
21775 if(typeof node === "string") { node = { "text" : node }; }
21776 if(node.text === undefined) { node.text = this.get_string('New node'); }
21777 var tmp, dpc, i, j;
21778
21779 if(par.id === '#') {
21780 if(pos === "before") { pos = "first"; }
21781 if(pos === "after") { pos = "last"; }
21782 }
21783 switch(pos) {
21784 case "before":
21785 tmp = this.get_node(par.parent);
21786 pos = $.inArray(par.id, tmp.children);
21787 par = tmp;
21788 break;
21789 case "after" :
21790 tmp = this.get_node(par.parent);
21791 pos = $.inArray(par.id, tmp.children) + 1;
21792 par = tmp;
21793 break;
21794 case "inside":
21795 case "first":
21796 pos = 0;
21797 break;
21798 case "last":
21799 pos = par.children.length;
21800 break;
21801 default:
21802 if(!pos) { pos = 0; }
21803 break;
21804 }
21805 if(pos > par.children.length) { pos = par.children.length; }
21806 if(!node.id) { node.id = true; }
21807 if(!this.check("create_node", node, par, pos)) {
21808 this.settings.core.error.call(this, this._data.core.last_error);
21809 return false;
21810 }
21811 if(node.id === true) { delete node.id; }
21812 node = this._parse_model_from_json(node, par.id, par.parents.concat());
21813 if(!node) { return false; }
21814 tmp = this.get_node(node);
21815 dpc = [];
21816 dpc.push(node);
21817 dpc = dpc.concat(tmp.children_d);
21818 this.trigger('model', { "nodes" : dpc, "parent" : par.id });
21819
21820 par.children_d = par.children_d.concat(dpc);
21821 for(i = 0, j = par.parents.length; i < j; i++) {
21822 this._model.data[par.parents[i]].children_d = this._model.data[par.parents[i]].children_d.concat(dpc);
21823 }
21824 node = tmp;
21825 tmp = [];
21826 for(i = 0, j = par.children.length; i < j; i++) {
21827 tmp[i >= pos ? i+1 : i] = par.children[i];
21828 }
21829 tmp[pos] = node.id;
21830 par.children = tmp;
21831
21832 this.redraw_node(par, true);
21833 if(callback) { callback.call(this, this.get_node(node)); }
21834 /**
21835 * triggered when a node is created
21836 * @event
21837 * @name create_node.jstree
21838 * @param {Object} node
21839 * @param {String} parent the parent's ID
21840 * @param {Number} position the position of the new node among the parent's children
21841 */
21842 this.trigger('create_node', { "node" : this.get_node(node), "parent" : par.id, "position" : pos });
21843 return node.id;
21844 },
21845 /**
21846 * set the text value of a node
21847 * @name rename_node(obj, val)
21848 * @param {mixed} obj the node, you can pass an array to rename multiple nodes to the same name
21849 * @param {String} val the new text value
21850 * @return {Boolean}
21851 * @trigger rename_node.jstree
21852 */
21853 rename_node : function (obj, val) {
21854 var t1, t2, old;
21855 if($.isArray(obj)) {
21856 obj = obj.slice();
21857 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
21858 this.rename_node(obj[t1], val);
21859 }
21860 return true;
21861 }
21862 obj = this.get_node(obj);
21863 if(!obj || obj.id === '#') { return false; }
21864 old = obj.text;
21865 if(!this.check("rename_node", obj, this.get_parent(obj), val)) {
21866 this.settings.core.error.call(this, this._data.core.last_error);
21867 return false;
21868 }
21869 this.set_text(obj, val); // .apply(this, Array.prototype.slice.call(arguments))
21870 /**
21871 * triggered when a node is renamed
21872 * @event
21873 * @name rename_node.jstree
21874 * @param {Object} node
21875 * @param {String} text the new value
21876 * @param {String} old the old value
21877 */
21878 this.trigger('rename_node', { "node" : obj, "text" : val, "old" : old });
21879 return true;
21880 },
21881 /**
21882 * remove a node
21883 * @name delete_node(obj)
21884 * @param {mixed} obj the node, you can pass an array to delete multiple nodes
21885 * @return {Boolean}
21886 * @trigger delete_node.jstree, changed.jstree
21887 */
21888 delete_node : function (obj) {
21889 var t1, t2, par, pos, tmp, i, j, k, l, c;
21890 if($.isArray(obj)) {
21891 obj = obj.slice();
21892 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
21893 this.delete_node(obj[t1]);
21894 }
21895 return true;
21896 }
21897 obj = this.get_node(obj);
21898 if(!obj || obj.id === '#') { return false; }
21899 par = this.get_node(obj.parent);
21900 pos = $.inArray(obj.id, par.children);
21901 c = false;
21902 if(!this.check("delete_node", obj, par, pos)) {
21903 this.settings.core.error.call(this, this._data.core.last_error);
21904 return false;
21905 }
21906 if(pos !== -1) {
21907 par.children = $.vakata.array_remove(par.children, pos);
21908 }
21909 tmp = obj.children_d.concat([]);
21910 tmp.push(obj.id);
21911 for(k = 0, l = tmp.length; k < l; k++) {
21912 for(i = 0, j = obj.parents.length; i < j; i++) {
21913 pos = $.inArray(tmp[k], this._model.data[obj.parents[i]].children_d);
21914 if(pos !== -1) {
21915 this._model.data[obj.parents[i]].children_d = $.vakata.array_remove(this._model.data[obj.parents[i]].children_d, pos);
21916 }
21917 }
21918 if(this._model.data[tmp[k]].state.selected) {
21919 c = true;
21920 pos = $.inArray(tmp[k], this._data.core.selected);
21921 if(pos !== -1) {
21922 this._data.core.selected = $.vakata.array_remove(this._data.core.selected, pos);
21923 }
21924 }
21925 }
21926 /**
21927 * triggered when a node is deleted
21928 * @event
21929 * @name delete_node.jstree
21930 * @param {Object} node
21931 * @param {String} parent the parent's ID
21932 */
21933 this.trigger('delete_node', { "node" : obj, "parent" : par.id });
21934 if(c) {
21935 this.trigger('changed', { 'action' : 'delete_node', 'node' : obj, 'selected' : this._data.core.selected, 'parent' : par.id });
21936 }
21937 for(k = 0, l = tmp.length; k < l; k++) {
21938 delete this._model.data[tmp[k]];
21939 }
21940 this.redraw_node(par, true);
21941 return true;
21942 },
21943 /**
21944 * check if an operation is premitted on the tree. Used internally.
21945 * @private
21946 * @name check(chk, obj, par, pos)
21947 * @param {String} chk the operation to check, can be "create_node", "rename_node", "delete_node", "copy_node" or "move_node"
21948 * @param {mixed} obj the node
21949 * @param {mixed} par the parent
21950 * @param {mixed} pos the position to insert at, or if "rename_node" - the new name
21951 * @param {mixed} more some various additional information, for example if a "move_node" operations is triggered by DND this will be the hovered node
21952 * @return {Boolean}
21953 */
21954 check : function (chk, obj, par, pos, more) {
21955 obj = obj && obj.id ? obj : this.get_node(obj);
21956 par = par && par.id ? par : this.get_node(par);
21957 var tmp = chk.match(/^move_node|copy_node|create_node$/i) ? par : obj,
21958 chc = this.settings.core.check_callback;
21959 if(chk === "move_node" || chk === "copy_node") {
21960 if((!more || !more.is_multi) && (obj.id === par.id || $.inArray(obj.id, par.children) === pos || $.inArray(par.id, obj.children_d) !== -1)) {
21961 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_01', 'reason' : 'Moving parent inside child', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
21962 return false;
21963 }
21964 }
21965 if(tmp && tmp.data) { tmp = tmp.data; }
21966 if(tmp && tmp.functions && (tmp.functions[chk] === false || tmp.functions[chk] === true)) {
21967 if(tmp.functions[chk] === false) {
21968 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_02', 'reason' : 'Node data prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
21969 }
21970 return tmp.functions[chk];
21971 }
21972 if(chc === false || ($.isFunction(chc) && chc.call(this, chk, obj, par, pos, more) === false) || (chc && chc[chk] === false)) {
21973 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_03', 'reason' : 'User config for core.check_callback prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
21974 return false;
21975 }
21976 return true;
21977 },
21978 /**
21979 * get the last error
21980 * @name last_error()
21981 * @return {Object}
21982 */
21983 last_error : function () {
21984 return this._data.core.last_error;
21985 },
21986 /**
21987 * move a node to a new parent
21988 * @name move_node(obj, par [, pos, callback, is_loaded])
21989 * @param {mixed} obj the node to move, pass an array to move multiple nodes
21990 * @param {mixed} par the new parent
21991 * @param {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0`
21992 * @param {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position
21993 * @param {Boolean} internal parameter indicating if the parent node has been loaded
21994 * @param {Boolean} internal parameter indicating if the tree should be redrawn
21995 * @trigger move_node.jstree
21996 */
21997 move_node : function (obj, par, pos, callback, is_loaded, skip_redraw) {
21998 var t1, t2, old_par, old_pos, new_par, old_ins, is_multi, dpc, tmp, i, j, k, l, p;
21999
22000 par = this.get_node(par);
22001 pos = pos === undefined ? 0 : pos;
22002 if(!par) { return false; }
22003 if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
22004 return this.load_node(par, function () { this.move_node(obj, par, pos, callback, true); });
22005 }
22006
22007 if($.isArray(obj)) {
22008 obj = obj.slice();
22009 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
22010 if(this.move_node(obj[t1], par, pos, callback, is_loaded, true)) {
22011 par = obj[t1];
22012 pos = "after";
22013 }
22014 }
22015 this.redraw();
22016 return true;
22017 }
22018 obj = obj && obj.id ? obj : this.get_node(obj);
22019
22020 if(!obj || obj.id === '#') { return false; }
22021
22022 old_par = (obj.parent || '#').toString();
22023 new_par = (!pos.toString().match(/^(before|after)$/) || par.id === '#') ? par : this.get_node(par.parent);
22024 old_ins = obj.instance ? obj.instance : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id));
22025 is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id);
22026 old_pos = old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1;
22027 if(is_multi) {
22028 if(this.copy_node(obj, par, pos, callback, is_loaded)) {
22029 if(old_ins) { old_ins.delete_node(obj); }
22030 return true;
22031 }
22032 return false;
22033 }
22034 //var m = this._model.data;
22035 if(par.id === '#') {
22036 if(pos === "before") { pos = "first"; }
22037 if(pos === "after") { pos = "last"; }
22038 }
22039 switch(pos) {
22040 case "before":
22041 pos = $.inArray(par.id, new_par.children);
22042 break;
22043 case "after" :
22044 pos = $.inArray(par.id, new_par.children) + 1;
22045 break;
22046 case "inside":
22047 case "first":
22048 pos = 0;
22049 break;
22050 case "last":
22051 pos = new_par.children.length;
22052 break;
22053 default:
22054 if(!pos) { pos = 0; }
22055 break;
22056 }
22057 if(pos > new_par.children.length) { pos = new_par.children.length; }
22058 if(!this.check("move_node", obj, new_par, pos, { 'core' : true, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) {
22059 this.settings.core.error.call(this, this._data.core.last_error);
22060 return false;
22061 }
22062 if(obj.parent === new_par.id) {
22063 dpc = new_par.children.concat();
22064 tmp = $.inArray(obj.id, dpc);
22065 if(tmp !== -1) {
22066 dpc = $.vakata.array_remove(dpc, tmp);
22067 if(pos > tmp) { pos--; }
22068 }
22069 tmp = [];
22070 for(i = 0, j = dpc.length; i < j; i++) {
22071 tmp[i >= pos ? i+1 : i] = dpc[i];
22072 }
22073 tmp[pos] = obj.id;
22074 new_par.children = tmp;
22075 this._node_changed(new_par.id);
22076 this.redraw(new_par.id === '#');
22077 }
22078 else {
22079 // clean old parent and up
22080 tmp = obj.children_d.concat();
22081 tmp.push(obj.id);
22082 for(i = 0, j = obj.parents.length; i < j; i++) {
22083 dpc = [];
22084 p = old_ins._model.data[obj.parents[i]].children_d;
22085 for(k = 0, l = p.length; k < l; k++) {
22086 if($.inArray(p[k], tmp) === -1) {
22087 dpc.push(p[k]);
22088 }
22089 }
22090 old_ins._model.data[obj.parents[i]].children_d = dpc;
22091 }
22092 old_ins._model.data[old_par].children = $.vakata.array_remove_item(old_ins._model.data[old_par].children, obj.id);
22093
22094 // insert into new parent and up
22095 for(i = 0, j = new_par.parents.length; i < j; i++) {
22096 this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(tmp);
22097 }
22098 dpc = [];
22099 for(i = 0, j = new_par.children.length; i < j; i++) {
22100 dpc[i >= pos ? i+1 : i] = new_par.children[i];
22101 }
22102 dpc[pos] = obj.id;
22103 new_par.children = dpc;
22104 new_par.children_d.push(obj.id);
22105 new_par.children_d = new_par.children_d.concat(obj.children_d);
22106
22107 // update object
22108 obj.parent = new_par.id;
22109 tmp = new_par.parents.concat();
22110 tmp.unshift(new_par.id);
22111 p = obj.parents.length;
22112 obj.parents = tmp;
22113
22114 // update object children
22115 tmp = tmp.concat();
22116 for(i = 0, j = obj.children_d.length; i < j; i++) {
22117 this._model.data[obj.children_d[i]].parents = this._model.data[obj.children_d[i]].parents.slice(0,p*-1);
22118 Array.prototype.push.apply(this._model.data[obj.children_d[i]].parents, tmp);
22119 }
22120
22121 if(old_par === '#' || new_par.id === '#') {
22122 this._model.force_full_redraw = true;
22123 }
22124 if(!this._model.force_full_redraw) {
22125 this._node_changed(old_par);
22126 this._node_changed(new_par.id);
22127 }
22128 if(!skip_redraw) {
22129 this.redraw();
22130 }
22131 }
22132 if(callback) { callback.call(this, obj, new_par, pos); }
22133 /**
22134 * triggered when a node is moved
22135 * @event
22136 * @name move_node.jstree
22137 * @param {Object} node
22138 * @param {String} parent the parent's ID
22139 * @param {Number} position the position of the node among the parent's children
22140 * @param {String} old_parent the old parent of the node
22141 * @param {Number} old_position the old position of the node
22142 * @param {Boolean} is_multi do the node and new parent belong to different instances
22143 * @param {jsTree} old_instance the instance the node came from
22144 * @param {jsTree} new_instance the instance of the new parent
22145 */
22146 this.trigger('move_node', { "node" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_pos, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this });
22147 return true;
22148 },
22149 /**
22150 * copy a node to a new parent
22151 * @name copy_node(obj, par [, pos, callback, is_loaded])
22152 * @param {mixed} obj the node to copy, pass an array to copy multiple nodes
22153 * @param {mixed} par the new parent
22154 * @param {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0`
22155 * @param {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position
22156 * @param {Boolean} internal parameter indicating if the parent node has been loaded
22157 * @param {Boolean} internal parameter indicating if the tree should be redrawn
22158 * @trigger model.jstree copy_node.jstree
22159 */
22160 copy_node : function (obj, par, pos, callback, is_loaded, skip_redraw) {
22161 var t1, t2, dpc, tmp, i, j, node, old_par, new_par, old_ins, is_multi;
22162
22163 par = this.get_node(par);
22164 pos = pos === undefined ? 0 : pos;
22165 if(!par) { return false; }
22166 if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
22167 return this.load_node(par, function () { this.copy_node(obj, par, pos, callback, true); });
22168 }
22169
22170 if($.isArray(obj)) {
22171 obj = obj.slice();
22172 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
22173 tmp = this.copy_node(obj[t1], par, pos, callback, is_loaded, true);
22174 if(tmp) {
22175 par = tmp;
22176 pos = "after";
22177 }
22178 }
22179 this.redraw();
22180 return true;
22181 }
22182 obj = obj && obj.id ? obj : this.get_node(obj);
22183 if(!obj || obj.id === '#') { return false; }
22184
22185 old_par = (obj.parent || '#').toString();
22186 new_par = (!pos.toString().match(/^(before|after)$/) || par.id === '#') ? par : this.get_node(par.parent);
22187 old_ins = obj.instance ? obj.instance : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id));
22188 is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id);
22189 if(par.id === '#') {
22190 if(pos === "before") { pos = "first"; }
22191 if(pos === "after") { pos = "last"; }
22192 }
22193 switch(pos) {
22194 case "before":
22195 pos = $.inArray(par.id, new_par.children);
22196 break;
22197 case "after" :
22198 pos = $.inArray(par.id, new_par.children) + 1;
22199 break;
22200 case "inside":
22201 case "first":
22202 pos = 0;
22203 break;
22204 case "last":
22205 pos = new_par.children.length;
22206 break;
22207 default:
22208 if(!pos) { pos = 0; }
22209 break;
22210 }
22211 if(pos > new_par.children.length) { pos = new_par.children.length; }
22212 if(!this.check("copy_node", obj, new_par, pos, { 'core' : true, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) {
22213 this.settings.core.error.call(this, this._data.core.last_error);
22214 return false;
22215 }
22216 node = old_ins ? old_ins.get_json(obj, { no_id : true, no_data : true, no_state : true }) : obj;
22217 if(!node) { return false; }
22218 if(node.id === true) { delete node.id; }
22219 node = this._parse_model_from_json(node, new_par.id, new_par.parents.concat());
22220 if(!node) { return false; }
22221 tmp = this.get_node(node);
22222 if(obj && obj.state && obj.state.loaded === false) { tmp.state.loaded = false; }
22223 dpc = [];
22224 dpc.push(node);
22225 dpc = dpc.concat(tmp.children_d);
22226 this.trigger('model', { "nodes" : dpc, "parent" : new_par.id });
22227
22228 // insert into new parent and up
22229 for(i = 0, j = new_par.parents.length; i < j; i++) {
22230 this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(dpc);
22231 }
22232 dpc = [];
22233 for(i = 0, j = new_par.children.length; i < j; i++) {
22234 dpc[i >= pos ? i+1 : i] = new_par.children[i];
22235 }
22236 dpc[pos] = tmp.id;
22237 new_par.children = dpc;
22238 new_par.children_d.push(tmp.id);
22239 new_par.children_d = new_par.children_d.concat(tmp.children_d);
22240
22241 if(new_par.id === '#') {
22242 this._model.force_full_redraw = true;
22243 }
22244 if(!this._model.force_full_redraw) {
22245 this._node_changed(new_par.id);
22246 }
22247 if(!skip_redraw) {
22248 this.redraw(new_par.id === '#');
22249 }
22250 if(callback) { callback.call(this, tmp, new_par, pos); }
22251 /**
22252 * triggered when a node is copied
22253 * @event
22254 * @name copy_node.jstree
22255 * @param {Object} node the copied node
22256 * @param {Object} original the original node
22257 * @param {String} parent the parent's ID
22258 * @param {Number} position the position of the node among the parent's children
22259 * @param {String} old_parent the old parent of the node
22260 * @param {Number} old_position the position of the original node
22261 * @param {Boolean} is_multi do the node and new parent belong to different instances
22262 * @param {jsTree} old_instance the instance the node came from
22263 * @param {jsTree} new_instance the instance of the new parent
22264 */
22265 this.trigger('copy_node', { "node" : tmp, "original" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1,'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this });
22266 return tmp.id;
22267 },
22268 /**
22269 * cut a node (a later call to `paste(obj)` would move the node)
22270 * @name cut(obj)
22271 * @param {mixed} obj multiple objects can be passed using an array
22272 * @trigger cut.jstree
22273 */
22274 cut : function (obj) {
22275 if(!obj) { obj = this._data.core.selected.concat(); }
22276 if(!$.isArray(obj)) { obj = [obj]; }
22277 if(!obj.length) { return false; }
22278 var tmp = [], o, t1, t2;
22279 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
22280 o = this.get_node(obj[t1]);
22281 if(o && o.id && o.id !== '#') { tmp.push(o); }
22282 }
22283 if(!tmp.length) { return false; }
22284 ccp_node = tmp;
22285 ccp_inst = this;
22286 ccp_mode = 'move_node';
22287 /**
22288 * triggered when nodes are added to the buffer for moving
22289 * @event
22290 * @name cut.jstree
22291 * @param {Array} node
22292 */
22293 this.trigger('cut', { "node" : obj });
22294 },
22295 /**
22296 * copy a node (a later call to `paste(obj)` would copy the node)
22297 * @name copy(obj)
22298 * @param {mixed} obj multiple objects can be passed using an array
22299 * @trigger copy.jstre
22300 */
22301 copy : function (obj) {
22302 if(!obj) { obj = this._data.core.selected.concat(); }
22303 if(!$.isArray(obj)) { obj = [obj]; }
22304 if(!obj.length) { return false; }
22305 var tmp = [], o, t1, t2;
22306 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
22307 o = this.get_node(obj[t1]);
22308 if(o && o.id && o.id !== '#') { tmp.push(o); }
22309 }
22310 if(!tmp.length) { return false; }
22311 ccp_node = tmp;
22312 ccp_inst = this;
22313 ccp_mode = 'copy_node';
22314 /**
22315 * triggered when nodes are added to the buffer for copying
22316 * @event
22317 * @name copy.jstree
22318 * @param {Array} node
22319 */
22320 this.trigger('copy', { "node" : obj });
22321 },
22322 /**
22323 * get the current buffer (any nodes that are waiting for a paste operation)
22324 * @name get_buffer()
22325 * @return {Object} an object consisting of `mode` ("copy_node" or "move_node"), `node` (an array of objects) and `inst` (the instance)
22326 */
22327 get_buffer : function () {
22328 return { 'mode' : ccp_mode, 'node' : ccp_node, 'inst' : ccp_inst };
22329 },
22330 /**
22331 * check if there is something in the buffer to paste
22332 * @name can_paste()
22333 * @return {Boolean}
22334 */
22335 can_paste : function () {
22336 return ccp_mode !== false && ccp_node !== false; // && ccp_inst._model.data[ccp_node];
22337 },
22338 /**
22339 * copy or move the previously cut or copied nodes to a new parent
22340 * @name paste(obj [, pos])
22341 * @param {mixed} obj the new parent
22342 * @param {mixed} pos the position to insert at (besides integer, "first" and "last" are supported), defaults to integer `0`
22343 * @trigger paste.jstree
22344 */
22345 paste : function (obj, pos) {
22346 obj = this.get_node(obj);
22347 if(!obj || !ccp_mode || !ccp_mode.match(/^(copy_node|move_node)$/) || !ccp_node) { return false; }
22348 if(this[ccp_mode](ccp_node, obj, pos)) {
22349 /**
22350 * triggered when paste is invoked
22351 * @event
22352 * @name paste.jstree
22353 * @param {String} parent the ID of the receiving node
22354 * @param {Array} node the nodes in the buffer
22355 * @param {String} mode the performed operation - "copy_node" or "move_node"
22356 */
22357 this.trigger('paste', { "parent" : obj.id, "node" : ccp_node, "mode" : ccp_mode });
22358 }
22359 ccp_node = false;
22360 ccp_mode = false;
22361 ccp_inst = false;
22362 },
22363 /**
22364 * clear the buffer of previously copied or cut nodes
22365 * @name clear_buffer()
22366 * @trigger clear_buffer.jstree
22367 */
22368 clear_buffer : function () {
22369 ccp_node = false;
22370 ccp_mode = false;
22371 ccp_inst = false;
22372 /**
22373 * triggered when the copy / cut buffer is cleared
22374 * @event
22375 * @name clear_buffer.jstree
22376 */
22377 this.trigger('clear_buffer');
22378 },
22379 /**
22380 * put a node in edit mode (input field to rename the node)
22381 * @name edit(obj [, default_text])
22382 * @param {mixed} obj
22383 * @param {String} default_text the text to populate the input with (if omitted the node text value is used)
22384 */
22385 edit : function (obj, default_text) {
22386 obj = this.get_node(obj);
22387 if(!obj) { return false; }
22388 if(this.settings.core.check_callback === false) {
22389 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_07', 'reason' : 'Could not edit node because of check_callback' };
22390 this.settings.core.error.call(this, this._data.core.last_error);
22391 return false;
22392 }
22393 default_text = typeof default_text === 'string' ? default_text : obj.text;
22394 this.set_text(obj, "");
22395 obj = this._open_to(obj);
22396
22397 var rtl = this._data.core.rtl,
22398 w = this.element.width(),
22399 a = obj.children('.jstree-anchor'),
22400 s = $('<span>'),
22401 /*!
22402 oi = obj.children("i:visible"),
22403 ai = a.children("i:visible"),
22404 w1 = oi.width() * oi.length,
22405 w2 = ai.width() * ai.length,
22406 */
22407 t = default_text,
22408 h1 = $("<"+"div />", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"),
22409 h2 = $("<"+"input />", {
22410 "value" : t,
22411 "class" : "jstree-rename-input",
22412 // "size" : t.length,
22413 "css" : {
22414 "padding" : "0",
22415 "border" : "1px solid silver",
22416 "box-sizing" : "border-box",
22417 "display" : "inline-block",
22418 "height" : (this._data.core.li_height) + "px",
22419 "lineHeight" : (this._data.core.li_height) + "px",
22420 "width" : "150px" // will be set a bit further down
22421 },
22422 "blur" : $.proxy(function () {
22423 var i = s.children(".jstree-rename-input"),
22424 v = i.val();
22425 if(v === "") { v = t; }
22426 h1.remove();
22427 s.replaceWith(a);
22428 s.remove();
22429 this.set_text(obj, t);
22430 if(this.rename_node(obj, $('<div></div>').text(v)[this.settings.core.force_text ? 'text' : 'html']()) === false) {
22431 this.set_text(obj, t); // move this up? and fix #483
22432 }
22433 }, this),
22434 "keydown" : function (event) {
22435 var key = event.which;
22436 if(key === 27) {
22437 this.value = t;
22438 }
22439 if(key === 27 || key === 13 || key === 37 || key === 38 || key === 39 || key === 40 || key === 32) {
22440 event.stopImmediatePropagation();
22441 }
22442 if(key === 27 || key === 13) {
22443 event.preventDefault();
22444 this.blur();
22445 }
22446 },
22447 "click" : function (e) { e.stopImmediatePropagation(); },
22448 "mousedown" : function (e) { e.stopImmediatePropagation(); },
22449 "keyup" : function (event) {
22450 h2.width(Math.min(h1.text("pW" + this.value).width(),w));
22451 },
22452 "keypress" : function(event) {
22453 if(event.which === 13) { return false; }
22454 }
22455 }),
22456 fn = {
22457 fontFamily : a.css('fontFamily') || '',
22458 fontSize : a.css('fontSize') || '',
22459 fontWeight : a.css('fontWeight') || '',
22460 fontStyle : a.css('fontStyle') || '',
22461 fontStretch : a.css('fontStretch') || '',
22462 fontVariant : a.css('fontVariant') || '',
22463 letterSpacing : a.css('letterSpacing') || '',
22464 wordSpacing : a.css('wordSpacing') || ''
22465 };
22466 s.attr('class', a.attr('class')).append(a.contents().clone()).append(h2);
22467 a.replaceWith(s);
22468 h1.css(fn);
22469 h2.css(fn).width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();
22470 },
22471
22472
22473 /**
22474 * changes the theme
22475 * @name set_theme(theme_name [, theme_url])
22476 * @param {String} theme_name the name of the new theme to apply
22477 * @param {mixed} theme_url the location of the CSS file for this theme. Omit or set to `false` if you manually included the file. Set to `true` to autoload from the `core.themes.dir` directory.
22478 * @trigger set_theme.jstree
22479 */
22480 set_theme : function (theme_name, theme_url) {
22481 if(!theme_name) { return false; }
22482 if(theme_url === true) {
22483 var dir = this.settings.core.themes.dir;
22484 if(!dir) { dir = $.jstree.path + '/themes'; }
22485 theme_url = dir + '/' + theme_name + '/style.css';
22486 }
22487 if(theme_url && $.inArray(theme_url, themes_loaded) === -1) {
22488 $('head').append('<'+'link rel="stylesheet" href="' + theme_url + '" type="text/css" />');
22489 themes_loaded.push(theme_url);
22490 }
22491 if(this._data.core.themes.name) {
22492 this.element.removeClass('jstree-' + this._data.core.themes.name);
22493 }
22494 this._data.core.themes.name = theme_name;
22495 this.element.addClass('jstree-' + theme_name);
22496 this.element[this.settings.core.themes.responsive ? 'addClass' : 'removeClass' ]('jstree-' + theme_name + '-responsive');
22497 /**
22498 * triggered when a theme is set
22499 * @event
22500 * @name set_theme.jstree
22501 * @param {String} theme the new theme
22502 */
22503 this.trigger('set_theme', { 'theme' : theme_name });
22504 },
22505 /**
22506 * gets the name of the currently applied theme name
22507 * @name get_theme()
22508 * @return {String}
22509 */
22510 get_theme : function () { return this._data.core.themes.name; },
22511 /**
22512 * changes the theme variant (if the theme has variants)
22513 * @name set_theme_variant(variant_name)
22514 * @param {String|Boolean} variant_name the variant to apply (if `false` is used the current variant is removed)
22515 */
22516 set_theme_variant : function (variant_name) {
22517 if(this._data.core.themes.variant) {
22518 this.element.removeClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);
22519 }
22520 this._data.core.themes.variant = variant_name;
22521 if(variant_name) {
22522 this.element.addClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);
22523 }
22524 },
22525 /**
22526 * gets the name of the currently applied theme variant
22527 * @name get_theme()
22528 * @return {String}
22529 */
22530 get_theme_variant : function () { return this._data.core.themes.variant; },
22531 /**
22532 * shows a striped background on the container (if the theme supports it)
22533 * @name show_stripes()
22534 */
22535 show_stripes : function () { this._data.core.themes.stripes = true; this.get_container_ul().addClass("jstree-striped"); },
22536 /**
22537 * hides the striped background on the container
22538 * @name hide_stripes()
22539 */
22540 hide_stripes : function () { this._data.core.themes.stripes = false; this.get_container_ul().removeClass("jstree-striped"); },
22541 /**
22542 * toggles the striped background on the container
22543 * @name toggle_stripes()
22544 */
22545 toggle_stripes : function () { if(this._data.core.themes.stripes) { this.hide_stripes(); } else { this.show_stripes(); } },
22546 /**
22547 * shows the connecting dots (if the theme supports it)
22548 * @name show_dots()
22549 */
22550 show_dots : function () { this._data.core.themes.dots = true; this.get_container_ul().removeClass("jstree-no-dots"); },
22551 /**
22552 * hides the connecting dots
22553 * @name hide_dots()
22554 */
22555 hide_dots : function () { this._data.core.themes.dots = false; this.get_container_ul().addClass("jstree-no-dots"); },
22556 /**
22557 * toggles the connecting dots
22558 * @name toggle_dots()
22559 */
22560 toggle_dots : function () { if(this._data.core.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },
22561 /**
22562 * show the node icons
22563 * @name show_icons()
22564 */
22565 show_icons : function () { this._data.core.themes.icons = true; this.get_container_ul().removeClass("jstree-no-icons"); },
22566 /**
22567 * hide the node icons
22568 * @name hide_icons()
22569 */
22570 hide_icons : function () { this._data.core.themes.icons = false; this.get_container_ul().addClass("jstree-no-icons"); },
22571 /**
22572 * toggle the node icons
22573 * @name toggle_icons()
22574 */
22575 toggle_icons : function () { if(this._data.core.themes.icons) { this.hide_icons(); } else { this.show_icons(); } },
22576 /**
22577 * set the node icon for a node
22578 * @name set_icon(obj, icon)
22579 * @param {mixed} obj
22580 * @param {String} icon the new icon - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class
22581 */
22582 set_icon : function (obj, icon) {
22583 var t1, t2, dom, old;
22584 if($.isArray(obj)) {
22585 obj = obj.slice();
22586 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
22587 this.set_icon(obj[t1], icon);
22588 }
22589 return true;
22590 }
22591 obj = this.get_node(obj);
22592 if(!obj || obj.id === '#') { return false; }
22593 old = obj.icon;
22594 obj.icon = icon;
22595 dom = this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon");
22596 if(icon === false) {
22597 this.hide_icon(obj);
22598 }
22599 else if(icon === true) {
22600 dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel");
22601 if(old === false) { this.show_icon(obj); }
22602 }
22603 else if(icon.indexOf("/") === -1 && icon.indexOf(".") === -1) {
22604 dom.removeClass(old).css("background","");
22605 dom.addClass(icon + ' jstree-themeicon-custom').attr("rel",icon);
22606 if(old === false) { this.show_icon(obj); }
22607 }
22608 else {
22609 dom.removeClass(old).css("background","");
22610 dom.addClass('jstree-themeicon-custom').css("background", "url('" + icon + "') center center no-repeat").attr("rel",icon);
22611 if(old === false) { this.show_icon(obj); }
22612 }
22613 return true;
22614 },
22615 /**
22616 * get the node icon for a node
22617 * @name get_icon(obj)
22618 * @param {mixed} obj
22619 * @return {String}
22620 */
22621 get_icon : function (obj) {
22622 obj = this.get_node(obj);
22623 return (!obj || obj.id === '#') ? false : obj.icon;
22624 },
22625 /**
22626 * hide the icon on an individual node
22627 * @name hide_icon(obj)
22628 * @param {mixed} obj
22629 */
22630 hide_icon : function (obj) {
22631 var t1, t2;
22632 if($.isArray(obj)) {
22633 obj = obj.slice();
22634 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
22635 this.hide_icon(obj[t1]);
22636 }
22637 return true;
22638 }
22639 obj = this.get_node(obj);
22640 if(!obj || obj === '#') { return false; }
22641 obj.icon = false;
22642 this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon").addClass('jstree-themeicon-hidden');
22643 return true;
22644 },
22645 /**
22646 * show the icon on an individual node
22647 * @name show_icon(obj)
22648 * @param {mixed} obj
22649 */
22650 show_icon : function (obj) {
22651 var t1, t2, dom;
22652 if($.isArray(obj)) {
22653 obj = obj.slice();
22654 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
22655 this.show_icon(obj[t1]);
22656 }
22657 return true;
22658 }
22659 obj = this.get_node(obj);
22660 if(!obj || obj === '#') { return false; }
22661 dom = this.get_node(obj, true);
22662 obj.icon = dom.length ? dom.children(".jstree-anchor").children(".jstree-themeicon").attr('rel') : true;
22663 if(!obj.icon) { obj.icon = true; }
22664 dom.children(".jstree-anchor").children(".jstree-themeicon").removeClass('jstree-themeicon-hidden');
22665 return true;
22666 }
22667 };
22668
22669 // helpers
22670 $.vakata = {};
22671 // collect attributes
22672 $.vakata.attributes = function(node, with_values) {
22673 node = $(node)[0];
22674 var attr = with_values ? {} : [];
22675 if(node && node.attributes) {
22676 $.each(node.attributes, function (i, v) {
22677 if($.inArray(v.name.toLowerCase(),['style','contenteditable','hasfocus','tabindex']) !== -1) { return; }
22678 if(v.value !== null && $.trim(v.value) !== '') {
22679 if(with_values) { attr[v.name] = v.value; }
22680 else { attr.push(v.name); }
22681 }
22682 });
22683 }
22684 return attr;
22685 };
22686 $.vakata.array_unique = function(array) {
22687 var a = [], i, j, l;
22688 for(i = 0, l = array.length; i < l; i++) {
22689 for(j = 0; j <= i; j++) {
22690 if(array[i] === array[j]) {
22691 break;
22692 }
22693 }
22694 if(j === i) { a.push(array[i]); }
22695 }
22696 return a;
22697 };
22698 // remove item from array
22699 $.vakata.array_remove = function(array, from, to) {
22700 var rest = array.slice((to || from) + 1 || array.length);
22701 array.length = from < 0 ? array.length + from : from;
22702 array.push.apply(array, rest);
22703 return array;
22704 };
22705 // remove item from array
22706 $.vakata.array_remove_item = function(array, item) {
22707 var tmp = $.inArray(item, array);
22708 return tmp !== -1 ? $.vakata.array_remove(array, tmp) : array;
22709 };
22710
22711
22712 /**
22713 * ### Checkbox plugin
22714 *
22715 * This plugin renders checkbox icons in front of each node, making multiple selection much easier.
22716 * It also supports tri-state behavior, meaning that if a node has a few of its children checked it will be rendered as undetermined, and state will be propagated up.
22717 */
22718
22719 var _i = document.createElement('I');
22720 _i.className = 'jstree-icon jstree-checkbox';
22721 _i.setAttribute('role', 'presentation');
22722 /**
22723 * stores all defaults for the checkbox plugin
22724 * @name $.jstree.defaults.checkbox
22725 * @plugin checkbox
22726 */
22727 $.jstree.defaults.checkbox = {
22728 /**
22729 * a boolean indicating if checkboxes should be visible (can be changed at a later time using `show_checkboxes()` and `hide_checkboxes`). Defaults to `true`.
22730 * @name $.jstree.defaults.checkbox.visible
22731 * @plugin checkbox
22732 */
22733 visible : true,
22734 /**
22735 * a boolean indicating if checkboxes should cascade down and have an undetermined state. Defaults to `true`.
22736 * @name $.jstree.defaults.checkbox.three_state
22737 * @plugin checkbox
22738 */
22739 three_state : true,
22740 /**
22741 * a boolean indicating if clicking anywhere on the node should act as clicking on the checkbox. Defaults to `true`.
22742 * @name $.jstree.defaults.checkbox.whole_node
22743 * @plugin checkbox
22744 */
22745 whole_node : true,
22746 /**
22747 * a boolean indicating if the selected style of a node should be kept, or removed. Defaults to `true`.
22748 * @name $.jstree.defaults.checkbox.keep_selected_style
22749 * @plugin checkbox
22750 */
22751 keep_selected_style : true,
22752 /**
22753 * This setting controls how cascading and undetermined nodes are applied.
22754 * If 'up' is in the string - cascading up is enabled, if 'down' is in the string - cascading down is enabled, if 'undetermined' is in the string - undetermined nodes will be used.
22755 * If `three_state` is set to `true` this setting is automatically set to 'up+down+undetermined'. Defaults to ''.
22756 * @name $.jstree.defaults.checkbox.cascade
22757 * @plugin checkbox
22758 */
22759 cascade : '',
22760 /**
22761 * This setting controls if checkbox are bound to the general tree selection or to an internal array maintained by the checkbox plugin. Defaults to `true`, only set to `false` if you know exactly what you are doing.
22762 * @name $.jstree.defaults.checkbox.tie_selection
22763 * @plugin checkbox
22764 */
22765 tie_selection : true
22766 };
22767 $.jstree.plugins.checkbox = function (options, parent) {
22768 this.bind = function () {
22769 parent.bind.call(this);
22770 this._data.checkbox.uto = false;
22771 this._data.checkbox.selected = [];
22772 if(this.settings.checkbox.three_state) {
22773 this.settings.checkbox.cascade = 'up+down+undetermined';
22774 }
22775 this.element
22776 .on("init.jstree", $.proxy(function () {
22777 this._data.checkbox.visible = this.settings.checkbox.visible;
22778 if(!this.settings.checkbox.keep_selected_style) {
22779 this.element.addClass('jstree-checkbox-no-clicked');
22780 }
22781 if(this.settings.checkbox.tie_selection) {
22782 this.element.addClass('jstree-checkbox-selection');
22783 }
22784 }, this))
22785 .on("loading.jstree", $.proxy(function () {
22786 this[ this._data.checkbox.visible ? 'show_checkboxes' : 'hide_checkboxes' ]();
22787 }, this));
22788 if(this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {
22789 this.element
22790 .on('changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree', $.proxy(function () {
22791 // only if undetermined is in setting
22792 if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); }
22793 this._data.checkbox.uto = setTimeout($.proxy(this._undetermined, this), 50);
22794 }, this));
22795 }
22796 if(!this.settings.checkbox.tie_selection) {
22797 this.element
22798 .on('model.jstree', $.proxy(function (e, data) {
22799 var m = this._model.data,
22800 p = m[data.parent],
22801 dpc = data.nodes,
22802 i, j;
22803 for(i = 0, j = dpc.length; i < j; i++) {
22804 m[dpc[i]].state.checked = (m[dpc[i]].original && m[dpc[i]].original.state && m[dpc[i]].original.state.checked);
22805 if(m[dpc[i]].state.checked) {
22806 this._data.checkbox.selected.push(dpc[i]);
22807 }
22808 }
22809 }, this));
22810 }
22811 if(this.settings.checkbox.cascade.indexOf('up') !== -1 || this.settings.checkbox.cascade.indexOf('down') !== -1) {
22812 this.element
22813 .on('model.jstree', $.proxy(function (e, data) {
22814 var m = this._model.data,
22815 p = m[data.parent],
22816 dpc = data.nodes,
22817 chd = [],
22818 c, i, j, k, l, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;
22819
22820 if(s.indexOf('down') !== -1) {
22821 // apply down
22822 if(p.state[ t ? 'selected' : 'checked' ]) {
22823 for(i = 0, j = dpc.length; i < j; i++) {
22824 m[dpc[i]].state[ t ? 'selected' : 'checked' ] = true;
22825 }
22826 this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(dpc);
22827 }
22828 else {
22829 for(i = 0, j = dpc.length; i < j; i++) {
22830 if(m[dpc[i]].state[ t ? 'selected' : 'checked' ]) {
22831 for(k = 0, l = m[dpc[i]].children_d.length; k < l; k++) {
22832 m[m[dpc[i]].children_d[k]].state[ t ? 'selected' : 'checked' ] = true;
22833 }
22834 this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(m[dpc[i]].children_d);
22835 }
22836 }
22837 }
22838 }
22839
22840 if(s.indexOf('up') !== -1) {
22841 // apply up
22842 for(i = 0, j = p.children_d.length; i < j; i++) {
22843 if(!m[p.children_d[i]].children.length) {
22844 chd.push(m[p.children_d[i]].parent);
22845 }
22846 }
22847 chd = $.vakata.array_unique(chd);
22848 for(k = 0, l = chd.length; k < l; k++) {
22849 p = m[chd[k]];
22850 while(p && p.id !== '#') {
22851 c = 0;
22852 for(i = 0, j = p.children.length; i < j; i++) {
22853 c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
22854 }
22855 if(c === j) {
22856 p.state[ t ? 'selected' : 'checked' ] = true;
22857 this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
22858 tmp = this.get_node(p, true);
22859 if(tmp && tmp.length) {
22860 tmp.attr('aria-selected', true).children('.jstree-anchor').addClass( t ? 'jstree-clicked' : 'jstree-checked');
22861 }
22862 }
22863 else {
22864 break;
22865 }
22866 p = this.get_node(p.parent);
22867 }
22868 }
22869 }
22870
22871 this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected);
22872 }, this))
22873 .on(this.settings.checkbox.tie_selection ? 'select_node.jstree' : 'check_node.jstree', $.proxy(function (e, data) {
22874 var obj = data.node,
22875 m = this._model.data,
22876 par = this.get_node(obj.parent),
22877 dom = this.get_node(obj, true),
22878 i, j, c, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;
22879
22880 // apply down
22881 if(s.indexOf('down') !== -1) {
22882 this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected.concat(obj.children_d));
22883 for(i = 0, j = obj.children_d.length; i < j; i++) {
22884 tmp = m[obj.children_d[i]];
22885 tmp.state[ t ? 'selected' : 'checked' ] = true;
22886 if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
22887 tmp.original.state.undetermined = false;
22888 }
22889 }
22890 }
22891
22892 // apply up
22893 if(s.indexOf('up') !== -1) {
22894 while(par && par.id !== '#') {
22895 c = 0;
22896 for(i = 0, j = par.children.length; i < j; i++) {
22897 c += m[par.children[i]].state[ t ? 'selected' : 'checked' ];
22898 }
22899 if(c === j) {
22900 par.state[ t ? 'selected' : 'checked' ] = true;
22901 this._data[ t ? 'core' : 'checkbox' ].selected.push(par.id);
22902 tmp = this.get_node(par, true);
22903 if(tmp && tmp.length) {
22904 tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
22905 }
22906 }
22907 else {
22908 break;
22909 }
22910 par = this.get_node(par.parent);
22911 }
22912 }
22913
22914 // apply down (process .children separately?)
22915 if(s.indexOf('down') !== -1 && dom.length) {
22916 dom.find('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked').parent().attr('aria-selected', true);
22917 }
22918 }, this))
22919 .on(this.settings.checkbox.tie_selection ? 'deselect_all.jstree' : 'uncheck_all.jstree', $.proxy(function (e, data) {
22920 var obj = this.get_node('#'),
22921 m = this._model.data,
22922 i, j, tmp;
22923 for(i = 0, j = obj.children_d.length; i < j; i++) {
22924 tmp = m[obj.children_d[i]];
22925 if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
22926 tmp.original.state.undetermined = false;
22927 }
22928 }
22929 }, this))
22930 .on(this.settings.checkbox.tie_selection ? 'deselect_node.jstree' : 'uncheck_node.jstree', $.proxy(function (e, data) {
22931 var obj = data.node,
22932 dom = this.get_node(obj, true),
22933 i, j, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;
22934 if(obj && obj.original && obj.original.state && obj.original.state.undetermined) {
22935 obj.original.state.undetermined = false;
22936 }
22937
22938 // apply down
22939 if(s.indexOf('down') !== -1) {
22940 for(i = 0, j = obj.children_d.length; i < j; i++) {
22941 tmp = this._model.data[obj.children_d[i]];
22942 tmp.state[ t ? 'selected' : 'checked' ] = false;
22943 if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
22944 tmp.original.state.undetermined = false;
22945 }
22946 }
22947 }
22948
22949 // apply up
22950 if(s.indexOf('up') !== -1) {
22951 for(i = 0, j = obj.parents.length; i < j; i++) {
22952 tmp = this._model.data[obj.parents[i]];
22953 tmp.state[ t ? 'selected' : 'checked' ] = false;
22954 if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
22955 tmp.original.state.undetermined = false;
22956 }
22957 tmp = this.get_node(obj.parents[i], true);
22958 if(tmp && tmp.length) {
22959 tmp.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');
22960 }
22961 }
22962 }
22963 tmp = [];
22964 for(i = 0, j = this._data[ t ? 'core' : 'checkbox' ].selected.length; i < j; i++) {
22965 // apply down + apply up
22966 if(
22967 (s.indexOf('down') === -1 || $.inArray(this._data[ t ? 'core' : 'checkbox' ].selected[i], obj.children_d) === -1) &&
22968 (s.indexOf('up') === -1 || $.inArray(this._data[ t ? 'core' : 'checkbox' ].selected[i], obj.parents) === -1)
22969 ) {
22970 tmp.push(this._data[ t ? 'core' : 'checkbox' ].selected[i]);
22971 }
22972 }
22973 this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(tmp);
22974
22975 // apply down (process .children separately?)
22976 if(s.indexOf('down') !== -1 && dom.length) {
22977 dom.find('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked').parent().attr('aria-selected', false);
22978 }
22979 }, this));
22980 }
22981 if(this.settings.checkbox.cascade.indexOf('up') !== -1) {
22982 this.element
22983 .on('delete_node.jstree', $.proxy(function (e, data) {
22984 // apply up (whole handler)
22985 var p = this.get_node(data.parent),
22986 m = this._model.data,
22987 i, j, c, tmp, t = this.settings.checkbox.tie_selection;
22988 while(p && p.id !== '#') {
22989 c = 0;
22990 for(i = 0, j = p.children.length; i < j; i++) {
22991 c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
22992 }
22993 if(c === j) {
22994 p.state[ t ? 'selected' : 'checked' ] = true;
22995 this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
22996 tmp = this.get_node(p, true);
22997 if(tmp && tmp.length) {
22998 tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
22999 }
23000 }
23001 else {
23002 break;
23003 }
23004 p = this.get_node(p.parent);
23005 }
23006 }, this))
23007 .on('move_node.jstree', $.proxy(function (e, data) {
23008 // apply up (whole handler)
23009 var is_multi = data.is_multi,
23010 old_par = data.old_parent,
23011 new_par = this.get_node(data.parent),
23012 m = this._model.data,
23013 p, c, i, j, tmp, t = this.settings.checkbox.tie_selection;
23014 if(!is_multi) {
23015 p = this.get_node(old_par);
23016 while(p && p.id !== '#') {
23017 c = 0;
23018 for(i = 0, j = p.children.length; i < j; i++) {
23019 c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
23020 }
23021 if(c === j) {
23022 p.state[ t ? 'selected' : 'checked' ] = true;
23023 this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
23024 tmp = this.get_node(p, true);
23025 if(tmp && tmp.length) {
23026 tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
23027 }
23028 }
23029 else {
23030 break;
23031 }
23032 p = this.get_node(p.parent);
23033 }
23034 }
23035 p = new_par;
23036 while(p && p.id !== '#') {
23037 c = 0;
23038 for(i = 0, j = p.children.length; i < j; i++) {
23039 c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
23040 }
23041 if(c === j) {
23042 if(!p.state[ t ? 'selected' : 'checked' ]) {
23043 p.state[ t ? 'selected' : 'checked' ] = true;
23044 this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
23045 tmp = this.get_node(p, true);
23046 if(tmp && tmp.length) {
23047 tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
23048 }
23049 }
23050 }
23051 else {
23052 if(p.state[ t ? 'selected' : 'checked' ]) {
23053 p.state[ t ? 'selected' : 'checked' ] = false;
23054 this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_remove_item(this._data[ t ? 'core' : 'checkbox' ].selected, p.id);
23055 tmp = this.get_node(p, true);
23056 if(tmp && tmp.length) {
23057 tmp.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');
23058 }
23059 }
23060 else {
23061 break;
23062 }
23063 }
23064 p = this.get_node(p.parent);
23065 }
23066 }, this));
23067 }
23068 };
23069 /**
23070 * set the undetermined state where and if necessary. Used internally.
23071 * @private
23072 * @name _undetermined()
23073 * @plugin checkbox
23074 */
23075 this._undetermined = function () {
23076 var i, j, m = this._model.data, t = this.settings.checkbox.tie_selection, s = this._data[ t ? 'core' : 'checkbox' ].selected, p = [], tt = this;
23077 for(i = 0, j = s.length; i < j; i++) {
23078 if(m[s[i]] && m[s[i]].parents) {
23079 p = p.concat(m[s[i]].parents);
23080 }
23081 }
23082 // attempt for server side undetermined state
23083 this.element.find('.jstree-closed').not(':has(.jstree-children)')
23084 .each(function () {
23085 var tmp = tt.get_node(this), tmp2;
23086 if(!tmp.state.loaded) {
23087 if(tmp.original && tmp.original.state && tmp.original.state.undetermined && tmp.original.state.undetermined === true) {
23088 p.push(tmp.id);
23089 p = p.concat(tmp.parents);
23090 }
23091 }
23092 else {
23093 for(i = 0, j = tmp.children_d.length; i < j; i++) {
23094 tmp2 = m[tmp.children_d[i]];
23095 if(!tmp2.state.loaded && tmp2.original && tmp2.original.state && tmp2.original.state.undetermined && tmp2.original.state.undetermined === true) {
23096 p.push(tmp2.id);
23097 p = p.concat(tmp2.parents);
23098 }
23099 }
23100 }
23101 });
23102 p = $.vakata.array_unique(p);
23103 p = $.vakata.array_remove_item(p,'#');
23104
23105 this.element.find('.jstree-undetermined').removeClass('jstree-undetermined');
23106 for(i = 0, j = p.length; i < j; i++) {
23107 if(!m[p[i]].state[ t ? 'selected' : 'checked' ]) {
23108 s = this.get_node(p[i], true);
23109 if(s && s.length) {
23110 s.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-undetermined');
23111 }
23112 }
23113 }
23114 };
23115 this.redraw_node = function(obj, deep, is_callback, force_render) {
23116 obj = parent.redraw_node.apply(this, arguments);
23117 if(obj) {
23118 var i, j, tmp = null;
23119 for(i = 0, j = obj.childNodes.length; i < j; i++) {
23120 if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
23121 tmp = obj.childNodes[i];
23122 break;
23123 }
23124 }
23125 if(tmp) {
23126 if(!this.settings.checkbox.tie_selection && this._model.data[obj.id].state.checked) { tmp.className += ' jstree-checked'; }
23127 tmp.insertBefore(_i.cloneNode(false), tmp.childNodes[0]);
23128 }
23129 }
23130 if(!is_callback && this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {
23131 if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); }
23132 this._data.checkbox.uto = setTimeout($.proxy(this._undetermined, this), 50);
23133 }
23134 return obj;
23135 };
23136 /**
23137 * show the node checkbox icons
23138 * @name show_checkboxes()
23139 * @plugin checkbox
23140 */
23141 this.show_checkboxes = function () { this._data.core.themes.checkboxes = true; this.get_container_ul().removeClass("jstree-no-checkboxes"); };
23142 /**
23143 * hide the node checkbox icons
23144 * @name hide_checkboxes()
23145 * @plugin checkbox
23146 */
23147 this.hide_checkboxes = function () { this._data.core.themes.checkboxes = false; this.get_container_ul().addClass("jstree-no-checkboxes"); };
23148 /**
23149 * toggle the node icons
23150 * @name toggle_checkboxes()
23151 * @plugin checkbox
23152 */
23153 this.toggle_checkboxes = function () { if(this._data.core.themes.checkboxes) { this.hide_checkboxes(); } else { this.show_checkboxes(); } };
23154 /**
23155 * checks if a node is in an undetermined state
23156 * @name is_undetermined(obj)
23157 * @param {mixed} obj
23158 * @return {Boolean}
23159 */
23160 this.is_undetermined = function (obj) {
23161 obj = this.get_node(obj);
23162 var s = this.settings.checkbox.cascade, i, j, t = this.settings.checkbox.tie_selection, d = this._data[ t ? 'core' : 'checkbox' ].selected, m = this._model.data;
23163 if(!obj || obj.state[ t ? 'selected' : 'checked' ] === true || s.indexOf('undetermined') === -1 || (s.indexOf('down') === -1 && s.indexOf('up') === -1)) {
23164 return false;
23165 }
23166 if(!obj.state.loaded && obj.original.state.undetermined === true) {
23167 return true;
23168 }
23169 for(i = 0, j = obj.children_d.length; i < j; i++) {
23170 if($.inArray(obj.children_d[i], d) !== -1 || (!m[obj.children_d[i]].state.loaded && m[obj.children_d[i]].original.state.undetermined)) {
23171 return true;
23172 }
23173 }
23174 return false;
23175 };
23176
23177 this.activate_node = function (obj, e) {
23178 if(this.settings.checkbox.tie_selection && (this.settings.checkbox.whole_node || $(e.target).hasClass('jstree-checkbox'))) {
23179 e.ctrlKey = true;
23180 }
23181 if(this.settings.checkbox.tie_selection || (!this.settings.checkbox.whole_node && !$(e.target).hasClass('jstree-checkbox'))) {
23182 return parent.activate_node.call(this, obj, e);
23183 }
23184 if(this.is_disabled(obj)) {
23185 return false;
23186 }
23187 if(this.is_checked(obj)) {
23188 this.uncheck_node(obj, e);
23189 }
23190 else {
23191 this.check_node(obj, e);
23192 }
23193 this.trigger('activate_node', { 'node' : this.get_node(obj) });
23194 };
23195
23196 /**
23197 * check a node (only if tie_selection in checkbox settings is false, otherwise select_node will be called internally)
23198 * @name check_node(obj)
23199 * @param {mixed} obj an array can be used to check multiple nodes
23200 * @trigger check_node.jstree
23201 * @plugin checkbox
23202 */
23203 this.check_node = function (obj, e) {
23204 if(this.settings.checkbox.tie_selection) { return this.select_node(obj, false, true, e); }
23205 var dom, t1, t2, th;
23206 if($.isArray(obj)) {
23207 obj = obj.slice();
23208 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
23209 this.check_node(obj[t1], e);
23210 }
23211 return true;
23212 }
23213 obj = this.get_node(obj);
23214 if(!obj || obj.id === '#') {
23215 return false;
23216 }
23217 dom = this.get_node(obj, true);
23218 if(!obj.state.checked) {
23219 obj.state.checked = true;
23220 this._data.checkbox.selected.push(obj.id);
23221 if(dom && dom.length) {
23222 dom.children('.jstree-anchor').addClass('jstree-checked');
23223 }
23224 /**
23225 * triggered when an node is checked (only if tie_selection in checkbox settings is false)
23226 * @event
23227 * @name check_node.jstree
23228 * @param {Object} node
23229 * @param {Array} selected the current selection
23230 * @param {Object} event the event (if any) that triggered this check_node
23231 * @plugin checkbox
23232 */
23233 this.trigger('check_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e });
23234 }
23235 };
23236 /**
23237 * uncheck a node (only if tie_selection in checkbox settings is false, otherwise deselect_node will be called internally)
23238 * @name deselect_node(obj)
23239 * @param {mixed} obj an array can be used to deselect multiple nodes
23240 * @trigger uncheck_node.jstree
23241 * @plugin checkbox
23242 */
23243 this.uncheck_node = function (obj, e) {
23244 if(this.settings.checkbox.tie_selection) { return this.deselect_node(obj, false, e); }
23245 var t1, t2, dom;
23246 if($.isArray(obj)) {
23247 obj = obj.slice();
23248 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
23249 this.uncheck_node(obj[t1], e);
23250 }
23251 return true;
23252 }
23253 obj = this.get_node(obj);
23254 if(!obj || obj.id === '#') {
23255 return false;
23256 }
23257 dom = this.get_node(obj, true);
23258 if(obj.state.checked) {
23259 obj.state.checked = false;
23260 this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, obj.id);
23261 if(dom.length) {
23262 dom.children('.jstree-anchor').removeClass('jstree-checked');
23263 }
23264 /**
23265 * triggered when an node is unchecked (only if tie_selection in checkbox settings is false)
23266 * @event
23267 * @name uncheck_node.jstree
23268 * @param {Object} node
23269 * @param {Array} selected the current selection
23270 * @param {Object} event the event (if any) that triggered this uncheck_node
23271 * @plugin checkbox
23272 */
23273 this.trigger('uncheck_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e });
23274 }
23275 };
23276 /**
23277 * checks all nodes in the tree (only if tie_selection in checkbox settings is false, otherwise select_all will be called internally)
23278 * @name check_all()
23279 * @trigger check_all.jstree, changed.jstree
23280 * @plugin checkbox
23281 */
23282 this.check_all = function () {
23283 if(this.settings.checkbox.tie_selection) { return this.select_all(); }
23284 var tmp = this._data.checkbox.selected.concat([]), i, j;
23285 this._data.checkbox.selected = this._model.data['#'].children_d.concat();
23286 for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) {
23287 if(this._model.data[this._data.checkbox.selected[i]]) {
23288 this._model.data[this._data.checkbox.selected[i]].state.checked = true;
23289 }
23290 }
23291 this.redraw(true);
23292 /**
23293 * triggered when all nodes are checked (only if tie_selection in checkbox settings is false)
23294 * @event
23295 * @name check_all.jstree
23296 * @param {Array} selected the current selection
23297 * @plugin checkbox
23298 */
23299 this.trigger('check_all', { 'selected' : this._data.checkbox.selected });
23300 };
23301 /**
23302 * uncheck all checked nodes (only if tie_selection in checkbox settings is false, otherwise deselect_all will be called internally)
23303 * @name uncheck_all()
23304 * @trigger uncheck_all.jstree
23305 * @plugin checkbox
23306 */
23307 this.uncheck_all = function () {
23308 if(this.settings.checkbox.tie_selection) { return this.deselect_all(); }
23309 var tmp = this._data.checkbox.selected.concat([]), i, j;
23310 for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) {
23311 if(this._model.data[this._data.checkbox.selected[i]]) {
23312 this._model.data[this._data.checkbox.selected[i]].state.checked = false;
23313 }
23314 }
23315 this._data.checkbox.selected = [];
23316 this.element.find('.jstree-checked').removeClass('jstree-checked');
23317 /**
23318 * triggered when all nodes are unchecked (only if tie_selection in checkbox settings is false)
23319 * @event
23320 * @name uncheck_all.jstree
23321 * @param {Object} node the previous selection
23322 * @param {Array} selected the current selection
23323 * @plugin checkbox
23324 */
23325 this.trigger('uncheck_all', { 'selected' : this._data.checkbox.selected, 'node' : tmp });
23326 };
23327 /**
23328 * checks if a node is checked (if tie_selection is on in the settings this function will return the same as is_selected)
23329 * @name is_checked(obj)
23330 * @param {mixed} obj
23331 * @return {Boolean}
23332 * @plugin checkbox
23333 */
23334 this.is_checked = function (obj) {
23335 if(this.settings.checkbox.tie_selection) { return this.is_selected(obj); }
23336 obj = this.get_node(obj);
23337 if(!obj || obj.id === '#') { return false; }
23338 return obj.state.checked;
23339 };
23340 /**
23341 * get an array of all checked nodes (if tie_selection is on in the settings this function will return the same as get_selected)
23342 * @name get_checked([full])
23343 * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
23344 * @return {Array}
23345 * @plugin checkbox
23346 */
23347 this.get_checked = function (full) {
23348 if(this.settings.checkbox.tie_selection) { return this.get_selected(full); }
23349 return full ? $.map(this._data.checkbox.selected, $.proxy(function (i) { return this.get_node(i); }, this)) : this._data.checkbox.selected;
23350 };
23351 /**
23352 * get an array of all top level checked nodes (ignoring children of checked nodes) (if tie_selection is on in the settings this function will return the same as get_top_selected)
23353 * @name get_top_checked([full])
23354 * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
23355 * @return {Array}
23356 * @plugin checkbox
23357 */
23358 this.get_top_checked = function (full) {
23359 if(this.settings.checkbox.tie_selection) { return this.get_top_selected(full); }
23360 var tmp = this.get_checked(true),
23361 obj = {}, i, j, k, l;
23362 for(i = 0, j = tmp.length; i < j; i++) {
23363 obj[tmp[i].id] = tmp[i];
23364 }
23365 for(i = 0, j = tmp.length; i < j; i++) {
23366 for(k = 0, l = tmp[i].children_d.length; k < l; k++) {
23367 if(obj[tmp[i].children_d[k]]) {
23368 delete obj[tmp[i].children_d[k]];
23369 }
23370 }
23371 }
23372 tmp = [];
23373 for(i in obj) {
23374 if(obj.hasOwnProperty(i)) {
23375 tmp.push(i);
23376 }
23377 }
23378 return full ? $.map(tmp, $.proxy(function (i) { return this.get_node(i); }, this)) : tmp;
23379 };
23380 /**
23381 * get an array of all bottom level checked nodes (ignoring selected parents) (if tie_selection is on in the settings this function will return the same as get_bottom_selected)
23382 * @name get_bottom_checked([full])
23383 * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
23384 * @return {Array}
23385 * @plugin checkbox
23386 */
23387 this.get_bottom_checked = function (full) {
23388 if(this.settings.checkbox.tie_selection) { return this.get_bottom_selected(full); }
23389 var tmp = this.get_checked(true),
23390 obj = [], i, j;
23391 for(i = 0, j = tmp.length; i < j; i++) {
23392 if(!tmp[i].children.length) {
23393 obj.push(tmp[i].id);
23394 }
23395 }
23396 return full ? $.map(obj, $.proxy(function (i) { return this.get_node(i); }, this)) : obj;
23397 };
23398 this.load_node = function (obj, callback) {
23399 var k, l, i, j, c, tmp;
23400 if(!$.isArray(obj) && !this.settings.checkbox.tie_selection) {
23401 tmp = this.get_node(obj);
23402 if(tmp && tmp.state.loaded) {
23403 for(k = 0, l = tmp.children_d.length; k < l; k++) {
23404 if(this._model.data[tmp.children_d[k]].state.checked) {
23405 c = true;
23406 this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, tmp.children_d[k]);
23407 }
23408 }
23409 }
23410 }
23411 return parent.load_node.apply(this, arguments);
23412 };
23413 this.get_state = function () {
23414 var state = parent.get_state.apply(this, arguments);
23415 if(this.settings.checkbox.tie_selection) { return state; }
23416 state.checkbox = this._data.checkbox.selected.slice();
23417 return state;
23418 };
23419 this.set_state = function (state, callback) {
23420 var res = parent.set_state.apply(this, arguments);
23421 if(res && state.checkbox) {
23422 if(!this.settings.checkbox.tie_selection) {
23423 this.uncheck_all();
23424 var _this = this;
23425 $.each(state.checkbox, function (i, v) {
23426 _this.check_node(v);
23427 });
23428 }
23429 delete state.checkbox;
23430 return false;
23431 }
23432 return res;
23433 };
23434 };
23435
23436 // include the checkbox plugin by default
23437 // $.jstree.defaults.plugins.push("checkbox");
23438
23439 /**
23440 * ### Contextmenu plugin
23441 *
23442 * Shows a context menu when a node is right-clicked.
23443 */
23444
23445 var cto = null, ex, ey;
23446
23447 /**
23448 * stores all defaults for the contextmenu plugin
23449 * @name $.jstree.defaults.contextmenu
23450 * @plugin contextmenu
23451 */
23452 $.jstree.defaults.contextmenu = {
23453 /**
23454 * a boolean indicating if the node should be selected when the context menu is invoked on it. Defaults to `true`.
23455 * @name $.jstree.defaults.contextmenu.select_node
23456 * @plugin contextmenu
23457 */
23458 select_node : true,
23459 /**
23460 * a boolean indicating if the menu should be shown aligned with the node. Defaults to `true`, otherwise the mouse coordinates are used.
23461 * @name $.jstree.defaults.contextmenu.show_at_node
23462 * @plugin contextmenu
23463 */
23464 show_at_node : true,
23465 /**
23466 * an object of actions, or a function that accepts a node and a callback function and calls the callback function with an object of actions available for that node (you can also return the items too).
23467 *
23468 * Each action consists of a key (a unique name) and a value which is an object with the following properties (only label and action are required):
23469 *
23470 * * `separator_before` - a boolean indicating if there should be a separator before this item
23471 * * `separator_after` - a boolean indicating if there should be a separator after this item
23472 * * `_disabled` - a boolean indicating if this action should be disabled
23473 * * `label` - a string - the name of the action (could be a function returning a string)
23474 * * `action` - a function to be executed if this item is chosen
23475 * * `icon` - a string, can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class
23476 * * `shortcut` - keyCode which will trigger the action if the menu is open (for example `113` for rename, which equals F2)
23477 * * `shortcut_label` - shortcut label (like for example `F2` for rename)
23478 *
23479 * @name $.jstree.defaults.contextmenu.items
23480 * @plugin contextmenu
23481 */
23482 items : function (o, cb) { // Could be an object directly
23483 return {
23484 "create" : {
23485 "separator_before" : false,
23486 "separator_after" : true,
23487 "_disabled" : false, //(this.check("create_node", data.reference, {}, "last")),
23488 "label" : "Create",
23489 "action" : function (data) {
23490 var inst = $.jstree.reference(data.reference),
23491 obj = inst.get_node(data.reference);
23492 inst.create_node(obj, {}, "last", function (new_node) {
23493 setTimeout(function () { inst.edit(new_node); },0);
23494 });
23495 }
23496 },
23497 "rename" : {
23498 "separator_before" : false,
23499 "separator_after" : false,
23500 "_disabled" : false, //(this.check("rename_node", data.reference, this.get_parent(data.reference), "")),
23501 "label" : "Rename",
23502 /*
23503 "shortcut" : 113,
23504 "shortcut_label" : 'F2',
23505 "icon" : "glyphicon glyphicon-leaf",
23506 */
23507 "action" : function (data) {
23508 var inst = $.jstree.reference(data.reference),
23509 obj = inst.get_node(data.reference);
23510 inst.edit(obj);
23511 }
23512 },
23513 "remove" : {
23514 "separator_before" : false,
23515 "icon" : false,
23516 "separator_after" : false,
23517 "_disabled" : false, //(this.check("delete_node", data.reference, this.get_parent(data.reference), "")),
23518 "label" : "Delete",
23519 "action" : function (data) {
23520 var inst = $.jstree.reference(data.reference),
23521 obj = inst.get_node(data.reference);
23522 if(inst.is_selected(obj)) {
23523 inst.delete_node(inst.get_selected());
23524 }
23525 else {
23526 inst.delete_node(obj);
23527 }
23528 }
23529 },
23530 "ccp" : {
23531 "separator_before" : true,
23532 "icon" : false,
23533 "separator_after" : false,
23534 "label" : "Edit",
23535 "action" : false,
23536 "submenu" : {
23537 "cut" : {
23538 "separator_before" : false,
23539 "separator_after" : false,
23540 "label" : "Cut",
23541 "action" : function (data) {
23542 var inst = $.jstree.reference(data.reference),
23543 obj = inst.get_node(data.reference);
23544 if(inst.is_selected(obj)) {
23545 inst.cut(inst.get_selected());
23546 }
23547 else {
23548 inst.cut(obj);
23549 }
23550 }
23551 },
23552 "copy" : {
23553 "separator_before" : false,
23554 "icon" : false,
23555 "separator_after" : false,
23556 "label" : "Copy",
23557 "action" : function (data) {
23558 var inst = $.jstree.reference(data.reference),
23559 obj = inst.get_node(data.reference);
23560 if(inst.is_selected(obj)) {
23561 inst.copy(inst.get_selected());
23562 }
23563 else {
23564 inst.copy(obj);
23565 }
23566 }
23567 },
23568 "paste" : {
23569 "separator_before" : false,
23570 "icon" : false,
23571 "_disabled" : function (data) {
23572 return !$.jstree.reference(data.reference).can_paste();
23573 },
23574 "separator_after" : false,
23575 "label" : "Paste",
23576 "action" : function (data) {
23577 var inst = $.jstree.reference(data.reference),
23578 obj = inst.get_node(data.reference);
23579 inst.paste(obj);
23580 }
23581 }
23582 }
23583 }
23584 };
23585 }
23586 };
23587
23588 $.jstree.plugins.contextmenu = function (options, parent) {
23589 this.bind = function () {
23590 parent.bind.call(this);
23591
23592 var last_ts = 0;
23593 this.element
23594 .on("contextmenu.jstree", ".jstree-anchor", $.proxy(function (e, data) {
23595 e.preventDefault();
23596 last_ts = e.ctrlKey ? +new Date() : 0;
23597 if(data || cto) {
23598 last_ts = (+new Date()) + 10000;
23599 }
23600 if(cto) {
23601 clearTimeout(cto);
23602 }
23603 if(!this.is_loading(e.currentTarget)) {
23604 this.show_contextmenu(e.currentTarget, e.pageX, e.pageY, e);
23605 }
23606 }, this))
23607 .on("click.jstree", ".jstree-anchor", $.proxy(function (e) {
23608 if(this._data.contextmenu.visible && (!last_ts || (+new Date()) - last_ts > 250)) { // work around safari & macOS ctrl+click
23609 $.vakata.context.hide();
23610 }
23611 last_ts = 0;
23612 }, this))
23613 .on("touchstart.jstree", ".jstree-anchor", function (e) {
23614 if(!e.originalEvent || !e.originalEvent.changedTouches || !e.originalEvent.changedTouches[0]) {
23615 return;
23616 }
23617 ex = e.pageX;
23618 ey = e.pageY;
23619 cto = setTimeout(function () {
23620 $(e.currentTarget).trigger('contextmenu', true);
23621 }, 750);
23622 });
23623 /*
23624 if(!('oncontextmenu' in document.body) && ('ontouchstart' in document.body)) {
23625 var el = null, tm = null;
23626 this.element
23627 .on("touchstart", ".jstree-anchor", function (e) {
23628 el = e.currentTarget;
23629 tm = +new Date();
23630 $(document).one("touchend", function (e) {
23631 e.target = document.elementFromPoint(e.originalEvent.targetTouches[0].pageX - window.pageXOffset, e.originalEvent.targetTouches[0].pageY - window.pageYOffset);
23632 e.currentTarget = e.target;
23633 tm = ((+(new Date())) - tm);
23634 if(e.target === el && tm > 600 && tm < 1000) {
23635 e.preventDefault();
23636 $(el).trigger('contextmenu', e);
23637 }
23638 el = null;
23639 tm = null;
23640 });
23641 });
23642 }
23643 */
23644 $(document).on("context_hide.vakata.jstree", $.proxy(function () { this._data.contextmenu.visible = false; }, this));
23645 };
23646 this.teardown = function () {
23647 if(this._data.contextmenu.visible) {
23648 $.vakata.context.hide();
23649 }
23650 parent.teardown.call(this);
23651 };
23652
23653 /**
23654 * prepare and show the context menu for a node
23655 * @name show_contextmenu(obj [, x, y])
23656 * @param {mixed} obj the node
23657 * @param {Number} x the x-coordinate relative to the document to show the menu at
23658 * @param {Number} y the y-coordinate relative to the document to show the menu at
23659 * @param {Object} e the event if available that triggered the contextmenu
23660 * @plugin contextmenu
23661 * @trigger show_contextmenu.jstree
23662 */
23663 this.show_contextmenu = function (obj, x, y, e) {
23664 obj = this.get_node(obj);
23665 if(!obj || obj.id === '#') { return false; }
23666 var s = this.settings.contextmenu,
23667 d = this.get_node(obj, true),
23668 a = d.children(".jstree-anchor"),
23669 o = false,
23670 i = false;
23671 if(s.show_at_node || x === undefined || y === undefined) {
23672 o = a.offset();
23673 x = o.left;
23674 y = o.top + this._data.core.li_height;
23675 }
23676 if(this.settings.contextmenu.select_node && !this.is_selected(obj)) {
23677 this.activate_node(obj, e);
23678 }
23679
23680 i = s.items;
23681 if($.isFunction(i)) {
23682 i = i.call(this, obj, $.proxy(function (i) {
23683 this._show_contextmenu(obj, x, y, i);
23684 }, this));
23685 }
23686 if($.isPlainObject(i)) {
23687 this._show_contextmenu(obj, x, y, i);
23688 }
23689 };
23690 /**
23691 * show the prepared context menu for a node
23692 * @name _show_contextmenu(obj, x, y, i)
23693 * @param {mixed} obj the node
23694 * @param {Number} x the x-coordinate relative to the document to show the menu at
23695 * @param {Number} y the y-coordinate relative to the document to show the menu at
23696 * @param {Number} i the object of items to show
23697 * @plugin contextmenu
23698 * @trigger show_contextmenu.jstree
23699 * @private
23700 */
23701 this._show_contextmenu = function (obj, x, y, i) {
23702 var d = this.get_node(obj, true),
23703 a = d.children(".jstree-anchor");
23704 $(document).one("context_show.vakata.jstree", $.proxy(function (e, data) {
23705 var cls = 'jstree-contextmenu jstree-' + this.get_theme() + '-contextmenu';
23706 $(data.element).addClass(cls);
23707 }, this));
23708 this._data.contextmenu.visible = true;
23709 $.vakata.context.show(a, { 'x' : x, 'y' : y }, i);
23710 /**
23711 * triggered when the contextmenu is shown for a node
23712 * @event
23713 * @name show_contextmenu.jstree
23714 * @param {Object} node the node
23715 * @param {Number} x the x-coordinate of the menu relative to the document
23716 * @param {Number} y the y-coordinate of the menu relative to the document
23717 * @plugin contextmenu
23718 */
23719 this.trigger('show_contextmenu', { "node" : obj, "x" : x, "y" : y });
23720 };
23721 };
23722
23723 $(function () {
23724 $(document)
23725 .on('touchmove.vakata.jstree', function (e) {
23726 if(cto && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0] && (Math.abs(ex - e.pageX) > 50 || Math.abs(ey - e.pageY) > 50)) {
23727 clearTimeout(cto);
23728 }
23729 })
23730 .on('touchend.vakata.jstree', function (e) {
23731 if(cto) {
23732 clearTimeout(cto);
23733 }
23734 });
23735 });
23736
23737 // contextmenu helper
23738 (function ($) {
23739 var right_to_left = false,
23740 vakata_context = {
23741 element : false,
23742 reference : false,
23743 position_x : 0,
23744 position_y : 0,
23745 items : [],
23746 html : "",
23747 is_visible : false
23748 };
23749
23750 $.vakata.context = {
23751 settings : {
23752 hide_onmouseleave : 0,
23753 icons : true
23754 },
23755 _trigger : function (event_name) {
23756 $(document).triggerHandler("context_" + event_name + ".vakata", {
23757 "reference" : vakata_context.reference,
23758 "element" : vakata_context.element,
23759 "position" : {
23760 "x" : vakata_context.position_x,
23761 "y" : vakata_context.position_y
23762 }
23763 });
23764 },
23765 _execute : function (i) {
23766 i = vakata_context.items[i];
23767 return i && (!i._disabled || ($.isFunction(i._disabled) && !i._disabled({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }))) && i.action ? i.action.call(null, {
23768 "item" : i,
23769 "reference" : vakata_context.reference,
23770 "element" : vakata_context.element,
23771 "position" : {
23772 "x" : vakata_context.position_x,
23773 "y" : vakata_context.position_y
23774 }
23775 }) : false;
23776 },
23777 _parse : function (o, is_callback) {
23778 if(!o) { return false; }
23779 if(!is_callback) {
23780 vakata_context.html = "";
23781 vakata_context.items = [];
23782 }
23783 var str = "",
23784 sep = false,
23785 tmp;
23786
23787 if(is_callback) { str += "<"+"ul>"; }
23788 $.each(o, function (i, val) {
23789 if(!val) { return true; }
23790 vakata_context.items.push(val);
23791 if(!sep && val.separator_before) {
23792 str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'style="margin-left:0px;"') + ">&#160;<"+"/a><"+"/li>";
23793 }
23794 sep = false;
23795 str += "<"+"li class='" + (val._class || "") + (val._disabled === true || ($.isFunction(val._disabled) && val._disabled({ "item" : val, "reference" : vakata_context.reference, "element" : vakata_context.element })) ? " vakata-contextmenu-disabled " : "") + "' "+(val.shortcut?" data-shortcut='"+val.shortcut+"' ":'')+">";
23796 str += "<"+"a href='#' rel='" + (vakata_context.items.length - 1) + "'>";
23797 if($.vakata.context.settings.icons) {
23798 str += "<"+"i ";
23799 if(val.icon) {
23800 if(val.icon.indexOf("/") !== -1 || val.icon.indexOf(".") !== -1) { str += " style='background:url(\"" + val.icon + "\") center center no-repeat' "; }
23801 else { str += " class='" + val.icon + "' "; }
23802 }
23803 str += "><"+"/i><"+"span class='vakata-contextmenu-sep'>&#160;<"+"/span>";
23804 }
23805 str += ($.isFunction(val.label) ? val.label({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }) : val.label) + (val.shortcut?' <span class="vakata-contextmenu-shortcut vakata-contextmenu-shortcut-'+val.shortcut+'">'+ (val.shortcut_label || '') +'</span>':'') + "<"+"/a>";
23806 if(val.submenu) {
23807 tmp = $.vakata.context._parse(val.submenu, true);
23808 if(tmp) { str += tmp; }
23809 }
23810 str += "<"+"/li>";
23811 if(val.separator_after) {
23812 str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'style="margin-left:0px;"') + ">&#160;<"+"/a><"+"/li>";
23813 sep = true;
23814 }
23815 });
23816 str = str.replace(/<li class\='vakata-context-separator'\><\/li\>$/,"");
23817 if(is_callback) { str += "</ul>"; }
23818 /**
23819 * triggered on the document when the contextmenu is parsed (HTML is built)
23820 * @event
23821 * @plugin contextmenu
23822 * @name context_parse.vakata
23823 * @param {jQuery} reference the element that was right clicked
23824 * @param {jQuery} element the DOM element of the menu itself
23825 * @param {Object} position the x & y coordinates of the menu
23826 */
23827 if(!is_callback) { vakata_context.html = str; $.vakata.context._trigger("parse"); }
23828 return str.length > 10 ? str : false;
23829 },
23830 _show_submenu : function (o) {
23831 o = $(o);
23832 if(!o.length || !o.children("ul").length) { return; }
23833 var e = o.children("ul"),
23834 x = o.offset().left + o.outerWidth(),
23835 y = o.offset().top,
23836 w = e.width(),
23837 h = e.height(),
23838 dw = $(window).width() + $(window).scrollLeft(),
23839 dh = $(window).height() + $(window).scrollTop();
23840 // може да се спести е една проверка - дали няма някой от класовете вече нагоре
23841 if(right_to_left) {
23842 o[x - (w + 10 + o.outerWidth()) < 0 ? "addClass" : "removeClass"]("vakata-context-left");
23843 }
23844 else {
23845 o[x + w + 10 > dw ? "addClass" : "removeClass"]("vakata-context-right");
23846 }
23847 if(y + h + 10 > dh) {
23848 e.css("bottom","-1px");
23849 }
23850 e.show();
23851 },
23852 show : function (reference, position, data) {
23853 var o, e, x, y, w, h, dw, dh, cond = true;
23854 if(vakata_context.element && vakata_context.element.length) {
23855 vakata_context.element.width('');
23856 }
23857 switch(cond) {
23858 case (!position && !reference):
23859 return false;
23860 case (!!position && !!reference):
23861 vakata_context.reference = reference;
23862 vakata_context.position_x = position.x;
23863 vakata_context.position_y = position.y;
23864 break;
23865 case (!position && !!reference):
23866 vakata_context.reference = reference;
23867 o = reference.offset();
23868 vakata_context.position_x = o.left + reference.outerHeight();
23869 vakata_context.position_y = o.top;
23870 break;
23871 case (!!position && !reference):
23872 vakata_context.position_x = position.x;
23873 vakata_context.position_y = position.y;
23874 break;
23875 }
23876 if(!!reference && !data && $(reference).data('vakata_contextmenu')) {
23877 data = $(reference).data('vakata_contextmenu');
23878 }
23879 if($.vakata.context._parse(data)) {
23880 vakata_context.element.html(vakata_context.html);
23881 }
23882 if(vakata_context.items.length) {
23883 vakata_context.element.appendTo("body");
23884 e = vakata_context.element;
23885 x = vakata_context.position_x;
23886 y = vakata_context.position_y;
23887 w = e.width();
23888 h = e.height();
23889 dw = $(window).width() + $(window).scrollLeft();
23890 dh = $(window).height() + $(window).scrollTop();
23891 if(right_to_left) {
23892 x -= (e.outerWidth() - $(reference).outerWidth());
23893 if(x < $(window).scrollLeft() + 20) {
23894 x = $(window).scrollLeft() + 20;
23895 }
23896 }
23897 if(x + w + 20 > dw) {
23898 x = dw - (w + 20);
23899 }
23900 if(y + h + 20 > dh) {
23901 y = dh - (h + 20);
23902 }
23903
23904 vakata_context.element
23905 .css({ "left" : x, "top" : y })
23906 .show()
23907 .find('a').first().focus().parent().addClass("vakata-context-hover");
23908 vakata_context.is_visible = true;
23909 /**
23910 * triggered on the document when the contextmenu is shown
23911 * @event
23912 * @plugin contextmenu
23913 * @name context_show.vakata
23914 * @param {jQuery} reference the element that was right clicked
23915 * @param {jQuery} element the DOM element of the menu itself
23916 * @param {Object} position the x & y coordinates of the menu
23917 */
23918 $.vakata.context._trigger("show");
23919 }
23920 },
23921 hide : function () {
23922 if(vakata_context.is_visible) {
23923 vakata_context.element.hide().find("ul").hide().end().find(':focus').blur().end().detach();
23924 vakata_context.is_visible = false;
23925 /**
23926 * triggered on the document when the contextmenu is hidden
23927 * @event
23928 * @plugin contextmenu
23929 * @name context_hide.vakata
23930 * @param {jQuery} reference the element that was right clicked
23931 * @param {jQuery} element the DOM element of the menu itself
23932 * @param {Object} position the x & y coordinates of the menu
23933 */
23934 $.vakata.context._trigger("hide");
23935 }
23936 }
23937 };
23938 $(function () {
23939 right_to_left = $("body").css("direction") === "rtl";
23940 var to = false;
23941
23942 vakata_context.element = $("<ul class='vakata-context'></ul>");
23943 vakata_context.element
23944 .on("mouseenter", "li", function (e) {
23945 e.stopImmediatePropagation();
23946
23947 if($.contains(this, e.relatedTarget)) {
23948 // премахнато заради delegate mouseleave по-долу
23949 // $(this).find(".vakata-context-hover").removeClass("vakata-context-hover");
23950 return;
23951 }
23952
23953 if(to) { clearTimeout(to); }
23954 vakata_context.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end();
23955
23956 $(this)
23957 .siblings().find("ul").hide().end().end()
23958 .parentsUntil(".vakata-context", "li").addBack().addClass("vakata-context-hover");
23959 $.vakata.context._show_submenu(this);
23960 })
23961 // тестово - дали не натоварва?
23962 .on("mouseleave", "li", function (e) {
23963 if($.contains(this, e.relatedTarget)) { return; }
23964 $(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover");
23965 })
23966 .on("mouseleave", function (e) {
23967 $(this).find(".vakata-context-hover").removeClass("vakata-context-hover");
23968 if($.vakata.context.settings.hide_onmouseleave) {
23969 to = setTimeout(
23970 (function (t) {
23971 return function () { $.vakata.context.hide(); };
23972 }(this)), $.vakata.context.settings.hide_onmouseleave);
23973 }
23974 })
23975 .on("click", "a", function (e) {
23976 e.preventDefault();
23977 //})
23978 //.on("mouseup", "a", function (e) {
23979 if(!$(this).blur().parent().hasClass("vakata-context-disabled") && $.vakata.context._execute($(this).attr("rel")) !== false) {
23980 $.vakata.context.hide();
23981 }
23982 })
23983 .on('keydown', 'a', function (e) {
23984 var o = null;
23985 switch(e.which) {
23986 case 13:
23987 case 32:
23988 e.type = "mouseup";
23989 e.preventDefault();
23990 $(e.currentTarget).trigger(e);
23991 break;
23992 case 37:
23993 if(vakata_context.is_visible) {
23994 vakata_context.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children('a').focus();
23995 e.stopImmediatePropagation();
23996 e.preventDefault();
23997 }
23998 break;
23999 case 38:
24000 if(vakata_context.is_visible) {
24001 o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first();
24002 if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last(); }
24003 o.addClass("vakata-context-hover").children('a').focus();
24004 e.stopImmediatePropagation();
24005 e.preventDefault();
24006 }
24007 break;
24008 case 39:
24009 if(vakata_context.is_visible) {
24010 vakata_context.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children('a').focus();
24011 e.stopImmediatePropagation();
24012 e.preventDefault();
24013 }
24014 break;
24015 case 40:
24016 if(vakata_context.is_visible) {
24017 o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first();
24018 if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first(); }
24019 o.addClass("vakata-context-hover").children('a').focus();
24020 e.stopImmediatePropagation();
24021 e.preventDefault();
24022 }
24023 break;
24024 case 27:
24025 $.vakata.context.hide();
24026 e.preventDefault();
24027 break;
24028 default:
24029 //console.log(e.which);
24030 break;
24031 }
24032 })
24033 .on('keydown', function (e) {
24034 e.preventDefault();
24035 var a = vakata_context.element.find('.vakata-contextmenu-shortcut-' + e.which).parent();
24036 if(a.parent().not('.vakata-context-disabled')) {
24037 a.click();
24038 }
24039 });
24040
24041 $(document)
24042 .on("mousedown.vakata.jstree", function (e) {
24043 if(vakata_context.is_visible && !$.contains(vakata_context.element[0], e.target)) {
24044 $.vakata.context.hide();
24045 }
24046 })
24047 .on("context_show.vakata.jstree", function (e, data) {
24048 vakata_context.element.find("li:has(ul)").children("a").addClass("vakata-context-parent");
24049 if(right_to_left) {
24050 vakata_context.element.addClass("vakata-context-rtl").css("direction", "rtl");
24051 }
24052 // also apply a RTL class?
24053 vakata_context.element.find("ul").hide().end();
24054 });
24055 });
24056 }($));
24057 // $.jstree.defaults.plugins.push("contextmenu");
24058
24059 /**
24060 * ### Drag'n'drop plugin
24061 *
24062 * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations.
24063 */
24064
24065 /**
24066 * stores all defaults for the drag'n'drop plugin
24067 * @name $.jstree.defaults.dnd
24068 * @plugin dnd
24069 */
24070 $.jstree.defaults.dnd = {
24071 /**
24072 * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`.
24073 * @name $.jstree.defaults.dnd.copy
24074 * @plugin dnd
24075 */
24076 copy : true,
24077 /**
24078 * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`.
24079 * @name $.jstree.defaults.dnd.open_timeout
24080 * @plugin dnd
24081 */
24082 open_timeout : 500,
24083 /**
24084 * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) - return `false` to prevent dragging
24085 * @name $.jstree.defaults.dnd.is_draggable
24086 * @plugin dnd
24087 */
24088 is_draggable : true,
24089 /**
24090 * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true`
24091 * @name $.jstree.defaults.dnd.check_while_dragging
24092 * @plugin dnd
24093 */
24094 check_while_dragging : true,
24095 /**
24096 * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false`
24097 * @name $.jstree.defaults.dnd.always_copy
24098 * @plugin dnd
24099 */
24100 always_copy : false,
24101 /**
24102 * when dropping a node "inside", this setting indicates the position the node should go to - it can be an integer or a string: "first" (same as 0) or "last", default is `0`
24103 * @name $.jstree.defaults.dnd.inside_pos
24104 * @plugin dnd
24105 */
24106 inside_pos : 0,
24107 /**
24108 * when starting the drag on a node that is selected this setting controls if all selected nodes are dragged or only the single node, default is `true`, which means all selected nodes are dragged when the drag is started on a selected node
24109 * @name $.jstree.defaults.dnd.drag_selection
24110 * @plugin dnd
24111 */
24112 drag_selection : true,
24113 /**
24114 * controls whether dnd works on touch devices. If left as boolean true dnd will work the same as in desktop browsers, which in some cases may impair scrolling. If set to boolean false dnd will not work on touch devices. There is a special third option - string "selected" which means only selected nodes can be dragged on touch devices.
24115 * @name $.jstree.defaults.dnd.touch
24116 * @plugin dnd
24117 */
24118 touch : true
24119 };
24120 // TODO: now check works by checking for each node individually, how about max_children, unique, etc?
24121 $.jstree.plugins.dnd = function (options, parent) {
24122 this.bind = function () {
24123 parent.bind.call(this);
24124
24125 this.element
24126 .on('mousedown.jstree touchstart.jstree', '.jstree-anchor', $.proxy(function (e) {
24127 if(e.type === "touchstart" && (!this.settings.dnd.touch || (this.settings.dnd.touch === 'selected' && !$(e.currentTarget).hasClass('jstree-clicked')))) {
24128 return true;
24129 }
24130 var obj = this.get_node(e.target),
24131 mlt = this.is_selected(obj) && this.settings.drag_selection ? this.get_selected().length : 1,
24132 txt = (mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget));
24133 if(this.settings.core.force_text) {
24134 txt = $('<div />').text(txt).html();
24135 }
24136 if(obj && obj.id && obj.id !== "#" && (e.which === 1 || e.type === "touchstart") &&
24137 (this.settings.dnd.is_draggable === true || ($.isFunction(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, (mlt > 1 ? this.get_selected(true) : [obj]))))
24138 ) {
24139 this.element.trigger('mousedown.jstree');
24140 return $.vakata.dnd.start(e, { 'jstree' : true, 'origin' : this, 'obj' : this.get_node(obj,true), 'nodes' : mlt > 1 ? this.get_selected() : [obj.id] }, '<div id="jstree-dnd" class="jstree-' + this.get_theme() + ' jstree-' + this.get_theme() + '-' + this.get_theme_variant() + ' ' + ( this.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ) + '"><i class="jstree-icon jstree-er"></i>' + txt + '<ins class="jstree-copy" style="display:none;">+</ins></div>');
24141 }
24142 }, this));
24143 };
24144 };
24145
24146 $(function() {
24147 // bind only once for all instances
24148 var lastmv = false,
24149 laster = false,
24150 opento = false,
24151 marker = $('<div id="jstree-marker">&#160;</div>').hide(); //.appendTo('body');
24152
24153 $(document)
24154 .on('dnd_start.vakata.jstree', function (e, data) {
24155 lastmv = false;
24156 if(!data || !data.data || !data.data.jstree) { return; }
24157 marker.appendTo('body'); //.show();
24158 })
24159 .on('dnd_move.vakata.jstree', function (e, data) {
24160 if(opento) { clearTimeout(opento); }
24161 if(!data || !data.data || !data.data.jstree) { return; }
24162
24163 // if we are hovering the marker image do nothing (can happen on "inside" drags)
24164 if(data.event.target.id && data.event.target.id === 'jstree-marker') {
24165 return;
24166 }
24167
24168 var ins = $.jstree.reference(data.event.target),
24169 ref = false,
24170 off = false,
24171 rel = false,
24172 l, t, h, p, i, o, ok, t1, t2, op, ps, pr, ip, tm;
24173 // if we are over an instance
24174 if(ins && ins._data && ins._data.dnd) {
24175 marker.attr('class', 'jstree-' + ins.get_theme() + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ));
24176 data.helper
24177 .children().attr('class', 'jstree-' + ins.get_theme() + ' jstree-' + ins.get_theme() + '-' + ins.get_theme_variant() + ' ' + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ))
24178 .find('.jstree-copy').first()[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'show' : 'hide' ]();
24179
24180
24181 // if are hovering the container itself add a new root node
24182 if( (data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && ins.get_container_ul().children().length === 0) {
24183 ok = true;
24184 for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
24185 ok = ok && ins.check( (data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ) ? "copy_node" : "move_node"), (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), '#', 'last', { 'dnd' : true, 'ref' : ins.get_node('#'), 'pos' : 'i', 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) });
24186 if(!ok) { break; }
24187 }
24188 if(ok) {
24189 lastmv = { 'ins' : ins, 'par' : '#', 'pos' : 'last' };
24190 marker.hide();
24191 data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
24192 return;
24193 }
24194 }
24195 else {
24196 // if we are hovering a tree node
24197 ref = $(data.event.target).closest('.jstree-anchor');
24198 if(ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) {
24199 off = ref.offset();
24200 rel = data.event.pageY - off.top;
24201 h = ref.height();
24202 if(rel < h / 3) {
24203 o = ['b', 'i', 'a'];
24204 }
24205 else if(rel > h - h / 3) {
24206 o = ['a', 'i', 'b'];
24207 }
24208 else {
24209 o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a'];
24210 }
24211 $.each(o, function (j, v) {
24212 switch(v) {
24213 case 'b':
24214 l = off.left - 6;
24215 t = off.top;
24216 p = ins.get_parent(ref);
24217 i = ref.parent().index();
24218 break;
24219 case 'i':
24220 ip = ins.settings.dnd.inside_pos;
24221 tm = ins.get_node(ref.parent());
24222 l = off.left - 2;
24223 t = off.top + h / 2 + 1;
24224 p = tm.id;
24225 i = ip === 'first' ? 0 : (ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length));
24226 break;
24227 case 'a':
24228 l = off.left - 6;
24229 t = off.top + h;
24230 p = ins.get_parent(ref);
24231 i = ref.parent().index() + 1;
24232 break;
24233 }
24234 ok = true;
24235 for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
24236 op = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node";
24237 ps = i;
24238 if(op === "move_node" && v === 'a' && (data.data.origin && data.data.origin === ins) && p === ins.get_parent(data.data.nodes[t1])) {
24239 pr = ins.get_node(p);
24240 if(ps > $.inArray(data.data.nodes[t1], pr.children)) {
24241 ps -= 1;
24242 }
24243 }
24244 ok = ok && ( (ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false) || ins.check(op, (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), p, ps, { 'dnd' : true, 'ref' : ins.get_node(ref.parent()), 'pos' : v, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }) );
24245 if(!ok) {
24246 if(ins && ins.last_error) { laster = ins.last_error(); }
24247 break;
24248 }
24249 }
24250 if(v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) {
24251 opento = setTimeout((function (x, z) { return function () { x.open_node(z); }; }(ins, ref)), ins.settings.dnd.open_timeout);
24252 }
24253 if(ok) {
24254 lastmv = { 'ins' : ins, 'par' : p, 'pos' : v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i };
24255 marker.css({ 'left' : l + 'px', 'top' : t + 'px' }).show();
24256 data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
24257 laster = {};
24258 o = true;
24259 return false;
24260 }
24261 });
24262 if(o === true) { return; }
24263 }
24264 }
24265 }
24266 lastmv = false;
24267 data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er');
24268 marker.hide();
24269 })
24270 .on('dnd_scroll.vakata.jstree', function (e, data) {
24271 if(!data || !data.data || !data.data.jstree) { return; }
24272 marker.hide();
24273 lastmv = false;
24274 data.helper.find('.jstree-icon').first().removeClass('jstree-ok').addClass('jstree-er');
24275 })
24276 .on('dnd_stop.vakata.jstree', function (e, data) {
24277 if(opento) { clearTimeout(opento); }
24278 if(!data || !data.data || !data.data.jstree) { return; }
24279 marker.hide().detach();
24280 var i, j, nodes = [];
24281 if(lastmv) {
24282 for(i = 0, j = data.data.nodes.length; i < j; i++) {
24283 nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i];
24284 if(data.data.origin) {
24285 nodes[i].instance = data.data.origin;
24286 }
24287 }
24288 lastmv.ins[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'copy_node' : 'move_node' ](nodes, lastmv.par, lastmv.pos);
24289 for(i = 0, j = nodes.length; i < j; i++) {
24290 if(nodes[i].instance) {
24291 nodes[i].instance = null;
24292 }
24293 }
24294 }
24295 else {
24296 i = $(data.event.target).closest('.jstree');
24297 if(i.length && laster && laster.error && laster.error === 'check') {
24298 i = i.jstree(true);
24299 if(i) {
24300 i.settings.core.error.call(this, laster);
24301 }
24302 }
24303 }
24304 })
24305 .on('keyup.jstree keydown.jstree', function (e, data) {
24306 data = $.vakata.dnd._get();
24307 if(data && data.data && data.data.jstree) {
24308 data.helper.find('.jstree-copy').first()[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey))) ? 'show' : 'hide' ]();
24309 }
24310 });
24311 });
24312
24313 // helpers
24314 (function ($) {
24315 // private variable
24316 var vakata_dnd = {
24317 element : false,
24318 target : false,
24319 is_down : false,
24320 is_drag : false,
24321 helper : false,
24322 helper_w: 0,
24323 data : false,
24324 init_x : 0,
24325 init_y : 0,
24326 scroll_l: 0,
24327 scroll_t: 0,
24328 scroll_e: false,
24329 scroll_i: false,
24330 is_touch: false
24331 };
24332 $.vakata.dnd = {
24333 settings : {
24334 scroll_speed : 10,
24335 scroll_proximity : 20,
24336 helper_left : 5,
24337 helper_top : 10,
24338 threshold : 5,
24339 threshold_touch : 50
24340 },
24341 _trigger : function (event_name, e) {
24342 var data = $.vakata.dnd._get();
24343 data.event = e;
24344 $(document).triggerHandler("dnd_" + event_name + ".vakata", data);
24345 },
24346 _get : function () {
24347 return {
24348 "data" : vakata_dnd.data,
24349 "element" : vakata_dnd.element,
24350 "helper" : vakata_dnd.helper
24351 };
24352 },
24353 _clean : function () {
24354 if(vakata_dnd.helper) { vakata_dnd.helper.remove(); }
24355 if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
24356 vakata_dnd = {
24357 element : false,
24358 target : false,
24359 is_down : false,
24360 is_drag : false,
24361 helper : false,
24362 helper_w: 0,
24363 data : false,
24364 init_x : 0,
24365 init_y : 0,
24366 scroll_l: 0,
24367 scroll_t: 0,
24368 scroll_e: false,
24369 scroll_i: false,
24370 is_touch: false
24371 };
24372 $(document).off("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
24373 $(document).off("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
24374 },
24375 _scroll : function (init_only) {
24376 if(!vakata_dnd.scroll_e || (!vakata_dnd.scroll_l && !vakata_dnd.scroll_t)) {
24377 if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
24378 return false;
24379 }
24380 if(!vakata_dnd.scroll_i) {
24381 vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100);
24382 return false;
24383 }
24384 if(init_only === true) { return false; }
24385
24386 var i = vakata_dnd.scroll_e.scrollTop(),
24387 j = vakata_dnd.scroll_e.scrollLeft();
24388 vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed);
24389 vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed);
24390 if(i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) {
24391 /**
24392 * triggered on the document when a drag causes an element to scroll
24393 * @event
24394 * @plugin dnd
24395 * @name dnd_scroll.vakata
24396 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
24397 * @param {DOM} element the DOM element being dragged
24398 * @param {jQuery} helper the helper shown next to the mouse
24399 * @param {jQuery} event the element that is scrolling
24400 */
24401 $.vakata.dnd._trigger("scroll", vakata_dnd.scroll_e);
24402 }
24403 },
24404 start : function (e, data, html) {
24405 if(e.type === "touchstart" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
24406 e.pageX = e.originalEvent.changedTouches[0].pageX;
24407 e.pageY = e.originalEvent.changedTouches[0].pageY;
24408 e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
24409 }
24410 if(vakata_dnd.is_drag) { $.vakata.dnd.stop({}); }
24411 try {
24412 e.currentTarget.unselectable = "on";
24413 e.currentTarget.onselectstart = function() { return false; };
24414 if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; }
24415 } catch(ignore) { }
24416 vakata_dnd.init_x = e.pageX;
24417 vakata_dnd.init_y = e.pageY;
24418 vakata_dnd.data = data;
24419 vakata_dnd.is_down = true;
24420 vakata_dnd.element = e.currentTarget;
24421 vakata_dnd.target = e.target;
24422 vakata_dnd.is_touch = e.type === "touchstart";
24423 if(html !== false) {
24424 vakata_dnd.helper = $("<div id='vakata-dnd'></div>").html(html).css({
24425 "display" : "block",
24426 "margin" : "0",
24427 "padding" : "0",
24428 "position" : "absolute",
24429 "top" : "-2000px",
24430 "lineHeight" : "16px",
24431 "zIndex" : "10000"
24432 });
24433 }
24434 $(document).on("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
24435 $(document).on("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
24436 return false;
24437 },
24438 drag : function (e) {
24439 if(e.type === "touchmove" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
24440 e.pageX = e.originalEvent.changedTouches[0].pageX;
24441 e.pageY = e.originalEvent.changedTouches[0].pageY;
24442 e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
24443 }
24444 if(!vakata_dnd.is_down) { return; }
24445 if(!vakata_dnd.is_drag) {
24446 if(
24447 Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) ||
24448 Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold)
24449 ) {
24450 if(vakata_dnd.helper) {
24451 vakata_dnd.helper.appendTo("body");
24452 vakata_dnd.helper_w = vakata_dnd.helper.outerWidth();
24453 }
24454 vakata_dnd.is_drag = true;
24455 /**
24456 * triggered on the document when a drag starts
24457 * @event
24458 * @plugin dnd
24459 * @name dnd_start.vakata
24460 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
24461 * @param {DOM} element the DOM element being dragged
24462 * @param {jQuery} helper the helper shown next to the mouse
24463 * @param {Object} event the event that caused the start (probably mousemove)
24464 */
24465 $.vakata.dnd._trigger("start", e);
24466 }
24467 else { return; }
24468 }
24469
24470 var d = false, w = false,
24471 dh = false, wh = false,
24472 dw = false, ww = false,
24473 dt = false, dl = false,
24474 ht = false, hl = false;
24475
24476 vakata_dnd.scroll_t = 0;
24477 vakata_dnd.scroll_l = 0;
24478 vakata_dnd.scroll_e = false;
24479 $($(e.target).parentsUntil("body").addBack().get().reverse())
24480 .filter(function () {
24481 return (/^auto|scroll$/).test($(this).css("overflow")) &&
24482 (this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth);
24483 })
24484 .each(function () {
24485 var t = $(this), o = t.offset();
24486 if(this.scrollHeight > this.offsetHeight) {
24487 if(o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; }
24488 if(e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; }
24489 }
24490 if(this.scrollWidth > this.offsetWidth) {
24491 if(o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; }
24492 if(e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; }
24493 }
24494 if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
24495 vakata_dnd.scroll_e = $(this);
24496 return false;
24497 }
24498 });
24499
24500 if(!vakata_dnd.scroll_e) {
24501 d = $(document); w = $(window);
24502 dh = d.height(); wh = w.height();
24503 dw = d.width(); ww = w.width();
24504 dt = d.scrollTop(); dl = d.scrollLeft();
24505 if(dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; }
24506 if(dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; }
24507 if(dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; }
24508 if(dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; }
24509 if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
24510 vakata_dnd.scroll_e = d;
24511 }
24512 }
24513 if(vakata_dnd.scroll_e) { $.vakata.dnd._scroll(true); }
24514
24515 if(vakata_dnd.helper) {
24516 ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10);
24517 hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10);
24518 if(dh && ht + 25 > dh) { ht = dh - 50; }
24519 if(dw && hl + vakata_dnd.helper_w > dw) { hl = dw - (vakata_dnd.helper_w + 2); }
24520 vakata_dnd.helper.css({
24521 left : hl + "px",
24522 top : ht + "px"
24523 });
24524 }
24525 /**
24526 * triggered on the document when a drag is in progress
24527 * @event
24528 * @plugin dnd
24529 * @name dnd_move.vakata
24530 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
24531 * @param {DOM} element the DOM element being dragged
24532 * @param {jQuery} helper the helper shown next to the mouse
24533 * @param {Object} event the event that caused this to trigger (most likely mousemove)
24534 */
24535 $.vakata.dnd._trigger("move", e);
24536 return false;
24537 },
24538 stop : function (e) {
24539 if(e.type === "touchend" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
24540 e.pageX = e.originalEvent.changedTouches[0].pageX;
24541 e.pageY = e.originalEvent.changedTouches[0].pageY;
24542 e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
24543 }
24544 if(vakata_dnd.is_drag) {
24545 /**
24546 * triggered on the document when a drag stops (the dragged element is dropped)
24547 * @event
24548 * @plugin dnd
24549 * @name dnd_stop.vakata
24550 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
24551 * @param {DOM} element the DOM element being dragged
24552 * @param {jQuery} helper the helper shown next to the mouse
24553 * @param {Object} event the event that caused the stop
24554 */
24555 $.vakata.dnd._trigger("stop", e);
24556 }
24557 else {
24558 if(e.type === "touchend" && e.target === vakata_dnd.target) {
24559 var to = setTimeout(function () { $(e.target).click(); }, 100);
24560 $(e.target).one('click', function() { if(to) { clearTimeout(to); } });
24561 }
24562 }
24563 $.vakata.dnd._clean();
24564 return false;
24565 }
24566 };
24567 }($));
24568
24569 // include the dnd plugin by default
24570 // $.jstree.defaults.plugins.push("dnd");
24571
24572
24573 /**
24574 * ### Search plugin
24575 *
24576 * Adds search functionality to jsTree.
24577 */
24578
24579 /**
24580 * stores all defaults for the search plugin
24581 * @name $.jstree.defaults.search
24582 * @plugin search
24583 */
24584 $.jstree.defaults.search = {
24585 /**
24586 * a jQuery-like AJAX config, which jstree uses if a server should be queried for results.
24587 *
24588 * A `str` (which is the search string) parameter will be added with the request. The expected result is a JSON array with nodes that need to be opened so that matching nodes will be revealed.
24589 * Leave this setting as `false` to not query the server. You can also set this to a function, which will be invoked in the instance's scope and receive 2 parameters - the search string and the callback to call with the array of nodes to load.
24590 * @name $.jstree.defaults.search.ajax
24591 * @plugin search
24592 */
24593 ajax : false,
24594 /**
24595 * Indicates if the search should be fuzzy or not (should `chnd3` match `child node 3`). Default is `false`.
24596 * @name $.jstree.defaults.search.fuzzy
24597 * @plugin search
24598 */
24599 fuzzy : false,
24600 /**
24601 * Indicates if the search should be case sensitive. Default is `false`.
24602 * @name $.jstree.defaults.search.case_sensitive
24603 * @plugin search
24604 */
24605 case_sensitive : false,
24606 /**
24607 * Indicates if the tree should be filtered (by default) to show only matching nodes (keep in mind this can be a heavy on large trees in old browsers).
24608 * This setting can be changed at runtime when calling the search method. Default is `false`.
24609 * @name $.jstree.defaults.search.show_only_matches
24610 * @plugin search
24611 */
24612 show_only_matches : false,
24613 /**
24614 * Indicates if all nodes opened to reveal the search result, should be closed when the search is cleared or a new search is performed. Default is `true`.
24615 * @name $.jstree.defaults.search.close_opened_onclear
24616 * @plugin search
24617 */
24618 close_opened_onclear : true,
24619 /**
24620 * Indicates if only leaf nodes should be included in search results. Default is `false`.
24621 * @name $.jstree.defaults.search.search_leaves_only
24622 * @plugin search
24623 */
24624 search_leaves_only : false,
24625 /**
24626 * If set to a function it wil be called in the instance's scope with two arguments - search string and node (where node will be every node in the structure, so use with caution).
24627 * If the function returns a truthy value the node will be considered a match (it might not be displayed if search_only_leaves is set to true and the node is not a leaf). Default is `false`.
24628 * @name $.jstree.defaults.search.search_callback
24629 * @plugin search
24630 */
24631 search_callback : false
24632 };
24633
24634 $.jstree.plugins.search = function (options, parent) {
24635 this.bind = function () {
24636 parent.bind.call(this);
24637
24638 this._data.search.str = "";
24639 this._data.search.dom = $();
24640 this._data.search.res = [];
24641 this._data.search.opn = [];
24642 this._data.search.som = false;
24643
24644 this.element
24645 .on('before_open.jstree', $.proxy(function (e, data) {
24646 var i, j, f, r = this._data.search.res, s = [], o = $();
24647 if(r && r.length) {
24648 this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #')));
24649 this._data.search.dom.children(".jstree-anchor").addClass('jstree-search');
24650 if(this._data.search.som && this._data.search.res.length) {
24651 for(i = 0, j = r.length; i < j; i++) {
24652 s = s.concat(this.get_node(r[i]).parents);
24653 }
24654 s = $.vakata.array_remove_item($.vakata.array_unique(s),'#');
24655 o = s.length ? $(this.element[0].querySelectorAll('#' + $.map(s, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #'))) : $();
24656
24657 this.element.find(".jstree-node").hide().filter('.jstree-last').filter(function() { return this.nextSibling; }).removeClass('jstree-last');
24658 o = o.add(this._data.search.dom);
24659 o.parentsUntil(".jstree").addBack().show()
24660 .filter(".jstree-children").each(function () { $(this).children(".jstree-node:visible").eq(-1).addClass("jstree-last"); });
24661 }
24662 }
24663 }, this))
24664 .on("search.jstree", $.proxy(function (e, data) {
24665 if(this._data.search.som) {
24666 if(data.nodes.length) {
24667 this.element.find(".jstree-node").hide().filter('.jstree-last').filter(function() { return this.nextSibling; }).removeClass('jstree-last');
24668 data.nodes.parentsUntil(".jstree").addBack().show()
24669 .filter(".jstree-children").each(function () { $(this).children(".jstree-node:visible").eq(-1).addClass("jstree-last"); });
24670 }
24671 }
24672 }, this))
24673 .on("clear_search.jstree", $.proxy(function (e, data) {
24674 if(this._data.search.som && data.nodes.length) {
24675 this.element.find(".jstree-node").css("display","").filter('.jstree-last').filter(function() { return this.nextSibling; }).removeClass('jstree-last');
24676 }
24677 }, this));
24678 };
24679 /**
24680 * used to search the tree nodes for a given string
24681 * @name search(str [, skip_async])
24682 * @param {String} str the search string
24683 * @param {Boolean} skip_async if set to true server will not be queried even if configured
24684 * @param {Boolean} show_only_matches if set to true only matching nodes will be shown (keep in mind this can be very slow on large trees or old browsers)
24685 * @plugin search
24686 * @trigger search.jstree
24687 */
24688 this.search = function (str, skip_async, show_only_matches) {
24689 if(str === false || $.trim(str.toString()) === "") {
24690 return this.clear_search();
24691 }
24692 str = str.toString();
24693 var s = this.settings.search,
24694 a = s.ajax ? s.ajax : false,
24695 f = null,
24696 r = [],
24697 p = [], i, j;
24698 if(this._data.search.res.length) {
24699 this.clear_search();
24700 }
24701 if(show_only_matches === undefined) {
24702 show_only_matches = s.show_only_matches;
24703 }
24704 if(!skip_async && a !== false) {
24705 if($.isFunction(a)) {
24706 return a.call(this, str, $.proxy(function (d) {
24707 if(d && d.d) { d = d.d; }
24708 this._load_nodes(!$.isArray(d) ? [] : $.vakata.array_unique(d), function () {
24709 this.search(str, true, show_only_matches);
24710 }, true);
24711 }, this));
24712 }
24713 else {
24714 a = $.extend({}, a);
24715 if(!a.data) { a.data = {}; }
24716 a.data.str = str;
24717 return $.ajax(a)
24718 .fail($.proxy(function () {
24719 this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'search', 'id' : 'search_01', 'reason' : 'Could not load search parents', 'data' : JSON.stringify(a) };
24720 this.settings.core.error.call(this, this._data.core.last_error);
24721 }, this))
24722 .done($.proxy(function (d) {
24723 if(d && d.d) { d = d.d; }
24724 this._load_nodes(!$.isArray(d) ? [] : $.vakata.array_unique(d), function () {
24725 this.search(str, true, show_only_matches);
24726 }, true);
24727 }, this));
24728 }
24729 }
24730 this._data.search.str = str;
24731 this._data.search.dom = $();
24732 this._data.search.res = [];
24733 this._data.search.opn = [];
24734 this._data.search.som = show_only_matches;
24735
24736 f = new $.vakata.search(str, true, { caseSensitive : s.case_sensitive, fuzzy : s.fuzzy });
24737
24738 $.each(this._model.data, function (i, v) {
24739 if(v.text && ( (s.search_callback && s.search_callback.call(this, str, v)) || (!s.search_callback && f.search(v.text).isMatch) ) && (!s.search_leaves_only || (v.state.loaded && v.children.length === 0)) ) {
24740 r.push(i);
24741 p = p.concat(v.parents);
24742 }
24743 });
24744 if(r.length) {
24745 p = $.vakata.array_unique(p);
24746 this._search_open(p);
24747 this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #')));
24748 this._data.search.res = r;
24749 this._data.search.dom.children(".jstree-anchor").addClass('jstree-search');
24750 }
24751 /**
24752 * triggered after search is complete
24753 * @event
24754 * @name search.jstree
24755 * @param {jQuery} nodes a jQuery collection of matching nodes
24756 * @param {String} str the search string
24757 * @param {Array} res a collection of objects represeing the matching nodes
24758 * @plugin search
24759 */
24760 this.trigger('search', { nodes : this._data.search.dom, str : str, res : this._data.search.res, show_only_matches : show_only_matches });
24761 };
24762 /**
24763 * used to clear the last search (removes classes and shows all nodes if filtering is on)
24764 * @name clear_search()
24765 * @plugin search
24766 * @trigger clear_search.jstree
24767 */
24768 this.clear_search = function () {
24769 this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search");
24770 if(this.settings.search.close_opened_onclear) {
24771 this.close_node(this._data.search.opn, 0);
24772 }
24773 /**
24774 * triggered after search is complete
24775 * @event
24776 * @name clear_search.jstree
24777 * @param {jQuery} nodes a jQuery collection of matching nodes (the result from the last search)
24778 * @param {String} str the search string (the last search string)
24779 * @param {Array} res a collection of objects represeing the matching nodes (the result from the last search)
24780 * @plugin search
24781 */
24782 this.trigger('clear_search', { 'nodes' : this._data.search.dom, str : this._data.search.str, res : this._data.search.res });
24783 this._data.search.str = "";
24784 this._data.search.res = [];
24785 this._data.search.opn = [];
24786 this._data.search.dom = $();
24787 };
24788 /**
24789 * opens nodes that need to be opened to reveal the search results. Used only internally.
24790 * @private
24791 * @name _search_open(d)
24792 * @param {Array} d an array of node IDs
24793 * @plugin search
24794 */
24795 this._search_open = function (d) {
24796 var t = this;
24797 $.each(d.concat([]), function (i, v) {
24798 if(v === "#") { return true; }
24799 try { v = $('#' + v.replace($.jstree.idregex,'\\$&'), t.element); } catch(ignore) { }
24800 if(v && v.length) {
24801 if(t.is_closed(v)) {
24802 t._data.search.opn.push(v[0].id);
24803 t.open_node(v, function () { t._search_open(d); }, 0);
24804 }
24805 }
24806 });
24807 };
24808 };
24809
24810 // helpers
24811 (function ($) {
24812 // from http://kiro.me/projects/fuse.html
24813 $.vakata.search = function(pattern, txt, options) {
24814 options = options || {};
24815 if(options.fuzzy !== false) {
24816 options.fuzzy = true;
24817 }
24818 pattern = options.caseSensitive ? pattern : pattern.toLowerCase();
24819 var MATCH_LOCATION = options.location || 0,
24820 MATCH_DISTANCE = options.distance || 100,
24821 MATCH_THRESHOLD = options.threshold || 0.6,
24822 patternLen = pattern.length,
24823 matchmask, pattern_alphabet, match_bitapScore, search;
24824 if(patternLen > 32) {
24825 options.fuzzy = false;
24826 }
24827 if(options.fuzzy) {
24828 matchmask = 1 << (patternLen - 1);
24829 pattern_alphabet = (function () {
24830 var mask = {},
24831 i = 0;
24832 for (i = 0; i < patternLen; i++) {
24833 mask[pattern.charAt(i)] = 0;
24834 }
24835 for (i = 0; i < patternLen; i++) {
24836 mask[pattern.charAt(i)] |= 1 << (patternLen - i - 1);
24837 }
24838 return mask;
24839 }());
24840 match_bitapScore = function (e, x) {
24841 var accuracy = e / patternLen,
24842 proximity = Math.abs(MATCH_LOCATION - x);
24843 if(!MATCH_DISTANCE) {
24844 return proximity ? 1.0 : accuracy;
24845 }
24846 return accuracy + (proximity / MATCH_DISTANCE);
24847 };
24848 }
24849 search = function (text) {
24850 text = options.caseSensitive ? text : text.toLowerCase();
24851 if(pattern === text || text.indexOf(pattern) !== -1) {
24852 return {
24853 isMatch: true,
24854 score: 0
24855 };
24856 }
24857 if(!options.fuzzy) {
24858 return {
24859 isMatch: false,
24860 score: 1
24861 };
24862 }
24863 var i, j,
24864 textLen = text.length,
24865 scoreThreshold = MATCH_THRESHOLD,
24866 bestLoc = text.indexOf(pattern, MATCH_LOCATION),
24867 binMin, binMid,
24868 binMax = patternLen + textLen,
24869 lastRd, start, finish, rd, charMatch,
24870 score = 1,
24871 locations = [];
24872 if (bestLoc !== -1) {
24873 scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);
24874 bestLoc = text.lastIndexOf(pattern, MATCH_LOCATION + patternLen);
24875 if (bestLoc !== -1) {
24876 scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);
24877 }
24878 }
24879 bestLoc = -1;
24880 for (i = 0; i < patternLen; i++) {
24881 binMin = 0;
24882 binMid = binMax;
24883 while (binMin < binMid) {
24884 if (match_bitapScore(i, MATCH_LOCATION + binMid) <= scoreThreshold) {
24885 binMin = binMid;
24886 } else {
24887 binMax = binMid;
24888 }
24889 binMid = Math.floor((binMax - binMin) / 2 + binMin);
24890 }
24891 binMax = binMid;
24892 start = Math.max(1, MATCH_LOCATION - binMid + 1);
24893 finish = Math.min(MATCH_LOCATION + binMid, textLen) + patternLen;
24894 rd = new Array(finish + 2);
24895 rd[finish + 1] = (1 << i) - 1;
24896 for (j = finish; j >= start; j--) {
24897 charMatch = pattern_alphabet[text.charAt(j - 1)];
24898 if (i === 0) {
24899 rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;
24900 } else {
24901 rd[j] = ((rd[j + 1] << 1) | 1) & charMatch | (((lastRd[j + 1] | lastRd[j]) << 1) | 1) | lastRd[j + 1];
24902 }
24903 if (rd[j] & matchmask) {
24904 score = match_bitapScore(i, j - 1);
24905 if (score <= scoreThreshold) {
24906 scoreThreshold = score;
24907 bestLoc = j - 1;
24908 locations.push(bestLoc);
24909 if (bestLoc > MATCH_LOCATION) {
24910 start = Math.max(1, 2 * MATCH_LOCATION - bestLoc);
24911 } else {
24912 break;
24913 }
24914 }
24915 }
24916 }
24917 if (match_bitapScore(i + 1, MATCH_LOCATION) > scoreThreshold) {
24918 break;
24919 }
24920 lastRd = rd;
24921 }
24922 return {
24923 isMatch: bestLoc >= 0,
24924 score: score
24925 };
24926 };
24927 return txt === true ? { 'search' : search } : search(txt);
24928 };
24929 }($));
24930
24931 // include the search plugin by default
24932 // $.jstree.defaults.plugins.push("search");
24933
24934 /**
24935 * ### Sort plugin
24936 *
24937 * Automatically sorts all siblings in the tree according to a sorting function.
24938 */
24939
24940 /**
24941 * the settings function used to sort the nodes.
24942 * It is executed in the tree's context, accepts two nodes as arguments and should return `1` or `-1`.
24943 * @name $.jstree.defaults.sort
24944 * @plugin sort
24945 */
24946 $.jstree.defaults.sort = function (a, b) {
24947 //return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : this.get_type(a) >= this.get_type(b);
24948 return this.get_text(a) > this.get_text(b) ? 1 : -1;
24949 };
24950 $.jstree.plugins.sort = function (options, parent) {
24951 this.bind = function () {
24952 parent.bind.call(this);
24953 this.element
24954 .on("model.jstree", $.proxy(function (e, data) {
24955 this.sort(data.parent, true);
24956 }, this))
24957 .on("rename_node.jstree create_node.jstree", $.proxy(function (e, data) {
24958 this.sort(data.parent || data.node.parent, false);
24959 this.redraw_node(data.parent || data.node.parent, true);
24960 }, this))
24961 .on("move_node.jstree copy_node.jstree", $.proxy(function (e, data) {
24962 this.sort(data.parent, false);
24963 this.redraw_node(data.parent, true);
24964 }, this));
24965 };
24966 /**
24967 * used to sort a node's children
24968 * @private
24969 * @name sort(obj [, deep])
24970 * @param {mixed} obj the node
24971 * @param {Boolean} deep if set to `true` nodes are sorted recursively.
24972 * @plugin sort
24973 * @trigger search.jstree
24974 */
24975 this.sort = function (obj, deep) {
24976 var i, j;
24977 obj = this.get_node(obj);
24978 if(obj && obj.children && obj.children.length) {
24979 obj.children.sort($.proxy(this.settings.sort, this));
24980 if(deep) {
24981 for(i = 0, j = obj.children_d.length; i < j; i++) {
24982 this.sort(obj.children_d[i], false);
24983 }
24984 }
24985 }
24986 };
24987 };
24988
24989 // include the sort plugin by default
24990 // $.jstree.defaults.plugins.push("sort");
24991
24992 /**
24993 * ### State plugin
24994 *
24995 * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc)
24996 */
24997
24998 var to = false;
24999 /**
25000 * stores all defaults for the state plugin
25001 * @name $.jstree.defaults.state
25002 * @plugin state
25003 */
25004 $.jstree.defaults.state = {
25005 /**
25006 * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`.
25007 * @name $.jstree.defaults.state.key
25008 * @plugin state
25009 */
25010 key : 'jstree',
25011 /**
25012 * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`.
25013 * @name $.jstree.defaults.state.events
25014 * @plugin state
25015 */
25016 events : 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree',
25017 /**
25018 * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire.
25019 * @name $.jstree.defaults.state.ttl
25020 * @plugin state
25021 */
25022 ttl : false,
25023 /**
25024 * A function that will be executed prior to restoring state with one argument - the state object. Can be used to clear unwanted parts of the state.
25025 * @name $.jstree.defaults.state.filter
25026 * @plugin state
25027 */
25028 filter : false
25029 };
25030 $.jstree.plugins.state = function (options, parent) {
25031 this.bind = function () {
25032 parent.bind.call(this);
25033 var bind = $.proxy(function () {
25034 this.element.on(this.settings.state.events, $.proxy(function () {
25035 if(to) { clearTimeout(to); }
25036 to = setTimeout($.proxy(function () { this.save_state(); }, this), 100);
25037 }, this));
25038 /**
25039 * triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore).
25040 * @event
25041 * @name state_ready.jstree
25042 * @plugin state
25043 */
25044 this.trigger('state_ready');
25045 }, this);
25046 this.element
25047 .on("ready.jstree", $.proxy(function (e, data) {
25048 this.element.one("restore_state.jstree", bind);
25049 if(!this.restore_state()) { bind(); }
25050 }, this));
25051 };
25052 /**
25053 * save the state
25054 * @name save_state()
25055 * @plugin state
25056 */
25057 this.save_state = function () {
25058 var st = { 'state' : this.get_state(), 'ttl' : this.settings.state.ttl, 'sec' : +(new Date()) };
25059 $.vakata.storage.set(this.settings.state.key, JSON.stringify(st));
25060 };
25061 /**
25062 * restore the state from the user's computer
25063 * @name restore_state()
25064 * @plugin state
25065 */
25066 this.restore_state = function () {
25067 var k = $.vakata.storage.get(this.settings.state.key);
25068 if(!!k) { try { k = JSON.parse(k); } catch(ex) { return false; } }
25069 if(!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; }
25070 if(!!k && k.state) { k = k.state; }
25071 if(!!k && $.isFunction(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); }
25072 if(!!k) {
25073 this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state' : $.extend(true, {}, k) }); });
25074 this.set_state(k);
25075 return true;
25076 }
25077 return false;
25078 };
25079 /**
25080 * clear the state on the user's computer
25081 * @name clear_state()
25082 * @plugin state
25083 */
25084 this.clear_state = function () {
25085 return $.vakata.storage.del(this.settings.state.key);
25086 };
25087 };
25088
25089 (function ($, undefined) {
25090 $.vakata.storage = {
25091 // simply specifying the functions in FF throws an error
25092 set : function (key, val) { return window.localStorage.setItem(key, val); },
25093 get : function (key) { return window.localStorage.getItem(key); },
25094 del : function (key) { return window.localStorage.removeItem(key); }
25095 };
25096 }($));
25097
25098 // include the state plugin by default
25099 // $.jstree.defaults.plugins.push("state");
25100
25101 /**
25102 * ### Types plugin
25103 *
25104 * Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group.
25105 */
25106
25107 /**
25108 * An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional).
25109 *
25110 * * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited.
25111 * * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited.
25112 * * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits.
25113 * * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme.
25114 *
25115 * There are two predefined types:
25116 *
25117 * * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes.
25118 * * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified.
25119 *
25120 * @name $.jstree.defaults.types
25121 * @plugin types
25122 */
25123 $.jstree.defaults.types = {
25124 '#' : {},
25125 'default' : {}
25126 };
25127
25128 $.jstree.plugins.types = function (options, parent) {
25129 this.init = function (el, options) {
25130 var i, j;
25131 if(options && options.types && options.types['default']) {
25132 for(i in options.types) {
25133 if(i !== "default" && i !== "#" && options.types.hasOwnProperty(i)) {
25134 for(j in options.types['default']) {
25135 if(options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) {
25136 options.types[i][j] = options.types['default'][j];
25137 }
25138 }
25139 }
25140 }
25141 }
25142 parent.init.call(this, el, options);
25143 this._model.data['#'].type = '#';
25144 };
25145 this.refresh = function (skip_loading, forget_state) {
25146 parent.refresh.call(this, skip_loading, forget_state);
25147 this._model.data['#'].type = '#';
25148 };
25149 this.bind = function () {
25150 this.element
25151 .on('model.jstree', $.proxy(function (e, data) {
25152 var m = this._model.data,
25153 dpc = data.nodes,
25154 t = this.settings.types,
25155 i, j, c = 'default';
25156 for(i = 0, j = dpc.length; i < j; i++) {
25157 c = 'default';
25158 if(m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) {
25159 c = m[dpc[i]].original.type;
25160 }
25161 if(m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) {
25162 c = m[dpc[i]].data.jstree.type;
25163 }
25164 m[dpc[i]].type = c;
25165 if(m[dpc[i]].icon === true && t[c].icon !== undefined) {
25166 m[dpc[i]].icon = t[c].icon;
25167 }
25168 }
25169 m['#'].type = '#';
25170 }, this));
25171 parent.bind.call(this);
25172 };
25173 this.get_json = function (obj, options, flat) {
25174 var i, j,
25175 m = this._model.data,
25176 opt = options ? $.extend(true, {}, options, {no_id:false}) : {},
25177 tmp = parent.get_json.call(this, obj, opt, flat);
25178 if(tmp === false) { return false; }
25179 if($.isArray(tmp)) {
25180 for(i = 0, j = tmp.length; i < j; i++) {
25181 tmp[i].type = tmp[i].id && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : "default";
25182 if(options && options.no_id) {
25183 delete tmp[i].id;
25184 if(tmp[i].li_attr && tmp[i].li_attr.id) {
25185 delete tmp[i].li_attr.id;
25186 }
25187 if(tmp[i].a_attr && tmp[i].a_attr.id) {
25188 delete tmp[i].a_attr.id;
25189 }
25190 }
25191 }
25192 }
25193 else {
25194 tmp.type = tmp.id && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : "default";
25195 if(options && options.no_id) {
25196 tmp = this._delete_ids(tmp);
25197 }
25198 }
25199 return tmp;
25200 };
25201 this._delete_ids = function (tmp) {
25202 if($.isArray(tmp)) {
25203 for(var i = 0, j = tmp.length; i < j; i++) {
25204 tmp[i] = this._delete_ids(tmp[i]);
25205 }
25206 return tmp;
25207 }
25208 delete tmp.id;
25209 if(tmp.li_attr && tmp.li_attr.id) {
25210 delete tmp.li_attr.id;
25211 }
25212 if(tmp.a_attr && tmp.a_attr.id) {
25213 delete tmp.a_attr.id;
25214 }
25215 if(tmp.children && $.isArray(tmp.children)) {
25216 tmp.children = this._delete_ids(tmp.children);
25217 }
25218 return tmp;
25219 };
25220 this.check = function (chk, obj, par, pos, more) {
25221 if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
25222 obj = obj && obj.id ? obj : this.get_node(obj);
25223 par = par && par.id ? par : this.get_node(par);
25224 var m = obj && obj.id ? $.jstree.reference(obj.id) : null, tmp, d, i, j;
25225 m = m && m._model && m._model.data ? m._model.data : null;
25226 switch(chk) {
25227 case "create_node":
25228 case "move_node":
25229 case "copy_node":
25230 if(chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) {
25231 tmp = this.get_rules(par);
25232 if(tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) {
25233 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_01', 'reason' : 'max_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
25234 return false;
25235 }
25236 if(tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray((obj.type || 'default'), tmp.valid_children) === -1) {
25237 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_02', 'reason' : 'valid_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
25238 return false;
25239 }
25240 if(m && obj.children_d && obj.parents) {
25241 d = 0;
25242 for(i = 0, j = obj.children_d.length; i < j; i++) {
25243 d = Math.max(d, m[obj.children_d[i]].parents.length);
25244 }
25245 d = d - obj.parents.length + 1;
25246 }
25247 if(d <= 0 || d === undefined) { d = 1; }
25248 do {
25249 if(tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) {
25250 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_03', 'reason' : 'max_depth prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
25251 return false;
25252 }
25253 par = this.get_node(par.parent);
25254 tmp = this.get_rules(par);
25255 d++;
25256 } while(par);
25257 }
25258 break;
25259 }
25260 return true;
25261 };
25262 /**
25263 * used to retrieve the type settings object for a node
25264 * @name get_rules(obj)
25265 * @param {mixed} obj the node to find the rules for
25266 * @return {Object}
25267 * @plugin types
25268 */
25269 this.get_rules = function (obj) {
25270 obj = this.get_node(obj);
25271 if(!obj) { return false; }
25272 var tmp = this.get_type(obj, true);
25273 if(tmp.max_depth === undefined) { tmp.max_depth = -1; }
25274 if(tmp.max_children === undefined) { tmp.max_children = -1; }
25275 if(tmp.valid_children === undefined) { tmp.valid_children = -1; }
25276 return tmp;
25277 };
25278 /**
25279 * used to retrieve the type string or settings object for a node
25280 * @name get_type(obj [, rules])
25281 * @param {mixed} obj the node to find the rules for
25282 * @param {Boolean} rules if set to `true` instead of a string the settings object will be returned
25283 * @return {String|Object}
25284 * @plugin types
25285 */
25286 this.get_type = function (obj, rules) {
25287 obj = this.get_node(obj);
25288 return (!obj) ? false : ( rules ? $.extend({ 'type' : obj.type }, this.settings.types[obj.type]) : obj.type);
25289 };
25290 /**
25291 * used to change a node's type
25292 * @name set_type(obj, type)
25293 * @param {mixed} obj the node to change
25294 * @param {String} type the new type
25295 * @plugin types
25296 */
25297 this.set_type = function (obj, type) {
25298 var t, t1, t2, old_type, old_icon;
25299 if($.isArray(obj)) {
25300 obj = obj.slice();
25301 for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
25302 this.set_type(obj[t1], type);
25303 }
25304 return true;
25305 }
25306 t = this.settings.types;
25307 obj = this.get_node(obj);
25308 if(!t[type] || !obj) { return false; }
25309 old_type = obj.type;
25310 old_icon = this.get_icon(obj);
25311 obj.type = type;
25312 if(old_icon === true || (t[old_type] && t[old_type].icon !== undefined && old_icon === t[old_type].icon)) {
25313 this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true);
25314 }
25315 return true;
25316 };
25317 };
25318 // include the types plugin by default
25319 // $.jstree.defaults.plugins.push("types");
25320
25321 /**
25322 * ### Unique plugin
25323 *
25324 * Enforces that no nodes with the same name can coexist as siblings.
25325 */
25326
25327 /**
25328 * stores all defaults for the unique plugin
25329 * @name $.jstree.defaults.unique
25330 * @plugin unique
25331 */
25332 $.jstree.defaults.unique = {
25333 /**
25334 * Indicates if the comparison should be case sensitive. Default is `false`.
25335 * @name $.jstree.defaults.unique.case_sensitive
25336 * @plugin unique
25337 */
25338 case_sensitive : false,
25339 /**
25340 * A callback executed in the instance's scope when a new node is created and the name is already taken, the two arguments are the conflicting name and the counter. The default will produce results like `New node (2)`.
25341 * @name $.jstree.defaults.unique.duplicate
25342 * @plugin unique
25343 */
25344 duplicate : function (name, counter) {
25345 return name + ' (' + counter + ')';
25346 }
25347 };
25348
25349 $.jstree.plugins.unique = function (options, parent) {
25350 this.check = function (chk, obj, par, pos, more) {
25351 if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
25352 obj = obj && obj.id ? obj : this.get_node(obj);
25353 par = par && par.id ? par : this.get_node(par);
25354 if(!par || !par.children) { return true; }
25355 var n = chk === "rename_node" ? pos : obj.text,
25356 c = [],
25357 s = this.settings.unique.case_sensitive,
25358 m = this._model.data, i, j;
25359 for(i = 0, j = par.children.length; i < j; i++) {
25360 c.push(s ? m[par.children[i]].text : m[par.children[i]].text.toLowerCase());
25361 }
25362 if(!s) { n = n.toLowerCase(); }
25363 switch(chk) {
25364 case "delete_node":
25365 return true;
25366 case "rename_node":
25367 i = ($.inArray(n, c) === -1 || (obj.text && obj.text[ s ? 'toString' : 'toLowerCase']() === n));
25368 if(!i) {
25369 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_01', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
25370 }
25371 return i;
25372 case "create_node":
25373 i = ($.inArray(n, c) === -1);
25374 if(!i) {
25375 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_04', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
25376 }
25377 return i;
25378 case "copy_node":
25379 i = ($.inArray(n, c) === -1);
25380 if(!i) {
25381 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_02', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
25382 }
25383 return i;
25384 case "move_node":
25385 i = (obj.parent === par.id || $.inArray(n, c) === -1);
25386 if(!i) {
25387 this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_03', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
25388 }
25389 return i;
25390 }
25391 return true;
25392 };
25393 this.create_node = function (par, node, pos, callback, is_loaded) {
25394 if(!node || node.text === undefined) {
25395 if(par === null) {
25396 par = "#";
25397 }
25398 par = this.get_node(par);
25399 if(!par) {
25400 return parent.create_node.call(this, par, node, pos, callback, is_loaded);
25401 }
25402 pos = pos === undefined ? "last" : pos;
25403 if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
25404 return parent.create_node.call(this, par, node, pos, callback, is_loaded);
25405 }
25406 if(!node) { node = {}; }
25407 var tmp, n, dpc, i, j, m = this._model.data, s = this.settings.unique.case_sensitive, cb = this.settings.unique.duplicate;
25408 n = tmp = this.get_string('New node');
25409 dpc = [];
25410 for(i = 0, j = par.children.length; i < j; i++) {
25411 dpc.push(s ? m[par.children[i]].text : m[par.children[i]].text.toLowerCase());
25412 }
25413 i = 1;
25414 while($.inArray(s ? n : n.toLowerCase(), dpc) !== -1) {
25415 n = cb.call(this, tmp, (++i)).toString();
25416 }
25417 node.text = n;
25418 }
25419 return parent.create_node.call(this, par, node, pos, callback, is_loaded);
25420 };
25421 };
25422
25423 // include the unique plugin by default
25424 // $.jstree.defaults.plugins.push("unique");
25425
25426
25427 /**
25428 * ### Wholerow plugin
25429 *
25430 * Makes each node appear block level. Making selection easier. May cause slow down for large trees in old browsers.
25431 */
25432
25433 var div = document.createElement('DIV');
25434 div.setAttribute('unselectable','on');
25435 div.setAttribute('role','presentation');
25436 div.className = 'jstree-wholerow';
25437 div.innerHTML = '&#160;';
25438 $.jstree.plugins.wholerow = function (options, parent) {
25439 this.bind = function () {
25440 parent.bind.call(this);
25441
25442 this.element
25443 .on('ready.jstree set_state.jstree', $.proxy(function () {
25444 this.hide_dots();
25445 }, this))
25446 .on("init.jstree loading.jstree ready.jstree", $.proxy(function () {
25447 //div.style.height = this._data.core.li_height + 'px';
25448 this.get_container_ul().addClass('jstree-wholerow-ul');
25449 }, this))
25450 .on("deselect_all.jstree", $.proxy(function (e, data) {
25451 this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');
25452 }, this))
25453 .on("changed.jstree", $.proxy(function (e, data) {
25454 this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');
25455 var tmp = false, i, j;
25456 for(i = 0, j = data.selected.length; i < j; i++) {
25457 tmp = this.get_node(data.selected[i], true);
25458 if(tmp && tmp.length) {
25459 tmp.children('.jstree-wholerow').addClass('jstree-wholerow-clicked');
25460 }
25461 }
25462 }, this))
25463 .on("open_node.jstree", $.proxy(function (e, data) {
25464 this.get_node(data.node, true).find('.jstree-clicked').parent().children('.jstree-wholerow').addClass('jstree-wholerow-clicked');
25465 }, this))
25466 .on("hover_node.jstree dehover_node.jstree", $.proxy(function (e, data) {
25467 if(e.type === "hover_node" && this.is_disabled(data.node)) { return; }
25468 this.get_node(data.node, true).children('.jstree-wholerow')[e.type === "hover_node"?"addClass":"removeClass"]('jstree-wholerow-hovered');
25469 }, this))
25470 .on("contextmenu.jstree", ".jstree-wholerow", $.proxy(function (e) {
25471 e.preventDefault();
25472 var tmp = $.Event('contextmenu', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey, pageX : e.pageX, pageY : e.pageY });
25473 $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp);
25474 }, this))
25475 .on("click.jstree", ".jstree-wholerow", function (e) {
25476 e.stopImmediatePropagation();
25477 var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
25478 $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).focus();
25479 })
25480 .on("click.jstree", ".jstree-leaf > .jstree-ocl", $.proxy(function (e) {
25481 e.stopImmediatePropagation();
25482 var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
25483 $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).focus();
25484 }, this))
25485 .on("mouseover.jstree", ".jstree-wholerow, .jstree-icon", $.proxy(function (e) {
25486 e.stopImmediatePropagation();
25487 if(!this.is_disabled(e.currentTarget)) {
25488 this.hover_node(e.currentTarget);
25489 }
25490 return false;
25491 }, this))
25492 .on("mouseleave.jstree", ".jstree-node", $.proxy(function (e) {
25493 this.dehover_node(e.currentTarget);
25494 }, this));
25495 };
25496 this.teardown = function () {
25497 if(this.settings.wholerow) {
25498 this.element.find(".jstree-wholerow").remove();
25499 }
25500 parent.teardown.call(this);
25501 };
25502 this.redraw_node = function(obj, deep, callback, force_render) {
25503 obj = parent.redraw_node.apply(this, arguments);
25504 if(obj) {
25505 var tmp = div.cloneNode(true);
25506 //tmp.style.height = this._data.core.li_height + 'px';
25507 if($.inArray(obj.id, this._data.core.selected) !== -1) { tmp.className += ' jstree-wholerow-clicked'; }
25508 if(this._data.core.focused && this._data.core.focused === obj.id) { tmp.className += ' jstree-wholerow-hovered'; }
25509 obj.insertBefore(tmp, obj.childNodes[0]);
25510 }
25511 return obj;
25512 };
25513 };
25514 // include the wholerow plugin by default
25515 // $.jstree.defaults.plugins.push("wholerow");
25516
25517
25518 (function ($) {
25519 if(document.registerElement && Object && Object.create) {
25520 var proto = Object.create(HTMLElement.prototype);
25521 proto.createdCallback = function () {
25522 var c = { core : {}, plugins : [] }, i;
25523 for(i in $.jstree.plugins) {
25524 if($.jstree.plugins.hasOwnProperty(i) && this.attributes[i]) {
25525 c.plugins.push(i);
25526 if(this.getAttribute(i) && JSON.parse(this.getAttribute(i))) {
25527 c[i] = JSON.parse(this.getAttribute(i));
25528 }
25529 }
25530 }
25531 for(i in $.jstree.defaults.core) {
25532 if($.jstree.defaults.core.hasOwnProperty(i) && this.attributes[i]) {
25533 c.core[i] = JSON.parse(this.getAttribute(i)) || this.getAttribute(i);
25534 }
25535 }
25536 jQuery(this).jstree(c);
25537 };
25538 // proto.attributeChangedCallback = function (name, previous, value) { };
25539 try {
25540 document.registerElement("vakata-jstree", { prototype: proto });
25541 } catch(ignore) { }
25542 }
25543 }(jQuery));
25544 }));
25545 /*! 18306 /*!
25546 18307
25547 JSZip - A Javascript class for generating and reading zip files 18308 JSZip - A Javascript class for generating and reading zip files
25548 <http://stuartk.com/jszip> 18309 <http://stuartk.com/jszip>
25549 18310
25797 var XLS={};(function make_xls(XLS){XLS.version="0.7.1";var current_codepage=1252,current_cptable;if(typeof module!=="undefined"&&typeof require!=="undefined"){if(typeof cptable==="undefined")cptable=require("./dist/cpexcel");current_cptable=cptable[current_codepage]}function reset_cp(){set_cp(1252)}function set_cp(cp){current_codepage=cp;if(typeof cptable!=="undefined")current_cptable=cptable[cp]}var _getchar=function _gc1(x){return String.fromCharCode(x)};if(typeof cptable!=="undefined")_getchar=function _gc2(x){if(current_codepage===1200)return String.fromCharCode(x);return cptable.utils.decode(current_codepage,[x&255,x>>8])[0]};var has_buf=typeof Buffer!=="undefined";function new_buf(len){return new(has_buf?Buffer:Array)(len)}var Base64=function make_b64(){var map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return{decode:function b64_decode(input,utf8){var o="";var c1,c2,c3;var e1,e2,e3,e4;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");for(var i=0;i<input.length;){e1=map.indexOf(input.charAt(i++));e2=map.indexOf(input.charAt(i++));e3=map.indexOf(input.charAt(i++));e4=map.indexOf(input.charAt(i++));c1=e1<<2|e2>>4;c2=(e2&15)<<4|e3>>2;c3=(e3&3)<<6|e4;o+=String.fromCharCode(c1);if(e3!=64){o+=String.fromCharCode(c2)}if(e4!=64){o+=String.fromCharCode(c3)}}return o}}}();function s2a(s){if(has_buf)return new Buffer(s,"binary");var w=s.split("").map(function(x){return x.charCodeAt(0)&255});return w}function readIEEE754(buf,idx,isLE,nl,ml){if(isLE===undefined)isLE=true;if(!nl)nl=8;if(!ml&&nl===8)ml=52;var e,m,el=nl*8-ml-1,eMax=(1<<el)-1,eBias=eMax>>1;var bits=-7,d=isLE?-1:1,i=isLE?nl-1:0,s=buf[idx+i];i+=d;e=s&(1<<-bits)-1;s>>>=-bits;bits+=el;for(;bits>0;e=e*256+buf[idx+i],i+=d,bits-=8);m=e&(1<<-bits)-1;e>>>=-bits;bits+=ml;for(;bits>0;m=m*256+buf[idx+i],i+=d,bits-=8);if(e===eMax)return m?NaN:(s?-1:1)*Infinity;else if(e===0)e=1-eBias;else{m=m+Math.pow(2,ml);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-ml)}var chr0=/\u0000/g,chr1=/[\u0001-\u0006]/;var __toBuffer,___toBuffer;__toBuffer=___toBuffer=function toBuffer_(bufs){var x=[];for(var i=0;i<bufs[0].length;++i){x.push.apply(x,bufs[0][i])}return x};var __utf16le,___utf16le;__utf16le=___utf16le=function utf16le_(b,s,e){var ss=[];for(var i=s;i<e;i+=2)ss.push(String.fromCharCode(__readUInt16LE(b,i)));return ss.join("")};var __hexlify,___hexlify;__hexlify=___hexlify=function hexlify_(b,s,l){return b.slice(s,s+l).map(function(x){return(x<16?"0":"")+x.toString(16)}).join("")};var __utf8,___utf8;__utf8=___utf8=function(b,s,e){var ss=[];for(var i=s;i<e;i++)ss.push(String.fromCharCode(__readUInt8(b,i)));return ss.join("")};var __lpstr,___lpstr;__lpstr=___lpstr=function lpstr_(b,i){var len=__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):""};var __lpwstr,___lpwstr;__lpwstr=___lpwstr=function lpwstr_(b,i){var len=2*__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):""};var __double,___double;__double=___double=function(b,idx){return readIEEE754(b,idx)};var bconcat=function(bufs){return[].concat.apply([],bufs)};if(typeof Buffer!=="undefined"){__utf16le=function utf16le_b(b,s,e){if(!Buffer.isBuffer(b))return ___utf16le(b,s,e);return b.toString("utf16le",s,e)};__hexlify=function(b,s,l){return Buffer.isBuffer(b)?b.toString("hex",s,s+l):___hexlify(b,s,l)};__lpstr=function lpstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpstr(b,i);var len=b.readUInt32LE(i);return len>0?b.toString("utf8",i+4,i+4+len-1):""};__lpwstr=function lpwstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpwstr(b,i);var len=2*b.readUInt32LE(i);return b.toString("utf16le",i+4,i+4+len-1)};__utf8=function utf8_b(s,e){return this.toString("utf8",s,e)};__toBuffer=function(bufs){return bufs[0].length>0&&Buffer.isBuffer(bufs[0][0])?Buffer.concat(bufs[0]):___toBuffer(bufs)};bconcat=function(bufs){return Buffer.isBuffer(bufs[0])?Buffer.concat(bufs):[].concat.apply([],bufs)};__double=function double_(b,i){if(Buffer.isBuffer(b))return b.readDoubleLE(i);return ___double(b,i)}}var __readUInt8=function(b,idx){return b[idx]};var __readUInt16LE=function(b,idx){return b[idx+1]*(1<<8)+b[idx]};var __readInt16LE=function(b,idx){var u=b[idx+1]*(1<<8)+b[idx];return u<32768?u:(65535-u+1)*-1};var __readUInt32LE=function(b,idx){return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]};var __readInt32LE=function(b,idx){return b[idx+3]<<24|b[idx+2]<<16|b[idx+1]<<8|b[idx]};var ___unhexlify=function(s){return s.match(/../g).map(function(x){return parseInt(x,16)})};var __unhexlify=typeof Buffer!=="undefined"?function(s){return Buffer.isBuffer(s)?new Buffer(s,"hex"):___unhexlify(s)}:___unhexlify;if(typeof cptable!=="undefined"){__utf16le=function(b,s,e){return cptable.utils.decode(1200,b.slice(s,e))};__utf8=function(b,s,e){return cptable.utils.decode(65001,b.slice(s,e))};__lpstr=function(b,i){var len=__readUInt32LE(b,i);return len>0?cptable.utils.decode(current_codepage,b.slice(i+4,i+4+len-1)):""};__lpwstr=function(b,i){var len=2*__readUInt32LE(b,i);return len>0?cptable.utils.decode(1200,b.slice(i+4,i+4+len-1)):""}}function ReadShift(size,t){var o,oI,oR,oo=[],w,vv,i,loc;switch(t){case"lpstr":o=__lpstr(this,this.l);size=5+o.length;break;case"lpwstr":o=__lpwstr(this,this.l);size=5+o.length;if(o[o.length-1]=="\x00")size+=2;break;case"cstr":size=0;o="";while((w=__readUInt8(this,this.l+size++))!==0)oo.push(_getchar(w));o=oo.join("");break;case"wstr":size=0;o="";while((w=__readUInt16LE(this,this.l+size))!==0){oo.push(_getchar(w));size+=2}size+=2;o=oo.join("");break;case"dbcs":o="";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?"dbcs":"sbcs");return oo.join("")+vv}oo.push(_getchar(__readUInt16LE(this,loc)));loc+=2}o=oo.join("");size*=2;break;case"sbcs":o="";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?"dbcs":"sbcs");return oo.join("")+vv}oo.push(_getchar(__readUInt8(this,loc)));loc+=1}o=oo.join("");break;case"utf8":o=__utf8(this,this.l,this.l+size);break;case"utf16le":size*=2;o=__utf16le(this,this.l,this.l+size);break;default:switch(size){case 1:oI=__readUInt8(this,this.l);this.l++;return oI;case 2:oI=t!=="i"?__readUInt16LE(this,this.l):__readInt16LE(this,this.l);this.l+=2;return oI;case 4:if(t==="i"||(this[this.l+3]&128)===0){oI=__readInt32LE(this,this.l);this.l+=4;return oI}else{oR=__readUInt32LE(this,this.l);this.l+=4;return oR}break;case 8:if(t==="f"){oR=__double(this,this.l);this.l+=8;return oR}case 16:o=__hexlify(this,this.l,size);break}}this.l+=size;return o}function CheckField(hexstr,fld){var m=__hexlify(this,this.l,hexstr.length>>1);if(m!==hexstr)throw fld+"Expected "+hexstr+" saw "+m;this.l+=hexstr.length>>1}function prep_blob(blob,pos){blob.l=pos;blob.read_shift=ReadShift;blob.chk=CheckField}var SSF={};var make_ssf=function make_ssf(SSF){SSF.version="0.8.1";function _strrev(x){var o="",i=x.length-1;while(i>=0)o+=x.charAt(i--);return o}function fill(c,l){var o="";while(o.length<l)o+=c;return o}function pad0(v,d){var t=""+v;return t.length>=d?t:fill("0",d-t.length)+t}function pad_(v,d){var t=""+v;return t.length>=d?t:fill(" ",d-t.length)+t}function rpad_(v,d){var t=""+v;return t.length>=d?t:t+fill(" ",d-t.length)}function pad0r1(v,d){var t=""+Math.round(v);return t.length>=d?t:fill("0",d-t.length)+t}function pad0r2(v,d){var t=""+v;return t.length>=d?t:fill("0",d-t.length)+t}var p2_32=Math.pow(2,32);function pad0r(v,d){if(v>p2_32||v<-p2_32)return pad0r1(v,d);var i=Math.round(v);return pad0r2(i,d)}function isgeneral(s,i){return s.length>=7+i&&(s.charCodeAt(i)|32)===103&&(s.charCodeAt(i+1)|32)===101&&(s.charCodeAt(i+2)|32)===110&&(s.charCodeAt(i+3)|32)===101&&(s.charCodeAt(i+4)|32)===114&&(s.charCodeAt(i+5)|32)===97&&(s.charCodeAt(i+6)|32)===108}var opts_fmt=[["date1904",0],["output",""],["WTF",false]];function fixopts(o){for(var y=0;y!=opts_fmt.length;++y)if(o[opts_fmt[y][0]]===undefined)o[opts_fmt[y][0]]=opts_fmt[y][1]}SSF.opts=opts_fmt;var table_fmt={0:"General",1:"0",2:"0.00",3:"#,##0",4:"#,##0.00",9:"0%",10:"0.00%",11:"0.00E+00",12:"# ?/?",13:"# ??/??",14:"m/d/yy",15:"d-mmm-yy",16:"d-mmm",17:"mmm-yy",18:"h:mm AM/PM",19:"h:mm:ss AM/PM",20:"h:mm",21:"h:mm:ss",22:"m/d/yy h:mm",37:"#,##0 ;(#,##0)",38:"#,##0 ;[Red](#,##0)",39:"#,##0.00;(#,##0.00)",40:"#,##0.00;[Red](#,##0.00)",45:"mm:ss",46:"[h]:mm:ss",47:"mmss.0",48:"##0.0E+0",49:"@",56:'"上午/下午 "hh"時"mm"分"ss"秒 "',65535:"General"};var days=[["Sun","Sunday"],["Mon","Monday"],["Tue","Tuesday"],["Wed","Wednesday"],["Thu","Thursday"],["Fri","Friday"],["Sat","Saturday"]];var months=[["J","Jan","January"],["F","Feb","February"],["M","Mar","March"],["A","Apr","April"],["M","May","May"],["J","Jun","June"],["J","Jul","July"],["A","Aug","August"],["S","Sep","September"],["O","Oct","October"],["N","Nov","November"],["D","Dec","December"]];function frac(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-A<5e-10)break;B=1/(B-A);P_2=P_1;P_1=P;Q_2=Q_1;Q_1=Q}if(Q>D){Q=Q_1;P=P_1}if(Q>D){Q=Q_2;P=P_2}if(!mixed)return[0,sgn*P,Q];if(Q===0)throw"Unexpected state: "+P+" "+P_1+" "+P_2+" "+Q+" "+Q_1+" "+Q_2;var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]}function general_fmt_int(v,opts){return""+v}SSF._general_int=general_fmt_int;var general_fmt_num=function make_general_fmt_num(){var gnr1=/\.(\d*[1-9])0+$/,gnr2=/\.0*$/,gnr4=/\.(\d*[1-9])0+/,gnr5=/\.0*[Ee]/,gnr6=/(E[+-])(\d)$/;function gfn2(v){var w=v<0?12:11;var o=gfn5(v.toFixed(12));if(o.length<=w)return o;o=v.toPrecision(10);if(o.length<=w)return o;return v.toExponential(5)}function gfn3(v){var o=v.toFixed(11).replace(gnr1,".$1");if(o.length>(v<0?12:11))o=v.toPrecision(6);return o}function gfn4(o){for(var i=0;i!=o.length;++i)if((o.charCodeAt(i)|32)===101)return o.replace(gnr4,".$1").replace(gnr5,"E").replace("e","E").replace(gnr6,"$10$2");return o}function gfn5(o){return o.indexOf(".")>-1?o.replace(gnr2,"").replace(gnr1,".$1"):o}return function general_fmt_num(v,opts){var V=Math.floor(Math.log(Math.abs(v))*Math.LOG10E),o;if(V>=-4&&V<=-1)o=v.toPrecision(10+V);else if(Math.abs(V)<=9)o=gfn2(v);else if(V===10)o=v.toFixed(10).substr(0,12);else o=gfn3(v);return gfn5(gfn4(o))}}();SSF._general_num=general_fmt_num;function general_fmt(v,opts){switch(typeof v){case"string":return v;case"boolean":return v?"TRUE":"FALSE";case"number":return(v|0)===v?general_fmt_int(v,opts):general_fmt_num(v,opts)}throw new Error("unsupported value in General format: "+v)}SSF._general=general_fmt;function fix_hijri(date,o){return 0}function parse_date_code(v,opts,b2){if(v>2958465||v<0)return null;var date=v|0,time=Math.floor(86400*(v-date)),dow=0;var dout=[];var out={D:date,T:time,u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};if(Math.abs(out.u)<1e-6)out.u=0;fixopts(opts!=null?opts:opts=[]);if(opts.date1904)date+=1462;if(out.u>.999){out.u=0;if(++time==86400){time=0;++date}}if(date===60){dout=b2?[1317,10,29]:[1900,2,29];dow=3}else if(date===0){dout=b2?[1317,8,29]:[1900,1,0];dow=6}else{if(date>60)--date;var d=new Date(1900,0,1);d.setDate(d.getDate()+date-1);dout=[d.getFullYear(),d.getMonth()+1,d.getDate()];dow=d.getDay();if(date<60)dow=(dow+6)%7;if(b2)dow=fix_hijri(d,dout)}out.y=dout[0];out.m=dout[1];out.d=dout[2];out.S=time%60;time=Math.floor(time/60);out.M=time%60;time=Math.floor(time/60);out.H=time;out.q=dow;return out}SSF.parse_date_code=parse_date_code;function write_date(type,fmt,val,ss0){var o="",ss=0,tt=0,y=val.y,out,outl=0;switch(type){case 98:y=val.y+543;case 121:switch(fmt.length){case 1:case 2:out=y%100;outl=2;break;default:out=y%1e4;outl=4;break}break;case 109:switch(fmt.length){case 1:case 2:out=val.m;outl=fmt.length;break;case 3:return months[val.m-1][1];case 5:return months[val.m-1][0];default:return months[val.m-1][2]}break;case 100:switch(fmt.length){case 1:case 2:out=val.d;outl=fmt.length;break;case 3:return days[val.q][0];default:return days[val.q][1]}break;case 104:switch(fmt.length){case 1:case 2:out=1+(val.H+11)%12;outl=fmt.length;break;default:throw"bad hour format: "+fmt}break;case 72:switch(fmt.length){case 1:case 2:out=val.H;outl=fmt.length;break;default:throw"bad hour format: "+fmt}break;case 77:switch(fmt.length){case 1:case 2:out=val.M;outl=fmt.length;break;default:throw"bad minute format: "+fmt}break;case 115:if(val.u===0)switch(fmt){case"s":case"ss":return pad0(val.S,fmt.length);case".0":case".00":case".000":}switch(fmt){case"s":case"ss":case".0":case".00":case".000":if(ss0>=2)tt=ss0===3?1e3:100;else tt=ss0===1?10:1;ss=Math.round(tt*(val.S+val.u));if(ss>=60*tt)ss=0;if(fmt==="s")return ss===0?"0":""+ss/tt;o=pad0(ss,2+ss0);if(fmt==="ss")return o.substr(0,2);return"."+o.substr(2,fmt.length-1);default:throw"bad second format: "+fmt}case 90:switch(fmt){case"[h]":case"[hh]":out=val.D*24+val.H;break;case"[m]":case"[mm]":out=(val.D*24+val.H)*60+val.M;break;case"[s]":case"[ss]":out=((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u);break;default:throw"bad abstime format: "+fmt}outl=fmt.length===3?1:2;break;case 101:out=y;outl=1}if(outl>0)return pad0(out,outl);else return""}function commaify(s){if(s.length<=3)return s;var j=s.length%3,o=s.substr(0,j);for(;j!=s.length;j+=3)o+=(o.length>0?",":"")+s.substr(j,3);return o}var write_num=function make_write_num(){var pct1=/%/g;function write_num_pct(type,fmt,val){var sfmt=fmt.replace(pct1,""),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill("%",mul)}function write_num_cm(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_exp(fmt,val){var o;var idx=fmt.indexOf("E")-fmt.indexOf(".")-1;if(fmt.match(/^#+0.0E\+0$/)){var period=fmt.indexOf(".");if(period===-1)period=fmt.indexOf("E");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(o.indexOf("e")===-1){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(".")===-1)o=o[0]+"."+o.substr(1)+"E+"+(fakee-o.length+ee);else o+="E+"+(fakee-ee);while(o.substr(0,2)==="0."){o=o[0]+o.substr(2,period)+"."+o.substr(2+period);o=o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.")}o=o.replace(/\+-/,"-")}o=o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+"."+$3.substr(ee)+"E"})}else o=val.toExponential(idx);if(fmt.match(/E\+00$/)&&o.match(/e[+-]\d$/))o=o.substr(0,o.length-1)+"0"+o[o.length-1];if(fmt.match(/E\-/)&&o.match(/e\+/))o=o.replace(/e\+/,"e");return o.replace("e","E")}var frac1=/# (\?+)( ?)\/( ?)(\d+)/;function write_num_f1(r,aval,sign){var den=parseInt(r[4]),rr=Math.round(aval*den),base=Math.floor(rr/den);var myn=rr-base*den,myd=den;return sign+(base===0?"":""+base)+" "+(myn===0?fill(" ",r[1].length+1+r[4].length):pad_(myn,r[1].length)+r[2]+"/"+r[3]+pad0(myd,r[4].length))}function write_num_f2(r,aval,sign){return sign+(aval===0?"":""+aval)+fill(" ",r[1].length+2+r[4].length)}var dec1=/^#*0*\.(0+)/;var closeparen=/\).*[0#]/;var phone=/\(###\) ###\\?-####/;function hashq(str){var o="",cc;for(var i=0;i!=str.length;++i)switch(cc=str.charCodeAt(i)){case 35:break;case 63:o+=" ";break;case 48:o+="0";break;default:o+=String.fromCharCode(cc)}return o}function rnd(val,d){var dd=Math.pow(10,d);return""+Math.round(val*dd)/dd}function dec(val,d){return Math.round((val-Math.floor(val))*Math.pow(10,d))}function flr(val){if(val<2147483647&&val>-2147483648)return""+(val>=0?val|0:val-1|0);return""+Math.floor(val)}function write_num_flt(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");if(val>=0)return write_num_flt("n",ffmt,val);return"("+write_num_flt("n",ffmt,-val)+")"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm(type,fmt,val);if(fmt.indexOf("%")!==-1)return write_num_pct(type,fmt,val);if(fmt.indexOf("E")!==-1)return write_num_exp(fmt,val);if(fmt.charCodeAt(0)===36)return"$"+write_num_flt(type,fmt.substr(fmt[1]==" "?2:1),val);var o,oo;var r,ri,ff,aval=Math.abs(val),sign=val<0?"-":"";if(fmt.match(/^00+$/))return sign+pad0r(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=pad0r(val,0);if(o==="0")o="";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f1(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0r(aval,fmt.length-fmt.indexOf("0"));if((r=fmt.match(dec1))!==null){o=rnd(val,r[1].length).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$,$1){return"."+$1+fill("0",r[1].length-$1.length)});return fmt.indexOf("0.")!==-1?o:o.replace(/^0\./,".")}fmt=fmt.replace(/^#+([0.])/,"$1");if((r=fmt.match(/^(0*)\.(#*)$/))!==null){return sign+rnd(aval,r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".")}if((r=fmt.match(/^#,##0(\.?)$/))!==null)return sign+commaify(pad0r(aval,0));if((r=fmt.match(/^#,##0\.([#0]*0)$/))!==null){return val<0?"-"+write_num_flt(type,fmt,-val):commaify(""+Math.floor(val))+"."+pad0(dec(val,r[1].length),r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);if((r=fmt.match(/^([0#]+)(\\?-([0#]+))+$/))!==null){o=_strrev(write_num_flt(type,fmt.replace(/[\\-]/g,""),val));ri=0;return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==="0"?"0":""}))}if(fmt.match(phone)!==null){o=write_num_flt(type,"##########",val);return"("+o.substr(0,3)+") "+o.substr(3,3)+"-"+o.substr(6)}var oa="";if((r=fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=""+sign;oa=write_num("n",r[1],ff[1]);if(oa[oa.length-1]==" ")oa=oa.substr(0,oa.length-1)+"0";o+=oa+r[2]+"/"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?"":"0"))+" "+(ff[1]?pad_(ff[1],ri)+r[2]+"/"+r[3]+rpad_(ff[2],ri):fill(" ",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=pad0r(val,0);if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0?]+)\.([#0]+)$/))!==null){o=""+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");ri=o.indexOf(".");var lres=fmt.indexOf(".")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\.([#0]*0)$/))!==null){ri=dec(val,r[1].length);return val<0?"-"+write_num_flt(type,fmt,-val):commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$){return"00,"+($$.length<3?pad0(0,3-$$.length):"")+$$})+"."+pad0(ri,r[1].length)}switch(fmt){case"#,###":var x=commaify(pad0r(aval,0));return x!=="0"?sign+x:"";default:}throw new Error("unsupported format |"+fmt+"|")}function write_num_cm2(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_pct2(type,fmt,val){var sfmt=fmt.replace(pct1,""),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill("%",mul)}function write_num_exp2(fmt,val){var o;var idx=fmt.indexOf("E")-fmt.indexOf(".")-1;if(fmt.match(/^#+0.0E\+0$/)){var period=fmt.indexOf(".");if(period===-1)period=fmt.indexOf("E");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(!o.match(/[Ee]/)){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(".")===-1)o=o[0]+"."+o.substr(1)+"E+"+(fakee-o.length+ee);else o+="E+"+(fakee-ee);o=o.replace(/\+-/,"-")}o=o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+"."+$3.substr(ee)+"E"})}else o=val.toExponential(idx);if(fmt.match(/E\+00$/)&&o.match(/e[+-]\d$/))o=o.substr(0,o.length-1)+"0"+o[o.length-1];if(fmt.match(/E\-/)&&o.match(/e\+/))o=o.replace(/e\+/,"e");return o.replace("e","E")}function write_num_int(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");if(val>=0)return write_num_int("n",ffmt,val);return"("+write_num_int("n",ffmt,-val)+")"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm2(type,fmt,val);if(fmt.indexOf("%")!==-1)return write_num_pct2(type,fmt,val);if(fmt.indexOf("E")!==-1)return write_num_exp2(fmt,val);if(fmt.charCodeAt(0)===36)return"$"+write_num_int(type,fmt.substr(fmt[1]==" "?2:1),val);var o;var r,ri,ff,aval=Math.abs(val),sign=val<0?"-":"";if(fmt.match(/^00+$/))return sign+pad0(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=""+val;if(val===0)o="";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f2(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0(aval,fmt.length-fmt.indexOf("0"));if((r=fmt.match(dec1))!==null){o=(""+val).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$,$1){return"."+$1+fill("0",r[1].length-$1.length)});return fmt.indexOf("0.")!==-1?o:o.replace(/^0\./,".")}fmt=fmt.replace(/^#+([0.])/,"$1");if((r=fmt.match(/^(0*)\.(#*)$/))!==null){return sign+(""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".")}if((r=fmt.match(/^#,##0(\.?)$/))!==null)return sign+commaify(""+aval);if((r=fmt.match(/^#,##0\.([#0]*0)$/))!==null){return val<0?"-"+write_num_int(type,fmt,-val):commaify(""+val)+"."+fill("0",r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_int(type,fmt.replace(/^#,#*,/,""),val);if((r=fmt.match(/^([0#]+)(\\?-([0#]+))+$/))!==null){o=_strrev(write_num_int(type,fmt.replace(/[\\-]/g,""),val));ri=0;return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==="0"?"0":""}))}if(fmt.match(phone)!==null){o=write_num_int(type,"##########",val);return"("+o.substr(0,3)+") "+o.substr(3,3)+"-"+o.substr(6)}var oa="";if((r=fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=""+sign;oa=write_num("n",r[1],ff[1]);if(oa[oa.length-1]==" ")oa=oa.substr(0,oa.length-1)+"0";o+=oa+r[2]+"/"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?"":"0"))+" "+(ff[1]?pad_(ff[1],ri)+r[2]+"/"+r[3]+rpad_(ff[2],ri):fill(" ",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=""+val;if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0]+)\.([#0]+)$/))!==null){o=""+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");ri=o.indexOf(".");var lres=fmt.indexOf(".")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\.([#0]*0)$/))!==null){return val<0?"-"+write_num_int(type,fmt,-val):commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$){return"00,"+($$.length<3?pad0(0,3-$$.length):"")+$$})+"."+pad0(0,r[1].length)}switch(fmt){case"#,###":var x=commaify(""+aval);return x!=="0"?sign+x:"";default:}throw new Error("unsupported format |"+fmt+"|")}return function write_num(type,fmt,val){return(val|0)===val?write_num_int(type,fmt,val):write_num_flt(type,fmt,val)}}();function split_fmt(fmt){var out=[];var in_str=false,cc;for(var i=0,j=0;i<fmt.length;++i)switch(cc=fmt.charCodeAt(i)){case 34:in_str=!in_str;break;case 95:case 42:case 92:++i;break;case 59:out[out.length]=fmt.substr(j,i-j);j=i+1}out[out.length]=fmt.substr(j);if(in_str===true)throw new Error("Format |"+fmt+"| unterminated string ");return out}SSF._split=split_fmt;var abstime=/\[[HhMmSs]*\]/;function eval_fmt(fmt,v,opts,flen){var out=[],o="",i=0,c="",lst="t",q,dt,j,cc;var hr="H";while(i<fmt.length){switch(c=fmt[i]){case"G":if(!isgeneral(fmt,i))throw new Error("unrecognized character "+c+" in "+fmt);out[out.length]={t:"G",v:"General"};i+=7;break;case'"':for(o="";(cc=fmt.charCodeAt(++i))!==34&&i<fmt.length;)o+=String.fromCharCode(cc);out[out.length]={t:"t",v:o};++i;break;case"\\":var w=fmt[++i],t=w==="("||w===")"?w:"t";out[out.length]={t:t,v:w};++i;break;case"_":out[out.length]={t:"t",v:" "};i+=2;break;case"@":out[out.length]={t:"T",v:v};++i;break;case"B":case"b":if(fmt[i+1]==="1"||fmt[i+1]==="2"){if(dt==null){dt=parse_date_code(v,opts,fmt[i+1]==="2");if(dt==null)return""}out[out.length]={t:"X",v:fmt.substr(i,2)};lst=c;i+=2;break}case"M":case"D":case"Y":case"H":case"S":case"E":c=c.toLowerCase();case"m":case"d":case"y":case"h":case"s":case"e":case"g":if(v<0)return"";if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return""}o=c;while(++i<fmt.length&&fmt[i].toLowerCase()===c)o+=c;if(c==="m"&&lst.toLowerCase()==="h")c="M";if(c==="h")c=hr;out[out.length]={t:c,v:o};lst=c;break;case"A":q={t:c,v:"A"};if(dt==null)dt=parse_date_code(v,opts);if(fmt.substr(i,3)==="A/P"){if(dt!=null)q.v=dt.H>=12?"P":"A";q.t="T";hr="h";i+=3}else if(fmt.substr(i,5)==="AM/PM"){if(dt!=null)q.v=dt.H>=12?"PM":"AM";q.t="T";i+=5;hr="h"}else{q.t="t";++i}if(dt==null&&q.t==="T")return"";out[out.length]=q;lst=c;break;case"[":o=c;while(fmt[i++]!=="]"&&i<fmt.length)o+=fmt[i];if(o.substr(-1)!=="]")throw'unterminated "[" block: |'+o+"|";if(o.match(abstime)){if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return""}out[out.length]={t:"Z",v:o.toLowerCase()}}else{o=""}break;case".":if(dt!=null){o=c;while((c=fmt[++i])==="0")o+=c;out[out.length]={t:"s",v:o};break}case"0":case"#":o=c;while("0#?.,E+-%".indexOf(c=fmt[++i])>-1||c=="\\"&&fmt[i+1]=="-"&&"0#".indexOf(fmt[i+2])>-1)o+=c;out[out.length]={t:"n",v:o};break;case"?":o=c;while(fmt[++i]===c)o+=c;q={t:c,v:o};out[out.length]=q;lst=c;break;case"*":++i;if(fmt[i]==" "||fmt[i]=="*")++i;break;case"(":case")":out[out.length]={t:flen===1?"t":c,v:c};++i;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":o=c;while("0123456789".indexOf(fmt[++i])>-1)o+=fmt[i];out[out.length]={t:"D",v:o};break;case" ":out[out.length]={t:c,v:c};++i;break;default:if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz".indexOf(c)===-1)throw new Error("unrecognized character "+c+" in "+fmt);out[out.length]={t:"t",v:c};++i;break}}var bt=0,ss0=0,ssm;for(i=out.length-1,lst="t";i>=0;--i){switch(out[i].t){case"h":case"H":out[i].t=hr;lst="h";if(bt<1)bt=1;break;case"s":if(ssm=out[i].v.match(/\.0+$/))ss0=Math.max(ss0,ssm[0].length-1);if(bt<3)bt=3;case"d":case"y":case"M":case"e":lst=out[i].t;break;case"m":if(lst==="s"){out[i].t="M";if(bt<2)bt=2}break;case"X":if(out[i].v==="B2");break;case"Z":if(bt<1&&out[i].v.match(/[Hh]/))bt=1;if(bt<2&&out[i].v.match(/[Mm]/))bt=2;if(bt<3&&out[i].v.match(/[Ss]/))bt=3}}switch(bt){case 0:break;case 1:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}if(dt.M>=60){dt.M=0;++dt.H}break;case 2:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}break}var nstr="",jj;for(i=0;i<out.length;++i){switch(out[i].t){case"t":case"T":case" ":case"D":break;case"X":out[i]=undefined;break;case"d":case"m":case"y":case"h":case"H":case"M":case"s":case"e":case"b":case"Z":out[i].v=write_date(out[i].t.charCodeAt(0),out[i].v,dt,ss0);out[i].t="t";break;case"n":case"(":case"?":jj=i+1;while(out[jj]!=null&&((c=out[jj].t)==="?"||c==="D"||(c===" "||c==="t")&&out[jj+1]!=null&&(out[jj+1].t==="?"||out[jj+1].t==="t"&&out[jj+1].v==="/")||out[i].t==="("&&(c===" "||c==="n"||c===")")||c==="t"&&(out[jj].v==="/"||"$€".indexOf(out[jj].v)>-1||out[jj].v===" "&&out[jj+1]!=null&&out[jj+1].t=="?"))){out[i].v+=out[jj].v;out[jj]=undefined;++jj}nstr+=out[i].v;i=jj-1;break;case"G":out[i].t="t";out[i].v=general_fmt(v,opts);break}}var vv="",myv,ostr;if(nstr.length>0){myv=v<0&&nstr.charCodeAt(0)===45?-v:v;ostr=write_num(nstr.charCodeAt(0)===40?"(":"n",nstr,myv);jj=ostr.length-1;var decpt=out.length;for(i=0;i<out.length;++i)if(out[i]!=null&&out[i].v.indexOf(".")>-1){decpt=i;break}var lasti=out.length;if(decpt===out.length&&ostr.indexOf("E")===-1){for(i=out.length-1;i>=0;--i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1)continue;if(jj>=out[i].v.length-1){jj-=out[i].v.length;out[i].v=ostr.substr(jj+1,out[i].v.length)}else if(jj<0)out[i].v="";else{out[i].v=ostr.substr(0,jj+1);jj=-1}out[i].t="t";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v}else if(decpt!==out.length&&ostr.indexOf("E")===-1){jj=ostr.indexOf(".")-1;for(i=decpt;i>=0;--i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1)continue;j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;vv=out[i].v.substr(j+1);for(;j>=0;--j){if(jj>=0&&(out[i].v[j]==="0"||out[i].v[j]==="#"))vv=ostr[jj--]+vv}out[i].v=vv;out[i].t="t";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v;jj=ostr.indexOf(".")+1;for(i=decpt;i<out.length;++i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1&&i!==decpt)continue;j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;vv=out[i].v.substr(0,j);for(;j<out[i].v.length;++j){if(jj<ostr.length)vv+=ostr[jj++]}out[i].v=vv;out[i].t="t";lasti=i}}}for(i=0;i<out.length;++i)if(out[i]!=null&&"n(?".indexOf(out[i].t)>-1){myv=flen>1&&v<0&&i>0&&out[i-1].v==="-"?-v:v;out[i].v=write_num(out[i].t,out[i].v,myv);out[i].t="t"}var retval="";for(i=0;i!==out.length;++i)if(out[i]!=null)retval+=out[i].v;return retval}SSF._eval=eval_fmt;var cfregex=/\[[=<>]/;var cfregex2=/\[([=<>]*)(-?\d+\.?\d*)\]/;function chkcond(v,rr){if(rr==null)return false;var thresh=parseFloat(rr[2]);switch(rr[1]){case"=":if(v==thresh)return true;break;case">":if(v>thresh)return true;break;case"<":if(v<thresh)return true;break;case"<>":if(v!=thresh)return true;break;case">=":if(v>=thresh)return true;break;case"<=":if(v<=thresh)return true;break}return false}function choose_fmt(f,v){var fmt=split_fmt(f);var l=fmt.length,lat=fmt[l-1].indexOf("@");if(l<4&&lat>-1)--l;if(fmt.length>4)throw"cannot find right format for |"+fmt+"|";if(typeof v!=="number")return[4,fmt.length===4||lat>-1?fmt[fmt.length-1]:"@"];switch(fmt.length){case 1:fmt=lat>-1?["General","General","General",fmt[0]]:[fmt[0],fmt[0],fmt[0],"@"];break;case 2:fmt=lat>-1?[fmt[0],fmt[0],fmt[0],fmt[1]]:[fmt[0],fmt[1],fmt[0],"@"];break;case 3:fmt=lat>-1?[fmt[0],fmt[1],fmt[0],fmt[2]]:[fmt[0],fmt[1],fmt[2],"@"];break;case 4:break}var ff=v>0?fmt[0]:v<0?fmt[1]:fmt[2];if(fmt[0].indexOf("[")===-1&&fmt[1].indexOf("[")===-1)return[l,ff];if(fmt[0].match(cfregex)!=null||fmt[1].match(cfregex)!=null){var m1=fmt[0].match(cfregex2);var m2=fmt[1].match(cfregex2);return chkcond(v,m1)?[l,fmt[0]]:chkcond(v,m2)?[l,fmt[1]]:[l,fmt[m1!=null&&m2!=null?2:1]]}return[l,ff]}function format(fmt,v,o){fixopts(o!=null?o:o=[]);var sfmt="";switch(typeof fmt){case"string":sfmt=fmt;break;case"number":sfmt=(o.table!=null?o.table:table_fmt)[fmt];break}if(isgeneral(sfmt,0))return general_fmt(v,o);var f=choose_fmt(sfmt,v);if(isgeneral(f[1]))return general_fmt(v,o);if(v===true)v="TRUE";else if(v===false)v="FALSE";else if(v===""||v==null)return"";return eval_fmt(f[1],v,o,f[0])}SSF._table=table_fmt;SSF.load=function load_entry(fmt,idx){table_fmt[idx]=fmt};SSF.format=format;SSF.get_table=function get_table(){return table_fmt};SSF.load_table=function load_table(tbl){for(var i=0;i!=392;++i)if(tbl[i]!==undefined)SSF.load(tbl[i],i)}};make_ssf(SSF);{var VT_EMPTY=0;var VT_NULL=1;var VT_I2=2;var VT_I4=3;var VT_R4=4;var VT_R8=5;var VT_CY=6;var VT_DATE=7;var VT_BSTR=8;var VT_ERROR=10;var VT_BOOL=11;var VT_VARIANT=12;var VT_DECIMAL=14;var VT_I1=16;var VT_UI1=17;var VT_UI2=18;var VT_UI4=19;var VT_I8=20;var VT_UI8=21;var VT_INT=22;var VT_UINT=23;var VT_LPSTR=30;var VT_LPWSTR=31;var VT_FILETIME=64;var VT_BLOB=65;var VT_STREAM=66;var VT_STORAGE=67;var VT_STREAMED_Object=68; 18558 var XLS={};(function make_xls(XLS){XLS.version="0.7.1";var current_codepage=1252,current_cptable;if(typeof module!=="undefined"&&typeof require!=="undefined"){if(typeof cptable==="undefined")cptable=require("./dist/cpexcel");current_cptable=cptable[current_codepage]}function reset_cp(){set_cp(1252)}function set_cp(cp){current_codepage=cp;if(typeof cptable!=="undefined")current_cptable=cptable[cp]}var _getchar=function _gc1(x){return String.fromCharCode(x)};if(typeof cptable!=="undefined")_getchar=function _gc2(x){if(current_codepage===1200)return String.fromCharCode(x);return cptable.utils.decode(current_codepage,[x&255,x>>8])[0]};var has_buf=typeof Buffer!=="undefined";function new_buf(len){return new(has_buf?Buffer:Array)(len)}var Base64=function make_b64(){var map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return{decode:function b64_decode(input,utf8){var o="";var c1,c2,c3;var e1,e2,e3,e4;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");for(var i=0;i<input.length;){e1=map.indexOf(input.charAt(i++));e2=map.indexOf(input.charAt(i++));e3=map.indexOf(input.charAt(i++));e4=map.indexOf(input.charAt(i++));c1=e1<<2|e2>>4;c2=(e2&15)<<4|e3>>2;c3=(e3&3)<<6|e4;o+=String.fromCharCode(c1);if(e3!=64){o+=String.fromCharCode(c2)}if(e4!=64){o+=String.fromCharCode(c3)}}return o}}}();function s2a(s){if(has_buf)return new Buffer(s,"binary");var w=s.split("").map(function(x){return x.charCodeAt(0)&255});return w}function readIEEE754(buf,idx,isLE,nl,ml){if(isLE===undefined)isLE=true;if(!nl)nl=8;if(!ml&&nl===8)ml=52;var e,m,el=nl*8-ml-1,eMax=(1<<el)-1,eBias=eMax>>1;var bits=-7,d=isLE?-1:1,i=isLE?nl-1:0,s=buf[idx+i];i+=d;e=s&(1<<-bits)-1;s>>>=-bits;bits+=el;for(;bits>0;e=e*256+buf[idx+i],i+=d,bits-=8);m=e&(1<<-bits)-1;e>>>=-bits;bits+=ml;for(;bits>0;m=m*256+buf[idx+i],i+=d,bits-=8);if(e===eMax)return m?NaN:(s?-1:1)*Infinity;else if(e===0)e=1-eBias;else{m=m+Math.pow(2,ml);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-ml)}var chr0=/\u0000/g,chr1=/[\u0001-\u0006]/;var __toBuffer,___toBuffer;__toBuffer=___toBuffer=function toBuffer_(bufs){var x=[];for(var i=0;i<bufs[0].length;++i){x.push.apply(x,bufs[0][i])}return x};var __utf16le,___utf16le;__utf16le=___utf16le=function utf16le_(b,s,e){var ss=[];for(var i=s;i<e;i+=2)ss.push(String.fromCharCode(__readUInt16LE(b,i)));return ss.join("")};var __hexlify,___hexlify;__hexlify=___hexlify=function hexlify_(b,s,l){return b.slice(s,s+l).map(function(x){return(x<16?"0":"")+x.toString(16)}).join("")};var __utf8,___utf8;__utf8=___utf8=function(b,s,e){var ss=[];for(var i=s;i<e;i++)ss.push(String.fromCharCode(__readUInt8(b,i)));return ss.join("")};var __lpstr,___lpstr;__lpstr=___lpstr=function lpstr_(b,i){var len=__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):""};var __lpwstr,___lpwstr;__lpwstr=___lpwstr=function lpwstr_(b,i){var len=2*__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):""};var __double,___double;__double=___double=function(b,idx){return readIEEE754(b,idx)};var bconcat=function(bufs){return[].concat.apply([],bufs)};if(typeof Buffer!=="undefined"){__utf16le=function utf16le_b(b,s,e){if(!Buffer.isBuffer(b))return ___utf16le(b,s,e);return b.toString("utf16le",s,e)};__hexlify=function(b,s,l){return Buffer.isBuffer(b)?b.toString("hex",s,s+l):___hexlify(b,s,l)};__lpstr=function lpstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpstr(b,i);var len=b.readUInt32LE(i);return len>0?b.toString("utf8",i+4,i+4+len-1):""};__lpwstr=function lpwstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpwstr(b,i);var len=2*b.readUInt32LE(i);return b.toString("utf16le",i+4,i+4+len-1)};__utf8=function utf8_b(s,e){return this.toString("utf8",s,e)};__toBuffer=function(bufs){return bufs[0].length>0&&Buffer.isBuffer(bufs[0][0])?Buffer.concat(bufs[0]):___toBuffer(bufs)};bconcat=function(bufs){return Buffer.isBuffer(bufs[0])?Buffer.concat(bufs):[].concat.apply([],bufs)};__double=function double_(b,i){if(Buffer.isBuffer(b))return b.readDoubleLE(i);return ___double(b,i)}}var __readUInt8=function(b,idx){return b[idx]};var __readUInt16LE=function(b,idx){return b[idx+1]*(1<<8)+b[idx]};var __readInt16LE=function(b,idx){var u=b[idx+1]*(1<<8)+b[idx];return u<32768?u:(65535-u+1)*-1};var __readUInt32LE=function(b,idx){return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]};var __readInt32LE=function(b,idx){return b[idx+3]<<24|b[idx+2]<<16|b[idx+1]<<8|b[idx]};var ___unhexlify=function(s){return s.match(/../g).map(function(x){return parseInt(x,16)})};var __unhexlify=typeof Buffer!=="undefined"?function(s){return Buffer.isBuffer(s)?new Buffer(s,"hex"):___unhexlify(s)}:___unhexlify;if(typeof cptable!=="undefined"){__utf16le=function(b,s,e){return cptable.utils.decode(1200,b.slice(s,e))};__utf8=function(b,s,e){return cptable.utils.decode(65001,b.slice(s,e))};__lpstr=function(b,i){var len=__readUInt32LE(b,i);return len>0?cptable.utils.decode(current_codepage,b.slice(i+4,i+4+len-1)):""};__lpwstr=function(b,i){var len=2*__readUInt32LE(b,i);return len>0?cptable.utils.decode(1200,b.slice(i+4,i+4+len-1)):""}}function ReadShift(size,t){var o,oI,oR,oo=[],w,vv,i,loc;switch(t){case"lpstr":o=__lpstr(this,this.l);size=5+o.length;break;case"lpwstr":o=__lpwstr(this,this.l);size=5+o.length;if(o[o.length-1]=="\x00")size+=2;break;case"cstr":size=0;o="";while((w=__readUInt8(this,this.l+size++))!==0)oo.push(_getchar(w));o=oo.join("");break;case"wstr":size=0;o="";while((w=__readUInt16LE(this,this.l+size))!==0){oo.push(_getchar(w));size+=2}size+=2;o=oo.join("");break;case"dbcs":o="";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?"dbcs":"sbcs");return oo.join("")+vv}oo.push(_getchar(__readUInt16LE(this,loc)));loc+=2}o=oo.join("");size*=2;break;case"sbcs":o="";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?"dbcs":"sbcs");return oo.join("")+vv}oo.push(_getchar(__readUInt8(this,loc)));loc+=1}o=oo.join("");break;case"utf8":o=__utf8(this,this.l,this.l+size);break;case"utf16le":size*=2;o=__utf16le(this,this.l,this.l+size);break;default:switch(size){case 1:oI=__readUInt8(this,this.l);this.l++;return oI;case 2:oI=t!=="i"?__readUInt16LE(this,this.l):__readInt16LE(this,this.l);this.l+=2;return oI;case 4:if(t==="i"||(this[this.l+3]&128)===0){oI=__readInt32LE(this,this.l);this.l+=4;return oI}else{oR=__readUInt32LE(this,this.l);this.l+=4;return oR}break;case 8:if(t==="f"){oR=__double(this,this.l);this.l+=8;return oR}case 16:o=__hexlify(this,this.l,size);break}}this.l+=size;return o}function CheckField(hexstr,fld){var m=__hexlify(this,this.l,hexstr.length>>1);if(m!==hexstr)throw fld+"Expected "+hexstr+" saw "+m;this.l+=hexstr.length>>1}function prep_blob(blob,pos){blob.l=pos;blob.read_shift=ReadShift;blob.chk=CheckField}var SSF={};var make_ssf=function make_ssf(SSF){SSF.version="0.8.1";function _strrev(x){var o="",i=x.length-1;while(i>=0)o+=x.charAt(i--);return o}function fill(c,l){var o="";while(o.length<l)o+=c;return o}function pad0(v,d){var t=""+v;return t.length>=d?t:fill("0",d-t.length)+t}function pad_(v,d){var t=""+v;return t.length>=d?t:fill(" ",d-t.length)+t}function rpad_(v,d){var t=""+v;return t.length>=d?t:t+fill(" ",d-t.length)}function pad0r1(v,d){var t=""+Math.round(v);return t.length>=d?t:fill("0",d-t.length)+t}function pad0r2(v,d){var t=""+v;return t.length>=d?t:fill("0",d-t.length)+t}var p2_32=Math.pow(2,32);function pad0r(v,d){if(v>p2_32||v<-p2_32)return pad0r1(v,d);var i=Math.round(v);return pad0r2(i,d)}function isgeneral(s,i){return s.length>=7+i&&(s.charCodeAt(i)|32)===103&&(s.charCodeAt(i+1)|32)===101&&(s.charCodeAt(i+2)|32)===110&&(s.charCodeAt(i+3)|32)===101&&(s.charCodeAt(i+4)|32)===114&&(s.charCodeAt(i+5)|32)===97&&(s.charCodeAt(i+6)|32)===108}var opts_fmt=[["date1904",0],["output",""],["WTF",false]];function fixopts(o){for(var y=0;y!=opts_fmt.length;++y)if(o[opts_fmt[y][0]]===undefined)o[opts_fmt[y][0]]=opts_fmt[y][1]}SSF.opts=opts_fmt;var table_fmt={0:"General",1:"0",2:"0.00",3:"#,##0",4:"#,##0.00",9:"0%",10:"0.00%",11:"0.00E+00",12:"# ?/?",13:"# ??/??",14:"m/d/yy",15:"d-mmm-yy",16:"d-mmm",17:"mmm-yy",18:"h:mm AM/PM",19:"h:mm:ss AM/PM",20:"h:mm",21:"h:mm:ss",22:"m/d/yy h:mm",37:"#,##0 ;(#,##0)",38:"#,##0 ;[Red](#,##0)",39:"#,##0.00;(#,##0.00)",40:"#,##0.00;[Red](#,##0.00)",45:"mm:ss",46:"[h]:mm:ss",47:"mmss.0",48:"##0.0E+0",49:"@",56:'"上午/下午 "hh"時"mm"分"ss"秒 "',65535:"General"};var days=[["Sun","Sunday"],["Mon","Monday"],["Tue","Tuesday"],["Wed","Wednesday"],["Thu","Thursday"],["Fri","Friday"],["Sat","Saturday"]];var months=[["J","Jan","January"],["F","Feb","February"],["M","Mar","March"],["A","Apr","April"],["M","May","May"],["J","Jun","June"],["J","Jul","July"],["A","Aug","August"],["S","Sep","September"],["O","Oct","October"],["N","Nov","November"],["D","Dec","December"]];function frac(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-A<5e-10)break;B=1/(B-A);P_2=P_1;P_1=P;Q_2=Q_1;Q_1=Q}if(Q>D){Q=Q_1;P=P_1}if(Q>D){Q=Q_2;P=P_2}if(!mixed)return[0,sgn*P,Q];if(Q===0)throw"Unexpected state: "+P+" "+P_1+" "+P_2+" "+Q+" "+Q_1+" "+Q_2;var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]}function general_fmt_int(v,opts){return""+v}SSF._general_int=general_fmt_int;var general_fmt_num=function make_general_fmt_num(){var gnr1=/\.(\d*[1-9])0+$/,gnr2=/\.0*$/,gnr4=/\.(\d*[1-9])0+/,gnr5=/\.0*[Ee]/,gnr6=/(E[+-])(\d)$/;function gfn2(v){var w=v<0?12:11;var o=gfn5(v.toFixed(12));if(o.length<=w)return o;o=v.toPrecision(10);if(o.length<=w)return o;return v.toExponential(5)}function gfn3(v){var o=v.toFixed(11).replace(gnr1,".$1");if(o.length>(v<0?12:11))o=v.toPrecision(6);return o}function gfn4(o){for(var i=0;i!=o.length;++i)if((o.charCodeAt(i)|32)===101)return o.replace(gnr4,".$1").replace(gnr5,"E").replace("e","E").replace(gnr6,"$10$2");return o}function gfn5(o){return o.indexOf(".")>-1?o.replace(gnr2,"").replace(gnr1,".$1"):o}return function general_fmt_num(v,opts){var V=Math.floor(Math.log(Math.abs(v))*Math.LOG10E),o;if(V>=-4&&V<=-1)o=v.toPrecision(10+V);else if(Math.abs(V)<=9)o=gfn2(v);else if(V===10)o=v.toFixed(10).substr(0,12);else o=gfn3(v);return gfn5(gfn4(o))}}();SSF._general_num=general_fmt_num;function general_fmt(v,opts){switch(typeof v){case"string":return v;case"boolean":return v?"TRUE":"FALSE";case"number":return(v|0)===v?general_fmt_int(v,opts):general_fmt_num(v,opts)}throw new Error("unsupported value in General format: "+v)}SSF._general=general_fmt;function fix_hijri(date,o){return 0}function parse_date_code(v,opts,b2){if(v>2958465||v<0)return null;var date=v|0,time=Math.floor(86400*(v-date)),dow=0;var dout=[];var out={D:date,T:time,u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};if(Math.abs(out.u)<1e-6)out.u=0;fixopts(opts!=null?opts:opts=[]);if(opts.date1904)date+=1462;if(out.u>.999){out.u=0;if(++time==86400){time=0;++date}}if(date===60){dout=b2?[1317,10,29]:[1900,2,29];dow=3}else if(date===0){dout=b2?[1317,8,29]:[1900,1,0];dow=6}else{if(date>60)--date;var d=new Date(1900,0,1);d.setDate(d.getDate()+date-1);dout=[d.getFullYear(),d.getMonth()+1,d.getDate()];dow=d.getDay();if(date<60)dow=(dow+6)%7;if(b2)dow=fix_hijri(d,dout)}out.y=dout[0];out.m=dout[1];out.d=dout[2];out.S=time%60;time=Math.floor(time/60);out.M=time%60;time=Math.floor(time/60);out.H=time;out.q=dow;return out}SSF.parse_date_code=parse_date_code;function write_date(type,fmt,val,ss0){var o="",ss=0,tt=0,y=val.y,out,outl=0;switch(type){case 98:y=val.y+543;case 121:switch(fmt.length){case 1:case 2:out=y%100;outl=2;break;default:out=y%1e4;outl=4;break}break;case 109:switch(fmt.length){case 1:case 2:out=val.m;outl=fmt.length;break;case 3:return months[val.m-1][1];case 5:return months[val.m-1][0];default:return months[val.m-1][2]}break;case 100:switch(fmt.length){case 1:case 2:out=val.d;outl=fmt.length;break;case 3:return days[val.q][0];default:return days[val.q][1]}break;case 104:switch(fmt.length){case 1:case 2:out=1+(val.H+11)%12;outl=fmt.length;break;default:throw"bad hour format: "+fmt}break;case 72:switch(fmt.length){case 1:case 2:out=val.H;outl=fmt.length;break;default:throw"bad hour format: "+fmt}break;case 77:switch(fmt.length){case 1:case 2:out=val.M;outl=fmt.length;break;default:throw"bad minute format: "+fmt}break;case 115:if(val.u===0)switch(fmt){case"s":case"ss":return pad0(val.S,fmt.length);case".0":case".00":case".000":}switch(fmt){case"s":case"ss":case".0":case".00":case".000":if(ss0>=2)tt=ss0===3?1e3:100;else tt=ss0===1?10:1;ss=Math.round(tt*(val.S+val.u));if(ss>=60*tt)ss=0;if(fmt==="s")return ss===0?"0":""+ss/tt;o=pad0(ss,2+ss0);if(fmt==="ss")return o.substr(0,2);return"."+o.substr(2,fmt.length-1);default:throw"bad second format: "+fmt}case 90:switch(fmt){case"[h]":case"[hh]":out=val.D*24+val.H;break;case"[m]":case"[mm]":out=(val.D*24+val.H)*60+val.M;break;case"[s]":case"[ss]":out=((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u);break;default:throw"bad abstime format: "+fmt}outl=fmt.length===3?1:2;break;case 101:out=y;outl=1}if(outl>0)return pad0(out,outl);else return""}function commaify(s){if(s.length<=3)return s;var j=s.length%3,o=s.substr(0,j);for(;j!=s.length;j+=3)o+=(o.length>0?",":"")+s.substr(j,3);return o}var write_num=function make_write_num(){var pct1=/%/g;function write_num_pct(type,fmt,val){var sfmt=fmt.replace(pct1,""),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill("%",mul)}function write_num_cm(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_exp(fmt,val){var o;var idx=fmt.indexOf("E")-fmt.indexOf(".")-1;if(fmt.match(/^#+0.0E\+0$/)){var period=fmt.indexOf(".");if(period===-1)period=fmt.indexOf("E");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(o.indexOf("e")===-1){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(".")===-1)o=o[0]+"."+o.substr(1)+"E+"+(fakee-o.length+ee);else o+="E+"+(fakee-ee);while(o.substr(0,2)==="0."){o=o[0]+o.substr(2,period)+"."+o.substr(2+period);o=o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.")}o=o.replace(/\+-/,"-")}o=o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+"."+$3.substr(ee)+"E"})}else o=val.toExponential(idx);if(fmt.match(/E\+00$/)&&o.match(/e[+-]\d$/))o=o.substr(0,o.length-1)+"0"+o[o.length-1];if(fmt.match(/E\-/)&&o.match(/e\+/))o=o.replace(/e\+/,"e");return o.replace("e","E")}var frac1=/# (\?+)( ?)\/( ?)(\d+)/;function write_num_f1(r,aval,sign){var den=parseInt(r[4]),rr=Math.round(aval*den),base=Math.floor(rr/den);var myn=rr-base*den,myd=den;return sign+(base===0?"":""+base)+" "+(myn===0?fill(" ",r[1].length+1+r[4].length):pad_(myn,r[1].length)+r[2]+"/"+r[3]+pad0(myd,r[4].length))}function write_num_f2(r,aval,sign){return sign+(aval===0?"":""+aval)+fill(" ",r[1].length+2+r[4].length)}var dec1=/^#*0*\.(0+)/;var closeparen=/\).*[0#]/;var phone=/\(###\) ###\\?-####/;function hashq(str){var o="",cc;for(var i=0;i!=str.length;++i)switch(cc=str.charCodeAt(i)){case 35:break;case 63:o+=" ";break;case 48:o+="0";break;default:o+=String.fromCharCode(cc)}return o}function rnd(val,d){var dd=Math.pow(10,d);return""+Math.round(val*dd)/dd}function dec(val,d){return Math.round((val-Math.floor(val))*Math.pow(10,d))}function flr(val){if(val<2147483647&&val>-2147483648)return""+(val>=0?val|0:val-1|0);return""+Math.floor(val)}function write_num_flt(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");if(val>=0)return write_num_flt("n",ffmt,val);return"("+write_num_flt("n",ffmt,-val)+")"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm(type,fmt,val);if(fmt.indexOf("%")!==-1)return write_num_pct(type,fmt,val);if(fmt.indexOf("E")!==-1)return write_num_exp(fmt,val);if(fmt.charCodeAt(0)===36)return"$"+write_num_flt(type,fmt.substr(fmt[1]==" "?2:1),val);var o,oo;var r,ri,ff,aval=Math.abs(val),sign=val<0?"-":"";if(fmt.match(/^00+$/))return sign+pad0r(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=pad0r(val,0);if(o==="0")o="";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f1(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0r(aval,fmt.length-fmt.indexOf("0"));if((r=fmt.match(dec1))!==null){o=rnd(val,r[1].length).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$,$1){return"."+$1+fill("0",r[1].length-$1.length)});return fmt.indexOf("0.")!==-1?o:o.replace(/^0\./,".")}fmt=fmt.replace(/^#+([0.])/,"$1");if((r=fmt.match(/^(0*)\.(#*)$/))!==null){return sign+rnd(aval,r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".")}if((r=fmt.match(/^#,##0(\.?)$/))!==null)return sign+commaify(pad0r(aval,0));if((r=fmt.match(/^#,##0\.([#0]*0)$/))!==null){return val<0?"-"+write_num_flt(type,fmt,-val):commaify(""+Math.floor(val))+"."+pad0(dec(val,r[1].length),r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);if((r=fmt.match(/^([0#]+)(\\?-([0#]+))+$/))!==null){o=_strrev(write_num_flt(type,fmt.replace(/[\\-]/g,""),val));ri=0;return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==="0"?"0":""}))}if(fmt.match(phone)!==null){o=write_num_flt(type,"##########",val);return"("+o.substr(0,3)+") "+o.substr(3,3)+"-"+o.substr(6)}var oa="";if((r=fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=""+sign;oa=write_num("n",r[1],ff[1]);if(oa[oa.length-1]==" ")oa=oa.substr(0,oa.length-1)+"0";o+=oa+r[2]+"/"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?"":"0"))+" "+(ff[1]?pad_(ff[1],ri)+r[2]+"/"+r[3]+rpad_(ff[2],ri):fill(" ",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=pad0r(val,0);if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0?]+)\.([#0]+)$/))!==null){o=""+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");ri=o.indexOf(".");var lres=fmt.indexOf(".")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\.([#0]*0)$/))!==null){ri=dec(val,r[1].length);return val<0?"-"+write_num_flt(type,fmt,-val):commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$){return"00,"+($$.length<3?pad0(0,3-$$.length):"")+$$})+"."+pad0(ri,r[1].length)}switch(fmt){case"#,###":var x=commaify(pad0r(aval,0));return x!=="0"?sign+x:"";default:}throw new Error("unsupported format |"+fmt+"|")}function write_num_cm2(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_pct2(type,fmt,val){var sfmt=fmt.replace(pct1,""),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill("%",mul)}function write_num_exp2(fmt,val){var o;var idx=fmt.indexOf("E")-fmt.indexOf(".")-1;if(fmt.match(/^#+0.0E\+0$/)){var period=fmt.indexOf(".");if(period===-1)period=fmt.indexOf("E");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(!o.match(/[Ee]/)){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(".")===-1)o=o[0]+"."+o.substr(1)+"E+"+(fakee-o.length+ee);else o+="E+"+(fakee-ee);o=o.replace(/\+-/,"-")}o=o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+"."+$3.substr(ee)+"E"})}else o=val.toExponential(idx);if(fmt.match(/E\+00$/)&&o.match(/e[+-]\d$/))o=o.substr(0,o.length-1)+"0"+o[o.length-1];if(fmt.match(/E\-/)&&o.match(/e\+/))o=o.replace(/e\+/,"e");return o.replace("e","E")}function write_num_int(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");if(val>=0)return write_num_int("n",ffmt,val);return"("+write_num_int("n",ffmt,-val)+")"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm2(type,fmt,val);if(fmt.indexOf("%")!==-1)return write_num_pct2(type,fmt,val);if(fmt.indexOf("E")!==-1)return write_num_exp2(fmt,val);if(fmt.charCodeAt(0)===36)return"$"+write_num_int(type,fmt.substr(fmt[1]==" "?2:1),val);var o;var r,ri,ff,aval=Math.abs(val),sign=val<0?"-":"";if(fmt.match(/^00+$/))return sign+pad0(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=""+val;if(val===0)o="";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f2(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0(aval,fmt.length-fmt.indexOf("0"));if((r=fmt.match(dec1))!==null){o=(""+val).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$,$1){return"."+$1+fill("0",r[1].length-$1.length)});return fmt.indexOf("0.")!==-1?o:o.replace(/^0\./,".")}fmt=fmt.replace(/^#+([0.])/,"$1");if((r=fmt.match(/^(0*)\.(#*)$/))!==null){return sign+(""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".")}if((r=fmt.match(/^#,##0(\.?)$/))!==null)return sign+commaify(""+aval);if((r=fmt.match(/^#,##0\.([#0]*0)$/))!==null){return val<0?"-"+write_num_int(type,fmt,-val):commaify(""+val)+"."+fill("0",r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_int(type,fmt.replace(/^#,#*,/,""),val);if((r=fmt.match(/^([0#]+)(\\?-([0#]+))+$/))!==null){o=_strrev(write_num_int(type,fmt.replace(/[\\-]/g,""),val));ri=0;return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==="0"?"0":""}))}if(fmt.match(phone)!==null){o=write_num_int(type,"##########",val);return"("+o.substr(0,3)+") "+o.substr(3,3)+"-"+o.substr(6)}var oa="";if((r=fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=""+sign;oa=write_num("n",r[1],ff[1]);if(oa[oa.length-1]==" ")oa=oa.substr(0,oa.length-1)+"0";o+=oa+r[2]+"/"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?"":"0"))+" "+(ff[1]?pad_(ff[1],ri)+r[2]+"/"+r[3]+rpad_(ff[2],ri):fill(" ",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=""+val;if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0]+)\.([#0]+)$/))!==null){o=""+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");ri=o.indexOf(".");var lres=fmt.indexOf(".")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\.([#0]*0)$/))!==null){return val<0?"-"+write_num_int(type,fmt,-val):commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$){return"00,"+($$.length<3?pad0(0,3-$$.length):"")+$$})+"."+pad0(0,r[1].length)}switch(fmt){case"#,###":var x=commaify(""+aval);return x!=="0"?sign+x:"";default:}throw new Error("unsupported format |"+fmt+"|")}return function write_num(type,fmt,val){return(val|0)===val?write_num_int(type,fmt,val):write_num_flt(type,fmt,val)}}();function split_fmt(fmt){var out=[];var in_str=false,cc;for(var i=0,j=0;i<fmt.length;++i)switch(cc=fmt.charCodeAt(i)){case 34:in_str=!in_str;break;case 95:case 42:case 92:++i;break;case 59:out[out.length]=fmt.substr(j,i-j);j=i+1}out[out.length]=fmt.substr(j);if(in_str===true)throw new Error("Format |"+fmt+"| unterminated string ");return out}SSF._split=split_fmt;var abstime=/\[[HhMmSs]*\]/;function eval_fmt(fmt,v,opts,flen){var out=[],o="",i=0,c="",lst="t",q,dt,j,cc;var hr="H";while(i<fmt.length){switch(c=fmt[i]){case"G":if(!isgeneral(fmt,i))throw new Error("unrecognized character "+c+" in "+fmt);out[out.length]={t:"G",v:"General"};i+=7;break;case'"':for(o="";(cc=fmt.charCodeAt(++i))!==34&&i<fmt.length;)o+=String.fromCharCode(cc);out[out.length]={t:"t",v:o};++i;break;case"\\":var w=fmt[++i],t=w==="("||w===")"?w:"t";out[out.length]={t:t,v:w};++i;break;case"_":out[out.length]={t:"t",v:" "};i+=2;break;case"@":out[out.length]={t:"T",v:v};++i;break;case"B":case"b":if(fmt[i+1]==="1"||fmt[i+1]==="2"){if(dt==null){dt=parse_date_code(v,opts,fmt[i+1]==="2");if(dt==null)return""}out[out.length]={t:"X",v:fmt.substr(i,2)};lst=c;i+=2;break}case"M":case"D":case"Y":case"H":case"S":case"E":c=c.toLowerCase();case"m":case"d":case"y":case"h":case"s":case"e":case"g":if(v<0)return"";if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return""}o=c;while(++i<fmt.length&&fmt[i].toLowerCase()===c)o+=c;if(c==="m"&&lst.toLowerCase()==="h")c="M";if(c==="h")c=hr;out[out.length]={t:c,v:o};lst=c;break;case"A":q={t:c,v:"A"};if(dt==null)dt=parse_date_code(v,opts);if(fmt.substr(i,3)==="A/P"){if(dt!=null)q.v=dt.H>=12?"P":"A";q.t="T";hr="h";i+=3}else if(fmt.substr(i,5)==="AM/PM"){if(dt!=null)q.v=dt.H>=12?"PM":"AM";q.t="T";i+=5;hr="h"}else{q.t="t";++i}if(dt==null&&q.t==="T")return"";out[out.length]=q;lst=c;break;case"[":o=c;while(fmt[i++]!=="]"&&i<fmt.length)o+=fmt[i];if(o.substr(-1)!=="]")throw'unterminated "[" block: |'+o+"|";if(o.match(abstime)){if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return""}out[out.length]={t:"Z",v:o.toLowerCase()}}else{o=""}break;case".":if(dt!=null){o=c;while((c=fmt[++i])==="0")o+=c;out[out.length]={t:"s",v:o};break}case"0":case"#":o=c;while("0#?.,E+-%".indexOf(c=fmt[++i])>-1||c=="\\"&&fmt[i+1]=="-"&&"0#".indexOf(fmt[i+2])>-1)o+=c;out[out.length]={t:"n",v:o};break;case"?":o=c;while(fmt[++i]===c)o+=c;q={t:c,v:o};out[out.length]=q;lst=c;break;case"*":++i;if(fmt[i]==" "||fmt[i]=="*")++i;break;case"(":case")":out[out.length]={t:flen===1?"t":c,v:c};++i;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":o=c;while("0123456789".indexOf(fmt[++i])>-1)o+=fmt[i];out[out.length]={t:"D",v:o};break;case" ":out[out.length]={t:c,v:c};++i;break;default:if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz".indexOf(c)===-1)throw new Error("unrecognized character "+c+" in "+fmt);out[out.length]={t:"t",v:c};++i;break}}var bt=0,ss0=0,ssm;for(i=out.length-1,lst="t";i>=0;--i){switch(out[i].t){case"h":case"H":out[i].t=hr;lst="h";if(bt<1)bt=1;break;case"s":if(ssm=out[i].v.match(/\.0+$/))ss0=Math.max(ss0,ssm[0].length-1);if(bt<3)bt=3;case"d":case"y":case"M":case"e":lst=out[i].t;break;case"m":if(lst==="s"){out[i].t="M";if(bt<2)bt=2}break;case"X":if(out[i].v==="B2");break;case"Z":if(bt<1&&out[i].v.match(/[Hh]/))bt=1;if(bt<2&&out[i].v.match(/[Mm]/))bt=2;if(bt<3&&out[i].v.match(/[Ss]/))bt=3}}switch(bt){case 0:break;case 1:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}if(dt.M>=60){dt.M=0;++dt.H}break;case 2:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}break}var nstr="",jj;for(i=0;i<out.length;++i){switch(out[i].t){case"t":case"T":case" ":case"D":break;case"X":out[i]=undefined;break;case"d":case"m":case"y":case"h":case"H":case"M":case"s":case"e":case"b":case"Z":out[i].v=write_date(out[i].t.charCodeAt(0),out[i].v,dt,ss0);out[i].t="t";break;case"n":case"(":case"?":jj=i+1;while(out[jj]!=null&&((c=out[jj].t)==="?"||c==="D"||(c===" "||c==="t")&&out[jj+1]!=null&&(out[jj+1].t==="?"||out[jj+1].t==="t"&&out[jj+1].v==="/")||out[i].t==="("&&(c===" "||c==="n"||c===")")||c==="t"&&(out[jj].v==="/"||"$€".indexOf(out[jj].v)>-1||out[jj].v===" "&&out[jj+1]!=null&&out[jj+1].t=="?"))){out[i].v+=out[jj].v;out[jj]=undefined;++jj}nstr+=out[i].v;i=jj-1;break;case"G":out[i].t="t";out[i].v=general_fmt(v,opts);break}}var vv="",myv,ostr;if(nstr.length>0){myv=v<0&&nstr.charCodeAt(0)===45?-v:v;ostr=write_num(nstr.charCodeAt(0)===40?"(":"n",nstr,myv);jj=ostr.length-1;var decpt=out.length;for(i=0;i<out.length;++i)if(out[i]!=null&&out[i].v.indexOf(".")>-1){decpt=i;break}var lasti=out.length;if(decpt===out.length&&ostr.indexOf("E")===-1){for(i=out.length-1;i>=0;--i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1)continue;if(jj>=out[i].v.length-1){jj-=out[i].v.length;out[i].v=ostr.substr(jj+1,out[i].v.length)}else if(jj<0)out[i].v="";else{out[i].v=ostr.substr(0,jj+1);jj=-1}out[i].t="t";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v}else if(decpt!==out.length&&ostr.indexOf("E")===-1){jj=ostr.indexOf(".")-1;for(i=decpt;i>=0;--i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1)continue;j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;vv=out[i].v.substr(j+1);for(;j>=0;--j){if(jj>=0&&(out[i].v[j]==="0"||out[i].v[j]==="#"))vv=ostr[jj--]+vv}out[i].v=vv;out[i].t="t";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v;jj=ostr.indexOf(".")+1;for(i=decpt;i<out.length;++i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1&&i!==decpt)continue;j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;vv=out[i].v.substr(0,j);for(;j<out[i].v.length;++j){if(jj<ostr.length)vv+=ostr[jj++]}out[i].v=vv;out[i].t="t";lasti=i}}}for(i=0;i<out.length;++i)if(out[i]!=null&&"n(?".indexOf(out[i].t)>-1){myv=flen>1&&v<0&&i>0&&out[i-1].v==="-"?-v:v;out[i].v=write_num(out[i].t,out[i].v,myv);out[i].t="t"}var retval="";for(i=0;i!==out.length;++i)if(out[i]!=null)retval+=out[i].v;return retval}SSF._eval=eval_fmt;var cfregex=/\[[=<>]/;var cfregex2=/\[([=<>]*)(-?\d+\.?\d*)\]/;function chkcond(v,rr){if(rr==null)return false;var thresh=parseFloat(rr[2]);switch(rr[1]){case"=":if(v==thresh)return true;break;case">":if(v>thresh)return true;break;case"<":if(v<thresh)return true;break;case"<>":if(v!=thresh)return true;break;case">=":if(v>=thresh)return true;break;case"<=":if(v<=thresh)return true;break}return false}function choose_fmt(f,v){var fmt=split_fmt(f);var l=fmt.length,lat=fmt[l-1].indexOf("@");if(l<4&&lat>-1)--l;if(fmt.length>4)throw"cannot find right format for |"+fmt+"|";if(typeof v!=="number")return[4,fmt.length===4||lat>-1?fmt[fmt.length-1]:"@"];switch(fmt.length){case 1:fmt=lat>-1?["General","General","General",fmt[0]]:[fmt[0],fmt[0],fmt[0],"@"];break;case 2:fmt=lat>-1?[fmt[0],fmt[0],fmt[0],fmt[1]]:[fmt[0],fmt[1],fmt[0],"@"];break;case 3:fmt=lat>-1?[fmt[0],fmt[1],fmt[0],fmt[2]]:[fmt[0],fmt[1],fmt[2],"@"];break;case 4:break}var ff=v>0?fmt[0]:v<0?fmt[1]:fmt[2];if(fmt[0].indexOf("[")===-1&&fmt[1].indexOf("[")===-1)return[l,ff];if(fmt[0].match(cfregex)!=null||fmt[1].match(cfregex)!=null){var m1=fmt[0].match(cfregex2);var m2=fmt[1].match(cfregex2);return chkcond(v,m1)?[l,fmt[0]]:chkcond(v,m2)?[l,fmt[1]]:[l,fmt[m1!=null&&m2!=null?2:1]]}return[l,ff]}function format(fmt,v,o){fixopts(o!=null?o:o=[]);var sfmt="";switch(typeof fmt){case"string":sfmt=fmt;break;case"number":sfmt=(o.table!=null?o.table:table_fmt)[fmt];break}if(isgeneral(sfmt,0))return general_fmt(v,o);var f=choose_fmt(sfmt,v);if(isgeneral(f[1]))return general_fmt(v,o);if(v===true)v="TRUE";else if(v===false)v="FALSE";else if(v===""||v==null)return"";return eval_fmt(f[1],v,o,f[0])}SSF._table=table_fmt;SSF.load=function load_entry(fmt,idx){table_fmt[idx]=fmt};SSF.format=format;SSF.get_table=function get_table(){return table_fmt};SSF.load_table=function load_table(tbl){for(var i=0;i!=392;++i)if(tbl[i]!==undefined)SSF.load(tbl[i],i)}};make_ssf(SSF);{var VT_EMPTY=0;var VT_NULL=1;var VT_I2=2;var VT_I4=3;var VT_R4=4;var VT_R8=5;var VT_CY=6;var VT_DATE=7;var VT_BSTR=8;var VT_ERROR=10;var VT_BOOL=11;var VT_VARIANT=12;var VT_DECIMAL=14;var VT_I1=16;var VT_UI1=17;var VT_UI2=18;var VT_UI4=19;var VT_I8=20;var VT_UI8=21;var VT_INT=22;var VT_UINT=23;var VT_LPSTR=30;var VT_LPWSTR=31;var VT_FILETIME=64;var VT_BLOB=65;var VT_STREAM=66;var VT_STORAGE=67;var VT_STREAMED_Object=68;
25798 var VT_STORED_Object=69;var VT_BLOB_Object=70;var VT_CF=71;var VT_CLSID=72;var VT_VERSIONED_STREAM=73;var VT_VECTOR=4096;var VT_ARRAY=8192;var VT_STRING=80;var VT_USTR=81;var VT_CUSTOM=[VT_STRING,VT_USTR]}var DocSummaryPIDDSI={1:{n:"CodePage",t:VT_I2},2:{n:"Category",t:VT_STRING},3:{n:"PresentationFormat",t:VT_STRING},4:{n:"ByteCount",t:VT_I4},5:{n:"LineCount",t:VT_I4},6:{n:"ParagraphCount",t:VT_I4},7:{n:"SlideCount",t:VT_I4},8:{n:"NoteCount",t:VT_I4},9:{n:"HiddenCount",t:VT_I4},10:{n:"MultimediaClipCount",t:VT_I4},11:{n:"Scale",t:VT_BOOL},12:{n:"HeadingPair",t:VT_VECTOR|VT_VARIANT},13:{n:"DocParts",t:VT_VECTOR|VT_LPSTR},14:{n:"Manager",t:VT_STRING},15:{n:"Company",t:VT_STRING},16:{n:"LinksDirty",t:VT_BOOL},17:{n:"CharacterCount",t:VT_I4},19:{n:"SharedDoc",t:VT_BOOL},22:{n:"HLinksChanged",t:VT_BOOL},23:{n:"AppVersion",t:VT_I4,p:"version"},26:{n:"ContentType",t:VT_STRING},27:{n:"ContentStatus",t:VT_STRING},28:{n:"Language",t:VT_STRING},29:{n:"Version",t:VT_STRING},255:{}};var SummaryPIDSI={1:{n:"CodePage",t:VT_I2},2:{n:"Title",t:VT_STRING},3:{n:"Subject",t:VT_STRING},4:{n:"Author",t:VT_STRING},5:{n:"Keywords",t:VT_STRING},6:{n:"Comments",t:VT_STRING},7:{n:"Template",t:VT_STRING},8:{n:"LastAuthor",t:VT_STRING},9:{n:"RevNumber",t:VT_STRING},10:{n:"EditTime",t:VT_FILETIME},11:{n:"LastPrinted",t:VT_FILETIME},12:{n:"CreatedDate",t:VT_FILETIME},13:{n:"ModifiedDate",t:VT_FILETIME},14:{n:"PageCount",t:VT_I4},15:{n:"WordCount",t:VT_I4},16:{n:"CharCount",t:VT_I4},17:{n:"Thumbnail",t:VT_CF},18:{n:"ApplicationName",t:VT_LPSTR},19:{n:"DocumentSecurity",t:VT_I4},255:{}};var SpecialProperties={2147483648:{n:"Locale",t:VT_UI4},2147483651:{n:"Behavior",t:VT_UI4},1768515945:{}};(function(){for(var y in SpecialProperties)if(SpecialProperties.hasOwnProperty(y))DocSummaryPIDDSI[y]=SummaryPIDSI[y]=SpecialProperties[y]})();function parse_FILETIME(blob){var dwLowDateTime=blob.read_shift(4),dwHighDateTime=blob.read_shift(4);return new Date((dwHighDateTime/1e7*Math.pow(2,32)+dwLowDateTime/1e7-11644473600)*1e3).toISOString().replace(/\.000/,"")}function parse_lpstr(blob,type,pad){var str=blob.read_shift(0,"lpstr");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_lpwstr(blob,type,pad){var str=blob.read_shift(0,"lpwstr");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_VtStringBase(blob,stringType,pad){if(stringType===31)return parse_lpwstr(blob);return parse_lpstr(blob,stringType,pad)}function parse_VtString(blob,t,pad){return parse_VtStringBase(blob,t,pad===false?0:4)}function parse_VtUnalignedString(blob,t){if(!t)throw new Error("dafuq?");return parse_VtStringBase(blob,t,0)}function parse_VtVecUnalignedLpstrValue(blob){var length=blob.read_shift(4);var ret=[];for(var i=0;i!=length;++i)ret[i]=blob.read_shift(0,"lpstr");return ret}function parse_VtVecUnalignedLpstr(blob){return parse_VtVecUnalignedLpstrValue(blob)}function parse_VtHeadingPair(blob){var headingString=parse_TypedPropertyValue(blob,VT_USTR);var headerParts=parse_TypedPropertyValue(blob,VT_I4);return[headingString,headerParts]}function parse_VtVecHeadingPairValue(blob){var cElements=blob.read_shift(4);var out=[];for(var i=0;i!=cElements/2;++i)out.push(parse_VtHeadingPair(blob));return out}function parse_VtVecHeadingPair(blob){return parse_VtVecHeadingPairValue(blob)}function parse_dictionary(blob,CodePage){var cnt=blob.read_shift(4);var dict={};for(var j=0;j!=cnt;++j){var pid=blob.read_shift(4);var len=blob.read_shift(4);dict[pid]=blob.read_shift(len,CodePage===1200?"utf16le":"utf8").replace(chr0,"").replace(chr1,"!")}if(blob.l&3)blob.l=blob.l>>2+1<<2;return dict}function parse_BLOB(blob){var size=blob.read_shift(4);var bytes=blob.slice(blob.l,blob.l+size);if(size&3>0)blob.l+=4-(size&3)&3;return bytes}function parse_ClipboardData(blob){var o={};o.Size=blob.read_shift(4);blob.l+=o.Size;return o}function parse_VtVector(blob,cb){}function parse_TypedPropertyValue(blob,type,_opts){var t=blob.read_shift(2),ret,opts=_opts||{};blob.l+=2;if(type!==VT_VARIANT)if(t!==type&&VT_CUSTOM.indexOf(type)===-1)throw new Error("Expected type "+type+" saw "+t);switch(type===VT_VARIANT?t:type){case 2:ret=blob.read_shift(2,"i");if(!opts.raw)blob.l+=2;return ret;case 3:ret=blob.read_shift(4,"i");return ret;case 11:return blob.read_shift(4)!==0;case 19:ret=blob.read_shift(4);return ret;case 30:return parse_lpstr(blob,t,4).replace(chr0,"");case 31:return parse_lpwstr(blob);case 64:return parse_FILETIME(blob);case 65:return parse_BLOB(blob);case 71:return parse_ClipboardData(blob);case 80:return parse_VtString(blob,t,!opts.raw&&4).replace(chr0,"");case 81:return parse_VtUnalignedString(blob,t,4).replace(chr0,"");case 4108:return parse_VtVecHeadingPair(blob);case 4126:return parse_VtVecUnalignedLpstr(blob);default:throw new Error("TypedPropertyValue unrecognized type "+type+" "+t)}}function parse_PropertySet(blob,PIDSI){var start_addr=blob.l;var size=blob.read_shift(4);var NumProps=blob.read_shift(4);var Props=[],i=0;var CodePage=0;var Dictionary=-1,DictObj;for(i=0;i!=NumProps;++i){var PropID=blob.read_shift(4);var Offset=blob.read_shift(4);Props[i]=[PropID,Offset+start_addr]}var PropH={};for(i=0;i!=NumProps;++i){if(blob.l!==Props[i][1]){var fail=true;if(i>0&&PIDSI)switch(PIDSI[Props[i-1][0]].t){case 2:if(blob.l+2===Props[i][1]){blob.l+=2;fail=false}break;case 80:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break;case 4108:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break}if(!PIDSI&&blob.l<=Props[i][1]){fail=false;blob.l=Props[i][1]}if(fail)throw new Error("Read Error: Expected address "+Props[i][1]+" at "+blob.l+" :"+i)}if(PIDSI){var piddsi=PIDSI[Props[i][0]];PropH[piddsi.n]=parse_TypedPropertyValue(blob,piddsi.t,{raw:true});if(piddsi.p==="version")PropH[piddsi.n]=String(PropH[piddsi.n]>>16)+"."+String(PropH[piddsi.n]&65535);if(piddsi.n=="CodePage")switch(PropH[piddsi.n]){case 0:PropH[piddsi.n]=1252;case 1e4:case 1252:case 874:case 1250:case 1251:case 1253:case 1254:case 1255:case 1256:case 1257:case 1258:case 932:case 936:case 949:case 950:case 1200:case 1201:case 65e3:case-536:case 65001:case-535:set_cp(CodePage=PropH[piddsi.n]);break;default:throw new Error("Unsupported CodePage: "+PropH[piddsi.n])}}else{if(Props[i][0]===1){CodePage=PropH.CodePage=parse_TypedPropertyValue(blob,VT_I2);set_cp(CodePage);if(Dictionary!==-1){var oldpos=blob.l;blob.l=Props[Dictionary][1];DictObj=parse_dictionary(blob,CodePage);blob.l=oldpos}}else if(Props[i][0]===0){if(CodePage===0){Dictionary=i;blob.l=Props[i+1][1];continue}DictObj=parse_dictionary(blob,CodePage)}else{var name=DictObj[Props[i][0]];var val;switch(blob[blob.l]){case 65:blob.l+=4;val=parse_BLOB(blob);break;case 30:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 31:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 3:blob.l+=4;val=blob.read_shift(4,"i");break;case 19:blob.l+=4;val=blob.read_shift(4);break;case 5:blob.l+=4;val=blob.read_shift(8,"f");break;case 11:blob.l+=4;val=parsebool(blob,4);break;case 64:blob.l+=4;val=new Date(parse_FILETIME(blob));break;default:throw new Error("unparsed value: "+blob[blob.l])}PropH[name]=val}}}blob.l=start_addr+size;return PropH}function parse_PropertySetStream(file,PIDSI){var blob=file.content;prep_blob(blob,0);var NumSets,FMTID0,FMTID1,Offset0,Offset1;blob.chk("feff","Byte Order: ");var vers=blob.read_shift(2);var SystemIdentifier=blob.read_shift(4);blob.chk(CFB.utils.consts.HEADER_CLSID,"CLSID: ");NumSets=blob.read_shift(4);if(NumSets!==1&&NumSets!==2)throw"Unrecognized #Sets: "+NumSets;FMTID0=blob.read_shift(16);Offset0=blob.read_shift(4);if(NumSets===1&&Offset0!==blob.l)throw"Length mismatch";else if(NumSets===2){FMTID1=blob.read_shift(16);Offset1=blob.read_shift(4)}var PSet0=parse_PropertySet(blob,PIDSI);var rval={SystemIdentifier:SystemIdentifier};for(var y in PSet0)rval[y]=PSet0[y];rval.FMTID=FMTID0;if(NumSets===1)return rval;if(blob.l!==Offset1)throw"Length mismatch 2: "+blob.l+" !== "+Offset1;var PSet1;try{PSet1=parse_PropertySet(blob,null)}catch(e){}for(y in PSet1)rval[y]=PSet1[y];rval.FMTID=[FMTID0,FMTID1];return rval}var DO_NOT_EXPORT_CFB=true;var CFB=function _CFB(){var exports={};exports.version="0.10.0";function parse(file){var mver=3;var ssz=512;var nmfs=0;var ndfs=0;var dir_start=0;var minifat_start=0;var difat_start=0;var fat_addrs=[];var blob=file.slice(0,512);prep_blob(blob,0);mver=check_get_mver(blob);switch(mver){case 3:ssz=512;break;case 4:ssz=4096;break;default:throw"Major Version: Expected 3 or 4 saw "+mver}if(ssz!==512){blob=file.slice(0,ssz);prep_blob(blob,28)}var header=file.slice(0,ssz);check_shifts(blob,mver);var nds=blob.read_shift(4,"i");if(mver===3&&nds!==0)throw"# Directory Sectors: Expected 0 saw "+nds;blob.l+=4;dir_start=blob.read_shift(4,"i");blob.l+=4;blob.chk("00100000","Mini Stream Cutoff Size: ");minifat_start=blob.read_shift(4,"i");nmfs=blob.read_shift(4,"i");difat_start=blob.read_shift(4,"i");ndfs=blob.read_shift(4,"i");for(var q,j=0;j<109;++j){q=blob.read_shift(4,"i");if(q<0)break;fat_addrs[j]=q}var sectors=sectorify(file,ssz);sleuth_fat(difat_start,ndfs,sectors,ssz,fat_addrs);var sector_list=make_sector_list(sectors,dir_start,fat_addrs,ssz);sector_list[dir_start].name="!Directory";if(nmfs>0&&minifat_start!==ENDOFCHAIN)sector_list[minifat_start].name="!MiniFAT";sector_list[fat_addrs[0]].name="!FAT";var files={},Paths=[],FileIndex=[],FullPaths=[],FullPathDir={};read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex);build_full_paths(FileIndex,FullPathDir,FullPaths,Paths);var root_name=Paths.shift();Paths.root=root_name;var find_path=make_find_path(FullPaths,Paths,FileIndex,files,root_name);return{raw:{header:header,sectors:sectors},FileIndex:FileIndex,FullPaths:FullPaths,FullPathDir:FullPathDir,find:find_path}}function check_get_mver(blob){blob.chk(HEADER_SIGNATURE,"Header Signature: ");blob.chk(HEADER_CLSID,"CLSID: ");blob.l+=2;return blob.read_shift(2,"u")}function check_shifts(blob,mver){var shift=9;blob.chk("feff","Byte Order: ");switch(shift=blob.read_shift(2)){case 9:if(mver!==3)throw"MajorVersion/SectorShift Mismatch";break;case 12:if(mver!==4)throw"MajorVersion/SectorShift Mismatch";break;default:throw"Sector Shift: Expected 9 or 12 saw "+shift}blob.chk("0600","Mini Sector Shift: ");blob.chk("000000000000","Reserved: ")}function sectorify(file,ssz){var nsectors=Math.ceil(file.length/ssz)-1;var sectors=new Array(nsectors);for(var i=1;i<nsectors;++i)sectors[i-1]=file.slice(i*ssz,(i+1)*ssz);sectors[nsectors-1]=file.slice(nsectors*ssz);return sectors}function build_full_paths(FI,FPD,FP,Paths){var i=0,L=0,R=0,C=0,j=0,pl=Paths.length;var dad=new Array(pl),q=new Array(pl);for(;i<pl;++i){dad[i]=q[i]=i;FP[i]=Paths[i]}for(;j<q.length;++j){i=q[j];L=FI[i].L;R=FI[i].R;C=FI[i].C;if(dad[i]===i){if(L!==-1&&dad[L]!==L)dad[i]=dad[L];if(R!==-1&&dad[R]!==R)dad[i]=dad[R]}if(C!==-1)dad[C]=i;if(L!==-1){dad[L]=dad[i];q.push(L)}if(R!==-1){dad[R]=dad[i];q.push(R)}}for(i=1;i!==pl;++i)if(dad[i]===i){if(R!==-1&&dad[R]!==R)dad[i]=dad[R];else if(L!==-1&&dad[L]!==L)dad[i]=dad[L]}for(i=1;i<pl;++i){if(FI[i].type===0)continue;j=dad[i];if(j===0)FP[i]=FP[0]+"/"+FP[i];else while(j!==0){FP[i]=FP[j]+"/"+FP[i];j=dad[j]}dad[i]=0}FP[0]+="/";for(i=1;i<pl;++i){if(FI[i].type!==2)FP[i]+="/";FPD[FP[i]]=FI[i]}}function make_find_path(FullPaths,Paths,FileIndex,files,root_name){var UCFullPaths=new Array(FullPaths.length);var UCPaths=new Array(Paths.length),i;for(i=0;i<FullPaths.length;++i)UCFullPaths[i]=FullPaths[i].toUpperCase();for(i=0;i<Paths.length;++i)UCPaths[i]=Paths[i].toUpperCase();return function find_path(path){var k;if(path.charCodeAt(0)===47){k=true;path=root_name+path}else k=path.indexOf("/")!==-1;var UCPath=path.toUpperCase();var w=k===true?UCFullPaths.indexOf(UCPath):UCPaths.indexOf(UCPath);if(w===-1)return null;return k===true?FileIndex[w]:files[Paths[w]]}}function sleuth_fat(idx,cnt,sectors,ssz,fat_addrs){var q;if(idx===ENDOFCHAIN){if(cnt!==0)throw"DIFAT chain shorter than expected"}else if(idx!==-1){var sector=sectors[idx],m=(ssz>>>2)-1;for(var i=0;i<m;++i){if((q=__readInt32LE(sector,i*4))===ENDOFCHAIN)break;fat_addrs.push(q)}sleuth_fat(__readInt32LE(sector,ssz-4),cnt-1,sectors,ssz,fat_addrs)}}function make_sector_list(sectors,dir_start,fat_addrs,ssz){var sl=sectors.length,sector_list=new Array(sl);var chkd=new Array(sl),buf,buf_chain;var modulus=ssz-1,i,j,k,jj;for(i=0;i<sl;++i){buf=[];k=i+dir_start;if(k>=sl)k-=sl;if(chkd[k]===true)continue;buf_chain=[];for(j=k;j>=0;){chkd[j]=true;buf[buf.length]=j;buf_chain.push(sectors[j]);var addr=fat_addrs[Math.floor(j*4/ssz)];jj=j*4&modulus;if(ssz<4+jj)throw"FAT boundary crossed: "+j+" 4 "+ssz;j=__readInt32LE(sectors[addr],jj)}sector_list[k]={nodes:buf,data:__toBuffer([buf_chain])}}return sector_list}function read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex){var blob;var minifat_store=0,pl=Paths.length?2:0;var sector=sector_list[dir_start].data;var i=0,namelen=0,name,o,ctime,mtime;for(;i<sector.length;i+=128){blob=sector.slice(i,i+128);prep_blob(blob,64);namelen=blob.read_shift(2);if(namelen===0)continue;name=__utf16le(blob,0,namelen-pl).replace(chr0,"").replace(chr1,"!");Paths.push(name);o={name:name,type:blob.read_shift(1),color:blob.read_shift(1),L:blob.read_shift(4,"i"),R:blob.read_shift(4,"i"),C:blob.read_shift(4,"i"),clsid:blob.read_shift(16),state:blob.read_shift(4,"i")};ctime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(ctime!==0){o.ctime=ctime;o.ct=read_date(blob,blob.l-8)}mtime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(mtime!==0){o.mtime=mtime;o.mt=read_date(blob,blob.l-8)}o.start=blob.read_shift(4,"i");o.size=blob.read_shift(4,"i");if(o.type===5){minifat_store=o.start;if(nmfs>0&&minifat_store!==ENDOFCHAIN)sector_list[minifat_store].name="!StreamData"}else if(o.size>=4096){o.storage="fat";if(sector_list[o.start]===undefined)if((o.start+=dir_start)>=sectors.length)o.start-=sectors.length;sector_list[o.start].name=o.name;o.content=sector_list[o.start].data.slice(0,o.size);prep_blob(o.content,0)}else{o.storage="minifat";if(minifat_store!==ENDOFCHAIN&&o.start!==ENDOFCHAIN){o.content=sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size);prep_blob(o.content,0)}}files[name]=o;FileIndex.push(o)}}function read_date(blob,offset){return new Date((__readUInt32LE(blob,offset+4)/1e7*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7-11644473600)*1e3)}var fs;function readFileSync(filename){if(fs===undefined)fs=require("fs");return parse(fs.readFileSync(filename))}function readSync(blob,options){switch(options!==undefined&&options.type!==undefined?options.type:"base64"){case"file":return readFileSync(blob);case"base64":return parse(s2a(Base64.decode(blob)));case"binary":return parse(s2a(blob))}return parse(blob)}var MSSZ=64;var ENDOFCHAIN=-2;var HEADER_SIGNATURE="d0cf11e0a1b11ae1";var HEADER_CLSID="00000000000000000000000000000000";var consts={MAXREGSECT:-6,DIFSECT:-4,FATSECT:-3,ENDOFCHAIN:ENDOFCHAIN,FREESECT:-1,HEADER_SIGNATURE:HEADER_SIGNATURE,HEADER_MINOR_VERSION:"3e00",MAXREGSID:-6,NOSTREAM:-1,HEADER_CLSID:HEADER_CLSID,EntryTypes:["unknown","storage","stream","lockbytes","property","root"]};exports.read=readSync;exports.parse=parse;exports.utils={ReadShift:ReadShift,CheckField:CheckField,prep_blob:prep_blob,bconcat:bconcat,consts:consts};return exports}();if(typeof require!=="undefined"&&typeof module!=="undefined"&&typeof DO_NOT_EXPORT_CFB==="undefined"){module.exports=CFB}function parsenoop(blob,length){blob.read_shift(length);return}function parsenoop2(blob,length){blob.read_shift(length);return null}function parslurp(blob,length,cb){var arr=[],target=blob.l+length;while(blob.l<target)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error("Slurp error");return arr}function parslurp2(blob,length,cb){var arr=[],target=blob.l+length,len=blob.read_shift(2);while(len--!==0)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error("Slurp error");return arr}function parsebool(blob,length){return blob.read_shift(length)===1}function parseuint16(blob){return blob.read_shift(2,"u")}function parseuint16a(blob,length){return parslurp(blob,length,parseuint16)}var parse_Boolean=parsebool;function parse_Bes(blob){var v=blob.read_shift(1),t=blob.read_shift(1);return t===1?BERR[v]:v===1}function parse_ShortXLUnicodeString(blob,length,opts){var cch=blob.read_shift(1);var width=1,encoding="sbcs";if(opts===undefined||opts.biff!==5){var fHighByte=blob.read_shift(1);if(fHighByte){width=2;encoding="dbcs"}}return cch?blob.read_shift(cch,encoding):""}function parse_XLUnicodeRichExtendedString(blob){var cch=blob.read_shift(2),flags=blob.read_shift(1);var fHighByte=flags&1,fExtSt=flags&4,fRichSt=flags&8;var width=1+(flags&1);var cRun,cbExtRst;var z={};if(fRichSt)cRun=blob.read_shift(2);if(fExtSt)cbExtRst=blob.read_shift(4);var encoding=flags&1?"dbcs":"sbcs";var msg=cch===0?"":blob.read_shift(cch,encoding);if(fRichSt)blob.l+=4*cRun;if(fExtSt)blob.l+=cbExtRst;z.t=msg;if(!fRichSt){z.raw="<t>"+z.t+"</t>";z.r=z.t}return z}function parse_XLUnicodeStringNoCch(blob,cch,opts){var retval;var fHighByte=blob.read_shift(1);if(fHighByte===0){retval=blob.read_shift(cch,"sbcs")}else{retval=blob.read_shift(cch,"dbcs")}return retval}function parse_XLUnicodeString(blob,length,opts){var cch=blob.read_shift(opts!==undefined&&opts.biff===5?1:2);if(cch===0){blob.l++;return""}return parse_XLUnicodeStringNoCch(blob,cch,opts)}function parse_XLUnicodeString2(blob,length,opts){if(opts.biff!==5)return parse_XLUnicodeString(blob,length,opts);var cch=blob.read_shift(1);if(cch===0){blob.l++;return""}return blob.read_shift(cch,"sbcs")}function parse_Xnum(blob){return blob.read_shift(8,"f")}var parse_ControlInfo=parsenoop;var parse_URLMoniker=function(blob,length){var len=blob.read_shift(4),start=blob.l;var extra=false;if(len>24){blob.l+=len-24;if(blob.read_shift(16)==="795881f43b1d7f48af2c825dc4852763")extra=true;blob.l=start}var url=blob.read_shift((extra?len-24:len)>>1,"utf16le").replace(chr0,"");if(extra)blob.l+=24;return url};var parse_FileMoniker=function(blob,length){var cAnti=blob.read_shift(2);var ansiLength=blob.read_shift(4);var ansiPath=blob.read_shift(ansiLength,"cstr");var endServer=blob.read_shift(2);var versionNumber=blob.read_shift(2);var cbUnicodePathSize=blob.read_shift(4);if(cbUnicodePathSize===0)return ansiPath.replace(/\\/g,"/");var cbUnicodePathBytes=blob.read_shift(4);var usKeyValue=blob.read_shift(2);var unicodePath=blob.read_shift(cbUnicodePathBytes>>1,"utf16le").replace(chr0,"");return unicodePath};var parse_HyperlinkMoniker=function(blob,length){var clsid=blob.read_shift(16);length-=16;switch(clsid){case"e0c9ea79f9bace118c8200aa004ba90b":return parse_URLMoniker(blob,length);case"0303000000000000c000000000000046":return parse_FileMoniker(blob,length);default:throw"unsupported moniker "+clsid}};var parse_HyperlinkString=function(blob,length){var len=blob.read_shift(4);var o=blob.read_shift(len,"utf16le").replace(chr0,"");return o};var parse_Hyperlink=function(blob,length){var end=blob.l+length;var sVer=blob.read_shift(4);if(sVer!==2)throw new Error("Unrecognized streamVersion: "+sVer);var flags=blob.read_shift(2);blob.l+=2;var displayName,targetFrameName,moniker,oleMoniker,location,guid,fileTime;if(flags&16)displayName=parse_HyperlinkString(blob,end-blob.l);if(flags&128)targetFrameName=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===257)moniker=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===1)oleMoniker=parse_HyperlinkMoniker(blob,end-blob.l);if(flags&8)location=parse_HyperlinkString(blob,end-blob.l);if(flags&32)guid=blob.read_shift(16);if(flags&64)fileTime=parse_FILETIME(blob,8);blob.l=end;var target=targetFrameName||moniker||oleMoniker;if(location)target+="#"+location;return{Target:target}};function isval(x){return x!==undefined&&x!==null}function keys(o){return Object.keys(o)}function evert(obj,arr){var o={};var K=keys(obj);for(var i=0;i<K.length;++i){var k=K[i];if(!arr)o[obj[k]]=k;else(o[obj[k]]=o[obj[k]]||[]).push(k)}return o}function parse_Cell(blob,length){var rw=blob.read_shift(2);var col=blob.read_shift(2);var ixfe=blob.read_shift(2);return{r:rw,c:col,ixfe:ixfe}}function parse_frtHeader(blob){var rt=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=8;return{type:rt,flags:flags}}function parse_OptXLUnicodeString(blob,length,opts){return length===0?"":parse_XLUnicodeString2(blob,length,opts)}var HIDEOBJENUM=["SHOWALL","SHOWPLACEHOLDER","HIDEALL"];var parse_HideObjEnum=parseuint16;function parse_XTI(blob,length){var iSupBook=blob.read_shift(2),itabFirst=blob.read_shift(2,"i"),itabLast=blob.read_shift(2,"i");return[iSupBook,itabFirst,itabLast]}function parse_RkNumber(blob){var b=blob.slice(blob.l,blob.l+4);var fX100=b[0]&1,fInt=b[0]&2;blob.l+=4;b[0]&=~3;var RK=fInt===0?__double([0,0,0,0,b[0],b[1],b[2],b[3]],0):__readInt32LE(b,0)>>2;return fX100?RK/100:RK}function parse_RkRec(blob,length){var ixfe=blob.read_shift(2);var RK=parse_RkNumber(blob);return[ixfe,RK]}function parse_AddinUdf(blob,length){blob.l+=4;length-=4;var l=blob.l+length;var udfName=parse_ShortXLUnicodeString(blob,length);var cb=blob.read_shift(2);l-=blob.l;if(cb!==l)throw"Malformed AddinUdf: padding = "+l+" != "+cb;blob.l+=cb;return udfName}function parse_Ref8U(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(2);var colLast=blob.read_shift(2);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}function parse_RefU(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(1);var colLast=blob.read_shift(1);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}var parse_Ref=parse_RefU;function parse_FtCmo(blob,length){blob.l+=4;var ot=blob.read_shift(2);var id=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=12;return[id,ot,flags]}function parse_FtNts(blob,length){var out={};blob.l+=4;blob.l+=16;out.fSharedNote=blob.read_shift(2);blob.l+=4;return out}function parse_FtCf(blob,length){var out={};blob.l+=4;blob.cf=blob.read_shift(2);return out}var FtTab={21:parse_FtCmo,19:parsenoop,18:function(blob,length){blob.l+=12},17:function(blob,length){blob.l+=8},16:parsenoop,15:parsenoop,13:parse_FtNts,12:function(blob,length){blob.l+=24},11:function(blob,length){blob.l+=10},10:function(blob,length){blob.l+=16},9:parsenoop,8:function(blob,length){blob.l+=6},7:parse_FtCf,6:function(blob,length){blob.l+=6},4:parsenoop,0:function(blob,length){blob.l+=4}};function parse_FtArray(blob,length,ot){var s=blob.l;var fts=[];while(blob.l<s+length){var ft=blob.read_shift(2);blob.l-=2;try{fts.push(FtTab[ft](blob,s+length-blob.l))}catch(e){blob.l=s+length;return fts}}if(blob.l!=s+length)blob.l=s+length;return fts}var parse_FontIndex=parseuint16;function parse_BOF(blob,length){var o={};o.BIFFVer=blob.read_shift(2);length-=2;if(o.BIFFVer!==1536&&o.BIFFVer!==1280)throw"Unexpected BIFF Ver "+o.BIFFVer;blob.read_shift(length);return o}function parse_InterfaceHdr(blob,length){if(length===0)return 1200;var q;if((q=blob.read_shift(2))!==1200)throw"InterfaceHdr codePage "+q;return 1200}function parse_WriteAccess(blob,length,opts){if(opts.enc){blob.l+=length;return""}var l=blob.l;var UserName=parse_XLUnicodeString(blob,0,opts);blob.read_shift(length+l-blob.l);return UserName}function parse_BoundSheet8(blob,length,opts){var pos=blob.read_shift(4);var hidden=blob.read_shift(1)>>6;var dt=blob.read_shift(1);switch(dt){case 0:dt="Worksheet";break;case 1:dt="Macrosheet";break;case 2:dt="Chartsheet";break;case 6:dt="VBAModule";break}var name=parse_ShortXLUnicodeString(blob,0,opts);return{pos:pos,hs:hidden,dt:dt,name:name}}function parse_SST(blob,length){var cnt=blob.read_shift(4);var ucnt=blob.read_shift(4);var strs=[];for(var i=0;i!=ucnt;++i){strs.push(parse_XLUnicodeRichExtendedString(blob))}strs.Count=cnt;strs.Unique=ucnt;return strs}function parse_ExtSST(blob,length){var extsst={};extsst.dsst=blob.read_shift(2);blob.l+=length-2;return extsst}function parse_Row(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2),Col=blob.read_shift(2),rht=blob.read_shift(2);blob.read_shift(4);var flags=blob.read_shift(1);blob.read_shift(1);blob.read_shift(2);return{r:rw,c:col,cnt:Col-col}}function parse_ForceFullCalculation(blob,length){var header=parse_frtHeader(blob);if(header.type!=2211)throw"Invalid Future Record "+header.type;var fullcalc=blob.read_shift(4);return fullcalc!==0}var parse_CompressPictures=parsenoop2;function parse_RecalcId(blob,length){blob.read_shift(2);return blob.read_shift(4)}function parse_DefaultRowHeight(blob,length){var f=blob.read_shift(2),miyRw;miyRw=blob.read_shift(2);var fl={Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};return[fl,miyRw]}function parse_Window1(blob,length){var xWn=blob.read_shift(2),yWn=blob.read_shift(2),dxWn=blob.read_shift(2),dyWn=blob.read_shift(2);var flags=blob.read_shift(2),iTabCur=blob.read_shift(2),iTabFirst=blob.read_shift(2);var ctabSel=blob.read_shift(2),wTabRatio=blob.read_shift(2);return{Pos:[xWn,yWn],Dim:[dxWn,dyWn],Flags:flags,CurTab:iTabCur,FirstTab:iTabFirst,Selected:ctabSel,TabRatio:wTabRatio}}function parse_Font(blob,length,opts){blob.l+=14;var name=parse_ShortXLUnicodeString(blob,0,opts);return name}function parse_LabelSst(blob,length){var cell=parse_Cell(blob);cell.isst=blob.read_shift(4);return cell}function parse_Label(blob,length,opts){var cell=parse_Cell(blob,6);var str=parse_XLUnicodeString(blob,length-6,opts);cell.val=str;return cell}function parse_Format(blob,length,opts){var ifmt=blob.read_shift(2);var fmtstr=parse_XLUnicodeString2(blob,0,opts);return[ifmt,fmtstr]}function parse_Dimensions(blob,length){var w=length===10?2:4;var r=blob.read_shift(w),R=blob.read_shift(w),c=blob.read_shift(2),C=blob.read_shift(2);blob.l+=2;return{s:{r:r,c:c},e:{r:R,c:C}}}function parse_RK(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrec=parse_RkRec(blob);return{r:rw,c:col,ixfe:rkrec[0],rknum:rkrec[1]}}function parse_MulRk(blob,length){var target=blob.l+length-2;var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrecs=[];while(blob.l<target)rkrecs.push(parse_RkRec(blob));if(blob.l!==target)throw"MulRK read error";var lastcol=blob.read_shift(2);if(rkrecs.length!=lastcol-col+1)throw"MulRK length mismatch";return{r:rw,c:col,C:lastcol,rkrec:rkrecs}}var parse_CellXF=parsenoop;var parse_StyleXF=parsenoop;function parse_XF(blob,length){var o={};o.ifnt=blob.read_shift(2);o.ifmt=blob.read_shift(2);o.flags=blob.read_shift(2);o.fStyle=o.flags>>2&1;length-=6;o.data=o.fStyle?parse_StyleXF(blob,length):parse_CellXF(blob,length);return o}function parse_Guts(blob,length){blob.l+=4;var out=[blob.read_shift(2),blob.read_shift(2)];if(out[0]!==0)out[0]--;if(out[1]!==0)out[1]--;if(out[0]>7||out[1]>7)throw"Bad Gutters: "+out;return out}function parse_BoolErr(blob,length){var cell=parse_Cell(blob,6);var val=parse_Bes(blob,2);cell.val=val;cell.t=val===true||val===false?"b":"e";return cell}function parse_Number(blob,length){var cell=parse_Cell(blob,6);var xnum=parse_Xnum(blob,8);cell.val=xnum;return cell}var parse_XLHeaderFooter=parse_OptXLUnicodeString;function parse_SupBook(blob,length,opts){var end=blob.l+length;var ctab=blob.read_shift(2);var cch=blob.read_shift(2);var virtPath;if(cch>=1&&cch<=255)virtPath=parse_XLUnicodeStringNoCch(blob,cch);var rgst=blob.read_shift(end-blob.l);opts.sbcch=cch;return[cch,ctab,virtPath,rgst]}function parse_ExternName(blob,length,opts){var flags=blob.read_shift(2);var body;var o={fBuiltIn:flags&1,fWantAdvise:flags>>>1&1,fWantPict:flags>>>2&1,fOle:flags>>>3&1,fOleLink:flags>>>4&1,cf:flags>>>5&1023,fIcon:flags>>>15&1};if(opts.sbcch===14849)body=parse_AddinUdf(blob,length-2);o.body=body||blob.read_shift(length-2);return o}function parse_Lbl(blob,length,opts){if(opts.biff<8)return parse_Label(blob,length,opts);var target=blob.l+length;var flags=blob.read_shift(2);var chKey=blob.read_shift(1);var cch=blob.read_shift(1);var cce=blob.read_shift(2);blob.l+=2;var itab=blob.read_shift(2);blob.l+=4;var name=parse_XLUnicodeStringNoCch(blob,cch,opts);var rgce=parse_NameParsedFormula(blob,target-blob.l,opts,cce);return{chKey:chKey,Name:name,rgce:rgce}}function parse_ExternSheet(blob,length,opts){if(opts.biff<8)return parse_ShortXLUnicodeString(blob,length,opts);var o=parslurp2(blob,length,parse_XTI);var oo=[];if(opts.sbcch===1025){for(var i=0;i!=o.length;++i)oo.push(opts.snames[o[i][1]]);return oo}else return o}function parse_ShrFmla(blob,length,opts){var ref=parse_RefU(blob,6);blob.l++;var cUse=blob.read_shift(1);length-=8;return[parse_SharedParsedFormula(blob,length,opts),cUse]}function parse_Array(blob,length,opts){var ref=parse_Ref(blob,6);blob.l+=6;length-=12;return[ref,parse_ArrayParsedFormula(blob,length,opts,ref)]}function parse_MTRSettings(blob,length){var fMTREnabled=blob.read_shift(4)!==0;var fUserSetThreadCount=blob.read_shift(4)!==0;var cUserThreadCount=blob.read_shift(4);return[fMTREnabled,fUserSetThreadCount,cUserThreadCount]}function parse_NoteSh(blob,length,opts){if(opts.biff<8)return;var row=blob.read_shift(2),col=blob.read_shift(2);var flags=blob.read_shift(2),idObj=blob.read_shift(2);var stAuthor=parse_XLUnicodeString2(blob,0,opts);if(opts.biff<8)blob.read_shift(1);return[{r:row,c:col},stAuthor,idObj,flags]}function parse_Note(blob,length,opts){return parse_NoteSh(blob,length,opts)}function parse_MergeCells(blob,length){var merges=[];var cmcs=blob.read_shift(2);while(cmcs--)merges.push(parse_Ref8U(blob,length));return merges}function parse_Obj(blob,length){var cmo=parse_FtCmo(blob,22);var fts=parse_FtArray(blob,length-22,cmo[1]);return{cmo:cmo,ft:fts}}function parse_TxO(blob,length,opts){var s=blob.l;try{blob.l+=4;var ot=(opts.lastobj||{cmo:[0,0]}).cmo[1];var controlInfo;if([0,5,7,11,12,14].indexOf(ot)==-1)blob.l+=6;else controlInfo=parse_ControlInfo(blob,6,opts);var cchText=blob.read_shift(2);var cbRuns=blob.read_shift(2);var ifntEmpty=parse_FontIndex(blob,2);var len=blob.read_shift(2);blob.l+=len;var texts="";for(var i=1;i<blob.lens.length-1;++i){if(blob.l-s!=blob.lens[i])throw"TxO: bad continue record";var hdr=blob[blob.l];var t=parse_XLUnicodeStringNoCch(blob,blob.lens[i+1]-blob.lens[i]-1);texts+=t;if(texts.length>=(hdr?cchText:2*cchText))break}if(texts.length!==cchText&&texts.length!==cchText*2){throw"cchText: "+cchText+" != "+texts.length}blob.l=s+length;return{t:texts}}catch(e){blob.l=s+length;return{t:texts||""}}}var parse_HLink=function(blob,length){var ref=parse_Ref8U(blob,8);blob.l+=16;var hlink=parse_Hyperlink(blob,length-24);return[ref,hlink]};var parse_HLinkTooltip=function(blob,length){var end=blob.l+length;blob.read_shift(2);var ref=parse_Ref8U(blob,8);var wzTooltip=blob.read_shift((length-10)/2,"dbcs");wzTooltip=wzTooltip.replace(chr0,"");return[ref,wzTooltip]};function parse_Country(blob,length){var o=[],d;d=blob.read_shift(2);o[0]=CountryEnum[d]||d;d=blob.read_shift(2);o[1]=CountryEnum[d]||d;return o}var parse_Backup=parsebool;var parse_Blank=parse_Cell;var parse_BottomMargin=parse_Xnum;var parse_BuiltInFnGroupCount=parseuint16;var parse_CalcCount=parseuint16;var parse_CalcDelta=parse_Xnum;var parse_CalcIter=parsebool;var parse_CalcMode=parseuint16;var parse_CalcPrecision=parsebool;var parse_CalcRefMode=parsenoop2;var parse_CalcSaveRecalc=parsebool;var parse_CodePage=parseuint16;var parse_Compat12=parsebool;var parse_Date1904=parsebool;var parse_DefColWidth=parseuint16;var parse_DSF=parsenoop2;var parse_EntExU2=parsenoop2;var parse_EOF=parsenoop2;var parse_Excel9File=parsenoop2;var parse_FeatHdr=parsenoop2;var parse_FontX=parseuint16;var parse_Footer=parse_XLHeaderFooter;var parse_GridSet=parseuint16;var parse_HCenter=parsebool;var parse_Header=parse_XLHeaderFooter;var parse_HideObj=parse_HideObjEnum;var parse_InterfaceEnd=parsenoop2;var parse_LeftMargin=parse_Xnum;var parse_Mms=parsenoop2;var parse_ObjProtect=parsebool;var parse_Password=parseuint16;var parse_PrintGrid=parsebool;var parse_PrintRowCol=parsebool;var parse_PrintSize=parseuint16;var parse_Prot4Rev=parsebool;var parse_Prot4RevPass=parseuint16;var parse_Protect=parsebool;var parse_RefreshAll=parsebool;var parse_RightMargin=parse_Xnum; 18559 var VT_STORED_Object=69;var VT_BLOB_Object=70;var VT_CF=71;var VT_CLSID=72;var VT_VERSIONED_STREAM=73;var VT_VECTOR=4096;var VT_ARRAY=8192;var VT_STRING=80;var VT_USTR=81;var VT_CUSTOM=[VT_STRING,VT_USTR]}var DocSummaryPIDDSI={1:{n:"CodePage",t:VT_I2},2:{n:"Category",t:VT_STRING},3:{n:"PresentationFormat",t:VT_STRING},4:{n:"ByteCount",t:VT_I4},5:{n:"LineCount",t:VT_I4},6:{n:"ParagraphCount",t:VT_I4},7:{n:"SlideCount",t:VT_I4},8:{n:"NoteCount",t:VT_I4},9:{n:"HiddenCount",t:VT_I4},10:{n:"MultimediaClipCount",t:VT_I4},11:{n:"Scale",t:VT_BOOL},12:{n:"HeadingPair",t:VT_VECTOR|VT_VARIANT},13:{n:"DocParts",t:VT_VECTOR|VT_LPSTR},14:{n:"Manager",t:VT_STRING},15:{n:"Company",t:VT_STRING},16:{n:"LinksDirty",t:VT_BOOL},17:{n:"CharacterCount",t:VT_I4},19:{n:"SharedDoc",t:VT_BOOL},22:{n:"HLinksChanged",t:VT_BOOL},23:{n:"AppVersion",t:VT_I4,p:"version"},26:{n:"ContentType",t:VT_STRING},27:{n:"ContentStatus",t:VT_STRING},28:{n:"Language",t:VT_STRING},29:{n:"Version",t:VT_STRING},255:{}};var SummaryPIDSI={1:{n:"CodePage",t:VT_I2},2:{n:"Title",t:VT_STRING},3:{n:"Subject",t:VT_STRING},4:{n:"Author",t:VT_STRING},5:{n:"Keywords",t:VT_STRING},6:{n:"Comments",t:VT_STRING},7:{n:"Template",t:VT_STRING},8:{n:"LastAuthor",t:VT_STRING},9:{n:"RevNumber",t:VT_STRING},10:{n:"EditTime",t:VT_FILETIME},11:{n:"LastPrinted",t:VT_FILETIME},12:{n:"CreatedDate",t:VT_FILETIME},13:{n:"ModifiedDate",t:VT_FILETIME},14:{n:"PageCount",t:VT_I4},15:{n:"WordCount",t:VT_I4},16:{n:"CharCount",t:VT_I4},17:{n:"Thumbnail",t:VT_CF},18:{n:"ApplicationName",t:VT_LPSTR},19:{n:"DocumentSecurity",t:VT_I4},255:{}};var SpecialProperties={2147483648:{n:"Locale",t:VT_UI4},2147483651:{n:"Behavior",t:VT_UI4},1768515945:{}};(function(){for(var y in SpecialProperties)if(SpecialProperties.hasOwnProperty(y))DocSummaryPIDDSI[y]=SummaryPIDSI[y]=SpecialProperties[y]})();function parse_FILETIME(blob){var dwLowDateTime=blob.read_shift(4),dwHighDateTime=blob.read_shift(4);return new Date((dwHighDateTime/1e7*Math.pow(2,32)+dwLowDateTime/1e7-11644473600)*1e3).toISOString().replace(/\.000/,"")}function parse_lpstr(blob,type,pad){var str=blob.read_shift(0,"lpstr");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_lpwstr(blob,type,pad){var str=blob.read_shift(0,"lpwstr");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_VtStringBase(blob,stringType,pad){if(stringType===31)return parse_lpwstr(blob);return parse_lpstr(blob,stringType,pad)}function parse_VtString(blob,t,pad){return parse_VtStringBase(blob,t,pad===false?0:4)}function parse_VtUnalignedString(blob,t){if(!t)throw new Error("dafuq?");return parse_VtStringBase(blob,t,0)}function parse_VtVecUnalignedLpstrValue(blob){var length=blob.read_shift(4);var ret=[];for(var i=0;i!=length;++i)ret[i]=blob.read_shift(0,"lpstr");return ret}function parse_VtVecUnalignedLpstr(blob){return parse_VtVecUnalignedLpstrValue(blob)}function parse_VtHeadingPair(blob){var headingString=parse_TypedPropertyValue(blob,VT_USTR);var headerParts=parse_TypedPropertyValue(blob,VT_I4);return[headingString,headerParts]}function parse_VtVecHeadingPairValue(blob){var cElements=blob.read_shift(4);var out=[];for(var i=0;i!=cElements/2;++i)out.push(parse_VtHeadingPair(blob));return out}function parse_VtVecHeadingPair(blob){return parse_VtVecHeadingPairValue(blob)}function parse_dictionary(blob,CodePage){var cnt=blob.read_shift(4);var dict={};for(var j=0;j!=cnt;++j){var pid=blob.read_shift(4);var len=blob.read_shift(4);dict[pid]=blob.read_shift(len,CodePage===1200?"utf16le":"utf8").replace(chr0,"").replace(chr1,"!")}if(blob.l&3)blob.l=blob.l>>2+1<<2;return dict}function parse_BLOB(blob){var size=blob.read_shift(4);var bytes=blob.slice(blob.l,blob.l+size);if(size&3>0)blob.l+=4-(size&3)&3;return bytes}function parse_ClipboardData(blob){var o={};o.Size=blob.read_shift(4);blob.l+=o.Size;return o}function parse_VtVector(blob,cb){}function parse_TypedPropertyValue(blob,type,_opts){var t=blob.read_shift(2),ret,opts=_opts||{};blob.l+=2;if(type!==VT_VARIANT)if(t!==type&&VT_CUSTOM.indexOf(type)===-1)throw new Error("Expected type "+type+" saw "+t);switch(type===VT_VARIANT?t:type){case 2:ret=blob.read_shift(2,"i");if(!opts.raw)blob.l+=2;return ret;case 3:ret=blob.read_shift(4,"i");return ret;case 11:return blob.read_shift(4)!==0;case 19:ret=blob.read_shift(4);return ret;case 30:return parse_lpstr(blob,t,4).replace(chr0,"");case 31:return parse_lpwstr(blob);case 64:return parse_FILETIME(blob);case 65:return parse_BLOB(blob);case 71:return parse_ClipboardData(blob);case 80:return parse_VtString(blob,t,!opts.raw&&4).replace(chr0,"");case 81:return parse_VtUnalignedString(blob,t,4).replace(chr0,"");case 4108:return parse_VtVecHeadingPair(blob);case 4126:return parse_VtVecUnalignedLpstr(blob);default:throw new Error("TypedPropertyValue unrecognized type "+type+" "+t)}}function parse_PropertySet(blob,PIDSI){var start_addr=blob.l;var size=blob.read_shift(4);var NumProps=blob.read_shift(4);var Props=[],i=0;var CodePage=0;var Dictionary=-1,DictObj;for(i=0;i!=NumProps;++i){var PropID=blob.read_shift(4);var Offset=blob.read_shift(4);Props[i]=[PropID,Offset+start_addr]}var PropH={};for(i=0;i!=NumProps;++i){if(blob.l!==Props[i][1]){var fail=true;if(i>0&&PIDSI)switch(PIDSI[Props[i-1][0]].t){case 2:if(blob.l+2===Props[i][1]){blob.l+=2;fail=false}break;case 80:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break;case 4108:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break}if(!PIDSI&&blob.l<=Props[i][1]){fail=false;blob.l=Props[i][1]}if(fail)throw new Error("Read Error: Expected address "+Props[i][1]+" at "+blob.l+" :"+i)}if(PIDSI){var piddsi=PIDSI[Props[i][0]];PropH[piddsi.n]=parse_TypedPropertyValue(blob,piddsi.t,{raw:true});if(piddsi.p==="version")PropH[piddsi.n]=String(PropH[piddsi.n]>>16)+"."+String(PropH[piddsi.n]&65535);if(piddsi.n=="CodePage")switch(PropH[piddsi.n]){case 0:PropH[piddsi.n]=1252;case 1e4:case 1252:case 874:case 1250:case 1251:case 1253:case 1254:case 1255:case 1256:case 1257:case 1258:case 932:case 936:case 949:case 950:case 1200:case 1201:case 65e3:case-536:case 65001:case-535:set_cp(CodePage=PropH[piddsi.n]);break;default:throw new Error("Unsupported CodePage: "+PropH[piddsi.n])}}else{if(Props[i][0]===1){CodePage=PropH.CodePage=parse_TypedPropertyValue(blob,VT_I2);set_cp(CodePage);if(Dictionary!==-1){var oldpos=blob.l;blob.l=Props[Dictionary][1];DictObj=parse_dictionary(blob,CodePage);blob.l=oldpos}}else if(Props[i][0]===0){if(CodePage===0){Dictionary=i;blob.l=Props[i+1][1];continue}DictObj=parse_dictionary(blob,CodePage)}else{var name=DictObj[Props[i][0]];var val;switch(blob[blob.l]){case 65:blob.l+=4;val=parse_BLOB(blob);break;case 30:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 31:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 3:blob.l+=4;val=blob.read_shift(4,"i");break;case 19:blob.l+=4;val=blob.read_shift(4);break;case 5:blob.l+=4;val=blob.read_shift(8,"f");break;case 11:blob.l+=4;val=parsebool(blob,4);break;case 64:blob.l+=4;val=new Date(parse_FILETIME(blob));break;default:throw new Error("unparsed value: "+blob[blob.l])}PropH[name]=val}}}blob.l=start_addr+size;return PropH}function parse_PropertySetStream(file,PIDSI){var blob=file.content;prep_blob(blob,0);var NumSets,FMTID0,FMTID1,Offset0,Offset1;blob.chk("feff","Byte Order: ");var vers=blob.read_shift(2);var SystemIdentifier=blob.read_shift(4);blob.chk(CFB.utils.consts.HEADER_CLSID,"CLSID: ");NumSets=blob.read_shift(4);if(NumSets!==1&&NumSets!==2)throw"Unrecognized #Sets: "+NumSets;FMTID0=blob.read_shift(16);Offset0=blob.read_shift(4);if(NumSets===1&&Offset0!==blob.l)throw"Length mismatch";else if(NumSets===2){FMTID1=blob.read_shift(16);Offset1=blob.read_shift(4)}var PSet0=parse_PropertySet(blob,PIDSI);var rval={SystemIdentifier:SystemIdentifier};for(var y in PSet0)rval[y]=PSet0[y];rval.FMTID=FMTID0;if(NumSets===1)return rval;if(blob.l!==Offset1)throw"Length mismatch 2: "+blob.l+" !== "+Offset1;var PSet1;try{PSet1=parse_PropertySet(blob,null)}catch(e){}for(y in PSet1)rval[y]=PSet1[y];rval.FMTID=[FMTID0,FMTID1];return rval}var DO_NOT_EXPORT_CFB=true;var CFB=function _CFB(){var exports={};exports.version="0.10.0";function parse(file){var mver=3;var ssz=512;var nmfs=0;var ndfs=0;var dir_start=0;var minifat_start=0;var difat_start=0;var fat_addrs=[];var blob=file.slice(0,512);prep_blob(blob,0);mver=check_get_mver(blob);switch(mver){case 3:ssz=512;break;case 4:ssz=4096;break;default:throw"Major Version: Expected 3 or 4 saw "+mver}if(ssz!==512){blob=file.slice(0,ssz);prep_blob(blob,28)}var header=file.slice(0,ssz);check_shifts(blob,mver);var nds=blob.read_shift(4,"i");if(mver===3&&nds!==0)throw"# Directory Sectors: Expected 0 saw "+nds;blob.l+=4;dir_start=blob.read_shift(4,"i");blob.l+=4;blob.chk("00100000","Mini Stream Cutoff Size: ");minifat_start=blob.read_shift(4,"i");nmfs=blob.read_shift(4,"i");difat_start=blob.read_shift(4,"i");ndfs=blob.read_shift(4,"i");for(var q,j=0;j<109;++j){q=blob.read_shift(4,"i");if(q<0)break;fat_addrs[j]=q}var sectors=sectorify(file,ssz);sleuth_fat(difat_start,ndfs,sectors,ssz,fat_addrs);var sector_list=make_sector_list(sectors,dir_start,fat_addrs,ssz);sector_list[dir_start].name="!Directory";if(nmfs>0&&minifat_start!==ENDOFCHAIN)sector_list[minifat_start].name="!MiniFAT";sector_list[fat_addrs[0]].name="!FAT";var files={},Paths=[],FileIndex=[],FullPaths=[],FullPathDir={};read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex);build_full_paths(FileIndex,FullPathDir,FullPaths,Paths);var root_name=Paths.shift();Paths.root=root_name;var find_path=make_find_path(FullPaths,Paths,FileIndex,files,root_name);return{raw:{header:header,sectors:sectors},FileIndex:FileIndex,FullPaths:FullPaths,FullPathDir:FullPathDir,find:find_path}}function check_get_mver(blob){blob.chk(HEADER_SIGNATURE,"Header Signature: ");blob.chk(HEADER_CLSID,"CLSID: ");blob.l+=2;return blob.read_shift(2,"u")}function check_shifts(blob,mver){var shift=9;blob.chk("feff","Byte Order: ");switch(shift=blob.read_shift(2)){case 9:if(mver!==3)throw"MajorVersion/SectorShift Mismatch";break;case 12:if(mver!==4)throw"MajorVersion/SectorShift Mismatch";break;default:throw"Sector Shift: Expected 9 or 12 saw "+shift}blob.chk("0600","Mini Sector Shift: ");blob.chk("000000000000","Reserved: ")}function sectorify(file,ssz){var nsectors=Math.ceil(file.length/ssz)-1;var sectors=new Array(nsectors);for(var i=1;i<nsectors;++i)sectors[i-1]=file.slice(i*ssz,(i+1)*ssz);sectors[nsectors-1]=file.slice(nsectors*ssz);return sectors}function build_full_paths(FI,FPD,FP,Paths){var i=0,L=0,R=0,C=0,j=0,pl=Paths.length;var dad=new Array(pl),q=new Array(pl);for(;i<pl;++i){dad[i]=q[i]=i;FP[i]=Paths[i]}for(;j<q.length;++j){i=q[j];L=FI[i].L;R=FI[i].R;C=FI[i].C;if(dad[i]===i){if(L!==-1&&dad[L]!==L)dad[i]=dad[L];if(R!==-1&&dad[R]!==R)dad[i]=dad[R]}if(C!==-1)dad[C]=i;if(L!==-1){dad[L]=dad[i];q.push(L)}if(R!==-1){dad[R]=dad[i];q.push(R)}}for(i=1;i!==pl;++i)if(dad[i]===i){if(R!==-1&&dad[R]!==R)dad[i]=dad[R];else if(L!==-1&&dad[L]!==L)dad[i]=dad[L]}for(i=1;i<pl;++i){if(FI[i].type===0)continue;j=dad[i];if(j===0)FP[i]=FP[0]+"/"+FP[i];else while(j!==0){FP[i]=FP[j]+"/"+FP[i];j=dad[j]}dad[i]=0}FP[0]+="/";for(i=1;i<pl;++i){if(FI[i].type!==2)FP[i]+="/";FPD[FP[i]]=FI[i]}}function make_find_path(FullPaths,Paths,FileIndex,files,root_name){var UCFullPaths=new Array(FullPaths.length);var UCPaths=new Array(Paths.length),i;for(i=0;i<FullPaths.length;++i)UCFullPaths[i]=FullPaths[i].toUpperCase();for(i=0;i<Paths.length;++i)UCPaths[i]=Paths[i].toUpperCase();return function find_path(path){var k;if(path.charCodeAt(0)===47){k=true;path=root_name+path}else k=path.indexOf("/")!==-1;var UCPath=path.toUpperCase();var w=k===true?UCFullPaths.indexOf(UCPath):UCPaths.indexOf(UCPath);if(w===-1)return null;return k===true?FileIndex[w]:files[Paths[w]]}}function sleuth_fat(idx,cnt,sectors,ssz,fat_addrs){var q;if(idx===ENDOFCHAIN){if(cnt!==0)throw"DIFAT chain shorter than expected"}else if(idx!==-1){var sector=sectors[idx],m=(ssz>>>2)-1;for(var i=0;i<m;++i){if((q=__readInt32LE(sector,i*4))===ENDOFCHAIN)break;fat_addrs.push(q)}sleuth_fat(__readInt32LE(sector,ssz-4),cnt-1,sectors,ssz,fat_addrs)}}function make_sector_list(sectors,dir_start,fat_addrs,ssz){var sl=sectors.length,sector_list=new Array(sl);var chkd=new Array(sl),buf,buf_chain;var modulus=ssz-1,i,j,k,jj;for(i=0;i<sl;++i){buf=[];k=i+dir_start;if(k>=sl)k-=sl;if(chkd[k]===true)continue;buf_chain=[];for(j=k;j>=0;){chkd[j]=true;buf[buf.length]=j;buf_chain.push(sectors[j]);var addr=fat_addrs[Math.floor(j*4/ssz)];jj=j*4&modulus;if(ssz<4+jj)throw"FAT boundary crossed: "+j+" 4 "+ssz;j=__readInt32LE(sectors[addr],jj)}sector_list[k]={nodes:buf,data:__toBuffer([buf_chain])}}return sector_list}function read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex){var blob;var minifat_store=0,pl=Paths.length?2:0;var sector=sector_list[dir_start].data;var i=0,namelen=0,name,o,ctime,mtime;for(;i<sector.length;i+=128){blob=sector.slice(i,i+128);prep_blob(blob,64);namelen=blob.read_shift(2);if(namelen===0)continue;name=__utf16le(blob,0,namelen-pl).replace(chr0,"").replace(chr1,"!");Paths.push(name);o={name:name,type:blob.read_shift(1),color:blob.read_shift(1),L:blob.read_shift(4,"i"),R:blob.read_shift(4,"i"),C:blob.read_shift(4,"i"),clsid:blob.read_shift(16),state:blob.read_shift(4,"i")};ctime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(ctime!==0){o.ctime=ctime;o.ct=read_date(blob,blob.l-8)}mtime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(mtime!==0){o.mtime=mtime;o.mt=read_date(blob,blob.l-8)}o.start=blob.read_shift(4,"i");o.size=blob.read_shift(4,"i");if(o.type===5){minifat_store=o.start;if(nmfs>0&&minifat_store!==ENDOFCHAIN)sector_list[minifat_store].name="!StreamData"}else if(o.size>=4096){o.storage="fat";if(sector_list[o.start]===undefined)if((o.start+=dir_start)>=sectors.length)o.start-=sectors.length;sector_list[o.start].name=o.name;o.content=sector_list[o.start].data.slice(0,o.size);prep_blob(o.content,0)}else{o.storage="minifat";if(minifat_store!==ENDOFCHAIN&&o.start!==ENDOFCHAIN){o.content=sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size);prep_blob(o.content,0)}}files[name]=o;FileIndex.push(o)}}function read_date(blob,offset){return new Date((__readUInt32LE(blob,offset+4)/1e7*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7-11644473600)*1e3)}var fs;function readFileSync(filename){if(fs===undefined)fs=require("fs");return parse(fs.readFileSync(filename))}function readSync(blob,options){switch(options!==undefined&&options.type!==undefined?options.type:"base64"){case"file":return readFileSync(blob);case"base64":return parse(s2a(Base64.decode(blob)));case"binary":return parse(s2a(blob))}return parse(blob)}var MSSZ=64;var ENDOFCHAIN=-2;var HEADER_SIGNATURE="d0cf11e0a1b11ae1";var HEADER_CLSID="00000000000000000000000000000000";var consts={MAXREGSECT:-6,DIFSECT:-4,FATSECT:-3,ENDOFCHAIN:ENDOFCHAIN,FREESECT:-1,HEADER_SIGNATURE:HEADER_SIGNATURE,HEADER_MINOR_VERSION:"3e00",MAXREGSID:-6,NOSTREAM:-1,HEADER_CLSID:HEADER_CLSID,EntryTypes:["unknown","storage","stream","lockbytes","property","root"]};exports.read=readSync;exports.parse=parse;exports.utils={ReadShift:ReadShift,CheckField:CheckField,prep_blob:prep_blob,bconcat:bconcat,consts:consts};return exports}();if(typeof require!=="undefined"&&typeof module!=="undefined"&&typeof DO_NOT_EXPORT_CFB==="undefined"){module.exports=CFB}function parsenoop(blob,length){blob.read_shift(length);return}function parsenoop2(blob,length){blob.read_shift(length);return null}function parslurp(blob,length,cb){var arr=[],target=blob.l+length;while(blob.l<target)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error("Slurp error");return arr}function parslurp2(blob,length,cb){var arr=[],target=blob.l+length,len=blob.read_shift(2);while(len--!==0)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error("Slurp error");return arr}function parsebool(blob,length){return blob.read_shift(length)===1}function parseuint16(blob){return blob.read_shift(2,"u")}function parseuint16a(blob,length){return parslurp(blob,length,parseuint16)}var parse_Boolean=parsebool;function parse_Bes(blob){var v=blob.read_shift(1),t=blob.read_shift(1);return t===1?BERR[v]:v===1}function parse_ShortXLUnicodeString(blob,length,opts){var cch=blob.read_shift(1);var width=1,encoding="sbcs";if(opts===undefined||opts.biff!==5){var fHighByte=blob.read_shift(1);if(fHighByte){width=2;encoding="dbcs"}}return cch?blob.read_shift(cch,encoding):""}function parse_XLUnicodeRichExtendedString(blob){var cch=blob.read_shift(2),flags=blob.read_shift(1);var fHighByte=flags&1,fExtSt=flags&4,fRichSt=flags&8;var width=1+(flags&1);var cRun,cbExtRst;var z={};if(fRichSt)cRun=blob.read_shift(2);if(fExtSt)cbExtRst=blob.read_shift(4);var encoding=flags&1?"dbcs":"sbcs";var msg=cch===0?"":blob.read_shift(cch,encoding);if(fRichSt)blob.l+=4*cRun;if(fExtSt)blob.l+=cbExtRst;z.t=msg;if(!fRichSt){z.raw="<t>"+z.t+"</t>";z.r=z.t}return z}function parse_XLUnicodeStringNoCch(blob,cch,opts){var retval;var fHighByte=blob.read_shift(1);if(fHighByte===0){retval=blob.read_shift(cch,"sbcs")}else{retval=blob.read_shift(cch,"dbcs")}return retval}function parse_XLUnicodeString(blob,length,opts){var cch=blob.read_shift(opts!==undefined&&opts.biff===5?1:2);if(cch===0){blob.l++;return""}return parse_XLUnicodeStringNoCch(blob,cch,opts)}function parse_XLUnicodeString2(blob,length,opts){if(opts.biff!==5)return parse_XLUnicodeString(blob,length,opts);var cch=blob.read_shift(1);if(cch===0){blob.l++;return""}return blob.read_shift(cch,"sbcs")}function parse_Xnum(blob){return blob.read_shift(8,"f")}var parse_ControlInfo=parsenoop;var parse_URLMoniker=function(blob,length){var len=blob.read_shift(4),start=blob.l;var extra=false;if(len>24){blob.l+=len-24;if(blob.read_shift(16)==="795881f43b1d7f48af2c825dc4852763")extra=true;blob.l=start}var url=blob.read_shift((extra?len-24:len)>>1,"utf16le").replace(chr0,"");if(extra)blob.l+=24;return url};var parse_FileMoniker=function(blob,length){var cAnti=blob.read_shift(2);var ansiLength=blob.read_shift(4);var ansiPath=blob.read_shift(ansiLength,"cstr");var endServer=blob.read_shift(2);var versionNumber=blob.read_shift(2);var cbUnicodePathSize=blob.read_shift(4);if(cbUnicodePathSize===0)return ansiPath.replace(/\\/g,"/");var cbUnicodePathBytes=blob.read_shift(4);var usKeyValue=blob.read_shift(2);var unicodePath=blob.read_shift(cbUnicodePathBytes>>1,"utf16le").replace(chr0,"");return unicodePath};var parse_HyperlinkMoniker=function(blob,length){var clsid=blob.read_shift(16);length-=16;switch(clsid){case"e0c9ea79f9bace118c8200aa004ba90b":return parse_URLMoniker(blob,length);case"0303000000000000c000000000000046":return parse_FileMoniker(blob,length);default:throw"unsupported moniker "+clsid}};var parse_HyperlinkString=function(blob,length){var len=blob.read_shift(4);var o=blob.read_shift(len,"utf16le").replace(chr0,"");return o};var parse_Hyperlink=function(blob,length){var end=blob.l+length;var sVer=blob.read_shift(4);if(sVer!==2)throw new Error("Unrecognized streamVersion: "+sVer);var flags=blob.read_shift(2);blob.l+=2;var displayName,targetFrameName,moniker,oleMoniker,location,guid,fileTime;if(flags&16)displayName=parse_HyperlinkString(blob,end-blob.l);if(flags&128)targetFrameName=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===257)moniker=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===1)oleMoniker=parse_HyperlinkMoniker(blob,end-blob.l);if(flags&8)location=parse_HyperlinkString(blob,end-blob.l);if(flags&32)guid=blob.read_shift(16);if(flags&64)fileTime=parse_FILETIME(blob,8);blob.l=end;var target=targetFrameName||moniker||oleMoniker;if(location)target+="#"+location;return{Target:target}};function isval(x){return x!==undefined&&x!==null}function keys(o){return Object.keys(o)}function evert(obj,arr){var o={};var K=keys(obj);for(var i=0;i<K.length;++i){var k=K[i];if(!arr)o[obj[k]]=k;else(o[obj[k]]=o[obj[k]]||[]).push(k)}return o}function parse_Cell(blob,length){var rw=blob.read_shift(2);var col=blob.read_shift(2);var ixfe=blob.read_shift(2);return{r:rw,c:col,ixfe:ixfe}}function parse_frtHeader(blob){var rt=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=8;return{type:rt,flags:flags}}function parse_OptXLUnicodeString(blob,length,opts){return length===0?"":parse_XLUnicodeString2(blob,length,opts)}var HIDEOBJENUM=["SHOWALL","SHOWPLACEHOLDER","HIDEALL"];var parse_HideObjEnum=parseuint16;function parse_XTI(blob,length){var iSupBook=blob.read_shift(2),itabFirst=blob.read_shift(2,"i"),itabLast=blob.read_shift(2,"i");return[iSupBook,itabFirst,itabLast]}function parse_RkNumber(blob){var b=blob.slice(blob.l,blob.l+4);var fX100=b[0]&1,fInt=b[0]&2;blob.l+=4;b[0]&=~3;var RK=fInt===0?__double([0,0,0,0,b[0],b[1],b[2],b[3]],0):__readInt32LE(b,0)>>2;return fX100?RK/100:RK}function parse_RkRec(blob,length){var ixfe=blob.read_shift(2);var RK=parse_RkNumber(blob);return[ixfe,RK]}function parse_AddinUdf(blob,length){blob.l+=4;length-=4;var l=blob.l+length;var udfName=parse_ShortXLUnicodeString(blob,length);var cb=blob.read_shift(2);l-=blob.l;if(cb!==l)throw"Malformed AddinUdf: padding = "+l+" != "+cb;blob.l+=cb;return udfName}function parse_Ref8U(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(2);var colLast=blob.read_shift(2);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}function parse_RefU(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(1);var colLast=blob.read_shift(1);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}var parse_Ref=parse_RefU;function parse_FtCmo(blob,length){blob.l+=4;var ot=blob.read_shift(2);var id=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=12;return[id,ot,flags]}function parse_FtNts(blob,length){var out={};blob.l+=4;blob.l+=16;out.fSharedNote=blob.read_shift(2);blob.l+=4;return out}function parse_FtCf(blob,length){var out={};blob.l+=4;blob.cf=blob.read_shift(2);return out}var FtTab={21:parse_FtCmo,19:parsenoop,18:function(blob,length){blob.l+=12},17:function(blob,length){blob.l+=8},16:parsenoop,15:parsenoop,13:parse_FtNts,12:function(blob,length){blob.l+=24},11:function(blob,length){blob.l+=10},10:function(blob,length){blob.l+=16},9:parsenoop,8:function(blob,length){blob.l+=6},7:parse_FtCf,6:function(blob,length){blob.l+=6},4:parsenoop,0:function(blob,length){blob.l+=4}};function parse_FtArray(blob,length,ot){var s=blob.l;var fts=[];while(blob.l<s+length){var ft=blob.read_shift(2);blob.l-=2;try{fts.push(FtTab[ft](blob,s+length-blob.l))}catch(e){blob.l=s+length;return fts}}if(blob.l!=s+length)blob.l=s+length;return fts}var parse_FontIndex=parseuint16;function parse_BOF(blob,length){var o={};o.BIFFVer=blob.read_shift(2);length-=2;if(o.BIFFVer!==1536&&o.BIFFVer!==1280)throw"Unexpected BIFF Ver "+o.BIFFVer;blob.read_shift(length);return o}function parse_InterfaceHdr(blob,length){if(length===0)return 1200;var q;if((q=blob.read_shift(2))!==1200)throw"InterfaceHdr codePage "+q;return 1200}function parse_WriteAccess(blob,length,opts){if(opts.enc){blob.l+=length;return""}var l=blob.l;var UserName=parse_XLUnicodeString(blob,0,opts);blob.read_shift(length+l-blob.l);return UserName}function parse_BoundSheet8(blob,length,opts){var pos=blob.read_shift(4);var hidden=blob.read_shift(1)>>6;var dt=blob.read_shift(1);switch(dt){case 0:dt="Worksheet";break;case 1:dt="Macrosheet";break;case 2:dt="Chartsheet";break;case 6:dt="VBAModule";break}var name=parse_ShortXLUnicodeString(blob,0,opts);return{pos:pos,hs:hidden,dt:dt,name:name}}function parse_SST(blob,length){var cnt=blob.read_shift(4);var ucnt=blob.read_shift(4);var strs=[];for(var i=0;i!=ucnt;++i){strs.push(parse_XLUnicodeRichExtendedString(blob))}strs.Count=cnt;strs.Unique=ucnt;return strs}function parse_ExtSST(blob,length){var extsst={};extsst.dsst=blob.read_shift(2);blob.l+=length-2;return extsst}function parse_Row(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2),Col=blob.read_shift(2),rht=blob.read_shift(2);blob.read_shift(4);var flags=blob.read_shift(1);blob.read_shift(1);blob.read_shift(2);return{r:rw,c:col,cnt:Col-col}}function parse_ForceFullCalculation(blob,length){var header=parse_frtHeader(blob);if(header.type!=2211)throw"Invalid Future Record "+header.type;var fullcalc=blob.read_shift(4);return fullcalc!==0}var parse_CompressPictures=parsenoop2;function parse_RecalcId(blob,length){blob.read_shift(2);return blob.read_shift(4)}function parse_DefaultRowHeight(blob,length){var f=blob.read_shift(2),miyRw;miyRw=blob.read_shift(2);var fl={Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};return[fl,miyRw]}function parse_Window1(blob,length){var xWn=blob.read_shift(2),yWn=blob.read_shift(2),dxWn=blob.read_shift(2),dyWn=blob.read_shift(2);var flags=blob.read_shift(2),iTabCur=blob.read_shift(2),iTabFirst=blob.read_shift(2);var ctabSel=blob.read_shift(2),wTabRatio=blob.read_shift(2);return{Pos:[xWn,yWn],Dim:[dxWn,dyWn],Flags:flags,CurTab:iTabCur,FirstTab:iTabFirst,Selected:ctabSel,TabRatio:wTabRatio}}function parse_Font(blob,length,opts){blob.l+=14;var name=parse_ShortXLUnicodeString(blob,0,opts);return name}function parse_LabelSst(blob,length){var cell=parse_Cell(blob);cell.isst=blob.read_shift(4);return cell}function parse_Label(blob,length,opts){var cell=parse_Cell(blob,6);var str=parse_XLUnicodeString(blob,length-6,opts);cell.val=str;return cell}function parse_Format(blob,length,opts){var ifmt=blob.read_shift(2);var fmtstr=parse_XLUnicodeString2(blob,0,opts);return[ifmt,fmtstr]}function parse_Dimensions(blob,length){var w=length===10?2:4;var r=blob.read_shift(w),R=blob.read_shift(w),c=blob.read_shift(2),C=blob.read_shift(2);blob.l+=2;return{s:{r:r,c:c},e:{r:R,c:C}}}function parse_RK(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrec=parse_RkRec(blob);return{r:rw,c:col,ixfe:rkrec[0],rknum:rkrec[1]}}function parse_MulRk(blob,length){var target=blob.l+length-2;var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrecs=[];while(blob.l<target)rkrecs.push(parse_RkRec(blob));if(blob.l!==target)throw"MulRK read error";var lastcol=blob.read_shift(2);if(rkrecs.length!=lastcol-col+1)throw"MulRK length mismatch";return{r:rw,c:col,C:lastcol,rkrec:rkrecs}}var parse_CellXF=parsenoop;var parse_StyleXF=parsenoop;function parse_XF(blob,length){var o={};o.ifnt=blob.read_shift(2);o.ifmt=blob.read_shift(2);o.flags=blob.read_shift(2);o.fStyle=o.flags>>2&1;length-=6;o.data=o.fStyle?parse_StyleXF(blob,length):parse_CellXF(blob,length);return o}function parse_Guts(blob,length){blob.l+=4;var out=[blob.read_shift(2),blob.read_shift(2)];if(out[0]!==0)out[0]--;if(out[1]!==0)out[1]--;if(out[0]>7||out[1]>7)throw"Bad Gutters: "+out;return out}function parse_BoolErr(blob,length){var cell=parse_Cell(blob,6);var val=parse_Bes(blob,2);cell.val=val;cell.t=val===true||val===false?"b":"e";return cell}function parse_Number(blob,length){var cell=parse_Cell(blob,6);var xnum=parse_Xnum(blob,8);cell.val=xnum;return cell}var parse_XLHeaderFooter=parse_OptXLUnicodeString;function parse_SupBook(blob,length,opts){var end=blob.l+length;var ctab=blob.read_shift(2);var cch=blob.read_shift(2);var virtPath;if(cch>=1&&cch<=255)virtPath=parse_XLUnicodeStringNoCch(blob,cch);var rgst=blob.read_shift(end-blob.l);opts.sbcch=cch;return[cch,ctab,virtPath,rgst]}function parse_ExternName(blob,length,opts){var flags=blob.read_shift(2);var body;var o={fBuiltIn:flags&1,fWantAdvise:flags>>>1&1,fWantPict:flags>>>2&1,fOle:flags>>>3&1,fOleLink:flags>>>4&1,cf:flags>>>5&1023,fIcon:flags>>>15&1};if(opts.sbcch===14849)body=parse_AddinUdf(blob,length-2);o.body=body||blob.read_shift(length-2);return o}function parse_Lbl(blob,length,opts){if(opts.biff<8)return parse_Label(blob,length,opts);var target=blob.l+length;var flags=blob.read_shift(2);var chKey=blob.read_shift(1);var cch=blob.read_shift(1);var cce=blob.read_shift(2);blob.l+=2;var itab=blob.read_shift(2);blob.l+=4;var name=parse_XLUnicodeStringNoCch(blob,cch,opts);var rgce=parse_NameParsedFormula(blob,target-blob.l,opts,cce);return{chKey:chKey,Name:name,rgce:rgce}}function parse_ExternSheet(blob,length,opts){if(opts.biff<8)return parse_ShortXLUnicodeString(blob,length,opts);var o=parslurp2(blob,length,parse_XTI);var oo=[];if(opts.sbcch===1025){for(var i=0;i!=o.length;++i)oo.push(opts.snames[o[i][1]]);return oo}else return o}function parse_ShrFmla(blob,length,opts){var ref=parse_RefU(blob,6);blob.l++;var cUse=blob.read_shift(1);length-=8;return[parse_SharedParsedFormula(blob,length,opts),cUse]}function parse_Array(blob,length,opts){var ref=parse_Ref(blob,6);blob.l+=6;length-=12;return[ref,parse_ArrayParsedFormula(blob,length,opts,ref)]}function parse_MTRSettings(blob,length){var fMTREnabled=blob.read_shift(4)!==0;var fUserSetThreadCount=blob.read_shift(4)!==0;var cUserThreadCount=blob.read_shift(4);return[fMTREnabled,fUserSetThreadCount,cUserThreadCount]}function parse_NoteSh(blob,length,opts){if(opts.biff<8)return;var row=blob.read_shift(2),col=blob.read_shift(2);var flags=blob.read_shift(2),idObj=blob.read_shift(2);var stAuthor=parse_XLUnicodeString2(blob,0,opts);if(opts.biff<8)blob.read_shift(1);return[{r:row,c:col},stAuthor,idObj,flags]}function parse_Note(blob,length,opts){return parse_NoteSh(blob,length,opts)}function parse_MergeCells(blob,length){var merges=[];var cmcs=blob.read_shift(2);while(cmcs--)merges.push(parse_Ref8U(blob,length));return merges}function parse_Obj(blob,length){var cmo=parse_FtCmo(blob,22);var fts=parse_FtArray(blob,length-22,cmo[1]);return{cmo:cmo,ft:fts}}function parse_TxO(blob,length,opts){var s=blob.l;try{blob.l+=4;var ot=(opts.lastobj||{cmo:[0,0]}).cmo[1];var controlInfo;if([0,5,7,11,12,14].indexOf(ot)==-1)blob.l+=6;else controlInfo=parse_ControlInfo(blob,6,opts);var cchText=blob.read_shift(2);var cbRuns=blob.read_shift(2);var ifntEmpty=parse_FontIndex(blob,2);var len=blob.read_shift(2);blob.l+=len;var texts="";for(var i=1;i<blob.lens.length-1;++i){if(blob.l-s!=blob.lens[i])throw"TxO: bad continue record";var hdr=blob[blob.l];var t=parse_XLUnicodeStringNoCch(blob,blob.lens[i+1]-blob.lens[i]-1);texts+=t;if(texts.length>=(hdr?cchText:2*cchText))break}if(texts.length!==cchText&&texts.length!==cchText*2){throw"cchText: "+cchText+" != "+texts.length}blob.l=s+length;return{t:texts}}catch(e){blob.l=s+length;return{t:texts||""}}}var parse_HLink=function(blob,length){var ref=parse_Ref8U(blob,8);blob.l+=16;var hlink=parse_Hyperlink(blob,length-24);return[ref,hlink]};var parse_HLinkTooltip=function(blob,length){var end=blob.l+length;blob.read_shift(2);var ref=parse_Ref8U(blob,8);var wzTooltip=blob.read_shift((length-10)/2,"dbcs");wzTooltip=wzTooltip.replace(chr0,"");return[ref,wzTooltip]};function parse_Country(blob,length){var o=[],d;d=blob.read_shift(2);o[0]=CountryEnum[d]||d;d=blob.read_shift(2);o[1]=CountryEnum[d]||d;return o}var parse_Backup=parsebool;var parse_Blank=parse_Cell;var parse_BottomMargin=parse_Xnum;var parse_BuiltInFnGroupCount=parseuint16;var parse_CalcCount=parseuint16;var parse_CalcDelta=parse_Xnum;var parse_CalcIter=parsebool;var parse_CalcMode=parseuint16;var parse_CalcPrecision=parsebool;var parse_CalcRefMode=parsenoop2;var parse_CalcSaveRecalc=parsebool;var parse_CodePage=parseuint16;var parse_Compat12=parsebool;var parse_Date1904=parsebool;var parse_DefColWidth=parseuint16;var parse_DSF=parsenoop2;var parse_EntExU2=parsenoop2;var parse_EOF=parsenoop2;var parse_Excel9File=parsenoop2;var parse_FeatHdr=parsenoop2;var parse_FontX=parseuint16;var parse_Footer=parse_XLHeaderFooter;var parse_GridSet=parseuint16;var parse_HCenter=parsebool;var parse_Header=parse_XLHeaderFooter;var parse_HideObj=parse_HideObjEnum;var parse_InterfaceEnd=parsenoop2;var parse_LeftMargin=parse_Xnum;var parse_Mms=parsenoop2;var parse_ObjProtect=parsebool;var parse_Password=parseuint16;var parse_PrintGrid=parsebool;var parse_PrintRowCol=parsebool;var parse_PrintSize=parseuint16;var parse_Prot4Rev=parsebool;var parse_Prot4RevPass=parseuint16;var parse_Protect=parsebool;var parse_RefreshAll=parsebool;var parse_RightMargin=parse_Xnum;
25799 var parse_RRTabId=parseuint16a;var parse_ScenarioProtect=parsebool;var parse_Scl=parseuint16a;var parse_String=parse_XLUnicodeString;var parse_SxBool=parsebool;var parse_TopMargin=parse_Xnum;var parse_UsesELFs=parsebool;var parse_VCenter=parsebool;var parse_WinProtect=parsebool;var parse_WriteProtect=parsenoop;var parse_VerticalPageBreaks=parsenoop;var parse_HorizontalPageBreaks=parsenoop;var parse_Selection=parsenoop;var parse_Continue=parsenoop;var parse_Pane=parsenoop;var parse_Pls=parsenoop;var parse_DCon=parsenoop;var parse_DConRef=parsenoop;var parse_DConName=parsenoop;var parse_XCT=parsenoop;var parse_CRN=parsenoop;var parse_FileSharing=parsenoop;var parse_Uncalced=parsenoop;var parse_Template=parsenoop;var parse_Intl=parsenoop;var parse_ColInfo=parsenoop;var parse_WsBool=parsenoop;var parse_Sort=parsenoop;var parse_Palette=parsenoop;var parse_Sync=parsenoop;var parse_LPr=parsenoop;var parse_DxGCol=parsenoop;var parse_FnGroupName=parsenoop;var parse_FilterMode=parsenoop;var parse_AutoFilterInfo=parsenoop;var parse_AutoFilter=parsenoop;var parse_Setup=parsenoop;var parse_ScenMan=parsenoop;var parse_SCENARIO=parsenoop;var parse_SxView=parsenoop;var parse_Sxvd=parsenoop;var parse_SXVI=parsenoop;var parse_SxIvd=parsenoop;var parse_SXLI=parsenoop;var parse_SXPI=parsenoop;var parse_DocRoute=parsenoop;var parse_RecipName=parsenoop;var parse_MulBlank=parsenoop;var parse_SXDI=parsenoop;var parse_SXDB=parsenoop;var parse_SXFDB=parsenoop;var parse_SXDBB=parsenoop;var parse_SXNum=parsenoop;var parse_SxErr=parsenoop;var parse_SXInt=parsenoop;var parse_SXString=parsenoop;var parse_SXDtr=parsenoop;var parse_SxNil=parsenoop;var parse_SXTbl=parsenoop;var parse_SXTBRGIITM=parsenoop;var parse_SxTbpg=parsenoop;var parse_ObProj=parsenoop;var parse_SXStreamID=parsenoop;var parse_DBCell=parsenoop;var parse_SXRng=parsenoop;var parse_SxIsxoper=parsenoop;var parse_BookBool=parsenoop;var parse_DbOrParamQry=parsenoop;var parse_OleObjectSize=parsenoop;var parse_SXVS=parsenoop;var parse_BkHim=parsenoop;var parse_MsoDrawingGroup=parsenoop;var parse_MsoDrawing=parsenoop;var parse_MsoDrawingSelection=parsenoop;var parse_PhoneticInfo=parsenoop;var parse_SxRule=parsenoop;var parse_SXEx=parsenoop;var parse_SxFilt=parsenoop;var parse_SxDXF=parsenoop;var parse_SxItm=parsenoop;var parse_SxName=parsenoop;var parse_SxSelect=parsenoop;var parse_SXPair=parsenoop;var parse_SxFmla=parsenoop;var parse_SxFormat=parsenoop;var parse_SXVDEx=parsenoop;var parse_SXFormula=parsenoop;var parse_SXDBEx=parsenoop;var parse_RRDInsDel=parsenoop;var parse_RRDHead=parsenoop;var parse_RRDChgCell=parsenoop;var parse_RRDRenSheet=parsenoop;var parse_RRSort=parsenoop;var parse_RRDMove=parsenoop;var parse_RRFormat=parsenoop;var parse_RRAutoFmt=parsenoop;var parse_RRInsertSh=parsenoop;var parse_RRDMoveBegin=parsenoop;var parse_RRDMoveEnd=parsenoop;var parse_RRDInsDelBegin=parsenoop;var parse_RRDInsDelEnd=parsenoop;var parse_RRDConflict=parsenoop;var parse_RRDDefName=parsenoop;var parse_RRDRstEtxp=parsenoop;var parse_LRng=parsenoop;var parse_CUsr=parsenoop;var parse_CbUsr=parsenoop;var parse_UsrInfo=parsenoop;var parse_UsrExcl=parsenoop;var parse_FileLock=parsenoop;var parse_RRDInfo=parsenoop;var parse_BCUsrs=parsenoop;var parse_UsrChk=parsenoop;var parse_UserBView=parsenoop;var parse_UserSViewBegin=parsenoop;var parse_UserSViewEnd=parsenoop;var parse_RRDUserView=parsenoop;var parse_Qsi=parsenoop;var parse_CondFmt=parsenoop;var parse_CF=parsenoop;var parse_DVal=parsenoop;var parse_DConBin=parsenoop;var parse_Lel=parsenoop;var parse_CodeName=parse_XLUnicodeString;var parse_SXFDBType=parsenoop;var parse_ObNoMacros=parsenoop;var parse_Dv=parsenoop;var parse_Index=parsenoop;var parse_Table=parsenoop;var parse_Window2=parsenoop;var parse_Style=parsenoop;var parse_BigName=parsenoop;var parse_ContinueBigName=parsenoop;var parse_WebPub=parsenoop;var parse_QsiSXTag=parsenoop;var parse_DBQueryExt=parsenoop;var parse_ExtString=parsenoop;var parse_TxtQry=parsenoop;var parse_Qsir=parsenoop;var parse_Qsif=parsenoop;var parse_RRDTQSIF=parsenoop;var parse_OleDbConn=parsenoop;var parse_WOpt=parsenoop;var parse_SXViewEx=parsenoop;var parse_SXTH=parsenoop;var parse_SXPIEx=parsenoop;var parse_SXVDTEx=parsenoop;var parse_SXViewEx9=parsenoop;var parse_ContinueFrt=parsenoop;var parse_RealTimeData=parsenoop;var parse_ChartFrtInfo=parsenoop;var parse_FrtWrapper=parsenoop;var parse_StartBlock=parsenoop;var parse_EndBlock=parsenoop;var parse_StartObject=parsenoop;var parse_EndObject=parsenoop;var parse_CatLab=parsenoop;var parse_YMult=parsenoop;var parse_SXViewLink=parsenoop;var parse_PivotChartBits=parsenoop;var parse_FrtFontList=parsenoop;var parse_SheetExt=parsenoop;var parse_BookExt=parsenoop;var parse_SXAddl=parsenoop;var parse_CrErr=parsenoop;var parse_HFPicture=parsenoop;var parse_Feat=parsenoop;var parse_DataLabExt=parsenoop;var parse_DataLabExtContents=parsenoop;var parse_CellWatch=parsenoop;var parse_FeatHdr11=parsenoop;var parse_Feature11=parsenoop;var parse_DropDownObjIds=parsenoop;var parse_ContinueFrt11=parsenoop;var parse_DConn=parsenoop;var parse_List12=parsenoop;var parse_Feature12=parsenoop;var parse_CondFmt12=parsenoop;var parse_CF12=parsenoop;var parse_CFEx=parsenoop;var parse_XFCRC=parsenoop;var parse_XFExt=parsenoop;var parse_AutoFilter12=parsenoop;var parse_ContinueFrt12=parsenoop;var parse_MDTInfo=parsenoop;var parse_MDXStr=parsenoop;var parse_MDXTuple=parsenoop;var parse_MDXSet=parsenoop;var parse_MDXProp=parsenoop;var parse_MDXKPI=parsenoop;var parse_MDB=parsenoop;var parse_PLV=parsenoop;var parse_DXF=parsenoop;var parse_TableStyles=parsenoop;var parse_TableStyle=parsenoop;var parse_TableStyleElement=parsenoop;var parse_StyleExt=parsenoop;var parse_NamePublish=parsenoop;var parse_NameCmt=parsenoop;var parse_SortData=parsenoop;var parse_Theme=parsenoop;var parse_GUIDTypeLib=parsenoop;var parse_FnGrp12=parsenoop;var parse_NameFnGrp12=parsenoop;var parse_HeaderFooter=parsenoop;var parse_CrtLayout12=parsenoop;var parse_CrtMlFrt=parsenoop;var parse_CrtMlFrtContinue=parsenoop;var parse_ShapePropsStream=parsenoop;var parse_TextPropsStream=parsenoop;var parse_RichTextStream=parsenoop;var parse_CrtLayout12A=parsenoop;var parse_Units=parsenoop;var parse_Chart=parsenoop;var parse_Series=parsenoop;var parse_DataFormat=parsenoop;var parse_LineFormat=parsenoop;var parse_MarkerFormat=parsenoop;var parse_AreaFormat=parsenoop;var parse_PieFormat=parsenoop;var parse_AttachedLabel=parsenoop;var parse_SeriesText=parsenoop;var parse_ChartFormat=parsenoop;var parse_Legend=parsenoop;var parse_SeriesList=parsenoop;var parse_Bar=parsenoop;var parse_Line=parsenoop;var parse_Pie=parsenoop;var parse_Area=parsenoop;var parse_Scatter=parsenoop;var parse_CrtLine=parsenoop;var parse_Axis=parsenoop;var parse_Tick=parsenoop;var parse_ValueRange=parsenoop;var parse_CatSerRange=parsenoop;var parse_AxisLine=parsenoop;var parse_CrtLink=parsenoop;var parse_DefaultText=parsenoop;var parse_Text=parsenoop;var parse_ObjectLink=parsenoop;var parse_Frame=parsenoop;var parse_Begin=parsenoop;var parse_End=parsenoop;var parse_PlotArea=parsenoop;var parse_Chart3d=parsenoop;var parse_PicF=parsenoop;var parse_DropBar=parsenoop;var parse_Radar=parsenoop;var parse_Surf=parsenoop;var parse_RadarArea=parsenoop;var parse_AxisParent=parsenoop;var parse_LegendException=parsenoop;var parse_ShtProps=parsenoop;var parse_SerToCrt=parsenoop;var parse_AxesUsed=parsenoop;var parse_SBaseRef=parsenoop;var parse_SerParent=parsenoop;var parse_SerAuxTrend=parsenoop;var parse_IFmtRecord=parsenoop;var parse_Pos=parsenoop;var parse_AlRuns=parsenoop;var parse_BRAI=parsenoop;var parse_SerAuxErrBar=parsenoop;var parse_ClrtClient=parsenoop;var parse_SerFmt=parsenoop;var parse_Chart3DBarShape=parsenoop;var parse_Fbi=parsenoop;var parse_BopPop=parsenoop;var parse_AxcExt=parsenoop;var parse_Dat=parsenoop;var parse_PlotGrowth=parsenoop;var parse_SIIndex=parsenoop;var parse_GelFrame=parsenoop;var parse_BopPopCustom=parsenoop;var parse_Fbi2=parsenoop;function parse_BIFF5String(blob){var len=blob.read_shift(1);return blob.read_shift(len,"sbcs")}var _chr=function(c){return String.fromCharCode(c)};var attregexg=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;var attregex=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;function parsexmltag(tag,skip_root){var words=tag.split(/\s+/);var z=[];if(!skip_root)z[0]=words[0];if(words.length===1)return z;var m=tag.match(attregexg),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex);if((j=y[1].indexOf(":"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)==="xmlns:")w="xmlns"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}function parsexmltagobj(tag){var words=tag.split(/\s+/);var z={};if(words.length===1)return z;var m=tag.match(attregexg),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex);if((j=y[1].indexOf(":"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)==="xmlns:")w="xmlns"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}var encodings={"&quot;":'"',"&apos;":"'","&gt;":">","&lt;":"<","&amp;":"&"};var rencoding=evert(encodings);var rencstr="&<>'\"".split("");var XML_HEADER='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';var OFFCRYPTO={};var make_offcrypto=function(O,_crypto){var crypto;if(typeof _crypto!=="undefined")crypto=_crypto;else if(typeof require!=="undefined"){try{crypto=require("cry"+"pto")}catch(e){crypto=null}}O.rc4=function(key,data){var S=new Array(256);var c=0,i=0,j=0,t=0;for(i=0;i!=256;++i)S[i]=i;for(i=0;i!=256;++i){j=j+S[i]+key[i%key.length].charCodeAt(0)&255;t=S[i];S[i]=S[j];S[j]=t}i=j=0;out=Buffer(data.length);for(c=0;c!=data.length;++c){i=i+1&255;j=(j+S[i])%256;t=S[i];S[i]=S[j];S[j]=t;out[c]=data[c]^S[S[i]+S[j]&255]}return out};if(crypto){O.md5=function(hex){return crypto.createHash("md5").update(hex).digest("hex")}}else{O.md5=function(hex){throw"unimplemented"}}};make_offcrypto(OFFCRYPTO,typeof crypto!=="undefined"?crypto:undefined);function _JS2ANSI(str){if(typeof cptable!=="undefined")return cptable.utils.encode(1252,str);return str.split("").map(function(x){return x.charCodeAt(0)})}function parse_Version(blob,length){var o={};o.Major=blob.read_shift(2);o.Minor=blob.read_shift(2);return o}function parse_EncryptionHeader(blob,length){var o={};o.Flags=blob.read_shift(4);var tmp=blob.read_shift(4);if(tmp!==0)throw"Unrecognized SizeExtra: "+tmp;o.AlgID=blob.read_shift(4);switch(o.AlgID){case 0:case 26625:case 26126:case 26127:case 26128:break;default:throw"Unrecognized encryption algorithm: "+o.AlgID}parsenoop(blob,length-12);return o}function parse_EncryptionVerifier(blob,length){return parsenoop(blob,length)}function parse_RC4CryptoHeader(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Minor!=2)throw"unrecognized minor version code: "+vers.Minor;if(vers.Major>4||vers.Major<2)throw"unrecognized major version code: "+vers.Major;o.Flags=blob.read_shift(4);length-=4;var sz=blob.read_shift(4);length-=4;o.EncryptionHeader=parse_EncryptionHeader(blob,sz);length-=sz;o.EncryptionVerifier=parse_EncryptionVerifier(blob,length);return o}function parse_RC4Header(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Major!=1||vers.Minor!=1)throw"unrecognized version code "+vers.Major+" : "+vers.Minor;o.Salt=blob.read_shift(16);o.EncryptedVerifier=blob.read_shift(16);o.EncryptedVerifierHash=blob.read_shift(16);return o}function crypto_CreatePasswordVerifier_Method1(Password){var Verifier=0,PasswordArray;var PasswordDecoded=_JS2ANSI(Password);var len=PasswordDecoded.length+1,i,PasswordByte;var Intermediate1,Intermediate2,Intermediate3;PasswordArray=new_buf(len);PasswordArray[0]=PasswordDecoded.length;for(i=1;i!=len;++i)PasswordArray[i]=PasswordDecoded[i-1];for(i=len-1;i>=0;--i){PasswordByte=PasswordArray[i];Intermediate1=(Verifier&16384)===0?0:1;Intermediate2=Verifier<<1&32767;Intermediate3=Intermediate1|Intermediate2;Verifier=Intermediate3^PasswordByte}return Verifier^52811}var crypto_CreateXorArray_Method1=function(){var PadArray=[187,255,255,186,255,255,185,128,0,190,15,0,191,15,0];var InitialCode=[57840,7439,52380,33984,4364,3600,61902,12606,6258,57657,54287,34041,10252,43370,20163];var XorMatrix=[44796,19929,39858,10053,20106,40212,10761,31585,63170,64933,60267,50935,40399,11199,17763,35526,1453,2906,5812,11624,23248,885,1770,3540,7080,14160,28320,56640,55369,41139,20807,41614,21821,43642,17621,28485,56970,44341,19019,38038,14605,29210,60195,50791,40175,10751,21502,43004,24537,18387,36774,3949,7898,15796,31592,63184,47201,24803,49606,37805,14203,28406,56812,17824,35648,1697,3394,6788,13576,27152,43601,17539,35078,557,1114,2228,4456,30388,60776,51953,34243,7079,14158,28316,14128,28256,56512,43425,17251,34502,7597,13105,26210,52420,35241,883,1766,3532,4129,8258,16516,33032,4657,9314,18628];var Ror=function(Byte){return(Byte/2|Byte*128)&255};var XorRor=function(byte1,byte2){return Ror(byte1^byte2)};var CreateXorKey_Method1=function(Password){var XorKey=InitialCode[Password.length-1];var CurrentElement=104;for(var i=Password.length-1;i>=0;--i){var Char=Password[i];for(var j=0;j!=7;++j){if(Char&64)XorKey^=XorMatrix[CurrentElement];Char*=2;--CurrentElement}}return XorKey};return function(password){var Password=_JS2ANSI(password);var XorKey=CreateXorKey_Method1(Password);var Index=Password.length;var ObfuscationArray=new_buf(16);for(var i=0;i!=16;++i)ObfuscationArray[i]=0;var Temp,PasswordLastChar,PadIndex;if((Index&1)===1){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[0],Temp);--Index;Temp=XorKey&255;PasswordLastChar=Password[Password.length-1];ObfuscationArray[Index]=XorRor(PasswordLastChar,Temp)}while(Index>0){--Index;Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp)}Index=15;PadIndex=15-Password.length;while(PadIndex>0){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[PadIndex],Temp);--Index;--PadIndex;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;--PadIndex}return ObfuscationArray}}();var crypto_DecryptData_Method1=function(password,Data,XorArrayIndex,XorArray,O){if(!O)O=Data;if(!XorArray)XorArray=crypto_CreateXorArray_Method1(password);var Index,Value;for(Index=0;Index!=Data.length;++Index){Value=Data[Index];Value^=XorArray[XorArrayIndex];Value=(Value>>5|Value<<3)&255;O[Index]=Value;++XorArrayIndex}return[O,XorArrayIndex,XorArray]};var crypto_MakeXorDecryptor=function(password){var XorArrayIndex=0,XorArray=crypto_CreateXorArray_Method1(password);return function(Data){var O=crypto_DecryptData_Method1(null,Data,XorArrayIndex,XorArray);XorArrayIndex=O[1];return O[0]}};function parse_XORObfuscation(blob,length,opts,out){var o={key:parseuint16(blob),verificationBytes:parseuint16(blob)};if(opts.password)o.verifier=crypto_CreatePasswordVerifier_Method1(opts.password);out.valid=o.verificationBytes===o.verifier;if(out.valid)out.insitu_decrypt=crypto_MakeXorDecryptor(opts.password);return o}function parse_FilePassHeader(blob,length,oo){var o=oo||{};o.Info=blob.read_shift(2);blob.l-=2;if(o.Info===1)o.Data=parse_RC4Header(blob,length);else o.Data=parse_RC4CryptoHeader(blob,length);return o}function parse_FilePass(blob,length,opts){var o={Type:blob.read_shift(2)};if(o.Type)parse_FilePassHeader(blob,length-2,o);else parse_XORObfuscation(blob,length-2,opts,o);return o}function parseread(l){return function(blob,length){blob.l+=l;return}}function parseread1(blob,length){blob.l+=1;return}function parse_ColRelU(blob,length){var c=blob.read_shift(2);return[c&16383,c>>14&1,c>>15&1]}function parse_RgceArea(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceAreaRel(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceLoc(blob,length){var r=blob.read_shift(2);var c=parse_ColRelU(blob,2);return{r:r,c:c[0],cRel:c[1],rRel:c[2]}}function parse_RgceLocRel(blob,length){var r=blob.read_shift(2);var cl=blob.read_shift(2);var cRel=(cl&32768)>>15,rRel=(cl&16384)>>14;cl&=16383;if(cRel!==0)while(cl>=256)cl-=256;return{r:r,c:cl,cRel:cRel,rRel:rRel}}function parse_PtgArea(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceArea(blob,8);return[type,area]}function parse_PtgArea3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);var area=parse_RgceArea(blob,8);return[type,ixti,area]}function parse_PtgAreaErr(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=8;return[type]}function parse_PtgAreaErr3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);blob.l+=8;return[type,ixti]}function parse_PtgAreaN(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceAreaRel(blob,8);return[type,area]}function parse_PtgArray(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=7;return[type]}function parse_PtgAttrBaxcel(blob,length){var bitSemi=blob[blob.l+1]&1;var bitBaxcel=1;blob.l+=4;return[bitSemi,bitBaxcel]}function parse_PtgAttrChoose(blob,length){blob.l+=2;var offset=blob.read_shift(2);var o=[];for(var i=0;i<=offset;++i)o.push(blob.read_shift(2));return o}function parse_PtgAttrGoto(blob,length){var bitGoto=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitGoto,blob.read_shift(2)]}function parse_PtgAttrIf(blob,length){var bitIf=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitIf,blob.read_shift(2)]}function parse_PtgAttrSemi(blob,length){var bitSemi=blob[blob.l+1]&255?1:0;blob.l+=4;return[bitSemi]}function parse_PtgAttrSpaceType(blob,length){var type=blob.read_shift(1),cch=blob.read_shift(1);return[type,cch]}function parse_PtgAttrSpace(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgAttrSpaceSemi(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgRef(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLoc(blob,4);return[type,loc]}function parse_PtgRefN(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLocRel(blob,4);return[type,loc]}function parse_PtgRef3d(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var ixti=blob.read_shift(2);var loc=parse_RgceLoc(blob,4);return[type,ixti,loc]}function parse_PtgFunc(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var iftab=blob.read_shift(2);return[FtabArgc[iftab],Ftab[iftab]]}function parse_PtgFuncVar(blob,length){blob.l++;var cparams=blob.read_shift(1),tab=parsetab(blob);return[cparams,(tab[0]===0?Ftab:Cetab)[tab[1]]]}function parsetab(blob,length){return[blob[blob.l+1]>>7,blob.read_shift(2)&32767]}var parse_PtgAttrSum=parseread(4);var parse_PtgConcat=parseread1;function parse_PtgExp(blob,length){blob.l++;var row=blob.read_shift(2);var col=blob.read_shift(2);return[row,col]}function parse_PtgErr(blob,length){blob.l++;return BERR[blob.read_shift(1)]}function parse_PtgInt(blob,length){blob.l++;return blob.read_shift(2)}function parse_PtgBool(blob,length){blob.l++;return blob.read_shift(1)!==0}function parse_PtgNum(blob,length){blob.l++;return parse_Xnum(blob,8)}function parse_PtgStr(blob,length){blob.l++;return parse_ShortXLUnicodeString(blob)}function parse_SerAr(blob){var val=[];switch(val[0]=blob.read_shift(1)){case 4:val[1]=parsebool(blob,1)?"TRUE":"FALSE";blob.l+=7;break;case 16:val[1]=BERR[blob[blob.l]];blob.l+=8;break;case 0:blob.l+=8;break;case 1:val[1]=parse_Xnum(blob,8);break;case 2:val[1]=parse_XLUnicodeString(blob);break}return val}function parse_PtgExtraMem(blob,cce){var count=blob.read_shift(2);var out=[];for(var i=0;i!=count;++i)out.push(parse_Ref8U(blob,8));return out}function parse_PtgExtraArray(blob){var cols=1+blob.read_shift(1);var rows=1+blob.read_shift(2);for(var i=0,o=[];i!=rows&&(o[i]=[]);++i)for(var j=0;j!=cols;++j)o[i][j]=parse_SerAr(blob);return o}function parse_PtgName(blob,length){var type=blob.read_shift(1)>>>5&3;var nameindex=blob.read_shift(4);return[type,0,nameindex]}function parse_PtgNameX(blob,length){var type=blob.read_shift(1)>>>5&3;var ixti=blob.read_shift(2);var nameindex=blob.read_shift(4);return[type,ixti,nameindex]}function parse_PtgMemArea(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgMemFunc(blob,length){var type=blob.read_shift(1)>>>5&3;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgRefErr(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;return[type]}var parse_PtgAdd=parseread1;var parse_PtgDiv=parseread1;var parse_PtgEq=parseread1;var parse_PtgGe=parseread1;var parse_PtgGt=parseread1;var parse_PtgIsect=parseread1;var parse_PtgLe=parseread1;var parse_PtgLt=parseread1;var parse_PtgMissArg=parseread1;var parse_PtgMul=parseread1;var parse_PtgNe=parseread1;var parse_PtgParen=parseread1;var parse_PtgPercent=parseread1;var parse_PtgPower=parseread1;var parse_PtgRange=parseread1;var parse_PtgSub=parseread1;var parse_PtgUminus=parseread1;var parse_PtgUnion=parseread1;var parse_PtgUplus=parseread1;var parse_PtgMemErr=parsenoop;var parse_PtgMemNoMem=parsenoop;var parse_PtgRefErr3d=parsenoop;var parse_PtgTbl=parsenoop;var PtgTypes={1:{n:"PtgExp",f:parse_PtgExp},2:{n:"PtgTbl",f:parse_PtgTbl},3:{n:"PtgAdd",f:parse_PtgAdd},4:{n:"PtgSub",f:parse_PtgSub},5:{n:"PtgMul",f:parse_PtgMul},6:{n:"PtgDiv",f:parse_PtgDiv},7:{n:"PtgPower",f:parse_PtgPower},8:{n:"PtgConcat",f:parse_PtgConcat},9:{n:"PtgLt",f:parse_PtgLt},10:{n:"PtgLe",f:parse_PtgLe},11:{n:"PtgEq",f:parse_PtgEq},12:{n:"PtgGe",f:parse_PtgGe},13:{n:"PtgGt",f:parse_PtgGt},14:{n:"PtgNe",f:parse_PtgNe},15:{n:"PtgIsect",f:parse_PtgIsect},16:{n:"PtgUnion",f:parse_PtgUnion},17:{n:"PtgRange",f:parse_PtgRange},18:{n:"PtgUplus",f:parse_PtgUplus},19:{n:"PtgUminus",f:parse_PtgUminus},20:{n:"PtgPercent",f:parse_PtgPercent},21:{n:"PtgParen",f:parse_PtgParen},22:{n:"PtgMissArg",f:parse_PtgMissArg},23:{n:"PtgStr",f:parse_PtgStr},28:{n:"PtgErr",f:parse_PtgErr},29:{n:"PtgBool",f:parse_PtgBool},30:{n:"PtgInt",f:parse_PtgInt},31:{n:"PtgNum",f:parse_PtgNum},32:{n:"PtgArray",f:parse_PtgArray},33:{n:"PtgFunc",f:parse_PtgFunc},34:{n:"PtgFuncVar",f:parse_PtgFuncVar},35:{n:"PtgName",f:parse_PtgName},36:{n:"PtgRef",f:parse_PtgRef},37:{n:"PtgArea",f:parse_PtgArea},38:{n:"PtgMemArea",f:parse_PtgMemArea},39:{n:"PtgMemErr",f:parse_PtgMemErr},40:{n:"PtgMemNoMem",f:parse_PtgMemNoMem},41:{n:"PtgMemFunc",f:parse_PtgMemFunc},42:{n:"PtgRefErr",f:parse_PtgRefErr},43:{n:"PtgAreaErr",f:parse_PtgAreaErr},44:{n:"PtgRefN",f:parse_PtgRefN},45:{n:"PtgAreaN",f:parse_PtgAreaN},57:{n:"PtgNameX",f:parse_PtgNameX},58:{n:"PtgRef3d",f:parse_PtgRef3d},59:{n:"PtgArea3d",f:parse_PtgArea3d},60:{n:"PtgRefErr3d",f:parse_PtgRefErr3d},61:{n:"PtgAreaErr3d",f:parse_PtgAreaErr3d},255:{}};var PtgDupes={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61};(function(){for(var y in PtgDupes)PtgTypes[y]=PtgTypes[PtgDupes[y]]})();var Ptg18={};var Ptg19={1:{n:"PtgAttrSemi",f:parse_PtgAttrSemi},2:{n:"PtgAttrIf",f:parse_PtgAttrIf},4:{n:"PtgAttrChoose",f:parse_PtgAttrChoose},8:{n:"PtgAttrGoto",f:parse_PtgAttrGoto},16:{n:"PtgAttrSum",f:parse_PtgAttrSum},32:{n:"PtgAttrBaxcel",f:parse_PtgAttrBaxcel},64:{n:"PtgAttrSpace",f:parse_PtgAttrSpace},65:{n:"PtgAttrSpaceSemi",f:parse_PtgAttrSpaceSemi},255:{}};var rcregex=/(^|[^A-Za-z])R(\[?)(-?\d+|)\]?C(\[?)(-?\d+|)\]?/g;var rcbase;function rcfunc($$,$1,$2,$3,$4,$5){var R=$3.length>0?parseInt($3,10)|0:0,C=$5.length>0?parseInt($5,10)|0:0;if(C<0&&$4.length===0)C=0;if($4.length>0)C+=rcbase.c;if($2.length>0)R+=rcbase.r;return $1+encode_col(C)+encode_row(R)}function rc_to_a1(fstr,base){rcbase=base;return fstr.replace(rcregex,rcfunc)}function parse_Formula(blob,length,opts){var cell=parse_Cell(blob,6);var val=parse_FormulaValue(blob,8);var flags=blob.read_shift(1);blob.read_shift(1);var chn=blob.read_shift(4);var cbf="";if(opts.biff===5)blob.l+=length-20;else cbf=parse_CellParsedFormula(blob,length-20,opts);return{cell:cell,val:val[0],formula:cbf,shared:flags>>3&1,tt:val[1]}}function parse_FormulaValue(blob){var b;if(__readUInt16LE(blob,blob.l+6)!==65535)return[parse_Xnum(blob),"n"];switch(blob[blob.l]){case 0:blob.l+=8;return["String","s"];case 1:b=blob[blob.l+2]===1;blob.l+=8;return[b,"b"];case 2:b=BERR[blob[blob.l+2]];blob.l+=8;return[b,"e"];case 3:blob.l+=8;return["","s"]}}function parse_RgbExtra(blob,length,rgce,opts){if(opts.biff<8)return parsenoop(blob,length);var target=blob.l+length;var o=[];for(var i=0;i!==rgce.length;++i){switch(rgce[i][0]){case"PtgArray":rgce[i][1]=parse_PtgExtraArray(blob);o.push(rgce[i][1]);break;case"PtgMemArea":rgce[i][2]=parse_PtgExtraMem(blob,rgce[i][1]);o.push(rgce[i][2]);break;default:break}}length=target-blob.l;if(length!==0)o.push(parsenoop(blob,length));return o}function parse_NameParsedFormula(blob,length,opts,cce){var target=blob.l+length;var rgce=parse_Rgce(blob,cce);var rgcb;if(target!==blob.l)rgcb=parse_RgbExtra(blob,target-blob.l,rgce,opts);return[rgce,rgcb]}function parse_CellParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,length-cce-2,rgce,opts);return[rgce,rgcb]}function parse_SharedParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);var rgce=parse_Rgce(blob,cce);if(cce==65535)return[[],parsenoop(blob,length-2)];if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_ArrayParsedFormula(blob,length,opts,ref){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_Rgce(blob,length){var target=blob.l+length;var R,id,ptgs=[];while(target!=blob.l){length=target-blob.l;id=blob[blob.l];R=PtgTypes[id];if(id===24||id===25){id=blob[blob.l+1];R=(id===24?Ptg18:Ptg19)[id]}if(!R||!R.f){ptgs.push(parsenoop(blob,length))}else{ptgs.push([R.n,R.f(blob,length)])}}return ptgs}function mapper(x){return x.map(function f2(y){return y[1]}).join(",")}function stringify_formula(formula,range,cell,supbooks,opts){if(opts!==undefined&&opts.biff===5)return"BIFF5??";var _range=range!==undefined?range:{s:{c:0,r:0}};var stack=[],e1,e2,type,c,ixti,nameidx,r;if(!formula[0]||!formula[0][0])return"";for(var ff=0,fflen=formula[0].length;ff<fflen;++ff){var f=formula[0][ff];switch(f[0]){case"PtgUminus":stack.push("-"+stack.pop());break;case"PtgUplus":stack.push("+"+stack.pop());break;case"PtgPercent":stack.push(stack.pop()+"%");break;case"PtgAdd":e1=stack.pop();e2=stack.pop();stack.push(e2+"+"+e1);break;case"PtgSub":e1=stack.pop();e2=stack.pop();stack.push(e2+"-"+e1);break;case"PtgMul":e1=stack.pop();e2=stack.pop();stack.push(e2+"*"+e1);break;case"PtgDiv":e1=stack.pop();e2=stack.pop();stack.push(e2+"/"+e1);break;case"PtgPower":e1=stack.pop();e2=stack.pop();stack.push(e2+"^"+e1);break;case"PtgConcat":e1=stack.pop();e2=stack.pop();stack.push(e2+"&"+e1);break;case"PtgLt":e1=stack.pop();e2=stack.pop();stack.push(e2+"<"+e1);break;case"PtgLe":e1=stack.pop();e2=stack.pop();stack.push(e2+"<="+e1);break;case"PtgEq":e1=stack.pop();e2=stack.pop();stack.push(e2+"="+e1);break;case"PtgGe":e1=stack.pop();e2=stack.pop();stack.push(e2+">="+e1);break;case"PtgGt":e1=stack.pop();e2=stack.pop();stack.push(e2+">"+e1);break;case"PtgNe":e1=stack.pop();e2=stack.pop();stack.push(e2+"<>"+e1);break;case"PtgIsect":e1=stack.pop();e2=stack.pop();stack.push(e2+" "+e1);break;case"PtgUnion":e1=stack.pop();e2=stack.pop();stack.push(e2+","+e1);break;case"PtgRange":break;case"PtgAttrChoose":break;case"PtgAttrGoto":break;case"PtgAttrIf":break;case"PtgRef":type=f[1][0];c=shift_cell(decode_cell(encode_cell(f[1][1])),_range);stack.push(encode_cell(c));break;case"PtgRefN":type=f[1][0];c=shift_cell(decode_cell(encode_cell(f[1][1])),cell);stack.push(encode_cell(c));break;case"PtgRef3d":type=f[1][0];ixti=f[1][1];c=shift_cell(f[1][2],_range);stack.push(supbooks[1][ixti+1]+"!"+encode_cell(c));break;case"PtgFunc":case"PtgFuncVar":var argc=f[1][0],func=f[1][1];if(!argc)argc=0;var args=stack.slice(-argc);stack.length-=argc;if(func==="User")func=args.shift();stack.push(func+"("+args.join(",")+")");break;case"PtgBool":stack.push(f[1]?"TRUE":"FALSE");break;case"PtgInt":stack.push(f[1]);break;case"PtgNum":stack.push(String(f[1]));break;case"PtgStr":stack.push('"'+f[1]+'"');break;case"PtgErr":stack.push(f[1]);break;case"PtgArea":type=f[1][0];r=shift_range(f[1][1],_range);stack.push(encode_range(r));break;case"PtgArea3d":type=f[1][0];ixti=f[1][1];r=f[1][2];stack.push(supbooks[1][ixti+1]+"!"+encode_range(r));break;case"PtgAttrSum":stack.push("SUM("+stack.pop()+")");break;case"PtgAttrSemi":break;case"PtgName":nameidx=f[1][2];var lbl=supbooks[0][nameidx];var name=lbl.Name;if(name in XLSXFutureFunctions)name=XLSXFutureFunctions[name];stack.push(name);break;case"PtgNameX":var bookidx=f[1][1];nameidx=f[1][2];var externbook;if(supbooks[bookidx+1])externbook=supbooks[bookidx+1][nameidx];else if(supbooks[bookidx-1])externbook=supbooks[bookidx-1][nameidx];if(!externbook)externbook={body:"??NAMEX??"};stack.push(externbook.body);break;case"PtgParen":stack.push("("+stack.pop()+")");break;case"PtgRefErr":stack.push("#REF!");break;case"PtgExp":c={c:f[1][1],r:f[1][0]};var q={c:cell.c,r:cell.r};if(supbooks.sharedf[encode_cell(c)]){var parsedf=supbooks.sharedf[encode_cell(c)];stack.push(stringify_formula(parsedf,_range,q,supbooks,opts))}else{var fnd=false;for(e1=0;e1!=supbooks.arrayf.length;++e1){e2=supbooks.arrayf[e1];if(c.c<e2[0].s.c||c.c>e2[0].e.c)continue;if(c.r<e2[0].s.r||c.r>e2[0].e.r)continue;stack.push(stringify_formula(e2[1],_range,q,supbooks,opts))}if(!fnd)stack.push(f[1])}break;case"PtgArray":stack.push("{"+f[1].map(mapper).join(";")+"}");break;case"PtgMemArea":break;case"PtgAttrSpace":break;case"PtgTbl":break;case"PtgMemErr":break;case"PtgMissArg":stack.push("");break;case"PtgAreaErr":break;case"PtgAreaN":stack.push("");break;case"PtgRefErr3d":break;case"PtgMemFunc":break;default:throw"Unrecognized Formula Token: "+f}}return stack[0]}var PtgDataType={1:"REFERENCE",2:"VALUE",3:"ARRAY"};var BERR={0:"#NULL!",7:"#DIV/0!",15:"#VALUE!",23:"#REF!",29:"#NAME?",36:"#NUM!",42:"#N/A",43:"#GETTING_DATA",255:"#WTF?"};var Cetab={0:"BEEP",1:"OPEN",2:"OPEN.LINKS",3:"CLOSE.ALL",4:"SAVE",5:"SAVE.AS",6:"FILE.DELETE",7:"PAGE.SETUP",8:"PRINT",9:"PRINTER.SETUP",10:"QUIT",11:"NEW.WINDOW",12:"ARRANGE.ALL",13:"WINDOW.SIZE",14:"WINDOW.MOVE",15:"FULL",16:"CLOSE",17:"RUN",22:"SET.PRINT.AREA",23:"SET.PRINT.TITLES",24:"SET.PAGE.BREAK",25:"REMOVE.PAGE.BREAK",26:"FONT",27:"DISPLAY",28:"PROTECT.DOCUMENT",29:"PRECISION",30:"A1.R1C1",31:"CALCULATE.NOW",32:"CALCULATION",34:"DATA.FIND",35:"EXTRACT",36:"DATA.DELETE",37:"SET.DATABASE",38:"SET.CRITERIA",39:"SORT",40:"DATA.SERIES",41:"TABLE",42:"FORMAT.NUMBER",43:"ALIGNMENT",44:"STYLE",45:"BORDER",46:"CELL.PROTECTION",47:"COLUMN.WIDTH",48:"UNDO",49:"CUT",50:"COPY",51:"PASTE",52:"CLEAR",53:"PASTE.SPECIAL",54:"EDIT.DELETE",55:"INSERT",56:"FILL.RIGHT",57:"FILL.DOWN",61:"DEFINE.NAME",62:"CREATE.NAMES",63:"FORMULA.GOTO",64:"FORMULA.FIND",65:"SELECT.LAST.CELL",66:"SHOW.ACTIVE.CELL",67:"GALLERY.AREA",68:"GALLERY.BAR",69:"GALLERY.COLUMN",70:"GALLERY.LINE",71:"GALLERY.PIE",72:"GALLERY.SCATTER",73:"COMBINATION",74:"PREFERRED",75:"ADD.OVERLAY",76:"GRIDLINES",77:"SET.PREFERRED",78:"AXES",79:"LEGEND",80:"ATTACH.TEXT",81:"ADD.ARROW",82:"SELECT.CHART",83:"SELECT.PLOT.AREA",84:"PATTERNS",85:"MAIN.CHART",86:"OVERLAY",87:"SCALE",88:"FORMAT.LEGEND",89:"FORMAT.TEXT",90:"EDIT.REPEAT",91:"PARSE",92:"JUSTIFY",93:"HIDE",94:"UNHIDE",95:"WORKSPACE",96:"FORMULA",97:"FORMULA.FILL",98:"FORMULA.ARRAY",99:"DATA.FIND.NEXT",100:"DATA.FIND.PREV",101:"FORMULA.FIND.NEXT",102:"FORMULA.FIND.PREV",103:"ACTIVATE",104:"ACTIVATE.NEXT",105:"ACTIVATE.PREV",106:"UNLOCKED.NEXT",107:"UNLOCKED.PREV",108:"COPY.PICTURE",109:"SELECT",110:"DELETE.NAME",111:"DELETE.FORMAT",112:"VLINE",113:"HLINE",114:"VPAGE",115:"HPAGE",116:"VSCROLL",117:"HSCROLL",118:"ALERT",119:"NEW",120:"CANCEL.COPY",121:"SHOW.CLIPBOARD",122:"MESSAGE",124:"PASTE.LINK",125:"APP.ACTIVATE",126:"DELETE.ARROW",127:"ROW.HEIGHT",128:"FORMAT.MOVE",129:"FORMAT.SIZE",130:"FORMULA.REPLACE",131:"SEND.KEYS",132:"SELECT.SPECIAL",133:"APPLY.NAMES",134:"REPLACE.FONT",135:"FREEZE.PANES",136:"SHOW.INFO",137:"SPLIT",138:"ON.WINDOW",139:"ON.DATA",140:"DISABLE.INPUT",142:"OUTLINE",143:"LIST.NAMES",144:"FILE.CLOSE",145:"SAVE.WORKBOOK",146:"DATA.FORM",147:"COPY.CHART",148:"ON.TIME",149:"WAIT",150:"FORMAT.FONT",151:"FILL.UP",152:"FILL.LEFT",153:"DELETE.OVERLAY",155:"SHORT.MENUS",159:"SET.UPDATE.STATUS",161:"COLOR.PALETTE",162:"DELETE.STYLE",163:"WINDOW.RESTORE",164:"WINDOW.MAXIMIZE",166:"CHANGE.LINK",167:"CALCULATE.DOCUMENT",168:"ON.KEY",169:"APP.RESTORE",170:"APP.MOVE",171:"APP.SIZE",172:"APP.MINIMIZE",173:"APP.MAXIMIZE",174:"BRING.TO.FRONT",175:"SEND.TO.BACK",185:"MAIN.CHART.TYPE",186:"OVERLAY.CHART.TYPE",187:"SELECT.END",188:"OPEN.MAIL",189:"SEND.MAIL",190:"STANDARD.FONT",191:"CONSOLIDATE",192:"SORT.SPECIAL",193:"GALLERY.3D.AREA",194:"GALLERY.3D.COLUMN",195:"GALLERY.3D.LINE",196:"GALLERY.3D.PIE",197:"VIEW.3D",198:"GOAL.SEEK",199:"WORKGROUP",200:"FILL.GROUP",201:"UPDATE.LINK",202:"PROMOTE",203:"DEMOTE",204:"SHOW.DETAIL",206:"UNGROUP",207:"OBJECT.PROPERTIES",208:"SAVE.NEW.OBJECT",209:"SHARE",210:"SHARE.NAME",211:"DUPLICATE",212:"APPLY.STYLE",213:"ASSIGN.TO.OBJECT",214:"OBJECT.PROTECTION",215:"HIDE.OBJECT",216:"SET.EXTRACT",217:"CREATE.PUBLISHER",218:"SUBSCRIBE.TO",219:"ATTRIBUTES",220:"SHOW.TOOLBAR",222:"PRINT.PREVIEW",223:"EDIT.COLOR",224:"SHOW.LEVELS",225:"FORMAT.MAIN",226:"FORMAT.OVERLAY",227:"ON.RECALC",228:"EDIT.SERIES",229:"DEFINE.STYLE",240:"LINE.PRINT",243:"ENTER.DATA",249:"GALLERY.RADAR",250:"MERGE.STYLES",251:"EDITION.OPTIONS",252:"PASTE.PICTURE",253:"PASTE.PICTURE.LINK",254:"SPELLING",256:"ZOOM",259:"INSERT.OBJECT",260:"WINDOW.MINIMIZE",265:"SOUND.NOTE",266:"SOUND.PLAY",267:"FORMAT.SHAPE",268:"EXTEND.POLYGON",269:"FORMAT.AUTO",272:"GALLERY.3D.BAR",273:"GALLERY.3D.SURFACE",274:"FILL.AUTO",276:"CUSTOMIZE.TOOLBAR",277:"ADD.TOOL",278:"EDIT.OBJECT",279:"ON.DOUBLECLICK",280:"ON.ENTRY",281:"WORKBOOK.ADD",282:"WORKBOOK.MOVE",283:"WORKBOOK.COPY",284:"WORKBOOK.OPTIONS",285:"SAVE.WORKSPACE",288:"CHART.WIZARD",289:"DELETE.TOOL",290:"MOVE.TOOL",291:"WORKBOOK.SELECT",292:"WORKBOOK.ACTIVATE",293:"ASSIGN.TO.TOOL",295:"COPY.TOOL",296:"RESET.TOOL",297:"CONSTRAIN.NUMERIC",298:"PASTE.TOOL",302:"WORKBOOK.NEW",305:"SCENARIO.CELLS",306:"SCENARIO.DELETE",307:"SCENARIO.ADD",308:"SCENARIO.EDIT",309:"SCENARIO.SHOW",310:"SCENARIO.SHOW.NEXT",311:"SCENARIO.SUMMARY",312:"PIVOT.TABLE.WIZARD",313:"PIVOT.FIELD.PROPERTIES",314:"PIVOT.FIELD",315:"PIVOT.ITEM",316:"PIVOT.ADD.FIELDS",318:"OPTIONS.CALCULATION",319:"OPTIONS.EDIT",320:"OPTIONS.VIEW",321:"ADDIN.MANAGER",322:"MENU.EDITOR",323:"ATTACH.TOOLBARS",324:"VBAActivate",325:"OPTIONS.CHART",328:"VBA.INSERT.FILE",330:"VBA.PROCEDURE.DEFINITION",336:"ROUTING.SLIP",338:"ROUTE.DOCUMENT",339:"MAIL.LOGON",342:"INSERT.PICTURE",343:"EDIT.TOOL",344:"GALLERY.DOUGHNUT",350:"CHART.TREND",352:"PIVOT.ITEM.PROPERTIES",354:"WORKBOOK.INSERT",355:"OPTIONS.TRANSITION",356:"OPTIONS.GENERAL",370:"FILTER.ADVANCED",373:"MAIL.ADD.MAILER",374:"MAIL.DELETE.MAILER",375:"MAIL.REPLY",376:"MAIL.REPLY.ALL",377:"MAIL.FORWARD",378:"MAIL.NEXT.LETTER",379:"DATA.LABEL",380:"INSERT.TITLE",381:"FONT.PROPERTIES",382:"MACRO.OPTIONS",383:"WORKBOOK.HIDE",384:"WORKBOOK.UNHIDE",385:"WORKBOOK.DELETE",386:"WORKBOOK.NAME",388:"GALLERY.CUSTOM",390:"ADD.CHART.AUTOFORMAT",391:"DELETE.CHART.AUTOFORMAT",392:"CHART.ADD.DATA",393:"AUTO.OUTLINE",394:"TAB.ORDER",395:"SHOW.DIALOG",396:"SELECT.ALL",397:"UNGROUP.SHEETS",398:"SUBTOTAL.CREATE",399:"SUBTOTAL.REMOVE",400:"RENAME.OBJECT",412:"WORKBOOK.SCROLL",413:"WORKBOOK.NEXT",414:"WORKBOOK.PREV",415:"WORKBOOK.TAB.SPLIT",416:"FULL.SCREEN",417:"WORKBOOK.PROTECT",420:"SCROLLBAR.PROPERTIES",421:"PIVOT.SHOW.PAGES",422:"TEXT.TO.COLUMNS",423:"FORMAT.CHARTTYPE",424:"LINK.FORMAT",425:"TRACER.DISPLAY",430:"TRACER.NAVIGATE",431:"TRACER.CLEAR",432:"TRACER.ERROR",433:"PIVOT.FIELD.GROUP",434:"PIVOT.FIELD.UNGROUP",435:"CHECKBOX.PROPERTIES",436:"LABEL.PROPERTIES",437:"LISTBOX.PROPERTIES",438:"EDITBOX.PROPERTIES",439:"PIVOT.REFRESH",440:"LINK.COMBO",441:"OPEN.TEXT",442:"HIDE.DIALOG",443:"SET.DIALOG.FOCUS",444:"ENABLE.OBJECT",445:"PUSHBUTTON.PROPERTIES",446:"SET.DIALOG.DEFAULT",447:"FILTER",448:"FILTER.SHOW.ALL",449:"CLEAR.OUTLINE",450:"FUNCTION.WIZARD",451:"ADD.LIST.ITEM",452:"SET.LIST.ITEM",453:"REMOVE.LIST.ITEM",454:"SELECT.LIST.ITEM",455:"SET.CONTROL.VALUE",456:"SAVE.COPY.AS",458:"OPTIONS.LISTS.ADD",459:"OPTIONS.LISTS.DELETE",460:"SERIES.AXES",461:"SERIES.X",462:"SERIES.Y",463:"ERRORBAR.X",464:"ERRORBAR.Y",465:"FORMAT.CHART",466:"SERIES.ORDER",467:"MAIL.LOGOFF",468:"CLEAR.ROUTING.SLIP",469:"APP.ACTIVATE.MICROSOFT",470:"MAIL.EDIT.MAILER",471:"ON.SHEET",472:"STANDARD.WIDTH",473:"SCENARIO.MERGE",474:"SUMMARY.INFO",475:"FIND.FILE",476:"ACTIVE.CELL.FONT",477:"ENABLE.TIPWIZARD",478:"VBA.MAKE.ADDIN",480:"INSERTDATATABLE",481:"WORKGROUP.OPTIONS",482:"MAIL.SEND.MAILER",485:"AUTOCORRECT",489:"POST.DOCUMENT",491:"PICKLIST",493:"VIEW.SHOW",494:"VIEW.DEFINE",495:"VIEW.DELETE",509:"SHEET.BACKGROUND",510:"INSERT.MAP.OBJECT",511:"OPTIONS.MENONO",517:"MSOCHECKS",518:"NORMAL",519:"LAYOUT",520:"RM.PRINT.AREA",521:"CLEAR.PRINT.AREA",522:"ADD.PRINT.AREA",523:"MOVE.BRK",545:"HIDECURR.NOTE",546:"HIDEALL.NOTES",547:"DELETE.NOTE",548:"TRAVERSE.NOTES",549:"ACTIVATE.NOTES",620:"PROTECT.REVISIONS",621:"UNPROTECT.REVISIONS",647:"OPTIONS.ME",653:"WEB.PUBLISH",667:"NEWWEBQUERY",673:"PIVOT.TABLE.CHART",753:"OPTIONS.SAVE",755:"OPTIONS.SPELL",808:"HIDEALL.INKANNOTS"}; 18560 var parse_RRTabId=parseuint16a;var parse_ScenarioProtect=parsebool;var parse_Scl=parseuint16a;var parse_String=parse_XLUnicodeString;var parse_SxBool=parsebool;var parse_TopMargin=parse_Xnum;var parse_UsesELFs=parsebool;var parse_VCenter=parsebool;var parse_WinProtect=parsebool;var parse_WriteProtect=parsenoop;var parse_VerticalPageBreaks=parsenoop;var parse_HorizontalPageBreaks=parsenoop;var parse_Selection=parsenoop;var parse_Continue=parsenoop;var parse_Pane=parsenoop;var parse_Pls=parsenoop;var parse_DCon=parsenoop;var parse_DConRef=parsenoop;var parse_DConName=parsenoop;var parse_XCT=parsenoop;var parse_CRN=parsenoop;var parse_FileSharing=parsenoop;var parse_Uncalced=parsenoop;var parse_Template=parsenoop;var parse_Intl=parsenoop;var parse_ColInfo=parsenoop;var parse_WsBool=parsenoop;var parse_Sort=parsenoop;var parse_Palette=parsenoop;var parse_Sync=parsenoop;var parse_LPr=parsenoop;var parse_DxGCol=parsenoop;var parse_FnGroupName=parsenoop;var parse_FilterMode=parsenoop;var parse_AutoFilterInfo=parsenoop;var parse_AutoFilter=parsenoop;var parse_Setup=parsenoop;var parse_ScenMan=parsenoop;var parse_SCENARIO=parsenoop;var parse_SxView=parsenoop;var parse_Sxvd=parsenoop;var parse_SXVI=parsenoop;var parse_SxIvd=parsenoop;var parse_SXLI=parsenoop;var parse_SXPI=parsenoop;var parse_DocRoute=parsenoop;var parse_RecipName=parsenoop;var parse_MulBlank=parsenoop;var parse_SXDI=parsenoop;var parse_SXDB=parsenoop;var parse_SXFDB=parsenoop;var parse_SXDBB=parsenoop;var parse_SXNum=parsenoop;var parse_SxErr=parsenoop;var parse_SXInt=parsenoop;var parse_SXString=parsenoop;var parse_SXDtr=parsenoop;var parse_SxNil=parsenoop;var parse_SXTbl=parsenoop;var parse_SXTBRGIITM=parsenoop;var parse_SxTbpg=parsenoop;var parse_ObProj=parsenoop;var parse_SXStreamID=parsenoop;var parse_DBCell=parsenoop;var parse_SXRng=parsenoop;var parse_SxIsxoper=parsenoop;var parse_BookBool=parsenoop;var parse_DbOrParamQry=parsenoop;var parse_OleObjectSize=parsenoop;var parse_SXVS=parsenoop;var parse_BkHim=parsenoop;var parse_MsoDrawingGroup=parsenoop;var parse_MsoDrawing=parsenoop;var parse_MsoDrawingSelection=parsenoop;var parse_PhoneticInfo=parsenoop;var parse_SxRule=parsenoop;var parse_SXEx=parsenoop;var parse_SxFilt=parsenoop;var parse_SxDXF=parsenoop;var parse_SxItm=parsenoop;var parse_SxName=parsenoop;var parse_SxSelect=parsenoop;var parse_SXPair=parsenoop;var parse_SxFmla=parsenoop;var parse_SxFormat=parsenoop;var parse_SXVDEx=parsenoop;var parse_SXFormula=parsenoop;var parse_SXDBEx=parsenoop;var parse_RRDInsDel=parsenoop;var parse_RRDHead=parsenoop;var parse_RRDChgCell=parsenoop;var parse_RRDRenSheet=parsenoop;var parse_RRSort=parsenoop;var parse_RRDMove=parsenoop;var parse_RRFormat=parsenoop;var parse_RRAutoFmt=parsenoop;var parse_RRInsertSh=parsenoop;var parse_RRDMoveBegin=parsenoop;var parse_RRDMoveEnd=parsenoop;var parse_RRDInsDelBegin=parsenoop;var parse_RRDInsDelEnd=parsenoop;var parse_RRDConflict=parsenoop;var parse_RRDDefName=parsenoop;var parse_RRDRstEtxp=parsenoop;var parse_LRng=parsenoop;var parse_CUsr=parsenoop;var parse_CbUsr=parsenoop;var parse_UsrInfo=parsenoop;var parse_UsrExcl=parsenoop;var parse_FileLock=parsenoop;var parse_RRDInfo=parsenoop;var parse_BCUsrs=parsenoop;var parse_UsrChk=parsenoop;var parse_UserBView=parsenoop;var parse_UserSViewBegin=parsenoop;var parse_UserSViewEnd=parsenoop;var parse_RRDUserView=parsenoop;var parse_Qsi=parsenoop;var parse_CondFmt=parsenoop;var parse_CF=parsenoop;var parse_DVal=parsenoop;var parse_DConBin=parsenoop;var parse_Lel=parsenoop;var parse_CodeName=parse_XLUnicodeString;var parse_SXFDBType=parsenoop;var parse_ObNoMacros=parsenoop;var parse_Dv=parsenoop;var parse_Index=parsenoop;var parse_Table=parsenoop;var parse_Window2=parsenoop;var parse_Style=parsenoop;var parse_BigName=parsenoop;var parse_ContinueBigName=parsenoop;var parse_WebPub=parsenoop;var parse_QsiSXTag=parsenoop;var parse_DBQueryExt=parsenoop;var parse_ExtString=parsenoop;var parse_TxtQry=parsenoop;var parse_Qsir=parsenoop;var parse_Qsif=parsenoop;var parse_RRDTQSIF=parsenoop;var parse_OleDbConn=parsenoop;var parse_WOpt=parsenoop;var parse_SXViewEx=parsenoop;var parse_SXTH=parsenoop;var parse_SXPIEx=parsenoop;var parse_SXVDTEx=parsenoop;var parse_SXViewEx9=parsenoop;var parse_ContinueFrt=parsenoop;var parse_RealTimeData=parsenoop;var parse_ChartFrtInfo=parsenoop;var parse_FrtWrapper=parsenoop;var parse_StartBlock=parsenoop;var parse_EndBlock=parsenoop;var parse_StartObject=parsenoop;var parse_EndObject=parsenoop;var parse_CatLab=parsenoop;var parse_YMult=parsenoop;var parse_SXViewLink=parsenoop;var parse_PivotChartBits=parsenoop;var parse_FrtFontList=parsenoop;var parse_SheetExt=parsenoop;var parse_BookExt=parsenoop;var parse_SXAddl=parsenoop;var parse_CrErr=parsenoop;var parse_HFPicture=parsenoop;var parse_Feat=parsenoop;var parse_DataLabExt=parsenoop;var parse_DataLabExtContents=parsenoop;var parse_CellWatch=parsenoop;var parse_FeatHdr11=parsenoop;var parse_Feature11=parsenoop;var parse_DropDownObjIds=parsenoop;var parse_ContinueFrt11=parsenoop;var parse_DConn=parsenoop;var parse_List12=parsenoop;var parse_Feature12=parsenoop;var parse_CondFmt12=parsenoop;var parse_CF12=parsenoop;var parse_CFEx=parsenoop;var parse_XFCRC=parsenoop;var parse_XFExt=parsenoop;var parse_AutoFilter12=parsenoop;var parse_ContinueFrt12=parsenoop;var parse_MDTInfo=parsenoop;var parse_MDXStr=parsenoop;var parse_MDXTuple=parsenoop;var parse_MDXSet=parsenoop;var parse_MDXProp=parsenoop;var parse_MDXKPI=parsenoop;var parse_MDB=parsenoop;var parse_PLV=parsenoop;var parse_DXF=parsenoop;var parse_TableStyles=parsenoop;var parse_TableStyle=parsenoop;var parse_TableStyleElement=parsenoop;var parse_StyleExt=parsenoop;var parse_NamePublish=parsenoop;var parse_NameCmt=parsenoop;var parse_SortData=parsenoop;var parse_Theme=parsenoop;var parse_GUIDTypeLib=parsenoop;var parse_FnGrp12=parsenoop;var parse_NameFnGrp12=parsenoop;var parse_HeaderFooter=parsenoop;var parse_CrtLayout12=parsenoop;var parse_CrtMlFrt=parsenoop;var parse_CrtMlFrtContinue=parsenoop;var parse_ShapePropsStream=parsenoop;var parse_TextPropsStream=parsenoop;var parse_RichTextStream=parsenoop;var parse_CrtLayout12A=parsenoop;var parse_Units=parsenoop;var parse_Chart=parsenoop;var parse_Series=parsenoop;var parse_DataFormat=parsenoop;var parse_LineFormat=parsenoop;var parse_MarkerFormat=parsenoop;var parse_AreaFormat=parsenoop;var parse_PieFormat=parsenoop;var parse_AttachedLabel=parsenoop;var parse_SeriesText=parsenoop;var parse_ChartFormat=parsenoop;var parse_Legend=parsenoop;var parse_SeriesList=parsenoop;var parse_Bar=parsenoop;var parse_Line=parsenoop;var parse_Pie=parsenoop;var parse_Area=parsenoop;var parse_Scatter=parsenoop;var parse_CrtLine=parsenoop;var parse_Axis=parsenoop;var parse_Tick=parsenoop;var parse_ValueRange=parsenoop;var parse_CatSerRange=parsenoop;var parse_AxisLine=parsenoop;var parse_CrtLink=parsenoop;var parse_DefaultText=parsenoop;var parse_Text=parsenoop;var parse_ObjectLink=parsenoop;var parse_Frame=parsenoop;var parse_Begin=parsenoop;var parse_End=parsenoop;var parse_PlotArea=parsenoop;var parse_Chart3d=parsenoop;var parse_PicF=parsenoop;var parse_DropBar=parsenoop;var parse_Radar=parsenoop;var parse_Surf=parsenoop;var parse_RadarArea=parsenoop;var parse_AxisParent=parsenoop;var parse_LegendException=parsenoop;var parse_ShtProps=parsenoop;var parse_SerToCrt=parsenoop;var parse_AxesUsed=parsenoop;var parse_SBaseRef=parsenoop;var parse_SerParent=parsenoop;var parse_SerAuxTrend=parsenoop;var parse_IFmtRecord=parsenoop;var parse_Pos=parsenoop;var parse_AlRuns=parsenoop;var parse_BRAI=parsenoop;var parse_SerAuxErrBar=parsenoop;var parse_ClrtClient=parsenoop;var parse_SerFmt=parsenoop;var parse_Chart3DBarShape=parsenoop;var parse_Fbi=parsenoop;var parse_BopPop=parsenoop;var parse_AxcExt=parsenoop;var parse_Dat=parsenoop;var parse_PlotGrowth=parsenoop;var parse_SIIndex=parsenoop;var parse_GelFrame=parsenoop;var parse_BopPopCustom=parsenoop;var parse_Fbi2=parsenoop;function parse_BIFF5String(blob){var len=blob.read_shift(1);return blob.read_shift(len,"sbcs")}var _chr=function(c){return String.fromCharCode(c)};var attregexg=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;var attregex=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;function parsexmltag(tag,skip_root){var words=tag.split(/\s+/);var z=[];if(!skip_root)z[0]=words[0];if(words.length===1)return z;var m=tag.match(attregexg),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex);if((j=y[1].indexOf(":"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)==="xmlns:")w="xmlns"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}function parsexmltagobj(tag){var words=tag.split(/\s+/);var z={};if(words.length===1)return z;var m=tag.match(attregexg),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex);if((j=y[1].indexOf(":"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)==="xmlns:")w="xmlns"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}var encodings={"&quot;":'"',"&apos;":"'","&gt;":">","&lt;":"<","&amp;":"&"};var rencoding=evert(encodings);var rencstr="&<>'\"".split("");var XML_HEADER='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';var OFFCRYPTO={};var make_offcrypto=function(O,_crypto){var crypto;if(typeof _crypto!=="undefined")crypto=_crypto;else if(typeof require!=="undefined"){try{crypto=require("cry"+"pto")}catch(e){crypto=null}}O.rc4=function(key,data){var S=new Array(256);var c=0,i=0,j=0,t=0;for(i=0;i!=256;++i)S[i]=i;for(i=0;i!=256;++i){j=j+S[i]+key[i%key.length].charCodeAt(0)&255;t=S[i];S[i]=S[j];S[j]=t}i=j=0;out=Buffer(data.length);for(c=0;c!=data.length;++c){i=i+1&255;j=(j+S[i])%256;t=S[i];S[i]=S[j];S[j]=t;out[c]=data[c]^S[S[i]+S[j]&255]}return out};if(crypto){O.md5=function(hex){return crypto.createHash("md5").update(hex).digest("hex")}}else{O.md5=function(hex){throw"unimplemented"}}};make_offcrypto(OFFCRYPTO,typeof crypto!=="undefined"?crypto:undefined);function _JS2ANSI(str){if(typeof cptable!=="undefined")return cptable.utils.encode(1252,str);return str.split("").map(function(x){return x.charCodeAt(0)})}function parse_Version(blob,length){var o={};o.Major=blob.read_shift(2);o.Minor=blob.read_shift(2);return o}function parse_EncryptionHeader(blob,length){var o={};o.Flags=blob.read_shift(4);var tmp=blob.read_shift(4);if(tmp!==0)throw"Unrecognized SizeExtra: "+tmp;o.AlgID=blob.read_shift(4);switch(o.AlgID){case 0:case 26625:case 26126:case 26127:case 26128:break;default:throw"Unrecognized encryption algorithm: "+o.AlgID}parsenoop(blob,length-12);return o}function parse_EncryptionVerifier(blob,length){return parsenoop(blob,length)}function parse_RC4CryptoHeader(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Minor!=2)throw"unrecognized minor version code: "+vers.Minor;if(vers.Major>4||vers.Major<2)throw"unrecognized major version code: "+vers.Major;o.Flags=blob.read_shift(4);length-=4;var sz=blob.read_shift(4);length-=4;o.EncryptionHeader=parse_EncryptionHeader(blob,sz);length-=sz;o.EncryptionVerifier=parse_EncryptionVerifier(blob,length);return o}function parse_RC4Header(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Major!=1||vers.Minor!=1)throw"unrecognized version code "+vers.Major+" : "+vers.Minor;o.Salt=blob.read_shift(16);o.EncryptedVerifier=blob.read_shift(16);o.EncryptedVerifierHash=blob.read_shift(16);return o}function crypto_CreatePasswordVerifier_Method1(Password){var Verifier=0,PasswordArray;var PasswordDecoded=_JS2ANSI(Password);var len=PasswordDecoded.length+1,i,PasswordByte;var Intermediate1,Intermediate2,Intermediate3;PasswordArray=new_buf(len);PasswordArray[0]=PasswordDecoded.length;for(i=1;i!=len;++i)PasswordArray[i]=PasswordDecoded[i-1];for(i=len-1;i>=0;--i){PasswordByte=PasswordArray[i];Intermediate1=(Verifier&16384)===0?0:1;Intermediate2=Verifier<<1&32767;Intermediate3=Intermediate1|Intermediate2;Verifier=Intermediate3^PasswordByte}return Verifier^52811}var crypto_CreateXorArray_Method1=function(){var PadArray=[187,255,255,186,255,255,185,128,0,190,15,0,191,15,0];var InitialCode=[57840,7439,52380,33984,4364,3600,61902,12606,6258,57657,54287,34041,10252,43370,20163];var XorMatrix=[44796,19929,39858,10053,20106,40212,10761,31585,63170,64933,60267,50935,40399,11199,17763,35526,1453,2906,5812,11624,23248,885,1770,3540,7080,14160,28320,56640,55369,41139,20807,41614,21821,43642,17621,28485,56970,44341,19019,38038,14605,29210,60195,50791,40175,10751,21502,43004,24537,18387,36774,3949,7898,15796,31592,63184,47201,24803,49606,37805,14203,28406,56812,17824,35648,1697,3394,6788,13576,27152,43601,17539,35078,557,1114,2228,4456,30388,60776,51953,34243,7079,14158,28316,14128,28256,56512,43425,17251,34502,7597,13105,26210,52420,35241,883,1766,3532,4129,8258,16516,33032,4657,9314,18628];var Ror=function(Byte){return(Byte/2|Byte*128)&255};var XorRor=function(byte1,byte2){return Ror(byte1^byte2)};var CreateXorKey_Method1=function(Password){var XorKey=InitialCode[Password.length-1];var CurrentElement=104;for(var i=Password.length-1;i>=0;--i){var Char=Password[i];for(var j=0;j!=7;++j){if(Char&64)XorKey^=XorMatrix[CurrentElement];Char*=2;--CurrentElement}}return XorKey};return function(password){var Password=_JS2ANSI(password);var XorKey=CreateXorKey_Method1(Password);var Index=Password.length;var ObfuscationArray=new_buf(16);for(var i=0;i!=16;++i)ObfuscationArray[i]=0;var Temp,PasswordLastChar,PadIndex;if((Index&1)===1){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[0],Temp);--Index;Temp=XorKey&255;PasswordLastChar=Password[Password.length-1];ObfuscationArray[Index]=XorRor(PasswordLastChar,Temp)}while(Index>0){--Index;Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp)}Index=15;PadIndex=15-Password.length;while(PadIndex>0){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[PadIndex],Temp);--Index;--PadIndex;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;--PadIndex}return ObfuscationArray}}();var crypto_DecryptData_Method1=function(password,Data,XorArrayIndex,XorArray,O){if(!O)O=Data;if(!XorArray)XorArray=crypto_CreateXorArray_Method1(password);var Index,Value;for(Index=0;Index!=Data.length;++Index){Value=Data[Index];Value^=XorArray[XorArrayIndex];Value=(Value>>5|Value<<3)&255;O[Index]=Value;++XorArrayIndex}return[O,XorArrayIndex,XorArray]};var crypto_MakeXorDecryptor=function(password){var XorArrayIndex=0,XorArray=crypto_CreateXorArray_Method1(password);return function(Data){var O=crypto_DecryptData_Method1(null,Data,XorArrayIndex,XorArray);XorArrayIndex=O[1];return O[0]}};function parse_XORObfuscation(blob,length,opts,out){var o={key:parseuint16(blob),verificationBytes:parseuint16(blob)};if(opts.password)o.verifier=crypto_CreatePasswordVerifier_Method1(opts.password);out.valid=o.verificationBytes===o.verifier;if(out.valid)out.insitu_decrypt=crypto_MakeXorDecryptor(opts.password);return o}function parse_FilePassHeader(blob,length,oo){var o=oo||{};o.Info=blob.read_shift(2);blob.l-=2;if(o.Info===1)o.Data=parse_RC4Header(blob,length);else o.Data=parse_RC4CryptoHeader(blob,length);return o}function parse_FilePass(blob,length,opts){var o={Type:blob.read_shift(2)};if(o.Type)parse_FilePassHeader(blob,length-2,o);else parse_XORObfuscation(blob,length-2,opts,o);return o}function parseread(l){return function(blob,length){blob.l+=l;return}}function parseread1(blob,length){blob.l+=1;return}function parse_ColRelU(blob,length){var c=blob.read_shift(2);return[c&16383,c>>14&1,c>>15&1]}function parse_RgceArea(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceAreaRel(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceLoc(blob,length){var r=blob.read_shift(2);var c=parse_ColRelU(blob,2);return{r:r,c:c[0],cRel:c[1],rRel:c[2]}}function parse_RgceLocRel(blob,length){var r=blob.read_shift(2);var cl=blob.read_shift(2);var cRel=(cl&32768)>>15,rRel=(cl&16384)>>14;cl&=16383;if(cRel!==0)while(cl>=256)cl-=256;return{r:r,c:cl,cRel:cRel,rRel:rRel}}function parse_PtgArea(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceArea(blob,8);return[type,area]}function parse_PtgArea3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);var area=parse_RgceArea(blob,8);return[type,ixti,area]}function parse_PtgAreaErr(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=8;return[type]}function parse_PtgAreaErr3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);blob.l+=8;return[type,ixti]}function parse_PtgAreaN(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceAreaRel(blob,8);return[type,area]}function parse_PtgArray(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=7;return[type]}function parse_PtgAttrBaxcel(blob,length){var bitSemi=blob[blob.l+1]&1;var bitBaxcel=1;blob.l+=4;return[bitSemi,bitBaxcel]}function parse_PtgAttrChoose(blob,length){blob.l+=2;var offset=blob.read_shift(2);var o=[];for(var i=0;i<=offset;++i)o.push(blob.read_shift(2));return o}function parse_PtgAttrGoto(blob,length){var bitGoto=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitGoto,blob.read_shift(2)]}function parse_PtgAttrIf(blob,length){var bitIf=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitIf,blob.read_shift(2)]}function parse_PtgAttrSemi(blob,length){var bitSemi=blob[blob.l+1]&255?1:0;blob.l+=4;return[bitSemi]}function parse_PtgAttrSpaceType(blob,length){var type=blob.read_shift(1),cch=blob.read_shift(1);return[type,cch]}function parse_PtgAttrSpace(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgAttrSpaceSemi(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgRef(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLoc(blob,4);return[type,loc]}function parse_PtgRefN(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLocRel(blob,4);return[type,loc]}function parse_PtgRef3d(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var ixti=blob.read_shift(2);var loc=parse_RgceLoc(blob,4);return[type,ixti,loc]}function parse_PtgFunc(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var iftab=blob.read_shift(2);return[FtabArgc[iftab],Ftab[iftab]]}function parse_PtgFuncVar(blob,length){blob.l++;var cparams=blob.read_shift(1),tab=parsetab(blob);return[cparams,(tab[0]===0?Ftab:Cetab)[tab[1]]]}function parsetab(blob,length){return[blob[blob.l+1]>>7,blob.read_shift(2)&32767]}var parse_PtgAttrSum=parseread(4);var parse_PtgConcat=parseread1;function parse_PtgExp(blob,length){blob.l++;var row=blob.read_shift(2);var col=blob.read_shift(2);return[row,col]}function parse_PtgErr(blob,length){blob.l++;return BERR[blob.read_shift(1)]}function parse_PtgInt(blob,length){blob.l++;return blob.read_shift(2)}function parse_PtgBool(blob,length){blob.l++;return blob.read_shift(1)!==0}function parse_PtgNum(blob,length){blob.l++;return parse_Xnum(blob,8)}function parse_PtgStr(blob,length){blob.l++;return parse_ShortXLUnicodeString(blob)}function parse_SerAr(blob){var val=[];switch(val[0]=blob.read_shift(1)){case 4:val[1]=parsebool(blob,1)?"TRUE":"FALSE";blob.l+=7;break;case 16:val[1]=BERR[blob[blob.l]];blob.l+=8;break;case 0:blob.l+=8;break;case 1:val[1]=parse_Xnum(blob,8);break;case 2:val[1]=parse_XLUnicodeString(blob);break}return val}function parse_PtgExtraMem(blob,cce){var count=blob.read_shift(2);var out=[];for(var i=0;i!=count;++i)out.push(parse_Ref8U(blob,8));return out}function parse_PtgExtraArray(blob){var cols=1+blob.read_shift(1);var rows=1+blob.read_shift(2);for(var i=0,o=[];i!=rows&&(o[i]=[]);++i)for(var j=0;j!=cols;++j)o[i][j]=parse_SerAr(blob);return o}function parse_PtgName(blob,length){var type=blob.read_shift(1)>>>5&3;var nameindex=blob.read_shift(4);return[type,0,nameindex]}function parse_PtgNameX(blob,length){var type=blob.read_shift(1)>>>5&3;var ixti=blob.read_shift(2);var nameindex=blob.read_shift(4);return[type,ixti,nameindex]}function parse_PtgMemArea(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgMemFunc(blob,length){var type=blob.read_shift(1)>>>5&3;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgRefErr(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;return[type]}var parse_PtgAdd=parseread1;var parse_PtgDiv=parseread1;var parse_PtgEq=parseread1;var parse_PtgGe=parseread1;var parse_PtgGt=parseread1;var parse_PtgIsect=parseread1;var parse_PtgLe=parseread1;var parse_PtgLt=parseread1;var parse_PtgMissArg=parseread1;var parse_PtgMul=parseread1;var parse_PtgNe=parseread1;var parse_PtgParen=parseread1;var parse_PtgPercent=parseread1;var parse_PtgPower=parseread1;var parse_PtgRange=parseread1;var parse_PtgSub=parseread1;var parse_PtgUminus=parseread1;var parse_PtgUnion=parseread1;var parse_PtgUplus=parseread1;var parse_PtgMemErr=parsenoop;var parse_PtgMemNoMem=parsenoop;var parse_PtgRefErr3d=parsenoop;var parse_PtgTbl=parsenoop;var PtgTypes={1:{n:"PtgExp",f:parse_PtgExp},2:{n:"PtgTbl",f:parse_PtgTbl},3:{n:"PtgAdd",f:parse_PtgAdd},4:{n:"PtgSub",f:parse_PtgSub},5:{n:"PtgMul",f:parse_PtgMul},6:{n:"PtgDiv",f:parse_PtgDiv},7:{n:"PtgPower",f:parse_PtgPower},8:{n:"PtgConcat",f:parse_PtgConcat},9:{n:"PtgLt",f:parse_PtgLt},10:{n:"PtgLe",f:parse_PtgLe},11:{n:"PtgEq",f:parse_PtgEq},12:{n:"PtgGe",f:parse_PtgGe},13:{n:"PtgGt",f:parse_PtgGt},14:{n:"PtgNe",f:parse_PtgNe},15:{n:"PtgIsect",f:parse_PtgIsect},16:{n:"PtgUnion",f:parse_PtgUnion},17:{n:"PtgRange",f:parse_PtgRange},18:{n:"PtgUplus",f:parse_PtgUplus},19:{n:"PtgUminus",f:parse_PtgUminus},20:{n:"PtgPercent",f:parse_PtgPercent},21:{n:"PtgParen",f:parse_PtgParen},22:{n:"PtgMissArg",f:parse_PtgMissArg},23:{n:"PtgStr",f:parse_PtgStr},28:{n:"PtgErr",f:parse_PtgErr},29:{n:"PtgBool",f:parse_PtgBool},30:{n:"PtgInt",f:parse_PtgInt},31:{n:"PtgNum",f:parse_PtgNum},32:{n:"PtgArray",f:parse_PtgArray},33:{n:"PtgFunc",f:parse_PtgFunc},34:{n:"PtgFuncVar",f:parse_PtgFuncVar},35:{n:"PtgName",f:parse_PtgName},36:{n:"PtgRef",f:parse_PtgRef},37:{n:"PtgArea",f:parse_PtgArea},38:{n:"PtgMemArea",f:parse_PtgMemArea},39:{n:"PtgMemErr",f:parse_PtgMemErr},40:{n:"PtgMemNoMem",f:parse_PtgMemNoMem},41:{n:"PtgMemFunc",f:parse_PtgMemFunc},42:{n:"PtgRefErr",f:parse_PtgRefErr},43:{n:"PtgAreaErr",f:parse_PtgAreaErr},44:{n:"PtgRefN",f:parse_PtgRefN},45:{n:"PtgAreaN",f:parse_PtgAreaN},57:{n:"PtgNameX",f:parse_PtgNameX},58:{n:"PtgRef3d",f:parse_PtgRef3d},59:{n:"PtgArea3d",f:parse_PtgArea3d},60:{n:"PtgRefErr3d",f:parse_PtgRefErr3d},61:{n:"PtgAreaErr3d",f:parse_PtgAreaErr3d},255:{}};var PtgDupes={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61};(function(){for(var y in PtgDupes)PtgTypes[y]=PtgTypes[PtgDupes[y]]})();var Ptg18={};var Ptg19={1:{n:"PtgAttrSemi",f:parse_PtgAttrSemi},2:{n:"PtgAttrIf",f:parse_PtgAttrIf},4:{n:"PtgAttrChoose",f:parse_PtgAttrChoose},8:{n:"PtgAttrGoto",f:parse_PtgAttrGoto},16:{n:"PtgAttrSum",f:parse_PtgAttrSum},32:{n:"PtgAttrBaxcel",f:parse_PtgAttrBaxcel},64:{n:"PtgAttrSpace",f:parse_PtgAttrSpace},65:{n:"PtgAttrSpaceSemi",f:parse_PtgAttrSpaceSemi},255:{}};var rcregex=/(^|[^A-Za-z])R(\[?)(-?\d+|)\]?C(\[?)(-?\d+|)\]?/g;var rcbase;function rcfunc($$,$1,$2,$3,$4,$5){var R=$3.length>0?parseInt($3,10)|0:0,C=$5.length>0?parseInt($5,10)|0:0;if(C<0&&$4.length===0)C=0;if($4.length>0)C+=rcbase.c;if($2.length>0)R+=rcbase.r;return $1+encode_col(C)+encode_row(R)}function rc_to_a1(fstr,base){rcbase=base;return fstr.replace(rcregex,rcfunc)}function parse_Formula(blob,length,opts){var cell=parse_Cell(blob,6);var val=parse_FormulaValue(blob,8);var flags=blob.read_shift(1);blob.read_shift(1);var chn=blob.read_shift(4);var cbf="";if(opts.biff===5)blob.l+=length-20;else cbf=parse_CellParsedFormula(blob,length-20,opts);return{cell:cell,val:val[0],formula:cbf,shared:flags>>3&1,tt:val[1]}}function parse_FormulaValue(blob){var b;if(__readUInt16LE(blob,blob.l+6)!==65535)return[parse_Xnum(blob),"n"];switch(blob[blob.l]){case 0:blob.l+=8;return["String","s"];case 1:b=blob[blob.l+2]===1;blob.l+=8;return[b,"b"];case 2:b=BERR[blob[blob.l+2]];blob.l+=8;return[b,"e"];case 3:blob.l+=8;return["","s"]}}function parse_RgbExtra(blob,length,rgce,opts){if(opts.biff<8)return parsenoop(blob,length);var target=blob.l+length;var o=[];for(var i=0;i!==rgce.length;++i){switch(rgce[i][0]){case"PtgArray":rgce[i][1]=parse_PtgExtraArray(blob);o.push(rgce[i][1]);break;case"PtgMemArea":rgce[i][2]=parse_PtgExtraMem(blob,rgce[i][1]);o.push(rgce[i][2]);break;default:break}}length=target-blob.l;if(length!==0)o.push(parsenoop(blob,length));return o}function parse_NameParsedFormula(blob,length,opts,cce){var target=blob.l+length;var rgce=parse_Rgce(blob,cce);var rgcb;if(target!==blob.l)rgcb=parse_RgbExtra(blob,target-blob.l,rgce,opts);return[rgce,rgcb]}function parse_CellParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,length-cce-2,rgce,opts);return[rgce,rgcb]}function parse_SharedParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);var rgce=parse_Rgce(blob,cce);if(cce==65535)return[[],parsenoop(blob,length-2)];if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_ArrayParsedFormula(blob,length,opts,ref){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_Rgce(blob,length){var target=blob.l+length;var R,id,ptgs=[];while(target!=blob.l){length=target-blob.l;id=blob[blob.l];R=PtgTypes[id];if(id===24||id===25){id=blob[blob.l+1];R=(id===24?Ptg18:Ptg19)[id]}if(!R||!R.f){ptgs.push(parsenoop(blob,length))}else{ptgs.push([R.n,R.f(blob,length)])}}return ptgs}function mapper(x){return x.map(function f2(y){return y[1]}).join(",")}function stringify_formula(formula,range,cell,supbooks,opts){if(opts!==undefined&&opts.biff===5)return"BIFF5??";var _range=range!==undefined?range:{s:{c:0,r:0}};var stack=[],e1,e2,type,c,ixti,nameidx,r;if(!formula[0]||!formula[0][0])return"";for(var ff=0,fflen=formula[0].length;ff<fflen;++ff){var f=formula[0][ff];switch(f[0]){case"PtgUminus":stack.push("-"+stack.pop());break;case"PtgUplus":stack.push("+"+stack.pop());break;case"PtgPercent":stack.push(stack.pop()+"%");break;case"PtgAdd":e1=stack.pop();e2=stack.pop();stack.push(e2+"+"+e1);break;case"PtgSub":e1=stack.pop();e2=stack.pop();stack.push(e2+"-"+e1);break;case"PtgMul":e1=stack.pop();e2=stack.pop();stack.push(e2+"*"+e1);break;case"PtgDiv":e1=stack.pop();e2=stack.pop();stack.push(e2+"/"+e1);break;case"PtgPower":e1=stack.pop();e2=stack.pop();stack.push(e2+"^"+e1);break;case"PtgConcat":e1=stack.pop();e2=stack.pop();stack.push(e2+"&"+e1);break;case"PtgLt":e1=stack.pop();e2=stack.pop();stack.push(e2+"<"+e1);break;case"PtgLe":e1=stack.pop();e2=stack.pop();stack.push(e2+"<="+e1);break;case"PtgEq":e1=stack.pop();e2=stack.pop();stack.push(e2+"="+e1);break;case"PtgGe":e1=stack.pop();e2=stack.pop();stack.push(e2+">="+e1);break;case"PtgGt":e1=stack.pop();e2=stack.pop();stack.push(e2+">"+e1);break;case"PtgNe":e1=stack.pop();e2=stack.pop();stack.push(e2+"<>"+e1);break;case"PtgIsect":e1=stack.pop();e2=stack.pop();stack.push(e2+" "+e1);break;case"PtgUnion":e1=stack.pop();e2=stack.pop();stack.push(e2+","+e1);break;case"PtgRange":break;case"PtgAttrChoose":break;case"PtgAttrGoto":break;case"PtgAttrIf":break;case"PtgRef":type=f[1][0];c=shift_cell(decode_cell(encode_cell(f[1][1])),_range);stack.push(encode_cell(c));break;case"PtgRefN":type=f[1][0];c=shift_cell(decode_cell(encode_cell(f[1][1])),cell);stack.push(encode_cell(c));break;case"PtgRef3d":type=f[1][0];ixti=f[1][1];c=shift_cell(f[1][2],_range);stack.push(supbooks[1][ixti+1]+"!"+encode_cell(c));break;case"PtgFunc":case"PtgFuncVar":var argc=f[1][0],func=f[1][1];if(!argc)argc=0;var args=stack.slice(-argc);stack.length-=argc;if(func==="User")func=args.shift();stack.push(func+"("+args.join(",")+")");break;case"PtgBool":stack.push(f[1]?"TRUE":"FALSE");break;case"PtgInt":stack.push(f[1]);break;case"PtgNum":stack.push(String(f[1]));break;case"PtgStr":stack.push('"'+f[1]+'"');break;case"PtgErr":stack.push(f[1]);break;case"PtgArea":type=f[1][0];r=shift_range(f[1][1],_range);stack.push(encode_range(r));break;case"PtgArea3d":type=f[1][0];ixti=f[1][1];r=f[1][2];stack.push(supbooks[1][ixti+1]+"!"+encode_range(r));break;case"PtgAttrSum":stack.push("SUM("+stack.pop()+")");break;case"PtgAttrSemi":break;case"PtgName":nameidx=f[1][2];var lbl=supbooks[0][nameidx];var name=lbl.Name;if(name in XLSXFutureFunctions)name=XLSXFutureFunctions[name];stack.push(name);break;case"PtgNameX":var bookidx=f[1][1];nameidx=f[1][2];var externbook;if(supbooks[bookidx+1])externbook=supbooks[bookidx+1][nameidx];else if(supbooks[bookidx-1])externbook=supbooks[bookidx-1][nameidx];if(!externbook)externbook={body:"??NAMEX??"};stack.push(externbook.body);break;case"PtgParen":stack.push("("+stack.pop()+")");break;case"PtgRefErr":stack.push("#REF!");break;case"PtgExp":c={c:f[1][1],r:f[1][0]};var q={c:cell.c,r:cell.r};if(supbooks.sharedf[encode_cell(c)]){var parsedf=supbooks.sharedf[encode_cell(c)];stack.push(stringify_formula(parsedf,_range,q,supbooks,opts))}else{var fnd=false;for(e1=0;e1!=supbooks.arrayf.length;++e1){e2=supbooks.arrayf[e1];if(c.c<e2[0].s.c||c.c>e2[0].e.c)continue;if(c.r<e2[0].s.r||c.r>e2[0].e.r)continue;stack.push(stringify_formula(e2[1],_range,q,supbooks,opts))}if(!fnd)stack.push(f[1])}break;case"PtgArray":stack.push("{"+f[1].map(mapper).join(";")+"}");break;case"PtgMemArea":break;case"PtgAttrSpace":break;case"PtgTbl":break;case"PtgMemErr":break;case"PtgMissArg":stack.push("");break;case"PtgAreaErr":break;case"PtgAreaN":stack.push("");break;case"PtgRefErr3d":break;case"PtgMemFunc":break;default:throw"Unrecognized Formula Token: "+f}}return stack[0]}var PtgDataType={1:"REFERENCE",2:"VALUE",3:"ARRAY"};var BERR={0:"#NULL!",7:"#DIV/0!",15:"#VALUE!",23:"#REF!",29:"#NAME?",36:"#NUM!",42:"#N/A",43:"#GETTING_DATA",255:"#WTF?"};var Cetab={0:"BEEP",1:"OPEN",2:"OPEN.LINKS",3:"CLOSE.ALL",4:"SAVE",5:"SAVE.AS",6:"FILE.DELETE",7:"PAGE.SETUP",8:"PRINT",9:"PRINTER.SETUP",10:"QUIT",11:"NEW.WINDOW",12:"ARRANGE.ALL",13:"WINDOW.SIZE",14:"WINDOW.MOVE",15:"FULL",16:"CLOSE",17:"RUN",22:"SET.PRINT.AREA",23:"SET.PRINT.TITLES",24:"SET.PAGE.BREAK",25:"REMOVE.PAGE.BREAK",26:"FONT",27:"DISPLAY",28:"PROTECT.DOCUMENT",29:"PRECISION",30:"A1.R1C1",31:"CALCULATE.NOW",32:"CALCULATION",34:"DATA.FIND",35:"EXTRACT",36:"DATA.DELETE",37:"SET.DATABASE",38:"SET.CRITERIA",39:"SORT",40:"DATA.SERIES",41:"TABLE",42:"FORMAT.NUMBER",43:"ALIGNMENT",44:"STYLE",45:"BORDER",46:"CELL.PROTECTION",47:"COLUMN.WIDTH",48:"UNDO",49:"CUT",50:"COPY",51:"PASTE",52:"CLEAR",53:"PASTE.SPECIAL",54:"EDIT.DELETE",55:"INSERT",56:"FILL.RIGHT",57:"FILL.DOWN",61:"DEFINE.NAME",62:"CREATE.NAMES",63:"FORMULA.GOTO",64:"FORMULA.FIND",65:"SELECT.LAST.CELL",66:"SHOW.ACTIVE.CELL",67:"GALLERY.AREA",68:"GALLERY.BAR",69:"GALLERY.COLUMN",70:"GALLERY.LINE",71:"GALLERY.PIE",72:"GALLERY.SCATTER",73:"COMBINATION",74:"PREFERRED",75:"ADD.OVERLAY",76:"GRIDLINES",77:"SET.PREFERRED",78:"AXES",79:"LEGEND",80:"ATTACH.TEXT",81:"ADD.ARROW",82:"SELECT.CHART",83:"SELECT.PLOT.AREA",84:"PATTERNS",85:"MAIN.CHART",86:"OVERLAY",87:"SCALE",88:"FORMAT.LEGEND",89:"FORMAT.TEXT",90:"EDIT.REPEAT",91:"PARSE",92:"JUSTIFY",93:"HIDE",94:"UNHIDE",95:"WORKSPACE",96:"FORMULA",97:"FORMULA.FILL",98:"FORMULA.ARRAY",99:"DATA.FIND.NEXT",100:"DATA.FIND.PREV",101:"FORMULA.FIND.NEXT",102:"FORMULA.FIND.PREV",103:"ACTIVATE",104:"ACTIVATE.NEXT",105:"ACTIVATE.PREV",106:"UNLOCKED.NEXT",107:"UNLOCKED.PREV",108:"COPY.PICTURE",109:"SELECT",110:"DELETE.NAME",111:"DELETE.FORMAT",112:"VLINE",113:"HLINE",114:"VPAGE",115:"HPAGE",116:"VSCROLL",117:"HSCROLL",118:"ALERT",119:"NEW",120:"CANCEL.COPY",121:"SHOW.CLIPBOARD",122:"MESSAGE",124:"PASTE.LINK",125:"APP.ACTIVATE",126:"DELETE.ARROW",127:"ROW.HEIGHT",128:"FORMAT.MOVE",129:"FORMAT.SIZE",130:"FORMULA.REPLACE",131:"SEND.KEYS",132:"SELECT.SPECIAL",133:"APPLY.NAMES",134:"REPLACE.FONT",135:"FREEZE.PANES",136:"SHOW.INFO",137:"SPLIT",138:"ON.WINDOW",139:"ON.DATA",140:"DISABLE.INPUT",142:"OUTLINE",143:"LIST.NAMES",144:"FILE.CLOSE",145:"SAVE.WORKBOOK",146:"DATA.FORM",147:"COPY.CHART",148:"ON.TIME",149:"WAIT",150:"FORMAT.FONT",151:"FILL.UP",152:"FILL.LEFT",153:"DELETE.OVERLAY",155:"SHORT.MENUS",159:"SET.UPDATE.STATUS",161:"COLOR.PALETTE",162:"DELETE.STYLE",163:"WINDOW.RESTORE",164:"WINDOW.MAXIMIZE",166:"CHANGE.LINK",167:"CALCULATE.DOCUMENT",168:"ON.KEY",169:"APP.RESTORE",170:"APP.MOVE",171:"APP.SIZE",172:"APP.MINIMIZE",173:"APP.MAXIMIZE",174:"BRING.TO.FRONT",175:"SEND.TO.BACK",185:"MAIN.CHART.TYPE",186:"OVERLAY.CHART.TYPE",187:"SELECT.END",188:"OPEN.MAIL",189:"SEND.MAIL",190:"STANDARD.FONT",191:"CONSOLIDATE",192:"SORT.SPECIAL",193:"GALLERY.3D.AREA",194:"GALLERY.3D.COLUMN",195:"GALLERY.3D.LINE",196:"GALLERY.3D.PIE",197:"VIEW.3D",198:"GOAL.SEEK",199:"WORKGROUP",200:"FILL.GROUP",201:"UPDATE.LINK",202:"PROMOTE",203:"DEMOTE",204:"SHOW.DETAIL",206:"UNGROUP",207:"OBJECT.PROPERTIES",208:"SAVE.NEW.OBJECT",209:"SHARE",210:"SHARE.NAME",211:"DUPLICATE",212:"APPLY.STYLE",213:"ASSIGN.TO.OBJECT",214:"OBJECT.PROTECTION",215:"HIDE.OBJECT",216:"SET.EXTRACT",217:"CREATE.PUBLISHER",218:"SUBSCRIBE.TO",219:"ATTRIBUTES",220:"SHOW.TOOLBAR",222:"PRINT.PREVIEW",223:"EDIT.COLOR",224:"SHOW.LEVELS",225:"FORMAT.MAIN",226:"FORMAT.OVERLAY",227:"ON.RECALC",228:"EDIT.SERIES",229:"DEFINE.STYLE",240:"LINE.PRINT",243:"ENTER.DATA",249:"GALLERY.RADAR",250:"MERGE.STYLES",251:"EDITION.OPTIONS",252:"PASTE.PICTURE",253:"PASTE.PICTURE.LINK",254:"SPELLING",256:"ZOOM",259:"INSERT.OBJECT",260:"WINDOW.MINIMIZE",265:"SOUND.NOTE",266:"SOUND.PLAY",267:"FORMAT.SHAPE",268:"EXTEND.POLYGON",269:"FORMAT.AUTO",272:"GALLERY.3D.BAR",273:"GALLERY.3D.SURFACE",274:"FILL.AUTO",276:"CUSTOMIZE.TOOLBAR",277:"ADD.TOOL",278:"EDIT.OBJECT",279:"ON.DOUBLECLICK",280:"ON.ENTRY",281:"WORKBOOK.ADD",282:"WORKBOOK.MOVE",283:"WORKBOOK.COPY",284:"WORKBOOK.OPTIONS",285:"SAVE.WORKSPACE",288:"CHART.WIZARD",289:"DELETE.TOOL",290:"MOVE.TOOL",291:"WORKBOOK.SELECT",292:"WORKBOOK.ACTIVATE",293:"ASSIGN.TO.TOOL",295:"COPY.TOOL",296:"RESET.TOOL",297:"CONSTRAIN.NUMERIC",298:"PASTE.TOOL",302:"WORKBOOK.NEW",305:"SCENARIO.CELLS",306:"SCENARIO.DELETE",307:"SCENARIO.ADD",308:"SCENARIO.EDIT",309:"SCENARIO.SHOW",310:"SCENARIO.SHOW.NEXT",311:"SCENARIO.SUMMARY",312:"PIVOT.TABLE.WIZARD",313:"PIVOT.FIELD.PROPERTIES",314:"PIVOT.FIELD",315:"PIVOT.ITEM",316:"PIVOT.ADD.FIELDS",318:"OPTIONS.CALCULATION",319:"OPTIONS.EDIT",320:"OPTIONS.VIEW",321:"ADDIN.MANAGER",322:"MENU.EDITOR",323:"ATTACH.TOOLBARS",324:"VBAActivate",325:"OPTIONS.CHART",328:"VBA.INSERT.FILE",330:"VBA.PROCEDURE.DEFINITION",336:"ROUTING.SLIP",338:"ROUTE.DOCUMENT",339:"MAIL.LOGON",342:"INSERT.PICTURE",343:"EDIT.TOOL",344:"GALLERY.DOUGHNUT",350:"CHART.TREND",352:"PIVOT.ITEM.PROPERTIES",354:"WORKBOOK.INSERT",355:"OPTIONS.TRANSITION",356:"OPTIONS.GENERAL",370:"FILTER.ADVANCED",373:"MAIL.ADD.MAILER",374:"MAIL.DELETE.MAILER",375:"MAIL.REPLY",376:"MAIL.REPLY.ALL",377:"MAIL.FORWARD",378:"MAIL.NEXT.LETTER",379:"DATA.LABEL",380:"INSERT.TITLE",381:"FONT.PROPERTIES",382:"MACRO.OPTIONS",383:"WORKBOOK.HIDE",384:"WORKBOOK.UNHIDE",385:"WORKBOOK.DELETE",386:"WORKBOOK.NAME",388:"GALLERY.CUSTOM",390:"ADD.CHART.AUTOFORMAT",391:"DELETE.CHART.AUTOFORMAT",392:"CHART.ADD.DATA",393:"AUTO.OUTLINE",394:"TAB.ORDER",395:"SHOW.DIALOG",396:"SELECT.ALL",397:"UNGROUP.SHEETS",398:"SUBTOTAL.CREATE",399:"SUBTOTAL.REMOVE",400:"RENAME.OBJECT",412:"WORKBOOK.SCROLL",413:"WORKBOOK.NEXT",414:"WORKBOOK.PREV",415:"WORKBOOK.TAB.SPLIT",416:"FULL.SCREEN",417:"WORKBOOK.PROTECT",420:"SCROLLBAR.PROPERTIES",421:"PIVOT.SHOW.PAGES",422:"TEXT.TO.COLUMNS",423:"FORMAT.CHARTTYPE",424:"LINK.FORMAT",425:"TRACER.DISPLAY",430:"TRACER.NAVIGATE",431:"TRACER.CLEAR",432:"TRACER.ERROR",433:"PIVOT.FIELD.GROUP",434:"PIVOT.FIELD.UNGROUP",435:"CHECKBOX.PROPERTIES",436:"LABEL.PROPERTIES",437:"LISTBOX.PROPERTIES",438:"EDITBOX.PROPERTIES",439:"PIVOT.REFRESH",440:"LINK.COMBO",441:"OPEN.TEXT",442:"HIDE.DIALOG",443:"SET.DIALOG.FOCUS",444:"ENABLE.OBJECT",445:"PUSHBUTTON.PROPERTIES",446:"SET.DIALOG.DEFAULT",447:"FILTER",448:"FILTER.SHOW.ALL",449:"CLEAR.OUTLINE",450:"FUNCTION.WIZARD",451:"ADD.LIST.ITEM",452:"SET.LIST.ITEM",453:"REMOVE.LIST.ITEM",454:"SELECT.LIST.ITEM",455:"SET.CONTROL.VALUE",456:"SAVE.COPY.AS",458:"OPTIONS.LISTS.ADD",459:"OPTIONS.LISTS.DELETE",460:"SERIES.AXES",461:"SERIES.X",462:"SERIES.Y",463:"ERRORBAR.X",464:"ERRORBAR.Y",465:"FORMAT.CHART",466:"SERIES.ORDER",467:"MAIL.LOGOFF",468:"CLEAR.ROUTING.SLIP",469:"APP.ACTIVATE.MICROSOFT",470:"MAIL.EDIT.MAILER",471:"ON.SHEET",472:"STANDARD.WIDTH",473:"SCENARIO.MERGE",474:"SUMMARY.INFO",475:"FIND.FILE",476:"ACTIVE.CELL.FONT",477:"ENABLE.TIPWIZARD",478:"VBA.MAKE.ADDIN",480:"INSERTDATATABLE",481:"WORKGROUP.OPTIONS",482:"MAIL.SEND.MAILER",485:"AUTOCORRECT",489:"POST.DOCUMENT",491:"PICKLIST",493:"VIEW.SHOW",494:"VIEW.DEFINE",495:"VIEW.DELETE",509:"SHEET.BACKGROUND",510:"INSERT.MAP.OBJECT",511:"OPTIONS.MENONO",517:"MSOCHECKS",518:"NORMAL",519:"LAYOUT",520:"RM.PRINT.AREA",521:"CLEAR.PRINT.AREA",522:"ADD.PRINT.AREA",523:"MOVE.BRK",545:"HIDECURR.NOTE",546:"HIDEALL.NOTES",547:"DELETE.NOTE",548:"TRAVERSE.NOTES",549:"ACTIVATE.NOTES",620:"PROTECT.REVISIONS",621:"UNPROTECT.REVISIONS",647:"OPTIONS.ME",653:"WEB.PUBLISH",667:"NEWWEBQUERY",673:"PIVOT.TABLE.CHART",753:"OPTIONS.SAVE",755:"OPTIONS.SPELL",808:"HIDEALL.INKANNOTS"};
25800 var Ftab={0:"COUNT",1:"IF",2:"ISNA",3:"ISERROR",4:"SUM",5:"AVERAGE",6:"MIN",7:"MAX",8:"ROW",9:"COLUMN",10:"NA",11:"NPV",12:"STDEV",13:"DOLLAR",14:"FIXED",15:"SIN",16:"COS",17:"TAN",18:"ATAN",19:"PI",20:"SQRT",21:"EXP",22:"LN",23:"LOG10",24:"ABS",25:"INT",26:"SIGN",27:"ROUND",28:"LOOKUP",29:"INDEX",30:"REPT",31:"MID",32:"LEN",33:"VALUE",34:"TRUE",35:"FALSE",36:"AND",37:"OR",38:"NOT",39:"MOD",40:"DCOUNT",41:"DSUM",42:"DAVERAGE",43:"DMIN",44:"DMAX",45:"DSTDEV",46:"VAR",47:"DVAR",48:"TEXT",49:"LINEST",50:"TREND",51:"LOGEST",52:"GROWTH",53:"GOTO",54:"HALT",55:"RETURN",56:"PV",57:"FV",58:"NPER",59:"PMT",60:"RATE",61:"MIRR",62:"IRR",63:"RAND",64:"MATCH",65:"DATE",66:"TIME",67:"DAY",68:"MONTH",69:"YEAR",70:"WEEKDAY",71:"HOUR",72:"MINUTE",73:"SECOND",74:"NOW",75:"AREAS",76:"ROWS",77:"COLUMNS",78:"OFFSET",79:"ABSREF",80:"RELREF",81:"ARGUMENT",82:"SEARCH",83:"TRANSPOSE",84:"ERROR",85:"STEP",86:"TYPE",87:"ECHO",88:"SET.NAME",89:"CALLER",90:"DEREF",91:"WINDOWS",92:"SERIES",93:"DOCUMENTS",94:"ACTIVE.CELL",95:"SELECTION",96:"RESULT",97:"ATAN2",98:"ASIN",99:"ACOS",100:"CHOOSE",101:"HLOOKUP",102:"VLOOKUP",103:"LINKS",104:"INPUT",105:"ISREF",106:"GET.FORMULA",107:"GET.NAME",108:"SET.VALUE",109:"LOG",110:"EXEC",111:"CHAR",112:"LOWER",113:"UPPER",114:"PROPER",115:"LEFT",116:"RIGHT",117:"EXACT",118:"TRIM",119:"REPLACE",120:"SUBSTITUTE",121:"CODE",122:"NAMES",123:"DIRECTORY",124:"FIND",125:"CELL",126:"ISERR",127:"ISTEXT",128:"ISNUMBER",129:"ISBLANK",130:"T",131:"N",132:"FOPEN",133:"FCLOSE",134:"FSIZE",135:"FREADLN",136:"FREAD",137:"FWRITELN",138:"FWRITE",139:"FPOS",140:"DATEVALUE",141:"TIMEVALUE",142:"SLN",143:"SYD",144:"DDB",145:"GET.DEF",146:"REFTEXT",147:"TEXTREF",148:"INDIRECT",149:"REGISTER",150:"CALL",151:"ADD.BAR",152:"ADD.MENU",153:"ADD.COMMAND",154:"ENABLE.COMMAND",155:"CHECK.COMMAND",156:"RENAME.COMMAND",157:"SHOW.BAR",158:"DELETE.MENU",159:"DELETE.COMMAND",160:"GET.CHART.ITEM",161:"DIALOG.BOX",162:"CLEAN",163:"MDETERM",164:"MINVERSE",165:"MMULT",166:"FILES",167:"IPMT",168:"PPMT",169:"COUNTA",170:"CANCEL.KEY",171:"FOR",172:"WHILE",173:"BREAK",174:"NEXT",175:"INITIATE",176:"REQUEST",177:"POKE",178:"EXECUTE",179:"TERMINATE",180:"RESTART",181:"HELP",182:"GET.BAR",183:"PRODUCT",184:"FACT",185:"GET.CELL",186:"GET.WORKSPACE",187:"GET.WINDOW",188:"GET.DOCUMENT",189:"DPRODUCT",190:"ISNONTEXT",191:"GET.NOTE",192:"NOTE",193:"STDEVP",194:"VARP",195:"DSTDEVP",196:"DVARP",197:"TRUNC",198:"ISLOGICAL",199:"DCOUNTA",200:"DELETE.BAR",201:"UNREGISTER",204:"USDOLLAR",205:"FINDB",206:"SEARCHB",207:"REPLACEB",208:"LEFTB",209:"RIGHTB",210:"MIDB",211:"LENB",212:"ROUNDUP",213:"ROUNDDOWN",214:"ASC",215:"DBCS",216:"RANK",219:"ADDRESS",220:"DAYS360",221:"TODAY",222:"VDB",223:"ELSE",224:"ELSE.IF",225:"END.IF",226:"FOR.CELL",227:"MEDIAN",228:"SUMPRODUCT",229:"SINH",230:"COSH",231:"TANH",232:"ASINH",233:"ACOSH",234:"ATANH",235:"DGET",236:"CREATE.OBJECT",237:"VOLATILE",238:"LAST.ERROR",239:"CUSTOM.UNDO",240:"CUSTOM.REPEAT",241:"FORMULA.CONVERT",242:"GET.LINK.INFO",243:"TEXT.BOX",244:"INFO",245:"GROUP",246:"GET.OBJECT",247:"DB",248:"PAUSE",251:"RESUME",252:"FREQUENCY",253:"ADD.TOOLBAR",254:"DELETE.TOOLBAR",255:"User",256:"RESET.TOOLBAR",257:"EVALUATE",258:"GET.TOOLBAR",259:"GET.TOOL",260:"SPELLING.CHECK",261:"ERROR.TYPE",262:"APP.TITLE",263:"WINDOW.TITLE",264:"SAVE.TOOLBAR",265:"ENABLE.TOOL",266:"PRESS.TOOL",267:"REGISTER.ID",268:"GET.WORKBOOK",269:"AVEDEV",270:"BETADIST",271:"GAMMALN",272:"BETAINV",273:"BINOMDIST",274:"CHIDIST",275:"CHIINV",276:"COMBIN",277:"CONFIDENCE",278:"CRITBINOM",279:"EVEN",280:"EXPONDIST",281:"FDIST",282:"FINV",283:"FISHER",284:"FISHERINV",285:"FLOOR",286:"GAMMADIST",287:"GAMMAINV",288:"CEILING",289:"HYPGEOMDIST",290:"LOGNORMDIST",291:"LOGINV",292:"NEGBINOMDIST",293:"NORMDIST",294:"NORMSDIST",295:"NORMINV",296:"NORMSINV",297:"STANDARDIZE",298:"ODD",299:"PERMUT",300:"POISSON",301:"TDIST",302:"WEIBULL",303:"SUMXMY2",304:"SUMX2MY2",305:"SUMX2PY2",306:"CHITEST",307:"CORREL",308:"COVAR",309:"FORECAST",310:"FTEST",311:"INTERCEPT",312:"PEARSON",313:"RSQ",314:"STEYX",315:"SLOPE",316:"TTEST",317:"PROB",318:"DEVSQ",319:"GEOMEAN",320:"HARMEAN",321:"SUMSQ",322:"KURT",323:"SKEW",324:"ZTEST",325:"LARGE",326:"SMALL",327:"QUARTILE",328:"PERCENTILE",329:"PERCENTRANK",330:"MODE",331:"TRIMMEAN",332:"TINV",334:"MOVIE.COMMAND",335:"GET.MOVIE",336:"CONCATENATE",337:"POWER",338:"PIVOT.ADD.DATA",339:"GET.PIVOT.TABLE",340:"GET.PIVOT.FIELD",341:"GET.PIVOT.ITEM",342:"RADIANS",343:"DEGREES",344:"SUBTOTAL",345:"SUMIF",346:"COUNTIF",347:"COUNTBLANK",348:"SCENARIO.GET",349:"OPTIONS.LISTS.GET",350:"ISPMT",351:"DATEDIF",352:"DATESTRING",353:"NUMBERSTRING",354:"ROMAN",355:"OPEN.DIALOG",356:"SAVE.DIALOG",357:"VIEW.GET",358:"GETPIVOTDATA",359:"HYPERLINK",360:"PHONETIC",361:"AVERAGEA",362:"MAXA",363:"MINA",364:"STDEVPA",365:"VARPA",366:"STDEVA",367:"VARA",368:"BAHTTEXT",369:"THAIDAYOFWEEK",370:"THAIDIGIT",371:"THAIMONTHOFYEAR",372:"THAINUMSOUND",373:"THAINUMSTRING",374:"THAISTRINGLENGTH",375:"ISTHAIDIGIT",376:"ROUNDBAHTDOWN",377:"ROUNDBAHTUP",378:"THAIYEAR",379:"RTD"};var FtabArgc={2:1,3:1,15:1,16:1,17:1,18:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,65:3,66:3,67:1,68:1,69:1,71:1,72:1,73:1,75:1,76:1,77:1,79:2,80:2,83:1,86:1,90:1,97:2,98:1,99:1,105:1,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,189:3,190:1,195:3,196:3,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,65535:0};var XLSXFutureFunctions={"_xlfn.ACOT":"ACOT","_xlfn.ACOTH":"ACOTH","_xlfn.AGGREGATE":"AGGREGATE","_xlfn.ARABIC":"ARABIC","_xlfn.AVERAGEIF":"AVERAGEIF","_xlfn.AVERAGEIFS":"AVERAGEIFS","_xlfn.BASE":"BASE","_xlfn.BETA.DIST":"BETA.DIST","_xlfn.BETA.INV":"BETA.INV","_xlfn.BINOM.DIST":"BINOM.DIST","_xlfn.BINOM.DIST.RANGE":"BINOM.DIST.RANGE","_xlfn.BINOM.INV":"BINOM.INV","_xlfn.BITAND":"BITAND","_xlfn.BITLSHIFT":"BITLSHIFT","_xlfn.BITOR":"BITOR","_xlfn.BITRSHIFT":"BITRSHIFT","_xlfn.BITXOR":"BITXOR","_xlfn.CEILING.MATH":"CEILING.MATH","_xlfn.CEILING.PRECISE":"CEILING.PRECISE","_xlfn.CHISQ.DIST":"CHISQ.DIST","_xlfn.CHISQ.DIST.RT":"CHISQ.DIST.RT","_xlfn.CHISQ.INV":"CHISQ.INV","_xlfn.CHISQ.INV.RT":"CHISQ.INV.RT","_xlfn.CHISQ.TEST":"CHISQ.TEST","_xlfn.COMBINA":"COMBINA","_xlfn.CONFIDENCE.NORM":"CONFIDENCE.NORM","_xlfn.CONFIDENCE.T":"CONFIDENCE.T","_xlfn.COT":"COT","_xlfn.COTH":"COTH","_xlfn.COUNTIFS":"COUNTIFS","_xlfn.COVARIANCE.P":"COVARIANCE.P","_xlfn.COVARIANCE.S":"COVARIANCE.S","_xlfn.CSC":"CSC","_xlfn.CSCH":"CSCH","_xlfn.DAYS":"DAYS","_xlfn.DECIMAL":"DECIMAL","_xlfn.ECMA.CEILING":"ECMA.CEILING","_xlfn.ERF.PRECISE":"ERF.PRECISE","_xlfn.ERFC.PRECISE":"ERFC.PRECISE","_xlfn.EXPON.DIST":"EXPON.DIST","_xlfn.F.DIST":"F.DIST","_xlfn.F.DIST.RT":"F.DIST.RT","_xlfn.F.INV":"F.INV","_xlfn.F.INV.RT":"F.INV.RT","_xlfn.F.TEST":"F.TEST","_xlfn.FILTERXML":"FILTERXML","_xlfn.FLOOR.MATH":"FLOOR.MATH","_xlfn.FLOOR.PRECISE":"FLOOR.PRECISE","_xlfn.FORMULATEXT":"FORMULATEXT","_xlfn.GAMMA":"GAMMA","_xlfn.GAMMA.DIST":"GAMMA.DIST","_xlfn.GAMMA.INV":"GAMMA.INV","_xlfn.GAMMALN.PRECISE":"GAMMALN.PRECISE","_xlfn.GAUSS":"GAUSS","_xlfn.HYPGEOM.DIST":"HYPGEOM.DIST","_xlfn.IFNA":"IFNA","_xlfn.IFERROR":"IFERROR","_xlfn.IMCOSH":"IMCOSH","_xlfn.IMCOT":"IMCOT","_xlfn.IMCSC":"IMCSC","_xlfn.IMCSCH":"IMCSCH","_xlfn.IMSEC":"IMSEC","_xlfn.IMSECH":"IMSECH","_xlfn.IMSINH":"IMSINH","_xlfn.IMTAN":"IMTAN","_xlfn.ISFORMULA":"ISFORMULA","_xlfn.ISO.CEILING":"ISO.CEILING","_xlfn.ISOWEEKNUM":"ISOWEEKNUM","_xlfn.LOGNORM.DIST":"LOGNORM.DIST","_xlfn.LOGNORM.INV":"LOGNORM.INV","_xlfn.MODE.MULT":"MODE.MULT","_xlfn.MODE.SNGL":"MODE.SNGL","_xlfn.MUNIT":"MUNIT","_xlfn.NEGBINOM.DIST":"NEGBINOM.DIST","_xlfn.NETWORKDAYS.INTL":"NETWORKDAYS.INTL","_xlfn.NIGBINOM":"NIGBINOM","_xlfn.NORM.DIST":"NORM.DIST","_xlfn.NORM.INV":"NORM.INV","_xlfn.NORM.S.DIST":"NORM.S.DIST","_xlfn.NORM.S.INV":"NORM.S.INV","_xlfn.NUMBERVALUE":"NUMBERVALUE","_xlfn.PDURATION":"PDURATION","_xlfn.PERCENTILE.EXC":"PERCENTILE.EXC","_xlfn.PERCENTILE.INC":"PERCENTILE.INC","_xlfn.PERCENTRANK.EXC":"PERCENTRANK.EXC","_xlfn.PERCENTRANK.INC":"PERCENTRANK.INC","_xlfn.PERMUTATIONA":"PERMUTATIONA","_xlfn.PHI":"PHI","_xlfn.POISSON.DIST":"POISSON.DIST","_xlfn.QUARTILE.EXC":"QUARTILE.EXC","_xlfn.QUARTILE.INC":"QUARTILE.INC","_xlfn.QUERYSTRING":"QUERYSTRING","_xlfn.RANK.AVG":"RANK.AVG","_xlfn.RANK.EQ":"RANK.EQ","_xlfn.RRI":"RRI","_xlfn.SEC":"SEC","_xlfn.SECH":"SECH","_xlfn.SHEET":"SHEET","_xlfn.SHEETS":"SHEETS","_xlfn.SKEW.P":"SKEW.P","_xlfn.STDEV.P":"STDEV.P","_xlfn.STDEV.S":"STDEV.S","_xlfn.SUMIFS":"SUMIFS","_xlfn.T.DIST":"T.DIST","_xlfn.T.DIST.2T":"T.DIST.2T","_xlfn.T.DIST.RT":"T.DIST.RT","_xlfn.T.INV":"T.INV","_xlfn.T.INV.2T":"T.INV.2T","_xlfn.T.TEST":"T.TEST","_xlfn.UNICHAR":"UNICHAR","_xlfn.UNICODE":"UNICODE","_xlfn.VAR.P":"VAR.P","_xlfn.VAR.S":"VAR.S","_xlfn.WEBSERVICE":"WEBSERVICE","_xlfn.WEIBULL.DIST":"WEIBULL.DIST","_xlfn.WORKDAY.INTL":"WORKDAY.INTL","_xlfn.XOR":"XOR","_xlfn.Z.TEST":"Z.TEST"};var RecordEnum={6:{n:"Formula",f:parse_Formula},10:{n:"EOF",f:parse_EOF},12:{n:"CalcCount",f:parse_CalcCount},13:{n:"CalcMode",f:parse_CalcMode},14:{n:"CalcPrecision",f:parse_CalcPrecision},15:{n:"CalcRefMode",f:parse_CalcRefMode},16:{n:"CalcDelta",f:parse_CalcDelta},17:{n:"CalcIter",f:parse_CalcIter},18:{n:"Protect",f:parse_Protect},19:{n:"Password",f:parse_Password},20:{n:"Header",f:parse_Header},21:{n:"Footer",f:parse_Footer},23:{n:"ExternSheet",f:parse_ExternSheet},24:{n:"Lbl",f:parse_Lbl},25:{n:"WinProtect",f:parse_WinProtect},26:{n:"VerticalPageBreaks",f:parse_VerticalPageBreaks},27:{n:"HorizontalPageBreaks",f:parse_HorizontalPageBreaks},28:{n:"Note",f:parse_Note},29:{n:"Selection",f:parse_Selection},34:{n:"Date1904",f:parse_Date1904},35:{n:"ExternName",f:parse_ExternName},38:{n:"LeftMargin",f:parse_LeftMargin},39:{n:"RightMargin",f:parse_RightMargin},40:{n:"TopMargin",f:parse_TopMargin},41:{n:"BottomMargin",f:parse_BottomMargin},42:{n:"PrintRowCol",f:parse_PrintRowCol},43:{n:"PrintGrid",f:parse_PrintGrid},47:{n:"FilePass",f:parse_FilePass},49:{n:"Font",f:parse_Font},51:{n:"PrintSize",f:parse_PrintSize},60:{n:"Continue",f:parse_Continue},61:{n:"Window1",f:parse_Window1},64:{n:"Backup",f:parse_Backup},65:{n:"Pane",f:parse_Pane},66:{n:"CodePage",f:parse_CodePage},77:{n:"Pls",f:parse_Pls},80:{n:"DCon",f:parse_DCon},81:{n:"DConRef",f:parse_DConRef},82:{n:"DConName",f:parse_DConName},85:{n:"DefColWidth",f:parse_DefColWidth},89:{n:"XCT",f:parse_XCT},90:{n:"CRN",f:parse_CRN},91:{n:"FileSharing",f:parse_FileSharing},92:{n:"WriteAccess",f:parse_WriteAccess},93:{n:"Obj",f:parse_Obj},94:{n:"Uncalced",f:parse_Uncalced},95:{n:"CalcSaveRecalc",f:parse_CalcSaveRecalc},96:{n:"Template",f:parse_Template},97:{n:"Intl",f:parse_Intl},99:{n:"ObjProtect",f:parse_ObjProtect},125:{n:"ColInfo",f:parse_ColInfo},128:{n:"Guts",f:parse_Guts},129:{n:"WsBool",f:parse_WsBool},130:{n:"GridSet",f:parse_GridSet},131:{n:"HCenter",f:parse_HCenter},132:{n:"VCenter",f:parse_VCenter},133:{n:"BoundSheet8",f:parse_BoundSheet8},134:{n:"WriteProtect",f:parse_WriteProtect},140:{n:"Country",f:parse_Country},141:{n:"HideObj",f:parse_HideObj},144:{n:"Sort",f:parse_Sort},146:{n:"Palette",f:parse_Palette},151:{n:"Sync",f:parse_Sync},152:{n:"LPr",f:parse_LPr},153:{n:"DxGCol",f:parse_DxGCol},154:{n:"FnGroupName",f:parse_FnGroupName},155:{n:"FilterMode",f:parse_FilterMode},156:{n:"BuiltInFnGroupCount",f:parse_BuiltInFnGroupCount},157:{n:"AutoFilterInfo",f:parse_AutoFilterInfo},158:{n:"AutoFilter",f:parse_AutoFilter},160:{n:"Scl",f:parse_Scl},161:{n:"Setup",f:parse_Setup},174:{n:"ScenMan",f:parse_ScenMan},175:{n:"SCENARIO",f:parse_SCENARIO},176:{n:"SxView",f:parse_SxView},177:{n:"Sxvd",f:parse_Sxvd},178:{n:"SXVI",f:parse_SXVI},180:{n:"SxIvd",f:parse_SxIvd},181:{n:"SXLI",f:parse_SXLI},182:{n:"SXPI",f:parse_SXPI},184:{n:"DocRoute",f:parse_DocRoute},185:{n:"RecipName",f:parse_RecipName},189:{n:"MulRk",f:parse_MulRk},190:{n:"MulBlank",f:parse_MulBlank},193:{n:"Mms",f:parse_Mms},197:{n:"SXDI",f:parse_SXDI},198:{n:"SXDB",f:parse_SXDB},199:{n:"SXFDB",f:parse_SXFDB},200:{n:"SXDBB",f:parse_SXDBB},201:{n:"SXNum",f:parse_SXNum},202:{n:"SxBool",f:parse_SxBool},203:{n:"SxErr",f:parse_SxErr},204:{n:"SXInt",f:parse_SXInt},205:{n:"SXString",f:parse_SXString},206:{n:"SXDtr",f:parse_SXDtr},207:{n:"SxNil",f:parse_SxNil},208:{n:"SXTbl",f:parse_SXTbl},209:{n:"SXTBRGIITM",f:parse_SXTBRGIITM},210:{n:"SxTbpg",f:parse_SxTbpg},211:{n:"ObProj",f:parse_ObProj},213:{n:"SXStreamID",f:parse_SXStreamID},215:{n:"DBCell",f:parse_DBCell},216:{n:"SXRng",f:parse_SXRng},217:{n:"SxIsxoper",f:parse_SxIsxoper},218:{n:"BookBool",f:parse_BookBool},220:{n:"DbOrParamQry",f:parse_DbOrParamQry},221:{n:"ScenarioProtect",f:parse_ScenarioProtect},222:{n:"OleObjectSize",f:parse_OleObjectSize},224:{n:"XF",f:parse_XF},225:{n:"InterfaceHdr",f:parse_InterfaceHdr},226:{n:"InterfaceEnd",f:parse_InterfaceEnd},227:{n:"SXVS",f:parse_SXVS},229:{n:"MergeCells",f:parse_MergeCells},233:{n:"BkHim",f:parse_BkHim},235:{n:"MsoDrawingGroup",f:parse_MsoDrawingGroup},236:{n:"MsoDrawing",f:parse_MsoDrawing},237:{n:"MsoDrawingSelection",f:parse_MsoDrawingSelection},239:{n:"PhoneticInfo",f:parse_PhoneticInfo},240:{n:"SxRule",f:parse_SxRule},241:{n:"SXEx",f:parse_SXEx},242:{n:"SxFilt",f:parse_SxFilt},244:{n:"SxDXF",f:parse_SxDXF},245:{n:"SxItm",f:parse_SxItm},246:{n:"SxName",f:parse_SxName},247:{n:"SxSelect",f:parse_SxSelect},248:{n:"SXPair",f:parse_SXPair},249:{n:"SxFmla",f:parse_SxFmla},251:{n:"SxFormat",f:parse_SxFormat},252:{n:"SST",f:parse_SST},253:{n:"LabelSst",f:parse_LabelSst},255:{n:"ExtSST",f:parse_ExtSST},256:{n:"SXVDEx",f:parse_SXVDEx},259:{n:"SXFormula",f:parse_SXFormula},290:{n:"SXDBEx",f:parse_SXDBEx},311:{n:"RRDInsDel",f:parse_RRDInsDel},312:{n:"RRDHead",f:parse_RRDHead},315:{n:"RRDChgCell",f:parse_RRDChgCell},317:{n:"RRTabId",f:parse_RRTabId},318:{n:"RRDRenSheet",f:parse_RRDRenSheet},319:{n:"RRSort",f:parse_RRSort},320:{n:"RRDMove",f:parse_RRDMove},330:{n:"RRFormat",f:parse_RRFormat},331:{n:"RRAutoFmt",f:parse_RRAutoFmt},333:{n:"RRInsertSh",f:parse_RRInsertSh},334:{n:"RRDMoveBegin",f:parse_RRDMoveBegin},335:{n:"RRDMoveEnd",f:parse_RRDMoveEnd},336:{n:"RRDInsDelBegin",f:parse_RRDInsDelBegin},337:{n:"RRDInsDelEnd",f:parse_RRDInsDelEnd},338:{n:"RRDConflict",f:parse_RRDConflict},339:{n:"RRDDefName",f:parse_RRDDefName},340:{n:"RRDRstEtxp",f:parse_RRDRstEtxp},351:{n:"LRng",f:parse_LRng},352:{n:"UsesELFs",f:parse_UsesELFs},353:{n:"DSF",f:parse_DSF},401:{n:"CUsr",f:parse_CUsr},402:{n:"CbUsr",f:parse_CbUsr},403:{n:"UsrInfo",f:parse_UsrInfo},404:{n:"UsrExcl",f:parse_UsrExcl},405:{n:"FileLock",f:parse_FileLock},406:{n:"RRDInfo",f:parse_RRDInfo},407:{n:"BCUsrs",f:parse_BCUsrs},408:{n:"UsrChk",f:parse_UsrChk},425:{n:"UserBView",f:parse_UserBView},426:{n:"UserSViewBegin",f:parse_UserSViewBegin},427:{n:"UserSViewEnd",f:parse_UserSViewEnd},428:{n:"RRDUserView",f:parse_RRDUserView},429:{n:"Qsi",f:parse_Qsi},430:{n:"SupBook",f:parse_SupBook},431:{n:"Prot4Rev",f:parse_Prot4Rev},432:{n:"CondFmt",f:parse_CondFmt},433:{n:"CF",f:parse_CF},434:{n:"DVal",f:parse_DVal},437:{n:"DConBin",f:parse_DConBin},438:{n:"TxO",f:parse_TxO},439:{n:"RefreshAll",f:parse_RefreshAll},440:{n:"HLink",f:parse_HLink},441:{n:"Lel",f:parse_Lel},442:{n:"CodeName",f:parse_CodeName},443:{n:"SXFDBType",f:parse_SXFDBType},444:{n:"Prot4RevPass",f:parse_Prot4RevPass},445:{n:"ObNoMacros",f:parse_ObNoMacros},446:{n:"Dv",f:parse_Dv},448:{n:"Excel9File",f:parse_Excel9File},449:{n:"RecalcId",f:parse_RecalcId,r:2},450:{n:"EntExU2",f:parse_EntExU2},512:{n:"Dimensions",f:parse_Dimensions},513:{n:"Blank",f:parse_Blank},515:{n:"Number",f:parse_Number},516:{n:"Label",f:parse_Label},517:{n:"BoolErr",f:parse_BoolErr},519:{n:"String",f:parse_String},520:{n:"Row",f:parse_Row},523:{n:"Index",f:parse_Index},545:{n:"Array",f:parse_Array},549:{n:"DefaultRowHeight",f:parse_DefaultRowHeight},566:{n:"Table",f:parse_Table},574:{n:"Window2",f:parse_Window2},638:{n:"RK",f:parse_RK},659:{n:"Style",f:parse_Style},1048:{n:"BigName",f:parse_BigName},1054:{n:"Format",f:parse_Format},1084:{n:"ContinueBigName",f:parse_ContinueBigName},1212:{n:"ShrFmla",f:parse_ShrFmla},2048:{n:"HLinkTooltip",f:parse_HLinkTooltip},2049:{n:"WebPub",f:parse_WebPub},2050:{n:"QsiSXTag",f:parse_QsiSXTag},2051:{n:"DBQueryExt",f:parse_DBQueryExt},2052:{n:"ExtString",f:parse_ExtString},2053:{n:"TxtQry",f:parse_TxtQry},2054:{n:"Qsir",f:parse_Qsir},2055:{n:"Qsif",f:parse_Qsif},2056:{n:"RRDTQSIF",f:parse_RRDTQSIF},2057:{n:"BOF",f:parse_BOF},2058:{n:"OleDbConn",f:parse_OleDbConn},2059:{n:"WOpt",f:parse_WOpt},2060:{n:"SXViewEx",f:parse_SXViewEx},2061:{n:"SXTH",f:parse_SXTH},2062:{n:"SXPIEx",f:parse_SXPIEx},2063:{n:"SXVDTEx",f:parse_SXVDTEx},2064:{n:"SXViewEx9",f:parse_SXViewEx9},2066:{n:"ContinueFrt",f:parse_ContinueFrt},2067:{n:"RealTimeData",f:parse_RealTimeData},2128:{n:"ChartFrtInfo",f:parse_ChartFrtInfo},2129:{n:"FrtWrapper",f:parse_FrtWrapper},2130:{n:"StartBlock",f:parse_StartBlock},2131:{n:"EndBlock",f:parse_EndBlock},2132:{n:"StartObject",f:parse_StartObject},2133:{n:"EndObject",f:parse_EndObject},2134:{n:"CatLab",f:parse_CatLab},2135:{n:"YMult",f:parse_YMult},2136:{n:"SXViewLink",f:parse_SXViewLink},2137:{n:"PivotChartBits",f:parse_PivotChartBits},2138:{n:"FrtFontList",f:parse_FrtFontList},2146:{n:"SheetExt",f:parse_SheetExt},2147:{n:"BookExt",f:parse_BookExt,r:12},2148:{n:"SXAddl",f:parse_SXAddl},2149:{n:"CrErr",f:parse_CrErr},2150:{n:"HFPicture",f:parse_HFPicture},2151:{n:"FeatHdr",f:parse_FeatHdr},2152:{n:"Feat",f:parse_Feat},2154:{n:"DataLabExt",f:parse_DataLabExt},2155:{n:"DataLabExtContents",f:parse_DataLabExtContents},2156:{n:"CellWatch",f:parse_CellWatch},2161:{n:"FeatHdr11",f:parse_FeatHdr11},2162:{n:"Feature11",f:parse_Feature11},2164:{n:"DropDownObjIds",f:parse_DropDownObjIds},2165:{n:"ContinueFrt11",f:parse_ContinueFrt11},2166:{n:"DConn",f:parse_DConn},2167:{n:"List12",f:parse_List12},2168:{n:"Feature12",f:parse_Feature12},2169:{n:"CondFmt12",f:parse_CondFmt12},2170:{n:"CF12",f:parse_CF12},2171:{n:"CFEx",f:parse_CFEx},2172:{n:"XFCRC",f:parse_XFCRC},2173:{n:"XFExt",f:parse_XFExt},2174:{n:"AutoFilter12",f:parse_AutoFilter12},2175:{n:"ContinueFrt12",f:parse_ContinueFrt12},2180:{n:"MDTInfo",f:parse_MDTInfo},2181:{n:"MDXStr",f:parse_MDXStr},2182:{n:"MDXTuple",f:parse_MDXTuple},2183:{n:"MDXSet",f:parse_MDXSet},2184:{n:"MDXProp",f:parse_MDXProp},2185:{n:"MDXKPI",f:parse_MDXKPI},2186:{n:"MDB",f:parse_MDB},2187:{n:"PLV",f:parse_PLV},2188:{n:"Compat12",f:parse_Compat12,r:12},2189:{n:"DXF",f:parse_DXF},2190:{n:"TableStyles",f:parse_TableStyles,r:12},2191:{n:"TableStyle",f:parse_TableStyle},2192:{n:"TableStyleElement",f:parse_TableStyleElement},2194:{n:"StyleExt",f:parse_StyleExt},2195:{n:"NamePublish",f:parse_NamePublish},2196:{n:"NameCmt",f:parse_NameCmt},2197:{n:"SortData",f:parse_SortData},2198:{n:"Theme",f:parse_Theme},2199:{n:"GUIDTypeLib",f:parse_GUIDTypeLib},2200:{n:"FnGrp12",f:parse_FnGrp12},2201:{n:"NameFnGrp12",f:parse_NameFnGrp12},2202:{n:"MTRSettings",f:parse_MTRSettings,r:12},2203:{n:"CompressPictures",f:parse_CompressPictures},2204:{n:"HeaderFooter",f:parse_HeaderFooter},2205:{n:"CrtLayout12",f:parse_CrtLayout12},2206:{n:"CrtMlFrt",f:parse_CrtMlFrt},2207:{n:"CrtMlFrtContinue",f:parse_CrtMlFrtContinue},2211:{n:"ForceFullCalculation",f:parse_ForceFullCalculation},2212:{n:"ShapePropsStream",f:parse_ShapePropsStream},2213:{n:"TextPropsStream",f:parse_TextPropsStream},2214:{n:"RichTextStream",f:parse_RichTextStream},2215:{n:"CrtLayout12A",f:parse_CrtLayout12A},4097:{n:"Units",f:parse_Units},4098:{n:"Chart",f:parse_Chart},4099:{n:"Series",f:parse_Series},4102:{n:"DataFormat",f:parse_DataFormat},4103:{n:"LineFormat",f:parse_LineFormat},4105:{n:"MarkerFormat",f:parse_MarkerFormat},4106:{n:"AreaFormat",f:parse_AreaFormat},4107:{n:"PieFormat",f:parse_PieFormat},4108:{n:"AttachedLabel",f:parse_AttachedLabel},4109:{n:"SeriesText",f:parse_SeriesText},4116:{n:"ChartFormat",f:parse_ChartFormat},4117:{n:"Legend",f:parse_Legend},4118:{n:"SeriesList",f:parse_SeriesList},4119:{n:"Bar",f:parse_Bar},4120:{n:"Line",f:parse_Line},4121:{n:"Pie",f:parse_Pie},4122:{n:"Area",f:parse_Area},4123:{n:"Scatter",f:parse_Scatter},4124:{n:"CrtLine",f:parse_CrtLine},4125:{n:"Axis",f:parse_Axis},4126:{n:"Tick",f:parse_Tick},4127:{n:"ValueRange",f:parse_ValueRange},4128:{n:"CatSerRange",f:parse_CatSerRange},4129:{n:"AxisLine",f:parse_AxisLine},4130:{n:"CrtLink",f:parse_CrtLink},4132:{n:"DefaultText",f:parse_DefaultText},4133:{n:"Text",f:parse_Text},4134:{n:"FontX",f:parse_FontX},4135:{n:"ObjectLink",f:parse_ObjectLink},4146:{n:"Frame",f:parse_Frame},4147:{n:"Begin",f:parse_Begin},4148:{n:"End",f:parse_End},4149:{n:"PlotArea",f:parse_PlotArea},4154:{n:"Chart3d",f:parse_Chart3d},4156:{n:"PicF",f:parse_PicF},4157:{n:"DropBar",f:parse_DropBar},4158:{n:"Radar",f:parse_Radar},4159:{n:"Surf",f:parse_Surf},4160:{n:"RadarArea",f:parse_RadarArea},4161:{n:"AxisParent",f:parse_AxisParent},4163:{n:"LegendException",f:parse_LegendException},4164:{n:"ShtProps",f:parse_ShtProps},4165:{n:"SerToCrt",f:parse_SerToCrt},4166:{n:"AxesUsed",f:parse_AxesUsed},4168:{n:"SBaseRef",f:parse_SBaseRef},4170:{n:"SerParent",f:parse_SerParent},4171:{n:"SerAuxTrend",f:parse_SerAuxTrend},4174:{n:"IFmtRecord",f:parse_IFmtRecord},4175:{n:"Pos",f:parse_Pos},4176:{n:"AlRuns",f:parse_AlRuns},4177:{n:"BRAI",f:parse_BRAI},4187:{n:"SerAuxErrBar",f:parse_SerAuxErrBar},4188:{n:"ClrtClient",f:parse_ClrtClient},4189:{n:"SerFmt",f:parse_SerFmt},4191:{n:"Chart3DBarShape",f:parse_Chart3DBarShape},4192:{n:"Fbi",f:parse_Fbi},4193:{n:"BopPop",f:parse_BopPop},4194:{n:"AxcExt",f:parse_AxcExt},4195:{n:"Dat",f:parse_Dat},4196:{n:"PlotGrowth",f:parse_PlotGrowth},4197:{n:"SIIndex",f:parse_SIIndex},4198:{n:"GelFrame",f:parse_GelFrame},4199:{n:"BopPopCustom",f:parse_BopPopCustom},4200:{n:"Fbi2",f:parse_Fbi2},22:{n:"ExternCount",f:parsenoop},126:{n:"RK",f:parsenoop},127:{n:"ImData",f:parsenoop},135:{n:"Addin",f:parsenoop},136:{n:"Edg",f:parsenoop},137:{n:"Pub",f:parsenoop},145:{n:"Sub",f:parsenoop},148:{n:"LHRecord",f:parsenoop},149:{n:"LHNGraph",f:parsenoop},150:{n:"Sound",f:parsenoop},169:{n:"CoordList",f:parsenoop},171:{n:"GCW",f:parsenoop},188:{n:"ShrFmla",f:parsenoop},194:{n:"AddMenu",f:parsenoop},195:{n:"DelMenu",f:parsenoop},214:{n:"RString",f:parsenoop},223:{n:"UDDesc",f:parsenoop},234:{n:"TabIdConf",f:parsenoop},354:{n:"XL5Modify",f:parsenoop},421:{n:"FileSharing2",f:parsenoop},536:{n:"Name",f:parsenoop},547:{n:"ExternName",f:parse_ExternName},561:{n:"Font",f:parsenoop},1030:{n:"Formula",f:parse_Formula},2157:{n:"FeatInfo",f:parsenoop},2163:{n:"FeatInfo11",f:parsenoop},2177:{n:"SXAddl12",f:parsenoop},2240:{n:"AutoWebPub",f:parsenoop},2241:{n:"ListObj",f:parsenoop},2242:{n:"ListField",f:parsenoop},2243:{n:"ListDV",f:parsenoop},2244:{n:"ListCondFmt",f:parsenoop},2245:{n:"ListCF",f:parsenoop},2246:{n:"FMQry",f:parsenoop},2247:{n:"FMSQry",f:parsenoop},2248:{n:"PLV",f:parsenoop},2249:{n:"LnExt",f:parsenoop},2250:{n:"MkrExt",f:parsenoop},2251:{n:"CrtCoopt",f:parsenoop},0:{}};var CountryEnum={1:"US",2:"CA",3:"",7:"RU",20:"EG",30:"GR",31:"NL",32:"BE",33:"FR",34:"ES",36:"HU",39:"IT",41:"CH",43:"AT",44:"GB",45:"DK",46:"SE",47:"NO",48:"PL",49:"DE",52:"MX",55:"BR",61:"AU",64:"NZ",66:"TH",81:"JP",82:"KR",84:"VN",86:"CN",90:"TR",105:"JS",213:"DZ",216:"MA",218:"LY",351:"PT",354:"IS",358:"FI",420:"CZ",886:"TW",961:"LB",962:"JO",963:"SY",964:"IQ",965:"KW",966:"SA",971:"AE",972:"IL",974:"QA",981:"IR",65535:"US"};function fix_opts_func(defaults){return function fix_opts(opts){for(var i=0;i!=defaults.length;++i){var d=defaults[i];if(typeof opts[d[0]]==="undefined")opts[d[0]]=d[1];if(d[2]==="n")opts[d[0]]=Number(opts[d[0]])}}}var fixopts=fix_opts_func([["cellNF",false],["cellFormula",true],["sheetRows",0,"n"],["bookSheets",false],["bookProps",false],["bookFiles",false],["password",""],["WTF",false]]);function parse_compobj(obj){var v={};var o=obj.content;var l=28,m;m=__lpstr(o,l);l+=4+__readUInt32LE(o,l);v.UserType=m;m=__readUInt32LE(o,l);l+=4;switch(m){case 0:break;case 4294967295:case 4294967294:l+=4;break;default:if(m>400)throw new Error("Unsupported Clipboard: "+m.toString(16));l+=m}m=__lpstr(o,l);l+=m.length===0?0:5+m.length;v.Reserved1=m;if((m=__readUInt32LE(o,l))!==1907550708)return v;throw"Unsupported Unicode Extension"}function parse_xlscfb(cfb,options){if(!options)options={};fixopts(options);reset_cp();var CompObj=cfb.find("!CompObj");var Summary=cfb.find("!SummaryInformation");var Workbook=cfb.find("/Workbook");if(!Workbook)Workbook=cfb.find("/Book");var CompObjP,SummaryP,WorkbookP;function slurp(R,blob,length,opts){var l=length;var bufs=[];var d=blob.slice(blob.l,blob.l+l);if(opts.enc&&opts.enc.insitu_decrypt)switch(R.n){case"BOF":case"FilePass":case"FileLock":case"InterfaceHdr":case"RRDInfo":case"RRDHead":case"UsrExcl":break;default:if(d.length===0)break;opts.enc.insitu_decrypt(d)}bufs.push(d);blob.l+=l;var next=RecordEnum[__readUInt16LE(blob,blob.l)];while(next!=null&&next.n==="Continue"){l=__readUInt16LE(blob,blob.l+2);bufs.push(blob.slice(blob.l+4,blob.l+4+l));blob.l+=4+l;next=RecordEnum[__readUInt16LE(blob,blob.l)]}var b=bconcat(bufs);prep_blob(b,0);var ll=0;b.lens=[];for(var j=0;j<bufs.length;++j){b.lens.push(ll);ll+=bufs[j].length}return R.f(b,b.length,opts)}function safe_format_xf(p,opts){if(!p.XF)return;try{var fmtid=p.XF.ifmt||0;if(fmtid===0){if(p.t==="n"){if((p.v|0)===p.v)p.w=SSF._general_int(p.v);else p.w=SSF._general_num(p.v)}else p.w=SSF._general(p.v)}else p.w=SSF.format(fmtid,p.v);if(opts.cellNF)p.z=SSF._table[fmtid]}catch(e){if(opts.WTF)throw e}}function make_cell(val,ixfe,t){return{v:val,ixfe:ixfe,t:t}}function parse_workbook(blob,options){var wb={opts:{}};var Sheets={};var out={};var Directory={};var found_sheet=false;var range={};var last_formula=null;var sst=[];var cur_sheet="";var Preamble={};var lastcell,last_cell,cc,cmnt,rng,rngC,rngR;var shared_formulae={};var array_formulae=[];var temp_val;var country;var cell_valid=true;var XFs=[];var addline=function addline(cell,line,options){if(!cell_valid)return;lastcell=cell;last_cell=encode_cell(cell);if(range.s){if(cell.r<range.s.r)range.s.r=cell.r;if(cell.c<range.s.c)range.s.c=cell.c}if(range.e){if(cell.r+1>range.e.r)range.e.r=cell.r+1;if(cell.c+1>range.e.c)range.e.c=cell.c+1}if(options.sheetRows&&lastcell.r>=options.sheetRows)cell_valid=false;else out[last_cell]=line};var opts={enc:false,sbcch:0,snames:[],sharedf:shared_formulae,arrayf:array_formulae,rrtabid:[],lastuser:"",biff:8,codepage:0,winlocked:0,wtf:false};if(options.password)opts.password=options.password;var mergecells=[];var objects=[];var supbooks=[[]];var sbc=0,sbci=0,sbcli=0;supbooks.SheetNames=opts.snames;supbooks.sharedf=opts.sharedf;supbooks.arrayf=opts.arrayf;var last_Rn="";var file_depth=0;while(blob.l<blob.length-1){var s=blob.l;var RecordType=blob.read_shift(2);if(RecordType===0&&last_Rn==="EOF")break;var length=blob.l===blob.length?0:blob.read_shift(2),y;var R=RecordEnum[RecordType];if(R&&R.f){if(options.bookSheets){if(last_Rn==="BoundSheet8"&&R.n!=="BoundSheet8")break}last_Rn=R.n;if(R.r===2||R.r==12){var rt=blob.read_shift(2);length-=2;if(!opts.enc&&rt!==RecordType)throw"rt mismatch";if(R.r==12){blob.l+=10;length-=10}}var val;if(R.n==="EOF")val=R.f(blob,length,opts);else val=slurp(R,blob,length,opts);var Rn=R.n;if(opts.biff===5)switch(Rn){case"Lbl":Rn="Label";break}switch(Rn){case"Date1904":wb.opts.Date1904=val;break;case"WriteProtect":wb.opts.WriteProtect=true;break;case"FilePass":if(!opts.enc)blob.l=0;opts.enc=val;if(opts.WTF)console.error(val);if(!options.password)throw new Error("File is password-protected");if(val.Type!==0)throw new Error("Encryption scheme unsupported");if(!val.valid)throw new Error("Password is incorrect");break;case"WriteAccess":opts.lastuser=val;break;case"FileSharing":break;case"CodePage":if(val===21010)val=1200;opts.codepage=val;set_cp(val);break;case"RRTabId":opts.rrtabid=val;break;case"WinProtect":opts.winlocked=val;break;case"Template":break;case"RefreshAll":wb.opts.RefreshAll=val;break;case"BookBool":break;case"UsesELFs":break;case"MTRSettings":{if(val[0]&&val[1])throw"Unsupported threads: "+val}break;case"CalcCount":wb.opts.CalcCount=val;break;case"CalcDelta":wb.opts.CalcDelta=val;break;case"CalcIter":wb.opts.CalcIter=val;break;case"CalcMode":wb.opts.CalcMode=val;break;case"CalcPrecision":wb.opts.CalcPrecision=val;break;case"CalcSaveRecalc":wb.opts.CalcSaveRecalc=val;break;case"CalcRefMode":opts.CalcRefMode=val;break;case"Uncalced":break;case"ForceFullCalculation":wb.opts.FullCalc=val;break;case"WsBool":break;case"XF":XFs.push(val);break;case"ExtSST":break;case"BookExt":break;case"RichTextStream":break;case"BkHim":break;case"SupBook":supbooks[++sbc]=[val];sbci=0;break;case"ExternName":supbooks[sbc][++sbci]=val;break;case"Index":break;case"Lbl":supbooks[0][++sbcli]=val;break;case"ExternSheet":supbooks[sbc]=supbooks[sbc].concat(val);sbci+=val.length;break;case"Protect":out["!protect"]=val;break;case"Password":if(val!==0&&opts.WTF)console.error("Password verifier: "+val);break;case"Prot4Rev":case"Prot4RevPass":break;case"BoundSheet8":{Directory[val.pos]=val;opts.snames.push(val.name)}break;case"EOF":{if(--file_depth)break;if(range.e){out["!range"]=range;if(range.e.r>0&&range.e.c>0){range.e.r--;range.e.c--;out["!ref"]=encode_range(range);range.e.r++;range.e.c++}if(mergecells.length>0)out["!merges"]=mergecells;if(objects.length>0)out["!objects"]=objects}if(cur_sheet==="")Preamble=out;else Sheets[cur_sheet]=out;out={}}break;case"BOF":{if(val.BIFFVer===1280)opts.biff=5;if(file_depth++)break;cell_valid=true;out={};cur_sheet=(Directory[s]||{name:""}).name;mergecells=[];objects=[]}break;case"Number":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"BoolErr":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:val.t};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"RK":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.rknum,t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"MulRk":{for(var j=val.c;j<=val.C;++j){var ixfe=val.rkrec[j-val.c][0];temp_val={ixfe:ixfe,XF:XFs[ixfe],v:val.rkrec[j-val.c][1],t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:j,r:val.r},temp_val,options)}}break;case"Formula":{switch(val.val){case"String":last_formula=val;break;case"Array Formula":throw"Array Formula unsupported";default:temp_val={v:val.val,ixfe:val.cell.ixfe,t:val.tt};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f="="+stringify_formula(val.formula,range,val.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options);addline(val.cell,temp_val,options);last_formula=val}}break;case"String":{if(last_formula){last_formula.val=val;temp_val={v:last_formula.val,ixfe:last_formula.cell.ixfe,t:"s"};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f="="+stringify_formula(last_formula.formula,range,last_formula.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options);addline(last_formula.cell,temp_val,options);last_formula=null}}break;case"Array":{array_formulae.push(val)}break;case"ShrFmla":{if(!cell_valid)break;shared_formulae[encode_cell(last_formula.cell)]=val[0]}break;case"LabelSst":temp_val=make_cell(sst[val.isst].t,val.ixfe,"s");temp_val.XF=XFs[temp_val.ixfe];if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options);break;case"Label":temp_val=make_cell(val.val,val.ixfe,"s");temp_val.XF=XFs[temp_val.ixfe]; 18561 var Ftab={0:"COUNT",1:"IF",2:"ISNA",3:"ISERROR",4:"SUM",5:"AVERAGE",6:"MIN",7:"MAX",8:"ROW",9:"COLUMN",10:"NA",11:"NPV",12:"STDEV",13:"DOLLAR",14:"FIXED",15:"SIN",16:"COS",17:"TAN",18:"ATAN",19:"PI",20:"SQRT",21:"EXP",22:"LN",23:"LOG10",24:"ABS",25:"INT",26:"SIGN",27:"ROUND",28:"LOOKUP",29:"INDEX",30:"REPT",31:"MID",32:"LEN",33:"VALUE",34:"TRUE",35:"FALSE",36:"AND",37:"OR",38:"NOT",39:"MOD",40:"DCOUNT",41:"DSUM",42:"DAVERAGE",43:"DMIN",44:"DMAX",45:"DSTDEV",46:"VAR",47:"DVAR",48:"TEXT",49:"LINEST",50:"TREND",51:"LOGEST",52:"GROWTH",53:"GOTO",54:"HALT",55:"RETURN",56:"PV",57:"FV",58:"NPER",59:"PMT",60:"RATE",61:"MIRR",62:"IRR",63:"RAND",64:"MATCH",65:"DATE",66:"TIME",67:"DAY",68:"MONTH",69:"YEAR",70:"WEEKDAY",71:"HOUR",72:"MINUTE",73:"SECOND",74:"NOW",75:"AREAS",76:"ROWS",77:"COLUMNS",78:"OFFSET",79:"ABSREF",80:"RELREF",81:"ARGUMENT",82:"SEARCH",83:"TRANSPOSE",84:"ERROR",85:"STEP",86:"TYPE",87:"ECHO",88:"SET.NAME",89:"CALLER",90:"DEREF",91:"WINDOWS",92:"SERIES",93:"DOCUMENTS",94:"ACTIVE.CELL",95:"SELECTION",96:"RESULT",97:"ATAN2",98:"ASIN",99:"ACOS",100:"CHOOSE",101:"HLOOKUP",102:"VLOOKUP",103:"LINKS",104:"INPUT",105:"ISREF",106:"GET.FORMULA",107:"GET.NAME",108:"SET.VALUE",109:"LOG",110:"EXEC",111:"CHAR",112:"LOWER",113:"UPPER",114:"PROPER",115:"LEFT",116:"RIGHT",117:"EXACT",118:"TRIM",119:"REPLACE",120:"SUBSTITUTE",121:"CODE",122:"NAMES",123:"DIRECTORY",124:"FIND",125:"CELL",126:"ISERR",127:"ISTEXT",128:"ISNUMBER",129:"ISBLANK",130:"T",131:"N",132:"FOPEN",133:"FCLOSE",134:"FSIZE",135:"FREADLN",136:"FREAD",137:"FWRITELN",138:"FWRITE",139:"FPOS",140:"DATEVALUE",141:"TIMEVALUE",142:"SLN",143:"SYD",144:"DDB",145:"GET.DEF",146:"REFTEXT",147:"TEXTREF",148:"INDIRECT",149:"REGISTER",150:"CALL",151:"ADD.BAR",152:"ADD.MENU",153:"ADD.COMMAND",154:"ENABLE.COMMAND",155:"CHECK.COMMAND",156:"RENAME.COMMAND",157:"SHOW.BAR",158:"DELETE.MENU",159:"DELETE.COMMAND",160:"GET.CHART.ITEM",161:"DIALOG.BOX",162:"CLEAN",163:"MDETERM",164:"MINVERSE",165:"MMULT",166:"FILES",167:"IPMT",168:"PPMT",169:"COUNTA",170:"CANCEL.KEY",171:"FOR",172:"WHILE",173:"BREAK",174:"NEXT",175:"INITIATE",176:"REQUEST",177:"POKE",178:"EXECUTE",179:"TERMINATE",180:"RESTART",181:"HELP",182:"GET.BAR",183:"PRODUCT",184:"FACT",185:"GET.CELL",186:"GET.WORKSPACE",187:"GET.WINDOW",188:"GET.DOCUMENT",189:"DPRODUCT",190:"ISNONTEXT",191:"GET.NOTE",192:"NOTE",193:"STDEVP",194:"VARP",195:"DSTDEVP",196:"DVARP",197:"TRUNC",198:"ISLOGICAL",199:"DCOUNTA",200:"DELETE.BAR",201:"UNREGISTER",204:"USDOLLAR",205:"FINDB",206:"SEARCHB",207:"REPLACEB",208:"LEFTB",209:"RIGHTB",210:"MIDB",211:"LENB",212:"ROUNDUP",213:"ROUNDDOWN",214:"ASC",215:"DBCS",216:"RANK",219:"ADDRESS",220:"DAYS360",221:"TODAY",222:"VDB",223:"ELSE",224:"ELSE.IF",225:"END.IF",226:"FOR.CELL",227:"MEDIAN",228:"SUMPRODUCT",229:"SINH",230:"COSH",231:"TANH",232:"ASINH",233:"ACOSH",234:"ATANH",235:"DGET",236:"CREATE.OBJECT",237:"VOLATILE",238:"LAST.ERROR",239:"CUSTOM.UNDO",240:"CUSTOM.REPEAT",241:"FORMULA.CONVERT",242:"GET.LINK.INFO",243:"TEXT.BOX",244:"INFO",245:"GROUP",246:"GET.OBJECT",247:"DB",248:"PAUSE",251:"RESUME",252:"FREQUENCY",253:"ADD.TOOLBAR",254:"DELETE.TOOLBAR",255:"User",256:"RESET.TOOLBAR",257:"EVALUATE",258:"GET.TOOLBAR",259:"GET.TOOL",260:"SPELLING.CHECK",261:"ERROR.TYPE",262:"APP.TITLE",263:"WINDOW.TITLE",264:"SAVE.TOOLBAR",265:"ENABLE.TOOL",266:"PRESS.TOOL",267:"REGISTER.ID",268:"GET.WORKBOOK",269:"AVEDEV",270:"BETADIST",271:"GAMMALN",272:"BETAINV",273:"BINOMDIST",274:"CHIDIST",275:"CHIINV",276:"COMBIN",277:"CONFIDENCE",278:"CRITBINOM",279:"EVEN",280:"EXPONDIST",281:"FDIST",282:"FINV",283:"FISHER",284:"FISHERINV",285:"FLOOR",286:"GAMMADIST",287:"GAMMAINV",288:"CEILING",289:"HYPGEOMDIST",290:"LOGNORMDIST",291:"LOGINV",292:"NEGBINOMDIST",293:"NORMDIST",294:"NORMSDIST",295:"NORMINV",296:"NORMSINV",297:"STANDARDIZE",298:"ODD",299:"PERMUT",300:"POISSON",301:"TDIST",302:"WEIBULL",303:"SUMXMY2",304:"SUMX2MY2",305:"SUMX2PY2",306:"CHITEST",307:"CORREL",308:"COVAR",309:"FORECAST",310:"FTEST",311:"INTERCEPT",312:"PEARSON",313:"RSQ",314:"STEYX",315:"SLOPE",316:"TTEST",317:"PROB",318:"DEVSQ",319:"GEOMEAN",320:"HARMEAN",321:"SUMSQ",322:"KURT",323:"SKEW",324:"ZTEST",325:"LARGE",326:"SMALL",327:"QUARTILE",328:"PERCENTILE",329:"PERCENTRANK",330:"MODE",331:"TRIMMEAN",332:"TINV",334:"MOVIE.COMMAND",335:"GET.MOVIE",336:"CONCATENATE",337:"POWER",338:"PIVOT.ADD.DATA",339:"GET.PIVOT.TABLE",340:"GET.PIVOT.FIELD",341:"GET.PIVOT.ITEM",342:"RADIANS",343:"DEGREES",344:"SUBTOTAL",345:"SUMIF",346:"COUNTIF",347:"COUNTBLANK",348:"SCENARIO.GET",349:"OPTIONS.LISTS.GET",350:"ISPMT",351:"DATEDIF",352:"DATESTRING",353:"NUMBERSTRING",354:"ROMAN",355:"OPEN.DIALOG",356:"SAVE.DIALOG",357:"VIEW.GET",358:"GETPIVOTDATA",359:"HYPERLINK",360:"PHONETIC",361:"AVERAGEA",362:"MAXA",363:"MINA",364:"STDEVPA",365:"VARPA",366:"STDEVA",367:"VARA",368:"BAHTTEXT",369:"THAIDAYOFWEEK",370:"THAIDIGIT",371:"THAIMONTHOFYEAR",372:"THAINUMSOUND",373:"THAINUMSTRING",374:"THAISTRINGLENGTH",375:"ISTHAIDIGIT",376:"ROUNDBAHTDOWN",377:"ROUNDBAHTUP",378:"THAIYEAR",379:"RTD"};var FtabArgc={2:1,3:1,15:1,16:1,17:1,18:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,65:3,66:3,67:1,68:1,69:1,71:1,72:1,73:1,75:1,76:1,77:1,79:2,80:2,83:1,86:1,90:1,97:2,98:1,99:1,105:1,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,189:3,190:1,195:3,196:3,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,65535:0};var XLSXFutureFunctions={"_xlfn.ACOT":"ACOT","_xlfn.ACOTH":"ACOTH","_xlfn.AGGREGATE":"AGGREGATE","_xlfn.ARABIC":"ARABIC","_xlfn.AVERAGEIF":"AVERAGEIF","_xlfn.AVERAGEIFS":"AVERAGEIFS","_xlfn.BASE":"BASE","_xlfn.BETA.DIST":"BETA.DIST","_xlfn.BETA.INV":"BETA.INV","_xlfn.BINOM.DIST":"BINOM.DIST","_xlfn.BINOM.DIST.RANGE":"BINOM.DIST.RANGE","_xlfn.BINOM.INV":"BINOM.INV","_xlfn.BITAND":"BITAND","_xlfn.BITLSHIFT":"BITLSHIFT","_xlfn.BITOR":"BITOR","_xlfn.BITRSHIFT":"BITRSHIFT","_xlfn.BITXOR":"BITXOR","_xlfn.CEILING.MATH":"CEILING.MATH","_xlfn.CEILING.PRECISE":"CEILING.PRECISE","_xlfn.CHISQ.DIST":"CHISQ.DIST","_xlfn.CHISQ.DIST.RT":"CHISQ.DIST.RT","_xlfn.CHISQ.INV":"CHISQ.INV","_xlfn.CHISQ.INV.RT":"CHISQ.INV.RT","_xlfn.CHISQ.TEST":"CHISQ.TEST","_xlfn.COMBINA":"COMBINA","_xlfn.CONFIDENCE.NORM":"CONFIDENCE.NORM","_xlfn.CONFIDENCE.T":"CONFIDENCE.T","_xlfn.COT":"COT","_xlfn.COTH":"COTH","_xlfn.COUNTIFS":"COUNTIFS","_xlfn.COVARIANCE.P":"COVARIANCE.P","_xlfn.COVARIANCE.S":"COVARIANCE.S","_xlfn.CSC":"CSC","_xlfn.CSCH":"CSCH","_xlfn.DAYS":"DAYS","_xlfn.DECIMAL":"DECIMAL","_xlfn.ECMA.CEILING":"ECMA.CEILING","_xlfn.ERF.PRECISE":"ERF.PRECISE","_xlfn.ERFC.PRECISE":"ERFC.PRECISE","_xlfn.EXPON.DIST":"EXPON.DIST","_xlfn.F.DIST":"F.DIST","_xlfn.F.DIST.RT":"F.DIST.RT","_xlfn.F.INV":"F.INV","_xlfn.F.INV.RT":"F.INV.RT","_xlfn.F.TEST":"F.TEST","_xlfn.FILTERXML":"FILTERXML","_xlfn.FLOOR.MATH":"FLOOR.MATH","_xlfn.FLOOR.PRECISE":"FLOOR.PRECISE","_xlfn.FORMULATEXT":"FORMULATEXT","_xlfn.GAMMA":"GAMMA","_xlfn.GAMMA.DIST":"GAMMA.DIST","_xlfn.GAMMA.INV":"GAMMA.INV","_xlfn.GAMMALN.PRECISE":"GAMMALN.PRECISE","_xlfn.GAUSS":"GAUSS","_xlfn.HYPGEOM.DIST":"HYPGEOM.DIST","_xlfn.IFNA":"IFNA","_xlfn.IFERROR":"IFERROR","_xlfn.IMCOSH":"IMCOSH","_xlfn.IMCOT":"IMCOT","_xlfn.IMCSC":"IMCSC","_xlfn.IMCSCH":"IMCSCH","_xlfn.IMSEC":"IMSEC","_xlfn.IMSECH":"IMSECH","_xlfn.IMSINH":"IMSINH","_xlfn.IMTAN":"IMTAN","_xlfn.ISFORMULA":"ISFORMULA","_xlfn.ISO.CEILING":"ISO.CEILING","_xlfn.ISOWEEKNUM":"ISOWEEKNUM","_xlfn.LOGNORM.DIST":"LOGNORM.DIST","_xlfn.LOGNORM.INV":"LOGNORM.INV","_xlfn.MODE.MULT":"MODE.MULT","_xlfn.MODE.SNGL":"MODE.SNGL","_xlfn.MUNIT":"MUNIT","_xlfn.NEGBINOM.DIST":"NEGBINOM.DIST","_xlfn.NETWORKDAYS.INTL":"NETWORKDAYS.INTL","_xlfn.NIGBINOM":"NIGBINOM","_xlfn.NORM.DIST":"NORM.DIST","_xlfn.NORM.INV":"NORM.INV","_xlfn.NORM.S.DIST":"NORM.S.DIST","_xlfn.NORM.S.INV":"NORM.S.INV","_xlfn.NUMBERVALUE":"NUMBERVALUE","_xlfn.PDURATION":"PDURATION","_xlfn.PERCENTILE.EXC":"PERCENTILE.EXC","_xlfn.PERCENTILE.INC":"PERCENTILE.INC","_xlfn.PERCENTRANK.EXC":"PERCENTRANK.EXC","_xlfn.PERCENTRANK.INC":"PERCENTRANK.INC","_xlfn.PERMUTATIONA":"PERMUTATIONA","_xlfn.PHI":"PHI","_xlfn.POISSON.DIST":"POISSON.DIST","_xlfn.QUARTILE.EXC":"QUARTILE.EXC","_xlfn.QUARTILE.INC":"QUARTILE.INC","_xlfn.QUERYSTRING":"QUERYSTRING","_xlfn.RANK.AVG":"RANK.AVG","_xlfn.RANK.EQ":"RANK.EQ","_xlfn.RRI":"RRI","_xlfn.SEC":"SEC","_xlfn.SECH":"SECH","_xlfn.SHEET":"SHEET","_xlfn.SHEETS":"SHEETS","_xlfn.SKEW.P":"SKEW.P","_xlfn.STDEV.P":"STDEV.P","_xlfn.STDEV.S":"STDEV.S","_xlfn.SUMIFS":"SUMIFS","_xlfn.T.DIST":"T.DIST","_xlfn.T.DIST.2T":"T.DIST.2T","_xlfn.T.DIST.RT":"T.DIST.RT","_xlfn.T.INV":"T.INV","_xlfn.T.INV.2T":"T.INV.2T","_xlfn.T.TEST":"T.TEST","_xlfn.UNICHAR":"UNICHAR","_xlfn.UNICODE":"UNICODE","_xlfn.VAR.P":"VAR.P","_xlfn.VAR.S":"VAR.S","_xlfn.WEBSERVICE":"WEBSERVICE","_xlfn.WEIBULL.DIST":"WEIBULL.DIST","_xlfn.WORKDAY.INTL":"WORKDAY.INTL","_xlfn.XOR":"XOR","_xlfn.Z.TEST":"Z.TEST"};var RecordEnum={6:{n:"Formula",f:parse_Formula},10:{n:"EOF",f:parse_EOF},12:{n:"CalcCount",f:parse_CalcCount},13:{n:"CalcMode",f:parse_CalcMode},14:{n:"CalcPrecision",f:parse_CalcPrecision},15:{n:"CalcRefMode",f:parse_CalcRefMode},16:{n:"CalcDelta",f:parse_CalcDelta},17:{n:"CalcIter",f:parse_CalcIter},18:{n:"Protect",f:parse_Protect},19:{n:"Password",f:parse_Password},20:{n:"Header",f:parse_Header},21:{n:"Footer",f:parse_Footer},23:{n:"ExternSheet",f:parse_ExternSheet},24:{n:"Lbl",f:parse_Lbl},25:{n:"WinProtect",f:parse_WinProtect},26:{n:"VerticalPageBreaks",f:parse_VerticalPageBreaks},27:{n:"HorizontalPageBreaks",f:parse_HorizontalPageBreaks},28:{n:"Note",f:parse_Note},29:{n:"Selection",f:parse_Selection},34:{n:"Date1904",f:parse_Date1904},35:{n:"ExternName",f:parse_ExternName},38:{n:"LeftMargin",f:parse_LeftMargin},39:{n:"RightMargin",f:parse_RightMargin},40:{n:"TopMargin",f:parse_TopMargin},41:{n:"BottomMargin",f:parse_BottomMargin},42:{n:"PrintRowCol",f:parse_PrintRowCol},43:{n:"PrintGrid",f:parse_PrintGrid},47:{n:"FilePass",f:parse_FilePass},49:{n:"Font",f:parse_Font},51:{n:"PrintSize",f:parse_PrintSize},60:{n:"Continue",f:parse_Continue},61:{n:"Window1",f:parse_Window1},64:{n:"Backup",f:parse_Backup},65:{n:"Pane",f:parse_Pane},66:{n:"CodePage",f:parse_CodePage},77:{n:"Pls",f:parse_Pls},80:{n:"DCon",f:parse_DCon},81:{n:"DConRef",f:parse_DConRef},82:{n:"DConName",f:parse_DConName},85:{n:"DefColWidth",f:parse_DefColWidth},89:{n:"XCT",f:parse_XCT},90:{n:"CRN",f:parse_CRN},91:{n:"FileSharing",f:parse_FileSharing},92:{n:"WriteAccess",f:parse_WriteAccess},93:{n:"Obj",f:parse_Obj},94:{n:"Uncalced",f:parse_Uncalced},95:{n:"CalcSaveRecalc",f:parse_CalcSaveRecalc},96:{n:"Template",f:parse_Template},97:{n:"Intl",f:parse_Intl},99:{n:"ObjProtect",f:parse_ObjProtect},125:{n:"ColInfo",f:parse_ColInfo},128:{n:"Guts",f:parse_Guts},129:{n:"WsBool",f:parse_WsBool},130:{n:"GridSet",f:parse_GridSet},131:{n:"HCenter",f:parse_HCenter},132:{n:"VCenter",f:parse_VCenter},133:{n:"BoundSheet8",f:parse_BoundSheet8},134:{n:"WriteProtect",f:parse_WriteProtect},140:{n:"Country",f:parse_Country},141:{n:"HideObj",f:parse_HideObj},144:{n:"Sort",f:parse_Sort},146:{n:"Palette",f:parse_Palette},151:{n:"Sync",f:parse_Sync},152:{n:"LPr",f:parse_LPr},153:{n:"DxGCol",f:parse_DxGCol},154:{n:"FnGroupName",f:parse_FnGroupName},155:{n:"FilterMode",f:parse_FilterMode},156:{n:"BuiltInFnGroupCount",f:parse_BuiltInFnGroupCount},157:{n:"AutoFilterInfo",f:parse_AutoFilterInfo},158:{n:"AutoFilter",f:parse_AutoFilter},160:{n:"Scl",f:parse_Scl},161:{n:"Setup",f:parse_Setup},174:{n:"ScenMan",f:parse_ScenMan},175:{n:"SCENARIO",f:parse_SCENARIO},176:{n:"SxView",f:parse_SxView},177:{n:"Sxvd",f:parse_Sxvd},178:{n:"SXVI",f:parse_SXVI},180:{n:"SxIvd",f:parse_SxIvd},181:{n:"SXLI",f:parse_SXLI},182:{n:"SXPI",f:parse_SXPI},184:{n:"DocRoute",f:parse_DocRoute},185:{n:"RecipName",f:parse_RecipName},189:{n:"MulRk",f:parse_MulRk},190:{n:"MulBlank",f:parse_MulBlank},193:{n:"Mms",f:parse_Mms},197:{n:"SXDI",f:parse_SXDI},198:{n:"SXDB",f:parse_SXDB},199:{n:"SXFDB",f:parse_SXFDB},200:{n:"SXDBB",f:parse_SXDBB},201:{n:"SXNum",f:parse_SXNum},202:{n:"SxBool",f:parse_SxBool},203:{n:"SxErr",f:parse_SxErr},204:{n:"SXInt",f:parse_SXInt},205:{n:"SXString",f:parse_SXString},206:{n:"SXDtr",f:parse_SXDtr},207:{n:"SxNil",f:parse_SxNil},208:{n:"SXTbl",f:parse_SXTbl},209:{n:"SXTBRGIITM",f:parse_SXTBRGIITM},210:{n:"SxTbpg",f:parse_SxTbpg},211:{n:"ObProj",f:parse_ObProj},213:{n:"SXStreamID",f:parse_SXStreamID},215:{n:"DBCell",f:parse_DBCell},216:{n:"SXRng",f:parse_SXRng},217:{n:"SxIsxoper",f:parse_SxIsxoper},218:{n:"BookBool",f:parse_BookBool},220:{n:"DbOrParamQry",f:parse_DbOrParamQry},221:{n:"ScenarioProtect",f:parse_ScenarioProtect},222:{n:"OleObjectSize",f:parse_OleObjectSize},224:{n:"XF",f:parse_XF},225:{n:"InterfaceHdr",f:parse_InterfaceHdr},226:{n:"InterfaceEnd",f:parse_InterfaceEnd},227:{n:"SXVS",f:parse_SXVS},229:{n:"MergeCells",f:parse_MergeCells},233:{n:"BkHim",f:parse_BkHim},235:{n:"MsoDrawingGroup",f:parse_MsoDrawingGroup},236:{n:"MsoDrawing",f:parse_MsoDrawing},237:{n:"MsoDrawingSelection",f:parse_MsoDrawingSelection},239:{n:"PhoneticInfo",f:parse_PhoneticInfo},240:{n:"SxRule",f:parse_SxRule},241:{n:"SXEx",f:parse_SXEx},242:{n:"SxFilt",f:parse_SxFilt},244:{n:"SxDXF",f:parse_SxDXF},245:{n:"SxItm",f:parse_SxItm},246:{n:"SxName",f:parse_SxName},247:{n:"SxSelect",f:parse_SxSelect},248:{n:"SXPair",f:parse_SXPair},249:{n:"SxFmla",f:parse_SxFmla},251:{n:"SxFormat",f:parse_SxFormat},252:{n:"SST",f:parse_SST},253:{n:"LabelSst",f:parse_LabelSst},255:{n:"ExtSST",f:parse_ExtSST},256:{n:"SXVDEx",f:parse_SXVDEx},259:{n:"SXFormula",f:parse_SXFormula},290:{n:"SXDBEx",f:parse_SXDBEx},311:{n:"RRDInsDel",f:parse_RRDInsDel},312:{n:"RRDHead",f:parse_RRDHead},315:{n:"RRDChgCell",f:parse_RRDChgCell},317:{n:"RRTabId",f:parse_RRTabId},318:{n:"RRDRenSheet",f:parse_RRDRenSheet},319:{n:"RRSort",f:parse_RRSort},320:{n:"RRDMove",f:parse_RRDMove},330:{n:"RRFormat",f:parse_RRFormat},331:{n:"RRAutoFmt",f:parse_RRAutoFmt},333:{n:"RRInsertSh",f:parse_RRInsertSh},334:{n:"RRDMoveBegin",f:parse_RRDMoveBegin},335:{n:"RRDMoveEnd",f:parse_RRDMoveEnd},336:{n:"RRDInsDelBegin",f:parse_RRDInsDelBegin},337:{n:"RRDInsDelEnd",f:parse_RRDInsDelEnd},338:{n:"RRDConflict",f:parse_RRDConflict},339:{n:"RRDDefName",f:parse_RRDDefName},340:{n:"RRDRstEtxp",f:parse_RRDRstEtxp},351:{n:"LRng",f:parse_LRng},352:{n:"UsesELFs",f:parse_UsesELFs},353:{n:"DSF",f:parse_DSF},401:{n:"CUsr",f:parse_CUsr},402:{n:"CbUsr",f:parse_CbUsr},403:{n:"UsrInfo",f:parse_UsrInfo},404:{n:"UsrExcl",f:parse_UsrExcl},405:{n:"FileLock",f:parse_FileLock},406:{n:"RRDInfo",f:parse_RRDInfo},407:{n:"BCUsrs",f:parse_BCUsrs},408:{n:"UsrChk",f:parse_UsrChk},425:{n:"UserBView",f:parse_UserBView},426:{n:"UserSViewBegin",f:parse_UserSViewBegin},427:{n:"UserSViewEnd",f:parse_UserSViewEnd},428:{n:"RRDUserView",f:parse_RRDUserView},429:{n:"Qsi",f:parse_Qsi},430:{n:"SupBook",f:parse_SupBook},431:{n:"Prot4Rev",f:parse_Prot4Rev},432:{n:"CondFmt",f:parse_CondFmt},433:{n:"CF",f:parse_CF},434:{n:"DVal",f:parse_DVal},437:{n:"DConBin",f:parse_DConBin},438:{n:"TxO",f:parse_TxO},439:{n:"RefreshAll",f:parse_RefreshAll},440:{n:"HLink",f:parse_HLink},441:{n:"Lel",f:parse_Lel},442:{n:"CodeName",f:parse_CodeName},443:{n:"SXFDBType",f:parse_SXFDBType},444:{n:"Prot4RevPass",f:parse_Prot4RevPass},445:{n:"ObNoMacros",f:parse_ObNoMacros},446:{n:"Dv",f:parse_Dv},448:{n:"Excel9File",f:parse_Excel9File},449:{n:"RecalcId",f:parse_RecalcId,r:2},450:{n:"EntExU2",f:parse_EntExU2},512:{n:"Dimensions",f:parse_Dimensions},513:{n:"Blank",f:parse_Blank},515:{n:"Number",f:parse_Number},516:{n:"Label",f:parse_Label},517:{n:"BoolErr",f:parse_BoolErr},519:{n:"String",f:parse_String},520:{n:"Row",f:parse_Row},523:{n:"Index",f:parse_Index},545:{n:"Array",f:parse_Array},549:{n:"DefaultRowHeight",f:parse_DefaultRowHeight},566:{n:"Table",f:parse_Table},574:{n:"Window2",f:parse_Window2},638:{n:"RK",f:parse_RK},659:{n:"Style",f:parse_Style},1048:{n:"BigName",f:parse_BigName},1054:{n:"Format",f:parse_Format},1084:{n:"ContinueBigName",f:parse_ContinueBigName},1212:{n:"ShrFmla",f:parse_ShrFmla},2048:{n:"HLinkTooltip",f:parse_HLinkTooltip},2049:{n:"WebPub",f:parse_WebPub},2050:{n:"QsiSXTag",f:parse_QsiSXTag},2051:{n:"DBQueryExt",f:parse_DBQueryExt},2052:{n:"ExtString",f:parse_ExtString},2053:{n:"TxtQry",f:parse_TxtQry},2054:{n:"Qsir",f:parse_Qsir},2055:{n:"Qsif",f:parse_Qsif},2056:{n:"RRDTQSIF",f:parse_RRDTQSIF},2057:{n:"BOF",f:parse_BOF},2058:{n:"OleDbConn",f:parse_OleDbConn},2059:{n:"WOpt",f:parse_WOpt},2060:{n:"SXViewEx",f:parse_SXViewEx},2061:{n:"SXTH",f:parse_SXTH},2062:{n:"SXPIEx",f:parse_SXPIEx},2063:{n:"SXVDTEx",f:parse_SXVDTEx},2064:{n:"SXViewEx9",f:parse_SXViewEx9},2066:{n:"ContinueFrt",f:parse_ContinueFrt},2067:{n:"RealTimeData",f:parse_RealTimeData},2128:{n:"ChartFrtInfo",f:parse_ChartFrtInfo},2129:{n:"FrtWrapper",f:parse_FrtWrapper},2130:{n:"StartBlock",f:parse_StartBlock},2131:{n:"EndBlock",f:parse_EndBlock},2132:{n:"StartObject",f:parse_StartObject},2133:{n:"EndObject",f:parse_EndObject},2134:{n:"CatLab",f:parse_CatLab},2135:{n:"YMult",f:parse_YMult},2136:{n:"SXViewLink",f:parse_SXViewLink},2137:{n:"PivotChartBits",f:parse_PivotChartBits},2138:{n:"FrtFontList",f:parse_FrtFontList},2146:{n:"SheetExt",f:parse_SheetExt},2147:{n:"BookExt",f:parse_BookExt,r:12},2148:{n:"SXAddl",f:parse_SXAddl},2149:{n:"CrErr",f:parse_CrErr},2150:{n:"HFPicture",f:parse_HFPicture},2151:{n:"FeatHdr",f:parse_FeatHdr},2152:{n:"Feat",f:parse_Feat},2154:{n:"DataLabExt",f:parse_DataLabExt},2155:{n:"DataLabExtContents",f:parse_DataLabExtContents},2156:{n:"CellWatch",f:parse_CellWatch},2161:{n:"FeatHdr11",f:parse_FeatHdr11},2162:{n:"Feature11",f:parse_Feature11},2164:{n:"DropDownObjIds",f:parse_DropDownObjIds},2165:{n:"ContinueFrt11",f:parse_ContinueFrt11},2166:{n:"DConn",f:parse_DConn},2167:{n:"List12",f:parse_List12},2168:{n:"Feature12",f:parse_Feature12},2169:{n:"CondFmt12",f:parse_CondFmt12},2170:{n:"CF12",f:parse_CF12},2171:{n:"CFEx",f:parse_CFEx},2172:{n:"XFCRC",f:parse_XFCRC},2173:{n:"XFExt",f:parse_XFExt},2174:{n:"AutoFilter12",f:parse_AutoFilter12},2175:{n:"ContinueFrt12",f:parse_ContinueFrt12},2180:{n:"MDTInfo",f:parse_MDTInfo},2181:{n:"MDXStr",f:parse_MDXStr},2182:{n:"MDXTuple",f:parse_MDXTuple},2183:{n:"MDXSet",f:parse_MDXSet},2184:{n:"MDXProp",f:parse_MDXProp},2185:{n:"MDXKPI",f:parse_MDXKPI},2186:{n:"MDB",f:parse_MDB},2187:{n:"PLV",f:parse_PLV},2188:{n:"Compat12",f:parse_Compat12,r:12},2189:{n:"DXF",f:parse_DXF},2190:{n:"TableStyles",f:parse_TableStyles,r:12},2191:{n:"TableStyle",f:parse_TableStyle},2192:{n:"TableStyleElement",f:parse_TableStyleElement},2194:{n:"StyleExt",f:parse_StyleExt},2195:{n:"NamePublish",f:parse_NamePublish},2196:{n:"NameCmt",f:parse_NameCmt},2197:{n:"SortData",f:parse_SortData},2198:{n:"Theme",f:parse_Theme},2199:{n:"GUIDTypeLib",f:parse_GUIDTypeLib},2200:{n:"FnGrp12",f:parse_FnGrp12},2201:{n:"NameFnGrp12",f:parse_NameFnGrp12},2202:{n:"MTRSettings",f:parse_MTRSettings,r:12},2203:{n:"CompressPictures",f:parse_CompressPictures},2204:{n:"HeaderFooter",f:parse_HeaderFooter},2205:{n:"CrtLayout12",f:parse_CrtLayout12},2206:{n:"CrtMlFrt",f:parse_CrtMlFrt},2207:{n:"CrtMlFrtContinue",f:parse_CrtMlFrtContinue},2211:{n:"ForceFullCalculation",f:parse_ForceFullCalculation},2212:{n:"ShapePropsStream",f:parse_ShapePropsStream},2213:{n:"TextPropsStream",f:parse_TextPropsStream},2214:{n:"RichTextStream",f:parse_RichTextStream},2215:{n:"CrtLayout12A",f:parse_CrtLayout12A},4097:{n:"Units",f:parse_Units},4098:{n:"Chart",f:parse_Chart},4099:{n:"Series",f:parse_Series},4102:{n:"DataFormat",f:parse_DataFormat},4103:{n:"LineFormat",f:parse_LineFormat},4105:{n:"MarkerFormat",f:parse_MarkerFormat},4106:{n:"AreaFormat",f:parse_AreaFormat},4107:{n:"PieFormat",f:parse_PieFormat},4108:{n:"AttachedLabel",f:parse_AttachedLabel},4109:{n:"SeriesText",f:parse_SeriesText},4116:{n:"ChartFormat",f:parse_ChartFormat},4117:{n:"Legend",f:parse_Legend},4118:{n:"SeriesList",f:parse_SeriesList},4119:{n:"Bar",f:parse_Bar},4120:{n:"Line",f:parse_Line},4121:{n:"Pie",f:parse_Pie},4122:{n:"Area",f:parse_Area},4123:{n:"Scatter",f:parse_Scatter},4124:{n:"CrtLine",f:parse_CrtLine},4125:{n:"Axis",f:parse_Axis},4126:{n:"Tick",f:parse_Tick},4127:{n:"ValueRange",f:parse_ValueRange},4128:{n:"CatSerRange",f:parse_CatSerRange},4129:{n:"AxisLine",f:parse_AxisLine},4130:{n:"CrtLink",f:parse_CrtLink},4132:{n:"DefaultText",f:parse_DefaultText},4133:{n:"Text",f:parse_Text},4134:{n:"FontX",f:parse_FontX},4135:{n:"ObjectLink",f:parse_ObjectLink},4146:{n:"Frame",f:parse_Frame},4147:{n:"Begin",f:parse_Begin},4148:{n:"End",f:parse_End},4149:{n:"PlotArea",f:parse_PlotArea},4154:{n:"Chart3d",f:parse_Chart3d},4156:{n:"PicF",f:parse_PicF},4157:{n:"DropBar",f:parse_DropBar},4158:{n:"Radar",f:parse_Radar},4159:{n:"Surf",f:parse_Surf},4160:{n:"RadarArea",f:parse_RadarArea},4161:{n:"AxisParent",f:parse_AxisParent},4163:{n:"LegendException",f:parse_LegendException},4164:{n:"ShtProps",f:parse_ShtProps},4165:{n:"SerToCrt",f:parse_SerToCrt},4166:{n:"AxesUsed",f:parse_AxesUsed},4168:{n:"SBaseRef",f:parse_SBaseRef},4170:{n:"SerParent",f:parse_SerParent},4171:{n:"SerAuxTrend",f:parse_SerAuxTrend},4174:{n:"IFmtRecord",f:parse_IFmtRecord},4175:{n:"Pos",f:parse_Pos},4176:{n:"AlRuns",f:parse_AlRuns},4177:{n:"BRAI",f:parse_BRAI},4187:{n:"SerAuxErrBar",f:parse_SerAuxErrBar},4188:{n:"ClrtClient",f:parse_ClrtClient},4189:{n:"SerFmt",f:parse_SerFmt},4191:{n:"Chart3DBarShape",f:parse_Chart3DBarShape},4192:{n:"Fbi",f:parse_Fbi},4193:{n:"BopPop",f:parse_BopPop},4194:{n:"AxcExt",f:parse_AxcExt},4195:{n:"Dat",f:parse_Dat},4196:{n:"PlotGrowth",f:parse_PlotGrowth},4197:{n:"SIIndex",f:parse_SIIndex},4198:{n:"GelFrame",f:parse_GelFrame},4199:{n:"BopPopCustom",f:parse_BopPopCustom},4200:{n:"Fbi2",f:parse_Fbi2},22:{n:"ExternCount",f:parsenoop},126:{n:"RK",f:parsenoop},127:{n:"ImData",f:parsenoop},135:{n:"Addin",f:parsenoop},136:{n:"Edg",f:parsenoop},137:{n:"Pub",f:parsenoop},145:{n:"Sub",f:parsenoop},148:{n:"LHRecord",f:parsenoop},149:{n:"LHNGraph",f:parsenoop},150:{n:"Sound",f:parsenoop},169:{n:"CoordList",f:parsenoop},171:{n:"GCW",f:parsenoop},188:{n:"ShrFmla",f:parsenoop},194:{n:"AddMenu",f:parsenoop},195:{n:"DelMenu",f:parsenoop},214:{n:"RString",f:parsenoop},223:{n:"UDDesc",f:parsenoop},234:{n:"TabIdConf",f:parsenoop},354:{n:"XL5Modify",f:parsenoop},421:{n:"FileSharing2",f:parsenoop},536:{n:"Name",f:parsenoop},547:{n:"ExternName",f:parse_ExternName},561:{n:"Font",f:parsenoop},1030:{n:"Formula",f:parse_Formula},2157:{n:"FeatInfo",f:parsenoop},2163:{n:"FeatInfo11",f:parsenoop},2177:{n:"SXAddl12",f:parsenoop},2240:{n:"AutoWebPub",f:parsenoop},2241:{n:"ListObj",f:parsenoop},2242:{n:"ListField",f:parsenoop},2243:{n:"ListDV",f:parsenoop},2244:{n:"ListCondFmt",f:parsenoop},2245:{n:"ListCF",f:parsenoop},2246:{n:"FMQry",f:parsenoop},2247:{n:"FMSQry",f:parsenoop},2248:{n:"PLV",f:parsenoop},2249:{n:"LnExt",f:parsenoop},2250:{n:"MkrExt",f:parsenoop},2251:{n:"CrtCoopt",f:parsenoop},0:{}};var CountryEnum={1:"US",2:"CA",3:"",7:"RU",20:"EG",30:"GR",31:"NL",32:"BE",33:"FR",34:"ES",36:"HU",39:"IT",41:"CH",43:"AT",44:"GB",45:"DK",46:"SE",47:"NO",48:"PL",49:"DE",52:"MX",55:"BR",61:"AU",64:"NZ",66:"TH",81:"JP",82:"KR",84:"VN",86:"CN",90:"TR",105:"JS",213:"DZ",216:"MA",218:"LY",351:"PT",354:"IS",358:"FI",420:"CZ",886:"TW",961:"LB",962:"JO",963:"SY",964:"IQ",965:"KW",966:"SA",971:"AE",972:"IL",974:"QA",981:"IR",65535:"US"};function fix_opts_func(defaults){return function fix_opts(opts){for(var i=0;i!=defaults.length;++i){var d=defaults[i];if(typeof opts[d[0]]==="undefined")opts[d[0]]=d[1];if(d[2]==="n")opts[d[0]]=Number(opts[d[0]])}}}var fixopts=fix_opts_func([["cellNF",false],["cellFormula",true],["sheetRows",0,"n"],["bookSheets",false],["bookProps",false],["bookFiles",false],["password",""],["WTF",false]]);function parse_compobj(obj){var v={};var o=obj.content;var l=28,m;m=__lpstr(o,l);l+=4+__readUInt32LE(o,l);v.UserType=m;m=__readUInt32LE(o,l);l+=4;switch(m){case 0:break;case 4294967295:case 4294967294:l+=4;break;default:if(m>400)throw new Error("Unsupported Clipboard: "+m.toString(16));l+=m}m=__lpstr(o,l);l+=m.length===0?0:5+m.length;v.Reserved1=m;if((m=__readUInt32LE(o,l))!==1907550708)return v;throw"Unsupported Unicode Extension"}function parse_xlscfb(cfb,options){if(!options)options={};fixopts(options);reset_cp();var CompObj=cfb.find("!CompObj");var Summary=cfb.find("!SummaryInformation");var Workbook=cfb.find("/Workbook");if(!Workbook)Workbook=cfb.find("/Book");var CompObjP,SummaryP,WorkbookP;function slurp(R,blob,length,opts){var l=length;var bufs=[];var d=blob.slice(blob.l,blob.l+l);if(opts.enc&&opts.enc.insitu_decrypt)switch(R.n){case"BOF":case"FilePass":case"FileLock":case"InterfaceHdr":case"RRDInfo":case"RRDHead":case"UsrExcl":break;default:if(d.length===0)break;opts.enc.insitu_decrypt(d)}bufs.push(d);blob.l+=l;var next=RecordEnum[__readUInt16LE(blob,blob.l)];while(next!=null&&next.n==="Continue"){l=__readUInt16LE(blob,blob.l+2);bufs.push(blob.slice(blob.l+4,blob.l+4+l));blob.l+=4+l;next=RecordEnum[__readUInt16LE(blob,blob.l)]}var b=bconcat(bufs);prep_blob(b,0);var ll=0;b.lens=[];for(var j=0;j<bufs.length;++j){b.lens.push(ll);ll+=bufs[j].length}return R.f(b,b.length,opts)}function safe_format_xf(p,opts){if(!p.XF)return;try{var fmtid=p.XF.ifmt||0;if(fmtid===0){if(p.t==="n"){if((p.v|0)===p.v)p.w=SSF._general_int(p.v);else p.w=SSF._general_num(p.v)}else p.w=SSF._general(p.v)}else p.w=SSF.format(fmtid,p.v);if(opts.cellNF)p.z=SSF._table[fmtid]}catch(e){if(opts.WTF)throw e}}function make_cell(val,ixfe,t){return{v:val,ixfe:ixfe,t:t}}function parse_workbook(blob,options){var wb={opts:{}};var Sheets={};var out={};var Directory={};var found_sheet=false;var range={};var last_formula=null;var sst=[];var cur_sheet="";var Preamble={};var lastcell,last_cell,cc,cmnt,rng,rngC,rngR;var shared_formulae={};var array_formulae=[];var temp_val;var country;var cell_valid=true;var XFs=[];var addline=function addline(cell,line,options){if(!cell_valid)return;lastcell=cell;last_cell=encode_cell(cell);if(range.s){if(cell.r<range.s.r)range.s.r=cell.r;if(cell.c<range.s.c)range.s.c=cell.c}if(range.e){if(cell.r+1>range.e.r)range.e.r=cell.r+1;if(cell.c+1>range.e.c)range.e.c=cell.c+1}if(options.sheetRows&&lastcell.r>=options.sheetRows)cell_valid=false;else out[last_cell]=line};var opts={enc:false,sbcch:0,snames:[],sharedf:shared_formulae,arrayf:array_formulae,rrtabid:[],lastuser:"",biff:8,codepage:0,winlocked:0,wtf:false};if(options.password)opts.password=options.password;var mergecells=[];var objects=[];var supbooks=[[]];var sbc=0,sbci=0,sbcli=0;supbooks.SheetNames=opts.snames;supbooks.sharedf=opts.sharedf;supbooks.arrayf=opts.arrayf;var last_Rn="";var file_depth=0;while(blob.l<blob.length-1){var s=blob.l;var RecordType=blob.read_shift(2);if(RecordType===0&&last_Rn==="EOF")break;var length=blob.l===blob.length?0:blob.read_shift(2),y;var R=RecordEnum[RecordType];if(R&&R.f){if(options.bookSheets){if(last_Rn==="BoundSheet8"&&R.n!=="BoundSheet8")break}last_Rn=R.n;if(R.r===2||R.r==12){var rt=blob.read_shift(2);length-=2;if(!opts.enc&&rt!==RecordType)throw"rt mismatch";if(R.r==12){blob.l+=10;length-=10}}var val;if(R.n==="EOF")val=R.f(blob,length,opts);else val=slurp(R,blob,length,opts);var Rn=R.n;if(opts.biff===5)switch(Rn){case"Lbl":Rn="Label";break}switch(Rn){case"Date1904":wb.opts.Date1904=val;break;case"WriteProtect":wb.opts.WriteProtect=true;break;case"FilePass":if(!opts.enc)blob.l=0;opts.enc=val;if(opts.WTF)console.error(val);if(!options.password)throw new Error("File is password-protected");if(val.Type!==0)throw new Error("Encryption scheme unsupported");if(!val.valid)throw new Error("Password is incorrect");break;case"WriteAccess":opts.lastuser=val;break;case"FileSharing":break;case"CodePage":if(val===21010)val=1200;opts.codepage=val;set_cp(val);break;case"RRTabId":opts.rrtabid=val;break;case"WinProtect":opts.winlocked=val;break;case"Template":break;case"RefreshAll":wb.opts.RefreshAll=val;break;case"BookBool":break;case"UsesELFs":break;case"MTRSettings":{if(val[0]&&val[1])throw"Unsupported threads: "+val}break;case"CalcCount":wb.opts.CalcCount=val;break;case"CalcDelta":wb.opts.CalcDelta=val;break;case"CalcIter":wb.opts.CalcIter=val;break;case"CalcMode":wb.opts.CalcMode=val;break;case"CalcPrecision":wb.opts.CalcPrecision=val;break;case"CalcSaveRecalc":wb.opts.CalcSaveRecalc=val;break;case"CalcRefMode":opts.CalcRefMode=val;break;case"Uncalced":break;case"ForceFullCalculation":wb.opts.FullCalc=val;break;case"WsBool":break;case"XF":XFs.push(val);break;case"ExtSST":break;case"BookExt":break;case"RichTextStream":break;case"BkHim":break;case"SupBook":supbooks[++sbc]=[val];sbci=0;break;case"ExternName":supbooks[sbc][++sbci]=val;break;case"Index":break;case"Lbl":supbooks[0][++sbcli]=val;break;case"ExternSheet":supbooks[sbc]=supbooks[sbc].concat(val);sbci+=val.length;break;case"Protect":out["!protect"]=val;break;case"Password":if(val!==0&&opts.WTF)console.error("Password verifier: "+val);break;case"Prot4Rev":case"Prot4RevPass":break;case"BoundSheet8":{Directory[val.pos]=val;opts.snames.push(val.name)}break;case"EOF":{if(--file_depth)break;if(range.e){out["!range"]=range;if(range.e.r>0&&range.e.c>0){range.e.r--;range.e.c--;out["!ref"]=encode_range(range);range.e.r++;range.e.c++}if(mergecells.length>0)out["!merges"]=mergecells;if(objects.length>0)out["!objects"]=objects}if(cur_sheet==="")Preamble=out;else Sheets[cur_sheet]=out;out={}}break;case"BOF":{if(val.BIFFVer===1280)opts.biff=5;if(file_depth++)break;cell_valid=true;out={};cur_sheet=(Directory[s]||{name:""}).name;mergecells=[];objects=[]}break;case"Number":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"BoolErr":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:val.t};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"RK":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.rknum,t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"MulRk":{for(var j=val.c;j<=val.C;++j){var ixfe=val.rkrec[j-val.c][0];temp_val={ixfe:ixfe,XF:XFs[ixfe],v:val.rkrec[j-val.c][1],t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:j,r:val.r},temp_val,options)}}break;case"Formula":{switch(val.val){case"String":last_formula=val;break;case"Array Formula":throw"Array Formula unsupported";default:temp_val={v:val.val,ixfe:val.cell.ixfe,t:val.tt};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f="="+stringify_formula(val.formula,range,val.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options);addline(val.cell,temp_val,options);last_formula=val}}break;case"String":{if(last_formula){last_formula.val=val;temp_val={v:last_formula.val,ixfe:last_formula.cell.ixfe,t:"s"};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f="="+stringify_formula(last_formula.formula,range,last_formula.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options);addline(last_formula.cell,temp_val,options);last_formula=null}}break;case"Array":{array_formulae.push(val)}break;case"ShrFmla":{if(!cell_valid)break;shared_formulae[encode_cell(last_formula.cell)]=val[0]}break;case"LabelSst":temp_val=make_cell(sst[val.isst].t,val.ixfe,"s");temp_val.XF=XFs[temp_val.ixfe];if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options);break;case"Label":temp_val=make_cell(val.val,val.ixfe,"s");temp_val.XF=XFs[temp_val.ixfe];
25801 if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options);break;case"Dimensions":{if(file_depth===1)range=val}break;case"SST":{sst=val}break;case"Format":{SSF.load(val[1],val[0])}break;case"MergeCells":mergecells=mergecells.concat(val);break;case"Obj":objects[val.cmo[0]]=opts.lastobj=val;break;case"TxO":opts.lastobj.TxO=val;break;case"HLink":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l=val[1]}break;case"HLinkTooltip":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l.tooltip=val[1]}break;case"Note":{if(opts.biff===5)break;cc=out[encode_cell(val[0])];var noteobj=objects[val[2]];if(!cc)break;if(!cc.c)cc.c=[];cmnt={a:val[1],t:noteobj.TxO.t};cc.c.push(cmnt)}break;case"NameCmt":break;default:switch(R.n){case"Header":break;case"Footer":break;case"HCenter":break;case"VCenter":break;case"Pls":break;case"Setup":break;case"DefColWidth":break;case"GCW":break;case"LHRecord":break;case"ColInfo":break;case"Row":break;case"DBCell":break;case"MulBlank":break;case"EntExU2":break;case"SxView":break;case"Sxvd":break;case"SXVI":break;case"SXVDEx":break;case"SxIvd":break;case"SXDI":break;case"SXLI":break;case"SXEx":break;case"QsiSXTag":break;case"Selection":break;case"Feat":break;case"FeatHdr":case"FeatHdr11":break;case"Feature11":case"Feature12":case"List12":break;case"Blank":break;case"Country":country=val;break;case"RecalcId":break;case"DefaultRowHeight":case"DxGCol":break;case"Fbi":case"Fbi2":case"GelFrame":break;case"Font":break;case"XFCRC":break;case"XFExt":break;case"Style":break;case"StyleExt":break;case"Palette":break;case"ClrtClient":break;case"Theme":break;case"ScenarioProtect":break;case"ObjProtect":break;case"CondFmt12":break;case"Table":break;case"TableStyles":break;case"TableStyle":break;case"TableStyleElement":break;case"SXStreamID":break;case"SXVS":break;case"DConRef":break;case"SXAddl":break;case"DConName":break;case"SXPI":break;case"SxFormat":break;case"SxSelect":break;case"SxRule":break;case"SxFilt":break;case"SxItm":break;case"SxDXF":break;case"ScenMan":break;case"DCon":break;case"CellWatch":break;case"PrintRowCol":break;case"PrintGrid":break;case"PrintSize":break;case"XCT":break;case"CRN":break;case"Scl":{}break;case"SheetExt":{}break;case"SheetExtOptional":{}break;case"ObNoMacros":{}break;case"ObProj":{}break;case"CodeName":{}break;case"GUIDTypeLib":{}break;case"WOpt":break;case"PhoneticInfo":break;case"OleObjectSize":break;case"DXF":case"DXFN":case"DXFN12":case"DXFN12List":case"DXFN12NoCB":break;case"Dv":case"DVal":break;case"BRAI":case"Series":case"SeriesText":break;case"DConn":break;case"DbOrParamQry":break;case"DBQueryExt":break;case"IFmtRecord":break;case"CondFmt":case"CF":case"CF12":case"CFEx":break;case"Excel9File":break;case"Units":break;case"InterfaceHdr":case"Mms":case"InterfaceEnd":case"DSF":case"BuiltInFnGroupCount":case"Window1":case"Window2":case"HideObj":case"GridSet":case"Guts":case"UserBView":case"UserSViewBegin":case"UserSViewEnd":case"Pane":break;default:switch(R.n){case"Dat":case"Begin":case"End":case"StartBlock":case"EndBlock":case"Frame":case"Area":case"Axis":case"AxisLine":case"Tick":break;case"AxesUsed":case"CrtLayout12":case"CrtLayout12A":case"CrtLink":case"CrtLine":case"CrtMlFrt":break;case"LineFormat":case"AreaFormat":case"Chart":case"Chart3d":case"Chart3DBarShape":case"ChartFormat":case"ChartFrtInfo":break;case"PlotArea":case"PlotGrowth":break;case"SeriesList":case"SerParent":case"SerAuxTrend":break;case"DataFormat":case"SerToCrt":case"FontX":break;case"CatSerRange":case"AxcExt":case"SerFmt":break;case"ShtProps":break;case"DefaultText":case"Text":case"CatLab":break;case"DataLabExtContents":break;case"Legend":case"LegendException":break;case"Pie":case"Scatter":break;case"PieFormat":case"MarkerFormat":break;case"StartObject":case"EndObject":break;case"AlRuns":case"ObjectLink":break;case"SIIndex":break;case"AttachedLabel":break;case"Line":case"Bar":break;case"Surf":break;case"AxisParent":break;case"Pos":break;case"ValueRange":break;case"SXViewEx9":break;case"SXViewLink":break;case"PivotChartBits":break;case"SBaseRef":break;case"TextPropsStream":break;case"LnExt":break;case"MkrExt":break;case"CrtCoopt":break;case"Qsi":case"Qsif":case"Qsir":case"QsiSXTag":break;case"TxtQry":break;case"FilterMode":break;case"AutoFilter":case"AutoFilterInfo":break;case"AutoFilter12":break;case"DropDownObjIds":break;case"Sort":break;case"SortData":break;case"ShapePropsStream":break;case"MsoDrawing":case"MsoDrawingGroup":case"MsoDrawingSelection":break;case"ImData":break;case"WebPub":case"AutoWebPub":case"RightMargin":case"LeftMargin":case"TopMargin":case"BottomMargin":case"HeaderFooter":case"HFPicture":case"PLV":case"HorizontalPageBreaks":case"VerticalPageBreaks":case"Backup":case"CompressPictures":case"Compat12":break;case"Continue":case"ContinueFrt12":break;case"ExternCount":break;case"RString":break;case"TabIdConf":case"Radar":case"RadarArea":case"DropBar":case"Intl":case"CoordList":case"SerAuxErrBar":break;default:if(options.WTF)throw"Unrecognized Record "+R.n}}}}else blob.l+=length}var sheetnamesraw=Object.keys(Directory).sort(function(a,b){return Number(a)-Number(b)}).map(function(x){return Directory[x].name});var sheetnames=sheetnamesraw.slice();wb.Directory=sheetnamesraw;wb.SheetNames=sheetnamesraw;if(!options.bookSheets)wb.Sheets=Sheets;wb.Preamble=Preamble;wb.Strings=sst;wb.SSF=SSF.get_table();if(opts.enc)wb.Encryption=opts.enc;wb.Metadata={};if(country!==undefined)wb.Metadata.Country=country;return wb}if(CompObj)CompObjP=parse_compobj(CompObj);if(options.bookProps&&!options.bookSheets)WorkbookP={};else{if(Workbook)WorkbookP=parse_workbook(Workbook.content,options);else throw new Error("Cannot find Workbook stream")}parse_props(cfb);var props={};for(var y in cfb.Summary)props[y]=cfb.Summary[y];for(y in cfb.DocSummary)props[y]=cfb.DocSummary[y];WorkbookP.Props=WorkbookP.Custprops=props;if(options.bookFiles)WorkbookP.cfb=cfb;WorkbookP.CompObjP=CompObjP;return WorkbookP}function parse_props(cfb){var DSI=cfb.find("!DocumentSummaryInformation");if(DSI)try{cfb.DocSummary=parse_PropertySetStream(DSI,DocSummaryPIDDSI)}catch(e){}var SI=cfb.find("!SummaryInformation");if(SI)try{cfb.Summary=parse_PropertySetStream(SI,SummaryPIDSI)}catch(e){}}var encregex=/&[a-z]*;/g,coderegex=/_x([0-9a-fA-F]+)_/g;function coderepl(m,c){return _chr(parseInt(c,16))}function encrepl($$){return encodings[$$]}function unescapexml(s){if(s.indexOf("&")>-1)s=s.replace(encregex,encrepl);return s.indexOf("_")===-1?s:s.replace(coderegex,coderepl)}function parsexmlbool(value,tag){switch(value){case"1":case"true":case"TRUE":return true;default:return false}}function matchtag(f,g){return new RegExp("<"+f+'(?: xml:space="preserve")?>([^☃]*)</'+f+">",(g||"")+"m")}var entregex=/&#(\d+);/g;function entrepl($$,$1){return String.fromCharCode(parseInt($1,10))}function fixstr(str){return str.replace(entregex,entrepl)}var everted_BERR=evert(BERR);var magic_formats={"General Number":"General","General Date":SSF._table[22],"Long Date":"dddd, mmmm dd, yyyy","Medium Date":SSF._table[15],"Short Date":SSF._table[14],"Long Time":SSF._table[19],"Medium Time":SSF._table[18],"Short Time":SSF._table[20],Currency:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',Fixed:SSF._table[2],Standard:SSF._table[4],Percent:SSF._table[10],Scientific:SSF._table[11],"Yes/No":'"Yes";"Yes";"No";@',"True/False":'"True";"True";"False";@',"On/Off":'"Yes";"Yes";"No";@'};function xlml_format(format,value){var fmt=magic_formats[format]||unescapexml(format);if(fmt==="General")return SSF._general(value);return SSF.format(fmt,value)}function xlml_set_prop(Props,tag,val){switch(tag){case"Description":tag="Comments";break}Props[tag]=val}function xlml_set_custprop(Custprops,Rn,cp,val){switch((cp[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]){case"boolean":val=parsexmlbool(val);break;case"i2":case"int":val=parseInt(val,10);break;case"r4":case"float":val=parseFloat(val);break;case"date":case"dateTime.tz":val=new Date(val);break;case"i8":case"string":case"fixed":case"uuid":case"bin.base64":break;default:throw"bad custprop:"+cp[0]}Custprops[unescapexml(Rn[3])]=val}function safe_format_xlml(cell,nf,o){try{if(nf==="General"){if(cell.t==="n"){if((cell.v|0)===cell.v)cell.w=SSF._general_int(cell.v);else cell.w=SSF._general_num(cell.v)}else cell.w=SSF._general(cell.v)}else cell.w=xlml_format(nf||"General",cell.v);if(o.cellNF)cell.z=magic_formats[nf]||nf||"General"}catch(e){if(o.WTF)throw e}}function parse_xlml_data(xml,ss,data,cell,base,styles,csty,o){var nf="General",sid=cell.StyleID;o=o||{};if(sid===undefined&&csty)sid=csty.StyleID;while(styles[sid]!==undefined){if(styles[sid].nf)nf=styles[sid].nf;if(!styles[sid].Parent)break;sid=styles[sid].Parent}switch(data.Type){case"Boolean":cell.t="b";cell.v=parsexmlbool(xml);break;case"String":cell.t="str";cell.r=fixstr(unescapexml(xml));cell.v=xml.indexOf("<")>-1?ss:cell.r;break;case"DateTime":cell.v=(Date.parse(xml)-new Date(Date.UTC(1899,11,30)))/(24*60*60*1e3);if(cell.v!==cell.v)cell.v=unescapexml(xml);else if(cell.v>=1&&cell.v<60)cell.v=cell.v-1;if(!nf||nf=="General")nf="yyyy-mm-dd";case"Number":if(cell.v===undefined)cell.v=+xml;if(!cell.t)cell.t="n";break;case"Error":cell.t="e";cell.v=xml;cell.w=xml;break;default:cell.t="s";cell.v=fixstr(ss);break}if(cell.t!=="e")safe_format_xlml(cell,nf,o);if(o.cellFormula!=null&&cell.Formula){cell.f=rc_to_a1(unescapexml(cell.Formula),base);cell.Formula=undefined}cell.ixfe=cell.StyleID!==undefined?cell.StyleID:"Default"}function xlml_clean_comment(comment){comment.t=comment.v;comment.v=comment.w=comment.ixfe=undefined}function xlml_normalize(d){if(has_buf&&Buffer.isBuffer(d))return d.toString("utf8");if(typeof d==="string")return d;throw"badf"}var xlmlregex=/<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/gm;function parse_xlml_xml(d,opts){var str=xlml_normalize(d);var Rn;var state=[],tmp;var sheets={},sheetnames=[],cursheet={},sheetname="";var table={},cell={},row={},dtag,didx;var c=0,r=0;var refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};var styles={},stag={};var ss="",fidx=0;var mergecells=[];var Props={},Custprops={},pidx=0,cp={};var comments=[],comment={};var cstys=[],csty;while(Rn=xlmlregex.exec(str))switch(Rn[3]){case"Data":if(state[state.length-1][1])break;if(Rn[1]==="/")parse_xlml_data(str.slice(didx,Rn.index),ss,dtag,state[state.length-1][0]=="Comment"?comment:cell,{c:c,r:r},styles,cstys[c],opts);else{ss="";dtag=parsexmltag(Rn[0]);didx=Rn.index+Rn[0].length}break;case"Cell":if(Rn[1]==="/"){if(comments.length>0)cell.c=comments;if((!opts.sheetRows||opts.sheetRows>r)&&cell.v!==undefined)cursheet[encode_col(c)+encode_row(r)]=cell;if(cell.HRef){cell.l={Target:cell.HRef,tooltip:cell.HRefScreenTip};cell.HRef=cell.HRefScreenTip=undefined}if(cell.MergeAcross||cell.MergeDown){var cc=c+(parseInt(cell.MergeAcross,10)|0);var rr=r+(parseInt(cell.MergeDown,10)|0);mergecells.push({s:{c:c,r:r},e:{c:cc,r:rr}})}++c;if(cell.MergeAcross)c+=+cell.MergeAcross}else{cell=parsexmltagobj(Rn[0]);if(cell.Index)c=+cell.Index-1;if(c<refguess.s.c)refguess.s.c=c;if(c>refguess.e.c)refguess.e.c=c;if(Rn[0].substr(-2)==="/>")++c;comments=[]}break;case"Row":if(Rn[1]==="/"||Rn[0].substr(-2)==="/>"){if(r<refguess.s.r)refguess.s.r=r;if(r>refguess.e.r)refguess.e.r=r;if(Rn[0].substr(-2)==="/>"){row=parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}c=0;++r}else{row=parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}break;case"Worksheet":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp;sheetnames.push(sheetname);if(refguess.s.r<=refguess.e.r&&refguess.s.c<=refguess.e.c)cursheet["!ref"]=encode_range(refguess);if(mergecells.length)cursheet["!merges"]=mergecells;sheets[sheetname]=cursheet}else{refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};r=c=0;state.push([Rn[3],false]);tmp=parsexmltag(Rn[0]);sheetname=tmp.Name;cursheet={};mergecells=[]}break;case"Table":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else if(Rn[0].slice(-2)=="/>")break;else{table=parsexmltag(Rn[0]);state.push([Rn[3],false]);cstys=[]}break;case"Style":if(Rn[1]==="/")styles[stag.ID]=stag;else stag=parsexmltag(Rn[0]);break;case"NumberFormat":stag.nf=parsexmltag(Rn[0]).Format||"General";break;case"Column":if(state[state.length-1][0]!=="Table")break;csty=parsexmltag(Rn[0]);cstys[csty.Index-1||cstys.length]=csty;for(var i=0;i<+csty.Span;++i)cstys[cstys.length]=csty;break;case"NamedRange":break;case"NamedCell":break;case"B":break;case"I":break;case"U":break;case"S":break;case"Sub":break;case"Sup":break;case"Span":break;case"Border":break;case"Alignment":break;case"Borders":break;case"Font":if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")ss+=str.slice(fidx,Rn.index);else fidx=Rn.index+Rn[0].length;break;case"Interior":break;case"Protection":break;case"Author":case"Title":case"Description":case"Created":case"Keywords":case"Subject":case"Category":case"Company":case"LastAuthor":case"LastSaved":case"LastPrinted":case"Version":case"Revision":case"TotalTime":case"HyperlinkBase":case"Manager":if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")xlml_set_prop(Props,Rn[3],str.slice(pidx,Rn.index));else pidx=Rn.index+Rn[0].length;break;case"Paragraphs":break;case"Styles":case"Workbook":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else state.push([Rn[3],false]);break;case"Comment":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp;xlml_clean_comment(comment);comments.push(comment)}else{state.push([Rn[3],false]);tmp=parsexmltag(Rn[0]);comment={a:tmp.Author}}break;case"Name":break;case"ComponentOptions":case"DocumentProperties":case"CustomDocumentProperties":case"OfficeDocumentSettings":case"PivotTable":case"PivotCache":case"Names":case"MapInfo":case"PageBreaks":case"QueryTable":case"DataValidation":case"AutoFilter":case"Sorting":case"Schema":case"data":case"ConditionalFormatting":case"SmartTagType":case"SmartTags":case"ExcelWorkbook":case"WorkbookOptions":case"WorksheetOptions":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else if(Rn[0].charAt(Rn[0].length-2)!=="/")state.push([Rn[3],true]);break;default:var seen=true;switch(state[state.length-1][0]){case"OfficeDocumentSettings":switch(Rn[3]){case"AllowPNG":break;case"RemovePersonalInformation":break;case"DownloadComponents":break;case"LocationOfComponents":break;case"Colors":break;case"Color":break;case"Index":break;case"RGB":break;case"PixelsPerInch":break;case"TargetScreenSize":break;case"ReadOnlyRecommended":break;default:seen=false}break;case"ComponentOptions":switch(Rn[3]){case"Toolbar":break;case"HideOfficeLogo":break;case"SpreadsheetAutoFit":break;case"Label":break;case"Caption":break;case"MaxHeight":break;case"MaxWidth":break;case"NextSheetNumber":break;default:seen=false}break;case"ExcelWorkbook":switch(Rn[3]){case"WindowHeight":break;case"WindowWidth":break;case"WindowTopX":break;case"WindowTopY":break;case"TabRatio":break;case"ProtectStructure":break;case"ProtectWindows":break;case"ActiveSheet":break;case"DisplayInkNotes":break;case"FirstVisibleSheet":break;case"SupBook":break;case"SheetName":break;case"SheetIndex":break;case"SheetIndexFirst":break;case"SheetIndexLast":break;case"Dll":break;case"AcceptLabelsInFormulas":break;case"DoNotSaveLinkValues":break;case"Date1904":break;case"Iteration":break;case"MaxIterations":break;case"MaxChange":break;case"Path":break;case"Xct":break;case"Count":break;case"SelectedSheets":break;case"Calculation":break;case"Uncalced":break;case"StartupPrompt":break;case"Crn":break;case"ExternName":break;case"Formula":break;case"ColFirst":break;case"ColLast":break;case"WantAdvise":break;case"Boolean":break;case"Error":break;case"Text":break;case"OLE":break;case"NoAutoRecover":break;case"PublishObjects":break;case"DoNotCalculateBeforeSave":break;case"Number":break;case"RefModeR1C1":break;case"EmbedSaveSmartTags":break;default:seen=false}break;case"WorkbookOptions":switch(Rn[3]){case"OWCVersion":break;case"Height":break;case"Width":break;default:seen=false}break;case"WorksheetOptions":switch(Rn[3]){case"Unsynced":break;case"Visible":break;case"Print":break;case"Panes":break;case"Scale":break;case"Pane":break;case"Number":break;case"Layout":break;case"Header":break;case"Footer":break;case"PageSetup":break;case"PageMargins":break;case"Selected":break;case"ProtectObjects":break;case"EnableSelection":break;case"ProtectScenarios":break;case"ValidPrinterInfo":break;case"HorizontalResolution":break;case"VerticalResolution":break;case"NumberofCopies":break;case"ActiveRow":break;case"ActiveCol":break;case"ActivePane":break;case"TopRowVisible":break;case"TopRowBottomPane":break;case"LeftColumnVisible":break;case"LeftColumnRightPane":break;case"FitToPage":break;case"RangeSelection":break;case"PaperSizeIndex":break;case"PageLayoutZoom":break;case"PageBreakZoom":break;case"FilterOn":break;case"DoNotDisplayGridlines":break;case"SplitHorizontal":break;case"SplitVertical":break;case"FreezePanes":break;case"FrozenNoSplit":break;case"FitWidth":break;case"FitHeight":break;case"CommentsLayout":break;case"Zoom":break;case"LeftToRight":break;case"Gridlines":break;case"AllowSort":break;case"AllowFilter":break;case"AllowInsertRows":break;case"AllowDeleteRows":break;case"AllowInsertCols":break;case"AllowDeleteCols":break;case"AllowInsertHyperlinks":break;case"AllowFormatCells":break;case"AllowSizeCols":break;case"AllowSizeRows":break;case"NoSummaryRowsBelowDetail":break;case"TabColorIndex":break;case"DoNotDisplayHeadings":break;case"ShowPageLayoutZoom":break;case"NoSummaryColumnsRightDetail":break;case"BlackAndWhite":break;case"DoNotDisplayZeros":break;case"DisplayPageBreak":break;case"RowColHeadings":break;case"DoNotDisplayOutline":break;case"NoOrientation":break;case"AllowUsePivotTables":break;case"ZeroHeight":break;case"ViewableRange":break;case"Selection":break;case"ProtectContents":break;default:seen=false}break;case"PivotTable":case"PivotCache":switch(Rn[3]){case"ImmediateItemsOnDrop":break;case"ShowPageMultipleItemLabel":break;case"CompactRowIndent":break;case"Location":break;case"PivotField":break;case"Orientation":break;case"LayoutForm":break;case"LayoutSubtotalLocation":break;case"LayoutCompactRow":break;case"Position":break;case"PivotItem":break;case"DataType":break;case"DataField":break;case"SourceName":break;case"ParentField":break;case"PTLineItems":break;case"PTLineItem":break;case"CountOfSameItems":break;case"Item":break;case"ItemType":break;case"PTSource":break;case"CacheIndex":break;case"ConsolidationReference":break;case"FileName":break;case"Reference":break;case"NoColumnGrand":break;case"NoRowGrand":break;case"BlankLineAfterItems":break;case"Hidden":break;case"Subtotal":break;case"BaseField":break;case"MapChildItems":break;case"Function":break;case"RefreshOnFileOpen":break;case"PrintSetTitles":break;case"MergeLabels":break;case"DefaultVersion":break;case"RefreshName":break;case"RefreshDate":break;case"RefreshDateCopy":break;case"VersionLastRefresh":break;case"VersionLastUpdate":break;case"VersionUpdateableMin":break;case"VersionRefreshableMin":break;case"Calculation":break;default:seen=false}break;case"PageBreaks":switch(Rn[3]){case"ColBreaks":break;case"ColBreak":break;case"RowBreaks":break;case"RowBreak":break;case"ColStart":break;case"ColEnd":break;case"RowEnd":break;default:seen=false}break;case"AutoFilter":switch(Rn[3]){case"AutoFilterColumn":break;case"AutoFilterCondition":break;case"AutoFilterAnd":break;case"AutoFilterOr":break;default:seen=false}break;case"QueryTable":switch(Rn[3]){case"Id":break;case"AutoFormatFont":break;case"AutoFormatPattern":break;case"QuerySource":break;case"QueryType":break;case"EnableRedirections":break;case"RefreshedInXl9":break;case"URLString":break;case"HTMLTables":break;case"Connection":break;case"CommandText":break;case"RefreshInfo":break;case"NoTitles":break;case"NextId":break;case"ColumnInfo":break;case"OverwriteCells":break;case"DoNotPromptForFile":break;case"TextWizardSettings":break;case"Source":break;case"Number":break;case"Decimal":break;case"ThousandSeparator":break;case"TrailingMinusNumbers":break;case"FormatSettings":break;case"FieldType":break;case"Delimiters":break;case"Tab":break;case"Comma":break;case"AutoFormatName":break;case"VersionLastEdit":break;case"VersionLastRefresh":break;default:seen=false}break;case"Sorting":case"ConditionalFormatting":case"DataValidation":switch(Rn[3]){case"Range":break;case"Type":break;case"Min":break;case"Max":break;case"Sort":break;case"Descending":break;case"Order":break;case"CaseSensitive":break;case"Value":break;case"ErrorStyle":break;case"ErrorMessage":break;case"ErrorTitle":break;case"CellRangeList":break;case"InputMessage":break;case"InputTitle":break;case"ComboHide":break;case"InputHide":break;case"Condition":break;case"Qualifier":break;case"UseBlank":break;case"Value1":break;case"Value2":break;case"Format":break;default:seen=false}break;case"MapInfo":case"Schema":case"data":switch(Rn[3]){case"Map":break;case"Entry":break;case"Range":break;case"XPath":break;case"Field":break;case"XSDType":break;case"FilterOn":break;case"Aggregate":break;case"ElementType":break;case"AttributeType":break;case"schema":case"element":case"complexType":case"datatype":case"all":case"attribute":case"extends":break;case"row":break;default:seen=false}break;case"SmartTags":break;default:seen=false;break}if(seen)break;if(!state[state.length-1][1])throw"Unrecognized tag: "+Rn[3]+"|"+state.join("|");if(state[state.length-1][0]==="CustomDocumentProperties"){if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")xlml_set_custprop(Custprops,Rn,cp,str.slice(pidx,Rn.index));else{cp=Rn;pidx=Rn.index+Rn[0].length}break}if(opts.WTF)throw"Unrecognized tag: "+Rn[3]+"|"+state.join("|")}var out={};if(!opts.bookSheets&&!opts.bookProps)out.Sheets=sheets;out.SheetNames=sheetnames;out.SSF=SSF.get_table();out.Props=Props;out.Custprops=Custprops;return out}function parse_xlml(data,opts){fixopts(opts=opts||{});switch(opts.type||"base64"){case"base64":return parse_xlml_xml(Base64.decode(data),opts);case"binary":case"buffer":case"file":return parse_xlml_xml(data,opts);case"array":return parse_xlml_xml(data.map(_chr).join(""),opts)}}function write_xlml(wb,opts){}var fs;if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){fs=require("fs")}}function firstbyte(f,o){switch((o||{}).type||"base64"){case"buffer":return f[0];case"base64":return Base64.decode(f.substr(0,12)).charCodeAt(0);case"binary":return f.charCodeAt(0);case"array":return f[0];default:throw new Error("Unrecognized type "+o.type)}}function xlsread(f,o){if(!o)o={};if(!o.type)o.type=has_buf&&Buffer.isBuffer(f)?"buffer":"base64";switch(firstbyte(f,o)){case 208:return parse_xlscfb(CFB.read(f,o),o);case 60:return parse_xlml(f,o);default:throw"Unsupported file"}}var readFile=function(f,o){var d=fs.readFileSync(f);if(!o)o={};switch(firstbyte(d,{type:"buffer"})){case 208:return parse_xlscfb(CFB.read(d,{type:"buffer"}),o);case 60:return parse_xlml(d,(o.type="buffer",o));default:throw"Unsupported file"}};function writeSync(wb,opts){var o=opts||{};switch(o.bookType){case"xml":return write_xlml(wb,o);default:throw"unsupported output format "+o.bookType}}function writeFileSync(wb,filename,opts){var o=opts|{};o.type="file";o.file=filename;switch(o.file.substr(-4).toLowerCase()){case".xls":o.bookType="xls";break;case".xml":o.bookType="xml";break}return writeSync(wb,o)}function shift_cell(cell,tgt){if(tgt.s){if(cell.cRel)cell.c+=tgt.s.c;if(cell.rRel)cell.r+=tgt.s.r}else{cell.c+=tgt.c;cell.r+=tgt.r}cell.cRel=cell.rRel=0;while(cell.c>=256)cell.c-=256;while(cell.r>=65536)cell.r-=65536;return cell}function shift_range(cell,range){cell.s=shift_cell(cell.s,range.s);cell.e=shift_cell(cell.e,range.s);return cell}function decode_row(rowstr){return parseInt(unfix_row(rowstr),10)-1}function encode_row(row){return""+(row+1)}function fix_row(cstr){return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2")}function unfix_row(cstr){return cstr.replace(/\$(\d+)$/,"$1")}function decode_col(colstr){var c=unfix_col(colstr),d=0,i=0;for(;i!==c.length;++i)d=26*d+c.charCodeAt(i)-64;return d-1}function encode_col(col){var s="";for(++col;col;col=Math.floor((col-1)/26))s=String.fromCharCode((col-1)%26+65)+s;return s}function fix_col(cstr){return cstr.replace(/^([A-Z])/,"$$$1")}function unfix_col(cstr){return cstr.replace(/^\$([A-Z])/,"$1")}function split_cell(cstr){return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(",")}function decode_cell(cstr){var splt=split_cell(cstr);return{c:decode_col(splt[0]),r:decode_row(splt[1])}}function encode_cell(cell){return encode_col(cell.c)+encode_row(cell.r)}function fix_cell(cstr){return fix_col(fix_row(cstr))}function unfix_cell(cstr){return unfix_col(unfix_row(cstr))}function decode_range(range){var x=range.split(":").map(decode_cell);return{s:x[0],e:x[x.length-1]}}function encode_range(cs,ce){if(ce===undefined||typeof ce==="number")return encode_range(cs.s,cs.e);if(typeof cs!=="string")cs=encode_cell(cs);if(typeof ce!=="string")ce=encode_cell(ce);return cs==ce?cs:cs+":"+ce}function safe_decode_range(range){var o={s:{c:0,r:0},e:{c:0,r:0}};var idx=0,i=0,cc=0;var len=range.length;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.s.c=--idx;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.s.r=--idx;if(i===len||range.charCodeAt(++i)===58){o.e.c=o.s.c;o.e.r=o.s.r;return o}for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.e.c=--idx;for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.e.r=--idx;return o}function safe_format_cell(cell,v){if(cell.z!==undefined)try{return cell.w=SSF.format(cell.z,v)}catch(e){}if(!cell.XF)return v;try{return cell.w=SSF.format(cell.XF.ifmt||0,v)}catch(e){return""+v}}function format_cell(cell,v){if(cell==null||cell.t==null)return"";if(cell.w!==undefined)return cell.w;if(v===undefined)return safe_format_cell(cell,cell.v);return safe_format_cell(cell,v)}function sheet_to_json(sheet,opts){var val,row,range,header=0,offset=1,r,hdr=[],isempty,R,C,v;var o=opts!=null?opts:{};var raw=o.raw;if(sheet==null||sheet["!ref"]==null)return[];range=o.range!==undefined?o.range:sheet["!ref"];if(o.header===1)header=1;else if(o.header==="A")header=2;else if(Array.isArray(o.header))header=3;switch(typeof range){case"string":r=safe_decode_range(range);break;case"number":r=safe_decode_range(sheet["!ref"]);r.s.r=range;break;default:r=range}if(header>0)offset=0;var rr=encode_row(r.s.r);var cols=new Array(r.e.c-r.s.c+1);var out=new Array(r.e.r-r.s.r-offset+1);var outi=0;for(C=r.s.c;C<=r.e.c;++C){cols[C]=encode_col(C);val=sheet[cols[C]+rr];switch(header){case 1:hdr[C]=C;break;case 2:hdr[C]=cols[C];break;case 3:hdr[C]=o.header[C-r.s.c];break;default:if(val===undefined)continue;hdr[C]=format_cell(val)}}for(R=r.s.r+offset;R<=r.e.r;++R){rr=encode_row(R);isempty=true;row=header===1?[]:Object.create({__rowNum__:R});for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];if(val===undefined||val.t===undefined)continue;v=val.v;switch(val.t){case"e":continue;case"s":case"str":break;case"b":case"n":break;default:throw"unrecognized type "+val.t}if(v!==undefined){row[hdr[C]]=raw?v:format_cell(val,v);isempty=false}}if(isempty===false)out[outi++]=row}out.length=outi;return out}function sheet_to_row_object_array(sheet,opts){return sheet_to_json(sheet,opts!=null?opts:{})}function sheet_to_csv(sheet,opts){var out="",txt="",qreg=/"/g;var o=opts==null?{}:opts;if(sheet==null||sheet["!ref"]==null)return"";var r=safe_decode_range(sheet["!ref"]);var FS=o.FS!==undefined?o.FS:",",fs=FS.charCodeAt(0);var RS=o.RS!==undefined?o.RS:"\n",rs=RS.charCodeAt(0);var row="",rr="",cols=[];var i=0,cc=0,val;var R=0,C=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(R=r.s.r;R<=r.e.r;++R){row="";rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];txt=val!==undefined?""+format_cell(val):"";for(i=0,cc=0;i!==txt.length;++i)if((cc=txt.charCodeAt(i))===fs||cc===rs||cc===34){txt='"'+txt.replace(qreg,'""')+'"';break}row+=(C===r.s.c?"":FS)+txt}out+=row+RS}return out}var make_csv=sheet_to_csv;function sheet_to_formulae(sheet){var cmds,y="",x,val="";if(sheet==null||sheet["!ref"]==null)return"";var r=safe_decode_range(sheet["!ref"]),rr="",cols=[],C;cmds=new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1));var i=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(var R=r.s.r;R<=r.e.r;++R){rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){y=cols[C]+rr;x=sheet[y];val="";if(x===undefined)continue;if(x.f!=null)val=x.f;else if(x.w!==undefined)val="'"+x.w;else if(x.v===undefined)continue;else val=""+x.v;cmds[i++]=y+"="+val}}cmds.length=i;return cmds}var utils={encode_col:encode_col,encode_row:encode_row,encode_cell:encode_cell,encode_range:encode_range,decode_col:decode_col,decode_row:decode_row,split_cell:split_cell,decode_cell:decode_cell,decode_range:decode_range,format_cell:format_cell,get_formulae:sheet_to_formulae,make_csv:sheet_to_csv,make_json:sheet_to_json,make_formulae:sheet_to_formulae,sheet_to_csv:sheet_to_csv,sheet_to_json:sheet_to_json,sheet_to_formulae:sheet_to_formulae,sheet_to_row_object_array:sheet_to_row_object_array};XLS.parse_xlscfb=parse_xlscfb;XLS.read=xlsread;XLS.readFile=readFile;XLS.utils=utils;XLS.CFB=CFB;XLS.SSF=SSF})(typeof exports!=="undefined"?exports:XLS); 18562 if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options);break;case"Dimensions":{if(file_depth===1)range=val}break;case"SST":{sst=val}break;case"Format":{SSF.load(val[1],val[0])}break;case"MergeCells":mergecells=mergecells.concat(val);break;case"Obj":objects[val.cmo[0]]=opts.lastobj=val;break;case"TxO":opts.lastobj.TxO=val;break;case"HLink":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l=val[1]}break;case"HLinkTooltip":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l.tooltip=val[1]}break;case"Note":{if(opts.biff===5)break;cc=out[encode_cell(val[0])];var noteobj=objects[val[2]];if(!cc)break;if(!cc.c)cc.c=[];cmnt={a:val[1],t:noteobj.TxO.t};cc.c.push(cmnt)}break;case"NameCmt":break;default:switch(R.n){case"Header":break;case"Footer":break;case"HCenter":break;case"VCenter":break;case"Pls":break;case"Setup":break;case"DefColWidth":break;case"GCW":break;case"LHRecord":break;case"ColInfo":break;case"Row":break;case"DBCell":break;case"MulBlank":break;case"EntExU2":break;case"SxView":break;case"Sxvd":break;case"SXVI":break;case"SXVDEx":break;case"SxIvd":break;case"SXDI":break;case"SXLI":break;case"SXEx":break;case"QsiSXTag":break;case"Selection":break;case"Feat":break;case"FeatHdr":case"FeatHdr11":break;case"Feature11":case"Feature12":case"List12":break;case"Blank":break;case"Country":country=val;break;case"RecalcId":break;case"DefaultRowHeight":case"DxGCol":break;case"Fbi":case"Fbi2":case"GelFrame":break;case"Font":break;case"XFCRC":break;case"XFExt":break;case"Style":break;case"StyleExt":break;case"Palette":break;case"ClrtClient":break;case"Theme":break;case"ScenarioProtect":break;case"ObjProtect":break;case"CondFmt12":break;case"Table":break;case"TableStyles":break;case"TableStyle":break;case"TableStyleElement":break;case"SXStreamID":break;case"SXVS":break;case"DConRef":break;case"SXAddl":break;case"DConName":break;case"SXPI":break;case"SxFormat":break;case"SxSelect":break;case"SxRule":break;case"SxFilt":break;case"SxItm":break;case"SxDXF":break;case"ScenMan":break;case"DCon":break;case"CellWatch":break;case"PrintRowCol":break;case"PrintGrid":break;case"PrintSize":break;case"XCT":break;case"CRN":break;case"Scl":{}break;case"SheetExt":{}break;case"SheetExtOptional":{}break;case"ObNoMacros":{}break;case"ObProj":{}break;case"CodeName":{}break;case"GUIDTypeLib":{}break;case"WOpt":break;case"PhoneticInfo":break;case"OleObjectSize":break;case"DXF":case"DXFN":case"DXFN12":case"DXFN12List":case"DXFN12NoCB":break;case"Dv":case"DVal":break;case"BRAI":case"Series":case"SeriesText":break;case"DConn":break;case"DbOrParamQry":break;case"DBQueryExt":break;case"IFmtRecord":break;case"CondFmt":case"CF":case"CF12":case"CFEx":break;case"Excel9File":break;case"Units":break;case"InterfaceHdr":case"Mms":case"InterfaceEnd":case"DSF":case"BuiltInFnGroupCount":case"Window1":case"Window2":case"HideObj":case"GridSet":case"Guts":case"UserBView":case"UserSViewBegin":case"UserSViewEnd":case"Pane":break;default:switch(R.n){case"Dat":case"Begin":case"End":case"StartBlock":case"EndBlock":case"Frame":case"Area":case"Axis":case"AxisLine":case"Tick":break;case"AxesUsed":case"CrtLayout12":case"CrtLayout12A":case"CrtLink":case"CrtLine":case"CrtMlFrt":break;case"LineFormat":case"AreaFormat":case"Chart":case"Chart3d":case"Chart3DBarShape":case"ChartFormat":case"ChartFrtInfo":break;case"PlotArea":case"PlotGrowth":break;case"SeriesList":case"SerParent":case"SerAuxTrend":break;case"DataFormat":case"SerToCrt":case"FontX":break;case"CatSerRange":case"AxcExt":case"SerFmt":break;case"ShtProps":break;case"DefaultText":case"Text":case"CatLab":break;case"DataLabExtContents":break;case"Legend":case"LegendException":break;case"Pie":case"Scatter":break;case"PieFormat":case"MarkerFormat":break;case"StartObject":case"EndObject":break;case"AlRuns":case"ObjectLink":break;case"SIIndex":break;case"AttachedLabel":break;case"Line":case"Bar":break;case"Surf":break;case"AxisParent":break;case"Pos":break;case"ValueRange":break;case"SXViewEx9":break;case"SXViewLink":break;case"PivotChartBits":break;case"SBaseRef":break;case"TextPropsStream":break;case"LnExt":break;case"MkrExt":break;case"CrtCoopt":break;case"Qsi":case"Qsif":case"Qsir":case"QsiSXTag":break;case"TxtQry":break;case"FilterMode":break;case"AutoFilter":case"AutoFilterInfo":break;case"AutoFilter12":break;case"DropDownObjIds":break;case"Sort":break;case"SortData":break;case"ShapePropsStream":break;case"MsoDrawing":case"MsoDrawingGroup":case"MsoDrawingSelection":break;case"ImData":break;case"WebPub":case"AutoWebPub":case"RightMargin":case"LeftMargin":case"TopMargin":case"BottomMargin":case"HeaderFooter":case"HFPicture":case"PLV":case"HorizontalPageBreaks":case"VerticalPageBreaks":case"Backup":case"CompressPictures":case"Compat12":break;case"Continue":case"ContinueFrt12":break;case"ExternCount":break;case"RString":break;case"TabIdConf":case"Radar":case"RadarArea":case"DropBar":case"Intl":case"CoordList":case"SerAuxErrBar":break;default:if(options.WTF)throw"Unrecognized Record "+R.n}}}}else blob.l+=length}var sheetnamesraw=Object.keys(Directory).sort(function(a,b){return Number(a)-Number(b)}).map(function(x){return Directory[x].name});var sheetnames=sheetnamesraw.slice();wb.Directory=sheetnamesraw;wb.SheetNames=sheetnamesraw;if(!options.bookSheets)wb.Sheets=Sheets;wb.Preamble=Preamble;wb.Strings=sst;wb.SSF=SSF.get_table();if(opts.enc)wb.Encryption=opts.enc;wb.Metadata={};if(country!==undefined)wb.Metadata.Country=country;return wb}if(CompObj)CompObjP=parse_compobj(CompObj);if(options.bookProps&&!options.bookSheets)WorkbookP={};else{if(Workbook)WorkbookP=parse_workbook(Workbook.content,options);else throw new Error("Cannot find Workbook stream")}parse_props(cfb);var props={};for(var y in cfb.Summary)props[y]=cfb.Summary[y];for(y in cfb.DocSummary)props[y]=cfb.DocSummary[y];WorkbookP.Props=WorkbookP.Custprops=props;if(options.bookFiles)WorkbookP.cfb=cfb;WorkbookP.CompObjP=CompObjP;return WorkbookP}function parse_props(cfb){var DSI=cfb.find("!DocumentSummaryInformation");if(DSI)try{cfb.DocSummary=parse_PropertySetStream(DSI,DocSummaryPIDDSI)}catch(e){}var SI=cfb.find("!SummaryInformation");if(SI)try{cfb.Summary=parse_PropertySetStream(SI,SummaryPIDSI)}catch(e){}}var encregex=/&[a-z]*;/g,coderegex=/_x([0-9a-fA-F]+)_/g;function coderepl(m,c){return _chr(parseInt(c,16))}function encrepl($$){return encodings[$$]}function unescapexml(s){if(s.indexOf("&")>-1)s=s.replace(encregex,encrepl);return s.indexOf("_")===-1?s:s.replace(coderegex,coderepl)}function parsexmlbool(value,tag){switch(value){case"1":case"true":case"TRUE":return true;default:return false}}function matchtag(f,g){return new RegExp("<"+f+'(?: xml:space="preserve")?>([^☃]*)</'+f+">",(g||"")+"m")}var entregex=/&#(\d+);/g;function entrepl($$,$1){return String.fromCharCode(parseInt($1,10))}function fixstr(str){return str.replace(entregex,entrepl)}var everted_BERR=evert(BERR);var magic_formats={"General Number":"General","General Date":SSF._table[22],"Long Date":"dddd, mmmm dd, yyyy","Medium Date":SSF._table[15],"Short Date":SSF._table[14],"Long Time":SSF._table[19],"Medium Time":SSF._table[18],"Short Time":SSF._table[20],Currency:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',Fixed:SSF._table[2],Standard:SSF._table[4],Percent:SSF._table[10],Scientific:SSF._table[11],"Yes/No":'"Yes";"Yes";"No";@',"True/False":'"True";"True";"False";@',"On/Off":'"Yes";"Yes";"No";@'};function xlml_format(format,value){var fmt=magic_formats[format]||unescapexml(format);if(fmt==="General")return SSF._general(value);return SSF.format(fmt,value)}function xlml_set_prop(Props,tag,val){switch(tag){case"Description":tag="Comments";break}Props[tag]=val}function xlml_set_custprop(Custprops,Rn,cp,val){switch((cp[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]){case"boolean":val=parsexmlbool(val);break;case"i2":case"int":val=parseInt(val,10);break;case"r4":case"float":val=parseFloat(val);break;case"date":case"dateTime.tz":val=new Date(val);break;case"i8":case"string":case"fixed":case"uuid":case"bin.base64":break;default:throw"bad custprop:"+cp[0]}Custprops[unescapexml(Rn[3])]=val}function safe_format_xlml(cell,nf,o){try{if(nf==="General"){if(cell.t==="n"){if((cell.v|0)===cell.v)cell.w=SSF._general_int(cell.v);else cell.w=SSF._general_num(cell.v)}else cell.w=SSF._general(cell.v)}else cell.w=xlml_format(nf||"General",cell.v);if(o.cellNF)cell.z=magic_formats[nf]||nf||"General"}catch(e){if(o.WTF)throw e}}function parse_xlml_data(xml,ss,data,cell,base,styles,csty,o){var nf="General",sid=cell.StyleID;o=o||{};if(sid===undefined&&csty)sid=csty.StyleID;while(styles[sid]!==undefined){if(styles[sid].nf)nf=styles[sid].nf;if(!styles[sid].Parent)break;sid=styles[sid].Parent}switch(data.Type){case"Boolean":cell.t="b";cell.v=parsexmlbool(xml);break;case"String":cell.t="str";cell.r=fixstr(unescapexml(xml));cell.v=xml.indexOf("<")>-1?ss:cell.r;break;case"DateTime":cell.v=(Date.parse(xml)-new Date(Date.UTC(1899,11,30)))/(24*60*60*1e3);if(cell.v!==cell.v)cell.v=unescapexml(xml);else if(cell.v>=1&&cell.v<60)cell.v=cell.v-1;if(!nf||nf=="General")nf="yyyy-mm-dd";case"Number":if(cell.v===undefined)cell.v=+xml;if(!cell.t)cell.t="n";break;case"Error":cell.t="e";cell.v=xml;cell.w=xml;break;default:cell.t="s";cell.v=fixstr(ss);break}if(cell.t!=="e")safe_format_xlml(cell,nf,o);if(o.cellFormula!=null&&cell.Formula){cell.f=rc_to_a1(unescapexml(cell.Formula),base);cell.Formula=undefined}cell.ixfe=cell.StyleID!==undefined?cell.StyleID:"Default"}function xlml_clean_comment(comment){comment.t=comment.v;comment.v=comment.w=comment.ixfe=undefined}function xlml_normalize(d){if(has_buf&&Buffer.isBuffer(d))return d.toString("utf8");if(typeof d==="string")return d;throw"badf"}var xlmlregex=/<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/gm;function parse_xlml_xml(d,opts){var str=xlml_normalize(d);var Rn;var state=[],tmp;var sheets={},sheetnames=[],cursheet={},sheetname="";var table={},cell={},row={},dtag,didx;var c=0,r=0;var refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};var styles={},stag={};var ss="",fidx=0;var mergecells=[];var Props={},Custprops={},pidx=0,cp={};var comments=[],comment={};var cstys=[],csty;while(Rn=xlmlregex.exec(str))switch(Rn[3]){case"Data":if(state[state.length-1][1])break;if(Rn[1]==="/")parse_xlml_data(str.slice(didx,Rn.index),ss,dtag,state[state.length-1][0]=="Comment"?comment:cell,{c:c,r:r},styles,cstys[c],opts);else{ss="";dtag=parsexmltag(Rn[0]);didx=Rn.index+Rn[0].length}break;case"Cell":if(Rn[1]==="/"){if(comments.length>0)cell.c=comments;if((!opts.sheetRows||opts.sheetRows>r)&&cell.v!==undefined)cursheet[encode_col(c)+encode_row(r)]=cell;if(cell.HRef){cell.l={Target:cell.HRef,tooltip:cell.HRefScreenTip};cell.HRef=cell.HRefScreenTip=undefined}if(cell.MergeAcross||cell.MergeDown){var cc=c+(parseInt(cell.MergeAcross,10)|0);var rr=r+(parseInt(cell.MergeDown,10)|0);mergecells.push({s:{c:c,r:r},e:{c:cc,r:rr}})}++c;if(cell.MergeAcross)c+=+cell.MergeAcross}else{cell=parsexmltagobj(Rn[0]);if(cell.Index)c=+cell.Index-1;if(c<refguess.s.c)refguess.s.c=c;if(c>refguess.e.c)refguess.e.c=c;if(Rn[0].substr(-2)==="/>")++c;comments=[]}break;case"Row":if(Rn[1]==="/"||Rn[0].substr(-2)==="/>"){if(r<refguess.s.r)refguess.s.r=r;if(r>refguess.e.r)refguess.e.r=r;if(Rn[0].substr(-2)==="/>"){row=parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}c=0;++r}else{row=parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}break;case"Worksheet":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp;sheetnames.push(sheetname);if(refguess.s.r<=refguess.e.r&&refguess.s.c<=refguess.e.c)cursheet["!ref"]=encode_range(refguess);if(mergecells.length)cursheet["!merges"]=mergecells;sheets[sheetname]=cursheet}else{refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};r=c=0;state.push([Rn[3],false]);tmp=parsexmltag(Rn[0]);sheetname=tmp.Name;cursheet={};mergecells=[]}break;case"Table":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else if(Rn[0].slice(-2)=="/>")break;else{table=parsexmltag(Rn[0]);state.push([Rn[3],false]);cstys=[]}break;case"Style":if(Rn[1]==="/")styles[stag.ID]=stag;else stag=parsexmltag(Rn[0]);break;case"NumberFormat":stag.nf=parsexmltag(Rn[0]).Format||"General";break;case"Column":if(state[state.length-1][0]!=="Table")break;csty=parsexmltag(Rn[0]);cstys[csty.Index-1||cstys.length]=csty;for(var i=0;i<+csty.Span;++i)cstys[cstys.length]=csty;break;case"NamedRange":break;case"NamedCell":break;case"B":break;case"I":break;case"U":break;case"S":break;case"Sub":break;case"Sup":break;case"Span":break;case"Border":break;case"Alignment":break;case"Borders":break;case"Font":if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")ss+=str.slice(fidx,Rn.index);else fidx=Rn.index+Rn[0].length;break;case"Interior":break;case"Protection":break;case"Author":case"Title":case"Description":case"Created":case"Keywords":case"Subject":case"Category":case"Company":case"LastAuthor":case"LastSaved":case"LastPrinted":case"Version":case"Revision":case"TotalTime":case"HyperlinkBase":case"Manager":if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")xlml_set_prop(Props,Rn[3],str.slice(pidx,Rn.index));else pidx=Rn.index+Rn[0].length;break;case"Paragraphs":break;case"Styles":case"Workbook":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else state.push([Rn[3],false]);break;case"Comment":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp;xlml_clean_comment(comment);comments.push(comment)}else{state.push([Rn[3],false]);tmp=parsexmltag(Rn[0]);comment={a:tmp.Author}}break;case"Name":break;case"ComponentOptions":case"DocumentProperties":case"CustomDocumentProperties":case"OfficeDocumentSettings":case"PivotTable":case"PivotCache":case"Names":case"MapInfo":case"PageBreaks":case"QueryTable":case"DataValidation":case"AutoFilter":case"Sorting":case"Schema":case"data":case"ConditionalFormatting":case"SmartTagType":case"SmartTags":case"ExcelWorkbook":case"WorkbookOptions":case"WorksheetOptions":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else if(Rn[0].charAt(Rn[0].length-2)!=="/")state.push([Rn[3],true]);break;default:var seen=true;switch(state[state.length-1][0]){case"OfficeDocumentSettings":switch(Rn[3]){case"AllowPNG":break;case"RemovePersonalInformation":break;case"DownloadComponents":break;case"LocationOfComponents":break;case"Colors":break;case"Color":break;case"Index":break;case"RGB":break;case"PixelsPerInch":break;case"TargetScreenSize":break;case"ReadOnlyRecommended":break;default:seen=false}break;case"ComponentOptions":switch(Rn[3]){case"Toolbar":break;case"HideOfficeLogo":break;case"SpreadsheetAutoFit":break;case"Label":break;case"Caption":break;case"MaxHeight":break;case"MaxWidth":break;case"NextSheetNumber":break;default:seen=false}break;case"ExcelWorkbook":switch(Rn[3]){case"WindowHeight":break;case"WindowWidth":break;case"WindowTopX":break;case"WindowTopY":break;case"TabRatio":break;case"ProtectStructure":break;case"ProtectWindows":break;case"ActiveSheet":break;case"DisplayInkNotes":break;case"FirstVisibleSheet":break;case"SupBook":break;case"SheetName":break;case"SheetIndex":break;case"SheetIndexFirst":break;case"SheetIndexLast":break;case"Dll":break;case"AcceptLabelsInFormulas":break;case"DoNotSaveLinkValues":break;case"Date1904":break;case"Iteration":break;case"MaxIterations":break;case"MaxChange":break;case"Path":break;case"Xct":break;case"Count":break;case"SelectedSheets":break;case"Calculation":break;case"Uncalced":break;case"StartupPrompt":break;case"Crn":break;case"ExternName":break;case"Formula":break;case"ColFirst":break;case"ColLast":break;case"WantAdvise":break;case"Boolean":break;case"Error":break;case"Text":break;case"OLE":break;case"NoAutoRecover":break;case"PublishObjects":break;case"DoNotCalculateBeforeSave":break;case"Number":break;case"RefModeR1C1":break;case"EmbedSaveSmartTags":break;default:seen=false}break;case"WorkbookOptions":switch(Rn[3]){case"OWCVersion":break;case"Height":break;case"Width":break;default:seen=false}break;case"WorksheetOptions":switch(Rn[3]){case"Unsynced":break;case"Visible":break;case"Print":break;case"Panes":break;case"Scale":break;case"Pane":break;case"Number":break;case"Layout":break;case"Header":break;case"Footer":break;case"PageSetup":break;case"PageMargins":break;case"Selected":break;case"ProtectObjects":break;case"EnableSelection":break;case"ProtectScenarios":break;case"ValidPrinterInfo":break;case"HorizontalResolution":break;case"VerticalResolution":break;case"NumberofCopies":break;case"ActiveRow":break;case"ActiveCol":break;case"ActivePane":break;case"TopRowVisible":break;case"TopRowBottomPane":break;case"LeftColumnVisible":break;case"LeftColumnRightPane":break;case"FitToPage":break;case"RangeSelection":break;case"PaperSizeIndex":break;case"PageLayoutZoom":break;case"PageBreakZoom":break;case"FilterOn":break;case"DoNotDisplayGridlines":break;case"SplitHorizontal":break;case"SplitVertical":break;case"FreezePanes":break;case"FrozenNoSplit":break;case"FitWidth":break;case"FitHeight":break;case"CommentsLayout":break;case"Zoom":break;case"LeftToRight":break;case"Gridlines":break;case"AllowSort":break;case"AllowFilter":break;case"AllowInsertRows":break;case"AllowDeleteRows":break;case"AllowInsertCols":break;case"AllowDeleteCols":break;case"AllowInsertHyperlinks":break;case"AllowFormatCells":break;case"AllowSizeCols":break;case"AllowSizeRows":break;case"NoSummaryRowsBelowDetail":break;case"TabColorIndex":break;case"DoNotDisplayHeadings":break;case"ShowPageLayoutZoom":break;case"NoSummaryColumnsRightDetail":break;case"BlackAndWhite":break;case"DoNotDisplayZeros":break;case"DisplayPageBreak":break;case"RowColHeadings":break;case"DoNotDisplayOutline":break;case"NoOrientation":break;case"AllowUsePivotTables":break;case"ZeroHeight":break;case"ViewableRange":break;case"Selection":break;case"ProtectContents":break;default:seen=false}break;case"PivotTable":case"PivotCache":switch(Rn[3]){case"ImmediateItemsOnDrop":break;case"ShowPageMultipleItemLabel":break;case"CompactRowIndent":break;case"Location":break;case"PivotField":break;case"Orientation":break;case"LayoutForm":break;case"LayoutSubtotalLocation":break;case"LayoutCompactRow":break;case"Position":break;case"PivotItem":break;case"DataType":break;case"DataField":break;case"SourceName":break;case"ParentField":break;case"PTLineItems":break;case"PTLineItem":break;case"CountOfSameItems":break;case"Item":break;case"ItemType":break;case"PTSource":break;case"CacheIndex":break;case"ConsolidationReference":break;case"FileName":break;case"Reference":break;case"NoColumnGrand":break;case"NoRowGrand":break;case"BlankLineAfterItems":break;case"Hidden":break;case"Subtotal":break;case"BaseField":break;case"MapChildItems":break;case"Function":break;case"RefreshOnFileOpen":break;case"PrintSetTitles":break;case"MergeLabels":break;case"DefaultVersion":break;case"RefreshName":break;case"RefreshDate":break;case"RefreshDateCopy":break;case"VersionLastRefresh":break;case"VersionLastUpdate":break;case"VersionUpdateableMin":break;case"VersionRefreshableMin":break;case"Calculation":break;default:seen=false}break;case"PageBreaks":switch(Rn[3]){case"ColBreaks":break;case"ColBreak":break;case"RowBreaks":break;case"RowBreak":break;case"ColStart":break;case"ColEnd":break;case"RowEnd":break;default:seen=false}break;case"AutoFilter":switch(Rn[3]){case"AutoFilterColumn":break;case"AutoFilterCondition":break;case"AutoFilterAnd":break;case"AutoFilterOr":break;default:seen=false}break;case"QueryTable":switch(Rn[3]){case"Id":break;case"AutoFormatFont":break;case"AutoFormatPattern":break;case"QuerySource":break;case"QueryType":break;case"EnableRedirections":break;case"RefreshedInXl9":break;case"URLString":break;case"HTMLTables":break;case"Connection":break;case"CommandText":break;case"RefreshInfo":break;case"NoTitles":break;case"NextId":break;case"ColumnInfo":break;case"OverwriteCells":break;case"DoNotPromptForFile":break;case"TextWizardSettings":break;case"Source":break;case"Number":break;case"Decimal":break;case"ThousandSeparator":break;case"TrailingMinusNumbers":break;case"FormatSettings":break;case"FieldType":break;case"Delimiters":break;case"Tab":break;case"Comma":break;case"AutoFormatName":break;case"VersionLastEdit":break;case"VersionLastRefresh":break;default:seen=false}break;case"Sorting":case"ConditionalFormatting":case"DataValidation":switch(Rn[3]){case"Range":break;case"Type":break;case"Min":break;case"Max":break;case"Sort":break;case"Descending":break;case"Order":break;case"CaseSensitive":break;case"Value":break;case"ErrorStyle":break;case"ErrorMessage":break;case"ErrorTitle":break;case"CellRangeList":break;case"InputMessage":break;case"InputTitle":break;case"ComboHide":break;case"InputHide":break;case"Condition":break;case"Qualifier":break;case"UseBlank":break;case"Value1":break;case"Value2":break;case"Format":break;default:seen=false}break;case"MapInfo":case"Schema":case"data":switch(Rn[3]){case"Map":break;case"Entry":break;case"Range":break;case"XPath":break;case"Field":break;case"XSDType":break;case"FilterOn":break;case"Aggregate":break;case"ElementType":break;case"AttributeType":break;case"schema":case"element":case"complexType":case"datatype":case"all":case"attribute":case"extends":break;case"row":break;default:seen=false}break;case"SmartTags":break;default:seen=false;break}if(seen)break;if(!state[state.length-1][1])throw"Unrecognized tag: "+Rn[3]+"|"+state.join("|");if(state[state.length-1][0]==="CustomDocumentProperties"){if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")xlml_set_custprop(Custprops,Rn,cp,str.slice(pidx,Rn.index));else{cp=Rn;pidx=Rn.index+Rn[0].length}break}if(opts.WTF)throw"Unrecognized tag: "+Rn[3]+"|"+state.join("|")}var out={};if(!opts.bookSheets&&!opts.bookProps)out.Sheets=sheets;out.SheetNames=sheetnames;out.SSF=SSF.get_table();out.Props=Props;out.Custprops=Custprops;return out}function parse_xlml(data,opts){fixopts(opts=opts||{});switch(opts.type||"base64"){case"base64":return parse_xlml_xml(Base64.decode(data),opts);case"binary":case"buffer":case"file":return parse_xlml_xml(data,opts);case"array":return parse_xlml_xml(data.map(_chr).join(""),opts)}}function write_xlml(wb,opts){}var fs;if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){fs=require("fs")}}function firstbyte(f,o){switch((o||{}).type||"base64"){case"buffer":return f[0];case"base64":return Base64.decode(f.substr(0,12)).charCodeAt(0);case"binary":return f.charCodeAt(0);case"array":return f[0];default:throw new Error("Unrecognized type "+o.type)}}function xlsread(f,o){if(!o)o={};if(!o.type)o.type=has_buf&&Buffer.isBuffer(f)?"buffer":"base64";switch(firstbyte(f,o)){case 208:return parse_xlscfb(CFB.read(f,o),o);case 60:return parse_xlml(f,o);default:throw"Unsupported file"}}var readFile=function(f,o){var d=fs.readFileSync(f);if(!o)o={};switch(firstbyte(d,{type:"buffer"})){case 208:return parse_xlscfb(CFB.read(d,{type:"buffer"}),o);case 60:return parse_xlml(d,(o.type="buffer",o));default:throw"Unsupported file"}};function writeSync(wb,opts){var o=opts||{};switch(o.bookType){case"xml":return write_xlml(wb,o);default:throw"unsupported output format "+o.bookType}}function writeFileSync(wb,filename,opts){var o=opts|{};o.type="file";o.file=filename;switch(o.file.substr(-4).toLowerCase()){case".xls":o.bookType="xls";break;case".xml":o.bookType="xml";break}return writeSync(wb,o)}function shift_cell(cell,tgt){if(tgt.s){if(cell.cRel)cell.c+=tgt.s.c;if(cell.rRel)cell.r+=tgt.s.r}else{cell.c+=tgt.c;cell.r+=tgt.r}cell.cRel=cell.rRel=0;while(cell.c>=256)cell.c-=256;while(cell.r>=65536)cell.r-=65536;return cell}function shift_range(cell,range){cell.s=shift_cell(cell.s,range.s);cell.e=shift_cell(cell.e,range.s);return cell}function decode_row(rowstr){return parseInt(unfix_row(rowstr),10)-1}function encode_row(row){return""+(row+1)}function fix_row(cstr){return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2")}function unfix_row(cstr){return cstr.replace(/\$(\d+)$/,"$1")}function decode_col(colstr){var c=unfix_col(colstr),d=0,i=0;for(;i!==c.length;++i)d=26*d+c.charCodeAt(i)-64;return d-1}function encode_col(col){var s="";for(++col;col;col=Math.floor((col-1)/26))s=String.fromCharCode((col-1)%26+65)+s;return s}function fix_col(cstr){return cstr.replace(/^([A-Z])/,"$$$1")}function unfix_col(cstr){return cstr.replace(/^\$([A-Z])/,"$1")}function split_cell(cstr){return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(",")}function decode_cell(cstr){var splt=split_cell(cstr);return{c:decode_col(splt[0]),r:decode_row(splt[1])}}function encode_cell(cell){return encode_col(cell.c)+encode_row(cell.r)}function fix_cell(cstr){return fix_col(fix_row(cstr))}function unfix_cell(cstr){return unfix_col(unfix_row(cstr))}function decode_range(range){var x=range.split(":").map(decode_cell);return{s:x[0],e:x[x.length-1]}}function encode_range(cs,ce){if(ce===undefined||typeof ce==="number")return encode_range(cs.s,cs.e);if(typeof cs!=="string")cs=encode_cell(cs);if(typeof ce!=="string")ce=encode_cell(ce);return cs==ce?cs:cs+":"+ce}function safe_decode_range(range){var o={s:{c:0,r:0},e:{c:0,r:0}};var idx=0,i=0,cc=0;var len=range.length;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.s.c=--idx;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.s.r=--idx;if(i===len||range.charCodeAt(++i)===58){o.e.c=o.s.c;o.e.r=o.s.r;return o}for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.e.c=--idx;for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.e.r=--idx;return o}function safe_format_cell(cell,v){if(cell.z!==undefined)try{return cell.w=SSF.format(cell.z,v)}catch(e){}if(!cell.XF)return v;try{return cell.w=SSF.format(cell.XF.ifmt||0,v)}catch(e){return""+v}}function format_cell(cell,v){if(cell==null||cell.t==null)return"";if(cell.w!==undefined)return cell.w;if(v===undefined)return safe_format_cell(cell,cell.v);return safe_format_cell(cell,v)}function sheet_to_json(sheet,opts){var val,row,range,header=0,offset=1,r,hdr=[],isempty,R,C,v;var o=opts!=null?opts:{};var raw=o.raw;if(sheet==null||sheet["!ref"]==null)return[];range=o.range!==undefined?o.range:sheet["!ref"];if(o.header===1)header=1;else if(o.header==="A")header=2;else if(Array.isArray(o.header))header=3;switch(typeof range){case"string":r=safe_decode_range(range);break;case"number":r=safe_decode_range(sheet["!ref"]);r.s.r=range;break;default:r=range}if(header>0)offset=0;var rr=encode_row(r.s.r);var cols=new Array(r.e.c-r.s.c+1);var out=new Array(r.e.r-r.s.r-offset+1);var outi=0;for(C=r.s.c;C<=r.e.c;++C){cols[C]=encode_col(C);val=sheet[cols[C]+rr];switch(header){case 1:hdr[C]=C;break;case 2:hdr[C]=cols[C];break;case 3:hdr[C]=o.header[C-r.s.c];break;default:if(val===undefined)continue;hdr[C]=format_cell(val)}}for(R=r.s.r+offset;R<=r.e.r;++R){rr=encode_row(R);isempty=true;row=header===1?[]:Object.create({__rowNum__:R});for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];if(val===undefined||val.t===undefined)continue;v=val.v;switch(val.t){case"e":continue;case"s":case"str":break;case"b":case"n":break;default:throw"unrecognized type "+val.t}if(v!==undefined){row[hdr[C]]=raw?v:format_cell(val,v);isempty=false}}if(isempty===false)out[outi++]=row}out.length=outi;return out}function sheet_to_row_object_array(sheet,opts){return sheet_to_json(sheet,opts!=null?opts:{})}function sheet_to_csv(sheet,opts){var out="",txt="",qreg=/"/g;var o=opts==null?{}:opts;if(sheet==null||sheet["!ref"]==null)return"";var r=safe_decode_range(sheet["!ref"]);var FS=o.FS!==undefined?o.FS:",",fs=FS.charCodeAt(0);var RS=o.RS!==undefined?o.RS:"\n",rs=RS.charCodeAt(0);var row="",rr="",cols=[];var i=0,cc=0,val;var R=0,C=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(R=r.s.r;R<=r.e.r;++R){row="";rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];txt=val!==undefined?""+format_cell(val):"";for(i=0,cc=0;i!==txt.length;++i)if((cc=txt.charCodeAt(i))===fs||cc===rs||cc===34){txt='"'+txt.replace(qreg,'""')+'"';break}row+=(C===r.s.c?"":FS)+txt}out+=row+RS}return out}var make_csv=sheet_to_csv;function sheet_to_formulae(sheet){var cmds,y="",x,val="";if(sheet==null||sheet["!ref"]==null)return"";var r=safe_decode_range(sheet["!ref"]),rr="",cols=[],C;cmds=new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1));var i=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(var R=r.s.r;R<=r.e.r;++R){rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){y=cols[C]+rr;x=sheet[y];val="";if(x===undefined)continue;if(x.f!=null)val=x.f;else if(x.w!==undefined)val="'"+x.w;else if(x.v===undefined)continue;else val=""+x.v;cmds[i++]=y+"="+val}}cmds.length=i;return cmds}var utils={encode_col:encode_col,encode_row:encode_row,encode_cell:encode_cell,encode_range:encode_range,decode_col:decode_col,decode_row:decode_row,split_cell:split_cell,decode_cell:decode_cell,decode_range:decode_range,format_cell:format_cell,get_formulae:sheet_to_formulae,make_csv:sheet_to_csv,make_json:sheet_to_json,make_formulae:sheet_to_formulae,sheet_to_csv:sheet_to_csv,sheet_to_json:sheet_to_json,sheet_to_formulae:sheet_to_formulae,sheet_to_row_object_array:sheet_to_row_object_array};XLS.parse_xlscfb=parse_xlscfb;XLS.read=xlsread;XLS.readFile=readFile;XLS.utils=utils;XLS.CFB=CFB;XLS.SSF=SSF})(typeof exports!=="undefined"?exports:XLS);
25802 //@ sourceMappingURL=dist/xls.min.map 18563 //# sourceMappingURL=dist/xls.min.map
25803 /* xlsx.js (C) 2013-2014 SheetJS -- http://sheetjs.com */ 18564 /* xlsx.js (C) 2013-2014 SheetJS -- http://sheetjs.com */
25804 /* vim: set ts=2: */ 18565 /* vim: set ts=2: */
25805 /*jshint -W041 */ 18566 /*jshint -W041 */
25806 var XLSX = {}; 18567 var XLSX = {};
25807 (function(XLSX){ 18568 (function(XLSX){
39095 if (ieversion == 8) { 31856 if (ieversion == 8) {
39096 GeoTemConfig.ie8 = true; 31857 GeoTemConfig.ie8 = true;
39097 } 31858 }
39098 } 31859 }
39099 31860
39100 GeoTemConfig.quoteVal = function(val){
39101 return val.replace(new RegExp('"', 'g'), '%22');
39102
39103 }
39104
39105 GeoTemConfig.getIndependentId = function(target){ 31861 GeoTemConfig.getIndependentId = function(target){
39106 if( target == 'map' ){ 31862 if( target == 'map' ){
39107 return ++GeoTemConfig.independentMapId; 31863 return ++GeoTemConfig.independentMapId;
39108 } 31864 }
39109 if( target == 'time' ){ 31865 if( target == 'time' ){
39338 }; 32094 };
39339 32095
39340 GeoTemConfig.removeDataset = function(index){ 32096 GeoTemConfig.removeDataset = function(index){
39341 GeoTemConfig.datasets.splice(index,1); 32097 GeoTemConfig.datasets.splice(index,1);
39342 Publisher.Publish('filterData', GeoTemConfig.datasets, null); 32098 Publisher.Publish('filterData', GeoTemConfig.datasets, null);
39343 };
39344
39345 GeoTemConfig.removeAllDatasets = function() {
39346
39347 if (GeoTemConfig.datasets.length > 0) {
39348 GeoTemConfig.datasets.splice(0, GeoTemConfig.datasets.length);
39349 Publisher.Publish('filterData', GeoTemConfig.datasets, null);
39350 }
39351 }; 32099 };
39352 32100
39353 /** 32101 /**
39354 * converts the csv-file into json-format 32102 * converts the csv-file into json-format
39355 * 32103 *
40039 csvContent += ","; 32787 csvContent += ",";
40040 } 32788 }
40041 csvContent += "\""+val+"\""; 32789 csvContent += "\""+val+"\"";
40042 }); 32790 });
40043 //Names according to CSV import definition 32791 //Names according to CSV import definition
40044 csvContent += ",\"Address\",\"Latitude\",\"Longitude\",\"TimeStamp\",\"TimeSpan:begin\",\"TimeSpan:end\""; 32792 csvContent += ",\"Address\",\"Latitude\",\"Longitude\",\"TimeStamp\"";
40045 csvContent += "\n"; 32793 csvContent += "\n";
40046 32794
40047 var isFirstRow = true; 32795 var isFirstRow = true;
40048 $(GeoTemConfig.datasets[index].objects).each(function(){ 32796 $(GeoTemConfig.datasets[index].objects).each(function(){
40049 var elem = this; 32797 var elem = this;
40067 if (isFirst){ 32815 if (isFirst){
40068 isFirst = false; 32816 isFirst = false;
40069 } else { 32817 } else {
40070 csvContent += ","; 32818 csvContent += ",";
40071 } 32819 }
40072 csvContent += "\""+GeoTemConfig.quoteVal(elem.tableContent[val])+"\""; 32820 csvContent += "\""+elem.tableContent[val]+"\"";
40073 }); 32821 });
40074 32822
40075 csvContent += ","; 32823 csvContent += ",";
40076 csvContent += "\""; 32824 csvContent += "\"";
40077 if (elem.isGeospatial){ 32825 if (elem.isGeospatial){
40098 if ( (elem.isTemporal) && (typeof elem.getDate(0) !== "undefined") ){ 32846 if ( (elem.isTemporal) && (typeof elem.getDate(0) !== "undefined") ){
40099 //TODO: not supported in IE8 switch to moment.js 32847 //TODO: not supported in IE8 switch to moment.js
40100 csvContent += elem.getDate(0).toISOString(); 32848 csvContent += elem.getDate(0).toISOString();
40101 } 32849 }
40102 csvContent += "\""; 32850 csvContent += "\"";
40103
40104 csvContent += ",";
40105 if (elem.isFuzzyTemporal){
40106 //TODO: not supported in IE8 switch to moment.js
40107 csvContent += "\""+elem.TimeSpanBegin.format()+"\",\""+elem.TimeSpanEnd.format()+"\"";
40108 } else {
40109 csvContent += "\"\",\"\"";
40110 }
40111 }); 32851 });
40112 32852
40113 return(csvContent); 32853 return(csvContent);
40114 }; 32854 };
40115 /** 32855 /**
43552 } else if (zoom <= 8) { 36292 } else if (zoom <= 8) {
43553 return 2; 36293 return 2;
43554 } else { 36294 } else {
43555 return 3; 36295 return 3;
43556 } 36296 }
43557 }, 36297 }
43558
43559
43560 getConfig : function(inquiringWidget){
43561 var mapWidget = this;
43562 var config = {};
43563
43564 //save widget specific configurations here into the config object
43565 config.mapIndex = this.baselayerIndex;
43566 config.mapCenter = this.openlayersMap.center;
43567 config.mapZoom = this.openlayersMap.zoom;
43568 //send config to iquiring widget
43569 if (typeof inquiringWidget.sendConfig !== "undefined"){
43570 inquiringWidget.sendConfig({widgetName: "map", 'config': config});
43571 }
43572 },
43573
43574 setConfig : function(configObj){
43575 var mapWidget = this;
43576
43577 if (configObj.widgetName === "map"){
43578 var config = configObj.config;
43579
43580 //set widgets configuration provided by config
43581 this.setMap(config.mapIndex);
43582 this.gui.mapTypeDropdown.setEntry(config.mapIndex);
43583
43584 this.openlayersMap.setCenter(config.mapCenter);
43585 this.openlayersMap.zoomTo(config.mapZoom);
43586 }
43587 },
43588
43589 } 36298 }
43590 /* 36299 /*
43591 * TimeConfig.js 36300 * TimeConfig.js
43592 * 36301 *
43593 * Copyright (c) 2012, Stefan Jänicke. All rights reserved. 36302 * Copyright (c) 2012, Stefan Jänicke. All rights reserved.
45423 tableTab.onclick = function() { 38132 tableTab.onclick = function() {
45424 tableWidget.selectTable(index); 38133 tableWidget.selectTable(index);
45425 } 38134 }
45426 var tableNameDiv = document.createElement('div'); 38135 var tableNameDiv = document.createElement('div');
45427 $(tableNameDiv).append(name); 38136 $(tableNameDiv).append(name);
45428 $(tableNameDiv).dblclick(function() {
45429 var n = $(tableNameDiv).text();
45430 $(tableNameDiv).empty();
45431 var nameInput = $('<input type="text" name="nameinput" value="'+n+'" />');
45432 $(tableNameDiv).append(nameInput);
45433 $(nameInput).focus();
45434 $(nameInput).focusout(function() {
45435 var newname = $(nameInput).val();
45436 $(tableNameDiv).empty();
45437 $(tableNameDiv).append(newname);
45438 dataSet.label = newname;
45439 });
45440 $(nameInput).keypress(function(event) {
45441 if (event.which == 13) {
45442 var newname = $(nameInput).val();
45443 $(tableNameDiv).empty();
45444 $(tableNameDiv).append(newname);
45445 dataSet.label = newname;
45446 }
45447 });
45448 });
45449 38137
45450 if (typeof dataSet.url !== "undefined"){ 38138 if (typeof dataSet.url !== "undefined"){
45451 var tableLinkDiv = document.createElement('a'); 38139 var tableLinkDiv = document.createElement('a');
45452 tableLinkDiv.title = dataSet.url; 38140 tableLinkDiv.title = dataSet.url;
45453 tableLinkDiv.href = dataSet.url; 38141 tableLinkDiv.href = dataSet.url;
45793 if( this.tables.length > 0 ){ 38481 if( this.tables.length > 0 ){
45794 this.tables[this.activeTable].resetElements(); 38482 this.tables[this.activeTable].resetElements();
45795 this.tables[this.activeTable].reset(); 38483 this.tables[this.activeTable].reset();
45796 this.tables[this.activeTable].update(); 38484 this.tables[this.activeTable].update();
45797 } 38485 }
45798 }, 38486 }
45799
45800
45801 getConfig : function(inquiringWidget){
45802 var tableWidget = this;
45803 var config = {};
45804
45805 //save widget specific configurations here into the config object
45806
45807 //send config to iquiring widget
45808 if (typeof inquiringWidget.sendConfig !== "undefined"){
45809 inquiringWidget.sendConfig({widgetName: "table", 'config': config});
45810 }
45811 },
45812
45813 setConfig : function(configObj){
45814 var tableWidget = this;
45815
45816 if (configObj.widgetName === "table"){
45817 var config = configObj.config;
45818
45819 //set widgets configuration provided by config
45820
45821 }
45822 },
45823
45824 } 38487 }
45825 /* 38488 /*
45826 * Table.js 38489 * Table.js
45827 * 38490 *
45828 * Copyright (c) 2012, Stefan Jänicke. All rights reserved. 38491 * Copyright (c) 2012, Stefan Jänicke. All rights reserved.
49835 $(fuzzyTimeline.handles).each(function(){ 42498 $(fuzzyTimeline.handles).each(function(){
49836 var handle = this; 42499 var handle = this;
49837 handle.x1 = handle.x1 * (zoomFactor/oldZoomFactor); 42500 handle.x1 = handle.x1 * (zoomFactor/oldZoomFactor);
49838 handle.x2 = handle.x2 * (zoomFactor/oldZoomFactor); 42501 handle.x2 = handle.x2 * (zoomFactor/oldZoomFactor);
49839 }); 42502 });
49840 }, 42503 }
49841
49842 getConfig : function(inquiringWidget){
49843 var fuzzyTimeline = this;
49844 var config = {};
49845
49846 //create handle copy
49847 var handleCopy = JSON.parse( JSON.stringify( fuzzyTimeline.handles ) );
49848 config.handles = handleCopy;
49849
49850 config.viewMode = fuzzyTimeline.viewMode;
49851
49852 config.rangeDropdownVal = $(fuzzyTimeline.rangeSlider.rangeDropdown).val();
49853 config.rangeStartVal = $(fuzzyTimeline.rangeSlider.rangeStart).val();
49854
49855 //send config to iquiring widget
49856 if (typeof inquiringWidget.sendConfig !== "undefined"){
49857 inquiringWidget.sendConfig({widgetName: "fuzzyTimeline", 'config': config});
49858 }
49859 },
49860
49861 setConfig : function(configObj){
49862 var fuzzyTimeline = this;
49863
49864 if (configObj.widgetName === "fuzzyTimeline"){
49865 var config = configObj.config;
49866
49867 $(fuzzyTimeline.rangeSlider.rangeDropdown).val(config.rangeDropdownVal);
49868 $(fuzzyTimeline.rangeSlider.rangeDropdown).change();
49869 fuzzyTimeline.switchViewMode(config.viewMode);
49870
49871 $(fuzzyTimeline.rangeSlider.rangeStart).val(config.rangeStartVal);
49872 $(fuzzyTimeline.rangeSlider.rangeStart).change();
49873
49874 //clear handles
49875 fuzzyTimeline.clearHandles();
49876
49877 //create handle copy
49878 var handleCopy = JSON.parse( JSON.stringify( config.handles ) );
49879 fuzzyTimeline.handles = handleCopy;
49880
49881 // redraw handles
49882 fuzzyTimeline.drawHandles();
49883
49884 // select elements
49885 $(fuzzyTimeline.handles).each(function(){
49886 var handle = this;
49887 fuzzyTimeline.selectByX(handle.x1, handle.x2)
49888 });
49889 }
49890 },
49891 }; 42504 };
49892 /* 42505 /*
49893 * Overlayloader.js 42506 * Overlayloader.js
49894 * 42507 *
49895 * Copyright (c) 2013, Sebastian Kruse. All rights reserved. 42508 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
51988 elements.push(this); 44601 elements.push(this);
51989 }); 44602 });
51990 44603
51991 return elements; 44604 return elements;
51992 }, 44605 },
51993
51994 getConfig : function(inquiringWidget){
51995 var pieChartWidget = this;
51996 var config = {};
51997
51998 //save widget specific configurations here into the config object
51999 var pieCharts = [];
52000 for (var i=0; i < pieChartWidget.pieCharts.length; i++){
52001 pieChart = pieChartWidget.pieCharts[i];
52002
52003 if (!pieChart){
52004 continue;
52005 }
52006
52007 if (pieChart.selectionFunction.categories){
52008 pieCharts.push({
52009 watchColumn:pieChart.watchColumn,
52010 watchedDataset:pieChart.watchedDataset,
52011 type:pieChart.selectionFunction.type,
52012 categories:pieChart.selectionFunction.categories
52013 });
52014 } else {
52015 pieCharts.push({
52016 watchColumn:pieChart.watchColumn,
52017 watchedDataset:pieChart.watchedDataset
52018 });
52019 }
52020 }
52021
52022 config.pieCharts = pieCharts;
52023
52024 //send config to iquiring widget
52025 if (typeof inquiringWidget.sendConfig !== "undefined"){
52026 inquiringWidget.sendConfig({widgetName: "pieChart", 'config': config});
52027 }
52028 },
52029
52030 setConfig : function(configObj){
52031 var pieChartWidget = this;
52032
52033 if (configObj.widgetName === "pieChart"){
52034 var config = configObj.config;
52035
52036 //remove old piecharts
52037 pieChartWidget.pieCharts = [];
52038 //set widgets configuration provided by config
52039 for (var i=0; i < config.pieCharts.length; i++){
52040 pieChart = config.pieCharts[i];
52041
52042 if (pieChart.type){
52043 pieChartWidget.addCategorizedPieChart(
52044 pieChart.watchedDataset,
52045 pieChart.watchColumn,
52046 pieChart.type,
52047 pieChart.categories
52048 );
52049 } else {
52050 pieChartWidget.addPieChart(
52051 pieChart.watchedDataset,
52052 pieChart.watchColumn
52053 );
52054 }
52055 }
52056 }
52057 },
52058
52059 }; 44606 };
52060 /* 44607 /*
52061 * Storytelling.js 44608 * Storytelling.js
52062 * 44609 *
52063 * Copyright (c) 2013, Sebastian Kruse. All rights reserved. 44610 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
52405 highlightChanged : function(objects) { 44952 highlightChanged : function(objects) {
52406 }, 44953 },
52407 44954
52408 selectionChanged : function(selection) { 44955 selectionChanged : function(selection) {
52409 }, 44956 },
52410 };
52411 /*
52412 * Storytellingv2.js
52413 *
52414 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
52415 *
52416 * This library is free software; you can redistribute it and/or
52417 * modify it under the terms of the GNU Lesser General Public
52418 * License as published by the Free Software Foundation; either
52419 * version 3 of the License, or (at your option) any later version.
52420 *
52421 * This library is distributed in the hope that it will be useful,
52422 * but WITHOUT ANY WARRANTY; without even the implied warranty of
52423 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
52424 * Lesser General Public License for more details.
52425 *
52426 * You should have received a copy of the GNU Lesser General Public
52427 * License along with this library; if not, write to the Free Software
52428 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
52429 * MA 02110-1301 USA
52430 */
52431
52432 /**
52433 * @class Storytellingv2
52434 * Storytelling Version 2
52435 * @author Mike Bretschneider (mike.bretschneider@gmx.de)
52436 *
52437 * @param {HTML object} parent div to append the Storytellingv2 widget
52438 */
52439 function Storytellingv2(parent) {
52440
52441 this.index;
52442 this.storytellingv2 = this;
52443
52444 this.parent = parent;
52445 this.options = parent.options;
52446
52447 this.initialize();
52448 }
52449
52450 Storytellingv2.prototype = {
52451
52452
52453 deleteAllNodes : function(tree) {
52454 var nodes = tree.jstree().get_children_dom('#');
52455 nodes.each(function() {
52456 tree.jstree().delete_node(this);
52457 });
52458 },
52459
52460 findNodesByType : function(tree,type, parent) {
52461 if (parent != undefined) {
52462 parent = tree.jstree().get_node(parent);
52463 } else {
52464 parent = tree.jstree().get_node('#');
52465 }
52466 var nodes = new Array();
52467
52468 if (parent.type == type) {
52469 nodes.push(parent);
52470 }
52471 for (var i = 0; i < parent.children_d.length; i++) {
52472 var n = tree.jstree().get_node(parent.children_d[i]);
52473 if (n.type == type) {
52474 nodes.push(n);
52475 }
52476 }
52477
52478 return nodes;
52479 },
52480
52481
52482 handleFileSelect : function(evt) {
52483
52484 // var storytellingv2 = this;
52485
52486 var file = evt.target.files[0];
52487 var tree = $('#storytellingv2jstree');
52488
52489 var reader = new FileReader();
52490
52491 var deleteAllNodes = function(tree) {
52492 var nodes = tree.jstree().get_children_dom('#');
52493 nodes.each(function() {
52494 tree.jstree().delete_node(this);
52495 });
52496 }
52497
52498 reader.onload = (function(f) {
52499 return function(e) {
52500
52501 var treedata = JSON.parse(e.target.result);
52502 deleteAllNodes(tree);
52503 for (var i = 0; i < treedata.length; i++) {
52504 if (treedata[i].type == 'dataset') {
52505 tree.jstree().create_node(treedata[i].parent,treedata[i]);
52506 var n = tree.jstree().get_node(treedata[i].id);
52507 tree.jstree().set_type(n, 'snapshot');
52508 $('#storytellingv2expert').show();
52509 $('#storytellingv2simple').hide();
52510 } else if (treedata[i].type == 'snapshot') {
52511 treedata[i].type = 'dataset';
52512 tree.jstree().create_node(treedata[i].parent,treedata[i]);
52513 var n = tree.jstree().get_node(treedata[i].id);
52514 tree.jstree().set_type(n, 'snapshot');
52515 $('#storytellingv2expert').show();
52516 $('#storytellingv2simple').hide();
52517 } else {
52518 tree.jstree().create_node(treedata[i].parent,treedata[i]);
52519 }
52520 };
52521
52522 }
52523 })(file);
52524 reader.readAsText(file);
52525 },
52526
52527
52528 makeSimple : function(tree) {
52529 var configs = this.findNodesByType(tree,'config');
52530 var datasets = this.findNodesByType(tree,'dataset');
52531 for (var i = 0; i < datasets.length; i++) {
52532 tree.jstree().set_type(datasets[i], 'snapshot');
52533 datasets[i].li_attr.dataset_text = datasets[i].text;
52534 datasets[i].text = datasets[i].li_attr.snapshot_text || datasets[i].text;
52535 }
52536 for (var i = 0; i < configs.length; i++) {
52537 var c = tree.jstree().get_node(configs[i], true);
52538 $(c).hide();
52539 }
52540 },
52541
52542
52543
52544
52545
52546
52547
52548
52549 defaultSession : function(tree) {
52550 if (tree.jstree().is_leaf('#')) {
52551 tree.jstree().create_node('#', {
52552 'text' : 'Default Session',
52553 'type' : 'session',
52554 'li_attr' : {
52555 'timestamp' : Date.now(),
52556 'description' : 'Default Session'
52557 }
52558 })
52559 };
52560
52561 },
52562
52563 remove : function() {
52564 },
52565
52566 initialize : function() {
52567 },
52568
52569 triggerHighlight : function(columnElement) {
52570 },
52571
52572 triggerSelection : function(columnElement) {
52573 },
52574
52575 deselection : function() {
52576 },
52577
52578 filtering : function() {
52579 },
52580
52581 inverseFiltering : function() {
52582 },
52583
52584 triggerRefining : function() {
52585 },
52586
52587 reset : function() {
52588 },
52589
52590 show : function() {
52591 },
52592
52593 hide : function() {
52594 }
52595 };
52596 /*
52597 * Storytellingv2Config.js
52598 *
52599 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
52600 *
52601 * This library is free software; you can redistribute it and/or
52602 * modify it under the terms of the GNU Lesser General Public
52603 * License as published by the Free Software Foundation; either
52604 * version 3 of the License, or (at your option) any later version.
52605 *
52606 * This library is distributed in the hope that it will be useful,
52607 * but WITHOUT ANY WARRANTY; without even the implied warranty of
52608 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
52609 * Lesser General Public License for more details.
52610 *
52611 * You should have received a copy of the GNU Lesser General Public
52612 * License along with this library; if not, write to the Free Software
52613 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
52614 * MA 02110-1301 USA
52615 */
52616
52617 /**
52618 * @class Storytellingv2Config
52619 * Storytellingv2 Configuration File
52620 * @author Mike Bretschneider (mike.bretschneider@gmx.de)
52621 */
52622 function Storytellingv2Config(options) {
52623
52624 this.options = {
52625 dariahStorage : false,
52626 localStorage : true
52627 };
52628 if ( typeof options != 'undefined') {
52629 $.extend(this.options, options);
52630 }
52631
52632 };
52633 /*
52634 * Storytellingv2Gui.js
52635 *
52636 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
52637 *
52638 * This library is free software; you can redistribute it and/or
52639 * modify it under the terms of the GNU Lesser General Public
52640 * License as published by the Free Software Foundation; either
52641 * version 3 of the License, or (at your option) any later version.
52642 *
52643 * This library is distributed in the hope that it will be useful,
52644 * but WITHOUT ANY WARRANTY; without even the implied warranty of
52645 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
52646 * Lesser General Public License for more details.
52647 *
52648 * You should have received a copy of the GNU Lesser General Public
52649 * License along with this library; if not, write to the Free Software
52650 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
52651 * MA 02110-1301 USA
52652 */
52653
52654 /**
52655 * @class StorytellingGui
52656 * Storytellingv2 GUI Implementation
52657 * @author Mike Bretschneider (mike.bretschneider@gmx.de)
52658 *
52659 * @param {Storytellingv2Widget} parent Storytellingv2 widget object
52660 * @param {HTML object} div parent div to append the Storytellingv2 gui
52661 * @param {JSON} options Storytellingv2 configuration
52662 */
52663 function Storytellingv2Gui(storytellingv2, div, options) {
52664
52665 this.parent = storytellingv2;
52666 var storytellingv2Gui = this;
52667
52668 storytellingv2Gui.storytellingv2Container = document.createElement('div');
52669 $(div).append(storytellingv2Gui.storytellingv2Container);
52670 storytellingv2Gui.storytellingv2Container.style.position = 'relative';
52671 };
52672
52673 Storytellingv2Gui.prototype = {
52674
52675 initGui : function() {
52676
52677 var storytellingv2Gui = this;
52678 var storytellingv2Widget = storytellingv2Gui.parent;
52679 var storytellingv2 = storytellingv2Widget.storytellingv2;
52680
52681 if (storytellingv2Gui.tree == undefined) {
52682 storytellingv2Gui.initTree();
52683 }
52684 },
52685
52686 initTree : function() {
52687
52688 var storytellingv2Gui = this;
52689 var storytellingv2Widget = storytellingv2Gui.parent;
52690 var storytellingv2 = storytellingv2Widget.storytellingv2;
52691
52692 $(storytellingv2Gui.storytellingv2Container).empty();
52693
52694 storytellingv2Gui.tree = $('<div style="border: 2px solid; padding: 5px; float: left;" id="storytellingv2jstree"><ul></ul></div>');
52695 storytellingv2Gui.tree.jstree({
52696 'core' : {
52697 'check_callback' : true,
52698 },
52699 'plugins' : [ 'dnd', 'types' ],
52700 'types' : {
52701 '#' : {
52702 valid_children : ['session']
52703 },
52704 'session' : {
52705 valid_children : ['dataset', 'config']
52706 },
52707 'dataset' : {
52708 'valid_children' : ['config'],
52709 'icon' : 'lib/jstree/themes/default/dataset.png'
52710 },
52711 'snapshot' : {
52712 'valid_children' : ['config'],
52713 'icon' : 'lib/jstree/themes/default/snapshot.png'
52714 },
52715 'config' : {
52716 'valid_children' : ['config'],
52717 'icon' : 'lib/jstree/themes/default/filter.png'
52718 }
52719 }
52720 });
52721
52722 storytellingv2Gui.tree.on('open_node.jstree', function(e, data) {
52723 var node = data.node;
52724 if (node.type == 'snapshot') {
52725 storytellingv2Gui.tree.jstree().close_node(node, false);
52726 }
52727
52728 });
52729
52730 storytellingv2Gui.menu = $('<div style="float: left;"></div>');
52731 storytellingv2Gui.importexportsubmenu = $('<div style="border: 2px solid; margin: 2px; padding: 5px;"></div>');
52732
52733 storytellingv2Gui.addImportButton();
52734 storytellingv2Gui.addExportButton();
52735 storytellingv2Gui.addResetButton();
52736 storytellingv2Gui.addExpertButton();
52737 storytellingv2Gui.addSimpleButton();
52738
52739 storytellingv2Gui.simplebutton.hide();
52740 $(storytellingv2Gui.importexportsubmenu).append(storytellingv2Gui.importbutton);
52741 $(storytellingv2Gui.importexportsubmenu).append(storytellingv2Gui.exportbutton);
52742 $(storytellingv2Gui.importexportsubmenu).append(storytellingv2Gui.resetbutton);
52743 $(storytellingv2Gui.importexportsubmenu).append(storytellingv2Gui.expertbutton);
52744 $(storytellingv2Gui.importexportsubmenu).append(storytellingv2Gui.simplebutton);
52745 $(storytellingv2Gui.importexportsubmenu).append(storytellingv2Gui.importfile);
52746
52747 storytellingv2Gui.treemanipulationsubmenu = $('<div style="border: 2px solid; margin: 2px; padding: 5px;"></div>');
52748
52749 storytellingv2Gui.addNewButton();
52750 storytellingv2Gui.addSnapshotButton();
52751 storytellingv2Gui.addRestoreButton();
52752 storytellingv2Gui.addDeleteButton();
52753 storytellingv2Gui.addEditButton();
52754 storytellingv2Gui.addBackwardButton();
52755 storytellingv2Gui.addForwardButton();
52756
52757 $(storytellingv2Gui.treemanipulationsubmenu).append(storytellingv2Gui.newbutton);
52758 $(storytellingv2Gui.treemanipulationsubmenu).append(storytellingv2Gui.snapshotbutton);
52759 $(storytellingv2Gui.treemanipulationsubmenu).append(storytellingv2Gui.restorebutton);
52760 $(storytellingv2Gui.treemanipulationsubmenu).append(storytellingv2Gui.deletebutton);
52761 $(storytellingv2Gui.treemanipulationsubmenu).append(storytellingv2Gui.editbutton);
52762 $(storytellingv2Gui.treemanipulationsubmenu).append(storytellingv2Gui.backwardbutton);
52763 $(storytellingv2Gui.treemanipulationsubmenu).append(storytellingv2Gui.forwardbutton);
52764
52765 storytellingv2Gui.addMetadata();
52766
52767 storytellingv2Gui.newbutton.hide();
52768 $(storytellingv2Gui.storytellingv2Container).append(storytellingv2Gui.tree);
52769 $(storytellingv2Gui.menu).append(storytellingv2Gui.importexportsubmenu);
52770 $(storytellingv2Gui.menu).append(storytellingv2Gui.treemanipulationsubmenu);
52771 $(storytellingv2Gui.menu).append(storytellingv2Gui.metadata);
52772 $(storytellingv2Gui.storytellingv2Container).append(storytellingv2Gui.menu);
52773
52774 storytellingv2Gui.tree.hide();
52775 storytellingv2Gui.metadata.hide();
52776
52777 storytellingv2Gui.tree.on('create_node.jstree delete_node.jstree', function(e, data) {
52778 var root = storytellingv2Gui.tree.jstree().get_node('#');
52779 if (root.children.length > 0) {
52780 storytellingv2Gui.tree.show();
52781 storytellingv2Gui.metadata.show();
52782 if (e.type == "create_node") {
52783 storytellingv2Gui.tree.jstree().deselect_all();
52784 storytellingv2Gui.tree.jstree().select_node(data.node);
52785 } if (e.type == "delete_node") {
52786 storytellingv2Gui.tree.jstree().deselect_all();
52787 var prev_node = storytellingv2Gui.tree.jstree().get_prev_dom(data.node);
52788 storytellingv2Gui.tree.jstree().select_node(prev_node);
52789 }
52790 } else {
52791 storytellingv2Gui.tree.hide();
52792 storytellingv2Gui.metadata.hide();
52793 }
52794
52795 });
52796
52797 if (localStorage.getItem('PLATIN.storytellingv2.last_snapshot')) {
52798 var lastSession = storytellingv2Gui.tree.jstree().create_node('#', {
52799 'text' : 'Last Session',
52800 'type' : 'session',
52801 'li_attr' : {
52802 'timestamp' : Date.now(),
52803 'description' : 'Default Session'
52804 }
52805 });
52806 var nodes = JSON.parse(localStorage.getItem('PLATIN.storytellingv2.last_snapshot'));
52807 var last = storytellingv2Gui.tree.jstree().create_node(lastSession, nodes);
52808 storytellingv2.makeSimple(storytellingv2Gui.tree);
52809
52810 }
52811
52812 },
52813
52814 addImportButton : function() {
52815
52816 var storytellingv2Gui = this;
52817 var storytellingv2Widget = storytellingv2Gui.parent;
52818 var storytellingv2 = storytellingv2Widget.storytellingv2;
52819
52820 storytellingv2Gui.importbutton = $('<input type="button" id="storytellingv2import" name="import" value="import" />');
52821 storytellingv2Gui.importfile = $('<input type="file" id="storytellingv2importfile" accept="application/json" style="display: block; visibility:hidden; width: 0; height: 0" />');
52822 storytellingv2Gui.importfile.change(storytellingv2.handleFileSelect);
52823
52824 storytellingv2Gui.importbutton.click($.proxy(function() {
52825 storytellingv2Gui.importfile.click();
52826 }));
52827
52828 },
52829
52830 addExportButton : function() {
52831
52832 var storytellingv2Gui = this;
52833 var storytellingv2Widget = storytellingv2Gui.parent;
52834 var storytellingv2 = storytellingv2Widget.storytellingv2;
52835
52836 storytellingv2Gui.exportbutton = $('<input type="button" id="storytellingv2export" name="export" value="export" />');
52837 var dialog = $('<div id="tree-export-filename" title="Save File As?"><p><input type="text" size="25" /></p></div>');
52838 storytellingv2Gui.exportbutton.append(dialog);
52839 dialog.dialog({
52840 resizable: false,
52841 autoOpen: false,
52842 height: 220,
52843 modal: true,
52844 buttons: {
52845 'Ok': function() {
52846 $(this).dialog("close");
52847 },
52848 Cancel: function() {
52849 $(this).dialog("close");
52850 }
52851 }
52852 });
52853 storytellingv2Gui.exportbutton.click($.proxy(function() {
52854 var tree_as_json = JSON.stringify($('#storytellingv2jstree').jstree(true).get_json('#', { 'flat': true }));
52855 var exportdate = new Date().toUTCString();
52856
52857 dialog.dialog('open');
52858 $(dialog).find(':input').val("Storytelling State(" + exportdate + ").json");
52859 dialog.dialog('option', 'buttons', {
52860 'Ok': function() {
52861 var blob = new Blob([tree_as_json], {type: "text/plain;charset=utf-8"});
52862 saveAs(blob, dialog.find(':input').val());
52863 $(this).dialog("close");
52864 },
52865 Cancel: function() {
52866 $(this).dialog("close");
52867 }
52868 })
52869 // var blob = new Blob([tree_as_json], {type: "text/plain;charset=utf-8"});
52870 // saveAs(blob, "Storytelling State(" + exportdate + ").json");
52871
52872 /*
52873 var pom = document.createElement('a');
52874 pom.setAttribute('href','data:application/json;charset=UTF-8, ' + encodeURIComponent(tree_as_json));
52875 pom.setAttribute('download','Storytelling State(' + exportdate + ').json');
52876 pom.click();
52877 */
52878 }));
52879
52880 },
52881
52882 addResetButton : function() {
52883
52884 var storytellingv2Gui = this;
52885 var storytellingv2Widget = storytellingv2Gui.parent;
52886 var storytellingv2 = storytellingv2Widget.storytellingv2;
52887
52888 storytellingv2Gui.resetbutton = $('<input type="button" id="storytellingv2reset" name="reset" value="reset" />');
52889 var dialog = $('<div id="tree-reset-dialog-confirm" title="Erase all tree content?"><p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>Tree items will be permanently deleted and cannot be recovered. Are you sure?</p></div>');
52890 storytellingv2Gui.resetbutton.append(dialog)
52891 dialog.dialog({
52892 resizable: false,
52893 autoOpen: false,
52894 height: 260,
52895 modal: true,
52896 buttons: {
52897 'Yes': function() {
52898 storytellingv2.deleteAllNodes(storytellingv2Gui.tree);
52899 $(this).dialog("close");
52900 },
52901 Cancel: function() {
52902 $(this).dialog("close");
52903 }
52904 }
52905 });
52906
52907 storytellingv2Gui.resetbutton.click($.proxy(function() {
52908 dialog.dialog('open');
52909 }));
52910 },
52911
52912 addExpertButton : function() {
52913
52914 var storytellingv2Gui = this;
52915 var storytellingv2Widget = storytellingv2Gui.parent;
52916 var storytellingv2 = storytellingv2Widget.storytellingv2;
52917
52918 storytellingv2Gui.expertbutton = $('<input type="button" id="storytellingv2expert" name="expert" value="expert" />');
52919 storytellingv2Gui.expertbutton.click($.proxy(function() {
52920 storytellingv2Gui.expertbutton.hide();
52921 storytellingv2Gui.simplebutton.show();
52922 storytellingv2Gui.snapshotbutton.hide();
52923 storytellingv2Gui.newbutton.show();
52924 storytellingv2Gui.parent.simplemode = false;
52925 var configs = storytellingv2.findNodesByType(storytellingv2Gui.tree,'config');
52926 for (var i = 0; i < configs.length; i++) {
52927 storytellingv2Gui.tree.jstree().get_node(configs[i], true).show();
52928 }
52929 var snapshots = storytellingv2.findNodesByType(storytellingv2Gui.tree,'snapshot');
52930 for (var i = 0; i < snapshots.length; i++) {
52931 storytellingv2Gui.tree.jstree().set_type(snapshots[i], 'dataset');
52932 snapshots[i].li_attr.snapshot_text = snapshots[i].text;
52933 snapshots[i].text = snapshots[i].li_attr.dataset_text || snapshots[i].text;
52934 }
52935
52936 }));
52937
52938 },
52939
52940 addSimpleButton : function() {
52941
52942 var storytellingv2Gui = this;
52943 var storytellingv2Widget = storytellingv2Gui.parent;
52944 var storytellingv2 = storytellingv2Widget.storytellingv2;
52945
52946 storytellingv2Gui.simplebutton = $('<input type="button" id="storytellingv2simple" name="simple" value="simple" />');
52947 storytellingv2Gui.simplebutton.click($.proxy(function() {
52948 storytellingv2Gui.simplebutton.hide();
52949 storytellingv2Gui.expertbutton.show();
52950 storytellingv2Gui.newbutton.hide();
52951 storytellingv2Gui.snapshotbutton.show();
52952 storytellingv2Gui.parent.simplemode = true;
52953 storytellingv2.makeSimple(storytellingv2Gui.tree);
52954 }));
52955
52956 },
52957
52958 addNewButton : function() {
52959
52960 var storytellingv2Gui = this;
52961 var storytellingv2Widget = storytellingv2Gui.parent;
52962 var storytellingv2 = storytellingv2Widget.storytellingv2;
52963
52964 storytellingv2Gui.newbutton = $('<input type="button" id="storytellingv2new" name="new" value="new" />');
52965 storytellingv2Gui.newbutton.click($.proxy(function() {
52966 storytellingv2.defaultSession(storytellingv2Gui.tree);
52967 var newform = $('<div></div>');
52968 var nameinput = $('<p>Name: <input type="text" /></p>');
52969 var typeinput = $('<p>Type: <select name="type"><option value="session">Session</option><option value="dataset">Dataset</option><option value="config">Config</option></select></p>');
52970 var descriptioninput = $('<p>Description: <textarea name="description"></textarea></p>');
52971 var addbutton = $('<p><input type="button" name="add" value="add" /></p>');
52972 newform.focusout(function() {
52973 var elem = $(this);
52974 setTimeout(function() {
52975 var hasFocus = !!(elem.find(':focus').length > 0);
52976 if (! hasFocus) {
52977 newform.empty();
52978 }
52979 }, 10);
52980 });
52981 addbutton.click($.proxy(function() {
52982 var sel = storytellingv2Gui.tree.jstree().get_selected()[0] || '#' ;
52983 if ($(typeinput).find('option:selected').val() == 'session') {
52984 sel = '#';
52985 }
52986 sel = storytellingv2Gui.tree.jstree().create_node(sel, {
52987 "text" : $(nameinput).find(':text').first().val(),
52988 "type" : $(typeinput).find('option:selected').val(),
52989 "li_attr" : {
52990 "timestamp" : Date.now(),
52991 "description" : $(descriptioninput).find('textarea').first().val()
52992 }
52993 });
52994 var newNode = storytellingv2Gui.tree.jstree().get_node(sel);
52995
52996 if (newNode.type == 'config') {
52997 Publisher.Publish('getConfig',storytellingv2Widget);
52998 newNode.li_attr.configs = storytellingv2Widget.configArray.slice();
52999 } else if (newNode.type == 'dataset') {
53000 var datasets = [];
53001 if (storytellingv2Widget.datasets != undefined) {
53002 for (var i = 0; i < storytellingv2Widget.datasets.length; i++) {
53003 var ds = {};
53004 ds.label = storytellingv2Widget.datasets[i].label;
53005 ds.objects = GeoTemConfig.convertCsv(GeoTemConfig.createCSVfromDataset(i));
53006 datasets.push(ds);
53007 }
53008 }
53009 newNode.li_attr.selected = storytellingv2Widget.selected;
53010 newNode.li_attr.datasets = datasets;
53011 }
53012 // tree.jstree().set_type(sel, 'session');
53013 $(newform).empty();
53014 }));
53015 $(newform).append(nameinput);
53016 $(newform).append(typeinput);
53017 $(newform).append(descriptioninput);
53018 $(newform).append(addbutton);
53019 $(storytellingv2Gui.treemanipulationsubmenu).append(newform);
53020 $(nameinput).find(':input').focus();
53021 }));
53022
53023 },
53024
53025 addSnapshotButton : function() {
53026
53027 var storytellingv2Gui = this;
53028 var storytellingv2Widget = storytellingv2Gui.parent;
53029 var storytellingv2 = storytellingv2Widget.storytellingv2;
53030
53031 storytellingv2Gui.snapshotbutton = $('<input type="button" id="storytellingv2snapshot" name="snapshot" value="snapshot" />');
53032 storytellingv2Gui.snapshotbutton.click($.proxy(function() {
53033 storytellingv2.defaultSession(storytellingv2Gui.tree);
53034 var root = storytellingv2Gui.tree.jstree().get_node('#');
53035 var session = storytellingv2Gui.tree.jstree().get_node(root.children[0]);
53036 var countSnapshots = session.children.length + 1;
53037 var datasets = [];
53038
53039 if (storytellingv2Widget.datasets != undefined) {
53040 for (var i = 0; i < storytellingv2Widget.datasets.length; i++) {
53041 var ds = {};
53042 ds.label = storytellingv2Widget.datasets[i].label;
53043 ds.objects = GeoTemConfig.convertCsv(GeoTemConfig.createCSVfromDataset(i));
53044 datasets.push(ds);
53045 }
53046 }
53047 var newDataset = storytellingv2Gui.tree.jstree().create_node(session, {
53048 'text' : 'Snapshot #'+countSnapshots,
53049 'type' : 'dataset',
53050 'li_attr' : {
53051 'timestamp' : Date.now(),
53052 'description' : 'Snapshot #'+countSnapshots+' Dataset',
53053 'datasets' : datasets,
53054 'selected' : storytellingv2Widget.selected
53055 }
53056 });
53057 Publisher.Publish('getConfig',storytellingv2Widget);
53058 var newConfig = storytellingv2Gui.tree.jstree().create_node(newDataset, {
53059 'text' : 'Snapshot #'+countSnapshots,
53060 'type' : 'config',
53061 'li_attr' : {
53062 'timestamp' : Date.now(),
53063 'description' : 'Snapshot #'+countSnapshots+' Config',
53064 'configs' : storytellingv2Widget.configArray.slice()
53065 }
53066 });
53067 snapshot_as_json = JSON.stringify(storytellingv2Gui.tree.jstree(true).get_json(newDataset));
53068 localStorage.setItem("PLATIN.storytellingv2.last_snapshot",snapshot_as_json);
53069 storytellingv2.makeSimple(storytellingv2Gui.tree);
53070
53071 }));
53072
53073 },
53074
53075 addRestoreButton : function() {
53076
53077 var storytellingv2Gui = this;
53078 var storytellingv2Widget = storytellingv2Gui.parent;
53079 var storytellingv2 = storytellingv2Widget.storytellingv2;
53080
53081 storytellingv2Gui.restorebutton = $('<input type="button" id="storytellingv2restore" name="restore" value="restore" />');
53082 var loadDataset = function(node) {
53083 var datasets = node.li_attr.datasets;
53084 if (datasets != undefined) {
53085 GeoTemConfig.removeAllDatasets();
53086 for (var i = 0; i < datasets.length; i++) {
53087 var dataset = new Dataset(GeoTemConfig.loadJson(datasets[i].objects), datasets[i].label);
53088 GeoTemConfig.addDataset(dataset);
53089 }
53090 }
53091
53092 }
53093
53094 var loadFilter = function(node) {
53095 var configArray = node.li_attr.configs;
53096 for (var i = 0; i < configArray.length; i++) {
53097 Publisher.Publish('setConfig', configArray[i]);
53098 }
53099 }
53100
53101 var loadSnapshot = function(node) {
53102 loadDataset(node);
53103 var childNode = node;
53104 while (storytellingv2Gui.tree.jstree().is_parent(childNode)) {
53105 childNode = storytellingv2Gui.tree.jstree().get_node(childNode.children[0]);
53106 if (childNode.type == 'config') {
53107 loadFilter(childNode);
53108 }
53109 }
53110 }
53111
53112 storytellingv2Gui.restorebutton.click($.proxy(function() {
53113 var selectedNode = storytellingv2Gui.tree.jstree().get_node(storytellingv2Gui.tree.jstree().get_selected()[0]);
53114 if (selectedNode == 'undefined' || selectedNode.type == 'session') {
53115 return;
53116 }
53117 if (selectedNode.type == 'snapshot') {
53118 loadSnapshot(selectedNode);
53119 return;
53120 }
53121 for (var i = selectedNode.parents.length - 1; i >= 0; i--) {
53122 var curNode = storytellingv2Gui.tree.jstree().get_node(selectedNode.parents[i]);
53123 if (curNode.type == 'dataset') {
53124 loadDataset(curNode);
53125 } else if (curNode.type == 'config') {
53126 loadFilter(curNode);
53127 }
53128 }
53129 if (selectedNode.type == 'dataset') {
53130 loadDataset(selectedNode);
53131 } else if (selectedNode.type == 'config') {
53132 loadFilter(selectedNode);
53133 }
53134 }));
53135
53136 },
53137
53138 addDeleteButton : function() {
53139
53140 var storytellingv2Gui = this;
53141 var storytellingv2Widget = storytellingv2Gui.parent;
53142 var storytellingv2 = storytellingv2Widget.storytellingv2;
53143
53144 storytellingv2Gui.deletebutton = $('<input type="button" id="storytellingv2delete" name="delete" value="delete" />');
53145 storytellingv2Gui.deletebutton.click($.proxy(function() {
53146 var selectedNode = storytellingv2Gui.tree.jstree().get_node(storytellingv2Gui.tree.jstree().get_selected()[0]);
53147 storytellingv2Gui.tree.jstree().delete_node(selectedNode);
53148 }))
53149
53150 },
53151
53152 addEditButton : function() {
53153
53154 var storytellingv2Gui = this;
53155 var storytellingv2Widget = storytellingv2Gui.parent;
53156 var storytellingv2 = storytellingv2Widget.storytellingv2;
53157
53158 storytellingv2Gui.editbutton = $('<input type="button" id="storytellingv2edit" name="edit" value="edit" />');
53159 storytellingv2Gui.editbutton.click($.proxy(function() {
53160 var sel = storytellingv2Gui.tree.jstree().get_selected()[0];
53161 if (sel != undefined ) {
53162 sel = storytellingv2Gui.tree.jstree().get_node(sel);
53163 var editform = $('<div></div>');
53164 var nameinput = $('<p>Name: <input type="text" value="'+sel.text+'" /></p>');
53165 var descriptioninput = $('<p>Description: <textarea name="description">'+sel.li_attr.description+'</textarea></p>');
53166 var savebutton = $('<p><input type="button" name="save" value="save" /></p>');
53167 editform.focusout(function() {
53168 var elem = $(this);
53169 setTimeout(function() {
53170 var hasFocus = !!(elem.find(':focus').length > 0);
53171 if (! hasFocus) {
53172 editform.empty();
53173 }
53174 }, 10);
53175 });
53176 savebutton.click($.proxy(function() {
53177 storytellingv2Gui.tree.jstree().rename_node(sel, $(nameinput).find(':text').first().val());
53178 sel.li_attr.description = $(descriptioninput).find('textarea').first().val();
53179 storytellingv2Gui.tree.jstree().redraw();
53180 $(editform).empty();
53181 }));
53182 // $(editform).focusout(function() {
53183 // $(editform).empty();
53184 // });
53185 $(editform).append(nameinput);
53186 $(editform).append(descriptioninput);
53187 $(editform).append(savebutton);
53188 storytellingv2Gui.treemanipulationsubmenu.append(editform);
53189 nameinput.find(':input').focus();
53190 }
53191
53192
53193 }));
53194
53195 },
53196
53197 addForwardButton : function() {
53198
53199 var storytellingv2Gui = this;
53200 var storytellingv2Widget = storytellingv2Gui.parent;
53201 var storytellingv2 = storytellingv2Widget.storytellingv2;
53202
53203 storytellingv2Gui.forwardbutton = $('<input type="button" id="storytellingv2forward" name="forward" value=">>" />');
53204 storytellingv2Gui.forwardbutton.click($.proxy(function() {
53205 var sel = storytellingv2Gui.tree.jstree().get_selected()[0];
53206 if (storytellingv2Gui.tree.jstree().get_next_dom(sel, true)) {
53207 storytellingv2Gui.tree.jstree().deselect_node(sel);
53208 storytellingv2Gui.tree.jstree().select_node(storytellingv2Gui.tree.jstree().get_next_dom(sel, true));
53209 }
53210
53211 }));
53212
53213 },
53214
53215 addBackwardButton : function() {
53216
53217 var storytellingv2Gui = this;
53218 var storytellingv2Widget = storytellingv2Gui.parent;
53219 var storytellingv2 = storytellingv2Widget.storytellingv2;
53220
53221 storytellingv2Gui.backwardbutton = $('<input type="button" id="storytellingv2backward" name="backward" value="<<" />');
53222 storytellingv2Gui.backwardbutton.click($.proxy(function() {
53223 var sel = storytellingv2Gui.tree.jstree().get_selected()[0];
53224 if (storytellingv2Gui.tree.jstree().get_prev_dom(sel, true)) {
53225 storytellingv2Gui.tree.jstree().deselect_node(sel);
53226 storytellingv2Gui.tree.jstree().select_node(storytellingv2Gui.tree.jstree().get_prev_dom(sel, true));
53227 }
53228
53229 }));
53230
53231
53232 },
53233
53234 addMetadata : function() {
53235
53236 var storytellingv2Gui = this;
53237 var storytellingv2Widget = storytellingv2Gui.parent;
53238 var storytellingv2 = storytellingv2Widget.storytellingv2;
53239
53240 storytellingv2Gui.metadata = $('<div></div>');
53241 var metadatafieldset = $('<fieldset style="border: 2px solid; margin: 2px; padding: 5px;"><legend>Metadata</legend></fieldset>');
53242 var metadataname = $('<p>Name:</p>');
53243 var metadatatype = $('<p>Type:</p>');
53244 var metadatatimestamp = $('<p>Timestamp:</p>');
53245 var metadatadescription = $('<p>Description:</p>');
53246 var metadataselected = $('<p></p>');
53247 $(metadatafieldset).append(metadataname);
53248 $(metadatafieldset).append(metadatatype);
53249 $(metadatafieldset).append(metadatatimestamp);
53250 $(metadatafieldset).append(metadatadescription);
53251 $(metadatafieldset).append(metadataselected);
53252 $(storytellingv2Gui.metadata).append(metadatafieldset);
53253 storytellingv2Gui.tree.on('changed.jstree rename_node.jstree', function(e, data) {
53254 if (data.node == undefined) {
53255 return;
53256 }
53257 $(metadataname).empty().append($('<p>Name: '+data.node.text+'</p>'));
53258 $(metadatatype).empty().append($('<p>Type: '+data.node.type+'</p>'));
53259 var tstamp = new Date(data.node.li_attr.timestamp);
53260 $(metadatatimestamp).empty().append($('<p>Timestamp: '+tstamp.toUTCString()+'</p>'));
53261 $(metadatadescription).empty().append($('<p>Description: '+data.node.li_attr.description+'</p>'));
53262 var objectcount = 0;
53263 var datasetcount = 0;
53264 if ($.isArray(data.node.li_attr.selected)) {
53265 datasetcount = data.node.li_attr.selected.length;
53266 $(data.node.li_attr.selected).each(function() {
53267 objectcount += this.length;
53268 });
53269 }
53270 // $(metadataselected).empty().append($('<p>'+objectcount+' Selected Objects in '+datasetcount+' Datasets</p>'));
53271 });
53272
53273 }
53274
53275
53276 };
53277 /*
53278 * StorytellingWidget.js
53279 *
53280 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
53281 *
53282 * This library is free software; you can redistribute it and/or
53283 * modify it under the terms of the GNU Lesser General Public
53284 * License as published by the Free Software Foundation; either
53285 * version 3 of the License, or (at your option) any later version.
53286 *
53287 * This library is distributed in the hope that it will be useful,
53288 * but WITHOUT ANY WARRANTY; without even the implied warranty of
53289 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
53290 * Lesser General Public License for more details.
53291 *
53292 * You should have received a copy of the GNU Lesser General Public
53293 * License along with this library; if not, write to the Free Software
53294 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
53295 * MA 02110-1301 USA
53296 */
53297
53298 /**
53299 * @class Storytellingv2Widget
53300 * Storytellingv2Widget Implementation
53301 * @author Mike Bretschneider (mike.bretschneider@gmx.de)
53302 *
53303 * @param {WidgetWrapper} core wrapper for interaction to other widgets
53304 * @param {HTML object} div parent div to append the Storytellingv2 widget div
53305 * @param {JSON} options user specified configuration that overwrites options in Storytellingv2Config.js
53306 */
53307 Storytellingv2Widget = function(core, div, options) {
53308 /* HACK DW: stelle sicher, dass das nicht zweimal aufgerufen wird! */
53309 if (typeof Storytellingv2Widget_cont == "undefined"){
53310 Storytellingv2Widget_cont="Done";
53311
53312 this.datasets;
53313 this.core = core;
53314 this.core.setWidget(this);
53315 this.currentStatus = new Object();
53316
53317 this.options = (new Storytellingv2Config(options)).options;
53318 this.gui = new Storytellingv2Gui(this, div, this.options);
53319 this.storytellingv2 = new Storytellingv2(this);
53320
53321 this.datasetLink;
53322
53323 this.selected;
53324 this.configArray = [];
53325
53326 this.simplemode = true;
53327
53328 this.initWidget();
53329
53330 }
53331 }
53332
53333 Storytellingv2Widget.prototype = {
53334
53335 initWidget : function(data) {
53336
53337
53338 var storytellingv2Widget = this;
53339 var gui = storytellingv2Widget.gui;
53340
53341 storytellingv2Widget.datasets = data;
53342
53343 gui.initGui();
53344
53345 },
53346
53347 createLink : function() {
53348 },
53349
53350 highlightChanged : function(objects) {
53351 },
53352
53353 selectionChanged : function(selection) {
53354 if (!selection.valid()) {
53355 selection.loadAllObjects();
53356 }
53357 this.selected = selection.objects;
53358 },
53359
53360 sendConfig : function(widgetConfig){
53361 for (var i = 0; i < this.configArray.length; i++) {
53362 if (this.configArray[i].widgetName == widgetConfig.widgetName) {
53363 this.configArray.splice(i,1);
53364 }
53365 }
53366 this.configArray.push(widgetConfig);
53367 },
53368
53369 }; 44957 };
53370 /* 44958 /*
53371 * LineOverlay.js 44959 * LineOverlay.js
53372 * 44960 *
53373 * Copyright (c) 2013, Sebastian Kruse. All rights reserved. 44961 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
57201 Publisher.Subscribe('resizeWidget', this, function() { 48789 Publisher.Subscribe('resizeWidget', this, function() {
57202 if ( typeof wrapper.widget != 'undefined' && typeof wrapper.widget.gui != 'undefined' && typeof wrapper.widget.gui.resize != 'undefined' ) { 48790 if ( typeof wrapper.widget != 'undefined' && typeof wrapper.widget.gui != 'undefined' && typeof wrapper.widget.gui.resize != 'undefined' ) {
57203 wrapper.widget.gui.resize(); 48791 wrapper.widget.gui.resize();
57204 } 48792 }
57205 }); 48793 });
57206
57207 Publisher.Subscribe('getConfig', this, function(inquiringWidget) {
57208 if (inquiringWidget == undefined) {
57209 return;
57210 }
57211 if ( typeof wrapper.widget != 'undefined') {
57212 if ( typeof wrapper.widget.getConfig != 'undefined') {
57213 wrapper.widget.getConfig(inquiringWidget);
57214 }
57215 }
57216 });
57217
57218 Publisher.Subscribe('setConfig', this, function(config) {
57219 if (config == undefined) {
57220 return;
57221 }
57222 if ( typeof wrapper.widget != 'undefined') {
57223 if ( typeof wrapper.widget.setConfig != 'undefined') {
57224 wrapper.widget.setConfig(config);
57225 }
57226 }
57227 });
57228
57229 48794
57230 this.triggerRefining = function(datasets) { 48795 this.triggerRefining = function(datasets) {
57231 Publisher.Publish('filterData', datasets, null); 48796 Publisher.Publish('filterData', datasets, null);
57232 }; 48797 };
57233 48798