11510 lines
		
	
	
		
			392 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			11510 lines
		
	
	
		
			392 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) Tiny Technologies, Inc. All rights reserved.
 | |
|  * Licensed under the LGPL or a commercial license.
 | |
|  * For LGPL see License.txt in the project root for license information.
 | |
|  * For commercial licenses see https://www.tiny.cloud/
 | |
|  *
 | |
|  * Version: 5.10.0 (2021-10-11)
 | |
|  */
 | |
| (function () {
 | |
|     'use strict';
 | |
| 
 | |
|     var typeOf = function (x) {
 | |
|       var t = typeof x;
 | |
|       if (x === null) {
 | |
|         return 'null';
 | |
|       } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
 | |
|         return 'array';
 | |
|       } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
 | |
|         return 'string';
 | |
|       } else {
 | |
|         return t;
 | |
|       }
 | |
|     };
 | |
|     var isType$1 = function (type) {
 | |
|       return function (value) {
 | |
|         return typeOf(value) === type;
 | |
|       };
 | |
|     };
 | |
|     var isSimpleType = function (type) {
 | |
|       return function (value) {
 | |
|         return typeof value === type;
 | |
|       };
 | |
|     };
 | |
|     var eq$2 = function (t) {
 | |
|       return function (a) {
 | |
|         return t === a;
 | |
|       };
 | |
|     };
 | |
|     var isString = isType$1('string');
 | |
|     var isObject = isType$1('object');
 | |
|     var isArray = isType$1('array');
 | |
|     var isNull = eq$2(null);
 | |
|     var isBoolean = isSimpleType('boolean');
 | |
|     var isUndefined = eq$2(undefined);
 | |
|     var isNullable = function (a) {
 | |
|       return a === null || a === undefined;
 | |
|     };
 | |
|     var isNonNullable = function (a) {
 | |
|       return !isNullable(a);
 | |
|     };
 | |
|     var isFunction = isSimpleType('function');
 | |
|     var isNumber = isSimpleType('number');
 | |
| 
 | |
|     var noop = function () {
 | |
|     };
 | |
|     var compose = function (fa, fb) {
 | |
|       return function () {
 | |
|         var args = [];
 | |
|         for (var _i = 0; _i < arguments.length; _i++) {
 | |
|           args[_i] = arguments[_i];
 | |
|         }
 | |
|         return fa(fb.apply(null, args));
 | |
|       };
 | |
|     };
 | |
|     var compose1 = function (fbc, fab) {
 | |
|       return function (a) {
 | |
|         return fbc(fab(a));
 | |
|       };
 | |
|     };
 | |
|     var constant = function (value) {
 | |
|       return function () {
 | |
|         return value;
 | |
|       };
 | |
|     };
 | |
|     var identity = function (x) {
 | |
|       return x;
 | |
|     };
 | |
|     var tripleEquals = function (a, b) {
 | |
|       return a === b;
 | |
|     };
 | |
|     function curry(fn) {
 | |
|       var initialArgs = [];
 | |
|       for (var _i = 1; _i < arguments.length; _i++) {
 | |
|         initialArgs[_i - 1] = arguments[_i];
 | |
|       }
 | |
|       return function () {
 | |
|         var restArgs = [];
 | |
|         for (var _i = 0; _i < arguments.length; _i++) {
 | |
|           restArgs[_i] = arguments[_i];
 | |
|         }
 | |
|         var all = initialArgs.concat(restArgs);
 | |
|         return fn.apply(null, all);
 | |
|       };
 | |
|     }
 | |
|     var not = function (f) {
 | |
|       return function (t) {
 | |
|         return !f(t);
 | |
|       };
 | |
|     };
 | |
|     var die = function (msg) {
 | |
|       return function () {
 | |
|         throw new Error(msg);
 | |
|       };
 | |
|     };
 | |
|     var never = constant(false);
 | |
|     var always = constant(true);
 | |
| 
 | |
|     var none$2 = function () {
 | |
|       return NONE;
 | |
|     };
 | |
|     var NONE = function () {
 | |
|       var call = function (thunk) {
 | |
|         return thunk();
 | |
|       };
 | |
|       var id = identity;
 | |
|       var me = {
 | |
|         fold: function (n, _s) {
 | |
|           return n();
 | |
|         },
 | |
|         isSome: never,
 | |
|         isNone: always,
 | |
|         getOr: id,
 | |
|         getOrThunk: call,
 | |
|         getOrDie: function (msg) {
 | |
|           throw new Error(msg || 'error: getOrDie called on none.');
 | |
|         },
 | |
|         getOrNull: constant(null),
 | |
|         getOrUndefined: constant(undefined),
 | |
|         or: id,
 | |
|         orThunk: call,
 | |
|         map: none$2,
 | |
|         each: noop,
 | |
|         bind: none$2,
 | |
|         exists: never,
 | |
|         forall: always,
 | |
|         filter: function () {
 | |
|           return none$2();
 | |
|         },
 | |
|         toArray: function () {
 | |
|           return [];
 | |
|         },
 | |
|         toString: constant('none()')
 | |
|       };
 | |
|       return me;
 | |
|     }();
 | |
|     var some = function (a) {
 | |
|       var constant_a = constant(a);
 | |
|       var self = function () {
 | |
|         return me;
 | |
|       };
 | |
|       var bind = function (f) {
 | |
|         return f(a);
 | |
|       };
 | |
|       var me = {
 | |
|         fold: function (n, s) {
 | |
|           return s(a);
 | |
|         },
 | |
|         isSome: always,
 | |
|         isNone: never,
 | |
|         getOr: constant_a,
 | |
|         getOrThunk: constant_a,
 | |
|         getOrDie: constant_a,
 | |
|         getOrNull: constant_a,
 | |
|         getOrUndefined: constant_a,
 | |
|         or: self,
 | |
|         orThunk: self,
 | |
|         map: function (f) {
 | |
|           return some(f(a));
 | |
|         },
 | |
|         each: function (f) {
 | |
|           f(a);
 | |
|         },
 | |
|         bind: bind,
 | |
|         exists: bind,
 | |
|         forall: bind,
 | |
|         filter: function (f) {
 | |
|           return f(a) ? me : NONE;
 | |
|         },
 | |
|         toArray: function () {
 | |
|           return [a];
 | |
|         },
 | |
|         toString: function () {
 | |
|           return 'some(' + a + ')';
 | |
|         }
 | |
|       };
 | |
|       return me;
 | |
|     };
 | |
|     var from$1 = function (value) {
 | |
|       return value === null || value === undefined ? NONE : some(value);
 | |
|     };
 | |
|     var Optional = {
 | |
|       some: some,
 | |
|       none: none$2,
 | |
|       from: from$1
 | |
|     };
 | |
| 
 | |
|     var nativeSlice = Array.prototype.slice;
 | |
|     var nativeIndexOf = Array.prototype.indexOf;
 | |
|     var nativePush = Array.prototype.push;
 | |
|     var rawIndexOf = function (ts, t) {
 | |
|       return nativeIndexOf.call(ts, t);
 | |
|     };
 | |
|     var contains$2 = function (xs, x) {
 | |
|       return rawIndexOf(xs, x) > -1;
 | |
|     };
 | |
|     var exists = function (xs, pred) {
 | |
|       for (var i = 0, len = xs.length; i < len; i++) {
 | |
|         var x = xs[i];
 | |
|         if (pred(x, i)) {
 | |
|           return true;
 | |
|         }
 | |
|       }
 | |
|       return false;
 | |
|     };
 | |
|     var range$1 = function (num, f) {
 | |
|       var r = [];
 | |
|       for (var i = 0; i < num; i++) {
 | |
|         r.push(f(i));
 | |
|       }
 | |
|       return r;
 | |
|     };
 | |
|     var map$1 = function (xs, f) {
 | |
|       var len = xs.length;
 | |
|       var r = new Array(len);
 | |
|       for (var i = 0; i < len; i++) {
 | |
|         var x = xs[i];
 | |
|         r[i] = f(x, i);
 | |
|       }
 | |
|       return r;
 | |
|     };
 | |
|     var each$2 = function (xs, f) {
 | |
|       for (var i = 0, len = xs.length; i < len; i++) {
 | |
|         var x = xs[i];
 | |
|         f(x, i);
 | |
|       }
 | |
|     };
 | |
|     var eachr = function (xs, f) {
 | |
|       for (var i = xs.length - 1; i >= 0; i--) {
 | |
|         var x = xs[i];
 | |
|         f(x, i);
 | |
|       }
 | |
|     };
 | |
|     var partition = function (xs, pred) {
 | |
|       var pass = [];
 | |
|       var fail = [];
 | |
|       for (var i = 0, len = xs.length; i < len; i++) {
 | |
|         var x = xs[i];
 | |
|         var arr = pred(x, i) ? pass : fail;
 | |
|         arr.push(x);
 | |
|       }
 | |
|       return {
 | |
|         pass: pass,
 | |
|         fail: fail
 | |
|       };
 | |
|     };
 | |
|     var filter$2 = function (xs, pred) {
 | |
|       var r = [];
 | |
|       for (var i = 0, len = xs.length; i < len; i++) {
 | |
|         var x = xs[i];
 | |
|         if (pred(x, i)) {
 | |
|           r.push(x);
 | |
|         }
 | |
|       }
 | |
|       return r;
 | |
|     };
 | |
|     var foldr = function (xs, f, acc) {
 | |
|       eachr(xs, function (x, i) {
 | |
|         acc = f(acc, x, i);
 | |
|       });
 | |
|       return acc;
 | |
|     };
 | |
|     var foldl = function (xs, f, acc) {
 | |
|       each$2(xs, function (x, i) {
 | |
|         acc = f(acc, x, i);
 | |
|       });
 | |
|       return acc;
 | |
|     };
 | |
|     var findUntil = function (xs, pred, until) {
 | |
|       for (var i = 0, len = xs.length; i < len; i++) {
 | |
|         var x = xs[i];
 | |
|         if (pred(x, i)) {
 | |
|           return Optional.some(x);
 | |
|         } else if (until(x, i)) {
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|       return Optional.none();
 | |
|     };
 | |
|     var find$1 = function (xs, pred) {
 | |
|       return findUntil(xs, pred, never);
 | |
|     };
 | |
|     var findIndex = function (xs, pred) {
 | |
|       for (var i = 0, len = xs.length; i < len; i++) {
 | |
|         var x = xs[i];
 | |
|         if (pred(x, i)) {
 | |
|           return Optional.some(i);
 | |
|         }
 | |
|       }
 | |
|       return Optional.none();
 | |
|     };
 | |
|     var flatten$1 = function (xs) {
 | |
|       var r = [];
 | |
|       for (var i = 0, len = xs.length; i < len; ++i) {
 | |
|         if (!isArray(xs[i])) {
 | |
|           throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
 | |
|         }
 | |
|         nativePush.apply(r, xs[i]);
 | |
|       }
 | |
|       return r;
 | |
|     };
 | |
|     var bind$2 = function (xs, f) {
 | |
|       return flatten$1(map$1(xs, f));
 | |
|     };
 | |
|     var forall = function (xs, pred) {
 | |
|       for (var i = 0, len = xs.length; i < len; ++i) {
 | |
|         var x = xs[i];
 | |
|         if (pred(x, i) !== true) {
 | |
|           return false;
 | |
|         }
 | |
|       }
 | |
|       return true;
 | |
|     };
 | |
|     var reverse = function (xs) {
 | |
|       var r = nativeSlice.call(xs, 0);
 | |
|       r.reverse();
 | |
|       return r;
 | |
|     };
 | |
|     var mapToObject = function (xs, f) {
 | |
|       var r = {};
 | |
|       for (var i = 0, len = xs.length; i < len; i++) {
 | |
|         var x = xs[i];
 | |
|         r[String(x)] = f(x, i);
 | |
|       }
 | |
|       return r;
 | |
|     };
 | |
|     var pure = function (x) {
 | |
|       return [x];
 | |
|     };
 | |
|     var sort$1 = function (xs, comparator) {
 | |
|       var copy = nativeSlice.call(xs, 0);
 | |
|       copy.sort(comparator);
 | |
|       return copy;
 | |
|     };
 | |
|     var get$d = function (xs, i) {
 | |
|       return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
 | |
|     };
 | |
|     var head = function (xs) {
 | |
|       return get$d(xs, 0);
 | |
|     };
 | |
|     var last$2 = function (xs) {
 | |
|       return get$d(xs, xs.length - 1);
 | |
|     };
 | |
|     var findMap = function (arr, f) {
 | |
|       for (var i = 0; i < arr.length; i++) {
 | |
|         var r = f(arr[i], i);
 | |
|         if (r.isSome()) {
 | |
|           return r;
 | |
|         }
 | |
|       }
 | |
|       return Optional.none();
 | |
|     };
 | |
| 
 | |
|     var __assign = function () {
 | |
|       __assign = Object.assign || function __assign(t) {
 | |
|         for (var s, i = 1, n = arguments.length; i < n; i++) {
 | |
|           s = arguments[i];
 | |
|           for (var p in s)
 | |
|             if (Object.prototype.hasOwnProperty.call(s, p))
 | |
|               t[p] = s[p];
 | |
|         }
 | |
|         return t;
 | |
|       };
 | |
|       return __assign.apply(this, arguments);
 | |
|     };
 | |
|     function __spreadArray(to, from, pack) {
 | |
|       if (pack || arguments.length === 2)
 | |
|         for (var i = 0, l = from.length, ar; i < l; i++) {
 | |
|           if (ar || !(i in from)) {
 | |
|             if (!ar)
 | |
|               ar = Array.prototype.slice.call(from, 0, i);
 | |
|             ar[i] = from[i];
 | |
|           }
 | |
|         }
 | |
|       return to.concat(ar || Array.prototype.slice.call(from));
 | |
|     }
 | |
| 
 | |
|     var cached = function (f) {
 | |
|       var called = false;
 | |
|       var r;
 | |
|       return function () {
 | |
|         var args = [];
 | |
|         for (var _i = 0; _i < arguments.length; _i++) {
 | |
|           args[_i] = arguments[_i];
 | |
|         }
 | |
|         if (!called) {
 | |
|           called = true;
 | |
|           r = f.apply(null, args);
 | |
|         }
 | |
|         return r;
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var DeviceType = function (os, browser, userAgent, mediaMatch) {
 | |
|       var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
 | |
|       var isiPhone = os.isiOS() && !isiPad;
 | |
|       var isMobile = os.isiOS() || os.isAndroid();
 | |
|       var isTouch = isMobile || mediaMatch('(pointer:coarse)');
 | |
|       var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');
 | |
|       var isPhone = isiPhone || isMobile && !isTablet;
 | |
|       var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
 | |
|       var isDesktop = !isPhone && !isTablet && !iOSwebview;
 | |
|       return {
 | |
|         isiPad: constant(isiPad),
 | |
|         isiPhone: constant(isiPhone),
 | |
|         isTablet: constant(isTablet),
 | |
|         isPhone: constant(isPhone),
 | |
|         isTouch: constant(isTouch),
 | |
|         isAndroid: os.isAndroid,
 | |
|         isiOS: os.isiOS,
 | |
|         isWebView: constant(iOSwebview),
 | |
|         isDesktop: constant(isDesktop)
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var firstMatch = function (regexes, s) {
 | |
|       for (var i = 0; i < regexes.length; i++) {
 | |
|         var x = regexes[i];
 | |
|         if (x.test(s)) {
 | |
|           return x;
 | |
|         }
 | |
|       }
 | |
|       return undefined;
 | |
|     };
 | |
|     var find = function (regexes, agent) {
 | |
|       var r = firstMatch(regexes, agent);
 | |
|       if (!r) {
 | |
|         return {
 | |
|           major: 0,
 | |
|           minor: 0
 | |
|         };
 | |
|       }
 | |
|       var group = function (i) {
 | |
|         return Number(agent.replace(r, '$' + i));
 | |
|       };
 | |
|       return nu$2(group(1), group(2));
 | |
|     };
 | |
|     var detect$6 = function (versionRegexes, agent) {
 | |
|       var cleanedAgent = String(agent).toLowerCase();
 | |
|       if (versionRegexes.length === 0) {
 | |
|         return unknown$2();
 | |
|       }
 | |
|       return find(versionRegexes, cleanedAgent);
 | |
|     };
 | |
|     var unknown$2 = function () {
 | |
|       return nu$2(0, 0);
 | |
|     };
 | |
|     var nu$2 = function (major, minor) {
 | |
|       return {
 | |
|         major: major,
 | |
|         minor: minor
 | |
|       };
 | |
|     };
 | |
|     var Version = {
 | |
|       nu: nu$2,
 | |
|       detect: detect$6,
 | |
|       unknown: unknown$2
 | |
|     };
 | |
| 
 | |
|     var detectBrowser$1 = function (browsers, userAgentData) {
 | |
|       return findMap(userAgentData.brands, function (uaBrand) {
 | |
|         var lcBrand = uaBrand.brand.toLowerCase();
 | |
|         return find$1(browsers, function (browser) {
 | |
|           var _a;
 | |
|           return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());
 | |
|         }).map(function (info) {
 | |
|           return {
 | |
|             current: info.name,
 | |
|             version: Version.nu(parseInt(uaBrand.version, 10), 0)
 | |
|           };
 | |
|         });
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var detect$5 = function (candidates, userAgent) {
 | |
|       var agent = String(userAgent).toLowerCase();
 | |
|       return find$1(candidates, function (candidate) {
 | |
|         return candidate.search(agent);
 | |
|       });
 | |
|     };
 | |
|     var detectBrowser = function (browsers, userAgent) {
 | |
|       return detect$5(browsers, userAgent).map(function (browser) {
 | |
|         var version = Version.detect(browser.versionRegexes, userAgent);
 | |
|         return {
 | |
|           current: browser.name,
 | |
|           version: version
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|     var detectOs = function (oses, userAgent) {
 | |
|       return detect$5(oses, userAgent).map(function (os) {
 | |
|         var version = Version.detect(os.versionRegexes, userAgent);
 | |
|         return {
 | |
|           current: os.name,
 | |
|           version: version
 | |
|         };
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var removeFromStart = function (str, numChars) {
 | |
|       return str.substring(numChars);
 | |
|     };
 | |
| 
 | |
|     var checkRange = function (str, substr, start) {
 | |
|       return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
 | |
|     };
 | |
|     var removeLeading = function (str, prefix) {
 | |
|       return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str;
 | |
|     };
 | |
|     var contains$1 = function (str, substr) {
 | |
|       return str.indexOf(substr) !== -1;
 | |
|     };
 | |
|     var startsWith = function (str, prefix) {
 | |
|       return checkRange(str, prefix, 0);
 | |
|     };
 | |
|     var endsWith = function (str, suffix) {
 | |
|       return checkRange(str, suffix, str.length - suffix.length);
 | |
|     };
 | |
|     var blank = function (r) {
 | |
|       return function (s) {
 | |
|         return s.replace(r, '');
 | |
|       };
 | |
|     };
 | |
|     var trim = blank(/^\s+|\s+$/g);
 | |
|     var isNotEmpty = function (s) {
 | |
|       return s.length > 0;
 | |
|     };
 | |
|     var isEmpty$1 = function (s) {
 | |
|       return !isNotEmpty(s);
 | |
|     };
 | |
|     var toFloat = function (value) {
 | |
|       var num = parseFloat(value);
 | |
|       return isNaN(num) ? Optional.none() : Optional.some(num);
 | |
|     };
 | |
| 
 | |
|     var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
 | |
|     var checkContains = function (target) {
 | |
|       return function (uastring) {
 | |
|         return contains$1(uastring, target);
 | |
|       };
 | |
|     };
 | |
|     var browsers = [
 | |
|       {
 | |
|         name: 'Edge',
 | |
|         versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
 | |
|         search: function (uastring) {
 | |
|           return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit');
 | |
|         }
 | |
|       },
 | |
|       {
 | |
|         name: 'Chrome',
 | |
|         brand: 'Chromium',
 | |
|         versionRegexes: [
 | |
|           /.*?chrome\/([0-9]+)\.([0-9]+).*/,
 | |
|           normalVersionRegex
 | |
|         ],
 | |
|         search: function (uastring) {
 | |
|           return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe');
 | |
|         }
 | |
|       },
 | |
|       {
 | |
|         name: 'IE',
 | |
|         versionRegexes: [
 | |
|           /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
 | |
|           /.*?rv:([0-9]+)\.([0-9]+).*/
 | |
|         ],
 | |
|         search: function (uastring) {
 | |
|           return contains$1(uastring, 'msie') || contains$1(uastring, 'trident');
 | |
|         }
 | |
|       },
 | |
|       {
 | |
|         name: 'Opera',
 | |
|         versionRegexes: [
 | |
|           normalVersionRegex,
 | |
|           /.*?opera\/([0-9]+)\.([0-9]+).*/
 | |
|         ],
 | |
|         search: checkContains('opera')
 | |
|       },
 | |
|       {
 | |
|         name: 'Firefox',
 | |
|         versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
 | |
|         search: checkContains('firefox')
 | |
|       },
 | |
|       {
 | |
|         name: 'Safari',
 | |
|         versionRegexes: [
 | |
|           normalVersionRegex,
 | |
|           /.*?cpu os ([0-9]+)_([0-9]+).*/
 | |
|         ],
 | |
|         search: function (uastring) {
 | |
|           return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit');
 | |
|         }
 | |
|       }
 | |
|     ];
 | |
|     var oses = [
 | |
|       {
 | |
|         name: 'Windows',
 | |
|         search: checkContains('win'),
 | |
|         versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
 | |
|       },
 | |
|       {
 | |
|         name: 'iOS',
 | |
|         search: function (uastring) {
 | |
|           return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad');
 | |
|         },
 | |
|         versionRegexes: [
 | |
|           /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
 | |
|           /.*cpu os ([0-9]+)_([0-9]+).*/,
 | |
|           /.*cpu iphone os ([0-9]+)_([0-9]+).*/
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         name: 'Android',
 | |
|         search: checkContains('android'),
 | |
|         versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
 | |
|       },
 | |
|       {
 | |
|         name: 'OSX',
 | |
|         search: checkContains('mac os x'),
 | |
|         versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]
 | |
|       },
 | |
|       {
 | |
|         name: 'Linux',
 | |
|         search: checkContains('linux'),
 | |
|         versionRegexes: []
 | |
|       },
 | |
|       {
 | |
|         name: 'Solaris',
 | |
|         search: checkContains('sunos'),
 | |
|         versionRegexes: []
 | |
|       },
 | |
|       {
 | |
|         name: 'FreeBSD',
 | |
|         search: checkContains('freebsd'),
 | |
|         versionRegexes: []
 | |
|       },
 | |
|       {
 | |
|         name: 'ChromeOS',
 | |
|         search: checkContains('cros'),
 | |
|         versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/]
 | |
|       }
 | |
|     ];
 | |
|     var PlatformInfo = {
 | |
|       browsers: constant(browsers),
 | |
|       oses: constant(oses)
 | |
|     };
 | |
| 
 | |
|     var edge = 'Edge';
 | |
|     var chrome = 'Chrome';
 | |
|     var ie = 'IE';
 | |
|     var opera = 'Opera';
 | |
|     var firefox = 'Firefox';
 | |
|     var safari = 'Safari';
 | |
|     var unknown$1 = function () {
 | |
|       return nu$1({
 | |
|         current: undefined,
 | |
|         version: Version.unknown()
 | |
|       });
 | |
|     };
 | |
|     var nu$1 = function (info) {
 | |
|       var current = info.current;
 | |
|       var version = info.version;
 | |
|       var isBrowser = function (name) {
 | |
|         return function () {
 | |
|           return current === name;
 | |
|         };
 | |
|       };
 | |
|       return {
 | |
|         current: current,
 | |
|         version: version,
 | |
|         isEdge: isBrowser(edge),
 | |
|         isChrome: isBrowser(chrome),
 | |
|         isIE: isBrowser(ie),
 | |
|         isOpera: isBrowser(opera),
 | |
|         isFirefox: isBrowser(firefox),
 | |
|         isSafari: isBrowser(safari)
 | |
|       };
 | |
|     };
 | |
|     var Browser = {
 | |
|       unknown: unknown$1,
 | |
|       nu: nu$1,
 | |
|       edge: constant(edge),
 | |
|       chrome: constant(chrome),
 | |
|       ie: constant(ie),
 | |
|       opera: constant(opera),
 | |
|       firefox: constant(firefox),
 | |
|       safari: constant(safari)
 | |
|     };
 | |
| 
 | |
|     var windows = 'Windows';
 | |
|     var ios = 'iOS';
 | |
|     var android = 'Android';
 | |
|     var linux = 'Linux';
 | |
|     var osx = 'OSX';
 | |
|     var solaris = 'Solaris';
 | |
|     var freebsd = 'FreeBSD';
 | |
|     var chromeos = 'ChromeOS';
 | |
|     var unknown = function () {
 | |
|       return nu({
 | |
|         current: undefined,
 | |
|         version: Version.unknown()
 | |
|       });
 | |
|     };
 | |
|     var nu = function (info) {
 | |
|       var current = info.current;
 | |
|       var version = info.version;
 | |
|       var isOS = function (name) {
 | |
|         return function () {
 | |
|           return current === name;
 | |
|         };
 | |
|       };
 | |
|       return {
 | |
|         current: current,
 | |
|         version: version,
 | |
|         isWindows: isOS(windows),
 | |
|         isiOS: isOS(ios),
 | |
|         isAndroid: isOS(android),
 | |
|         isOSX: isOS(osx),
 | |
|         isLinux: isOS(linux),
 | |
|         isSolaris: isOS(solaris),
 | |
|         isFreeBSD: isOS(freebsd),
 | |
|         isChromeOS: isOS(chromeos)
 | |
|       };
 | |
|     };
 | |
|     var OperatingSystem = {
 | |
|       unknown: unknown,
 | |
|       nu: nu,
 | |
|       windows: constant(windows),
 | |
|       ios: constant(ios),
 | |
|       android: constant(android),
 | |
|       linux: constant(linux),
 | |
|       osx: constant(osx),
 | |
|       solaris: constant(solaris),
 | |
|       freebsd: constant(freebsd),
 | |
|       chromeos: constant(chromeos)
 | |
|     };
 | |
| 
 | |
|     var detect$4 = function (userAgent, userAgentDataOpt, mediaMatch) {
 | |
|       var browsers = PlatformInfo.browsers();
 | |
|       var oses = PlatformInfo.oses();
 | |
|       var browser = userAgentDataOpt.bind(function (userAgentData) {
 | |
|         return detectBrowser$1(browsers, userAgentData);
 | |
|       }).orThunk(function () {
 | |
|         return detectBrowser(browsers, userAgent);
 | |
|       }).fold(Browser.unknown, Browser.nu);
 | |
|       var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
 | |
|       var deviceType = DeviceType(os, browser, userAgent, mediaMatch);
 | |
|       return {
 | |
|         browser: browser,
 | |
|         os: os,
 | |
|         deviceType: deviceType
 | |
|       };
 | |
|     };
 | |
|     var PlatformDetection = { detect: detect$4 };
 | |
| 
 | |
|     var mediaMatch = function (query) {
 | |
|       return window.matchMedia(query).matches;
 | |
|     };
 | |
|     var platform = cached(function () {
 | |
|       return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch);
 | |
|     });
 | |
|     var detect$3 = function () {
 | |
|       return platform();
 | |
|     };
 | |
| 
 | |
|     var compareDocumentPosition = function (a, b, match) {
 | |
|       return (a.compareDocumentPosition(b) & match) !== 0;
 | |
|     };
 | |
|     var documentPositionContainedBy = function (a, b) {
 | |
|       return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY);
 | |
|     };
 | |
| 
 | |
|     var COMMENT = 8;
 | |
|     var DOCUMENT = 9;
 | |
|     var DOCUMENT_FRAGMENT = 11;
 | |
|     var ELEMENT = 1;
 | |
|     var TEXT = 3;
 | |
| 
 | |
|     var fromHtml$1 = function (html, scope) {
 | |
|       var doc = scope || document;
 | |
|       var div = doc.createElement('div');
 | |
|       div.innerHTML = html;
 | |
|       if (!div.hasChildNodes() || div.childNodes.length > 1) {
 | |
|         console.error('HTML does not have a single root node', html);
 | |
|         throw new Error('HTML must have a single root node');
 | |
|       }
 | |
|       return fromDom$1(div.childNodes[0]);
 | |
|     };
 | |
|     var fromTag = function (tag, scope) {
 | |
|       var doc = scope || document;
 | |
|       var node = doc.createElement(tag);
 | |
|       return fromDom$1(node);
 | |
|     };
 | |
|     var fromText = function (text, scope) {
 | |
|       var doc = scope || document;
 | |
|       var node = doc.createTextNode(text);
 | |
|       return fromDom$1(node);
 | |
|     };
 | |
|     var fromDom$1 = function (node) {
 | |
|       if (node === null || node === undefined) {
 | |
|         throw new Error('Node cannot be null or undefined');
 | |
|       }
 | |
|       return { dom: node };
 | |
|     };
 | |
|     var fromPoint$1 = function (docElm, x, y) {
 | |
|       return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$1);
 | |
|     };
 | |
|     var SugarElement = {
 | |
|       fromHtml: fromHtml$1,
 | |
|       fromTag: fromTag,
 | |
|       fromText: fromText,
 | |
|       fromDom: fromDom$1,
 | |
|       fromPoint: fromPoint$1
 | |
|     };
 | |
| 
 | |
|     var is$2 = function (element, selector) {
 | |
|       var dom = element.dom;
 | |
|       if (dom.nodeType !== ELEMENT) {
 | |
|         return false;
 | |
|       } else {
 | |
|         var elem = dom;
 | |
|         if (elem.matches !== undefined) {
 | |
|           return elem.matches(selector);
 | |
|         } else if (elem.msMatchesSelector !== undefined) {
 | |
|           return elem.msMatchesSelector(selector);
 | |
|         } else if (elem.webkitMatchesSelector !== undefined) {
 | |
|           return elem.webkitMatchesSelector(selector);
 | |
|         } else if (elem.mozMatchesSelector !== undefined) {
 | |
|           return elem.mozMatchesSelector(selector);
 | |
|         } else {
 | |
|           throw new Error('Browser lacks native selectors');
 | |
|         }
 | |
|       }
 | |
|     };
 | |
|     var bypassSelector = function (dom) {
 | |
|       return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
 | |
|     };
 | |
|     var all$1 = function (selector, scope) {
 | |
|       var base = scope === undefined ? document : scope.dom;
 | |
|       return bypassSelector(base) ? [] : map$1(base.querySelectorAll(selector), SugarElement.fromDom);
 | |
|     };
 | |
|     var one = function (selector, scope) {
 | |
|       var base = scope === undefined ? document : scope.dom;
 | |
|       return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);
 | |
|     };
 | |
| 
 | |
|     var eq$1 = function (e1, e2) {
 | |
|       return e1.dom === e2.dom;
 | |
|     };
 | |
|     var regularContains = function (e1, e2) {
 | |
|       var d1 = e1.dom;
 | |
|       var d2 = e2.dom;
 | |
|       return d1 === d2 ? false : d1.contains(d2);
 | |
|     };
 | |
|     var ieContains = function (e1, e2) {
 | |
|       return documentPositionContainedBy(e1.dom, e2.dom);
 | |
|     };
 | |
|     var contains = function (e1, e2) {
 | |
|       return detect$3().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2);
 | |
|     };
 | |
|     var is$1 = is$2;
 | |
| 
 | |
|     var keys = Object.keys;
 | |
|     var hasOwnProperty = Object.hasOwnProperty;
 | |
|     var each$1 = function (obj, f) {
 | |
|       var props = keys(obj);
 | |
|       for (var k = 0, len = props.length; k < len; k++) {
 | |
|         var i = props[k];
 | |
|         var x = obj[i];
 | |
|         f(x, i);
 | |
|       }
 | |
|     };
 | |
|     var map = function (obj, f) {
 | |
|       return tupleMap(obj, function (x, i) {
 | |
|         return {
 | |
|           k: i,
 | |
|           v: f(x, i)
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|     var tupleMap = function (obj, f) {
 | |
|       var r = {};
 | |
|       each$1(obj, function (x, i) {
 | |
|         var tuple = f(x, i);
 | |
|         r[tuple.k] = tuple.v;
 | |
|       });
 | |
|       return r;
 | |
|     };
 | |
|     var objAcc = function (r) {
 | |
|       return function (x, i) {
 | |
|         r[i] = x;
 | |
|       };
 | |
|     };
 | |
|     var internalFilter = function (obj, pred, onTrue, onFalse) {
 | |
|       var r = {};
 | |
|       each$1(obj, function (x, i) {
 | |
|         (pred(x, i) ? onTrue : onFalse)(x, i);
 | |
|       });
 | |
|       return r;
 | |
|     };
 | |
|     var filter$1 = function (obj, pred) {
 | |
|       var t = {};
 | |
|       internalFilter(obj, pred, objAcc(t), noop);
 | |
|       return t;
 | |
|     };
 | |
|     var mapToArray = function (obj, f) {
 | |
|       var r = [];
 | |
|       each$1(obj, function (value, name) {
 | |
|         r.push(f(value, name));
 | |
|       });
 | |
|       return r;
 | |
|     };
 | |
|     var values = function (obj) {
 | |
|       return mapToArray(obj, identity);
 | |
|     };
 | |
|     var size = function (obj) {
 | |
|       return keys(obj).length;
 | |
|     };
 | |
|     var get$c = function (obj, key) {
 | |
|       return has$1(obj, key) ? Optional.from(obj[key]) : Optional.none();
 | |
|     };
 | |
|     var has$1 = function (obj, key) {
 | |
|       return hasOwnProperty.call(obj, key);
 | |
|     };
 | |
|     var hasNonNullableKey = function (obj, key) {
 | |
|       return has$1(obj, key) && obj[key] !== undefined && obj[key] !== null;
 | |
|     };
 | |
|     var isEmpty = function (r) {
 | |
|       for (var x in r) {
 | |
|         if (hasOwnProperty.call(r, x)) {
 | |
|           return false;
 | |
|         }
 | |
|       }
 | |
|       return true;
 | |
|     };
 | |
| 
 | |
|     var validSectionList = [
 | |
|       'tfoot',
 | |
|       'thead',
 | |
|       'tbody',
 | |
|       'colgroup'
 | |
|     ];
 | |
|     var isValidSection = function (parentName) {
 | |
|       return contains$2(validSectionList, parentName);
 | |
|     };
 | |
|     var grid = function (rows, columns) {
 | |
|       return {
 | |
|         rows: rows,
 | |
|         columns: columns
 | |
|       };
 | |
|     };
 | |
|     var address = function (row, column) {
 | |
|       return {
 | |
|         row: row,
 | |
|         column: column
 | |
|       };
 | |
|     };
 | |
|     var detail = function (element, rowspan, colspan) {
 | |
|       return {
 | |
|         element: element,
 | |
|         rowspan: rowspan,
 | |
|         colspan: colspan
 | |
|       };
 | |
|     };
 | |
|     var detailnew = function (element, rowspan, colspan, isNew) {
 | |
|       return {
 | |
|         element: element,
 | |
|         rowspan: rowspan,
 | |
|         colspan: colspan,
 | |
|         isNew: isNew
 | |
|       };
 | |
|     };
 | |
|     var extended = function (element, rowspan, colspan, row, column, isLocked) {
 | |
|       return {
 | |
|         element: element,
 | |
|         rowspan: rowspan,
 | |
|         colspan: colspan,
 | |
|         row: row,
 | |
|         column: column,
 | |
|         isLocked: isLocked
 | |
|       };
 | |
|     };
 | |
|     var rowdetail = function (element, cells, section) {
 | |
|       return {
 | |
|         element: element,
 | |
|         cells: cells,
 | |
|         section: section
 | |
|       };
 | |
|     };
 | |
|     var rowdetailnew = function (element, cells, section, isNew) {
 | |
|       return {
 | |
|         element: element,
 | |
|         cells: cells,
 | |
|         section: section,
 | |
|         isNew: isNew
 | |
|       };
 | |
|     };
 | |
|     var elementnew = function (element, isNew, isLocked) {
 | |
|       return {
 | |
|         element: element,
 | |
|         isNew: isNew,
 | |
|         isLocked: isLocked
 | |
|       };
 | |
|     };
 | |
|     var rowcells = function (element, cells, section, isNew) {
 | |
|       return {
 | |
|         element: element,
 | |
|         cells: cells,
 | |
|         section: section,
 | |
|         isNew: isNew
 | |
|       };
 | |
|     };
 | |
|     var bounds = function (startRow, startCol, finishRow, finishCol) {
 | |
|       return {
 | |
|         startRow: startRow,
 | |
|         startCol: startCol,
 | |
|         finishRow: finishRow,
 | |
|         finishCol: finishCol
 | |
|       };
 | |
|     };
 | |
|     var columnext = function (element, colspan, column) {
 | |
|       return {
 | |
|         element: element,
 | |
|         colspan: colspan,
 | |
|         column: column
 | |
|       };
 | |
|     };
 | |
|     var colgroup = function (element, columns) {
 | |
|       return {
 | |
|         element: element,
 | |
|         columns: columns
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     typeof window !== 'undefined' ? window : Function('return this;')();
 | |
| 
 | |
|     var name = function (element) {
 | |
|       var r = element.dom.nodeName;
 | |
|       return r.toLowerCase();
 | |
|     };
 | |
|     var type$1 = function (element) {
 | |
|       return element.dom.nodeType;
 | |
|     };
 | |
|     var isType = function (t) {
 | |
|       return function (element) {
 | |
|         return type$1(element) === t;
 | |
|       };
 | |
|     };
 | |
|     var isComment = function (element) {
 | |
|       return type$1(element) === COMMENT || name(element) === '#comment';
 | |
|     };
 | |
|     var isElement = isType(ELEMENT);
 | |
|     var isText = isType(TEXT);
 | |
|     var isDocument = isType(DOCUMENT);
 | |
|     var isDocumentFragment = isType(DOCUMENT_FRAGMENT);
 | |
|     var isTag = function (tag) {
 | |
|       return function (e) {
 | |
|         return isElement(e) && name(e) === tag;
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var owner = function (element) {
 | |
|       return SugarElement.fromDom(element.dom.ownerDocument);
 | |
|     };
 | |
|     var documentOrOwner = function (dos) {
 | |
|       return isDocument(dos) ? dos : owner(dos);
 | |
|     };
 | |
|     var defaultView = function (element) {
 | |
|       return SugarElement.fromDom(documentOrOwner(element).dom.defaultView);
 | |
|     };
 | |
|     var parent = function (element) {
 | |
|       return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
 | |
|     };
 | |
|     var parentElement = function (element) {
 | |
|       return Optional.from(element.dom.parentElement).map(SugarElement.fromDom);
 | |
|     };
 | |
|     var parents = function (element, isRoot) {
 | |
|       var stop = isFunction(isRoot) ? isRoot : never;
 | |
|       var dom = element.dom;
 | |
|       var ret = [];
 | |
|       while (dom.parentNode !== null && dom.parentNode !== undefined) {
 | |
|         var rawParent = dom.parentNode;
 | |
|         var p = SugarElement.fromDom(rawParent);
 | |
|         ret.push(p);
 | |
|         if (stop(p) === true) {
 | |
|           break;
 | |
|         } else {
 | |
|           dom = rawParent;
 | |
|         }
 | |
|       }
 | |
|       return ret;
 | |
|     };
 | |
|     var prevSibling = function (element) {
 | |
|       return Optional.from(element.dom.previousSibling).map(SugarElement.fromDom);
 | |
|     };
 | |
|     var nextSibling = function (element) {
 | |
|       return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
 | |
|     };
 | |
|     var children$3 = function (element) {
 | |
|       return map$1(element.dom.childNodes, SugarElement.fromDom);
 | |
|     };
 | |
|     var child$3 = function (element, index) {
 | |
|       var cs = element.dom.childNodes;
 | |
|       return Optional.from(cs[index]).map(SugarElement.fromDom);
 | |
|     };
 | |
|     var firstChild = function (element) {
 | |
|       return child$3(element, 0);
 | |
|     };
 | |
| 
 | |
|     var isShadowRoot = function (dos) {
 | |
|       return isDocumentFragment(dos) && isNonNullable(dos.dom.host);
 | |
|     };
 | |
|     var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
 | |
|     var isSupported$1 = constant(supported);
 | |
|     var getRootNode = supported ? function (e) {
 | |
|       return SugarElement.fromDom(e.dom.getRootNode());
 | |
|     } : documentOrOwner;
 | |
|     var getShadowRoot = function (e) {
 | |
|       var r = getRootNode(e);
 | |
|       return isShadowRoot(r) ? Optional.some(r) : Optional.none();
 | |
|     };
 | |
|     var getShadowHost = function (e) {
 | |
|       return SugarElement.fromDom(e.dom.host);
 | |
|     };
 | |
|     var getOriginalEventTarget = function (event) {
 | |
|       if (isSupported$1() && isNonNullable(event.target)) {
 | |
|         var el = SugarElement.fromDom(event.target);
 | |
|         if (isElement(el) && isOpenShadowHost(el)) {
 | |
|           if (event.composed && event.composedPath) {
 | |
|             var composedPath = event.composedPath();
 | |
|             if (composedPath) {
 | |
|               return head(composedPath);
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       return Optional.from(event.target);
 | |
|     };
 | |
|     var isOpenShadowHost = function (element) {
 | |
|       return isNonNullable(element.dom.shadowRoot);
 | |
|     };
 | |
| 
 | |
|     var inBody = function (element) {
 | |
|       var dom = isText(element) ? element.dom.parentNode : element.dom;
 | |
|       if (dom === undefined || dom === null || dom.ownerDocument === null) {
 | |
|         return false;
 | |
|       }
 | |
|       var doc = dom.ownerDocument;
 | |
|       return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {
 | |
|         return doc.body.contains(dom);
 | |
|       }, compose1(inBody, getShadowHost));
 | |
|     };
 | |
|     var body$1 = function () {
 | |
|       return getBody$1(SugarElement.fromDom(document));
 | |
|     };
 | |
|     var getBody$1 = function (doc) {
 | |
|       var b = doc.dom.body;
 | |
|       if (b === null || b === undefined) {
 | |
|         throw new Error('Body is not available yet');
 | |
|       }
 | |
|       return SugarElement.fromDom(b);
 | |
|     };
 | |
| 
 | |
|     var ancestors$4 = function (scope, predicate, isRoot) {
 | |
|       return filter$2(parents(scope, isRoot), predicate);
 | |
|     };
 | |
|     var children$2 = function (scope, predicate) {
 | |
|       return filter$2(children$3(scope), predicate);
 | |
|     };
 | |
|     var descendants$1 = function (scope, predicate) {
 | |
|       var result = [];
 | |
|       each$2(children$3(scope), function (x) {
 | |
|         if (predicate(x)) {
 | |
|           result = result.concat([x]);
 | |
|         }
 | |
|         result = result.concat(descendants$1(x, predicate));
 | |
|       });
 | |
|       return result;
 | |
|     };
 | |
| 
 | |
|     var ancestors$3 = function (scope, selector, isRoot) {
 | |
|       return ancestors$4(scope, function (e) {
 | |
|         return is$2(e, selector);
 | |
|       }, isRoot);
 | |
|     };
 | |
|     var children$1 = function (scope, selector) {
 | |
|       return children$2(scope, function (e) {
 | |
|         return is$2(e, selector);
 | |
|       });
 | |
|     };
 | |
|     var descendants = function (scope, selector) {
 | |
|       return all$1(selector, scope);
 | |
|     };
 | |
| 
 | |
|     function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {
 | |
|       if (is(scope, a)) {
 | |
|         return Optional.some(scope);
 | |
|       } else if (isFunction(isRoot) && isRoot(scope)) {
 | |
|         return Optional.none();
 | |
|       } else {
 | |
|         return ancestor(scope, a, isRoot);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     var ancestor$2 = function (scope, predicate, isRoot) {
 | |
|       var element = scope.dom;
 | |
|       var stop = isFunction(isRoot) ? isRoot : never;
 | |
|       while (element.parentNode) {
 | |
|         element = element.parentNode;
 | |
|         var el = SugarElement.fromDom(element);
 | |
|         if (predicate(el)) {
 | |
|           return Optional.some(el);
 | |
|         } else if (stop(el)) {
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|       return Optional.none();
 | |
|     };
 | |
|     var closest$2 = function (scope, predicate, isRoot) {
 | |
|       var is = function (s, test) {
 | |
|         return test(s);
 | |
|       };
 | |
|       return ClosestOrAncestor(is, ancestor$2, scope, predicate, isRoot);
 | |
|     };
 | |
|     var child$2 = function (scope, predicate) {
 | |
|       var pred = function (node) {
 | |
|         return predicate(SugarElement.fromDom(node));
 | |
|       };
 | |
|       var result = find$1(scope.dom.childNodes, pred);
 | |
|       return result.map(SugarElement.fromDom);
 | |
|     };
 | |
|     var descendant$1 = function (scope, predicate) {
 | |
|       var descend = function (node) {
 | |
|         for (var i = 0; i < node.childNodes.length; i++) {
 | |
|           var child_1 = SugarElement.fromDom(node.childNodes[i]);
 | |
|           if (predicate(child_1)) {
 | |
|             return Optional.some(child_1);
 | |
|           }
 | |
|           var res = descend(node.childNodes[i]);
 | |
|           if (res.isSome()) {
 | |
|             return res;
 | |
|           }
 | |
|         }
 | |
|         return Optional.none();
 | |
|       };
 | |
|       return descend(scope.dom);
 | |
|     };
 | |
| 
 | |
|     var ancestor$1 = function (scope, selector, isRoot) {
 | |
|       return ancestor$2(scope, function (e) {
 | |
|         return is$2(e, selector);
 | |
|       }, isRoot);
 | |
|     };
 | |
|     var child$1 = function (scope, selector) {
 | |
|       return child$2(scope, function (e) {
 | |
|         return is$2(e, selector);
 | |
|       });
 | |
|     };
 | |
|     var descendant = function (scope, selector) {
 | |
|       return one(selector, scope);
 | |
|     };
 | |
|     var closest$1 = function (scope, selector, isRoot) {
 | |
|       var is = function (element, selector) {
 | |
|         return is$2(element, selector);
 | |
|       };
 | |
|       return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot);
 | |
|     };
 | |
| 
 | |
|     var rawSet = function (dom, key, value) {
 | |
|       if (isString(value) || isBoolean(value) || isNumber(value)) {
 | |
|         dom.setAttribute(key, value + '');
 | |
|       } else {
 | |
|         console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
 | |
|         throw new Error('Attribute value was not simple');
 | |
|       }
 | |
|     };
 | |
|     var set$2 = function (element, key, value) {
 | |
|       rawSet(element.dom, key, value);
 | |
|     };
 | |
|     var setAll$1 = function (element, attrs) {
 | |
|       var dom = element.dom;
 | |
|       each$1(attrs, function (v, k) {
 | |
|         rawSet(dom, k, v);
 | |
|       });
 | |
|     };
 | |
|     var setOptions = function (element, attrs) {
 | |
|       each$1(attrs, function (v, k) {
 | |
|         v.fold(function () {
 | |
|           remove$7(element, k);
 | |
|         }, function (value) {
 | |
|           rawSet(element.dom, k, value);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var get$b = function (element, key) {
 | |
|       var v = element.dom.getAttribute(key);
 | |
|       return v === null ? undefined : v;
 | |
|     };
 | |
|     var getOpt = function (element, key) {
 | |
|       return Optional.from(get$b(element, key));
 | |
|     };
 | |
|     var remove$7 = function (element, key) {
 | |
|       element.dom.removeAttribute(key);
 | |
|     };
 | |
|     var clone$2 = function (element) {
 | |
|       return foldl(element.dom.attributes, function (acc, attr) {
 | |
|         acc[attr.name] = attr.value;
 | |
|         return acc;
 | |
|       }, {});
 | |
|     };
 | |
| 
 | |
|     var is = function (lhs, rhs, comparator) {
 | |
|       if (comparator === void 0) {
 | |
|         comparator = tripleEquals;
 | |
|       }
 | |
|       return lhs.exists(function (left) {
 | |
|         return comparator(left, rhs);
 | |
|       });
 | |
|     };
 | |
|     var cat = function (arr) {
 | |
|       var r = [];
 | |
|       var push = function (x) {
 | |
|         r.push(x);
 | |
|       };
 | |
|       for (var i = 0; i < arr.length; i++) {
 | |
|         arr[i].each(push);
 | |
|       }
 | |
|       return r;
 | |
|     };
 | |
|     var lift2 = function (oa, ob, f) {
 | |
|       return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
 | |
|     };
 | |
|     var bindFrom = function (a, f) {
 | |
|       return a !== undefined && a !== null ? f(a) : Optional.none();
 | |
|     };
 | |
|     var flatten = function (oot) {
 | |
|       return oot.bind(identity);
 | |
|     };
 | |
|     var someIf = function (b, a) {
 | |
|       return b ? Optional.some(a) : Optional.none();
 | |
|     };
 | |
| 
 | |
|     var isSupported = function (dom) {
 | |
|       return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
 | |
|     };
 | |
| 
 | |
|     var internalSet = function (dom, property, value) {
 | |
|       if (!isString(value)) {
 | |
|         console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
 | |
|         throw new Error('CSS value must be a string: ' + value);
 | |
|       }
 | |
|       if (isSupported(dom)) {
 | |
|         dom.style.setProperty(property, value);
 | |
|       }
 | |
|     };
 | |
|     var internalRemove = function (dom, property) {
 | |
|       if (isSupported(dom)) {
 | |
|         dom.style.removeProperty(property);
 | |
|       }
 | |
|     };
 | |
|     var set$1 = function (element, property, value) {
 | |
|       var dom = element.dom;
 | |
|       internalSet(dom, property, value);
 | |
|     };
 | |
|     var setAll = function (element, css) {
 | |
|       var dom = element.dom;
 | |
|       each$1(css, function (v, k) {
 | |
|         internalSet(dom, k, v);
 | |
|       });
 | |
|     };
 | |
|     var get$a = function (element, property) {
 | |
|       var dom = element.dom;
 | |
|       var styles = window.getComputedStyle(dom);
 | |
|       var r = styles.getPropertyValue(property);
 | |
|       return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
 | |
|     };
 | |
|     var getUnsafeProperty = function (dom, property) {
 | |
|       return isSupported(dom) ? dom.style.getPropertyValue(property) : '';
 | |
|     };
 | |
|     var getRaw$2 = function (element, property) {
 | |
|       var dom = element.dom;
 | |
|       var raw = getUnsafeProperty(dom, property);
 | |
|       return Optional.from(raw).filter(function (r) {
 | |
|         return r.length > 0;
 | |
|       });
 | |
|     };
 | |
|     var remove$6 = function (element, property) {
 | |
|       var dom = element.dom;
 | |
|       internalRemove(dom, property);
 | |
|       if (is(getOpt(element, 'style').map(trim), '')) {
 | |
|         remove$7(element, 'style');
 | |
|       }
 | |
|     };
 | |
|     var copy$2 = function (source, target) {
 | |
|       var sourceDom = source.dom;
 | |
|       var targetDom = target.dom;
 | |
|       if (isSupported(sourceDom) && isSupported(targetDom)) {
 | |
|         targetDom.style.cssText = sourceDom.style.cssText;
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var getAttrValue = function (cell, name, fallback) {
 | |
|       if (fallback === void 0) {
 | |
|         fallback = 0;
 | |
|       }
 | |
|       return getOpt(cell, name).map(function (value) {
 | |
|         return parseInt(value, 10);
 | |
|       }).getOr(fallback);
 | |
|     };
 | |
|     var getSpan = function (cell, type) {
 | |
|       return getAttrValue(cell, type, 1);
 | |
|     };
 | |
|     var hasColspan = function (cellOrCol) {
 | |
|       if (isTag('col')(cellOrCol)) {
 | |
|         return getAttrValue(cellOrCol, 'span', 1) > 1;
 | |
|       } else {
 | |
|         return getSpan(cellOrCol, 'colspan') > 1;
 | |
|       }
 | |
|     };
 | |
|     var hasRowspan = function (cell) {
 | |
|       return getSpan(cell, 'rowspan') > 1;
 | |
|     };
 | |
|     var getCssValue = function (element, property) {
 | |
|       return parseInt(get$a(element, property), 10);
 | |
|     };
 | |
|     var minWidth = constant(10);
 | |
|     var minHeight = constant(10);
 | |
| 
 | |
|     var firstLayer = function (scope, selector) {
 | |
|       return filterFirstLayer(scope, selector, always);
 | |
|     };
 | |
|     var filterFirstLayer = function (scope, selector, predicate) {
 | |
|       return bind$2(children$3(scope), function (x) {
 | |
|         if (is$2(x, selector)) {
 | |
|           return predicate(x) ? [x] : [];
 | |
|         } else {
 | |
|           return filterFirstLayer(x, selector, predicate);
 | |
|         }
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var lookup = function (tags, element, isRoot) {
 | |
|       if (isRoot === void 0) {
 | |
|         isRoot = never;
 | |
|       }
 | |
|       if (isRoot(element)) {
 | |
|         return Optional.none();
 | |
|       }
 | |
|       if (contains$2(tags, name(element))) {
 | |
|         return Optional.some(element);
 | |
|       }
 | |
|       var isRootOrUpperTable = function (elm) {
 | |
|         return is$2(elm, 'table') || isRoot(elm);
 | |
|       };
 | |
|       return ancestor$1(element, tags.join(','), isRootOrUpperTable);
 | |
|     };
 | |
|     var cell = function (element, isRoot) {
 | |
|       return lookup([
 | |
|         'td',
 | |
|         'th'
 | |
|       ], element, isRoot);
 | |
|     };
 | |
|     var cells$1 = function (ancestor) {
 | |
|       return firstLayer(ancestor, 'th,td');
 | |
|     };
 | |
|     var columns$1 = function (ancestor) {
 | |
|       if (is$2(ancestor, 'colgroup')) {
 | |
|         return children$1(ancestor, 'col');
 | |
|       } else {
 | |
|         return bind$2(columnGroups(ancestor), function (columnGroup) {
 | |
|           return children$1(columnGroup, 'col');
 | |
|         });
 | |
|       }
 | |
|     };
 | |
|     var table = function (element, isRoot) {
 | |
|       return closest$1(element, 'table', isRoot);
 | |
|     };
 | |
|     var rows$1 = function (ancestor) {
 | |
|       return firstLayer(ancestor, 'tr');
 | |
|     };
 | |
|     var columnGroups = function (ancestor) {
 | |
|       return table(ancestor).fold(constant([]), function (table) {
 | |
|         return children$1(table, 'colgroup');
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var fromRowsOrColGroups = function (elems, getSection) {
 | |
|       return map$1(elems, function (row) {
 | |
|         if (name(row) === 'colgroup') {
 | |
|           var cells = map$1(columns$1(row), function (column) {
 | |
|             var colspan = getAttrValue(column, 'span', 1);
 | |
|             return detail(column, 1, colspan);
 | |
|           });
 | |
|           return rowdetail(row, cells, 'colgroup');
 | |
|         } else {
 | |
|           var cells = map$1(cells$1(row), function (cell) {
 | |
|             var rowspan = getAttrValue(cell, 'rowspan', 1);
 | |
|             var colspan = getAttrValue(cell, 'colspan', 1);
 | |
|             return detail(cell, rowspan, colspan);
 | |
|           });
 | |
|           return rowdetail(row, cells, getSection(row));
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var getParentSection = function (group) {
 | |
|       return parent(group).map(function (parent) {
 | |
|         var parentName = name(parent);
 | |
|         return isValidSection(parentName) ? parentName : 'tbody';
 | |
|       }).getOr('tbody');
 | |
|     };
 | |
|     var fromTable$1 = function (table) {
 | |
|       var rows = rows$1(table);
 | |
|       var columnGroups$1 = columnGroups(table);
 | |
|       var elems = __spreadArray(__spreadArray([], columnGroups$1, true), rows, true);
 | |
|       return fromRowsOrColGroups(elems, getParentSection);
 | |
|     };
 | |
|     var fromPastedRows = function (elems, section) {
 | |
|       return fromRowsOrColGroups(elems, function () {
 | |
|         return section;
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var addCells = function (gridRow, index, cells) {
 | |
|       var existingCells = gridRow.cells;
 | |
|       var before = existingCells.slice(0, index);
 | |
|       var after = existingCells.slice(index);
 | |
|       var newCells = before.concat(cells).concat(after);
 | |
|       return setCells(gridRow, newCells);
 | |
|     };
 | |
|     var addCell = function (gridRow, index, cell) {
 | |
|       return addCells(gridRow, index, [cell]);
 | |
|     };
 | |
|     var mutateCell = function (gridRow, index, cell) {
 | |
|       var cells = gridRow.cells;
 | |
|       cells[index] = cell;
 | |
|     };
 | |
|     var setCells = function (gridRow, cells) {
 | |
|       return rowcells(gridRow.element, cells, gridRow.section, gridRow.isNew);
 | |
|     };
 | |
|     var mapCells = function (gridRow, f) {
 | |
|       var cells = gridRow.cells;
 | |
|       var r = map$1(cells, f);
 | |
|       return rowcells(gridRow.element, r, gridRow.section, gridRow.isNew);
 | |
|     };
 | |
|     var getCell = function (gridRow, index) {
 | |
|       return gridRow.cells[index];
 | |
|     };
 | |
|     var getCellElement = function (gridRow, index) {
 | |
|       return getCell(gridRow, index).element;
 | |
|     };
 | |
|     var cellLength = function (gridRow) {
 | |
|       return gridRow.cells.length;
 | |
|     };
 | |
|     var extractGridDetails = function (grid) {
 | |
|       var result = partition(grid, function (row) {
 | |
|         return row.section === 'colgroup';
 | |
|       });
 | |
|       return {
 | |
|         rows: result.fail,
 | |
|         cols: result.pass
 | |
|       };
 | |
|     };
 | |
|     var clone$1 = function (gridRow, cloneRow, cloneCell) {
 | |
|       var newCells = map$1(gridRow.cells, cloneCell);
 | |
|       return rowcells(cloneRow(gridRow.element), newCells, gridRow.section, true);
 | |
|     };
 | |
| 
 | |
|     var LOCKED_COL_ATTR = 'data-snooker-locked-cols';
 | |
|     var getLockedColumnsFromTable = function (table) {
 | |
|       return getOpt(table, LOCKED_COL_ATTR).bind(function (lockedColStr) {
 | |
|         return Optional.from(lockedColStr.match(/\d+/g));
 | |
|       }).map(function (lockedCols) {
 | |
|         return mapToObject(lockedCols, always);
 | |
|       });
 | |
|     };
 | |
|     var getLockedColumnsFromGrid = function (grid) {
 | |
|       var locked = foldl(extractGridDetails(grid).rows, function (acc, row) {
 | |
|         each$2(row.cells, function (cell, idx) {
 | |
|           if (cell.isLocked) {
 | |
|             acc[idx] = true;
 | |
|           }
 | |
|         });
 | |
|         return acc;
 | |
|       }, {});
 | |
|       var lockedArr = mapToArray(locked, function (_val, key) {
 | |
|         return parseInt(key, 10);
 | |
|       });
 | |
|       return sort$1(lockedArr);
 | |
|     };
 | |
| 
 | |
|     var key = function (row, column) {
 | |
|       return row + ',' + column;
 | |
|     };
 | |
|     var getAt = function (warehouse, row, column) {
 | |
|       return Optional.from(warehouse.access[key(row, column)]);
 | |
|     };
 | |
|     var findItem = function (warehouse, item, comparator) {
 | |
|       var filtered = filterItems(warehouse, function (detail) {
 | |
|         return comparator(item, detail.element);
 | |
|       });
 | |
|       return filtered.length > 0 ? Optional.some(filtered[0]) : Optional.none();
 | |
|     };
 | |
|     var filterItems = function (warehouse, predicate) {
 | |
|       var all = bind$2(warehouse.all, function (r) {
 | |
|         return r.cells;
 | |
|       });
 | |
|       return filter$2(all, predicate);
 | |
|     };
 | |
|     var generateColumns = function (rowData) {
 | |
|       var columnsGroup = {};
 | |
|       var index = 0;
 | |
|       each$2(rowData.cells, function (column) {
 | |
|         var colspan = column.colspan;
 | |
|         range$1(colspan, function (columnIndex) {
 | |
|           var colIndex = index + columnIndex;
 | |
|           columnsGroup[colIndex] = columnext(column.element, colspan, colIndex);
 | |
|         });
 | |
|         index += colspan;
 | |
|       });
 | |
|       return columnsGroup;
 | |
|     };
 | |
|     var generate$1 = function (list) {
 | |
|       var access = {};
 | |
|       var cells = [];
 | |
|       var tableOpt = head(list).map(function (rowData) {
 | |
|         return rowData.element;
 | |
|       }).bind(table);
 | |
|       var lockedColumns = tableOpt.bind(getLockedColumnsFromTable).getOr({});
 | |
|       var maxRows = 0;
 | |
|       var maxColumns = 0;
 | |
|       var rowCount = 0;
 | |
|       var _a = partition(list, function (rowData) {
 | |
|           return rowData.section === 'colgroup';
 | |
|         }), colgroupRows = _a.pass, rows = _a.fail;
 | |
|       each$2(rows, function (rowData) {
 | |
|         var currentRow = [];
 | |
|         each$2(rowData.cells, function (rowCell) {
 | |
|           var start = 0;
 | |
|           while (access[key(rowCount, start)] !== undefined) {
 | |
|             start++;
 | |
|           }
 | |
|           var isLocked = hasNonNullableKey(lockedColumns, start.toString());
 | |
|           var current = extended(rowCell.element, rowCell.rowspan, rowCell.colspan, rowCount, start, isLocked);
 | |
|           for (var occupiedColumnPosition = 0; occupiedColumnPosition < rowCell.colspan; occupiedColumnPosition++) {
 | |
|             for (var occupiedRowPosition = 0; occupiedRowPosition < rowCell.rowspan; occupiedRowPosition++) {
 | |
|               var rowPosition = rowCount + occupiedRowPosition;
 | |
|               var columnPosition = start + occupiedColumnPosition;
 | |
|               var newpos = key(rowPosition, columnPosition);
 | |
|               access[newpos] = current;
 | |
|               maxColumns = Math.max(maxColumns, columnPosition + 1);
 | |
|             }
 | |
|           }
 | |
|           currentRow.push(current);
 | |
|         });
 | |
|         maxRows++;
 | |
|         cells.push(rowdetail(rowData.element, currentRow, rowData.section));
 | |
|         rowCount++;
 | |
|       });
 | |
|       var _b = last$2(colgroupRows).map(function (rowData) {
 | |
|           var columns = generateColumns(rowData);
 | |
|           var colgroup$1 = colgroup(rowData.element, values(columns));
 | |
|           return {
 | |
|             colgroups: [colgroup$1],
 | |
|             columns: columns
 | |
|           };
 | |
|         }).getOrThunk(function () {
 | |
|           return {
 | |
|             colgroups: [],
 | |
|             columns: {}
 | |
|           };
 | |
|         }), columns = _b.columns, colgroups = _b.colgroups;
 | |
|       var grid$1 = grid(maxRows, maxColumns);
 | |
|       return {
 | |
|         grid: grid$1,
 | |
|         access: access,
 | |
|         all: cells,
 | |
|         columns: columns,
 | |
|         colgroups: colgroups
 | |
|       };
 | |
|     };
 | |
|     var fromTable = function (table) {
 | |
|       var list = fromTable$1(table);
 | |
|       return generate$1(list);
 | |
|     };
 | |
|     var justCells = function (warehouse) {
 | |
|       return bind$2(warehouse.all, function (w) {
 | |
|         return w.cells;
 | |
|       });
 | |
|     };
 | |
|     var justColumns = function (warehouse) {
 | |
|       return values(warehouse.columns);
 | |
|     };
 | |
|     var hasColumns = function (warehouse) {
 | |
|       return keys(warehouse.columns).length > 0;
 | |
|     };
 | |
|     var getColumnAt = function (warehouse, columnIndex) {
 | |
|       return Optional.from(warehouse.columns[columnIndex]);
 | |
|     };
 | |
|     var Warehouse = {
 | |
|       fromTable: fromTable,
 | |
|       generate: generate$1,
 | |
|       getAt: getAt,
 | |
|       findItem: findItem,
 | |
|       filterItems: filterItems,
 | |
|       justCells: justCells,
 | |
|       justColumns: justColumns,
 | |
|       hasColumns: hasColumns,
 | |
|       getColumnAt: getColumnAt
 | |
|     };
 | |
| 
 | |
|     var inSelection = function (bounds, detail) {
 | |
|       var leftEdge = detail.column;
 | |
|       var rightEdge = detail.column + detail.colspan - 1;
 | |
|       var topEdge = detail.row;
 | |
|       var bottomEdge = detail.row + detail.rowspan - 1;
 | |
|       return leftEdge <= bounds.finishCol && rightEdge >= bounds.startCol && (topEdge <= bounds.finishRow && bottomEdge >= bounds.startRow);
 | |
|     };
 | |
|     var isWithin = function (bounds, detail) {
 | |
|       return detail.column >= bounds.startCol && detail.column + detail.colspan - 1 <= bounds.finishCol && detail.row >= bounds.startRow && detail.row + detail.rowspan - 1 <= bounds.finishRow;
 | |
|     };
 | |
|     var isRectangular = function (warehouse, bounds) {
 | |
|       var isRect = true;
 | |
|       var detailIsWithin = curry(isWithin, bounds);
 | |
|       for (var i = bounds.startRow; i <= bounds.finishRow; i++) {
 | |
|         for (var j = bounds.startCol; j <= bounds.finishCol; j++) {
 | |
|           isRect = isRect && Warehouse.getAt(warehouse, i, j).exists(detailIsWithin);
 | |
|         }
 | |
|       }
 | |
|       return isRect ? Optional.some(bounds) : Optional.none();
 | |
|     };
 | |
| 
 | |
|     var getBounds = function (detailA, detailB) {
 | |
|       return bounds(Math.min(detailA.row, detailB.row), Math.min(detailA.column, detailB.column), Math.max(detailA.row + detailA.rowspan - 1, detailB.row + detailB.rowspan - 1), Math.max(detailA.column + detailA.colspan - 1, detailB.column + detailB.colspan - 1));
 | |
|     };
 | |
|     var getAnyBox = function (warehouse, startCell, finishCell) {
 | |
|       var startCoords = Warehouse.findItem(warehouse, startCell, eq$1);
 | |
|       var finishCoords = Warehouse.findItem(warehouse, finishCell, eq$1);
 | |
|       return startCoords.bind(function (sc) {
 | |
|         return finishCoords.map(function (fc) {
 | |
|           return getBounds(sc, fc);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var getBox$1 = function (warehouse, startCell, finishCell) {
 | |
|       return getAnyBox(warehouse, startCell, finishCell).bind(function (bounds) {
 | |
|         return isRectangular(warehouse, bounds);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var moveBy$1 = function (warehouse, cell, row, column) {
 | |
|       return Warehouse.findItem(warehouse, cell, eq$1).bind(function (detail) {
 | |
|         var startRow = row > 0 ? detail.row + detail.rowspan - 1 : detail.row;
 | |
|         var startCol = column > 0 ? detail.column + detail.colspan - 1 : detail.column;
 | |
|         var dest = Warehouse.getAt(warehouse, startRow + row, startCol + column);
 | |
|         return dest.map(function (d) {
 | |
|           return d.element;
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var intercepts$1 = function (warehouse, start, finish) {
 | |
|       return getAnyBox(warehouse, start, finish).map(function (bounds) {
 | |
|         var inside = Warehouse.filterItems(warehouse, curry(inSelection, bounds));
 | |
|         return map$1(inside, function (detail) {
 | |
|           return detail.element;
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var parentCell = function (warehouse, innerCell) {
 | |
|       var isContainedBy = function (c1, c2) {
 | |
|         return contains(c2, c1);
 | |
|       };
 | |
|       return Warehouse.findItem(warehouse, innerCell, isContainedBy).map(function (detail) {
 | |
|         return detail.element;
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var moveBy = function (cell, deltaRow, deltaColumn) {
 | |
|       return table(cell).bind(function (table) {
 | |
|         var warehouse = getWarehouse(table);
 | |
|         return moveBy$1(warehouse, cell, deltaRow, deltaColumn);
 | |
|       });
 | |
|     };
 | |
|     var intercepts = function (table, first, last) {
 | |
|       var warehouse = getWarehouse(table);
 | |
|       return intercepts$1(warehouse, first, last);
 | |
|     };
 | |
|     var nestedIntercepts = function (table, first, firstTable, last, lastTable) {
 | |
|       var warehouse = getWarehouse(table);
 | |
|       var optStartCell = eq$1(table, firstTable) ? Optional.some(first) : parentCell(warehouse, first);
 | |
|       var optLastCell = eq$1(table, lastTable) ? Optional.some(last) : parentCell(warehouse, last);
 | |
|       return optStartCell.bind(function (startCell) {
 | |
|         return optLastCell.bind(function (lastCell) {
 | |
|           return intercepts$1(warehouse, startCell, lastCell);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var getBox = function (table, first, last) {
 | |
|       var warehouse = getWarehouse(table);
 | |
|       return getBox$1(warehouse, first, last);
 | |
|     };
 | |
|     var getWarehouse = Warehouse.fromTable;
 | |
| 
 | |
|     var before$4 = function (marker, element) {
 | |
|       var parent$1 = parent(marker);
 | |
|       parent$1.each(function (v) {
 | |
|         v.dom.insertBefore(element.dom, marker.dom);
 | |
|       });
 | |
|     };
 | |
|     var after$5 = function (marker, element) {
 | |
|       var sibling = nextSibling(marker);
 | |
|       sibling.fold(function () {
 | |
|         var parent$1 = parent(marker);
 | |
|         parent$1.each(function (v) {
 | |
|           append$1(v, element);
 | |
|         });
 | |
|       }, function (v) {
 | |
|         before$4(v, element);
 | |
|       });
 | |
|     };
 | |
|     var prepend = function (parent, element) {
 | |
|       var firstChild$1 = firstChild(parent);
 | |
|       firstChild$1.fold(function () {
 | |
|         append$1(parent, element);
 | |
|       }, function (v) {
 | |
|         parent.dom.insertBefore(element.dom, v.dom);
 | |
|       });
 | |
|     };
 | |
|     var append$1 = function (parent, element) {
 | |
|       parent.dom.appendChild(element.dom);
 | |
|     };
 | |
|     var appendAt = function (parent, element, index) {
 | |
|       child$3(parent, index).fold(function () {
 | |
|         append$1(parent, element);
 | |
|       }, function (v) {
 | |
|         before$4(v, element);
 | |
|       });
 | |
|     };
 | |
|     var wrap = function (element, wrapper) {
 | |
|       before$4(element, wrapper);
 | |
|       append$1(wrapper, element);
 | |
|     };
 | |
| 
 | |
|     var before$3 = function (marker, elements) {
 | |
|       each$2(elements, function (x) {
 | |
|         before$4(marker, x);
 | |
|       });
 | |
|     };
 | |
|     var after$4 = function (marker, elements) {
 | |
|       each$2(elements, function (x, i) {
 | |
|         var e = i === 0 ? marker : elements[i - 1];
 | |
|         after$5(e, x);
 | |
|       });
 | |
|     };
 | |
|     var append = function (parent, elements) {
 | |
|       each$2(elements, function (x) {
 | |
|         append$1(parent, x);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var empty = function (element) {
 | |
|       element.dom.textContent = '';
 | |
|       each$2(children$3(element), function (rogue) {
 | |
|         remove$5(rogue);
 | |
|       });
 | |
|     };
 | |
|     var remove$5 = function (element) {
 | |
|       var dom = element.dom;
 | |
|       if (dom.parentNode !== null) {
 | |
|         dom.parentNode.removeChild(dom);
 | |
|       }
 | |
|     };
 | |
|     var unwrap = function (wrapper) {
 | |
|       var children = children$3(wrapper);
 | |
|       if (children.length > 0) {
 | |
|         before$3(wrapper, children);
 | |
|       }
 | |
|       remove$5(wrapper);
 | |
|     };
 | |
| 
 | |
|     var NodeValue = function (is, name) {
 | |
|       var get = function (element) {
 | |
|         if (!is(element)) {
 | |
|           throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
 | |
|         }
 | |
|         return getOption(element).getOr('');
 | |
|       };
 | |
|       var getOption = function (element) {
 | |
|         return is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
 | |
|       };
 | |
|       var set = function (element, value) {
 | |
|         if (!is(element)) {
 | |
|           throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
 | |
|         }
 | |
|         element.dom.nodeValue = value;
 | |
|       };
 | |
|       return {
 | |
|         get: get,
 | |
|         getOption: getOption,
 | |
|         set: set
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var api$2 = NodeValue(isText, 'text');
 | |
|     var get$9 = function (element) {
 | |
|       return api$2.get(element);
 | |
|     };
 | |
|     var getOption = function (element) {
 | |
|       return api$2.getOption(element);
 | |
|     };
 | |
|     var set = function (element, value) {
 | |
|       return api$2.set(element, value);
 | |
|     };
 | |
| 
 | |
|     var TagBoundaries = [
 | |
|       'body',
 | |
|       'p',
 | |
|       'div',
 | |
|       'article',
 | |
|       'aside',
 | |
|       'figcaption',
 | |
|       'figure',
 | |
|       'footer',
 | |
|       'header',
 | |
|       'nav',
 | |
|       'section',
 | |
|       'ol',
 | |
|       'ul',
 | |
|       'li',
 | |
|       'table',
 | |
|       'thead',
 | |
|       'tbody',
 | |
|       'tfoot',
 | |
|       'caption',
 | |
|       'tr',
 | |
|       'td',
 | |
|       'th',
 | |
|       'h1',
 | |
|       'h2',
 | |
|       'h3',
 | |
|       'h4',
 | |
|       'h5',
 | |
|       'h6',
 | |
|       'blockquote',
 | |
|       'pre',
 | |
|       'address'
 | |
|     ];
 | |
| 
 | |
|     function DomUniverse () {
 | |
|       var clone = function (element) {
 | |
|         return SugarElement.fromDom(element.dom.cloneNode(false));
 | |
|       };
 | |
|       var document = function (element) {
 | |
|         return documentOrOwner(element).dom;
 | |
|       };
 | |
|       var isBoundary = function (element) {
 | |
|         if (!isElement(element)) {
 | |
|           return false;
 | |
|         }
 | |
|         if (name(element) === 'body') {
 | |
|           return true;
 | |
|         }
 | |
|         return contains$2(TagBoundaries, name(element));
 | |
|       };
 | |
|       var isEmptyTag = function (element) {
 | |
|         if (!isElement(element)) {
 | |
|           return false;
 | |
|         }
 | |
|         return contains$2([
 | |
|           'br',
 | |
|           'img',
 | |
|           'hr',
 | |
|           'input'
 | |
|         ], name(element));
 | |
|       };
 | |
|       var isNonEditable = function (element) {
 | |
|         return isElement(element) && get$b(element, 'contenteditable') === 'false';
 | |
|       };
 | |
|       var comparePosition = function (element, other) {
 | |
|         return element.dom.compareDocumentPosition(other.dom);
 | |
|       };
 | |
|       var copyAttributesTo = function (source, destination) {
 | |
|         var as = clone$2(source);
 | |
|         setAll$1(destination, as);
 | |
|       };
 | |
|       var isSpecial = function (element) {
 | |
|         var tag = name(element);
 | |
|         return contains$2([
 | |
|           'script',
 | |
|           'noscript',
 | |
|           'iframe',
 | |
|           'noframes',
 | |
|           'noembed',
 | |
|           'title',
 | |
|           'style',
 | |
|           'textarea',
 | |
|           'xmp'
 | |
|         ], tag);
 | |
|       };
 | |
|       var getLanguage = function (element) {
 | |
|         return isElement(element) ? getOpt(element, 'lang') : Optional.none();
 | |
|       };
 | |
|       return {
 | |
|         up: constant({
 | |
|           selector: ancestor$1,
 | |
|           closest: closest$1,
 | |
|           predicate: ancestor$2,
 | |
|           all: parents
 | |
|         }),
 | |
|         down: constant({
 | |
|           selector: descendants,
 | |
|           predicate: descendants$1
 | |
|         }),
 | |
|         styles: constant({
 | |
|           get: get$a,
 | |
|           getRaw: getRaw$2,
 | |
|           set: set$1,
 | |
|           remove: remove$6
 | |
|         }),
 | |
|         attrs: constant({
 | |
|           get: get$b,
 | |
|           set: set$2,
 | |
|           remove: remove$7,
 | |
|           copyTo: copyAttributesTo
 | |
|         }),
 | |
|         insert: constant({
 | |
|           before: before$4,
 | |
|           after: after$5,
 | |
|           afterAll: after$4,
 | |
|           append: append$1,
 | |
|           appendAll: append,
 | |
|           prepend: prepend,
 | |
|           wrap: wrap
 | |
|         }),
 | |
|         remove: constant({
 | |
|           unwrap: unwrap,
 | |
|           remove: remove$5
 | |
|         }),
 | |
|         create: constant({
 | |
|           nu: SugarElement.fromTag,
 | |
|           clone: clone,
 | |
|           text: SugarElement.fromText
 | |
|         }),
 | |
|         query: constant({
 | |
|           comparePosition: comparePosition,
 | |
|           prevSibling: prevSibling,
 | |
|           nextSibling: nextSibling
 | |
|         }),
 | |
|         property: constant({
 | |
|           children: children$3,
 | |
|           name: name,
 | |
|           parent: parent,
 | |
|           document: document,
 | |
|           isText: isText,
 | |
|           isComment: isComment,
 | |
|           isElement: isElement,
 | |
|           isSpecial: isSpecial,
 | |
|           getLanguage: getLanguage,
 | |
|           getText: get$9,
 | |
|           setText: set,
 | |
|           isBoundary: isBoundary,
 | |
|           isEmptyTag: isEmptyTag,
 | |
|           isNonEditable: isNonEditable
 | |
|         }),
 | |
|         eq: eq$1,
 | |
|         is: is$1
 | |
|       };
 | |
|     }
 | |
| 
 | |
|     var all = function (universe, look, elements, f) {
 | |
|       var head = elements[0];
 | |
|       var tail = elements.slice(1);
 | |
|       return f(universe, look, head, tail);
 | |
|     };
 | |
|     var oneAll = function (universe, look, elements) {
 | |
|       return elements.length > 0 ? all(universe, look, elements, unsafeOne) : Optional.none();
 | |
|     };
 | |
|     var unsafeOne = function (universe, look, head, tail) {
 | |
|       var start = look(universe, head);
 | |
|       return foldr(tail, function (b, a) {
 | |
|         var current = look(universe, a);
 | |
|         return commonElement(universe, b, current);
 | |
|       }, start);
 | |
|     };
 | |
|     var commonElement = function (universe, start, end) {
 | |
|       return start.bind(function (s) {
 | |
|         return end.filter(curry(universe.eq, s));
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var eq = function (universe, item) {
 | |
|       return curry(universe.eq, item);
 | |
|     };
 | |
|     var ancestors$2 = function (universe, start, end, isRoot) {
 | |
|       if (isRoot === void 0) {
 | |
|         isRoot = never;
 | |
|       }
 | |
|       var ps1 = [start].concat(universe.up().all(start));
 | |
|       var ps2 = [end].concat(universe.up().all(end));
 | |
|       var prune = function (path) {
 | |
|         var index = findIndex(path, isRoot);
 | |
|         return index.fold(function () {
 | |
|           return path;
 | |
|         }, function (ind) {
 | |
|           return path.slice(0, ind + 1);
 | |
|         });
 | |
|       };
 | |
|       var pruned1 = prune(ps1);
 | |
|       var pruned2 = prune(ps2);
 | |
|       var shared = find$1(pruned1, function (x) {
 | |
|         return exists(pruned2, eq(universe, x));
 | |
|       });
 | |
|       return {
 | |
|         firstpath: pruned1,
 | |
|         secondpath: pruned2,
 | |
|         shared: shared
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var sharedOne$1 = oneAll;
 | |
|     var ancestors$1 = ancestors$2;
 | |
| 
 | |
|     var universe$3 = DomUniverse();
 | |
|     var sharedOne = function (look, elements) {
 | |
|       return sharedOne$1(universe$3, function (_universe, element) {
 | |
|         return look(element);
 | |
|       }, elements);
 | |
|     };
 | |
|     var ancestors = function (start, finish, isRoot) {
 | |
|       return ancestors$1(universe$3, start, finish, isRoot);
 | |
|     };
 | |
| 
 | |
|     var lookupTable = function (container) {
 | |
|       return ancestor$1(container, 'table');
 | |
|     };
 | |
|     var identify = function (start, finish, isRoot) {
 | |
|       var getIsRoot = function (rootTable) {
 | |
|         return function (element) {
 | |
|           return isRoot !== undefined && isRoot(element) || eq$1(element, rootTable);
 | |
|         };
 | |
|       };
 | |
|       if (eq$1(start, finish)) {
 | |
|         return Optional.some({
 | |
|           boxes: Optional.some([start]),
 | |
|           start: start,
 | |
|           finish: finish
 | |
|         });
 | |
|       } else {
 | |
|         return lookupTable(start).bind(function (startTable) {
 | |
|           return lookupTable(finish).bind(function (finishTable) {
 | |
|             if (eq$1(startTable, finishTable)) {
 | |
|               return Optional.some({
 | |
|                 boxes: intercepts(startTable, start, finish),
 | |
|                 start: start,
 | |
|                 finish: finish
 | |
|               });
 | |
|             } else if (contains(startTable, finishTable)) {
 | |
|               var ancestorCells = ancestors$3(finish, 'td,th', getIsRoot(startTable));
 | |
|               var finishCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : finish;
 | |
|               return Optional.some({
 | |
|                 boxes: nestedIntercepts(startTable, start, startTable, finish, finishTable),
 | |
|                 start: start,
 | |
|                 finish: finishCell
 | |
|               });
 | |
|             } else if (contains(finishTable, startTable)) {
 | |
|               var ancestorCells = ancestors$3(start, 'td,th', getIsRoot(finishTable));
 | |
|               var startCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : start;
 | |
|               return Optional.some({
 | |
|                 boxes: nestedIntercepts(finishTable, start, startTable, finish, finishTable),
 | |
|                 start: start,
 | |
|                 finish: startCell
 | |
|               });
 | |
|             } else {
 | |
|               return ancestors(start, finish).shared.bind(function (lca) {
 | |
|                 return closest$1(lca, 'table', isRoot).bind(function (lcaTable) {
 | |
|                   var finishAncestorCells = ancestors$3(finish, 'td,th', getIsRoot(lcaTable));
 | |
|                   var finishCell = finishAncestorCells.length > 0 ? finishAncestorCells[finishAncestorCells.length - 1] : finish;
 | |
|                   var startAncestorCells = ancestors$3(start, 'td,th', getIsRoot(lcaTable));
 | |
|                   var startCell = startAncestorCells.length > 0 ? startAncestorCells[startAncestorCells.length - 1] : start;
 | |
|                   return Optional.some({
 | |
|                     boxes: nestedIntercepts(lcaTable, start, startTable, finish, finishTable),
 | |
|                     start: startCell,
 | |
|                     finish: finishCell
 | |
|                   });
 | |
|                 });
 | |
|               });
 | |
|             }
 | |
|           });
 | |
|         });
 | |
|       }
 | |
|     };
 | |
|     var retrieve$1 = function (container, selector) {
 | |
|       var sels = descendants(container, selector);
 | |
|       return sels.length > 0 ? Optional.some(sels) : Optional.none();
 | |
|     };
 | |
|     var getLast = function (boxes, lastSelectedSelector) {
 | |
|       return find$1(boxes, function (box) {
 | |
|         return is$2(box, lastSelectedSelector);
 | |
|       });
 | |
|     };
 | |
|     var getEdges = function (container, firstSelectedSelector, lastSelectedSelector) {
 | |
|       return descendant(container, firstSelectedSelector).bind(function (first) {
 | |
|         return descendant(container, lastSelectedSelector).bind(function (last) {
 | |
|           return sharedOne(lookupTable, [
 | |
|             first,
 | |
|             last
 | |
|           ]).map(function (table) {
 | |
|             return {
 | |
|               first: first,
 | |
|               last: last,
 | |
|               table: table
 | |
|             };
 | |
|           });
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var expandTo = function (finish, firstSelectedSelector) {
 | |
|       return ancestor$1(finish, 'table').bind(function (table) {
 | |
|         return descendant(table, firstSelectedSelector).bind(function (start) {
 | |
|           return identify(start, finish).bind(function (identified) {
 | |
|             return identified.boxes.map(function (boxes) {
 | |
|               return {
 | |
|                 boxes: boxes,
 | |
|                 start: identified.start,
 | |
|                 finish: identified.finish
 | |
|               };
 | |
|             });
 | |
|           });
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var shiftSelection = function (boxes, deltaRow, deltaColumn, firstSelectedSelector, lastSelectedSelector) {
 | |
|       return getLast(boxes, lastSelectedSelector).bind(function (last) {
 | |
|         return moveBy(last, deltaRow, deltaColumn).bind(function (finish) {
 | |
|           return expandTo(finish, firstSelectedSelector);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var retrieve = function (container, selector) {
 | |
|       return retrieve$1(container, selector);
 | |
|     };
 | |
|     var retrieveBox = function (container, firstSelectedSelector, lastSelectedSelector) {
 | |
|       return getEdges(container, firstSelectedSelector, lastSelectedSelector).bind(function (edges) {
 | |
|         var isRoot = function (ancestor) {
 | |
|           return eq$1(container, ancestor);
 | |
|         };
 | |
|         var sectionSelector = 'thead,tfoot,tbody,table';
 | |
|         var firstAncestor = ancestor$1(edges.first, sectionSelector, isRoot);
 | |
|         var lastAncestor = ancestor$1(edges.last, sectionSelector, isRoot);
 | |
|         return firstAncestor.bind(function (fA) {
 | |
|           return lastAncestor.bind(function (lA) {
 | |
|             return eq$1(fA, lA) ? getBox(edges.table, edges.first, edges.last) : Optional.none();
 | |
|           });
 | |
|         });
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var generate = function (cases) {
 | |
|       if (!isArray(cases)) {
 | |
|         throw new Error('cases must be an array');
 | |
|       }
 | |
|       if (cases.length === 0) {
 | |
|         throw new Error('there must be at least one case');
 | |
|       }
 | |
|       var constructors = [];
 | |
|       var adt = {};
 | |
|       each$2(cases, function (acase, count) {
 | |
|         var keys$1 = keys(acase);
 | |
|         if (keys$1.length !== 1) {
 | |
|           throw new Error('one and only one name per case');
 | |
|         }
 | |
|         var key = keys$1[0];
 | |
|         var value = acase[key];
 | |
|         if (adt[key] !== undefined) {
 | |
|           throw new Error('duplicate key detected:' + key);
 | |
|         } else if (key === 'cata') {
 | |
|           throw new Error('cannot have a case named cata (sorry)');
 | |
|         } else if (!isArray(value)) {
 | |
|           throw new Error('case arguments must be an array');
 | |
|         }
 | |
|         constructors.push(key);
 | |
|         adt[key] = function () {
 | |
|           var args = [];
 | |
|           for (var _i = 0; _i < arguments.length; _i++) {
 | |
|             args[_i] = arguments[_i];
 | |
|           }
 | |
|           var argLength = args.length;
 | |
|           if (argLength !== value.length) {
 | |
|             throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
 | |
|           }
 | |
|           var match = function (branches) {
 | |
|             var branchKeys = keys(branches);
 | |
|             if (constructors.length !== branchKeys.length) {
 | |
|               throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(','));
 | |
|             }
 | |
|             var allReqd = forall(constructors, function (reqKey) {
 | |
|               return contains$2(branchKeys, reqKey);
 | |
|             });
 | |
|             if (!allReqd) {
 | |
|               throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
 | |
|             }
 | |
|             return branches[key].apply(null, args);
 | |
|           };
 | |
|           return {
 | |
|             fold: function () {
 | |
|               var foldArgs = [];
 | |
|               for (var _i = 0; _i < arguments.length; _i++) {
 | |
|                 foldArgs[_i] = arguments[_i];
 | |
|               }
 | |
|               if (foldArgs.length !== cases.length) {
 | |
|                 throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);
 | |
|               }
 | |
|               var target = foldArgs[count];
 | |
|               return target.apply(null, args);
 | |
|             },
 | |
|             match: match,
 | |
|             log: function (label) {
 | |
|               console.log(label, {
 | |
|                 constructors: constructors,
 | |
|                 constructor: key,
 | |
|                 params: args
 | |
|               });
 | |
|             }
 | |
|           };
 | |
|         };
 | |
|       });
 | |
|       return adt;
 | |
|     };
 | |
|     var Adt = { generate: generate };
 | |
| 
 | |
|     var type = Adt.generate([
 | |
|       { none: [] },
 | |
|       { multiple: ['elements'] },
 | |
|       { single: ['element'] }
 | |
|     ]);
 | |
|     var cata$2 = function (subject, onNone, onMultiple, onSingle) {
 | |
|       return subject.fold(onNone, onMultiple, onSingle);
 | |
|     };
 | |
|     var none$1 = type.none;
 | |
|     var multiple = type.multiple;
 | |
|     var single = type.single;
 | |
| 
 | |
|     var Selections = function (lazyRoot, getStart, selectedSelector) {
 | |
|       var get = function () {
 | |
|         return retrieve(lazyRoot(), selectedSelector).fold(function () {
 | |
|           return getStart().fold(none$1, single);
 | |
|         }, function (cells) {
 | |
|           return multiple(cells);
 | |
|         });
 | |
|       };
 | |
|       return { get: get };
 | |
|     };
 | |
| 
 | |
|     var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager');
 | |
| 
 | |
|     var clone = function (original, isDeep) {
 | |
|       return SugarElement.fromDom(original.dom.cloneNode(isDeep));
 | |
|     };
 | |
|     var shallow = function (original) {
 | |
|       return clone(original, false);
 | |
|     };
 | |
|     var deep = function (original) {
 | |
|       return clone(original, true);
 | |
|     };
 | |
|     var shallowAs = function (original, tag) {
 | |
|       var nu = SugarElement.fromTag(tag);
 | |
|       var attributes = clone$2(original);
 | |
|       setAll$1(nu, attributes);
 | |
|       return nu;
 | |
|     };
 | |
|     var copy$1 = function (original, tag) {
 | |
|       var nu = shallowAs(original, tag);
 | |
|       var cloneChildren = children$3(deep(original));
 | |
|       append(nu, cloneChildren);
 | |
|       return nu;
 | |
|     };
 | |
|     var mutate$1 = function (original, tag) {
 | |
|       var nu = shallowAs(original, tag);
 | |
|       before$4(original, nu);
 | |
|       var children = children$3(original);
 | |
|       append(nu, children);
 | |
|       remove$5(original);
 | |
|       return nu;
 | |
|     };
 | |
| 
 | |
|     var Dimension = function (name, getOffset) {
 | |
|       var set = function (element, h) {
 | |
|         if (!isNumber(h) && !h.match(/^[0-9]+$/)) {
 | |
|           throw new Error(name + '.set accepts only positive integer values. Value was ' + h);
 | |
|         }
 | |
|         var dom = element.dom;
 | |
|         if (isSupported(dom)) {
 | |
|           dom.style[name] = h + 'px';
 | |
|         }
 | |
|       };
 | |
|       var get = function (element) {
 | |
|         var r = getOffset(element);
 | |
|         if (r <= 0 || r === null) {
 | |
|           var css = get$a(element, name);
 | |
|           return parseFloat(css) || 0;
 | |
|         }
 | |
|         return r;
 | |
|       };
 | |
|       var getOuter = get;
 | |
|       var aggregate = function (element, properties) {
 | |
|         return foldl(properties, function (acc, property) {
 | |
|           var val = get$a(element, property);
 | |
|           var value = val === undefined ? 0 : parseInt(val, 10);
 | |
|           return isNaN(value) ? acc : acc + value;
 | |
|         }, 0);
 | |
|       };
 | |
|       var max = function (element, value, properties) {
 | |
|         var cumulativeInclusions = aggregate(element, properties);
 | |
|         var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;
 | |
|         return absoluteMax;
 | |
|       };
 | |
|       return {
 | |
|         set: set,
 | |
|         get: get,
 | |
|         getOuter: getOuter,
 | |
|         aggregate: aggregate,
 | |
|         max: max
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var needManualCalc = function () {
 | |
|       var browser = detect$3().browser;
 | |
|       return browser.isIE() || browser.isEdge();
 | |
|     };
 | |
|     var toNumber = function (px, fallback) {
 | |
|       return toFloat(px).getOr(fallback);
 | |
|     };
 | |
|     var getProp = function (element, name, fallback) {
 | |
|       return toNumber(get$a(element, name), fallback);
 | |
|     };
 | |
|     var getBoxSizing = function (element) {
 | |
|       return get$a(element, 'box-sizing');
 | |
|     };
 | |
|     var calcContentBoxSize = function (element, size, upper, lower) {
 | |
|       var paddingUpper = getProp(element, 'padding-' + upper, 0);
 | |
|       var paddingLower = getProp(element, 'padding-' + lower, 0);
 | |
|       var borderUpper = getProp(element, 'border-' + upper + '-width', 0);
 | |
|       var borderLower = getProp(element, 'border-' + lower + '-width', 0);
 | |
|       return size - paddingUpper - paddingLower - borderUpper - borderLower;
 | |
|     };
 | |
|     var getCalculatedHeight = function (element, boxSizing) {
 | |
|       var dom = element.dom;
 | |
|       var height = dom.getBoundingClientRect().height || dom.offsetHeight;
 | |
|       return boxSizing === 'border-box' ? height : calcContentBoxSize(element, height, 'top', 'bottom');
 | |
|     };
 | |
|     var getCalculatedWidth = function (element, boxSizing) {
 | |
|       var dom = element.dom;
 | |
|       var width = dom.getBoundingClientRect().width || dom.offsetWidth;
 | |
|       return boxSizing === 'border-box' ? width : calcContentBoxSize(element, width, 'left', 'right');
 | |
|     };
 | |
|     var getHeight$1 = function (element) {
 | |
|       return needManualCalc() ? getCalculatedHeight(element, getBoxSizing(element)) : getProp(element, 'height', element.dom.offsetHeight);
 | |
|     };
 | |
|     var getWidth = function (element) {
 | |
|       return needManualCalc() ? getCalculatedWidth(element, getBoxSizing(element)) : getProp(element, 'width', element.dom.offsetWidth);
 | |
|     };
 | |
|     var getInnerWidth = function (element) {
 | |
|       return getCalculatedWidth(element, 'content-box');
 | |
|     };
 | |
| 
 | |
|     var api$1 = Dimension('width', function (element) {
 | |
|       return element.dom.offsetWidth;
 | |
|     });
 | |
|     var get$8 = function (element) {
 | |
|       return api$1.get(element);
 | |
|     };
 | |
|     var getOuter$2 = function (element) {
 | |
|       return api$1.getOuter(element);
 | |
|     };
 | |
|     var getInner = getInnerWidth;
 | |
|     var getRuntime$1 = getWidth;
 | |
| 
 | |
|     var columns = function (warehouse, isValidCell) {
 | |
|       if (isValidCell === void 0) {
 | |
|         isValidCell = always;
 | |
|       }
 | |
|       var grid = warehouse.grid;
 | |
|       var cols = range$1(grid.columns, identity);
 | |
|       var rowsArr = range$1(grid.rows, identity);
 | |
|       return map$1(cols, function (col) {
 | |
|         var getBlock = function () {
 | |
|           return bind$2(rowsArr, function (r) {
 | |
|             return Warehouse.getAt(warehouse, r, col).filter(function (detail) {
 | |
|               return detail.column === col;
 | |
|             }).toArray();
 | |
|           });
 | |
|         };
 | |
|         var isValid = function (detail) {
 | |
|           return detail.colspan === 1 && isValidCell(detail.element);
 | |
|         };
 | |
|         var getFallback = function () {
 | |
|           return Warehouse.getAt(warehouse, 0, col);
 | |
|         };
 | |
|         return decide(getBlock, isValid, getFallback);
 | |
|       });
 | |
|     };
 | |
|     var decide = function (getBlock, isValid, getFallback) {
 | |
|       var inBlock = getBlock();
 | |
|       var validInBlock = find$1(inBlock, isValid);
 | |
|       var detailOption = validInBlock.orThunk(function () {
 | |
|         return Optional.from(inBlock[0]).orThunk(getFallback);
 | |
|       });
 | |
|       return detailOption.map(function (detail) {
 | |
|         return detail.element;
 | |
|       });
 | |
|     };
 | |
|     var rows = function (warehouse) {
 | |
|       var grid = warehouse.grid;
 | |
|       var rowsArr = range$1(grid.rows, identity);
 | |
|       var cols = range$1(grid.columns, identity);
 | |
|       return map$1(rowsArr, function (row) {
 | |
|         var getBlock = function () {
 | |
|           return bind$2(cols, function (c) {
 | |
|             return Warehouse.getAt(warehouse, row, c).filter(function (detail) {
 | |
|               return detail.row === row;
 | |
|             }).fold(constant([]), function (detail) {
 | |
|               return [detail];
 | |
|             });
 | |
|           });
 | |
|         };
 | |
|         var isSingle = function (detail) {
 | |
|           return detail.rowspan === 1;
 | |
|         };
 | |
|         var getFallback = function () {
 | |
|           return Warehouse.getAt(warehouse, row, 0);
 | |
|         };
 | |
|         return decide(getBlock, isSingle, getFallback);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var deduce = function (xs, index) {
 | |
|       if (index < 0 || index >= xs.length - 1) {
 | |
|         return Optional.none();
 | |
|       }
 | |
|       var current = xs[index].fold(function () {
 | |
|         var rest = reverse(xs.slice(0, index));
 | |
|         return findMap(rest, function (a, i) {
 | |
|           return a.map(function (aa) {
 | |
|             return {
 | |
|               value: aa,
 | |
|               delta: i + 1
 | |
|             };
 | |
|           });
 | |
|         });
 | |
|       }, function (c) {
 | |
|         return Optional.some({
 | |
|           value: c,
 | |
|           delta: 0
 | |
|         });
 | |
|       });
 | |
|       var next = xs[index + 1].fold(function () {
 | |
|         var rest = xs.slice(index + 1);
 | |
|         return findMap(rest, function (a, i) {
 | |
|           return a.map(function (aa) {
 | |
|             return {
 | |
|               value: aa,
 | |
|               delta: i + 1
 | |
|             };
 | |
|           });
 | |
|         });
 | |
|       }, function (n) {
 | |
|         return Optional.some({
 | |
|           value: n,
 | |
|           delta: 1
 | |
|         });
 | |
|       });
 | |
|       return current.bind(function (c) {
 | |
|         return next.map(function (n) {
 | |
|           var extras = n.delta + c.delta;
 | |
|           return Math.abs(n.value - c.value) / extras;
 | |
|         });
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var onDirection = function (isLtr, isRtl) {
 | |
|       return function (element) {
 | |
|         return getDirection(element) === 'rtl' ? isRtl : isLtr;
 | |
|       };
 | |
|     };
 | |
|     var getDirection = function (element) {
 | |
|       return get$a(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';
 | |
|     };
 | |
| 
 | |
|     var api = Dimension('height', function (element) {
 | |
|       var dom = element.dom;
 | |
|       return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;
 | |
|     });
 | |
|     var get$7 = function (element) {
 | |
|       return api.get(element);
 | |
|     };
 | |
|     var getOuter$1 = function (element) {
 | |
|       return api.getOuter(element);
 | |
|     };
 | |
|     var getRuntime = getHeight$1;
 | |
| 
 | |
|     var r = function (left, top) {
 | |
|       var translate = function (x, y) {
 | |
|         return r(left + x, top + y);
 | |
|       };
 | |
|       return {
 | |
|         left: left,
 | |
|         top: top,
 | |
|         translate: translate
 | |
|       };
 | |
|     };
 | |
|     var SugarPosition = r;
 | |
| 
 | |
|     var boxPosition = function (dom) {
 | |
|       var box = dom.getBoundingClientRect();
 | |
|       return SugarPosition(box.left, box.top);
 | |
|     };
 | |
|     var firstDefinedOrZero = function (a, b) {
 | |
|       if (a !== undefined) {
 | |
|         return a;
 | |
|       } else {
 | |
|         return b !== undefined ? b : 0;
 | |
|       }
 | |
|     };
 | |
|     var absolute = function (element) {
 | |
|       var doc = element.dom.ownerDocument;
 | |
|       var body = doc.body;
 | |
|       var win = doc.defaultView;
 | |
|       var html = doc.documentElement;
 | |
|       if (body === element.dom) {
 | |
|         return SugarPosition(body.offsetLeft, body.offsetTop);
 | |
|       }
 | |
|       var scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop);
 | |
|       var scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft);
 | |
|       var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);
 | |
|       var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);
 | |
|       return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);
 | |
|     };
 | |
|     var viewport = function (element) {
 | |
|       var dom = element.dom;
 | |
|       var doc = dom.ownerDocument;
 | |
|       var body = doc.body;
 | |
|       if (body === dom) {
 | |
|         return SugarPosition(body.offsetLeft, body.offsetTop);
 | |
|       }
 | |
|       if (!inBody(element)) {
 | |
|         return SugarPosition(0, 0);
 | |
|       }
 | |
|       return boxPosition(dom);
 | |
|     };
 | |
| 
 | |
|     var rowInfo = function (row, y) {
 | |
|       return {
 | |
|         row: row,
 | |
|         y: y
 | |
|       };
 | |
|     };
 | |
|     var colInfo = function (col, x) {
 | |
|       return {
 | |
|         col: col,
 | |
|         x: x
 | |
|       };
 | |
|     };
 | |
|     var rtlEdge = function (cell) {
 | |
|       var pos = absolute(cell);
 | |
|       return pos.left + getOuter$2(cell);
 | |
|     };
 | |
|     var ltrEdge = function (cell) {
 | |
|       return absolute(cell).left;
 | |
|     };
 | |
|     var getLeftEdge = function (index, cell) {
 | |
|       return colInfo(index, ltrEdge(cell));
 | |
|     };
 | |
|     var getRightEdge = function (index, cell) {
 | |
|       return colInfo(index, rtlEdge(cell));
 | |
|     };
 | |
|     var getTop$1 = function (cell) {
 | |
|       return absolute(cell).top;
 | |
|     };
 | |
|     var getTopEdge = function (index, cell) {
 | |
|       return rowInfo(index, getTop$1(cell));
 | |
|     };
 | |
|     var getBottomEdge = function (index, cell) {
 | |
|       return rowInfo(index, getTop$1(cell) + getOuter$1(cell));
 | |
|     };
 | |
|     var findPositions = function (getInnerEdge, getOuterEdge, array) {
 | |
|       if (array.length === 0) {
 | |
|         return [];
 | |
|       }
 | |
|       var lines = map$1(array.slice(1), function (cellOption, index) {
 | |
|         return cellOption.map(function (cell) {
 | |
|           return getInnerEdge(index, cell);
 | |
|         });
 | |
|       });
 | |
|       var lastLine = array[array.length - 1].map(function (cell) {
 | |
|         return getOuterEdge(array.length - 1, cell);
 | |
|       });
 | |
|       return lines.concat([lastLine]);
 | |
|     };
 | |
|     var negate = function (step) {
 | |
|       return -step;
 | |
|     };
 | |
|     var height = {
 | |
|       delta: identity,
 | |
|       positions: function (optElements) {
 | |
|         return findPositions(getTopEdge, getBottomEdge, optElements);
 | |
|       },
 | |
|       edge: getTop$1
 | |
|     };
 | |
|     var ltr$1 = {
 | |
|       delta: identity,
 | |
|       edge: ltrEdge,
 | |
|       positions: function (optElements) {
 | |
|         return findPositions(getLeftEdge, getRightEdge, optElements);
 | |
|       }
 | |
|     };
 | |
|     var rtl$1 = {
 | |
|       delta: negate,
 | |
|       edge: rtlEdge,
 | |
|       positions: function (optElements) {
 | |
|         return findPositions(getRightEdge, getLeftEdge, optElements);
 | |
|       }
 | |
|     };
 | |
|     var detect$2 = onDirection(ltr$1, rtl$1);
 | |
|     var width = {
 | |
|       delta: function (amount, table) {
 | |
|         return detect$2(table).delta(amount, table);
 | |
|       },
 | |
|       positions: function (cols, table) {
 | |
|         return detect$2(table).positions(cols, table);
 | |
|       },
 | |
|       edge: function (cell) {
 | |
|         return detect$2(cell).edge(cell);
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var units = {
 | |
|       unsupportedLength: [
 | |
|         'em',
 | |
|         'ex',
 | |
|         'cap',
 | |
|         'ch',
 | |
|         'ic',
 | |
|         'rem',
 | |
|         'lh',
 | |
|         'rlh',
 | |
|         'vw',
 | |
|         'vh',
 | |
|         'vi',
 | |
|         'vb',
 | |
|         'vmin',
 | |
|         'vmax',
 | |
|         'cm',
 | |
|         'mm',
 | |
|         'Q',
 | |
|         'in',
 | |
|         'pc',
 | |
|         'pt',
 | |
|         'px'
 | |
|       ],
 | |
|       fixed: [
 | |
|         'px',
 | |
|         'pt'
 | |
|       ],
 | |
|       relative: ['%'],
 | |
|       empty: ['']
 | |
|     };
 | |
|     var pattern = function () {
 | |
|       var decimalDigits = '[0-9]+';
 | |
|       var signedInteger = '[+-]?' + decimalDigits;
 | |
|       var exponentPart = '[eE]' + signedInteger;
 | |
|       var dot = '\\.';
 | |
|       var opt = function (input) {
 | |
|         return '(?:' + input + ')?';
 | |
|       };
 | |
|       var unsignedDecimalLiteral = [
 | |
|         'Infinity',
 | |
|         decimalDigits + dot + opt(decimalDigits) + opt(exponentPart),
 | |
|         dot + decimalDigits + opt(exponentPart),
 | |
|         decimalDigits + opt(exponentPart)
 | |
|       ].join('|');
 | |
|       var float = '[+-]?(?:' + unsignedDecimalLiteral + ')';
 | |
|       return new RegExp('^(' + float + ')(.*)$');
 | |
|     }();
 | |
|     var isUnit = function (unit, accepted) {
 | |
|       return exists(accepted, function (acc) {
 | |
|         return exists(units[acc], function (check) {
 | |
|           return unit === check;
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var parse = function (input, accepted) {
 | |
|       var match = Optional.from(pattern.exec(input));
 | |
|       return match.bind(function (array) {
 | |
|         var value = Number(array[1]);
 | |
|         var unitRaw = array[2];
 | |
|         if (isUnit(unitRaw, accepted)) {
 | |
|           return Optional.some({
 | |
|             value: value,
 | |
|             unit: unitRaw
 | |
|           });
 | |
|         } else {
 | |
|           return Optional.none();
 | |
|         }
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var rPercentageBasedSizeRegex = /(\d+(\.\d+)?)%/;
 | |
|     var rPixelBasedSizeRegex = /(\d+(\.\d+)?)px|em/;
 | |
|     var isCol$2 = isTag('col');
 | |
|     var getPercentSize = function (elm, outerGetter, innerGetter) {
 | |
|       var relativeParent = parentElement(elm).getOrThunk(function () {
 | |
|         return getBody$1(owner(elm));
 | |
|       });
 | |
|       return outerGetter(elm) / innerGetter(relativeParent) * 100;
 | |
|     };
 | |
|     var setPixelWidth = function (cell, amount) {
 | |
|       set$1(cell, 'width', amount + 'px');
 | |
|     };
 | |
|     var setPercentageWidth = function (cell, amount) {
 | |
|       set$1(cell, 'width', amount + '%');
 | |
|     };
 | |
|     var setHeight = function (cell, amount) {
 | |
|       set$1(cell, 'height', amount + 'px');
 | |
|     };
 | |
|     var getHeightValue = function (cell) {
 | |
|       return getRuntime(cell) + 'px';
 | |
|     };
 | |
|     var convert = function (cell, number, getter, setter) {
 | |
|       var newSize = table(cell).map(function (table) {
 | |
|         var total = getter(table);
 | |
|         return Math.floor(number / 100 * total);
 | |
|       }).getOr(number);
 | |
|       setter(cell, newSize);
 | |
|       return newSize;
 | |
|     };
 | |
|     var normalizePixelSize = function (value, cell, getter, setter) {
 | |
|       var number = parseFloat(value);
 | |
|       return endsWith(value, '%') && name(cell) !== 'table' ? convert(cell, number, getter, setter) : number;
 | |
|     };
 | |
|     var getTotalHeight = function (cell) {
 | |
|       var value = getHeightValue(cell);
 | |
|       if (!value) {
 | |
|         return get$7(cell);
 | |
|       }
 | |
|       return normalizePixelSize(value, cell, get$7, setHeight);
 | |
|     };
 | |
|     var get$6 = function (cell, type, f) {
 | |
|       var v = f(cell);
 | |
|       var span = getSpan(cell, type);
 | |
|       return v / span;
 | |
|     };
 | |
|     var getRaw$1 = function (element, prop) {
 | |
|       return getRaw$2(element, prop).orThunk(function () {
 | |
|         return getOpt(element, prop).map(function (val) {
 | |
|           return val + 'px';
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var getRawWidth$1 = function (element) {
 | |
|       return getRaw$1(element, 'width');
 | |
|     };
 | |
|     var getRawHeight = function (element) {
 | |
|       return getRaw$1(element, 'height');
 | |
|     };
 | |
|     var getPercentageWidth = function (cell) {
 | |
|       return getPercentSize(cell, get$8, getInner);
 | |
|     };
 | |
|     var getPixelWidth$1 = function (cell) {
 | |
|       return isCol$2(cell) ? get$8(cell) : getRuntime$1(cell);
 | |
|     };
 | |
|     var getHeight = function (cell) {
 | |
|       return get$6(cell, 'rowspan', getTotalHeight);
 | |
|     };
 | |
|     var getGenericWidth = function (cell) {
 | |
|       var width = getRawWidth$1(cell);
 | |
|       return width.bind(function (w) {
 | |
|         return parse(w, [
 | |
|           'fixed',
 | |
|           'relative',
 | |
|           'empty'
 | |
|         ]);
 | |
|       });
 | |
|     };
 | |
|     var setGenericWidth = function (cell, amount, unit) {
 | |
|       set$1(cell, 'width', amount + unit);
 | |
|     };
 | |
|     var getPixelTableWidth = function (table) {
 | |
|       return get$8(table) + 'px';
 | |
|     };
 | |
|     var getPercentTableWidth = function (table) {
 | |
|       return getPercentSize(table, get$8, getInner) + '%';
 | |
|     };
 | |
|     var isPercentSizing$1 = function (table) {
 | |
|       return getRawWidth$1(table).exists(function (size) {
 | |
|         return rPercentageBasedSizeRegex.test(size);
 | |
|       });
 | |
|     };
 | |
|     var isPixelSizing$1 = function (table) {
 | |
|       return getRawWidth$1(table).exists(function (size) {
 | |
|         return rPixelBasedSizeRegex.test(size);
 | |
|       });
 | |
|     };
 | |
|     var isNoneSizing$1 = function (table) {
 | |
|       return getRawWidth$1(table).isNone();
 | |
|     };
 | |
|     var percentageBasedSizeRegex = constant(rPercentageBasedSizeRegex);
 | |
| 
 | |
|     var isCol$1 = isTag('col');
 | |
|     var getRawW = function (cell) {
 | |
|       return getRawWidth$1(cell).getOrThunk(function () {
 | |
|         return getPixelWidth$1(cell) + 'px';
 | |
|       });
 | |
|     };
 | |
|     var getRawH = function (cell) {
 | |
|       return getRawHeight(cell).getOrThunk(function () {
 | |
|         return getHeight(cell) + 'px';
 | |
|       });
 | |
|     };
 | |
|     var justCols = function (warehouse) {
 | |
|       return map$1(Warehouse.justColumns(warehouse), function (column) {
 | |
|         return Optional.from(column.element);
 | |
|       });
 | |
|     };
 | |
|     var isValidColumn = function (cell) {
 | |
|       var browser = detect$3().browser;
 | |
|       var supportsColWidths = browser.isChrome() || browser.isFirefox();
 | |
|       return isCol$1(cell) ? supportsColWidths : true;
 | |
|     };
 | |
|     var getDimension = function (cellOpt, index, backups, filter, getter, fallback) {
 | |
|       return cellOpt.filter(filter).fold(function () {
 | |
|         return fallback(deduce(backups, index));
 | |
|       }, function (cell) {
 | |
|         return getter(cell);
 | |
|       });
 | |
|     };
 | |
|     var getWidthFrom = function (warehouse, table, getWidth, fallback) {
 | |
|       var columnCells = columns(warehouse);
 | |
|       var columns$1 = Warehouse.hasColumns(warehouse) ? justCols(warehouse) : columnCells;
 | |
|       var backups = [Optional.some(width.edge(table))].concat(map$1(width.positions(columnCells, table), function (pos) {
 | |
|         return pos.map(function (p) {
 | |
|           return p.x;
 | |
|         });
 | |
|       }));
 | |
|       var colFilter = not(hasColspan);
 | |
|       return map$1(columns$1, function (cellOption, c) {
 | |
|         return getDimension(cellOption, c, backups, colFilter, function (column) {
 | |
|           if (isValidColumn(column)) {
 | |
|             return getWidth(column);
 | |
|           } else {
 | |
|             var cell = bindFrom(columnCells[c], identity);
 | |
|             return getDimension(cell, c, backups, colFilter, function (cell) {
 | |
|               return fallback(Optional.some(get$8(cell)));
 | |
|             }, fallback);
 | |
|           }
 | |
|         }, fallback);
 | |
|       });
 | |
|     };
 | |
|     var getDeduced = function (deduced) {
 | |
|       return deduced.map(function (d) {
 | |
|         return d + 'px';
 | |
|       }).getOr('');
 | |
|     };
 | |
|     var getRawWidths = function (warehouse, table) {
 | |
|       return getWidthFrom(warehouse, table, getRawW, getDeduced);
 | |
|     };
 | |
|     var getPercentageWidths = function (warehouse, table, tableSize) {
 | |
|       return getWidthFrom(warehouse, table, getPercentageWidth, function (deduced) {
 | |
|         return deduced.fold(function () {
 | |
|           return tableSize.minCellWidth();
 | |
|         }, function (cellWidth) {
 | |
|           return cellWidth / tableSize.pixelWidth() * 100;
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var getPixelWidths = function (warehouse, table, tableSize) {
 | |
|       return getWidthFrom(warehouse, table, getPixelWidth$1, function (deduced) {
 | |
|         return deduced.getOrThunk(tableSize.minCellWidth);
 | |
|       });
 | |
|     };
 | |
|     var getHeightFrom = function (warehouse, table, direction, getHeight, fallback) {
 | |
|       var rows$1 = rows(warehouse);
 | |
|       var backups = [Optional.some(direction.edge(table))].concat(map$1(direction.positions(rows$1, table), function (pos) {
 | |
|         return pos.map(function (p) {
 | |
|           return p.y;
 | |
|         });
 | |
|       }));
 | |
|       return map$1(rows$1, function (cellOption, c) {
 | |
|         return getDimension(cellOption, c, backups, not(hasRowspan), getHeight, fallback);
 | |
|       });
 | |
|     };
 | |
|     var getPixelHeights = function (warehouse, table, direction) {
 | |
|       return getHeightFrom(warehouse, table, direction, getHeight, function (deduced) {
 | |
|         return deduced.getOrThunk(minHeight);
 | |
|       });
 | |
|     };
 | |
|     var getRawHeights = function (warehouse, table, direction) {
 | |
|       return getHeightFrom(warehouse, table, direction, getRawH, getDeduced);
 | |
|     };
 | |
| 
 | |
|     var widthLookup = function (table, getter) {
 | |
|       return function () {
 | |
|         if (inBody(table)) {
 | |
|           return getter(table);
 | |
|         } else {
 | |
|           return parseFloat(getRaw$2(table, 'width').getOr('0'));
 | |
|         }
 | |
|       };
 | |
|     };
 | |
|     var noneSize = function (table) {
 | |
|       var getWidth = widthLookup(table, get$8);
 | |
|       var zero = constant(0);
 | |
|       var getWidths = function (warehouse, tableSize) {
 | |
|         return getPixelWidths(warehouse, table, tableSize);
 | |
|       };
 | |
|       return {
 | |
|         width: getWidth,
 | |
|         pixelWidth: getWidth,
 | |
|         getWidths: getWidths,
 | |
|         getCellDelta: zero,
 | |
|         singleColumnWidth: constant([0]),
 | |
|         minCellWidth: zero,
 | |
|         setElementWidth: noop,
 | |
|         adjustTableWidth: noop,
 | |
|         isRelative: true,
 | |
|         label: 'none'
 | |
|       };
 | |
|     };
 | |
|     var percentageSize = function (table) {
 | |
|       var getFloatWidth = widthLookup(table, function (elem) {
 | |
|         return parseFloat(getPercentTableWidth(elem));
 | |
|       });
 | |
|       var getWidth = widthLookup(table, get$8);
 | |
|       var getCellDelta = function (delta) {
 | |
|         return delta / getWidth() * 100;
 | |
|       };
 | |
|       var singleColumnWidth = function (w, _delta) {
 | |
|         return [100 - w];
 | |
|       };
 | |
|       var minCellWidth = function () {
 | |
|         return minWidth() / getWidth() * 100;
 | |
|       };
 | |
|       var adjustTableWidth = function (delta) {
 | |
|         var currentWidth = getFloatWidth();
 | |
|         var change = delta / 100 * currentWidth;
 | |
|         var newWidth = currentWidth + change;
 | |
|         setPercentageWidth(table, newWidth);
 | |
|       };
 | |
|       var getWidths = function (warehouse, tableSize) {
 | |
|         return getPercentageWidths(warehouse, table, tableSize);
 | |
|       };
 | |
|       return {
 | |
|         width: getFloatWidth,
 | |
|         pixelWidth: getWidth,
 | |
|         getWidths: getWidths,
 | |
|         getCellDelta: getCellDelta,
 | |
|         singleColumnWidth: singleColumnWidth,
 | |
|         minCellWidth: minCellWidth,
 | |
|         setElementWidth: setPercentageWidth,
 | |
|         adjustTableWidth: adjustTableWidth,
 | |
|         isRelative: true,
 | |
|         label: 'percent'
 | |
|       };
 | |
|     };
 | |
|     var pixelSize = function (table) {
 | |
|       var getWidth = widthLookup(table, get$8);
 | |
|       var getCellDelta = identity;
 | |
|       var singleColumnWidth = function (w, delta) {
 | |
|         var newNext = Math.max(minWidth(), w + delta);
 | |
|         return [newNext - w];
 | |
|       };
 | |
|       var adjustTableWidth = function (delta) {
 | |
|         var newWidth = getWidth() + delta;
 | |
|         setPixelWidth(table, newWidth);
 | |
|       };
 | |
|       var getWidths = function (warehouse, tableSize) {
 | |
|         return getPixelWidths(warehouse, table, tableSize);
 | |
|       };
 | |
|       return {
 | |
|         width: getWidth,
 | |
|         pixelWidth: getWidth,
 | |
|         getWidths: getWidths,
 | |
|         getCellDelta: getCellDelta,
 | |
|         singleColumnWidth: singleColumnWidth,
 | |
|         minCellWidth: minWidth,
 | |
|         setElementWidth: setPixelWidth,
 | |
|         adjustTableWidth: adjustTableWidth,
 | |
|         isRelative: false,
 | |
|         label: 'pixel'
 | |
|       };
 | |
|     };
 | |
|     var chooseSize = function (element, width) {
 | |
|       var percentMatch = percentageBasedSizeRegex().exec(width);
 | |
|       if (percentMatch !== null) {
 | |
|         return percentageSize(element);
 | |
|       } else {
 | |
|         return pixelSize(element);
 | |
|       }
 | |
|     };
 | |
|     var getTableSize = function (table) {
 | |
|       var width = getRawWidth$1(table);
 | |
|       return width.fold(function () {
 | |
|         return noneSize(table);
 | |
|       }, function (w) {
 | |
|         return chooseSize(table, w);
 | |
|       });
 | |
|     };
 | |
|     var TableSize = {
 | |
|       getTableSize: getTableSize,
 | |
|       pixelSize: pixelSize,
 | |
|       percentageSize: percentageSize,
 | |
|       noneSize: noneSize
 | |
|     };
 | |
| 
 | |
|     var statsStruct = function (minRow, minCol, maxRow, maxCol, allCells, selectedCells) {
 | |
|       return {
 | |
|         minRow: minRow,
 | |
|         minCol: minCol,
 | |
|         maxRow: maxRow,
 | |
|         maxCol: maxCol,
 | |
|         allCells: allCells,
 | |
|         selectedCells: selectedCells
 | |
|       };
 | |
|     };
 | |
|     var findSelectedStats = function (house, isSelected) {
 | |
|       var totalColumns = house.grid.columns;
 | |
|       var totalRows = house.grid.rows;
 | |
|       var minRow = totalRows;
 | |
|       var minCol = totalColumns;
 | |
|       var maxRow = 0;
 | |
|       var maxCol = 0;
 | |
|       var allCells = [];
 | |
|       var selectedCells = [];
 | |
|       each$1(house.access, function (detail) {
 | |
|         allCells.push(detail);
 | |
|         if (isSelected(detail)) {
 | |
|           selectedCells.push(detail);
 | |
|           var startRow = detail.row;
 | |
|           var endRow = startRow + detail.rowspan - 1;
 | |
|           var startCol = detail.column;
 | |
|           var endCol = startCol + detail.colspan - 1;
 | |
|           if (startRow < minRow) {
 | |
|             minRow = startRow;
 | |
|           } else if (endRow > maxRow) {
 | |
|             maxRow = endRow;
 | |
|           }
 | |
|           if (startCol < minCol) {
 | |
|             minCol = startCol;
 | |
|           } else if (endCol > maxCol) {
 | |
|             maxCol = endCol;
 | |
|           }
 | |
|         }
 | |
|       });
 | |
|       return statsStruct(minRow, minCol, maxRow, maxCol, allCells, selectedCells);
 | |
|     };
 | |
|     var makeCell = function (list, seenSelected, rowIndex) {
 | |
|       var row = list[rowIndex].element;
 | |
|       var td = SugarElement.fromTag('td');
 | |
|       append$1(td, SugarElement.fromTag('br'));
 | |
|       var f = seenSelected ? append$1 : prepend;
 | |
|       f(row, td);
 | |
|     };
 | |
|     var fillInGaps = function (list, house, stats, isSelected) {
 | |
|       var totalColumns = house.grid.columns;
 | |
|       var totalRows = house.grid.rows;
 | |
|       for (var i = 0; i < totalRows; i++) {
 | |
|         var seenSelected = false;
 | |
|         for (var j = 0; j < totalColumns; j++) {
 | |
|           if (!(i < stats.minRow || i > stats.maxRow || j < stats.minCol || j > stats.maxCol)) {
 | |
|             var needCell = Warehouse.getAt(house, i, j).filter(isSelected).isNone();
 | |
|             if (needCell) {
 | |
|               makeCell(list, seenSelected, i);
 | |
|             } else {
 | |
|               seenSelected = true;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     };
 | |
|     var clean = function (replica, stats, house, widthDelta) {
 | |
|       each$1(house.columns, function (col) {
 | |
|         if (col.column < stats.minCol || col.column > stats.maxCol) {
 | |
|           remove$5(col.element);
 | |
|         }
 | |
|       });
 | |
|       var emptyRows = filter$2(firstLayer(replica, 'tr'), function (row) {
 | |
|         return row.dom.childElementCount === 0;
 | |
|       });
 | |
|       each$2(emptyRows, remove$5);
 | |
|       if (stats.minCol === stats.maxCol || stats.minRow === stats.maxRow) {
 | |
|         each$2(firstLayer(replica, 'th,td'), function (cell) {
 | |
|           remove$7(cell, 'rowspan');
 | |
|           remove$7(cell, 'colspan');
 | |
|         });
 | |
|       }
 | |
|       remove$7(replica, LOCKED_COL_ATTR);
 | |
|       remove$7(replica, 'data-snooker-col-series');
 | |
|       var tableSize = TableSize.getTableSize(replica);
 | |
|       tableSize.adjustTableWidth(widthDelta);
 | |
|     };
 | |
|     var getTableWidthDelta = function (table, warehouse, tableSize, stats) {
 | |
|       if (stats.minCol === 0 && warehouse.grid.columns === stats.maxCol + 1) {
 | |
|         return 0;
 | |
|       }
 | |
|       var colWidths = getPixelWidths(warehouse, table, tableSize);
 | |
|       var allColsWidth = foldl(colWidths, function (acc, width) {
 | |
|         return acc + width;
 | |
|       }, 0);
 | |
|       var selectedColsWidth = foldl(colWidths.slice(stats.minCol, stats.maxCol + 1), function (acc, width) {
 | |
|         return acc + width;
 | |
|       }, 0);
 | |
|       var newWidth = selectedColsWidth / allColsWidth * tableSize.pixelWidth();
 | |
|       var delta = newWidth - tableSize.pixelWidth();
 | |
|       return tableSize.getCellDelta(delta);
 | |
|     };
 | |
|     var extract$1 = function (table, selectedSelector) {
 | |
|       var isSelected = function (detail) {
 | |
|         return is$2(detail.element, selectedSelector);
 | |
|       };
 | |
|       var replica = deep(table);
 | |
|       var list = fromTable$1(replica);
 | |
|       var tableSize = TableSize.getTableSize(table);
 | |
|       var replicaHouse = Warehouse.generate(list);
 | |
|       var replicaStats = findSelectedStats(replicaHouse, isSelected);
 | |
|       var selector = 'th:not(' + selectedSelector + ')' + ',td:not(' + selectedSelector + ')';
 | |
|       var unselectedCells = filterFirstLayer(replica, 'th,td', function (cell) {
 | |
|         return is$2(cell, selector);
 | |
|       });
 | |
|       each$2(unselectedCells, remove$5);
 | |
|       fillInGaps(list, replicaHouse, replicaStats, isSelected);
 | |
|       var house = Warehouse.fromTable(table);
 | |
|       var widthDelta = getTableWidthDelta(table, house, tableSize, replicaStats);
 | |
|       clean(replica, replicaStats, replicaHouse, widthDelta);
 | |
|       return replica;
 | |
|     };
 | |
| 
 | |
|     var nbsp = '\xA0';
 | |
| 
 | |
|     var getEnd = function (element) {
 | |
|       return name(element) === 'img' ? 1 : getOption(element).fold(function () {
 | |
|         return children$3(element).length;
 | |
|       }, function (v) {
 | |
|         return v.length;
 | |
|       });
 | |
|     };
 | |
|     var isTextNodeWithCursorPosition = function (el) {
 | |
|       return getOption(el).filter(function (text) {
 | |
|         return text.trim().length !== 0 || text.indexOf(nbsp) > -1;
 | |
|       }).isSome();
 | |
|     };
 | |
|     var elementsWithCursorPosition = [
 | |
|       'img',
 | |
|       'br'
 | |
|     ];
 | |
|     var isCursorPosition = function (elem) {
 | |
|       var hasCursorPosition = isTextNodeWithCursorPosition(elem);
 | |
|       return hasCursorPosition || contains$2(elementsWithCursorPosition, name(elem));
 | |
|     };
 | |
| 
 | |
|     var first = function (element) {
 | |
|       return descendant$1(element, isCursorPosition);
 | |
|     };
 | |
|     var last$1 = function (element) {
 | |
|       return descendantRtl(element, isCursorPosition);
 | |
|     };
 | |
|     var descendantRtl = function (scope, predicate) {
 | |
|       var descend = function (element) {
 | |
|         var children = children$3(element);
 | |
|         for (var i = children.length - 1; i >= 0; i--) {
 | |
|           var child = children[i];
 | |
|           if (predicate(child)) {
 | |
|             return Optional.some(child);
 | |
|           }
 | |
|           var res = descend(child);
 | |
|           if (res.isSome()) {
 | |
|             return res;
 | |
|           }
 | |
|         }
 | |
|         return Optional.none();
 | |
|       };
 | |
|       return descend(scope);
 | |
|     };
 | |
| 
 | |
|     var transferableAttributes = {
 | |
|       scope: [
 | |
|         'row',
 | |
|         'col'
 | |
|       ]
 | |
|     };
 | |
|     var createCell = function (doc) {
 | |
|       return function () {
 | |
|         var td = SugarElement.fromTag('td', doc.dom);
 | |
|         append$1(td, SugarElement.fromTag('br', doc.dom));
 | |
|         return td;
 | |
|       };
 | |
|     };
 | |
|     var createCol = function (doc) {
 | |
|       return function () {
 | |
|         return SugarElement.fromTag('col', doc.dom);
 | |
|       };
 | |
|     };
 | |
|     var createColgroup = function (doc) {
 | |
|       return function () {
 | |
|         return SugarElement.fromTag('colgroup', doc.dom);
 | |
|       };
 | |
|     };
 | |
|     var createRow$1 = function (doc) {
 | |
|       return function () {
 | |
|         return SugarElement.fromTag('tr', doc.dom);
 | |
|       };
 | |
|     };
 | |
|     var replace$1 = function (cell, tag, attrs) {
 | |
|       var replica = copy$1(cell, tag);
 | |
|       each$1(attrs, function (v, k) {
 | |
|         if (v === null) {
 | |
|           remove$7(replica, k);
 | |
|         } else {
 | |
|           set$2(replica, k, v);
 | |
|         }
 | |
|       });
 | |
|       return replica;
 | |
|     };
 | |
|     var pasteReplace = function (cell) {
 | |
|       return cell;
 | |
|     };
 | |
|     var cloneFormats = function (oldCell, newCell, formats) {
 | |
|       var first$1 = first(oldCell);
 | |
|       return first$1.map(function (firstText) {
 | |
|         var formatSelector = formats.join(',');
 | |
|         var parents = ancestors$3(firstText, formatSelector, function (element) {
 | |
|           return eq$1(element, oldCell);
 | |
|         });
 | |
|         return foldr(parents, function (last, parent) {
 | |
|           var clonedFormat = shallow(parent);
 | |
|           remove$7(clonedFormat, 'contenteditable');
 | |
|           append$1(last, clonedFormat);
 | |
|           return clonedFormat;
 | |
|         }, newCell);
 | |
|       }).getOr(newCell);
 | |
|     };
 | |
|     var cloneAppropriateAttributes = function (original, clone) {
 | |
|       each$1(transferableAttributes, function (validAttributes, attributeName) {
 | |
|         return getOpt(original, attributeName).filter(function (attribute) {
 | |
|           return contains$2(validAttributes, attribute);
 | |
|         }).each(function (attribute) {
 | |
|           return set$2(clone, attributeName, attribute);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var cellOperations = function (mutate, doc, formatsToClone) {
 | |
|       var cloneCss = function (prev, clone) {
 | |
|         copy$2(prev.element, clone);
 | |
|         remove$6(clone, 'height');
 | |
|         if (prev.colspan !== 1) {
 | |
|           remove$6(clone, 'width');
 | |
|         }
 | |
|       };
 | |
|       var newCell = function (prev) {
 | |
|         var td = SugarElement.fromTag(name(prev.element), doc.dom);
 | |
|         var formats = formatsToClone.getOr([
 | |
|           'strong',
 | |
|           'em',
 | |
|           'b',
 | |
|           'i',
 | |
|           'span',
 | |
|           'font',
 | |
|           'h1',
 | |
|           'h2',
 | |
|           'h3',
 | |
|           'h4',
 | |
|           'h5',
 | |
|           'h6',
 | |
|           'p',
 | |
|           'div'
 | |
|         ]);
 | |
|         var lastNode = formats.length > 0 ? cloneFormats(prev.element, td, formats) : td;
 | |
|         append$1(lastNode, SugarElement.fromTag('br'));
 | |
|         cloneCss(prev, td);
 | |
|         cloneAppropriateAttributes(prev.element, td);
 | |
|         mutate(prev.element, td);
 | |
|         return td;
 | |
|       };
 | |
|       var newCol = function (prev) {
 | |
|         var col = SugarElement.fromTag(name(prev.element), doc.dom);
 | |
|         cloneCss(prev, col);
 | |
|         mutate(prev.element, col);
 | |
|         return col;
 | |
|       };
 | |
|       return {
 | |
|         col: newCol,
 | |
|         colgroup: createColgroup(doc),
 | |
|         row: createRow$1(doc),
 | |
|         cell: newCell,
 | |
|         replace: replace$1,
 | |
|         colGap: createCol(doc),
 | |
|         gap: createCell(doc)
 | |
|       };
 | |
|     };
 | |
|     var paste$1 = function (doc) {
 | |
|       return {
 | |
|         col: createCol(doc),
 | |
|         colgroup: createColgroup(doc),
 | |
|         row: createRow$1(doc),
 | |
|         cell: createCell(doc),
 | |
|         replace: pasteReplace,
 | |
|         colGap: createCol(doc),
 | |
|         gap: createCell(doc)
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var fromHtml = function (html, scope) {
 | |
|       var doc = scope || document;
 | |
|       var div = doc.createElement('div');
 | |
|       div.innerHTML = html;
 | |
|       return children$3(SugarElement.fromDom(div));
 | |
|     };
 | |
|     var fromDom = function (nodes) {
 | |
|       return map$1(nodes, SugarElement.fromDom);
 | |
|     };
 | |
| 
 | |
|     var getNodeName = function (elm) {
 | |
|       return elm.nodeName.toLowerCase();
 | |
|     };
 | |
|     var getBody = function (editor) {
 | |
|       return SugarElement.fromDom(editor.getBody());
 | |
|     };
 | |
|     var getPixelWidth = function (elm) {
 | |
|       return elm.getBoundingClientRect().width;
 | |
|     };
 | |
|     var getPixelHeight = function (elm) {
 | |
|       return elm.getBoundingClientRect().height;
 | |
|     };
 | |
|     var getIsRoot = function (editor) {
 | |
|       return function (element) {
 | |
|         return eq$1(element, getBody(editor));
 | |
|       };
 | |
|     };
 | |
|     var removePxSuffix = function (size) {
 | |
|       return size ? size.replace(/px$/, '') : '';
 | |
|     };
 | |
|     var addPxSuffix = function (size) {
 | |
|       return /^\d+(\.\d+)?$/.test(size) ? size + 'px' : size;
 | |
|     };
 | |
|     var removeDataStyle = function (table) {
 | |
|       remove$7(table, 'data-mce-style');
 | |
|       var removeStyleAttribute = function (element) {
 | |
|         return remove$7(element, 'data-mce-style');
 | |
|       };
 | |
|       each$2(cells$1(table), removeStyleAttribute);
 | |
|       each$2(columns$1(table), removeStyleAttribute);
 | |
|     };
 | |
|     var getRawWidth = function (editor, elm) {
 | |
|       var raw = editor.dom.getStyle(elm, 'width') || editor.dom.getAttrib(elm, 'width');
 | |
|       return Optional.from(raw).filter(isNotEmpty);
 | |
|     };
 | |
|     var isPercentage$1 = function (value) {
 | |
|       return /^(\d+(\.\d+)?)%$/.test(value);
 | |
|     };
 | |
|     var isPixel = function (value) {
 | |
|       return /^(\d+(\.\d+)?)px$/.test(value);
 | |
|     };
 | |
|     var getSelectionStart = function (editor) {
 | |
|       return SugarElement.fromDom(editor.selection.getStart());
 | |
|     };
 | |
|     var getSelectionEnd = function (editor) {
 | |
|       return SugarElement.fromDom(editor.selection.getEnd());
 | |
|     };
 | |
| 
 | |
|     var selection = function (selections) {
 | |
|       return cata$2(selections.get(), constant([]), identity, pure);
 | |
|     };
 | |
|     var unmergable = function (selections) {
 | |
|       var hasSpan = function (elem, type) {
 | |
|         return getOpt(elem, type).exists(function (span) {
 | |
|           return parseInt(span, 10) > 1;
 | |
|         });
 | |
|       };
 | |
|       var hasRowOrColSpan = function (elem) {
 | |
|         return hasSpan(elem, 'rowspan') || hasSpan(elem, 'colspan');
 | |
|       };
 | |
|       var candidates = selection(selections);
 | |
|       return candidates.length > 0 && forall(candidates, hasRowOrColSpan) ? Optional.some(candidates) : Optional.none();
 | |
|     };
 | |
|     var mergable = function (table, selections, ephemera) {
 | |
|       return cata$2(selections.get(), Optional.none, function (cells) {
 | |
|         if (cells.length <= 1) {
 | |
|           return Optional.none();
 | |
|         } else {
 | |
|           return retrieveBox(table, ephemera.firstSelectedSelector, ephemera.lastSelectedSelector).map(function (bounds) {
 | |
|             return {
 | |
|               bounds: bounds,
 | |
|               cells: cells
 | |
|             };
 | |
|           });
 | |
|         }
 | |
|       }, Optional.none);
 | |
|     };
 | |
| 
 | |
|     var strSelected = 'data-mce-selected';
 | |
|     var strSelectedSelector = 'td[' + strSelected + '],th[' + strSelected + ']';
 | |
|     var strAttributeSelector = '[' + strSelected + ']';
 | |
|     var strFirstSelected = 'data-mce-first-selected';
 | |
|     var strFirstSelectedSelector = 'td[' + strFirstSelected + '],th[' + strFirstSelected + ']';
 | |
|     var strLastSelected = 'data-mce-last-selected';
 | |
|     var strLastSelectedSelector = 'td[' + strLastSelected + '],th[' + strLastSelected + ']';
 | |
|     var attributeSelector = strAttributeSelector;
 | |
|     var ephemera = {
 | |
|       selected: strSelected,
 | |
|       selectedSelector: strSelectedSelector,
 | |
|       firstSelected: strFirstSelected,
 | |
|       firstSelectedSelector: strFirstSelectedSelector,
 | |
|       lastSelected: strLastSelected,
 | |
|       lastSelectedSelector: strLastSelectedSelector
 | |
|     };
 | |
| 
 | |
|     var noMenu = function (cell) {
 | |
|       return {
 | |
|         element: cell,
 | |
|         mergable: Optional.none(),
 | |
|         unmergable: Optional.none(),
 | |
|         selection: [cell]
 | |
|       };
 | |
|     };
 | |
|     var forMenu = function (selections, table, cell) {
 | |
|       return {
 | |
|         element: cell,
 | |
|         mergable: mergable(table, selections, ephemera),
 | |
|         unmergable: unmergable(selections),
 | |
|         selection: selection(selections)
 | |
|       };
 | |
|     };
 | |
|     var paste = function (element, clipboard, generators) {
 | |
|       return {
 | |
|         element: element,
 | |
|         clipboard: clipboard,
 | |
|         generators: generators
 | |
|       };
 | |
|     };
 | |
|     var pasteRows = function (selections, cell, clipboard, generators) {
 | |
|       return {
 | |
|         selection: selection(selections),
 | |
|         clipboard: clipboard,
 | |
|         generators: generators
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var getSelectionCellFallback = function (element) {
 | |
|       return table(element).bind(function (table) {
 | |
|         return retrieve(table, ephemera.firstSelectedSelector);
 | |
|       }).fold(constant(element), function (cells) {
 | |
|         return cells[0];
 | |
|       });
 | |
|     };
 | |
|     var getSelectionFromSelector = function (selector) {
 | |
|       return function (initCell, isRoot) {
 | |
|         var cellName = name(initCell);
 | |
|         var cell = cellName === 'col' || cellName === 'colgroup' ? getSelectionCellFallback(initCell) : initCell;
 | |
|         return closest$1(cell, selector, isRoot);
 | |
|       };
 | |
|     };
 | |
|     var getSelectionCellOrCaption = getSelectionFromSelector('th,td,caption');
 | |
|     var getSelectionCell = getSelectionFromSelector('th,td');
 | |
|     var getCellsFromSelection = function (selections) {
 | |
|       return selection(selections);
 | |
|     };
 | |
|     var getRowsFromSelection = function (selected, selector) {
 | |
|       var cellOpt = getSelectionCell(selected);
 | |
|       var rowsOpt = cellOpt.bind(function (cell) {
 | |
|         return table(cell);
 | |
|       }).map(function (table) {
 | |
|         return rows$1(table);
 | |
|       });
 | |
|       return lift2(cellOpt, rowsOpt, function (cell, rows) {
 | |
|         return filter$2(rows, function (row) {
 | |
|           return exists(fromDom(row.dom.cells), function (rowCell) {
 | |
|             return get$b(rowCell, selector) === '1' || eq$1(rowCell, cell);
 | |
|           });
 | |
|         });
 | |
|       }).getOr([]);
 | |
|     };
 | |
| 
 | |
|     var extractSelected = function (cells) {
 | |
|       return table(cells[0]).map(function (table) {
 | |
|         var replica = extract$1(table, attributeSelector);
 | |
|         removeDataStyle(replica);
 | |
|         return [replica];
 | |
|       });
 | |
|     };
 | |
|     var serializeElements = function (editor, elements) {
 | |
|       return map$1(elements, function (elm) {
 | |
|         return editor.selection.serializer.serialize(elm.dom, {});
 | |
|       }).join('');
 | |
|     };
 | |
|     var getTextContent = function (elements) {
 | |
|       return map$1(elements, function (element) {
 | |
|         return element.dom.innerText;
 | |
|       }).join('');
 | |
|     };
 | |
|     var registerEvents = function (editor, selections, actions) {
 | |
|       editor.on('BeforeGetContent', function (e) {
 | |
|         var multiCellContext = function (cells) {
 | |
|           e.preventDefault();
 | |
|           extractSelected(cells).each(function (elements) {
 | |
|             e.content = e.format === 'text' ? getTextContent(elements) : serializeElements(editor, elements);
 | |
|           });
 | |
|         };
 | |
|         if (e.selection === true) {
 | |
|           cata$2(selections.get(), noop, multiCellContext, noop);
 | |
|         }
 | |
|       });
 | |
|       editor.on('BeforeSetContent', function (e) {
 | |
|         if (e.selection === true && e.paste === true) {
 | |
|           var selectedCells = getCellsFromSelection(selections);
 | |
|           head(selectedCells).each(function (cell) {
 | |
|             table(cell).each(function (table) {
 | |
|               var elements = filter$2(fromHtml(e.content), function (content) {
 | |
|                 return name(content) !== 'meta';
 | |
|               });
 | |
|               var isTable = isTag('table');
 | |
|               if (elements.length === 1 && isTable(elements[0])) {
 | |
|                 e.preventDefault();
 | |
|                 var doc = SugarElement.fromDom(editor.getDoc());
 | |
|                 var generators = paste$1(doc);
 | |
|                 var targets = paste(cell, elements[0], generators);
 | |
|                 actions.pasteCells(table, targets).each(function () {
 | |
|                   editor.focus();
 | |
|                 });
 | |
|               }
 | |
|             });
 | |
|           });
 | |
|         }
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var adt$7 = Adt.generate([
 | |
|       { none: [] },
 | |
|       { only: ['index'] },
 | |
|       {
 | |
|         left: [
 | |
|           'index',
 | |
|           'next'
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         middle: [
 | |
|           'prev',
 | |
|           'index',
 | |
|           'next'
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         right: [
 | |
|           'prev',
 | |
|           'index'
 | |
|         ]
 | |
|       }
 | |
|     ]);
 | |
|     var ColumnContext = __assign({}, adt$7);
 | |
| 
 | |
|     var neighbours = function (input, index) {
 | |
|       if (input.length === 0) {
 | |
|         return ColumnContext.none();
 | |
|       }
 | |
|       if (input.length === 1) {
 | |
|         return ColumnContext.only(0);
 | |
|       }
 | |
|       if (index === 0) {
 | |
|         return ColumnContext.left(0, 1);
 | |
|       }
 | |
|       if (index === input.length - 1) {
 | |
|         return ColumnContext.right(index - 1, index);
 | |
|       }
 | |
|       if (index > 0 && index < input.length - 1) {
 | |
|         return ColumnContext.middle(index - 1, index, index + 1);
 | |
|       }
 | |
|       return ColumnContext.none();
 | |
|     };
 | |
|     var determine = function (input, column, step, tableSize, resize) {
 | |
|       var result = input.slice(0);
 | |
|       var context = neighbours(input, column);
 | |
|       var onNone = constant(map$1(result, constant(0)));
 | |
|       var onOnly = function (index) {
 | |
|         return tableSize.singleColumnWidth(result[index], step);
 | |
|       };
 | |
|       var onLeft = function (index, next) {
 | |
|         return resize.calcLeftEdgeDeltas(result, index, next, step, tableSize.minCellWidth(), tableSize.isRelative);
 | |
|       };
 | |
|       var onMiddle = function (prev, index, next) {
 | |
|         return resize.calcMiddleDeltas(result, prev, index, next, step, tableSize.minCellWidth(), tableSize.isRelative);
 | |
|       };
 | |
|       var onRight = function (prev, index) {
 | |
|         return resize.calcRightEdgeDeltas(result, prev, index, step, tableSize.minCellWidth(), tableSize.isRelative);
 | |
|       };
 | |
|       return context.fold(onNone, onOnly, onLeft, onMiddle, onRight);
 | |
|     };
 | |
| 
 | |
|     var total = function (start, end, measures) {
 | |
|       var r = 0;
 | |
|       for (var i = start; i < end; i++) {
 | |
|         r += measures[i] !== undefined ? measures[i] : 0;
 | |
|       }
 | |
|       return r;
 | |
|     };
 | |
|     var recalculateWidthForCells = function (warehouse, widths) {
 | |
|       var all = Warehouse.justCells(warehouse);
 | |
|       return map$1(all, function (cell) {
 | |
|         var width = total(cell.column, cell.column + cell.colspan, widths);
 | |
|         return {
 | |
|           element: cell.element,
 | |
|           width: width,
 | |
|           colspan: cell.colspan
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|     var recalculateWidthForColumns = function (warehouse, widths) {
 | |
|       var groups = Warehouse.justColumns(warehouse);
 | |
|       return map$1(groups, function (column, index) {
 | |
|         return {
 | |
|           element: column.element,
 | |
|           width: widths[index],
 | |
|           colspan: column.colspan
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|     var recalculateHeightForCells = function (warehouse, heights) {
 | |
|       var all = Warehouse.justCells(warehouse);
 | |
|       return map$1(all, function (cell) {
 | |
|         var height = total(cell.row, cell.row + cell.rowspan, heights);
 | |
|         return {
 | |
|           element: cell.element,
 | |
|           height: height,
 | |
|           rowspan: cell.rowspan
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|     var matchRowHeight = function (warehouse, heights) {
 | |
|       return map$1(warehouse.all, function (row, i) {
 | |
|         return {
 | |
|           element: row.element,
 | |
|           height: heights[i]
 | |
|         };
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var sumUp = function (newSize) {
 | |
|       return foldr(newSize, function (b, a) {
 | |
|         return b + a;
 | |
|       }, 0);
 | |
|     };
 | |
|     var recalculate = function (warehouse, widths) {
 | |
|       if (Warehouse.hasColumns(warehouse)) {
 | |
|         return recalculateWidthForColumns(warehouse, widths);
 | |
|       } else {
 | |
|         return recalculateWidthForCells(warehouse, widths);
 | |
|       }
 | |
|     };
 | |
|     var recalculateAndApply = function (warehouse, widths, tableSize) {
 | |
|       var newSizes = recalculate(warehouse, widths);
 | |
|       each$2(newSizes, function (cell) {
 | |
|         tableSize.setElementWidth(cell.element, cell.width);
 | |
|       });
 | |
|     };
 | |
|     var adjustWidth = function (table, delta, index, resizing, tableSize) {
 | |
|       var warehouse = Warehouse.fromTable(table);
 | |
|       var step = tableSize.getCellDelta(delta);
 | |
|       var widths = tableSize.getWidths(warehouse, tableSize);
 | |
|       var isLastColumn = index === warehouse.grid.columns - 1;
 | |
|       var clampedStep = resizing.clampTableDelta(widths, index, step, tableSize.minCellWidth(), isLastColumn);
 | |
|       var deltas = determine(widths, index, clampedStep, tableSize, resizing);
 | |
|       var newWidths = map$1(deltas, function (dx, i) {
 | |
|         return dx + widths[i];
 | |
|       });
 | |
|       recalculateAndApply(warehouse, newWidths, tableSize);
 | |
|       resizing.resizeTable(tableSize.adjustTableWidth, clampedStep, isLastColumn);
 | |
|     };
 | |
|     var adjustHeight = function (table, delta, index, direction) {
 | |
|       var warehouse = Warehouse.fromTable(table);
 | |
|       var heights = getPixelHeights(warehouse, table, direction);
 | |
|       var newHeights = map$1(heights, function (dy, i) {
 | |
|         return index === i ? Math.max(delta + dy, minHeight()) : dy;
 | |
|       });
 | |
|       var newCellSizes = recalculateHeightForCells(warehouse, newHeights);
 | |
|       var newRowSizes = matchRowHeight(warehouse, newHeights);
 | |
|       each$2(newRowSizes, function (row) {
 | |
|         setHeight(row.element, row.height);
 | |
|       });
 | |
|       each$2(newCellSizes, function (cell) {
 | |
|         setHeight(cell.element, cell.height);
 | |
|       });
 | |
|       var total = sumUp(newHeights);
 | |
|       setHeight(table, total);
 | |
|     };
 | |
|     var adjustAndRedistributeWidths$1 = function (_table, list, details, tableSize, resizeBehaviour) {
 | |
|       var warehouse = Warehouse.generate(list);
 | |
|       var sizes = tableSize.getWidths(warehouse, tableSize);
 | |
|       var tablePixelWidth = tableSize.pixelWidth();
 | |
|       var _a = resizeBehaviour.calcRedestributedWidths(sizes, tablePixelWidth, details.pixelDelta, tableSize.isRelative), newSizes = _a.newSizes, delta = _a.delta;
 | |
|       recalculateAndApply(warehouse, newSizes, tableSize);
 | |
|       tableSize.adjustTableWidth(delta);
 | |
|     };
 | |
|     var adjustWidthTo = function (_table, list, _info, tableSize) {
 | |
|       var warehouse = Warehouse.generate(list);
 | |
|       var widths = tableSize.getWidths(warehouse, tableSize);
 | |
|       recalculateAndApply(warehouse, widths, tableSize);
 | |
|     };
 | |
| 
 | |
|     var zero = function (array) {
 | |
|       return map$1(array, constant(0));
 | |
|     };
 | |
|     var surround = function (sizes, startIndex, endIndex, results, f) {
 | |
|       return f(sizes.slice(0, startIndex)).concat(results).concat(f(sizes.slice(endIndex)));
 | |
|     };
 | |
|     var clampDeltaHelper = function (predicate) {
 | |
|       return function (sizes, index, delta, minCellSize) {
 | |
|         if (!predicate(delta)) {
 | |
|           return delta;
 | |
|         } else {
 | |
|           var newSize = Math.max(minCellSize, sizes[index] - Math.abs(delta));
 | |
|           var diff = Math.abs(newSize - sizes[index]);
 | |
|           return delta >= 0 ? diff : -diff;
 | |
|         }
 | |
|       };
 | |
|     };
 | |
|     var clampNegativeDelta = clampDeltaHelper(function (delta) {
 | |
|       return delta < 0;
 | |
|     });
 | |
|     var clampDelta = clampDeltaHelper(always);
 | |
|     var resizeTable = function () {
 | |
|       var calcFixedDeltas = function (sizes, index, next, delta, minCellSize) {
 | |
|         var clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize);
 | |
|         return surround(sizes, index, next + 1, [
 | |
|           clampedDelta,
 | |
|           0
 | |
|         ], zero);
 | |
|       };
 | |
|       var calcRelativeDeltas = function (sizes, index, delta, minCellSize) {
 | |
|         var ratio = (100 + delta) / 100;
 | |
|         var newThis = Math.max(minCellSize, (sizes[index] + delta) / ratio);
 | |
|         return map$1(sizes, function (size, idx) {
 | |
|           var newSize = idx === index ? newThis : size / ratio;
 | |
|           return newSize - size;
 | |
|         });
 | |
|       };
 | |
|       var calcLeftEdgeDeltas = function (sizes, index, next, delta, minCellSize, isRelative) {
 | |
|         if (isRelative) {
 | |
|           return calcRelativeDeltas(sizes, index, delta, minCellSize);
 | |
|         } else {
 | |
|           return calcFixedDeltas(sizes, index, next, delta, minCellSize);
 | |
|         }
 | |
|       };
 | |
|       var calcMiddleDeltas = function (sizes, _prev, index, next, delta, minCellSize, isRelative) {
 | |
|         return calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize, isRelative);
 | |
|       };
 | |
|       var resizeTable = function (resizer, delta) {
 | |
|         return resizer(delta);
 | |
|       };
 | |
|       var calcRightEdgeDeltas = function (sizes, _prev, index, delta, minCellSize, isRelative) {
 | |
|         if (isRelative) {
 | |
|           return calcRelativeDeltas(sizes, index, delta, minCellSize);
 | |
|         } else {
 | |
|           var clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize);
 | |
|           return zero(sizes.slice(0, index)).concat([clampedDelta]);
 | |
|         }
 | |
|       };
 | |
|       var calcRedestributedWidths = function (sizes, totalWidth, pixelDelta, isRelative) {
 | |
|         if (isRelative) {
 | |
|           var tableWidth = totalWidth + pixelDelta;
 | |
|           var ratio_1 = tableWidth / totalWidth;
 | |
|           var newSizes = map$1(sizes, function (size) {
 | |
|             return size / ratio_1;
 | |
|           });
 | |
|           return {
 | |
|             delta: ratio_1 * 100 - 100,
 | |
|             newSizes: newSizes
 | |
|           };
 | |
|         } else {
 | |
|           return {
 | |
|             delta: pixelDelta,
 | |
|             newSizes: sizes
 | |
|           };
 | |
|         }
 | |
|       };
 | |
|       return {
 | |
|         resizeTable: resizeTable,
 | |
|         clampTableDelta: clampNegativeDelta,
 | |
|         calcLeftEdgeDeltas: calcLeftEdgeDeltas,
 | |
|         calcMiddleDeltas: calcMiddleDeltas,
 | |
|         calcRightEdgeDeltas: calcRightEdgeDeltas,
 | |
|         calcRedestributedWidths: calcRedestributedWidths
 | |
|       };
 | |
|     };
 | |
|     var preserveTable = function () {
 | |
|       var calcLeftEdgeDeltas = function (sizes, index, next, delta, minCellSize) {
 | |
|         var idx = delta >= 0 ? next : index;
 | |
|         var clampedDelta = clampDelta(sizes, idx, delta, minCellSize);
 | |
|         return surround(sizes, index, next + 1, [
 | |
|           clampedDelta,
 | |
|           -clampedDelta
 | |
|         ], zero);
 | |
|       };
 | |
|       var calcMiddleDeltas = function (sizes, _prev, index, next, delta, minCellSize) {
 | |
|         return calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize);
 | |
|       };
 | |
|       var resizeTable = function (resizer, delta, isLastColumn) {
 | |
|         if (isLastColumn) {
 | |
|           resizer(delta);
 | |
|         }
 | |
|       };
 | |
|       var calcRightEdgeDeltas = function (sizes, _prev, _index, delta, _minCellSize, isRelative) {
 | |
|         if (isRelative) {
 | |
|           return zero(sizes);
 | |
|         } else {
 | |
|           var diff = delta / sizes.length;
 | |
|           return map$1(sizes, constant(diff));
 | |
|         }
 | |
|       };
 | |
|       var clampTableDelta = function (sizes, index, delta, minCellSize, isLastColumn) {
 | |
|         if (isLastColumn) {
 | |
|           if (delta >= 0) {
 | |
|             return delta;
 | |
|           } else {
 | |
|             var maxDelta = foldl(sizes, function (a, b) {
 | |
|               return a + b - minCellSize;
 | |
|             }, 0);
 | |
|             return Math.max(-maxDelta, delta);
 | |
|           }
 | |
|         } else {
 | |
|           return clampNegativeDelta(sizes, index, delta, minCellSize);
 | |
|         }
 | |
|       };
 | |
|       var calcRedestributedWidths = function (sizes, _totalWidth, _pixelDelta, _isRelative) {
 | |
|         return {
 | |
|           delta: 0,
 | |
|           newSizes: sizes
 | |
|         };
 | |
|       };
 | |
|       return {
 | |
|         resizeTable: resizeTable,
 | |
|         clampTableDelta: clampTableDelta,
 | |
|         calcLeftEdgeDeltas: calcLeftEdgeDeltas,
 | |
|         calcMiddleDeltas: calcMiddleDeltas,
 | |
|         calcRightEdgeDeltas: calcRightEdgeDeltas,
 | |
|         calcRedestributedWidths: calcRedestributedWidths
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var only = function (element, isResizable) {
 | |
|       var parent = Optional.from(element.dom.documentElement).map(SugarElement.fromDom).getOr(element);
 | |
|       return {
 | |
|         parent: constant(parent),
 | |
|         view: constant(element),
 | |
|         origin: constant(SugarPosition(0, 0)),
 | |
|         isResizable: isResizable
 | |
|       };
 | |
|     };
 | |
|     var detached = function (editable, chrome, isResizable) {
 | |
|       var origin = function () {
 | |
|         return absolute(chrome);
 | |
|       };
 | |
|       return {
 | |
|         parent: constant(chrome),
 | |
|         view: constant(editable),
 | |
|         origin: origin,
 | |
|         isResizable: isResizable
 | |
|       };
 | |
|     };
 | |
|     var body = function (editable, chrome, isResizable) {
 | |
|       return {
 | |
|         parent: constant(chrome),
 | |
|         view: constant(editable),
 | |
|         origin: constant(SugarPosition(0, 0)),
 | |
|         isResizable: isResizable
 | |
|       };
 | |
|     };
 | |
|     var ResizeWire = {
 | |
|       only: only,
 | |
|       detached: detached,
 | |
|       body: body
 | |
|     };
 | |
| 
 | |
|     var adt$6 = Adt.generate([
 | |
|       { invalid: ['raw'] },
 | |
|       { pixels: ['value'] },
 | |
|       { percent: ['value'] }
 | |
|     ]);
 | |
|     var validateFor = function (suffix, type, value) {
 | |
|       var rawAmount = value.substring(0, value.length - suffix.length);
 | |
|       var amount = parseFloat(rawAmount);
 | |
|       return rawAmount === amount.toString() ? type(amount) : adt$6.invalid(value);
 | |
|     };
 | |
|     var from = function (value) {
 | |
|       if (endsWith(value, '%')) {
 | |
|         return validateFor('%', adt$6.percent, value);
 | |
|       }
 | |
|       if (endsWith(value, 'px')) {
 | |
|         return validateFor('px', adt$6.pixels, value);
 | |
|       }
 | |
|       return adt$6.invalid(value);
 | |
|     };
 | |
|     var Size = __assign(__assign({}, adt$6), { from: from });
 | |
| 
 | |
|     var redistributeToPercent = function (widths, totalWidth) {
 | |
|       return map$1(widths, function (w) {
 | |
|         var colType = Size.from(w);
 | |
|         return colType.fold(function () {
 | |
|           return w;
 | |
|         }, function (px) {
 | |
|           var ratio = px / totalWidth * 100;
 | |
|           return ratio + '%';
 | |
|         }, function (pc) {
 | |
|           return pc + '%';
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var redistributeToPx = function (widths, totalWidth, newTotalWidth) {
 | |
|       var scale = newTotalWidth / totalWidth;
 | |
|       return map$1(widths, function (w) {
 | |
|         var colType = Size.from(w);
 | |
|         return colType.fold(function () {
 | |
|           return w;
 | |
|         }, function (px) {
 | |
|           return px * scale + 'px';
 | |
|         }, function (pc) {
 | |
|           return pc / 100 * newTotalWidth + 'px';
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var redistributeEmpty = function (newWidthType, columns) {
 | |
|       var f = newWidthType.fold(function () {
 | |
|         return constant('');
 | |
|       }, function (pixels) {
 | |
|         var num = pixels / columns;
 | |
|         return constant(num + 'px');
 | |
|       }, function () {
 | |
|         var num = 100 / columns;
 | |
|         return constant(num + '%');
 | |
|       });
 | |
|       return range$1(columns, f);
 | |
|     };
 | |
|     var redistributeValues = function (newWidthType, widths, totalWidth) {
 | |
|       return newWidthType.fold(function () {
 | |
|         return widths;
 | |
|       }, function (px) {
 | |
|         return redistributeToPx(widths, totalWidth, px);
 | |
|       }, function (_pc) {
 | |
|         return redistributeToPercent(widths, totalWidth);
 | |
|       });
 | |
|     };
 | |
|     var redistribute$1 = function (widths, totalWidth, newWidth) {
 | |
|       var newType = Size.from(newWidth);
 | |
|       var floats = forall(widths, function (s) {
 | |
|         return s === '0px';
 | |
|       }) ? redistributeEmpty(newType, widths.length) : redistributeValues(newType, widths, totalWidth);
 | |
|       return normalize(floats);
 | |
|     };
 | |
|     var sum = function (values, fallback) {
 | |
|       if (values.length === 0) {
 | |
|         return fallback;
 | |
|       }
 | |
|       return foldr(values, function (rest, v) {
 | |
|         return Size.from(v).fold(constant(0), identity, identity) + rest;
 | |
|       }, 0);
 | |
|     };
 | |
|     var roundDown = function (num, unit) {
 | |
|       var floored = Math.floor(num);
 | |
|       return {
 | |
|         value: floored + unit,
 | |
|         remainder: num - floored
 | |
|       };
 | |
|     };
 | |
|     var add$3 = function (value, amount) {
 | |
|       return Size.from(value).fold(constant(value), function (px) {
 | |
|         return px + amount + 'px';
 | |
|       }, function (pc) {
 | |
|         return pc + amount + '%';
 | |
|       });
 | |
|     };
 | |
|     var normalize = function (values) {
 | |
|       if (values.length === 0) {
 | |
|         return values;
 | |
|       }
 | |
|       var scan = foldr(values, function (rest, value) {
 | |
|         var info = Size.from(value).fold(function () {
 | |
|           return {
 | |
|             value: value,
 | |
|             remainder: 0
 | |
|           };
 | |
|         }, function (num) {
 | |
|           return roundDown(num, 'px');
 | |
|         }, function (num) {
 | |
|           return {
 | |
|             value: num + '%',
 | |
|             remainder: 0
 | |
|           };
 | |
|         });
 | |
|         return {
 | |
|           output: [info.value].concat(rest.output),
 | |
|           remainder: rest.remainder + info.remainder
 | |
|         };
 | |
|       }, {
 | |
|         output: [],
 | |
|         remainder: 0
 | |
|       });
 | |
|       var r = scan.output;
 | |
|       return r.slice(0, r.length - 1).concat([add$3(r[r.length - 1], Math.round(scan.remainder))]);
 | |
|     };
 | |
|     var validate = Size.from;
 | |
| 
 | |
|     var redistributeToW = function (newWidths, cells, unit) {
 | |
|       each$2(cells, function (cell) {
 | |
|         var widths = newWidths.slice(cell.column, cell.colspan + cell.column);
 | |
|         var w = sum(widths, minWidth());
 | |
|         set$1(cell.element, 'width', w + unit);
 | |
|       });
 | |
|     };
 | |
|     var redistributeToColumns = function (newWidths, columns, unit) {
 | |
|       each$2(columns, function (column, index) {
 | |
|         var width = sum([newWidths[index]], minWidth());
 | |
|         set$1(column.element, 'width', width + unit);
 | |
|       });
 | |
|     };
 | |
|     var redistributeToH = function (newHeights, rows, cells, unit) {
 | |
|       each$2(cells, function (cell) {
 | |
|         var heights = newHeights.slice(cell.row, cell.rowspan + cell.row);
 | |
|         var h = sum(heights, minHeight());
 | |
|         set$1(cell.element, 'height', h + unit);
 | |
|       });
 | |
|       each$2(rows, function (row, i) {
 | |
|         set$1(row.element, 'height', newHeights[i]);
 | |
|       });
 | |
|     };
 | |
|     var getUnit = function (newSize) {
 | |
|       return validate(newSize).fold(constant('px'), constant('px'), constant('%'));
 | |
|     };
 | |
|     var redistribute = function (table, optWidth, optHeight) {
 | |
|       var warehouse = Warehouse.fromTable(table);
 | |
|       var rows = warehouse.all;
 | |
|       var cells = Warehouse.justCells(warehouse);
 | |
|       var columns = Warehouse.justColumns(warehouse);
 | |
|       optWidth.each(function (newWidth) {
 | |
|         var widthUnit = getUnit(newWidth);
 | |
|         var totalWidth = get$8(table);
 | |
|         var oldWidths = getRawWidths(warehouse, table);
 | |
|         var nuWidths = redistribute$1(oldWidths, totalWidth, newWidth);
 | |
|         if (Warehouse.hasColumns(warehouse)) {
 | |
|           redistributeToColumns(nuWidths, columns, widthUnit);
 | |
|         } else {
 | |
|           redistributeToW(nuWidths, cells, widthUnit);
 | |
|         }
 | |
|         set$1(table, 'width', newWidth);
 | |
|       });
 | |
|       optHeight.each(function (newHeight) {
 | |
|         var hUnit = getUnit(newHeight);
 | |
|         var totalHeight = get$7(table);
 | |
|         var oldHeights = getRawHeights(warehouse, table, height);
 | |
|         var nuHeights = redistribute$1(oldHeights, totalHeight, newHeight);
 | |
|         redistributeToH(nuHeights, rows, cells, hUnit);
 | |
|         set$1(table, 'height', newHeight);
 | |
|       });
 | |
|     };
 | |
|     var isPercentSizing = isPercentSizing$1;
 | |
|     var isPixelSizing = isPixelSizing$1;
 | |
|     var isNoneSizing = isNoneSizing$1;
 | |
| 
 | |
|     var getGridSize = function (table) {
 | |
|       var warehouse = Warehouse.fromTable(table);
 | |
|       return warehouse.grid;
 | |
|     };
 | |
| 
 | |
|     var Event = function (fields) {
 | |
|       var handlers = [];
 | |
|       var bind = function (handler) {
 | |
|         if (handler === undefined) {
 | |
|           throw new Error('Event bind error: undefined handler');
 | |
|         }
 | |
|         handlers.push(handler);
 | |
|       };
 | |
|       var unbind = function (handler) {
 | |
|         handlers = filter$2(handlers, function (h) {
 | |
|           return h !== handler;
 | |
|         });
 | |
|       };
 | |
|       var trigger = function () {
 | |
|         var args = [];
 | |
|         for (var _i = 0; _i < arguments.length; _i++) {
 | |
|           args[_i] = arguments[_i];
 | |
|         }
 | |
|         var event = {};
 | |
|         each$2(fields, function (name, i) {
 | |
|           event[name] = args[i];
 | |
|         });
 | |
|         each$2(handlers, function (handler) {
 | |
|           handler(event);
 | |
|         });
 | |
|       };
 | |
|       return {
 | |
|         bind: bind,
 | |
|         unbind: unbind,
 | |
|         trigger: trigger
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var create$4 = function (typeDefs) {
 | |
|       var registry = map(typeDefs, function (event) {
 | |
|         return {
 | |
|           bind: event.bind,
 | |
|           unbind: event.unbind
 | |
|         };
 | |
|       });
 | |
|       var trigger = map(typeDefs, function (event) {
 | |
|         return event.trigger;
 | |
|       });
 | |
|       return {
 | |
|         registry: registry,
 | |
|         trigger: trigger
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var last = function (fn, rate) {
 | |
|       var timer = null;
 | |
|       var cancel = function () {
 | |
|         if (!isNull(timer)) {
 | |
|           clearTimeout(timer);
 | |
|           timer = null;
 | |
|         }
 | |
|       };
 | |
|       var throttle = function () {
 | |
|         var args = [];
 | |
|         for (var _i = 0; _i < arguments.length; _i++) {
 | |
|           args[_i] = arguments[_i];
 | |
|         }
 | |
|         cancel();
 | |
|         timer = setTimeout(function () {
 | |
|           timer = null;
 | |
|           fn.apply(null, args);
 | |
|         }, rate);
 | |
|       };
 | |
|       return {
 | |
|         cancel: cancel,
 | |
|         throttle: throttle
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var sort = function (arr) {
 | |
|       return arr.slice(0).sort();
 | |
|     };
 | |
|     var reqMessage = function (required, keys) {
 | |
|       throw new Error('All required keys (' + sort(required).join(', ') + ') were not specified. Specified keys were: ' + sort(keys).join(', ') + '.');
 | |
|     };
 | |
|     var unsuppMessage = function (unsupported) {
 | |
|       throw new Error('Unsupported keys for object: ' + sort(unsupported).join(', '));
 | |
|     };
 | |
|     var validateStrArr = function (label, array) {
 | |
|       if (!isArray(array)) {
 | |
|         throw new Error('The ' + label + ' fields must be an array. Was: ' + array + '.');
 | |
|       }
 | |
|       each$2(array, function (a) {
 | |
|         if (!isString(a)) {
 | |
|           throw new Error('The value ' + a + ' in the ' + label + ' fields was not a string.');
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var invalidTypeMessage = function (incorrect, type) {
 | |
|       throw new Error('All values need to be of type: ' + type + '. Keys (' + sort(incorrect).join(', ') + ') were not.');
 | |
|     };
 | |
|     var checkDupes = function (everything) {
 | |
|       var sorted = sort(everything);
 | |
|       var dupe = find$1(sorted, function (s, i) {
 | |
|         return i < sorted.length - 1 && s === sorted[i + 1];
 | |
|       });
 | |
|       dupe.each(function (d) {
 | |
|         throw new Error('The field: ' + d + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].');
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var base = function (handleUnsupported, required) {
 | |
|       return baseWith(handleUnsupported, required, {
 | |
|         validate: isFunction,
 | |
|         label: 'function'
 | |
|       });
 | |
|     };
 | |
|     var baseWith = function (handleUnsupported, required, pred) {
 | |
|       if (required.length === 0) {
 | |
|         throw new Error('You must specify at least one required field.');
 | |
|       }
 | |
|       validateStrArr('required', required);
 | |
|       checkDupes(required);
 | |
|       return function (obj) {
 | |
|         var keys$1 = keys(obj);
 | |
|         var allReqd = forall(required, function (req) {
 | |
|           return contains$2(keys$1, req);
 | |
|         });
 | |
|         if (!allReqd) {
 | |
|           reqMessage(required, keys$1);
 | |
|         }
 | |
|         handleUnsupported(required, keys$1);
 | |
|         var invalidKeys = filter$2(required, function (key) {
 | |
|           return !pred.validate(obj[key], key);
 | |
|         });
 | |
|         if (invalidKeys.length > 0) {
 | |
|           invalidTypeMessage(invalidKeys, pred.label);
 | |
|         }
 | |
|         return obj;
 | |
|       };
 | |
|     };
 | |
|     var handleExact = function (required, keys) {
 | |
|       var unsupported = filter$2(keys, function (key) {
 | |
|         return !contains$2(required, key);
 | |
|       });
 | |
|       if (unsupported.length > 0) {
 | |
|         unsuppMessage(unsupported);
 | |
|       }
 | |
|     };
 | |
|     var exactly = function (required) {
 | |
|       return base(handleExact, required);
 | |
|     };
 | |
| 
 | |
|     var DragMode = exactly([
 | |
|       'compare',
 | |
|       'extract',
 | |
|       'mutate',
 | |
|       'sink'
 | |
|     ]);
 | |
|     var DragSink = exactly([
 | |
|       'element',
 | |
|       'start',
 | |
|       'stop',
 | |
|       'destroy'
 | |
|     ]);
 | |
|     var DragApi = exactly([
 | |
|       'forceDrop',
 | |
|       'drop',
 | |
|       'move',
 | |
|       'delayDrop'
 | |
|     ]);
 | |
| 
 | |
|     var InDrag = function () {
 | |
|       var previous = Optional.none();
 | |
|       var reset = function () {
 | |
|         previous = Optional.none();
 | |
|       };
 | |
|       var update = function (mode, nu) {
 | |
|         var result = previous.map(function (old) {
 | |
|           return mode.compare(old, nu);
 | |
|         });
 | |
|         previous = Optional.some(nu);
 | |
|         return result;
 | |
|       };
 | |
|       var onEvent = function (event, mode) {
 | |
|         var dataOption = mode.extract(event);
 | |
|         dataOption.each(function (data) {
 | |
|           var offset = update(mode, data);
 | |
|           offset.each(function (d) {
 | |
|             events.trigger.move(d);
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var events = create$4({ move: Event(['info']) });
 | |
|       return {
 | |
|         onEvent: onEvent,
 | |
|         reset: reset,
 | |
|         events: events.registry
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var NoDrag = function () {
 | |
|       var events = create$4({ move: Event(['info']) });
 | |
|       return {
 | |
|         onEvent: noop,
 | |
|         reset: noop,
 | |
|         events: events.registry
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var Movement = function () {
 | |
|       var noDragState = NoDrag();
 | |
|       var inDragState = InDrag();
 | |
|       var dragState = noDragState;
 | |
|       var on = function () {
 | |
|         dragState.reset();
 | |
|         dragState = inDragState;
 | |
|       };
 | |
|       var off = function () {
 | |
|         dragState.reset();
 | |
|         dragState = noDragState;
 | |
|       };
 | |
|       var onEvent = function (event, mode) {
 | |
|         dragState.onEvent(event, mode);
 | |
|       };
 | |
|       var isOn = function () {
 | |
|         return dragState === inDragState;
 | |
|       };
 | |
|       return {
 | |
|         on: on,
 | |
|         off: off,
 | |
|         isOn: isOn,
 | |
|         onEvent: onEvent,
 | |
|         events: inDragState.events
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var setup = function (mutation, mode, settings) {
 | |
|       var active = false;
 | |
|       var events = create$4({
 | |
|         start: Event([]),
 | |
|         stop: Event([])
 | |
|       });
 | |
|       var movement = Movement();
 | |
|       var drop = function () {
 | |
|         sink.stop();
 | |
|         if (movement.isOn()) {
 | |
|           movement.off();
 | |
|           events.trigger.stop();
 | |
|         }
 | |
|       };
 | |
|       var throttledDrop = last(drop, 200);
 | |
|       var go = function (parent) {
 | |
|         sink.start(parent);
 | |
|         movement.on();
 | |
|         events.trigger.start();
 | |
|       };
 | |
|       var mousemove = function (event) {
 | |
|         throttledDrop.cancel();
 | |
|         movement.onEvent(event, mode);
 | |
|       };
 | |
|       movement.events.move.bind(function (event) {
 | |
|         mode.mutate(mutation, event.info);
 | |
|       });
 | |
|       var on = function () {
 | |
|         active = true;
 | |
|       };
 | |
|       var off = function () {
 | |
|         active = false;
 | |
|       };
 | |
|       var runIfActive = function (f) {
 | |
|         return function () {
 | |
|           var args = [];
 | |
|           for (var _i = 0; _i < arguments.length; _i++) {
 | |
|             args[_i] = arguments[_i];
 | |
|           }
 | |
|           if (active) {
 | |
|             f.apply(null, args);
 | |
|           }
 | |
|         };
 | |
|       };
 | |
|       var sink = mode.sink(DragApi({
 | |
|         forceDrop: drop,
 | |
|         drop: runIfActive(drop),
 | |
|         move: runIfActive(mousemove),
 | |
|         delayDrop: runIfActive(throttledDrop.throttle)
 | |
|       }), settings);
 | |
|       var destroy = function () {
 | |
|         sink.destroy();
 | |
|       };
 | |
|       return {
 | |
|         element: sink.element,
 | |
|         go: go,
 | |
|         on: on,
 | |
|         off: off,
 | |
|         destroy: destroy,
 | |
|         events: events.registry
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var mkEvent = function (target, x, y, stop, prevent, kill, raw) {
 | |
|       return {
 | |
|         target: target,
 | |
|         x: x,
 | |
|         y: y,
 | |
|         stop: stop,
 | |
|         prevent: prevent,
 | |
|         kill: kill,
 | |
|         raw: raw
 | |
|       };
 | |
|     };
 | |
|     var fromRawEvent$1 = function (rawEvent) {
 | |
|       var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));
 | |
|       var stop = function () {
 | |
|         return rawEvent.stopPropagation();
 | |
|       };
 | |
|       var prevent = function () {
 | |
|         return rawEvent.preventDefault();
 | |
|       };
 | |
|       var kill = compose(prevent, stop);
 | |
|       return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);
 | |
|     };
 | |
|     var handle$2 = function (filter, handler) {
 | |
|       return function (rawEvent) {
 | |
|         if (filter(rawEvent)) {
 | |
|           handler(fromRawEvent$1(rawEvent));
 | |
|         }
 | |
|       };
 | |
|     };
 | |
|     var binder = function (element, event, filter, handler, useCapture) {
 | |
|       var wrapped = handle$2(filter, handler);
 | |
|       element.dom.addEventListener(event, wrapped, useCapture);
 | |
|       return { unbind: curry(unbind, element, event, wrapped, useCapture) };
 | |
|     };
 | |
|     var bind$1 = function (element, event, filter, handler) {
 | |
|       return binder(element, event, filter, handler, false);
 | |
|     };
 | |
|     var unbind = function (element, event, handler, useCapture) {
 | |
|       element.dom.removeEventListener(event, handler, useCapture);
 | |
|     };
 | |
| 
 | |
|     var filter = always;
 | |
|     var bind = function (element, event, handler) {
 | |
|       return bind$1(element, event, filter, handler);
 | |
|     };
 | |
|     var fromRawEvent = fromRawEvent$1;
 | |
| 
 | |
|     var read = function (element, attr) {
 | |
|       var value = get$b(element, attr);
 | |
|       return value === undefined || value === '' ? [] : value.split(' ');
 | |
|     };
 | |
|     var add$2 = function (element, attr, id) {
 | |
|       var old = read(element, attr);
 | |
|       var nu = old.concat([id]);
 | |
|       set$2(element, attr, nu.join(' '));
 | |
|       return true;
 | |
|     };
 | |
|     var remove$4 = function (element, attr, id) {
 | |
|       var nu = filter$2(read(element, attr), function (v) {
 | |
|         return v !== id;
 | |
|       });
 | |
|       if (nu.length > 0) {
 | |
|         set$2(element, attr, nu.join(' '));
 | |
|       } else {
 | |
|         remove$7(element, attr);
 | |
|       }
 | |
|       return false;
 | |
|     };
 | |
| 
 | |
|     var supports = function (element) {
 | |
|       return element.dom.classList !== undefined;
 | |
|     };
 | |
|     var get$5 = function (element) {
 | |
|       return read(element, 'class');
 | |
|     };
 | |
|     var add$1 = function (element, clazz) {
 | |
|       return add$2(element, 'class', clazz);
 | |
|     };
 | |
|     var remove$3 = function (element, clazz) {
 | |
|       return remove$4(element, 'class', clazz);
 | |
|     };
 | |
| 
 | |
|     var add = function (element, clazz) {
 | |
|       if (supports(element)) {
 | |
|         element.dom.classList.add(clazz);
 | |
|       } else {
 | |
|         add$1(element, clazz);
 | |
|       }
 | |
|     };
 | |
|     var cleanClass = function (element) {
 | |
|       var classList = supports(element) ? element.dom.classList : get$5(element);
 | |
|       if (classList.length === 0) {
 | |
|         remove$7(element, 'class');
 | |
|       }
 | |
|     };
 | |
|     var remove$2 = function (element, clazz) {
 | |
|       if (supports(element)) {
 | |
|         var classList = element.dom.classList;
 | |
|         classList.remove(clazz);
 | |
|       } else {
 | |
|         remove$3(element, clazz);
 | |
|       }
 | |
|       cleanClass(element);
 | |
|     };
 | |
|     var has = function (element, clazz) {
 | |
|       return supports(element) && element.dom.classList.contains(clazz);
 | |
|     };
 | |
| 
 | |
|     var css = function (namespace) {
 | |
|       var dashNamespace = namespace.replace(/\./g, '-');
 | |
|       var resolve = function (str) {
 | |
|         return dashNamespace + '-' + str;
 | |
|       };
 | |
|       return { resolve: resolve };
 | |
|     };
 | |
| 
 | |
|     var styles$1 = css('ephox-dragster');
 | |
|     var resolve$1 = styles$1.resolve;
 | |
| 
 | |
|     var Blocker = function (options) {
 | |
|       var settings = __assign({ layerClass: resolve$1('blocker') }, options);
 | |
|       var div = SugarElement.fromTag('div');
 | |
|       set$2(div, 'role', 'presentation');
 | |
|       setAll(div, {
 | |
|         position: 'fixed',
 | |
|         left: '0px',
 | |
|         top: '0px',
 | |
|         width: '100%',
 | |
|         height: '100%'
 | |
|       });
 | |
|       add(div, resolve$1('blocker'));
 | |
|       add(div, settings.layerClass);
 | |
|       var element = constant(div);
 | |
|       var destroy = function () {
 | |
|         remove$5(div);
 | |
|       };
 | |
|       return {
 | |
|         element: element,
 | |
|         destroy: destroy
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var compare = function (old, nu) {
 | |
|       return SugarPosition(nu.left - old.left, nu.top - old.top);
 | |
|     };
 | |
|     var extract = function (event) {
 | |
|       return Optional.some(SugarPosition(event.x, event.y));
 | |
|     };
 | |
|     var mutate = function (mutation, info) {
 | |
|       mutation.mutate(info.left, info.top);
 | |
|     };
 | |
|     var sink = function (dragApi, settings) {
 | |
|       var blocker = Blocker(settings);
 | |
|       var mdown = bind(blocker.element(), 'mousedown', dragApi.forceDrop);
 | |
|       var mup = bind(blocker.element(), 'mouseup', dragApi.drop);
 | |
|       var mmove = bind(blocker.element(), 'mousemove', dragApi.move);
 | |
|       var mout = bind(blocker.element(), 'mouseout', dragApi.delayDrop);
 | |
|       var destroy = function () {
 | |
|         blocker.destroy();
 | |
|         mup.unbind();
 | |
|         mmove.unbind();
 | |
|         mout.unbind();
 | |
|         mdown.unbind();
 | |
|       };
 | |
|       var start = function (parent) {
 | |
|         append$1(parent, blocker.element());
 | |
|       };
 | |
|       var stop = function () {
 | |
|         remove$5(blocker.element());
 | |
|       };
 | |
|       return DragSink({
 | |
|         element: blocker.element,
 | |
|         start: start,
 | |
|         stop: stop,
 | |
|         destroy: destroy
 | |
|       });
 | |
|     };
 | |
|     var MouseDrag = DragMode({
 | |
|       compare: compare,
 | |
|       extract: extract,
 | |
|       sink: sink,
 | |
|       mutate: mutate
 | |
|     });
 | |
| 
 | |
|     var transform$1 = function (mutation, settings) {
 | |
|       if (settings === void 0) {
 | |
|         settings = {};
 | |
|       }
 | |
|       var mode = settings.mode !== undefined ? settings.mode : MouseDrag;
 | |
|       return setup(mutation, mode, settings);
 | |
|     };
 | |
| 
 | |
|     var closest = function (target) {
 | |
|       return closest$1(target, '[contenteditable]');
 | |
|     };
 | |
|     var isEditable$1 = function (element, assumeEditable) {
 | |
|       if (assumeEditable === void 0) {
 | |
|         assumeEditable = false;
 | |
|       }
 | |
|       if (!detect$3().browser.isIE() && inBody(element)) {
 | |
|         return element.dom.isContentEditable;
 | |
|       } else {
 | |
|         return closest(element).fold(constant(assumeEditable), function (editable) {
 | |
|           return getRaw(editable) === 'true';
 | |
|         });
 | |
|       }
 | |
|     };
 | |
|     var getRaw = function (element) {
 | |
|       return element.dom.contentEditable;
 | |
|     };
 | |
| 
 | |
|     var styles = css('ephox-snooker');
 | |
|     var resolve = styles.resolve;
 | |
| 
 | |
|     var Mutation = function () {
 | |
|       var events = create$4({
 | |
|         drag: Event([
 | |
|           'xDelta',
 | |
|           'yDelta'
 | |
|         ])
 | |
|       });
 | |
|       var mutate = function (x, y) {
 | |
|         events.trigger.drag(x, y);
 | |
|       };
 | |
|       return {
 | |
|         mutate: mutate,
 | |
|         events: events.registry
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var BarMutation = function () {
 | |
|       var events = create$4({
 | |
|         drag: Event([
 | |
|           'xDelta',
 | |
|           'yDelta',
 | |
|           'target'
 | |
|         ])
 | |
|       });
 | |
|       var target = Optional.none();
 | |
|       var delegate = Mutation();
 | |
|       delegate.events.drag.bind(function (event) {
 | |
|         target.each(function (t) {
 | |
|           events.trigger.drag(event.xDelta, event.yDelta, t);
 | |
|         });
 | |
|       });
 | |
|       var assign = function (t) {
 | |
|         target = Optional.some(t);
 | |
|       };
 | |
|       var get = function () {
 | |
|         return target;
 | |
|       };
 | |
|       return {
 | |
|         assign: assign,
 | |
|         get: get,
 | |
|         mutate: delegate.mutate,
 | |
|         events: events.registry
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var col = function (column, x, y, w, h) {
 | |
|       var bar = SugarElement.fromTag('div');
 | |
|       setAll(bar, {
 | |
|         position: 'absolute',
 | |
|         left: x - w / 2 + 'px',
 | |
|         top: y + 'px',
 | |
|         height: h + 'px',
 | |
|         width: w + 'px'
 | |
|       });
 | |
|       setAll$1(bar, {
 | |
|         'data-column': column,
 | |
|         'role': 'presentation'
 | |
|       });
 | |
|       return bar;
 | |
|     };
 | |
|     var row = function (r, x, y, w, h) {
 | |
|       var bar = SugarElement.fromTag('div');
 | |
|       setAll(bar, {
 | |
|         position: 'absolute',
 | |
|         left: x + 'px',
 | |
|         top: y - h / 2 + 'px',
 | |
|         height: h + 'px',
 | |
|         width: w + 'px'
 | |
|       });
 | |
|       setAll$1(bar, {
 | |
|         'data-row': r,
 | |
|         'role': 'presentation'
 | |
|       });
 | |
|       return bar;
 | |
|     };
 | |
| 
 | |
|     var resizeBar = resolve('resizer-bar');
 | |
|     var resizeRowBar = resolve('resizer-rows');
 | |
|     var resizeColBar = resolve('resizer-cols');
 | |
|     var BAR_THICKNESS = 7;
 | |
|     var resizableRows = function (warehouse, isResizable) {
 | |
|       return bind$2(warehouse.all, function (row, i) {
 | |
|         return isResizable(row.element) ? [i] : [];
 | |
|       });
 | |
|     };
 | |
|     var resizableColumns = function (warehouse, isResizable) {
 | |
|       var resizableCols = [];
 | |
|       range$1(warehouse.grid.columns, function (index) {
 | |
|         var colElmOpt = Warehouse.getColumnAt(warehouse, index).map(function (col) {
 | |
|           return col.element;
 | |
|         });
 | |
|         if (colElmOpt.forall(isResizable)) {
 | |
|           resizableCols.push(index);
 | |
|         }
 | |
|       });
 | |
|       return filter$2(resizableCols, function (colIndex) {
 | |
|         var columnCells = Warehouse.filterItems(warehouse, function (cell) {
 | |
|           return cell.column === colIndex;
 | |
|         });
 | |
|         return forall(columnCells, function (cell) {
 | |
|           return isResizable(cell.element);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var destroy = function (wire) {
 | |
|       var previous = descendants(wire.parent(), '.' + resizeBar);
 | |
|       each$2(previous, remove$5);
 | |
|     };
 | |
|     var drawBar = function (wire, positions, create) {
 | |
|       var origin = wire.origin();
 | |
|       each$2(positions, function (cpOption) {
 | |
|         cpOption.each(function (cp) {
 | |
|           var bar = create(origin, cp);
 | |
|           add(bar, resizeBar);
 | |
|           append$1(wire.parent(), bar);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var refreshCol = function (wire, colPositions, position, tableHeight) {
 | |
|       drawBar(wire, colPositions, function (origin, cp) {
 | |
|         var colBar = col(cp.col, cp.x - origin.left, position.top - origin.top, BAR_THICKNESS, tableHeight);
 | |
|         add(colBar, resizeColBar);
 | |
|         return colBar;
 | |
|       });
 | |
|     };
 | |
|     var refreshRow = function (wire, rowPositions, position, tableWidth) {
 | |
|       drawBar(wire, rowPositions, function (origin, cp) {
 | |
|         var rowBar = row(cp.row, position.left - origin.left, cp.y - origin.top, tableWidth, BAR_THICKNESS);
 | |
|         add(rowBar, resizeRowBar);
 | |
|         return rowBar;
 | |
|       });
 | |
|     };
 | |
|     var refreshGrid = function (warhouse, wire, table, rows, cols) {
 | |
|       var position = absolute(table);
 | |
|       var isResizable = wire.isResizable;
 | |
|       var rowPositions = rows.length > 0 ? height.positions(rows, table) : [];
 | |
|       var resizableRowBars = rowPositions.length > 0 ? resizableRows(warhouse, isResizable) : [];
 | |
|       var resizableRowPositions = filter$2(rowPositions, function (_pos, i) {
 | |
|         return exists(resizableRowBars, function (barIndex) {
 | |
|           return i === barIndex;
 | |
|         });
 | |
|       });
 | |
|       refreshRow(wire, resizableRowPositions, position, getOuter$2(table));
 | |
|       var colPositions = cols.length > 0 ? width.positions(cols, table) : [];
 | |
|       var resizableColBars = colPositions.length > 0 ? resizableColumns(warhouse, isResizable) : [];
 | |
|       var resizableColPositions = filter$2(colPositions, function (_pos, i) {
 | |
|         return exists(resizableColBars, function (barIndex) {
 | |
|           return i === barIndex;
 | |
|         });
 | |
|       });
 | |
|       refreshCol(wire, resizableColPositions, position, getOuter$1(table));
 | |
|     };
 | |
|     var refresh = function (wire, table) {
 | |
|       destroy(wire);
 | |
|       if (wire.isResizable(table)) {
 | |
|         var warehouse = Warehouse.fromTable(table);
 | |
|         var rows$1 = rows(warehouse);
 | |
|         var cols = columns(warehouse);
 | |
|         refreshGrid(warehouse, wire, table, rows$1, cols);
 | |
|       }
 | |
|     };
 | |
|     var each = function (wire, f) {
 | |
|       var bars = descendants(wire.parent(), '.' + resizeBar);
 | |
|       each$2(bars, f);
 | |
|     };
 | |
|     var hide = function (wire) {
 | |
|       each(wire, function (bar) {
 | |
|         set$1(bar, 'display', 'none');
 | |
|       });
 | |
|     };
 | |
|     var show = function (wire) {
 | |
|       each(wire, function (bar) {
 | |
|         set$1(bar, 'display', 'block');
 | |
|       });
 | |
|     };
 | |
|     var isRowBar = function (element) {
 | |
|       return has(element, resizeRowBar);
 | |
|     };
 | |
|     var isColBar = function (element) {
 | |
|       return has(element, resizeColBar);
 | |
|     };
 | |
| 
 | |
|     var resizeBarDragging = resolve('resizer-bar-dragging');
 | |
|     var BarManager = function (wire) {
 | |
|       var mutation = BarMutation();
 | |
|       var resizing = transform$1(mutation, {});
 | |
|       var hoverTable = Optional.none();
 | |
|       var getResizer = function (element, type) {
 | |
|         return Optional.from(get$b(element, type));
 | |
|       };
 | |
|       mutation.events.drag.bind(function (event) {
 | |
|         getResizer(event.target, 'data-row').each(function (_dataRow) {
 | |
|           var currentRow = getCssValue(event.target, 'top');
 | |
|           set$1(event.target, 'top', currentRow + event.yDelta + 'px');
 | |
|         });
 | |
|         getResizer(event.target, 'data-column').each(function (_dataCol) {
 | |
|           var currentCol = getCssValue(event.target, 'left');
 | |
|           set$1(event.target, 'left', currentCol + event.xDelta + 'px');
 | |
|         });
 | |
|       });
 | |
|       var getDelta = function (target, dir) {
 | |
|         var newX = getCssValue(target, dir);
 | |
|         var oldX = getAttrValue(target, 'data-initial-' + dir, 0);
 | |
|         return newX - oldX;
 | |
|       };
 | |
|       resizing.events.stop.bind(function () {
 | |
|         mutation.get().each(function (target) {
 | |
|           hoverTable.each(function (table) {
 | |
|             getResizer(target, 'data-row').each(function (row) {
 | |
|               var delta = getDelta(target, 'top');
 | |
|               remove$7(target, 'data-initial-top');
 | |
|               events.trigger.adjustHeight(table, delta, parseInt(row, 10));
 | |
|             });
 | |
|             getResizer(target, 'data-column').each(function (column) {
 | |
|               var delta = getDelta(target, 'left');
 | |
|               remove$7(target, 'data-initial-left');
 | |
|               events.trigger.adjustWidth(table, delta, parseInt(column, 10));
 | |
|             });
 | |
|             refresh(wire, table);
 | |
|           });
 | |
|         });
 | |
|       });
 | |
|       var handler = function (target, dir) {
 | |
|         events.trigger.startAdjust();
 | |
|         mutation.assign(target);
 | |
|         set$2(target, 'data-initial-' + dir, getCssValue(target, dir));
 | |
|         add(target, resizeBarDragging);
 | |
|         set$1(target, 'opacity', '0.2');
 | |
|         resizing.go(wire.parent());
 | |
|       };
 | |
|       var mousedown = bind(wire.parent(), 'mousedown', function (event) {
 | |
|         if (isRowBar(event.target)) {
 | |
|           handler(event.target, 'top');
 | |
|         }
 | |
|         if (isColBar(event.target)) {
 | |
|           handler(event.target, 'left');
 | |
|         }
 | |
|       });
 | |
|       var isRoot = function (e) {
 | |
|         return eq$1(e, wire.view());
 | |
|       };
 | |
|       var findClosestEditableTable = function (target) {
 | |
|         return closest$1(target, 'table', isRoot).filter(isEditable$1);
 | |
|       };
 | |
|       var mouseover = bind(wire.view(), 'mouseover', function (event) {
 | |
|         findClosestEditableTable(event.target).fold(function () {
 | |
|           if (inBody(event.target)) {
 | |
|             destroy(wire);
 | |
|           }
 | |
|         }, function (table) {
 | |
|           hoverTable = Optional.some(table);
 | |
|           refresh(wire, table);
 | |
|         });
 | |
|       });
 | |
|       var destroy$1 = function () {
 | |
|         mousedown.unbind();
 | |
|         mouseover.unbind();
 | |
|         resizing.destroy();
 | |
|         destroy(wire);
 | |
|       };
 | |
|       var refresh$1 = function (tbl) {
 | |
|         refresh(wire, tbl);
 | |
|       };
 | |
|       var events = create$4({
 | |
|         adjustHeight: Event([
 | |
|           'table',
 | |
|           'delta',
 | |
|           'row'
 | |
|         ]),
 | |
|         adjustWidth: Event([
 | |
|           'table',
 | |
|           'delta',
 | |
|           'column'
 | |
|         ]),
 | |
|         startAdjust: Event([])
 | |
|       });
 | |
|       return {
 | |
|         destroy: destroy$1,
 | |
|         refresh: refresh$1,
 | |
|         on: resizing.on,
 | |
|         off: resizing.off,
 | |
|         hideBars: curry(hide, wire),
 | |
|         showBars: curry(show, wire),
 | |
|         events: events.registry
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var create$3 = function (wire, resizing, lazySizing) {
 | |
|       var hdirection = height;
 | |
|       var vdirection = width;
 | |
|       var manager = BarManager(wire);
 | |
|       var events = create$4({
 | |
|         beforeResize: Event([
 | |
|           'table',
 | |
|           'type'
 | |
|         ]),
 | |
|         afterResize: Event([
 | |
|           'table',
 | |
|           'type'
 | |
|         ]),
 | |
|         startDrag: Event([])
 | |
|       });
 | |
|       manager.events.adjustHeight.bind(function (event) {
 | |
|         var table = event.table;
 | |
|         events.trigger.beforeResize(table, 'row');
 | |
|         var delta = hdirection.delta(event.delta, table);
 | |
|         adjustHeight(table, delta, event.row, hdirection);
 | |
|         events.trigger.afterResize(table, 'row');
 | |
|       });
 | |
|       manager.events.startAdjust.bind(function (_event) {
 | |
|         events.trigger.startDrag();
 | |
|       });
 | |
|       manager.events.adjustWidth.bind(function (event) {
 | |
|         var table = event.table;
 | |
|         events.trigger.beforeResize(table, 'col');
 | |
|         var delta = vdirection.delta(event.delta, table);
 | |
|         var tableSize = lazySizing(table);
 | |
|         adjustWidth(table, delta, event.column, resizing, tableSize);
 | |
|         events.trigger.afterResize(table, 'col');
 | |
|       });
 | |
|       return {
 | |
|         on: manager.on,
 | |
|         off: manager.off,
 | |
|         hideBars: manager.hideBars,
 | |
|         showBars: manager.showBars,
 | |
|         destroy: manager.destroy,
 | |
|         events: events.registry
 | |
|       };
 | |
|     };
 | |
|     var TableResize = { create: create$3 };
 | |
| 
 | |
|     var fireNewRow = function (editor, row) {
 | |
|       return editor.fire('newrow', { node: row });
 | |
|     };
 | |
|     var fireNewCell = function (editor, cell) {
 | |
|       return editor.fire('newcell', { node: cell });
 | |
|     };
 | |
|     var fireObjectResizeStart = function (editor, target, width, height, origin) {
 | |
|       editor.fire('ObjectResizeStart', {
 | |
|         target: target,
 | |
|         width: width,
 | |
|         height: height,
 | |
|         origin: origin
 | |
|       });
 | |
|     };
 | |
|     var fireObjectResized = function (editor, target, width, height, origin) {
 | |
|       editor.fire('ObjectResized', {
 | |
|         target: target,
 | |
|         width: width,
 | |
|         height: height,
 | |
|         origin: origin
 | |
|       });
 | |
|     };
 | |
|     var fireTableSelectionChange = function (editor, cells, start, finish, otherCells) {
 | |
|       editor.fire('TableSelectionChange', {
 | |
|         cells: cells,
 | |
|         start: start,
 | |
|         finish: finish,
 | |
|         otherCells: otherCells
 | |
|       });
 | |
|     };
 | |
|     var fireTableSelectionClear = function (editor) {
 | |
|       editor.fire('TableSelectionClear');
 | |
|     };
 | |
|     var fireTableModified = function (editor, table, data) {
 | |
|       editor.fire('TableModified', __assign(__assign({}, data), { table: table }));
 | |
|     };
 | |
|     var styleModified = {
 | |
|       structure: false,
 | |
|       style: true
 | |
|     };
 | |
|     var structureModified = {
 | |
|       structure: true,
 | |
|       style: false
 | |
|     };
 | |
|     var styleAndStructureModified = {
 | |
|       structure: true,
 | |
|       style: true
 | |
|     };
 | |
| 
 | |
|     var defaultTableToolbar = 'tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol';
 | |
|     var defaultStyles = {
 | |
|       'border-collapse': 'collapse',
 | |
|       'width': '100%'
 | |
|     };
 | |
|     var defaultCellBorderWidths = range$1(5, function (i) {
 | |
|       var size = i + 1 + 'px';
 | |
|       return {
 | |
|         title: size,
 | |
|         value: size
 | |
|       };
 | |
|     });
 | |
|     var defaultCellBorderStyles = map$1([
 | |
|       'Solid',
 | |
|       'Dotted',
 | |
|       'Dashed',
 | |
|       'Double',
 | |
|       'Groove',
 | |
|       'Ridge',
 | |
|       'Inset',
 | |
|       'Outset',
 | |
|       'None',
 | |
|       'Hidden'
 | |
|     ], function (type) {
 | |
|       return {
 | |
|         title: type,
 | |
|         value: type.toLowerCase()
 | |
|       };
 | |
|     });
 | |
|     var determineDefaultStyles = function (editor) {
 | |
|       var _a;
 | |
|       if (isPixelsForced(editor)) {
 | |
|         var dom = editor.dom;
 | |
|         var parentBlock = (_a = dom.getParent(editor.selection.getStart(), dom.isBlock)) !== null && _a !== void 0 ? _a : editor.getBody();
 | |
|         var contentWidth = getInner(SugarElement.fromDom(parentBlock));
 | |
|         return __assign(__assign({}, defaultStyles), { width: contentWidth + 'px' });
 | |
|       } else if (isResponsiveForced(editor)) {
 | |
|         return filter$1(defaultStyles, function (_value, key) {
 | |
|           return key !== 'width';
 | |
|         });
 | |
|       } else {
 | |
|         return defaultStyles;
 | |
|       }
 | |
|     };
 | |
|     var defaultAttributes = { border: '1' };
 | |
|     var defaultColumnResizingBehaviour = 'preservetable';
 | |
|     var getTableSizingMode = function (editor) {
 | |
|       return editor.getParam('table_sizing_mode', 'auto');
 | |
|     };
 | |
|     var getTableResponseWidth = function (editor) {
 | |
|       return editor.getParam('table_responsive_width');
 | |
|     };
 | |
|     var getTableBorderWidths = function (editor) {
 | |
|       return editor.getParam('table_border_widths', defaultCellBorderWidths, 'array');
 | |
|     };
 | |
|     var getTableBorderStyles = function (editor) {
 | |
|       return editor.getParam('table_border_styles', defaultCellBorderStyles, 'array');
 | |
|     };
 | |
|     var getDefaultAttributes = function (editor) {
 | |
|       return editor.getParam('table_default_attributes', defaultAttributes, 'object');
 | |
|     };
 | |
|     var getDefaultStyles = function (editor) {
 | |
|       return editor.getParam('table_default_styles', determineDefaultStyles(editor), 'object');
 | |
|     };
 | |
|     var hasTableResizeBars = function (editor) {
 | |
|       return editor.getParam('table_resize_bars', true, 'boolean');
 | |
|     };
 | |
|     var hasTabNavigation = function (editor) {
 | |
|       return editor.getParam('table_tab_navigation', true, 'boolean');
 | |
|     };
 | |
|     var hasAdvancedCellTab = function (editor) {
 | |
|       return editor.getParam('table_cell_advtab', true, 'boolean');
 | |
|     };
 | |
|     var hasAdvancedRowTab = function (editor) {
 | |
|       return editor.getParam('table_row_advtab', true, 'boolean');
 | |
|     };
 | |
|     var hasAdvancedTableTab = function (editor) {
 | |
|       return editor.getParam('table_advtab', true, 'boolean');
 | |
|     };
 | |
|     var hasAppearanceOptions = function (editor) {
 | |
|       return editor.getParam('table_appearance_options', true, 'boolean');
 | |
|     };
 | |
|     var hasTableGrid = function (editor) {
 | |
|       return editor.getParam('table_grid', true, 'boolean');
 | |
|     };
 | |
|     var shouldStyleWithCss = function (editor) {
 | |
|       return editor.getParam('table_style_by_css', false, 'boolean');
 | |
|     };
 | |
|     var getCellClassList = function (editor) {
 | |
|       return editor.getParam('table_cell_class_list', [], 'array');
 | |
|     };
 | |
|     var getRowClassList = function (editor) {
 | |
|       return editor.getParam('table_row_class_list', [], 'array');
 | |
|     };
 | |
|     var getTableClassList = function (editor) {
 | |
|       return editor.getParam('table_class_list', [], 'array');
 | |
|     };
 | |
|     var isPercentagesForced = function (editor) {
 | |
|       return getTableSizingMode(editor) === 'relative' || getTableResponseWidth(editor) === true;
 | |
|     };
 | |
|     var isPixelsForced = function (editor) {
 | |
|       return getTableSizingMode(editor) === 'fixed' || getTableResponseWidth(editor) === false;
 | |
|     };
 | |
|     var isResponsiveForced = function (editor) {
 | |
|       return getTableSizingMode(editor) === 'responsive';
 | |
|     };
 | |
|     var getToolbar = function (editor) {
 | |
|       return editor.getParam('table_toolbar', defaultTableToolbar);
 | |
|     };
 | |
|     var useColumnGroup = function (editor) {
 | |
|       return editor.getParam('table_use_colgroups', false, 'boolean');
 | |
|     };
 | |
|     var getTableHeaderType = function (editor) {
 | |
|       var defaultValue = 'section';
 | |
|       var value = editor.getParam('table_header_type', defaultValue, 'string');
 | |
|       var validValues = [
 | |
|         'section',
 | |
|         'cells',
 | |
|         'sectionCells',
 | |
|         'auto'
 | |
|       ];
 | |
|       if (!contains$2(validValues, value)) {
 | |
|         return defaultValue;
 | |
|       } else {
 | |
|         return value;
 | |
|       }
 | |
|     };
 | |
|     var getColumnResizingBehaviour = function (editor) {
 | |
|       var validModes = [
 | |
|         'preservetable',
 | |
|         'resizetable'
 | |
|       ];
 | |
|       var givenMode = editor.getParam('table_column_resizing', defaultColumnResizingBehaviour, 'string');
 | |
|       return find$1(validModes, function (mode) {
 | |
|         return mode === givenMode;
 | |
|       }).getOr(defaultColumnResizingBehaviour);
 | |
|     };
 | |
|     var isPreserveTableColumnResizing = function (editor) {
 | |
|       return getColumnResizingBehaviour(editor) === 'preservetable';
 | |
|     };
 | |
|     var isResizeTableColumnResizing = function (editor) {
 | |
|       return getColumnResizingBehaviour(editor) === 'resizetable';
 | |
|     };
 | |
|     var getCloneElements = function (editor) {
 | |
|       var cloneElements = editor.getParam('table_clone_elements');
 | |
|       if (isString(cloneElements)) {
 | |
|         return Optional.some(cloneElements.split(/[ ,]/));
 | |
|       } else if (Array.isArray(cloneElements)) {
 | |
|         return Optional.some(cloneElements);
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
|     var hasObjectResizing = function (editor) {
 | |
|       var objectResizing = editor.getParam('object_resizing', true);
 | |
|       return isString(objectResizing) ? objectResizing === 'table' : objectResizing;
 | |
|     };
 | |
|     var getTableBackgroundColorMap = function (editor) {
 | |
|       return editor.getParam('table_background_color_map', [], 'array');
 | |
|     };
 | |
|     var getTableBorderColorMap = function (editor) {
 | |
|       return editor.getParam('table_border_color_map', [], 'array');
 | |
|     };
 | |
| 
 | |
|     var get$4 = function (editor, table) {
 | |
|       if (isPercentagesForced(editor)) {
 | |
|         return TableSize.percentageSize(table);
 | |
|       } else if (isPixelsForced(editor)) {
 | |
|         return TableSize.pixelSize(table);
 | |
|       } else {
 | |
|         return TableSize.getTableSize(table);
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var cleanupLegacyAttributes = function (element) {
 | |
|       remove$7(element, 'width');
 | |
|     };
 | |
|     var convertToPercentSize = function (table) {
 | |
|       var newWidth = getPercentTableWidth(table);
 | |
|       redistribute(table, Optional.some(newWidth), Optional.none());
 | |
|       cleanupLegacyAttributes(table);
 | |
|     };
 | |
|     var convertToPixelSize = function (table) {
 | |
|       var newWidth = getPixelTableWidth(table);
 | |
|       redistribute(table, Optional.some(newWidth), Optional.none());
 | |
|       cleanupLegacyAttributes(table);
 | |
|     };
 | |
|     var convertToNoneSize = function (table) {
 | |
|       remove$6(table, 'width');
 | |
|       var columns = columns$1(table);
 | |
|       var rowElements = columns.length > 0 ? columns : cells$1(table);
 | |
|       each$2(rowElements, function (cell) {
 | |
|         remove$6(cell, 'width');
 | |
|         cleanupLegacyAttributes(cell);
 | |
|       });
 | |
|       cleanupLegacyAttributes(table);
 | |
|     };
 | |
| 
 | |
|     var enforcePercentage = convertToPercentSize;
 | |
|     var enforcePixels = convertToPixelSize;
 | |
|     var enforceNone = convertToNoneSize;
 | |
|     var syncPixels = function (table) {
 | |
|       var warehouse = Warehouse.fromTable(table);
 | |
|       if (!Warehouse.hasColumns(warehouse)) {
 | |
|         each$2(cells$1(table), function (cell) {
 | |
|           var computedWidth = get$a(cell, 'width');
 | |
|           set$1(cell, 'width', computedWidth);
 | |
|           remove$7(cell, 'width');
 | |
|         });
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var createContainer = function () {
 | |
|       var container = SugarElement.fromTag('div');
 | |
|       setAll(container, {
 | |
|         position: 'static',
 | |
|         height: '0',
 | |
|         width: '0',
 | |
|         padding: '0',
 | |
|         margin: '0',
 | |
|         border: '0'
 | |
|       });
 | |
|       append$1(body$1(), container);
 | |
|       return container;
 | |
|     };
 | |
|     var get$3 = function (editor, isResizable) {
 | |
|       return editor.inline ? ResizeWire.body(getBody(editor), createContainer(), isResizable) : ResizeWire.only(SugarElement.fromDom(editor.getDoc()), isResizable);
 | |
|     };
 | |
|     var remove$1 = function (editor, wire) {
 | |
|       if (editor.inline) {
 | |
|         remove$5(wire.parent());
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var barResizerPrefix = 'bar-';
 | |
|     var isResizable = function (elm) {
 | |
|       return get$b(elm, 'data-mce-resize') !== 'false';
 | |
|     };
 | |
|     var getResizeHandler = function (editor) {
 | |
|       var selectionRng = Optional.none();
 | |
|       var resize = Optional.none();
 | |
|       var wire = Optional.none();
 | |
|       var startW;
 | |
|       var startRawW;
 | |
|       var isTable = function (elm) {
 | |
|         return elm.nodeName === 'TABLE';
 | |
|       };
 | |
|       var lazyResize = function () {
 | |
|         return resize;
 | |
|       };
 | |
|       var lazyWire = function () {
 | |
|         return wire.getOr(ResizeWire.only(SugarElement.fromDom(editor.getBody()), isResizable));
 | |
|       };
 | |
|       var lazySizing = function (table) {
 | |
|         return get$4(editor, table);
 | |
|       };
 | |
|       var lazyResizingBehaviour = function () {
 | |
|         return isPreserveTableColumnResizing(editor) ? preserveTable() : resizeTable();
 | |
|       };
 | |
|       var getNumColumns = function (table) {
 | |
|         return getGridSize(table).columns;
 | |
|       };
 | |
|       var afterCornerResize = function (table, origin, width) {
 | |
|         var isRightEdgeResize = endsWith(origin, 'e');
 | |
|         if (startRawW === '') {
 | |
|           enforcePercentage(table);
 | |
|         }
 | |
|         if (width !== startW && startRawW !== '') {
 | |
|           set$1(table, 'width', startRawW);
 | |
|           var resizing = lazyResizingBehaviour();
 | |
|           var tableSize = lazySizing(table);
 | |
|           var col = isPreserveTableColumnResizing(editor) || isRightEdgeResize ? getNumColumns(table) - 1 : 0;
 | |
|           adjustWidth(table, width - startW, col, resizing, tableSize);
 | |
|         } else if (isPercentage$1(startRawW)) {
 | |
|           var percentW = parseFloat(startRawW.replace('%', ''));
 | |
|           var targetPercentW = width * percentW / startW;
 | |
|           set$1(table, 'width', targetPercentW + '%');
 | |
|         }
 | |
|         if (isPixel(startRawW)) {
 | |
|           syncPixels(table);
 | |
|         }
 | |
|       };
 | |
|       var destroy = function () {
 | |
|         resize.each(function (sz) {
 | |
|           sz.destroy();
 | |
|         });
 | |
|         wire.each(function (w) {
 | |
|           remove$1(editor, w);
 | |
|         });
 | |
|       };
 | |
|       editor.on('init', function () {
 | |
|         var rawWire = get$3(editor, isResizable);
 | |
|         wire = Optional.some(rawWire);
 | |
|         if (hasObjectResizing(editor) && hasTableResizeBars(editor)) {
 | |
|           var resizing = lazyResizingBehaviour();
 | |
|           var sz = TableResize.create(rawWire, resizing, lazySizing);
 | |
|           sz.on();
 | |
|           sz.events.startDrag.bind(function (_event) {
 | |
|             selectionRng = Optional.some(editor.selection.getRng());
 | |
|           });
 | |
|           sz.events.beforeResize.bind(function (event) {
 | |
|             var rawTable = event.table.dom;
 | |
|             fireObjectResizeStart(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type);
 | |
|           });
 | |
|           sz.events.afterResize.bind(function (event) {
 | |
|             var table = event.table;
 | |
|             var rawTable = table.dom;
 | |
|             removeDataStyle(table);
 | |
|             selectionRng.each(function (rng) {
 | |
|               editor.selection.setRng(rng);
 | |
|               editor.focus();
 | |
|             });
 | |
|             fireObjectResized(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type);
 | |
|             editor.undoManager.add();
 | |
|           });
 | |
|           resize = Optional.some(sz);
 | |
|         }
 | |
|       });
 | |
|       editor.on('ObjectResizeStart', function (e) {
 | |
|         var targetElm = e.target;
 | |
|         if (isTable(targetElm)) {
 | |
|           var table = SugarElement.fromDom(targetElm);
 | |
|           each$2(editor.dom.select('.mce-clonedresizable'), function (clone) {
 | |
|             editor.dom.addClass(clone, 'mce-' + getColumnResizingBehaviour(editor) + '-columns');
 | |
|           });
 | |
|           if (!isPixelSizing(table) && isPixelsForced(editor)) {
 | |
|             enforcePixels(table);
 | |
|           } else if (!isPercentSizing(table) && isPercentagesForced(editor)) {
 | |
|             enforcePercentage(table);
 | |
|           }
 | |
|           if (isNoneSizing(table) && startsWith(e.origin, barResizerPrefix)) {
 | |
|             enforcePercentage(table);
 | |
|           }
 | |
|           startW = e.width;
 | |
|           startRawW = isResponsiveForced(editor) ? '' : getRawWidth(editor, targetElm).getOr('');
 | |
|         }
 | |
|       });
 | |
|       editor.on('ObjectResized', function (e) {
 | |
|         var targetElm = e.target;
 | |
|         if (isTable(targetElm)) {
 | |
|           var table = SugarElement.fromDom(targetElm);
 | |
|           var origin_1 = e.origin;
 | |
|           if (startsWith(origin_1, 'corner-')) {
 | |
|             afterCornerResize(table, origin_1, e.width);
 | |
|           }
 | |
|           removeDataStyle(table);
 | |
|           fireTableModified(editor, table.dom, styleModified);
 | |
|         }
 | |
|       });
 | |
|       editor.on('SwitchMode', function () {
 | |
|         lazyResize().each(function (resize) {
 | |
|           if (editor.mode.isReadOnly()) {
 | |
|             resize.hideBars();
 | |
|           } else {
 | |
|             resize.showBars();
 | |
|           }
 | |
|         });
 | |
|       });
 | |
|       return {
 | |
|         lazyResize: lazyResize,
 | |
|         lazyWire: lazyWire,
 | |
|         destroy: destroy
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var point = function (element, offset) {
 | |
|       return {
 | |
|         element: element,
 | |
|         offset: offset
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var scan$1 = function (universe, element, direction) {
 | |
|       if (universe.property().isText(element) && universe.property().getText(element).trim().length === 0 || universe.property().isComment(element)) {
 | |
|         return direction(element).bind(function (elem) {
 | |
|           return scan$1(universe, elem, direction).orThunk(function () {
 | |
|             return Optional.some(elem);
 | |
|           });
 | |
|         });
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
|     var toEnd = function (universe, element) {
 | |
|       if (universe.property().isText(element)) {
 | |
|         return universe.property().getText(element).length;
 | |
|       }
 | |
|       var children = universe.property().children(element);
 | |
|       return children.length;
 | |
|     };
 | |
|     var freefallRtl$2 = function (universe, element) {
 | |
|       var candidate = scan$1(universe, element, universe.query().prevSibling).getOr(element);
 | |
|       if (universe.property().isText(candidate)) {
 | |
|         return point(candidate, toEnd(universe, candidate));
 | |
|       }
 | |
|       var children = universe.property().children(candidate);
 | |
|       return children.length > 0 ? freefallRtl$2(universe, children[children.length - 1]) : point(candidate, toEnd(universe, candidate));
 | |
|     };
 | |
| 
 | |
|     var freefallRtl$1 = freefallRtl$2;
 | |
| 
 | |
|     var universe$2 = DomUniverse();
 | |
|     var freefallRtl = function (element) {
 | |
|       return freefallRtl$1(universe$2, element);
 | |
|     };
 | |
| 
 | |
|     var halve = function (main, other) {
 | |
|       var colspan = getSpan(main, 'colspan');
 | |
|       if (colspan === 1) {
 | |
|         var width = getGenericWidth(main);
 | |
|         width.each(function (w) {
 | |
|           var newWidth = w.value / 2;
 | |
|           setGenericWidth(main, newWidth, w.unit);
 | |
|           setGenericWidth(other, newWidth, w.unit);
 | |
|         });
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var isHeaderCell = isTag('th');
 | |
|     var isHeaderCells = function (cells) {
 | |
|       return forall(cells, function (cell) {
 | |
|         return isHeaderCell(cell.element);
 | |
|       });
 | |
|     };
 | |
|     var getRowHeaderType = function (isHeaderRow, isHeaderCells) {
 | |
|       if (isHeaderRow && isHeaderCells) {
 | |
|         return 'sectionCells';
 | |
|       } else if (isHeaderRow) {
 | |
|         return 'section';
 | |
|       } else {
 | |
|         return 'cells';
 | |
|       }
 | |
|     };
 | |
|     var getRowType$1 = function (row) {
 | |
|       var isHeaderRow = row.section === 'thead';
 | |
|       var isHeaderCells = is(findCommonCellType(row.cells), 'th');
 | |
|       if (isHeaderRow || isHeaderCells) {
 | |
|         return {
 | |
|           type: 'header',
 | |
|           subType: getRowHeaderType(isHeaderRow, isHeaderCells)
 | |
|         };
 | |
|       } else if (row.section === 'tfoot') {
 | |
|         return { type: 'footer' };
 | |
|       } else {
 | |
|         return { type: 'body' };
 | |
|       }
 | |
|     };
 | |
|     var findCommonCellType = function (cells) {
 | |
|       var headerCells = filter$2(cells, function (cell) {
 | |
|         return isHeaderCell(cell.element);
 | |
|       });
 | |
|       if (headerCells.length === 0) {
 | |
|         return Optional.some('td');
 | |
|       } else if (headerCells.length === cells.length) {
 | |
|         return Optional.some('th');
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
|     var findCommonRowType = function (rows) {
 | |
|       var rowTypes = map$1(rows, function (row) {
 | |
|         return getRowType$1(row).type;
 | |
|       });
 | |
|       var hasHeader = contains$2(rowTypes, 'header');
 | |
|       var hasFooter = contains$2(rowTypes, 'footer');
 | |
|       if (!hasHeader && !hasFooter) {
 | |
|         return Optional.some('body');
 | |
|       } else {
 | |
|         var hasBody = contains$2(rowTypes, 'body');
 | |
|         if (hasHeader && !hasBody && !hasFooter) {
 | |
|           return Optional.some('header');
 | |
|         } else if (!hasHeader && !hasBody && hasFooter) {
 | |
|           return Optional.some('footer');
 | |
|         } else {
 | |
|           return Optional.none();
 | |
|         }
 | |
|       }
 | |
|     };
 | |
|     var findTableRowHeaderType = function (warehouse) {
 | |
|       return findMap(warehouse.all, function (row) {
 | |
|         var rowType = getRowType$1(row);
 | |
|         return rowType.type === 'header' ? Optional.from(rowType.subType) : Optional.none();
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var transformCell = function (cell, comparator, substitution) {
 | |
|       return elementnew(substitution(cell.element, comparator), true, cell.isLocked);
 | |
|     };
 | |
|     var transformRow = function (row, section) {
 | |
|       return row.section !== section ? rowcells(row.element, row.cells, section, row.isNew) : row;
 | |
|     };
 | |
|     var section = function () {
 | |
|       return {
 | |
|         transformRow: transformRow,
 | |
|         transformCell: function (cell, comparator, substitution) {
 | |
|           var newCell = substitution(cell.element, comparator);
 | |
|           var fixedCell = name(newCell) !== 'td' ? mutate$1(newCell, 'td') : newCell;
 | |
|           return elementnew(fixedCell, cell.isNew, cell.isLocked);
 | |
|         }
 | |
|       };
 | |
|     };
 | |
|     var sectionCells = function () {
 | |
|       return {
 | |
|         transformRow: transformRow,
 | |
|         transformCell: transformCell
 | |
|       };
 | |
|     };
 | |
|     var cells = function () {
 | |
|       return {
 | |
|         transformRow: function (row, section) {
 | |
|           var newSection = section === 'thead' ? 'tbody' : section;
 | |
|           return transformRow(row, newSection);
 | |
|         },
 | |
|         transformCell: transformCell
 | |
|       };
 | |
|     };
 | |
|     var fallback = function () {
 | |
|       return {
 | |
|         transformRow: identity,
 | |
|         transformCell: transformCell
 | |
|       };
 | |
|     };
 | |
|     var getTableSectionType = function (table, fallback) {
 | |
|       var warehouse = Warehouse.fromTable(table);
 | |
|       var type = findTableRowHeaderType(warehouse).getOr(fallback);
 | |
|       switch (type) {
 | |
|       case 'section':
 | |
|         return section();
 | |
|       case 'sectionCells':
 | |
|         return sectionCells();
 | |
|       case 'cells':
 | |
|         return cells();
 | |
|       }
 | |
|     };
 | |
|     var TableSection = {
 | |
|       getTableSectionType: getTableSectionType,
 | |
|       section: section,
 | |
|       sectionCells: sectionCells,
 | |
|       cells: cells,
 | |
|       fallback: fallback
 | |
|     };
 | |
| 
 | |
|     var setIfNot = function (element, property, value, ignore) {
 | |
|       if (value === ignore) {
 | |
|         remove$7(element, property);
 | |
|       } else {
 | |
|         set$2(element, property, value);
 | |
|       }
 | |
|     };
 | |
|     var insert$1 = function (table, selector, element) {
 | |
|       last$2(children$1(table, selector)).fold(function () {
 | |
|         return prepend(table, element);
 | |
|       }, function (child) {
 | |
|         return after$5(child, element);
 | |
|       });
 | |
|     };
 | |
|     var generateSection = function (table, sectionName) {
 | |
|       var section = child$1(table, sectionName).getOrThunk(function () {
 | |
|         var newSection = SugarElement.fromTag(sectionName, owner(table).dom);
 | |
|         if (sectionName === 'thead') {
 | |
|           insert$1(table, 'caption,colgroup', newSection);
 | |
|         } else if (sectionName === 'colgroup') {
 | |
|           insert$1(table, 'caption', newSection);
 | |
|         } else {
 | |
|           append$1(table, newSection);
 | |
|         }
 | |
|         return newSection;
 | |
|       });
 | |
|       empty(section);
 | |
|       return section;
 | |
|     };
 | |
|     var render$1 = function (table, grid) {
 | |
|       var newRows = [];
 | |
|       var newCells = [];
 | |
|       var syncRows = function (gridSection) {
 | |
|         return map$1(gridSection, function (row) {
 | |
|           if (row.isNew) {
 | |
|             newRows.push(row.element);
 | |
|           }
 | |
|           var tr = row.element;
 | |
|           empty(tr);
 | |
|           each$2(row.cells, function (cell) {
 | |
|             if (cell.isNew) {
 | |
|               newCells.push(cell.element);
 | |
|             }
 | |
|             setIfNot(cell.element, 'colspan', cell.colspan, 1);
 | |
|             setIfNot(cell.element, 'rowspan', cell.rowspan, 1);
 | |
|             append$1(tr, cell.element);
 | |
|           });
 | |
|           return tr;
 | |
|         });
 | |
|       };
 | |
|       var syncColGroup = function (gridSection) {
 | |
|         return bind$2(gridSection, function (colGroup) {
 | |
|           return map$1(colGroup.cells, function (col) {
 | |
|             setIfNot(col.element, 'span', col.colspan, 1);
 | |
|             return col.element;
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var renderSection = function (gridSection, sectionName) {
 | |
|         var section = generateSection(table, sectionName);
 | |
|         var sync = sectionName === 'colgroup' ? syncColGroup : syncRows;
 | |
|         var sectionElems = sync(gridSection);
 | |
|         append(section, sectionElems);
 | |
|       };
 | |
|       var removeSection = function (sectionName) {
 | |
|         child$1(table, sectionName).each(remove$5);
 | |
|       };
 | |
|       var renderOrRemoveSection = function (gridSection, sectionName) {
 | |
|         if (gridSection.length > 0) {
 | |
|           renderSection(gridSection, sectionName);
 | |
|         } else {
 | |
|           removeSection(sectionName);
 | |
|         }
 | |
|       };
 | |
|       var headSection = [];
 | |
|       var bodySection = [];
 | |
|       var footSection = [];
 | |
|       var columnGroupsSection = [];
 | |
|       each$2(grid, function (row) {
 | |
|         switch (row.section) {
 | |
|         case 'thead':
 | |
|           headSection.push(row);
 | |
|           break;
 | |
|         case 'tbody':
 | |
|           bodySection.push(row);
 | |
|           break;
 | |
|         case 'tfoot':
 | |
|           footSection.push(row);
 | |
|           break;
 | |
|         case 'colgroup':
 | |
|           columnGroupsSection.push(row);
 | |
|           break;
 | |
|         }
 | |
|       });
 | |
|       renderOrRemoveSection(columnGroupsSection, 'colgroup');
 | |
|       renderOrRemoveSection(headSection, 'thead');
 | |
|       renderOrRemoveSection(bodySection, 'tbody');
 | |
|       renderOrRemoveSection(footSection, 'tfoot');
 | |
|       return {
 | |
|         newRows: newRows,
 | |
|         newCells: newCells
 | |
|       };
 | |
|     };
 | |
|     var copy = function (grid) {
 | |
|       return map$1(grid, function (row) {
 | |
|         var tr = shallow(row.element);
 | |
|         each$2(row.cells, function (cell) {
 | |
|           var clonedCell = deep(cell.element);
 | |
|           setIfNot(clonedCell, 'colspan', cell.colspan, 1);
 | |
|           setIfNot(clonedCell, 'rowspan', cell.rowspan, 1);
 | |
|           append$1(tr, clonedCell);
 | |
|         });
 | |
|         return tr;
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var getColumn = function (grid, index) {
 | |
|       return map$1(grid, function (row) {
 | |
|         return getCell(row, index);
 | |
|       });
 | |
|     };
 | |
|     var getRow = function (grid, index) {
 | |
|       return grid[index];
 | |
|     };
 | |
|     var findDiff = function (xs, comp) {
 | |
|       if (xs.length === 0) {
 | |
|         return 0;
 | |
|       }
 | |
|       var first = xs[0];
 | |
|       var index = findIndex(xs, function (x) {
 | |
|         return !comp(first.element, x.element);
 | |
|       });
 | |
|       return index.getOr(xs.length);
 | |
|     };
 | |
|     var subgrid = function (grid, row, column, comparator) {
 | |
|       var gridRow = getRow(grid, row);
 | |
|       var isColRow = gridRow.section === 'colgroup';
 | |
|       var colspan = findDiff(gridRow.cells.slice(column), comparator);
 | |
|       var rowspan = isColRow ? 1 : findDiff(getColumn(grid.slice(row), column), comparator);
 | |
|       return {
 | |
|         colspan: colspan,
 | |
|         rowspan: rowspan
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var toDetails = function (grid, comparator) {
 | |
|       var seen = map$1(grid, function (row) {
 | |
|         return map$1(row.cells, never);
 | |
|       });
 | |
|       var updateSeen = function (rowIndex, columnIndex, rowspan, colspan) {
 | |
|         for (var row = rowIndex; row < rowIndex + rowspan; row++) {
 | |
|           for (var column = columnIndex; column < columnIndex + colspan; column++) {
 | |
|             seen[row][column] = true;
 | |
|           }
 | |
|         }
 | |
|       };
 | |
|       return map$1(grid, function (row, rowIndex) {
 | |
|         var details = bind$2(row.cells, function (cell, columnIndex) {
 | |
|           if (seen[rowIndex][columnIndex] === false) {
 | |
|             var result = subgrid(grid, rowIndex, columnIndex, comparator);
 | |
|             updateSeen(rowIndex, columnIndex, result.rowspan, result.colspan);
 | |
|             return [detailnew(cell.element, result.rowspan, result.colspan, cell.isNew)];
 | |
|           } else {
 | |
|             return [];
 | |
|           }
 | |
|         });
 | |
|         return rowdetailnew(row.element, details, row.section, row.isNew);
 | |
|       });
 | |
|     };
 | |
|     var toGrid = function (warehouse, generators, isNew) {
 | |
|       var grid = [];
 | |
|       each$2(warehouse.colgroups, function (colgroup) {
 | |
|         var colgroupCols = [];
 | |
|         for (var columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) {
 | |
|           var element = Warehouse.getColumnAt(warehouse, columnIndex).map(function (column) {
 | |
|             return elementnew(column.element, isNew, false);
 | |
|           }).getOrThunk(function () {
 | |
|             return elementnew(generators.colGap(), true, false);
 | |
|           });
 | |
|           colgroupCols.push(element);
 | |
|         }
 | |
|         grid.push(rowcells(colgroup.element, colgroupCols, 'colgroup', isNew));
 | |
|       });
 | |
|       for (var rowIndex = 0; rowIndex < warehouse.grid.rows; rowIndex++) {
 | |
|         var rowCells = [];
 | |
|         for (var columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) {
 | |
|           var element = Warehouse.getAt(warehouse, rowIndex, columnIndex).map(function (item) {
 | |
|             return elementnew(item.element, isNew, item.isLocked);
 | |
|           }).getOrThunk(function () {
 | |
|             return elementnew(generators.gap(), true, false);
 | |
|           });
 | |
|           rowCells.push(element);
 | |
|         }
 | |
|         var rowDetail = warehouse.all[rowIndex];
 | |
|         var row = rowcells(rowDetail.element, rowCells, rowDetail.section, isNew);
 | |
|         grid.push(row);
 | |
|       }
 | |
|       return grid;
 | |
|     };
 | |
| 
 | |
|     var fromWarehouse = function (warehouse, generators) {
 | |
|       return toGrid(warehouse, generators, false);
 | |
|     };
 | |
|     var toDetailList = function (grid) {
 | |
|       return toDetails(grid, eq$1);
 | |
|     };
 | |
|     var findInWarehouse = function (warehouse, element) {
 | |
|       return findMap(warehouse.all, function (r) {
 | |
|         return find$1(r.cells, function (e) {
 | |
|           return eq$1(element, e.element);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var extractCells = function (warehouse, target, predicate) {
 | |
|       var details = map$1(target.selection, function (cell$1) {
 | |
|         return cell(cell$1).bind(function (lc) {
 | |
|           return findInWarehouse(warehouse, lc);
 | |
|         }).filter(predicate);
 | |
|       });
 | |
|       var cells = cat(details);
 | |
|       return someIf(cells.length > 0, cells);
 | |
|     };
 | |
|     var run = function (operation, extract, adjustment, postAction, genWrappers) {
 | |
|       return function (wire, table, target, generators, behaviours) {
 | |
|         var warehouse = Warehouse.fromTable(table);
 | |
|         var tableSection = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.section).getOrThunk(TableSection.fallback);
 | |
|         var output = extract(warehouse, target).map(function (info) {
 | |
|           var model = fromWarehouse(warehouse, generators);
 | |
|           var result = operation(model, info, eq$1, genWrappers(generators), tableSection);
 | |
|           var lockedColumns = getLockedColumnsFromGrid(result.grid);
 | |
|           var grid = toDetailList(result.grid);
 | |
|           return {
 | |
|             info: info,
 | |
|             grid: grid,
 | |
|             cursor: result.cursor,
 | |
|             lockedColumns: lockedColumns
 | |
|           };
 | |
|         });
 | |
|         return output.bind(function (out) {
 | |
|           var newElements = render$1(table, out.grid);
 | |
|           var tableSizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.sizing).getOrThunk(function () {
 | |
|             return TableSize.getTableSize(table);
 | |
|           });
 | |
|           var resizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.resize).getOrThunk(preserveTable);
 | |
|           adjustment(table, out.grid, out.info, {
 | |
|             sizing: tableSizing,
 | |
|             resize: resizing,
 | |
|             section: tableSection
 | |
|           });
 | |
|           postAction(table);
 | |
|           refresh(wire, table);
 | |
|           remove$7(table, LOCKED_COL_ATTR);
 | |
|           if (out.lockedColumns.length > 0) {
 | |
|             set$2(table, LOCKED_COL_ATTR, out.lockedColumns.join(','));
 | |
|           }
 | |
|           return Optional.some({
 | |
|             cursor: out.cursor,
 | |
|             newRows: newElements.newRows,
 | |
|             newCells: newElements.newCells
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|     };
 | |
|     var onPaste = function (warehouse, target) {
 | |
|       return cell(target.element).bind(function (cell) {
 | |
|         return findInWarehouse(warehouse, cell).map(function (details) {
 | |
|           var value = __assign(__assign({}, details), {
 | |
|             generators: target.generators,
 | |
|             clipboard: target.clipboard
 | |
|           });
 | |
|           return value;
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var onPasteByEditor = function (warehouse, target) {
 | |
|       return extractCells(warehouse, target, always).map(function (cells) {
 | |
|         return {
 | |
|           cells: cells,
 | |
|           generators: target.generators,
 | |
|           clipboard: target.clipboard
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|     var onMergable = function (_warehouse, target) {
 | |
|       return target.mergable;
 | |
|     };
 | |
|     var onUnmergable = function (_warehouse, target) {
 | |
|       return target.unmergable;
 | |
|     };
 | |
|     var onCells = function (warehouse, target) {
 | |
|       return extractCells(warehouse, target, always);
 | |
|     };
 | |
|     var onUnlockedCells = function (warehouse, target) {
 | |
|       return extractCells(warehouse, target, function (detail) {
 | |
|         return !detail.isLocked;
 | |
|       });
 | |
|     };
 | |
|     var isUnlockedTableCell = function (warehouse, cell) {
 | |
|       return findInWarehouse(warehouse, cell).exists(function (detail) {
 | |
|         return !detail.isLocked;
 | |
|       });
 | |
|     };
 | |
|     var allUnlocked = function (warehouse, cells) {
 | |
|       return forall(cells, function (cell) {
 | |
|         return isUnlockedTableCell(warehouse, cell);
 | |
|       });
 | |
|     };
 | |
|     var onUnlockedMergable = function (warehouse, target) {
 | |
|       return onMergable(warehouse, target).filter(function (mergeable) {
 | |
|         return allUnlocked(warehouse, mergeable.cells);
 | |
|       });
 | |
|     };
 | |
|     var onUnlockedUnmergable = function (warehouse, target) {
 | |
|       return onUnmergable(warehouse, target).filter(function (cells) {
 | |
|         return allUnlocked(warehouse, cells);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var merge$2 = function (grid, bounds, comparator, substitution) {
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       if (rows.length === 0) {
 | |
|         return grid;
 | |
|       }
 | |
|       for (var i = bounds.startRow; i <= bounds.finishRow; i++) {
 | |
|         for (var j = bounds.startCol; j <= bounds.finishCol; j++) {
 | |
|           var row = rows[i];
 | |
|           var isLocked = getCell(row, j).isLocked;
 | |
|           mutateCell(row, j, elementnew(substitution(), false, isLocked));
 | |
|         }
 | |
|       }
 | |
|       return grid;
 | |
|     };
 | |
|     var unmerge = function (grid, target, comparator, substitution) {
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       var first = true;
 | |
|       for (var i = 0; i < rows.length; i++) {
 | |
|         for (var j = 0; j < cellLength(rows[0]); j++) {
 | |
|           var row = rows[i];
 | |
|           var currentCell = getCell(row, j);
 | |
|           var currentCellElm = currentCell.element;
 | |
|           var isToReplace = comparator(currentCellElm, target);
 | |
|           if (isToReplace === true && first === false) {
 | |
|             mutateCell(row, j, elementnew(substitution(), true, currentCell.isLocked));
 | |
|           } else if (isToReplace === true) {
 | |
|             first = false;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       return grid;
 | |
|     };
 | |
|     var uniqueCells = function (row, comparator) {
 | |
|       return foldl(row, function (rest, cell) {
 | |
|         return exists(rest, function (currentCell) {
 | |
|           return comparator(currentCell.element, cell.element);
 | |
|         }) ? rest : rest.concat([cell]);
 | |
|       }, []);
 | |
|     };
 | |
|     var splitCols = function (grid, index, comparator, substitution) {
 | |
|       if (index > 0 && index < grid[0].cells.length) {
 | |
|         each$2(grid, function (row) {
 | |
|           var prevCell = row.cells[index - 1];
 | |
|           var current = row.cells[index];
 | |
|           var isToReplace = comparator(current.element, prevCell.element);
 | |
|           if (isToReplace) {
 | |
|             mutateCell(row, index, elementnew(substitution(), true, current.isLocked));
 | |
|           }
 | |
|         });
 | |
|       }
 | |
|       return grid;
 | |
|     };
 | |
|     var splitRows = function (grid, index, comparator, substitution) {
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       if (index > 0 && index < rows.length) {
 | |
|         var rowPrevCells = rows[index - 1].cells;
 | |
|         var cells = uniqueCells(rowPrevCells, comparator);
 | |
|         each$2(cells, function (cell) {
 | |
|           var replacement = Optional.none();
 | |
|           for (var i = index; i < rows.length; i++) {
 | |
|             var _loop_1 = function (j) {
 | |
|               var row = rows[i];
 | |
|               var current = getCell(row, j);
 | |
|               var isToReplace = comparator(current.element, cell.element);
 | |
|               if (isToReplace) {
 | |
|                 if (replacement.isNone()) {
 | |
|                   replacement = Optional.some(substitution());
 | |
|                 }
 | |
|                 replacement.each(function (sub) {
 | |
|                   mutateCell(row, j, elementnew(sub, true, current.isLocked));
 | |
|                 });
 | |
|               }
 | |
|             };
 | |
|             for (var j = 0; j < cellLength(rows[0]); j++) {
 | |
|               _loop_1(j);
 | |
|             }
 | |
|           }
 | |
|         });
 | |
|       }
 | |
|       return grid;
 | |
|     };
 | |
| 
 | |
|     var value$1 = function (o) {
 | |
|       var or = function (_opt) {
 | |
|         return value$1(o);
 | |
|       };
 | |
|       var orThunk = function (_f) {
 | |
|         return value$1(o);
 | |
|       };
 | |
|       var map = function (f) {
 | |
|         return value$1(f(o));
 | |
|       };
 | |
|       var mapError = function (_f) {
 | |
|         return value$1(o);
 | |
|       };
 | |
|       var each = function (f) {
 | |
|         f(o);
 | |
|       };
 | |
|       var bind = function (f) {
 | |
|         return f(o);
 | |
|       };
 | |
|       var fold = function (_, onValue) {
 | |
|         return onValue(o);
 | |
|       };
 | |
|       var exists = function (f) {
 | |
|         return f(o);
 | |
|       };
 | |
|       var forall = function (f) {
 | |
|         return f(o);
 | |
|       };
 | |
|       var toOptional = function () {
 | |
|         return Optional.some(o);
 | |
|       };
 | |
|       return {
 | |
|         isValue: always,
 | |
|         isError: never,
 | |
|         getOr: constant(o),
 | |
|         getOrThunk: constant(o),
 | |
|         getOrDie: constant(o),
 | |
|         or: or,
 | |
|         orThunk: orThunk,
 | |
|         fold: fold,
 | |
|         map: map,
 | |
|         mapError: mapError,
 | |
|         each: each,
 | |
|         bind: bind,
 | |
|         exists: exists,
 | |
|         forall: forall,
 | |
|         toOptional: toOptional
 | |
|       };
 | |
|     };
 | |
|     var error = function (message) {
 | |
|       var getOrThunk = function (f) {
 | |
|         return f();
 | |
|       };
 | |
|       var getOrDie = function () {
 | |
|         return die(String(message))();
 | |
|       };
 | |
|       var or = identity;
 | |
|       var orThunk = function (f) {
 | |
|         return f();
 | |
|       };
 | |
|       var map = function (_f) {
 | |
|         return error(message);
 | |
|       };
 | |
|       var mapError = function (f) {
 | |
|         return error(f(message));
 | |
|       };
 | |
|       var bind = function (_f) {
 | |
|         return error(message);
 | |
|       };
 | |
|       var fold = function (onError, _) {
 | |
|         return onError(message);
 | |
|       };
 | |
|       return {
 | |
|         isValue: never,
 | |
|         isError: always,
 | |
|         getOr: identity,
 | |
|         getOrThunk: getOrThunk,
 | |
|         getOrDie: getOrDie,
 | |
|         or: or,
 | |
|         orThunk: orThunk,
 | |
|         fold: fold,
 | |
|         map: map,
 | |
|         mapError: mapError,
 | |
|         each: noop,
 | |
|         bind: bind,
 | |
|         exists: never,
 | |
|         forall: always,
 | |
|         toOptional: Optional.none
 | |
|       };
 | |
|     };
 | |
|     var fromOption = function (opt, err) {
 | |
|       return opt.fold(function () {
 | |
|         return error(err);
 | |
|       }, value$1);
 | |
|     };
 | |
|     var Result = {
 | |
|       value: value$1,
 | |
|       error: error,
 | |
|       fromOption: fromOption
 | |
|     };
 | |
| 
 | |
|     var measure = function (startAddress, gridA, gridB) {
 | |
|       if (startAddress.row >= gridA.length || startAddress.column > cellLength(gridA[0])) {
 | |
|         return Result.error('invalid start address out of table bounds, row: ' + startAddress.row + ', column: ' + startAddress.column);
 | |
|       }
 | |
|       var rowRemainder = gridA.slice(startAddress.row);
 | |
|       var colRemainder = rowRemainder[0].cells.slice(startAddress.column);
 | |
|       var colRequired = cellLength(gridB[0]);
 | |
|       var rowRequired = gridB.length;
 | |
|       return Result.value({
 | |
|         rowDelta: rowRemainder.length - rowRequired,
 | |
|         colDelta: colRemainder.length - colRequired
 | |
|       });
 | |
|     };
 | |
|     var measureWidth = function (gridA, gridB) {
 | |
|       var colLengthA = cellLength(gridA[0]);
 | |
|       var colLengthB = cellLength(gridB[0]);
 | |
|       return {
 | |
|         rowDelta: 0,
 | |
|         colDelta: colLengthA - colLengthB
 | |
|       };
 | |
|     };
 | |
|     var measureHeight = function (gridA, gridB) {
 | |
|       var rowLengthA = gridA.length;
 | |
|       var rowLengthB = gridB.length;
 | |
|       return {
 | |
|         rowDelta: rowLengthA - rowLengthB,
 | |
|         colDelta: 0
 | |
|       };
 | |
|     };
 | |
|     var generateElements = function (amount, row, generators, isLocked) {
 | |
|       var generator = row.section === 'colgroup' ? generators.col : generators.cell;
 | |
|       return range$1(amount, function (idx) {
 | |
|         return elementnew(generator(), true, isLocked(idx));
 | |
|       });
 | |
|     };
 | |
|     var rowFill = function (grid, amount, generators, lockedColumns) {
 | |
|       var exampleRow = grid[grid.length - 1];
 | |
|       return grid.concat(range$1(amount, function () {
 | |
|         var generator = exampleRow.section === 'colgroup' ? generators.colgroup : generators.row;
 | |
|         var row = clone$1(exampleRow, generator, identity);
 | |
|         var elements = generateElements(row.cells.length, row, generators, function (idx) {
 | |
|           return has$1(lockedColumns, idx.toString());
 | |
|         });
 | |
|         return setCells(row, elements);
 | |
|       }));
 | |
|     };
 | |
|     var colFill = function (grid, amount, generators, startIndex) {
 | |
|       return map$1(grid, function (row) {
 | |
|         var newChildren = generateElements(amount, row, generators, never);
 | |
|         return addCells(row, startIndex, newChildren);
 | |
|       });
 | |
|     };
 | |
|     var lockedColFill = function (grid, generators, lockedColumns) {
 | |
|       return map$1(grid, function (row) {
 | |
|         return foldl(lockedColumns, function (acc, colNum) {
 | |
|           var newChild = generateElements(1, row, generators, always)[0];
 | |
|           return addCell(acc, colNum, newChild);
 | |
|         }, row);
 | |
|       });
 | |
|     };
 | |
|     var tailor = function (gridA, delta, generators) {
 | |
|       var fillCols = delta.colDelta < 0 ? colFill : identity;
 | |
|       var fillRows = delta.rowDelta < 0 ? rowFill : identity;
 | |
|       var lockedColumns = getLockedColumnsFromGrid(gridA);
 | |
|       var gridWidth = cellLength(gridA[0]);
 | |
|       var isLastColLocked = exists(lockedColumns, function (locked) {
 | |
|         return locked === gridWidth - 1;
 | |
|       });
 | |
|       var modifiedCols = fillCols(gridA, Math.abs(delta.colDelta), generators, isLastColLocked ? gridWidth - 1 : gridWidth);
 | |
|       var newLockedColumns = getLockedColumnsFromGrid(modifiedCols);
 | |
|       return fillRows(modifiedCols, Math.abs(delta.rowDelta), generators, mapToObject(newLockedColumns, always));
 | |
|     };
 | |
| 
 | |
|     var isSpanning = function (grid, row, col, comparator) {
 | |
|       var candidate = getCell(grid[row], col);
 | |
|       var matching = curry(comparator, candidate.element);
 | |
|       var currentRow = grid[row];
 | |
|       return grid.length > 1 && cellLength(currentRow) > 1 && (col > 0 && matching(getCellElement(currentRow, col - 1)) || col < currentRow.cells.length - 1 && matching(getCellElement(currentRow, col + 1)) || row > 0 && matching(getCellElement(grid[row - 1], col)) || row < grid.length - 1 && matching(getCellElement(grid[row + 1], col)));
 | |
|     };
 | |
|     var mergeTables = function (startAddress, gridA, gridB, generator, comparator, lockedColumns) {
 | |
|       var startRow = startAddress.row;
 | |
|       var startCol = startAddress.column;
 | |
|       var mergeHeight = gridB.length;
 | |
|       var mergeWidth = cellLength(gridB[0]);
 | |
|       var endRow = startRow + mergeHeight;
 | |
|       var endCol = startCol + mergeWidth + lockedColumns.length;
 | |
|       var lockedColumnObj = mapToObject(lockedColumns, always);
 | |
|       for (var r = startRow; r < endRow; r++) {
 | |
|         var skippedCol = 0;
 | |
|         for (var c = startCol; c < endCol; c++) {
 | |
|           if (lockedColumnObj[c]) {
 | |
|             skippedCol++;
 | |
|             continue;
 | |
|           }
 | |
|           if (isSpanning(gridA, r, c, comparator)) {
 | |
|             unmerge(gridA, getCellElement(gridA[r], c), comparator, generator.cell);
 | |
|           }
 | |
|           var gridBColIndex = c - startCol - skippedCol;
 | |
|           var newCell = getCell(gridB[r - startRow], gridBColIndex);
 | |
|           var newCellElm = newCell.element;
 | |
|           var replacement = generator.replace(newCellElm);
 | |
|           mutateCell(gridA[r], c, elementnew(replacement, true, newCell.isLocked));
 | |
|         }
 | |
|       }
 | |
|       return gridA;
 | |
|     };
 | |
|     var getValidStartAddress = function (currentStartAddress, grid, lockedColumns) {
 | |
|       var gridColLength = cellLength(grid[0]);
 | |
|       var adjustedRowAddress = extractGridDetails(grid).cols.length + currentStartAddress.row;
 | |
|       var possibleColAddresses = range$1(gridColLength - currentStartAddress.column, function (num) {
 | |
|         return num + currentStartAddress.column;
 | |
|       });
 | |
|       var validColAddress = find$1(possibleColAddresses, function (num) {
 | |
|         return forall(lockedColumns, function (col) {
 | |
|           return col !== num;
 | |
|         });
 | |
|       }).getOr(gridColLength - 1);
 | |
|       return {
 | |
|         row: adjustedRowAddress,
 | |
|         column: validColAddress
 | |
|       };
 | |
|     };
 | |
|     var getLockedColumnsWithinBounds = function (startAddress, grid, lockedColumns) {
 | |
|       return filter$2(lockedColumns, function (colNum) {
 | |
|         return colNum >= startAddress.column && colNum <= cellLength(grid[0]) + startAddress.column;
 | |
|       });
 | |
|     };
 | |
|     var merge$1 = function (startAddress, gridA, gridB, generator, comparator) {
 | |
|       var lockedColumns = getLockedColumnsFromGrid(gridA);
 | |
|       var validStartAddress = getValidStartAddress(startAddress, gridA, lockedColumns);
 | |
|       var gridBRows = extractGridDetails(gridB).rows;
 | |
|       var lockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, lockedColumns);
 | |
|       var result = measure(validStartAddress, gridA, gridBRows);
 | |
|       return result.map(function (diff) {
 | |
|         var delta = __assign(__assign({}, diff), { colDelta: diff.colDelta - lockedColumnsWithinBounds.length });
 | |
|         var fittedGrid = tailor(gridA, delta, generator);
 | |
|         var newLockedColumns = getLockedColumnsFromGrid(fittedGrid);
 | |
|         var newLockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, newLockedColumns);
 | |
|         return mergeTables(validStartAddress, fittedGrid, gridBRows, generator, comparator, newLockedColumnsWithinBounds);
 | |
|       });
 | |
|     };
 | |
|     var insertCols = function (index, gridA, gridB, generator, comparator) {
 | |
|       splitCols(gridA, index, comparator, generator.cell);
 | |
|       var delta = measureHeight(gridB, gridA);
 | |
|       var fittedNewGrid = tailor(gridB, delta, generator);
 | |
|       var secondDelta = measureHeight(gridA, fittedNewGrid);
 | |
|       var fittedOldGrid = tailor(gridA, secondDelta, generator);
 | |
|       return map$1(fittedOldGrid, function (gridRow, i) {
 | |
|         return addCells(gridRow, index, fittedNewGrid[i].cells);
 | |
|       });
 | |
|     };
 | |
|     var insertRows = function (index, gridA, gridB, generator, comparator) {
 | |
|       splitRows(gridA, index, comparator, generator.cell);
 | |
|       var locked = getLockedColumnsFromGrid(gridA);
 | |
|       var diff = measureWidth(gridA, gridB);
 | |
|       var delta = __assign(__assign({}, diff), { colDelta: diff.colDelta - locked.length });
 | |
|       var fittedOldGrid = tailor(gridA, delta, generator);
 | |
|       var _a = extractGridDetails(fittedOldGrid), oldCols = _a.cols, oldRows = _a.rows;
 | |
|       var newLocked = getLockedColumnsFromGrid(fittedOldGrid);
 | |
|       var secondDiff = measureWidth(gridB, gridA);
 | |
|       var secondDelta = __assign(__assign({}, secondDiff), { colDelta: secondDiff.colDelta + newLocked.length });
 | |
|       var fittedGridB = lockedColFill(gridB, generator, newLocked);
 | |
|       var fittedNewGrid = tailor(fittedGridB, secondDelta, generator);
 | |
|       return oldCols.concat(oldRows.slice(0, index)).concat(fittedNewGrid).concat(oldRows.slice(index, oldRows.length));
 | |
|     };
 | |
| 
 | |
|     var cloneRow = function (row, cloneCell, comparator, substitution) {
 | |
|       return clone$1(row, function (elem) {
 | |
|         return substitution(elem, comparator);
 | |
|       }, cloneCell);
 | |
|     };
 | |
|     var insertRowAt = function (grid, index, example, comparator, substitution) {
 | |
|       var _a = extractGridDetails(grid), rows = _a.rows, cols = _a.cols;
 | |
|       var before = rows.slice(0, index);
 | |
|       var after = rows.slice(index);
 | |
|       var newRow = cloneRow(rows[example], function (ex, c) {
 | |
|         var withinSpan = index > 0 && index < rows.length && comparator(getCellElement(rows[index - 1], c), getCellElement(rows[index], c));
 | |
|         var ret = withinSpan ? getCell(rows[index], c) : elementnew(substitution(ex.element, comparator), true, ex.isLocked);
 | |
|         return ret;
 | |
|       }, comparator, substitution);
 | |
|       return cols.concat(before).concat([newRow]).concat(after);
 | |
|     };
 | |
|     var getElementFor = function (row, column, section, withinSpan, example, comparator, substitution) {
 | |
|       if (section === 'colgroup' || !withinSpan) {
 | |
|         var cell = getCell(row, example);
 | |
|         return elementnew(substitution(cell.element, comparator), true, false);
 | |
|       } else {
 | |
|         return getCell(row, column);
 | |
|       }
 | |
|     };
 | |
|     var insertColumnAt = function (grid, index, example, comparator, substitution) {
 | |
|       return map$1(grid, function (row) {
 | |
|         var withinSpan = index > 0 && index < cellLength(row) && comparator(getCellElement(row, index - 1), getCellElement(row, index));
 | |
|         var sub = getElementFor(row, index, row.section, withinSpan, example, comparator, substitution);
 | |
|         return addCell(row, index, sub);
 | |
|       });
 | |
|     };
 | |
|     var deleteColumnsAt = function (grid, columns) {
 | |
|       return bind$2(grid, function (row) {
 | |
|         var existingCells = row.cells;
 | |
|         var cells = foldr(columns, function (acc, column) {
 | |
|           return column >= 0 && column < acc.length ? acc.slice(0, column).concat(acc.slice(column + 1)) : acc;
 | |
|         }, existingCells);
 | |
|         return cells.length > 0 ? [rowcells(row.element, cells, row.section, row.isNew)] : [];
 | |
|       });
 | |
|     };
 | |
|     var deleteRowsAt = function (grid, start, finish) {
 | |
|       var _a = extractGridDetails(grid), rows = _a.rows, cols = _a.cols;
 | |
|       return cols.concat(rows.slice(0, start)).concat(rows.slice(finish + 1));
 | |
|     };
 | |
| 
 | |
|     var notInStartRow = function (grid, rowIndex, colIndex, comparator) {
 | |
|       return getCellElement(grid[rowIndex], colIndex) !== undefined && (rowIndex > 0 && comparator(getCellElement(grid[rowIndex - 1], colIndex), getCellElement(grid[rowIndex], colIndex)));
 | |
|     };
 | |
|     var notInStartColumn = function (row, index, comparator) {
 | |
|       return index > 0 && comparator(getCellElement(row, index - 1), getCellElement(row, index));
 | |
|     };
 | |
|     var isDuplicatedCell = function (grid, rowIndex, colIndex, comparator) {
 | |
|       return notInStartRow(grid, rowIndex, colIndex, comparator) || notInStartColumn(grid[rowIndex], colIndex, comparator);
 | |
|     };
 | |
|     var rowReplacerPredicate = function (targetRow, columnHeaders) {
 | |
|       var entireTableIsHeader = forall(columnHeaders, identity) && isHeaderCells(targetRow.cells);
 | |
|       return entireTableIsHeader ? always : function (cell, _rowIndex, colIndex) {
 | |
|         var type = name(cell.element);
 | |
|         return !(type === 'th' && columnHeaders[colIndex]);
 | |
|       };
 | |
|     };
 | |
|     var columnReplacePredicate = function (targetColumn, rowHeaders) {
 | |
|       var entireTableIsHeader = forall(rowHeaders, identity) && isHeaderCells(targetColumn);
 | |
|       return entireTableIsHeader ? always : function (cell, rowIndex, _colIndex) {
 | |
|         var type = name(cell.element);
 | |
|         return !(type === 'th' && rowHeaders[rowIndex]);
 | |
|       };
 | |
|     };
 | |
|     var determineScope = function (applyScope, element, newScope, isInHeader) {
 | |
|       var hasSpan = function (scope) {
 | |
|         return scope === 'row' ? hasRowspan(element) : hasColspan(element);
 | |
|       };
 | |
|       var getScope = function (scope) {
 | |
|         return hasSpan(scope) ? scope + 'group' : scope;
 | |
|       };
 | |
|       if (applyScope) {
 | |
|         return isHeaderCell(element) ? getScope(newScope) : null;
 | |
|       } else if (isInHeader && isHeaderCell(element)) {
 | |
|         var oppositeScope = newScope === 'row' ? 'col' : 'row';
 | |
|         return getScope(oppositeScope);
 | |
|       } else {
 | |
|         return null;
 | |
|       }
 | |
|     };
 | |
|     var rowScopeGenerator = function (applyScope, columnHeaders) {
 | |
|       return function (cell, rowIndex, columnIndex) {
 | |
|         return Optional.some(determineScope(applyScope, cell.element, 'col', columnHeaders[columnIndex]));
 | |
|       };
 | |
|     };
 | |
|     var columnScopeGenerator = function (applyScope, rowHeaders) {
 | |
|       return function (cell, rowIndex) {
 | |
|         return Optional.some(determineScope(applyScope, cell.element, 'row', rowHeaders[rowIndex]));
 | |
|       };
 | |
|     };
 | |
|     var replace = function (cell, comparator, substitute) {
 | |
|       return elementnew(substitute(cell.element, comparator), true, cell.isLocked);
 | |
|     };
 | |
|     var replaceIn = function (grid, targets, comparator, substitute, replacer, genScope, shouldReplace) {
 | |
|       var isTarget = function (cell) {
 | |
|         return exists(targets, function (target) {
 | |
|           return comparator(cell.element, target.element);
 | |
|         });
 | |
|       };
 | |
|       return map$1(grid, function (row, rowIndex) {
 | |
|         return mapCells(row, function (cell, colIndex) {
 | |
|           if (isTarget(cell)) {
 | |
|             var newCell_1 = shouldReplace(cell, rowIndex, colIndex) ? replacer(cell, comparator, substitute) : cell;
 | |
|             genScope(newCell_1, rowIndex, colIndex).each(function (scope) {
 | |
|               setOptions(newCell_1.element, { scope: Optional.from(scope) });
 | |
|             });
 | |
|             return newCell_1;
 | |
|           } else {
 | |
|             return cell;
 | |
|           }
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var getColumnCells = function (rows, columnIndex, comparator) {
 | |
|       return bind$2(rows, function (row, i) {
 | |
|         return isDuplicatedCell(rows, i, columnIndex, comparator) ? [] : [getCell(row, columnIndex)];
 | |
|       });
 | |
|     };
 | |
|     var getRowCells = function (rows, rowIndex, comparator) {
 | |
|       var targetRow = rows[rowIndex];
 | |
|       return bind$2(targetRow.cells, function (item, i) {
 | |
|         return isDuplicatedCell(rows, rowIndex, i, comparator) ? [] : [item];
 | |
|       });
 | |
|     };
 | |
|     var replaceColumns = function (grid, indexes, applyScope, comparator, substitution) {
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       var targets = bind$2(indexes, function (index) {
 | |
|         return getColumnCells(rows, index, comparator);
 | |
|       });
 | |
|       var rowHeaders = map$1(grid, function (row) {
 | |
|         return isHeaderCells(row.cells);
 | |
|       });
 | |
|       var shouldReplaceCell = columnReplacePredicate(targets, rowHeaders);
 | |
|       var scopeGenerator = columnScopeGenerator(applyScope, rowHeaders);
 | |
|       return replaceIn(grid, targets, comparator, substitution, replace, scopeGenerator, shouldReplaceCell);
 | |
|     };
 | |
|     var replaceRows = function (grid, indexes, section, applyScope, comparator, substitution, tableSection) {
 | |
|       var _a = extractGridDetails(grid), cols = _a.cols, rows = _a.rows;
 | |
|       var targetRow = rows[indexes[0]];
 | |
|       var targets = bind$2(indexes, function (index) {
 | |
|         return getRowCells(rows, index, comparator);
 | |
|       });
 | |
|       var columnHeaders = map$1(targetRow.cells, function (_cell, index) {
 | |
|         return isHeaderCells(getColumnCells(rows, index, comparator));
 | |
|       });
 | |
|       var newRows = __spreadArray([], rows, true);
 | |
|       each$2(indexes, function (index) {
 | |
|         newRows[index] = tableSection.transformRow(rows[index], section);
 | |
|       });
 | |
|       var newGrid = cols.concat(newRows);
 | |
|       var shouldReplaceCell = rowReplacerPredicate(targetRow, columnHeaders);
 | |
|       var scopeGenerator = rowScopeGenerator(applyScope, columnHeaders);
 | |
|       return replaceIn(newGrid, targets, comparator, substitution, tableSection.transformCell, scopeGenerator, shouldReplaceCell);
 | |
|     };
 | |
|     var replaceCells = function (grid, details, comparator, substitution) {
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       var targetCells = map$1(details, function (detail) {
 | |
|         return getCell(rows[detail.row], detail.column);
 | |
|       });
 | |
|       return replaceIn(grid, targetCells, comparator, substitution, replace, Optional.none, always);
 | |
|     };
 | |
| 
 | |
|     var uniqueColumns = function (details) {
 | |
|       var uniqueCheck = function (rest, detail) {
 | |
|         var columnExists = exists(rest, function (currentDetail) {
 | |
|           return currentDetail.column === detail.column;
 | |
|         });
 | |
|         return columnExists ? rest : rest.concat([detail]);
 | |
|       };
 | |
|       return foldl(details, uniqueCheck, []).sort(function (detailA, detailB) {
 | |
|         return detailA.column - detailB.column;
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var isCol = isTag('col');
 | |
|     var isColgroup = isTag('colgroup');
 | |
|     var isRow$1 = function (element) {
 | |
|       return name(element) === 'tr' || isColgroup(element);
 | |
|     };
 | |
|     var elementToData = function (element) {
 | |
|       var colspan = getAttrValue(element, 'colspan', 1);
 | |
|       var rowspan = getAttrValue(element, 'rowspan', 1);
 | |
|       return {
 | |
|         element: element,
 | |
|         colspan: colspan,
 | |
|         rowspan: rowspan
 | |
|       };
 | |
|     };
 | |
|     var modification = function (generators, toData) {
 | |
|       if (toData === void 0) {
 | |
|         toData = elementToData;
 | |
|       }
 | |
|       var nuCell = function (data) {
 | |
|         return isCol(data.element) ? generators.col(data) : generators.cell(data);
 | |
|       };
 | |
|       var nuRow = function (data) {
 | |
|         return isColgroup(data.element) ? generators.colgroup(data) : generators.row(data);
 | |
|       };
 | |
|       var add = function (element) {
 | |
|         if (isRow$1(element)) {
 | |
|           return nuRow({ element: element });
 | |
|         } else {
 | |
|           var replacement = nuCell(toData(element));
 | |
|           recent = Optional.some({
 | |
|             item: element,
 | |
|             replacement: replacement
 | |
|           });
 | |
|           return replacement;
 | |
|         }
 | |
|       };
 | |
|       var recent = Optional.none();
 | |
|       var getOrInit = function (element, comparator) {
 | |
|         return recent.fold(function () {
 | |
|           return add(element);
 | |
|         }, function (p) {
 | |
|           return comparator(element, p.item) ? p.replacement : add(element);
 | |
|         });
 | |
|       };
 | |
|       return { getOrInit: getOrInit };
 | |
|     };
 | |
|     var transform = function (tag) {
 | |
|       return function (generators) {
 | |
|         var list = [];
 | |
|         var find = function (element, comparator) {
 | |
|           return find$1(list, function (x) {
 | |
|             return comparator(x.item, element);
 | |
|           });
 | |
|         };
 | |
|         var makeNew = function (element) {
 | |
|           var attrs = tag === 'td' ? { scope: null } : {};
 | |
|           var cell = generators.replace(element, tag, attrs);
 | |
|           list.push({
 | |
|             item: element,
 | |
|             sub: cell
 | |
|           });
 | |
|           return cell;
 | |
|         };
 | |
|         var replaceOrInit = function (element, comparator) {
 | |
|           if (isRow$1(element) || isCol(element)) {
 | |
|             return element;
 | |
|           } else {
 | |
|             return find(element, comparator).fold(function () {
 | |
|               return makeNew(element);
 | |
|             }, function (p) {
 | |
|               return comparator(element, p.item) ? p.sub : makeNew(element);
 | |
|             });
 | |
|           }
 | |
|         };
 | |
|         return { replaceOrInit: replaceOrInit };
 | |
|       };
 | |
|     };
 | |
|     var getScopeAttribute = function (cell) {
 | |
|       return getOpt(cell, 'scope').map(function (attribute) {
 | |
|         return attribute.substr(0, 3);
 | |
|       });
 | |
|     };
 | |
|     var merging = function (generators) {
 | |
|       var unmerge = function (cell) {
 | |
|         var scope = getScopeAttribute(cell);
 | |
|         scope.each(function (attribute) {
 | |
|           return set$2(cell, 'scope', attribute);
 | |
|         });
 | |
|         return function () {
 | |
|           var raw = generators.cell({
 | |
|             element: cell,
 | |
|             colspan: 1,
 | |
|             rowspan: 1
 | |
|           });
 | |
|           remove$6(raw, 'width');
 | |
|           remove$6(cell, 'width');
 | |
|           scope.each(function (attribute) {
 | |
|             return set$2(raw, 'scope', attribute);
 | |
|           });
 | |
|           return raw;
 | |
|         };
 | |
|       };
 | |
|       var merge = function (cells) {
 | |
|         var getScopeProperty = function () {
 | |
|           var stringAttributes = cat(map$1(cells, getScopeAttribute));
 | |
|           if (stringAttributes.length === 0) {
 | |
|             return Optional.none();
 | |
|           } else {
 | |
|             var baseScope_1 = stringAttributes[0];
 | |
|             var scopes_1 = [
 | |
|               'row',
 | |
|               'col'
 | |
|             ];
 | |
|             var isMixed = exists(stringAttributes, function (attribute) {
 | |
|               return attribute !== baseScope_1 && contains$2(scopes_1, attribute);
 | |
|             });
 | |
|             return isMixed ? Optional.none() : Optional.from(baseScope_1);
 | |
|           }
 | |
|         };
 | |
|         remove$6(cells[0], 'width');
 | |
|         getScopeProperty().fold(function () {
 | |
|           return remove$7(cells[0], 'scope');
 | |
|         }, function (attribute) {
 | |
|           return set$2(cells[0], 'scope', attribute + 'group');
 | |
|         });
 | |
|         return constant(cells[0]);
 | |
|       };
 | |
|       return {
 | |
|         unmerge: unmerge,
 | |
|         merge: merge
 | |
|       };
 | |
|     };
 | |
|     var Generators = {
 | |
|       modification: modification,
 | |
|       transform: transform,
 | |
|       merging: merging
 | |
|     };
 | |
| 
 | |
|     var blockList = [
 | |
|       'body',
 | |
|       'p',
 | |
|       'div',
 | |
|       'article',
 | |
|       'aside',
 | |
|       'figcaption',
 | |
|       'figure',
 | |
|       'footer',
 | |
|       'header',
 | |
|       'nav',
 | |
|       'section',
 | |
|       'ol',
 | |
|       'ul',
 | |
|       'table',
 | |
|       'thead',
 | |
|       'tfoot',
 | |
|       'tbody',
 | |
|       'caption',
 | |
|       'tr',
 | |
|       'td',
 | |
|       'th',
 | |
|       'h1',
 | |
|       'h2',
 | |
|       'h3',
 | |
|       'h4',
 | |
|       'h5',
 | |
|       'h6',
 | |
|       'blockquote',
 | |
|       'pre',
 | |
|       'address'
 | |
|     ];
 | |
|     var isList$1 = function (universe, item) {
 | |
|       var tagName = universe.property().name(item);
 | |
|       return contains$2([
 | |
|         'ol',
 | |
|         'ul'
 | |
|       ], tagName);
 | |
|     };
 | |
|     var isBlock$1 = function (universe, item) {
 | |
|       var tagName = universe.property().name(item);
 | |
|       return contains$2(blockList, tagName);
 | |
|     };
 | |
|     var isEmptyTag$1 = function (universe, item) {
 | |
|       return contains$2([
 | |
|         'br',
 | |
|         'img',
 | |
|         'hr',
 | |
|         'input'
 | |
|       ], universe.property().name(item));
 | |
|     };
 | |
| 
 | |
|     var universe$1 = DomUniverse();
 | |
|     var isBlock = function (element) {
 | |
|       return isBlock$1(universe$1, element);
 | |
|     };
 | |
|     var isList = function (element) {
 | |
|       return isList$1(universe$1, element);
 | |
|     };
 | |
|     var isEmptyTag = function (element) {
 | |
|       return isEmptyTag$1(universe$1, element);
 | |
|     };
 | |
| 
 | |
|     var merge = function (cells) {
 | |
|       var isBr = function (el) {
 | |
|         return name(el) === 'br';
 | |
|       };
 | |
|       var advancedBr = function (children) {
 | |
|         return forall(children, function (c) {
 | |
|           return isBr(c) || isText(c) && get$9(c).trim().length === 0;
 | |
|         });
 | |
|       };
 | |
|       var isListItem = function (el) {
 | |
|         return name(el) === 'li' || ancestor$2(el, isList).isSome();
 | |
|       };
 | |
|       var siblingIsBlock = function (el) {
 | |
|         return nextSibling(el).map(function (rightSibling) {
 | |
|           if (isBlock(rightSibling)) {
 | |
|             return true;
 | |
|           }
 | |
|           if (isEmptyTag(rightSibling)) {
 | |
|             return name(rightSibling) === 'img' ? false : true;
 | |
|           }
 | |
|           return false;
 | |
|         }).getOr(false);
 | |
|       };
 | |
|       var markCell = function (cell) {
 | |
|         return last$1(cell).bind(function (rightEdge) {
 | |
|           var rightSiblingIsBlock = siblingIsBlock(rightEdge);
 | |
|           return parent(rightEdge).map(function (parent) {
 | |
|             return rightSiblingIsBlock === true || isListItem(parent) || isBr(rightEdge) || isBlock(parent) && !eq$1(cell, parent) ? [] : [SugarElement.fromTag('br')];
 | |
|           });
 | |
|         }).getOr([]);
 | |
|       };
 | |
|       var markContent = function () {
 | |
|         var content = bind$2(cells, function (cell) {
 | |
|           var children = children$3(cell);
 | |
|           return advancedBr(children) ? [] : children.concat(markCell(cell));
 | |
|         });
 | |
|         return content.length === 0 ? [SugarElement.fromTag('br')] : content;
 | |
|       };
 | |
|       var contents = markContent();
 | |
|       empty(cells[0]);
 | |
|       append(cells[0], contents);
 | |
|     };
 | |
| 
 | |
|     var isEditable = function (elem) {
 | |
|       return isEditable$1(elem, true);
 | |
|     };
 | |
|     var prune = function (table) {
 | |
|       var cells = cells$1(table);
 | |
|       if (cells.length === 0) {
 | |
|         remove$5(table);
 | |
|       }
 | |
|     };
 | |
|     var outcome = function (grid, cursor) {
 | |
|       return {
 | |
|         grid: grid,
 | |
|         cursor: cursor
 | |
|       };
 | |
|     };
 | |
|     var findEditableCursorPosition = function (rows) {
 | |
|       return findMap(rows, function (row) {
 | |
|         return findMap(row.cells, function (cell) {
 | |
|           var elem = cell.element;
 | |
|           return someIf(isEditable(elem), elem);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var elementFromGrid = function (grid, row, column) {
 | |
|       var _a, _b;
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       return Optional.from((_b = (_a = rows[row]) === null || _a === void 0 ? void 0 : _a.cells[column]) === null || _b === void 0 ? void 0 : _b.element).filter(isEditable).orThunk(function () {
 | |
|         return findEditableCursorPosition(rows);
 | |
|       });
 | |
|     };
 | |
|     var bundle = function (grid, row, column) {
 | |
|       var cursorElement = elementFromGrid(grid, row, column);
 | |
|       return outcome(grid, cursorElement);
 | |
|     };
 | |
|     var uniqueRows = function (details) {
 | |
|       var rowCompilation = function (rest, detail) {
 | |
|         var rowExists = exists(rest, function (currentDetail) {
 | |
|           return currentDetail.row === detail.row;
 | |
|         });
 | |
|         return rowExists ? rest : rest.concat([detail]);
 | |
|       };
 | |
|       return foldl(details, rowCompilation, []).sort(function (detailA, detailB) {
 | |
|         return detailA.row - detailB.row;
 | |
|       });
 | |
|     };
 | |
|     var opInsertRowsBefore = function (grid, details, comparator, genWrappers) {
 | |
|       var targetIndex = details[0].row;
 | |
|       var rows = uniqueRows(details);
 | |
|       var newGrid = foldr(rows, function (acc, row) {
 | |
|         var newG = insertRowAt(acc.grid, targetIndex, row.row + acc.delta, comparator, genWrappers.getOrInit);
 | |
|         return {
 | |
|           grid: newG,
 | |
|           delta: acc.delta + 1
 | |
|         };
 | |
|       }, {
 | |
|         grid: grid,
 | |
|         delta: 0
 | |
|       }).grid;
 | |
|       return bundle(newGrid, targetIndex, details[0].column);
 | |
|     };
 | |
|     var opInsertRowsAfter = function (grid, details, comparator, genWrappers) {
 | |
|       var rows = uniqueRows(details);
 | |
|       var target = rows[rows.length - 1];
 | |
|       var targetIndex = target.row + target.rowspan;
 | |
|       var newGrid = foldr(rows, function (newG, row) {
 | |
|         return insertRowAt(newG, targetIndex, row.row, comparator, genWrappers.getOrInit);
 | |
|       }, grid);
 | |
|       return bundle(newGrid, targetIndex, details[0].column);
 | |
|     };
 | |
|     var opInsertColumnsBefore = function (grid, extractDetail, comparator, genWrappers) {
 | |
|       var details = extractDetail.details;
 | |
|       var columns = uniqueColumns(details);
 | |
|       var targetIndex = columns[0].column;
 | |
|       var newGrid = foldr(columns, function (acc, col) {
 | |
|         var newG = insertColumnAt(acc.grid, targetIndex, col.column + acc.delta, comparator, genWrappers.getOrInit);
 | |
|         return {
 | |
|           grid: newG,
 | |
|           delta: acc.delta + 1
 | |
|         };
 | |
|       }, {
 | |
|         grid: grid,
 | |
|         delta: 0
 | |
|       }).grid;
 | |
|       return bundle(newGrid, details[0].row, targetIndex);
 | |
|     };
 | |
|     var opInsertColumnsAfter = function (grid, extractDetail, comparator, genWrappers) {
 | |
|       var details = extractDetail.details;
 | |
|       var target = details[details.length - 1];
 | |
|       var targetIndex = target.column + target.colspan;
 | |
|       var columns = uniqueColumns(details);
 | |
|       var newGrid = foldr(columns, function (newG, col) {
 | |
|         return insertColumnAt(newG, targetIndex, col.column, comparator, genWrappers.getOrInit);
 | |
|       }, grid);
 | |
|       return bundle(newGrid, details[0].row, targetIndex);
 | |
|     };
 | |
|     var opMakeColumnsHeader = function (initialGrid, details, comparator, genWrappers) {
 | |
|       var columns = uniqueColumns(details);
 | |
|       var columnIndexes = map$1(columns, function (detail) {
 | |
|         return detail.column;
 | |
|       });
 | |
|       var newGrid = replaceColumns(initialGrid, columnIndexes, true, comparator, genWrappers.replaceOrInit);
 | |
|       return bundle(newGrid, details[0].row, details[0].column);
 | |
|     };
 | |
|     var opMakeCellsHeader = function (initialGrid, details, comparator, genWrappers) {
 | |
|       var newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit);
 | |
|       return bundle(newGrid, details[0].row, details[0].column);
 | |
|     };
 | |
|     var opUnmakeColumnsHeader = function (initialGrid, details, comparator, genWrappers) {
 | |
|       var columns = uniqueColumns(details);
 | |
|       var columnIndexes = map$1(columns, function (detail) {
 | |
|         return detail.column;
 | |
|       });
 | |
|       var newGrid = replaceColumns(initialGrid, columnIndexes, false, comparator, genWrappers.replaceOrInit);
 | |
|       return bundle(newGrid, details[0].row, details[0].column);
 | |
|     };
 | |
|     var opUnmakeCellsHeader = function (initialGrid, details, comparator, genWrappers) {
 | |
|       var newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit);
 | |
|       return bundle(newGrid, details[0].row, details[0].column);
 | |
|     };
 | |
|     var makeRowsSection = function (section, applyScope) {
 | |
|       return function (initialGrid, details, comparator, genWrappers, tableSection) {
 | |
|         var rows = uniqueRows(details);
 | |
|         var rowIndexes = map$1(rows, function (detail) {
 | |
|           return detail.row;
 | |
|         });
 | |
|         var newGrid = replaceRows(initialGrid, rowIndexes, section, applyScope, comparator, genWrappers.replaceOrInit, tableSection);
 | |
|         return bundle(newGrid, details[0].row, details[0].column);
 | |
|       };
 | |
|     };
 | |
|     var opMakeRowsHeader = makeRowsSection('thead', true);
 | |
|     var opMakeRowsBody = makeRowsSection('tbody', false);
 | |
|     var opMakeRowsFooter = makeRowsSection('tfoot', false);
 | |
|     var opEraseColumns = function (grid, extractDetail, _comparator, _genWrappers) {
 | |
|       var columns = uniqueColumns(extractDetail.details);
 | |
|       var newGrid = deleteColumnsAt(grid, map$1(columns, function (column) {
 | |
|         return column.column;
 | |
|       }));
 | |
|       var maxColIndex = newGrid.length > 0 ? newGrid[0].cells.length - 1 : 0;
 | |
|       return bundle(newGrid, columns[0].row, Math.min(columns[0].column, maxColIndex));
 | |
|     };
 | |
|     var opEraseRows = function (grid, details, _comparator, _genWrappers) {
 | |
|       var rows = uniqueRows(details);
 | |
|       var newGrid = deleteRowsAt(grid, rows[0].row, rows[rows.length - 1].row);
 | |
|       var maxRowIndex = newGrid.length > 0 ? newGrid.length - 1 : 0;
 | |
|       return bundle(newGrid, Math.min(details[0].row, maxRowIndex), details[0].column);
 | |
|     };
 | |
|     var opMergeCells = function (grid, mergable, comparator, genWrappers) {
 | |
|       var cells = mergable.cells;
 | |
|       merge(cells);
 | |
|       var newGrid = merge$2(grid, mergable.bounds, comparator, genWrappers.merge(cells));
 | |
|       return outcome(newGrid, Optional.from(cells[0]));
 | |
|     };
 | |
|     var opUnmergeCells = function (grid, unmergable, comparator, genWrappers) {
 | |
|       var unmerge$1 = function (b, cell) {
 | |
|         return unmerge(b, cell, comparator, genWrappers.unmerge(cell));
 | |
|       };
 | |
|       var newGrid = foldr(unmergable, unmerge$1, grid);
 | |
|       return outcome(newGrid, Optional.from(unmergable[0]));
 | |
|     };
 | |
|     var opPasteCells = function (grid, pasteDetails, comparator, _genWrappers) {
 | |
|       var gridify = function (table, generators) {
 | |
|         var wh = Warehouse.fromTable(table);
 | |
|         return toGrid(wh, generators, true);
 | |
|       };
 | |
|       var gridB = gridify(pasteDetails.clipboard, pasteDetails.generators);
 | |
|       var startAddress = address(pasteDetails.row, pasteDetails.column);
 | |
|       var mergedGrid = merge$1(startAddress, grid, gridB, pasteDetails.generators, comparator);
 | |
|       return mergedGrid.fold(function () {
 | |
|         return outcome(grid, Optional.some(pasteDetails.element));
 | |
|       }, function (newGrid) {
 | |
|         return bundle(newGrid, pasteDetails.row, pasteDetails.column);
 | |
|       });
 | |
|     };
 | |
|     var gridifyRows = function (rows, generators, context) {
 | |
|       var pasteDetails = fromPastedRows(rows, context.section);
 | |
|       var wh = Warehouse.generate(pasteDetails);
 | |
|       return toGrid(wh, generators, true);
 | |
|     };
 | |
|     var opPasteColsBefore = function (grid, pasteDetails, comparator, _genWrappers) {
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       var index = pasteDetails.cells[0].column;
 | |
|       var context = rows[pasteDetails.cells[0].row];
 | |
|       var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);
 | |
|       var mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator);
 | |
|       return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);
 | |
|     };
 | |
|     var opPasteColsAfter = function (grid, pasteDetails, comparator, _genWrappers) {
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       var index = pasteDetails.cells[pasteDetails.cells.length - 1].column + pasteDetails.cells[pasteDetails.cells.length - 1].colspan;
 | |
|       var context = rows[pasteDetails.cells[0].row];
 | |
|       var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);
 | |
|       var mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator);
 | |
|       return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);
 | |
|     };
 | |
|     var opPasteRowsBefore = function (grid, pasteDetails, comparator, _genWrappers) {
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       var index = pasteDetails.cells[0].row;
 | |
|       var context = rows[index];
 | |
|       var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);
 | |
|       var mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator);
 | |
|       return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);
 | |
|     };
 | |
|     var opPasteRowsAfter = function (grid, pasteDetails, comparator, _genWrappers) {
 | |
|       var rows = extractGridDetails(grid).rows;
 | |
|       var index = pasteDetails.cells[pasteDetails.cells.length - 1].row + pasteDetails.cells[pasteDetails.cells.length - 1].rowspan;
 | |
|       var context = rows[pasteDetails.cells[0].row];
 | |
|       var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context);
 | |
|       var mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator);
 | |
|       return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column);
 | |
|     };
 | |
|     var opGetColumnsType = function (table, target) {
 | |
|       var house = Warehouse.fromTable(table);
 | |
|       var details = onCells(house, target);
 | |
|       return details.bind(function (selectedCells) {
 | |
|         var lastSelectedCell = selectedCells[selectedCells.length - 1];
 | |
|         var minColRange = selectedCells[0].column;
 | |
|         var maxColRange = lastSelectedCell.column + lastSelectedCell.colspan;
 | |
|         var selectedColumnCells = flatten$1(map$1(house.all, function (row) {
 | |
|           return filter$2(row.cells, function (cell) {
 | |
|             return cell.column >= minColRange && cell.column < maxColRange;
 | |
|           });
 | |
|         }));
 | |
|         return findCommonCellType(selectedColumnCells);
 | |
|       }).getOr('');
 | |
|     };
 | |
|     var opGetCellsType = function (table, target) {
 | |
|       var house = Warehouse.fromTable(table);
 | |
|       var details = onCells(house, target);
 | |
|       return details.bind(findCommonCellType).getOr('');
 | |
|     };
 | |
|     var opGetRowsType = function (table, target) {
 | |
|       var house = Warehouse.fromTable(table);
 | |
|       var details = onCells(house, target);
 | |
|       return details.bind(function (selectedCells) {
 | |
|         var lastSelectedCell = selectedCells[selectedCells.length - 1];
 | |
|         var minRowRange = selectedCells[0].row;
 | |
|         var maxRowRange = lastSelectedCell.row + lastSelectedCell.rowspan;
 | |
|         var selectedRows = house.all.slice(minRowRange, maxRowRange);
 | |
|         return findCommonRowType(selectedRows);
 | |
|       }).getOr('');
 | |
|     };
 | |
|     var resize = function (table, list, details, behaviours) {
 | |
|       return adjustWidthTo(table, list, details, behaviours.sizing);
 | |
|     };
 | |
|     var adjustAndRedistributeWidths = function (table, list, details, behaviours) {
 | |
|       return adjustAndRedistributeWidths$1(table, list, details, behaviours.sizing, behaviours.resize);
 | |
|     };
 | |
|     var firstColumnIsLocked = function (_warehouse, details) {
 | |
|       return exists(details, function (detail) {
 | |
|         return detail.column === 0 && detail.isLocked;
 | |
|       });
 | |
|     };
 | |
|     var lastColumnIsLocked = function (warehouse, details) {
 | |
|       return exists(details, function (detail) {
 | |
|         return detail.column + detail.colspan >= warehouse.grid.columns && detail.isLocked;
 | |
|       });
 | |
|     };
 | |
|     var getColumnsWidth = function (warehouse, details) {
 | |
|       var columns$1 = columns(warehouse);
 | |
|       var uniqueCols = uniqueColumns(details);
 | |
|       return foldl(uniqueCols, function (acc, detail) {
 | |
|         var column = columns$1[detail.column];
 | |
|         var colWidth = column.map(getOuter$2).getOr(0);
 | |
|         return acc + colWidth;
 | |
|       }, 0);
 | |
|     };
 | |
|     var insertColumnsExtractor = function (before) {
 | |
|       return function (warehouse, target) {
 | |
|         return onCells(warehouse, target).filter(function (details) {
 | |
|           var checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked;
 | |
|           return !checkLocked(warehouse, details);
 | |
|         }).map(function (details) {
 | |
|           return {
 | |
|             details: details,
 | |
|             pixelDelta: getColumnsWidth(warehouse, details)
 | |
|           };
 | |
|         });
 | |
|       };
 | |
|     };
 | |
|     var eraseColumnsExtractor = function (warehouse, target) {
 | |
|       return onUnlockedCells(warehouse, target).map(function (details) {
 | |
|         return {
 | |
|           details: details,
 | |
|           pixelDelta: -getColumnsWidth(warehouse, details)
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|     var pasteColumnsExtractor = function (before) {
 | |
|       return function (warehouse, target) {
 | |
|         return onPasteByEditor(warehouse, target).filter(function (details) {
 | |
|           var checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked;
 | |
|           return !checkLocked(warehouse, details.cells);
 | |
|         });
 | |
|       };
 | |
|     };
 | |
|     var headerCellGenerator = Generators.transform('th');
 | |
|     var bodyCellGenerator = Generators.transform('td');
 | |
|     var insertRowsBefore = run(opInsertRowsBefore, onCells, noop, noop, Generators.modification);
 | |
|     var insertRowsAfter = run(opInsertRowsAfter, onCells, noop, noop, Generators.modification);
 | |
|     var insertColumnsBefore = run(opInsertColumnsBefore, insertColumnsExtractor(true), adjustAndRedistributeWidths, noop, Generators.modification);
 | |
|     var insertColumnsAfter = run(opInsertColumnsAfter, insertColumnsExtractor(false), adjustAndRedistributeWidths, noop, Generators.modification);
 | |
|     var eraseColumns = run(opEraseColumns, eraseColumnsExtractor, adjustAndRedistributeWidths, prune, Generators.modification);
 | |
|     var eraseRows = run(opEraseRows, onCells, noop, prune, Generators.modification);
 | |
|     var makeColumnsHeader = run(opMakeColumnsHeader, onUnlockedCells, noop, noop, headerCellGenerator);
 | |
|     var unmakeColumnsHeader = run(opUnmakeColumnsHeader, onUnlockedCells, noop, noop, bodyCellGenerator);
 | |
|     var makeRowsHeader = run(opMakeRowsHeader, onUnlockedCells, noop, noop, headerCellGenerator);
 | |
|     var makeRowsBody = run(opMakeRowsBody, onUnlockedCells, noop, noop, bodyCellGenerator);
 | |
|     var makeRowsFooter = run(opMakeRowsFooter, onUnlockedCells, noop, noop, bodyCellGenerator);
 | |
|     var makeCellsHeader = run(opMakeCellsHeader, onUnlockedCells, noop, noop, headerCellGenerator);
 | |
|     var unmakeCellsHeader = run(opUnmakeCellsHeader, onUnlockedCells, noop, noop, bodyCellGenerator);
 | |
|     var mergeCells = run(opMergeCells, onUnlockedMergable, resize, noop, Generators.merging);
 | |
|     var unmergeCells = run(opUnmergeCells, onUnlockedUnmergable, resize, noop, Generators.merging);
 | |
|     var pasteCells = run(opPasteCells, onPaste, resize, noop, Generators.modification);
 | |
|     var pasteColsBefore = run(opPasteColsBefore, pasteColumnsExtractor(true), noop, noop, Generators.modification);
 | |
|     var pasteColsAfter = run(opPasteColsAfter, pasteColumnsExtractor(false), noop, noop, Generators.modification);
 | |
|     var pasteRowsBefore = run(opPasteRowsBefore, onPasteByEditor, noop, noop, Generators.modification);
 | |
|     var pasteRowsAfter = run(opPasteRowsAfter, onPasteByEditor, noop, noop, Generators.modification);
 | |
|     var getColumnsType = opGetColumnsType;
 | |
|     var getCellsType = opGetCellsType;
 | |
|     var getRowsType = opGetRowsType;
 | |
| 
 | |
|     var TableActions = function (editor, cellSelection, lazyWire) {
 | |
|       var isTableBody = function (editor) {
 | |
|         return name(getBody(editor)) === 'table';
 | |
|       };
 | |
|       var lastRowGuard = function (table) {
 | |
|         return isTableBody(editor) === false || getGridSize(table).rows > 1;
 | |
|       };
 | |
|       var lastColumnGuard = function (table) {
 | |
|         return isTableBody(editor) === false || getGridSize(table).columns > 1;
 | |
|       };
 | |
|       var cloneFormats = getCloneElements(editor);
 | |
|       var colMutationOp = isResizeTableColumnResizing(editor) ? noop : halve;
 | |
|       var getTableSectionType = function (table) {
 | |
|         switch (getTableHeaderType(editor)) {
 | |
|         case 'section':
 | |
|           return TableSection.section();
 | |
|         case 'sectionCells':
 | |
|           return TableSection.sectionCells();
 | |
|         case 'cells':
 | |
|           return TableSection.cells();
 | |
|         default:
 | |
|           return TableSection.getTableSectionType(table, 'section');
 | |
|         }
 | |
|       };
 | |
|       var setSelectionFromAction = function (table, result) {
 | |
|         return result.cursor.fold(function () {
 | |
|           var cells = cells$1(table);
 | |
|           return head(cells).filter(inBody).map(function (firstCell) {
 | |
|             cellSelection.clear(table);
 | |
|             var rng = editor.dom.createRng();
 | |
|             rng.selectNode(firstCell.dom);
 | |
|             editor.selection.setRng(rng);
 | |
|             set$2(firstCell, 'data-mce-selected', '1');
 | |
|             return rng;
 | |
|           });
 | |
|         }, function (cell) {
 | |
|           var des = freefallRtl(cell);
 | |
|           var rng = editor.dom.createRng();
 | |
|           rng.setStart(des.element.dom, des.offset);
 | |
|           rng.setEnd(des.element.dom, des.offset);
 | |
|           editor.selection.setRng(rng);
 | |
|           cellSelection.clear(table);
 | |
|           return Optional.some(rng);
 | |
|         });
 | |
|       };
 | |
|       var execute = function (operation, guard, mutate, lazyWire, effect) {
 | |
|         return function (table, target, noEvents) {
 | |
|           if (noEvents === void 0) {
 | |
|             noEvents = false;
 | |
|           }
 | |
|           removeDataStyle(table);
 | |
|           var wire = lazyWire();
 | |
|           var doc = SugarElement.fromDom(editor.getDoc());
 | |
|           var generators = cellOperations(mutate, doc, cloneFormats);
 | |
|           var behaviours = {
 | |
|             sizing: get$4(editor, table),
 | |
|             resize: isResizeTableColumnResizing(editor) ? resizeTable() : preserveTable(),
 | |
|             section: getTableSectionType(table)
 | |
|           };
 | |
|           return guard(table) ? operation(wire, table, target, generators, behaviours).bind(function (result) {
 | |
|             each$2(result.newRows, function (row) {
 | |
|               fireNewRow(editor, row.dom);
 | |
|             });
 | |
|             each$2(result.newCells, function (cell) {
 | |
|               fireNewCell(editor, cell.dom);
 | |
|             });
 | |
|             var range = setSelectionFromAction(table, result);
 | |
|             if (inBody(table)) {
 | |
|               removeDataStyle(table);
 | |
|               if (!noEvents) {
 | |
|                 fireTableModified(editor, table.dom, effect);
 | |
|               }
 | |
|             }
 | |
|             return range.map(function (rng) {
 | |
|               return {
 | |
|                 rng: rng,
 | |
|                 effect: effect
 | |
|               };
 | |
|             });
 | |
|           }) : Optional.none();
 | |
|         };
 | |
|       };
 | |
|       var deleteRow = execute(eraseRows, lastRowGuard, noop, lazyWire, structureModified);
 | |
|       var deleteColumn = execute(eraseColumns, lastColumnGuard, noop, lazyWire, structureModified);
 | |
|       var insertRowsBefore$1 = execute(insertRowsBefore, always, noop, lazyWire, structureModified);
 | |
|       var insertRowsAfter$1 = execute(insertRowsAfter, always, noop, lazyWire, structureModified);
 | |
|       var insertColumnsBefore$1 = execute(insertColumnsBefore, always, colMutationOp, lazyWire, structureModified);
 | |
|       var insertColumnsAfter$1 = execute(insertColumnsAfter, always, colMutationOp, lazyWire, structureModified);
 | |
|       var mergeCells$1 = execute(mergeCells, always, noop, lazyWire, structureModified);
 | |
|       var unmergeCells$1 = execute(unmergeCells, always, noop, lazyWire, structureModified);
 | |
|       var pasteColsBefore$1 = execute(pasteColsBefore, always, noop, lazyWire, structureModified);
 | |
|       var pasteColsAfter$1 = execute(pasteColsAfter, always, noop, lazyWire, structureModified);
 | |
|       var pasteRowsBefore$1 = execute(pasteRowsBefore, always, noop, lazyWire, structureModified);
 | |
|       var pasteRowsAfter$1 = execute(pasteRowsAfter, always, noop, lazyWire, structureModified);
 | |
|       var pasteCells$1 = execute(pasteCells, always, noop, lazyWire, styleAndStructureModified);
 | |
|       var makeCellsHeader$1 = execute(makeCellsHeader, always, noop, lazyWire, structureModified);
 | |
|       var unmakeCellsHeader$1 = execute(unmakeCellsHeader, always, noop, lazyWire, structureModified);
 | |
|       var makeColumnsHeader$1 = execute(makeColumnsHeader, always, noop, lazyWire, structureModified);
 | |
|       var unmakeColumnsHeader$1 = execute(unmakeColumnsHeader, always, noop, lazyWire, structureModified);
 | |
|       var makeRowsHeader$1 = execute(makeRowsHeader, always, noop, lazyWire, structureModified);
 | |
|       var makeRowsBody$1 = execute(makeRowsBody, always, noop, lazyWire, structureModified);
 | |
|       var makeRowsFooter$1 = execute(makeRowsFooter, always, noop, lazyWire, structureModified);
 | |
|       var getTableCellType = getCellsType;
 | |
|       var getTableColType = getColumnsType;
 | |
|       var getTableRowType = getRowsType;
 | |
|       return {
 | |
|         deleteRow: deleteRow,
 | |
|         deleteColumn: deleteColumn,
 | |
|         insertRowsBefore: insertRowsBefore$1,
 | |
|         insertRowsAfter: insertRowsAfter$1,
 | |
|         insertColumnsBefore: insertColumnsBefore$1,
 | |
|         insertColumnsAfter: insertColumnsAfter$1,
 | |
|         mergeCells: mergeCells$1,
 | |
|         unmergeCells: unmergeCells$1,
 | |
|         pasteColsBefore: pasteColsBefore$1,
 | |
|         pasteColsAfter: pasteColsAfter$1,
 | |
|         pasteRowsBefore: pasteRowsBefore$1,
 | |
|         pasteRowsAfter: pasteRowsAfter$1,
 | |
|         pasteCells: pasteCells$1,
 | |
|         makeCellsHeader: makeCellsHeader$1,
 | |
|         unmakeCellsHeader: unmakeCellsHeader$1,
 | |
|         makeColumnsHeader: makeColumnsHeader$1,
 | |
|         unmakeColumnsHeader: unmakeColumnsHeader$1,
 | |
|         makeRowsHeader: makeRowsHeader$1,
 | |
|         makeRowsBody: makeRowsBody$1,
 | |
|         makeRowsFooter: makeRowsFooter$1,
 | |
|         getTableRowType: getTableRowType,
 | |
|         getTableCellType: getTableCellType,
 | |
|         getTableColType: getTableColType
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var DefaultRenderOptions = {
 | |
|       styles: {
 | |
|         'border-collapse': 'collapse',
 | |
|         'width': '100%'
 | |
|       },
 | |
|       attributes: { border: '1' },
 | |
|       colGroups: false
 | |
|     };
 | |
|     var tableHeaderCell = function () {
 | |
|       return SugarElement.fromTag('th');
 | |
|     };
 | |
|     var tableCell = function () {
 | |
|       return SugarElement.fromTag('td');
 | |
|     };
 | |
|     var tableColumn = function () {
 | |
|       return SugarElement.fromTag('col');
 | |
|     };
 | |
|     var createRow = function (columns, rowHeaders, columnHeaders, rowIndex) {
 | |
|       var tr = SugarElement.fromTag('tr');
 | |
|       for (var j = 0; j < columns; j++) {
 | |
|         var td = rowIndex < rowHeaders || j < columnHeaders ? tableHeaderCell() : tableCell();
 | |
|         if (j < columnHeaders) {
 | |
|           set$2(td, 'scope', 'row');
 | |
|         }
 | |
|         if (rowIndex < rowHeaders) {
 | |
|           set$2(td, 'scope', 'col');
 | |
|         }
 | |
|         append$1(td, SugarElement.fromTag('br'));
 | |
|         append$1(tr, td);
 | |
|       }
 | |
|       return tr;
 | |
|     };
 | |
|     var createGroupRow = function (columns) {
 | |
|       var columnGroup = SugarElement.fromTag('colgroup');
 | |
|       range$1(columns, function () {
 | |
|         return append$1(columnGroup, tableColumn());
 | |
|       });
 | |
|       return columnGroup;
 | |
|     };
 | |
|     var createRows = function (rows, columns, rowHeaders, columnHeaders) {
 | |
|       return range$1(rows, function (r) {
 | |
|         return createRow(columns, rowHeaders, columnHeaders, r);
 | |
|       });
 | |
|     };
 | |
|     var render = function (rows, columns, rowHeaders, columnHeaders, headerType, renderOpts) {
 | |
|       if (renderOpts === void 0) {
 | |
|         renderOpts = DefaultRenderOptions;
 | |
|       }
 | |
|       var table = SugarElement.fromTag('table');
 | |
|       var rowHeadersGoInThead = headerType !== 'cells';
 | |
|       setAll(table, renderOpts.styles);
 | |
|       setAll$1(table, renderOpts.attributes);
 | |
|       if (renderOpts.colGroups) {
 | |
|         append$1(table, createGroupRow(columns));
 | |
|       }
 | |
|       var actualRowHeaders = Math.min(rows, rowHeaders);
 | |
|       if (rowHeadersGoInThead && rowHeaders > 0) {
 | |
|         var thead = SugarElement.fromTag('thead');
 | |
|         append$1(table, thead);
 | |
|         var theadRowHeaders = headerType === 'sectionCells' ? actualRowHeaders : 0;
 | |
|         var theadRows = createRows(rowHeaders, columns, theadRowHeaders, columnHeaders);
 | |
|         append(thead, theadRows);
 | |
|       }
 | |
|       var tbody = SugarElement.fromTag('tbody');
 | |
|       append$1(table, tbody);
 | |
|       var numRows = rowHeadersGoInThead ? rows - actualRowHeaders : rows;
 | |
|       var numRowHeaders = rowHeadersGoInThead ? 0 : rowHeaders;
 | |
|       var tbodyRows = createRows(numRows, columns, numRowHeaders, columnHeaders);
 | |
|       append(tbody, tbodyRows);
 | |
|       return table;
 | |
|     };
 | |
| 
 | |
|     var get$2 = function (element) {
 | |
|       return element.dom.innerHTML;
 | |
|     };
 | |
|     var getOuter = function (element) {
 | |
|       var container = SugarElement.fromTag('div');
 | |
|       var clone = SugarElement.fromDom(element.dom.cloneNode(true));
 | |
|       append$1(container, clone);
 | |
|       return get$2(container);
 | |
|     };
 | |
| 
 | |
|     var placeCaretInCell = function (editor, cell) {
 | |
|       editor.selection.select(cell.dom, true);
 | |
|       editor.selection.collapse(true);
 | |
|     };
 | |
|     var selectFirstCellInTable = function (editor, tableElm) {
 | |
|       descendant(tableElm, 'td,th').each(curry(placeCaretInCell, editor));
 | |
|     };
 | |
|     var fireEvents = function (editor, table) {
 | |
|       each$2(descendants(table, 'tr'), function (row) {
 | |
|         fireNewRow(editor, row.dom);
 | |
|         each$2(descendants(row, 'th,td'), function (cell) {
 | |
|           fireNewCell(editor, cell.dom);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var isPercentage = function (width) {
 | |
|       return isString(width) && width.indexOf('%') !== -1;
 | |
|     };
 | |
|     var insert = function (editor, columns, rows, colHeaders, rowHeaders) {
 | |
|       var defaultStyles = getDefaultStyles(editor);
 | |
|       var options = {
 | |
|         styles: defaultStyles,
 | |
|         attributes: getDefaultAttributes(editor),
 | |
|         colGroups: useColumnGroup(editor)
 | |
|       };
 | |
|       editor.undoManager.ignore(function () {
 | |
|         var table = render(rows, columns, rowHeaders, colHeaders, getTableHeaderType(editor), options);
 | |
|         set$2(table, 'data-mce-id', '__mce');
 | |
|         var html = getOuter(table);
 | |
|         editor.insertContent(html);
 | |
|         editor.addVisual();
 | |
|       });
 | |
|       return descendant(getBody(editor), 'table[data-mce-id="__mce"]').map(function (table) {
 | |
|         if (isPixelsForced(editor)) {
 | |
|           enforcePixels(table);
 | |
|         } else if (isResponsiveForced(editor)) {
 | |
|           enforceNone(table);
 | |
|         } else if (isPercentagesForced(editor) || isPercentage(defaultStyles.width)) {
 | |
|           enforcePercentage(table);
 | |
|         }
 | |
|         removeDataStyle(table);
 | |
|         remove$7(table, 'data-mce-id');
 | |
|         fireEvents(editor, table);
 | |
|         selectFirstCellInTable(editor, table);
 | |
|         return table.dom;
 | |
|       }).getOr(null);
 | |
|     };
 | |
|     var insertTableWithDataValidation = function (editor, rows, columns, options, errorMsg) {
 | |
|       if (options === void 0) {
 | |
|         options = {};
 | |
|       }
 | |
|       var checkInput = function (val) {
 | |
|         return isNumber(val) && val > 0;
 | |
|       };
 | |
|       if (checkInput(rows) && checkInput(columns)) {
 | |
|         var headerRows = options.headerRows || 0;
 | |
|         var headerColumns = options.headerColumns || 0;
 | |
|         return insert(editor, columns, rows, headerColumns, headerRows);
 | |
|       } else {
 | |
|         console.error(errorMsg);
 | |
|         return null;
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var getClipboardElements = function (getClipboard) {
 | |
|       return function () {
 | |
|         return getClipboard().fold(function () {
 | |
|           return [];
 | |
|         }, function (elems) {
 | |
|           return map$1(elems, function (e) {
 | |
|             return e.dom;
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|     };
 | |
|     var setClipboardElements = function (setClipboard) {
 | |
|       return function (elems) {
 | |
|         var elmsOpt = elems.length > 0 ? Optional.some(fromDom(elems)) : Optional.none();
 | |
|         setClipboard(elmsOpt);
 | |
|       };
 | |
|     };
 | |
|     var insertTable = function (editor) {
 | |
|       return function (columns, rows, options) {
 | |
|         if (options === void 0) {
 | |
|           options = {};
 | |
|         }
 | |
|         var table = insertTableWithDataValidation(editor, rows, columns, options, 'Invalid values for insertTable - rows and columns values are required to insert a table.');
 | |
|         editor.undoManager.add();
 | |
|         return table;
 | |
|       };
 | |
|     };
 | |
|     var getApi = function (editor, clipboard, resizeHandler, selectionTargets) {
 | |
|       return {
 | |
|         insertTable: insertTable(editor),
 | |
|         setClipboardRows: setClipboardElements(clipboard.setRows),
 | |
|         getClipboardRows: getClipboardElements(clipboard.getRows),
 | |
|         setClipboardCols: setClipboardElements(clipboard.setColumns),
 | |
|         getClipboardCols: getClipboardElements(clipboard.getColumns),
 | |
|         resizeHandler: resizeHandler,
 | |
|         selectionTargets: selectionTargets
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var constrainSpan = function (element, property, value) {
 | |
|       var currentColspan = getAttrValue(element, property, 1);
 | |
|       if (value === 1 || currentColspan <= 1) {
 | |
|         remove$7(element, property);
 | |
|       } else {
 | |
|         set$2(element, property, Math.min(value, currentColspan));
 | |
|       }
 | |
|     };
 | |
|     var generateColGroup = function (house, minColRange, maxColRange) {
 | |
|       if (Warehouse.hasColumns(house)) {
 | |
|         var colsToCopy = filter$2(Warehouse.justColumns(house), function (col) {
 | |
|           return col.column >= minColRange && col.column < maxColRange;
 | |
|         });
 | |
|         var copiedCols = map$1(colsToCopy, function (c) {
 | |
|           var clonedCol = deep(c.element);
 | |
|           constrainSpan(clonedCol, 'span', maxColRange - minColRange);
 | |
|           return clonedCol;
 | |
|         });
 | |
|         var fakeColgroup = SugarElement.fromTag('colgroup');
 | |
|         append(fakeColgroup, copiedCols);
 | |
|         return [fakeColgroup];
 | |
|       } else {
 | |
|         return [];
 | |
|       }
 | |
|     };
 | |
|     var generateRows = function (house, minColRange, maxColRange) {
 | |
|       return map$1(house.all, function (row) {
 | |
|         var cellsToCopy = filter$2(row.cells, function (cell) {
 | |
|           return cell.column >= minColRange && cell.column < maxColRange;
 | |
|         });
 | |
|         var copiedCells = map$1(cellsToCopy, function (cell) {
 | |
|           var clonedCell = deep(cell.element);
 | |
|           constrainSpan(clonedCell, 'colspan', maxColRange - minColRange);
 | |
|           return clonedCell;
 | |
|         });
 | |
|         var fakeTR = SugarElement.fromTag('tr');
 | |
|         append(fakeTR, copiedCells);
 | |
|         return fakeTR;
 | |
|       });
 | |
|     };
 | |
|     var copyCols = function (table, target) {
 | |
|       var house = Warehouse.fromTable(table);
 | |
|       var details = onUnlockedCells(house, target);
 | |
|       return details.map(function (selectedCells) {
 | |
|         var lastSelectedCell = selectedCells[selectedCells.length - 1];
 | |
|         var minColRange = selectedCells[0].column;
 | |
|         var maxColRange = lastSelectedCell.column + lastSelectedCell.colspan;
 | |
|         var fakeColGroups = generateColGroup(house, minColRange, maxColRange);
 | |
|         var fakeRows = generateRows(house, minColRange, maxColRange);
 | |
|         return __spreadArray(__spreadArray([], fakeColGroups, true), fakeRows, true);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var copyRows = function (table, target, generators) {
 | |
|       var warehouse = Warehouse.fromTable(table);
 | |
|       var details = onCells(warehouse, target);
 | |
|       return details.bind(function (selectedCells) {
 | |
|         var grid = toGrid(warehouse, generators, false);
 | |
|         var rows = extractGridDetails(grid).rows;
 | |
|         var slicedGrid = rows.slice(selectedCells[0].row, selectedCells[selectedCells.length - 1].row + selectedCells[selectedCells.length - 1].rowspan);
 | |
|         var filteredGrid = bind$2(slicedGrid, function (row) {
 | |
|           var newCells = filter$2(row.cells, function (cell) {
 | |
|             return !cell.isLocked;
 | |
|           });
 | |
|           return newCells.length > 0 ? [__assign(__assign({}, row), { cells: newCells })] : [];
 | |
|         });
 | |
|         var slicedDetails = toDetailList(filteredGrid);
 | |
|         return someIf(slicedDetails.length > 0, slicedDetails);
 | |
|       }).map(function (slicedDetails) {
 | |
|         return copy(slicedDetails);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
 | |
| 
 | |
|     var getTDTHOverallStyle = function (dom, elm, name) {
 | |
|       var cells = dom.select('td,th', elm);
 | |
|       var firstChildStyle;
 | |
|       var checkChildren = function (firstChildStyle, elms) {
 | |
|         for (var i = 0; i < elms.length; i++) {
 | |
|           var currentStyle = dom.getStyle(elms[i], name);
 | |
|           if (typeof firstChildStyle === 'undefined') {
 | |
|             firstChildStyle = currentStyle;
 | |
|           }
 | |
|           if (firstChildStyle !== currentStyle) {
 | |
|             return '';
 | |
|           }
 | |
|         }
 | |
|         return firstChildStyle;
 | |
|       };
 | |
|       return checkChildren(firstChildStyle, cells);
 | |
|     };
 | |
|     var applyAlign = function (editor, elm, name) {
 | |
|       if (name) {
 | |
|         editor.formatter.apply('align' + name, {}, elm);
 | |
|       }
 | |
|     };
 | |
|     var applyVAlign = function (editor, elm, name) {
 | |
|       if (name) {
 | |
|         editor.formatter.apply('valign' + name, {}, elm);
 | |
|       }
 | |
|     };
 | |
|     var unApplyAlign = function (editor, elm) {
 | |
|       global$2.each('left center right'.split(' '), function (name) {
 | |
|         editor.formatter.remove('align' + name, {}, elm);
 | |
|       });
 | |
|     };
 | |
|     var unApplyVAlign = function (editor, elm) {
 | |
|       global$2.each('top middle bottom'.split(' '), function (name) {
 | |
|         editor.formatter.remove('valign' + name, {}, elm);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var verticalAlignValues = [
 | |
|       {
 | |
|         text: 'None',
 | |
|         value: ''
 | |
|       },
 | |
|       {
 | |
|         text: 'Top',
 | |
|         value: 'top'
 | |
|       },
 | |
|       {
 | |
|         text: 'Middle',
 | |
|         value: 'middle'
 | |
|       },
 | |
|       {
 | |
|         text: 'Bottom',
 | |
|         value: 'bottom'
 | |
|       }
 | |
|     ];
 | |
| 
 | |
|     var hexColour = function (value) {
 | |
|       return { value: value };
 | |
|     };
 | |
|     var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
 | |
|     var longformRegex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;
 | |
|     var isHexString = function (hex) {
 | |
|       return shorthandRegex.test(hex) || longformRegex.test(hex);
 | |
|     };
 | |
|     var normalizeHex = function (hex) {
 | |
|       return removeLeading(hex, '#').toUpperCase();
 | |
|     };
 | |
|     var fromString$1 = function (hex) {
 | |
|       return isHexString(hex) ? Optional.some({ value: normalizeHex(hex) }) : Optional.none();
 | |
|     };
 | |
|     var toHex = function (component) {
 | |
|       var hex = component.toString(16);
 | |
|       return (hex.length === 1 ? '0' + hex : hex).toUpperCase();
 | |
|     };
 | |
|     var fromRgba = function (rgbaColour) {
 | |
|       var value = toHex(rgbaColour.red) + toHex(rgbaColour.green) + toHex(rgbaColour.blue);
 | |
|       return hexColour(value);
 | |
|     };
 | |
| 
 | |
|     var rgbRegex = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)/;
 | |
|     var rgbaRegex = /^rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d?(?:\.\d+)?)\)/;
 | |
|     var rgbaColour = function (red, green, blue, alpha) {
 | |
|       return {
 | |
|         red: red,
 | |
|         green: green,
 | |
|         blue: blue,
 | |
|         alpha: alpha
 | |
|       };
 | |
|     };
 | |
|     var fromStringValues = function (red, green, blue, alpha) {
 | |
|       var r = parseInt(red, 10);
 | |
|       var g = parseInt(green, 10);
 | |
|       var b = parseInt(blue, 10);
 | |
|       var a = parseFloat(alpha);
 | |
|       return rgbaColour(r, g, b, a);
 | |
|     };
 | |
|     var fromString = function (rgbaString) {
 | |
|       if (rgbaString === 'transparent') {
 | |
|         return Optional.some(rgbaColour(0, 0, 0, 0));
 | |
|       }
 | |
|       var rgbMatch = rgbRegex.exec(rgbaString);
 | |
|       if (rgbMatch !== null) {
 | |
|         return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1'));
 | |
|       }
 | |
|       var rgbaMatch = rgbaRegex.exec(rgbaString);
 | |
|       if (rgbaMatch !== null) {
 | |
|         return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4]));
 | |
|       }
 | |
|       return Optional.none();
 | |
|     };
 | |
| 
 | |
|     var anyToHex = function (color) {
 | |
|       return fromString$1(color).orThunk(function () {
 | |
|         return fromString(color).map(fromRgba);
 | |
|       }).getOrThunk(function () {
 | |
|         var canvas = document.createElement('canvas');
 | |
|         canvas.height = 1;
 | |
|         canvas.width = 1;
 | |
|         var canvasContext = canvas.getContext('2d');
 | |
|         canvasContext.clearRect(0, 0, canvas.width, canvas.height);
 | |
|         canvasContext.fillStyle = '#FFFFFF';
 | |
|         canvasContext.fillStyle = color;
 | |
|         canvasContext.fillRect(0, 0, 1, 1);
 | |
|         var rgba = canvasContext.getImageData(0, 0, 1, 1).data;
 | |
|         var r = rgba[0];
 | |
|         var g = rgba[1];
 | |
|         var b = rgba[2];
 | |
|         var a = rgba[3];
 | |
|         return fromRgba(rgbaColour(r, g, b, a));
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var Cell = function (initial) {
 | |
|       var value = initial;
 | |
|       var get = function () {
 | |
|         return value;
 | |
|       };
 | |
|       var set = function (v) {
 | |
|         value = v;
 | |
|       };
 | |
|       return {
 | |
|         get: get,
 | |
|         set: set
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var singleton = function (doRevoke) {
 | |
|       var subject = Cell(Optional.none());
 | |
|       var revoke = function () {
 | |
|         return subject.get().each(doRevoke);
 | |
|       };
 | |
|       var clear = function () {
 | |
|         revoke();
 | |
|         subject.set(Optional.none());
 | |
|       };
 | |
|       var isSet = function () {
 | |
|         return subject.get().isSome();
 | |
|       };
 | |
|       var get = function () {
 | |
|         return subject.get();
 | |
|       };
 | |
|       var set = function (s) {
 | |
|         revoke();
 | |
|         subject.set(Optional.some(s));
 | |
|       };
 | |
|       return {
 | |
|         clear: clear,
 | |
|         isSet: isSet,
 | |
|         get: get,
 | |
|         set: set
 | |
|       };
 | |
|     };
 | |
|     var unbindable = function () {
 | |
|       return singleton(function (s) {
 | |
|         return s.unbind();
 | |
|       });
 | |
|     };
 | |
|     var value = function () {
 | |
|       var subject = singleton(noop);
 | |
|       var on = function (f) {
 | |
|         return subject.get().each(f);
 | |
|       };
 | |
|       return __assign(__assign({}, subject), { on: on });
 | |
|     };
 | |
| 
 | |
|     var onSetupToggle = function (editor, selections, formatName, formatValue) {
 | |
|       return function (api) {
 | |
|         var boundCallback = unbindable();
 | |
|         var isNone = isEmpty$1(formatValue);
 | |
|         var init = function () {
 | |
|           var selectedCells = getCellsFromSelection(selections);
 | |
|           var checkNode = function (cell) {
 | |
|             return editor.formatter.match(formatName, { value: formatValue }, cell.dom, isNone);
 | |
|           };
 | |
|           if (isNone) {
 | |
|             api.setActive(!exists(selectedCells, checkNode));
 | |
|             boundCallback.set(editor.formatter.formatChanged(formatName, function (match) {
 | |
|               return api.setActive(!match);
 | |
|             }, true));
 | |
|           } else {
 | |
|             api.setActive(forall(selectedCells, checkNode));
 | |
|             boundCallback.set(editor.formatter.formatChanged(formatName, api.setActive, false, { value: formatValue }));
 | |
|           }
 | |
|         };
 | |
|         editor.initialized ? init() : editor.on('init', init);
 | |
|         return boundCallback.clear;
 | |
|       };
 | |
|     };
 | |
|     var isListGroup = function (item) {
 | |
|       return hasNonNullableKey(item, 'menu');
 | |
|     };
 | |
|     var buildListItems = function (items) {
 | |
|       return map$1(items, function (item) {
 | |
|         var text = item.text || item.title;
 | |
|         if (isListGroup(item)) {
 | |
|           return {
 | |
|             text: text,
 | |
|             items: buildListItems(item.menu)
 | |
|           };
 | |
|         } else {
 | |
|           return {
 | |
|             text: text,
 | |
|             value: item.value
 | |
|           };
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var buildMenuItems = function (editor, selections, items, format, onAction) {
 | |
|       return map$1(items, function (item) {
 | |
|         var text = item.text || item.title;
 | |
|         if (isListGroup(item)) {
 | |
|           return {
 | |
|             type: 'nestedmenuitem',
 | |
|             text: text,
 | |
|             getSubmenuItems: function () {
 | |
|               return buildMenuItems(editor, selections, item.menu, format, onAction);
 | |
|             }
 | |
|           };
 | |
|         } else {
 | |
|           return {
 | |
|             text: text,
 | |
|             type: 'togglemenuitem',
 | |
|             onAction: function () {
 | |
|               return onAction(item.value);
 | |
|             },
 | |
|             onSetup: onSetupToggle(editor, selections, format, item.value)
 | |
|           };
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var applyTableCellStyle = function (editor, style) {
 | |
|       return function (value) {
 | |
|         var _a;
 | |
|         editor.execCommand('mceTableApplyCellStyle', false, (_a = {}, _a[style] = value, _a));
 | |
|       };
 | |
|     };
 | |
|     var filterNoneItem = function (list) {
 | |
|       return bind$2(list, function (item) {
 | |
|         if (isListGroup(item)) {
 | |
|           return [__assign(__assign({}, item), { menu: filterNoneItem(item.menu) })];
 | |
|         } else {
 | |
|           return isNotEmpty(item.value) ? [item] : [];
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var generateMenuItemsCallback = function (editor, selections, items, format, onAction) {
 | |
|       return function (callback) {
 | |
|         return callback(buildMenuItems(editor, selections, items, format, onAction));
 | |
|       };
 | |
|     };
 | |
|     var buildColorMenu = function (editor, colorList, style) {
 | |
|       var colorMap = map$1(colorList, function (entry) {
 | |
|         return {
 | |
|           text: entry.title,
 | |
|           value: '#' + anyToHex(entry.value).value,
 | |
|           type: 'choiceitem'
 | |
|         };
 | |
|       });
 | |
|       return [{
 | |
|           type: 'fancymenuitem',
 | |
|           fancytype: 'colorswatch',
 | |
|           initData: {
 | |
|             colors: colorMap.length > 0 ? colorMap : undefined,
 | |
|             allowCustomColors: false
 | |
|           },
 | |
|           onAction: function (data) {
 | |
|             var _a;
 | |
|             var value = data.value === 'remove' ? '' : data.value;
 | |
|             editor.execCommand('mceTableApplyCellStyle', false, (_a = {}, _a[style] = value, _a));
 | |
|           }
 | |
|         }];
 | |
|     };
 | |
|     var changeRowHeader = function (editor) {
 | |
|       return function () {
 | |
|         var currentType = editor.queryCommandValue('mceTableRowType');
 | |
|         var newType = currentType === 'header' ? 'body' : 'header';
 | |
|         editor.execCommand('mceTableRowType', false, { type: newType });
 | |
|       };
 | |
|     };
 | |
|     var changeColumnHeader = function (editor) {
 | |
|       return function () {
 | |
|         var currentType = editor.queryCommandValue('mceTableColType');
 | |
|         var newType = currentType === 'th' ? 'td' : 'th';
 | |
|         editor.execCommand('mceTableColType', false, { type: newType });
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var getClassList$1 = function (editor) {
 | |
|       var classes = buildListItems(getCellClassList(editor));
 | |
|       if (classes.length > 0) {
 | |
|         return Optional.some({
 | |
|           name: 'class',
 | |
|           type: 'listbox',
 | |
|           label: 'Class',
 | |
|           items: classes
 | |
|         });
 | |
|       }
 | |
|       return Optional.none();
 | |
|     };
 | |
|     var children = [
 | |
|       {
 | |
|         name: 'width',
 | |
|         type: 'input',
 | |
|         label: 'Width'
 | |
|       },
 | |
|       {
 | |
|         name: 'height',
 | |
|         type: 'input',
 | |
|         label: 'Height'
 | |
|       },
 | |
|       {
 | |
|         name: 'celltype',
 | |
|         type: 'listbox',
 | |
|         label: 'Cell type',
 | |
|         items: [
 | |
|           {
 | |
|             text: 'Cell',
 | |
|             value: 'td'
 | |
|           },
 | |
|           {
 | |
|             text: 'Header cell',
 | |
|             value: 'th'
 | |
|           }
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         name: 'scope',
 | |
|         type: 'listbox',
 | |
|         label: 'Scope',
 | |
|         items: [
 | |
|           {
 | |
|             text: 'None',
 | |
|             value: ''
 | |
|           },
 | |
|           {
 | |
|             text: 'Row',
 | |
|             value: 'row'
 | |
|           },
 | |
|           {
 | |
|             text: 'Column',
 | |
|             value: 'col'
 | |
|           },
 | |
|           {
 | |
|             text: 'Row group',
 | |
|             value: 'rowgroup'
 | |
|           },
 | |
|           {
 | |
|             text: 'Column group',
 | |
|             value: 'colgroup'
 | |
|           }
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         name: 'halign',
 | |
|         type: 'listbox',
 | |
|         label: 'Horizontal align',
 | |
|         items: [
 | |
|           {
 | |
|             text: 'None',
 | |
|             value: ''
 | |
|           },
 | |
|           {
 | |
|             text: 'Left',
 | |
|             value: 'left'
 | |
|           },
 | |
|           {
 | |
|             text: 'Center',
 | |
|             value: 'center'
 | |
|           },
 | |
|           {
 | |
|             text: 'Right',
 | |
|             value: 'right'
 | |
|           }
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         name: 'valign',
 | |
|         type: 'listbox',
 | |
|         label: 'Vertical align',
 | |
|         items: verticalAlignValues
 | |
|       }
 | |
|     ];
 | |
|     var getItems$2 = function (editor) {
 | |
|       return children.concat(getClassList$1(editor).toArray());
 | |
|     };
 | |
| 
 | |
|     var getAdvancedTab = function (editor, dialogName) {
 | |
|       var emptyBorderStyle = [{
 | |
|           text: 'Select...',
 | |
|           value: ''
 | |
|         }];
 | |
|       var advTabItems = [
 | |
|         {
 | |
|           name: 'borderstyle',
 | |
|           type: 'listbox',
 | |
|           label: 'Border style',
 | |
|           items: emptyBorderStyle.concat(buildListItems(getTableBorderStyles(editor)))
 | |
|         },
 | |
|         {
 | |
|           name: 'bordercolor',
 | |
|           type: 'colorinput',
 | |
|           label: 'Border color'
 | |
|         },
 | |
|         {
 | |
|           name: 'backgroundcolor',
 | |
|           type: 'colorinput',
 | |
|           label: 'Background color'
 | |
|         }
 | |
|       ];
 | |
|       var borderWidth = {
 | |
|         name: 'borderwidth',
 | |
|         type: 'input',
 | |
|         label: 'Border width'
 | |
|       };
 | |
|       var items = dialogName === 'cell' ? [borderWidth].concat(advTabItems) : advTabItems;
 | |
|       return {
 | |
|         title: 'Advanced',
 | |
|         name: 'advanced',
 | |
|         items: items
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var modifiers = function (testTruthy) {
 | |
|       return function (editor, node) {
 | |
|         var dom = editor.dom;
 | |
|         var setAttrib = function (attr, value) {
 | |
|           if (!testTruthy || value) {
 | |
|             dom.setAttrib(node, attr, value);
 | |
|           }
 | |
|         };
 | |
|         var setStyle = function (prop, value) {
 | |
|           if (!testTruthy || value) {
 | |
|             dom.setStyle(node, prop, value);
 | |
|           }
 | |
|         };
 | |
|         var setFormat = function (formatName, value) {
 | |
|           if (!testTruthy || value) {
 | |
|             if (value === '') {
 | |
|               editor.formatter.remove(formatName, { value: null }, node, true);
 | |
|             } else {
 | |
|               editor.formatter.apply(formatName, { value: value }, node);
 | |
|             }
 | |
|           }
 | |
|         };
 | |
|         return {
 | |
|           setAttrib: setAttrib,
 | |
|           setStyle: setStyle,
 | |
|           setFormat: setFormat
 | |
|         };
 | |
|       };
 | |
|     };
 | |
|     var DomModifier = {
 | |
|       normal: modifiers(false),
 | |
|       ifTruthy: modifiers(true)
 | |
|     };
 | |
| 
 | |
|     var rgbToHex = function (dom) {
 | |
|       return function (value) {
 | |
|         return startsWith(value, 'rgb') ? dom.toHex(value) : value;
 | |
|       };
 | |
|     };
 | |
|     var extractAdvancedStyles = function (dom, elm) {
 | |
|       var element = SugarElement.fromDom(elm);
 | |
|       return {
 | |
|         borderwidth: getRaw$2(element, 'border-width').getOr(''),
 | |
|         borderstyle: getRaw$2(element, 'border-style').getOr(''),
 | |
|         bordercolor: getRaw$2(element, 'border-color').map(rgbToHex(dom)).getOr(''),
 | |
|         backgroundcolor: getRaw$2(element, 'background-color').map(rgbToHex(dom)).getOr('')
 | |
|       };
 | |
|     };
 | |
|     var getSharedValues = function (data) {
 | |
|       var baseData = data[0];
 | |
|       var comparisonData = data.slice(1);
 | |
|       each$2(comparisonData, function (items) {
 | |
|         each$2(keys(baseData), function (key) {
 | |
|           each$1(items, function (itemValue, itemKey) {
 | |
|             var comparisonValue = baseData[key];
 | |
|             if (comparisonValue !== '' && key === itemKey) {
 | |
|               if (comparisonValue !== itemValue) {
 | |
|                 baseData[key] = '';
 | |
|               }
 | |
|             }
 | |
|           });
 | |
|         });
 | |
|       });
 | |
|       return baseData;
 | |
|     };
 | |
|     var getAlignment = function (formats, formatName, editor, elm) {
 | |
|       return find$1(formats, function (name) {
 | |
|         return !isUndefined(editor.formatter.matchNode(elm, formatName + name));
 | |
|       }).getOr('');
 | |
|     };
 | |
|     var getHAlignment = curry(getAlignment, [
 | |
|       'left',
 | |
|       'center',
 | |
|       'right'
 | |
|     ], 'align');
 | |
|     var getVAlignment = curry(getAlignment, [
 | |
|       'top',
 | |
|       'middle',
 | |
|       'bottom'
 | |
|     ], 'valign');
 | |
|     var extractDataFromSettings = function (editor, hasAdvTableTab) {
 | |
|       var style = getDefaultStyles(editor);
 | |
|       var attrs = getDefaultAttributes(editor);
 | |
|       var extractAdvancedStyleData = function (dom) {
 | |
|         return {
 | |
|           borderstyle: get$c(style, 'border-style').getOr(''),
 | |
|           bordercolor: rgbToHex(dom)(get$c(style, 'border-color').getOr('')),
 | |
|           backgroundcolor: rgbToHex(dom)(get$c(style, 'background-color').getOr(''))
 | |
|         };
 | |
|       };
 | |
|       var defaultData = {
 | |
|         height: '',
 | |
|         width: '100%',
 | |
|         cellspacing: '',
 | |
|         cellpadding: '',
 | |
|         caption: false,
 | |
|         class: '',
 | |
|         align: '',
 | |
|         border: ''
 | |
|       };
 | |
|       var getBorder = function () {
 | |
|         var borderWidth = style['border-width'];
 | |
|         if (shouldStyleWithCss(editor) && borderWidth) {
 | |
|           return { border: borderWidth };
 | |
|         }
 | |
|         return get$c(attrs, 'border').fold(function () {
 | |
|           return {};
 | |
|         }, function (border) {
 | |
|           return { border: border };
 | |
|         });
 | |
|       };
 | |
|       var advStyle = hasAdvTableTab ? extractAdvancedStyleData(editor.dom) : {};
 | |
|       var getCellPaddingCellSpacing = function () {
 | |
|         var spacing = get$c(style, 'border-spacing').or(get$c(attrs, 'cellspacing')).fold(function () {
 | |
|           return {};
 | |
|         }, function (cellspacing) {
 | |
|           return { cellspacing: cellspacing };
 | |
|         });
 | |
|         var padding = get$c(style, 'border-padding').or(get$c(attrs, 'cellpadding')).fold(function () {
 | |
|           return {};
 | |
|         }, function (cellpadding) {
 | |
|           return { cellpadding: cellpadding };
 | |
|         });
 | |
|         return __assign(__assign({}, spacing), padding);
 | |
|       };
 | |
|       var data = __assign(__assign(__assign(__assign(__assign(__assign({}, defaultData), style), attrs), advStyle), getBorder()), getCellPaddingCellSpacing());
 | |
|       return data;
 | |
|     };
 | |
|     var getRowType = function (elm) {
 | |
|       return table(SugarElement.fromDom(elm)).map(function (table) {
 | |
|         var target = { selection: fromDom(elm.cells) };
 | |
|         return getRowsType(table, target);
 | |
|       }).getOr('');
 | |
|     };
 | |
|     var extractDataFromTableElement = function (editor, elm, hasAdvTableTab) {
 | |
|       var getBorder = function (dom, elm) {
 | |
|         var optBorderWidth = getRaw$2(SugarElement.fromDom(elm), 'border-width');
 | |
|         if (shouldStyleWithCss(editor) && optBorderWidth.isSome()) {
 | |
|           return optBorderWidth.getOr('');
 | |
|         }
 | |
|         return dom.getAttrib(elm, 'border') || getTDTHOverallStyle(editor.dom, elm, 'border-width') || getTDTHOverallStyle(editor.dom, elm, 'border');
 | |
|       };
 | |
|       var dom = editor.dom;
 | |
|       var cellspacing = shouldStyleWithCss(editor) ? dom.getStyle(elm, 'border-spacing') || dom.getAttrib(elm, 'cellspacing') : dom.getAttrib(elm, 'cellspacing') || dom.getStyle(elm, 'border-spacing');
 | |
|       var cellpadding = shouldStyleWithCss(editor) ? getTDTHOverallStyle(dom, elm, 'padding') || dom.getAttrib(elm, 'cellpadding') : dom.getAttrib(elm, 'cellpadding') || getTDTHOverallStyle(dom, elm, 'padding');
 | |
|       return __assign({
 | |
|         width: dom.getStyle(elm, 'width') || dom.getAttrib(elm, 'width'),
 | |
|         height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'),
 | |
|         cellspacing: cellspacing,
 | |
|         cellpadding: cellpadding,
 | |
|         border: getBorder(dom, elm),
 | |
|         caption: !!dom.select('caption', elm)[0],
 | |
|         class: dom.getAttrib(elm, 'class', ''),
 | |
|         align: getHAlignment(editor, elm)
 | |
|       }, hasAdvTableTab ? extractAdvancedStyles(dom, elm) : {});
 | |
|     };
 | |
|     var extractDataFromRowElement = function (editor, elm, hasAdvancedRowTab) {
 | |
|       var dom = editor.dom;
 | |
|       return __assign({
 | |
|         height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'),
 | |
|         class: dom.getAttrib(elm, 'class', ''),
 | |
|         type: getRowType(elm),
 | |
|         align: getHAlignment(editor, elm)
 | |
|       }, hasAdvancedRowTab ? extractAdvancedStyles(dom, elm) : {});
 | |
|     };
 | |
|     var extractDataFromCellElement = function (editor, cell, hasAdvancedCellTab, column) {
 | |
|       var dom = editor.dom;
 | |
|       var colElm = column.getOr(cell);
 | |
|       var getStyle = function (element, style) {
 | |
|         return dom.getStyle(element, style) || dom.getAttrib(element, style);
 | |
|       };
 | |
|       return __assign({
 | |
|         width: getStyle(colElm, 'width'),
 | |
|         height: getStyle(cell, 'height'),
 | |
|         scope: dom.getAttrib(cell, 'scope'),
 | |
|         celltype: getNodeName(cell),
 | |
|         class: dom.getAttrib(cell, 'class', ''),
 | |
|         halign: getHAlignment(editor, cell),
 | |
|         valign: getVAlignment(editor, cell)
 | |
|       }, hasAdvancedCellTab ? extractAdvancedStyles(dom, cell) : {});
 | |
|     };
 | |
| 
 | |
|     var getSelectedCells = function (table, cells) {
 | |
|       var warehouse = Warehouse.fromTable(table);
 | |
|       var allCells = Warehouse.justCells(warehouse);
 | |
|       var filtered = filter$2(allCells, function (cellA) {
 | |
|         return exists(cells, function (cellB) {
 | |
|           return eq$1(cellA.element, cellB);
 | |
|         });
 | |
|       });
 | |
|       return map$1(filtered, function (cell) {
 | |
|         return {
 | |
|           element: cell.element.dom,
 | |
|           column: Warehouse.getColumnAt(warehouse, cell.column).map(function (col) {
 | |
|             return col.element.dom;
 | |
|           })
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|     var updateSimpleProps$1 = function (modifier, colModifier, data) {
 | |
|       modifier.setAttrib('scope', data.scope);
 | |
|       modifier.setAttrib('class', data.class);
 | |
|       modifier.setStyle('height', addPxSuffix(data.height));
 | |
|       colModifier.setStyle('width', addPxSuffix(data.width));
 | |
|     };
 | |
|     var updateAdvancedProps$1 = function (modifier, data) {
 | |
|       modifier.setFormat('tablecellbackgroundcolor', data.backgroundcolor);
 | |
|       modifier.setFormat('tablecellbordercolor', data.bordercolor);
 | |
|       modifier.setFormat('tablecellborderstyle', data.borderstyle);
 | |
|       modifier.setFormat('tablecellborderwidth', addPxSuffix(data.borderwidth));
 | |
|     };
 | |
|     var applyStyleData$1 = function (editor, cells, data) {
 | |
|       var isSingleCell = cells.length === 1;
 | |
|       each$2(cells, function (item) {
 | |
|         var cellElm = item.element;
 | |
|         var modifier = isSingleCell ? DomModifier.normal(editor, cellElm) : DomModifier.ifTruthy(editor, cellElm);
 | |
|         var colModifier = item.column.map(function (col) {
 | |
|           return isSingleCell ? DomModifier.normal(editor, col) : DomModifier.ifTruthy(editor, col);
 | |
|         }).getOr(modifier);
 | |
|         updateSimpleProps$1(modifier, colModifier, data);
 | |
|         if (hasAdvancedCellTab(editor)) {
 | |
|           updateAdvancedProps$1(modifier, data);
 | |
|         }
 | |
|         if (isSingleCell) {
 | |
|           unApplyAlign(editor, cellElm);
 | |
|           unApplyVAlign(editor, cellElm);
 | |
|         }
 | |
|         if (data.halign) {
 | |
|           applyAlign(editor, cellElm, data.halign);
 | |
|         }
 | |
|         if (data.valign) {
 | |
|           applyVAlign(editor, cellElm, data.valign);
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var applyStructureData$1 = function (editor, data) {
 | |
|       editor.execCommand('mceTableCellType', false, {
 | |
|         type: data.celltype,
 | |
|         no_events: true
 | |
|       });
 | |
|     };
 | |
|     var applyCellData = function (editor, cells, oldData, data) {
 | |
|       var modifiedData = filter$1(data, function (value, key) {
 | |
|         return oldData[key] !== value;
 | |
|       });
 | |
|       if (size(modifiedData) > 0 && cells.length >= 1) {
 | |
|         table(cells[0]).each(function (table) {
 | |
|           var selectedCells = getSelectedCells(table, cells);
 | |
|           var styleModified = size(filter$1(modifiedData, function (_value, key) {
 | |
|             return key !== 'scope' && key !== 'celltype';
 | |
|           })) > 0;
 | |
|           var structureModified = has$1(modifiedData, 'celltype');
 | |
|           if (styleModified || has$1(modifiedData, 'scope')) {
 | |
|             applyStyleData$1(editor, selectedCells, data);
 | |
|           }
 | |
|           if (structureModified) {
 | |
|             applyStructureData$1(editor, data);
 | |
|           }
 | |
|           fireTableModified(editor, table.dom, {
 | |
|             structure: structureModified,
 | |
|             style: styleModified
 | |
|           });
 | |
|         });
 | |
|       }
 | |
|     };
 | |
|     var onSubmitCellForm = function (editor, cells, oldData, api) {
 | |
|       var data = api.getData();
 | |
|       api.close();
 | |
|       editor.undoManager.transact(function () {
 | |
|         applyCellData(editor, cells, oldData, data);
 | |
|         editor.focus();
 | |
|       });
 | |
|     };
 | |
|     var getData = function (editor, cells) {
 | |
|       var cellsData = table(cells[0]).map(function (table) {
 | |
|         return map$1(getSelectedCells(table, cells), function (item) {
 | |
|           return extractDataFromCellElement(editor, item.element, hasAdvancedCellTab(editor), item.column);
 | |
|         });
 | |
|       });
 | |
|       return getSharedValues(cellsData.getOrDie());
 | |
|     };
 | |
|     var open$2 = function (editor, selections) {
 | |
|       var cells = getCellsFromSelection(selections);
 | |
|       if (cells.length === 0) {
 | |
|         return;
 | |
|       }
 | |
|       var data = getData(editor, cells);
 | |
|       var dialogTabPanel = {
 | |
|         type: 'tabpanel',
 | |
|         tabs: [
 | |
|           {
 | |
|             title: 'General',
 | |
|             name: 'general',
 | |
|             items: getItems$2(editor)
 | |
|           },
 | |
|           getAdvancedTab(editor, 'cell')
 | |
|         ]
 | |
|       };
 | |
|       var dialogPanel = {
 | |
|         type: 'panel',
 | |
|         items: [{
 | |
|             type: 'grid',
 | |
|             columns: 2,
 | |
|             items: getItems$2(editor)
 | |
|           }]
 | |
|       };
 | |
|       editor.windowManager.open({
 | |
|         title: 'Cell Properties',
 | |
|         size: 'normal',
 | |
|         body: hasAdvancedCellTab(editor) ? dialogTabPanel : dialogPanel,
 | |
|         buttons: [
 | |
|           {
 | |
|             type: 'cancel',
 | |
|             name: 'cancel',
 | |
|             text: 'Cancel'
 | |
|           },
 | |
|           {
 | |
|             type: 'submit',
 | |
|             name: 'save',
 | |
|             text: 'Save',
 | |
|             primary: true
 | |
|           }
 | |
|         ],
 | |
|         initialData: data,
 | |
|         onSubmit: curry(onSubmitCellForm, editor, cells, data)
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var getClassList = function (editor) {
 | |
|       var classes = buildListItems(getRowClassList(editor));
 | |
|       if (classes.length > 0) {
 | |
|         return Optional.some({
 | |
|           name: 'class',
 | |
|           type: 'listbox',
 | |
|           label: 'Class',
 | |
|           items: classes
 | |
|         });
 | |
|       }
 | |
|       return Optional.none();
 | |
|     };
 | |
|     var formChildren = [
 | |
|       {
 | |
|         type: 'listbox',
 | |
|         name: 'type',
 | |
|         label: 'Row type',
 | |
|         items: [
 | |
|           {
 | |
|             text: 'Header',
 | |
|             value: 'header'
 | |
|           },
 | |
|           {
 | |
|             text: 'Body',
 | |
|             value: 'body'
 | |
|           },
 | |
|           {
 | |
|             text: 'Footer',
 | |
|             value: 'footer'
 | |
|           }
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         type: 'listbox',
 | |
|         name: 'align',
 | |
|         label: 'Alignment',
 | |
|         items: [
 | |
|           {
 | |
|             text: 'None',
 | |
|             value: ''
 | |
|           },
 | |
|           {
 | |
|             text: 'Left',
 | |
|             value: 'left'
 | |
|           },
 | |
|           {
 | |
|             text: 'Center',
 | |
|             value: 'center'
 | |
|           },
 | |
|           {
 | |
|             text: 'Right',
 | |
|             value: 'right'
 | |
|           }
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         label: 'Height',
 | |
|         name: 'height',
 | |
|         type: 'input'
 | |
|       }
 | |
|     ];
 | |
|     var getItems$1 = function (editor) {
 | |
|       return formChildren.concat(getClassList(editor).toArray());
 | |
|     };
 | |
| 
 | |
|     var updateSimpleProps = function (modifier, data) {
 | |
|       modifier.setAttrib('class', data.class);
 | |
|       modifier.setStyle('height', addPxSuffix(data.height));
 | |
|     };
 | |
|     var updateAdvancedProps = function (modifier, data) {
 | |
|       modifier.setStyle('background-color', data.backgroundcolor);
 | |
|       modifier.setStyle('border-color', data.bordercolor);
 | |
|       modifier.setStyle('border-style', data.borderstyle);
 | |
|     };
 | |
|     var applyStyleData = function (editor, rows, data, oldData) {
 | |
|       var isSingleRow = rows.length === 1;
 | |
|       each$2(rows, function (rowElm) {
 | |
|         var modifier = isSingleRow ? DomModifier.normal(editor, rowElm) : DomModifier.ifTruthy(editor, rowElm);
 | |
|         updateSimpleProps(modifier, data);
 | |
|         if (hasAdvancedRowTab(editor)) {
 | |
|           updateAdvancedProps(modifier, data);
 | |
|         }
 | |
|         if (data.align !== oldData.align) {
 | |
|           unApplyAlign(editor, rowElm);
 | |
|           applyAlign(editor, rowElm, data.align);
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var applyStructureData = function (editor, data) {
 | |
|       editor.execCommand('mceTableRowType', false, {
 | |
|         type: data.type,
 | |
|         no_events: true
 | |
|       });
 | |
|     };
 | |
|     var applyRowData = function (editor, rows, oldData, data) {
 | |
|       var modifiedData = filter$1(data, function (value, key) {
 | |
|         return oldData[key] !== value;
 | |
|       });
 | |
|       if (size(modifiedData) > 0) {
 | |
|         var typeModified_1 = has$1(modifiedData, 'type');
 | |
|         var styleModified_1 = typeModified_1 ? size(modifiedData) > 1 : true;
 | |
|         if (styleModified_1) {
 | |
|           applyStyleData(editor, rows, data, oldData);
 | |
|         }
 | |
|         if (typeModified_1) {
 | |
|           applyStructureData(editor, data);
 | |
|         }
 | |
|         table(SugarElement.fromDom(rows[0])).each(function (table) {
 | |
|           return fireTableModified(editor, table.dom, {
 | |
|             structure: typeModified_1,
 | |
|             style: styleModified_1
 | |
|           });
 | |
|         });
 | |
|       }
 | |
|     };
 | |
|     var onSubmitRowForm = function (editor, rows, oldData, api) {
 | |
|       var data = api.getData();
 | |
|       api.close();
 | |
|       editor.undoManager.transact(function () {
 | |
|         applyRowData(editor, rows, oldData, data);
 | |
|         editor.focus();
 | |
|       });
 | |
|     };
 | |
|     var open$1 = function (editor) {
 | |
|       var rows = getRowsFromSelection(getSelectionStart(editor), ephemera.selected);
 | |
|       if (rows.length === 0) {
 | |
|         return;
 | |
|       }
 | |
|       var rowsData = map$1(rows, function (rowElm) {
 | |
|         return extractDataFromRowElement(editor, rowElm.dom, hasAdvancedRowTab(editor));
 | |
|       });
 | |
|       var data = getSharedValues(rowsData);
 | |
|       var dialogTabPanel = {
 | |
|         type: 'tabpanel',
 | |
|         tabs: [
 | |
|           {
 | |
|             title: 'General',
 | |
|             name: 'general',
 | |
|             items: getItems$1(editor)
 | |
|           },
 | |
|           getAdvancedTab(editor, 'row')
 | |
|         ]
 | |
|       };
 | |
|       var dialogPanel = {
 | |
|         type: 'panel',
 | |
|         items: [{
 | |
|             type: 'grid',
 | |
|             columns: 2,
 | |
|             items: getItems$1(editor)
 | |
|           }]
 | |
|       };
 | |
|       editor.windowManager.open({
 | |
|         title: 'Row Properties',
 | |
|         size: 'normal',
 | |
|         body: hasAdvancedRowTab(editor) ? dialogTabPanel : dialogPanel,
 | |
|         buttons: [
 | |
|           {
 | |
|             type: 'cancel',
 | |
|             name: 'cancel',
 | |
|             text: 'Cancel'
 | |
|           },
 | |
|           {
 | |
|             type: 'submit',
 | |
|             name: 'save',
 | |
|             text: 'Save',
 | |
|             primary: true
 | |
|           }
 | |
|         ],
 | |
|         initialData: data,
 | |
|         onSubmit: curry(onSubmitRowForm, editor, map$1(rows, function (r) {
 | |
|           return r.dom;
 | |
|         }), data)
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var getItems = function (editor, classes, insertNewTable) {
 | |
|       var rowColCountItems = !insertNewTable ? [] : [
 | |
|         {
 | |
|           type: 'input',
 | |
|           name: 'cols',
 | |
|           label: 'Cols',
 | |
|           inputMode: 'numeric'
 | |
|         },
 | |
|         {
 | |
|           type: 'input',
 | |
|           name: 'rows',
 | |
|           label: 'Rows',
 | |
|           inputMode: 'numeric'
 | |
|         }
 | |
|       ];
 | |
|       var alwaysItems = [
 | |
|         {
 | |
|           type: 'input',
 | |
|           name: 'width',
 | |
|           label: 'Width'
 | |
|         },
 | |
|         {
 | |
|           type: 'input',
 | |
|           name: 'height',
 | |
|           label: 'Height'
 | |
|         }
 | |
|       ];
 | |
|       var appearanceItems = hasAppearanceOptions(editor) ? [
 | |
|         {
 | |
|           type: 'input',
 | |
|           name: 'cellspacing',
 | |
|           label: 'Cell spacing',
 | |
|           inputMode: 'numeric'
 | |
|         },
 | |
|         {
 | |
|           type: 'input',
 | |
|           name: 'cellpadding',
 | |
|           label: 'Cell padding',
 | |
|           inputMode: 'numeric'
 | |
|         },
 | |
|         {
 | |
|           type: 'input',
 | |
|           name: 'border',
 | |
|           label: 'Border width'
 | |
|         },
 | |
|         {
 | |
|           type: 'label',
 | |
|           label: 'Caption',
 | |
|           items: [{
 | |
|               type: 'checkbox',
 | |
|               name: 'caption',
 | |
|               label: 'Show caption'
 | |
|             }]
 | |
|         }
 | |
|       ] : [];
 | |
|       var alignmentItem = [{
 | |
|           type: 'listbox',
 | |
|           name: 'align',
 | |
|           label: 'Alignment',
 | |
|           items: [
 | |
|             {
 | |
|               text: 'None',
 | |
|               value: ''
 | |
|             },
 | |
|             {
 | |
|               text: 'Left',
 | |
|               value: 'left'
 | |
|             },
 | |
|             {
 | |
|               text: 'Center',
 | |
|               value: 'center'
 | |
|             },
 | |
|             {
 | |
|               text: 'Right',
 | |
|               value: 'right'
 | |
|             }
 | |
|           ]
 | |
|         }];
 | |
|       var classListItem = classes.length > 0 ? [{
 | |
|           type: 'listbox',
 | |
|           name: 'class',
 | |
|           label: 'Class',
 | |
|           items: classes
 | |
|         }] : [];
 | |
|       return rowColCountItems.concat(alwaysItems).concat(appearanceItems).concat(alignmentItem).concat(classListItem);
 | |
|     };
 | |
| 
 | |
|     var styleTDTH = function (dom, elm, name, value) {
 | |
|       if (elm.tagName === 'TD' || elm.tagName === 'TH') {
 | |
|         if (isString(name)) {
 | |
|           dom.setStyle(elm, name, value);
 | |
|         } else {
 | |
|           dom.setStyle(elm, name);
 | |
|         }
 | |
|       } else {
 | |
|         if (elm.children) {
 | |
|           for (var i = 0; i < elm.children.length; i++) {
 | |
|             styleTDTH(dom, elm.children[i], name, value);
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     };
 | |
|     var applyDataToElement = function (editor, tableElm, data) {
 | |
|       var dom = editor.dom;
 | |
|       var attrs = {};
 | |
|       var styles = {};
 | |
|       attrs.class = data.class;
 | |
|       styles.height = addPxSuffix(data.height);
 | |
|       if (dom.getAttrib(tableElm, 'width') && !shouldStyleWithCss(editor)) {
 | |
|         attrs.width = removePxSuffix(data.width);
 | |
|       } else {
 | |
|         styles.width = addPxSuffix(data.width);
 | |
|       }
 | |
|       if (shouldStyleWithCss(editor)) {
 | |
|         styles['border-width'] = addPxSuffix(data.border);
 | |
|         styles['border-spacing'] = addPxSuffix(data.cellspacing);
 | |
|       } else {
 | |
|         attrs.border = data.border;
 | |
|         attrs.cellpadding = data.cellpadding;
 | |
|         attrs.cellspacing = data.cellspacing;
 | |
|       }
 | |
|       if (shouldStyleWithCss(editor) && tableElm.children) {
 | |
|         for (var i = 0; i < tableElm.children.length; i++) {
 | |
|           styleTDTH(dom, tableElm.children[i], {
 | |
|             'border-width': addPxSuffix(data.border),
 | |
|             'padding': addPxSuffix(data.cellpadding)
 | |
|           });
 | |
|           if (hasAdvancedTableTab(editor)) {
 | |
|             styleTDTH(dom, tableElm.children[i], { 'border-color': data.bordercolor });
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       if (hasAdvancedTableTab(editor)) {
 | |
|         styles['background-color'] = data.backgroundcolor;
 | |
|         styles['border-color'] = data.bordercolor;
 | |
|         styles['border-style'] = data.borderstyle;
 | |
|       }
 | |
|       attrs.style = dom.serializeStyle(__assign(__assign({}, getDefaultStyles(editor)), styles));
 | |
|       dom.setAttribs(tableElm, __assign(__assign({}, getDefaultAttributes(editor)), attrs));
 | |
|     };
 | |
|     var onSubmitTableForm = function (editor, tableElm, oldData, api) {
 | |
|       var dom = editor.dom;
 | |
|       var data = api.getData();
 | |
|       var modifiedData = filter$1(data, function (value, key) {
 | |
|         return oldData[key] !== value;
 | |
|       });
 | |
|       api.close();
 | |
|       if (data.class === '') {
 | |
|         delete data.class;
 | |
|       }
 | |
|       editor.undoManager.transact(function () {
 | |
|         if (!tableElm) {
 | |
|           var cols = parseInt(data.cols, 10) || 1;
 | |
|           var rows = parseInt(data.rows, 10) || 1;
 | |
|           tableElm = insert(editor, cols, rows, 0, 0);
 | |
|         }
 | |
|         if (size(modifiedData) > 0) {
 | |
|           applyDataToElement(editor, tableElm, data);
 | |
|           var captionElm = dom.select('caption', tableElm)[0];
 | |
|           if (captionElm && !data.caption || !captionElm && data.caption) {
 | |
|             editor.execCommand('mceTableToggleCaption');
 | |
|           }
 | |
|           if (data.align === '') {
 | |
|             unApplyAlign(editor, tableElm);
 | |
|           } else {
 | |
|             applyAlign(editor, tableElm, data.align);
 | |
|           }
 | |
|         }
 | |
|         editor.focus();
 | |
|         editor.addVisual();
 | |
|         if (size(modifiedData) > 0) {
 | |
|           var captionModified = has$1(modifiedData, 'caption');
 | |
|           var styleModified = captionModified ? size(modifiedData) > 1 : true;
 | |
|           fireTableModified(editor, tableElm, {
 | |
|             structure: captionModified,
 | |
|             style: styleModified
 | |
|           });
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var open = function (editor, insertNewTable) {
 | |
|       var dom = editor.dom;
 | |
|       var tableElm;
 | |
|       var data = extractDataFromSettings(editor, hasAdvancedTableTab(editor));
 | |
|       if (insertNewTable === false) {
 | |
|         tableElm = dom.getParent(editor.selection.getStart(), 'table', editor.getBody());
 | |
|         if (tableElm) {
 | |
|           data = extractDataFromTableElement(editor, tableElm, hasAdvancedTableTab(editor));
 | |
|         } else {
 | |
|           if (hasAdvancedTableTab(editor)) {
 | |
|             data.borderstyle = '';
 | |
|             data.bordercolor = '';
 | |
|             data.backgroundcolor = '';
 | |
|           }
 | |
|         }
 | |
|       } else {
 | |
|         data.cols = '1';
 | |
|         data.rows = '1';
 | |
|         if (hasAdvancedTableTab(editor)) {
 | |
|           data.borderstyle = '';
 | |
|           data.bordercolor = '';
 | |
|           data.backgroundcolor = '';
 | |
|         }
 | |
|       }
 | |
|       var classes = buildListItems(getTableClassList(editor));
 | |
|       if (classes.length > 0) {
 | |
|         if (data.class) {
 | |
|           data.class = data.class.replace(/\s*mce\-item\-table\s*/g, '');
 | |
|         }
 | |
|       }
 | |
|       var generalPanel = {
 | |
|         type: 'grid',
 | |
|         columns: 2,
 | |
|         items: getItems(editor, classes, insertNewTable)
 | |
|       };
 | |
|       var nonAdvancedForm = function () {
 | |
|         return {
 | |
|           type: 'panel',
 | |
|           items: [generalPanel]
 | |
|         };
 | |
|       };
 | |
|       var advancedForm = function () {
 | |
|         return {
 | |
|           type: 'tabpanel',
 | |
|           tabs: [
 | |
|             {
 | |
|               title: 'General',
 | |
|               name: 'general',
 | |
|               items: [generalPanel]
 | |
|             },
 | |
|             getAdvancedTab(editor, 'table')
 | |
|           ]
 | |
|         };
 | |
|       };
 | |
|       var dialogBody = hasAdvancedTableTab(editor) ? advancedForm() : nonAdvancedForm();
 | |
|       editor.windowManager.open({
 | |
|         title: 'Table Properties',
 | |
|         size: 'normal',
 | |
|         body: dialogBody,
 | |
|         onSubmit: curry(onSubmitTableForm, editor, tableElm, data),
 | |
|         buttons: [
 | |
|           {
 | |
|             type: 'cancel',
 | |
|             name: 'cancel',
 | |
|             text: 'Cancel'
 | |
|           },
 | |
|           {
 | |
|             type: 'submit',
 | |
|             name: 'save',
 | |
|             text: 'Save',
 | |
|             primary: true
 | |
|           }
 | |
|         ],
 | |
|         initialData: data
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var getSelectionStartCellOrCaption = function (editor) {
 | |
|       return getSelectionCellOrCaption(getSelectionStart(editor), getIsRoot(editor));
 | |
|     };
 | |
|     var getSelectionStartCell = function (editor) {
 | |
|       return getSelectionCell(getSelectionStart(editor), getIsRoot(editor));
 | |
|     };
 | |
|     var registerCommands = function (editor, actions, cellSelection, selections, clipboard) {
 | |
|       var isRoot = getIsRoot(editor);
 | |
|       var eraseTable = function () {
 | |
|         return getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) {
 | |
|           table(cellOrCaption, isRoot).filter(not(isRoot)).each(function (table) {
 | |
|             var cursor = SugarElement.fromText('');
 | |
|             after$5(table, cursor);
 | |
|             remove$5(table);
 | |
|             if (editor.dom.isEmpty(editor.getBody())) {
 | |
|               editor.setContent('');
 | |
|               editor.selection.setCursorLocation();
 | |
|             } else {
 | |
|               var rng = editor.dom.createRng();
 | |
|               rng.setStart(cursor.dom, 0);
 | |
|               rng.setEnd(cursor.dom, 0);
 | |
|               editor.selection.setRng(rng);
 | |
|               editor.nodeChanged();
 | |
|             }
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var setSizingMode = function (sizing) {
 | |
|         return getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) {
 | |
|           var isForcedSizing = isResponsiveForced(editor) || isPixelsForced(editor) || isPercentagesForced(editor);
 | |
|           if (!isForcedSizing) {
 | |
|             table(cellOrCaption, isRoot).each(function (table) {
 | |
|               if (sizing === 'relative' && !isPercentSizing(table)) {
 | |
|                 enforcePercentage(table);
 | |
|               } else if (sizing === 'fixed' && !isPixelSizing(table)) {
 | |
|                 enforcePixels(table);
 | |
|               } else if (sizing === 'responsive' && !isNoneSizing(table)) {
 | |
|                 enforceNone(table);
 | |
|               }
 | |
|               removeDataStyle(table);
 | |
|               fireTableModified(editor, table.dom, structureModified);
 | |
|             });
 | |
|           }
 | |
|         });
 | |
|       };
 | |
|       var getTableFromCell = function (cell) {
 | |
|         return table(cell, isRoot);
 | |
|       };
 | |
|       var performActionOnSelection = function (action) {
 | |
|         return getSelectionStartCell(editor).bind(function (cell) {
 | |
|           return getTableFromCell(cell).map(function (table) {
 | |
|             return action(table, cell);
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var toggleTableClass = function (_ui, clazz) {
 | |
|         performActionOnSelection(function (table) {
 | |
|           editor.formatter.toggle('tableclass', { value: clazz }, table.dom);
 | |
|           fireTableModified(editor, table.dom, styleModified);
 | |
|         });
 | |
|       };
 | |
|       var toggleTableCellClass = function (_ui, clazz) {
 | |
|         performActionOnSelection(function (table) {
 | |
|           var selectedCells = getCellsFromSelection(selections);
 | |
|           var allHaveClass = forall(selectedCells, function (cell) {
 | |
|             return editor.formatter.match('tablecellclass', { value: clazz }, cell.dom);
 | |
|           });
 | |
|           var formatterAction = allHaveClass ? editor.formatter.remove : editor.formatter.apply;
 | |
|           each$2(selectedCells, function (cell) {
 | |
|             return formatterAction('tablecellclass', { value: clazz }, cell.dom);
 | |
|           });
 | |
|           fireTableModified(editor, table.dom, styleModified);
 | |
|         });
 | |
|       };
 | |
|       var toggleCaption = function () {
 | |
|         getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) {
 | |
|           table(cellOrCaption, isRoot).each(function (table) {
 | |
|             child$1(table, 'caption').fold(function () {
 | |
|               var caption = SugarElement.fromTag('caption');
 | |
|               append$1(caption, SugarElement.fromText('Caption'));
 | |
|               appendAt(table, caption, 0);
 | |
|               editor.selection.setCursorLocation(caption.dom, 0);
 | |
|             }, function (caption) {
 | |
|               if (isTag('caption')(cellOrCaption)) {
 | |
|                 one('td', table).each(function (td) {
 | |
|                   return editor.selection.setCursorLocation(td.dom, 0);
 | |
|                 });
 | |
|               }
 | |
|               remove$5(caption);
 | |
|             });
 | |
|             fireTableModified(editor, table.dom, structureModified);
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var postExecute = function (_data) {
 | |
|         editor.focus();
 | |
|       };
 | |
|       var actOnSelection = function (execute, noEvents) {
 | |
|         if (noEvents === void 0) {
 | |
|           noEvents = false;
 | |
|         }
 | |
|         return performActionOnSelection(function (table, startCell) {
 | |
|           var targets = forMenu(selections, table, startCell);
 | |
|           execute(table, targets, noEvents).each(postExecute);
 | |
|         });
 | |
|       };
 | |
|       var copyRowSelection = function () {
 | |
|         return performActionOnSelection(function (table, startCell) {
 | |
|           var targets = forMenu(selections, table, startCell);
 | |
|           var generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), Optional.none());
 | |
|           return copyRows(table, targets, generators);
 | |
|         });
 | |
|       };
 | |
|       var copyColSelection = function () {
 | |
|         return performActionOnSelection(function (table, startCell) {
 | |
|           var targets = forMenu(selections, table, startCell);
 | |
|           return copyCols(table, targets);
 | |
|         });
 | |
|       };
 | |
|       var pasteOnSelection = function (execute, getRows) {
 | |
|         return getRows().each(function (rows) {
 | |
|           var clonedRows = map$1(rows, function (row) {
 | |
|             return deep(row);
 | |
|           });
 | |
|           performActionOnSelection(function (table, startCell) {
 | |
|             var generators = paste$1(SugarElement.fromDom(editor.getDoc()));
 | |
|             var targets = pasteRows(selections, startCell, clonedRows, generators);
 | |
|             execute(table, targets).each(postExecute);
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var actOnType = function (getAction) {
 | |
|         return function (_ui, args) {
 | |
|           return get$c(args, 'type').each(function (type) {
 | |
|             actOnSelection(getAction(type), args.no_events);
 | |
|           });
 | |
|         };
 | |
|       };
 | |
|       each$1({
 | |
|         mceTableSplitCells: function () {
 | |
|           return actOnSelection(actions.unmergeCells);
 | |
|         },
 | |
|         mceTableMergeCells: function () {
 | |
|           return actOnSelection(actions.mergeCells);
 | |
|         },
 | |
|         mceTableInsertRowBefore: function () {
 | |
|           return actOnSelection(actions.insertRowsBefore);
 | |
|         },
 | |
|         mceTableInsertRowAfter: function () {
 | |
|           return actOnSelection(actions.insertRowsAfter);
 | |
|         },
 | |
|         mceTableInsertColBefore: function () {
 | |
|           return actOnSelection(actions.insertColumnsBefore);
 | |
|         },
 | |
|         mceTableInsertColAfter: function () {
 | |
|           return actOnSelection(actions.insertColumnsAfter);
 | |
|         },
 | |
|         mceTableDeleteCol: function () {
 | |
|           return actOnSelection(actions.deleteColumn);
 | |
|         },
 | |
|         mceTableDeleteRow: function () {
 | |
|           return actOnSelection(actions.deleteRow);
 | |
|         },
 | |
|         mceTableCutCol: function () {
 | |
|           return copyColSelection().each(function (selection) {
 | |
|             clipboard.setColumns(selection);
 | |
|             actOnSelection(actions.deleteColumn);
 | |
|           });
 | |
|         },
 | |
|         mceTableCutRow: function () {
 | |
|           return copyRowSelection().each(function (selection) {
 | |
|             clipboard.setRows(selection);
 | |
|             actOnSelection(actions.deleteRow);
 | |
|           });
 | |
|         },
 | |
|         mceTableCopyCol: function () {
 | |
|           return copyColSelection().each(function (selection) {
 | |
|             return clipboard.setColumns(selection);
 | |
|           });
 | |
|         },
 | |
|         mceTableCopyRow: function () {
 | |
|           return copyRowSelection().each(function (selection) {
 | |
|             return clipboard.setRows(selection);
 | |
|           });
 | |
|         },
 | |
|         mceTablePasteColBefore: function () {
 | |
|           return pasteOnSelection(actions.pasteColsBefore, clipboard.getColumns);
 | |
|         },
 | |
|         mceTablePasteColAfter: function () {
 | |
|           return pasteOnSelection(actions.pasteColsAfter, clipboard.getColumns);
 | |
|         },
 | |
|         mceTablePasteRowBefore: function () {
 | |
|           return pasteOnSelection(actions.pasteRowsBefore, clipboard.getRows);
 | |
|         },
 | |
|         mceTablePasteRowAfter: function () {
 | |
|           return pasteOnSelection(actions.pasteRowsAfter, clipboard.getRows);
 | |
|         },
 | |
|         mceTableDelete: eraseTable,
 | |
|         mceTableCellToggleClass: toggleTableCellClass,
 | |
|         mceTableToggleClass: toggleTableClass,
 | |
|         mceTableToggleCaption: toggleCaption,
 | |
|         mceTableSizingMode: function (_ui, sizing) {
 | |
|           return setSizingMode(sizing);
 | |
|         },
 | |
|         mceTableCellType: actOnType(function (type) {
 | |
|           return type === 'th' ? actions.makeCellsHeader : actions.unmakeCellsHeader;
 | |
|         }),
 | |
|         mceTableColType: actOnType(function (type) {
 | |
|           return type === 'th' ? actions.makeColumnsHeader : actions.unmakeColumnsHeader;
 | |
|         }),
 | |
|         mceTableRowType: actOnType(function (type) {
 | |
|           switch (type) {
 | |
|           case 'header':
 | |
|             return actions.makeRowsHeader;
 | |
|           case 'footer':
 | |
|             return actions.makeRowsFooter;
 | |
|           default:
 | |
|             return actions.makeRowsBody;
 | |
|           }
 | |
|         })
 | |
|       }, function (func, name) {
 | |
|         return editor.addCommand(name, func);
 | |
|       });
 | |
|       each$1({
 | |
|         mceTableProps: curry(open, editor, false),
 | |
|         mceTableRowProps: curry(open$1, editor),
 | |
|         mceTableCellProps: curry(open$2, editor, selections)
 | |
|       }, function (func, name) {
 | |
|         return editor.addCommand(name, function () {
 | |
|           return func();
 | |
|         });
 | |
|       });
 | |
|       editor.addCommand('mceInsertTable', function (_ui, args) {
 | |
|         if (isObject(args) && keys(args).length > 0) {
 | |
|           insertTableWithDataValidation(editor, args.rows, args.columns, args.options, 'Invalid values for mceInsertTable - rows and columns values are required to insert a table.');
 | |
|         } else {
 | |
|           open(editor, true);
 | |
|         }
 | |
|       });
 | |
|       editor.addCommand('mceTableApplyCellStyle', function (_ui, args) {
 | |
|         var getFormatName = function (style) {
 | |
|           return 'tablecell' + style.toLowerCase().replace('-', '');
 | |
|         };
 | |
|         if (!isObject(args)) {
 | |
|           return;
 | |
|         }
 | |
|         var cells = getCellsFromSelection(selections);
 | |
|         if (cells.length === 0) {
 | |
|           return;
 | |
|         }
 | |
|         var validArgs = filter$1(args, function (value, style) {
 | |
|           return editor.formatter.has(getFormatName(style)) && isString(value);
 | |
|         });
 | |
|         if (isEmpty(validArgs)) {
 | |
|           return;
 | |
|         }
 | |
|         each$1(validArgs, function (value, style) {
 | |
|           each$2(cells, function (cell) {
 | |
|             DomModifier.normal(editor, cell.dom).setFormat(getFormatName(style), value);
 | |
|           });
 | |
|         });
 | |
|         getTableFromCell(cells[0]).each(function (table) {
 | |
|           return fireTableModified(editor, table.dom, styleModified);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var registerQueryCommands = function (editor, actions, selections) {
 | |
|       var isRoot = getIsRoot(editor);
 | |
|       var lookupOnSelection = function (action) {
 | |
|         return getSelectionCell(getSelectionStart(editor)).bind(function (cell) {
 | |
|           return table(cell, isRoot).map(function (table) {
 | |
|             var targets = forMenu(selections, table, cell);
 | |
|             return action(table, targets);
 | |
|           });
 | |
|         }).getOr('');
 | |
|       };
 | |
|       each$1({
 | |
|         mceTableRowType: function () {
 | |
|           return lookupOnSelection(actions.getTableRowType);
 | |
|         },
 | |
|         mceTableCellType: function () {
 | |
|           return lookupOnSelection(actions.getTableCellType);
 | |
|         },
 | |
|         mceTableColType: function () {
 | |
|           return lookupOnSelection(actions.getTableColType);
 | |
|         }
 | |
|       }, function (func, name) {
 | |
|         return editor.addQueryValueHandler(name, func);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var Clipboard = function () {
 | |
|       var rows = value();
 | |
|       var cols = value();
 | |
|       return {
 | |
|         getRows: rows.get,
 | |
|         setRows: function (r) {
 | |
|           r.fold(rows.clear, rows.set);
 | |
|           cols.clear();
 | |
|         },
 | |
|         clearRows: rows.clear,
 | |
|         getColumns: cols.get,
 | |
|         setColumns: function (c) {
 | |
|           c.fold(cols.clear, cols.set);
 | |
|           rows.clear();
 | |
|         },
 | |
|         clearColumns: cols.clear
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var genericBase = {
 | |
|       remove_similar: true,
 | |
|       inherit: false
 | |
|     };
 | |
|     var cellBase = __assign({ selector: 'td,th' }, genericBase);
 | |
|     var cellFormats = {
 | |
|       tablecellbackgroundcolor: __assign({ styles: { backgroundColor: '%value' } }, cellBase),
 | |
|       tablecellverticalalign: __assign({ styles: { 'vertical-align': '%value' } }, cellBase),
 | |
|       tablecellbordercolor: __assign({ styles: { borderColor: '%value' } }, cellBase),
 | |
|       tablecellclass: __assign({ classes: ['%value'] }, cellBase),
 | |
|       tableclass: __assign({
 | |
|         selector: 'table',
 | |
|         classes: ['%value']
 | |
|       }, genericBase),
 | |
|       tablecellborderstyle: __assign({ styles: { borderStyle: '%value' } }, cellBase),
 | |
|       tablecellborderwidth: __assign({ styles: { borderWidth: '%value' } }, cellBase)
 | |
|     };
 | |
|     var registerFormats = function (editor) {
 | |
|       editor.formatter.register(cellFormats);
 | |
|     };
 | |
| 
 | |
|     var adt$5 = Adt.generate([
 | |
|       { none: ['current'] },
 | |
|       { first: ['current'] },
 | |
|       {
 | |
|         middle: [
 | |
|           'current',
 | |
|           'target'
 | |
|         ]
 | |
|       },
 | |
|       { last: ['current'] }
 | |
|     ]);
 | |
|     var none = function (current) {
 | |
|       if (current === void 0) {
 | |
|         current = undefined;
 | |
|       }
 | |
|       return adt$5.none(current);
 | |
|     };
 | |
|     var CellLocation = __assign(__assign({}, adt$5), { none: none });
 | |
| 
 | |
|     var walk = function (all, current, index, direction, isEligible) {
 | |
|       if (isEligible === void 0) {
 | |
|         isEligible = always;
 | |
|       }
 | |
|       var forwards = direction === 1;
 | |
|       if (!forwards && index <= 0) {
 | |
|         return CellLocation.first(all[0]);
 | |
|       } else if (forwards && index >= all.length - 1) {
 | |
|         return CellLocation.last(all[all.length - 1]);
 | |
|       } else {
 | |
|         var newIndex = index + direction;
 | |
|         var elem = all[newIndex];
 | |
|         return isEligible(elem) ? CellLocation.middle(current, elem) : walk(all, current, newIndex, direction, isEligible);
 | |
|       }
 | |
|     };
 | |
|     var detect$1 = function (current, isRoot) {
 | |
|       return table(current, isRoot).bind(function (table) {
 | |
|         var all = cells$1(table);
 | |
|         var index = findIndex(all, function (x) {
 | |
|           return eq$1(current, x);
 | |
|         });
 | |
|         return index.map(function (index) {
 | |
|           return {
 | |
|             index: index,
 | |
|             all: all
 | |
|           };
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var next = function (current, isEligible, isRoot) {
 | |
|       var detection = detect$1(current, isRoot);
 | |
|       return detection.fold(function () {
 | |
|         return CellLocation.none(current);
 | |
|       }, function (info) {
 | |
|         return walk(info.all, current, info.index, 1, isEligible);
 | |
|       });
 | |
|     };
 | |
|     var prev = function (current, isEligible, isRoot) {
 | |
|       var detection = detect$1(current, isRoot);
 | |
|       return detection.fold(function () {
 | |
|         return CellLocation.none();
 | |
|       }, function (info) {
 | |
|         return walk(info.all, current, info.index, -1, isEligible);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var create$2 = function (start, soffset, finish, foffset) {
 | |
|       return {
 | |
|         start: start,
 | |
|         soffset: soffset,
 | |
|         finish: finish,
 | |
|         foffset: foffset
 | |
|       };
 | |
|     };
 | |
|     var SimRange = { create: create$2 };
 | |
| 
 | |
|     var adt$4 = Adt.generate([
 | |
|       { before: ['element'] },
 | |
|       {
 | |
|         on: [
 | |
|           'element',
 | |
|           'offset'
 | |
|         ]
 | |
|       },
 | |
|       { after: ['element'] }
 | |
|     ]);
 | |
|     var cata$1 = function (subject, onBefore, onOn, onAfter) {
 | |
|       return subject.fold(onBefore, onOn, onAfter);
 | |
|     };
 | |
|     var getStart$1 = function (situ) {
 | |
|       return situ.fold(identity, identity, identity);
 | |
|     };
 | |
|     var before$2 = adt$4.before;
 | |
|     var on = adt$4.on;
 | |
|     var after$3 = adt$4.after;
 | |
|     var Situ = {
 | |
|       before: before$2,
 | |
|       on: on,
 | |
|       after: after$3,
 | |
|       cata: cata$1,
 | |
|       getStart: getStart$1
 | |
|     };
 | |
| 
 | |
|     var adt$3 = Adt.generate([
 | |
|       { domRange: ['rng'] },
 | |
|       {
 | |
|         relative: [
 | |
|           'startSitu',
 | |
|           'finishSitu'
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         exact: [
 | |
|           'start',
 | |
|           'soffset',
 | |
|           'finish',
 | |
|           'foffset'
 | |
|         ]
 | |
|       }
 | |
|     ]);
 | |
|     var exactFromRange = function (simRange) {
 | |
|       return adt$3.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);
 | |
|     };
 | |
|     var getStart = function (selection) {
 | |
|       return selection.match({
 | |
|         domRange: function (rng) {
 | |
|           return SugarElement.fromDom(rng.startContainer);
 | |
|         },
 | |
|         relative: function (startSitu, _finishSitu) {
 | |
|           return Situ.getStart(startSitu);
 | |
|         },
 | |
|         exact: function (start, _soffset, _finish, _foffset) {
 | |
|           return start;
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var domRange = adt$3.domRange;
 | |
|     var relative = adt$3.relative;
 | |
|     var exact = adt$3.exact;
 | |
|     var getWin = function (selection) {
 | |
|       var start = getStart(selection);
 | |
|       return defaultView(start);
 | |
|     };
 | |
|     var range = SimRange.create;
 | |
|     var SimSelection = {
 | |
|       domRange: domRange,
 | |
|       relative: relative,
 | |
|       exact: exact,
 | |
|       exactFromRange: exactFromRange,
 | |
|       getWin: getWin,
 | |
|       range: range
 | |
|     };
 | |
| 
 | |
|     var selectNode = function (win, element) {
 | |
|       var rng = win.document.createRange();
 | |
|       rng.selectNode(element.dom);
 | |
|       return rng;
 | |
|     };
 | |
|     var selectNodeContents = function (win, element) {
 | |
|       var rng = win.document.createRange();
 | |
|       selectNodeContentsUsing(rng, element);
 | |
|       return rng;
 | |
|     };
 | |
|     var selectNodeContentsUsing = function (rng, element) {
 | |
|       return rng.selectNodeContents(element.dom);
 | |
|     };
 | |
|     var setStart = function (rng, situ) {
 | |
|       situ.fold(function (e) {
 | |
|         rng.setStartBefore(e.dom);
 | |
|       }, function (e, o) {
 | |
|         rng.setStart(e.dom, o);
 | |
|       }, function (e) {
 | |
|         rng.setStartAfter(e.dom);
 | |
|       });
 | |
|     };
 | |
|     var setFinish = function (rng, situ) {
 | |
|       situ.fold(function (e) {
 | |
|         rng.setEndBefore(e.dom);
 | |
|       }, function (e, o) {
 | |
|         rng.setEnd(e.dom, o);
 | |
|       }, function (e) {
 | |
|         rng.setEndAfter(e.dom);
 | |
|       });
 | |
|     };
 | |
|     var relativeToNative = function (win, startSitu, finishSitu) {
 | |
|       var range = win.document.createRange();
 | |
|       setStart(range, startSitu);
 | |
|       setFinish(range, finishSitu);
 | |
|       return range;
 | |
|     };
 | |
|     var exactToNative = function (win, start, soffset, finish, foffset) {
 | |
|       var rng = win.document.createRange();
 | |
|       rng.setStart(start.dom, soffset);
 | |
|       rng.setEnd(finish.dom, foffset);
 | |
|       return rng;
 | |
|     };
 | |
|     var toRect = function (rect) {
 | |
|       return {
 | |
|         left: rect.left,
 | |
|         top: rect.top,
 | |
|         right: rect.right,
 | |
|         bottom: rect.bottom,
 | |
|         width: rect.width,
 | |
|         height: rect.height
 | |
|       };
 | |
|     };
 | |
|     var getFirstRect$1 = function (rng) {
 | |
|       var rects = rng.getClientRects();
 | |
|       var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect();
 | |
|       return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none();
 | |
|     };
 | |
| 
 | |
|     var adt$2 = Adt.generate([
 | |
|       {
 | |
|         ltr: [
 | |
|           'start',
 | |
|           'soffset',
 | |
|           'finish',
 | |
|           'foffset'
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         rtl: [
 | |
|           'start',
 | |
|           'soffset',
 | |
|           'finish',
 | |
|           'foffset'
 | |
|         ]
 | |
|       }
 | |
|     ]);
 | |
|     var fromRange = function (win, type, range) {
 | |
|       return type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);
 | |
|     };
 | |
|     var getRanges = function (win, selection) {
 | |
|       return selection.match({
 | |
|         domRange: function (rng) {
 | |
|           return {
 | |
|             ltr: constant(rng),
 | |
|             rtl: Optional.none
 | |
|           };
 | |
|         },
 | |
|         relative: function (startSitu, finishSitu) {
 | |
|           return {
 | |
|             ltr: cached(function () {
 | |
|               return relativeToNative(win, startSitu, finishSitu);
 | |
|             }),
 | |
|             rtl: cached(function () {
 | |
|               return Optional.some(relativeToNative(win, finishSitu, startSitu));
 | |
|             })
 | |
|           };
 | |
|         },
 | |
|         exact: function (start, soffset, finish, foffset) {
 | |
|           return {
 | |
|             ltr: cached(function () {
 | |
|               return exactToNative(win, start, soffset, finish, foffset);
 | |
|             }),
 | |
|             rtl: cached(function () {
 | |
|               return Optional.some(exactToNative(win, finish, foffset, start, soffset));
 | |
|             })
 | |
|           };
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var doDiagnose = function (win, ranges) {
 | |
|       var rng = ranges.ltr();
 | |
|       if (rng.collapsed) {
 | |
|         var reversed = ranges.rtl().filter(function (rev) {
 | |
|           return rev.collapsed === false;
 | |
|         });
 | |
|         return reversed.map(function (rev) {
 | |
|           return adt$2.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset);
 | |
|         }).getOrThunk(function () {
 | |
|           return fromRange(win, adt$2.ltr, rng);
 | |
|         });
 | |
|       } else {
 | |
|         return fromRange(win, adt$2.ltr, rng);
 | |
|       }
 | |
|     };
 | |
|     var diagnose = function (win, selection) {
 | |
|       var ranges = getRanges(win, selection);
 | |
|       return doDiagnose(win, ranges);
 | |
|     };
 | |
|     var asLtrRange = function (win, selection) {
 | |
|       var diagnosis = diagnose(win, selection);
 | |
|       return diagnosis.match({
 | |
|         ltr: function (start, soffset, finish, foffset) {
 | |
|           var rng = win.document.createRange();
 | |
|           rng.setStart(start.dom, soffset);
 | |
|           rng.setEnd(finish.dom, foffset);
 | |
|           return rng;
 | |
|         },
 | |
|         rtl: function (start, soffset, finish, foffset) {
 | |
|           var rng = win.document.createRange();
 | |
|           rng.setStart(finish.dom, foffset);
 | |
|           rng.setEnd(start.dom, soffset);
 | |
|           return rng;
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     adt$2.ltr;
 | |
|     adt$2.rtl;
 | |
| 
 | |
|     var searchForPoint = function (rectForOffset, x, y, maxX, length) {
 | |
|       if (length === 0) {
 | |
|         return 0;
 | |
|       } else if (x === maxX) {
 | |
|         return length - 1;
 | |
|       }
 | |
|       var xDelta = maxX;
 | |
|       for (var i = 1; i < length; i++) {
 | |
|         var rect = rectForOffset(i);
 | |
|         var curDeltaX = Math.abs(x - rect.left);
 | |
|         if (y <= rect.bottom) {
 | |
|           if (y < rect.top || curDeltaX > xDelta) {
 | |
|             return i - 1;
 | |
|           } else {
 | |
|             xDelta = curDeltaX;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       return 0;
 | |
|     };
 | |
|     var inRect = function (rect, x, y) {
 | |
|       return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;
 | |
|     };
 | |
| 
 | |
|     var locateOffset = function (doc, textnode, x, y, rect) {
 | |
|       var rangeForOffset = function (o) {
 | |
|         var r = doc.dom.createRange();
 | |
|         r.setStart(textnode.dom, o);
 | |
|         r.collapse(true);
 | |
|         return r;
 | |
|       };
 | |
|       var rectForOffset = function (o) {
 | |
|         var r = rangeForOffset(o);
 | |
|         return r.getBoundingClientRect();
 | |
|       };
 | |
|       var length = get$9(textnode).length;
 | |
|       var offset = searchForPoint(rectForOffset, x, y, rect.right, length);
 | |
|       return rangeForOffset(offset);
 | |
|     };
 | |
|     var locate$1 = function (doc, node, x, y) {
 | |
|       var r = doc.dom.createRange();
 | |
|       r.selectNode(node.dom);
 | |
|       var rects = r.getClientRects();
 | |
|       var foundRect = findMap(rects, function (rect) {
 | |
|         return inRect(rect, x, y) ? Optional.some(rect) : Optional.none();
 | |
|       });
 | |
|       return foundRect.map(function (rect) {
 | |
|         return locateOffset(doc, node, x, y, rect);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var searchInChildren = function (doc, node, x, y) {
 | |
|       var r = doc.dom.createRange();
 | |
|       var nodes = children$3(node);
 | |
|       return findMap(nodes, function (n) {
 | |
|         r.selectNode(n.dom);
 | |
|         return inRect(r.getBoundingClientRect(), x, y) ? locateNode(doc, n, x, y) : Optional.none();
 | |
|       });
 | |
|     };
 | |
|     var locateNode = function (doc, node, x, y) {
 | |
|       return isText(node) ? locate$1(doc, node, x, y) : searchInChildren(doc, node, x, y);
 | |
|     };
 | |
|     var locate = function (doc, node, x, y) {
 | |
|       var r = doc.dom.createRange();
 | |
|       r.selectNode(node.dom);
 | |
|       var rect = r.getBoundingClientRect();
 | |
|       var boundedX = Math.max(rect.left, Math.min(rect.right, x));
 | |
|       var boundedY = Math.max(rect.top, Math.min(rect.bottom, y));
 | |
|       return locateNode(doc, node, boundedX, boundedY);
 | |
|     };
 | |
| 
 | |
|     var COLLAPSE_TO_LEFT = true;
 | |
|     var COLLAPSE_TO_RIGHT = false;
 | |
|     var getCollapseDirection = function (rect, x) {
 | |
|       return x - rect.left < rect.right - x ? COLLAPSE_TO_LEFT : COLLAPSE_TO_RIGHT;
 | |
|     };
 | |
|     var createCollapsedNode = function (doc, target, collapseDirection) {
 | |
|       var r = doc.dom.createRange();
 | |
|       r.selectNode(target.dom);
 | |
|       r.collapse(collapseDirection);
 | |
|       return r;
 | |
|     };
 | |
|     var locateInElement = function (doc, node, x) {
 | |
|       var cursorRange = doc.dom.createRange();
 | |
|       cursorRange.selectNode(node.dom);
 | |
|       var rect = cursorRange.getBoundingClientRect();
 | |
|       var collapseDirection = getCollapseDirection(rect, x);
 | |
|       var f = collapseDirection === COLLAPSE_TO_LEFT ? first : last$1;
 | |
|       return f(node).map(function (target) {
 | |
|         return createCollapsedNode(doc, target, collapseDirection);
 | |
|       });
 | |
|     };
 | |
|     var locateInEmpty = function (doc, node, x) {
 | |
|       var rect = node.dom.getBoundingClientRect();
 | |
|       var collapseDirection = getCollapseDirection(rect, x);
 | |
|       return Optional.some(createCollapsedNode(doc, node, collapseDirection));
 | |
|     };
 | |
|     var search = function (doc, node, x) {
 | |
|       var f = children$3(node).length === 0 ? locateInEmpty : locateInElement;
 | |
|       return f(doc, node, x);
 | |
|     };
 | |
| 
 | |
|     var caretPositionFromPoint = function (doc, x, y) {
 | |
|       var _a, _b;
 | |
|       return Optional.from((_b = (_a = doc.dom).caretPositionFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)).bind(function (pos) {
 | |
|         if (pos.offsetNode === null) {
 | |
|           return Optional.none();
 | |
|         }
 | |
|         var r = doc.dom.createRange();
 | |
|         r.setStart(pos.offsetNode, pos.offset);
 | |
|         r.collapse();
 | |
|         return Optional.some(r);
 | |
|       });
 | |
|     };
 | |
|     var caretRangeFromPoint = function (doc, x, y) {
 | |
|       var _a, _b;
 | |
|       return Optional.from((_b = (_a = doc.dom).caretRangeFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y));
 | |
|     };
 | |
|     var searchTextNodes = function (doc, node, x, y) {
 | |
|       var r = doc.dom.createRange();
 | |
|       r.selectNode(node.dom);
 | |
|       var rect = r.getBoundingClientRect();
 | |
|       var boundedX = Math.max(rect.left, Math.min(rect.right, x));
 | |
|       var boundedY = Math.max(rect.top, Math.min(rect.bottom, y));
 | |
|       return locate(doc, node, boundedX, boundedY);
 | |
|     };
 | |
|     var searchFromPoint = function (doc, x, y) {
 | |
|       return SugarElement.fromPoint(doc, x, y).bind(function (elem) {
 | |
|         var fallback = function () {
 | |
|           return search(doc, elem, x);
 | |
|         };
 | |
|         return children$3(elem).length === 0 ? fallback() : searchTextNodes(doc, elem, x, y).orThunk(fallback);
 | |
|       });
 | |
|     };
 | |
|     var availableSearch = function () {
 | |
|       if (document.caretPositionFromPoint) {
 | |
|         return caretPositionFromPoint;
 | |
|       } else if (document.caretRangeFromPoint) {
 | |
|         return caretRangeFromPoint;
 | |
|       } else {
 | |
|         return searchFromPoint;
 | |
|       }
 | |
|     }();
 | |
|     var fromPoint = function (win, x, y) {
 | |
|       var doc = SugarElement.fromDom(win.document);
 | |
|       return availableSearch(doc, x, y).map(function (rng) {
 | |
|         return SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var beforeSpecial = function (element, offset) {
 | |
|       var name$1 = name(element);
 | |
|       if ('input' === name$1) {
 | |
|         return Situ.after(element);
 | |
|       } else if (!contains$2([
 | |
|           'br',
 | |
|           'img'
 | |
|         ], name$1)) {
 | |
|         return Situ.on(element, offset);
 | |
|       } else {
 | |
|         return offset === 0 ? Situ.before(element) : Situ.after(element);
 | |
|       }
 | |
|     };
 | |
|     var preprocessRelative = function (startSitu, finishSitu) {
 | |
|       var start = startSitu.fold(Situ.before, beforeSpecial, Situ.after);
 | |
|       var finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after);
 | |
|       return SimSelection.relative(start, finish);
 | |
|     };
 | |
|     var preprocessExact = function (start, soffset, finish, foffset) {
 | |
|       var startSitu = beforeSpecial(start, soffset);
 | |
|       var finishSitu = beforeSpecial(finish, foffset);
 | |
|       return SimSelection.relative(startSitu, finishSitu);
 | |
|     };
 | |
|     var preprocess = function (selection) {
 | |
|       return selection.match({
 | |
|         domRange: function (rng) {
 | |
|           var start = SugarElement.fromDom(rng.startContainer);
 | |
|           var finish = SugarElement.fromDom(rng.endContainer);
 | |
|           return preprocessExact(start, rng.startOffset, finish, rng.endOffset);
 | |
|         },
 | |
|         relative: preprocessRelative,
 | |
|         exact: preprocessExact
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var makeRange = function (start, soffset, finish, foffset) {
 | |
|       var doc = owner(start);
 | |
|       var rng = doc.dom.createRange();
 | |
|       rng.setStart(start.dom, soffset);
 | |
|       rng.setEnd(finish.dom, foffset);
 | |
|       return rng;
 | |
|     };
 | |
|     var after$2 = function (start, soffset, finish, foffset) {
 | |
|       var r = makeRange(start, soffset, finish, foffset);
 | |
|       var same = eq$1(start, finish) && soffset === foffset;
 | |
|       return r.collapsed && !same;
 | |
|     };
 | |
| 
 | |
|     var getNativeSelection = function (win) {
 | |
|       return Optional.from(win.getSelection());
 | |
|     };
 | |
|     var doSetNativeRange = function (win, rng) {
 | |
|       getNativeSelection(win).each(function (selection) {
 | |
|         selection.removeAllRanges();
 | |
|         selection.addRange(rng);
 | |
|       });
 | |
|     };
 | |
|     var doSetRange = function (win, start, soffset, finish, foffset) {
 | |
|       var rng = exactToNative(win, start, soffset, finish, foffset);
 | |
|       doSetNativeRange(win, rng);
 | |
|     };
 | |
|     var setLegacyRtlRange = function (win, selection, start, soffset, finish, foffset) {
 | |
|       selection.collapse(start.dom, soffset);
 | |
|       selection.extend(finish.dom, foffset);
 | |
|     };
 | |
|     var setRangeFromRelative = function (win, relative) {
 | |
|       return diagnose(win, relative).match({
 | |
|         ltr: function (start, soffset, finish, foffset) {
 | |
|           doSetRange(win, start, soffset, finish, foffset);
 | |
|         },
 | |
|         rtl: function (start, soffset, finish, foffset) {
 | |
|           getNativeSelection(win).each(function (selection) {
 | |
|             if (selection.setBaseAndExtent) {
 | |
|               selection.setBaseAndExtent(start.dom, soffset, finish.dom, foffset);
 | |
|             } else if (selection.extend) {
 | |
|               try {
 | |
|                 setLegacyRtlRange(win, selection, start, soffset, finish, foffset);
 | |
|               } catch (e) {
 | |
|                 doSetRange(win, finish, foffset, start, soffset);
 | |
|               }
 | |
|             } else {
 | |
|               doSetRange(win, finish, foffset, start, soffset);
 | |
|             }
 | |
|           });
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var setExact = function (win, start, soffset, finish, foffset) {
 | |
|       var relative = preprocessExact(start, soffset, finish, foffset);
 | |
|       setRangeFromRelative(win, relative);
 | |
|     };
 | |
|     var setRelative = function (win, startSitu, finishSitu) {
 | |
|       var relative = preprocessRelative(startSitu, finishSitu);
 | |
|       setRangeFromRelative(win, relative);
 | |
|     };
 | |
|     var toNative = function (selection) {
 | |
|       var win = SimSelection.getWin(selection).dom;
 | |
|       var getDomRange = function (start, soffset, finish, foffset) {
 | |
|         return exactToNative(win, start, soffset, finish, foffset);
 | |
|       };
 | |
|       var filtered = preprocess(selection);
 | |
|       return diagnose(win, filtered).match({
 | |
|         ltr: getDomRange,
 | |
|         rtl: getDomRange
 | |
|       });
 | |
|     };
 | |
|     var readRange = function (selection) {
 | |
|       if (selection.rangeCount > 0) {
 | |
|         var firstRng = selection.getRangeAt(0);
 | |
|         var lastRng = selection.getRangeAt(selection.rangeCount - 1);
 | |
|         return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset));
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
|     var doGetExact = function (selection) {
 | |
|       if (selection.anchorNode === null || selection.focusNode === null) {
 | |
|         return readRange(selection);
 | |
|       } else {
 | |
|         var anchor = SugarElement.fromDom(selection.anchorNode);
 | |
|         var focus_1 = SugarElement.fromDom(selection.focusNode);
 | |
|         return after$2(anchor, selection.anchorOffset, focus_1, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus_1, selection.focusOffset)) : readRange(selection);
 | |
|       }
 | |
|     };
 | |
|     var setToElement = function (win, element, selectNodeContents$1) {
 | |
|       if (selectNodeContents$1 === void 0) {
 | |
|         selectNodeContents$1 = true;
 | |
|       }
 | |
|       var rngGetter = selectNodeContents$1 ? selectNodeContents : selectNode;
 | |
|       var rng = rngGetter(win, element);
 | |
|       doSetNativeRange(win, rng);
 | |
|     };
 | |
|     var getExact = function (win) {
 | |
|       return getNativeSelection(win).filter(function (sel) {
 | |
|         return sel.rangeCount > 0;
 | |
|       }).bind(doGetExact);
 | |
|     };
 | |
|     var get$1 = function (win) {
 | |
|       return getExact(win).map(function (range) {
 | |
|         return SimSelection.exact(range.start, range.soffset, range.finish, range.foffset);
 | |
|       });
 | |
|     };
 | |
|     var getFirstRect = function (win, selection) {
 | |
|       var rng = asLtrRange(win, selection);
 | |
|       return getFirstRect$1(rng);
 | |
|     };
 | |
|     var getAtPoint = function (win, x, y) {
 | |
|       return fromPoint(win, x, y);
 | |
|     };
 | |
|     var clear = function (win) {
 | |
|       getNativeSelection(win).each(function (selection) {
 | |
|         return selection.removeAllRanges();
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var global$1 = tinymce.util.Tools.resolve('tinymce.util.VK');
 | |
| 
 | |
|     var forward = function (editor, isRoot, cell) {
 | |
|       return go$1(editor, isRoot, next(cell, isEditable$1));
 | |
|     };
 | |
|     var backward = function (editor, isRoot, cell) {
 | |
|       return go$1(editor, isRoot, prev(cell, isEditable$1));
 | |
|     };
 | |
|     var getCellFirstCursorPosition = function (editor, cell) {
 | |
|       var selection = SimSelection.exact(cell, 0, cell, 0);
 | |
|       return toNative(selection);
 | |
|     };
 | |
|     var go$1 = function (editor, isRoot, cell) {
 | |
|       return cell.fold(Optional.none, Optional.none, function (current, next) {
 | |
|         return first(next).map(function (cell) {
 | |
|           return getCellFirstCursorPosition(editor, cell);
 | |
|         });
 | |
|       }, function (current) {
 | |
|         editor.execCommand('mceTableInsertRowAfter');
 | |
|         return forward(editor, isRoot, current);
 | |
|       });
 | |
|     };
 | |
|     var rootElements = [
 | |
|       'table',
 | |
|       'li',
 | |
|       'dl'
 | |
|     ];
 | |
|     var handle$1 = function (event, editor, cellSelection) {
 | |
|       if (event.keyCode === global$1.TAB) {
 | |
|         var body_1 = getBody(editor);
 | |
|         var isRoot_1 = function (element) {
 | |
|           var name$1 = name(element);
 | |
|           return eq$1(element, body_1) || contains$2(rootElements, name$1);
 | |
|         };
 | |
|         var rng = editor.selection.getRng();
 | |
|         var container = SugarElement.fromDom(event.shiftKey ? rng.startContainer : rng.endContainer);
 | |
|         cell(container, isRoot_1).each(function (cell) {
 | |
|           event.preventDefault();
 | |
|           table(cell, isRoot_1).each(cellSelection.clear);
 | |
|           editor.selection.collapse(event.shiftKey);
 | |
|           var navigation = event.shiftKey ? backward : forward;
 | |
|           var rng = navigation(editor, isRoot_1, cell);
 | |
|           rng.each(function (range) {
 | |
|             editor.selection.setRng(range);
 | |
|           });
 | |
|         });
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var create$1 = function (selection, kill) {
 | |
|       return {
 | |
|         selection: selection,
 | |
|         kill: kill
 | |
|       };
 | |
|     };
 | |
|     var Response = { create: create$1 };
 | |
| 
 | |
|     var create = function (start, soffset, finish, foffset) {
 | |
|       return {
 | |
|         start: Situ.on(start, soffset),
 | |
|         finish: Situ.on(finish, foffset)
 | |
|       };
 | |
|     };
 | |
|     var Situs = { create: create };
 | |
| 
 | |
|     var convertToRange = function (win, selection) {
 | |
|       var rng = asLtrRange(win, selection);
 | |
|       return SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset);
 | |
|     };
 | |
|     var makeSitus = Situs.create;
 | |
| 
 | |
|     var sync = function (container, isRoot, start, soffset, finish, foffset, selectRange) {
 | |
|       if (!(eq$1(start, finish) && soffset === foffset)) {
 | |
|         return closest$1(start, 'td,th', isRoot).bind(function (s) {
 | |
|           return closest$1(finish, 'td,th', isRoot).bind(function (f) {
 | |
|             return detect(container, isRoot, s, f, selectRange);
 | |
|           });
 | |
|         });
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
|     var detect = function (container, isRoot, start, finish, selectRange) {
 | |
|       if (!eq$1(start, finish)) {
 | |
|         return identify(start, finish, isRoot).bind(function (cellSel) {
 | |
|           var boxes = cellSel.boxes.getOr([]);
 | |
|           if (boxes.length > 1) {
 | |
|             selectRange(container, boxes, cellSel.start, cellSel.finish);
 | |
|             return Optional.some(Response.create(Optional.some(makeSitus(start, 0, start, getEnd(start))), true));
 | |
|           } else {
 | |
|             return Optional.none();
 | |
|           }
 | |
|         });
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
|     var update = function (rows, columns, container, selected, annotations) {
 | |
|       var updateSelection = function (newSels) {
 | |
|         annotations.clearBeforeUpdate(container);
 | |
|         annotations.selectRange(container, newSels.boxes, newSels.start, newSels.finish);
 | |
|         return newSels.boxes;
 | |
|       };
 | |
|       return shiftSelection(selected, rows, columns, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(updateSelection);
 | |
|     };
 | |
| 
 | |
|     var traverse = function (item, mode) {
 | |
|       return {
 | |
|         item: item,
 | |
|         mode: mode
 | |
|       };
 | |
|     };
 | |
|     var backtrack = function (universe, item, _direction, transition) {
 | |
|       if (transition === void 0) {
 | |
|         transition = sidestep;
 | |
|       }
 | |
|       return universe.property().parent(item).map(function (p) {
 | |
|         return traverse(p, transition);
 | |
|       });
 | |
|     };
 | |
|     var sidestep = function (universe, item, direction, transition) {
 | |
|       if (transition === void 0) {
 | |
|         transition = advance;
 | |
|       }
 | |
|       return direction.sibling(universe, item).map(function (p) {
 | |
|         return traverse(p, transition);
 | |
|       });
 | |
|     };
 | |
|     var advance = function (universe, item, direction, transition) {
 | |
|       if (transition === void 0) {
 | |
|         transition = advance;
 | |
|       }
 | |
|       var children = universe.property().children(item);
 | |
|       var result = direction.first(children);
 | |
|       return result.map(function (r) {
 | |
|         return traverse(r, transition);
 | |
|       });
 | |
|     };
 | |
|     var successors = [
 | |
|       {
 | |
|         current: backtrack,
 | |
|         next: sidestep,
 | |
|         fallback: Optional.none()
 | |
|       },
 | |
|       {
 | |
|         current: sidestep,
 | |
|         next: advance,
 | |
|         fallback: Optional.some(backtrack)
 | |
|       },
 | |
|       {
 | |
|         current: advance,
 | |
|         next: advance,
 | |
|         fallback: Optional.some(sidestep)
 | |
|       }
 | |
|     ];
 | |
|     var go = function (universe, item, mode, direction, rules) {
 | |
|       if (rules === void 0) {
 | |
|         rules = successors;
 | |
|       }
 | |
|       var ruleOpt = find$1(rules, function (succ) {
 | |
|         return succ.current === mode;
 | |
|       });
 | |
|       return ruleOpt.bind(function (rule) {
 | |
|         return rule.current(universe, item, direction, rule.next).orThunk(function () {
 | |
|           return rule.fallback.bind(function (fb) {
 | |
|             return go(universe, item, fb, direction);
 | |
|           });
 | |
|         });
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var left$1 = function () {
 | |
|       var sibling = function (universe, item) {
 | |
|         return universe.query().prevSibling(item);
 | |
|       };
 | |
|       var first = function (children) {
 | |
|         return children.length > 0 ? Optional.some(children[children.length - 1]) : Optional.none();
 | |
|       };
 | |
|       return {
 | |
|         sibling: sibling,
 | |
|         first: first
 | |
|       };
 | |
|     };
 | |
|     var right$1 = function () {
 | |
|       var sibling = function (universe, item) {
 | |
|         return universe.query().nextSibling(item);
 | |
|       };
 | |
|       var first = function (children) {
 | |
|         return children.length > 0 ? Optional.some(children[0]) : Optional.none();
 | |
|       };
 | |
|       return {
 | |
|         sibling: sibling,
 | |
|         first: first
 | |
|       };
 | |
|     };
 | |
|     var Walkers = {
 | |
|       left: left$1,
 | |
|       right: right$1
 | |
|     };
 | |
| 
 | |
|     var hone = function (universe, item, predicate, mode, direction, isRoot) {
 | |
|       var next = go(universe, item, mode, direction);
 | |
|       return next.bind(function (n) {
 | |
|         if (isRoot(n.item)) {
 | |
|           return Optional.none();
 | |
|         } else {
 | |
|           return predicate(n.item) ? Optional.some(n.item) : hone(universe, n.item, predicate, n.mode, direction, isRoot);
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|     var left = function (universe, item, predicate, isRoot) {
 | |
|       return hone(universe, item, predicate, sidestep, Walkers.left(), isRoot);
 | |
|     };
 | |
|     var right = function (universe, item, predicate, isRoot) {
 | |
|       return hone(universe, item, predicate, sidestep, Walkers.right(), isRoot);
 | |
|     };
 | |
| 
 | |
|     var isLeaf = function (universe) {
 | |
|       return function (element) {
 | |
|         return universe.property().children(element).length === 0;
 | |
|       };
 | |
|     };
 | |
|     var before$1 = function (universe, item, isRoot) {
 | |
|       return seekLeft$1(universe, item, isLeaf(universe), isRoot);
 | |
|     };
 | |
|     var after$1 = function (universe, item, isRoot) {
 | |
|       return seekRight$1(universe, item, isLeaf(universe), isRoot);
 | |
|     };
 | |
|     var seekLeft$1 = left;
 | |
|     var seekRight$1 = right;
 | |
| 
 | |
|     var universe = DomUniverse();
 | |
|     var before = function (element, isRoot) {
 | |
|       return before$1(universe, element, isRoot);
 | |
|     };
 | |
|     var after = function (element, isRoot) {
 | |
|       return after$1(universe, element, isRoot);
 | |
|     };
 | |
|     var seekLeft = function (element, predicate, isRoot) {
 | |
|       return seekLeft$1(universe, element, predicate, isRoot);
 | |
|     };
 | |
|     var seekRight = function (element, predicate, isRoot) {
 | |
|       return seekRight$1(universe, element, predicate, isRoot);
 | |
|     };
 | |
| 
 | |
|     var ancestor = function (scope, predicate, isRoot) {
 | |
|       return ancestor$2(scope, predicate, isRoot).isSome();
 | |
|     };
 | |
| 
 | |
|     var adt$1 = Adt.generate([
 | |
|       { none: ['message'] },
 | |
|       { success: [] },
 | |
|       { failedUp: ['cell'] },
 | |
|       { failedDown: ['cell'] }
 | |
|     ]);
 | |
|     var isOverlapping = function (bridge, before, after) {
 | |
|       var beforeBounds = bridge.getRect(before);
 | |
|       var afterBounds = bridge.getRect(after);
 | |
|       return afterBounds.right > beforeBounds.left && afterBounds.left < beforeBounds.right;
 | |
|     };
 | |
|     var isRow = function (elem) {
 | |
|       return closest$1(elem, 'tr');
 | |
|     };
 | |
|     var verify = function (bridge, before, beforeOffset, after, afterOffset, failure, isRoot) {
 | |
|       return closest$1(after, 'td,th', isRoot).bind(function (afterCell) {
 | |
|         return closest$1(before, 'td,th', isRoot).map(function (beforeCell) {
 | |
|           if (!eq$1(afterCell, beforeCell)) {
 | |
|             return sharedOne(isRow, [
 | |
|               afterCell,
 | |
|               beforeCell
 | |
|             ]).fold(function () {
 | |
|               return isOverlapping(bridge, beforeCell, afterCell) ? adt$1.success() : failure(beforeCell);
 | |
|             }, function (_sharedRow) {
 | |
|               return failure(beforeCell);
 | |
|             });
 | |
|           } else {
 | |
|             return eq$1(after, afterCell) && getEnd(afterCell) === afterOffset ? failure(beforeCell) : adt$1.none('in same cell');
 | |
|           }
 | |
|         });
 | |
|       }).getOr(adt$1.none('default'));
 | |
|     };
 | |
|     var cata = function (subject, onNone, onSuccess, onFailedUp, onFailedDown) {
 | |
|       return subject.fold(onNone, onSuccess, onFailedUp, onFailedDown);
 | |
|     };
 | |
|     var BeforeAfter = __assign(__assign({}, adt$1), {
 | |
|       verify: verify,
 | |
|       cata: cata
 | |
|     });
 | |
| 
 | |
|     var inParent = function (parent, children, element, index) {
 | |
|       return {
 | |
|         parent: parent,
 | |
|         children: children,
 | |
|         element: element,
 | |
|         index: index
 | |
|       };
 | |
|     };
 | |
|     var indexInParent = function (element) {
 | |
|       return parent(element).bind(function (parent) {
 | |
|         var children = children$3(parent);
 | |
|         return indexOf(children, element).map(function (index) {
 | |
|           return inParent(parent, children, element, index);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var indexOf = function (elements, element) {
 | |
|       return findIndex(elements, curry(eq$1, element));
 | |
|     };
 | |
| 
 | |
|     var isBr = function (elem) {
 | |
|       return name(elem) === 'br';
 | |
|     };
 | |
|     var gatherer = function (cand, gather, isRoot) {
 | |
|       return gather(cand, isRoot).bind(function (target) {
 | |
|         return isText(target) && get$9(target).trim().length === 0 ? gatherer(target, gather, isRoot) : Optional.some(target);
 | |
|       });
 | |
|     };
 | |
|     var handleBr = function (isRoot, element, direction) {
 | |
|       return direction.traverse(element).orThunk(function () {
 | |
|         return gatherer(element, direction.gather, isRoot);
 | |
|       }).map(direction.relative);
 | |
|     };
 | |
|     var findBr = function (element, offset) {
 | |
|       return child$3(element, offset).filter(isBr).orThunk(function () {
 | |
|         return child$3(element, offset - 1).filter(isBr);
 | |
|       });
 | |
|     };
 | |
|     var handleParent = function (isRoot, element, offset, direction) {
 | |
|       return findBr(element, offset).bind(function (br) {
 | |
|         return direction.traverse(br).fold(function () {
 | |
|           return gatherer(br, direction.gather, isRoot).map(direction.relative);
 | |
|         }, function (adjacent) {
 | |
|           return indexInParent(adjacent).map(function (info) {
 | |
|             return Situ.on(info.parent, info.index);
 | |
|           });
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var tryBr = function (isRoot, element, offset, direction) {
 | |
|       var target = isBr(element) ? handleBr(isRoot, element, direction) : handleParent(isRoot, element, offset, direction);
 | |
|       return target.map(function (tgt) {
 | |
|         return {
 | |
|           start: tgt,
 | |
|           finish: tgt
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|     var process = function (analysis) {
 | |
|       return BeforeAfter.cata(analysis, function (_message) {
 | |
|         return Optional.none();
 | |
|       }, function () {
 | |
|         return Optional.none();
 | |
|       }, function (cell) {
 | |
|         return Optional.some(point(cell, 0));
 | |
|       }, function (cell) {
 | |
|         return Optional.some(point(cell, getEnd(cell)));
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var moveDown = function (caret, amount) {
 | |
|       return {
 | |
|         left: caret.left,
 | |
|         top: caret.top + amount,
 | |
|         right: caret.right,
 | |
|         bottom: caret.bottom + amount
 | |
|       };
 | |
|     };
 | |
|     var moveUp = function (caret, amount) {
 | |
|       return {
 | |
|         left: caret.left,
 | |
|         top: caret.top - amount,
 | |
|         right: caret.right,
 | |
|         bottom: caret.bottom - amount
 | |
|       };
 | |
|     };
 | |
|     var translate = function (caret, xDelta, yDelta) {
 | |
|       return {
 | |
|         left: caret.left + xDelta,
 | |
|         top: caret.top + yDelta,
 | |
|         right: caret.right + xDelta,
 | |
|         bottom: caret.bottom + yDelta
 | |
|       };
 | |
|     };
 | |
|     var getTop = function (caret) {
 | |
|       return caret.top;
 | |
|     };
 | |
|     var getBottom = function (caret) {
 | |
|       return caret.bottom;
 | |
|     };
 | |
| 
 | |
|     var getPartialBox = function (bridge, element, offset) {
 | |
|       if (offset >= 0 && offset < getEnd(element)) {
 | |
|         return bridge.getRangedRect(element, offset, element, offset + 1);
 | |
|       } else if (offset > 0) {
 | |
|         return bridge.getRangedRect(element, offset - 1, element, offset);
 | |
|       }
 | |
|       return Optional.none();
 | |
|     };
 | |
|     var toCaret = function (rect) {
 | |
|       return {
 | |
|         left: rect.left,
 | |
|         top: rect.top,
 | |
|         right: rect.right,
 | |
|         bottom: rect.bottom
 | |
|       };
 | |
|     };
 | |
|     var getElemBox = function (bridge, element) {
 | |
|       return Optional.some(bridge.getRect(element));
 | |
|     };
 | |
|     var getBoxAt = function (bridge, element, offset) {
 | |
|       if (isElement(element)) {
 | |
|         return getElemBox(bridge, element).map(toCaret);
 | |
|       } else if (isText(element)) {
 | |
|         return getPartialBox(bridge, element, offset).map(toCaret);
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
|     var getEntireBox = function (bridge, element) {
 | |
|       if (isElement(element)) {
 | |
|         return getElemBox(bridge, element).map(toCaret);
 | |
|       } else if (isText(element)) {
 | |
|         return bridge.getRangedRect(element, 0, element, getEnd(element)).map(toCaret);
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var JUMP_SIZE = 5;
 | |
|     var NUM_RETRIES = 100;
 | |
|     var adt = Adt.generate([
 | |
|       { none: [] },
 | |
|       { retry: ['caret'] }
 | |
|     ]);
 | |
|     var isOutside = function (caret, box) {
 | |
|       return caret.left < box.left || Math.abs(box.right - caret.left) < 1 || caret.left > box.right;
 | |
|     };
 | |
|     var inOutsideBlock = function (bridge, element, caret) {
 | |
|       return closest$2(element, isBlock).fold(never, function (cell) {
 | |
|         return getEntireBox(bridge, cell).exists(function (box) {
 | |
|           return isOutside(caret, box);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var adjustDown = function (bridge, element, guessBox, original, caret) {
 | |
|       var lowerCaret = moveDown(caret, JUMP_SIZE);
 | |
|       if (Math.abs(guessBox.bottom - original.bottom) < 1) {
 | |
|         return adt.retry(lowerCaret);
 | |
|       } else if (guessBox.top > caret.bottom) {
 | |
|         return adt.retry(lowerCaret);
 | |
|       } else if (guessBox.top === caret.bottom) {
 | |
|         return adt.retry(moveDown(caret, 1));
 | |
|       } else {
 | |
|         return inOutsideBlock(bridge, element, caret) ? adt.retry(translate(lowerCaret, JUMP_SIZE, 0)) : adt.none();
 | |
|       }
 | |
|     };
 | |
|     var adjustUp = function (bridge, element, guessBox, original, caret) {
 | |
|       var higherCaret = moveUp(caret, JUMP_SIZE);
 | |
|       if (Math.abs(guessBox.top - original.top) < 1) {
 | |
|         return adt.retry(higherCaret);
 | |
|       } else if (guessBox.bottom < caret.top) {
 | |
|         return adt.retry(higherCaret);
 | |
|       } else if (guessBox.bottom === caret.top) {
 | |
|         return adt.retry(moveUp(caret, 1));
 | |
|       } else {
 | |
|         return inOutsideBlock(bridge, element, caret) ? adt.retry(translate(higherCaret, JUMP_SIZE, 0)) : adt.none();
 | |
|       }
 | |
|     };
 | |
|     var upMovement = {
 | |
|       point: getTop,
 | |
|       adjuster: adjustUp,
 | |
|       move: moveUp,
 | |
|       gather: before
 | |
|     };
 | |
|     var downMovement = {
 | |
|       point: getBottom,
 | |
|       adjuster: adjustDown,
 | |
|       move: moveDown,
 | |
|       gather: after
 | |
|     };
 | |
|     var isAtTable = function (bridge, x, y) {
 | |
|       return bridge.elementFromPoint(x, y).filter(function (elm) {
 | |
|         return name(elm) === 'table';
 | |
|       }).isSome();
 | |
|     };
 | |
|     var adjustForTable = function (bridge, movement, original, caret, numRetries) {
 | |
|       return adjustTil(bridge, movement, original, movement.move(caret, JUMP_SIZE), numRetries);
 | |
|     };
 | |
|     var adjustTil = function (bridge, movement, original, caret, numRetries) {
 | |
|       if (numRetries === 0) {
 | |
|         return Optional.some(caret);
 | |
|       }
 | |
|       if (isAtTable(bridge, caret.left, movement.point(caret))) {
 | |
|         return adjustForTable(bridge, movement, original, caret, numRetries - 1);
 | |
|       }
 | |
|       return bridge.situsFromPoint(caret.left, movement.point(caret)).bind(function (guess) {
 | |
|         return guess.start.fold(Optional.none, function (element) {
 | |
|           return getEntireBox(bridge, element).bind(function (guessBox) {
 | |
|             return movement.adjuster(bridge, element, guessBox, original, caret).fold(Optional.none, function (newCaret) {
 | |
|               return adjustTil(bridge, movement, original, newCaret, numRetries - 1);
 | |
|             });
 | |
|           }).orThunk(function () {
 | |
|             return Optional.some(caret);
 | |
|           });
 | |
|         }, Optional.none);
 | |
|       });
 | |
|     };
 | |
|     var ieTryDown = function (bridge, caret) {
 | |
|       return bridge.situsFromPoint(caret.left, caret.bottom + JUMP_SIZE);
 | |
|     };
 | |
|     var ieTryUp = function (bridge, caret) {
 | |
|       return bridge.situsFromPoint(caret.left, caret.top - JUMP_SIZE);
 | |
|     };
 | |
|     var checkScroll = function (movement, adjusted, bridge) {
 | |
|       if (movement.point(adjusted) > bridge.getInnerHeight()) {
 | |
|         return Optional.some(movement.point(adjusted) - bridge.getInnerHeight());
 | |
|       } else if (movement.point(adjusted) < 0) {
 | |
|         return Optional.some(-movement.point(adjusted));
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
|     var retry = function (movement, bridge, caret) {
 | |
|       var moved = movement.move(caret, JUMP_SIZE);
 | |
|       var adjusted = adjustTil(bridge, movement, caret, moved, NUM_RETRIES).getOr(moved);
 | |
|       return checkScroll(movement, adjusted, bridge).fold(function () {
 | |
|         return bridge.situsFromPoint(adjusted.left, movement.point(adjusted));
 | |
|       }, function (delta) {
 | |
|         bridge.scrollBy(0, delta);
 | |
|         return bridge.situsFromPoint(adjusted.left, movement.point(adjusted) - delta);
 | |
|       });
 | |
|     };
 | |
|     var Retries = {
 | |
|       tryUp: curry(retry, upMovement),
 | |
|       tryDown: curry(retry, downMovement),
 | |
|       ieTryUp: ieTryUp,
 | |
|       ieTryDown: ieTryDown,
 | |
|       getJumpSize: constant(JUMP_SIZE)
 | |
|     };
 | |
| 
 | |
|     var MAX_RETRIES = 20;
 | |
|     var findSpot = function (bridge, isRoot, direction) {
 | |
|       return bridge.getSelection().bind(function (sel) {
 | |
|         return tryBr(isRoot, sel.finish, sel.foffset, direction).fold(function () {
 | |
|           return Optional.some(point(sel.finish, sel.foffset));
 | |
|         }, function (brNeighbour) {
 | |
|           var range = bridge.fromSitus(brNeighbour);
 | |
|           var analysis = BeforeAfter.verify(bridge, sel.finish, sel.foffset, range.finish, range.foffset, direction.failure, isRoot);
 | |
|           return process(analysis);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var scan = function (bridge, isRoot, element, offset, direction, numRetries) {
 | |
|       if (numRetries === 0) {
 | |
|         return Optional.none();
 | |
|       }
 | |
|       return tryCursor(bridge, isRoot, element, offset, direction).bind(function (situs) {
 | |
|         var range = bridge.fromSitus(situs);
 | |
|         var analysis = BeforeAfter.verify(bridge, element, offset, range.finish, range.foffset, direction.failure, isRoot);
 | |
|         return BeforeAfter.cata(analysis, function () {
 | |
|           return Optional.none();
 | |
|         }, function () {
 | |
|           return Optional.some(situs);
 | |
|         }, function (cell) {
 | |
|           if (eq$1(element, cell) && offset === 0) {
 | |
|             return tryAgain(bridge, element, offset, moveUp, direction);
 | |
|           } else {
 | |
|             return scan(bridge, isRoot, cell, 0, direction, numRetries - 1);
 | |
|           }
 | |
|         }, function (cell) {
 | |
|           if (eq$1(element, cell) && offset === getEnd(cell)) {
 | |
|             return tryAgain(bridge, element, offset, moveDown, direction);
 | |
|           } else {
 | |
|             return scan(bridge, isRoot, cell, getEnd(cell), direction, numRetries - 1);
 | |
|           }
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var tryAgain = function (bridge, element, offset, move, direction) {
 | |
|       return getBoxAt(bridge, element, offset).bind(function (box) {
 | |
|         return tryAt(bridge, direction, move(box, Retries.getJumpSize()));
 | |
|       });
 | |
|     };
 | |
|     var tryAt = function (bridge, direction, box) {
 | |
|       var browser = detect$3().browser;
 | |
|       if (browser.isChrome() || browser.isSafari() || browser.isFirefox() || browser.isEdge()) {
 | |
|         return direction.otherRetry(bridge, box);
 | |
|       } else if (browser.isIE()) {
 | |
|         return direction.ieRetry(bridge, box);
 | |
|       } else {
 | |
|         return Optional.none();
 | |
|       }
 | |
|     };
 | |
|     var tryCursor = function (bridge, isRoot, element, offset, direction) {
 | |
|       return getBoxAt(bridge, element, offset).bind(function (box) {
 | |
|         return tryAt(bridge, direction, box);
 | |
|       });
 | |
|     };
 | |
|     var handle = function (bridge, isRoot, direction) {
 | |
|       return findSpot(bridge, isRoot, direction).bind(function (spot) {
 | |
|         return scan(bridge, isRoot, spot.element, spot.offset, direction, MAX_RETRIES).map(bridge.fromSitus);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var inSameTable = function (elem, table) {
 | |
|       return ancestor(elem, function (e) {
 | |
|         return parent(e).exists(function (p) {
 | |
|           return eq$1(p, table);
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var simulate = function (bridge, isRoot, direction, initial, anchor) {
 | |
|       return closest$1(initial, 'td,th', isRoot).bind(function (start) {
 | |
|         return closest$1(start, 'table', isRoot).bind(function (table) {
 | |
|           if (!inSameTable(anchor, table)) {
 | |
|             return Optional.none();
 | |
|           }
 | |
|           return handle(bridge, isRoot, direction).bind(function (range) {
 | |
|             return closest$1(range.finish, 'td,th', isRoot).map(function (finish) {
 | |
|               return {
 | |
|                 start: start,
 | |
|                 finish: finish,
 | |
|                 range: range
 | |
|               };
 | |
|             });
 | |
|           });
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var navigate = function (bridge, isRoot, direction, initial, anchor, precheck) {
 | |
|       if (detect$3().browser.isIE()) {
 | |
|         return Optional.none();
 | |
|       } else {
 | |
|         return precheck(initial, isRoot).orThunk(function () {
 | |
|           return simulate(bridge, isRoot, direction, initial, anchor).map(function (info) {
 | |
|             var range = info.range;
 | |
|             return Response.create(Optional.some(makeSitus(range.start, range.soffset, range.finish, range.foffset)), true);
 | |
|           });
 | |
|         });
 | |
|       }
 | |
|     };
 | |
|     var firstUpCheck = function (initial, isRoot) {
 | |
|       return closest$1(initial, 'tr', isRoot).bind(function (startRow) {
 | |
|         return closest$1(startRow, 'table', isRoot).bind(function (table) {
 | |
|           var rows = descendants(table, 'tr');
 | |
|           if (eq$1(startRow, rows[0])) {
 | |
|             return seekLeft(table, function (element) {
 | |
|               return last$1(element).isSome();
 | |
|             }, isRoot).map(function (last) {
 | |
|               var lastOffset = getEnd(last);
 | |
|               return Response.create(Optional.some(makeSitus(last, lastOffset, last, lastOffset)), true);
 | |
|             });
 | |
|           } else {
 | |
|             return Optional.none();
 | |
|           }
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var lastDownCheck = function (initial, isRoot) {
 | |
|       return closest$1(initial, 'tr', isRoot).bind(function (startRow) {
 | |
|         return closest$1(startRow, 'table', isRoot).bind(function (table) {
 | |
|           var rows = descendants(table, 'tr');
 | |
|           if (eq$1(startRow, rows[rows.length - 1])) {
 | |
|             return seekRight(table, function (element) {
 | |
|               return first(element).isSome();
 | |
|             }, isRoot).map(function (first) {
 | |
|               return Response.create(Optional.some(makeSitus(first, 0, first, 0)), true);
 | |
|             });
 | |
|           } else {
 | |
|             return Optional.none();
 | |
|           }
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var select = function (bridge, container, isRoot, direction, initial, anchor, selectRange) {
 | |
|       return simulate(bridge, isRoot, direction, initial, anchor).bind(function (info) {
 | |
|         return detect(container, isRoot, info.start, info.finish, selectRange);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var findCell = function (target, isRoot) {
 | |
|       return closest$1(target, 'td,th', isRoot);
 | |
|     };
 | |
|     var MouseSelection = function (bridge, container, isRoot, annotations) {
 | |
|       var cursor = value();
 | |
|       var clearstate = cursor.clear;
 | |
|       var applySelection = function (event) {
 | |
|         cursor.on(function (start) {
 | |
|           annotations.clearBeforeUpdate(container);
 | |
|           findCell(event.target, isRoot).each(function (finish) {
 | |
|             identify(start, finish, isRoot).each(function (cellSel) {
 | |
|               var boxes = cellSel.boxes.getOr([]);
 | |
|               if (boxes.length === 1) {
 | |
|                 var singleCell = boxes[0];
 | |
|                 var isNonEditableCell = getRaw(singleCell) === 'false';
 | |
|                 var isCellClosestContentEditable = is(closest(event.target), singleCell, eq$1);
 | |
|                 if (isNonEditableCell && isCellClosestContentEditable) {
 | |
|                   annotations.selectRange(container, boxes, singleCell, singleCell);
 | |
|                   bridge.selectContents(singleCell);
 | |
|                 }
 | |
|               } else if (boxes.length > 1) {
 | |
|                 annotations.selectRange(container, boxes, cellSel.start, cellSel.finish);
 | |
|                 bridge.selectContents(finish);
 | |
|               }
 | |
|             });
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var mousedown = function (event) {
 | |
|         annotations.clear(container);
 | |
|         findCell(event.target, isRoot).each(cursor.set);
 | |
|       };
 | |
|       var mouseover = function (event) {
 | |
|         applySelection(event);
 | |
|       };
 | |
|       var mouseup = function (event) {
 | |
|         applySelection(event);
 | |
|         clearstate();
 | |
|       };
 | |
|       return {
 | |
|         clearstate: clearstate,
 | |
|         mousedown: mousedown,
 | |
|         mouseover: mouseover,
 | |
|         mouseup: mouseup
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var down = {
 | |
|       traverse: nextSibling,
 | |
|       gather: after,
 | |
|       relative: Situ.before,
 | |
|       otherRetry: Retries.tryDown,
 | |
|       ieRetry: Retries.ieTryDown,
 | |
|       failure: BeforeAfter.failedDown
 | |
|     };
 | |
|     var up = {
 | |
|       traverse: prevSibling,
 | |
|       gather: before,
 | |
|       relative: Situ.before,
 | |
|       otherRetry: Retries.tryUp,
 | |
|       ieRetry: Retries.ieTryUp,
 | |
|       failure: BeforeAfter.failedUp
 | |
|     };
 | |
| 
 | |
|     var isKey = function (key) {
 | |
|       return function (keycode) {
 | |
|         return keycode === key;
 | |
|       };
 | |
|     };
 | |
|     var isUp = isKey(38);
 | |
|     var isDown = isKey(40);
 | |
|     var isNavigation = function (keycode) {
 | |
|       return keycode >= 37 && keycode <= 40;
 | |
|     };
 | |
|     var ltr = {
 | |
|       isBackward: isKey(37),
 | |
|       isForward: isKey(39)
 | |
|     };
 | |
|     var rtl = {
 | |
|       isBackward: isKey(39),
 | |
|       isForward: isKey(37)
 | |
|     };
 | |
| 
 | |
|     var get = function (_DOC) {
 | |
|       var doc = _DOC !== undefined ? _DOC.dom : document;
 | |
|       var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;
 | |
|       var y = doc.body.scrollTop || doc.documentElement.scrollTop;
 | |
|       return SugarPosition(x, y);
 | |
|     };
 | |
|     var by = function (x, y, _DOC) {
 | |
|       var doc = _DOC !== undefined ? _DOC.dom : document;
 | |
|       var win = doc.defaultView;
 | |
|       if (win) {
 | |
|         win.scrollBy(x, y);
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var WindowBridge = function (win) {
 | |
|       var elementFromPoint = function (x, y) {
 | |
|         return SugarElement.fromPoint(SugarElement.fromDom(win.document), x, y);
 | |
|       };
 | |
|       var getRect = function (element) {
 | |
|         return element.dom.getBoundingClientRect();
 | |
|       };
 | |
|       var getRangedRect = function (start, soffset, finish, foffset) {
 | |
|         var sel = SimSelection.exact(start, soffset, finish, foffset);
 | |
|         return getFirstRect(win, sel);
 | |
|       };
 | |
|       var getSelection = function () {
 | |
|         return get$1(win).map(function (exactAdt) {
 | |
|           return convertToRange(win, exactAdt);
 | |
|         });
 | |
|       };
 | |
|       var fromSitus = function (situs) {
 | |
|         var relative = SimSelection.relative(situs.start, situs.finish);
 | |
|         return convertToRange(win, relative);
 | |
|       };
 | |
|       var situsFromPoint = function (x, y) {
 | |
|         return getAtPoint(win, x, y).map(function (exact) {
 | |
|           return Situs.create(exact.start, exact.soffset, exact.finish, exact.foffset);
 | |
|         });
 | |
|       };
 | |
|       var clearSelection = function () {
 | |
|         clear(win);
 | |
|       };
 | |
|       var collapseSelection = function (toStart) {
 | |
|         if (toStart === void 0) {
 | |
|           toStart = false;
 | |
|         }
 | |
|         get$1(win).each(function (sel) {
 | |
|           return sel.fold(function (rng) {
 | |
|             return rng.collapse(toStart);
 | |
|           }, function (startSitu, finishSitu) {
 | |
|             var situ = toStart ? startSitu : finishSitu;
 | |
|             setRelative(win, situ, situ);
 | |
|           }, function (start, soffset, finish, foffset) {
 | |
|             var node = toStart ? start : finish;
 | |
|             var offset = toStart ? soffset : foffset;
 | |
|             setExact(win, node, offset, node, offset);
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var selectNode = function (element) {
 | |
|         setToElement(win, element, false);
 | |
|       };
 | |
|       var selectContents = function (element) {
 | |
|         setToElement(win, element);
 | |
|       };
 | |
|       var setSelection = function (sel) {
 | |
|         setExact(win, sel.start, sel.soffset, sel.finish, sel.foffset);
 | |
|       };
 | |
|       var setRelativeSelection = function (start, finish) {
 | |
|         setRelative(win, start, finish);
 | |
|       };
 | |
|       var getInnerHeight = function () {
 | |
|         return win.innerHeight;
 | |
|       };
 | |
|       var getScrollY = function () {
 | |
|         var pos = get(SugarElement.fromDom(win.document));
 | |
|         return pos.top;
 | |
|       };
 | |
|       var scrollBy = function (x, y) {
 | |
|         by(x, y, SugarElement.fromDom(win.document));
 | |
|       };
 | |
|       return {
 | |
|         elementFromPoint: elementFromPoint,
 | |
|         getRect: getRect,
 | |
|         getRangedRect: getRangedRect,
 | |
|         getSelection: getSelection,
 | |
|         fromSitus: fromSitus,
 | |
|         situsFromPoint: situsFromPoint,
 | |
|         clearSelection: clearSelection,
 | |
|         collapseSelection: collapseSelection,
 | |
|         setSelection: setSelection,
 | |
|         setRelativeSelection: setRelativeSelection,
 | |
|         selectNode: selectNode,
 | |
|         selectContents: selectContents,
 | |
|         getInnerHeight: getInnerHeight,
 | |
|         getScrollY: getScrollY,
 | |
|         scrollBy: scrollBy
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var rc = function (rows, cols) {
 | |
|       return {
 | |
|         rows: rows,
 | |
|         cols: cols
 | |
|       };
 | |
|     };
 | |
|     var mouse = function (win, container, isRoot, annotations) {
 | |
|       var bridge = WindowBridge(win);
 | |
|       var handlers = MouseSelection(bridge, container, isRoot, annotations);
 | |
|       return {
 | |
|         clearstate: handlers.clearstate,
 | |
|         mousedown: handlers.mousedown,
 | |
|         mouseover: handlers.mouseover,
 | |
|         mouseup: handlers.mouseup
 | |
|       };
 | |
|     };
 | |
|     var keyboard = function (win, container, isRoot, annotations) {
 | |
|       var bridge = WindowBridge(win);
 | |
|       var clearToNavigate = function () {
 | |
|         annotations.clear(container);
 | |
|         return Optional.none();
 | |
|       };
 | |
|       var keydown = function (event, start, soffset, finish, foffset, direction) {
 | |
|         var realEvent = event.raw;
 | |
|         var keycode = realEvent.which;
 | |
|         var shiftKey = realEvent.shiftKey === true;
 | |
|         var handler = retrieve$1(container, annotations.selectedSelector).fold(function () {
 | |
|           if (isNavigation(keycode) && !shiftKey) {
 | |
|             annotations.clearBeforeUpdate(container);
 | |
|           }
 | |
|           if (isDown(keycode) && shiftKey) {
 | |
|             return curry(select, bridge, container, isRoot, down, finish, start, annotations.selectRange);
 | |
|           } else if (isUp(keycode) && shiftKey) {
 | |
|             return curry(select, bridge, container, isRoot, up, finish, start, annotations.selectRange);
 | |
|           } else if (isDown(keycode)) {
 | |
|             return curry(navigate, bridge, isRoot, down, finish, start, lastDownCheck);
 | |
|           } else if (isUp(keycode)) {
 | |
|             return curry(navigate, bridge, isRoot, up, finish, start, firstUpCheck);
 | |
|           } else {
 | |
|             return Optional.none;
 | |
|           }
 | |
|         }, function (selected) {
 | |
|           var update$1 = function (attempts) {
 | |
|             return function () {
 | |
|               var navigation = findMap(attempts, function (delta) {
 | |
|                 return update(delta.rows, delta.cols, container, selected, annotations);
 | |
|               });
 | |
|               return navigation.fold(function () {
 | |
|                 return getEdges(container, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(function (edges) {
 | |
|                   var relative = isDown(keycode) || direction.isForward(keycode) ? Situ.after : Situ.before;
 | |
|                   bridge.setRelativeSelection(Situ.on(edges.first, 0), relative(edges.table));
 | |
|                   annotations.clear(container);
 | |
|                   return Response.create(Optional.none(), true);
 | |
|                 });
 | |
|               }, function (_) {
 | |
|                 return Optional.some(Response.create(Optional.none(), true));
 | |
|               });
 | |
|             };
 | |
|           };
 | |
|           if (isDown(keycode) && shiftKey) {
 | |
|             return update$1([rc(+1, 0)]);
 | |
|           } else if (isUp(keycode) && shiftKey) {
 | |
|             return update$1([rc(-1, 0)]);
 | |
|           } else if (direction.isBackward(keycode) && shiftKey) {
 | |
|             return update$1([
 | |
|               rc(0, -1),
 | |
|               rc(-1, 0)
 | |
|             ]);
 | |
|           } else if (direction.isForward(keycode) && shiftKey) {
 | |
|             return update$1([
 | |
|               rc(0, +1),
 | |
|               rc(+1, 0)
 | |
|             ]);
 | |
|           } else if (isNavigation(keycode) && !shiftKey) {
 | |
|             return clearToNavigate;
 | |
|           } else {
 | |
|             return Optional.none;
 | |
|           }
 | |
|         });
 | |
|         return handler();
 | |
|       };
 | |
|       var keyup = function (event, start, soffset, finish, foffset) {
 | |
|         return retrieve$1(container, annotations.selectedSelector).fold(function () {
 | |
|           var realEvent = event.raw;
 | |
|           var keycode = realEvent.which;
 | |
|           var shiftKey = realEvent.shiftKey === true;
 | |
|           if (!shiftKey) {
 | |
|             return Optional.none();
 | |
|           }
 | |
|           if (isNavigation(keycode)) {
 | |
|             return sync(container, isRoot, start, soffset, finish, foffset, annotations.selectRange);
 | |
|           } else {
 | |
|             return Optional.none();
 | |
|           }
 | |
|         }, Optional.none);
 | |
|       };
 | |
|       return {
 | |
|         keydown: keydown,
 | |
|         keyup: keyup
 | |
|       };
 | |
|     };
 | |
|     var external = function (win, container, isRoot, annotations) {
 | |
|       var bridge = WindowBridge(win);
 | |
|       return function (start, finish) {
 | |
|         annotations.clearBeforeUpdate(container);
 | |
|         identify(start, finish, isRoot).each(function (cellSel) {
 | |
|           var boxes = cellSel.boxes.getOr([]);
 | |
|           annotations.selectRange(container, boxes, cellSel.start, cellSel.finish);
 | |
|           bridge.selectContents(finish);
 | |
|           bridge.collapseSelection();
 | |
|         });
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var remove = function (element, classes) {
 | |
|       each$2(classes, function (x) {
 | |
|         remove$2(element, x);
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var addClass = function (clazz) {
 | |
|       return function (element) {
 | |
|         add(element, clazz);
 | |
|       };
 | |
|     };
 | |
|     var removeClasses = function (classes) {
 | |
|       return function (element) {
 | |
|         remove(element, classes);
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var byClass = function (ephemera) {
 | |
|       var addSelectionClass = addClass(ephemera.selected);
 | |
|       var removeSelectionClasses = removeClasses([
 | |
|         ephemera.selected,
 | |
|         ephemera.lastSelected,
 | |
|         ephemera.firstSelected
 | |
|       ]);
 | |
|       var clear = function (container) {
 | |
|         var sels = descendants(container, ephemera.selectedSelector);
 | |
|         each$2(sels, removeSelectionClasses);
 | |
|       };
 | |
|       var selectRange = function (container, cells, start, finish) {
 | |
|         clear(container);
 | |
|         each$2(cells, addSelectionClass);
 | |
|         add(start, ephemera.firstSelected);
 | |
|         add(finish, ephemera.lastSelected);
 | |
|       };
 | |
|       return {
 | |
|         clearBeforeUpdate: clear,
 | |
|         clear: clear,
 | |
|         selectRange: selectRange,
 | |
|         selectedSelector: ephemera.selectedSelector,
 | |
|         firstSelectedSelector: ephemera.firstSelectedSelector,
 | |
|         lastSelectedSelector: ephemera.lastSelectedSelector
 | |
|       };
 | |
|     };
 | |
|     var byAttr = function (ephemera, onSelection, onClear) {
 | |
|       var removeSelectionAttributes = function (element) {
 | |
|         remove$7(element, ephemera.selected);
 | |
|         remove$7(element, ephemera.firstSelected);
 | |
|         remove$7(element, ephemera.lastSelected);
 | |
|       };
 | |
|       var addSelectionAttribute = function (element) {
 | |
|         set$2(element, ephemera.selected, '1');
 | |
|       };
 | |
|       var clear = function (container) {
 | |
|         clearBeforeUpdate(container);
 | |
|         onClear();
 | |
|       };
 | |
|       var clearBeforeUpdate = function (container) {
 | |
|         var sels = descendants(container, ephemera.selectedSelector + ',' + ephemera.firstSelectedSelector + ',' + ephemera.lastSelectedSelector);
 | |
|         each$2(sels, removeSelectionAttributes);
 | |
|       };
 | |
|       var selectRange = function (container, cells, start, finish) {
 | |
|         clear(container);
 | |
|         each$2(cells, addSelectionAttribute);
 | |
|         set$2(start, ephemera.firstSelected, '1');
 | |
|         set$2(finish, ephemera.lastSelected, '1');
 | |
|         onSelection(cells, start, finish);
 | |
|       };
 | |
|       return {
 | |
|         clearBeforeUpdate: clearBeforeUpdate,
 | |
|         clear: clear,
 | |
|         selectRange: selectRange,
 | |
|         selectedSelector: ephemera.selectedSelector,
 | |
|         firstSelectedSelector: ephemera.firstSelectedSelector,
 | |
|         lastSelectedSelector: ephemera.lastSelectedSelector
 | |
|       };
 | |
|     };
 | |
|     var SelectionAnnotation = {
 | |
|       byClass: byClass,
 | |
|       byAttr: byAttr
 | |
|     };
 | |
| 
 | |
|     var getUpOrLeftCells = function (grid, selectedCells) {
 | |
|       var upGrid = grid.slice(0, selectedCells[selectedCells.length - 1].row + 1);
 | |
|       var upDetails = toDetailList(upGrid);
 | |
|       return bind$2(upDetails, function (detail) {
 | |
|         var slicedCells = detail.cells.slice(0, selectedCells[selectedCells.length - 1].column + 1);
 | |
|         return map$1(slicedCells, function (cell) {
 | |
|           return cell.element;
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var getDownOrRightCells = function (grid, selectedCells) {
 | |
|       var downGrid = grid.slice(selectedCells[0].row + selectedCells[0].rowspan - 1, grid.length);
 | |
|       var downDetails = toDetailList(downGrid);
 | |
|       return bind$2(downDetails, function (detail) {
 | |
|         var slicedCells = detail.cells.slice(selectedCells[0].column + selectedCells[0].colspan - 1, detail.cells.length);
 | |
|         return map$1(slicedCells, function (cell) {
 | |
|           return cell.element;
 | |
|         });
 | |
|       });
 | |
|     };
 | |
|     var getOtherCells = function (table, target, generators) {
 | |
|       var warehouse = Warehouse.fromTable(table);
 | |
|       var details = onCells(warehouse, target);
 | |
|       return details.map(function (selectedCells) {
 | |
|         var grid = toGrid(warehouse, generators, false);
 | |
|         var upOrLeftCells = getUpOrLeftCells(grid, selectedCells);
 | |
|         var downOrRightCells = getDownOrRightCells(grid, selectedCells);
 | |
|         return {
 | |
|           upOrLeftCells: upOrLeftCells,
 | |
|           downOrRightCells: downOrRightCells
 | |
|         };
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var global = tinymce.util.Tools.resolve('tinymce.Env');
 | |
| 
 | |
|     var hasInternalTarget = function (e) {
 | |
|       return has(SugarElement.fromDom(e.target), 'ephox-snooker-resizer-bar') === false;
 | |
|     };
 | |
|     function CellSelection (editor, lazyResize, selectionTargets) {
 | |
|       var onSelection = function (cells, start, finish) {
 | |
|         selectionTargets.targets().each(function (targets) {
 | |
|           var tableOpt = table(start);
 | |
|           tableOpt.each(function (table) {
 | |
|             var cloneFormats = getCloneElements(editor);
 | |
|             var generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), cloneFormats);
 | |
|             var otherCells = getOtherCells(table, targets, generators);
 | |
|             fireTableSelectionChange(editor, cells, start, finish, otherCells);
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var onClear = function () {
 | |
|         return fireTableSelectionClear(editor);
 | |
|       };
 | |
|       var annotations = SelectionAnnotation.byAttr(ephemera, onSelection, onClear);
 | |
|       editor.on('init', function (_e) {
 | |
|         var win = editor.getWin();
 | |
|         var body = getBody(editor);
 | |
|         var isRoot = getIsRoot(editor);
 | |
|         var syncSelection = function () {
 | |
|           var sel = editor.selection;
 | |
|           var start = SugarElement.fromDom(sel.getStart());
 | |
|           var end = SugarElement.fromDom(sel.getEnd());
 | |
|           var shared = sharedOne(table, [
 | |
|             start,
 | |
|             end
 | |
|           ]);
 | |
|           shared.fold(function () {
 | |
|             return annotations.clear(body);
 | |
|           }, noop);
 | |
|         };
 | |
|         var mouseHandlers = mouse(win, body, isRoot, annotations);
 | |
|         var keyHandlers = keyboard(win, body, isRoot, annotations);
 | |
|         var external$1 = external(win, body, isRoot, annotations);
 | |
|         var hasShiftKey = function (event) {
 | |
|           return event.raw.shiftKey === true;
 | |
|         };
 | |
|         editor.on('TableSelectorChange', function (e) {
 | |
|           return external$1(e.start, e.finish);
 | |
|         });
 | |
|         var handleResponse = function (event, response) {
 | |
|           if (!hasShiftKey(event)) {
 | |
|             return;
 | |
|           }
 | |
|           if (response.kill) {
 | |
|             event.kill();
 | |
|           }
 | |
|           response.selection.each(function (ns) {
 | |
|             var relative = SimSelection.relative(ns.start, ns.finish);
 | |
|             var rng = asLtrRange(win, relative);
 | |
|             editor.selection.setRng(rng);
 | |
|           });
 | |
|         };
 | |
|         var keyup = function (event) {
 | |
|           var wrappedEvent = fromRawEvent(event);
 | |
|           if (wrappedEvent.raw.shiftKey && isNavigation(wrappedEvent.raw.which)) {
 | |
|             var rng = editor.selection.getRng();
 | |
|             var start = SugarElement.fromDom(rng.startContainer);
 | |
|             var end = SugarElement.fromDom(rng.endContainer);
 | |
|             keyHandlers.keyup(wrappedEvent, start, rng.startOffset, end, rng.endOffset).each(function (response) {
 | |
|               handleResponse(wrappedEvent, response);
 | |
|             });
 | |
|           }
 | |
|         };
 | |
|         var keydown = function (event) {
 | |
|           var wrappedEvent = fromRawEvent(event);
 | |
|           lazyResize().each(function (resize) {
 | |
|             return resize.hideBars();
 | |
|           });
 | |
|           var rng = editor.selection.getRng();
 | |
|           var start = SugarElement.fromDom(rng.startContainer);
 | |
|           var end = SugarElement.fromDom(rng.endContainer);
 | |
|           var direction = onDirection(ltr, rtl)(SugarElement.fromDom(editor.selection.getStart()));
 | |
|           keyHandlers.keydown(wrappedEvent, start, rng.startOffset, end, rng.endOffset, direction).each(function (response) {
 | |
|             handleResponse(wrappedEvent, response);
 | |
|           });
 | |
|           lazyResize().each(function (resize) {
 | |
|             return resize.showBars();
 | |
|           });
 | |
|         };
 | |
|         var isLeftMouse = function (raw) {
 | |
|           return raw.button === 0;
 | |
|         };
 | |
|         var isLeftButtonPressed = function (raw) {
 | |
|           if (raw.buttons === undefined) {
 | |
|             return true;
 | |
|           }
 | |
|           if (global.browser.isEdge() && raw.buttons === 0) {
 | |
|             return true;
 | |
|           }
 | |
|           return (raw.buttons & 1) !== 0;
 | |
|         };
 | |
|         var dragStart = function (_e) {
 | |
|           mouseHandlers.clearstate();
 | |
|         };
 | |
|         var mouseDown = function (e) {
 | |
|           if (isLeftMouse(e) && hasInternalTarget(e)) {
 | |
|             mouseHandlers.mousedown(fromRawEvent(e));
 | |
|           }
 | |
|         };
 | |
|         var mouseOver = function (e) {
 | |
|           if (isLeftButtonPressed(e) && hasInternalTarget(e)) {
 | |
|             mouseHandlers.mouseover(fromRawEvent(e));
 | |
|           }
 | |
|         };
 | |
|         var mouseUp = function (e) {
 | |
|           if (isLeftMouse(e) && hasInternalTarget(e)) {
 | |
|             mouseHandlers.mouseup(fromRawEvent(e));
 | |
|           }
 | |
|         };
 | |
|         var getDoubleTap = function () {
 | |
|           var lastTarget = Cell(SugarElement.fromDom(body));
 | |
|           var lastTimeStamp = Cell(0);
 | |
|           var touchEnd = function (t) {
 | |
|             var target = SugarElement.fromDom(t.target);
 | |
|             if (name(target) === 'td' || name(target) === 'th') {
 | |
|               var lT = lastTarget.get();
 | |
|               var lTS = lastTimeStamp.get();
 | |
|               if (eq$1(lT, target) && t.timeStamp - lTS < 300) {
 | |
|                 t.preventDefault();
 | |
|                 external$1(target, target);
 | |
|               }
 | |
|             }
 | |
|             lastTarget.set(target);
 | |
|             lastTimeStamp.set(t.timeStamp);
 | |
|           };
 | |
|           return { touchEnd: touchEnd };
 | |
|         };
 | |
|         var doubleTap = getDoubleTap();
 | |
|         editor.on('dragstart', dragStart);
 | |
|         editor.on('mousedown', mouseDown);
 | |
|         editor.on('mouseover', mouseOver);
 | |
|         editor.on('mouseup', mouseUp);
 | |
|         editor.on('touchend', doubleTap.touchEnd);
 | |
|         editor.on('keyup', keyup);
 | |
|         editor.on('keydown', keydown);
 | |
|         editor.on('NodeChange', syncSelection);
 | |
|       });
 | |
|       return { clear: annotations.clear };
 | |
|     }
 | |
| 
 | |
|     var child = function (scope, selector) {
 | |
|       return child$1(scope, selector).isSome();
 | |
|     };
 | |
| 
 | |
|     var getSelectionTargets = function (editor, selections) {
 | |
|       var targets = Cell(Optional.none());
 | |
|       var changeHandlers = Cell([]);
 | |
|       var selectionDetails = Optional.none();
 | |
|       var isCaption = isTag('caption');
 | |
|       var isDisabledForSelection = function (key) {
 | |
|         return selectionDetails.forall(function (details) {
 | |
|           return !details[key];
 | |
|         });
 | |
|       };
 | |
|       var getStart = function () {
 | |
|         return getSelectionCellOrCaption(getSelectionStart(editor), getIsRoot(editor));
 | |
|       };
 | |
|       var getEnd = function () {
 | |
|         return getSelectionCellOrCaption(getSelectionEnd(editor), getIsRoot(editor));
 | |
|       };
 | |
|       var findTargets = function () {
 | |
|         return getStart().bind(function (startCellOrCaption) {
 | |
|           return flatten(lift2(table(startCellOrCaption), getEnd().bind(table), function (startTable, endTable) {
 | |
|             if (eq$1(startTable, endTable)) {
 | |
|               if (isCaption(startCellOrCaption)) {
 | |
|                 return Optional.some(noMenu(startCellOrCaption));
 | |
|               } else {
 | |
|                 return Optional.some(forMenu(selections, startTable, startCellOrCaption));
 | |
|               }
 | |
|             }
 | |
|             return Optional.none();
 | |
|           }));
 | |
|         });
 | |
|       };
 | |
|       var getExtractedDetails = function (targets) {
 | |
|         var tableOpt = table(targets.element);
 | |
|         return tableOpt.map(function (table) {
 | |
|           var warehouse = Warehouse.fromTable(table);
 | |
|           var selectedCells = onCells(warehouse, targets).getOr([]);
 | |
|           var locked = foldl(selectedCells, function (acc, cell) {
 | |
|             if (cell.isLocked) {
 | |
|               acc.onAny = true;
 | |
|               if (cell.column === 0) {
 | |
|                 acc.onFirst = true;
 | |
|               } else if (cell.column + cell.colspan >= warehouse.grid.columns) {
 | |
|                 acc.onLast = true;
 | |
|               }
 | |
|             }
 | |
|             return acc;
 | |
|           }, {
 | |
|             onAny: false,
 | |
|             onFirst: false,
 | |
|             onLast: false
 | |
|           });
 | |
|           return {
 | |
|             mergeable: onUnlockedMergable(warehouse, targets).isSome(),
 | |
|             unmergeable: onUnlockedUnmergable(warehouse, targets).isSome(),
 | |
|             locked: locked
 | |
|           };
 | |
|         });
 | |
|       };
 | |
|       var resetTargets = function () {
 | |
|         targets.set(cached(findTargets)());
 | |
|         selectionDetails = targets.get().bind(getExtractedDetails);
 | |
|         each$2(changeHandlers.get(), function (handler) {
 | |
|           return handler();
 | |
|         });
 | |
|       };
 | |
|       var setupHandler = function (handler) {
 | |
|         handler();
 | |
|         changeHandlers.set(changeHandlers.get().concat([handler]));
 | |
|         return function () {
 | |
|           changeHandlers.set(filter$2(changeHandlers.get(), function (h) {
 | |
|             return h !== handler;
 | |
|           }));
 | |
|         };
 | |
|       };
 | |
|       var onSetup = function (api, isDisabled) {
 | |
|         return setupHandler(function () {
 | |
|           return targets.get().fold(function () {
 | |
|             api.setDisabled(true);
 | |
|           }, function (targets) {
 | |
|             api.setDisabled(isDisabled(targets));
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var onSetupWithToggle = function (api, isDisabled, isActive) {
 | |
|         return setupHandler(function () {
 | |
|           return targets.get().fold(function () {
 | |
|             api.setDisabled(true);
 | |
|             api.setActive(false);
 | |
|           }, function (targets) {
 | |
|             api.setDisabled(isDisabled(targets));
 | |
|             api.setActive(isActive(targets));
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var isDisabledFromLocked = function (lockedDisable) {
 | |
|         return selectionDetails.exists(function (details) {
 | |
|           return details.locked[lockedDisable];
 | |
|         });
 | |
|       };
 | |
|       var onSetupTable = function (api) {
 | |
|         return onSetup(api, function (_) {
 | |
|           return false;
 | |
|         });
 | |
|       };
 | |
|       var onSetupCellOrRow = function (api) {
 | |
|         return onSetup(api, function (targets) {
 | |
|           return isCaption(targets.element);
 | |
|         });
 | |
|       };
 | |
|       var onSetupColumn = function (lockedDisable) {
 | |
|         return function (api) {
 | |
|           return onSetup(api, function (targets) {
 | |
|             return isCaption(targets.element) || isDisabledFromLocked(lockedDisable);
 | |
|           });
 | |
|         };
 | |
|       };
 | |
|       var onSetupPasteable = function (getClipboardData) {
 | |
|         return function (api) {
 | |
|           return onSetup(api, function (targets) {
 | |
|             return isCaption(targets.element) || getClipboardData().isNone();
 | |
|           });
 | |
|         };
 | |
|       };
 | |
|       var onSetupPasteableColumn = function (getClipboardData, lockedDisable) {
 | |
|         return function (api) {
 | |
|           return onSetup(api, function (targets) {
 | |
|             return isCaption(targets.element) || getClipboardData().isNone() || isDisabledFromLocked(lockedDisable);
 | |
|           });
 | |
|         };
 | |
|       };
 | |
|       var onSetupMergeable = function (api) {
 | |
|         return onSetup(api, function (_targets) {
 | |
|           return isDisabledForSelection('mergeable');
 | |
|         });
 | |
|       };
 | |
|       var onSetupUnmergeable = function (api) {
 | |
|         return onSetup(api, function (_targets) {
 | |
|           return isDisabledForSelection('unmergeable');
 | |
|         });
 | |
|       };
 | |
|       var onSetupTableWithCaption = function (api) {
 | |
|         return onSetupWithToggle(api, never, function (targets) {
 | |
|           var tableOpt = table(targets.element, getIsRoot(editor));
 | |
|           return tableOpt.exists(function (table) {
 | |
|             return child(table, 'caption');
 | |
|           });
 | |
|         });
 | |
|       };
 | |
|       var onSetupTableHeaders = function (command, headerType) {
 | |
|         return function (api) {
 | |
|           return onSetupWithToggle(api, function (targets) {
 | |
|             return isCaption(targets.element);
 | |
|           }, function () {
 | |
|             return editor.queryCommandValue(command) === headerType;
 | |
|           });
 | |
|         };
 | |
|       };
 | |
|       var onSetupTableRowHeaders = onSetupTableHeaders('mceTableRowType', 'header');
 | |
|       var onSetupTableColumnHeaders = onSetupTableHeaders('mceTableColType', 'th');
 | |
|       editor.on('NodeChange ExecCommand TableSelectorChange', resetTargets);
 | |
|       return {
 | |
|         onSetupTable: onSetupTable,
 | |
|         onSetupCellOrRow: onSetupCellOrRow,
 | |
|         onSetupColumn: onSetupColumn,
 | |
|         onSetupPasteable: onSetupPasteable,
 | |
|         onSetupPasteableColumn: onSetupPasteableColumn,
 | |
|         onSetupMergeable: onSetupMergeable,
 | |
|         onSetupUnmergeable: onSetupUnmergeable,
 | |
|         resetTargets: resetTargets,
 | |
|         onSetupTableWithCaption: onSetupTableWithCaption,
 | |
|         onSetupTableRowHeaders: onSetupTableRowHeaders,
 | |
|         onSetupTableColumnHeaders: onSetupTableColumnHeaders,
 | |
|         targets: targets.get
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     var addButtons = function (editor, selections, selectionTargets, clipboard) {
 | |
|       editor.ui.registry.addMenuButton('table', {
 | |
|         tooltip: 'Table',
 | |
|         icon: 'table',
 | |
|         fetch: function (callback) {
 | |
|           return callback('inserttable | cell row column | advtablesort | tableprops deletetable');
 | |
|         }
 | |
|       });
 | |
|       var cmd = function (command) {
 | |
|         return function () {
 | |
|           return editor.execCommand(command);
 | |
|         };
 | |
|       };
 | |
|       editor.ui.registry.addButton('tableprops', {
 | |
|         tooltip: 'Table properties',
 | |
|         onAction: cmd('mceTableProps'),
 | |
|         icon: 'table',
 | |
|         onSetup: selectionTargets.onSetupTable
 | |
|       });
 | |
|       editor.ui.registry.addButton('tabledelete', {
 | |
|         tooltip: 'Delete table',
 | |
|         onAction: cmd('mceTableDelete'),
 | |
|         icon: 'table-delete-table',
 | |
|         onSetup: selectionTargets.onSetupTable
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablecellprops', {
 | |
|         tooltip: 'Cell properties',
 | |
|         onAction: cmd('mceTableCellProps'),
 | |
|         icon: 'table-cell-properties',
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablemergecells', {
 | |
|         tooltip: 'Merge cells',
 | |
|         onAction: cmd('mceTableMergeCells'),
 | |
|         icon: 'table-merge-cells',
 | |
|         onSetup: selectionTargets.onSetupMergeable
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablesplitcells', {
 | |
|         tooltip: 'Split cell',
 | |
|         onAction: cmd('mceTableSplitCells'),
 | |
|         icon: 'table-split-cells',
 | |
|         onSetup: selectionTargets.onSetupUnmergeable
 | |
|       });
 | |
|       editor.ui.registry.addButton('tableinsertrowbefore', {
 | |
|         tooltip: 'Insert row before',
 | |
|         onAction: cmd('mceTableInsertRowBefore'),
 | |
|         icon: 'table-insert-row-above',
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addButton('tableinsertrowafter', {
 | |
|         tooltip: 'Insert row after',
 | |
|         onAction: cmd('mceTableInsertRowAfter'),
 | |
|         icon: 'table-insert-row-after',
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addButton('tabledeleterow', {
 | |
|         tooltip: 'Delete row',
 | |
|         onAction: cmd('mceTableDeleteRow'),
 | |
|         icon: 'table-delete-row',
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablerowprops', {
 | |
|         tooltip: 'Row properties',
 | |
|         onAction: cmd('mceTableRowProps'),
 | |
|         icon: 'table-row-properties',
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addButton('tableinsertcolbefore', {
 | |
|         tooltip: 'Insert column before',
 | |
|         onAction: cmd('mceTableInsertColBefore'),
 | |
|         icon: 'table-insert-column-before',
 | |
|         onSetup: selectionTargets.onSetupColumn('onFirst')
 | |
|       });
 | |
|       editor.ui.registry.addButton('tableinsertcolafter', {
 | |
|         tooltip: 'Insert column after',
 | |
|         onAction: cmd('mceTableInsertColAfter'),
 | |
|         icon: 'table-insert-column-after',
 | |
|         onSetup: selectionTargets.onSetupColumn('onLast')
 | |
|       });
 | |
|       editor.ui.registry.addButton('tabledeletecol', {
 | |
|         tooltip: 'Delete column',
 | |
|         onAction: cmd('mceTableDeleteCol'),
 | |
|         icon: 'table-delete-column',
 | |
|         onSetup: selectionTargets.onSetupColumn('onAny')
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablecutrow', {
 | |
|         tooltip: 'Cut row',
 | |
|         icon: 'cut-row',
 | |
|         onAction: cmd('mceTableCutRow'),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablecopyrow', {
 | |
|         tooltip: 'Copy row',
 | |
|         icon: 'duplicate-row',
 | |
|         onAction: cmd('mceTableCopyRow'),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablepasterowbefore', {
 | |
|         tooltip: 'Paste row before',
 | |
|         icon: 'paste-row-before',
 | |
|         onAction: cmd('mceTablePasteRowBefore'),
 | |
|         onSetup: selectionTargets.onSetupPasteable(clipboard.getRows)
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablepasterowafter', {
 | |
|         tooltip: 'Paste row after',
 | |
|         icon: 'paste-row-after',
 | |
|         onAction: cmd('mceTablePasteRowAfter'),
 | |
|         onSetup: selectionTargets.onSetupPasteable(clipboard.getRows)
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablecutcol', {
 | |
|         tooltip: 'Cut column',
 | |
|         icon: 'cut-column',
 | |
|         onAction: cmd('mceTableCutCol'),
 | |
|         onSetup: selectionTargets.onSetupColumn('onAny')
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablecopycol', {
 | |
|         tooltip: 'Copy column',
 | |
|         icon: 'duplicate-column',
 | |
|         onAction: cmd('mceTableCopyCol'),
 | |
|         onSetup: selectionTargets.onSetupColumn('onAny')
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablepastecolbefore', {
 | |
|         tooltip: 'Paste column before',
 | |
|         icon: 'paste-column-before',
 | |
|         onAction: cmd('mceTablePasteColBefore'),
 | |
|         onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onFirst')
 | |
|       });
 | |
|       editor.ui.registry.addButton('tablepastecolafter', {
 | |
|         tooltip: 'Paste column after',
 | |
|         icon: 'paste-column-after',
 | |
|         onAction: cmd('mceTablePasteColAfter'),
 | |
|         onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onLast')
 | |
|       });
 | |
|       editor.ui.registry.addButton('tableinsertdialog', {
 | |
|         tooltip: 'Insert table',
 | |
|         onAction: cmd('mceInsertTable'),
 | |
|         icon: 'table'
 | |
|       });
 | |
|       var tableClassList = filterNoneItem(getTableClassList(editor));
 | |
|       if (tableClassList.length !== 0) {
 | |
|         editor.ui.registry.addMenuButton('tableclass', {
 | |
|           icon: 'table-classes',
 | |
|           tooltip: 'Table styles',
 | |
|           fetch: generateMenuItemsCallback(editor, selections, tableClassList, 'tableclass', function (value) {
 | |
|             return editor.execCommand('mceTableToggleClass', false, value);
 | |
|           }),
 | |
|           onSetup: selectionTargets.onSetupTable
 | |
|         });
 | |
|       }
 | |
|       var tableCellClassList = filterNoneItem(getCellClassList(editor));
 | |
|       if (tableCellClassList.length !== 0) {
 | |
|         editor.ui.registry.addMenuButton('tablecellclass', {
 | |
|           icon: 'table-cell-classes',
 | |
|           tooltip: 'Cell styles',
 | |
|           fetch: generateMenuItemsCallback(editor, selections, tableCellClassList, 'tablecellclass', function (value) {
 | |
|             return editor.execCommand('mceTableCellToggleClass', false, value);
 | |
|           }),
 | |
|           onSetup: selectionTargets.onSetupCellOrRow
 | |
|         });
 | |
|       }
 | |
|       editor.ui.registry.addMenuButton('tablecellvalign', {
 | |
|         icon: 'vertical-align',
 | |
|         tooltip: 'Vertical align',
 | |
|         fetch: generateMenuItemsCallback(editor, selections, verticalAlignValues, 'tablecellverticalalign', applyTableCellStyle(editor, 'vertical-align')),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuButton('tablecellborderwidth', {
 | |
|         icon: 'border-width',
 | |
|         tooltip: 'Border width',
 | |
|         fetch: generateMenuItemsCallback(editor, selections, getTableBorderWidths(editor), 'tablecellborderwidth', applyTableCellStyle(editor, 'border-width')),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuButton('tablecellborderstyle', {
 | |
|         icon: 'border-style',
 | |
|         tooltip: 'Border style',
 | |
|         fetch: generateMenuItemsCallback(editor, selections, getTableBorderStyles(editor), 'tablecellborderstyle', applyTableCellStyle(editor, 'border-style')),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addToggleButton('tablecaption', {
 | |
|         tooltip: 'Table caption',
 | |
|         onAction: cmd('mceTableToggleCaption'),
 | |
|         icon: 'table-caption',
 | |
|         onSetup: selectionTargets.onSetupTableWithCaption
 | |
|       });
 | |
|       editor.ui.registry.addMenuButton('tablecellbackgroundcolor', {
 | |
|         icon: 'cell-background-color',
 | |
|         tooltip: 'Background color',
 | |
|         fetch: function (callback) {
 | |
|           return callback(buildColorMenu(editor, getTableBackgroundColorMap(editor), 'background-color'));
 | |
|         },
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuButton('tablecellbordercolor', {
 | |
|         icon: 'cell-border-color',
 | |
|         tooltip: 'Border color',
 | |
|         fetch: function (callback) {
 | |
|           return callback(buildColorMenu(editor, getTableBorderColorMap(editor), 'border-color'));
 | |
|         },
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addToggleButton('tablerowheader', {
 | |
|         tooltip: 'Row header',
 | |
|         icon: 'table-top-header',
 | |
|         onAction: changeRowHeader(editor),
 | |
|         onSetup: selectionTargets.onSetupTableRowHeaders
 | |
|       });
 | |
|       editor.ui.registry.addToggleButton('tablecolheader', {
 | |
|         tooltip: 'Column header',
 | |
|         icon: 'table-left-header',
 | |
|         onAction: changeColumnHeader(editor),
 | |
|         onSetup: selectionTargets.onSetupTableColumnHeaders
 | |
|       });
 | |
|     };
 | |
|     var addToolbars = function (editor) {
 | |
|       var isTable = function (table) {
 | |
|         return editor.dom.is(table, 'table') && editor.getBody().contains(table);
 | |
|       };
 | |
|       var toolbar = getToolbar(editor);
 | |
|       if (toolbar.length > 0) {
 | |
|         editor.ui.registry.addContextToolbar('table', {
 | |
|           predicate: isTable,
 | |
|           items: toolbar,
 | |
|           scope: 'node',
 | |
|           position: 'node'
 | |
|         });
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var addMenuItems = function (editor, selections, selectionTargets, clipboard) {
 | |
|       var cmd = function (command) {
 | |
|         return function () {
 | |
|           return editor.execCommand(command);
 | |
|         };
 | |
|       };
 | |
|       var insertTableAction = function (data) {
 | |
|         editor.execCommand('mceInsertTable', false, {
 | |
|           rows: data.numRows,
 | |
|           columns: data.numColumns
 | |
|         });
 | |
|       };
 | |
|       var tableProperties = {
 | |
|         text: 'Table properties',
 | |
|         onSetup: selectionTargets.onSetupTable,
 | |
|         onAction: cmd('mceTableProps')
 | |
|       };
 | |
|       var deleteTable = {
 | |
|         text: 'Delete table',
 | |
|         icon: 'table-delete-table',
 | |
|         onSetup: selectionTargets.onSetupTable,
 | |
|         onAction: cmd('mceTableDelete')
 | |
|       };
 | |
|       editor.ui.registry.addMenuItem('tableinsertrowbefore', {
 | |
|         text: 'Insert row before',
 | |
|         icon: 'table-insert-row-above',
 | |
|         onAction: cmd('mceTableInsertRowBefore'),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tableinsertrowafter', {
 | |
|         text: 'Insert row after',
 | |
|         icon: 'table-insert-row-after',
 | |
|         onAction: cmd('mceTableInsertRowAfter'),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tabledeleterow', {
 | |
|         text: 'Delete row',
 | |
|         icon: 'table-delete-row',
 | |
|         onAction: cmd('mceTableDeleteRow'),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablerowprops', {
 | |
|         text: 'Row properties',
 | |
|         icon: 'table-row-properties',
 | |
|         onAction: cmd('mceTableRowProps'),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablecutrow', {
 | |
|         text: 'Cut row',
 | |
|         icon: 'cut-row',
 | |
|         onAction: cmd('mceTableCutRow'),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablecopyrow', {
 | |
|         text: 'Copy row',
 | |
|         icon: 'duplicate-row',
 | |
|         onAction: cmd('mceTableCopyRow'),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablepasterowbefore', {
 | |
|         text: 'Paste row before',
 | |
|         icon: 'paste-row-before',
 | |
|         onAction: cmd('mceTablePasteRowBefore'),
 | |
|         onSetup: selectionTargets.onSetupPasteable(clipboard.getRows)
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablepasterowafter', {
 | |
|         text: 'Paste row after',
 | |
|         icon: 'paste-row-after',
 | |
|         onAction: cmd('mceTablePasteRowAfter'),
 | |
|         onSetup: selectionTargets.onSetupPasteable(clipboard.getRows)
 | |
|       });
 | |
|       var row = {
 | |
|         type: 'nestedmenuitem',
 | |
|         text: 'Row',
 | |
|         getSubmenuItems: constant('tableinsertrowbefore tableinsertrowafter tabledeleterow tablerowprops | tablecutrow tablecopyrow tablepasterowbefore tablepasterowafter')
 | |
|       };
 | |
|       editor.ui.registry.addMenuItem('tableinsertcolumnbefore', {
 | |
|         text: 'Insert column before',
 | |
|         icon: 'table-insert-column-before',
 | |
|         onAction: cmd('mceTableInsertColBefore'),
 | |
|         onSetup: selectionTargets.onSetupColumn('onFirst')
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tableinsertcolumnafter', {
 | |
|         text: 'Insert column after',
 | |
|         icon: 'table-insert-column-after',
 | |
|         onAction: cmd('mceTableInsertColAfter'),
 | |
|         onSetup: selectionTargets.onSetupColumn('onLast')
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tabledeletecolumn', {
 | |
|         text: 'Delete column',
 | |
|         icon: 'table-delete-column',
 | |
|         onAction: cmd('mceTableDeleteCol'),
 | |
|         onSetup: selectionTargets.onSetupColumn('onAny')
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablecutcolumn', {
 | |
|         text: 'Cut column',
 | |
|         icon: 'cut-column',
 | |
|         onAction: cmd('mceTableCutCol'),
 | |
|         onSetup: selectionTargets.onSetupColumn('onAny')
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablecopycolumn', {
 | |
|         text: 'Copy column',
 | |
|         icon: 'duplicate-column',
 | |
|         onAction: cmd('mceTableCopyCol'),
 | |
|         onSetup: selectionTargets.onSetupColumn('onAny')
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablepastecolumnbefore', {
 | |
|         text: 'Paste column before',
 | |
|         icon: 'paste-column-before',
 | |
|         onAction: cmd('mceTablePasteColBefore'),
 | |
|         onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onFirst')
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablepastecolumnafter', {
 | |
|         text: 'Paste column after',
 | |
|         icon: 'paste-column-after',
 | |
|         onAction: cmd('mceTablePasteColAfter'),
 | |
|         onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onLast')
 | |
|       });
 | |
|       var column = {
 | |
|         type: 'nestedmenuitem',
 | |
|         text: 'Column',
 | |
|         getSubmenuItems: constant('tableinsertcolumnbefore tableinsertcolumnafter tabledeletecolumn | tablecutcolumn tablecopycolumn tablepastecolumnbefore tablepastecolumnafter')
 | |
|       };
 | |
|       editor.ui.registry.addMenuItem('tablecellprops', {
 | |
|         text: 'Cell properties',
 | |
|         icon: 'table-cell-properties',
 | |
|         onAction: cmd('mceTableCellProps'),
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablemergecells', {
 | |
|         text: 'Merge cells',
 | |
|         icon: 'table-merge-cells',
 | |
|         onAction: cmd('mceTableMergeCells'),
 | |
|         onSetup: selectionTargets.onSetupMergeable
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tablesplitcells', {
 | |
|         text: 'Split cell',
 | |
|         icon: 'table-split-cells',
 | |
|         onAction: cmd('mceTableSplitCells'),
 | |
|         onSetup: selectionTargets.onSetupUnmergeable
 | |
|       });
 | |
|       var cell = {
 | |
|         type: 'nestedmenuitem',
 | |
|         text: 'Cell',
 | |
|         getSubmenuItems: constant('tablecellprops tablemergecells tablesplitcells')
 | |
|       };
 | |
|       if (hasTableGrid(editor) === false) {
 | |
|         editor.ui.registry.addMenuItem('inserttable', {
 | |
|           text: 'Table',
 | |
|           icon: 'table',
 | |
|           onAction: cmd('mceInsertTable')
 | |
|         });
 | |
|       } else {
 | |
|         editor.ui.registry.addNestedMenuItem('inserttable', {
 | |
|           text: 'Table',
 | |
|           icon: 'table',
 | |
|           getSubmenuItems: function () {
 | |
|             return [{
 | |
|                 type: 'fancymenuitem',
 | |
|                 fancytype: 'inserttable',
 | |
|                 onAction: insertTableAction
 | |
|               }];
 | |
|           }
 | |
|         });
 | |
|       }
 | |
|       editor.ui.registry.addMenuItem('inserttabledialog', {
 | |
|         text: 'Insert table',
 | |
|         icon: 'table',
 | |
|         onAction: cmd('mceInsertTable')
 | |
|       });
 | |
|       editor.ui.registry.addMenuItem('tableprops', tableProperties);
 | |
|       editor.ui.registry.addMenuItem('deletetable', deleteTable);
 | |
|       editor.ui.registry.addNestedMenuItem('row', row);
 | |
|       editor.ui.registry.addNestedMenuItem('column', column);
 | |
|       editor.ui.registry.addNestedMenuItem('cell', cell);
 | |
|       editor.ui.registry.addContextMenu('table', {
 | |
|         update: function () {
 | |
|           selectionTargets.resetTargets();
 | |
|           return selectionTargets.targets().fold(constant(''), function (targets) {
 | |
|             if (name(targets.element) === 'caption') {
 | |
|               return 'tableprops deletetable';
 | |
|             } else {
 | |
|               return 'cell row column | advtablesort | tableprops deletetable';
 | |
|             }
 | |
|           });
 | |
|         }
 | |
|       });
 | |
|       var tableClassList = filterNoneItem(getTableClassList(editor));
 | |
|       if (tableClassList.length !== 0) {
 | |
|         editor.ui.registry.addNestedMenuItem('tableclass', {
 | |
|           icon: 'table-classes',
 | |
|           text: 'Table styles',
 | |
|           getSubmenuItems: function () {
 | |
|             return buildMenuItems(editor, selections, tableClassList, 'tableclass', function (value) {
 | |
|               return editor.execCommand('mceTableToggleClass', false, value);
 | |
|             });
 | |
|           },
 | |
|           onSetup: selectionTargets.onSetupTable
 | |
|         });
 | |
|       }
 | |
|       var tableCellClassList = filterNoneItem(getCellClassList(editor));
 | |
|       if (tableCellClassList.length !== 0) {
 | |
|         editor.ui.registry.addNestedMenuItem('tablecellclass', {
 | |
|           icon: 'table-cell-classes',
 | |
|           text: 'Cell styles',
 | |
|           getSubmenuItems: function () {
 | |
|             return buildMenuItems(editor, selections, tableCellClassList, 'tablecellclass', function (value) {
 | |
|               return editor.execCommand('mceTableCellToggleClass', false, value);
 | |
|             });
 | |
|           },
 | |
|           onSetup: selectionTargets.onSetupCellOrRow
 | |
|         });
 | |
|       }
 | |
|       editor.ui.registry.addNestedMenuItem('tablecellvalign', {
 | |
|         icon: 'vertical-align',
 | |
|         text: 'Vertical align',
 | |
|         getSubmenuItems: function () {
 | |
|           return buildMenuItems(editor, selections, verticalAlignValues, 'tablecellverticalalign', applyTableCellStyle(editor, 'vertical-align'));
 | |
|         },
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addNestedMenuItem('tablecellborderwidth', {
 | |
|         icon: 'border-width',
 | |
|         text: 'Border width',
 | |
|         getSubmenuItems: function () {
 | |
|           return buildMenuItems(editor, selections, getTableBorderWidths(editor), 'tablecellborderwidth', applyTableCellStyle(editor, 'border-width'));
 | |
|         },
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addNestedMenuItem('tablecellborderstyle', {
 | |
|         icon: 'border-style',
 | |
|         text: 'Border style',
 | |
|         getSubmenuItems: function () {
 | |
|           return buildMenuItems(editor, selections, getTableBorderStyles(editor), 'tablecellborderstyle', applyTableCellStyle(editor, 'border-style'));
 | |
|         },
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addToggleMenuItem('tablecaption', {
 | |
|         icon: 'table-caption',
 | |
|         text: 'Table caption',
 | |
|         onAction: cmd('mceTableToggleCaption'),
 | |
|         onSetup: selectionTargets.onSetupTableWithCaption
 | |
|       });
 | |
|       editor.ui.registry.addNestedMenuItem('tablecellbackgroundcolor', {
 | |
|         icon: 'cell-background-color',
 | |
|         text: 'Background color',
 | |
|         getSubmenuItems: function () {
 | |
|           return buildColorMenu(editor, getTableBackgroundColorMap(editor), 'background-color');
 | |
|         },
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addNestedMenuItem('tablecellbordercolor', {
 | |
|         icon: 'cell-border-color',
 | |
|         text: 'Border color',
 | |
|         getSubmenuItems: function () {
 | |
|           return buildColorMenu(editor, getTableBorderColorMap(editor), 'border-color');
 | |
|         },
 | |
|         onSetup: selectionTargets.onSetupCellOrRow
 | |
|       });
 | |
|       editor.ui.registry.addToggleMenuItem('tablerowheader', {
 | |
|         text: 'Row header',
 | |
|         icon: 'table-top-header',
 | |
|         onAction: changeRowHeader(editor),
 | |
|         onSetup: selectionTargets.onSetupTableRowHeaders
 | |
|       });
 | |
|       editor.ui.registry.addToggleMenuItem('tablecolheader', {
 | |
|         text: 'Column header',
 | |
|         icon: 'table-left-header',
 | |
|         onAction: changeColumnHeader(editor),
 | |
|         onSetup: selectionTargets.onSetupTableColumnHeaders
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     var Plugin = function (editor) {
 | |
|       var selections = Selections(function () {
 | |
|         return getBody(editor);
 | |
|       }, function () {
 | |
|         return getSelectionCell(getSelectionStart(editor), getIsRoot(editor));
 | |
|       }, ephemera.selectedSelector);
 | |
|       var selectionTargets = getSelectionTargets(editor, selections);
 | |
|       var resizeHandler = getResizeHandler(editor);
 | |
|       var cellSelection = CellSelection(editor, resizeHandler.lazyResize, selectionTargets);
 | |
|       var actions = TableActions(editor, cellSelection, resizeHandler.lazyWire);
 | |
|       var clipboard = Clipboard();
 | |
|       registerCommands(editor, actions, cellSelection, selections, clipboard);
 | |
|       registerQueryCommands(editor, actions, selections);
 | |
|       registerEvents(editor, selections, actions);
 | |
|       addMenuItems(editor, selections, selectionTargets, clipboard);
 | |
|       addButtons(editor, selections, selectionTargets, clipboard);
 | |
|       addToolbars(editor);
 | |
|       editor.on('PreInit', function () {
 | |
|         editor.serializer.addTempAttr(ephemera.firstSelected);
 | |
|         editor.serializer.addTempAttr(ephemera.lastSelected);
 | |
|         registerFormats(editor);
 | |
|       });
 | |
|       if (hasTabNavigation(editor)) {
 | |
|         editor.on('keydown', function (e) {
 | |
|           handle$1(e, editor, cellSelection);
 | |
|         });
 | |
|       }
 | |
|       editor.on('remove', function () {
 | |
|         resizeHandler.destroy();
 | |
|       });
 | |
|       return getApi(editor, clipboard, resizeHandler, selectionTargets);
 | |
|     };
 | |
|     function Plugin$1 () {
 | |
|       global$3.add('table', Plugin);
 | |
|     }
 | |
| 
 | |
|     Plugin$1();
 | |
| 
 | |
| }());
 |