Mercurial > hg > mpiwg_geobrowser
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;"') + "> <"+"/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'> <"+"/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;"') + "> <"+"/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"> </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 = ' '; | |
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={""":'"',"'":"'",">":">","<":"<","&":"&"};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={""":'"',"'":"'",">":">","<":"<","&":"&"};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 |