]> git.proxmox.com Git - framework7.git/blob - framework7/js/framework7.bundle.js
intial commit
[framework7.git] / framework7 / js / framework7.bundle.js
1 /**
2 * Framework7 4.0.5
3 * Full featured mobile HTML framework for building iOS & Android apps
4 * http://framework7.io/
5 *
6 * Copyright 2014-2019 Vladimir Kharlampidi
7 *
8 * Released under the MIT License
9 *
10 * Released on: February 14, 2019
11 */
12
13 (function (global, factory) {
14 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
15 typeof define === 'function' && define.amd ? define(factory) :
16 (global = global || self, global.Framework7 = factory());
17 }(this, function () { 'use strict';
18
19 /**
20 * Template7 1.4.1
21 * Mobile-first HTML template engine
22 *
23 * http://www.idangero.us/template7/
24 *
25 * Copyright 2019, Vladimir Kharlampidi
26 * The iDangero.us
27 * http://www.idangero.us/
28 *
29 * Licensed under MIT
30 *
31 * Released on: February 5, 2019
32 */
33
34 var t7ctx;
35 if (typeof window !== 'undefined') {
36 t7ctx = window;
37 } else if (typeof global !== 'undefined') {
38 t7ctx = global;
39 } else {
40 t7ctx = undefined;
41 }
42
43 var Template7Context = t7ctx;
44
45 var Template7Utils = {
46 quoteSingleRexExp: new RegExp('\'', 'g'),
47 quoteDoubleRexExp: new RegExp('"', 'g'),
48 isFunction: function isFunction(func) {
49 return typeof func === 'function';
50 },
51 escape: function escape(string) {
52 if ( string === void 0 ) string = '';
53
54 return string
55 .replace(/&/g, '&')
56 .replace(/</g, '&lt;')
57 .replace(/>/g, '&gt;')
58 .replace(/"/g, '&quot;')
59 .replace(/'/g, '&#039;');
60 },
61 helperToSlices: function helperToSlices(string) {
62 var quoteDoubleRexExp = Template7Utils.quoteDoubleRexExp;
63 var quoteSingleRexExp = Template7Utils.quoteSingleRexExp;
64 var helperParts = string.replace(/[{}#}]/g, '').trim().split(' ');
65 var slices = [];
66 var shiftIndex;
67 var i;
68 var j;
69 for (i = 0; i < helperParts.length; i += 1) {
70 var part = helperParts[i];
71 var blockQuoteRegExp = (void 0);
72 var openingQuote = (void 0);
73 if (i === 0) { slices.push(part); }
74 else if (part.indexOf('"') === 0 || part.indexOf('\'') === 0) {
75 blockQuoteRegExp = part.indexOf('"') === 0 ? quoteDoubleRexExp : quoteSingleRexExp;
76 openingQuote = part.indexOf('"') === 0 ? '"' : '\'';
77 // Plain String
78 if (part.match(blockQuoteRegExp).length === 2) {
79 // One word string
80 slices.push(part);
81 } else {
82 // Find closed Index
83 shiftIndex = 0;
84 for (j = i + 1; j < helperParts.length; j += 1) {
85 part += " " + (helperParts[j]);
86 if (helperParts[j].indexOf(openingQuote) >= 0) {
87 shiftIndex = j;
88 slices.push(part);
89 break;
90 }
91 }
92 if (shiftIndex) { i = shiftIndex; }
93 }
94 } else if (part.indexOf('=') > 0) {
95 // Hash
96 var hashParts = part.split('=');
97 var hashName = hashParts[0];
98 var hashContent = hashParts[1];
99 if (!blockQuoteRegExp) {
100 blockQuoteRegExp = hashContent.indexOf('"') === 0 ? quoteDoubleRexExp : quoteSingleRexExp;
101 openingQuote = hashContent.indexOf('"') === 0 ? '"' : '\'';
102 }
103 if (hashContent.match(blockQuoteRegExp).length !== 2) {
104 shiftIndex = 0;
105 for (j = i + 1; j < helperParts.length; j += 1) {
106 hashContent += " " + (helperParts[j]);
107 if (helperParts[j].indexOf(openingQuote) >= 0) {
108 shiftIndex = j;
109 break;
110 }
111 }
112 if (shiftIndex) { i = shiftIndex; }
113 }
114 var hash = [hashName, hashContent.replace(blockQuoteRegExp, '')];
115 slices.push(hash);
116 } else {
117 // Plain variable
118 slices.push(part);
119 }
120 }
121 return slices;
122 },
123 stringToBlocks: function stringToBlocks(string) {
124 var blocks = [];
125 var i;
126 var j;
127 if (!string) { return []; }
128 var stringBlocks = string.split(/({{[^{^}]*}})/);
129 for (i = 0; i < stringBlocks.length; i += 1) {
130 var block = stringBlocks[i];
131 if (block === '') { continue; }
132 if (block.indexOf('{{') < 0) {
133 blocks.push({
134 type: 'plain',
135 content: block,
136 });
137 } else {
138 if (block.indexOf('{/') >= 0) {
139 continue;
140 }
141 block = block
142 .replace(/{{([#/])*([ ])*/, '{{$1')
143 .replace(/([ ])*}}/, '}}');
144 if (block.indexOf('{#') < 0 && block.indexOf(' ') < 0 && block.indexOf('else') < 0) {
145 // Simple variable
146 blocks.push({
147 type: 'variable',
148 contextName: block.replace(/[{}]/g, ''),
149 });
150 continue;
151 }
152 // Helpers
153 var helperSlices = Template7Utils.helperToSlices(block);
154 var helperName = helperSlices[0];
155 var isPartial = helperName === '>';
156 var helperContext = [];
157 var helperHash = {};
158 for (j = 1; j < helperSlices.length; j += 1) {
159 var slice = helperSlices[j];
160 if (Array.isArray(slice)) {
161 // Hash
162 helperHash[slice[0]] = slice[1] === 'false' ? false : slice[1];
163 } else {
164 helperContext.push(slice);
165 }
166 }
167
168 if (block.indexOf('{#') >= 0) {
169 // Condition/Helper
170 var helperContent = '';
171 var elseContent = '';
172 var toSkip = 0;
173 var shiftIndex = (void 0);
174 var foundClosed = false;
175 var foundElse = false;
176 var depth = 0;
177 for (j = i + 1; j < stringBlocks.length; j += 1) {
178 if (stringBlocks[j].indexOf('{{#') >= 0) {
179 depth += 1;
180 }
181 if (stringBlocks[j].indexOf('{{/') >= 0) {
182 depth -= 1;
183 }
184 if (stringBlocks[j].indexOf(("{{#" + helperName)) >= 0) {
185 helperContent += stringBlocks[j];
186 if (foundElse) { elseContent += stringBlocks[j]; }
187 toSkip += 1;
188 } else if (stringBlocks[j].indexOf(("{{/" + helperName)) >= 0) {
189 if (toSkip > 0) {
190 toSkip -= 1;
191 helperContent += stringBlocks[j];
192 if (foundElse) { elseContent += stringBlocks[j]; }
193 } else {
194 shiftIndex = j;
195 foundClosed = true;
196 break;
197 }
198 } else if (stringBlocks[j].indexOf('else') >= 0 && depth === 0) {
199 foundElse = true;
200 } else {
201 if (!foundElse) { helperContent += stringBlocks[j]; }
202 if (foundElse) { elseContent += stringBlocks[j]; }
203 }
204 }
205 if (foundClosed) {
206 if (shiftIndex) { i = shiftIndex; }
207 if (helperName === 'raw') {
208 blocks.push({
209 type: 'plain',
210 content: helperContent,
211 });
212 } else {
213 blocks.push({
214 type: 'helper',
215 helperName: helperName,
216 contextName: helperContext,
217 content: helperContent,
218 inverseContent: elseContent,
219 hash: helperHash,
220 });
221 }
222 }
223 } else if (block.indexOf(' ') > 0) {
224 if (isPartial) {
225 helperName = '_partial';
226 if (helperContext[0]) {
227 if (helperContext[0].indexOf('[') === 0) { helperContext[0] = helperContext[0].replace(/[[\]]/g, ''); }
228 else { helperContext[0] = "\"" + (helperContext[0].replace(/"|'/g, '')) + "\""; }
229 }
230 }
231 blocks.push({
232 type: 'helper',
233 helperName: helperName,
234 contextName: helperContext,
235 hash: helperHash,
236 });
237 }
238 }
239 }
240 return blocks;
241 },
242 parseJsVariable: function parseJsVariable(expression, replace, object) {
243 return expression.split(/([+ \-*/^()&=|<>!%:?])/g).reduce(function (arr, part) {
244 if (!part) {
245 return arr;
246 }
247 if (part.indexOf(replace) < 0) {
248 arr.push(part);
249 return arr;
250 }
251 if (!object) {
252 arr.push(JSON.stringify(''));
253 return arr;
254 }
255
256 var variable = object;
257 if (part.indexOf((replace + ".")) >= 0) {
258 part.split((replace + "."))[1].split('.').forEach(function (partName) {
259 if (partName in variable) { variable = variable[partName]; }
260 else { variable = undefined; }
261 });
262 }
263 if (typeof variable === 'string') {
264 variable = JSON.stringify(variable);
265 }
266 if (variable === undefined) { variable = 'undefined'; }
267
268 arr.push(variable);
269 return arr;
270 }, []).join('');
271 },
272 parseJsParents: function parseJsParents(expression, parents) {
273 return expression.split(/([+ \-*^()&=|<>!%:?])/g).reduce(function (arr, part) {
274 if (!part) {
275 return arr;
276 }
277
278 if (part.indexOf('../') < 0) {
279 arr.push(part);
280 return arr;
281 }
282
283 if (!parents || parents.length === 0) {
284 arr.push(JSON.stringify(''));
285 return arr;
286 }
287
288 var levelsUp = part.split('../').length - 1;
289 var parentData = levelsUp > parents.length ? parents[parents.length - 1] : parents[levelsUp - 1];
290
291 var variable = parentData;
292 var parentPart = part.replace(/..\//g, '');
293 parentPart.split('.').forEach(function (partName) {
294 if (typeof variable[partName] !== 'undefined') { variable = variable[partName]; }
295 else { variable = 'undefined'; }
296 });
297 if (variable === false || variable === true) {
298 arr.push(JSON.stringify(variable));
299 return arr;
300 }
301 if (variable === null || variable === 'undefined') {
302 arr.push(JSON.stringify(''));
303 return arr;
304 }
305 arr.push(JSON.stringify(variable));
306 return arr;
307 }, []).join('');
308 },
309 getCompileVar: function getCompileVar(name, ctx, data) {
310 if ( data === void 0 ) data = 'data_1';
311
312 var variable = ctx;
313 var parts;
314 var levelsUp = 0;
315 var newDepth;
316 if (name.indexOf('../') === 0) {
317 levelsUp = name.split('../').length - 1;
318 newDepth = variable.split('_')[1] - levelsUp;
319 variable = "ctx_" + (newDepth >= 1 ? newDepth : 1);
320 parts = name.split('../')[levelsUp].split('.');
321 } else if (name.indexOf('@global') === 0) {
322 variable = 'Template7.global';
323 parts = name.split('@global.')[1].split('.');
324 } else if (name.indexOf('@root') === 0) {
325 variable = 'root';
326 parts = name.split('@root.')[1].split('.');
327 } else {
328 parts = name.split('.');
329 }
330 for (var i = 0; i < parts.length; i += 1) {
331 var part = parts[i];
332 if (part.indexOf('@') === 0) {
333 var dataLevel = data.split('_')[1];
334 if (levelsUp > 0) {
335 dataLevel = newDepth;
336 }
337 if (i > 0) {
338 variable += "[(data_" + dataLevel + " && data_" + dataLevel + "." + (part.replace('@', '')) + ")]";
339 } else {
340 variable = "(data_" + dataLevel + " && data_" + dataLevel + "." + (part.replace('@', '')) + ")";
341 }
342 } else if (Number.isFinite ? Number.isFinite(part) : Template7Context.isFinite(part)) {
343 variable += "[" + part + "]";
344 } else if (part === 'this' || part.indexOf('this.') >= 0 || part.indexOf('this[') >= 0 || part.indexOf('this(') >= 0) {
345 variable = part.replace('this', ctx);
346 } else {
347 variable += "." + part;
348 }
349 }
350 return variable;
351 },
352 getCompiledArguments: function getCompiledArguments(contextArray, ctx, data) {
353 var arr = [];
354 for (var i = 0; i < contextArray.length; i += 1) {
355 if (/^['"]/.test(contextArray[i])) { arr.push(contextArray[i]); }
356 else if (/^(true|false|\d+)$/.test(contextArray[i])) { arr.push(contextArray[i]); }
357 else {
358 arr.push(Template7Utils.getCompileVar(contextArray[i], ctx, data));
359 }
360 }
361
362 return arr.join(', ');
363 },
364 };
365
366 /* eslint no-eval: "off" */
367
368 var Template7Helpers = {
369 _partial: function _partial(partialName, options) {
370 var ctx = this;
371 var p = Template7Class.partials[partialName];
372 if (!p || (p && !p.template)) { return ''; }
373 if (!p.compiled) {
374 p.compiled = new Template7Class(p.template).compile();
375 }
376 Object.keys(options.hash).forEach(function (hashName) {
377 ctx[hashName] = options.hash[hashName];
378 });
379 return p.compiled(ctx, options.data, options.root);
380 },
381 escape: function escape(context) {
382 if (typeof context !== 'string') {
383 throw new Error('Template7: Passed context to "escape" helper should be a string');
384 }
385 return Template7Utils.escape(context);
386 },
387 if: function if$1(context, options) {
388 var ctx = context;
389 if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
390 if (ctx) {
391 return options.fn(this, options.data);
392 }
393
394 return options.inverse(this, options.data);
395 },
396 unless: function unless(context, options) {
397 var ctx = context;
398 if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
399 if (!ctx) {
400 return options.fn(this, options.data);
401 }
402
403 return options.inverse(this, options.data);
404 },
405 each: function each(context, options) {
406 var ctx = context;
407 var ret = '';
408 var i = 0;
409 if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
410 if (Array.isArray(ctx)) {
411 if (options.hash.reverse) {
412 ctx = ctx.reverse();
413 }
414 for (i = 0; i < ctx.length; i += 1) {
415 ret += options.fn(ctx[i], { first: i === 0, last: i === ctx.length - 1, index: i });
416 }
417 if (options.hash.reverse) {
418 ctx = ctx.reverse();
419 }
420 } else {
421 // eslint-disable-next-line
422 for (var key in ctx) {
423 i += 1;
424 ret += options.fn(ctx[key], { key: key });
425 }
426 }
427 if (i > 0) { return ret; }
428 return options.inverse(this);
429 },
430 with: function with$1(context, options) {
431 var ctx = context;
432 if (Template7Utils.isFunction(ctx)) { ctx = context.call(this); }
433 return options.fn(ctx);
434 },
435 join: function join(context, options) {
436 var ctx = context;
437 if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
438 return ctx.join(options.hash.delimiter || options.hash.delimeter);
439 },
440 js: function js(expression, options) {
441 var data = options.data;
442 var func;
443 var execute = expression;
444 ('index first last key').split(' ').forEach(function (prop) {
445 if (typeof data[prop] !== 'undefined') {
446 var re1 = new RegExp(("this.@" + prop), 'g');
447 var re2 = new RegExp(("@" + prop), 'g');
448 execute = execute
449 .replace(re1, JSON.stringify(data[prop]))
450 .replace(re2, JSON.stringify(data[prop]));
451 }
452 });
453 if (options.root && execute.indexOf('@root') >= 0) {
454 execute = Template7Utils.parseJsVariable(execute, '@root', options.root);
455 }
456 if (execute.indexOf('@global') >= 0) {
457 execute = Template7Utils.parseJsVariable(execute, '@global', Template7Context.Template7.global);
458 }
459 if (execute.indexOf('../') >= 0) {
460 execute = Template7Utils.parseJsParents(execute, options.parents);
461 }
462 if (execute.indexOf('return') >= 0) {
463 func = "(function(){" + execute + "})";
464 } else {
465 func = "(function(){return (" + execute + ")})";
466 }
467 return eval(func).call(this);
468 },
469 js_if: function js_if(expression, options) {
470 var data = options.data;
471 var func;
472 var execute = expression;
473 ('index first last key').split(' ').forEach(function (prop) {
474 if (typeof data[prop] !== 'undefined') {
475 var re1 = new RegExp(("this.@" + prop), 'g');
476 var re2 = new RegExp(("@" + prop), 'g');
477 execute = execute
478 .replace(re1, JSON.stringify(data[prop]))
479 .replace(re2, JSON.stringify(data[prop]));
480 }
481 });
482 if (options.root && execute.indexOf('@root') >= 0) {
483 execute = Template7Utils.parseJsVariable(execute, '@root', options.root);
484 }
485 if (execute.indexOf('@global') >= 0) {
486 execute = Template7Utils.parseJsVariable(execute, '@global', Template7Context.Template7.global);
487 }
488 if (execute.indexOf('../') >= 0) {
489 execute = Template7Utils.parseJsParents(execute, options.parents);
490 }
491 if (execute.indexOf('return') >= 0) {
492 func = "(function(){" + execute + "})";
493 } else {
494 func = "(function(){return (" + execute + ")})";
495 }
496 var condition = eval(func).call(this);
497 if (condition) {
498 return options.fn(this, options.data);
499 }
500
501 return options.inverse(this, options.data);
502 },
503 };
504 Template7Helpers.js_compare = Template7Helpers.js_if;
505
506 var Template7Options = {};
507 var Template7Partials = {};
508
509 var Template7Class = function Template7Class(template) {
510 var t = this;
511 t.template = template;
512 };
513
514 var staticAccessors = { options: { configurable: true },partials: { configurable: true },helpers: { configurable: true } };
515 Template7Class.prototype.compile = function compile (template, depth) {
516 if ( template === void 0 ) template = this.template;
517 if ( depth === void 0 ) depth = 1;
518
519 var t = this;
520 if (t.compiled) { return t.compiled; }
521
522 if (typeof template !== 'string') {
523 throw new Error('Template7: Template must be a string');
524 }
525 var stringToBlocks = Template7Utils.stringToBlocks;
526 var getCompileVar = Template7Utils.getCompileVar;
527 var getCompiledArguments = Template7Utils.getCompiledArguments;
528
529 var blocks = stringToBlocks(template);
530 var ctx = "ctx_" + depth;
531 var data = "data_" + depth;
532 if (blocks.length === 0) {
533 return function empty() { return ''; };
534 }
535
536 function getCompileFn(block, newDepth) {
537 if (block.content) { return t.compile(block.content, newDepth); }
538 return function empty() { return ''; };
539 }
540 function getCompileInverse(block, newDepth) {
541 if (block.inverseContent) { return t.compile(block.inverseContent, newDepth); }
542 return function empty() { return ''; };
543 }
544
545 var resultString = '';
546 if (depth === 1) {
547 resultString += "(function (" + ctx + ", " + data + ", root) {\n";
548 } else {
549 resultString += "(function (" + ctx + ", " + data + ") {\n";
550 }
551 if (depth === 1) {
552 resultString += 'function isArray(arr){return Array.isArray(arr);}\n';
553 resultString += 'function isFunction(func){return (typeof func === \'function\');}\n';
554 resultString += 'function c(val, ctx) {if (typeof val !== "undefined" && val !== null) {if (isFunction(val)) {return val.call(ctx);} else return val;} else return "";}\n';
555 resultString += 'root = root || ctx_1 || {};\n';
556 }
557 resultString += 'var r = \'\';\n';
558 var i;
559 for (i = 0; i < blocks.length; i += 1) {
560 var block = blocks[i];
561 // Plain block
562 if (block.type === 'plain') {
563 // eslint-disable-next-line
564 resultString += "r +='" + ((block.content).replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/'/g, '\\' + '\'')) + "';";
565 continue;
566 }
567 var variable = (void 0);
568 var compiledArguments = (void 0);
569 // Variable block
570 if (block.type === 'variable') {
571 variable = getCompileVar(block.contextName, ctx, data);
572 resultString += "r += c(" + variable + ", " + ctx + ");";
573 }
574 // Helpers block
575 if (block.type === 'helper') {
576 var parents = (void 0);
577 if (ctx !== 'ctx_1') {
578 var level = ctx.split('_')[1];
579 var parentsString = "ctx_" + (level - 1);
580 for (var j = level - 2; j >= 1; j -= 1) {
581 parentsString += ", ctx_" + j;
582 }
583 parents = "[" + parentsString + "]";
584 } else {
585 parents = "[" + ctx + "]";
586 }
587 var dynamicHelper = (void 0);
588 if (block.helperName.indexOf('[') === 0) {
589 block.helperName = getCompileVar(block.helperName.replace(/[[\]]/g, ''), ctx, data);
590 dynamicHelper = true;
591 }
592 if (dynamicHelper || block.helperName in Template7Helpers) {
593 compiledArguments = getCompiledArguments(block.contextName, ctx, data);
594 resultString += "r += (Template7Helpers" + (dynamicHelper ? ("[" + (block.helperName) + "]") : ("." + (block.helperName))) + ").call(" + ctx + ", " + (compiledArguments && ((compiledArguments + ", "))) + "{hash:" + (JSON.stringify(block.hash)) + ", data: " + data + " || {}, fn: " + (getCompileFn(block, depth + 1)) + ", inverse: " + (getCompileInverse(block, depth + 1)) + ", root: root, parents: " + parents + "});";
595 } else if (block.contextName.length > 0) {
596 throw new Error(("Template7: Missing helper: \"" + (block.helperName) + "\""));
597 } else {
598 variable = getCompileVar(block.helperName, ctx, data);
599 resultString += "if (" + variable + ") {";
600 resultString += "if (isArray(" + variable + ")) {";
601 resultString += "r += (Template7Helpers.each).call(" + ctx + ", " + variable + ", {hash:" + (JSON.stringify(block.hash)) + ", data: " + data + " || {}, fn: " + (getCompileFn(block, depth + 1)) + ", inverse: " + (getCompileInverse(block, depth + 1)) + ", root: root, parents: " + parents + "});";
602 resultString += '}else {';
603 resultString += "r += (Template7Helpers.with).call(" + ctx + ", " + variable + ", {hash:" + (JSON.stringify(block.hash)) + ", data: " + data + " || {}, fn: " + (getCompileFn(block, depth + 1)) + ", inverse: " + (getCompileInverse(block, depth + 1)) + ", root: root, parents: " + parents + "});";
604 resultString += '}}';
605 }
606 }
607 }
608 resultString += '\nreturn r;})';
609
610 if (depth === 1) {
611 // eslint-disable-next-line
612 t.compiled = eval(resultString);
613 return t.compiled;
614 }
615 return resultString;
616 };
617 staticAccessors.options.get = function () {
618 return Template7Options;
619 };
620 staticAccessors.partials.get = function () {
621 return Template7Partials;
622 };
623 staticAccessors.helpers.get = function () {
624 return Template7Helpers;
625 };
626
627 Object.defineProperties( Template7Class, staticAccessors );
628
629 function Template7() {
630 var args = [], len = arguments.length;
631 while ( len-- ) args[ len ] = arguments[ len ];
632
633 var template = args[0];
634 var data = args[1];
635 if (args.length === 2) {
636 var instance = new Template7Class(template);
637 var rendered = instance.compile()(data);
638 instance = null;
639 return (rendered);
640 }
641 return new Template7Class(template);
642 }
643 Template7.registerHelper = function registerHelper(name, fn) {
644 Template7Class.helpers[name] = fn;
645 };
646 Template7.unregisterHelper = function unregisterHelper(name) {
647 Template7Class.helpers[name] = undefined;
648 delete Template7Class.helpers[name];
649 };
650 Template7.registerPartial = function registerPartial(name, template) {
651 Template7Class.partials[name] = { template: template };
652 };
653 Template7.unregisterPartial = function unregisterPartial(name) {
654 if (Template7Class.partials[name]) {
655 Template7Class.partials[name] = undefined;
656 delete Template7Class.partials[name];
657 }
658 };
659 Template7.compile = function compile(template, options) {
660 var instance = new Template7Class(template, options);
661 return instance.compile();
662 };
663
664 Template7.options = Template7Class.options;
665 Template7.helpers = Template7Class.helpers;
666 Template7.partials = Template7Class.partials;
667
668 /**
669 * SSR Window 1.0.1
670 * Better handling for window object in SSR environment
671 * https://github.com/nolimits4web/ssr-window
672 *
673 * Copyright 2018, Vladimir Kharlampidi
674 *
675 * Licensed under MIT
676 *
677 * Released on: July 18, 2018
678 */
679 var doc = (typeof document === 'undefined') ? {
680 body: {},
681 addEventListener: function addEventListener() {},
682 removeEventListener: function removeEventListener() {},
683 activeElement: {
684 blur: function blur() {},
685 nodeName: '',
686 },
687 querySelector: function querySelector() {
688 return null;
689 },
690 querySelectorAll: function querySelectorAll() {
691 return [];
692 },
693 getElementById: function getElementById() {
694 return null;
695 },
696 createEvent: function createEvent() {
697 return {
698 initEvent: function initEvent() {},
699 };
700 },
701 createElement: function createElement() {
702 return {
703 children: [],
704 childNodes: [],
705 style: {},
706 setAttribute: function setAttribute() {},
707 getElementsByTagName: function getElementsByTagName() {
708 return [];
709 },
710 };
711 },
712 location: { hash: '' },
713 } : document; // eslint-disable-line
714
715 var win = (typeof window === 'undefined') ? {
716 document: doc,
717 navigator: {
718 userAgent: '',
719 },
720 location: {},
721 history: {},
722 CustomEvent: function CustomEvent() {
723 return this;
724 },
725 addEventListener: function addEventListener() {},
726 removeEventListener: function removeEventListener() {},
727 getComputedStyle: function getComputedStyle() {
728 return {
729 getPropertyValue: function getPropertyValue() {
730 return '';
731 },
732 };
733 },
734 Image: function Image() {},
735 Date: function Date() {},
736 screen: {},
737 setTimeout: function setTimeout() {},
738 clearTimeout: function clearTimeout() {},
739 } : window; // eslint-disable-line
740
741 /**
742 * Dom7 2.1.3
743 * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API
744 * http://framework7.io/docs/dom.html
745 *
746 * Copyright 2019, Vladimir Kharlampidi
747 * The iDangero.us
748 * http://www.idangero.us/
749 *
750 * Licensed under MIT
751 *
752 * Released on: February 11, 2019
753 */
754
755 var Dom7 = function Dom7(arr) {
756 var self = this;
757 // Create array-like object
758 for (var i = 0; i < arr.length; i += 1) {
759 self[i] = arr[i];
760 }
761 self.length = arr.length;
762 // Return collection with methods
763 return this;
764 };
765
766 function $(selector, context) {
767 var arr = [];
768 var i = 0;
769 if (selector && !context) {
770 if (selector instanceof Dom7) {
771 return selector;
772 }
773 }
774 if (selector) {
775 // String
776 if (typeof selector === 'string') {
777 var els;
778 var tempParent;
779 var html = selector.trim();
780 if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
781 var toCreate = 'div';
782 if (html.indexOf('<li') === 0) { toCreate = 'ul'; }
783 if (html.indexOf('<tr') === 0) { toCreate = 'tbody'; }
784 if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) { toCreate = 'tr'; }
785 if (html.indexOf('<tbody') === 0) { toCreate = 'table'; }
786 if (html.indexOf('<option') === 0) { toCreate = 'select'; }
787 tempParent = doc.createElement(toCreate);
788 tempParent.innerHTML = html;
789 for (i = 0; i < tempParent.childNodes.length; i += 1) {
790 arr.push(tempParent.childNodes[i]);
791 }
792 } else {
793 if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {
794 // Pure ID selector
795 els = [doc.getElementById(selector.trim().split('#')[1])];
796 } else {
797 // Other selectors
798 els = (context || doc).querySelectorAll(selector.trim());
799 }
800 for (i = 0; i < els.length; i += 1) {
801 if (els[i]) { arr.push(els[i]); }
802 }
803 }
804 } else if (selector.nodeType || selector === win || selector === doc) {
805 // Node/element
806 arr.push(selector);
807 } else if (selector.length > 0 && selector[0].nodeType) {
808 // Array of elements or instance of Dom
809 for (i = 0; i < selector.length; i += 1) {
810 arr.push(selector[i]);
811 }
812 }
813 }
814 return new Dom7(arr);
815 }
816
817 $.fn = Dom7.prototype;
818 $.Class = Dom7;
819 $.Dom7 = Dom7;
820
821 function unique(arr) {
822 var uniqueArray = [];
823 for (var i = 0; i < arr.length; i += 1) {
824 if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }
825 }
826 return uniqueArray;
827 }
828 function toCamelCase(string) {
829 return string.toLowerCase().replace(/-(.)/g, function (match, group1) { return group1.toUpperCase(); });
830 }
831
832 function requestAnimationFrame(callback) {
833 if (win.requestAnimationFrame) { return win.requestAnimationFrame(callback); }
834 else if (win.webkitRequestAnimationFrame) { return win.webkitRequestAnimationFrame(callback); }
835 return win.setTimeout(callback, 1000 / 60);
836 }
837 function cancelAnimationFrame(id) {
838 if (win.cancelAnimationFrame) { return win.cancelAnimationFrame(id); }
839 else if (win.webkitCancelAnimationFrame) { return win.webkitCancelAnimationFrame(id); }
840 return win.clearTimeout(id);
841 }
842
843 // Classes and attributes
844 function addClass(className) {
845 if (typeof className === 'undefined') {
846 return this;
847 }
848 var classes = className.split(' ');
849 for (var i = 0; i < classes.length; i += 1) {
850 for (var j = 0; j < this.length; j += 1) {
851 if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }
852 }
853 }
854 return this;
855 }
856 function removeClass(className) {
857 var classes = className.split(' ');
858 for (var i = 0; i < classes.length; i += 1) {
859 for (var j = 0; j < this.length; j += 1) {
860 if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }
861 }
862 }
863 return this;
864 }
865 function hasClass(className) {
866 if (!this[0]) { return false; }
867 return this[0].classList.contains(className);
868 }
869 function toggleClass(className) {
870 var classes = className.split(' ');
871 for (var i = 0; i < classes.length; i += 1) {
872 for (var j = 0; j < this.length; j += 1) {
873 if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }
874 }
875 }
876 return this;
877 }
878 function attr(attrs, value) {
879 var arguments$1 = arguments;
880
881 if (arguments.length === 1 && typeof attrs === 'string') {
882 // Get attr
883 if (this[0]) { return this[0].getAttribute(attrs); }
884 return undefined;
885 }
886
887 // Set attrs
888 for (var i = 0; i < this.length; i += 1) {
889 if (arguments$1.length === 2) {
890 // String
891 this[i].setAttribute(attrs, value);
892 } else {
893 // Object
894 // eslint-disable-next-line
895 for (var attrName in attrs) {
896 this[i][attrName] = attrs[attrName];
897 this[i].setAttribute(attrName, attrs[attrName]);
898 }
899 }
900 }
901 return this;
902 }
903 // eslint-disable-next-line
904 function removeAttr(attr) {
905 for (var i = 0; i < this.length; i += 1) {
906 this[i].removeAttribute(attr);
907 }
908 return this;
909 }
910 // eslint-disable-next-line
911 function prop(props, value) {
912 var arguments$1 = arguments;
913
914 if (arguments.length === 1 && typeof props === 'string') {
915 // Get prop
916 if (this[0]) { return this[0][props]; }
917 } else {
918 // Set props
919 for (var i = 0; i < this.length; i += 1) {
920 if (arguments$1.length === 2) {
921 // String
922 this[i][props] = value;
923 } else {
924 // Object
925 // eslint-disable-next-line
926 for (var propName in props) {
927 this[i][propName] = props[propName];
928 }
929 }
930 }
931 return this;
932 }
933 }
934 function data(key, value) {
935 var el;
936 if (typeof value === 'undefined') {
937 el = this[0];
938 // Get value
939 if (el) {
940 if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {
941 return el.dom7ElementDataStorage[key];
942 }
943
944 var dataKey = el.getAttribute(("data-" + key));
945 if (dataKey) {
946 return dataKey;
947 }
948 return undefined;
949 }
950 return undefined;
951 }
952
953 // Set value
954 for (var i = 0; i < this.length; i += 1) {
955 el = this[i];
956 if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }
957 el.dom7ElementDataStorage[key] = value;
958 }
959 return this;
960 }
961 function removeData(key) {
962 for (var i = 0; i < this.length; i += 1) {
963 var el = this[i];
964 if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {
965 el.dom7ElementDataStorage[key] = null;
966 delete el.dom7ElementDataStorage[key];
967 }
968 }
969 }
970 function dataset() {
971 var el = this[0];
972 if (!el) { return undefined; }
973 var dataset = {}; // eslint-disable-line
974 if (el.dataset) {
975 // eslint-disable-next-line
976 for (var dataKey in el.dataset) {
977 dataset[dataKey] = el.dataset[dataKey];
978 }
979 } else {
980 for (var i = 0; i < el.attributes.length; i += 1) {
981 // eslint-disable-next-line
982 var attr = el.attributes[i];
983 if (attr.name.indexOf('data-') >= 0) {
984 dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;
985 }
986 }
987 }
988 // eslint-disable-next-line
989 for (var key in dataset) {
990 if (dataset[key] === 'false') { dataset[key] = false; }
991 else if (dataset[key] === 'true') { dataset[key] = true; }
992 else if (parseFloat(dataset[key]) === dataset[key] * 1) { dataset[key] *= 1; }
993 }
994 return dataset;
995 }
996 function val(value) {
997 var dom = this;
998 if (typeof value === 'undefined') {
999 if (dom[0]) {
1000 if (dom[0].multiple && dom[0].nodeName.toLowerCase() === 'select') {
1001 var values = [];
1002 for (var i = 0; i < dom[0].selectedOptions.length; i += 1) {
1003 values.push(dom[0].selectedOptions[i].value);
1004 }
1005 return values;
1006 }
1007 return dom[0].value;
1008 }
1009 return undefined;
1010 }
1011
1012 for (var i$1 = 0; i$1 < dom.length; i$1 += 1) {
1013 var el = dom[i$1];
1014 if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {
1015 for (var j = 0; j < el.options.length; j += 1) {
1016 el.options[j].selected = value.indexOf(el.options[j].value) >= 0;
1017 }
1018 } else {
1019 el.value = value;
1020 }
1021 }
1022 return dom;
1023 }
1024 // Transforms
1025 // eslint-disable-next-line
1026 function transform(transform) {
1027 for (var i = 0; i < this.length; i += 1) {
1028 var elStyle = this[i].style;
1029 elStyle.webkitTransform = transform;
1030 elStyle.transform = transform;
1031 }
1032 return this;
1033 }
1034 function transition(duration) {
1035 if (typeof duration !== 'string') {
1036 duration = duration + "ms"; // eslint-disable-line
1037 }
1038 for (var i = 0; i < this.length; i += 1) {
1039 var elStyle = this[i].style;
1040 elStyle.webkitTransitionDuration = duration;
1041 elStyle.transitionDuration = duration;
1042 }
1043 return this;
1044 }
1045 // Events
1046 function on() {
1047 var assign;
1048
1049 var args = [], len = arguments.length;
1050 while ( len-- ) args[ len ] = arguments[ len ];
1051 var eventType = args[0];
1052 var targetSelector = args[1];
1053 var listener = args[2];
1054 var capture = args[3];
1055 if (typeof args[1] === 'function') {
1056 (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
1057 targetSelector = undefined;
1058 }
1059 if (!capture) { capture = false; }
1060
1061 function handleLiveEvent(e) {
1062 var target = e.target;
1063 if (!target) { return; }
1064 var eventData = e.target.dom7EventData || [];
1065 if (eventData.indexOf(e) < 0) {
1066 eventData.unshift(e);
1067 }
1068 if ($(target).is(targetSelector)) { listener.apply(target, eventData); }
1069 else {
1070 var parents = $(target).parents(); // eslint-disable-line
1071 for (var k = 0; k < parents.length; k += 1) {
1072 if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }
1073 }
1074 }
1075 }
1076 function handleEvent(e) {
1077 var eventData = e && e.target ? e.target.dom7EventData || [] : [];
1078 if (eventData.indexOf(e) < 0) {
1079 eventData.unshift(e);
1080 }
1081 listener.apply(this, eventData);
1082 }
1083 var events = eventType.split(' ');
1084 var j;
1085 for (var i = 0; i < this.length; i += 1) {
1086 var el = this[i];
1087 if (!targetSelector) {
1088 for (j = 0; j < events.length; j += 1) {
1089 var event = events[j];
1090 if (!el.dom7Listeners) { el.dom7Listeners = {}; }
1091 if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }
1092 el.dom7Listeners[event].push({
1093 listener: listener,
1094 proxyListener: handleEvent,
1095 });
1096 el.addEventListener(event, handleEvent, capture);
1097 }
1098 } else {
1099 // Live events
1100 for (j = 0; j < events.length; j += 1) {
1101 var event$1 = events[j];
1102 if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }
1103 if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }
1104 el.dom7LiveListeners[event$1].push({
1105 listener: listener,
1106 proxyListener: handleLiveEvent,
1107 });
1108 el.addEventListener(event$1, handleLiveEvent, capture);
1109 }
1110 }
1111 }
1112 return this;
1113 }
1114 function off() {
1115 var assign;
1116
1117 var args = [], len = arguments.length;
1118 while ( len-- ) args[ len ] = arguments[ len ];
1119 var eventType = args[0];
1120 var targetSelector = args[1];
1121 var listener = args[2];
1122 var capture = args[3];
1123 if (typeof args[1] === 'function') {
1124 (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
1125 targetSelector = undefined;
1126 }
1127 if (!capture) { capture = false; }
1128
1129 var events = eventType.split(' ');
1130 for (var i = 0; i < events.length; i += 1) {
1131 var event = events[i];
1132 for (var j = 0; j < this.length; j += 1) {
1133 var el = this[j];
1134 var handlers = (void 0);
1135 if (!targetSelector && el.dom7Listeners) {
1136 handlers = el.dom7Listeners[event];
1137 } else if (targetSelector && el.dom7LiveListeners) {
1138 handlers = el.dom7LiveListeners[event];
1139 }
1140 if (handlers && handlers.length) {
1141 for (var k = handlers.length - 1; k >= 0; k -= 1) {
1142 var handler = handlers[k];
1143 if (listener && handler.listener === listener) {
1144 el.removeEventListener(event, handler.proxyListener, capture);
1145 handlers.splice(k, 1);
1146 } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {
1147 el.removeEventListener(event, handler.proxyListener, capture);
1148 handlers.splice(k, 1);
1149 } else if (!listener) {
1150 el.removeEventListener(event, handler.proxyListener, capture);
1151 handlers.splice(k, 1);
1152 }
1153 }
1154 }
1155 }
1156 }
1157 return this;
1158 }
1159 function once() {
1160 var assign;
1161
1162 var args = [], len = arguments.length;
1163 while ( len-- ) args[ len ] = arguments[ len ];
1164 var dom = this;
1165 var eventName = args[0];
1166 var targetSelector = args[1];
1167 var listener = args[2];
1168 var capture = args[3];
1169 if (typeof args[1] === 'function') {
1170 (assign = args, eventName = assign[0], listener = assign[1], capture = assign[2]);
1171 targetSelector = undefined;
1172 }
1173 function onceHandler() {
1174 var eventArgs = [], len = arguments.length;
1175 while ( len-- ) eventArgs[ len ] = arguments[ len ];
1176
1177 listener.apply(this, eventArgs);
1178 dom.off(eventName, targetSelector, onceHandler, capture);
1179 if (onceHandler.dom7proxy) {
1180 delete onceHandler.dom7proxy;
1181 }
1182 }
1183 onceHandler.dom7proxy = listener;
1184 return dom.on(eventName, targetSelector, onceHandler, capture);
1185 }
1186 function trigger() {
1187 var args = [], len = arguments.length;
1188 while ( len-- ) args[ len ] = arguments[ len ];
1189
1190 var events = args[0].split(' ');
1191 var eventData = args[1];
1192 for (var i = 0; i < events.length; i += 1) {
1193 var event = events[i];
1194 for (var j = 0; j < this.length; j += 1) {
1195 var el = this[j];
1196 var evt = (void 0);
1197 try {
1198 evt = new win.CustomEvent(event, {
1199 detail: eventData,
1200 bubbles: true,
1201 cancelable: true,
1202 });
1203 } catch (e) {
1204 evt = doc.createEvent('Event');
1205 evt.initEvent(event, true, true);
1206 evt.detail = eventData;
1207 }
1208 // eslint-disable-next-line
1209 el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });
1210 el.dispatchEvent(evt);
1211 el.dom7EventData = [];
1212 delete el.dom7EventData;
1213 }
1214 }
1215 return this;
1216 }
1217 function transitionEnd(callback) {
1218 var events = ['webkitTransitionEnd', 'transitionend'];
1219 var dom = this;
1220 var i;
1221 function fireCallBack(e) {
1222 /* jshint validthis:true */
1223 if (e.target !== this) { return; }
1224 callback.call(this, e);
1225 for (i = 0; i < events.length; i += 1) {
1226 dom.off(events[i], fireCallBack);
1227 }
1228 }
1229 if (callback) {
1230 for (i = 0; i < events.length; i += 1) {
1231 dom.on(events[i], fireCallBack);
1232 }
1233 }
1234 return this;
1235 }
1236 function animationEnd(callback) {
1237 var events = ['webkitAnimationEnd', 'animationend'];
1238 var dom = this;
1239 var i;
1240 function fireCallBack(e) {
1241 if (e.target !== this) { return; }
1242 callback.call(this, e);
1243 for (i = 0; i < events.length; i += 1) {
1244 dom.off(events[i], fireCallBack);
1245 }
1246 }
1247 if (callback) {
1248 for (i = 0; i < events.length; i += 1) {
1249 dom.on(events[i], fireCallBack);
1250 }
1251 }
1252 return this;
1253 }
1254 // Sizing/Styles
1255 function width() {
1256 if (this[0] === win) {
1257 return win.innerWidth;
1258 }
1259
1260 if (this.length > 0) {
1261 return parseFloat(this.css('width'));
1262 }
1263
1264 return null;
1265 }
1266 function outerWidth(includeMargins) {
1267 if (this.length > 0) {
1268 if (includeMargins) {
1269 // eslint-disable-next-line
1270 var styles = this.styles();
1271 return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));
1272 }
1273 return this[0].offsetWidth;
1274 }
1275 return null;
1276 }
1277 function height() {
1278 if (this[0] === win) {
1279 return win.innerHeight;
1280 }
1281
1282 if (this.length > 0) {
1283 return parseFloat(this.css('height'));
1284 }
1285
1286 return null;
1287 }
1288 function outerHeight(includeMargins) {
1289 if (this.length > 0) {
1290 if (includeMargins) {
1291 // eslint-disable-next-line
1292 var styles = this.styles();
1293 return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));
1294 }
1295 return this[0].offsetHeight;
1296 }
1297 return null;
1298 }
1299 function offset() {
1300 if (this.length > 0) {
1301 var el = this[0];
1302 var box = el.getBoundingClientRect();
1303 var body = doc.body;
1304 var clientTop = el.clientTop || body.clientTop || 0;
1305 var clientLeft = el.clientLeft || body.clientLeft || 0;
1306 var scrollTop = el === win ? win.scrollY : el.scrollTop;
1307 var scrollLeft = el === win ? win.scrollX : el.scrollLeft;
1308 return {
1309 top: (box.top + scrollTop) - clientTop,
1310 left: (box.left + scrollLeft) - clientLeft,
1311 };
1312 }
1313
1314 return null;
1315 }
1316 function hide() {
1317 for (var i = 0; i < this.length; i += 1) {
1318 this[i].style.display = 'none';
1319 }
1320 return this;
1321 }
1322 function show() {
1323 for (var i = 0; i < this.length; i += 1) {
1324 var el = this[i];
1325 if (el.style.display === 'none') {
1326 el.style.display = '';
1327 }
1328 if (win.getComputedStyle(el, null).getPropertyValue('display') === 'none') {
1329 // Still not visible
1330 el.style.display = 'block';
1331 }
1332 }
1333 return this;
1334 }
1335 function styles() {
1336 if (this[0]) { return win.getComputedStyle(this[0], null); }
1337 return {};
1338 }
1339 function css(props, value) {
1340 var i;
1341 if (arguments.length === 1) {
1342 if (typeof props === 'string') {
1343 if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }
1344 } else {
1345 for (i = 0; i < this.length; i += 1) {
1346 // eslint-disable-next-line
1347 for (var prop in props) {
1348 this[i].style[prop] = props[prop];
1349 }
1350 }
1351 return this;
1352 }
1353 }
1354 if (arguments.length === 2 && typeof props === 'string') {
1355 for (i = 0; i < this.length; i += 1) {
1356 this[i].style[props] = value;
1357 }
1358 return this;
1359 }
1360 return this;
1361 }
1362
1363 // Dom manipulation
1364 function toArray() {
1365 var arr = [];
1366 for (var i = 0; i < this.length; i += 1) {
1367 arr.push(this[i]);
1368 }
1369 return arr;
1370 }
1371 // Iterate over the collection passing elements to `callback`
1372 function each(callback) {
1373 // Don't bother continuing without a callback
1374 if (!callback) { return this; }
1375 // Iterate over the current collection
1376 for (var i = 0; i < this.length; i += 1) {
1377 // If the callback returns false
1378 if (callback.call(this[i], i, this[i]) === false) {
1379 // End the loop early
1380 return this;
1381 }
1382 }
1383 // Return `this` to allow chained DOM operations
1384 return this;
1385 }
1386 function forEach(callback) {
1387 // Don't bother continuing without a callback
1388 if (!callback) { return this; }
1389 // Iterate over the current collection
1390 for (var i = 0; i < this.length; i += 1) {
1391 // If the callback returns false
1392 if (callback.call(this[i], this[i], i) === false) {
1393 // End the loop early
1394 return this;
1395 }
1396 }
1397 // Return `this` to allow chained DOM operations
1398 return this;
1399 }
1400 function filter(callback) {
1401 var matchedItems = [];
1402 var dom = this;
1403 for (var i = 0; i < dom.length; i += 1) {
1404 if (callback.call(dom[i], i, dom[i])) { matchedItems.push(dom[i]); }
1405 }
1406 return new Dom7(matchedItems);
1407 }
1408 function map(callback) {
1409 var modifiedItems = [];
1410 var dom = this;
1411 for (var i = 0; i < dom.length; i += 1) {
1412 modifiedItems.push(callback.call(dom[i], i, dom[i]));
1413 }
1414 return new Dom7(modifiedItems);
1415 }
1416 // eslint-disable-next-line
1417 function html(html) {
1418 if (typeof html === 'undefined') {
1419 return this[0] ? this[0].innerHTML : undefined;
1420 }
1421
1422 for (var i = 0; i < this.length; i += 1) {
1423 this[i].innerHTML = html;
1424 }
1425 return this;
1426 }
1427 // eslint-disable-next-line
1428 function text(text) {
1429 if (typeof text === 'undefined') {
1430 if (this[0]) {
1431 return this[0].textContent.trim();
1432 }
1433 return null;
1434 }
1435
1436 for (var i = 0; i < this.length; i += 1) {
1437 this[i].textContent = text;
1438 }
1439 return this;
1440 }
1441 function is(selector) {
1442 var el = this[0];
1443 var compareWith;
1444 var i;
1445 if (!el || typeof selector === 'undefined') { return false; }
1446 if (typeof selector === 'string') {
1447 if (el.matches) { return el.matches(selector); }
1448 else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }
1449 else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }
1450
1451 compareWith = $(selector);
1452 for (i = 0; i < compareWith.length; i += 1) {
1453 if (compareWith[i] === el) { return true; }
1454 }
1455 return false;
1456 } else if (selector === doc) { return el === doc; }
1457 else if (selector === win) { return el === win; }
1458
1459 if (selector.nodeType || selector instanceof Dom7) {
1460 compareWith = selector.nodeType ? [selector] : selector;
1461 for (i = 0; i < compareWith.length; i += 1) {
1462 if (compareWith[i] === el) { return true; }
1463 }
1464 return false;
1465 }
1466 return false;
1467 }
1468 function indexOf(el) {
1469 for (var i = 0; i < this.length; i += 1) {
1470 if (this[i] === el) { return i; }
1471 }
1472 return -1;
1473 }
1474 function index() {
1475 var child = this[0];
1476 var i;
1477 if (child) {
1478 i = 0;
1479 // eslint-disable-next-line
1480 while ((child = child.previousSibling) !== null) {
1481 if (child.nodeType === 1) { i += 1; }
1482 }
1483 return i;
1484 }
1485 return undefined;
1486 }
1487 // eslint-disable-next-line
1488 function eq(index) {
1489 if (typeof index === 'undefined') { return this; }
1490 var length = this.length;
1491 var returnIndex;
1492 if (index > length - 1) {
1493 return new Dom7([]);
1494 }
1495 if (index < 0) {
1496 returnIndex = length + index;
1497 if (returnIndex < 0) { return new Dom7([]); }
1498 return new Dom7([this[returnIndex]]);
1499 }
1500 return new Dom7([this[index]]);
1501 }
1502 function append() {
1503 var args = [], len = arguments.length;
1504 while ( len-- ) args[ len ] = arguments[ len ];
1505
1506 var newChild;
1507
1508 for (var k = 0; k < args.length; k += 1) {
1509 newChild = args[k];
1510 for (var i = 0; i < this.length; i += 1) {
1511 if (typeof newChild === 'string') {
1512 var tempDiv = doc.createElement('div');
1513 tempDiv.innerHTML = newChild;
1514 while (tempDiv.firstChild) {
1515 this[i].appendChild(tempDiv.firstChild);
1516 }
1517 } else if (newChild instanceof Dom7) {
1518 for (var j = 0; j < newChild.length; j += 1) {
1519 this[i].appendChild(newChild[j]);
1520 }
1521 } else {
1522 this[i].appendChild(newChild);
1523 }
1524 }
1525 }
1526
1527 return this;
1528 }
1529 // eslint-disable-next-line
1530 function appendTo(parent) {
1531 $(parent).append(this);
1532 return this;
1533 }
1534 function prepend(newChild) {
1535 var i;
1536 var j;
1537 for (i = 0; i < this.length; i += 1) {
1538 if (typeof newChild === 'string') {
1539 var tempDiv = doc.createElement('div');
1540 tempDiv.innerHTML = newChild;
1541 for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {
1542 this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
1543 }
1544 } else if (newChild instanceof Dom7) {
1545 for (j = 0; j < newChild.length; j += 1) {
1546 this[i].insertBefore(newChild[j], this[i].childNodes[0]);
1547 }
1548 } else {
1549 this[i].insertBefore(newChild, this[i].childNodes[0]);
1550 }
1551 }
1552 return this;
1553 }
1554 // eslint-disable-next-line
1555 function prependTo(parent) {
1556 $(parent).prepend(this);
1557 return this;
1558 }
1559 function insertBefore(selector) {
1560 var before = $(selector);
1561 for (var i = 0; i < this.length; i += 1) {
1562 if (before.length === 1) {
1563 before[0].parentNode.insertBefore(this[i], before[0]);
1564 } else if (before.length > 1) {
1565 for (var j = 0; j < before.length; j += 1) {
1566 before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);
1567 }
1568 }
1569 }
1570 }
1571 function insertAfter(selector) {
1572 var after = $(selector);
1573 for (var i = 0; i < this.length; i += 1) {
1574 if (after.length === 1) {
1575 after[0].parentNode.insertBefore(this[i], after[0].nextSibling);
1576 } else if (after.length > 1) {
1577 for (var j = 0; j < after.length; j += 1) {
1578 after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);
1579 }
1580 }
1581 }
1582 }
1583 function next(selector) {
1584 if (this.length > 0) {
1585 if (selector) {
1586 if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {
1587 return new Dom7([this[0].nextElementSibling]);
1588 }
1589 return new Dom7([]);
1590 }
1591
1592 if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }
1593 return new Dom7([]);
1594 }
1595 return new Dom7([]);
1596 }
1597 function nextAll(selector) {
1598 var nextEls = [];
1599 var el = this[0];
1600 if (!el) { return new Dom7([]); }
1601 while (el.nextElementSibling) {
1602 var next = el.nextElementSibling; // eslint-disable-line
1603 if (selector) {
1604 if ($(next).is(selector)) { nextEls.push(next); }
1605 } else { nextEls.push(next); }
1606 el = next;
1607 }
1608 return new Dom7(nextEls);
1609 }
1610 function prev(selector) {
1611 if (this.length > 0) {
1612 var el = this[0];
1613 if (selector) {
1614 if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {
1615 return new Dom7([el.previousElementSibling]);
1616 }
1617 return new Dom7([]);
1618 }
1619
1620 if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }
1621 return new Dom7([]);
1622 }
1623 return new Dom7([]);
1624 }
1625 function prevAll(selector) {
1626 var prevEls = [];
1627 var el = this[0];
1628 if (!el) { return new Dom7([]); }
1629 while (el.previousElementSibling) {
1630 var prev = el.previousElementSibling; // eslint-disable-line
1631 if (selector) {
1632 if ($(prev).is(selector)) { prevEls.push(prev); }
1633 } else { prevEls.push(prev); }
1634 el = prev;
1635 }
1636 return new Dom7(prevEls);
1637 }
1638 function siblings(selector) {
1639 return this.nextAll(selector).add(this.prevAll(selector));
1640 }
1641 function parent(selector) {
1642 var parents = []; // eslint-disable-line
1643 for (var i = 0; i < this.length; i += 1) {
1644 if (this[i].parentNode !== null) {
1645 if (selector) {
1646 if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }
1647 } else {
1648 parents.push(this[i].parentNode);
1649 }
1650 }
1651 }
1652 return $(unique(parents));
1653 }
1654 function parents(selector) {
1655 var parents = []; // eslint-disable-line
1656 for (var i = 0; i < this.length; i += 1) {
1657 var parent = this[i].parentNode; // eslint-disable-line
1658 while (parent) {
1659 if (selector) {
1660 if ($(parent).is(selector)) { parents.push(parent); }
1661 } else {
1662 parents.push(parent);
1663 }
1664 parent = parent.parentNode;
1665 }
1666 }
1667 return $(unique(parents));
1668 }
1669 function closest(selector) {
1670 var closest = this; // eslint-disable-line
1671 if (typeof selector === 'undefined') {
1672 return new Dom7([]);
1673 }
1674 if (!closest.is(selector)) {
1675 closest = closest.parents(selector).eq(0);
1676 }
1677 return closest;
1678 }
1679 function find(selector) {
1680 var foundElements = [];
1681 for (var i = 0; i < this.length; i += 1) {
1682 var found = this[i].querySelectorAll(selector);
1683 for (var j = 0; j < found.length; j += 1) {
1684 foundElements.push(found[j]);
1685 }
1686 }
1687 return new Dom7(foundElements);
1688 }
1689 function children(selector) {
1690 var children = []; // eslint-disable-line
1691 for (var i = 0; i < this.length; i += 1) {
1692 var childNodes = this[i].childNodes;
1693
1694 for (var j = 0; j < childNodes.length; j += 1) {
1695 if (!selector) {
1696 if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }
1697 } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {
1698 children.push(childNodes[j]);
1699 }
1700 }
1701 }
1702 return new Dom7(unique(children));
1703 }
1704 function remove() {
1705 for (var i = 0; i < this.length; i += 1) {
1706 if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }
1707 }
1708 return this;
1709 }
1710 function detach() {
1711 return this.remove();
1712 }
1713 function add() {
1714 var args = [], len = arguments.length;
1715 while ( len-- ) args[ len ] = arguments[ len ];
1716
1717 var dom = this;
1718 var i;
1719 var j;
1720 for (i = 0; i < args.length; i += 1) {
1721 var toAdd = $(args[i]);
1722 for (j = 0; j < toAdd.length; j += 1) {
1723 dom[dom.length] = toAdd[j];
1724 dom.length += 1;
1725 }
1726 }
1727 return dom;
1728 }
1729 function empty() {
1730 for (var i = 0; i < this.length; i += 1) {
1731 var el = this[i];
1732 if (el.nodeType === 1) {
1733 for (var j = 0; j < el.childNodes.length; j += 1) {
1734 if (el.childNodes[j].parentNode) {
1735 el.childNodes[j].parentNode.removeChild(el.childNodes[j]);
1736 }
1737 }
1738 el.textContent = '';
1739 }
1740 }
1741 return this;
1742 }
1743
1744 var Methods = /*#__PURE__*/Object.freeze({
1745 addClass: addClass,
1746 removeClass: removeClass,
1747 hasClass: hasClass,
1748 toggleClass: toggleClass,
1749 attr: attr,
1750 removeAttr: removeAttr,
1751 prop: prop,
1752 data: data,
1753 removeData: removeData,
1754 dataset: dataset,
1755 val: val,
1756 transform: transform,
1757 transition: transition,
1758 on: on,
1759 off: off,
1760 once: once,
1761 trigger: trigger,
1762 transitionEnd: transitionEnd,
1763 animationEnd: animationEnd,
1764 width: width,
1765 outerWidth: outerWidth,
1766 height: height,
1767 outerHeight: outerHeight,
1768 offset: offset,
1769 hide: hide,
1770 show: show,
1771 styles: styles,
1772 css: css,
1773 toArray: toArray,
1774 each: each,
1775 forEach: forEach,
1776 filter: filter,
1777 map: map,
1778 html: html,
1779 text: text,
1780 is: is,
1781 indexOf: indexOf,
1782 index: index,
1783 eq: eq,
1784 append: append,
1785 appendTo: appendTo,
1786 prepend: prepend,
1787 prependTo: prependTo,
1788 insertBefore: insertBefore,
1789 insertAfter: insertAfter,
1790 next: next,
1791 nextAll: nextAll,
1792 prev: prev,
1793 prevAll: prevAll,
1794 siblings: siblings,
1795 parent: parent,
1796 parents: parents,
1797 closest: closest,
1798 find: find,
1799 children: children,
1800 remove: remove,
1801 detach: detach,
1802 add: add,
1803 empty: empty
1804 });
1805
1806 function scrollTo() {
1807 var assign;
1808
1809 var args = [], len = arguments.length;
1810 while ( len-- ) args[ len ] = arguments[ len ];
1811 var left = args[0];
1812 var top = args[1];
1813 var duration = args[2];
1814 var easing = args[3];
1815 var callback = args[4];
1816 if (args.length === 4 && typeof easing === 'function') {
1817 callback = easing;
1818 (assign = args, left = assign[0], top = assign[1], duration = assign[2], callback = assign[3], easing = assign[4]);
1819 }
1820 if (typeof easing === 'undefined') { easing = 'swing'; }
1821
1822 return this.each(function animate() {
1823 var el = this;
1824 var currentTop;
1825 var currentLeft;
1826 var maxTop;
1827 var maxLeft;
1828 var newTop;
1829 var newLeft;
1830 var scrollTop; // eslint-disable-line
1831 var scrollLeft; // eslint-disable-line
1832 var animateTop = top > 0 || top === 0;
1833 var animateLeft = left > 0 || left === 0;
1834 if (typeof easing === 'undefined') {
1835 easing = 'swing';
1836 }
1837 if (animateTop) {
1838 currentTop = el.scrollTop;
1839 if (!duration) {
1840 el.scrollTop = top;
1841 }
1842 }
1843 if (animateLeft) {
1844 currentLeft = el.scrollLeft;
1845 if (!duration) {
1846 el.scrollLeft = left;
1847 }
1848 }
1849 if (!duration) { return; }
1850 if (animateTop) {
1851 maxTop = el.scrollHeight - el.offsetHeight;
1852 newTop = Math.max(Math.min(top, maxTop), 0);
1853 }
1854 if (animateLeft) {
1855 maxLeft = el.scrollWidth - el.offsetWidth;
1856 newLeft = Math.max(Math.min(left, maxLeft), 0);
1857 }
1858 var startTime = null;
1859 if (animateTop && newTop === currentTop) { animateTop = false; }
1860 if (animateLeft && newLeft === currentLeft) { animateLeft = false; }
1861 function render(time) {
1862 if ( time === void 0 ) time = new Date().getTime();
1863
1864 if (startTime === null) {
1865 startTime = time;
1866 }
1867 var progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
1868 var easeProgress = easing === 'linear' ? progress : (0.5 - (Math.cos(progress * Math.PI) / 2));
1869 var done;
1870 if (animateTop) { scrollTop = currentTop + (easeProgress * (newTop - currentTop)); }
1871 if (animateLeft) { scrollLeft = currentLeft + (easeProgress * (newLeft - currentLeft)); }
1872 if (animateTop && newTop > currentTop && scrollTop >= newTop) {
1873 el.scrollTop = newTop;
1874 done = true;
1875 }
1876 if (animateTop && newTop < currentTop && scrollTop <= newTop) {
1877 el.scrollTop = newTop;
1878 done = true;
1879 }
1880 if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {
1881 el.scrollLeft = newLeft;
1882 done = true;
1883 }
1884 if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {
1885 el.scrollLeft = newLeft;
1886 done = true;
1887 }
1888
1889 if (done) {
1890 if (callback) { callback(); }
1891 return;
1892 }
1893 if (animateTop) { el.scrollTop = scrollTop; }
1894 if (animateLeft) { el.scrollLeft = scrollLeft; }
1895 requestAnimationFrame(render);
1896 }
1897 requestAnimationFrame(render);
1898 });
1899 }
1900 // scrollTop(top, duration, easing, callback) {
1901 function scrollTop() {
1902 var assign;
1903
1904 var args = [], len = arguments.length;
1905 while ( len-- ) args[ len ] = arguments[ len ];
1906 var top = args[0];
1907 var duration = args[1];
1908 var easing = args[2];
1909 var callback = args[3];
1910 if (args.length === 3 && typeof easing === 'function') {
1911 (assign = args, top = assign[0], duration = assign[1], callback = assign[2], easing = assign[3]);
1912 }
1913 var dom = this;
1914 if (typeof top === 'undefined') {
1915 if (dom.length > 0) { return dom[0].scrollTop; }
1916 return null;
1917 }
1918 return dom.scrollTo(undefined, top, duration, easing, callback);
1919 }
1920 function scrollLeft() {
1921 var assign;
1922
1923 var args = [], len = arguments.length;
1924 while ( len-- ) args[ len ] = arguments[ len ];
1925 var left = args[0];
1926 var duration = args[1];
1927 var easing = args[2];
1928 var callback = args[3];
1929 if (args.length === 3 && typeof easing === 'function') {
1930 (assign = args, left = assign[0], duration = assign[1], callback = assign[2], easing = assign[3]);
1931 }
1932 var dom = this;
1933 if (typeof left === 'undefined') {
1934 if (dom.length > 0) { return dom[0].scrollLeft; }
1935 return null;
1936 }
1937 return dom.scrollTo(left, undefined, duration, easing, callback);
1938 }
1939
1940 var Scroll = /*#__PURE__*/Object.freeze({
1941 scrollTo: scrollTo,
1942 scrollTop: scrollTop,
1943 scrollLeft: scrollLeft
1944 });
1945
1946 function animate(initialProps, initialParams) {
1947 var els = this;
1948 var a = {
1949 props: Object.assign({}, initialProps),
1950 params: Object.assign({
1951 duration: 300,
1952 easing: 'swing', // or 'linear'
1953 /* Callbacks
1954 begin(elements)
1955 complete(elements)
1956 progress(elements, complete, remaining, start, tweenValue)
1957 */
1958 }, initialParams),
1959
1960 elements: els,
1961 animating: false,
1962 que: [],
1963
1964 easingProgress: function easingProgress(easing, progress) {
1965 if (easing === 'swing') {
1966 return 0.5 - (Math.cos(progress * Math.PI) / 2);
1967 }
1968 if (typeof easing === 'function') {
1969 return easing(progress);
1970 }
1971 return progress;
1972 },
1973 stop: function stop() {
1974 if (a.frameId) {
1975 cancelAnimationFrame(a.frameId);
1976 }
1977 a.animating = false;
1978 a.elements.each(function (index, el) {
1979 var element = el;
1980 delete element.dom7AnimateInstance;
1981 });
1982 a.que = [];
1983 },
1984 done: function done(complete) {
1985 a.animating = false;
1986 a.elements.each(function (index, el) {
1987 var element = el;
1988 delete element.dom7AnimateInstance;
1989 });
1990 if (complete) { complete(els); }
1991 if (a.que.length > 0) {
1992 var que = a.que.shift();
1993 a.animate(que[0], que[1]);
1994 }
1995 },
1996 animate: function animate(props, params) {
1997 if (a.animating) {
1998 a.que.push([props, params]);
1999 return a;
2000 }
2001 var elements = [];
2002
2003 // Define & Cache Initials & Units
2004 a.elements.each(function (index, el) {
2005 var initialFullValue;
2006 var initialValue;
2007 var unit;
2008 var finalValue;
2009 var finalFullValue;
2010
2011 if (!el.dom7AnimateInstance) { a.elements[index].dom7AnimateInstance = a; }
2012
2013 elements[index] = {
2014 container: el,
2015 };
2016 Object.keys(props).forEach(function (prop) {
2017 initialFullValue = win.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');
2018 initialValue = parseFloat(initialFullValue);
2019 unit = initialFullValue.replace(initialValue, '');
2020 finalValue = parseFloat(props[prop]);
2021 finalFullValue = props[prop] + unit;
2022 elements[index][prop] = {
2023 initialFullValue: initialFullValue,
2024 initialValue: initialValue,
2025 unit: unit,
2026 finalValue: finalValue,
2027 finalFullValue: finalFullValue,
2028 currentValue: initialValue,
2029 };
2030 });
2031 });
2032
2033 var startTime = null;
2034 var time;
2035 var elementsDone = 0;
2036 var propsDone = 0;
2037 var done;
2038 var began = false;
2039
2040 a.animating = true;
2041
2042 function render() {
2043 time = new Date().getTime();
2044 var progress;
2045 var easeProgress;
2046 // let el;
2047 if (!began) {
2048 began = true;
2049 if (params.begin) { params.begin(els); }
2050 }
2051 if (startTime === null) {
2052 startTime = time;
2053 }
2054 if (params.progress) {
2055 // eslint-disable-next-line
2056 params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), ((startTime + params.duration) - time < 0 ? 0 : (startTime + params.duration) - time), startTime);
2057 }
2058
2059 elements.forEach(function (element) {
2060 var el = element;
2061 if (done || el.done) { return; }
2062 Object.keys(props).forEach(function (prop) {
2063 if (done || el.done) { return; }
2064 progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);
2065 easeProgress = a.easingProgress(params.easing, progress);
2066 var ref = el[prop];
2067 var initialValue = ref.initialValue;
2068 var finalValue = ref.finalValue;
2069 var unit = ref.unit;
2070 el[prop].currentValue = initialValue + (easeProgress * (finalValue - initialValue));
2071 var currentValue = el[prop].currentValue;
2072
2073 if (
2074 (finalValue > initialValue && currentValue >= finalValue) ||
2075 (finalValue < initialValue && currentValue <= finalValue)) {
2076 el.container.style[prop] = finalValue + unit;
2077 propsDone += 1;
2078 if (propsDone === Object.keys(props).length) {
2079 el.done = true;
2080 elementsDone += 1;
2081 }
2082 if (elementsDone === elements.length) {
2083 done = true;
2084 }
2085 }
2086 if (done) {
2087 a.done(params.complete);
2088 return;
2089 }
2090 el.container.style[prop] = currentValue + unit;
2091 });
2092 });
2093 if (done) { return; }
2094 // Then call
2095 a.frameId = requestAnimationFrame(render);
2096 }
2097 a.frameId = requestAnimationFrame(render);
2098 return a;
2099 },
2100 };
2101
2102 if (a.elements.length === 0) {
2103 return els;
2104 }
2105
2106 var animateInstance;
2107 for (var i = 0; i < a.elements.length; i += 1) {
2108 if (a.elements[i].dom7AnimateInstance) {
2109 animateInstance = a.elements[i].dom7AnimateInstance;
2110 } else { a.elements[i].dom7AnimateInstance = a; }
2111 }
2112 if (!animateInstance) {
2113 animateInstance = a;
2114 }
2115
2116 if (initialProps === 'stop') {
2117 animateInstance.stop();
2118 } else {
2119 animateInstance.animate(a.props, a.params);
2120 }
2121
2122 return els;
2123 }
2124
2125 function stop() {
2126 var els = this;
2127 for (var i = 0; i < els.length; i += 1) {
2128 if (els[i].dom7AnimateInstance) {
2129 els[i].dom7AnimateInstance.stop();
2130 }
2131 }
2132 }
2133
2134 var Animate = /*#__PURE__*/Object.freeze({
2135 animate: animate,
2136 stop: stop
2137 });
2138
2139 var noTrigger = ('resize scroll').split(' ');
2140 function eventShortcut(name) {
2141 var ref;
2142
2143 var args = [], len = arguments.length - 1;
2144 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
2145 if (typeof args[0] === 'undefined') {
2146 for (var i = 0; i < this.length; i += 1) {
2147 if (noTrigger.indexOf(name) < 0) {
2148 if (name in this[i]) { this[i][name](); }
2149 else {
2150 $(this[i]).trigger(name);
2151 }
2152 }
2153 }
2154 return this;
2155 }
2156 return (ref = this).on.apply(ref, [ name ].concat( args ));
2157 }
2158
2159 function click() {
2160 var args = [], len = arguments.length;
2161 while ( len-- ) args[ len ] = arguments[ len ];
2162
2163 return eventShortcut.bind(this).apply(void 0, [ 'click' ].concat( args ));
2164 }
2165 function blur() {
2166 var args = [], len = arguments.length;
2167 while ( len-- ) args[ len ] = arguments[ len ];
2168
2169 return eventShortcut.bind(this).apply(void 0, [ 'blur' ].concat( args ));
2170 }
2171 function focus() {
2172 var args = [], len = arguments.length;
2173 while ( len-- ) args[ len ] = arguments[ len ];
2174
2175 return eventShortcut.bind(this).apply(void 0, [ 'focus' ].concat( args ));
2176 }
2177 function focusin() {
2178 var args = [], len = arguments.length;
2179 while ( len-- ) args[ len ] = arguments[ len ];
2180
2181 return eventShortcut.bind(this).apply(void 0, [ 'focusin' ].concat( args ));
2182 }
2183 function focusout() {
2184 var args = [], len = arguments.length;
2185 while ( len-- ) args[ len ] = arguments[ len ];
2186
2187 return eventShortcut.bind(this).apply(void 0, [ 'focusout' ].concat( args ));
2188 }
2189 function keyup() {
2190 var args = [], len = arguments.length;
2191 while ( len-- ) args[ len ] = arguments[ len ];
2192
2193 return eventShortcut.bind(this).apply(void 0, [ 'keyup' ].concat( args ));
2194 }
2195 function keydown() {
2196 var args = [], len = arguments.length;
2197 while ( len-- ) args[ len ] = arguments[ len ];
2198
2199 return eventShortcut.bind(this).apply(void 0, [ 'keydown' ].concat( args ));
2200 }
2201 function keypress() {
2202 var args = [], len = arguments.length;
2203 while ( len-- ) args[ len ] = arguments[ len ];
2204
2205 return eventShortcut.bind(this).apply(void 0, [ 'keypress' ].concat( args ));
2206 }
2207 function submit() {
2208 var args = [], len = arguments.length;
2209 while ( len-- ) args[ len ] = arguments[ len ];
2210
2211 return eventShortcut.bind(this).apply(void 0, [ 'submit' ].concat( args ));
2212 }
2213 function change() {
2214 var args = [], len = arguments.length;
2215 while ( len-- ) args[ len ] = arguments[ len ];
2216
2217 return eventShortcut.bind(this).apply(void 0, [ 'change' ].concat( args ));
2218 }
2219 function mousedown() {
2220 var args = [], len = arguments.length;
2221 while ( len-- ) args[ len ] = arguments[ len ];
2222
2223 return eventShortcut.bind(this).apply(void 0, [ 'mousedown' ].concat( args ));
2224 }
2225 function mousemove() {
2226 var args = [], len = arguments.length;
2227 while ( len-- ) args[ len ] = arguments[ len ];
2228
2229 return eventShortcut.bind(this).apply(void 0, [ 'mousemove' ].concat( args ));
2230 }
2231 function mouseup() {
2232 var args = [], len = arguments.length;
2233 while ( len-- ) args[ len ] = arguments[ len ];
2234
2235 return eventShortcut.bind(this).apply(void 0, [ 'mouseup' ].concat( args ));
2236 }
2237 function mouseenter() {
2238 var args = [], len = arguments.length;
2239 while ( len-- ) args[ len ] = arguments[ len ];
2240
2241 return eventShortcut.bind(this).apply(void 0, [ 'mouseenter' ].concat( args ));
2242 }
2243 function mouseleave() {
2244 var args = [], len = arguments.length;
2245 while ( len-- ) args[ len ] = arguments[ len ];
2246
2247 return eventShortcut.bind(this).apply(void 0, [ 'mouseleave' ].concat( args ));
2248 }
2249 function mouseout() {
2250 var args = [], len = arguments.length;
2251 while ( len-- ) args[ len ] = arguments[ len ];
2252
2253 return eventShortcut.bind(this).apply(void 0, [ 'mouseout' ].concat( args ));
2254 }
2255 function mouseover() {
2256 var args = [], len = arguments.length;
2257 while ( len-- ) args[ len ] = arguments[ len ];
2258
2259 return eventShortcut.bind(this).apply(void 0, [ 'mouseover' ].concat( args ));
2260 }
2261 function touchstart() {
2262 var args = [], len = arguments.length;
2263 while ( len-- ) args[ len ] = arguments[ len ];
2264
2265 return eventShortcut.bind(this).apply(void 0, [ 'touchstart' ].concat( args ));
2266 }
2267 function touchend() {
2268 var args = [], len = arguments.length;
2269 while ( len-- ) args[ len ] = arguments[ len ];
2270
2271 return eventShortcut.bind(this).apply(void 0, [ 'touchend' ].concat( args ));
2272 }
2273 function touchmove() {
2274 var args = [], len = arguments.length;
2275 while ( len-- ) args[ len ] = arguments[ len ];
2276
2277 return eventShortcut.bind(this).apply(void 0, [ 'touchmove' ].concat( args ));
2278 }
2279 function resize() {
2280 var args = [], len = arguments.length;
2281 while ( len-- ) args[ len ] = arguments[ len ];
2282
2283 return eventShortcut.bind(this).apply(void 0, [ 'resize' ].concat( args ));
2284 }
2285 function scroll() {
2286 var args = [], len = arguments.length;
2287 while ( len-- ) args[ len ] = arguments[ len ];
2288
2289 return eventShortcut.bind(this).apply(void 0, [ 'scroll' ].concat( args ));
2290 }
2291
2292 var eventShortcuts = /*#__PURE__*/Object.freeze({
2293 click: click,
2294 blur: blur,
2295 focus: focus,
2296 focusin: focusin,
2297 focusout: focusout,
2298 keyup: keyup,
2299 keydown: keydown,
2300 keypress: keypress,
2301 submit: submit,
2302 change: change,
2303 mousedown: mousedown,
2304 mousemove: mousemove,
2305 mouseup: mouseup,
2306 mouseenter: mouseenter,
2307 mouseleave: mouseleave,
2308 mouseout: mouseout,
2309 mouseover: mouseover,
2310 touchstart: touchstart,
2311 touchend: touchend,
2312 touchmove: touchmove,
2313 resize: resize,
2314 scroll: scroll
2315 });
2316
2317 [Methods, Scroll, Animate, eventShortcuts].forEach(function (group) {
2318 Object.keys(group).forEach(function (methodName) {
2319 $.fn[methodName] = group[methodName];
2320 });
2321 });
2322
2323 /**
2324 * https://github.com/gre/bezier-easing
2325 * BezierEasing - use bezier curve for transition easing function
2326 * by Gaëtan Renaudeau 2014 - 2015 – MIT License
2327 */
2328
2329 /* eslint-disable */
2330
2331 // These values are established by empiricism with tests (tradeoff: performance VS precision)
2332 var NEWTON_ITERATIONS = 4;
2333 var NEWTON_MIN_SLOPE = 0.001;
2334 var SUBDIVISION_PRECISION = 0.0000001;
2335 var SUBDIVISION_MAX_ITERATIONS = 10;
2336
2337 var kSplineTableSize = 11;
2338 var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);
2339
2340 var float32ArraySupported = typeof Float32Array === 'function';
2341
2342 function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }
2343 function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }
2344 function C (aA1) { return 3.0 * aA1; }
2345
2346 // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.
2347 function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }
2348
2349 // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.
2350 function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }
2351
2352 function binarySubdivide (aX, aA, aB, mX1, mX2) {
2353 var currentX, currentT, i = 0;
2354 do {
2355 currentT = aA + (aB - aA) / 2.0;
2356 currentX = calcBezier(currentT, mX1, mX2) - aX;
2357 if (currentX > 0.0) {
2358 aB = currentT;
2359 } else {
2360 aA = currentT;
2361 }
2362 } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
2363 return currentT;
2364 }
2365
2366 function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {
2367 for (var i = 0; i < NEWTON_ITERATIONS; ++i) {
2368 var currentSlope = getSlope(aGuessT, mX1, mX2);
2369 if (currentSlope === 0.0) {
2370 return aGuessT;
2371 }
2372 var currentX = calcBezier(aGuessT, mX1, mX2) - aX;
2373 aGuessT -= currentX / currentSlope;
2374 }
2375 return aGuessT;
2376 }
2377
2378 function bezier (mX1, mY1, mX2, mY2) {
2379 if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {
2380 throw new Error('bezier x values must be in [0, 1] range');
2381 }
2382
2383 // Precompute samples table
2384 var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
2385 if (mX1 !== mY1 || mX2 !== mY2) {
2386 for (var i = 0; i < kSplineTableSize; ++i) {
2387 sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
2388 }
2389 }
2390
2391 function getTForX (aX) {
2392 var intervalStart = 0.0;
2393 var currentSample = 1;
2394 var lastSample = kSplineTableSize - 1;
2395
2396 for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
2397 intervalStart += kSampleStepSize;
2398 }
2399 --currentSample;
2400
2401 // Interpolate to provide an initial guess for t
2402 var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
2403 var guessForT = intervalStart + dist * kSampleStepSize;
2404
2405 var initialSlope = getSlope(guessForT, mX1, mX2);
2406 if (initialSlope >= NEWTON_MIN_SLOPE) {
2407 return newtonRaphsonIterate(aX, guessForT, mX1, mX2);
2408 } else if (initialSlope === 0.0) {
2409 return guessForT;
2410 } else {
2411 return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);
2412 }
2413 }
2414
2415 return function BezierEasing (x) {
2416 if (mX1 === mY1 && mX2 === mY2) {
2417 return x; // linear
2418 }
2419 // Because JavaScript number are imprecise, we should guarantee the extremes are right.
2420 if (x === 0) {
2421 return 0;
2422 }
2423 if (x === 1) {
2424 return 1;
2425 }
2426 return calcBezier(getTForX(x), mY1, mY2);
2427 };
2428 }
2429
2430 /* eslint no-control-regex: "off" */
2431
2432 // Remove Diacritics
2433 var defaultDiacriticsRemovalap = [
2434 { base: 'A', letters: '\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F' },
2435 { base: 'AA', letters: '\uA732' },
2436 { base: 'AE', letters: '\u00C6\u01FC\u01E2' },
2437 { base: 'AO', letters: '\uA734' },
2438 { base: 'AU', letters: '\uA736' },
2439 { base: 'AV', letters: '\uA738\uA73A' },
2440 { base: 'AY', letters: '\uA73C' },
2441 { base: 'B', letters: '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181' },
2442 { base: 'C', letters: '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E' },
2443 { base: 'D', letters: '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779' },
2444 { base: 'DZ', letters: '\u01F1\u01C4' },
2445 { base: 'Dz', letters: '\u01F2\u01C5' },
2446 { base: 'E', letters: '\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E' },
2447 { base: 'F', letters: '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B' },
2448 { base: 'G', letters: '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E' },
2449 { base: 'H', letters: '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D' },
2450 { base: 'I', letters: '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197' },
2451 { base: 'J', letters: '\u004A\u24BF\uFF2A\u0134\u0248' },
2452 { base: 'K', letters: '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2' },
2453 { base: 'L', letters: '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780' },
2454 { base: 'LJ', letters: '\u01C7' },
2455 { base: 'Lj', letters: '\u01C8' },
2456 { base: 'M', letters: '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C' },
2457 { base: 'N', letters: '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4' },
2458 { base: 'NJ', letters: '\u01CA' },
2459 { base: 'Nj', letters: '\u01CB' },
2460 { base: 'O', letters: '\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C' },
2461 { base: 'OI', letters: '\u01A2' },
2462 { base: 'OO', letters: '\uA74E' },
2463 { base: 'OU', letters: '\u0222' },
2464 { base: 'OE', letters: '\u008C\u0152' },
2465 { base: 'oe', letters: '\u009C\u0153' },
2466 { base: 'P', letters: '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754' },
2467 { base: 'Q', letters: '\u0051\u24C6\uFF31\uA756\uA758\u024A' },
2468 { base: 'R', letters: '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782' },
2469 { base: 'S', letters: '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784' },
2470 { base: 'T', letters: '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786' },
2471 { base: 'TZ', letters: '\uA728' },
2472 { base: 'U', letters: '\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244' },
2473 { base: 'V', letters: '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245' },
2474 { base: 'VY', letters: '\uA760' },
2475 { base: 'W', letters: '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72' },
2476 { base: 'X', letters: '\u0058\u24CD\uFF38\u1E8A\u1E8C' },
2477 { base: 'Y', letters: '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE' },
2478 { base: 'Z', letters: '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762' },
2479 { base: 'a', letters: '\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250' },
2480 { base: 'aa', letters: '\uA733' },
2481 { base: 'ae', letters: '\u00E6\u01FD\u01E3' },
2482 { base: 'ao', letters: '\uA735' },
2483 { base: 'au', letters: '\uA737' },
2484 { base: 'av', letters: '\uA739\uA73B' },
2485 { base: 'ay', letters: '\uA73D' },
2486 { base: 'b', letters: '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253' },
2487 { base: 'c', letters: '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184' },
2488 { base: 'd', letters: '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A' },
2489 { base: 'dz', letters: '\u01F3\u01C6' },
2490 { base: 'e', letters: '\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD' },
2491 { base: 'f', letters: '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C' },
2492 { base: 'g', letters: '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F' },
2493 { base: 'h', letters: '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265' },
2494 { base: 'hv', letters: '\u0195' },
2495 { base: 'i', letters: '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131' },
2496 { base: 'j', letters: '\u006A\u24D9\uFF4A\u0135\u01F0\u0249' },
2497 { base: 'k', letters: '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3' },
2498 { base: 'l', letters: '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747' },
2499 { base: 'lj', letters: '\u01C9' },
2500 { base: 'm', letters: '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F' },
2501 { base: 'n', letters: '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5' },
2502 { base: 'nj', letters: '\u01CC' },
2503 { base: 'o', letters: '\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275' },
2504 { base: 'oi', letters: '\u01A3' },
2505 { base: 'ou', letters: '\u0223' },
2506 { base: 'oo', letters: '\uA74F' },
2507 { base: 'p', letters: '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755' },
2508 { base: 'q', letters: '\u0071\u24E0\uFF51\u024B\uA757\uA759' },
2509 { base: 'r', letters: '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783' },
2510 { base: 's', letters: '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B' },
2511 { base: 't', letters: '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787' },
2512 { base: 'tz', letters: '\uA729' },
2513 { base: 'u', letters: '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289' },
2514 { base: 'v', letters: '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C' },
2515 { base: 'vy', letters: '\uA761' },
2516 { base: 'w', letters: '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73' },
2517 { base: 'x', letters: '\u0078\u24E7\uFF58\u1E8B\u1E8D' },
2518 { base: 'y', letters: '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF' },
2519 { base: 'z', letters: '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763' } ];
2520
2521 var diacriticsMap = {};
2522 for (var i = 0; i < defaultDiacriticsRemovalap.length; i += 1) {
2523 var letters = defaultDiacriticsRemovalap[i].letters;
2524 for (var j = 0; j < letters.length; j += 1) {
2525 diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;
2526 }
2527 }
2528
2529 var uniqueNumber = 1;
2530
2531 var Utils = {
2532 uniqueNumber: function uniqueNumber$1() {
2533 uniqueNumber += 1;
2534 return uniqueNumber;
2535 },
2536 id: function id(mask, map) {
2537 if ( mask === void 0 ) mask = 'xxxxxxxxxx';
2538 if ( map === void 0 ) map = '0123456789abcdef';
2539
2540 var length = map.length;
2541 return mask.replace(/x/g, function () { return map[Math.floor((Math.random() * length))]; });
2542 },
2543 mdPreloaderContent: "\n <span class=\"preloader-inner\">\n <span class=\"preloader-inner-gap\"></span>\n <span class=\"preloader-inner-left\">\n <span class=\"preloader-inner-half-circle\"></span>\n </span>\n <span class=\"preloader-inner-right\">\n <span class=\"preloader-inner-half-circle\"></span>\n </span>\n </span>\n ".trim(),
2544 iosPreloaderContent: ("\n <span class=\"preloader-inner\">\n " + (Array.from({ length: 12 }).map(function () { return '<span class="preloader-inner-line"></span>'; }).join('')) + "\n </span>\n ").trim(),
2545 eventNameToColonCase: function eventNameToColonCase(eventName) {
2546 var hasColon;
2547 return eventName.split('').map(function (char, index) {
2548 if (char.match(/[A-Z]/) && index !== 0 && !hasColon) {
2549 hasColon = true;
2550 return (":" + (char.toLowerCase()));
2551 }
2552 return char.toLowerCase();
2553 }).join('');
2554 },
2555 deleteProps: function deleteProps(obj) {
2556 var object = obj;
2557 Object.keys(object).forEach(function (key) {
2558 try {
2559 object[key] = null;
2560 } catch (e) {
2561 // no setter for object
2562 }
2563 try {
2564 delete object[key];
2565 } catch (e) {
2566 // something got wrong
2567 }
2568 });
2569 },
2570 bezier: function bezier$1() {
2571 var args = [], len = arguments.length;
2572 while ( len-- ) args[ len ] = arguments[ len ];
2573
2574 return bezier.apply(void 0, args);
2575 },
2576 nextTick: function nextTick(callback, delay) {
2577 if ( delay === void 0 ) delay = 0;
2578
2579 return setTimeout(callback, delay);
2580 },
2581 nextFrame: function nextFrame(callback) {
2582 return Utils.requestAnimationFrame(function () {
2583 Utils.requestAnimationFrame(callback);
2584 });
2585 },
2586 now: function now() {
2587 return Date.now();
2588 },
2589 requestAnimationFrame: function requestAnimationFrame(callback) {
2590 return win.requestAnimationFrame(callback);
2591 },
2592 cancelAnimationFrame: function cancelAnimationFrame(id) {
2593 return win.cancelAnimationFrame(id);
2594 },
2595 removeDiacritics: function removeDiacritics(str) {
2596 return str.replace(/[^\u0000-\u007E]/g, function (a) { return diacriticsMap[a] || a; });
2597 },
2598 parseUrlQuery: function parseUrlQuery(url) {
2599 var query = {};
2600 var urlToParse = url || win.location.href;
2601 var i;
2602 var params;
2603 var param;
2604 var length;
2605 if (typeof urlToParse === 'string' && urlToParse.length) {
2606 urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : '';
2607 params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });
2608 length = params.length;
2609
2610 for (i = 0; i < length; i += 1) {
2611 param = params[i].replace(/#\S+/g, '').split('=');
2612 query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param.slice(1).join('=')) || '';
2613 }
2614 }
2615 return query;
2616 },
2617 getTranslate: function getTranslate(el, axis) {
2618 if ( axis === void 0 ) axis = 'x';
2619
2620 var matrix;
2621 var curTransform;
2622 var transformMatrix;
2623
2624 var curStyle = win.getComputedStyle(el, null);
2625
2626 if (win.WebKitCSSMatrix) {
2627 curTransform = curStyle.transform || curStyle.webkitTransform;
2628 if (curTransform.split(',').length > 6) {
2629 curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');
2630 }
2631 // Some old versions of Webkit choke when 'none' is passed; pass
2632 // empty string instead in this case
2633 transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
2634 } else {
2635 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
2636 matrix = transformMatrix.toString().split(',');
2637 }
2638
2639 if (axis === 'x') {
2640 // Latest Chrome and webkits Fix
2641 if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }
2642 // Crazy IE10 Matrix
2643 else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }
2644 // Normal Browsers
2645 else { curTransform = parseFloat(matrix[4]); }
2646 }
2647 if (axis === 'y') {
2648 // Latest Chrome and webkits Fix
2649 if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }
2650 // Crazy IE10 Matrix
2651 else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }
2652 // Normal Browsers
2653 else { curTransform = parseFloat(matrix[5]); }
2654 }
2655 return curTransform || 0;
2656 },
2657 serializeObject: function serializeObject(obj, parents) {
2658 if ( parents === void 0 ) parents = [];
2659
2660 if (typeof obj === 'string') { return obj; }
2661 var resultArray = [];
2662 var separator = '&';
2663 var newParents;
2664 function varName(name) {
2665 if (parents.length > 0) {
2666 var parentParts = '';
2667 for (var j = 0; j < parents.length; j += 1) {
2668 if (j === 0) { parentParts += parents[j]; }
2669 else { parentParts += "[" + (encodeURIComponent(parents[j])) + "]"; }
2670 }
2671 return (parentParts + "[" + (encodeURIComponent(name)) + "]");
2672 }
2673 return encodeURIComponent(name);
2674 }
2675 function varValue(value) {
2676 return encodeURIComponent(value);
2677 }
2678 Object.keys(obj).forEach(function (prop) {
2679 var toPush;
2680 if (Array.isArray(obj[prop])) {
2681 toPush = [];
2682 for (var i = 0; i < obj[prop].length; i += 1) {
2683 if (!Array.isArray(obj[prop][i]) && typeof obj[prop][i] === 'object') {
2684 newParents = parents.slice();
2685 newParents.push(prop);
2686 newParents.push(String(i));
2687 toPush.push(Utils.serializeObject(obj[prop][i], newParents));
2688 } else {
2689 toPush.push(((varName(prop)) + "[]=" + (varValue(obj[prop][i]))));
2690 }
2691 }
2692 if (toPush.length > 0) { resultArray.push(toPush.join(separator)); }
2693 } else if (obj[prop] === null || obj[prop] === '') {
2694 resultArray.push(((varName(prop)) + "="));
2695 } else if (typeof obj[prop] === 'object') {
2696 // Object, convert to named array
2697 newParents = parents.slice();
2698 newParents.push(prop);
2699 toPush = Utils.serializeObject(obj[prop], newParents);
2700 if (toPush !== '') { resultArray.push(toPush); }
2701 } else if (typeof obj[prop] !== 'undefined' && obj[prop] !== '') {
2702 // Should be string or plain value
2703 resultArray.push(((varName(prop)) + "=" + (varValue(obj[prop]))));
2704 } else if (obj[prop] === '') { resultArray.push(varName(prop)); }
2705 });
2706 return resultArray.join(separator);
2707 },
2708 isObject: function isObject(o) {
2709 return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
2710 },
2711 merge: function merge() {
2712 var args = [], len$1 = arguments.length;
2713 while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
2714
2715 var to = args[0];
2716 args.splice(0, 1);
2717 var from = args;
2718
2719 for (var i = 0; i < from.length; i += 1) {
2720 var nextSource = args[i];
2721 if (nextSource !== undefined && nextSource !== null) {
2722 var keysArray = Object.keys(Object(nextSource));
2723 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
2724 var nextKey = keysArray[nextIndex];
2725 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
2726 if (desc !== undefined && desc.enumerable) {
2727 to[nextKey] = nextSource[nextKey];
2728 }
2729 }
2730 }
2731 }
2732 return to;
2733 },
2734 extend: function extend() {
2735 var args = [], len$1 = arguments.length;
2736 while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
2737
2738 var deep = true;
2739 var to;
2740 var from;
2741 if (typeof args[0] === 'boolean') {
2742 deep = args[0];
2743 to = args[1];
2744 args.splice(0, 2);
2745 from = args;
2746 } else {
2747 to = args[0];
2748 args.splice(0, 1);
2749 from = args;
2750 }
2751 for (var i = 0; i < from.length; i += 1) {
2752 var nextSource = args[i];
2753 if (nextSource !== undefined && nextSource !== null) {
2754 var keysArray = Object.keys(Object(nextSource));
2755 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
2756 var nextKey = keysArray[nextIndex];
2757 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
2758 if (desc !== undefined && desc.enumerable) {
2759 if (!deep) {
2760 to[nextKey] = nextSource[nextKey];
2761 } else if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
2762 Utils.extend(to[nextKey], nextSource[nextKey]);
2763 } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
2764 to[nextKey] = {};
2765 Utils.extend(to[nextKey], nextSource[nextKey]);
2766 } else {
2767 to[nextKey] = nextSource[nextKey];
2768 }
2769 }
2770 }
2771 }
2772 }
2773 return to;
2774 },
2775 colorHexToRgb: function colorHexToRgb(hex) {
2776 var h = hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function (m, r, g, b) { return r + r + g + g + b + b; });
2777 var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(h);
2778 return result
2779 ? result.slice(1).map(function (n) { return parseInt(n, 16); })
2780 : null;
2781 },
2782 colorRgbToHex: function colorRgbToHex(r, g, b) {
2783 var result = [r, g, b].map(function (n) {
2784 var hex = n.toString(16);
2785 return hex.length === 1 ? ("0" + hex) : hex;
2786 }).join('');
2787 return ("#" + result);
2788 },
2789 colorRgbToHsl: function colorRgbToHsl(r, g, b) {
2790 r /= 255; // eslint-disable-line
2791 g /= 255; // eslint-disable-line
2792 b /= 255; // eslint-disable-line
2793 var max = Math.max(r, g, b);
2794 var min = Math.min(r, g, b);
2795 var d = max - min;
2796 var h;
2797 if (d === 0) { h = 0; }
2798 else if (max === r) { h = ((g - b) / d) % 6; }
2799 else if (max === g) { h = (b - r) / d + 2; }
2800 else if (max === b) { h = (r - g) / d + 4; }
2801 var l = (min + max) / 2;
2802 var s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
2803 return [h * 60, s, l];
2804 },
2805 colorHslToRgb: function colorHslToRgb(h, s, l) {
2806 var c = (1 - Math.abs(2 * l - 1)) * s;
2807 var hp = h / 60;
2808 var x = c * (1 - Math.abs((hp % 2) - 1));
2809 var rgb1;
2810 if (Number.isNaN(h) || typeof h === 'undefined') {
2811 rgb1 = [0, 0, 0];
2812 } else if (hp <= 1) { rgb1 = [c, x, 0]; }
2813 else if (hp <= 2) { rgb1 = [x, c, 0]; }
2814 else if (hp <= 3) { rgb1 = [0, c, x]; }
2815 else if (hp <= 4) { rgb1 = [0, x, c]; }
2816 else if (hp <= 5) { rgb1 = [x, 0, c]; }
2817 else if (hp <= 6) { rgb1 = [c, 0, x]; }
2818 var m = l - (c / 2);
2819 return rgb1.map(function (n) { return Math.max(0, Math.min(255, Math.round(255 * (n + m)))); });
2820 },
2821 colorThemeCSSProperties: function colorThemeCSSProperties() {
2822 var args = [], len = arguments.length;
2823 while ( len-- ) args[ len ] = arguments[ len ];
2824
2825 var hex;
2826 var rgb;
2827 if (args.length === 1) {
2828 hex = args[0];
2829 rgb = Utils.colorHexToRgb(hex);
2830 } else if (args.length === 3) {
2831 rgb = args;
2832 hex = Utils.colorRgbToHex.apply(Utils, rgb);
2833 }
2834 if (!rgb) { return {}; }
2835 var hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
2836 var hslShade = [hsl[0], hsl[1], Math.max(0, (hsl[2] - 0.08))];
2837 var hslTint = [hsl[0], hsl[1], Math.max(0, (hsl[2] + 0.08))];
2838 var shade = Utils.colorRgbToHex.apply(Utils, Utils.colorHslToRgb.apply(Utils, hslShade));
2839 var tint = Utils.colorRgbToHex.apply(Utils, Utils.colorHslToRgb.apply(Utils, hslTint));
2840 return {
2841 '--f7-theme-color': hex,
2842 '--f7-theme-color-rgb': rgb.join(', '),
2843 '--f7-theme-color-shade': shade,
2844 '--f7-theme-color-tint': tint,
2845 };
2846 },
2847 };
2848
2849 var Device = (function Device() {
2850 var platform = win.navigator.platform;
2851 var ua = win.navigator.userAgent;
2852
2853 var device = {
2854 ios: false,
2855 android: false,
2856 androidChrome: false,
2857 desktop: false,
2858 windowsPhone: false,
2859 iphone: false,
2860 iphoneX: false,
2861 ipod: false,
2862 ipad: false,
2863 edge: false,
2864 ie: false,
2865 firefox: false,
2866 macos: false,
2867 windows: false,
2868 cordova: !!(win.cordova || win.phonegap),
2869 phonegap: !!(win.cordova || win.phonegap),
2870 };
2871
2872 var screenWidth = win.screen.width;
2873 var screenHeight = win.screen.height;
2874
2875 var windowsPhone = ua.match(/(Windows Phone);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2876 var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2877 var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
2878 var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
2879 var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
2880 var iphoneX = iphone && (
2881 (screenWidth === 375 && screenHeight === 812) // X/XS
2882 || (screenWidth === 414 && screenHeight === 896) // XR / XS Max
2883 );
2884 var ie = ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;
2885 var edge = ua.indexOf('Edge/') >= 0;
2886 var firefox = ua.indexOf('Gecko/') >= 0 && ua.indexOf('Firefox/') >= 0;
2887 var macos = platform === 'MacIntel';
2888 var windows = platform === 'Win32';
2889
2890 device.ie = ie;
2891 device.edge = edge;
2892 device.firefox = firefox;
2893
2894 // Windows
2895 if (windowsPhone) {
2896 device.os = 'windows';
2897 device.osVersion = windowsPhone[2];
2898 device.windowsPhone = true;
2899 }
2900 // Android
2901 if (android && !windows) {
2902 device.os = 'android';
2903 device.osVersion = android[2];
2904 device.android = true;
2905 device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;
2906 }
2907 if (ipad || iphone || ipod) {
2908 device.os = 'ios';
2909 device.ios = true;
2910 }
2911 // iOS
2912 if (iphone && !ipod) {
2913 device.osVersion = iphone[2].replace(/_/g, '.');
2914 device.iphone = true;
2915 device.iphoneX = iphoneX;
2916 }
2917 if (ipad) {
2918 device.osVersion = ipad[2].replace(/_/g, '.');
2919 device.ipad = true;
2920 }
2921 if (ipod) {
2922 device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
2923 device.iphone = true;
2924 }
2925 // iOS 8+ changed UA
2926 if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {
2927 if (device.osVersion.split('.')[0] === '10') {
2928 device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];
2929 }
2930 }
2931
2932 // Webview
2933 device.webView = !!((iphone || ipad || ipod) && (ua.match(/.*AppleWebKit(?!.*Safari)/i) || win.navigator.standalone))
2934 || (win.matchMedia && win.matchMedia('(display-mode: standalone)').matches);
2935 device.webview = device.webView;
2936 device.standalone = device.webView;
2937
2938 // Desktop
2939 device.desktop = !(device.os || device.android || device.webView);
2940 if (device.desktop) {
2941 device.macos = macos;
2942 device.windows = windows;
2943 }
2944
2945 // Minimal UI
2946 if (device.os && device.os === 'ios') {
2947 var osVersionArr = device.osVersion.split('.');
2948 var metaViewport = doc.querySelector('meta[name="viewport"]');
2949 device.minimalUi = !device.webView
2950 && (ipod || iphone)
2951 && (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7)
2952 && metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0;
2953 }
2954
2955 // Meta statusbar
2956 var metaStatusbar = doc.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]');
2957
2958 // Check for status bar and fullscreen app mode
2959 device.needsStatusbarOverlay = function needsStatusbarOverlay() {
2960 if (device.standalone && device.ios && metaStatusbar && metaStatusbar.content === 'black-translucent') {
2961 return true;
2962 }
2963 if ((device.webView || (device.android && device.cordova)) && (win.innerWidth * win.innerHeight === win.screen.width * win.screen.height)) {
2964 if (device.iphoneX && (win.orientation === 90 || win.orientation === -90)) {
2965 return false;
2966 }
2967 return true;
2968 }
2969 return false;
2970 };
2971 device.statusbar = device.needsStatusbarOverlay();
2972
2973 // Pixel Ratio
2974 device.pixelRatio = win.devicePixelRatio || 1;
2975
2976 // Export object
2977 return device;
2978 }());
2979
2980 var EventsClass = function EventsClass(parents) {
2981 if ( parents === void 0 ) parents = [];
2982
2983 var self = this;
2984 self.eventsParents = parents;
2985 self.eventsListeners = {};
2986 };
2987
2988 EventsClass.prototype.on = function on (events, handler, priority) {
2989 var self = this;
2990 if (typeof handler !== 'function') { return self; }
2991 var method = priority ? 'unshift' : 'push';
2992 events.split(' ').forEach(function (event) {
2993 if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }
2994 self.eventsListeners[event][method](handler);
2995 });
2996 return self;
2997 };
2998
2999 EventsClass.prototype.once = function once (events, handler, priority) {
3000 var self = this;
3001 if (typeof handler !== 'function') { return self; }
3002 function onceHandler() {
3003 var args = [], len = arguments.length;
3004 while ( len-- ) args[ len ] = arguments[ len ];
3005
3006 handler.apply(self, args);
3007 self.off(events, onceHandler);
3008 if (onceHandler.f7proxy) {
3009 delete onceHandler.f7proxy;
3010 }
3011 }
3012 onceHandler.f7proxy = handler;
3013 return self.on(events, onceHandler, priority);
3014 };
3015
3016 EventsClass.prototype.off = function off (events, handler) {
3017 var self = this;
3018 if (!self.eventsListeners) { return self; }
3019 events.split(' ').forEach(function (event) {
3020 if (typeof handler === 'undefined') {
3021 self.eventsListeners[event] = [];
3022 } else if (self.eventsListeners[event]) {
3023 self.eventsListeners[event].forEach(function (eventHandler, index) {
3024 if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {
3025 self.eventsListeners[event].splice(index, 1);
3026 }
3027 });
3028 }
3029 });
3030 return self;
3031 };
3032
3033 EventsClass.prototype.emit = function emit () {
3034 var args = [], len = arguments.length;
3035 while ( len-- ) args[ len ] = arguments[ len ];
3036
3037 var self = this;
3038 if (!self.eventsListeners) { return self; }
3039 var events;
3040 var data;
3041 var context;
3042 var eventsParents;
3043 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
3044 events = args[0];
3045 data = args.slice(1, args.length);
3046 context = self;
3047 eventsParents = self.eventsParents;
3048 } else {
3049 events = args[0].events;
3050 data = args[0].data;
3051 context = args[0].context || self;
3052 eventsParents = args[0].local ? [] : args[0].parents || self.eventsParents;
3053 }
3054 var eventsArray = Array.isArray(events) ? events : events.split(' ');
3055 var localEvents = eventsArray.map(function (eventName) { return eventName.replace('local::', ''); });
3056 var parentEvents = eventsArray.filter(function (eventName) { return eventName.indexOf('local::') < 0; });
3057
3058 localEvents.forEach(function (event) {
3059 if (self.eventsListeners && self.eventsListeners[event]) {
3060 var handlers = [];
3061 self.eventsListeners[event].forEach(function (eventHandler) {
3062 handlers.push(eventHandler);
3063 });
3064 handlers.forEach(function (eventHandler) {
3065 eventHandler.apply(context, data);
3066 });
3067 }
3068 });
3069 if (eventsParents && eventsParents.length > 0) {
3070 eventsParents.forEach(function (eventsParent) {
3071 eventsParent.emit.apply(eventsParent, [ parentEvents ].concat( data ));
3072 });
3073 }
3074 return self;
3075 };
3076
3077 var Framework7Class = /*@__PURE__*/(function (EventsClass$$1) {
3078 function Framework7Class(params, parents) {
3079 if ( params === void 0 ) params = {};
3080 if ( parents === void 0 ) parents = [];
3081
3082 EventsClass$$1.call(this, parents);
3083 var self = this;
3084 self.params = params;
3085
3086 if (self.params && self.params.on) {
3087 Object.keys(self.params.on).forEach(function (eventName) {
3088 self.on(eventName, self.params.on[eventName]);
3089 });
3090 }
3091 }
3092
3093 if ( EventsClass$$1 ) Framework7Class.__proto__ = EventsClass$$1;
3094 Framework7Class.prototype = Object.create( EventsClass$$1 && EventsClass$$1.prototype );
3095 Framework7Class.prototype.constructor = Framework7Class;
3096
3097 var staticAccessors = { components: { configurable: true } };
3098
3099 // eslint-disable-next-line
3100 Framework7Class.prototype.useModuleParams = function useModuleParams (module, instanceParams) {
3101 if (module.params) {
3102 var originalParams = {};
3103 Object.keys(module.params).forEach(function (paramKey) {
3104 if (typeof instanceParams[paramKey] === 'undefined') { return; }
3105 originalParams[paramKey] = Utils.extend({}, instanceParams[paramKey]);
3106 });
3107 Utils.extend(instanceParams, module.params);
3108 Object.keys(originalParams).forEach(function (paramKey) {
3109 Utils.extend(instanceParams[paramKey], originalParams[paramKey]);
3110 });
3111 }
3112 };
3113
3114 Framework7Class.prototype.useModulesParams = function useModulesParams (instanceParams) {
3115 var instance = this;
3116 if (!instance.modules) { return; }
3117 Object.keys(instance.modules).forEach(function (moduleName) {
3118 var module = instance.modules[moduleName];
3119 // Extend params
3120 if (module.params) {
3121 Utils.extend(instanceParams, module.params);
3122 }
3123 });
3124 };
3125
3126 Framework7Class.prototype.useModule = function useModule (moduleName, moduleParams) {
3127 if ( moduleName === void 0 ) moduleName = '';
3128 if ( moduleParams === void 0 ) moduleParams = {};
3129
3130 var instance = this;
3131 if (!instance.modules) { return; }
3132 var module = typeof moduleName === 'string' ? instance.modules[moduleName] : moduleName;
3133 if (!module) { return; }
3134
3135 // Extend instance methods and props
3136 if (module.instance) {
3137 Object.keys(module.instance).forEach(function (modulePropName) {
3138 var moduleProp = module.instance[modulePropName];
3139 if (typeof moduleProp === 'function') {
3140 instance[modulePropName] = moduleProp.bind(instance);
3141 } else {
3142 instance[modulePropName] = moduleProp;
3143 }
3144 });
3145 }
3146 // Add event listeners
3147 if (module.on && instance.on) {
3148 Object.keys(module.on).forEach(function (moduleEventName) {
3149 instance.on(moduleEventName, module.on[moduleEventName]);
3150 });
3151 }
3152 // Add vnode hooks
3153 if (module.vnode) {
3154 if (!instance.vnodeHooks) { instance.vnodeHooks = {}; }
3155 Object.keys(module.vnode).forEach(function (vnodeId) {
3156 Object.keys(module.vnode[vnodeId]).forEach(function (hookName) {
3157 var handler = module.vnode[vnodeId][hookName];
3158 if (!instance.vnodeHooks[hookName]) { instance.vnodeHooks[hookName] = {}; }
3159 if (!instance.vnodeHooks[hookName][vnodeId]) { instance.vnodeHooks[hookName][vnodeId] = []; }
3160 instance.vnodeHooks[hookName][vnodeId].push(handler.bind(instance));
3161 });
3162 });
3163 }
3164 // Module create callback
3165 if (module.create) {
3166 module.create.bind(instance)(moduleParams);
3167 }
3168 };
3169
3170 Framework7Class.prototype.useModules = function useModules (modulesParams) {
3171 if ( modulesParams === void 0 ) modulesParams = {};
3172
3173 var instance = this;
3174 if (!instance.modules) { return; }
3175 Object.keys(instance.modules).forEach(function (moduleName) {
3176 var moduleParams = modulesParams[moduleName] || {};
3177 instance.useModule(moduleName, moduleParams);
3178 });
3179 };
3180
3181 staticAccessors.components.set = function (components) {
3182 var Class = this;
3183 if (!Class.use) { return; }
3184 Class.use(components);
3185 };
3186
3187 Framework7Class.installModule = function installModule (module) {
3188 var params = [], len = arguments.length - 1;
3189 while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
3190
3191 var Class = this;
3192 if (!Class.prototype.modules) { Class.prototype.modules = {}; }
3193 var name = module.name || (((Object.keys(Class.prototype.modules).length) + "_" + (Utils.now())));
3194 Class.prototype.modules[name] = module;
3195 // Prototype
3196 if (module.proto) {
3197 Object.keys(module.proto).forEach(function (key) {
3198 Class.prototype[key] = module.proto[key];
3199 });
3200 }
3201 // Class
3202 if (module.static) {
3203 Object.keys(module.static).forEach(function (key) {
3204 Class[key] = module.static[key];
3205 });
3206 }
3207 // Callback
3208 if (module.install) {
3209 module.install.apply(Class, params);
3210 }
3211 return Class;
3212 };
3213
3214 Framework7Class.use = function use (module) {
3215 var params = [], len = arguments.length - 1;
3216 while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
3217
3218 var Class = this;
3219 if (Array.isArray(module)) {
3220 module.forEach(function (m) { return Class.installModule(m); });
3221 return Class;
3222 }
3223 return Class.installModule.apply(Class, [ module ].concat( params ));
3224 };
3225
3226 Object.defineProperties( Framework7Class, staticAccessors );
3227
3228 return Framework7Class;
3229 }(EventsClass));
3230
3231 function ConstructorMethods (parameters) {
3232 if ( parameters === void 0 ) parameters = {};
3233
3234 var defaultSelector = parameters.defaultSelector;
3235 var constructor = parameters.constructor;
3236 var domProp = parameters.domProp;
3237 var app = parameters.app;
3238 var addMethods = parameters.addMethods;
3239 var methods = {
3240 create: function create() {
3241 var args = [], len = arguments.length;
3242 while ( len-- ) args[ len ] = arguments[ len ];
3243
3244 if (app) { return new (Function.prototype.bind.apply( constructor, [ null ].concat( [app], args) )); }
3245 return new (Function.prototype.bind.apply( constructor, [ null ].concat( args) ));
3246 },
3247 get: function get(el) {
3248 if ( el === void 0 ) el = defaultSelector;
3249
3250 if (el instanceof constructor) { return el; }
3251 var $el = $(el);
3252 if ($el.length === 0) { return undefined; }
3253 return $el[0][domProp];
3254 },
3255 destroy: function destroy(el) {
3256 var instance = methods.get(el);
3257 if (instance && instance.destroy) { return instance.destroy(); }
3258 return undefined;
3259 },
3260 };
3261 if (addMethods && Array.isArray(addMethods)) {
3262 addMethods.forEach(function (methodName) {
3263 methods[methodName] = function (el) {
3264 if ( el === void 0 ) el = defaultSelector;
3265 var args = [], len = arguments.length - 1;
3266 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
3267
3268 var instance = methods.get(el);
3269 if (instance && instance[methodName]) { return instance[methodName].apply(instance, args); }
3270 return undefined;
3271 };
3272 });
3273 }
3274 return methods;
3275 }
3276
3277 function ModalMethods (parameters) {
3278 if ( parameters === void 0 ) parameters = {};
3279
3280 var defaultSelector = parameters.defaultSelector;
3281 var constructor = parameters.constructor;
3282 var app = parameters.app;
3283 var methods = Utils.extend(
3284 ConstructorMethods({
3285 defaultSelector: defaultSelector,
3286 constructor: constructor,
3287 app: app,
3288 domProp: 'f7Modal',
3289 }),
3290 {
3291 open: function open(el, animate) {
3292 var $el = $(el);
3293 var instance = $el[0].f7Modal;
3294 if (!instance) { instance = new constructor(app, { el: $el }); }
3295 return instance.open(animate);
3296 },
3297 close: function close(el, animate) {
3298 if ( el === void 0 ) el = defaultSelector;
3299
3300 var $el = $(el);
3301 if ($el.length === 0) { return undefined; }
3302 var instance = $el[0].f7Modal;
3303 if (!instance) { instance = new constructor(app, { el: $el }); }
3304 return instance.close(animate);
3305 },
3306 }
3307 );
3308 return methods;
3309 }
3310
3311 var fetchedModules = [];
3312 function loadModule(moduleToLoad) {
3313 var Framework7 = this;
3314 return new Promise(function (resolve, reject) {
3315 var app = Framework7.instance;
3316 var modulePath;
3317 var moduleObj;
3318 var moduleFunc;
3319 if (!moduleToLoad) {
3320 reject(new Error('Framework7: Lazy module must be specified'));
3321 return;
3322 }
3323
3324 function install(module) {
3325 Framework7.use(module);
3326
3327 if (app) {
3328 app.useModuleParams(module, app.params);
3329 app.useModule(module);
3330 }
3331 }
3332
3333 if (typeof moduleToLoad === 'string') {
3334 var matchNamePattern = moduleToLoad.match(/([a-z0-9-]*)/i);
3335 if (moduleToLoad.indexOf('.') < 0 && matchNamePattern && matchNamePattern[0].length === moduleToLoad.length) {
3336 if (!app || (app && !app.params.lazyModulesPath)) {
3337 reject(new Error('Framework7: "lazyModulesPath" app parameter must be specified to fetch module by name'));
3338 return;
3339 }
3340 modulePath = (app.params.lazyModulesPath) + "/" + moduleToLoad + ".js";
3341 } else {
3342 modulePath = moduleToLoad;
3343 }
3344 } else if (typeof moduleToLoad === 'function') {
3345 moduleFunc = moduleToLoad;
3346 } else {
3347 // considering F7-Plugin object
3348 moduleObj = moduleToLoad;
3349 }
3350
3351 if (moduleFunc) {
3352 var module = moduleFunc(Framework7, false);
3353 if (!module) {
3354 reject(new Error('Framework7: Can\'t find Framework7 component in specified component function'));
3355 return;
3356 }
3357 // Check if it was added
3358 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
3359 resolve();
3360 return;
3361 }
3362 // Install It
3363 install(module);
3364
3365 resolve();
3366 }
3367 if (moduleObj) {
3368 var module$1 = moduleObj;
3369 if (!module$1) {
3370 reject(new Error('Framework7: Can\'t find Framework7 component in specified component'));
3371 return;
3372 }
3373 // Check if it was added
3374 if (Framework7.prototype.modules && Framework7.prototype.modules[module$1.name]) {
3375 resolve();
3376 return;
3377 }
3378 // Install It
3379 install(module$1);
3380
3381 resolve();
3382 }
3383 if (modulePath) {
3384 if (fetchedModules.indexOf(modulePath) >= 0) {
3385 resolve();
3386 return;
3387 }
3388 fetchedModules.push(modulePath);
3389 var scriptLoad = new Promise(function (resolveScript, rejectScript) {
3390 Framework7.request.get(
3391 modulePath,
3392 function (scriptContent) {
3393 var id = Utils.id();
3394 var callbackLoadName = "f7_component_loader_callback_" + id;
3395
3396 var scriptEl = document.createElement('script');
3397 scriptEl.innerHTML = "window." + callbackLoadName + " = function (Framework7, Framework7AutoInstallComponent) {return " + (scriptContent.trim()) + "}";
3398 $('head').append(scriptEl);
3399
3400 var componentLoader = window[callbackLoadName];
3401 delete window[callbackLoadName];
3402 $(scriptEl).remove();
3403
3404 var module = componentLoader(Framework7, false);
3405
3406 if (!module) {
3407 rejectScript(new Error(("Framework7: Can't find Framework7 component in " + modulePath + " file")));
3408 return;
3409 }
3410
3411 // Check if it was added
3412 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
3413 resolveScript();
3414 return;
3415 }
3416
3417 // Install It
3418 install(module);
3419
3420 resolveScript();
3421 },
3422 function (xhr, status) {
3423 rejectScript(xhr, status);
3424 }
3425 );
3426 });
3427 var styleLoad = new Promise(function (resolveStyle) {
3428 Framework7.request.get(
3429 modulePath.replace('.js', app.rtl ? '.rtl.css' : '.css'),
3430 function (styleContent) {
3431 var styleEl = document.createElement('style');
3432 styleEl.innerHTML = styleContent;
3433 $('head').append(styleEl);
3434
3435 resolveStyle();
3436 },
3437 function () {
3438 resolveStyle();
3439 }
3440 );
3441 });
3442
3443 Promise.all([scriptLoad, styleLoad]).then(function () {
3444 resolve();
3445 }).catch(function (err) {
3446 reject(err);
3447 });
3448 }
3449 });
3450 }
3451
3452 var Framework7 = /*@__PURE__*/(function (Framework7Class$$1) {
3453 function Framework7(params) {
3454 Framework7Class$$1.call(this, params);
3455 if (Framework7.instance) {
3456 throw new Error('Framework7 is already initialized and can\'t be initialized more than once');
3457 }
3458
3459 var passedParams = Utils.extend({}, params);
3460
3461 // App Instance
3462 var app = this;
3463
3464 Framework7.instance = app;
3465
3466 // Default
3467 var defaults = {
3468 version: '1.0.0',
3469 id: 'io.framework7.testapp',
3470 root: 'body',
3471 theme: 'auto',
3472 language: win.navigator.language,
3473 routes: [],
3474 name: 'Framework7',
3475 lazyModulesPath: null,
3476 initOnDeviceReady: true,
3477 init: true,
3478 };
3479
3480 // Extend defaults with modules params
3481 app.useModulesParams(defaults);
3482
3483 // Extend defaults with passed params
3484 app.params = Utils.extend(defaults, params);
3485
3486 var $rootEl = $(app.params.root);
3487
3488 Utils.extend(app, {
3489 // App Id
3490 id: app.params.id,
3491 // App Name
3492 name: app.params.name,
3493 // App version
3494 version: app.params.version,
3495 // Routes
3496 routes: app.params.routes,
3497 // Lang
3498 language: app.params.language,
3499 // Root
3500 root: $rootEl,
3501 // RTL
3502 rtl: $rootEl.css('direction') === 'rtl',
3503 // Theme
3504 theme: (function getTheme() {
3505 if (app.params.theme === 'auto') {
3506 return Device.ios ? 'ios' : 'md';
3507 }
3508 return app.params.theme;
3509 }()),
3510 // Initially passed parameters
3511 passedParams: passedParams,
3512 });
3513
3514 // Save Root
3515 if (app.root && app.root[0]) {
3516 app.root[0].f7 = app;
3517 }
3518
3519 // Install Modules
3520 app.useModules();
3521
3522 // Init Data & Methods
3523 app.initData();
3524
3525 // Init
3526 if (app.params.init) {
3527 if (Device.cordova && app.params.initOnDeviceReady) {
3528 $(doc).on('deviceready', function () {
3529 app.init();
3530 });
3531 } else {
3532 app.init();
3533 }
3534 }
3535 // Return app instance
3536 return app;
3537 }
3538
3539 if ( Framework7Class$$1 ) Framework7.__proto__ = Framework7Class$$1;
3540 Framework7.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
3541 Framework7.prototype.constructor = Framework7;
3542
3543 var prototypeAccessors = { $: { configurable: true },t7: { configurable: true } };
3544 var staticAccessors = { Dom7: { configurable: true },$: { configurable: true },Template7: { configurable: true },Class: { configurable: true },Events: { configurable: true } };
3545
3546 Framework7.prototype.initData = function initData () {
3547 var app = this;
3548
3549 // Data
3550 app.data = {};
3551 if (app.params.data && typeof app.params.data === 'function') {
3552 Utils.extend(app.data, app.params.data.bind(app)());
3553 } else if (app.params.data) {
3554 Utils.extend(app.data, app.params.data);
3555 }
3556 // Methods
3557 app.methods = {};
3558 if (app.params.methods) {
3559 Object.keys(app.params.methods).forEach(function (methodName) {
3560 if (typeof app.params.methods[methodName] === 'function') {
3561 app.methods[methodName] = app.params.methods[methodName].bind(app);
3562 } else {
3563 app.methods[methodName] = app.params.methods[methodName];
3564 }
3565 });
3566 }
3567 };
3568
3569 Framework7.prototype.init = function init () {
3570 var app = this;
3571 if (app.initialized) { return app; }
3572
3573 app.root.addClass('framework7-initializing');
3574
3575 // RTL attr
3576 if (app.rtl) {
3577 $('html').attr('dir', 'rtl');
3578 }
3579
3580 // Root class
3581 app.root.addClass('framework7-root');
3582
3583 // Theme class
3584 $('html').removeClass('ios md').addClass(app.theme);
3585
3586 // Init class
3587 Utils.nextFrame(function () {
3588 app.root.removeClass('framework7-initializing');
3589 });
3590 // Emit, init other modules
3591 app.initialized = true;
3592 app.emit('init');
3593
3594 return app;
3595 };
3596
3597 // eslint-disable-next-line
3598 Framework7.prototype.loadModule = function loadModule$$1 () {
3599 var args = [], len = arguments.length;
3600 while ( len-- ) args[ len ] = arguments[ len ];
3601
3602 return Framework7.loadModule.apply(Framework7, args);
3603 };
3604
3605 // eslint-disable-next-line
3606 Framework7.prototype.loadModules = function loadModules () {
3607 var args = [], len = arguments.length;
3608 while ( len-- ) args[ len ] = arguments[ len ];
3609
3610 return Framework7.loadModules.apply(Framework7, args);
3611 };
3612
3613 Framework7.prototype.getVnodeHooks = function getVnodeHooks (hook, id) {
3614 var app = this;
3615 if (!app.vnodeHooks || !app.vnodeHooks[hook]) { return []; }
3616 return app.vnodeHooks[hook][id] || [];
3617 };
3618
3619 // eslint-disable-next-line
3620 prototypeAccessors.$.get = function () {
3621 return $;
3622 };
3623 // eslint-disable-next-line
3624 prototypeAccessors.t7.get = function () {
3625 return Template7;
3626 };
3627
3628 staticAccessors.Dom7.get = function () {
3629 return $;
3630 };
3631
3632 staticAccessors.$.get = function () {
3633 return $;
3634 };
3635
3636 staticAccessors.Template7.get = function () {
3637 return Template7;
3638 };
3639
3640 staticAccessors.Class.get = function () {
3641 return Framework7Class$$1;
3642 };
3643
3644 staticAccessors.Events.get = function () {
3645 return EventsClass;
3646 };
3647
3648 Object.defineProperties( Framework7.prototype, prototypeAccessors );
3649 Object.defineProperties( Framework7, staticAccessors );
3650
3651 return Framework7;
3652 }(Framework7Class));
3653
3654 Framework7.ModalMethods = ModalMethods;
3655 Framework7.ConstructorMethods = ConstructorMethods;
3656
3657 Framework7.loadModule = loadModule;
3658 Framework7.loadModules = function loadModules(modules) {
3659 return Promise.all(modules.map(function (module) { return Framework7.loadModule(module); }));
3660 };
3661
3662 var DeviceModule = {
3663 name: 'device',
3664 proto: {
3665 device: Device,
3666 },
3667 static: {
3668 device: Device,
3669 },
3670 on: {
3671 init: function init() {
3672 var classNames = [];
3673 var html = doc.querySelector('html');
3674 var metaStatusbar = doc.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]');
3675 if (!html) { return; }
3676 if (Device.standalone && Device.ios && metaStatusbar && metaStatusbar.content === 'black-translucent') {
3677 classNames.push('device-full-viewport');
3678 }
3679
3680 // Pixel Ratio
3681 classNames.push(("device-pixel-ratio-" + (Math.floor(Device.pixelRatio))));
3682 if (Device.pixelRatio >= 2) {
3683 classNames.push('device-retina');
3684 }
3685 // OS classes
3686 if (Device.os) {
3687 classNames.push(
3688 ("device-" + (Device.os)),
3689 ("device-" + (Device.os) + "-" + (Device.osVersion.split('.')[0])),
3690 ("device-" + (Device.os) + "-" + (Device.osVersion.replace(/\./g, '-')))
3691 );
3692 if (Device.os === 'ios') {
3693 var major = parseInt(Device.osVersion.split('.')[0], 10);
3694 for (var i = major - 1; i >= 6; i -= 1) {
3695 classNames.push(("device-ios-gt-" + i));
3696 }
3697 if (Device.iphoneX) {
3698 classNames.push('device-iphone-x');
3699 }
3700 }
3701 } else if (Device.desktop) {
3702 classNames.push('device-desktop');
3703 if (Device.macos) { classNames.push('device-macos'); }
3704 else if (Device.windows) { classNames.push('device-windows'); }
3705 }
3706 if (Device.cordova || Device.phonegap) {
3707 classNames.push('device-cordova');
3708 }
3709
3710 // Add html classes
3711 classNames.forEach(function (className) {
3712 html.classList.add(className);
3713 });
3714 },
3715 },
3716 };
3717
3718 var Support = (function Support() {
3719 var testDiv = doc.createElement('div');
3720
3721 return {
3722 touch: (function checkTouch() {
3723 return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch));
3724 }()),
3725
3726 pointerEvents: !!(win.navigator.pointerEnabled || win.PointerEvent || ('maxTouchPoints' in win.navigator)),
3727 prefixedPointerEvents: !!win.navigator.msPointerEnabled,
3728
3729 transition: (function checkTransition() {
3730 var style = testDiv.style;
3731 return ('transition' in style || 'webkitTransition' in style || 'MozTransition' in style);
3732 }()),
3733 transforms3d: (win.Modernizr && win.Modernizr.csstransforms3d === true) || (function checkTransforms3d() {
3734 var style = testDiv.style;
3735 return ('webkitPerspective' in style || 'MozPerspective' in style || 'OPerspective' in style || 'MsPerspective' in style || 'perspective' in style);
3736 }()),
3737
3738 flexbox: (function checkFlexbox() {
3739 var div = doc.createElement('div').style;
3740 var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' ');
3741 for (var i = 0; i < styles.length; i += 1) {
3742 if (styles[i] in div) { return true; }
3743 }
3744 return false;
3745 }()),
3746
3747 observer: (function checkObserver() {
3748 return ('MutationObserver' in win || 'WebkitMutationObserver' in win);
3749 }()),
3750
3751 passiveListener: (function checkPassiveListener() {
3752 var supportsPassive = false;
3753 try {
3754 var opts = Object.defineProperty({}, 'passive', {
3755 // eslint-disable-next-line
3756 get: function get() {
3757 supportsPassive = true;
3758 },
3759 });
3760 win.addEventListener('testPassiveListener', null, opts);
3761 } catch (e) {
3762 // No support
3763 }
3764 return supportsPassive;
3765 }()),
3766
3767 gestures: (function checkGestures() {
3768 return 'ongesturestart' in win;
3769 }()),
3770
3771 intersectionObserver: (function checkObserver() {
3772 return ('IntersectionObserver' in win);
3773 }()),
3774 };
3775 }());
3776
3777 var SupportModule = {
3778 name: 'support',
3779 proto: {
3780 support: Support,
3781 },
3782 static: {
3783 support: Support,
3784 },
3785 on: {
3786 init: function init() {
3787 var html = doc.querySelector('html');
3788 if (!html) { return; }
3789 var classNames = [];
3790 // Add html classes
3791 classNames.forEach(function (className) {
3792 html.classList.add(className);
3793 });
3794 },
3795 },
3796 };
3797
3798 var UtilsModule = {
3799 name: 'utils',
3800 proto: {
3801 utils: Utils,
3802 },
3803 static: {
3804 utils: Utils,
3805 },
3806 };
3807
3808 var ResizeModule = {
3809 name: 'resize',
3810 instance: {
3811 getSize: function getSize() {
3812 var app = this;
3813 if (!app.root[0]) { return { width: 0, height: 0, left: 0, top: 0 }; }
3814 var offset = app.root.offset();
3815 var ref = [app.root[0].offsetWidth, app.root[0].offsetHeight, offset.left, offset.top];
3816 var width = ref[0];
3817 var height = ref[1];
3818 var left = ref[2];
3819 var top = ref[3];
3820 app.width = width;
3821 app.height = height;
3822 app.left = left;
3823 app.top = top;
3824 return { width: width, height: height, left: left, top: top };
3825 },
3826 },
3827 on: {
3828 init: function init() {
3829 var app = this;
3830
3831 // Get Size
3832 app.getSize();
3833
3834 // Emit resize
3835 win.addEventListener('resize', function () {
3836 app.emit('resize');
3837 }, false);
3838
3839 // Emit orientationchange
3840 win.addEventListener('orientationchange', function () {
3841 app.emit('orientationchange');
3842 });
3843 },
3844 orientationchange: function orientationchange() {
3845 var app = this;
3846 if (app.device && app.device.minimalUi) {
3847 if (win.orientation === 90 || win.orientation === -90) {
3848 doc.body.scrollTop = 0;
3849 }
3850 }
3851 // Fix iPad weird body scroll
3852 if (app.device.ipad) {
3853 doc.body.scrollLeft = 0;
3854 setTimeout(function () {
3855 doc.body.scrollLeft = 0;
3856 }, 0);
3857 }
3858 },
3859 resize: function resize() {
3860 var app = this;
3861 app.getSize();
3862 },
3863 },
3864 };
3865
3866 var globals = {};
3867 var jsonpRequests = 0;
3868
3869 function Request(requestOptions) {
3870 var globalsNoCallbacks = Utils.extend({}, globals);
3871 ('beforeCreate beforeOpen beforeSend error complete success statusCode').split(' ').forEach(function (callbackName) {
3872 delete globalsNoCallbacks[callbackName];
3873 });
3874 var defaults = Utils.extend({
3875 url: win.location.toString(),
3876 method: 'GET',
3877 data: false,
3878 async: true,
3879 cache: true,
3880 user: '',
3881 password: '',
3882 headers: {},
3883 xhrFields: {},
3884 statusCode: {},
3885 processData: true,
3886 dataType: 'text',
3887 contentType: 'application/x-www-form-urlencoded',
3888 timeout: 0,
3889 }, globalsNoCallbacks);
3890
3891 var options = Utils.extend({}, defaults, requestOptions);
3892 var proceedRequest;
3893
3894 // Function to run XHR callbacks and events
3895 function fireCallback(callbackName) {
3896 var data = [], len = arguments.length - 1;
3897 while ( len-- > 0 ) data[ len ] = arguments[ len + 1 ];
3898
3899 /*
3900 Callbacks:
3901 beforeCreate (options),
3902 beforeOpen (xhr, options),
3903 beforeSend (xhr, options),
3904 error (xhr, status),
3905 complete (xhr, stautus),
3906 success (response, status, xhr),
3907 statusCode ()
3908 */
3909 var globalCallbackValue;
3910 var optionCallbackValue;
3911 if (globals[callbackName]) {
3912 globalCallbackValue = globals[callbackName].apply(globals, data);
3913 }
3914 if (options[callbackName]) {
3915 optionCallbackValue = options[callbackName].apply(options, data);
3916 }
3917 if (typeof globalCallbackValue !== 'boolean') { globalCallbackValue = true; }
3918 if (typeof optionCallbackValue !== 'boolean') { optionCallbackValue = true; }
3919 return (globalCallbackValue && optionCallbackValue);
3920 }
3921
3922 // Before create callback
3923 proceedRequest = fireCallback('beforeCreate', options);
3924 if (proceedRequest === false) { return undefined; }
3925
3926 // For jQuery guys
3927 if (options.type) { options.method = options.type; }
3928
3929 // Parameters Prefix
3930 var paramsPrefix = options.url.indexOf('?') >= 0 ? '&' : '?';
3931
3932 // UC method
3933 var method = options.method.toUpperCase();
3934
3935 // Data to modify GET URL
3936 if ((method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') && options.data) {
3937 var stringData;
3938 if (typeof options.data === 'string') {
3939 // Should be key=value string
3940 if (options.data.indexOf('?') >= 0) { stringData = options.data.split('?')[1]; }
3941 else { stringData = options.data; }
3942 } else {
3943 // Should be key=value object
3944 stringData = Utils.serializeObject(options.data);
3945 }
3946 if (stringData.length) {
3947 options.url += paramsPrefix + stringData;
3948 if (paramsPrefix === '?') { paramsPrefix = '&'; }
3949 }
3950 }
3951
3952 // JSONP
3953 if (options.dataType === 'json' && options.url.indexOf('callback=') >= 0) {
3954 var callbackName = "f7jsonp_" + (Date.now() + ((jsonpRequests += 1)));
3955 var abortTimeout;
3956 var callbackSplit = options.url.split('callback=');
3957 var requestUrl = (callbackSplit[0]) + "callback=" + callbackName;
3958 if (callbackSplit[1].indexOf('&') >= 0) {
3959 var addVars = callbackSplit[1].split('&').filter(function (el) { return el.indexOf('=') > 0; }).join('&');
3960 if (addVars.length > 0) { requestUrl += "&" + addVars; }
3961 }
3962
3963 // Create script
3964 var script = doc.createElement('script');
3965 script.type = 'text/javascript';
3966 script.onerror = function onerror() {
3967 clearTimeout(abortTimeout);
3968 fireCallback('error', null, 'scripterror');
3969 fireCallback('complete', null, 'scripterror');
3970 };
3971 script.src = requestUrl;
3972
3973 // Handler
3974 win[callbackName] = function jsonpCallback(data) {
3975 clearTimeout(abortTimeout);
3976 fireCallback('success', data);
3977 script.parentNode.removeChild(script);
3978 script = null;
3979 delete win[callbackName];
3980 };
3981 doc.querySelector('head').appendChild(script);
3982
3983 if (options.timeout > 0) {
3984 abortTimeout = setTimeout(function () {
3985 script.parentNode.removeChild(script);
3986 script = null;
3987 fireCallback('error', null, 'timeout');
3988 }, options.timeout);
3989 }
3990
3991 return undefined;
3992 }
3993
3994 // Cache for GET/HEAD requests
3995 if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') {
3996 if (options.cache === false) {
3997 options.url += paramsPrefix + "_nocache" + (Date.now());
3998 }
3999 }
4000
4001 // Create XHR
4002 var xhr = new XMLHttpRequest();
4003
4004 // Save Request URL
4005 xhr.requestUrl = options.url;
4006 xhr.requestParameters = options;
4007
4008 // Before open callback
4009 proceedRequest = fireCallback('beforeOpen', xhr, options);
4010 if (proceedRequest === false) { return xhr; }
4011
4012 // Open XHR
4013 xhr.open(method, options.url, options.async, options.user, options.password);
4014
4015 // Create POST Data
4016 var postData = null;
4017
4018 if ((method === 'POST' || method === 'PUT' || method === 'PATCH') && options.data) {
4019 if (options.processData) {
4020 var postDataInstances = [ArrayBuffer, Blob, Document, FormData];
4021 // Post Data
4022 if (postDataInstances.indexOf(options.data.constructor) >= 0) {
4023 postData = options.data;
4024 } else {
4025 // POST Headers
4026 var boundary = "---------------------------" + (Date.now().toString(16));
4027
4028 if (options.contentType === 'multipart/form-data') {
4029 xhr.setRequestHeader('Content-Type', ("multipart/form-data; boundary=" + boundary));
4030 } else {
4031 xhr.setRequestHeader('Content-Type', options.contentType);
4032 }
4033 postData = '';
4034 var data$1 = Utils.serializeObject(options.data);
4035 if (options.contentType === 'multipart/form-data') {
4036 data$1 = data$1.split('&');
4037 var newData = [];
4038 for (var i = 0; i < data$1.length; i += 1) {
4039 newData.push(("Content-Disposition: form-data; name=\"" + (data$1[i].split('=')[0]) + "\"\r\n\r\n" + (data$1[i].split('=')[1]) + "\r\n"));
4040 }
4041 postData = "--" + boundary + "\r\n" + (newData.join(("--" + boundary + "\r\n"))) + "--" + boundary + "--\r\n";
4042 } else if (options.contentType === 'application/json') {
4043 postData = JSON.stringify(options.data);
4044 } else {
4045 postData = data$1;
4046 }
4047 }
4048 } else {
4049 postData = options.data;
4050 xhr.setRequestHeader('Content-Type', options.contentType);
4051 }
4052 }
4053
4054 // Additional headers
4055 if (options.headers) {
4056 Object.keys(options.headers).forEach(function (headerName) {
4057 xhr.setRequestHeader(headerName, options.headers[headerName]);
4058 });
4059 }
4060
4061 // Check for crossDomain
4062 if (typeof options.crossDomain === 'undefined') {
4063 // eslint-disable-next-line
4064 options.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(options.url) && RegExp.$2 !== win.location.host;
4065 }
4066
4067 if (!options.crossDomain) {
4068 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
4069 }
4070
4071 if (options.xhrFields) {
4072 Utils.extend(xhr, options.xhrFields);
4073 }
4074
4075 var xhrTimeout;
4076
4077 // Handle XHR
4078 xhr.onload = function onload() {
4079 if (xhrTimeout) { clearTimeout(xhrTimeout); }
4080 if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) {
4081 var responseData;
4082 if (options.dataType === 'json') {
4083 var parseError;
4084 try {
4085 responseData = JSON.parse(xhr.responseText);
4086 } catch (err) {
4087 parseError = true;
4088 }
4089 if (!parseError) {
4090 fireCallback('success', responseData, xhr.status, xhr);
4091 } else {
4092 fireCallback('error', xhr, 'parseerror');
4093 }
4094 } else {
4095 responseData = xhr.responseType === 'text' || xhr.responseType === '' ? xhr.responseText : xhr.response;
4096 fireCallback('success', responseData, xhr.status, xhr);
4097 }
4098 } else {
4099 fireCallback('error', xhr, xhr.status);
4100 }
4101 if (options.statusCode) {
4102 if (globals.statusCode && globals.statusCode[xhr.status]) { globals.statusCode[xhr.status](xhr); }
4103 if (options.statusCode[xhr.status]) { options.statusCode[xhr.status](xhr); }
4104 }
4105 fireCallback('complete', xhr, xhr.status);
4106 };
4107
4108 xhr.onerror = function onerror() {
4109 if (xhrTimeout) { clearTimeout(xhrTimeout); }
4110 fireCallback('error', xhr, xhr.status);
4111 fireCallback('complete', xhr, 'error');
4112 };
4113
4114 // Timeout
4115 if (options.timeout > 0) {
4116 xhr.onabort = function onabort() {
4117 if (xhrTimeout) { clearTimeout(xhrTimeout); }
4118 };
4119 xhrTimeout = setTimeout(function () {
4120 xhr.abort();
4121 fireCallback('error', xhr, 'timeout');
4122 fireCallback('complete', xhr, 'timeout');
4123 }, options.timeout);
4124 }
4125
4126 // Ajax start callback
4127 proceedRequest = fireCallback('beforeSend', xhr, options);
4128 if (proceedRequest === false) { return xhr; }
4129
4130 // Send XHR
4131 xhr.send(postData);
4132
4133 // Return XHR object
4134 return xhr;
4135 }
4136 function RequestShortcut(method) {
4137 var assign, assign$1;
4138
4139 var args = [], len = arguments.length - 1;
4140 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
4141 var ref = [];
4142 var url = ref[0];
4143 var data = ref[1];
4144 var success = ref[2];
4145 var error = ref[3];
4146 var dataType = ref[4];
4147 if (typeof args[1] === 'function') {
4148 (assign = args, url = assign[0], success = assign[1], error = assign[2], dataType = assign[3]);
4149 } else {
4150 (assign$1 = args, url = assign$1[0], data = assign$1[1], success = assign$1[2], error = assign$1[3], dataType = assign$1[4]);
4151 }
4152 [success, error].forEach(function (callback) {
4153 if (typeof callback === 'string') {
4154 dataType = callback;
4155 if (callback === success) { success = undefined; }
4156 else { error = undefined; }
4157 }
4158 });
4159 dataType = dataType || (method === 'json' || method === 'postJSON' ? 'json' : undefined);
4160 var requestOptions = {
4161 url: url,
4162 method: method === 'post' || method === 'postJSON' ? 'POST' : 'GET',
4163 data: data,
4164 success: success,
4165 error: error,
4166 dataType: dataType,
4167 };
4168 if (method === 'postJSON') {
4169 Utils.extend(requestOptions, {
4170 contentType: 'application/json',
4171 processData: false,
4172 crossDomain: true,
4173 data: typeof data === 'string' ? data : JSON.stringify(data),
4174 });
4175 }
4176 return Request(requestOptions);
4177 }
4178 function RequestShortcutPromise(method) {
4179 var args = [], len = arguments.length - 1;
4180 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
4181
4182 var url = args[0];
4183 var data = args[1];
4184 var dataType = args[2];
4185 return new Promise(function (resolve, reject) {
4186 RequestShortcut(
4187 method,
4188 url,
4189 data,
4190 function (response) {
4191 resolve(response);
4192 },
4193 function (xhr, status) {
4194 reject(status);
4195 },
4196 dataType
4197 );
4198 });
4199 }
4200 Object.assign(Request, {
4201 get: function () {
4202 var args = [], len = arguments.length;
4203 while ( len-- ) args[ len ] = arguments[ len ];
4204
4205 return RequestShortcut.apply(void 0, [ 'get' ].concat( args ));
4206 },
4207 post: function () {
4208 var args = [], len = arguments.length;
4209 while ( len-- ) args[ len ] = arguments[ len ];
4210
4211 return RequestShortcut.apply(void 0, [ 'post' ].concat( args ));
4212 },
4213 json: function () {
4214 var args = [], len = arguments.length;
4215 while ( len-- ) args[ len ] = arguments[ len ];
4216
4217 return RequestShortcut.apply(void 0, [ 'json' ].concat( args ));
4218 },
4219 getJSON: function () {
4220 var args = [], len = arguments.length;
4221 while ( len-- ) args[ len ] = arguments[ len ];
4222
4223 return RequestShortcut.apply(void 0, [ 'json' ].concat( args ));
4224 },
4225 postJSON: function () {
4226 var args = [], len = arguments.length;
4227 while ( len-- ) args[ len ] = arguments[ len ];
4228
4229 return RequestShortcut.apply(void 0, [ 'postJSON' ].concat( args ));
4230 },
4231 });
4232
4233 Request.promise = function requestPromise(requestOptions) {
4234 return new Promise(function (resolve, reject) {
4235 Request(Object.assign(requestOptions, {
4236 success: function success(data) {
4237 resolve(data);
4238 },
4239 error: function error(xhr, status) {
4240 reject(status);
4241 },
4242 }));
4243 });
4244 };
4245 Object.assign(Request.promise, {
4246 get: function () {
4247 var args = [], len = arguments.length;
4248 while ( len-- ) args[ len ] = arguments[ len ];
4249
4250 return RequestShortcutPromise.apply(void 0, [ 'get' ].concat( args ));
4251 },
4252 post: function () {
4253 var args = [], len = arguments.length;
4254 while ( len-- ) args[ len ] = arguments[ len ];
4255
4256 return RequestShortcutPromise.apply(void 0, [ 'post' ].concat( args ));
4257 },
4258 json: function () {
4259 var args = [], len = arguments.length;
4260 while ( len-- ) args[ len ] = arguments[ len ];
4261
4262 return RequestShortcutPromise.apply(void 0, [ 'json' ].concat( args ));
4263 },
4264 getJSON: function () {
4265 var args = [], len = arguments.length;
4266 while ( len-- ) args[ len ] = arguments[ len ];
4267
4268 return RequestShortcutPromise.apply(void 0, [ 'json' ].concat( args ));
4269 },
4270 postJSON: function () {
4271 var args = [], len = arguments.length;
4272 while ( len-- ) args[ len ] = arguments[ len ];
4273
4274 return RequestShortcutPromise.apply(void 0, [ 'postJSON' ].concat( args ));
4275 },
4276 });
4277
4278 Request.setup = function setup(options) {
4279 if (options.type && !options.method) {
4280 Utils.extend(options, { method: options.type });
4281 }
4282 Utils.extend(globals, options);
4283 };
4284
4285 /* eslint no-param-reassign: "off" */
4286
4287 var RequestModule = {
4288 name: 'request',
4289 proto: {
4290 request: Request,
4291 },
4292 static: {
4293 request: Request,
4294 },
4295 };
4296
4297 function initTouch() {
4298 var app = this;
4299 var params = app.params.touch;
4300 var useRipple = params[((app.theme) + "TouchRipple")];
4301
4302 if (Device.ios && Device.webView) {
4303 // Strange hack required for iOS 8 webview to work on inputs
4304 win.addEventListener('touchstart', function () {});
4305 }
4306
4307 var touchStartX;
4308 var touchStartY;
4309 var touchStartTime;
4310 var targetElement;
4311 var trackClick;
4312 var activeSelection;
4313 var scrollParent;
4314 var lastClickTime;
4315 var isMoved;
4316 var tapHoldFired;
4317 var tapHoldTimeout;
4318 var preventClick;
4319
4320 var activableElement;
4321 var activeTimeout;
4322
4323 var needsFastClick;
4324 var needsFastClickTimeOut;
4325
4326 var rippleWave;
4327 var rippleTarget;
4328 var rippleTimeout;
4329
4330 function findActivableElement(el) {
4331 var target = $(el);
4332 var parents = target.parents(params.activeStateElements);
4333 var activable;
4334 if (target.is(params.activeStateElements)) {
4335 activable = target;
4336 }
4337 if (parents.length > 0) {
4338 activable = activable ? activable.add(parents) : parents;
4339 }
4340 return activable || target;
4341 }
4342
4343 function isInsideScrollableViewLight(el) {
4344 var pageContent = el.parents('.page-content');
4345 return pageContent.length > 0;
4346 }
4347 function isInsideScrollableView(el) {
4348 var pageContent = el.parents('.page-content');
4349
4350 if (pageContent.length === 0) {
4351 return false;
4352 }
4353
4354 // This event handler covers the "tap to stop scrolling".
4355 if (pageContent.prop('scrollHandlerSet') !== 'yes') {
4356 pageContent.on('scroll', function () {
4357 clearTimeout(activeTimeout);
4358 clearTimeout(rippleTimeout);
4359 });
4360 pageContent.prop('scrollHandlerSet', 'yes');
4361 }
4362
4363 return true;
4364 }
4365 function addActive() {
4366 if (!activableElement) { return; }
4367 activableElement.addClass('active-state');
4368 }
4369 function removeActive() {
4370 if (!activableElement) { return; }
4371 activableElement.removeClass('active-state');
4372 activableElement = null;
4373 }
4374 function isFormElement(el) {
4375 var nodes = ('input select textarea label').split(' ');
4376 if (el.nodeName && nodes.indexOf(el.nodeName.toLowerCase()) >= 0) { return true; }
4377 return false;
4378 }
4379 function androidNeedsBlur(el) {
4380 var noBlur = ('button input textarea select').split(' ');
4381 if (doc.activeElement && el !== doc.activeElement && doc.activeElement !== doc.body) {
4382 if (noBlur.indexOf(el.nodeName.toLowerCase()) >= 0) {
4383 return false;
4384 }
4385 return true;
4386 }
4387 return false;
4388 }
4389 function targetNeedsFastClick(el) {
4390 /*
4391 if (
4392 Device.ios
4393 &&
4394 (
4395 Device.osVersion.split('.')[0] > 9
4396 ||
4397 (Device.osVersion.split('.')[0] * 1 === 9 && Device.osVersion.split('.')[1] >= 1)
4398 )
4399 ) {
4400 return false;
4401 }
4402 */
4403 var $el = $(el);
4404 if (el.nodeName.toLowerCase() === 'input' && (el.type === 'file' || el.type === 'range')) { return false; }
4405 if (el.nodeName.toLowerCase() === 'select' && Device.android) { return false; }
4406 if ($el.hasClass('no-fastclick') || $el.parents('.no-fastclick').length > 0) { return false; }
4407 if (params.fastClicksExclude && $el.closest(params.fastClicksExclude).length > 0) { return false; }
4408
4409 return true;
4410 }
4411 function targetNeedsFocus(el) {
4412 if (doc.activeElement === el) {
4413 return false;
4414 }
4415 var tag = el.nodeName.toLowerCase();
4416 var skipInputs = ('button checkbox file image radio submit').split(' ');
4417 if (el.disabled || el.readOnly) { return false; }
4418 if (tag === 'textarea') { return true; }
4419 if (tag === 'select') {
4420 if (Device.android) { return false; }
4421 return true;
4422 }
4423 if (tag === 'input' && skipInputs.indexOf(el.type) < 0) { return true; }
4424 return false;
4425 }
4426 function targetNeedsPrevent(el) {
4427 var $el = $(el);
4428 var prevent = true;
4429 if ($el.is('label') || $el.parents('label').length > 0) {
4430 if (Device.android) {
4431 prevent = false;
4432 } else if (Device.ios && $el.is('input')) {
4433 prevent = true;
4434 } else { prevent = false; }
4435 }
4436 return prevent;
4437 }
4438
4439 // Ripple handlers
4440 function findRippleElement(el) {
4441 var rippleElements = params.touchRippleElements;
4442 var $el = $(el);
4443 if ($el.is(rippleElements)) {
4444 if ($el.hasClass('no-ripple')) {
4445 return false;
4446 }
4447 return $el;
4448 }
4449 if ($el.parents(rippleElements).length > 0) {
4450 var rippleParent = $el.parents(rippleElements).eq(0);
4451 if (rippleParent.hasClass('no-ripple')) {
4452 return false;
4453 }
4454 return rippleParent;
4455 }
4456 return false;
4457 }
4458 function createRipple($el, x, y) {
4459 if (!$el) { return; }
4460 rippleWave = app.touchRipple.create($el, x, y);
4461 }
4462
4463 function removeRipple() {
4464 if (!rippleWave) { return; }
4465 rippleWave.remove();
4466 rippleWave = undefined;
4467 rippleTarget = undefined;
4468 }
4469 function rippleTouchStart(el) {
4470 rippleTarget = findRippleElement(el);
4471 if (!rippleTarget || rippleTarget.length === 0) {
4472 rippleTarget = undefined;
4473 return;
4474 }
4475 var inScrollable = params.fastClicks
4476 ? isInsideScrollableView(rippleTarget)
4477 : isInsideScrollableViewLight(rippleTarget);
4478
4479 if (!inScrollable) {
4480 createRipple(rippleTarget, touchStartX, touchStartY);
4481 } else {
4482 rippleTimeout = setTimeout(function () {
4483 createRipple(rippleTarget, touchStartX, touchStartY);
4484 }, 80);
4485 }
4486 }
4487 function rippleTouchMove() {
4488 clearTimeout(rippleTimeout);
4489 removeRipple();
4490 }
4491 function rippleTouchEnd() {
4492 if (rippleWave) {
4493 removeRipple();
4494 } else if (rippleTarget && !isMoved) {
4495 clearTimeout(rippleTimeout);
4496 createRipple(rippleTarget, touchStartX, touchStartY);
4497 setTimeout(removeRipple, 0);
4498 } else {
4499 removeRipple();
4500 }
4501 }
4502
4503 // Mouse Handlers
4504 function handleMouseDown(e) {
4505 findActivableElement(e.target).addClass('active-state');
4506 if ('which' in e && e.which === 3) {
4507 setTimeout(function () {
4508 $('.active-state').removeClass('active-state');
4509 }, 0);
4510 }
4511 if (useRipple) {
4512 touchStartX = e.pageX;
4513 touchStartY = e.pageY;
4514 rippleTouchStart(e.target, e.pageX, e.pageY);
4515 }
4516 }
4517 function handleMouseMove() {
4518 $('.active-state').removeClass('active-state');
4519 if (useRipple) {
4520 rippleTouchMove();
4521 }
4522 }
4523 function handleMouseUp() {
4524 $('.active-state').removeClass('active-state');
4525 if (useRipple) {
4526 rippleTouchEnd();
4527 }
4528 }
4529
4530 // Send Click
4531 function sendClick(e) {
4532 var touch = e.changedTouches[0];
4533 var evt = doc.createEvent('MouseEvents');
4534 var eventType = 'click';
4535 if (Device.android && targetElement.nodeName.toLowerCase() === 'select') {
4536 eventType = 'mousedown';
4537 }
4538 evt.initMouseEvent(eventType, true, true, win, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
4539 evt.forwardedTouchEvent = true;
4540
4541 if (app.device.ios && win.navigator.standalone) {
4542 // Fix the issue happens in iOS home screen apps where the wrong element is selected during a momentum scroll.
4543 // Upon tapping, we give the scrolling time to stop, then we grab the element based where the user tapped.
4544 setTimeout(function () {
4545 targetElement = doc.elementFromPoint(e.changedTouches[0].clientX, e.changedTouches[0].clientY);
4546 targetElement.dispatchEvent(evt);
4547 }, 10);
4548 } else {
4549 targetElement.dispatchEvent(evt);
4550 }
4551 }
4552
4553 // Touch Handlers
4554 function handleTouchStart(e) {
4555 var this$1 = this;
4556
4557 isMoved = false;
4558 tapHoldFired = false;
4559 if (e.targetTouches.length > 1) {
4560 if (activableElement) { removeActive(); }
4561 return true;
4562 }
4563 if (e.touches.length > 1 && activableElement) {
4564 removeActive();
4565 }
4566 if (params.tapHold) {
4567 if (tapHoldTimeout) { clearTimeout(tapHoldTimeout); }
4568 tapHoldTimeout = setTimeout(function () {
4569 if (e && e.touches && e.touches.length > 1) { return; }
4570 tapHoldFired = true;
4571 e.preventDefault();
4572 $(e.target).trigger('taphold');
4573 }, params.tapHoldDelay);
4574 }
4575 if (needsFastClickTimeOut) { clearTimeout(needsFastClickTimeOut); }
4576 needsFastClick = targetNeedsFastClick(e.target);
4577
4578 if (!needsFastClick) {
4579 trackClick = false;
4580 return true;
4581 }
4582 if (Device.ios || (Device.android && 'getSelection' in win)) {
4583 var selection = win.getSelection();
4584 if (
4585 selection.rangeCount
4586 && selection.focusNode !== doc.body
4587 && (!selection.isCollapsed || doc.activeElement === selection.focusNode)
4588 ) {
4589 activeSelection = true;
4590 return true;
4591 }
4592
4593 activeSelection = false;
4594 }
4595 if (Device.android) {
4596 if (androidNeedsBlur(e.target)) {
4597 doc.activeElement.blur();
4598 }
4599 }
4600
4601 trackClick = true;
4602 targetElement = e.target;
4603 touchStartTime = (new Date()).getTime();
4604 touchStartX = e.targetTouches[0].pageX;
4605 touchStartY = e.targetTouches[0].pageY;
4606
4607 // Detect scroll parent
4608 if (Device.ios) {
4609 scrollParent = undefined;
4610 $(targetElement).parents().each(function () {
4611 var parent = this$1;
4612 if (parent.scrollHeight > parent.offsetHeight && !scrollParent) {
4613 scrollParent = parent;
4614 scrollParent.f7ScrollTop = scrollParent.scrollTop;
4615 }
4616 });
4617 }
4618 if ((touchStartTime - lastClickTime) < params.fastClicksDelayBetweenClicks) {
4619 e.preventDefault();
4620 }
4621
4622 if (params.activeState) {
4623 activableElement = findActivableElement(targetElement);
4624 activeTimeout = setTimeout(addActive, 0);
4625 }
4626 if (useRipple) {
4627 rippleTouchStart(targetElement, touchStartX, touchStartY);
4628 }
4629 return true;
4630 }
4631 function handleTouchMove(e) {
4632 if (!trackClick) { return; }
4633 var distance = params.fastClicksDistanceThreshold;
4634 if (distance) {
4635 var pageX = e.targetTouches[0].pageX;
4636 var pageY = e.targetTouches[0].pageY;
4637 if (Math.abs(pageX - touchStartX) > distance || Math.abs(pageY - touchStartY) > distance) {
4638 isMoved = true;
4639 }
4640 } else {
4641 isMoved = true;
4642 }
4643 if (isMoved) {
4644 trackClick = false;
4645 targetElement = null;
4646 isMoved = true;
4647 if (params.tapHold) {
4648 clearTimeout(tapHoldTimeout);
4649 }
4650 if (params.activeState) {
4651 clearTimeout(activeTimeout);
4652 removeActive();
4653 }
4654 if (useRipple) {
4655 rippleTouchMove();
4656 }
4657 }
4658 }
4659 function handleTouchEnd(e) {
4660 clearTimeout(activeTimeout);
4661 clearTimeout(tapHoldTimeout);
4662
4663 var touchEndTime = (new Date()).getTime();
4664
4665 if (!trackClick) {
4666 if (!activeSelection && needsFastClick) {
4667 if (!(Device.android && !e.cancelable) && e.cancelable) {
4668 e.preventDefault();
4669 }
4670 }
4671 if (params.activeState) { removeActive(); }
4672 if (useRipple) {
4673 rippleTouchEnd();
4674 }
4675 return true;
4676 }
4677
4678 if (doc.activeElement === e.target) {
4679 if (params.activeState) { removeActive(); }
4680 if (useRipple) {
4681 rippleTouchEnd();
4682 }
4683 return true;
4684 }
4685
4686 if (!activeSelection) {
4687 e.preventDefault();
4688 }
4689
4690 if ((touchEndTime - lastClickTime) < params.fastClicksDelayBetweenClicks) {
4691 setTimeout(removeActive, 0);
4692 if (useRipple) {
4693 rippleTouchEnd();
4694 }
4695 return true;
4696 }
4697
4698 lastClickTime = touchEndTime;
4699
4700 trackClick = false;
4701
4702 if (Device.ios && scrollParent) {
4703 if (scrollParent.scrollTop !== scrollParent.f7ScrollTop) {
4704 return false;
4705 }
4706 }
4707
4708 // Add active-state here because, in a very fast tap, the timeout didn't
4709 // have the chance to execute. Removing active-state in a timeout gives
4710 // the chance to the animation execute.
4711 if (params.activeState) {
4712 addActive();
4713 setTimeout(removeActive, 0);
4714 }
4715 // Remove Ripple
4716 if (useRipple) {
4717 rippleTouchEnd();
4718 }
4719
4720 // Trigger focus when required
4721 if (targetNeedsFocus(targetElement)) {
4722 if (Device.ios && Device.webView) {
4723 targetElement.focus();
4724 return false;
4725 }
4726
4727 targetElement.focus();
4728 }
4729
4730 // Blur active elements
4731 if (doc.activeElement && targetElement !== doc.activeElement && doc.activeElement !== doc.body && targetElement.nodeName.toLowerCase() !== 'label') {
4732 doc.activeElement.blur();
4733 }
4734
4735 // Send click
4736 e.preventDefault();
4737 if (params.tapHoldPreventClicks && tapHoldFired) {
4738 return false;
4739 }
4740 sendClick(e);
4741 return false;
4742 }
4743 function handleTouchCancel() {
4744 trackClick = false;
4745 targetElement = null;
4746
4747 // Remove Active State
4748 clearTimeout(activeTimeout);
4749 clearTimeout(tapHoldTimeout);
4750 if (params.activeState) {
4751 removeActive();
4752 }
4753
4754 // Remove Ripple
4755 if (useRipple) {
4756 rippleTouchEnd();
4757 }
4758 }
4759
4760 function handleClick(e) {
4761 var allowClick = false;
4762 if (trackClick) {
4763 targetElement = null;
4764 trackClick = false;
4765 return true;
4766 }
4767 if ((e.target.type === 'submit' && e.detail === 0) || e.target.type === 'file') {
4768 return true;
4769 }
4770 if (!targetElement) {
4771 if (!isFormElement(e.target)) {
4772 allowClick = true;
4773 }
4774 }
4775 if (!needsFastClick) {
4776 allowClick = true;
4777 }
4778 if (doc.activeElement === targetElement) {
4779 allowClick = true;
4780 }
4781 if (e.forwardedTouchEvent) {
4782 allowClick = true;
4783 }
4784 if (!e.cancelable) {
4785 allowClick = true;
4786 }
4787 if (params.tapHold && params.tapHoldPreventClicks && tapHoldFired) {
4788 allowClick = false;
4789 }
4790 if (!allowClick) {
4791 e.stopImmediatePropagation();
4792 e.stopPropagation();
4793 if (targetElement) {
4794 if (targetNeedsPrevent(targetElement) || isMoved) {
4795 e.preventDefault();
4796 }
4797 } else {
4798 e.preventDefault();
4799 }
4800 targetElement = null;
4801 }
4802 needsFastClickTimeOut = setTimeout(function () {
4803 needsFastClick = false;
4804 }, (Device.ios || Device.androidChrome ? 100 : 400));
4805
4806 if (params.tapHold) {
4807 tapHoldTimeout = setTimeout(function () {
4808 tapHoldFired = false;
4809 }, (Device.ios || Device.androidChrome ? 100 : 400));
4810 }
4811
4812 return allowClick;
4813 }
4814
4815 function handleTouchStartLight(e) {
4816 isMoved = false;
4817 tapHoldFired = false;
4818 preventClick = false;
4819 if (e.targetTouches.length > 1) {
4820 if (activableElement) { removeActive(); }
4821 return true;
4822 }
4823 if (e.touches.length > 1 && activableElement) {
4824 removeActive();
4825 }
4826 if (params.tapHold) {
4827 if (tapHoldTimeout) { clearTimeout(tapHoldTimeout); }
4828 tapHoldTimeout = setTimeout(function () {
4829 if (e && e.touches && e.touches.length > 1) { return; }
4830 tapHoldFired = true;
4831 e.preventDefault();
4832 preventClick = true;
4833 $(e.target).trigger('taphold');
4834 }, params.tapHoldDelay);
4835 }
4836 targetElement = e.target;
4837 touchStartX = e.targetTouches[0].pageX;
4838 touchStartY = e.targetTouches[0].pageY;
4839
4840 if (params.activeState) {
4841 activableElement = findActivableElement(targetElement);
4842 if (!isInsideScrollableViewLight(activableElement)) {
4843 addActive();
4844 } else {
4845 activeTimeout = setTimeout(addActive, 80);
4846 }
4847 }
4848 if (useRipple) {
4849 rippleTouchStart(targetElement, touchStartX, touchStartY);
4850 }
4851 return true;
4852 }
4853 function handleTouchMoveLight(e) {
4854 var distance = params.fastClicks ? params.fastClicksDistanceThreshold : 0;
4855 if (distance) {
4856 var pageX = e.targetTouches[0].pageX;
4857 var pageY = e.targetTouches[0].pageY;
4858 if (Math.abs(pageX - touchStartX) > distance || Math.abs(pageY - touchStartY) > distance) {
4859 isMoved = true;
4860 }
4861 } else {
4862 isMoved = true;
4863 }
4864 if (isMoved) {
4865 preventClick = true;
4866 if (params.tapHold) {
4867 clearTimeout(tapHoldTimeout);
4868 }
4869 if (params.activeState) {
4870 clearTimeout(activeTimeout);
4871 removeActive();
4872 }
4873 if (useRipple) {
4874 rippleTouchMove();
4875 }
4876 }
4877 }
4878 function handleTouchEndLight(e) {
4879 clearTimeout(activeTimeout);
4880 clearTimeout(tapHoldTimeout);
4881 if (doc.activeElement === e.target) {
4882 if (params.activeState) { removeActive(); }
4883 if (useRipple) {
4884 rippleTouchEnd();
4885 }
4886 return true;
4887 }
4888 if (params.activeState) {
4889 addActive();
4890 setTimeout(removeActive, 0);
4891 }
4892 if (useRipple) {
4893 rippleTouchEnd();
4894 }
4895 if ((params.tapHoldPreventClicks && tapHoldFired) || preventClick) {
4896 if (e.cancelable) { e.preventDefault(); }
4897 preventClick = true;
4898 return false;
4899 }
4900 return true;
4901 }
4902 function handleClickLight(e) {
4903 var localPreventClick = preventClick;
4904 if (targetElement && e.target !== targetElement) {
4905 localPreventClick = true;
4906 }
4907 if (params.tapHold && params.tapHoldPreventClicks && tapHoldFired) {
4908 localPreventClick = true;
4909 }
4910 if (localPreventClick) {
4911 e.stopImmediatePropagation();
4912 e.stopPropagation();
4913 e.preventDefault();
4914 }
4915
4916 if (params.tapHold) {
4917 tapHoldTimeout = setTimeout(
4918 function () {
4919 tapHoldFired = false;
4920 },
4921 (Device.ios || Device.androidChrome ? 100 : 400)
4922 );
4923 }
4924 preventClick = false;
4925 targetElement = null;
4926
4927 return !localPreventClick;
4928 }
4929
4930 function emitAppTouchEvent(name, e) {
4931 app.emit({
4932 events: name,
4933 data: [e],
4934 });
4935 }
4936 function appClick(e) {
4937 emitAppTouchEvent('click', e);
4938 }
4939 function appTouchStartActive(e) {
4940 emitAppTouchEvent('touchstart touchstart:active', e);
4941 }
4942 function appTouchMoveActive(e) {
4943 emitAppTouchEvent('touchmove touchmove:active', e);
4944 }
4945 function appTouchEndActive(e) {
4946 emitAppTouchEvent('touchend touchend:active', e);
4947 }
4948 function appTouchStartPassive(e) {
4949 emitAppTouchEvent('touchstart:passive', e);
4950 }
4951 function appTouchMovePassive(e) {
4952 emitAppTouchEvent('touchmove:passive', e);
4953 }
4954 function appTouchEndPassive(e) {
4955 emitAppTouchEvent('touchend:passive', e);
4956 }
4957
4958 var passiveListener = Support.passiveListener ? { passive: true } : false;
4959 var activeListener = Support.passiveListener ? { passive: false } : false;
4960
4961 doc.addEventListener('click', appClick, true);
4962
4963 if (Support.passiveListener) {
4964 doc.addEventListener(app.touchEvents.start, appTouchStartActive, activeListener);
4965 doc.addEventListener(app.touchEvents.move, appTouchMoveActive, activeListener);
4966 doc.addEventListener(app.touchEvents.end, appTouchEndActive, activeListener);
4967
4968 doc.addEventListener(app.touchEvents.start, appTouchStartPassive, passiveListener);
4969 doc.addEventListener(app.touchEvents.move, appTouchMovePassive, passiveListener);
4970 doc.addEventListener(app.touchEvents.end, appTouchEndPassive, passiveListener);
4971 } else {
4972 doc.addEventListener(app.touchEvents.start, function (e) {
4973 appTouchStartActive(e);
4974 appTouchStartPassive(e);
4975 }, false);
4976 doc.addEventListener(app.touchEvents.move, function (e) {
4977 appTouchMoveActive(e);
4978 appTouchMovePassive(e);
4979 }, false);
4980 doc.addEventListener(app.touchEvents.end, function (e) {
4981 appTouchEndActive(e);
4982 appTouchEndPassive(e);
4983 }, false);
4984 }
4985
4986 if (Support.touch) {
4987 if (params.fastClicks) {
4988 app.on('click', handleClick);
4989 app.on('touchstart', handleTouchStart);
4990 app.on('touchmove', handleTouchMove);
4991 app.on('touchend', handleTouchEnd);
4992 } else {
4993 app.on('click', handleClickLight);
4994 app.on('touchstart', handleTouchStartLight);
4995 app.on('touchmove', handleTouchMoveLight);
4996 app.on('touchend', handleTouchEndLight);
4997 }
4998
4999 doc.addEventListener('touchcancel', handleTouchCancel, { passive: true });
5000 } else if (params.activeState) {
5001 app.on('touchstart', handleMouseDown);
5002 app.on('touchmove', handleMouseMove);
5003 app.on('touchend', handleMouseUp);
5004 }
5005 doc.addEventListener('contextmenu', function (e) {
5006 if (params.disableContextMenu && (Device.ios || Device.android || Device.cordova)) {
5007 e.preventDefault();
5008 }
5009 if (useRipple) {
5010 if (activableElement) { removeActive(); }
5011 rippleTouchEnd();
5012 }
5013 });
5014 }
5015
5016 var TouchModule = {
5017 name: 'touch',
5018 params: {
5019 touch: {
5020 // Fast clicks
5021 fastClicks: false,
5022 fastClicksDistanceThreshold: 10,
5023 fastClicksDelayBetweenClicks: 50,
5024 fastClicksExclude: '', // CSS selector
5025 // ContextMenu
5026 disableContextMenu: false,
5027 // Tap Hold
5028 tapHold: false,
5029 tapHoldDelay: 750,
5030 tapHoldPreventClicks: true,
5031 // Active State
5032 activeState: true,
5033 activeStateElements: 'a, button, label, span, .actions-button, .stepper-button, .stepper-button-plus, .stepper-button-minus, .card-expandable, .menu-item',
5034 mdTouchRipple: true,
5035 iosTouchRipple: false,
5036 touchRippleElements: '.ripple, .link, .item-link, .list-button, .links-list a, .button, button, .input-clear-button, .dialog-button, .tab-link, .item-radio, .item-checkbox, .actions-button, .searchbar-disable-button, .fab a, .checkbox, .radio, .data-table .sortable-cell:not(.input-cell), .notification-close-button, .stepper-button, .stepper-button-minus, .stepper-button-plus, .menu-item-content',
5037 },
5038 },
5039 instance: {
5040 touchEvents: {
5041 start: Support.touch ? 'touchstart' : 'mousedown',
5042 move: Support.touch ? 'touchmove' : 'mousemove',
5043 end: Support.touch ? 'touchend' : 'mouseup',
5044 },
5045 },
5046 on: {
5047 init: initTouch,
5048 },
5049 };
5050
5051 /**
5052 * Expose `pathToRegexp`.
5053 */
5054 var pathToRegexp_1 = pathToRegexp;
5055 var parse_1 = parse;
5056 var compile_1 = compile;
5057 var tokensToFunction_1 = tokensToFunction;
5058 var tokensToRegExp_1 = tokensToRegExp;
5059
5060 /**
5061 * Default configs.
5062 */
5063 var DEFAULT_DELIMITER = '/';
5064
5065 /**
5066 * The main path matching regexp utility.
5067 *
5068 * @type {RegExp}
5069 */
5070 var PATH_REGEXP = new RegExp([
5071 // Match escaped characters that would otherwise appear in future matches.
5072 // This allows the user to escape special characters that won't transform.
5073 '(\\\\.)',
5074 // Match Express-style parameters and un-named parameters with a prefix
5075 // and optional suffixes. Matches appear as:
5076 //
5077 // ":test(\\d+)?" => ["test", "\d+", undefined, "?"]
5078 // "(\\d+)" => [undefined, undefined, "\d+", undefined]
5079 '(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?'
5080 ].join('|'), 'g');
5081
5082 /**
5083 * Parse a string for the raw tokens.
5084 *
5085 * @param {string} str
5086 * @param {Object=} options
5087 * @return {!Array}
5088 */
5089 function parse (str, options) {
5090 var tokens = [];
5091 var key = 0;
5092 var index = 0;
5093 var path = '';
5094 var defaultDelimiter = (options && options.delimiter) || DEFAULT_DELIMITER;
5095 var whitelist = (options && options.whitelist) || undefined;
5096 var pathEscaped = false;
5097 var res;
5098
5099 while ((res = PATH_REGEXP.exec(str)) !== null) {
5100 var m = res[0];
5101 var escaped = res[1];
5102 var offset = res.index;
5103 path += str.slice(index, offset);
5104 index = offset + m.length;
5105
5106 // Ignore already escaped sequences.
5107 if (escaped) {
5108 path += escaped[1];
5109 pathEscaped = true;
5110 continue
5111 }
5112
5113 var prev = '';
5114 var name = res[2];
5115 var capture = res[3];
5116 var group = res[4];
5117 var modifier = res[5];
5118
5119 if (!pathEscaped && path.length) {
5120 var k = path.length - 1;
5121 var c = path[k];
5122 var matches = whitelist ? whitelist.indexOf(c) > -1 : true;
5123
5124 if (matches) {
5125 prev = c;
5126 path = path.slice(0, k);
5127 }
5128 }
5129
5130 // Push the current path onto the tokens.
5131 if (path) {
5132 tokens.push(path);
5133 path = '';
5134 pathEscaped = false;
5135 }
5136
5137 var repeat = modifier === '+' || modifier === '*';
5138 var optional = modifier === '?' || modifier === '*';
5139 var pattern = capture || group;
5140 var delimiter = prev || defaultDelimiter;
5141
5142 tokens.push({
5143 name: name || key++,
5144 prefix: prev,
5145 delimiter: delimiter,
5146 optional: optional,
5147 repeat: repeat,
5148 pattern: pattern
5149 ? escapeGroup(pattern)
5150 : '[^' + escapeString(delimiter === defaultDelimiter ? delimiter : (delimiter + defaultDelimiter)) + ']+?'
5151 });
5152 }
5153
5154 // Push any remaining characters.
5155 if (path || index < str.length) {
5156 tokens.push(path + str.substr(index));
5157 }
5158
5159 return tokens
5160 }
5161
5162 /**
5163 * Compile a string to a template function for the path.
5164 *
5165 * @param {string} str
5166 * @param {Object=} options
5167 * @return {!function(Object=, Object=)}
5168 */
5169 function compile (str, options) {
5170 return tokensToFunction(parse(str, options))
5171 }
5172
5173 /**
5174 * Expose a method for transforming tokens into the path function.
5175 */
5176 function tokensToFunction (tokens) {
5177 // Compile all the tokens into regexps.
5178 var matches = new Array(tokens.length);
5179
5180 // Compile all the patterns before compilation.
5181 for (var i = 0; i < tokens.length; i++) {
5182 if (typeof tokens[i] === 'object') {
5183 matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$');
5184 }
5185 }
5186
5187 return function (data, options) {
5188 var path = '';
5189 var encode = (options && options.encode) || encodeURIComponent;
5190
5191 for (var i = 0; i < tokens.length; i++) {
5192 var token = tokens[i];
5193
5194 if (typeof token === 'string') {
5195 path += token;
5196 continue
5197 }
5198
5199 var value = data ? data[token.name] : undefined;
5200 var segment;
5201
5202 if (Array.isArray(value)) {
5203 if (!token.repeat) {
5204 throw new TypeError('Expected "' + token.name + '" to not repeat, but got array')
5205 }
5206
5207 if (value.length === 0) {
5208 if (token.optional) { continue }
5209
5210 throw new TypeError('Expected "' + token.name + '" to not be empty')
5211 }
5212
5213 for (var j = 0; j < value.length; j++) {
5214 segment = encode(value[j], token);
5215
5216 if (!matches[i].test(segment)) {
5217 throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '"')
5218 }
5219
5220 path += (j === 0 ? token.prefix : token.delimiter) + segment;
5221 }
5222
5223 continue
5224 }
5225
5226 if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
5227 segment = encode(String(value), token);
5228
5229 if (!matches[i].test(segment)) {
5230 throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but got "' + segment + '"')
5231 }
5232
5233 path += token.prefix + segment;
5234 continue
5235 }
5236
5237 if (token.optional) { continue }
5238
5239 throw new TypeError('Expected "' + token.name + '" to be ' + (token.repeat ? 'an array' : 'a string'))
5240 }
5241
5242 return path
5243 }
5244 }
5245
5246 /**
5247 * Escape a regular expression string.
5248 *
5249 * @param {string} str
5250 * @return {string}
5251 */
5252 function escapeString (str) {
5253 return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1')
5254 }
5255
5256 /**
5257 * Escape the capturing group by escaping special characters and meaning.
5258 *
5259 * @param {string} group
5260 * @return {string}
5261 */
5262 function escapeGroup (group) {
5263 return group.replace(/([=!:$/()])/g, '\\$1')
5264 }
5265
5266 /**
5267 * Get the flags for a regexp from the options.
5268 *
5269 * @param {Object} options
5270 * @return {string}
5271 */
5272 function flags (options) {
5273 return options && options.sensitive ? '' : 'i'
5274 }
5275
5276 /**
5277 * Pull out keys from a regexp.
5278 *
5279 * @param {!RegExp} path
5280 * @param {Array=} keys
5281 * @return {!RegExp}
5282 */
5283 function regexpToRegexp (path, keys) {
5284 if (!keys) { return path }
5285
5286 // Use a negative lookahead to match only capturing groups.
5287 var groups = path.source.match(/\((?!\?)/g);
5288
5289 if (groups) {
5290 for (var i = 0; i < groups.length; i++) {
5291 keys.push({
5292 name: i,
5293 prefix: null,
5294 delimiter: null,
5295 optional: false,
5296 repeat: false,
5297 pattern: null
5298 });
5299 }
5300 }
5301
5302 return path
5303 }
5304
5305 /**
5306 * Transform an array into a regexp.
5307 *
5308 * @param {!Array} path
5309 * @param {Array=} keys
5310 * @param {Object=} options
5311 * @return {!RegExp}
5312 */
5313 function arrayToRegexp (path, keys, options) {
5314 var parts = [];
5315
5316 for (var i = 0; i < path.length; i++) {
5317 parts.push(pathToRegexp(path[i], keys, options).source);
5318 }
5319
5320 return new RegExp('(?:' + parts.join('|') + ')', flags(options))
5321 }
5322
5323 /**
5324 * Create a path regexp from string input.
5325 *
5326 * @param {string} path
5327 * @param {Array=} keys
5328 * @param {Object=} options
5329 * @return {!RegExp}
5330 */
5331 function stringToRegexp (path, keys, options) {
5332 return tokensToRegExp(parse(path, options), keys, options)
5333 }
5334
5335 /**
5336 * Expose a function for taking tokens and returning a RegExp.
5337 *
5338 * @param {!Array} tokens
5339 * @param {Array=} keys
5340 * @param {Object=} options
5341 * @return {!RegExp}
5342 */
5343 function tokensToRegExp (tokens, keys, options) {
5344 options = options || {};
5345
5346 var strict = options.strict;
5347 var start = options.start !== false;
5348 var end = options.end !== false;
5349 var delimiter = options.delimiter || DEFAULT_DELIMITER;
5350 var endsWith = [].concat(options.endsWith || []).map(escapeString).concat('$').join('|');
5351 var route = start ? '^' : '';
5352
5353 // Iterate over the tokens and create our regexp string.
5354 for (var i = 0; i < tokens.length; i++) {
5355 var token = tokens[i];
5356
5357 if (typeof token === 'string') {
5358 route += escapeString(token);
5359 } else {
5360 var capture = token.repeat
5361 ? '(?:' + token.pattern + ')(?:' + escapeString(token.delimiter) + '(?:' + token.pattern + '))*'
5362 : token.pattern;
5363
5364 if (keys) { keys.push(token); }
5365
5366 if (token.optional) {
5367 if (!token.prefix) {
5368 route += '(' + capture + ')?';
5369 } else {
5370 route += '(?:' + escapeString(token.prefix) + '(' + capture + '))?';
5371 }
5372 } else {
5373 route += escapeString(token.prefix) + '(' + capture + ')';
5374 }
5375 }
5376 }
5377
5378 if (end) {
5379 if (!strict) { route += '(?:' + escapeString(delimiter) + ')?'; }
5380
5381 route += endsWith === '$' ? '$' : '(?=' + endsWith + ')';
5382 } else {
5383 var endToken = tokens[tokens.length - 1];
5384 var isEndDelimited = typeof endToken === 'string'
5385 ? endToken[endToken.length - 1] === delimiter
5386 : endToken === undefined;
5387
5388 if (!strict) { route += '(?:' + escapeString(delimiter) + '(?=' + endsWith + '))?'; }
5389 if (!isEndDelimited) { route += '(?=' + escapeString(delimiter) + '|' + endsWith + ')'; }
5390 }
5391
5392 return new RegExp(route, flags(options))
5393 }
5394
5395 /**
5396 * Normalize the given path string, returning a regular expression.
5397 *
5398 * An empty array can be passed in for the keys, which will hold the
5399 * placeholder key descriptions. For example, using `/user/:id`, `keys` will
5400 * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
5401 *
5402 * @param {(string|RegExp|Array)} path
5403 * @param {Array=} keys
5404 * @param {Object=} options
5405 * @return {!RegExp}
5406 */
5407 function pathToRegexp (path, keys, options) {
5408 if (path instanceof RegExp) {
5409 return regexpToRegexp(path, keys)
5410 }
5411
5412 if (Array.isArray(path)) {
5413 return arrayToRegexp(/** @type {!Array} */ (path), keys, options)
5414 }
5415
5416 return stringToRegexp(/** @type {string} */ (path), keys, options)
5417 }
5418 pathToRegexp_1.parse = parse_1;
5419 pathToRegexp_1.compile = compile_1;
5420 pathToRegexp_1.tokensToFunction = tokensToFunction_1;
5421 pathToRegexp_1.tokensToRegExp = tokensToRegExp_1;
5422
5423 var History = {
5424 queue: [],
5425 clearQueue: function clearQueue() {
5426 if (History.queue.length === 0) { return; }
5427 var currentQueue = History.queue.shift();
5428 currentQueue();
5429 },
5430 routerQueue: [],
5431 clearRouterQueue: function clearRouterQueue() {
5432 if (History.routerQueue.length === 0) { return; }
5433 var currentQueue = History.routerQueue.pop();
5434 var router = currentQueue.router;
5435 var stateUrl = currentQueue.stateUrl;
5436 var action = currentQueue.action;
5437
5438 var animate = router.params.animate;
5439 if (router.params.pushStateAnimate === false) { animate = false; }
5440
5441 if (action === 'back') {
5442 router.back({ animate: animate, pushState: false });
5443 }
5444 if (action === 'load') {
5445 router.navigate(stateUrl, { animate: animate, pushState: false });
5446 }
5447 },
5448 handle: function handle(e) {
5449 if (History.blockPopstate) { return; }
5450 var app = this;
5451 // const mainView = app.views.main;
5452 var state = e.state;
5453 History.previousState = History.state;
5454 History.state = state;
5455
5456 History.allowChange = true;
5457 History.clearQueue();
5458
5459 state = History.state;
5460 if (!state) { state = {}; }
5461
5462 app.views.forEach(function (view) {
5463 var router = view.router;
5464 var viewState = state[view.id];
5465 if (!viewState && view.params.pushState) {
5466 viewState = {
5467 url: view.router.history[0],
5468 };
5469 }
5470 if (!viewState) { return; }
5471 var stateUrl = viewState.url || undefined;
5472
5473 var animate = router.params.animate;
5474 if (router.params.pushStateAnimate === false) { animate = false; }
5475
5476 if (stateUrl !== router.url) {
5477 if (router.history.indexOf(stateUrl) >= 0) {
5478 // Go Back
5479 if (router.allowPageChange) {
5480 router.back({ animate: animate, pushState: false });
5481 } else {
5482 History.routerQueue.push({
5483 action: 'back',
5484 router: router,
5485 });
5486 }
5487 } else if (router.allowPageChange) {
5488 // Load page
5489 router.navigate(stateUrl, { animate: animate, pushState: false });
5490 } else {
5491 History.routerQueue.unshift({
5492 action: 'load',
5493 stateUrl: stateUrl,
5494 router: router,
5495 });
5496 }
5497 }
5498 });
5499 },
5500 initViewState: function initViewState(viewId, viewState) {
5501 var obj;
5502
5503 var newState = Utils.extend({}, (History.state || {}), ( obj = {}, obj[viewId] = viewState, obj ));
5504 History.state = newState;
5505 win.history.replaceState(newState, '');
5506 },
5507 push: function push(viewId, viewState, url) {
5508 var obj;
5509
5510 if (!History.allowChange) {
5511 History.queue.push(function () {
5512 History.push(viewId, viewState, url);
5513 });
5514 return;
5515 }
5516 History.previousState = History.state;
5517 var newState = Utils.extend({}, (History.previousState || {}), ( obj = {}, obj[viewId] = viewState, obj ));
5518 History.state = newState;
5519 win.history.pushState(newState, '', url);
5520 },
5521 replace: function replace(viewId, viewState, url) {
5522 var obj;
5523
5524 if (!History.allowChange) {
5525 History.queue.push(function () {
5526 History.replace(viewId, viewState, url);
5527 });
5528 return;
5529 }
5530 History.previousState = History.state;
5531 var newState = Utils.extend({}, (History.previousState || {}), ( obj = {}, obj[viewId] = viewState, obj ));
5532 History.state = newState;
5533 win.history.replaceState(newState, '', url);
5534 },
5535 go: function go(index) {
5536 History.allowChange = false;
5537 win.history.go(index);
5538 },
5539 back: function back() {
5540 History.allowChange = false;
5541 win.history.back();
5542 },
5543 allowChange: true,
5544 previousState: {},
5545 state: win.history.state,
5546 blockPopstate: true,
5547 init: function init(app) {
5548 $(win).on('load', function () {
5549 setTimeout(function () {
5550 History.blockPopstate = false;
5551 }, 0);
5552 });
5553
5554 if (doc.readyState && doc.readyState === 'complete') {
5555 History.blockPopstate = false;
5556 }
5557
5558 $(win).on('popstate', History.handle.bind(app));
5559 },
5560 };
5561
5562 function SwipeBack(r) {
5563 var router = r;
5564 var $el = router.$el;
5565 var $navbarEl = router.$navbarEl;
5566 var app = router.app;
5567 var params = router.params;
5568 var isTouched = false;
5569 var isMoved = false;
5570 var touchesStart = {};
5571 var isScrolling;
5572 var currentPage = [];
5573 var previousPage = [];
5574 var viewContainerWidth;
5575 var touchesDiff;
5576 var allowViewTouchMove = true;
5577 var touchStartTime;
5578 var $currentNavbarInner = [];
5579 var $previousNavbarInner = [];
5580 var dynamicNavbar;
5581 var separateNavbar;
5582 var pageShadow;
5583 var pageOpacity;
5584
5585 var animatableNavEls;
5586
5587 var paramsSwipeBackAnimateShadow = params[((app.theme) + "SwipeBackAnimateShadow")];
5588 var paramsSwipeBackAnimateOpacity = params[((app.theme) + "SwipeBackAnimateOpacity")];
5589 var paramsSwipeBackActiveArea = params[((app.theme) + "SwipeBackActiveArea")];
5590 var paramsSwipeBackThreshold = params[((app.theme) + "SwipeBackThreshold")];
5591
5592 var transformOrigin = app.rtl ? 'right center' : 'left center';
5593
5594 function animatableNavElements() {
5595 var els = [];
5596 var inverter = app.rtl ? -1 : 1;
5597 var currentNavIsLarge = $currentNavbarInner.hasClass('navbar-inner-large');
5598 var previousNavIsLarge = $previousNavbarInner.hasClass('navbar-inner-large');
5599 var fromLarge = currentNavIsLarge && !$currentNavbarInner.hasClass('navbar-inner-large-collapsed');
5600 var toLarge = previousNavIsLarge && !$previousNavbarInner.hasClass('navbar-inner-large-collapsed');
5601 var $currentNavElements = $currentNavbarInner.children('.left, .title, .right, .subnavbar, .fading, .title-large');
5602 var $previousNavElements = $previousNavbarInner.children('.left, .title, .right, .subnavbar, .fading, .title-large');
5603 var activeNavBackIconText;
5604 var previousNavBackIconText;
5605
5606 if (params.iosAnimateNavbarBackIcon) {
5607 if ($currentNavbarInner.hasClass('sliding')) {
5608 activeNavBackIconText = $currentNavbarInner.children('.left').find('.back .icon + span').eq(0);
5609 } else {
5610 activeNavBackIconText = $currentNavbarInner.children('.left.sliding').find('.back .icon + span').eq(0);
5611 }
5612 if ($previousNavbarInner.hasClass('sliding')) {
5613 previousNavBackIconText = $previousNavbarInner.children('.left').find('.back .icon + span').eq(0);
5614 } else {
5615 previousNavBackIconText = $previousNavbarInner.children('.left.sliding').find('.back .icon + span').eq(0);
5616 }
5617 if (activeNavBackIconText.length) {
5618 $previousNavElements.each(function (index, el) {
5619 if (!$(el).hasClass('title')) { return; }
5620 el.f7NavbarLeftOffset += activeNavBackIconText.prev('.icon')[0].offsetWidth;
5621 });
5622 }
5623 }
5624 $currentNavElements
5625 .each(function (index, navEl) {
5626 var $navEl = $(navEl);
5627 var isSubnavbar = $navEl.hasClass('subnavbar');
5628 var isLeft = $navEl.hasClass('left');
5629 var isTitle = $navEl.hasClass('title');
5630 if (!fromLarge && $navEl.hasClass('.title-large')) { return; }
5631 var el = {
5632 el: navEl,
5633 };
5634 if (fromLarge) {
5635 if (isTitle) { return; }
5636 if ($navEl.hasClass('title-large')) {
5637 if (!separateNavbar) { return; }
5638 if (toLarge) {
5639 if (els.indexOf(el) < 0) { els.push(el); }
5640 el.overflow = 'visible';
5641 el.transform = 'translateX(100%)';
5642 $navEl.find('.title-large-text, .title-large-inner').each(function (subIndex, subNavEl) {
5643 els.push({
5644 el: subNavEl,
5645 transform: function (progress) { return ("translateX(" + (-100 + progress * 100 * inverter) + "%)"); },
5646 });
5647 });
5648 } else {
5649 if (els.indexOf(el) < 0) { els.push(el); }
5650 el.overflow = 'hidden';
5651 el.transform = function (progress) { return ("translateY(calc(" + (-progress) + " * var(--f7-navbar-large-title-height)))"); };
5652 $navEl.find('.title-large-text, .title-large-inner').each(function (subIndex, subNavEl) {
5653 els.push({
5654 el: subNavEl,
5655 transform: function (progress) { return ("translateX(" + (progress * 100 * inverter) + "%) translateY(calc(" + progress + " * var(--f7-navbar-large-title-height)))"); },
5656 });
5657 });
5658 }
5659 return;
5660 }
5661 }
5662 if (toLarge) {
5663 if (!fromLarge) {
5664 if ($navEl.hasClass('title-large')) {
5665 if (!separateNavbar) { return; }
5666 if (els.indexOf(el) < 0) { els.push(el); }
5667 el.opacity = 0;
5668 }
5669 }
5670 if (isLeft && separateNavbar) {
5671 if (els.indexOf(el) < 0) { els.push(el); }
5672 el.opacity = function (progress) { return (1 - (Math.pow( progress, 0.33 ))); };
5673 $navEl.find('.back span').each(function (subIndex, subNavEl) {
5674 els.push({
5675 el: subNavEl,
5676 'transform-origin': transformOrigin,
5677 transform: function (progress) { return ("translateY(calc(var(--f7-navbar-height) * " + progress + ")) scale(" + (1 + (1 * progress)) + ")"); },
5678 });
5679 });
5680 return;
5681 }
5682 }
5683 if ($navEl.hasClass('title-large')) { return; }
5684 var isSliding = $navEl.hasClass('sliding') || $currentNavbarInner.hasClass('sliding');
5685 if (els.indexOf(el) < 0) { els.push(el); }
5686 if (!isSubnavbar || (isSubnavbar && !isSliding)) {
5687 el.opacity = function (progress) { return (1 - (Math.pow( progress, 0.33 ))); };
5688 }
5689 if (isSliding) {
5690 var transformTarget = el;
5691 if (isLeft && activeNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
5692 var textEl = { el: activeNavBackIconText[0] };
5693 transformTarget = textEl;
5694 els.push(textEl);
5695 }
5696 transformTarget.transform = function (progress) {
5697 var activeNavTranslate = progress * transformTarget.el.f7NavbarRightOffset;
5698 if (Device.pixelRatio === 1) { activeNavTranslate = Math.round(activeNavTranslate); }
5699 if (isSubnavbar && currentNavIsLarge && separateNavbar) {
5700 return ("translate3d(" + activeNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
5701 }
5702 return ("translate3d(" + activeNavTranslate + "px,0,0)");
5703 };
5704 }
5705 });
5706 $previousNavElements
5707 .each(function (index, navEl) {
5708 var $navEl = $(navEl);
5709 var isSubnavbar = $navEl.hasClass('subnavbar');
5710 var isLeft = $navEl.hasClass('left');
5711 var isTitle = $navEl.hasClass('title');
5712 var el = {
5713 el: navEl,
5714 };
5715 if (toLarge) {
5716 if (isTitle) { return; }
5717 if (els.indexOf(el) < 0) { els.push(el); }
5718
5719 if ($navEl.hasClass('title-large')) {
5720 if (!separateNavbar) { return; }
5721 if (fromLarge) {
5722 el.opacity = 1;
5723 el.overflow = 'visible';
5724 el.transform = 'translateY(0)';
5725 $navEl.find('.title-large-text').each(function (subIndex, subNavEl) {
5726 els.push({
5727 el: subNavEl,
5728 'transform-origin': transformOrigin,
5729 opacity: function (progress) { return (Math.pow( progress, 3 )); },
5730 transform: function (progress) { return ("translateY(calc(" + (-1 + progress * 1) + " * var(--f7-navbar-large-title-height))) scale(" + (0.5 + progress * 0.5) + ")"); },
5731 });
5732 });
5733 } else {
5734 el.transform = function (progress) { return ("translateY(calc(" + (progress - 1) + " * var(--f7-navbar-large-title-height)))"); };
5735 el.opacity = 1;
5736 el.overflow = 'hidden';
5737 $navEl.find('.title-large-text').each(function (subIndex, subNavEl) {
5738 els.push({
5739 el: subNavEl,
5740 'transform-origin': transformOrigin,
5741 opacity: function (progress) { return (Math.pow( progress, 3 )); },
5742 transform: function (progress) { return ("scale(" + (0.5 + progress * 0.5) + ")"); },
5743 });
5744 });
5745 }
5746 $navEl.find('.title-large-inner').each(function (subIndex, subNavEl) {
5747 els.push({
5748 el: subNavEl,
5749 'transform-origin': transformOrigin,
5750 opacity: function (progress) { return (Math.pow( progress, 3 )); },
5751 transform: function (progress) { return ("translateX(" + (-100 * (1 - progress) * inverter) + "%)"); },
5752 });
5753 });
5754 return;
5755 }
5756 }
5757 if ($navEl.hasClass('title-large')) { return; }
5758 var isSliding = $navEl.hasClass('sliding') || $previousNavbarInner.hasClass('sliding');
5759 if (els.indexOf(el) < 0) { els.push(el); }
5760 if (!isSubnavbar || (isSubnavbar && !isSliding)) {
5761 el.opacity = function (progress) { return (Math.pow( progress, 3 )); };
5762 }
5763 if (isSliding) {
5764 var transformTarget = el;
5765 if (isLeft && previousNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
5766 var textEl = { el: activeNavBackIconText[0] };
5767 transformTarget = textEl;
5768 els.push(textEl);
5769 }
5770 transformTarget.transform = function (progress) {
5771 var previousNavTranslate = transformTarget.el.f7NavbarLeftOffset * (1 - progress);
5772 if (Device.pixelRatio === 1) { previousNavTranslate = Math.round(previousNavTranslate); }
5773 if (isSubnavbar && previousNavIsLarge && separateNavbar) {
5774 return ("translate3d(" + previousNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
5775 }
5776 return ("translate3d(" + previousNavTranslate + "px,0,0)");
5777 };
5778 }
5779 });
5780 return els;
5781 }
5782
5783 function setAnimatableNavElements(ref) {
5784 if ( ref === void 0 ) ref = {};
5785 var progress = ref.progress;
5786 var reset = ref.reset;
5787 var transition = ref.transition;
5788
5789 var styles = ['overflow', 'transform', 'transform-origin', 'opacity'];
5790 for (var i = 0; i < animatableNavEls.length; i += 1) {
5791 var el = animatableNavEls[i];
5792 if (el && el.el) {
5793 if (transition === true) { el.el.classList.add('navbar-page-transitioning'); }
5794 if (transition === false) { el.el.classList.remove('navbar-page-transitioning'); }
5795 for (var j = 0; j < styles.length; j += 1) {
5796 var styleProp = styles[j];
5797 if (el[styleProp]) {
5798 if (reset) {
5799 el.el.style[styleProp] = '';
5800 } else if (typeof el[styleProp] === 'function') {
5801 el.el.style[styleProp] = el[styleProp](progress);
5802 } else {
5803 el.el.style[styleProp] = el[styleProp];
5804 }
5805 }
5806 }
5807 }
5808 }
5809 }
5810
5811 function handleTouchStart(e) {
5812 var swipeBackEnabled = params[((app.theme) + "SwipeBack")];
5813 if (!allowViewTouchMove || !swipeBackEnabled || isTouched || (app.swipeout && app.swipeout.el) || !router.allowPageChange) { return; }
5814 if ($(e.target).closest('.range-slider, .calendar-months').length > 0) { return; }
5815 if ($(e.target).closest('.page-master, .page-master-detail').length > 0 && params.masterDetailBreakpoint > 0 && app.width >= params.masterDetailBreakpoint) { return; }
5816 isMoved = false;
5817 isTouched = true;
5818 isScrolling = undefined;
5819 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
5820 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
5821 touchStartTime = Utils.now();
5822 dynamicNavbar = router.dynamicNavbar;
5823 separateNavbar = router.separateNavbar;
5824 }
5825 function handleTouchMove(e) {
5826 if (!isTouched) { return; }
5827 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
5828 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
5829 if (typeof isScrolling === 'undefined') {
5830 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x)) || (pageX < touchesStart.x && !app.rtl) || (pageX > touchesStart.x && app.rtl);
5831 }
5832 if (isScrolling || e.f7PreventSwipeBack || app.preventSwipeBack) {
5833 isTouched = false;
5834 return;
5835 }
5836 if (!isMoved) {
5837 // Calc values during first move fired
5838 var cancel = false;
5839 var target = $(e.target);
5840
5841 var swipeout = target.closest('.swipeout');
5842 if (swipeout.length > 0) {
5843 if (!app.rtl && swipeout.find('.swipeout-actions-left').length > 0) { cancel = true; }
5844 if (app.rtl && swipeout.find('.swipeout-actions-right').length > 0) { cancel = true; }
5845 }
5846
5847 currentPage = target.closest('.page');
5848 if (currentPage.hasClass('no-swipeback') || target.closest('.no-swipeback, .card-opened').length > 0) { cancel = true; }
5849 previousPage = $el.find('.page-previous:not(.stacked)');
5850
5851 var notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
5852 viewContainerWidth = $el.width();
5853 if (app.rtl) {
5854 notFromBorder = touchesStart.x < ($el.offset().left - $el[0].scrollLeft) + (viewContainerWidth - paramsSwipeBackActiveArea);
5855 } else {
5856 notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
5857 }
5858 if (notFromBorder) { cancel = true; }
5859 if (previousPage.length === 0 || currentPage.length === 0) { cancel = true; }
5860 if (cancel) {
5861 isTouched = false;
5862 return;
5863 }
5864
5865 if (paramsSwipeBackAnimateShadow) {
5866 pageShadow = currentPage.find('.page-shadow-effect');
5867 if (pageShadow.length === 0) {
5868 pageShadow = $('<div class="page-shadow-effect"></div>');
5869 currentPage.append(pageShadow);
5870 }
5871 }
5872 if (paramsSwipeBackAnimateOpacity) {
5873 pageOpacity = previousPage.find('.page-opacity-effect');
5874 if (pageOpacity.length === 0) {
5875 pageOpacity = $('<div class="page-opacity-effect"></div>');
5876 previousPage.append(pageOpacity);
5877 }
5878 }
5879
5880 if (dynamicNavbar) {
5881 if (separateNavbar) {
5882 $currentNavbarInner = $navbarEl.find('.navbar-current:not(.stacked)');
5883 $previousNavbarInner = $navbarEl.find('.navbar-previous:not(.stacked)');
5884 } else {
5885 $currentNavbarInner = currentPage.children('.navbar').children('.navbar-inner');
5886 $previousNavbarInner = previousPage.children('.navbar').children('.navbar-inner');
5887 }
5888
5889 animatableNavEls = animatableNavElements($previousNavbarInner, $currentNavbarInner);
5890 }
5891
5892 // Close/Hide Any Picker
5893 if ($('.sheet.modal-in').length > 0 && app.sheet) {
5894 app.sheet.close($('.sheet.modal-in'));
5895 }
5896 }
5897 e.f7PreventPanelSwipe = true;
5898 isMoved = true;
5899 app.preventSwipePanelBySwipeBack = true;
5900 e.preventDefault();
5901
5902 // RTL inverter
5903 var inverter = app.rtl ? -1 : 1;
5904
5905 // Touches diff
5906 touchesDiff = (pageX - touchesStart.x - paramsSwipeBackThreshold) * inverter;
5907 if (touchesDiff < 0) { touchesDiff = 0; }
5908 var percentage = Math.min(Math.max(touchesDiff / viewContainerWidth, 0), 1);
5909
5910 // Swipe Back Callback
5911 var callbackData = {
5912 percentage: percentage,
5913 progress: percentage,
5914 currentPageEl: currentPage[0],
5915 previousPageEl: previousPage[0],
5916 currentNavbarEl: $currentNavbarInner[0],
5917 previousNavbarEl: $previousNavbarInner[0],
5918 };
5919 $el.trigger('swipeback:move', callbackData);
5920 router.emit('swipebackMove', callbackData);
5921
5922 // Transform pages
5923 var currentPageTranslate = touchesDiff * inverter;
5924 var previousPageTranslate = ((touchesDiff / 5) - (viewContainerWidth / 5)) * inverter;
5925 if (!app.rtl) {
5926 currentPageTranslate = Math.min(currentPageTranslate, viewContainerWidth);
5927 previousPageTranslate = Math.min(previousPageTranslate, 0);
5928 } else {
5929 currentPageTranslate = Math.max(currentPageTranslate, -viewContainerWidth);
5930 previousPageTranslate = Math.max(previousPageTranslate, 0);
5931 }
5932 if (Device.pixelRatio === 1) {
5933 currentPageTranslate = Math.round(currentPageTranslate);
5934 previousPageTranslate = Math.round(previousPageTranslate);
5935 }
5936
5937 router.swipeBackActive = true;
5938 $([currentPage[0], previousPage[0]]).addClass('page-swipeback-active');
5939
5940 currentPage.transform(("translate3d(" + currentPageTranslate + "px,0,0)"));
5941 if (paramsSwipeBackAnimateShadow) { pageShadow[0].style.opacity = 1 - (1 * percentage); }
5942
5943 if (app.theme !== 'md') {
5944 previousPage.transform(("translate3d(" + previousPageTranslate + "px,0,0)"));
5945 }
5946 if (paramsSwipeBackAnimateOpacity) { pageOpacity[0].style.opacity = 1 - (1 * percentage); }
5947
5948 // Dynamic Navbars Animation
5949 if (!dynamicNavbar) { return; }
5950
5951 setAnimatableNavElements({ progress: percentage });
5952 }
5953 function handleTouchEnd() {
5954 app.preventSwipePanelBySwipeBack = false;
5955 if (!isTouched || !isMoved) {
5956 isTouched = false;
5957 isMoved = false;
5958 return;
5959 }
5960 isTouched = false;
5961 isMoved = false;
5962 router.swipeBackActive = false;
5963 $([currentPage[0], previousPage[0]]).removeClass('page-swipeback-active');
5964 if (touchesDiff === 0) {
5965 $([currentPage[0], previousPage[0]]).transform('');
5966 if (pageShadow && pageShadow.length > 0) { pageShadow.remove(); }
5967 if (pageOpacity && pageOpacity.length > 0) { pageOpacity.remove(); }
5968 if (dynamicNavbar) {
5969 setAnimatableNavElements({ reset: true });
5970 }
5971 return;
5972 }
5973 var timeDiff = Utils.now() - touchStartTime;
5974 var pageChanged = false;
5975 // Swipe back to previous page
5976 if (
5977 (timeDiff < 300 && touchesDiff > 10)
5978 || (timeDiff >= 300 && touchesDiff > viewContainerWidth / 2)
5979 ) {
5980 currentPage.removeClass('page-current').addClass(("page-next" + (app.theme === 'md' ? ' page-next-on-right' : '')));
5981 previousPage.removeClass('page-previous').addClass('page-current').removeAttr('aria-hidden');
5982 if (pageShadow) { pageShadow[0].style.opacity = ''; }
5983 if (pageOpacity) { pageOpacity[0].style.opacity = ''; }
5984 if (dynamicNavbar) {
5985 $currentNavbarInner.removeClass('navbar-current').addClass('navbar-next');
5986 $previousNavbarInner.removeClass('navbar-previous').addClass('navbar-current').removeAttr('aria-hidden');
5987 }
5988 pageChanged = true;
5989 }
5990 // Reset custom styles
5991 // Add transitioning class for transition-duration
5992 $([currentPage[0], previousPage[0]]).addClass('page-transitioning page-transitioning-swipeback').transform('');
5993
5994 if (dynamicNavbar) {
5995 setAnimatableNavElements({ progress: pageChanged ? 1 : 0, transition: true });
5996 }
5997 allowViewTouchMove = false;
5998 router.allowPageChange = false;
5999
6000 // Swipe Back Callback
6001 var callbackData = {
6002 currentPageEl: currentPage[0],
6003 previousPageEl: previousPage[0],
6004 currentNavbarEl: $currentNavbarInner[0],
6005 previousNavbarEl: $previousNavbarInner[0],
6006 };
6007
6008 if (pageChanged) {
6009 // Update Route
6010 router.currentRoute = previousPage[0].f7Page.route;
6011 router.currentPage = previousPage[0];
6012
6013 // Page before animation callback
6014 router.pageCallback('beforeOut', currentPage, $currentNavbarInner, 'current', 'next', { route: currentPage[0].f7Page.route, swipeBack: true });
6015 router.pageCallback('beforeIn', previousPage, $previousNavbarInner, 'previous', 'current', { route: previousPage[0].f7Page.route, swipeBack: true });
6016
6017 $el.trigger('swipeback:beforechange', callbackData);
6018 router.emit('swipebackBeforeChange', callbackData);
6019 } else {
6020 $el.trigger('swipeback:beforereset', callbackData);
6021 router.emit('swipebackBeforeReset', callbackData);
6022 }
6023
6024 currentPage.transitionEnd(function () {
6025 $([currentPage[0], previousPage[0]]).removeClass('page-transitioning page-transitioning-swipeback');
6026 if (dynamicNavbar) {
6027 setAnimatableNavElements({ reset: true, transition: false });
6028 }
6029 allowViewTouchMove = true;
6030 router.allowPageChange = true;
6031 if (pageChanged) {
6032 // Update History
6033 if (router.history.length === 1) {
6034 router.history.unshift(router.url);
6035 }
6036 router.history.pop();
6037 router.saveHistory();
6038
6039 // Update push state
6040 if (params.pushState) {
6041 History.back();
6042 }
6043
6044 // Page after animation callback
6045 router.pageCallback('afterOut', currentPage, $currentNavbarInner, 'current', 'next', { route: currentPage[0].f7Page.route, swipeBack: true });
6046 router.pageCallback('afterIn', previousPage, $previousNavbarInner, 'previous', 'current', { route: previousPage[0].f7Page.route, swipeBack: true });
6047
6048 // Remove Old Page
6049 if (params.stackPages && router.initialPages.indexOf(currentPage[0]) >= 0) {
6050 currentPage.addClass('stacked');
6051 if (separateNavbar) {
6052 $currentNavbarInner.addClass('stacked');
6053 }
6054 } else {
6055 router.pageCallback('beforeRemove', currentPage, $currentNavbarInner, 'next', { swipeBack: true });
6056 router.removePage(currentPage);
6057 if (separateNavbar) {
6058 router.removeNavbar($currentNavbarInner);
6059 }
6060 }
6061
6062 $el.trigger('swipeback:afterchange', callbackData);
6063 router.emit('swipebackAfterChange', callbackData);
6064
6065 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
6066
6067 if (params.preloadPreviousPage) {
6068 router.back(router.history[router.history.length - 2], { preload: true });
6069 }
6070 } else {
6071 $el.trigger('swipeback:afterreset', callbackData);
6072 router.emit('swipebackAfterReset', callbackData);
6073 }
6074 if (pageShadow && pageShadow.length > 0) { pageShadow.remove(); }
6075 if (pageOpacity && pageOpacity.length > 0) { pageOpacity.remove(); }
6076 });
6077 }
6078
6079 function attachEvents() {
6080 var passiveListener = (app.touchEvents.start === 'touchstart' && Support.passiveListener) ? { passive: true, capture: false } : false;
6081 $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
6082 app.on('touchmove:active', handleTouchMove);
6083 app.on('touchend:passive', handleTouchEnd);
6084 }
6085 function detachEvents() {
6086 var passiveListener = (app.touchEvents.start === 'touchstart' && Support.passiveListener) ? { passive: true, capture: false } : false;
6087 $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
6088 app.off('touchmove:active', handleTouchMove);
6089 app.off('touchend:passive', handleTouchEnd);
6090 }
6091
6092 attachEvents();
6093
6094 router.on('routerDestroy', detachEvents);
6095 }
6096
6097 function redirect (direction, route, options) {
6098 var router = this;
6099 var redirect = route.route.redirect;
6100 if (options.initial && router.params.pushState) {
6101 options.replaceState = true; // eslint-disable-line
6102 options.history = true; // eslint-disable-line
6103 }
6104 function redirectResolve(redirectUrl, redirectOptions) {
6105 if ( redirectOptions === void 0 ) redirectOptions = {};
6106
6107 router.allowPageChange = true;
6108 router[direction](redirectUrl, Utils.extend({}, options, redirectOptions));
6109 }
6110 function redirectReject() {
6111 router.allowPageChange = true;
6112 }
6113 if (typeof redirect === 'function') {
6114 router.allowPageChange = false;
6115 var redirectUrl = redirect.call(router, route, redirectResolve, redirectReject);
6116 if (redirectUrl && typeof redirectUrl === 'string') {
6117 router.allowPageChange = true;
6118 return router[direction](redirectUrl, options);
6119 }
6120 return router;
6121 }
6122 return router[direction](redirect, options);
6123 }
6124
6125 function processQueue(router, routerQueue, routeQueue, to, from, resolve, reject) {
6126 var queue = [];
6127
6128 if (Array.isArray(routeQueue)) {
6129 queue.push.apply(queue, routeQueue);
6130 } else if (routeQueue && typeof routeQueue === 'function') {
6131 queue.push(routeQueue);
6132 }
6133 if (routerQueue) {
6134 if (Array.isArray(routerQueue)) {
6135 queue.push.apply(queue, routerQueue);
6136 } else {
6137 queue.push(routerQueue);
6138 }
6139 }
6140
6141 function next() {
6142 if (queue.length === 0) {
6143 resolve();
6144 return;
6145 }
6146 var queueItem = queue.shift();
6147
6148 queueItem.call(
6149 router,
6150 to,
6151 from,
6152 function () {
6153 next();
6154 },
6155 function () {
6156 reject();
6157 }
6158 );
6159 }
6160 next();
6161 }
6162
6163 function processRouteQueue (to, from, resolve, reject) {
6164 var router = this;
6165 function enterNextRoute() {
6166 if (to && to.route && (router.params.routesBeforeEnter || to.route.beforeEnter)) {
6167 router.allowPageChange = false;
6168 processQueue(
6169 router,
6170 router.params.routesBeforeEnter,
6171 to.route.beforeEnter,
6172 to,
6173 from,
6174 function () {
6175 router.allowPageChange = true;
6176 resolve();
6177 },
6178 function () {
6179 reject();
6180 }
6181 );
6182 } else {
6183 resolve();
6184 }
6185 }
6186 function leaveCurrentRoute() {
6187 if (from && from.route && (router.params.routesBeforeLeave || from.route.beforeLeave)) {
6188 router.allowPageChange = false;
6189 processQueue(
6190 router,
6191 router.params.routesBeforeLeave,
6192 from.route.beforeLeave,
6193 to,
6194 from,
6195 function () {
6196 router.allowPageChange = true;
6197 enterNextRoute();
6198 },
6199 function () {
6200 reject();
6201 }
6202 );
6203 } else {
6204 enterNextRoute();
6205 }
6206 }
6207 leaveCurrentRoute();
6208 }
6209
6210 function appRouterCheck (router, method) {
6211 if (!router.view) {
6212 throw new Error(("Framework7: it is not allowed to use router methods on global app router. Use router methods only on related View, e.g. app.views.main.router." + method + "(...)"));
6213 }
6214 }
6215
6216 function refreshPage() {
6217 var router = this;
6218 appRouterCheck(router, 'refreshPage');
6219 return router.navigate(router.currentRoute.url, {
6220 ignoreCache: true,
6221 reloadCurrent: true,
6222 });
6223 }
6224
6225 function forward(el, forwardOptions) {
6226 if ( forwardOptions === void 0 ) forwardOptions = {};
6227
6228 var router = this;
6229 var $el = $(el);
6230 var app = router.app;
6231 var view = router.view;
6232 var options = Utils.extend(false, {
6233 animate: router.params.animate,
6234 pushState: true,
6235 replaceState: false,
6236 history: true,
6237 reloadCurrent: router.params.reloadPages,
6238 reloadPrevious: false,
6239 reloadAll: false,
6240 clearPreviousHistory: false,
6241 reloadDetail: router.params.reloadDetail,
6242 on: {},
6243 }, forwardOptions);
6244
6245 var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
6246 var isMaster = masterDetailEnabled && options.route && options.route.route && options.route.route.master === true;
6247 var masterPageEl;
6248 var otherDetailPageEl;
6249
6250 var currentRouteIsModal = router.currentRoute.modal;
6251 var modalType;
6252 if (!currentRouteIsModal) {
6253 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
6254 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route[modalLoadProp]) {
6255 currentRouteIsModal = true;
6256 modalType = modalLoadProp;
6257 }
6258 });
6259 }
6260
6261 if (currentRouteIsModal) {
6262 var modalToClose = router.currentRoute.modal
6263 || router.currentRoute.route.modalInstance
6264 || app[modalType].get();
6265 var previousUrl = router.history[router.history.length - 2];
6266 var previousRoute = router.findMatchingRoute(previousUrl);
6267 if (!previousRoute && previousUrl) {
6268 previousRoute = {
6269 url: previousUrl,
6270 path: previousUrl.split('?')[0],
6271 query: Utils.parseUrlQuery(previousUrl),
6272 route: {
6273 path: previousUrl.split('?')[0],
6274 url: previousUrl,
6275 },
6276 };
6277 }
6278
6279 router.modalRemove(modalToClose);
6280 }
6281
6282 var dynamicNavbar = router.dynamicNavbar;
6283 var separateNavbar = router.separateNavbar;
6284
6285 var $viewEl = router.$el;
6286 var $newPage = $el;
6287 var reload = options.reloadPrevious || options.reloadCurrent || options.reloadAll;
6288 var $oldPage;
6289
6290 var $navbarEl;
6291 var $newNavbarInner;
6292 var $oldNavbarInner;
6293
6294 router.allowPageChange = false;
6295 if ($newPage.length === 0) {
6296 router.allowPageChange = true;
6297 return router;
6298 }
6299
6300 if ($newPage.length) {
6301 // Remove theme elements
6302 router.removeThemeElements($newPage);
6303 }
6304
6305 if (dynamicNavbar) {
6306 $newNavbarInner = $newPage.children('.navbar').children('.navbar-inner');
6307 if (separateNavbar) {
6308 $navbarEl = router.$navbarEl;
6309 if ($newNavbarInner.length > 0) {
6310 $newPage.children('.navbar').remove();
6311 }
6312 if ($newNavbarInner.length === 0 && $newPage[0] && $newPage[0].f7Page) {
6313 // Try from pageData
6314 $newNavbarInner = $newPage[0].f7Page.$navbarEl;
6315 }
6316 }
6317 }
6318
6319 // Save Keep Alive Cache
6320 if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
6321 options.route.route.keepAliveData = {
6322 pageEl: $el[0],
6323 };
6324 }
6325
6326 // Pages In View
6327 var $pagesInView = $viewEl
6328 .children('.page:not(.stacked)')
6329 .filter(function (index, pageInView) { return pageInView !== $newPage[0]; });
6330
6331 // Navbars In View
6332 var $navbarsInView;
6333 if (separateNavbar) {
6334 $navbarsInView = $navbarEl
6335 .children('.navbar-inner:not(.stacked)')
6336 .filter(function (index, navbarInView) { return navbarInView !== $newNavbarInner[0]; });
6337 }
6338
6339 // Exit when reload previous and only 1 page in view so nothing ro reload
6340 if (options.reloadPrevious && $pagesInView.length < 2) {
6341 router.allowPageChange = true;
6342 return router;
6343 }
6344
6345 // Find Detail' master page
6346 var isDetail;
6347 var reloadDetail;
6348 if (masterDetailEnabled && !options.reloadAll) {
6349 for (var i = 0; i < $pagesInView.length; i += 1) {
6350 if (!masterPageEl
6351 && $pagesInView[i].classList.contains('page-master')
6352 ) {
6353 masterPageEl = $pagesInView[i];
6354 continue; // eslint-disable-line
6355 }
6356 }
6357 isDetail = !isMaster && masterPageEl;
6358
6359 if (isDetail) {
6360 // Find Other Detail
6361 if (masterPageEl) {
6362 for (var i$1 = 0; i$1 < $pagesInView.length; i$1 += 1) {
6363 if ($pagesInView[i$1].classList.contains('page-master-detail')
6364 ) {
6365 otherDetailPageEl = $pagesInView[i$1];
6366 continue; // eslint-disable-line
6367 }
6368 }
6369 }
6370 }
6371 reloadDetail = isDetail && options.reloadDetail && app.width >= router.params.masterDetailBreakpoint && masterPageEl;
6372 }
6373
6374 // New Page
6375 var newPagePosition = 'next';
6376 if (options.reloadCurrent || options.reloadAll || reloadDetail) {
6377 newPagePosition = 'current';
6378 } else if (options.reloadPrevious) {
6379 newPagePosition = 'previous';
6380 }
6381 $newPage
6382 .addClass(("page-" + newPagePosition + (isMaster ? ' page-master' : '') + (isDetail ? ' page-master-detail' : '')))
6383 .removeClass('stacked')
6384 .trigger('page:unstack')
6385 .trigger('page:position', { position: newPagePosition });
6386 if (isMaster || isDetail) {
6387 $newPage.trigger('page:role', { role: isMaster ? 'master' : 'detail' });
6388 }
6389
6390
6391 if (dynamicNavbar && $newNavbarInner.length) {
6392 $newNavbarInner
6393 .addClass(("navbar-" + newPagePosition + (isMaster ? ' navbar-master' : '') + (isDetail ? ' navbar-master-detail' : '')))
6394 .removeClass('stacked');
6395 }
6396
6397 // Find Old Page
6398 if (options.reloadCurrent || reloadDetail) {
6399 $oldPage = $pagesInView.eq($pagesInView.length - 1);
6400 if (separateNavbar) {
6401 // $oldNavbarInner = $navbarsInView.eq($pagesInView.length - 1);
6402 $oldNavbarInner = $(app.navbar.getElByPage($oldPage));
6403 }
6404 } else if (options.reloadPrevious) {
6405 $oldPage = $pagesInView.eq($pagesInView.length - 2);
6406 if (separateNavbar) {
6407 // $oldNavbarInner = $navbarsInView.eq($pagesInView.length - 2);
6408 $oldNavbarInner = $(app.navbar.getElByPage($oldPage));
6409 }
6410 } else if (options.reloadAll) {
6411 $oldPage = $pagesInView.filter(function (index, pageEl) { return pageEl !== $newPage[0]; });
6412 if (separateNavbar) {
6413 $oldNavbarInner = $navbarsInView.filter(function (index, navbarEl) { return navbarEl !== $newNavbarInner[0]; });
6414 }
6415 } else {
6416 if ($pagesInView.length > 1) {
6417 var i$2 = 0;
6418 for (i$2 = 0; i$2 < $pagesInView.length - 1; i$2 += 1) {
6419 if (masterPageEl
6420 && $pagesInView[i$2] === masterPageEl
6421 ) {
6422 $pagesInView.eq(i$2).addClass('page-master-stacked');
6423 $pagesInView.eq(i$2).trigger('page:masterstack');
6424 if (separateNavbar) {
6425 $(app.navbar.getElByPage(masterPageEl)).addClass('navbar-master-stacked');
6426 }
6427 continue; // eslint-disable-line
6428 }
6429 var oldNavbarInnerEl = app.navbar.getElByPage($pagesInView.eq(i$2));
6430 if (router.params.stackPages) {
6431 $pagesInView.eq(i$2).addClass('stacked');
6432 $pagesInView.eq(i$2).trigger('page:stack');
6433 if (separateNavbar) {
6434 $(oldNavbarInnerEl).addClass('stacked');
6435 }
6436 } else {
6437 // Page remove event
6438 router.pageCallback('beforeRemove', $pagesInView[i$2], $navbarsInView && $navbarsInView[i$2], 'previous', undefined, options);
6439 router.removePage($pagesInView[i$2]);
6440 if (separateNavbar && oldNavbarInnerEl) {
6441 router.removeNavbar(oldNavbarInnerEl);
6442 }
6443 }
6444 }
6445 }
6446 $oldPage = $viewEl
6447 .children('.page:not(.stacked)')
6448 .filter(function (index, page) { return page !== $newPage[0]; });
6449 if (separateNavbar) {
6450 $oldNavbarInner = $navbarEl
6451 .children('.navbar-inner:not(.stacked)')
6452 .filter(function (index, navbarInner) { return navbarInner !== $newNavbarInner[0]; });
6453 }
6454 }
6455
6456 if (dynamicNavbar && !separateNavbar) {
6457 $oldNavbarInner = $oldPage.children('.navbar').children('.navbar-inner');
6458 }
6459 if (isDetail && !options.reloadAll) {
6460 if ($oldPage.length > 1 || reloadDetail) {
6461 $oldPage = $oldPage.filter(function (pageIndex, pageEl) { return !pageEl.classList.contains('page-master'); });
6462 }
6463 if ($oldNavbarInner && ($oldNavbarInner.length > 1 || reloadDetail)) {
6464 $oldNavbarInner = $oldNavbarInner.filter(function (navbarIndex, navbarEl) { return !navbarEl.classList.contains('navbar-master'); });
6465 }
6466 }
6467
6468 // Push State
6469 if (router.params.pushState && (options.pushState || options.replaceState) && !options.reloadPrevious) {
6470 var pushStateRoot = router.params.pushStateRoot || '';
6471 History[options.reloadCurrent || (reloadDetail && otherDetailPageEl) || options.reloadAll || options.replaceState ? 'replace' : 'push'](
6472 view.id,
6473 {
6474 url: options.route.url,
6475 },
6476 pushStateRoot + router.params.pushStateSeparator + options.route.url
6477 );
6478 }
6479
6480 if (!options.reloadPrevious) {
6481 // Current Page & Navbar
6482 router.currentPageEl = $newPage[0];
6483 if (dynamicNavbar && $newNavbarInner.length) {
6484 router.currentNavbarEl = $newNavbarInner[0];
6485 } else {
6486 delete router.currentNavbarEl;
6487 }
6488
6489 // Current Route
6490 router.currentRoute = options.route;
6491 }
6492
6493 // Update router history
6494 var url = options.route.url;
6495
6496 if (options.history) {
6497 if (((options.reloadCurrent || (reloadDetail && otherDetailPageEl)) && router.history.length) > 0 || options.replaceState) {
6498 router.history[router.history.length - (options.reloadPrevious ? 2 : 1)] = url;
6499 } else if (options.reloadPrevious) {
6500 router.history[router.history.length - 2] = url;
6501 } else if (options.reloadAll) {
6502 router.history = [url];
6503 } else {
6504 router.history.push(url);
6505 }
6506 }
6507 router.saveHistory();
6508
6509 // Insert new page and navbar
6510 var newPageInDom = $newPage.parents(doc).length > 0;
6511 var f7Component = $newPage[0].f7Component;
6512 if (options.reloadPrevious) {
6513 if (f7Component && !newPageInDom) {
6514 f7Component.$mount(function (componentEl) {
6515 $(componentEl).insertBefore($oldPage);
6516 });
6517 } else {
6518 $newPage.insertBefore($oldPage);
6519 }
6520 if (separateNavbar && $newNavbarInner.length) {
6521 if ($newNavbarInner.children('.title-large').length) {
6522 $newNavbarInner.addClass('navbar-inner-large');
6523 }
6524 if ($oldNavbarInner.length) {
6525 $newNavbarInner.insertBefore($oldNavbarInner);
6526 } else {
6527 if (!router.$navbarEl.parents(doc).length) {
6528 router.$el.prepend(router.$navbarEl);
6529 }
6530 $navbarEl.append($newNavbarInner);
6531 }
6532 }
6533 } else {
6534 if ($oldPage.next('.page')[0] !== $newPage[0]) {
6535 if (f7Component && !newPageInDom) {
6536 f7Component.$mount(function (componentEl) {
6537 $viewEl.append(componentEl);
6538 });
6539 } else {
6540 $viewEl.append($newPage[0]);
6541 }
6542 }
6543 if (separateNavbar && $newNavbarInner.length) {
6544 if ($newNavbarInner.children('.title-large').length) {
6545 $newNavbarInner.addClass('navbar-inner-large');
6546 }
6547 if (!router.$navbarEl.parents(doc).length) {
6548 router.$el.prepend(router.$navbarEl);
6549 }
6550 $navbarEl.append($newNavbarInner[0]);
6551 }
6552 }
6553 if (!newPageInDom) {
6554 router.pageCallback('mounted', $newPage, $newNavbarInner, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
6555 } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
6556 $newPage[0].f7PageMounted = true;
6557 router.pageCallback('mounted', $newPage, $newNavbarInner, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
6558 }
6559
6560 // Remove old page
6561 if ((options.reloadCurrent || reloadDetail) && $oldPage.length > 0) {
6562 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
6563 $oldPage.addClass('stacked');
6564 $oldPage.trigger('page:stack');
6565 if (separateNavbar) {
6566 $oldNavbarInner.addClass('stacked');
6567 }
6568 } else {
6569 // Page remove event
6570 router.pageCallback('beforeRemove', $oldPage, $oldNavbarInner, 'previous', undefined, options);
6571 router.removePage($oldPage);
6572 if (separateNavbar && $oldNavbarInner && $oldNavbarInner.length) {
6573 router.removeNavbar($oldNavbarInner);
6574 }
6575 }
6576 } else if (options.reloadAll) {
6577 $oldPage.each(function (index, pageEl) {
6578 var $oldPageEl = $(pageEl);
6579 var $oldNavbarInnerEl = $(app.navbar.getElByPage($oldPageEl));
6580 if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
6581 $oldPageEl.addClass('stacked');
6582 $oldPageEl.trigger('page:stack');
6583 if (separateNavbar) {
6584 $oldNavbarInnerEl.addClass('stacked');
6585 }
6586 } else {
6587 // Page remove event
6588 router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarInner && $oldNavbarInner.eq(index), 'previous', undefined, options);
6589 router.removePage($oldPageEl);
6590 if (separateNavbar && $oldNavbarInnerEl.length) {
6591 router.removeNavbar($oldNavbarInnerEl);
6592 }
6593 }
6594 });
6595 } else if (options.reloadPrevious) {
6596 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
6597 $oldPage.addClass('stacked');
6598 $oldPage.trigger('page:stack');
6599 if (separateNavbar) {
6600 $oldNavbarInner.addClass('stacked');
6601 }
6602 } else {
6603 // Page remove event
6604 router.pageCallback('beforeRemove', $oldPage, $oldNavbarInner, 'previous', undefined, options);
6605 router.removePage($oldPage);
6606 if (separateNavbar && $oldNavbarInner && $oldNavbarInner.length) {
6607 router.removeNavbar($oldNavbarInner);
6608 }
6609 }
6610 }
6611
6612 // Load Tab
6613 if (options.route.route.tab) {
6614 router.tabLoad(options.route.route.tab, Utils.extend({}, options, {
6615 history: false,
6616 pushState: false,
6617 }));
6618 }
6619
6620 // Page init and before init events
6621 router.pageCallback('init', $newPage, $newNavbarInner, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
6622
6623 if (options.reloadCurrent || options.reloadAll || reloadDetail) {
6624 router.allowPageChange = true;
6625 router.pageCallback('beforeIn', $newPage, $newNavbarInner, newPagePosition, 'current', options);
6626 router.pageCallback('afterIn', $newPage, $newNavbarInner, newPagePosition, 'current', options);
6627 if (options.reloadCurrent && options.clearPreviousHistory) { router.clearPreviousHistory(); }
6628 if (reloadDetail) {
6629 masterPageEl.classList.add('page-previous');
6630 masterPageEl.classList.remove('page-current');
6631 $(masterPageEl).trigger('page:position', { position: 'previous' });
6632 if (masterPageEl.f7Page && masterPageEl.f7Page.navbarEl) {
6633 masterPageEl.f7Page.navbarEl.classList.add('navbar-previous');
6634 masterPageEl.f7Page.navbarEl.classList.remove('navbar-current');
6635 }
6636 }
6637 return router;
6638 }
6639 if (options.reloadPrevious) {
6640 router.allowPageChange = true;
6641 return router;
6642 }
6643
6644 // Before animation event
6645 router.pageCallback('beforeIn', $newPage, $newNavbarInner, 'next', 'current', options);
6646 router.pageCallback('beforeOut', $oldPage, $oldNavbarInner, 'current', 'previous', options);
6647
6648 // Animation
6649 function afterAnimation() {
6650 var pageClasses = 'page-previous page-current page-next';
6651 var navbarClasses = 'navbar-previous navbar-current navbar-next';
6652 $newPage.removeClass(pageClasses).addClass('page-current').removeAttr('aria-hidden').trigger('page:position', { position: 'current' });
6653 $oldPage.removeClass(pageClasses).addClass('page-previous').trigger('page:position', { position: 'previous' });
6654 if (!$oldPage.hasClass('page-master')) {
6655 $oldPage.attr('aria-hidden', 'true');
6656 }
6657 if (dynamicNavbar) {
6658 $newNavbarInner.removeClass(navbarClasses).addClass('navbar-current').removeAttr('aria-hidden');
6659 $oldNavbarInner.removeClass(navbarClasses).addClass('navbar-previous');
6660 if (!$oldNavbarInner.hasClass('navbar-master')) {
6661 $oldNavbarInner.attr('aria-hidden', 'true');
6662 }
6663 }
6664 // After animation event
6665 router.allowPageChange = true;
6666 router.pageCallback('afterIn', $newPage, $newNavbarInner, 'next', 'current', options);
6667 router.pageCallback('afterOut', $oldPage, $oldNavbarInner, 'current', 'previous', options);
6668
6669 var keepOldPage = (router.params.preloadPreviousPage || (app.theme === 'ios' ? router.params.iosSwipeBack : router.params.mdSwipeBack)) && !isMaster;
6670 if (!keepOldPage) {
6671 if ($newPage.hasClass('smart-select-page') || $newPage.hasClass('photo-browser-page') || $newPage.hasClass('autocomplete-page')) {
6672 keepOldPage = true;
6673 }
6674 }
6675 if (!keepOldPage) {
6676 if (router.params.stackPages) {
6677 $oldPage.addClass('stacked');
6678 $oldPage.trigger('page:stack');
6679 if (separateNavbar) {
6680 $oldNavbarInner.addClass('stacked');
6681 }
6682 } else if (!($newPage.attr('data-name') && $newPage.attr('data-name') === 'smart-select-page')) {
6683 // Remove event
6684 router.pageCallback('beforeRemove', $oldPage, $oldNavbarInner, 'previous', undefined, options);
6685 router.removePage($oldPage);
6686 if (separateNavbar && $oldNavbarInner.length) {
6687 router.removeNavbar($oldNavbarInner);
6688 }
6689 }
6690 }
6691 if (options.clearPreviousHistory) { router.clearPreviousHistory(); }
6692 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
6693
6694 if (router.params.pushState) {
6695 History.clearRouterQueue();
6696 }
6697 }
6698 function setPositionClasses() {
6699 var pageClasses = 'page-previous page-current page-next';
6700 var navbarClasses = 'navbar-previous navbar-current navbar-next';
6701 $oldPage.removeClass(pageClasses).addClass('page-current').removeAttr('aria-hidden').trigger('page:position', { position: 'current' });
6702 $newPage.removeClass(pageClasses).addClass('page-next').removeAttr('aria-hidden').trigger('page:position', { position: 'next' });
6703 if (dynamicNavbar) {
6704 $oldNavbarInner.removeClass(navbarClasses).addClass('navbar-current').removeAttr('aria-hidden');
6705 $newNavbarInner.removeClass(navbarClasses).addClass('navbar-next').removeAttr('aria-hidden');
6706 }
6707 }
6708 if (options.animate && !(isMaster && app.width >= router.params.masterDetailBreakpoint)) {
6709 var delay = router.app.theme === 'md' ? router.params.mdPageLoadDelay : router.params.iosPageLoadDelay;
6710 if (delay) {
6711 setTimeout(function () {
6712 setPositionClasses();
6713 router.animate($oldPage, $newPage, $oldNavbarInner, $newNavbarInner, 'forward', function () {
6714 afterAnimation();
6715 });
6716 }, delay);
6717 } else {
6718 setPositionClasses();
6719 router.animate($oldPage, $newPage, $oldNavbarInner, $newNavbarInner, 'forward', function () {
6720 afterAnimation();
6721 });
6722 }
6723 } else {
6724 afterAnimation();
6725 }
6726 return router;
6727 }
6728 function load(loadParams, loadOptions, ignorePageChange) {
6729 if ( loadParams === void 0 ) loadParams = {};
6730 if ( loadOptions === void 0 ) loadOptions = {};
6731
6732 var router = this;
6733 if (!router.allowPageChange && !ignorePageChange) { return router; }
6734 var params = loadParams;
6735 var options = loadOptions;
6736 var url = params.url;
6737 var content = params.content;
6738 var el = params.el;
6739 var pageName = params.pageName;
6740 var template = params.template;
6741 var templateUrl = params.templateUrl;
6742 var component = params.component;
6743 var componentUrl = params.componentUrl;
6744
6745 if (!options.reloadCurrent
6746 && options.route
6747 && options.route.route
6748 && options.route.route.parentPath
6749 && router.currentRoute.route
6750 && router.currentRoute.route.parentPath === options.route.route.parentPath) {
6751 // Do something nested
6752 if (options.route.url === router.url) {
6753 router.allowPageChange = true;
6754 return false;
6755 }
6756 // Check for same params
6757 var sameParams = Object.keys(options.route.params).length === Object.keys(router.currentRoute.params).length;
6758 if (sameParams) {
6759 // Check for equal params name
6760 Object.keys(options.route.params).forEach(function (paramName) {
6761 if (
6762 !(paramName in router.currentRoute.params)
6763 || (router.currentRoute.params[paramName] !== options.route.params[paramName])
6764 ) {
6765 sameParams = false;
6766 }
6767 });
6768 }
6769 if (sameParams) {
6770 if (options.route.route.tab) {
6771 return router.tabLoad(options.route.route.tab, options);
6772 }
6773 return false;
6774 }
6775 if (!sameParams
6776 && options.route.route.tab
6777 && router.currentRoute.route.tab
6778 && router.currentRoute.parentPath === options.route.parentPath
6779 ) {
6780 return router.tabLoad(options.route.route.tab, options);
6781 }
6782 }
6783
6784 if (
6785 options.route
6786 && options.route.url
6787 && router.url === options.route.url
6788 && !(options.reloadCurrent || options.reloadPrevious)
6789 && !router.params.allowDuplicateUrls
6790 ) {
6791 router.allowPageChange = true;
6792 return false;
6793 }
6794
6795 if (!options.route && url) {
6796 options.route = router.parseRouteUrl(url);
6797 Utils.extend(options.route, { route: { url: url, path: url } });
6798 }
6799
6800 // Component Callbacks
6801 function resolve(pageEl, newOptions) {
6802 return router.forward(pageEl, Utils.extend(options, newOptions));
6803 }
6804 function reject() {
6805 router.allowPageChange = true;
6806 return router;
6807 }
6808
6809 if (url || templateUrl || componentUrl) {
6810 router.allowPageChange = false;
6811 }
6812
6813 // Proceed
6814 if (content) {
6815 router.forward(router.getPageEl(content), options);
6816 } else if (template || templateUrl) {
6817 // Parse template and send page element
6818 try {
6819 router.pageTemplateLoader(template, templateUrl, options, resolve, reject);
6820 } catch (err) {
6821 router.allowPageChange = true;
6822 throw err;
6823 }
6824 } else if (el) {
6825 // Load page from specified HTMLElement or by page name in pages container
6826 router.forward(router.getPageEl(el), options);
6827 } else if (pageName) {
6828 // Load page by page name in pages container
6829 router.forward(router.$el.children((".page[data-name=\"" + pageName + "\"]")).eq(0), options);
6830 } else if (component || componentUrl) {
6831 // Load from component (F7/Vue/React/...)
6832 try {
6833 router.pageComponentLoader(router.el, component, componentUrl, options, resolve, reject);
6834 } catch (err) {
6835 router.allowPageChange = true;
6836 throw err;
6837 }
6838 } else if (url) {
6839 // Load using XHR
6840 if (router.xhr) {
6841 router.xhr.abort();
6842 router.xhr = false;
6843 }
6844 router.xhrRequest(url, options)
6845 .then(function (pageContent) {
6846 router.forward(router.getPageEl(pageContent), options);
6847 })
6848 .catch(function () {
6849 router.allowPageChange = true;
6850 });
6851 }
6852 return router;
6853 }
6854 function navigate(navigateParams, navigateOptions) {
6855 if ( navigateOptions === void 0 ) navigateOptions = {};
6856
6857 var router = this;
6858 if (router.swipeBackActive) { return router; }
6859 var url;
6860 var createRoute;
6861 var name;
6862 var query;
6863 var params;
6864 var route;
6865 if (typeof navigateParams === 'string') {
6866 url = navigateParams;
6867 } else {
6868 url = navigateParams.url;
6869 createRoute = navigateParams.route;
6870 name = navigateParams.name;
6871 query = navigateParams.query;
6872 params = navigateParams.params;
6873 }
6874 if (name) {
6875 // find route by name
6876 route = router.findRouteByKey('name', name);
6877 if (!route) {
6878 throw new Error(("Framework7: route with name \"" + name + "\" not found"));
6879 }
6880 url = router.constructRouteUrl(route, { params: params, query: query });
6881 if (url) {
6882 return router.navigate(url, navigateOptions);
6883 }
6884 throw new Error(("Framework7: can't construct URL for route with name \"" + name + "\""));
6885 }
6886 var app = router.app;
6887 appRouterCheck(router, 'navigate');
6888 if (url === '#' || url === '') {
6889 return router;
6890 }
6891
6892 var navigateUrl = url.replace('./', '');
6893 if (navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
6894 var currentPath = router.currentRoute.parentPath || router.currentRoute.path;
6895 navigateUrl = ((currentPath ? (currentPath + "/") : '/') + navigateUrl)
6896 .replace('///', '/')
6897 .replace('//', '/');
6898 }
6899 if (createRoute) {
6900 route = Utils.extend(router.parseRouteUrl(navigateUrl), {
6901 route: Utils.extend({}, createRoute),
6902 });
6903 } else {
6904 route = router.findMatchingRoute(navigateUrl);
6905 }
6906
6907 if (!route) {
6908 return router;
6909 }
6910
6911 if (route.route.redirect) {
6912 return redirect.call(router, 'navigate', route, navigateOptions);
6913 }
6914
6915
6916 var options = {};
6917 if (route.route.options) {
6918 Utils.extend(options, route.route.options, navigateOptions);
6919 } else {
6920 Utils.extend(options, navigateOptions);
6921 }
6922 options.route = route;
6923
6924 if (options && options.context) {
6925 route.context = options.context;
6926 options.route.context = options.context;
6927 }
6928
6929 function resolve() {
6930 var routerLoaded = false;
6931 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
6932 if (route.route[modalLoadProp] && !routerLoaded) {
6933 routerLoaded = true;
6934 router.modalLoad(modalLoadProp, route, options);
6935 }
6936 });
6937 if (route.route.keepAlive && route.route.keepAliveData) {
6938 router.load({ el: route.route.keepAliveData.pageEl }, options, false);
6939 routerLoaded = true;
6940 }
6941 ('url content component pageName el componentUrl template templateUrl').split(' ').forEach(function (pageLoadProp) {
6942 var obj;
6943
6944 if (route.route[pageLoadProp] && !routerLoaded) {
6945 routerLoaded = true;
6946 router.load(( obj = {}, obj[pageLoadProp] = route.route[pageLoadProp], obj ), options, false);
6947 }
6948 });
6949 if (routerLoaded) { return; }
6950 // Async
6951 function asyncResolve(resolveParams, resolveOptions) {
6952 router.allowPageChange = false;
6953 var resolvedAsModal = false;
6954 if (resolveOptions && resolveOptions.context) {
6955 if (!route.context) { route.context = resolveOptions.context; }
6956 else { route.context = Utils.extend({}, route.context, resolveOptions.context); }
6957 options.route.context = route.context;
6958 }
6959 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
6960 if (resolveParams[modalLoadProp]) {
6961 resolvedAsModal = true;
6962 var modalRoute = Utils.extend({}, route, { route: resolveParams });
6963 router.allowPageChange = true;
6964 router.modalLoad(modalLoadProp, modalRoute, Utils.extend(options, resolveOptions));
6965 }
6966 });
6967 if (resolvedAsModal) { return; }
6968 router.load(resolveParams, Utils.extend(options, resolveOptions), true);
6969 }
6970 function asyncReject() {
6971 router.allowPageChange = true;
6972 }
6973 if (route.route.async) {
6974 router.allowPageChange = false;
6975
6976 route.route.async.call(router, options.route, router.currentRoute, asyncResolve, asyncReject);
6977 }
6978 }
6979 function reject() {
6980 router.allowPageChange = true;
6981 }
6982
6983 if (router.params.masterDetailBreakpoint > 0 && route.route.masterRoute) {
6984 // load detail route
6985 var preloadMaster = true;
6986 if (router.currentRoute && router.currentRoute.route) {
6987 if (router.currentRoute.route.master && (router.currentRoute.route === route.route.masterRoute || router.currentRoute.route.path === route.route.masterRoute.path)) {
6988 preloadMaster = false;
6989 }
6990 if (router.currentRoute.route.masterRoute && ((router.currentRoute.route.masterRoute === route.route.masterRoute) || (router.currentRoute.route.masterRoute.path === route.route.masterRoute.path))) {
6991 preloadMaster = false;
6992 }
6993 }
6994 if (preloadMaster) {
6995 router.navigate(route.route.masterRoute.path, {
6996 animate: false,
6997 reloadAll: navigateOptions.reloadAll,
6998 reloadCurrent: navigateOptions.reloadCurrent,
6999 reloadPrevious: navigateOptions.reloadPrevious,
7000 once: {
7001 pageAfterIn: function pageAfterIn() {
7002 router.navigate(navigateParams, Utils.extend({}, navigateOptions, {
7003 animate: false,
7004 reloadAll: false,
7005 reloadCurrent: false,
7006 reloadPrevious: false,
7007 }));
7008 },
7009 },
7010 });
7011 return router;
7012 }
7013 }
7014
7015 processRouteQueue.call(
7016 router,
7017 route,
7018 router.currentRoute,
7019 function () {
7020 if (route.route.modules) {
7021 app
7022 .loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules])
7023 .then(function () {
7024 resolve();
7025 })
7026 .catch(function () {
7027 reject();
7028 });
7029 } else {
7030 resolve();
7031 }
7032 },
7033 function () {
7034 reject();
7035 }
7036 );
7037
7038 // Return Router
7039 return router;
7040 }
7041
7042 function tabLoad(tabRoute, loadOptions) {
7043 if ( loadOptions === void 0 ) loadOptions = {};
7044
7045 var router = this;
7046 var options = Utils.extend({
7047 animate: router.params.animate,
7048 pushState: true,
7049 history: true,
7050 parentPageEl: null,
7051 preload: false,
7052 on: {},
7053 }, loadOptions);
7054
7055 var currentRoute;
7056 var previousRoute;
7057 if (options.route) {
7058 // Set Route
7059 if (!options.preload && options.route !== router.currentRoute) {
7060 previousRoute = router.previousRoute;
7061 router.currentRoute = options.route;
7062 }
7063 if (options.preload) {
7064 currentRoute = options.route;
7065 previousRoute = router.currentRoute;
7066 } else {
7067 currentRoute = router.currentRoute;
7068 if (!previousRoute) { previousRoute = router.previousRoute; }
7069 }
7070
7071 // Update Browser History
7072 if (router.params.pushState && options.pushState && !options.reloadPrevious) {
7073 History.replace(
7074 router.view.id,
7075 {
7076 url: options.route.url,
7077 },
7078 (router.params.pushStateRoot || '') + router.params.pushStateSeparator + options.route.url
7079 );
7080 }
7081
7082 // Update Router History
7083 if (options.history) {
7084 router.history[Math.max(router.history.length - 1, 0)] = options.route.url;
7085 router.saveHistory();
7086 }
7087 }
7088
7089 // Show Tab
7090 var $parentPageEl = $(options.parentPageEl || router.currentPageEl);
7091 var tabEl;
7092 if ($parentPageEl.length && $parentPageEl.find(("#" + (tabRoute.id))).length) {
7093 tabEl = $parentPageEl.find(("#" + (tabRoute.id))).eq(0);
7094 } else if (router.view.selector) {
7095 tabEl = (router.view.selector) + " #" + (tabRoute.id);
7096 } else {
7097 tabEl = "#" + (tabRoute.id);
7098 }
7099 var tabShowResult = router.app.tab.show({
7100 tabEl: tabEl,
7101 animate: options.animate,
7102 tabRoute: options.route,
7103 });
7104
7105 var $newTabEl = tabShowResult.$newTabEl;
7106 var $oldTabEl = tabShowResult.$oldTabEl;
7107 var animated = tabShowResult.animated;
7108 var onTabsChanged = tabShowResult.onTabsChanged;
7109
7110 if ($newTabEl && $newTabEl.parents('.page').length > 0 && options.route) {
7111 var tabParentPageData = $newTabEl.parents('.page')[0].f7Page;
7112 if (tabParentPageData && options.route) {
7113 tabParentPageData.route = options.route;
7114 }
7115 }
7116
7117 // Tab Content Loaded
7118 function onTabLoaded(contentEl) {
7119 // Remove theme elements
7120 router.removeThemeElements($newTabEl);
7121
7122 var tabEventTarget = $newTabEl;
7123 if (typeof contentEl !== 'string') { tabEventTarget = $(contentEl); }
7124
7125 tabEventTarget.trigger('tab:init tab:mounted', tabRoute);
7126 router.emit('tabInit tabMounted', $newTabEl[0], tabRoute);
7127
7128 if ($oldTabEl && $oldTabEl.length) {
7129 if (animated) {
7130 onTabsChanged(function () {
7131 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7132 if (router.params.unloadTabContent) {
7133 router.tabRemove($oldTabEl, $newTabEl, tabRoute);
7134 }
7135 });
7136 } else {
7137 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7138 if (router.params.unloadTabContent) {
7139 router.tabRemove($oldTabEl, $newTabEl, tabRoute);
7140 }
7141 }
7142 }
7143 }
7144
7145 if ($newTabEl[0].f7RouterTabLoaded) {
7146 if (!$oldTabEl || !$oldTabEl.length) { return router; }
7147 if (animated) {
7148 onTabsChanged(function () {
7149 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7150 });
7151 } else {
7152 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7153 }
7154 return router;
7155 }
7156
7157 // Load Tab Content
7158 function loadTab(loadTabParams, loadTabOptions) {
7159 // Load Tab Props
7160 var url = loadTabParams.url;
7161 var content = loadTabParams.content;
7162 var el = loadTabParams.el;
7163 var template = loadTabParams.template;
7164 var templateUrl = loadTabParams.templateUrl;
7165 var component = loadTabParams.component;
7166 var componentUrl = loadTabParams.componentUrl;
7167 // Component/Template Callbacks
7168 function resolve(contentEl) {
7169 router.allowPageChange = true;
7170 if (!contentEl) { return; }
7171 if (typeof contentEl === 'string') {
7172 $newTabEl.html(contentEl);
7173 } else {
7174 $newTabEl.html('');
7175 if (contentEl.f7Component) {
7176 contentEl.f7Component.$mount(function (componentEl) {
7177 $newTabEl.append(componentEl);
7178 });
7179 } else {
7180 $newTabEl.append(contentEl);
7181 }
7182 }
7183 $newTabEl[0].f7RouterTabLoaded = true;
7184 onTabLoaded(contentEl);
7185 }
7186 function reject() {
7187 router.allowPageChange = true;
7188 return router;
7189 }
7190
7191 if (content) {
7192 resolve(content);
7193 } else if (template || templateUrl) {
7194 try {
7195 router.tabTemplateLoader(template, templateUrl, loadTabOptions, resolve, reject);
7196 } catch (err) {
7197 router.allowPageChange = true;
7198 throw err;
7199 }
7200 } else if (el) {
7201 resolve(el);
7202 } else if (component || componentUrl) {
7203 // Load from component (F7/Vue/React/...)
7204 try {
7205 router.tabComponentLoader($newTabEl[0], component, componentUrl, loadTabOptions, resolve, reject);
7206 } catch (err) {
7207 router.allowPageChange = true;
7208 throw err;
7209 }
7210 } else if (url) {
7211 // Load using XHR
7212 if (router.xhr) {
7213 router.xhr.abort();
7214 router.xhr = false;
7215 }
7216 router.xhrRequest(url, loadTabOptions)
7217 .then(function (tabContent) {
7218 resolve(tabContent);
7219 })
7220 .catch(function () {
7221 router.allowPageChange = true;
7222 });
7223 }
7224 }
7225
7226 var hasContentLoadProp;
7227 ('url content component el componentUrl template templateUrl').split(' ').forEach(function (tabLoadProp) {
7228 var obj;
7229
7230 if (tabRoute[tabLoadProp]) {
7231 hasContentLoadProp = true;
7232 loadTab(( obj = {}, obj[tabLoadProp] = tabRoute[tabLoadProp], obj ), options);
7233 }
7234 });
7235
7236 // Async
7237 function asyncResolve(resolveParams, resolveOptions) {
7238 loadTab(resolveParams, Utils.extend(options, resolveOptions));
7239 }
7240 function asyncReject() {
7241 router.allowPageChange = true;
7242 }
7243 if (tabRoute.async) {
7244 tabRoute.async.call(router, currentRoute, previousRoute, asyncResolve, asyncReject);
7245 } else if (!hasContentLoadProp) {
7246 router.allowPageChange = true;
7247 }
7248
7249 return router;
7250 }
7251 function tabRemove($oldTabEl, $newTabEl, tabRoute) {
7252 var router = this;
7253
7254 var hasTabComponentChild;
7255 if ($oldTabEl[0]) {
7256 $oldTabEl[0].f7RouterTabLoaded = false;
7257 delete $oldTabEl[0].f7RouterTabLoaded;
7258 }
7259 $oldTabEl.children().each(function (index, tabChild) {
7260 if (tabChild.f7Component) {
7261 hasTabComponentChild = true;
7262 $(tabChild).trigger('tab:beforeremove', tabRoute);
7263 tabChild.f7Component.$destroy();
7264 }
7265 });
7266 if (!hasTabComponentChild) {
7267 $oldTabEl.trigger('tab:beforeremove', tabRoute);
7268 }
7269 router.emit('tabBeforeRemove', $oldTabEl[0], $newTabEl[0], tabRoute);
7270 router.removeTabContent($oldTabEl[0], tabRoute);
7271 }
7272
7273 function modalLoad(modalType, route, loadOptions) {
7274 if ( loadOptions === void 0 ) loadOptions = {};
7275
7276 var router = this;
7277 var app = router.app;
7278 var isPanel = modalType === 'panel';
7279 var modalOrPanel = isPanel ? 'panel' : 'modal';
7280
7281 var options = Utils.extend({
7282 animate: router.params.animate,
7283 pushState: true,
7284 history: true,
7285 on: {},
7286 }, loadOptions);
7287
7288 var modalParams = Utils.extend({}, route.route[modalType]);
7289 var modalRoute = route.route;
7290
7291 function onModalLoaded() {
7292 // Create Modal
7293 var modal = app[modalType].create(modalParams);
7294 modalRoute.modalInstance = modal;
7295
7296 var hasEl = modal.el;
7297
7298 function closeOnSwipeBack() {
7299 modal.close();
7300 }
7301 modal.on((modalOrPanel + "Open"), function () {
7302 if (!hasEl) {
7303 // Remove theme elements
7304 router.removeThemeElements(modal.el);
7305
7306 // Emit events
7307 modal.$el.trigger(((modalType.toLowerCase()) + ":init " + (modalType.toLowerCase()) + ":mounted"), route, modal);
7308 router.emit(((!isPanel ? 'modalInit' : '') + " " + modalType + "Init " + modalType + "Mounted"), modal.el, route, modal);
7309 }
7310 router.once('swipeBackMove', closeOnSwipeBack);
7311 });
7312 modal.on((modalOrPanel + "Close"), function () {
7313 router.off('swipeBackMove', closeOnSwipeBack);
7314 if (!modal.closeByRouter) {
7315 router.back();
7316 }
7317 });
7318
7319 modal.on((modalOrPanel + "Closed"), function () {
7320 modal.$el.trigger(((modalType.toLowerCase()) + ":beforeremove"), route, modal);
7321 modal.emit(("" + (!isPanel ? 'modalBeforeRemove ' : '') + modalType + "BeforeRemove"), modal.el, route, modal);
7322 var modalComponent = modal.el.f7Component;
7323 if (modalComponent) {
7324 modalComponent.$destroy();
7325 }
7326 Utils.nextTick(function () {
7327 if (modalComponent || modalParams.component) {
7328 router.removeModal(modal.el);
7329 }
7330 modal.destroy();
7331 delete modal.route;
7332 delete modalRoute.modalInstance;
7333 });
7334 });
7335
7336 if (options.route) {
7337 // Update Browser History
7338 if (router.params.pushState && options.pushState) {
7339 History.push(
7340 router.view.id,
7341 {
7342 url: options.route.url,
7343 modal: modalType,
7344 },
7345 (router.params.pushStateRoot || '') + router.params.pushStateSeparator + options.route.url
7346 );
7347 }
7348
7349 // Set Route
7350 if (options.route !== router.currentRoute) {
7351 modal.route = Utils.extend(options.route, { modal: modal });
7352 router.currentRoute = modal.route;
7353 }
7354
7355 // Update Router History
7356 if (options.history) {
7357 router.history.push(options.route.url);
7358 router.saveHistory();
7359 }
7360 }
7361
7362 if (hasEl) {
7363 // Remove theme elements
7364 router.removeThemeElements(modal.el);
7365
7366 // Emit events
7367 modal.$el.trigger(((modalType.toLowerCase()) + ":init " + (modalType.toLowerCase()) + ":mounted"), route, modal);
7368 router.emit((modalOrPanel + "Init " + modalType + "Init " + modalType + "Mounted"), modal.el, route, modal);
7369 }
7370
7371 // Open
7372 modal.open();
7373 }
7374
7375 // Load Modal Content
7376 function loadModal(loadModalParams, loadModalOptions) {
7377 // Load Modal Props
7378 var url = loadModalParams.url;
7379 var content = loadModalParams.content;
7380 var template = loadModalParams.template;
7381 var templateUrl = loadModalParams.templateUrl;
7382 var component = loadModalParams.component;
7383 var componentUrl = loadModalParams.componentUrl;
7384
7385 // Component/Template Callbacks
7386 function resolve(contentEl) {
7387 if (contentEl) {
7388 if (typeof contentEl === 'string') {
7389 modalParams.content = contentEl;
7390 } else if (contentEl.f7Component) {
7391 contentEl.f7Component.$mount(function (componentEl) {
7392 modalParams.el = componentEl;
7393 app.root.append(componentEl);
7394 });
7395 } else {
7396 modalParams.el = contentEl;
7397 }
7398 onModalLoaded();
7399 }
7400 }
7401 function reject() {
7402 router.allowPageChange = true;
7403 return router;
7404 }
7405
7406 if (content) {
7407 resolve(content);
7408 } else if (template || templateUrl) {
7409 try {
7410 router.modalTemplateLoader(template, templateUrl, loadModalOptions, resolve, reject);
7411 } catch (err) {
7412 router.allowPageChange = true;
7413 throw err;
7414 }
7415 } else if (component || componentUrl) {
7416 // Load from component (F7/Vue/React/...)
7417 try {
7418 router.modalComponentLoader(app.root[0], component, componentUrl, loadModalOptions, resolve, reject);
7419 } catch (err) {
7420 router.allowPageChange = true;
7421 throw err;
7422 }
7423 } else if (url) {
7424 // Load using XHR
7425 if (router.xhr) {
7426 router.xhr.abort();
7427 router.xhr = false;
7428 }
7429 router.xhrRequest(url, loadModalOptions)
7430 .then(function (modalContent) {
7431 modalParams.content = modalContent;
7432 onModalLoaded();
7433 })
7434 .catch(function () {
7435 router.allowPageChange = true;
7436 });
7437 } else {
7438 onModalLoaded();
7439 }
7440 }
7441
7442 var foundLoadProp;
7443 ('url content component el componentUrl template templateUrl').split(' ').forEach(function (modalLoadProp) {
7444 var obj;
7445
7446 if (modalParams[modalLoadProp] && !foundLoadProp) {
7447 foundLoadProp = true;
7448 loadModal(( obj = {}, obj[modalLoadProp] = modalParams[modalLoadProp], obj ), options);
7449 }
7450 });
7451 if (!foundLoadProp && modalType === 'actions') {
7452 onModalLoaded();
7453 }
7454
7455 // Async
7456 function asyncResolve(resolveParams, resolveOptions) {
7457 loadModal(resolveParams, Utils.extend(options, resolveOptions));
7458 }
7459 function asyncReject() {
7460 router.allowPageChange = true;
7461 }
7462 if (modalParams.async) {
7463 modalParams.async.call(router, options.route, router.currentRoute, asyncResolve, asyncReject);
7464 }
7465 return router;
7466 }
7467 function modalRemove(modal) {
7468 Utils.extend(modal, { closeByRouter: true });
7469 modal.close();
7470 }
7471
7472 function backward(el, backwardOptions) {
7473 var router = this;
7474 var $el = $(el);
7475 var app = router.app;
7476 var view = router.view;
7477
7478 var options = Utils.extend({
7479 animate: router.params.animate,
7480 pushState: true,
7481 }, backwardOptions);
7482
7483 var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
7484 var isMaster = masterDetailEnabled && options.route && options.route.route && options.route.route.master === true;
7485 var masterPageEl;
7486
7487 var dynamicNavbar = router.dynamicNavbar;
7488 var separateNavbar = router.separateNavbar;
7489
7490 var $newPage = $el;
7491 var $oldPage = router.$el.children('.page-current');
7492 var currentIsMaster = masterDetailEnabled && $oldPage.hasClass('page-master');
7493
7494 if ($newPage.length) {
7495 // Remove theme elements
7496 router.removeThemeElements($newPage);
7497 }
7498
7499 var $navbarEl;
7500 var $newNavbarInner;
7501 var $oldNavbarInner;
7502
7503 if (dynamicNavbar) {
7504 $newNavbarInner = $newPage.children('.navbar').children('.navbar-inner');
7505 if (separateNavbar) {
7506 $navbarEl = router.$navbarEl;
7507 if ($newNavbarInner.length > 0) {
7508 $newPage.children('.navbar').remove();
7509 }
7510 if ($newNavbarInner.length === 0 && $newPage[0] && $newPage[0].f7Page) {
7511 // Try from pageData
7512 $newNavbarInner = $newPage[0].f7Page.$navbarEl;
7513 }
7514 $oldNavbarInner = $navbarEl.find('.navbar-current');
7515 } else {
7516 $oldNavbarInner = $oldPage.children('.navbar').children('.navbar-inner');
7517 }
7518 }
7519
7520 router.allowPageChange = false;
7521 if ($newPage.length === 0 || $oldPage.length === 0) {
7522 router.allowPageChange = true;
7523 return router;
7524 }
7525
7526 // Remove theme elements
7527 router.removeThemeElements($newPage);
7528
7529 // Save Keep Alive Cache
7530 if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
7531 options.route.route.keepAliveData = {
7532 pageEl: $el[0],
7533 };
7534 }
7535
7536 // Pages In View
7537 var isDetail;
7538 if (masterDetailEnabled) {
7539 var $pagesInView = router.$el
7540 .children('.page:not(.stacked)')
7541 .filter(function (index, pageInView) { return pageInView !== $newPage[0]; });
7542
7543 // Find Detail' master page
7544 for (var i = 0; i < $pagesInView.length; i += 1) {
7545 if (!masterPageEl
7546 && $pagesInView[i].classList.contains('page-master')
7547 ) {
7548 masterPageEl = $pagesInView[i];
7549 continue; // eslint-disable-line
7550 }
7551 }
7552
7553 isDetail = !isMaster
7554 && masterPageEl
7555 && (router.history.indexOf(options.route.url) > router.history.indexOf(masterPageEl.f7Page.route.url));
7556 }
7557
7558
7559 // New Page
7560 $newPage
7561 .addClass(("page-previous" + (isMaster ? ' page-master' : '') + (isDetail ? ' page-master-detail' : '')))
7562 .removeClass('stacked')
7563 .removeAttr('aria-hidden')
7564 .trigger('page:unstack')
7565 .trigger('page:position', { position: 'previous' });
7566 if (isMaster || isDetail) {
7567 $newPage.trigger('page:role', { role: isMaster ? 'master' : 'detail' });
7568 }
7569
7570 if (dynamicNavbar && $newNavbarInner.length > 0) {
7571 $newNavbarInner
7572 .addClass(("navbar-previous" + (isMaster ? ' navbar-master' : '') + (isDetail ? ' navbar-master-detail' : '')))
7573 .removeClass('stacked')
7574 .removeAttr('aria-hidden');
7575 }
7576
7577 // Remove previous page in case of "forced"
7578 var backIndex;
7579 if (options.force) {
7580 if ($oldPage.prev('.page-previous:not(.stacked)').length > 0 || $oldPage.prev('.page-previous').length === 0) {
7581 if (router.history.indexOf(options.route.url) >= 0) {
7582 backIndex = router.history.length - router.history.indexOf(options.route.url) - 1;
7583 router.history = router.history.slice(0, router.history.indexOf(options.route.url) + 2);
7584 view.history = router.history;
7585 } else if (router.history[[router.history.length - 2]]) {
7586 router.history[router.history.length - 2] = options.route.url;
7587 } else {
7588 router.history.unshift(router.url);
7589 }
7590
7591 if (backIndex && router.params.stackPages) {
7592 $oldPage.prevAll('.page-previous').each(function (index, pageToRemove) {
7593 var $pageToRemove = $(pageToRemove);
7594 var $navbarToRemove;
7595 if (separateNavbar) {
7596 // $navbarToRemove = $oldNavbarInner.prevAll('.navbar-previous').eq(index);
7597 $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
7598 }
7599 if ($pageToRemove[0] !== $newPage[0] && $pageToRemove.index() > $newPage.index()) {
7600 if (router.initialPages.indexOf($pageToRemove[0]) >= 0) {
7601 $pageToRemove.addClass('stacked');
7602 $pageToRemove.trigger('page:stack');
7603 if (separateNavbar) {
7604 $navbarToRemove.addClass('stacked');
7605 }
7606 } else {
7607 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
7608 router.removePage($pageToRemove);
7609 if (separateNavbar && $navbarToRemove.length > 0) {
7610 router.removeNavbar($navbarToRemove);
7611 }
7612 }
7613 }
7614 });
7615 } else {
7616 var $pageToRemove = $oldPage.prev('.page-previous:not(.stacked)');
7617 var $navbarToRemove;
7618 if (separateNavbar) {
7619 // $navbarToRemove = $oldNavbarInner.prev('.navbar-inner:not(.stacked)');
7620 $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
7621 }
7622 if (router.params.stackPages && router.initialPages.indexOf($pageToRemove[0]) >= 0) {
7623 $pageToRemove.addClass('stacked');
7624 $pageToRemove.trigger('page:stack');
7625 $navbarToRemove.addClass('stacked');
7626 } else if ($pageToRemove.length > 0) {
7627 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
7628 router.removePage($pageToRemove);
7629 if (separateNavbar && $navbarToRemove.length) {
7630 router.removeNavbar($navbarToRemove);
7631 }
7632 }
7633 }
7634 }
7635 }
7636
7637 // Insert new page
7638 var newPageInDom = $newPage.parents(doc).length > 0;
7639 var f7Component = $newPage[0].f7Component;
7640
7641 function insertPage() {
7642 if ($newPage.next($oldPage).length === 0) {
7643 if (!newPageInDom && f7Component) {
7644 f7Component.$mount(function (componentEl) {
7645 $(componentEl).insertBefore($oldPage);
7646 });
7647 } else {
7648 $newPage.insertBefore($oldPage);
7649 }
7650 }
7651 if (separateNavbar && $newNavbarInner.length) {
7652 if ($newNavbarInner.children('.title-large').length) {
7653 $newNavbarInner.addClass('navbar-inner-large');
7654 }
7655 $newNavbarInner.insertBefore($oldNavbarInner);
7656 if ($oldNavbarInner.length > 0) {
7657 $newNavbarInner.insertBefore($oldNavbarInner);
7658 } else {
7659 if (!router.$navbarEl.parents(doc).length) {
7660 router.$el.prepend(router.$navbarEl);
7661 }
7662 $navbarEl.append($newNavbarInner);
7663 }
7664 }
7665 if (!newPageInDom) {
7666 router.pageCallback('mounted', $newPage, $newNavbarInner, 'previous', 'current', options, $oldPage);
7667 } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
7668 $newPage[0].f7PageMounted = true;
7669 router.pageCallback('mounted', $newPage, $newNavbarInner, 'previous', 'current', options, $oldPage);
7670 }
7671 }
7672
7673 if (options.preload) {
7674 // Insert Page
7675 insertPage();
7676 // Tab route
7677 if (options.route.route.tab) {
7678 router.tabLoad(options.route.route.tab, Utils.extend({}, options, {
7679 history: false,
7680 pushState: false,
7681 preload: true,
7682 }));
7683 }
7684 if (isMaster) {
7685 $newPage
7686 .removeClass('page-master-stacked')
7687 .trigger('page:masterunstack');
7688 if (separateNavbar) {
7689 $(app.navbar.getElByPage($newPage)).removeClass('navbar-master-stacked');
7690 }
7691 }
7692 // Page init and before init events
7693 router.pageCallback('init', $newPage, $newNavbarInner, 'previous', 'current', options, $oldPage);
7694 var $previousPages = $newPage.prevAll('.page-previous:not(.stacked):not(.page-master)');
7695 if ($previousPages.length > 0) {
7696 $previousPages.each(function (index, pageToRemove) {
7697 var $pageToRemove = $(pageToRemove);
7698 var $navbarToRemove;
7699 if (separateNavbar) {
7700 // $navbarToRemove = $newNavbarInner.prevAll('.navbar-previous:not(.stacked)').eq(index);
7701 $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
7702 }
7703 if (router.params.stackPages && router.initialPages.indexOf(pageToRemove) >= 0) {
7704 $pageToRemove.addClass('stacked');
7705 $pageToRemove.trigger('page:stack');
7706 if (separateNavbar) {
7707 $navbarToRemove.addClass('stacked');
7708 }
7709 } else {
7710 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined);
7711 router.removePage($pageToRemove);
7712 if (separateNavbar && $navbarToRemove.length) {
7713 router.removeNavbar($navbarToRemove);
7714 }
7715 }
7716 });
7717 }
7718 router.allowPageChange = true;
7719 return router;
7720 }
7721
7722 // History State
7723 if (!(Device.ie || Device.edge || (Device.firefox && !Device.ios))) {
7724 if (router.params.pushState && options.pushState) {
7725 if (backIndex) { History.go(-backIndex); }
7726 else { History.back(); }
7727 }
7728 }
7729
7730 // Update History
7731 if (router.history.length === 1) {
7732 router.history.unshift(router.url);
7733 }
7734 router.history.pop();
7735 router.saveHistory();
7736
7737 // Current Page & Navbar
7738 router.currentPageEl = $newPage[0];
7739 if (dynamicNavbar && $newNavbarInner.length) {
7740 router.currentNavbarEl = $newNavbarInner[0];
7741 } else {
7742 delete router.currentNavbarEl;
7743 }
7744
7745 // Current Route
7746 router.currentRoute = options.route;
7747
7748 // History State
7749 if (Device.ie || Device.edge || (Device.firefox && !Device.ios)) {
7750 if (router.params.pushState && options.pushState) {
7751 if (backIndex) { History.go(-backIndex); }
7752 else { History.back(); }
7753 }
7754 }
7755
7756 // Insert Page
7757 insertPage();
7758
7759 // Load Tab
7760 if (options.route.route.tab) {
7761 router.tabLoad(options.route.route.tab, Utils.extend({}, options, {
7762 history: false,
7763 pushState: false,
7764 }));
7765 }
7766
7767 // Page init and before init events
7768 router.pageCallback('init', $newPage, $newNavbarInner, 'previous', 'current', options, $oldPage);
7769
7770 // Before animation callback
7771 router.pageCallback('beforeIn', $newPage, $newNavbarInner, 'previous', 'current', options);
7772 router.pageCallback('beforeOut', $oldPage, $oldNavbarInner, 'current', 'next', options);
7773
7774 // Animation
7775 function afterAnimation() {
7776 // Set classes
7777 var pageClasses = 'page-previous page-current page-next';
7778 var navbarClasses = 'navbar-previous navbar-current navbar-next';
7779 $newPage.removeClass(pageClasses).addClass('page-current').removeAttr('aria-hidden').trigger('page:position', { position: 'current' });
7780 $oldPage.removeClass(pageClasses).addClass('page-next').attr('aria-hidden', 'true').trigger('page:position', { position: 'next' });
7781 if (dynamicNavbar) {
7782 $newNavbarInner.removeClass(navbarClasses).addClass('navbar-current').removeAttr('aria-hidden');
7783 $oldNavbarInner.removeClass(navbarClasses).addClass('navbar-next').attr('aria-hidden', 'true');
7784 }
7785
7786 // After animation event
7787 router.pageCallback('afterIn', $newPage, $newNavbarInner, 'previous', 'current', options);
7788 router.pageCallback('afterOut', $oldPage, $oldNavbarInner, 'current', 'next', options);
7789
7790 // Remove Old Page
7791 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
7792 $oldPage.addClass('stacked');
7793 $oldPage.trigger('page:stack');
7794 if (separateNavbar) {
7795 $oldNavbarInner.addClass('stacked');
7796 }
7797 } else {
7798 router.pageCallback('beforeRemove', $oldPage, $oldNavbarInner, 'next', undefined, options);
7799 router.removePage($oldPage);
7800 if (separateNavbar && $oldNavbarInner.length) {
7801 router.removeNavbar($oldNavbarInner);
7802 }
7803 }
7804
7805 router.allowPageChange = true;
7806 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7807
7808 // Preload previous page
7809 var preloadPreviousPage = router.params.preloadPreviousPage || (app.theme.ios ? router.params.iosSwipeBack : router.params.mdSwipeBack);
7810 if (preloadPreviousPage && router.history[router.history.length - 2] && !isMaster) {
7811 router.back(router.history[router.history.length - 2], { preload: true });
7812 }
7813 if (router.params.pushState) {
7814 History.clearRouterQueue();
7815 }
7816 }
7817
7818 function setPositionClasses() {
7819 var pageClasses = 'page-previous page-current page-next';
7820 var navbarClasses = 'navbar-previous navbar-current navbar-next';
7821 $oldPage.removeClass(pageClasses).addClass('page-current').trigger('page:position', { position: 'current' });
7822 $newPage.removeClass(pageClasses).addClass('page-previous').removeAttr('aria-hidden').trigger('page:position', { position: 'previous' });
7823 if (dynamicNavbar) {
7824 $oldNavbarInner.removeClass(navbarClasses).addClass('navbar-current');
7825 $newNavbarInner.removeClass(navbarClasses).addClass('navbar-previous').removeAttr('aria-hidden');
7826 }
7827 }
7828
7829 if (options.animate && !(currentIsMaster && app.width >= router.params.masterDetailBreakpoint)) {
7830 setPositionClasses();
7831 router.animate($oldPage, $newPage, $oldNavbarInner, $newNavbarInner, 'backward', function () {
7832 afterAnimation();
7833 });
7834 } else {
7835 afterAnimation();
7836 }
7837
7838 return router;
7839 }
7840 function loadBack(backParams, backOptions, ignorePageChange) {
7841 var router = this;
7842
7843 if (!router.allowPageChange && !ignorePageChange) { return router; }
7844 var params = backParams;
7845 var options = backOptions;
7846 var url = params.url;
7847 var content = params.content;
7848 var el = params.el;
7849 var pageName = params.pageName;
7850 var template = params.template;
7851 var templateUrl = params.templateUrl;
7852 var component = params.component;
7853 var componentUrl = params.componentUrl;
7854
7855 if (
7856 options.route.url
7857 && router.url === options.route.url
7858 && !(options.reloadCurrent || options.reloadPrevious)
7859 && !router.params.allowDuplicateUrls
7860 ) {
7861 return false;
7862 }
7863
7864 if (!options.route && url) {
7865 options.route = router.parseRouteUrl(url);
7866 }
7867
7868 // Component Callbacks
7869 function resolve(pageEl, newOptions) {
7870 return router.backward(pageEl, Utils.extend(options, newOptions));
7871 }
7872 function reject() {
7873 router.allowPageChange = true;
7874 return router;
7875 }
7876
7877 if (url || templateUrl || componentUrl) {
7878 router.allowPageChange = false;
7879 }
7880
7881 // Proceed
7882 if (content) {
7883 router.backward(router.getPageEl(content), options);
7884 } else if (template || templateUrl) {
7885 // Parse template and send page element
7886 try {
7887 router.pageTemplateLoader(template, templateUrl, options, resolve, reject);
7888 } catch (err) {
7889 router.allowPageChange = true;
7890 throw err;
7891 }
7892 } else if (el) {
7893 // Load page from specified HTMLElement or by page name in pages container
7894 router.backward(router.getPageEl(el), options);
7895 } else if (pageName) {
7896 // Load page by page name in pages container
7897 router.backward(router.$el.children((".page[data-name=\"" + pageName + "\"]")).eq(0), options);
7898 } else if (component || componentUrl) {
7899 // Load from component (F7/Vue/React/...)
7900 try {
7901 router.pageComponentLoader(router.el, component, componentUrl, options, resolve, reject);
7902 } catch (err) {
7903 router.allowPageChange = true;
7904 throw err;
7905 }
7906 } else if (url) {
7907 // Load using XHR
7908 if (router.xhr) {
7909 router.xhr.abort();
7910 router.xhr = false;
7911 }
7912 router.xhrRequest(url, options)
7913 .then(function (pageContent) {
7914 router.backward(router.getPageEl(pageContent), options);
7915 })
7916 .catch(function () {
7917 router.allowPageChange = true;
7918 });
7919 }
7920 return router;
7921 }
7922 function back() {
7923 var args = [], len = arguments.length;
7924 while ( len-- ) args[ len ] = arguments[ len ];
7925
7926 var router = this;
7927 if (router.swipeBackActive) { return router; }
7928 var navigateUrl;
7929 var navigateOptions;
7930 var route;
7931 if (typeof args[0] === 'object') {
7932 navigateOptions = args[0] || {};
7933 } else {
7934 navigateUrl = args[0];
7935 navigateOptions = args[1] || {};
7936 }
7937
7938 var name = navigateOptions.name;
7939 var params = navigateOptions.params;
7940 var query = navigateOptions.query;
7941 if (name) {
7942 // find route by name
7943 route = router.findRouteByKey('name', name);
7944 if (!route) {
7945 throw new Error(("Framework7: route with name \"" + name + "\" not found"));
7946 }
7947 navigateUrl = router.constructRouteUrl(route, { params: params, query: query });
7948 if (navigateUrl) {
7949 return router.back(navigateUrl, Utils.extend({}, navigateOptions, {
7950 name: null,
7951 params: null,
7952 query: null,
7953 }));
7954 }
7955 throw new Error(("Framework7: can't construct URL for route with name \"" + name + "\""));
7956 }
7957
7958 var app = router.app;
7959 appRouterCheck(router, 'back');
7960
7961 var currentRouteIsModal = router.currentRoute.modal;
7962 var modalType;
7963 if (!currentRouteIsModal) {
7964 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
7965 if (router.currentRoute.route[modalLoadProp]) {
7966 currentRouteIsModal = true;
7967 modalType = modalLoadProp;
7968 }
7969 });
7970 }
7971 if (currentRouteIsModal) {
7972 var modalToClose = router.currentRoute.modal
7973 || router.currentRoute.route.modalInstance
7974 || app[modalType].get();
7975 var previousUrl = router.history[router.history.length - 2];
7976 var previousRoute;
7977 // check if previous route is modal too
7978 if (modalToClose && modalToClose.$el) {
7979 var prevOpenedModals = modalToClose.$el.prevAll('.modal-in');
7980 if (prevOpenedModals.length && prevOpenedModals[0].f7Modal) {
7981 previousRoute = prevOpenedModals[0].f7Modal.route;
7982 }
7983 }
7984 if (!previousRoute) {
7985 previousRoute = router.findMatchingRoute(previousUrl);
7986 }
7987
7988 if (!previousRoute && previousUrl) {
7989 previousRoute = {
7990 url: previousUrl,
7991 path: previousUrl.split('?')[0],
7992 query: Utils.parseUrlQuery(previousUrl),
7993 route: {
7994 path: previousUrl.split('?')[0],
7995 url: previousUrl,
7996 },
7997 };
7998 }
7999 if (!navigateUrl || navigateUrl.replace(/[# ]/g, '').trim().length === 0) {
8000 if (!previousRoute || !modalToClose) {
8001 return router;
8002 }
8003 }
8004 var forceOtherUrl = navigateOptions.force && previousRoute && navigateUrl;
8005 if (previousRoute && modalToClose) {
8006 if (router.params.pushState && navigateOptions.pushState !== false) {
8007 History.back();
8008 }
8009 router.currentRoute = previousRoute;
8010 router.history.pop();
8011 router.saveHistory();
8012 router.modalRemove(modalToClose);
8013 if (forceOtherUrl) {
8014 router.navigate(navigateUrl, { reloadCurrent: true });
8015 }
8016 } else if (modalToClose) {
8017 router.modalRemove(modalToClose);
8018 if (navigateUrl) {
8019 router.navigate(navigateUrl, { reloadCurrent: true });
8020 }
8021 }
8022 return router;
8023 }
8024 var $previousPage = router.$el.children('.page-current').prevAll('.page-previous:not(.page-master)').eq(0);
8025
8026 var skipMaster;
8027 if (router.params.masterDetailBreakpoint > 0) {
8028 var $previousMaster = router.$el.children('.page-current').prevAll('.page-master').eq(0);
8029 if ($previousMaster.length) {
8030 var expectedPreviousPageUrl = router.history[router.history.length - 2];
8031 var expectedPreviousPageRoute = router.findMatchingRoute(expectedPreviousPageUrl);
8032 if (expectedPreviousPageRoute && expectedPreviousPageRoute.route === $previousMaster[0].f7Page.route.route) {
8033 $previousPage = $previousMaster;
8034 if (!navigateOptions.preload) {
8035 skipMaster = app.width >= router.params.masterDetailBreakpoint;
8036 }
8037 }
8038 }
8039 }
8040 if (!navigateOptions.force && $previousPage.length && !skipMaster) {
8041 if (router.params.pushState
8042 && $previousPage[0].f7Page
8043 && router.history[router.history.length - 2] !== $previousPage[0].f7Page.route.url
8044 ) {
8045 router.back(
8046 router.history[router.history.length - 2],
8047 Utils.extend(navigateOptions, { force: true })
8048 );
8049 return router;
8050 }
8051 var previousPageRoute = $previousPage[0].f7Page.route;
8052
8053 processRouteQueue.call(
8054 router,
8055 previousPageRoute,
8056 router.currentRoute,
8057 function () {
8058 router.loadBack({ el: $previousPage }, Utils.extend(navigateOptions, {
8059 route: previousPageRoute,
8060 }));
8061 },
8062 function () {}
8063 );
8064
8065 return router;
8066 }
8067
8068 // Navigate URL
8069 if (navigateUrl === '#') {
8070 navigateUrl = undefined;
8071 }
8072 if (navigateUrl && navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
8073 navigateUrl = ((router.path || '/') + navigateUrl).replace('//', '/');
8074 }
8075 if (!navigateUrl && router.history.length > 1) {
8076 navigateUrl = router.history[router.history.length - 2];
8077 }
8078 if (skipMaster && !navigateOptions.force && router.history[router.history.length - 3]) {
8079 return router.back(router.history[router.history.length - 3], Utils.extend({}, navigateOptions || {}, {
8080 force: true,
8081 animate: false,
8082 }));
8083 }
8084 if (skipMaster && !navigateOptions.force) {
8085 return router;
8086 }
8087
8088 // Find route to load
8089 route = router.findMatchingRoute(navigateUrl);
8090 if (!route) {
8091 if (navigateUrl) {
8092 route = {
8093 url: navigateUrl,
8094 path: navigateUrl.split('?')[0],
8095 query: Utils.parseUrlQuery(navigateUrl),
8096 route: {
8097 path: navigateUrl.split('?')[0],
8098 url: navigateUrl,
8099 },
8100 };
8101 }
8102 }
8103 if (!route) {
8104 return router;
8105 }
8106
8107 if (route.route.redirect) {
8108 return redirect.call(router, 'back', route, navigateOptions);
8109 }
8110
8111 var options = {};
8112 if (route.route.options) {
8113 Utils.extend(options, route.route.options, navigateOptions);
8114 } else {
8115 Utils.extend(options, navigateOptions);
8116 }
8117 options.route = route;
8118
8119 if (options && options.context) {
8120 route.context = options.context;
8121 options.route.context = options.context;
8122 }
8123
8124 var backForceLoaded;
8125 if (options.force && router.params.stackPages) {
8126 router.$el.children('.page-previous.stacked').each(function (index, pageEl) {
8127 if (pageEl.f7Page && pageEl.f7Page.route && pageEl.f7Page.route.url === route.url) {
8128 backForceLoaded = true;
8129 router.loadBack({ el: pageEl }, options);
8130 }
8131 });
8132 if (backForceLoaded) {
8133 return router;
8134 }
8135 }
8136 function resolve() {
8137 var routerLoaded = false;
8138 if (route.route.keepAlive && route.route.keepAliveData) {
8139 router.loadBack({ el: route.route.keepAliveData.pageEl }, options);
8140 routerLoaded = true;
8141 }
8142 ('url content component pageName el componentUrl template templateUrl').split(' ').forEach(function (pageLoadProp) {
8143 var obj;
8144
8145 if (route.route[pageLoadProp] && !routerLoaded) {
8146 routerLoaded = true;
8147 router.loadBack(( obj = {}, obj[pageLoadProp] = route.route[pageLoadProp], obj ), options);
8148 }
8149 });
8150 if (routerLoaded) { return; }
8151 // Async
8152 function asyncResolve(resolveParams, resolveOptions) {
8153 router.allowPageChange = false;
8154 if (resolveOptions && resolveOptions.context) {
8155 if (!route.context) { route.context = resolveOptions.context; }
8156 else { route.context = Utils.extend({}, route.context, resolveOptions.context); }
8157 options.route.context = route.context;
8158 }
8159 router.loadBack(resolveParams, Utils.extend(options, resolveOptions), true);
8160 }
8161 function asyncReject() {
8162 router.allowPageChange = true;
8163 }
8164 if (route.route.async) {
8165 router.allowPageChange = false;
8166
8167 route.route.async.call(router, route, router.currentRoute, asyncResolve, asyncReject);
8168 }
8169 }
8170 function reject() {
8171 router.allowPageChange = true;
8172 }
8173
8174 if (options.preload) {
8175 resolve();
8176 } else {
8177 processRouteQueue.call(
8178 router,
8179 route,
8180 router.currentRoute,
8181 function () {
8182 if (route.route.modules) {
8183 app
8184 .loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules])
8185 .then(function () {
8186 resolve();
8187 })
8188 .catch(function () {
8189 reject();
8190 });
8191 } else {
8192 resolve();
8193 }
8194 },
8195 function () {
8196 reject();
8197 }
8198 );
8199 }
8200
8201 // Return Router
8202 return router;
8203 }
8204
8205 function clearPreviousPages() {
8206 var router = this;
8207 appRouterCheck(router, 'clearPreviousPages');
8208 var app = router.app;
8209 var separateNavbar = router.separateNavbar;
8210
8211 var $pagesToRemove = router.$el
8212 .children('.page')
8213 .filter(function (index, pageInView) {
8214 if (router.currentRoute && (router.currentRoute.modal || router.currentRoute.panel)) { return true; }
8215 return pageInView !== router.currentPageEl;
8216 });
8217
8218 $pagesToRemove.each(function (index, pageEl) {
8219 var $oldPageEl = $(pageEl);
8220 var $oldNavbarInnerEl = $(app.navbar.getElByPage($oldPageEl));
8221 if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
8222 $oldPageEl.addClass('stacked');
8223 if (separateNavbar) {
8224 $oldNavbarInnerEl.addClass('stacked');
8225 }
8226 } else {
8227 // Page remove event
8228 router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarInnerEl, 'previous', undefined, {});
8229 router.removePage($oldPageEl);
8230 if (separateNavbar && $oldNavbarInnerEl.length) {
8231 router.removeNavbar($oldNavbarInnerEl);
8232 }
8233 }
8234 });
8235 }
8236
8237 function clearPreviousHistory() {
8238 var router = this;
8239 appRouterCheck(router, 'clearPreviousHistory');
8240 var url = router.history[router.history.length - 1];
8241
8242 router.clearPreviousPages();
8243
8244 router.history = [url];
8245 router.view.history = [url];
8246 router.saveHistory();
8247 }
8248
8249 var Router = /*@__PURE__*/(function (Framework7Class$$1) {
8250 function Router(app, view) {
8251 Framework7Class$$1.call(this, {}, [typeof view === 'undefined' ? app : view]);
8252 var router = this;
8253
8254 // Is App Router
8255 router.isAppRouter = typeof view === 'undefined';
8256
8257 if (router.isAppRouter) {
8258 // App Router
8259 Utils.extend(false, router, {
8260 app: app,
8261 params: app.params.view,
8262 routes: app.routes || [],
8263 cache: app.cache,
8264 });
8265 } else {
8266 // View Router
8267 Utils.extend(false, router, {
8268 app: app,
8269 view: view,
8270 viewId: view.id,
8271 params: view.params,
8272 routes: view.routes,
8273 $el: view.$el,
8274 el: view.el,
8275 $navbarEl: view.$navbarEl,
8276 navbarEl: view.navbarEl,
8277 history: view.history,
8278 scrollHistory: view.scrollHistory,
8279 cache: app.cache,
8280 dynamicNavbar: app.theme === 'ios' && view.params.iosDynamicNavbar,
8281 separateNavbar: app.theme === 'ios' && view.params.iosDynamicNavbar && view.params.iosSeparateDynamicNavbar,
8282 initialPages: [],
8283 initialNavbars: [],
8284 });
8285 }
8286
8287 // Install Modules
8288 router.useModules();
8289
8290 // Temporary Dom
8291 router.tempDom = doc.createElement('div');
8292
8293 // AllowPageChage
8294 router.allowPageChange = true;
8295
8296 // Current Route
8297 var currentRoute = {};
8298 var previousRoute = {};
8299 Object.defineProperty(router, 'currentRoute', {
8300 enumerable: true,
8301 configurable: true,
8302 set: function set(newRoute) {
8303 if ( newRoute === void 0 ) newRoute = {};
8304
8305 previousRoute = Utils.extend({}, currentRoute);
8306 currentRoute = newRoute;
8307 if (!currentRoute) { return; }
8308 router.url = currentRoute.url;
8309 router.emit('routeChange', newRoute, previousRoute, router);
8310 },
8311 get: function get() {
8312 return currentRoute;
8313 },
8314 });
8315 Object.defineProperty(router, 'previousRoute', {
8316 enumerable: true,
8317 configurable: true,
8318 get: function get() {
8319 return previousRoute;
8320 },
8321 set: function set(newRoute) {
8322 previousRoute = newRoute;
8323 },
8324 });
8325
8326 return router;
8327 }
8328
8329 if ( Framework7Class$$1 ) Router.__proto__ = Framework7Class$$1;
8330 Router.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
8331 Router.prototype.constructor = Router;
8332
8333 Router.prototype.animatableNavElements = function animatableNavElements (newNavbarInner, oldNavbarInner, toLarge, fromLarge, direction) {
8334 var router = this;
8335 var dynamicNavbar = router.dynamicNavbar;
8336 var separateNavbar = router.separateNavbar;
8337 var animateIcon = router.params.iosAnimateNavbarBackIcon;
8338
8339 var newNavEls;
8340 var oldNavEls;
8341 function animatableNavEl($el, navbarInner) {
8342 var isSliding = $el.hasClass('sliding') || navbarInner.hasClass('sliding');
8343 var isSubnavbar = $el.hasClass('subnavbar');
8344 var needsOpacityTransition = isSliding ? !isSubnavbar : true;
8345 var $iconEl = $el.find('.back .icon');
8346 var isIconLabel;
8347 if (isSliding && animateIcon && $el.hasClass('left') && $iconEl.length > 0 && $iconEl.next('span').length) {
8348 $el = $iconEl.next('span'); // eslint-disable-line
8349 isIconLabel = true;
8350 }
8351 return {
8352 $el: $el,
8353 isIconLabel: isIconLabel,
8354 leftOffset: $el[0].f7NavbarLeftOffset,
8355 rightOffset: $el[0].f7NavbarRightOffset,
8356 isSliding: isSliding,
8357 isSubnavbar: isSubnavbar,
8358 needsOpacityTransition: needsOpacityTransition,
8359 };
8360 }
8361 if (dynamicNavbar) {
8362 newNavEls = [];
8363 oldNavEls = [];
8364 newNavbarInner.children('.left, .right, .title, .subnavbar').each(function (index, navEl) {
8365 var $navEl = $(navEl);
8366 if ($navEl.hasClass('left') && fromLarge && direction === 'forward' && separateNavbar) { return; }
8367 if ($navEl.hasClass('title') && toLarge) { return; }
8368 newNavEls.push(animatableNavEl($navEl, newNavbarInner));
8369 });
8370 if (!(oldNavbarInner.hasClass('navbar-master') && router.params.masterDetailBreakpoint > 0 && router.app.width >= router.params.masterDetailBreakpoint)) {
8371 oldNavbarInner.children('.left, .right, .title, .subnavbar').each(function (index, navEl) {
8372 var $navEl = $(navEl);
8373 if ($navEl.hasClass('left') && toLarge && !fromLarge && direction === 'forward' && separateNavbar) { return; }
8374 if ($navEl.hasClass('left') && toLarge && direction === 'backward' && separateNavbar) { return; }
8375 if ($navEl.hasClass('title') && fromLarge) {
8376 return;
8377 }
8378 oldNavEls.push(animatableNavEl($navEl, oldNavbarInner));
8379 });
8380 }
8381 [oldNavEls, newNavEls].forEach(function (navEls) {
8382 navEls.forEach(function (navEl) {
8383 var n = navEl;
8384 var isSliding = navEl.isSliding;
8385 var $el = navEl.$el;
8386 var otherEls = navEls === oldNavEls ? newNavEls : oldNavEls;
8387 if (!(isSliding && $el.hasClass('title') && otherEls)) { return; }
8388 otherEls.forEach(function (otherNavEl) {
8389 if (otherNavEl.isIconLabel) {
8390 var iconTextEl = otherNavEl.$el[0];
8391 n.leftOffset += iconTextEl ? (iconTextEl.offsetLeft || 0) : 0;
8392 }
8393 });
8394 });
8395 });
8396 }
8397
8398 return { newNavEls: newNavEls, oldNavEls: oldNavEls };
8399 };
8400
8401 Router.prototype.animate = function animate (oldPage, newPage, oldNavbarInner, newNavbarInner, direction, callback) {
8402 var router = this;
8403 if (router.params.animateCustom) {
8404 router.params.animateCustom.apply(router, [oldPage, newPage, oldNavbarInner, newNavbarInner, direction, callback]);
8405 return;
8406 }
8407 var dynamicNavbar = router.dynamicNavbar;
8408 var ios = router.app.theme === 'ios';
8409 // Router Animation class
8410 var routerTransitionClass = "router-transition-" + direction + " router-transition";
8411
8412 var newNavEls;
8413 var oldNavEls;
8414
8415 var fromLarge;
8416 var toLarge;
8417
8418 var oldIsLarge;
8419 var newIsLarge;
8420
8421 if (ios && dynamicNavbar) {
8422 oldIsLarge = oldNavbarInner && oldNavbarInner.hasClass('navbar-inner-large');
8423 newIsLarge = newNavbarInner && newNavbarInner.hasClass('navbar-inner-large');
8424 fromLarge = oldIsLarge && !oldNavbarInner.hasClass('navbar-inner-large-collapsed');
8425 toLarge = newIsLarge && !newNavbarInner.hasClass('navbar-inner-large-collapsed');
8426 var navEls = router.animatableNavElements(newNavbarInner, oldNavbarInner, toLarge, fromLarge, direction);
8427 newNavEls = navEls.newNavEls;
8428 oldNavEls = navEls.oldNavEls;
8429 }
8430
8431 function animateNavbars(progress) {
8432 if (!(ios && dynamicNavbar)) { return; }
8433 if (progress === 1) {
8434 if (toLarge) {
8435 newNavbarInner.addClass('router-navbar-transition-to-large');
8436 oldNavbarInner.addClass('router-navbar-transition-to-large');
8437 }
8438 if (fromLarge) {
8439 newNavbarInner.addClass('router-navbar-transition-from-large');
8440 oldNavbarInner.addClass('router-navbar-transition-from-large');
8441 }
8442 }
8443 newNavEls.forEach(function (navEl) {
8444 var $el = navEl.$el;
8445 var offset = direction === 'forward' ? navEl.rightOffset : navEl.leftOffset;
8446 if (navEl.isSliding) {
8447 if (navEl.isSubnavbar && newIsLarge) {
8448 $el[0].style.setProperty('transform', ("translate3d(" + (offset * (1 - progress)) + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)"), 'important');
8449 } else {
8450 $el.transform(("translate3d(" + (offset * (1 - progress)) + "px,0,0)"));
8451 }
8452 }
8453 });
8454 oldNavEls.forEach(function (navEl) {
8455 var $el = navEl.$el;
8456 var offset = direction === 'forward' ? navEl.leftOffset : navEl.rightOffset;
8457 if (navEl.isSliding) {
8458 if (navEl.isSubnavbar && oldIsLarge) {
8459 $el.transform(("translate3d(" + (offset * (progress)) + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)"));
8460 } else {
8461 $el.transform(("translate3d(" + (offset * (progress)) + "px,0,0)"));
8462 }
8463 }
8464 });
8465 }
8466
8467 // AnimationEnd Callback
8468 function onDone() {
8469 if (router.dynamicNavbar) {
8470 if (newNavbarInner) {
8471 newNavbarInner.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
8472 newNavbarInner.addClass('navbar-no-title-large-transition');
8473 Utils.nextFrame(function () {
8474 newNavbarInner.removeClass('navbar-no-title-large-transition');
8475 });
8476 }
8477 if (oldNavbarInner) {
8478 oldNavbarInner.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
8479 }
8480 if (newNavbarInner.hasClass('sliding')) {
8481 newNavbarInner.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
8482 } else {
8483 newNavbarInner.find('.sliding').transform('');
8484 }
8485 if (oldNavbarInner.hasClass('sliding')) {
8486 oldNavbarInner.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
8487 } else {
8488 oldNavbarInner.find('.sliding').transform('');
8489 }
8490 }
8491 router.$el.removeClass(routerTransitionClass);
8492 if (callback) { callback(); }
8493 }
8494
8495 (direction === 'forward' ? newPage : oldPage).animationEnd(function () {
8496 onDone();
8497 });
8498
8499 // Animate
8500 if (dynamicNavbar) {
8501 // Prepare Navbars
8502 animateNavbars(0);
8503 Utils.nextFrame(function () {
8504 // Add class, start animation
8505 animateNavbars(1);
8506 router.$el.addClass(routerTransitionClass);
8507 });
8508 } else {
8509 // Add class, start animation
8510 router.$el.addClass(routerTransitionClass);
8511 }
8512 };
8513
8514 Router.prototype.removeModal = function removeModal (modalEl) {
8515 var router = this;
8516 router.removeEl(modalEl);
8517 };
8518 // eslint-disable-next-line
8519 Router.prototype.removeTabContent = function removeTabContent (tabEl) {
8520 var $tabEl = $(tabEl);
8521 $tabEl.html('');
8522 };
8523
8524 Router.prototype.removeNavbar = function removeNavbar (el) {
8525 var router = this;
8526 router.removeEl(el);
8527 };
8528
8529 Router.prototype.removePage = function removePage (el) {
8530 var $el = $(el);
8531 var f7Page = $el && $el[0] && $el[0].f7Page;
8532 var router = this;
8533 if (f7Page && f7Page.route && f7Page.route.route && f7Page.route.route.keepAlive) {
8534 $el.remove();
8535 return;
8536 }
8537 router.removeEl(el);
8538 };
8539
8540 Router.prototype.removeEl = function removeEl (el) {
8541 if (!el) { return; }
8542 var router = this;
8543 var $el = $(el);
8544 if ($el.length === 0) { return; }
8545 $el.find('.tab').each(function (tabIndex, tabEl) {
8546 $(tabEl).children().each(function (index, tabChild) {
8547 if (tabChild.f7Component) {
8548 $(tabChild).trigger('tab:beforeremove');
8549 tabChild.f7Component.$destroy();
8550 }
8551 });
8552 });
8553 if ($el[0].f7Component && $el[0].f7Component.$destroy) {
8554 $el[0].f7Component.$destroy();
8555 }
8556 if (!router.params.removeElements) {
8557 return;
8558 }
8559 if (router.params.removeElementsWithTimeout) {
8560 setTimeout(function () {
8561 $el.remove();
8562 }, router.params.removeElementsTimeout);
8563 } else {
8564 $el.remove();
8565 }
8566 };
8567
8568 Router.prototype.getPageEl = function getPageEl (content) {
8569 var router = this;
8570 if (typeof content === 'string') {
8571 router.tempDom.innerHTML = content;
8572 } else {
8573 if ($(content).hasClass('page')) {
8574 return content;
8575 }
8576 router.tempDom.innerHTML = '';
8577 $(router.tempDom).append(content);
8578 }
8579
8580 return router.findElement('.page', router.tempDom);
8581 };
8582
8583 Router.prototype.findElement = function findElement (stringSelector, container, notStacked) {
8584 var router = this;
8585 var view = router.view;
8586 var app = router.app;
8587
8588 // Modals Selector
8589 var modalsSelector = '.popup, .dialog, .popover, .actions-modal, .sheet-modal, .login-screen, .page';
8590
8591 var $container = $(container);
8592 var selector = stringSelector;
8593 if (notStacked) { selector += ':not(.stacked)'; }
8594
8595 var found = $container
8596 .find(selector)
8597 .filter(function (index, el) { return $(el).parents(modalsSelector).length === 0; });
8598
8599 if (found.length > 1) {
8600 if (typeof view.selector === 'string') {
8601 // Search in related view
8602 found = $container.find(((view.selector) + " " + selector));
8603 }
8604 if (found.length > 1) {
8605 // Search in main view
8606 found = $container.find(("." + (app.params.viewMainClass) + " " + selector));
8607 }
8608 }
8609 if (found.length === 1) { return found; }
8610
8611 // Try to find not stacked
8612 if (!notStacked) { found = router.findElement(selector, $container, true); }
8613 if (found && found.length === 1) { return found; }
8614 if (found && found.length > 1) { return $(found[0]); }
8615 return undefined;
8616 };
8617
8618 Router.prototype.flattenRoutes = function flattenRoutes (routes) {
8619 if ( routes === void 0 ) routes = this.routes;
8620
8621 var router = this;
8622 var flattenedRoutes = [];
8623 routes.forEach(function (route) {
8624 var hasTabRoutes = false;
8625 if ('tabs' in route && route.tabs) {
8626 var mergedPathsRoutes = route.tabs.map(function (tabRoute) {
8627 var tRoute = Utils.extend({}, route, {
8628 path: (((route.path) + "/" + (tabRoute.path))).replace('///', '/').replace('//', '/'),
8629 parentPath: route.path,
8630 tab: tabRoute,
8631 });
8632 delete tRoute.tabs;
8633 delete tRoute.routes;
8634 return tRoute;
8635 });
8636 hasTabRoutes = true;
8637 flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(mergedPathsRoutes));
8638 }
8639 if ('detailRoutes' in route) {
8640 var mergedPathsRoutes$1 = route.detailRoutes.map(function (detailRoute) {
8641 var dRoute = Utils.extend({}, detailRoute);
8642 dRoute.masterRoute = route;
8643 dRoute.masterRoutePath = route.path;
8644 return dRoute;
8645 });
8646 flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(mergedPathsRoutes$1));
8647 }
8648 if ('routes' in route) {
8649 var mergedPathsRoutes$2 = route.routes.map(function (childRoute) {
8650 var cRoute = Utils.extend({}, childRoute);
8651 cRoute.path = (((route.path) + "/" + (cRoute.path))).replace('///', '/').replace('//', '/');
8652 return cRoute;
8653 });
8654 if (hasTabRoutes) {
8655 flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(mergedPathsRoutes$2));
8656 } else {
8657 flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(mergedPathsRoutes$2));
8658 }
8659 }
8660 if (!('routes' in route) && !('tabs' in route && route.tabs) && !('detailRoutes' in route)) {
8661 flattenedRoutes.push(route);
8662 }
8663 });
8664 return flattenedRoutes;
8665 };
8666
8667 // eslint-disable-next-line
8668 Router.prototype.parseRouteUrl = function parseRouteUrl (url) {
8669 if (!url) { return {}; }
8670 var query = Utils.parseUrlQuery(url);
8671 var hash = url.split('#')[1];
8672 var params = {};
8673 var path = url.split('#')[0].split('?')[0];
8674 return {
8675 query: query,
8676 hash: hash,
8677 params: params,
8678 url: url,
8679 path: path,
8680 };
8681 };
8682
8683 // eslint-disable-next-line
8684 Router.prototype.constructRouteUrl = function constructRouteUrl (route, ref) {
8685 if ( ref === void 0 ) ref = {};
8686 var params = ref.params;
8687 var query = ref.query;
8688
8689 var path = route.path;
8690 var toUrl = pathToRegexp_1.compile(path);
8691 var url;
8692 try {
8693 url = toUrl(params || {});
8694 } catch (error) {
8695 throw new Error(("Framework7: error constructing route URL from passed params:\nRoute: " + path + "\n" + (error.toString())));
8696 }
8697
8698 if (query) {
8699 if (typeof query === 'string') { url += "?" + query; }
8700 else { url += "?" + (Utils.serializeObject(query)); }
8701 }
8702
8703 return url;
8704 };
8705
8706 Router.prototype.findTabRoute = function findTabRoute (tabEl) {
8707 var router = this;
8708 var $tabEl = $(tabEl);
8709 var parentPath = router.currentRoute.route.parentPath;
8710 var tabId = $tabEl.attr('id');
8711 var flattenedRoutes = router.flattenRoutes(router.routes);
8712 var foundTabRoute;
8713 flattenedRoutes.forEach(function (route) {
8714 if (
8715 route.parentPath === parentPath
8716 && route.tab
8717 && route.tab.id === tabId
8718 ) {
8719 foundTabRoute = route;
8720 }
8721 });
8722 return foundTabRoute;
8723 };
8724
8725 Router.prototype.findRouteByKey = function findRouteByKey (key, value) {
8726 var router = this;
8727 var routes = router.routes;
8728 var flattenedRoutes = router.flattenRoutes(routes);
8729 var matchingRoute;
8730
8731 flattenedRoutes.forEach(function (route) {
8732 if (matchingRoute) { return; }
8733 if (route[key] === value) {
8734 matchingRoute = route;
8735 }
8736 });
8737 return matchingRoute;
8738 };
8739
8740 Router.prototype.findMatchingRoute = function findMatchingRoute (url) {
8741 if (!url) { return undefined; }
8742 var router = this;
8743 var routes = router.routes;
8744 var flattenedRoutes = router.flattenRoutes(routes);
8745 var ref = router.parseRouteUrl(url);
8746 var path = ref.path;
8747 var query = ref.query;
8748 var hash = ref.hash;
8749 var params = ref.params;
8750 var matchingRoute;
8751 flattenedRoutes.forEach(function (route) {
8752 if (matchingRoute) { return; }
8753 var keys = [];
8754
8755 var pathsToMatch = [route.path];
8756 if (route.alias) {
8757 if (typeof route.alias === 'string') { pathsToMatch.push(route.alias); }
8758 else if (Array.isArray(route.alias)) {
8759 route.alias.forEach(function (aliasPath) {
8760 pathsToMatch.push(aliasPath);
8761 });
8762 }
8763 }
8764
8765 var matched;
8766 pathsToMatch.forEach(function (pathToMatch) {
8767 if (matched) { return; }
8768 matched = pathToRegexp_1(pathToMatch, keys).exec(path);
8769 });
8770
8771 if (matched) {
8772 keys.forEach(function (keyObj, index) {
8773 if (typeof keyObj.name === 'number') { return; }
8774 var paramValue = matched[index + 1];
8775 params[keyObj.name] = paramValue;
8776 });
8777
8778 var parentPath;
8779 if (route.parentPath) {
8780 parentPath = path.split('/').slice(0, route.parentPath.split('/').length - 1).join('/');
8781 }
8782
8783 matchingRoute = {
8784 query: query,
8785 hash: hash,
8786 params: params,
8787 url: url,
8788 path: path,
8789 parentPath: parentPath,
8790 route: route,
8791 name: route.name,
8792 };
8793 }
8794 });
8795 return matchingRoute;
8796 };
8797
8798 // eslint-disable-next-line
8799 Router.prototype.replaceRequestUrlParams = function replaceRequestUrlParams (url, options) {
8800 if ( url === void 0 ) url = '';
8801 if ( options === void 0 ) options = {};
8802
8803 var compiledUrl = url;
8804 if (typeof compiledUrl === 'string'
8805 && compiledUrl.indexOf('{{') >= 0
8806 && options
8807 && options.route
8808 && options.route.params
8809 && Object.keys(options.route.params).length
8810 ) {
8811 Object.keys(options.route.params).forEach(function (paramName) {
8812 var regExp = new RegExp(("{{" + paramName + "}}"), 'g');
8813 compiledUrl = compiledUrl.replace(regExp, options.route.params[paramName] || '');
8814 });
8815 }
8816 return compiledUrl;
8817 };
8818
8819 Router.prototype.removeFromXhrCache = function removeFromXhrCache (url) {
8820 var router = this;
8821 var xhrCache = router.cache.xhr;
8822 var index = false;
8823 for (var i = 0; i < xhrCache.length; i += 1) {
8824 if (xhrCache[i].url === url) { index = i; }
8825 }
8826 if (index !== false) { xhrCache.splice(index, 1); }
8827 };
8828
8829 Router.prototype.xhrRequest = function xhrRequest (requestUrl, options) {
8830 var router = this;
8831 var params = router.params;
8832 var ignoreCache = options.ignoreCache;
8833 var url = requestUrl;
8834
8835 var hasQuery = url.indexOf('?') >= 0;
8836 if (params.passRouteQueryToRequest
8837 && options
8838 && options.route
8839 && options.route.query
8840 && Object.keys(options.route.query).length
8841 ) {
8842 url += "" + (hasQuery ? '&' : '?') + (Utils.serializeObject(options.route.query));
8843 hasQuery = true;
8844 }
8845
8846 if (params.passRouteParamsToRequest
8847 && options
8848 && options.route
8849 && options.route.params
8850 && Object.keys(options.route.params).length
8851 ) {
8852 url += "" + (hasQuery ? '&' : '?') + (Utils.serializeObject(options.route.params));
8853 hasQuery = true;
8854 }
8855
8856 if (url.indexOf('{{') >= 0) {
8857 url = router.replaceRequestUrlParams(url, options);
8858 }
8859 // should we ignore get params or not
8860 if (params.xhrCacheIgnoreGetParameters && url.indexOf('?') >= 0) {
8861 url = url.split('?')[0];
8862 }
8863 return new Promise(function (resolve, reject) {
8864 if (params.xhrCache && !ignoreCache && url.indexOf('nocache') < 0 && params.xhrCacheIgnore.indexOf(url) < 0) {
8865 for (var i = 0; i < router.cache.xhr.length; i += 1) {
8866 var cachedUrl = router.cache.xhr[i];
8867 if (cachedUrl.url === url) {
8868 // Check expiration
8869 if (Utils.now() - cachedUrl.time < params.xhrCacheDuration) {
8870 // Load from cache
8871 resolve(cachedUrl.content);
8872 return;
8873 }
8874 }
8875 }
8876 }
8877 router.xhr = router.app.request({
8878 url: url,
8879 method: 'GET',
8880 beforeSend: function beforeSend(xhr) {
8881 router.emit('routerAjaxStart', xhr, options);
8882 },
8883 complete: function complete(xhr, status) {
8884 router.emit('routerAjaxComplete', xhr);
8885 if ((status !== 'error' && status !== 'timeout' && (xhr.status >= 200 && xhr.status < 300)) || xhr.status === 0) {
8886 if (params.xhrCache && xhr.responseText !== '') {
8887 router.removeFromXhrCache(url);
8888 router.cache.xhr.push({
8889 url: url,
8890 time: Utils.now(),
8891 content: xhr.responseText,
8892 });
8893 }
8894 router.emit('routerAjaxSuccess', xhr, options);
8895 resolve(xhr.responseText);
8896 } else {
8897 router.emit('routerAjaxError', xhr, options);
8898 reject(xhr);
8899 }
8900 },
8901 error: function error(xhr) {
8902 router.emit('routerAjaxError', xhr, options);
8903 reject(xhr);
8904 },
8905 });
8906 });
8907 };
8908
8909 // Remove theme elements
8910 Router.prototype.removeThemeElements = function removeThemeElements (el) {
8911 var router = this;
8912 var theme = router.app.theme;
8913 $(el).find(("." + (theme === 'md' ? 'ios' : 'md') + "-only, .if-" + (theme === 'md' ? 'ios' : 'md'))).remove();
8914 };
8915
8916 Router.prototype.getPageData = function getPageData (pageEl, navbarEl, from, to, route, pageFromEl) {
8917 if ( route === void 0 ) route = {};
8918
8919 var router = this;
8920 var $pageEl = $(pageEl).eq(0);
8921 var $navbarEl = $(navbarEl).eq(0);
8922 var currentPage = $pageEl[0].f7Page || {};
8923 var direction;
8924 var pageFrom;
8925 if ((from === 'next' && to === 'current') || (from === 'current' && to === 'previous')) { direction = 'forward'; }
8926 if ((from === 'current' && to === 'next') || (from === 'previous' && to === 'current')) { direction = 'backward'; }
8927 if (currentPage && !currentPage.fromPage) {
8928 var $pageFromEl = $(pageFromEl);
8929 if ($pageFromEl.length) {
8930 pageFrom = $pageFromEl[0].f7Page;
8931 }
8932 }
8933 pageFrom = currentPage.pageFrom || pageFrom;
8934 if (pageFrom && pageFrom.pageFrom) {
8935 pageFrom.pageFrom = null;
8936 }
8937 var page = {
8938 app: router.app,
8939 view: router.view,
8940 router: router,
8941 $el: $pageEl,
8942 el: $pageEl[0],
8943 $pageEl: $pageEl,
8944 pageEl: $pageEl[0],
8945 $navbarEl: $navbarEl,
8946 navbarEl: $navbarEl[0],
8947 name: $pageEl.attr('data-name'),
8948 position: from,
8949 from: from,
8950 to: to,
8951 direction: direction,
8952 route: currentPage.route ? currentPage.route : route,
8953 pageFrom: pageFrom,
8954 };
8955
8956 $pageEl[0].f7Page = page;
8957 return page;
8958 };
8959
8960 // Callbacks
8961 Router.prototype.pageCallback = function pageCallback (callback, pageEl, navbarEl, from, to, options, pageFromEl) {
8962 if ( options === void 0 ) options = {};
8963
8964 if (!pageEl) { return; }
8965 var router = this;
8966 var $pageEl = $(pageEl);
8967 if (!$pageEl.length) { return; }
8968 var $navbarEl = $(navbarEl);
8969 var route = options.route;
8970 var restoreScrollTopOnBack = router.params.restoreScrollTopOnBack
8971 && !(
8972 router.params.masterDetailBreakpoint > 0
8973 && $pageEl.hasClass('page-master')
8974 && router.app.width >= router.params.masterDetailBreakpoint
8975 );
8976 var keepAlive = $pageEl[0].f7Page && $pageEl[0].f7Page.route && $pageEl[0].f7Page.route.route && $pageEl[0].f7Page.route.route.keepAlive;
8977
8978 if (callback === 'beforeRemove' && keepAlive) {
8979 callback = 'beforeUnmount'; // eslint-disable-line
8980 }
8981
8982 var camelName = "page" + (callback[0].toUpperCase() + callback.slice(1, callback.length));
8983 var colonName = "page:" + (callback.toLowerCase());
8984
8985 var page = {};
8986 if (callback === 'beforeRemove' && $pageEl[0].f7Page) {
8987 page = Utils.extend($pageEl[0].f7Page, { from: from, to: to, position: from });
8988 } else {
8989 page = router.getPageData($pageEl[0], $navbarEl[0], from, to, route, pageFromEl);
8990 }
8991 page.swipeBack = !!options.swipeBack;
8992
8993 var ref = options.route ? options.route.route : {};
8994 var on = ref.on; if ( on === void 0 ) on = {};
8995 var once = ref.once; if ( once === void 0 ) once = {};
8996 if (options.on) {
8997 Utils.extend(on, options.on);
8998 }
8999 if (options.once) {
9000 Utils.extend(once, options.once);
9001 }
9002
9003 function attachEvents() {
9004 if ($pageEl[0].f7RouteEventsAttached) { return; }
9005 $pageEl[0].f7RouteEventsAttached = true;
9006 if (on && Object.keys(on).length > 0) {
9007 $pageEl[0].f7RouteEventsOn = on;
9008 Object.keys(on).forEach(function (eventName) {
9009 on[eventName] = on[eventName].bind(router);
9010 $pageEl.on(Utils.eventNameToColonCase(eventName), on[eventName]);
9011 });
9012 }
9013 if (once && Object.keys(once).length > 0) {
9014 $pageEl[0].f7RouteEventsOnce = once;
9015 Object.keys(once).forEach(function (eventName) {
9016 once[eventName] = once[eventName].bind(router);
9017 $pageEl.once(Utils.eventNameToColonCase(eventName), once[eventName]);
9018 });
9019 }
9020 }
9021
9022 function detachEvents() {
9023 if (!$pageEl[0].f7RouteEventsAttached) { return; }
9024 if ($pageEl[0].f7RouteEventsOn) {
9025 Object.keys($pageEl[0].f7RouteEventsOn).forEach(function (eventName) {
9026 $pageEl.off(Utils.eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOn[eventName]);
9027 });
9028 }
9029 if ($pageEl[0].f7RouteEventsOnce) {
9030 Object.keys($pageEl[0].f7RouteEventsOnce).forEach(function (eventName) {
9031 $pageEl.off(Utils.eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOnce[eventName]);
9032 });
9033 }
9034 $pageEl[0].f7RouteEventsAttached = null;
9035 $pageEl[0].f7RouteEventsOn = null;
9036 $pageEl[0].f7RouteEventsOnce = null;
9037 delete $pageEl[0].f7RouteEventsAttached;
9038 delete $pageEl[0].f7RouteEventsOn;
9039 delete $pageEl[0].f7RouteEventsOnce;
9040 }
9041
9042 if (callback === 'mounted') {
9043 attachEvents();
9044 }
9045 if (callback === 'init') {
9046 if (restoreScrollTopOnBack && (from === 'previous' || !from) && to === 'current' && router.scrollHistory[page.route.url] && !$pageEl.hasClass('no-restore-scroll')) {
9047 var $pageContent = $pageEl.find('.page-content');
9048 if ($pageContent.length > 0) {
9049 // eslint-disable-next-line
9050 $pageContent = $pageContent.filter(function (pageContentIndex, pageContentEl) {
9051 return (
9052 $(pageContentEl).parents('.tab:not(.tab-active)').length === 0
9053 && !$(pageContentEl).is('.tab:not(.tab-active)')
9054 );
9055 });
9056 }
9057 $pageContent.scrollTop(router.scrollHistory[page.route.url]);
9058 }
9059 attachEvents();
9060 if ($pageEl[0].f7PageInitialized) {
9061 $pageEl.trigger('page:reinit', page);
9062 router.emit('pageReinit', page);
9063 return;
9064 }
9065 $pageEl[0].f7PageInitialized = true;
9066 }
9067 if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'previous') {
9068 // Save scroll position
9069 var $pageContent$1 = $pageEl.find('.page-content');
9070 if ($pageContent$1.length > 0) {
9071 // eslint-disable-next-line
9072 $pageContent$1 = $pageContent$1.filter(function (pageContentIndex, pageContentEl) {
9073 return (
9074 $(pageContentEl).parents('.tab:not(.tab-active)').length === 0
9075 && !$(pageContentEl).is('.tab:not(.tab-active)')
9076 );
9077 });
9078 }
9079 router.scrollHistory[page.route.url] = $pageContent$1.scrollTop();
9080 }
9081 if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'next') {
9082 // Delete scroll position
9083 delete router.scrollHistory[page.route.url];
9084 }
9085
9086 $pageEl.trigger(colonName, page);
9087 router.emit(camelName, page);
9088
9089 if (callback === 'beforeRemove' || callback === 'beforeUnmount') {
9090 detachEvents();
9091 if (!keepAlive) {
9092 if ($pageEl[0].f7Page && $pageEl[0].f7Page.navbarEl) {
9093 delete $pageEl[0].f7Page.navbarEl.f7Page;
9094 }
9095 $pageEl[0].f7Page = null;
9096 }
9097 }
9098 };
9099
9100 Router.prototype.saveHistory = function saveHistory () {
9101 var router = this;
9102 router.view.history = router.history;
9103 if (router.params.pushState) {
9104 win.localStorage[("f7router-" + (router.view.id) + "-history")] = JSON.stringify(router.history);
9105 }
9106 };
9107
9108 Router.prototype.restoreHistory = function restoreHistory () {
9109 var router = this;
9110 if (router.params.pushState && win.localStorage[("f7router-" + (router.view.id) + "-history")]) {
9111 router.history = JSON.parse(win.localStorage[("f7router-" + (router.view.id) + "-history")]);
9112 router.view.history = router.history;
9113 }
9114 };
9115
9116 Router.prototype.clearHistory = function clearHistory () {
9117 var router = this;
9118 router.history = [];
9119 if (router.view) { router.view.history = []; }
9120 router.saveHistory();
9121 };
9122
9123 Router.prototype.updateCurrentUrl = function updateCurrentUrl (newUrl) {
9124 var router = this;
9125 appRouterCheck(router, 'updateCurrentUrl');
9126 // Update history
9127 if (router.history.length) {
9128 router.history[router.history.length - 1] = newUrl;
9129 } else {
9130 router.history.push(newUrl);
9131 }
9132
9133 // Update current route params
9134 var ref = router.parseRouteUrl(newUrl);
9135 var query = ref.query;
9136 var hash = ref.hash;
9137 var params = ref.params;
9138 var url = ref.url;
9139 var path = ref.path;
9140 if (router.currentRoute) {
9141 Utils.extend(router.currentRoute, {
9142 query: query,
9143 hash: hash,
9144 params: params,
9145 url: url,
9146 path: path,
9147 });
9148 }
9149
9150 if (router.params.pushState) {
9151 var pushStateRoot = router.params.pushStateRoot || '';
9152 History.replace(
9153 router.view.id,
9154 {
9155 url: newUrl,
9156 },
9157 pushStateRoot + router.params.pushStateSeparator + newUrl
9158 );
9159 }
9160
9161 // Save History
9162 router.saveHistory();
9163
9164 router.emit('routeUrlUpdate', router.currentRoute, router);
9165 };
9166
9167 Router.prototype.init = function init () {
9168 var router = this;
9169 var app = router.app;
9170 var view = router.view;
9171
9172 // Init Swipeback
9173 {
9174 if (
9175 (view && router.params.iosSwipeBack && app.theme === 'ios')
9176 || (view && router.params.mdSwipeBack && app.theme === 'md')
9177 ) {
9178 SwipeBack(router);
9179 }
9180 }
9181
9182 // Dynamic not separated navbbar
9183 if (router.dynamicNavbar && !router.separateNavbar) {
9184 router.$el.addClass('router-dynamic-navbar-inside');
9185 }
9186
9187 var initUrl = router.params.url;
9188 var documentUrl = doc.location.href.split(doc.location.origin)[1];
9189 var historyRestored;
9190 var ref = router.params;
9191 var pushState = ref.pushState;
9192 var pushStateOnLoad = ref.pushStateOnLoad;
9193 var pushStateSeparator = ref.pushStateSeparator;
9194 var pushStateAnimateOnLoad = ref.pushStateAnimateOnLoad;
9195 var ref$1 = router.params;
9196 var pushStateRoot = ref$1.pushStateRoot;
9197 if (win.cordova && pushState && !pushStateSeparator && !pushStateRoot && doc.location.pathname.indexOf('index.html')) {
9198 // eslint-disable-next-line
9199 console.warn('Framework7: wrong or not complete pushState configuration, trying to guess pushStateRoot');
9200 pushStateRoot = doc.location.pathname.split('index.html')[0];
9201 }
9202
9203 if (!pushState || !pushStateOnLoad) {
9204 if (!initUrl) {
9205 initUrl = documentUrl;
9206 }
9207 if (doc.location.search && initUrl.indexOf('?') < 0) {
9208 initUrl += doc.location.search;
9209 }
9210 if (doc.location.hash && initUrl.indexOf('#') < 0) {
9211 initUrl += doc.location.hash;
9212 }
9213 } else {
9214 if (pushStateRoot && documentUrl.indexOf(pushStateRoot) >= 0) {
9215 documentUrl = documentUrl.split(pushStateRoot)[1];
9216 if (documentUrl === '') { documentUrl = '/'; }
9217 }
9218 if (pushStateSeparator.length > 0 && documentUrl.indexOf(pushStateSeparator) >= 0) {
9219 initUrl = documentUrl.split(pushStateSeparator)[1];
9220 } else {
9221 initUrl = documentUrl;
9222 }
9223 router.restoreHistory();
9224 if (router.history.indexOf(initUrl) >= 0) {
9225 router.history = router.history.slice(0, router.history.indexOf(initUrl) + 1);
9226 } else if (router.params.url === initUrl) {
9227 router.history = [initUrl];
9228 } else if (History.state && History.state[view.id] && History.state[view.id].url === router.history[router.history.length - 1]) {
9229 initUrl = router.history[router.history.length - 1];
9230 } else {
9231 router.history = [documentUrl.split(pushStateSeparator)[0] || '/', initUrl];
9232 }
9233 if (router.history.length > 1) {
9234 historyRestored = true;
9235 } else {
9236 router.history = [];
9237 }
9238 router.saveHistory();
9239 }
9240 var currentRoute;
9241 if (router.history.length > 1) {
9242 // Will load page
9243 currentRoute = router.findMatchingRoute(router.history[0]);
9244 if (!currentRoute) {
9245 currentRoute = Utils.extend(router.parseRouteUrl(router.history[0]), {
9246 route: {
9247 url: router.history[0],
9248 path: router.history[0].split('?')[0],
9249 },
9250 });
9251 }
9252 } else {
9253 // Don't load page
9254 currentRoute = router.findMatchingRoute(initUrl);
9255 if (!currentRoute) {
9256 currentRoute = Utils.extend(router.parseRouteUrl(initUrl), {
9257 route: {
9258 url: initUrl,
9259 path: initUrl.split('?')[0],
9260 },
9261 });
9262 }
9263 }
9264
9265 if (router.params.stackPages) {
9266 router.$el.children('.page').each(function (index, pageEl) {
9267 var $pageEl = $(pageEl);
9268 router.initialPages.push($pageEl[0]);
9269 if (router.separateNavbar && $pageEl.children('.navbar').length > 0) {
9270 router.initialNavbars.push($pageEl.children('.navbar').find('.navbar-inner')[0]);
9271 }
9272 });
9273 }
9274
9275 if (router.$el.children('.page:not(.stacked)').length === 0 && initUrl) {
9276 // No pages presented in DOM, reload new page
9277 router.navigate(initUrl, {
9278 initial: true,
9279 reloadCurrent: true,
9280 pushState: false,
9281 });
9282 } else {
9283 // Init current DOM page
9284 var hasTabRoute;
9285 router.currentRoute = currentRoute;
9286 router.$el.children('.page:not(.stacked)').each(function (index, pageEl) {
9287 var $pageEl = $(pageEl);
9288 var $navbarInnerEl;
9289 $pageEl.addClass('page-current');
9290 if (router.separateNavbar) {
9291 $navbarInnerEl = $pageEl.children('.navbar').children('.navbar-inner');
9292 if ($navbarInnerEl.length > 0) {
9293 if (!router.$navbarEl.parents(doc).length) {
9294 router.$el.prepend(router.$navbarEl);
9295 }
9296 $navbarInnerEl.addClass('navbar-current');
9297 router.$navbarEl.append($navbarInnerEl);
9298 if ($navbarInnerEl.children('.title-large').length) {
9299 $navbarInnerEl.addClass('navbar-inner-large');
9300 }
9301 $pageEl.children('.navbar').remove();
9302 } else {
9303 router.$navbarEl.addClass('navbar-hidden');
9304 if ($navbarInnerEl.children('.title-large').length) {
9305 router.$navbarEl.addClass('navbar-hidden navbar-large-hidden');
9306 }
9307 }
9308 }
9309 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route.master && router.params.masterDetailBreakpoint > 0) {
9310 $pageEl.addClass('page-master');
9311 $pageEl.trigger('page:role', { role: 'master' });
9312 if ($navbarInnerEl && $navbarInnerEl.length) {
9313 $navbarInnerEl.addClass('navbar-master');
9314 }
9315 }
9316 var initOptions = {
9317 route: router.currentRoute,
9318 };
9319 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route.options) {
9320 Utils.extend(initOptions, router.currentRoute.route.options);
9321 }
9322 router.currentPageEl = $pageEl[0];
9323 if (router.separateNavbar && $navbarInnerEl.length) {
9324 router.currentNavbarEl = $navbarInnerEl[0];
9325 }
9326 router.removeThemeElements($pageEl);
9327 if (router.separateNavbar && $navbarInnerEl.length) {
9328 router.removeThemeElements($navbarInnerEl);
9329 }
9330 if (initOptions.route.route.tab) {
9331 hasTabRoute = true;
9332 router.tabLoad(initOptions.route.route.tab, Utils.extend({}, initOptions));
9333 }
9334 router.pageCallback('init', $pageEl, $navbarInnerEl, 'current', undefined, initOptions);
9335 });
9336 if (historyRestored) {
9337 router.navigate(initUrl, {
9338 initial: true,
9339 pushState: false,
9340 history: false,
9341 animate: pushStateAnimateOnLoad,
9342 once: {
9343 pageAfterIn: function pageAfterIn() {
9344 if (router.history.length > 2) {
9345 router.back({ preload: true });
9346 }
9347 },
9348 },
9349 });
9350 }
9351 if (!historyRestored && !hasTabRoute) {
9352 router.history.push(initUrl);
9353 router.saveHistory();
9354 }
9355 }
9356 if (initUrl && pushState && pushStateOnLoad && (!History.state || !History.state[view.id])) {
9357 History.initViewState(view.id, {
9358 url: initUrl,
9359 });
9360 }
9361 router.emit('local::init routerInit', router);
9362 };
9363
9364 Router.prototype.destroy = function destroy () {
9365 var router = this;
9366
9367 router.emit('local::destroy routerDestroy', router);
9368
9369 // Delete props & methods
9370 Object.keys(router).forEach(function (routerProp) {
9371 router[routerProp] = null;
9372 delete router[routerProp];
9373 });
9374
9375 router = null;
9376 };
9377
9378 return Router;
9379 }(Framework7Class));
9380
9381 // Load
9382 Router.prototype.forward = forward;
9383 Router.prototype.load = load;
9384 Router.prototype.navigate = navigate;
9385 Router.prototype.refreshPage = refreshPage;
9386 // Tab
9387 Router.prototype.tabLoad = tabLoad;
9388 Router.prototype.tabRemove = tabRemove;
9389 // Modal
9390 Router.prototype.modalLoad = modalLoad;
9391 Router.prototype.modalRemove = modalRemove;
9392 // Back
9393 Router.prototype.backward = backward;
9394 Router.prototype.loadBack = loadBack;
9395 Router.prototype.back = back;
9396 // Clear previoius pages from the DOM
9397 Router.prototype.clearPreviousPages = clearPreviousPages;
9398 // Clear history
9399 Router.prototype.clearPreviousHistory = clearPreviousHistory;
9400
9401 var Router$1 = {
9402 name: 'router',
9403 static: {
9404 Router: Router,
9405 },
9406 instance: {
9407 cache: {
9408 xhr: [],
9409 templates: [],
9410 components: [],
9411 },
9412 },
9413 create: function create() {
9414 var instance = this;
9415 if (instance.app) {
9416 // View Router
9417 if (instance.params.router) {
9418 instance.router = new Router(instance.app, instance);
9419 }
9420 } else {
9421 // App Router
9422 instance.router = new Router(instance);
9423 }
9424 },
9425 };
9426
9427 var View = /*@__PURE__*/(function (Framework7Class$$1) {
9428 function View(appInstance, el, viewParams) {
9429 if ( viewParams === void 0 ) viewParams = {};
9430
9431 Framework7Class$$1.call(this, viewParams, [appInstance]);
9432
9433 var app = appInstance;
9434 var $el = $(el);
9435 var view = this;
9436
9437 var defaults = {
9438 routes: [],
9439 routesAdd: [],
9440 };
9441
9442 // Default View params
9443 view.params = Utils.extend(defaults, app.params.view, viewParams);
9444
9445 // Routes
9446 if (view.params.routes.length > 0) {
9447 view.routes = view.params.routes;
9448 } else {
9449 view.routes = [].concat(app.routes, view.params.routesAdd);
9450 }
9451
9452 // Selector
9453 var selector;
9454 if (typeof el === 'string') { selector = el; }
9455 else {
9456 // Supposed to be HTMLElement or Dom7
9457 selector = ($el.attr('id') ? ("#" + ($el.attr('id'))) : '') + ($el.attr('class') ? ("." + ($el.attr('class').replace(/ /g, '.').replace('.active', ''))) : '');
9458 }
9459
9460 // DynamicNavbar
9461 var $navbarEl;
9462 if (app.theme === 'ios' && view.params.iosDynamicNavbar && view.params.iosSeparateDynamicNavbar) {
9463 $navbarEl = $el.children('.navbar').eq(0);
9464 if ($navbarEl.length === 0) {
9465 $navbarEl = $('<div class="navbar"></div>');
9466 }
9467 }
9468
9469 // View Props
9470 Utils.extend(false, view, {
9471 app: app,
9472 $el: $el,
9473 el: $el[0],
9474 name: view.params.name,
9475 main: view.params.main || $el.hasClass('view-main'),
9476 $navbarEl: $navbarEl,
9477 navbarEl: $navbarEl ? $navbarEl[0] : undefined,
9478 selector: selector,
9479 history: [],
9480 scrollHistory: {},
9481 });
9482
9483 // Save in DOM
9484 $el[0].f7View = view;
9485
9486 // Install Modules
9487 view.useModules();
9488
9489 // Add to app
9490 app.views.push(view);
9491 if (view.main) {
9492 app.views.main = view;
9493 }
9494 if (view.name) {
9495 app.views[view.name] = view;
9496 }
9497
9498 // Index
9499 view.index = app.views.indexOf(view);
9500
9501 // View ID
9502 var viewId;
9503 if (view.name) {
9504 viewId = "view_" + (view.name);
9505 } else if (view.main) {
9506 viewId = 'view_main';
9507 } else {
9508 viewId = "view_" + (view.index);
9509 }
9510 view.id = viewId;
9511
9512 // Init View
9513 if (app.initialized) {
9514 view.init();
9515 } else {
9516 app.on('init', function () {
9517 view.init();
9518 });
9519 }
9520
9521 return view;
9522 }
9523
9524 if ( Framework7Class$$1 ) View.__proto__ = Framework7Class$$1;
9525 View.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
9526 View.prototype.constructor = View;
9527
9528 View.prototype.destroy = function destroy () {
9529 var view = this;
9530 var app = view.app;
9531
9532 view.$el.trigger('view:beforedestroy', view);
9533 view.emit('local::beforeDestroy viewBeforeDestroy', view);
9534
9535 app.off('resize', view.checkmasterDetailBreakpoint);
9536
9537 if (view.main) {
9538 app.views.main = null;
9539 delete app.views.main;
9540 } else if (view.name) {
9541 app.views[view.name] = null;
9542 delete app.views[view.name];
9543 }
9544 view.$el[0].f7View = null;
9545 delete view.$el[0].f7View;
9546
9547 app.views.splice(app.views.indexOf(view), 1);
9548
9549 // Destroy Router
9550 if (view.params.router && view.router) {
9551 view.router.destroy();
9552 }
9553
9554 view.emit('local::destroy viewDestroy', view);
9555
9556 // Delete props & methods
9557 Object.keys(view).forEach(function (viewProp) {
9558 view[viewProp] = null;
9559 delete view[viewProp];
9560 });
9561
9562 view = null;
9563 };
9564
9565 View.prototype.checkmasterDetailBreakpoint = function checkmasterDetailBreakpoint () {
9566 var view = this;
9567 var app = view.app;
9568 var wasMasterDetail = view.$el.hasClass('view-master-detail');
9569 if (app.width >= view.params.masterDetailBreakpoint) {
9570 view.$el.addClass('view-master-detail');
9571 if (!wasMasterDetail) {
9572 view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint');
9573 view.$el.trigger('view:masterDetailBreakpoint', view);
9574 }
9575 } else {
9576 view.$el.removeClass('view-master-detail');
9577 if (wasMasterDetail) {
9578 view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint');
9579 view.$el.trigger('view:masterDetailBreakpoint', view);
9580 }
9581 }
9582 };
9583
9584 View.prototype.initMasterDetail = function initMasterDetail () {
9585 var view = this;
9586 var app = view.app;
9587 view.checkmasterDetailBreakpoint = view.checkmasterDetailBreakpoint.bind(view);
9588 view.checkmasterDetailBreakpoint();
9589 app.on('resize', view.checkmasterDetailBreakpoint);
9590 };
9591
9592 View.prototype.init = function init () {
9593 var view = this;
9594 if (view.params.router) {
9595 if (view.params.masterDetailBreakpoint > 0) {
9596 view.initMasterDetail();
9597 }
9598 view.router.init();
9599 view.$el.trigger('view:init', view);
9600 view.emit('local::init viewInit', view);
9601 }
9602 };
9603
9604 return View;
9605 }(Framework7Class));
9606
9607 // Use Router
9608 View.use(Router$1);
9609
9610 function initClicks(app) {
9611 function handleClicks(e) {
9612 var $clickedEl = $(e.target);
9613 var $clickedLinkEl = $clickedEl.closest('a');
9614 var isLink = $clickedLinkEl.length > 0;
9615 var url = isLink && $clickedLinkEl.attr('href');
9616 var isTabLink = isLink && $clickedLinkEl.hasClass('tab-link') && ($clickedLinkEl.attr('data-tab') || (url && url.indexOf('#') === 0));
9617
9618 // Check if link is external
9619 if (isLink) {
9620 // eslint-disable-next-line
9621 if ($clickedLinkEl.is(app.params.clicks.externalLinks) || (url && url.indexOf('javascript:') >= 0)) {
9622 var target = $clickedLinkEl.attr('target');
9623 if (
9624 url
9625 && win.cordova
9626 && win.cordova.InAppBrowser
9627 && (target === '_system' || target === '_blank')
9628 ) {
9629 e.preventDefault();
9630 win.cordova.InAppBrowser.open(url, target);
9631 }
9632 return;
9633 }
9634 }
9635
9636 // Modules Clicks
9637 Object.keys(app.modules).forEach(function (moduleName) {
9638 var moduleClicks = app.modules[moduleName].clicks;
9639 if (!moduleClicks) { return; }
9640 Object.keys(moduleClicks).forEach(function (clickSelector) {
9641 var matchingClickedElement = $clickedEl.closest(clickSelector).eq(0);
9642 if (matchingClickedElement.length > 0) {
9643 moduleClicks[clickSelector].call(app, matchingClickedElement, matchingClickedElement.dataset(), e);
9644 }
9645 });
9646 });
9647
9648
9649 // Load Page
9650 var clickedLinkData = {};
9651 if (isLink) {
9652 e.preventDefault();
9653 clickedLinkData = $clickedLinkEl.dataset();
9654 }
9655
9656 // Prevent Router
9657 if ($clickedLinkEl.hasClass('prevent-router') || $clickedLinkEl.hasClass('router-prevent')) { return; }
9658
9659 var validUrl = url && url.length > 0 && url !== '#' && !isTabLink;
9660 if (validUrl || $clickedLinkEl.hasClass('back')) {
9661 var view;
9662 if (clickedLinkData.view) {
9663 view = $(clickedLinkData.view)[0].f7View;
9664 } else {
9665 view = $clickedEl.parents('.view')[0] && $clickedEl.parents('.view')[0].f7View;
9666 if (!$clickedLinkEl.hasClass('back') && view && view.params.linksView) {
9667 if (typeof view.params.linksView === 'string') { view = $(view.params.linksView)[0].f7View; }
9668 else if (view.params.linksView instanceof View) { view = view.params.linksView; }
9669 }
9670 }
9671 if (!view) {
9672 if (app.views.main) { view = app.views.main; }
9673 }
9674 if (!view || !view.router) { return; }
9675 if (clickedLinkData.context && typeof clickedLinkData.context === 'string') {
9676 try {
9677 clickedLinkData.context = JSON.parse(clickedLinkData.context);
9678 } catch (err) {
9679 // something wrong there
9680 }
9681 }
9682 if ($clickedLinkEl[0].f7RouteProps) {
9683 clickedLinkData.props = $clickedLinkEl[0].f7RouteProps;
9684 }
9685 if ($clickedLinkEl.hasClass('back')) { view.router.back(url, clickedLinkData); }
9686 else { view.router.navigate(url, clickedLinkData); }
9687 }
9688 }
9689
9690 app.on('click', handleClicks);
9691
9692 // TODO: check if need this in iOS
9693 // Prevent scrolling on overlays
9694 // function preventScrolling(e) {
9695 // e.preventDefault();
9696 // }
9697 // if (Support.touch && !Device.android) {
9698 // const activeListener = Support.passiveListener ? { passive: false, capture: false } : false;
9699 // $(document).on((app.params.touch.fastClicks ? 'touchstart' : 'touchmove'), '.panel-backdrop, .dialog-backdrop, .preloader-backdrop, .popup-backdrop, .searchbar-backdrop', preventScrolling, activeListener);
9700 // }
9701 }
9702 var ClicksModule = {
9703 name: 'clicks',
9704 params: {
9705 clicks: {
9706 // External Links
9707 externalLinks: '.external',
9708 },
9709 },
9710 on: {
9711 init: function init() {
9712 var app = this;
9713 initClicks(app);
9714 },
9715 },
9716 };
9717
9718 var RouterTemplateLoaderModule = {
9719 name: 'routerTemplateLoader',
9720 proto: {
9721 templateLoader: function templateLoader(template, templateUrl, options, resolve, reject) {
9722 var router = this;
9723 function compile(t) {
9724 var compiledHtml;
9725 var context;
9726 try {
9727 context = options.context || {};
9728 if (typeof context === 'function') { context = context.call(router); }
9729 else if (typeof context === 'string') {
9730 try {
9731 context = JSON.parse(context);
9732 } catch (err) {
9733 reject();
9734 throw (err);
9735 }
9736 }
9737 if (typeof t === 'function') {
9738 compiledHtml = t(context);
9739 } else {
9740 compiledHtml = Template7.compile(t)(Utils.extend({}, context || {}, {
9741 $app: router.app,
9742 $root: Utils.extend({}, router.app.data, router.app.methods),
9743 $route: options.route,
9744 $f7route: options.route,
9745 $router: router,
9746 $f7router: router,
9747 $theme: {
9748 ios: router.app.theme === 'ios',
9749 md: router.app.theme === 'md',
9750 },
9751 }));
9752 }
9753 } catch (err) {
9754 reject();
9755 throw (err);
9756 }
9757 resolve(compiledHtml, { context: context });
9758 }
9759 if (templateUrl) {
9760 // Load via XHR
9761 if (router.xhr) {
9762 router.xhr.abort();
9763 router.xhr = false;
9764 }
9765 router
9766 .xhrRequest(templateUrl, options)
9767 .then(function (templateContent) {
9768 compile(templateContent);
9769 })
9770 .catch(function () {
9771 reject();
9772 });
9773 } else {
9774 compile(template);
9775 }
9776 },
9777
9778 modalTemplateLoader: function modalTemplateLoader(template, templateUrl, options, resolve, reject) {
9779 var router = this;
9780 return router.templateLoader(template, templateUrl, options, function (html) {
9781 resolve(html);
9782 }, reject);
9783 },
9784
9785 tabTemplateLoader: function tabTemplateLoader(template, templateUrl, options, resolve, reject) {
9786 var router = this;
9787 return router.templateLoader(template, templateUrl, options, function (html) {
9788 resolve(html);
9789 }, reject);
9790 },
9791
9792 pageTemplateLoader: function pageTemplateLoader(template, templateUrl, options, resolve, reject) {
9793 var router = this;
9794 return router.templateLoader(template, templateUrl, options, function (html, newOptions) {
9795 if ( newOptions === void 0 ) newOptions = {};
9796
9797 resolve(router.getPageEl(html), newOptions);
9798 }, reject);
9799 },
9800 },
9801 };
9802
9803 var RouterComponentLoaderModule = {
9804 name: 'routerComponentLoader',
9805 proto: {
9806 componentLoader: function componentLoader(component, componentUrl, options, resolve, reject) {
9807 if ( options === void 0 ) options = {};
9808
9809 var router = this;
9810 var app = router.app;
9811 var url = typeof component === 'string' ? component : componentUrl;
9812 var compiledUrl = router.replaceRequestUrlParams(url, options);
9813 function compile(componentOptions) {
9814 var context = options.context || {};
9815 if (typeof context === 'function') { context = context.call(router); }
9816 else if (typeof context === 'string') {
9817 try {
9818 context = JSON.parse(context);
9819 } catch (err) {
9820 reject();
9821 throw (err);
9822 }
9823 }
9824 var extendContext = Utils.merge(
9825 {},
9826 context,
9827 {
9828 $route: options.route,
9829 $f7route: options.route,
9830 $router: router,
9831 $f7router: router,
9832 $theme: {
9833 ios: app.theme === 'ios',
9834 md: app.theme === 'md',
9835 },
9836 }
9837 );
9838 var createdComponent = app.component.create(componentOptions, extendContext);
9839 resolve(createdComponent.el);
9840 }
9841 var cachedComponent;
9842 if (compiledUrl) {
9843 router.cache.components.forEach(function (cached) {
9844 if (cached.url === compiledUrl) { cachedComponent = cached.component; }
9845 });
9846 }
9847 if (compiledUrl && cachedComponent) {
9848 compile(cachedComponent);
9849 } else if (compiledUrl && !cachedComponent) {
9850 // Load via XHR
9851 if (router.xhr) {
9852 router.xhr.abort();
9853 router.xhr = false;
9854 }
9855 router
9856 .xhrRequest(url, options)
9857 .then(function (loadedComponent) {
9858 var parsedComponent = app.component.parse(loadedComponent);
9859 router.cache.components.push({
9860 url: compiledUrl,
9861 component: parsedComponent,
9862 });
9863 compile(parsedComponent);
9864 })
9865 .catch(function (err) {
9866 reject();
9867 throw (err);
9868 });
9869 } else {
9870 compile(component);
9871 }
9872 },
9873
9874 modalComponentLoader: function modalComponentLoader(rootEl, component, componentUrl, options, resolve, reject) {
9875 var router = this;
9876 router.componentLoader(component, componentUrl, options, function (el) {
9877 resolve(el);
9878 }, reject);
9879 },
9880
9881 tabComponentLoader: function tabComponentLoader(tabEl, component, componentUrl, options, resolve, reject) {
9882 var router = this;
9883 router.componentLoader(component, componentUrl, options, function (el) {
9884 resolve(el);
9885 }, reject);
9886 },
9887
9888 pageComponentLoader: function pageComponentLoader(routerEl, component, componentUrl, options, resolve, reject) {
9889 var router = this;
9890 router.componentLoader(component, componentUrl, options, function (el, newOptions) {
9891 if ( newOptions === void 0 ) newOptions = {};
9892
9893 resolve(el, newOptions);
9894 }, reject);
9895 },
9896 },
9897 };
9898
9899 var HistoryModule = {
9900 name: 'history',
9901 static: {
9902 history: History,
9903 },
9904 on: {
9905 init: function init() {
9906 History.init(this);
9907 },
9908 },
9909 };
9910
9911 var keyPrefix = 'f7storage-';
9912 var Storage = {
9913 get: function get(key) {
9914 return new Promise(function (resolve, reject) {
9915 try {
9916 var value = JSON.parse(win.localStorage.getItem(("" + keyPrefix + key)));
9917 resolve(value);
9918 } catch (e) {
9919 reject(e);
9920 }
9921 });
9922 },
9923 set: function set(key, value) {
9924 return new Promise(function (resolve, reject) {
9925 try {
9926 win.localStorage.setItem(("" + keyPrefix + key), JSON.stringify(value));
9927 resolve();
9928 } catch (e) {
9929 reject(e);
9930 }
9931 });
9932 },
9933 remove: function remove(key) {
9934 return new Promise(function (resolve, reject) {
9935 try {
9936 win.localStorage.removeItem(("" + keyPrefix + key));
9937 resolve();
9938 } catch (e) {
9939 reject(e);
9940 }
9941 });
9942 },
9943 clear: function clear() {
9944
9945 },
9946 length: function length() {
9947
9948 },
9949 keys: function keys() {
9950 return new Promise(function (resolve, reject) {
9951 try {
9952 var keys = Object.keys(win.localStorage)
9953 .filter(function (keyName) { return keyName.indexOf(keyPrefix) === 0; })
9954 .map(function (keyName) { return keyName.replace(keyPrefix, ''); });
9955 resolve(keys);
9956 } catch (e) {
9957 reject(e);
9958 }
9959 });
9960 },
9961 forEach: function forEach(callback) {
9962 return new Promise(function (resolve, reject) {
9963 try {
9964 Object.keys(win.localStorage)
9965 .filter(function (keyName) { return keyName.indexOf(keyPrefix) === 0; })
9966 .forEach(function (keyName, index) {
9967 var key = keyName.replace(keyPrefix, '');
9968 Storage.get(key).then(function (value) {
9969 callback(key, value, index);
9970 });
9971 });
9972 resolve();
9973 } catch (e) {
9974 reject(e);
9975 }
9976 });
9977 },
9978 };
9979
9980 var StorageModule = {
9981 name: 'storage',
9982 static: {
9983 Storage: Storage,
9984 storage: Storage,
9985 },
9986 };
9987
9988 function vnode(sel, data, children, text, elm) {
9989 var key = data === undefined ? undefined : data.key;
9990 return { sel: sel, data: data, children: children,
9991 text: text, elm: elm, key: key };
9992 }
9993
9994 var array = Array.isArray;
9995 function primitive(s) {
9996 return typeof s === 'string' || typeof s === 'number';
9997 }
9998
9999 function addNS(data, children, sel) {
10000 data.ns = 'http://www.w3.org/2000/svg';
10001 if (sel !== 'foreignObject' && children !== undefined) {
10002 for (var i = 0; i < children.length; ++i) {
10003 var childData = children[i].data;
10004 if (childData !== undefined) {
10005 addNS(childData, children[i].children, children[i].sel);
10006 }
10007 }
10008 }
10009 }
10010 function h(sel, b, c) {
10011 var data = {}, children, text, i;
10012 if (c !== undefined) {
10013 data = b;
10014 if (array(c)) {
10015 children = c;
10016 }
10017 else if (primitive(c)) {
10018 text = c;
10019 }
10020 else if (c && c.sel) {
10021 children = [c];
10022 }
10023 }
10024 else if (b !== undefined) {
10025 if (array(b)) {
10026 children = b;
10027 }
10028 else if (primitive(b)) {
10029 text = b;
10030 }
10031 else if (b && b.sel) {
10032 children = [b];
10033 }
10034 else {
10035 data = b;
10036 }
10037 }
10038 if (array(children)) {
10039 for (i = 0; i < children.length; ++i) {
10040 if (primitive(children[i]))
10041 { children[i] = vnode(undefined, undefined, undefined, children[i], undefined); }
10042 }
10043 }
10044 if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' &&
10045 (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
10046 addNS(data, children, sel);
10047 }
10048 return vnode(sel, data, children, text, undefined);
10049 }
10050
10051 /* eslint no-use-before-define: "off" */
10052
10053 var selfClosing = 'area base br col command embed hr img input keygen link menuitem meta param source track wbr'.split(' ');
10054 var propsAttrs = 'hidden checked disabled readonly selected autocomplete autofocus autoplay required multiple value'.split(' ');
10055 var booleanProps = 'hidden checked disabled readonly selected autocomplete autofocus autoplay required multiple readOnly'.split(' ');
10056 var tempDom = doc.createElement('div');
10057
10058 function getHooks(data, app, initial, isRoot) {
10059 var hooks = {};
10060 if (!data || !data.attrs || !data.attrs.class) { return hooks; }
10061 var classNames = data.attrs.class;
10062 var insert = [];
10063 var destroy = [];
10064 var update = [];
10065 var postpatch = [];
10066 classNames.split(' ').forEach(function (className) {
10067 if (!initial) {
10068 insert.push.apply(insert, app.getVnodeHooks('insert', className));
10069 }
10070 destroy.push.apply(destroy, app.getVnodeHooks('destroy', className));
10071 update.push.apply(update, app.getVnodeHooks('update', className));
10072 postpatch.push.apply(postpatch, app.getVnodeHooks('postpatch', className));
10073 });
10074
10075 if (isRoot && !initial) {
10076 postpatch.push(function (oldVnode, vnode) {
10077 var vn = vnode || oldVnode;
10078 if (!vn) { return; }
10079 if (vn.data && vn.data.context && vn.data.context.$options.updated) {
10080 vn.data.context.$options.updated();
10081 }
10082 });
10083 }
10084 if (insert.length === 0 && destroy.length === 0 && update.length === 0 && postpatch.length === 0) {
10085 return hooks;
10086 }
10087 if (insert.length) {
10088 hooks.insert = function (vnode) {
10089 insert.forEach(function (f) { return f(vnode); });
10090 };
10091 }
10092 if (destroy.length) {
10093 hooks.destroy = function (vnode) {
10094 destroy.forEach(function (f) { return f(vnode); });
10095 };
10096 }
10097 if (update.length) {
10098 hooks.update = function (oldVnode, vnode) {
10099 update.forEach(function (f) { return f(oldVnode, vnode); });
10100 };
10101 }
10102 if (postpatch.length) {
10103 hooks.postpatch = function (oldVnode, vnode) {
10104 postpatch.forEach(function (f) { return f(oldVnode, vnode); });
10105 };
10106 }
10107
10108 return hooks;
10109 }
10110 function getEventHandler(handlerString, context, ref) {
10111 if ( ref === void 0 ) ref = {};
10112 var stop = ref.stop;
10113 var prevent = ref.prevent;
10114 var once = ref.once;
10115
10116 var fired = false;
10117
10118 var methodName;
10119 var method;
10120 var customArgs = [];
10121 var needMethodBind = true;
10122
10123 if (handlerString.indexOf('(') < 0) {
10124 methodName = handlerString;
10125 } else {
10126 methodName = handlerString.split('(')[0];
10127 }
10128 if (methodName.indexOf('.') >= 0) {
10129 methodName.split('.').forEach(function (path, pathIndex) {
10130 if (pathIndex === 0 && path === 'this') { return; }
10131 if (pathIndex === 0 && path === 'window') {
10132 // eslint-disable-next-line
10133 method = win;
10134 needMethodBind = false;
10135 return;
10136 }
10137 if (!method) { method = context; }
10138 if (method[path]) { method = method[path]; }
10139 else {
10140 throw new Error(("Framework7: Component doesn't have method \"" + (methodName.split('.').slice(0, pathIndex + 1).join('.')) + "\""));
10141 }
10142 });
10143 } else {
10144 if (!context[methodName]) {
10145 throw new Error(("Framework7: Component doesn't have method \"" + methodName + "\""));
10146 }
10147 method = context[methodName];
10148 }
10149 if (needMethodBind) {
10150 method = method.bind(context);
10151 }
10152
10153 function handler() {
10154 var args = [], len = arguments.length;
10155 while ( len-- ) args[ len ] = arguments[ len ];
10156
10157 var e = args[0];
10158 if (once && fired) { return; }
10159 if (stop) { e.stopPropagation(); }
10160 if (prevent) { e.preventDefault(); }
10161 fired = true;
10162
10163 if (handlerString.indexOf('(') < 0) {
10164 customArgs = args;
10165 } else {
10166 handlerString.split('(')[1].split(')')[0].split(',').forEach(function (argument) {
10167 var arg = argument.trim();
10168 // eslint-disable-next-line
10169 if (!isNaN(arg)) { arg = parseFloat(arg); }
10170 else if (arg === 'true') { arg = true; }
10171 else if (arg === 'false') { arg = false; }
10172 else if (arg === 'null') { arg = null; }
10173 else if (arg === 'undefined') { arg = undefined; }
10174 else if (arg[0] === '"') { arg = arg.replace(/"/g, ''); }
10175 else if (arg[0] === '\'') { arg = arg.replace(/'/g, ''); }
10176 else if (arg.indexOf('.') > 0) {
10177 var deepArg;
10178 arg.split('.').forEach(function (path) {
10179 if (!deepArg) { deepArg = context; }
10180 deepArg = deepArg[path];
10181 });
10182 arg = deepArg;
10183 } else {
10184 arg = context[arg];
10185 }
10186 customArgs.push(arg);
10187 });
10188 }
10189
10190 method.apply(void 0, customArgs);
10191 }
10192
10193 return handler;
10194 }
10195
10196 function getData(el, context, app, initial, isRoot) {
10197 var data = {
10198 context: context,
10199 };
10200 var attributes = el.attributes;
10201 Array.prototype.forEach.call(attributes, function (attr) {
10202 var attrName = attr.name;
10203 var attrValue = attr.value;
10204 if (propsAttrs.indexOf(attrName) >= 0) {
10205 // Props
10206 if (!data.props) { data.props = {}; }
10207 if (attrName === 'readonly') {
10208 attrName = 'readOnly';
10209 }
10210 if (booleanProps.indexOf(attrName) >= 0) {
10211 // eslint-disable-next-line
10212 data.props[attrName] = attrValue === false ? false : true;
10213 } else {
10214 data.props[attrName] = attrValue;
10215 }
10216 } else if (attrName === 'key') {
10217 // Key
10218 data.key = attrValue;
10219 } else if (attrName.indexOf('@') === 0) {
10220 // Events
10221 if (!data.on) { data.on = {}; }
10222 var eventName = attrName.substr(1);
10223 var stop = false;
10224 var prevent = false;
10225 var once = false;
10226 if (eventName.indexOf('.') >= 0) {
10227 eventName.split('.').forEach(function (eventNamePart, eventNameIndex) {
10228 if (eventNameIndex === 0) { eventName = eventNamePart; }
10229 else {
10230 if (eventNamePart === 'stop') { stop = true; }
10231 if (eventNamePart === 'prevent') { prevent = true; }
10232 if (eventNamePart === 'once') { once = true; }
10233 }
10234 });
10235 }
10236 data.on[eventName] = getEventHandler(attrValue, context, { stop: stop, prevent: prevent, once: once });
10237 } else if (attrName === 'style') {
10238 // Style
10239 if (attrValue.indexOf('{') >= 0 && attrValue.indexOf('}') >= 0) {
10240 try {
10241 data.style = JSON.parse(attrValue);
10242 } catch (e) {
10243 if (!data.attrs) { data.attrs = {}; }
10244 data.attrs.style = attrValue;
10245 }
10246 } else {
10247 if (!data.attrs) { data.attrs = {}; }
10248 data.attrs.style = attrValue;
10249 }
10250 } else {
10251 // Rest of attribures
10252 if (!data.attrs) { data.attrs = {}; }
10253 data.attrs[attrName] = attrValue;
10254
10255 // ID -> Key
10256 if (attrName === 'id' && !data.key && !isRoot) {
10257 data.key = attrValue;
10258 }
10259 }
10260 });
10261 var hooks = getHooks(data, app, initial, isRoot);
10262 hooks.prepatch = function (oldVnode, vnode) {
10263 if (!oldVnode || !vnode) { return; }
10264 if (oldVnode && oldVnode.data && oldVnode.data.props) {
10265 Object.keys(oldVnode.data.props).forEach(function (key) {
10266 if (booleanProps.indexOf(key) < 0) { return; }
10267 if (!vnode.data) { vnode.data = {}; }
10268 if (!vnode.data.props) { vnode.data.props = {}; }
10269 if (oldVnode.data.props[key] === true && !(key in vnode.data.props)) {
10270 vnode.data.props[key] = false;
10271 }
10272 });
10273 }
10274 };
10275 if (hooks) {
10276 data.hook = hooks;
10277 }
10278 return data;
10279 }
10280
10281 function getChildren(el, context, app, initial) {
10282 var children = [];
10283 var nodes = el.childNodes;
10284 for (var i = 0; i < nodes.length; i += 1) {
10285 var childNode = nodes[i];
10286 var child = elementToVNode(childNode, context, app, initial);
10287 if (child) {
10288 children.push(child);
10289 }
10290 }
10291 return children;
10292 }
10293
10294 function elementToVNode(el, context, app, initial, isRoot) {
10295 if (el.nodeType === 1) {
10296 // element
10297 var tagName = el.nodeName.toLowerCase();
10298 return h(
10299 tagName,
10300 getData(el, context, app, initial, isRoot),
10301 selfClosing.indexOf(tagName) >= 0 ? [] : getChildren(el, context, app, initial)
10302 );
10303 }
10304 if (el.nodeType === 3) {
10305 // text
10306 return el.textContent;
10307 }
10308 return null;
10309 }
10310
10311 function vdom (html, context, app, initial) {
10312 if ( html === void 0 ) html = '';
10313
10314 // Save to temp dom
10315 tempDom.innerHTML = html.trim();
10316
10317 // Parse DOM
10318 var rootEl;
10319 for (var i = 0; i < tempDom.childNodes.length; i += 1) {
10320 if (!rootEl && tempDom.childNodes[i].nodeType === 1) {
10321 rootEl = tempDom.childNodes[i];
10322 }
10323 }
10324 var result = elementToVNode(rootEl, context, app, initial, true);
10325
10326 // Clean
10327 tempDom.innerHTML = '';
10328
10329 return result;
10330 }
10331
10332 function createElement(tagName) {
10333 return document.createElement(tagName);
10334 }
10335 function createElementNS(namespaceURI, qualifiedName) {
10336 return document.createElementNS(namespaceURI, qualifiedName);
10337 }
10338 function createTextNode(text) {
10339 return document.createTextNode(text);
10340 }
10341 function createComment(text) {
10342 return document.createComment(text);
10343 }
10344 function insertBefore$1(parentNode, newNode, referenceNode) {
10345 parentNode.insertBefore(newNode, referenceNode);
10346 }
10347 function removeChild(node, child) {
10348 if (!node) { return; }
10349 node.removeChild(child);
10350 }
10351 function appendChild(node, child) {
10352 node.appendChild(child);
10353 }
10354 function parentNode(node) {
10355 return node.parentNode;
10356 }
10357 function nextSibling(node) {
10358 return node.nextSibling;
10359 }
10360 function tagName(elm) {
10361 return elm.tagName;
10362 }
10363 function setTextContent(node, text) {
10364 node.textContent = text;
10365 }
10366 function getTextContent(node) {
10367 return node.textContent;
10368 }
10369 function isElement(node) {
10370 return node.nodeType === 1;
10371 }
10372 function isText(node) {
10373 return node.nodeType === 3;
10374 }
10375 function isComment(node) {
10376 return node.nodeType === 8;
10377 }
10378 var htmlDomApi = {
10379 createElement: createElement,
10380 createElementNS: createElementNS,
10381 createTextNode: createTextNode,
10382 createComment: createComment,
10383 insertBefore: insertBefore$1,
10384 removeChild: removeChild,
10385 appendChild: appendChild,
10386 parentNode: parentNode,
10387 nextSibling: nextSibling,
10388 tagName: tagName,
10389 setTextContent: setTextContent,
10390 getTextContent: getTextContent,
10391 isElement: isElement,
10392 isText: isText,
10393 isComment: isComment,
10394 };
10395
10396 function isUndef(s) { return s === undefined; }
10397 function isDef(s) { return s !== undefined; }
10398 var emptyNode = vnode('', {}, [], undefined, undefined);
10399 function sameVnode(vnode1, vnode2) {
10400 return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
10401 }
10402 function isVnode(vnode$$1) {
10403 return vnode$$1.sel !== undefined;
10404 }
10405 function createKeyToOldIdx(children, beginIdx, endIdx) {
10406 var i, map = {}, key, ch;
10407 for (i = beginIdx; i <= endIdx; ++i) {
10408 ch = children[i];
10409 if (ch != null) {
10410 key = ch.key;
10411 if (key !== undefined)
10412 { map[key] = i; }
10413 }
10414 }
10415 return map;
10416 }
10417 var hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
10418 function init$1(modules, domApi) {
10419 var i, j, cbs = {};
10420 var api = domApi !== undefined ? domApi : htmlDomApi;
10421 for (i = 0; i < hooks.length; ++i) {
10422 cbs[hooks[i]] = [];
10423 for (j = 0; j < modules.length; ++j) {
10424 var hook = modules[j][hooks[i]];
10425 if (hook !== undefined) {
10426 cbs[hooks[i]].push(hook);
10427 }
10428 }
10429 }
10430 function emptyNodeAt(elm) {
10431 var id = elm.id ? '#' + elm.id : '';
10432 var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
10433 return vnode(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
10434 }
10435 function createRmCb(childElm, listeners) {
10436 return function rmCb() {
10437 if (--listeners === 0) {
10438 var parent_1 = api.parentNode(childElm);
10439 api.removeChild(parent_1, childElm);
10440 }
10441 };
10442 }
10443 function createElm(vnode$$1, insertedVnodeQueue) {
10444 var i, data = vnode$$1.data;
10445 if (data !== undefined) {
10446 if (isDef(i = data.hook) && isDef(i = i.init)) {
10447 i(vnode$$1);
10448 data = vnode$$1.data;
10449 }
10450 }
10451 var children = vnode$$1.children, sel = vnode$$1.sel;
10452 if (sel === '!') {
10453 if (isUndef(vnode$$1.text)) {
10454 vnode$$1.text = '';
10455 }
10456 vnode$$1.elm = api.createComment(vnode$$1.text);
10457 }
10458 else if (sel !== undefined) {
10459 // Parse selector
10460 var hashIdx = sel.indexOf('#');
10461 var dotIdx = sel.indexOf('.', hashIdx);
10462 var hash = hashIdx > 0 ? hashIdx : sel.length;
10463 var dot = dotIdx > 0 ? dotIdx : sel.length;
10464 var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
10465 var elm = vnode$$1.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)
10466 : api.createElement(tag);
10467 if (hash < dot)
10468 { elm.setAttribute('id', sel.slice(hash + 1, dot)); }
10469 if (dotIdx > 0)
10470 { elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' ')); }
10471 for (i = 0; i < cbs.create.length; ++i)
10472 { cbs.create[i](emptyNode, vnode$$1); }
10473 if (array(children)) {
10474 for (i = 0; i < children.length; ++i) {
10475 var ch = children[i];
10476 if (ch != null) {
10477 api.appendChild(elm, createElm(ch, insertedVnodeQueue));
10478 }
10479 }
10480 }
10481 else if (primitive(vnode$$1.text)) {
10482 api.appendChild(elm, api.createTextNode(vnode$$1.text));
10483 }
10484 i = vnode$$1.data.hook; // Reuse variable
10485 if (isDef(i)) {
10486 if (i.create)
10487 { i.create(emptyNode, vnode$$1); }
10488 if (i.insert)
10489 { insertedVnodeQueue.push(vnode$$1); }
10490 }
10491 }
10492 else {
10493 vnode$$1.elm = api.createTextNode(vnode$$1.text);
10494 }
10495 return vnode$$1.elm;
10496 }
10497 function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
10498 for (; startIdx <= endIdx; ++startIdx) {
10499 var ch = vnodes[startIdx];
10500 if (ch != null) {
10501 api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
10502 }
10503 }
10504 }
10505 function invokeDestroyHook(vnode$$1) {
10506 var i, j, data = vnode$$1.data;
10507 if (data !== undefined) {
10508 if (isDef(i = data.hook) && isDef(i = i.destroy))
10509 { i(vnode$$1); }
10510 for (i = 0; i < cbs.destroy.length; ++i)
10511 { cbs.destroy[i](vnode$$1); }
10512 if (vnode$$1.children !== undefined) {
10513 for (j = 0; j < vnode$$1.children.length; ++j) {
10514 i = vnode$$1.children[j];
10515 if (i != null && typeof i !== "string") {
10516 invokeDestroyHook(i);
10517 }
10518 }
10519 }
10520 }
10521 }
10522 function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
10523 for (; startIdx <= endIdx; ++startIdx) {
10524 var i_1 = void 0, listeners = void 0, rm = void 0, ch = vnodes[startIdx];
10525 if (ch != null) {
10526 if (isDef(ch.sel)) {
10527 invokeDestroyHook(ch);
10528 listeners = cbs.remove.length + 1;
10529 rm = createRmCb(ch.elm, listeners);
10530 for (i_1 = 0; i_1 < cbs.remove.length; ++i_1)
10531 { cbs.remove[i_1](ch, rm); }
10532 if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {
10533 i_1(ch, rm);
10534 }
10535 else {
10536 rm();
10537 }
10538 }
10539 else {
10540 api.removeChild(parentElm, ch.elm);
10541 }
10542 }
10543 }
10544 }
10545 function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
10546 var oldStartIdx = 0, newStartIdx = 0;
10547 var oldEndIdx = oldCh.length - 1;
10548 var oldStartVnode = oldCh[0];
10549 var oldEndVnode = oldCh[oldEndIdx];
10550 var newEndIdx = newCh.length - 1;
10551 var newStartVnode = newCh[0];
10552 var newEndVnode = newCh[newEndIdx];
10553 var oldKeyToIdx;
10554 var idxInOld;
10555 var elmToMove;
10556 var before;
10557 while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
10558 if (oldStartVnode == null) {
10559 oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
10560 }
10561 else if (oldEndVnode == null) {
10562 oldEndVnode = oldCh[--oldEndIdx];
10563 }
10564 else if (newStartVnode == null) {
10565 newStartVnode = newCh[++newStartIdx];
10566 }
10567 else if (newEndVnode == null) {
10568 newEndVnode = newCh[--newEndIdx];
10569 }
10570 else if (sameVnode(oldStartVnode, newStartVnode)) {
10571 patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
10572 oldStartVnode = oldCh[++oldStartIdx];
10573 newStartVnode = newCh[++newStartIdx];
10574 }
10575 else if (sameVnode(oldEndVnode, newEndVnode)) {
10576 patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
10577 oldEndVnode = oldCh[--oldEndIdx];
10578 newEndVnode = newCh[--newEndIdx];
10579 }
10580 else if (sameVnode(oldStartVnode, newEndVnode)) {
10581 patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
10582 api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
10583 oldStartVnode = oldCh[++oldStartIdx];
10584 newEndVnode = newCh[--newEndIdx];
10585 }
10586 else if (sameVnode(oldEndVnode, newStartVnode)) {
10587 patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
10588 api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
10589 oldEndVnode = oldCh[--oldEndIdx];
10590 newStartVnode = newCh[++newStartIdx];
10591 }
10592 else {
10593 if (oldKeyToIdx === undefined) {
10594 oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
10595 }
10596 idxInOld = oldKeyToIdx[newStartVnode.key];
10597 if (isUndef(idxInOld)) {
10598 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
10599 newStartVnode = newCh[++newStartIdx];
10600 }
10601 else {
10602 elmToMove = oldCh[idxInOld];
10603 if (elmToMove.sel !== newStartVnode.sel) {
10604 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
10605 }
10606 else {
10607 patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
10608 oldCh[idxInOld] = undefined;
10609 api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
10610 }
10611 newStartVnode = newCh[++newStartIdx];
10612 }
10613 }
10614 }
10615 if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
10616 if (oldStartIdx > oldEndIdx) {
10617 before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
10618 addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
10619 }
10620 else {
10621 removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
10622 }
10623 }
10624 }
10625 function patchVnode(oldVnode, vnode$$1, insertedVnodeQueue) {
10626 var i, hook;
10627 if (isDef(i = vnode$$1.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
10628 i(oldVnode, vnode$$1);
10629 }
10630 var elm = vnode$$1.elm = oldVnode.elm;
10631 var oldCh = oldVnode.children;
10632 var ch = vnode$$1.children;
10633 if (oldVnode === vnode$$1)
10634 { return; }
10635 if (vnode$$1.data !== undefined) {
10636 for (i = 0; i < cbs.update.length; ++i)
10637 { cbs.update[i](oldVnode, vnode$$1); }
10638 i = vnode$$1.data.hook;
10639 if (isDef(i) && isDef(i = i.update))
10640 { i(oldVnode, vnode$$1); }
10641 }
10642 if (isUndef(vnode$$1.text)) {
10643 if (isDef(oldCh) && isDef(ch)) {
10644 if (oldCh !== ch)
10645 { updateChildren(elm, oldCh, ch, insertedVnodeQueue); }
10646 }
10647 else if (isDef(ch)) {
10648 if (isDef(oldVnode.text))
10649 { api.setTextContent(elm, ''); }
10650 addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
10651 }
10652 else if (isDef(oldCh)) {
10653 removeVnodes(elm, oldCh, 0, oldCh.length - 1);
10654 }
10655 else if (isDef(oldVnode.text)) {
10656 api.setTextContent(elm, '');
10657 }
10658 }
10659 else if (oldVnode.text !== vnode$$1.text) {
10660 api.setTextContent(elm, vnode$$1.text);
10661 }
10662 if (isDef(hook) && isDef(i = hook.postpatch)) {
10663 i(oldVnode, vnode$$1);
10664 }
10665 }
10666 return function patch(oldVnode, vnode$$1) {
10667 var i, elm, parent;
10668 var insertedVnodeQueue = [];
10669 for (i = 0; i < cbs.pre.length; ++i)
10670 { cbs.pre[i](); }
10671 if (!isVnode(oldVnode)) {
10672 oldVnode = emptyNodeAt(oldVnode);
10673 }
10674 if (sameVnode(oldVnode, vnode$$1)) {
10675 patchVnode(oldVnode, vnode$$1, insertedVnodeQueue);
10676 }
10677 else {
10678 elm = oldVnode.elm;
10679 parent = api.parentNode(elm);
10680 createElm(vnode$$1, insertedVnodeQueue);
10681 if (parent !== null) {
10682 api.insertBefore(parent, vnode$$1.elm, api.nextSibling(elm));
10683 removeVnodes(parent, [oldVnode], 0, 0);
10684 }
10685 }
10686 for (i = 0; i < insertedVnodeQueue.length; ++i) {
10687 insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
10688 }
10689 for (i = 0; i < cbs.post.length; ++i)
10690 { cbs.post[i](); }
10691 return vnode$$1;
10692 };
10693 }
10694
10695 var xlinkNS = 'http://www.w3.org/1999/xlink';
10696 var xmlNS = 'http://www.w3.org/XML/1998/namespace';
10697 var colonChar = 58;
10698 var xChar = 120;
10699 function updateAttrs(oldVnode, vnode) {
10700 var key, elm = vnode.elm, oldAttrs = oldVnode.data.attrs, attrs = vnode.data.attrs;
10701 if (!oldAttrs && !attrs)
10702 { return; }
10703 if (oldAttrs === attrs)
10704 { return; }
10705 oldAttrs = oldAttrs || {};
10706 attrs = attrs || {};
10707 // update modified attributes, add new attributes
10708 for (key in attrs) {
10709 var cur = attrs[key];
10710 var old = oldAttrs[key];
10711 if (old !== cur) {
10712 if (cur === true) {
10713 elm.setAttribute(key, "");
10714 }
10715 else if (cur === false) {
10716 elm.removeAttribute(key);
10717 }
10718 else {
10719 if (key.charCodeAt(0) !== xChar) {
10720 elm.setAttribute(key, cur);
10721 }
10722 else if (key.charCodeAt(3) === colonChar) {
10723 // Assume xml namespace
10724 elm.setAttributeNS(xmlNS, key, cur);
10725 }
10726 else if (key.charCodeAt(5) === colonChar) {
10727 // Assume xlink namespace
10728 elm.setAttributeNS(xlinkNS, key, cur);
10729 }
10730 else {
10731 elm.setAttribute(key, cur);
10732 }
10733 }
10734 }
10735 }
10736 // remove removed attributes
10737 // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
10738 // the other option is to remove all attributes with value == undefined
10739 for (key in oldAttrs) {
10740 if (!(key in attrs)) {
10741 elm.removeAttribute(key);
10742 }
10743 }
10744 }
10745 var attributesModule = { create: updateAttrs, update: updateAttrs };
10746
10747 function updateProps(oldVnode, vnode) {
10748 var key, cur, old, elm = vnode.elm, oldProps = oldVnode.data.props, props = vnode.data.props;
10749 if (!oldProps && !props)
10750 { return; }
10751 if (oldProps === props)
10752 { return; }
10753 oldProps = oldProps || {};
10754 props = props || {};
10755 for (key in oldProps) {
10756 if (!props[key]) {
10757 delete elm[key];
10758 }
10759 }
10760 for (key in props) {
10761 cur = props[key];
10762 old = oldProps[key];
10763 if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
10764 elm[key] = cur;
10765 }
10766 }
10767 }
10768 var propsModule = { create: updateProps, update: updateProps };
10769
10770 var raf = (typeof window !== 'undefined' && window.requestAnimationFrame) || setTimeout;
10771 var nextFrame = function (fn) { raf(function () { raf(fn); }); };
10772 function setNextFrame(obj, prop, val) {
10773 nextFrame(function () { obj[prop] = val; });
10774 }
10775 function updateStyle(oldVnode, vnode) {
10776 var cur, name, elm = vnode.elm, oldStyle = oldVnode.data.style, style = vnode.data.style;
10777 if (!oldStyle && !style)
10778 { return; }
10779 if (oldStyle === style)
10780 { return; }
10781 oldStyle = oldStyle || {};
10782 style = style || {};
10783 var oldHasDel = 'delayed' in oldStyle;
10784 for (name in oldStyle) {
10785 if (!style[name]) {
10786 if (name[0] === '-' && name[1] === '-') {
10787 elm.style.removeProperty(name);
10788 }
10789 else {
10790 elm.style[name] = '';
10791 }
10792 }
10793 }
10794 for (name in style) {
10795 cur = style[name];
10796 if (name === 'delayed' && style.delayed) {
10797 for (var name2 in style.delayed) {
10798 cur = style.delayed[name2];
10799 if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
10800 setNextFrame(elm.style, name2, cur);
10801 }
10802 }
10803 }
10804 else if (name !== 'remove' && cur !== oldStyle[name]) {
10805 if (name[0] === '-' && name[1] === '-') {
10806 elm.style.setProperty(name, cur);
10807 }
10808 else {
10809 elm.style[name] = cur;
10810 }
10811 }
10812 }
10813 }
10814 function applyDestroyStyle(vnode) {
10815 var style, name, elm = vnode.elm, s = vnode.data.style;
10816 if (!s || !(style = s.destroy))
10817 { return; }
10818 for (name in style) {
10819 elm.style[name] = style[name];
10820 }
10821 }
10822 function applyRemoveStyle(vnode, rm) {
10823 var s = vnode.data.style;
10824 if (!s || !s.remove) {
10825 rm();
10826 return;
10827 }
10828 var name, elm = vnode.elm, i = 0, compStyle, style = s.remove, amount = 0, applied = [];
10829 for (name in style) {
10830 applied.push(name);
10831 elm.style[name] = style[name];
10832 }
10833 compStyle = getComputedStyle(elm);
10834 var props = compStyle['transition-property'].split(', ');
10835 for (; i < props.length; ++i) {
10836 if (applied.indexOf(props[i]) !== -1)
10837 { amount++; }
10838 }
10839 elm.addEventListener('transitionend', function (ev) {
10840 if (ev.target === elm)
10841 { --amount; }
10842 if (amount === 0)
10843 { rm(); }
10844 });
10845 }
10846 var styleModule = {
10847 create: updateStyle,
10848 update: updateStyle,
10849 destroy: applyDestroyStyle,
10850 remove: applyRemoveStyle
10851 };
10852
10853 function invokeHandler(handler, event, args) {
10854 if (typeof handler === 'function') {
10855 // call function handler
10856 handler.apply(void 0, [ event ].concat( args ));
10857 }
10858 }
10859 function handleEvent(event, args, vnode) {
10860 var name = event.type;
10861 var on = vnode.data.on;
10862 // call event handler(s) if exists
10863 if (on && on[name]) {
10864 invokeHandler(on[name], event, args, vnode);
10865 }
10866 }
10867 function createListener() {
10868 return function handler(event) {
10869 var args = [], len = arguments.length - 1;
10870 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
10871
10872 handleEvent(event, args, handler.vnode);
10873 };
10874 }
10875 function updateEvents(oldVnode, vnode) {
10876 var oldOn = oldVnode.data.on;
10877 var oldListener = oldVnode.listener;
10878 var oldElm = oldVnode.elm;
10879 var on = vnode && vnode.data.on;
10880 var elm = (vnode && vnode.elm);
10881 // optimization for reused immutable handlers
10882 if (oldOn === on) {
10883 return;
10884 }
10885 // remove existing listeners which no longer used
10886 if (oldOn && oldListener) {
10887 // if element changed or deleted we remove all existing listeners unconditionally
10888 if (!on) {
10889 Object.keys(oldOn).forEach(function (name) {
10890 $(oldElm).off(name, oldListener);
10891 });
10892 } else {
10893 Object.keys(oldOn).forEach(function (name) {
10894 if (!on[name]) {
10895 $(oldElm).off(name, oldListener);
10896 }
10897 });
10898 }
10899 }
10900 // add new listeners which has not already attached
10901 if (on) {
10902 // reuse existing listener or create new
10903 var listener = oldVnode.listener || createListener();
10904 vnode.listener = listener;
10905 // update vnode for listener
10906 listener.vnode = vnode;
10907 // if element changed or added we add all needed listeners unconditionally
10908 if (!oldOn) {
10909 Object.keys(on).forEach(function (name) {
10910 $(elm).on(name, listener);
10911 });
10912 } else {
10913 Object.keys(on).forEach(function (name) {
10914 if (!oldOn[name]) {
10915 $(elm).on(name, listener);
10916 }
10917 });
10918 }
10919 }
10920 }
10921
10922 var eventListenersModule = {
10923 create: updateEvents,
10924 update: updateEvents,
10925 destroy: updateEvents,
10926 };
10927
10928 /* eslint import/no-named-as-default: off */
10929
10930 var patch = init$1([
10931 attributesModule,
10932 propsModule,
10933 styleModule,
10934 eventListenersModule ]);
10935
10936 var Framework7Component = function Framework7Component(app, options, extendContext) {
10937 if ( extendContext === void 0 ) extendContext = {};
10938
10939 var id = Utils.id();
10940 var self = Utils.merge(
10941 this,
10942 extendContext,
10943 {
10944 $: $,
10945 $$: $,
10946 $dom7: $,
10947 $app: app,
10948 $f7: app,
10949 $options: Utils.extend({ id: id }, options),
10950 }
10951 );
10952 var $options = self.$options;
10953
10954 // Root data and methods
10955 Object.defineProperty(self, '$root', {
10956 enumerable: true,
10957 configurable: true,
10958 get: function get() {
10959 var root = Utils.merge({}, app.data, app.methods);
10960 if (win && win.Proxy) {
10961 root = new win.Proxy(root, {
10962 set: function set(target, name, val) {
10963 app.data[name] = val;
10964 },
10965 deleteProperty: function deleteProperty(target, name) {
10966 delete app.data[name];
10967 delete app.methods[name];
10968 },
10969 has: function has(target, name) {
10970 return (name in app.data || name in app.methods);
10971 },
10972 });
10973 }
10974 return root;
10975 },
10976 set: function set() {},
10977 });
10978
10979 // Apply context
10980 ('beforeCreate created beforeMount mounted beforeDestroy destroyed updated').split(' ').forEach(function (cycleKey) {
10981 if ($options[cycleKey]) { $options[cycleKey] = $options[cycleKey].bind(self); }
10982 });
10983
10984 if ($options.data) {
10985 $options.data = $options.data.bind(self);
10986 // Data
10987 Utils.extend(self, $options.data());
10988 }
10989 if ($options.render) { $options.render = $options.render.bind(self); }
10990 if ($options.methods) {
10991 Object.keys($options.methods).forEach(function (methodName) {
10992 self[methodName] = $options.methods[methodName].bind(self);
10993 });
10994 }
10995
10996 // Bind Events
10997 if ($options.on) {
10998 Object.keys($options.on).forEach(function (eventName) {
10999 $options.on[eventName] = $options.on[eventName].bind(self);
11000 });
11001 }
11002 if ($options.once) {
11003 Object.keys($options.once).forEach(function (eventName) {
11004 $options.once[eventName] = $options.once[eventName].bind(self);
11005 });
11006 }
11007
11008 // Before create hook
11009 if ($options.beforeCreate) { $options.beforeCreate(); }
11010
11011 // Render
11012 var html = self.$render();
11013
11014 // Make Dom
11015 if (html && typeof html === 'string') {
11016 html = html.trim();
11017 self.$vnode = vdom(html, self, app, true);
11018 self.el = doc.createElement('div');
11019 patch(self.el, self.$vnode);
11020 } else if (html) {
11021 self.el = html;
11022 }
11023 self.$el = $(self.el);
11024
11025 // Set styles scope ID
11026 if ($options.style) {
11027 self.$styleEl = doc.createElement('style');
11028 self.$styleEl.innerHTML = $options.style;
11029 if ($options.styleScoped) {
11030 self.el.setAttribute(("data-f7-" + ($options.id)), '');
11031 }
11032 }
11033
11034 self.$attachEvents();
11035
11036 // Created callback
11037 if ($options.created) { $options.created(); }
11038
11039 // Store component instance
11040 self.el.f7Component = self;
11041
11042 return self;
11043 };
11044
11045 Framework7Component.prototype.$attachEvents = function $attachEvents () {
11046 var self = this;
11047 var $options = self.$options;
11048 var $el = self.$el;
11049 if ($options.on) {
11050 Object.keys($options.on).forEach(function (eventName) {
11051 $el.on(Utils.eventNameToColonCase(eventName), $options.on[eventName]);
11052 });
11053 }
11054 if ($options.once) {
11055 Object.keys($options.once).forEach(function (eventName) {
11056 $el.once(Utils.eventNameToColonCase(eventName), $options.once[eventName]);
11057 });
11058 }
11059 };
11060
11061 Framework7Component.prototype.$detachEvents = function $detachEvents () {
11062 var self = this;
11063 var $options = self.$options;
11064 var $el = self.$el;
11065 if ($options.on) {
11066 Object.keys($options.on).forEach(function (eventName) {
11067 $el.off(Utils.eventNameToColonCase(eventName), $options.on[eventName]);
11068 });
11069 }
11070 if ($options.once) {
11071 Object.keys($options.once).forEach(function (eventName) {
11072 $el.off(Utils.eventNameToColonCase(eventName), $options.once[eventName]);
11073 });
11074 }
11075 };
11076
11077 Framework7Component.prototype.$render = function $render () {
11078 var self = this;
11079 var $options = self.$options;
11080 var html = '';
11081 if ($options.render) {
11082 html = $options.render();
11083 } else if ($options.template) {
11084 if (typeof $options.template === 'string') {
11085 try {
11086 html = Template7.compile($options.template)(self);
11087 } catch (err) {
11088 throw err;
11089 }
11090 } else {
11091 // Supposed to be function
11092 html = $options.template(self);
11093 }
11094 }
11095 return html;
11096 };
11097
11098 Framework7Component.prototype.$forceUpdate = function $forceUpdate () {
11099 var self = this;
11100 var html = self.$render();
11101
11102 // Make Dom
11103 if (html && typeof html === 'string') {
11104 html = html.trim();
11105 var newVNode = vdom(html, self, self.$app);
11106 self.$vnode = patch(self.$vnode, newVNode);
11107 }
11108 };
11109
11110 Framework7Component.prototype.$setState = function $setState (mergeState) {
11111 var self = this;
11112 Utils.merge(self, mergeState);
11113 self.$forceUpdate();
11114 };
11115
11116 Framework7Component.prototype.$mount = function $mount (mountMethod) {
11117 var self = this;
11118 if (self.$options.beforeMount) { self.$options.beforeMount(); }
11119 if (self.$styleEl) { $('head').append(self.$styleEl); }
11120 if (mountMethod) { mountMethod(self.el); }
11121 if (self.$options.mounted) { self.$options.mounted(); }
11122 };
11123
11124 Framework7Component.prototype.$destroy = function $destroy () {
11125 var self = this;
11126 if (self.$options.beforeDestroy) { self.$options.beforeDestroy(); }
11127 if (self.$styleEl) { $(self.$styleEl).remove(); }
11128 self.$detachEvents();
11129 if (self.$options.destroyed) { self.$options.destroyed(); }
11130 // Delete component instance
11131 if (self.el && self.el.f7Component) {
11132 self.el.f7Component = null;
11133 delete self.el.f7Component;
11134 }
11135 // Patch with empty node
11136 if (self.$vnode) {
11137 self.$vnode = patch(self.$vnode, { sel: self.$vnode.sel, data: {} });
11138 }
11139 Utils.deleteProps(self);
11140 };
11141
11142 function parseComponent(componentString) {
11143 var id = Utils.id();
11144 var callbackCreateName = "f7_component_create_callback_" + id;
11145 var callbackRenderName = "f7_component_render_callback_" + id;
11146
11147 // Template
11148 var template;
11149 var hasTemplate = componentString.match(/<template([ ]?)([a-z0-9-]*)>/);
11150 var templateType = hasTemplate[2] || 't7';
11151 if (hasTemplate) {
11152 template = componentString
11153 .split(/<template[ ]?[a-z0-9-]*>/)
11154 .filter(function (item, index) { return index > 0; })
11155 .join('<template>')
11156 .split('</template>')
11157 .filter(function (item, index, arr) { return index < arr.length - 1; })
11158 .join('</template>')
11159 .replace(/{{#raw}}([ \n]*)<template/g, '{{#raw}}<template')
11160 .replace(/\/template>([ \n]*){{\/raw}}/g, '/template>{{/raw}}')
11161 .replace(/([ \n])<template/g, '$1{{#raw}}<template')
11162 .replace(/\/template>([ \n])/g, '/template>{{/raw}}$1');
11163 }
11164
11165 // Parse Styles
11166 var style = null;
11167 var styleScoped = false;
11168
11169 if (componentString.indexOf('<style>') >= 0) {
11170 style = componentString.split('<style>')[1].split('</style>')[0];
11171 } else if (componentString.indexOf('<style scoped>') >= 0) {
11172 styleScoped = true;
11173 style = componentString.split('<style scoped>')[1].split('</style>')[0];
11174 style = style.split('\n').map(function (line) {
11175 var trimmedLine = line.trim();
11176 if (trimmedLine.indexOf('@') === 0) { return line; }
11177 if (line.indexOf('{') >= 0) {
11178 if (line.indexOf('{{this}}') >= 0) {
11179 return line.replace('{{this}}', ("[data-f7-" + id + "]"));
11180 }
11181 return ("[data-f7-" + id + "] " + (line.trim()));
11182 }
11183 return line;
11184 }).join('\n');
11185 }
11186
11187 // Parse Script
11188 var scriptContent;
11189 var scriptEl;
11190 if (componentString.indexOf('<script>') >= 0) {
11191 var scripts = componentString.split('<script>');
11192 scriptContent = scripts[scripts.length - 1].split('</script>')[0].trim();
11193 } else {
11194 scriptContent = 'return {}';
11195 }
11196 if (!scriptContent || !scriptContent.trim()) { scriptContent = 'return {}'; }
11197
11198 scriptContent = "window." + callbackCreateName + " = function () {" + scriptContent + "}";
11199
11200 // Insert Script El
11201 scriptEl = doc.createElement('script');
11202 scriptEl.innerHTML = scriptContent;
11203 $('head').append(scriptEl);
11204
11205 var component = win[callbackCreateName]();
11206
11207 // Remove Script El
11208 $(scriptEl).remove();
11209 win[callbackCreateName] = null;
11210 delete win[callbackCreateName];
11211
11212 // Assign Template
11213 if (!component.template && !component.render) {
11214 component.template = template;
11215 component.templateType = templateType;
11216 }
11217 if (component.template) {
11218 if (component.templateType === 't7') {
11219 component.template = Template7.compile(component.template);
11220 }
11221 if (component.templateType === 'es') {
11222 var renderContent = "window." + callbackRenderName + " = function () {\n return function render() {\n return `" + (component.template) + "`;\n }\n }";
11223 scriptEl = doc.createElement('script');
11224 scriptEl.innerHTML = renderContent;
11225 $('head').append(scriptEl);
11226
11227 component.render = win[callbackRenderName]();
11228
11229 // Remove Script El
11230 $(scriptEl).remove();
11231 win[callbackRenderName] = null;
11232 delete win[callbackRenderName];
11233 }
11234 }
11235
11236 // Assign Style
11237 if (style) {
11238 component.style = style;
11239 component.styleScoped = styleScoped;
11240 }
11241
11242 // Component ID
11243 component.id = id;
11244 return component;
11245 }
11246
11247 var ComponentModule = {
11248 name: 'component',
11249 create: function create() {
11250 var app = this;
11251 app.component = {
11252 parse: function parse(componentString) {
11253 return parseComponent(componentString);
11254 },
11255 create: function create(options, extendContext) {
11256 return new Framework7Component(app, options, extendContext);
11257 },
11258 };
11259 },
11260 };
11261
11262 var SW = {
11263 registrations: [],
11264 register: function register(path, scope) {
11265 var app = this;
11266 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
11267 return new Promise(function (resolve, reject) {
11268 reject(new Error('Service worker is not supported'));
11269 });
11270 }
11271 return new Promise(function (resolve, reject) {
11272 app.serviceWorker.container.register(path, (scope ? { scope: scope } : {}))
11273 .then(function (reg) {
11274 SW.registrations.push(reg);
11275 app.emit('serviceWorkerRegisterSuccess', reg);
11276 resolve(reg);
11277 }).catch(function (error) {
11278 app.emit('serviceWorkerRegisterError', error);
11279 reject(error);
11280 });
11281 });
11282 },
11283 unregister: function unregister(registration) {
11284 var app = this;
11285 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
11286 return new Promise(function (resolve, reject) {
11287 reject(new Error('Service worker is not supported'));
11288 });
11289 }
11290 var registrations;
11291 if (!registration) { registrations = SW.registrations; }
11292 else if (Array.isArray(registration)) { registrations = registration; }
11293 else { registrations = [registration]; }
11294 return Promise.all(registrations.map(function (reg) { return new Promise(function (resolve, reject) {
11295 reg.unregister()
11296 .then(function () {
11297 if (SW.registrations.indexOf(reg) >= 0) {
11298 SW.registrations.splice(SW.registrations.indexOf(reg), 1);
11299 }
11300 app.emit('serviceWorkerUnregisterSuccess', reg);
11301 resolve();
11302 })
11303 .catch(function (error) {
11304 app.emit('serviceWorkerUnregisterError', reg, error);
11305 reject(error);
11306 });
11307 }); }));
11308 },
11309 };
11310
11311 var ServiceWorkerModule = {
11312 name: 'sw',
11313 params: {
11314 serviceWorker: {
11315 path: undefined,
11316 scope: undefined,
11317 },
11318 },
11319 create: function create() {
11320 var app = this;
11321 Utils.extend(app, {
11322 serviceWorker: {
11323 container: ('serviceWorker' in window.navigator) ? window.navigator.serviceWorker : undefined,
11324 registrations: SW.registrations,
11325 register: SW.register.bind(app),
11326 unregister: SW.unregister.bind(app),
11327 },
11328 });
11329 },
11330 on: {
11331 init: function init() {
11332 if (!('serviceWorker' in window.navigator)) { return; }
11333 var app = this;
11334 if (!app.serviceWorker.container) { return; }
11335 var paths = app.params.serviceWorker.path;
11336 var scope = app.params.serviceWorker.scope;
11337 if (!paths || (Array.isArray(paths) && !paths.length)) { return; }
11338 var toRegister = Array.isArray(paths) ? paths : [paths];
11339 toRegister.forEach(function (path) {
11340 app.serviceWorker.register(path, scope);
11341 });
11342 },
11343 },
11344 };
11345
11346 var Statusbar = {
11347 hide: function hide() {
11348 $('html').removeClass('with-statusbar');
11349 if (Device.cordova && win.StatusBar) {
11350 win.StatusBar.hide();
11351 }
11352 },
11353 show: function show() {
11354 if (Device.cordova && win.StatusBar) {
11355 win.StatusBar.show();
11356 Utils.nextTick(function () {
11357 if (Device.needsStatusbarOverlay()) {
11358 $('html').addClass('with-statusbar');
11359 }
11360 });
11361 return;
11362 }
11363 $('html').addClass('with-statusbar');
11364 },
11365 onClick: function onClick() {
11366 var app = this;
11367 var pageContent;
11368 if ($('.popup.modal-in').length > 0) {
11369 // Check for opened popup
11370 pageContent = $('.popup.modal-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11371 } else if ($('.panel.panel-active').length > 0) {
11372 // Check for opened panel
11373 pageContent = $('.panel.panel-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11374 } else if ($('.views > .view.tab-active').length > 0) {
11375 // View in tab bar app layout
11376 pageContent = $('.views > .view.tab-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11377 } else if ($('.views').length > 0) {
11378 pageContent = $('.views').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11379 } else {
11380 pageContent = app.root.children('.view').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11381 }
11382
11383 if (pageContent && pageContent.length > 0) {
11384 // Check for tab
11385 if (pageContent.hasClass('tab')) {
11386 pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
11387 }
11388 if (pageContent.length > 0) { pageContent.scrollTop(0, 300); }
11389 }
11390 },
11391 setTextColor: function setTextColor(color) {
11392 if (Device.cordova && win.StatusBar) {
11393 if (color === 'white') {
11394 win.StatusBar.styleLightContent();
11395 } else {
11396 win.StatusBar.styleDefault();
11397 }
11398 }
11399 },
11400 setIosTextColor: function setIosTextColor(color) {
11401 if (!Device.ios) { return; }
11402 Statusbar.setTextColor(color);
11403 },
11404 setBackgroundColor: function setBackgroundColor(color) {
11405 $('.statusbar').css('background-color', color);
11406 if (Device.cordova && win.StatusBar) {
11407 win.StatusBar.backgroundColorByHexString(color);
11408 }
11409 },
11410 isVisible: function isVisible() {
11411 if (Device.cordova && win.StatusBar) {
11412 return win.StatusBar.isVisible;
11413 }
11414 return false;
11415 },
11416 overlaysWebView: function overlaysWebView(overlays) {
11417 if ( overlays === void 0 ) overlays = true;
11418
11419 if (Device.cordova && win.StatusBar) {
11420 win.StatusBar.overlaysWebView(overlays);
11421 if (overlays) {
11422 $('html').addClass('with-statusbar');
11423 } else {
11424 $('html').removeClass('with-statusbar');
11425 }
11426 }
11427 },
11428 checkOverlay: function checkOverlay() {
11429 if (Device.needsStatusbarOverlay()) {
11430 $('html').addClass('with-statusbar');
11431 } else {
11432 $('html').removeClass('with-statusbar');
11433 }
11434 },
11435 init: function init() {
11436 var app = this;
11437 var params = app.params.statusbar;
11438 if (!params.enabled) { return; }
11439
11440 if (params.overlay === 'auto') {
11441 if (Device.needsStatusbarOverlay()) {
11442 $('html').addClass('with-statusbar');
11443 } else {
11444 $('html').removeClass('with-statusbar');
11445 }
11446
11447 if (Device.ios && (Device.cordova || Device.webView)) {
11448 if (win.orientation === 0) {
11449 app.once('resize', function () {
11450 Statusbar.checkOverlay();
11451 });
11452 }
11453
11454 $(doc).on('resume', function () {
11455 Statusbar.checkOverlay();
11456 }, false);
11457
11458 app.on(Device.ios ? 'orientationchange' : 'orientationchange resize', function () {
11459 Statusbar.checkOverlay();
11460 });
11461 }
11462 } else if (params.overlay === true) {
11463 $('html').addClass('with-statusbar');
11464 } else if (params.overlay === false) {
11465 $('html').removeClass('with-statusbar');
11466 }
11467
11468 if (Device.cordova && win.StatusBar) {
11469 if (params.scrollTopOnClick) {
11470 $(win).on('statusTap', Statusbar.onClick.bind(app));
11471 }
11472 if (Device.ios) {
11473 if (params.iosOverlaysWebView) {
11474 win.StatusBar.overlaysWebView(true);
11475 } else {
11476 win.StatusBar.overlaysWebView(false);
11477 }
11478 if (params.iosTextColor === 'white') {
11479 win.StatusBar.styleLightContent();
11480 } else {
11481 win.StatusBar.styleDefault();
11482 }
11483 }
11484 if (Device.android) {
11485 if (params.androidOverlaysWebView) {
11486 win.StatusBar.overlaysWebView(true);
11487 } else {
11488 win.StatusBar.overlaysWebView(false);
11489 }
11490 if (params.androidTextColor === 'white') {
11491 win.StatusBar.styleLightContent();
11492 } else {
11493 win.StatusBar.styleDefault();
11494 }
11495 }
11496 }
11497 if (params.iosBackgroundColor && Device.ios) {
11498 Statusbar.setBackgroundColor(params.iosBackgroundColor);
11499 }
11500 if ((params.materialBackgroundColor || params.androidBackgroundColor) && Device.android) {
11501 Statusbar.setBackgroundColor(params.materialBackgroundColor || params.androidBackgroundColor);
11502 }
11503 },
11504 };
11505
11506 var Statusbar$1 = {
11507 name: 'statusbar',
11508 params: {
11509 statusbar: {
11510 enabled: true,
11511 overlay: 'auto',
11512 scrollTopOnClick: true,
11513
11514 iosOverlaysWebView: true,
11515 iosTextColor: 'black',
11516 iosBackgroundColor: null,
11517
11518 androidOverlaysWebView: false,
11519 androidTextColor: 'black',
11520 androidBackgroundColor: null,
11521 },
11522 },
11523 create: function create() {
11524 var app = this;
11525 Utils.extend(app, {
11526 statusbar: {
11527 checkOverlay: Statusbar.checkOverlay,
11528 hide: Statusbar.hide,
11529 show: Statusbar.show,
11530 overlaysWebView: Statusbar.overlaysWebView,
11531 setTextColor: Statusbar.setTextColor,
11532 setBackgroundColor: Statusbar.setBackgroundColor,
11533 isVisible: Statusbar.isVisible,
11534 init: Statusbar.init.bind(app),
11535 },
11536 });
11537 },
11538 on: {
11539 init: function init() {
11540 var app = this;
11541 Statusbar.init.call(app);
11542 },
11543 },
11544 clicks: {
11545 '.statusbar': function onStatusbarClick() {
11546 var app = this;
11547 if (!app.params.statusbar.enabled) { return; }
11548 if (!app.params.statusbar.scrollTopOnClick) { return; }
11549 Statusbar.onClick.call(app);
11550 },
11551 },
11552 };
11553
11554 function getCurrentView(app) {
11555 var popoverView = $('.popover.modal-in .view');
11556 var popupView = $('.popup.modal-in .view');
11557 var panelView = $('.panel.panel-active .view');
11558 var appViews = $('.views');
11559 if (appViews.length === 0) { appViews = app.root; }
11560 // Find active view as tab
11561 var appView = appViews.children('.view');
11562 // Propably in tabs or split view
11563 if (appView.length > 1) {
11564 if (appView.hasClass('tab')) {
11565 // Tabs
11566 appView = appViews.children('.view.tab-active');
11567 }
11568 }
11569 if (popoverView.length > 0 && popoverView[0].f7View) { return popoverView[0].f7View; }
11570 if (popupView.length > 0 && popupView[0].f7View) { return popupView[0].f7View; }
11571 if (panelView.length > 0 && panelView[0].f7View) { return panelView[0].f7View; }
11572 if (appView.length > 0) {
11573 if (appView.length === 1 && appView[0].f7View) { return appView[0].f7View; }
11574 if (appView.length > 1) {
11575 return app.views.main;
11576 }
11577 }
11578 return undefined;
11579 }
11580
11581 var View$1 = {
11582 name: 'view',
11583 params: {
11584 view: {
11585 name: undefined,
11586 main: false,
11587 router: true,
11588 linksView: null,
11589 stackPages: false,
11590 xhrCache: true,
11591 xhrCacheIgnore: [],
11592 xhrCacheIgnoreGetParameters: false,
11593 xhrCacheDuration: 1000 * 60 * 10, // Ten minutes
11594 preloadPreviousPage: true,
11595 allowDuplicateUrls: false,
11596 reloadPages: false,
11597 reloadDetail: false,
11598 masterDetailBreakpoint: 0,
11599 removeElements: true,
11600 removeElementsWithTimeout: false,
11601 removeElementsTimeout: 0,
11602 restoreScrollTopOnBack: true,
11603 unloadTabContent: true,
11604 passRouteQueryToRequest: true,
11605 passRouteParamsToRequest: false,
11606 // Swipe Back
11607 iosSwipeBack: true,
11608 iosSwipeBackAnimateShadow: true,
11609 iosSwipeBackAnimateOpacity: true,
11610 iosSwipeBackActiveArea: 30,
11611 iosSwipeBackThreshold: 0,
11612 mdSwipeBack: false,
11613 mdSwipeBackAnimateShadow: true,
11614 mdSwipeBackAnimateOpacity: false,
11615 mdSwipeBackActiveArea: 30,
11616 mdSwipeBackThreshold: 0,
11617 // Push State
11618 pushState: false,
11619 pushStateRoot: undefined,
11620 pushStateAnimate: true,
11621 pushStateAnimateOnLoad: false,
11622 pushStateSeparator: '#!',
11623 pushStateOnLoad: true,
11624 // Animate Pages
11625 animate: true,
11626 // iOS Dynamic Navbar
11627 iosDynamicNavbar: true,
11628 iosSeparateDynamicNavbar: true,
11629 // Animate iOS Navbar Back Icon
11630 iosAnimateNavbarBackIcon: true,
11631 // Delays
11632 iosPageLoadDelay: 0,
11633 mdPageLoadDelay: 0,
11634 // Routes hooks
11635 routesBeforeEnter: null,
11636 routesBeforeLeave: null,
11637 },
11638 },
11639 static: {
11640 View: View,
11641 },
11642 create: function create() {
11643 var app = this;
11644 Utils.extend(app, {
11645 views: Utils.extend([], {
11646 create: function create(el, params) {
11647 return new View(app, el, params);
11648 },
11649 get: function get(viewEl) {
11650 var $viewEl = $(viewEl);
11651 if ($viewEl.length && $viewEl[0].f7View) { return $viewEl[0].f7View; }
11652 return undefined;
11653 },
11654 }),
11655 });
11656 Object.defineProperty(app.views, 'current', {
11657 enumerable: true,
11658 configurable: true,
11659 get: function get() {
11660 return getCurrentView(app);
11661 },
11662 });
11663 // Alias
11664 app.view = app.views;
11665 },
11666 on: {
11667 init: function init() {
11668 var app = this;
11669 $('.view-init').each(function (index, viewEl) {
11670 if (viewEl.f7View) { return; }
11671 var viewParams = $(viewEl).dataset();
11672 app.views.create(viewEl, viewParams);
11673 });
11674 },
11675 modalOpen: function modalOpen(modal) {
11676 var app = this;
11677 modal.$el.find('.view-init').each(function (index, viewEl) {
11678 if (viewEl.f7View) { return; }
11679 var viewParams = $(viewEl).dataset();
11680 app.views.create(viewEl, viewParams);
11681 });
11682 },
11683 modalBeforeDestroy: function modalBeforeDestroy(modal) {
11684 if (!modal || !modal.$el) { return; }
11685 modal.$el.find('.view-init').each(function (index, viewEl) {
11686 var view = viewEl.f7View;
11687 if (!view) { return; }
11688 view.destroy();
11689 });
11690 },
11691 },
11692 };
11693
11694 var Navbar = {
11695 size: function size(el) {
11696 var app = this;
11697 if (app.theme === 'md' && !app.params.navbar.mdCenterTitle) { return; }
11698 var $el = $(el);
11699 if ($el.hasClass('navbar')) {
11700 $el = $el.children('.navbar-inner').each(function (index, navbarEl) {
11701 app.navbar.size(navbarEl);
11702 });
11703 return;
11704 }
11705
11706 if (
11707 $el.hasClass('stacked')
11708 || $el.parents('.stacked').length > 0
11709 || $el.parents('.tab:not(.tab-active)').length > 0
11710 || $el.parents('.popup:not(.modal-in)').length > 0
11711 ) {
11712 return;
11713 }
11714
11715 if (app.theme === 'md' && app.params.navbar.mdCenterTitle) {
11716 $el.addClass('navbar-inner-centered-title');
11717 }
11718 if (app.theme === 'ios' && !app.params.navbar.iosCenterTitle) {
11719 $el.addClass('navbar-inner-left-title');
11720 }
11721
11722 var $viewEl = $el.parents('.view').eq(0);
11723 var left = app.rtl ? $el.children('.right') : $el.children('.left');
11724 var right = app.rtl ? $el.children('.left') : $el.children('.right');
11725 var title = $el.children('.title');
11726 var subnavbar = $el.children('.subnavbar');
11727 var noLeft = left.length === 0;
11728 var noRight = right.length === 0;
11729 var leftWidth = noLeft ? 0 : left.outerWidth(true);
11730 var rightWidth = noRight ? 0 : right.outerWidth(true);
11731 var titleWidth = title.outerWidth(true);
11732 var navbarStyles = $el.styles();
11733 var navbarWidth = $el[0].offsetWidth;
11734 var navbarInnerWidth = navbarWidth - parseInt(navbarStyles.paddingLeft, 10) - parseInt(navbarStyles.paddingRight, 10);
11735 var isPrevious = $el.hasClass('navbar-previous');
11736 var sliding = $el.hasClass('sliding');
11737
11738 var router;
11739 var dynamicNavbar;
11740 var separateNavbar;
11741 var separateNavbarRightOffset = 0;
11742 var separateNavbarLeftOffset = 0;
11743
11744 if ($viewEl.length > 0 && $viewEl[0].f7View) {
11745 router = $viewEl[0].f7View.router;
11746 dynamicNavbar = router && router.dynamicNavbar;
11747 separateNavbar = router && router.separateNavbar;
11748 if (!separateNavbar) {
11749 separateNavbarRightOffset = navbarWidth;
11750 separateNavbarLeftOffset = navbarWidth / 5;
11751 }
11752 }
11753
11754 var currLeft;
11755 var diff;
11756 if (noRight) {
11757 currLeft = navbarInnerWidth - titleWidth;
11758 }
11759 if (noLeft) {
11760 currLeft = 0;
11761 }
11762 if (!noLeft && !noRight) {
11763 currLeft = ((navbarInnerWidth - rightWidth - titleWidth) + leftWidth) / 2;
11764 }
11765 var requiredLeft = (navbarInnerWidth - titleWidth) / 2;
11766 if (navbarInnerWidth - leftWidth - rightWidth > titleWidth) {
11767 if (requiredLeft < leftWidth) {
11768 requiredLeft = leftWidth;
11769 }
11770 if (requiredLeft + titleWidth > navbarInnerWidth - rightWidth) {
11771 requiredLeft = navbarInnerWidth - rightWidth - titleWidth;
11772 }
11773 diff = requiredLeft - currLeft;
11774 } else {
11775 diff = 0;
11776 }
11777
11778 // RTL inverter
11779 var inverter = app.rtl ? -1 : 1;
11780
11781 if (dynamicNavbar && app.theme === 'ios') {
11782 if (title.hasClass('sliding') || (title.length > 0 && sliding)) {
11783 var titleLeftOffset = (-(currLeft + diff) * inverter) + separateNavbarLeftOffset;
11784 var titleRightOffset = ((navbarInnerWidth - currLeft - diff - titleWidth) * inverter) - separateNavbarRightOffset;
11785
11786 if (isPrevious) {
11787 if (router && router.params.iosAnimateNavbarBackIcon) {
11788 var activeNavbarBackLink = $el.parent().find('.navbar-current').children('.left.sliding').find('.back .icon ~ span');
11789 if (activeNavbarBackLink.length > 0) {
11790 titleLeftOffset += activeNavbarBackLink[0].offsetLeft;
11791 }
11792 }
11793 }
11794 title[0].f7NavbarLeftOffset = titleLeftOffset;
11795 title[0].f7NavbarRightOffset = titleRightOffset;
11796 }
11797 if (!noLeft && (left.hasClass('sliding') || sliding)) {
11798 if (app.rtl) {
11799 left[0].f7NavbarLeftOffset = (-(navbarInnerWidth - left[0].offsetWidth) / 2) * inverter;
11800 left[0].f7NavbarRightOffset = leftWidth * inverter;
11801 } else {
11802 left[0].f7NavbarLeftOffset = -leftWidth + separateNavbarLeftOffset;
11803 left[0].f7NavbarRightOffset = ((navbarInnerWidth - left[0].offsetWidth) / 2) - separateNavbarRightOffset;
11804 if (router && router.params.iosAnimateNavbarBackIcon && left.find('.back .icon').length > 0) {
11805 if (left.find('.back .icon ~ span').length) {
11806 var leftOffset = left[0].f7NavbarLeftOffset;
11807 var rightOffset = left[0].f7NavbarRightOffset;
11808 left[0].f7NavbarLeftOffset = 0;
11809 left[0].f7NavbarRightOffset = 0;
11810 left.find('.back .icon ~ span')[0].f7NavbarLeftOffset = leftOffset;
11811 left.find('.back .icon ~ span')[0].f7NavbarRightOffset = rightOffset - left.find('.back .icon')[0].offsetWidth;
11812 }
11813 }
11814 }
11815 }
11816 if (!noRight && (right.hasClass('sliding') || sliding)) {
11817 if (app.rtl) {
11818 right[0].f7NavbarLeftOffset = -rightWidth * inverter;
11819 right[0].f7NavbarRightOffset = ((navbarInnerWidth - right[0].offsetWidth) / 2) * inverter;
11820 } else {
11821 right[0].f7NavbarLeftOffset = (-(navbarInnerWidth - right[0].offsetWidth) / 2) + separateNavbarLeftOffset;
11822 right[0].f7NavbarRightOffset = rightWidth - separateNavbarRightOffset;
11823 }
11824 }
11825 if (subnavbar.length && (subnavbar.hasClass('sliding') || sliding)) {
11826 subnavbar[0].f7NavbarLeftOffset = app.rtl ? subnavbar[0].offsetWidth : (-subnavbar[0].offsetWidth + separateNavbarLeftOffset);
11827 subnavbar[0].f7NavbarRightOffset = (-subnavbar[0].f7NavbarLeftOffset - separateNavbarRightOffset) + separateNavbarLeftOffset;
11828 }
11829 }
11830
11831 // Center title
11832 if (
11833 (app.theme === 'ios' && app.params.navbar.iosCenterTitle)
11834 || (app.theme === 'md' && app.params.navbar.mdCenterTitle)
11835 ) {
11836 var titleLeft = diff;
11837 if (app.rtl && noLeft && noRight && title.length > 0) { titleLeft = -titleLeft; }
11838 title.css({ left: (titleLeft + "px") });
11839 }
11840 },
11841 hide: function hide(el, animate) {
11842 if ( animate === void 0 ) animate = true;
11843
11844 var app = this;
11845 var $el = $(el);
11846 if ($el.hasClass('navbar-inner')) { $el = $el.parents('.navbar'); }
11847 if (!$el.length) { return; }
11848 if ($el.hasClass('navbar-hidden')) { return; }
11849 var className = "navbar-hidden" + (animate ? ' navbar-transitioning' : '');
11850 var currentIsLarge = app.theme === 'ios' ? $el.find('.navbar-current .title-large').length : $el.find('.title-large').length;
11851 if (currentIsLarge) {
11852 className += ' navbar-large-hidden';
11853 }
11854 $el.transitionEnd(function () {
11855 $el.removeClass('navbar-transitioning');
11856 });
11857 $el.addClass(className);
11858 },
11859 show: function show(el, animate) {
11860 if ( el === void 0 ) el = '.navbar-hidden';
11861 if ( animate === void 0 ) animate = true;
11862
11863 var $el = $(el);
11864 if ($el.hasClass('navbar-inner')) { $el = $el.parents('.navbar'); }
11865 if (!$el.length) { return; }
11866 if (!$el.hasClass('navbar-hidden')) { return; }
11867 if (animate) {
11868 $el.addClass('navbar-transitioning');
11869 $el.transitionEnd(function () {
11870 $el.removeClass('navbar-transitioning');
11871 });
11872 }
11873 $el.removeClass('navbar-hidden navbar-large-hidden');
11874 },
11875 getElByPage: function getElByPage(page) {
11876 var $pageEl;
11877 var $navbarInnerEl;
11878 var pageData;
11879 if (page.$navbarEl || page.$el) {
11880 pageData = page;
11881 $pageEl = page.$el;
11882 } else {
11883 $pageEl = $(page);
11884 if ($pageEl.length > 0) { pageData = $pageEl[0].f7Page; }
11885 }
11886 if (pageData && pageData.$navbarEl && pageData.$navbarEl.length > 0) {
11887 $navbarInnerEl = pageData.$navbarEl;
11888 } else if ($pageEl) {
11889 $navbarInnerEl = $pageEl.children('.navbar').children('.navbar-inner');
11890 }
11891 if (!$navbarInnerEl || ($navbarInnerEl && $navbarInnerEl.length === 0)) { return undefined; }
11892 return $navbarInnerEl[0];
11893 },
11894 getPageByEl: function getPageByEl(navbarInnerEl) {
11895 var $navbarInnerEl = $(navbarInnerEl);
11896 if ($navbarInnerEl.hasClass('navbar')) {
11897 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner');
11898 if ($navbarInnerEl.length > 1) { return undefined; }
11899 }
11900 if ($navbarInnerEl.parents('.page').length) {
11901 return $navbarInnerEl.parents('.page')[0];
11902 }
11903 var pageEl;
11904 $navbarInnerEl.parents('.view').find('.page').each(function (index, el) {
11905 if (el && el.f7Page && el.f7Page.navbarEl && $navbarInnerEl[0] === el.f7Page.navbarEl) {
11906 pageEl = el;
11907 }
11908 });
11909 return pageEl;
11910 },
11911
11912 collapseLargeTitle: function collapseLargeTitle(navbarInnerEl) {
11913 var app = this;
11914 var $navbarInnerEl = $(navbarInnerEl);
11915 if ($navbarInnerEl.hasClass('navbar')) {
11916 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner-large');
11917 if ($navbarInnerEl.length > 1) {
11918 $navbarInnerEl = $(navbarInnerEl).find('.navbar-inner-large.navbar-current');
11919 }
11920 if ($navbarInnerEl.length > 1 || !$navbarInnerEl.length) {
11921 return;
11922 }
11923 }
11924 var $pageEl = $(app.navbar.getPageByEl($navbarInnerEl));
11925 $navbarInnerEl.addClass('navbar-inner-large-collapsed');
11926 $pageEl.eq(0).addClass('page-with-navbar-large-collapsed').trigger('page:navbarlargecollapsed');
11927 if (app.theme === 'md') {
11928 $navbarInnerEl.parents('.navbar').addClass('navbar-large-collapsed');
11929 }
11930 },
11931 expandLargeTitle: function expandLargeTitle(navbarInnerEl) {
11932 var app = this;
11933 var $navbarInnerEl = $(navbarInnerEl);
11934 if ($navbarInnerEl.hasClass('navbar')) {
11935 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner-large');
11936 if ($navbarInnerEl.length > 1) {
11937 $navbarInnerEl = $(navbarInnerEl).find('.navbar-inner-large.navbar-current');
11938 }
11939 if ($navbarInnerEl.length > 1 || !$navbarInnerEl.length) {
11940 return;
11941 }
11942 }
11943 var $pageEl = $(app.navbar.getPageByEl($navbarInnerEl));
11944 $navbarInnerEl.removeClass('navbar-inner-large-collapsed');
11945 $pageEl.eq(0).removeClass('page-with-navbar-large-collapsed').trigger('page:navbarlargeexpanded');
11946 if (app.theme === 'md') {
11947 $navbarInnerEl.parents('.navbar').removeClass('navbar-large-collapsed');
11948 }
11949 },
11950 toggleLargeTitle: function toggleLargeTitle(navbarInnerEl) {
11951 var app = this;
11952 var $navbarInnerEl = $(navbarInnerEl);
11953 if ($navbarInnerEl.hasClass('navbar')) {
11954 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner-large');
11955 if ($navbarInnerEl.length > 1) {
11956 $navbarInnerEl = $(navbarInnerEl).find('.navbar-inner-large.navbar-current');
11957 }
11958 if ($navbarInnerEl.length > 1 || !$navbarInnerEl.length) {
11959 return;
11960 }
11961 }
11962 if ($navbarInnerEl.hasClass('navbar-inner-large-collapsed')) {
11963 app.navbar.expandLargeTitle($navbarInnerEl);
11964 } else {
11965 app.navbar.collapseLargeTitle($navbarInnerEl);
11966 }
11967 },
11968 initNavbarOnScroll: function initNavbarOnScroll(pageEl, navbarInnerEl, needHide, needCollapse) {
11969 var app = this;
11970 var $pageEl = $(pageEl);
11971 var $navbarInnerEl = $(navbarInnerEl);
11972 var $navbarEl = app.theme === 'md'
11973 ? $navbarInnerEl.parents('.navbar')
11974 : $(navbarInnerEl || app.navbar.getElByPage(pageEl)).closest('.navbar');
11975 var isLarge = $navbarInnerEl.find('.title-large').length || $navbarInnerEl.hasClass('.navbar-inner-large');
11976 var navbarHideHeight = 44;
11977 var snapPageScrollToLargeTitle = app.params.navbar.snapPageScrollToLargeTitle;
11978
11979 var previousScrollTop;
11980 var currentScrollTop;
11981
11982 var scrollHeight;
11983 var offsetHeight;
11984 var reachEnd;
11985 var action;
11986 var navbarHidden;
11987
11988 var navbarCollapsed;
11989 var navbarTitleLargeHeight;
11990 if (needCollapse || (needHide && isLarge)) {
11991 navbarTitleLargeHeight = $navbarInnerEl.css('--f7-navbar-large-title-height');
11992 if (navbarTitleLargeHeight && navbarTitleLargeHeight.indexOf('px') >= 0) {
11993 navbarTitleLargeHeight = parseInt(navbarTitleLargeHeight, 10);
11994 if (Number.isNaN(navbarTitleLargeHeight)) {
11995 navbarTitleLargeHeight = app.theme === 'ios' ? 52 : 48;
11996 }
11997 } else {
11998 navbarTitleLargeHeight = app.theme === 'ios' ? 52 : 48;
11999 }
12000 }
12001 if (needHide && isLarge) {
12002 navbarHideHeight += navbarTitleLargeHeight;
12003 }
12004
12005 var scrollChanged;
12006 var scrollContent;
12007 var scrollTimeoutId;
12008 var touchEndTimeoutId;
12009 var touchSnapTimeout = 70;
12010 var desktopSnapTimeout = 300;
12011
12012 function snapLargeNavbar() {
12013 var inSearchbarExpanded = $navbarInnerEl.hasClass('with-searchbar-expandable-enabled');
12014 if (inSearchbarExpanded) { return; }
12015 if (!scrollContent || currentScrollTop < 0) { return; }
12016 if (currentScrollTop >= navbarTitleLargeHeight / 2 && currentScrollTop < navbarTitleLargeHeight) {
12017 $(scrollContent).scrollTop(navbarTitleLargeHeight, 100);
12018 } else if (currentScrollTop < navbarTitleLargeHeight) {
12019 $(scrollContent).scrollTop(0, 200);
12020 }
12021 }
12022
12023 function handleLargeNavbarCollapse() {
12024 var collapseProgress = Math.min(Math.max((currentScrollTop / navbarTitleLargeHeight), 0), 1);
12025 var inSearchbarExpanded = $navbarInnerEl.hasClass('with-searchbar-expandable-enabled');
12026 if (inSearchbarExpanded) { return; }
12027 navbarCollapsed = $navbarInnerEl.hasClass('navbar-inner-large-collapsed');
12028 if (collapseProgress === 0 && navbarCollapsed) {
12029 app.navbar.expandLargeTitle($navbarInnerEl[0]);
12030 $navbarInnerEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12031 $pageEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12032 $navbarInnerEl[0].style.overflow = '';
12033 if (app.theme === 'md') {
12034 $navbarEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12035 }
12036 } else if (collapseProgress === 1 && !navbarCollapsed) {
12037 app.navbar.collapseLargeTitle($navbarInnerEl[0]);
12038 $navbarInnerEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12039 $navbarInnerEl[0].style.overflow = '';
12040 $pageEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12041 if (app.theme === 'md') {
12042 $navbarEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12043 }
12044 } else if ((collapseProgress === 1 && navbarCollapsed) || (collapseProgress === 0 && !navbarCollapsed)) {
12045 $navbarInnerEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12046 $navbarInnerEl[0].style.overflow = '';
12047 $pageEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12048 if (app.theme === 'md') {
12049 $navbarEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12050 }
12051 } else {
12052 $navbarInnerEl[0].style.setProperty('--f7-navbar-large-collapse-progress', collapseProgress);
12053 $navbarInnerEl[0].style.overflow = 'visible';
12054 $pageEl[0].style.setProperty('--f7-navbar-large-collapse-progress', collapseProgress);
12055 if (app.theme === 'md') {
12056 $navbarEl[0].style.setProperty('--f7-navbar-large-collapse-progress', collapseProgress);
12057 }
12058 }
12059
12060 if (snapPageScrollToLargeTitle) {
12061 if (!Support.touch) {
12062 clearTimeout(scrollTimeoutId);
12063 scrollTimeoutId = setTimeout(function () {
12064 snapLargeNavbar();
12065 }, desktopSnapTimeout);
12066 } else if (touchEndTimeoutId) {
12067 clearTimeout(touchEndTimeoutId);
12068 touchEndTimeoutId = null;
12069 touchEndTimeoutId = setTimeout(function () {
12070 snapLargeNavbar();
12071 clearTimeout(touchEndTimeoutId);
12072 touchEndTimeoutId = null;
12073 }, touchSnapTimeout);
12074 }
12075 }
12076 }
12077
12078 function handleTitleHideShow() {
12079 scrollHeight = scrollContent.scrollHeight;
12080 offsetHeight = scrollContent.offsetHeight;
12081 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
12082 navbarHidden = $navbarEl.hasClass('navbar-hidden');
12083
12084 if (reachEnd) {
12085 if (app.params.navbar.showOnPageScrollEnd) {
12086 action = 'show';
12087 }
12088 } else if (previousScrollTop > currentScrollTop) {
12089 if (app.params.navbar.showOnPageScrollTop || currentScrollTop <= navbarHideHeight) {
12090 action = 'show';
12091 } else {
12092 action = 'hide';
12093 }
12094 } else if (currentScrollTop > navbarHideHeight) {
12095 action = 'hide';
12096 } else {
12097 action = 'show';
12098 }
12099
12100 if (action === 'show' && navbarHidden) {
12101 app.navbar.show($navbarEl);
12102 navbarHidden = false;
12103 } else if (action === 'hide' && !navbarHidden) {
12104 app.navbar.hide($navbarEl);
12105 navbarHidden = true;
12106 }
12107 previousScrollTop = currentScrollTop;
12108 }
12109
12110 function handleScroll() {
12111 scrollContent = this;
12112 currentScrollTop = scrollContent.scrollTop;
12113 scrollChanged = currentScrollTop;
12114
12115 if (needCollapse) {
12116 handleLargeNavbarCollapse();
12117 }
12118 if ($pageEl.hasClass('page-previous')) { return; }
12119 if (needHide) {
12120 handleTitleHideShow();
12121 }
12122 }
12123 function handeTouchStart() {
12124 scrollChanged = false;
12125 }
12126 function handleTouchEnd() {
12127 clearTimeout(touchEndTimeoutId);
12128 touchEndTimeoutId = null;
12129 touchEndTimeoutId = setTimeout(function () {
12130 if (scrollChanged !== false) {
12131 snapLargeNavbar();
12132 clearTimeout(touchEndTimeoutId);
12133 touchEndTimeoutId = null;
12134 }
12135 }, touchSnapTimeout);
12136 }
12137 $pageEl.on('scroll', '.page-content', handleScroll, true);
12138 if (Support.touch && needCollapse && snapPageScrollToLargeTitle) {
12139 app.on('touchstart:passive', handeTouchStart);
12140 app.on('touchend:passive', handleTouchEnd);
12141 }
12142 if (needCollapse) {
12143 $pageEl.find('.page-content').each(function (pageContentIndex, pageContentEl) {
12144 if (pageContentEl.scrollTop > 0) { handleScroll.call(pageContentEl); }
12145 });
12146 }
12147 $pageEl[0].f7DetachNavbarScrollHandlers = function f7DetachNavbarScrollHandlers() {
12148 delete $pageEl[0].f7DetachNavbarScrollHandlers;
12149 $pageEl.off('scroll', '.page-content', handleScroll, true);
12150 if (Support.touch && needCollapse && snapPageScrollToLargeTitle) {
12151 app.off('touchstart:passive', handeTouchStart);
12152 app.off('touchend:passive', handleTouchEnd);
12153 }
12154 };
12155 },
12156 };
12157 var Navbar$1 = {
12158 name: 'navbar',
12159 create: function create() {
12160 var app = this;
12161 Utils.extend(app, {
12162 navbar: {
12163 size: Navbar.size.bind(app),
12164 hide: Navbar.hide.bind(app),
12165 show: Navbar.show.bind(app),
12166 getElByPage: Navbar.getElByPage.bind(app),
12167 getPageByEl: Navbar.getPageByEl.bind(app),
12168 collapseLargeTitle: Navbar.collapseLargeTitle.bind(app),
12169 expandLargeTitle: Navbar.expandLargeTitle.bind(app),
12170 toggleLargeTitle: Navbar.toggleLargeTitle.bind(app),
12171 initNavbarOnScroll: Navbar.initNavbarOnScroll.bind(app),
12172 },
12173 });
12174 },
12175 params: {
12176 navbar: {
12177 scrollTopOnTitleClick: true,
12178 iosCenterTitle: true,
12179 mdCenterTitle: false,
12180 hideOnPageScroll: false,
12181 showOnPageScrollEnd: true,
12182 showOnPageScrollTop: true,
12183 collapseLargeTitleOnScroll: true,
12184 snapPageScrollToLargeTitle: true,
12185 },
12186 },
12187 on: {
12188 'panelBreakpoint resize viewMasterDetailBreakpoint': function onResize() {
12189 var app = this;
12190 $('.navbar').each(function (index, navbarEl) {
12191 app.navbar.size(navbarEl);
12192 });
12193 },
12194 pageBeforeRemove: function pageBeforeRemove(page) {
12195 if (page.$el[0].f7DetachNavbarScrollHandlers) {
12196 page.$el[0].f7DetachNavbarScrollHandlers();
12197 }
12198 },
12199 pageBeforeIn: function pageBeforeIn(page) {
12200 var app = this;
12201 if (app.theme !== 'ios') { return; }
12202 var $navbarEl;
12203 var view = page.$el.parents('.view')[0].f7View;
12204 var navbarInnerEl = app.navbar.getElByPage(page);
12205 if (!navbarInnerEl) {
12206 $navbarEl = page.$el.parents('.view').children('.navbar');
12207 } else {
12208 $navbarEl = $(navbarInnerEl).parents('.navbar');
12209 }
12210 if (page.$el.hasClass('no-navbar') || (view.router.dynamicNavbar && !navbarInnerEl)) {
12211 var animate = !!(page.pageFrom && page.router.history.length > 0);
12212 app.navbar.hide($navbarEl, animate);
12213 } else {
12214 app.navbar.show($navbarEl);
12215 }
12216 },
12217 pageReinit: function pageReinit(page) {
12218 var app = this;
12219 var $navbarInnerEl = $(app.navbar.getElByPage(page));
12220 if (!$navbarInnerEl || $navbarInnerEl.length === 0) { return; }
12221 app.navbar.size($navbarInnerEl);
12222 },
12223 pageInit: function pageInit(page) {
12224 var app = this;
12225 var $navbarInnerEl = $(app.navbar.getElByPage(page));
12226 if (!$navbarInnerEl || $navbarInnerEl.length === 0) { return; }
12227
12228 // Size
12229 app.navbar.size($navbarInnerEl);
12230
12231 // Need Collapse On Scroll
12232 var needCollapseOnScrollHandler;
12233 if ($navbarInnerEl.children('.title-large').length > 0) {
12234 $navbarInnerEl.addClass('navbar-inner-large');
12235 }
12236 if ($navbarInnerEl.hasClass('navbar-inner-large')) {
12237 if (app.params.navbar.collapseLargeTitleOnScroll) { needCollapseOnScrollHandler = true; }
12238 if (app.theme === 'md') {
12239 $navbarInnerEl.parents('.navbar').addClass('navbar-large');
12240 }
12241 page.$el.addClass('page-with-navbar-large');
12242 }
12243
12244 // Need Hide On Scroll
12245 var needHideOnScrollHandler;
12246 if (
12247 app.params.navbar.hideOnPageScroll
12248 || page.$el.find('.hide-navbar-on-scroll').length
12249 || page.$el.hasClass('hide-navbar-on-scroll')
12250 || page.$el.find('.hide-bars-on-scroll').length
12251 || page.$el.hasClass('hide-bars-on-scroll')
12252 ) {
12253 if (
12254 page.$el.find('.keep-navbar-on-scroll').length
12255 || page.$el.hasClass('keep-navbar-on-scroll')
12256 || page.$el.find('.keep-bars-on-scroll').length
12257 || page.$el.hasClass('keep-bars-on-scroll')
12258 ) {
12259 needHideOnScrollHandler = false;
12260 } else {
12261 needHideOnScrollHandler = true;
12262 }
12263 }
12264
12265 if (needCollapseOnScrollHandler || needHideOnScrollHandler) {
12266 app.navbar.initNavbarOnScroll(page.el, $navbarInnerEl[0], needHideOnScrollHandler, needCollapseOnScrollHandler);
12267 }
12268 },
12269 modalOpen: function modalOpen(modal) {
12270 var app = this;
12271 if (
12272 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12273 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12274 ) {
12275 return;
12276 }
12277 modal.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12278 app.navbar.size(navbarEl);
12279 });
12280 },
12281 panelOpen: function panelOpen(panel) {
12282 var app = this;
12283 if (
12284 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12285 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12286 ) {
12287 return;
12288 }
12289 panel.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12290 app.navbar.size(navbarEl);
12291 });
12292 },
12293 panelSwipeOpen: function panelSwipeOpen(panel) {
12294 var app = this;
12295 if (
12296 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12297 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12298 ) {
12299 return;
12300 }
12301 panel.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12302 app.navbar.size(navbarEl);
12303 });
12304 },
12305 tabShow: function tabShow(tabEl) {
12306 var app = this;
12307 if (
12308 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12309 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12310 ) {
12311 return;
12312 }
12313 $(tabEl).find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12314 app.navbar.size(navbarEl);
12315 });
12316 },
12317 },
12318 clicks: {
12319 '.navbar .title': function onTitleClick($clickedEl) {
12320 var app = this;
12321 if (!app.params.navbar.scrollTopOnTitleClick) { return; }
12322 if ($clickedEl.closest('a').length > 0) {
12323 return;
12324 }
12325 var pageContent;
12326 // Find active page
12327 var navbar = $clickedEl.parents('.navbar');
12328
12329 // Static Layout
12330 pageContent = navbar.parents('.page-content');
12331
12332 if (pageContent.length === 0) {
12333 // Fixed Layout
12334 if (navbar.parents('.page').length > 0) {
12335 pageContent = navbar.parents('.page').find('.page-content');
12336 }
12337 // Through Layout
12338 if (pageContent.length === 0) {
12339 if (navbar.nextAll('.page-current:not(.stacked)').length > 0) {
12340 pageContent = navbar.nextAll('.page-current:not(.stacked)').find('.page-content');
12341 }
12342 }
12343 }
12344 if (pageContent && pageContent.length > 0) {
12345 // Check for tab
12346 if (pageContent.hasClass('tab')) {
12347 pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
12348 }
12349 if (pageContent.length > 0) { pageContent.scrollTop(0, 300); }
12350 }
12351 },
12352 },
12353 vnode: {
12354 'navbar-inner': {
12355 postpatch: function postpatch(vnode) {
12356 var app = this;
12357 if (
12358 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12359 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12360 ) {
12361 return;
12362 }
12363 app.navbar.size(vnode.elm);
12364 },
12365 },
12366 },
12367 };
12368
12369 var Toolbar = {
12370 setHighlight: function setHighlight(tabbarEl) {
12371 var app = this;
12372 if (app.theme !== 'md') { return; }
12373
12374 var $tabbarEl = $(tabbarEl);
12375
12376 if ($tabbarEl.length === 0 || !($tabbarEl.hasClass('tabbar') || $tabbarEl.hasClass('tabbar-labels'))) { return; }
12377
12378 var $highlightEl = $tabbarEl.find('.tab-link-highlight');
12379 var tabLinksCount = $tabbarEl.find('.tab-link').length;
12380 if (tabLinksCount === 0) {
12381 $highlightEl.remove();
12382 return;
12383 }
12384
12385 if ($highlightEl.length === 0) {
12386 $tabbarEl.children('.toolbar-inner').append('<span class="tab-link-highlight"></span>');
12387 $highlightEl = $tabbarEl.find('.tab-link-highlight');
12388 } else if ($highlightEl.next().length) {
12389 $tabbarEl.children('.toolbar-inner').append($highlightEl);
12390 }
12391
12392 var $activeLink = $tabbarEl.find('.tab-link-active');
12393 var highlightWidth;
12394 var highlightTranslate;
12395
12396 if ($tabbarEl.hasClass('tabbar-scrollable') && $activeLink && $activeLink[0]) {
12397 highlightWidth = ($activeLink[0].offsetWidth) + "px";
12398 highlightTranslate = ($activeLink[0].offsetLeft) + "px";
12399 } else {
12400 var activeIndex = $activeLink.index();
12401 highlightWidth = (100 / tabLinksCount) + "%";
12402 highlightTranslate = ((app.rtl ? -activeIndex : activeIndex) * 100) + "%";
12403 }
12404
12405 Utils.nextFrame(function () {
12406 $highlightEl
12407 .css('width', highlightWidth)
12408 .transform(("translate3d(" + highlightTranslate + ",0,0)"));
12409 });
12410 },
12411 init: function init(tabbarEl) {
12412 var app = this;
12413 app.toolbar.setHighlight(tabbarEl);
12414 },
12415 hide: function hide(el, animate) {
12416 if ( animate === void 0 ) animate = true;
12417
12418 var $el = $(el);
12419 if ($el.hasClass('toolbar-hidden')) { return; }
12420 var className = "toolbar-hidden" + (animate ? ' toolbar-transitioning' : '');
12421 $el.transitionEnd(function () {
12422 $el.removeClass('toolbar-transitioning');
12423 });
12424 $el.addClass(className);
12425 },
12426 show: function show(el, animate) {
12427 if ( animate === void 0 ) animate = true;
12428
12429 var $el = $(el);
12430 if (!$el.hasClass('toolbar-hidden')) { return; }
12431 if (animate) {
12432 $el.addClass('toolbar-transitioning');
12433 $el.transitionEnd(function () {
12434 $el.removeClass('toolbar-transitioning');
12435 });
12436 }
12437 $el.removeClass('toolbar-hidden');
12438 },
12439 initHideToolbarOnScroll: function initHideToolbarOnScroll(pageEl) {
12440 var app = this;
12441 var $pageEl = $(pageEl);
12442 var $toolbarEl = $pageEl.parents('.view').children('.toolbar');
12443 if ($toolbarEl.length === 0) {
12444 $toolbarEl = $pageEl.find('.toolbar');
12445 }
12446 if ($toolbarEl.length === 0) {
12447 $toolbarEl = $pageEl.parents('.views').children('.tabbar, .tabbar-labels');
12448 }
12449 if ($toolbarEl.length === 0) {
12450 return;
12451 }
12452
12453 var previousScrollTop;
12454 var currentScrollTop;
12455
12456 var scrollHeight;
12457 var offsetHeight;
12458 var reachEnd;
12459 var action;
12460 var toolbarHidden;
12461 function handleScroll() {
12462 var scrollContent = this;
12463 if ($pageEl.hasClass('page-previous')) { return; }
12464 currentScrollTop = scrollContent.scrollTop;
12465 scrollHeight = scrollContent.scrollHeight;
12466 offsetHeight = scrollContent.offsetHeight;
12467 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
12468 toolbarHidden = $toolbarEl.hasClass('toolbar-hidden');
12469
12470 if (reachEnd) {
12471 if (app.params.toolbar.showOnPageScrollEnd) {
12472 action = 'show';
12473 }
12474 } else if (previousScrollTop > currentScrollTop) {
12475 if (app.params.toolbar.showOnPageScrollTop || currentScrollTop <= 44) {
12476 action = 'show';
12477 } else {
12478 action = 'hide';
12479 }
12480 } else if (currentScrollTop > 44) {
12481 action = 'hide';
12482 } else {
12483 action = 'show';
12484 }
12485
12486 if (action === 'show' && toolbarHidden) {
12487 app.toolbar.show($toolbarEl);
12488 toolbarHidden = false;
12489 } else if (action === 'hide' && !toolbarHidden) {
12490 app.toolbar.hide($toolbarEl);
12491 toolbarHidden = true;
12492 }
12493
12494 previousScrollTop = currentScrollTop;
12495 }
12496 $pageEl.on('scroll', '.page-content', handleScroll, true);
12497 $pageEl[0].f7ScrollToolbarHandler = handleScroll;
12498 },
12499 };
12500 var Toolbar$1 = {
12501 name: 'toolbar',
12502 create: function create() {
12503 var app = this;
12504 Utils.extend(app, {
12505 toolbar: {
12506 hide: Toolbar.hide.bind(app),
12507 show: Toolbar.show.bind(app),
12508 setHighlight: Toolbar.setHighlight.bind(app),
12509 initHideToolbarOnScroll: Toolbar.initHideToolbarOnScroll.bind(app),
12510 init: Toolbar.init.bind(app),
12511 },
12512 });
12513 },
12514 params: {
12515 toolbar: {
12516 hideOnPageScroll: false,
12517 showOnPageScrollEnd: true,
12518 showOnPageScrollTop: true,
12519 },
12520 },
12521 on: {
12522 pageBeforeRemove: function pageBeforeRemove(page) {
12523 if (page.$el[0].f7ScrollToolbarHandler) {
12524 page.$el.off('scroll', '.page-content', page.$el[0].f7ScrollToolbarHandler, true);
12525 }
12526 },
12527 pageBeforeIn: function pageBeforeIn(page) {
12528 var app = this;
12529 var $toolbarEl = page.$el.parents('.view').children('.toolbar');
12530 if ($toolbarEl.length === 0) {
12531 $toolbarEl = page.$el.parents('.views').children('.tabbar, .tabbar-labels');
12532 }
12533 if ($toolbarEl.length === 0) {
12534 $toolbarEl = page.$el.find('.toolbar');
12535 }
12536 if ($toolbarEl.length === 0) {
12537 return;
12538 }
12539 if (page.$el.hasClass('no-toolbar')) {
12540 app.toolbar.hide($toolbarEl);
12541 } else {
12542 app.toolbar.show($toolbarEl);
12543 }
12544 },
12545 pageInit: function pageInit(page) {
12546 var app = this;
12547 page.$el.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
12548 app.toolbar.init(tabbarEl);
12549 });
12550 if (
12551 app.params.toolbar.hideOnPageScroll
12552 || page.$el.find('.hide-toolbar-on-scroll').length
12553 || page.$el.hasClass('hide-toolbar-on-scroll')
12554 || page.$el.find('.hide-bars-on-scroll').length
12555 || page.$el.hasClass('hide-bars-on-scroll')
12556 ) {
12557 if (
12558 page.$el.find('.keep-toolbar-on-scroll').length
12559 || page.$el.hasClass('keep-toolbar-on-scroll')
12560 || page.$el.find('.keep-bars-on-scroll').length
12561 || page.$el.hasClass('keep-bars-on-scroll')
12562 ) {
12563 return;
12564 }
12565 app.toolbar.initHideToolbarOnScroll(page.el);
12566 }
12567 },
12568 init: function init() {
12569 var app = this;
12570 app.root.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
12571 app.toolbar.init(tabbarEl);
12572 });
12573 },
12574 },
12575 };
12576
12577 var Subnavbar = {
12578 name: 'subnavbar',
12579 on: {
12580 pageInit: function pageInit(page) {
12581 if (page.$navbarEl && page.$navbarEl.length && page.$navbarEl.find('.subnavbar').length) {
12582 page.$el.addClass('page-with-subnavbar');
12583 }
12584 if (page.$el.find('.subnavbar').length) {
12585 page.$el.addClass('page-with-subnavbar');
12586 }
12587 },
12588 },
12589 };
12590
12591 var TouchRipple = function TouchRipple($el, x, y) {
12592 var ripple = this;
12593 if (!$el) { return undefined; }
12594 var box = $el[0].getBoundingClientRect();
12595 var center = {
12596 x: x - box.left,
12597 y: y - box.top,
12598 };
12599 var width = box.width;
12600 var height = box.height;
12601 var diameter = Math.max((Math.pow( ((Math.pow( height, 2 )) + (Math.pow( width, 2 ))), 0.5 )), 48);
12602
12603 ripple.$rippleWaveEl = $(("<div class=\"ripple-wave\" style=\"width: " + diameter + "px; height: " + diameter + "px; margin-top:-" + (diameter / 2) + "px; margin-left:-" + (diameter / 2) + "px; left:" + (center.x) + "px; top:" + (center.y) + "px;\"></div>"));
12604
12605 $el.prepend(ripple.$rippleWaveEl);
12606
12607 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
12608 // ripple._clientLeft = ripple.$rippleWaveEl[0].clientLeft;
12609 ripple.rippleTransform = "translate3d(" + (-center.x + (width / 2)) + "px, " + (-center.y + (height / 2)) + "px, 0) scale(1)";
12610
12611 Utils.nextFrame(function () {
12612 if (!ripple || !ripple.$rippleWaveEl) { return; }
12613 ripple.$rippleWaveEl.transform(ripple.rippleTransform);
12614 });
12615
12616 return ripple;
12617 };
12618
12619 TouchRipple.prototype.onRemove = function onRemove () {
12620 var ripple = this;
12621 if (ripple.$rippleWaveEl) {
12622 ripple.$rippleWaveEl.remove();
12623 }
12624 Object.keys(ripple).forEach(function (key) {
12625 ripple[key] = null;
12626 delete ripple[key];
12627 });
12628 ripple = null;
12629 };
12630
12631 TouchRipple.prototype.remove = function remove () {
12632 var ripple = this;
12633 if (ripple.removing) { return; }
12634 var $rippleWaveEl = this.$rippleWaveEl;
12635 var rippleTransform = this.rippleTransform;
12636 var removeTimeout = Utils.nextTick(function () {
12637 ripple.onRemove();
12638 }, 400);
12639 ripple.removing = true;
12640 $rippleWaveEl
12641 .addClass('ripple-wave-fill')
12642 .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'))
12643 .transitionEnd(function () {
12644 clearTimeout(removeTimeout);
12645 Utils.nextFrame(function () {
12646 $rippleWaveEl
12647 .addClass('ripple-wave-out')
12648 .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'));
12649
12650 removeTimeout = Utils.nextTick(function () {
12651 ripple.onRemove();
12652 }, 700);
12653
12654 $rippleWaveEl.transitionEnd(function () {
12655 clearTimeout(removeTimeout);
12656 ripple.onRemove();
12657 });
12658 });
12659 });
12660 };
12661
12662 var TouchRipple$1 = {
12663 name: 'touch-ripple',
12664 static: {
12665 TouchRipple: TouchRipple,
12666 },
12667 create: function create() {
12668 var app = this;
12669 app.touchRipple = {
12670 create: function create() {
12671 var args = [], len = arguments.length;
12672 while ( len-- ) args[ len ] = arguments[ len ];
12673
12674 return new (Function.prototype.bind.apply( TouchRipple, [ null ].concat( args) ));
12675 },
12676 };
12677 },
12678 };
12679
12680 var openedModals = [];
12681 var dialogsQueue = [];
12682 function clearDialogsQueue() {
12683 if (dialogsQueue.length === 0) { return; }
12684 var dialog = dialogsQueue.shift();
12685 dialog.open();
12686 }
12687 var Modal = /*@__PURE__*/(function (Framework7Class$$1) {
12688 function Modal(app, params) {
12689 Framework7Class$$1.call(this, params, [app]);
12690
12691 var modal = this;
12692
12693 var defaults = {};
12694
12695 // Extend defaults with modules params
12696 modal.useModulesParams(defaults);
12697
12698 modal.params = Utils.extend(defaults, params);
12699 modal.opened = false;
12700
12701 // Install Modules
12702 modal.useModules();
12703
12704 return this;
12705 }
12706
12707 if ( Framework7Class$$1 ) Modal.__proto__ = Framework7Class$$1;
12708 Modal.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
12709 Modal.prototype.constructor = Modal;
12710
12711 Modal.prototype.onOpen = function onOpen () {
12712 var modal = this;
12713 modal.opened = true;
12714 openedModals.push(modal);
12715 $('html').addClass(("with-modal-" + (modal.type.toLowerCase())));
12716 modal.$el.trigger(("modal:open " + (modal.type.toLowerCase()) + ":open"), modal);
12717 modal.emit(("local::open modalOpen " + (modal.type) + "Open"), modal);
12718 };
12719
12720 Modal.prototype.onOpened = function onOpened () {
12721 var modal = this;
12722 modal.$el.trigger(("modal:opened " + (modal.type.toLowerCase()) + ":opened"), modal);
12723 modal.emit(("local::opened modalOpened " + (modal.type) + "Opened"), modal);
12724 };
12725
12726 Modal.prototype.onClose = function onClose () {
12727 var modal = this;
12728 modal.opened = false;
12729 if (!modal.type || !modal.$el) { return; }
12730 openedModals.splice(openedModals.indexOf(modal), 1);
12731 $('html').removeClass(("with-modal-" + (modal.type.toLowerCase())));
12732 modal.$el.trigger(("modal:close " + (modal.type.toLowerCase()) + ":close"), modal);
12733 modal.emit(("local::close modalClose " + (modal.type) + "Close"), modal);
12734 };
12735
12736 Modal.prototype.onClosed = function onClosed () {
12737 var modal = this;
12738 if (!modal.type || !modal.$el) { return; }
12739 modal.$el.removeClass('modal-out');
12740 modal.$el.hide();
12741 modal.$el.trigger(("modal:closed " + (modal.type.toLowerCase()) + ":closed"), modal);
12742 modal.emit(("local::closed modalClosed " + (modal.type) + "Closed"), modal);
12743 };
12744
12745 Modal.prototype.open = function open (animateModal) {
12746 var modal = this;
12747 var app = modal.app;
12748 var $el = modal.$el;
12749 var $backdropEl = modal.$backdropEl;
12750 var type = modal.type;
12751 var animate = true;
12752 if (typeof animateModal !== 'undefined') { animate = animateModal; }
12753 else if (typeof modal.params.animate !== 'undefined') {
12754 animate = modal.params.animate;
12755 }
12756
12757 if (!$el || $el.hasClass('modal-in')) {
12758 return modal;
12759 }
12760
12761 if (type === 'dialog' && app.params.modal.queueDialogs) {
12762 var pushToQueue;
12763 if ($('.dialog.modal-in').length > 0) {
12764 pushToQueue = true;
12765 } else if (openedModals.length > 0) {
12766 openedModals.forEach(function (openedModal) {
12767 if (openedModal.type === 'dialog') { pushToQueue = true; }
12768 });
12769 }
12770 if (pushToQueue) {
12771 dialogsQueue.push(modal);
12772 return modal;
12773 }
12774 }
12775
12776 var $modalParentEl = $el.parent();
12777 var wasInDom = $el.parents(doc).length > 0;
12778 if (app.params.modal.moveToRoot && !$modalParentEl.is(app.root)) {
12779 app.root.append($el);
12780 modal.once((type + "Closed"), function () {
12781 if (wasInDom) {
12782 $modalParentEl.append($el);
12783 } else {
12784 $el.remove();
12785 }
12786 });
12787 }
12788 // Show Modal
12789 $el.show();
12790
12791 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
12792 modal._clientLeft = $el[0].clientLeft;
12793
12794 // Modal
12795 function transitionEnd() {
12796 if ($el.hasClass('modal-out')) {
12797 modal.onClosed();
12798 } else if ($el.hasClass('modal-in')) {
12799 modal.onOpened();
12800 }
12801 }
12802 if (animate) {
12803 if ($backdropEl) {
12804 $backdropEl.removeClass('not-animated');
12805 $backdropEl.addClass('backdrop-in');
12806 }
12807 $el
12808 .animationEnd(function () {
12809 transitionEnd();
12810 });
12811 $el
12812 .transitionEnd(function () {
12813 transitionEnd();
12814 });
12815 $el
12816 .removeClass('modal-out not-animated')
12817 .addClass('modal-in');
12818 modal.onOpen();
12819 } else {
12820 if ($backdropEl) {
12821 $backdropEl.addClass('backdrop-in not-animated');
12822 }
12823 $el.removeClass('modal-out').addClass('modal-in not-animated');
12824 modal.onOpen();
12825 modal.onOpened();
12826 }
12827
12828 return modal;
12829 };
12830
12831 Modal.prototype.close = function close (animateModal) {
12832 var modal = this;
12833 var $el = modal.$el;
12834 var $backdropEl = modal.$backdropEl;
12835
12836 var animate = true;
12837 if (typeof animateModal !== 'undefined') { animate = animateModal; }
12838 else if (typeof modal.params.animate !== 'undefined') {
12839 animate = modal.params.animate;
12840 }
12841
12842 if (!$el || !$el.hasClass('modal-in')) {
12843 return modal;
12844 }
12845
12846 // backdrop
12847 if ($backdropEl) {
12848 var needToHideBackdrop = true;
12849 if (modal.type === 'popup') {
12850 modal.$el.prevAll('.popup.modal-in').each(function (index, popupEl) {
12851 var popupInstance = popupEl.f7Modal;
12852 if (!popupInstance) { return; }
12853 if (
12854 popupInstance.params.closeByBackdropClick
12855 && popupInstance.params.backdrop
12856 && popupInstance.backdropEl === modal.backdropEl
12857 ) {
12858 needToHideBackdrop = false;
12859 }
12860 });
12861 }
12862 if (needToHideBackdrop) {
12863 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
12864 $backdropEl.removeClass('backdrop-in');
12865 }
12866 }
12867
12868 // Modal
12869 $el[animate ? 'removeClass' : 'addClass']('not-animated');
12870 function transitionEnd() {
12871 if ($el.hasClass('modal-out')) {
12872 modal.onClosed();
12873 } else if ($el.hasClass('modal-in')) {
12874 modal.onOpened();
12875 }
12876 }
12877 if (animate) {
12878 $el
12879 .animationEnd(function () {
12880 transitionEnd();
12881 });
12882 $el
12883 .transitionEnd(function () {
12884 transitionEnd();
12885 });
12886 $el
12887 .removeClass('modal-in')
12888 .addClass('modal-out');
12889 // Emit close
12890 modal.onClose();
12891 } else {
12892 $el
12893 .addClass('not-animated')
12894 .removeClass('modal-in')
12895 .addClass('modal-out');
12896 // Emit close
12897 modal.onClose();
12898 modal.onClosed();
12899 }
12900
12901 if (modal.type === 'dialog') {
12902 clearDialogsQueue();
12903 }
12904
12905 return modal;
12906 };
12907
12908 Modal.prototype.destroy = function destroy () {
12909 var modal = this;
12910 if (modal.destroyed) { return; }
12911 modal.emit(("local::beforeDestroy modalBeforeDestroy " + (modal.type) + "BeforeDestroy"), modal);
12912 if (modal.$el) {
12913 modal.$el.trigger(("modal:beforedestroy " + (modal.type.toLowerCase()) + ":beforedestroy"), modal);
12914 if (modal.$el.length && modal.$el[0].f7Modal) {
12915 delete modal.$el[0].f7Modal;
12916 }
12917 }
12918 Utils.deleteProps(modal);
12919 modal.destroyed = true;
12920 };
12921
12922 return Modal;
12923 }(Framework7Class));
12924
12925 var CustomModal = /*@__PURE__*/(function (Modal$$1) {
12926 function CustomModal(app, params) {
12927 var extendedParams = Utils.extend({
12928 backdrop: true,
12929 closeByBackdropClick: true,
12930 on: {},
12931 }, params);
12932
12933 // Extends with open/close Modal methods;
12934 Modal$$1.call(this, app, extendedParams);
12935
12936 var customModal = this;
12937
12938 customModal.params = extendedParams;
12939
12940 // Find Element
12941 var $el;
12942 if (!customModal.params.el) {
12943 $el = $(customModal.params.content);
12944 } else {
12945 $el = $(customModal.params.el);
12946 }
12947
12948 if ($el && $el.length > 0 && $el[0].f7Modal) {
12949 return $el[0].f7Modal;
12950 }
12951
12952 if ($el.length === 0) {
12953 return customModal.destroy();
12954 }
12955 var $backdropEl;
12956 if (customModal.params.backdrop) {
12957 $backdropEl = app.root.children('.custom-modal-backdrop');
12958 if ($backdropEl.length === 0) {
12959 $backdropEl = $('<div class="custom-modal-backdrop"></div>');
12960 app.root.append($backdropEl);
12961 }
12962 }
12963
12964 function handleClick(e) {
12965 if (!customModal || customModal.destroyed) { return; }
12966 if ($backdropEl && e.target === $backdropEl[0]) {
12967 customModal.close();
12968 }
12969 }
12970
12971 customModal.on('customModalOpened', function () {
12972 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
12973 app.on('click', handleClick);
12974 }
12975 });
12976 customModal.on('customModalClose', function () {
12977 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
12978 app.off('click', handleClick);
12979 }
12980 });
12981
12982 Utils.extend(customModal, {
12983 app: app,
12984 $el: $el,
12985 el: $el[0],
12986 $backdropEl: $backdropEl,
12987 backdropEl: $backdropEl && $backdropEl[0],
12988 type: 'customModal',
12989 });
12990
12991 $el[0].f7Modal = customModal;
12992
12993 return customModal;
12994 }
12995
12996 if ( Modal$$1 ) CustomModal.__proto__ = Modal$$1;
12997 CustomModal.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
12998 CustomModal.prototype.constructor = CustomModal;
12999
13000 return CustomModal;
13001 }(Modal));
13002
13003 var Modal$1 = {
13004 name: 'modal',
13005 static: {
13006 Modal: Modal,
13007 CustomModal: CustomModal,
13008 },
13009 create: function create() {
13010 var app = this;
13011 app.customModal = {
13012 create: function create(params) {
13013 return new CustomModal(app, params);
13014 },
13015 };
13016 },
13017 params: {
13018 modal: {
13019 moveToRoot: true,
13020 queueDialogs: true,
13021 },
13022 },
13023 };
13024
13025 var Dialog = /*@__PURE__*/(function (Modal$$1) {
13026 function Dialog(app, params) {
13027 var extendedParams = Utils.extend({
13028 title: app.params.dialog.title,
13029 text: undefined,
13030 content: '',
13031 buttons: [],
13032 verticalButtons: false,
13033 onClick: undefined,
13034 cssClass: undefined,
13035 destroyOnClose: false,
13036 on: {},
13037 }, params);
13038 if (typeof extendedParams.closeByBackdropClick === 'undefined') {
13039 extendedParams.closeByBackdropClick = app.params.dialog.closeByBackdropClick;
13040 }
13041
13042 // Extends with open/close Modal methods;
13043 Modal$$1.call(this, app, extendedParams);
13044
13045 var dialog = this;
13046
13047 var title = extendedParams.title;
13048 var text = extendedParams.text;
13049 var content = extendedParams.content;
13050 var buttons = extendedParams.buttons;
13051 var verticalButtons = extendedParams.verticalButtons;
13052 var cssClass = extendedParams.cssClass;
13053
13054 dialog.params = extendedParams;
13055
13056 // Find Element
13057 var $el;
13058 if (!dialog.params.el) {
13059 var dialogClasses = ['dialog'];
13060 if (buttons.length === 0) { dialogClasses.push('dialog-no-buttons'); }
13061 if (buttons.length > 0) { dialogClasses.push(("dialog-buttons-" + (buttons.length))); }
13062 if (verticalButtons) { dialogClasses.push('dialog-buttons-vertical'); }
13063 if (cssClass) { dialogClasses.push(cssClass); }
13064
13065 var buttonsHTML = '';
13066 if (buttons.length > 0) {
13067 buttonsHTML = "\n <div class=\"dialog-buttons\">\n " + (buttons.map(function (button) { return ("\n <span class=\"dialog-button" + (button.bold ? ' dialog-button-bold' : '') + (button.color ? (" color-" + (button.color)) : '') + (button.cssClass ? (" " + (button.cssClass)) : '') + "\">" + (button.text) + "</span>\n "); }).join('')) + "\n </div>\n ";
13068 }
13069
13070 var dialogHtml = "\n <div class=\"" + (dialogClasses.join(' ')) + "\">\n <div class=\"dialog-inner\">\n " + (title ? ("<div class=\"dialog-title\">" + title + "</div>") : '') + "\n " + (text ? ("<div class=\"dialog-text\">" + text + "</div>") : '') + "\n " + content + "\n </div>\n " + buttonsHTML + "\n </div>\n ";
13071 $el = $(dialogHtml);
13072 } else {
13073 $el = $(dialog.params.el);
13074 }
13075
13076 if ($el && $el.length > 0 && $el[0].f7Modal) {
13077 return $el[0].f7Modal;
13078 }
13079
13080 if ($el.length === 0) {
13081 return dialog.destroy();
13082 }
13083
13084 var $backdropEl = app.root.children('.dialog-backdrop');
13085 if ($backdropEl.length === 0) {
13086 $backdropEl = $('<div class="dialog-backdrop"></div>');
13087 app.root.append($backdropEl);
13088 }
13089
13090 // Assign events
13091 function buttonOnClick(e) {
13092 var buttonEl = this;
13093 var index = $(buttonEl).index();
13094 var button = buttons[index];
13095 if (button.onClick) { button.onClick(dialog, e); }
13096 if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
13097 if (button.close !== false) { dialog.close(); }
13098 }
13099 var addKeyboardHander;
13100 function onKeyPress(e) {
13101 var keyCode = e.keyCode;
13102 buttons.forEach(function (button, index) {
13103 if (button.keyCodes && button.keyCodes.indexOf(keyCode) >= 0) {
13104 if (doc.activeElement) { doc.activeElement.blur(); }
13105 if (button.onClick) { button.onClick(dialog, e); }
13106 if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
13107 if (button.close !== false) { dialog.close(); }
13108 }
13109 });
13110 }
13111 if (buttons && buttons.length > 0) {
13112 dialog.on('open', function () {
13113 $el.find('.dialog-button').each(function (index, buttonEl) {
13114 var button = buttons[index];
13115 if (button.keyCodes) { addKeyboardHander = true; }
13116 $(buttonEl).on('click', buttonOnClick);
13117 });
13118 if (
13119 addKeyboardHander
13120 && !app.device.ios
13121 && !app.device.android
13122 && !app.device.cordova
13123 ) {
13124 $(doc).on('keydown', onKeyPress);
13125 }
13126 });
13127 dialog.on('close', function () {
13128 $el.find('.dialog-button').each(function (index, buttonEl) {
13129 $(buttonEl).off('click', buttonOnClick);
13130 });
13131 if (
13132 addKeyboardHander
13133 && !app.device.ios
13134 && !app.device.android
13135 && !app.device.cordova
13136 ) {
13137 $(doc).off('keydown', onKeyPress);
13138 }
13139 addKeyboardHander = false;
13140 });
13141 }
13142 Utils.extend(dialog, {
13143 app: app,
13144 $el: $el,
13145 el: $el[0],
13146 $backdropEl: $backdropEl,
13147 backdropEl: $backdropEl[0],
13148 type: 'dialog',
13149 setProgress: function setProgress(progress, duration) {
13150 app.progressbar.set($el.find('.progressbar'), progress, duration);
13151 return dialog;
13152 },
13153 setText: function setText(newText) {
13154 var $textEl = $el.find('.dialog-text');
13155 if ($textEl.length === 0) {
13156 $textEl = $('<div class="dialog-text"></div>');
13157 if (typeof title !== 'undefined') {
13158 $textEl.insertAfter($el.find('.dialog-title'));
13159 } else {
13160 $el.find('.dialog-inner').prepend($textEl);
13161 }
13162 }
13163 $textEl.html(newText);
13164 dialog.params.text = newText;
13165 return dialog;
13166 },
13167 setTitle: function setTitle(newTitle) {
13168 var $titleEl = $el.find('.dialog-title');
13169 if ($titleEl.length === 0) {
13170 $titleEl = $('<div class="dialog-title"></div>');
13171 $el.find('.dialog-inner').prepend($titleEl);
13172 }
13173 $titleEl.html(newTitle);
13174 dialog.params.title = newTitle;
13175 return dialog;
13176 },
13177 });
13178
13179 function handleClick(e) {
13180 var target = e.target;
13181 var $target = $(target);
13182 if ($target.closest(dialog.el).length === 0) {
13183 if (
13184 dialog.params.closeByBackdropClick
13185 && dialog.backdropEl
13186 && dialog.backdropEl === target
13187 ) {
13188 dialog.close();
13189 }
13190 }
13191 }
13192
13193 dialog.on('opened', function () {
13194 if (dialog.params.closeByBackdropClick) {
13195 app.on('click', handleClick);
13196 }
13197 });
13198 dialog.on('close', function () {
13199 if (dialog.params.closeByBackdropClick) {
13200 app.off('click', handleClick);
13201 }
13202 });
13203
13204 $el[0].f7Modal = dialog;
13205
13206 if (dialog.params.destroyOnClose) {
13207 dialog.once('closed', function () {
13208 setTimeout(function () {
13209 dialog.destroy();
13210 }, 0);
13211 });
13212 }
13213
13214 return dialog;
13215 }
13216
13217 if ( Modal$$1 ) Dialog.__proto__ = Modal$$1;
13218 Dialog.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
13219 Dialog.prototype.constructor = Dialog;
13220
13221 return Dialog;
13222 }(Modal));
13223
13224 var Dialog$1 = {
13225 name: 'dialog',
13226 params: {
13227 dialog: {
13228 title: undefined,
13229 buttonOk: 'OK',
13230 buttonCancel: 'Cancel',
13231 usernamePlaceholder: 'Username',
13232 passwordPlaceholder: 'Password',
13233 preloaderTitle: 'Loading... ',
13234 progressTitle: 'Loading... ',
13235 closeByBackdropClick: false,
13236 destroyPredefinedDialogs: true,
13237 keyboardActions: true,
13238 },
13239 },
13240 static: {
13241 Dialog: Dialog,
13242 },
13243 create: function create() {
13244 var app = this;
13245 function defaultDialogTitle() {
13246 return app.params.dialog.title || app.name;
13247 }
13248 var destroyOnClose = app.params.dialog.destroyPredefinedDialogs;
13249 var keyboardActions = app.params.dialog.keyboardActions;
13250 app.dialog = Utils.extend(
13251 ModalMethods({
13252 app: app,
13253 constructor: Dialog,
13254 defaultSelector: '.dialog.modal-in',
13255 }),
13256 {
13257 // Shortcuts
13258 alert: function alert() {
13259 var assign;
13260
13261 var args = [], len = arguments.length;
13262 while ( len-- ) args[ len ] = arguments[ len ];
13263 var text = args[0];
13264 var title = args[1];
13265 var callbackOk = args[2];
13266 if (args.length === 2 && typeof args[1] === 'function') {
13267 (assign = args, text = assign[0], callbackOk = assign[1], title = assign[2]);
13268 }
13269 return new Dialog(app, {
13270 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13271 text: text,
13272 buttons: [{
13273 text: app.params.dialog.buttonOk,
13274 bold: true,
13275 onClick: callbackOk,
13276 keyCodes: keyboardActions ? [13, 27] : null,
13277 }],
13278 destroyOnClose: destroyOnClose,
13279 }).open();
13280 },
13281 prompt: function prompt() {
13282 var assign;
13283
13284 var args = [], len = arguments.length;
13285 while ( len-- ) args[ len ] = arguments[ len ];
13286 var text = args[0];
13287 var title = args[1];
13288 var callbackOk = args[2];
13289 var callbackCancel = args[3];
13290 var defaultValue = args[4];
13291 if (typeof args[1] === 'function') {
13292 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], defaultValue = assign[3], title = assign[4]);
13293 }
13294 defaultValue = typeof defaultValue === 'undefined' || defaultValue === null ? '' : defaultValue;
13295 return new Dialog(app, {
13296 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13297 text: text,
13298 content: ("<div class=\"dialog-input-field input\"><input type=\"text\" class=\"dialog-input\" value=\"" + defaultValue + "\"></div>"),
13299 buttons: [
13300 {
13301 text: app.params.dialog.buttonCancel,
13302 keyCodes: keyboardActions ? [27] : null,
13303 },
13304 {
13305 text: app.params.dialog.buttonOk,
13306 bold: true,
13307 keyCodes: keyboardActions ? [13] : null,
13308 } ],
13309 onClick: function onClick(dialog, index) {
13310 var inputValue = dialog.$el.find('.dialog-input').val();
13311 if (index === 0 && callbackCancel) { callbackCancel(inputValue); }
13312 if (index === 1 && callbackOk) { callbackOk(inputValue); }
13313 },
13314 destroyOnClose: destroyOnClose,
13315 }).open();
13316 },
13317 confirm: function confirm() {
13318 var assign;
13319
13320 var args = [], len = arguments.length;
13321 while ( len-- ) args[ len ] = arguments[ len ];
13322 var text = args[0];
13323 var title = args[1];
13324 var callbackOk = args[2];
13325 var callbackCancel = args[3];
13326 if (typeof args[1] === 'function') {
13327 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
13328 }
13329 return new Dialog(app, {
13330 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13331 text: text,
13332 buttons: [
13333 {
13334 text: app.params.dialog.buttonCancel,
13335 onClick: callbackCancel,
13336 keyCodes: keyboardActions ? [27] : null,
13337 },
13338 {
13339 text: app.params.dialog.buttonOk,
13340 bold: true,
13341 onClick: callbackOk,
13342 keyCodes: keyboardActions ? [13] : null,
13343 } ],
13344 destroyOnClose: destroyOnClose,
13345 }).open();
13346 },
13347 login: function login() {
13348 var assign;
13349
13350 var args = [], len = arguments.length;
13351 while ( len-- ) args[ len ] = arguments[ len ];
13352 var text = args[0];
13353 var title = args[1];
13354 var callbackOk = args[2];
13355 var callbackCancel = args[3];
13356 if (typeof args[1] === 'function') {
13357 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
13358 }
13359 return new Dialog(app, {
13360 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13361 text: text,
13362 content: ("\n <div class=\"dialog-input-field dialog-input-double input\">\n <input type=\"text\" name=\"dialog-username\" placeholder=\"" + (app.params.dialog.usernamePlaceholder) + "\" class=\"dialog-input\">\n </div>\n <div class=\"dialog-input-field dialog-input-double input\">\n <input type=\"password\" name=\"dialog-password\" placeholder=\"" + (app.params.dialog.passwordPlaceholder) + "\" class=\"dialog-input\">\n </div>"),
13363 buttons: [
13364 {
13365 text: app.params.dialog.buttonCancel,
13366 keyCodes: keyboardActions ? [27] : null,
13367 },
13368 {
13369 text: app.params.dialog.buttonOk,
13370 bold: true,
13371 keyCodes: keyboardActions ? [13] : null,
13372 } ],
13373 onClick: function onClick(dialog, index) {
13374 var username = dialog.$el.find('[name="dialog-username"]').val();
13375 var password = dialog.$el.find('[name="dialog-password"]').val();
13376 if (index === 0 && callbackCancel) { callbackCancel(username, password); }
13377 if (index === 1 && callbackOk) { callbackOk(username, password); }
13378 },
13379 destroyOnClose: destroyOnClose,
13380 }).open();
13381 },
13382 password: function password() {
13383 var assign;
13384
13385 var args = [], len = arguments.length;
13386 while ( len-- ) args[ len ] = arguments[ len ];
13387 var text = args[0];
13388 var title = args[1];
13389 var callbackOk = args[2];
13390 var callbackCancel = args[3];
13391 if (typeof args[1] === 'function') {
13392 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
13393 }
13394 return new Dialog(app, {
13395 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13396 text: text,
13397 content: ("\n <div class=\"dialog-input-field input\">\n <input type=\"password\" name=\"dialog-password\" placeholder=\"" + (app.params.dialog.passwordPlaceholder) + "\" class=\"dialog-input\">\n </div>"),
13398 buttons: [
13399 {
13400 text: app.params.dialog.buttonCancel,
13401 keyCodes: keyboardActions ? [27] : null,
13402 },
13403 {
13404 text: app.params.dialog.buttonOk,
13405 bold: true,
13406 keyCodes: keyboardActions ? [13] : null,
13407 } ],
13408 onClick: function onClick(dialog, index) {
13409 var password = dialog.$el.find('[name="dialog-password"]').val();
13410 if (index === 0 && callbackCancel) { callbackCancel(password); }
13411 if (index === 1 && callbackOk) { callbackOk(password); }
13412 },
13413 destroyOnClose: destroyOnClose,
13414 }).open();
13415 },
13416 preloader: function preloader(title, color) {
13417 var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
13418 return new Dialog(app, {
13419 title: typeof title === 'undefined' || title === null ? app.params.dialog.preloaderTitle : title,
13420 content: ("<div class=\"preloader" + (color ? (" color-" + color) : '') + "\">" + preloaderInner + "</div>"),
13421 cssClass: 'dialog-preloader',
13422 destroyOnClose: destroyOnClose,
13423 }).open();
13424 },
13425 progress: function progress() {
13426 var assign, assign$1, assign$2;
13427
13428 var args = [], len = arguments.length;
13429 while ( len-- ) args[ len ] = arguments[ len ];
13430 var title = args[0];
13431 var progress = args[1];
13432 var color = args[2];
13433 if (args.length === 2) {
13434 if (typeof args[0] === 'number') {
13435 (assign = args, progress = assign[0], color = assign[1], title = assign[2]);
13436 } else if (typeof args[0] === 'string' && typeof args[1] === 'string') {
13437 (assign$1 = args, title = assign$1[0], color = assign$1[1], progress = assign$1[2]);
13438 }
13439 } else if (args.length === 1) {
13440 if (typeof args[0] === 'number') {
13441 (assign$2 = args, progress = assign$2[0], title = assign$2[1], color = assign$2[2]);
13442 }
13443 }
13444 var infinite = typeof progress === 'undefined';
13445 var dialog = new Dialog(app, {
13446 title: typeof title === 'undefined' ? app.params.dialog.progressTitle : title,
13447 cssClass: 'dialog-progress',
13448 content: ("\n <div class=\"progressbar" + (infinite ? '-infinite' : '') + (color ? (" color-" + color) : '') + "\">\n " + (!infinite ? '<span></span>' : '') + "\n </div>\n "),
13449 destroyOnClose: destroyOnClose,
13450 });
13451 if (!infinite) { dialog.setProgress(progress); }
13452 return dialog.open();
13453 },
13454 }
13455 );
13456 },
13457 };
13458
13459 var Popup = /*@__PURE__*/(function (Modal$$1) {
13460 function Popup(app, params) {
13461 var extendedParams = Utils.extend(
13462 { on: {} },
13463 app.params.popup,
13464 params
13465 );
13466
13467 // Extends with open/close Modal methods;
13468 Modal$$1.call(this, app, extendedParams);
13469
13470 var popup = this;
13471
13472 popup.params = extendedParams;
13473
13474 // Find Element
13475 var $el;
13476 if (!popup.params.el) {
13477 $el = $(popup.params.content);
13478 } else {
13479 $el = $(popup.params.el);
13480 }
13481
13482 if ($el && $el.length > 0 && $el[0].f7Modal) {
13483 return $el[0].f7Modal;
13484 }
13485
13486 if ($el.length === 0) {
13487 return popup.destroy();
13488 }
13489
13490 var $backdropEl;
13491 if (popup.params.backdrop) {
13492 $backdropEl = app.root.children('.popup-backdrop');
13493 if ($backdropEl.length === 0) {
13494 $backdropEl = $('<div class="popup-backdrop"></div>');
13495 app.root.append($backdropEl);
13496 }
13497 }
13498
13499 Utils.extend(popup, {
13500 app: app,
13501 $el: $el,
13502 el: $el[0],
13503 $backdropEl: $backdropEl,
13504 backdropEl: $backdropEl && $backdropEl[0],
13505 type: 'popup',
13506 });
13507
13508 function handleClick(e) {
13509 var target = e.target;
13510 var $target = $(target);
13511 if ($target.closest(popup.el).length === 0) {
13512 if (
13513 popup.params
13514 && popup.params.closeByBackdropClick
13515 && popup.params.backdrop
13516 && popup.backdropEl
13517 && popup.backdropEl === target
13518 ) {
13519 var needToClose = true;
13520 popup.$el.nextAll('.popup.modal-in').each(function (index, popupEl) {
13521 var popupInstance = popupEl.f7Modal;
13522 if (!popupInstance) { return; }
13523 if (
13524 popupInstance.params.closeByBackdropClick
13525 && popupInstance.params.backdrop
13526 && popupInstance.backdropEl === popup.backdropEl
13527 ) {
13528 needToClose = false;
13529 }
13530 });
13531 if (needToClose) {
13532 popup.close();
13533 }
13534 }
13535 }
13536 }
13537
13538 popup.on('popupOpened', function () {
13539 if (popup.params.closeByBackdropClick) {
13540 app.on('click', handleClick);
13541 }
13542 });
13543 popup.on('popupClose', function () {
13544 if (popup.params.closeByBackdropClick) {
13545 app.off('click', handleClick);
13546 }
13547 });
13548
13549 $el[0].f7Modal = popup;
13550
13551 return popup;
13552 }
13553
13554 if ( Modal$$1 ) Popup.__proto__ = Modal$$1;
13555 Popup.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
13556 Popup.prototype.constructor = Popup;
13557
13558 return Popup;
13559 }(Modal));
13560
13561 var Popup$1 = {
13562 name: 'popup',
13563 params: {
13564 popup: {
13565 backdrop: true,
13566 closeByBackdropClick: true,
13567 },
13568 },
13569 static: {
13570 Popup: Popup,
13571 },
13572 create: function create() {
13573 var app = this;
13574 app.popup = ModalMethods({
13575 app: app,
13576 constructor: Popup,
13577 defaultSelector: '.popup.modal-in',
13578 });
13579 },
13580 clicks: {
13581 '.popup-open': function openPopup($clickedEl, data) {
13582 if ( data === void 0 ) data = {};
13583
13584 var app = this;
13585 app.popup.open(data.popup, data.animate);
13586 },
13587 '.popup-close': function closePopup($clickedEl, data) {
13588 if ( data === void 0 ) data = {};
13589
13590 var app = this;
13591 app.popup.close(data.popup, data.animate);
13592 },
13593 },
13594 };
13595
13596 var LoginScreen = /*@__PURE__*/(function (Modal$$1) {
13597 function LoginScreen(app, params) {
13598 var extendedParams = Utils.extend({
13599 on: {},
13600 }, params);
13601
13602 // Extends with open/close Modal methods;
13603 Modal$$1.call(this, app, extendedParams);
13604
13605 var loginScreen = this;
13606
13607 loginScreen.params = extendedParams;
13608
13609 // Find Element
13610 var $el;
13611 if (!loginScreen.params.el) {
13612 $el = $(loginScreen.params.content);
13613 } else {
13614 $el = $(loginScreen.params.el);
13615 }
13616
13617 if ($el && $el.length > 0 && $el[0].f7Modal) {
13618 return $el[0].f7Modal;
13619 }
13620
13621 if ($el.length === 0) {
13622 return loginScreen.destroy();
13623 }
13624
13625 Utils.extend(loginScreen, {
13626 app: app,
13627 $el: $el,
13628 el: $el[0],
13629 type: 'loginScreen',
13630 });
13631
13632 $el[0].f7Modal = loginScreen;
13633
13634 return loginScreen;
13635 }
13636
13637 if ( Modal$$1 ) LoginScreen.__proto__ = Modal$$1;
13638 LoginScreen.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
13639 LoginScreen.prototype.constructor = LoginScreen;
13640
13641 return LoginScreen;
13642 }(Modal));
13643
13644 var LoginScreen$1 = {
13645 name: 'loginScreen',
13646 static: {
13647 LoginScreen: LoginScreen,
13648 },
13649 create: function create() {
13650 var app = this;
13651 app.loginScreen = ModalMethods({
13652 app: app,
13653 constructor: LoginScreen,
13654 defaultSelector: '.login-screen.modal-in',
13655 });
13656 },
13657 clicks: {
13658 '.login-screen-open': function openLoginScreen($clickedEl, data) {
13659 if ( data === void 0 ) data = {};
13660
13661 var app = this;
13662 app.loginScreen.open(data.loginScreen, data.animate);
13663 },
13664 '.login-screen-close': function closeLoginScreen($clickedEl, data) {
13665 if ( data === void 0 ) data = {};
13666
13667 var app = this;
13668 app.loginScreen.close(data.loginScreen, data.animate);
13669 },
13670 },
13671 };
13672
13673 var Popover = /*@__PURE__*/(function (Modal$$1) {
13674 function Popover(app, params) {
13675 var extendedParams = Utils.extend(
13676 { on: {} },
13677 app.params.popover,
13678 params
13679 );
13680
13681 // Extends with open/close Modal methods;
13682 Modal$$1.call(this, app, extendedParams);
13683
13684 var popover = this;
13685
13686 popover.params = extendedParams;
13687
13688 // Find Element
13689 var $el;
13690 if (!popover.params.el) {
13691 $el = $(popover.params.content);
13692 } else {
13693 $el = $(popover.params.el);
13694 }
13695
13696 if ($el && $el.length > 0 && $el[0].f7Modal) {
13697 return $el[0].f7Modal;
13698 }
13699
13700 // Find Target
13701 var $targetEl = $(popover.params.targetEl).eq(0);
13702
13703 if ($el.length === 0) {
13704 return popover.destroy();
13705 }
13706
13707 // Backdrop
13708 var $backdropEl;
13709 if (popover.params.backdrop) {
13710 $backdropEl = app.root.children('.popover-backdrop');
13711 if ($backdropEl.length === 0) {
13712 $backdropEl = $('<div class="popover-backdrop"></div>');
13713 app.root.append($backdropEl);
13714 }
13715 }
13716
13717 // Find Angle
13718 var $angleEl;
13719 if ($el.find('.popover-angle').length === 0) {
13720 $angleEl = $('<div class="popover-angle"></div>');
13721 $el.prepend($angleEl);
13722 } else {
13723 $angleEl = $el.find('.popover-angle');
13724 }
13725
13726 // Open
13727 var originalOpen = popover.open;
13728
13729 Utils.extend(popover, {
13730 app: app,
13731 $el: $el,
13732 el: $el[0],
13733 $targetEl: $targetEl,
13734 targetEl: $targetEl[0],
13735 $angleEl: $angleEl,
13736 angleEl: $angleEl[0],
13737 $backdropEl: $backdropEl,
13738 backdropEl: $backdropEl && $backdropEl[0],
13739 type: 'popover',
13740 open: function open() {
13741 var assign;
13742
13743 var args = [], len = arguments.length;
13744 while ( len-- ) args[ len ] = arguments[ len ];
13745 var targetEl = args[0];
13746 var animate = args[1];
13747 if (typeof args[0] === 'boolean') { (assign = args, animate = assign[0], targetEl = assign[1]); }
13748 if (targetEl) {
13749 popover.$targetEl = $(targetEl);
13750 popover.targetEl = popover.$targetEl[0];
13751 }
13752 return originalOpen.call(popover, animate);
13753 },
13754 });
13755
13756 function handleResize() {
13757 popover.resize();
13758 }
13759 popover.on('popoverOpen', function () {
13760 popover.resize();
13761 app.on('resize', handleResize);
13762 popover.on('popoverClose popoverBeforeDestroy', function () {
13763 app.off('resize', handleResize);
13764 });
13765 });
13766
13767 function handleClick(e) {
13768 var target = e.target;
13769 var $target = $(target);
13770 if ($target.closest(popover.el).length === 0) {
13771 if (
13772 popover.params.closeByBackdropClick
13773 && popover.params.backdrop
13774 && popover.backdropEl
13775 && popover.backdropEl === target
13776 ) {
13777 popover.close();
13778 } else if (popover.params.closeByOutsideClick) {
13779 popover.close();
13780 }
13781 }
13782 }
13783
13784 popover.on('popoverOpened', function () {
13785 if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
13786 app.on('click', handleClick);
13787 }
13788 });
13789 popover.on('popoverClose', function () {
13790 if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
13791 app.off('click', handleClick);
13792 }
13793 });
13794
13795 $el[0].f7Modal = popover;
13796
13797 return popover;
13798 }
13799
13800 if ( Modal$$1 ) Popover.__proto__ = Modal$$1;
13801 Popover.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
13802 Popover.prototype.constructor = Popover;
13803
13804 Popover.prototype.resize = function resize () {
13805 var popover = this;
13806 var app = popover.app;
13807 var $el = popover.$el;
13808 var $targetEl = popover.$targetEl;
13809 var $angleEl = popover.$angleEl;
13810 var ref = popover.params;
13811 var targetX = ref.targetX;
13812 var targetY = ref.targetY;
13813 $el.css({ left: '', top: '' });
13814 var ref$1 = [$el.width(), $el.height()];
13815 var width = ref$1[0];
13816 var height = ref$1[1];
13817 var angleSize = 0;
13818 var angleLeft;
13819 var angleTop;
13820 if (app.theme === 'ios') {
13821 $angleEl.removeClass('on-left on-right on-top on-bottom').css({ left: '', top: '' });
13822 angleSize = $angleEl.width() / 2;
13823 } else {
13824 $el.removeClass('popover-on-left popover-on-right popover-on-top popover-on-bottom').css({ left: '', top: '' });
13825 }
13826
13827 var targetWidth;
13828 var targetHeight;
13829 var targetOffsetLeft;
13830 var targetOffsetTop;
13831 if ($targetEl && $targetEl.length > 0) {
13832 targetWidth = $targetEl.outerWidth();
13833 targetHeight = $targetEl.outerHeight();
13834
13835 var targetOffset = $targetEl.offset();
13836 targetOffsetLeft = targetOffset.left - app.left;
13837 targetOffsetTop = targetOffset.top - app.top;
13838
13839 var targetParentPage = $targetEl.parents('.page');
13840 if (targetParentPage.length > 0) {
13841 targetOffsetTop -= targetParentPage[0].scrollTop;
13842 }
13843 } else if (typeof targetX !== 'undefined' && targetY !== 'undefined') {
13844 targetOffsetLeft = targetX;
13845 targetOffsetTop = targetY;
13846 targetWidth = popover.params.targetWidth || 0;
13847 targetHeight = popover.params.targetHeight || 0;
13848 }
13849
13850 var ref$2 = [0, 0, 0];
13851 var left = ref$2[0];
13852 var top = ref$2[1];
13853 var diff = ref$2[2];
13854 // Top Position
13855 var position = app.theme === 'md' ? 'bottom' : 'top';
13856 if (app.theme === 'md') {
13857 if (height < app.height - targetOffsetTop - targetHeight) {
13858 // On bottom
13859 position = 'bottom';
13860 top = targetOffsetTop;
13861 } else if (height < targetOffsetTop) {
13862 // On top
13863 top = (targetOffsetTop - height) + targetHeight;
13864 position = 'top';
13865 } else {
13866 // On middle
13867 position = 'bottom';
13868 top = targetOffsetTop;
13869 }
13870
13871 if (top <= 0) {
13872 top = 8;
13873 } else if (top + height >= app.height) {
13874 top = app.height - height - 8;
13875 }
13876
13877 // Horizontal Position
13878 left = (targetOffsetLeft + targetWidth) - width - 8;
13879 if (left + width >= app.width - 8) {
13880 left = (targetOffsetLeft + targetWidth) - width - 8;
13881 }
13882 if (left < 8) {
13883 left = 8;
13884 }
13885 if (position === 'top') {
13886 $el.addClass('popover-on-top');
13887 }
13888 if (position === 'bottom') {
13889 $el.addClass('popover-on-bottom');
13890 }
13891 } else {
13892 if ((height + angleSize) < targetOffsetTop) {
13893 // On top
13894 top = targetOffsetTop - height - angleSize;
13895 } else if ((height + angleSize) < app.height - targetOffsetTop - targetHeight) {
13896 // On bottom
13897 position = 'bottom';
13898 top = targetOffsetTop + targetHeight + angleSize;
13899 } else {
13900 // On middle
13901 position = 'middle';
13902 top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
13903 diff = top;
13904 if (top <= 0) {
13905 top = 5;
13906 } else if (top + height >= app.height) {
13907 top = app.height - height - 5;
13908 }
13909 diff -= top;
13910 }
13911
13912 // Horizontal Position
13913 if (position === 'top' || position === 'bottom') {
13914 left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
13915 diff = left;
13916 if (left < 5) { left = 5; }
13917 if (left + width > app.width) { left = app.width - width - 5; }
13918 if (left < 0) { left = 0; }
13919 if (position === 'top') {
13920 $angleEl.addClass('on-bottom');
13921 }
13922 if (position === 'bottom') {
13923 $angleEl.addClass('on-top');
13924 }
13925 diff -= left;
13926 angleLeft = ((width / 2) - angleSize) + diff;
13927 angleLeft = Math.max(Math.min(angleLeft, width - (angleSize * 2) - 13), 13);
13928 $angleEl.css({ left: (angleLeft + "px") });
13929 } else if (position === 'middle') {
13930 left = targetOffsetLeft - width - angleSize;
13931 $angleEl.addClass('on-right');
13932 if (left < 5 || (left + width > app.width)) {
13933 if (left < 5) { left = targetOffsetLeft + targetWidth + angleSize; }
13934 if (left + width > app.width) { left = app.width - width - 5; }
13935 $angleEl.removeClass('on-right').addClass('on-left');
13936 }
13937 angleTop = ((height / 2) - angleSize) + diff;
13938 angleTop = Math.max(Math.min(angleTop, height - (angleSize * 2) - 13), 13);
13939 $angleEl.css({ top: (angleTop + "px") });
13940 }
13941 }
13942
13943 // Apply Styles
13944 $el.css({ top: (top + "px"), left: (left + "px") });
13945 };
13946
13947 return Popover;
13948 }(Modal));
13949
13950 var Popover$1 = {
13951 name: 'popover',
13952 params: {
13953 popover: {
13954 closeByBackdropClick: true,
13955 closeByOutsideClick: true,
13956 backdrop: true,
13957 },
13958 },
13959 static: {
13960 Popover: Popover,
13961 },
13962 create: function create() {
13963 var app = this;
13964 app.popover = Utils.extend(
13965 ModalMethods({
13966 app: app,
13967 constructor: Popover,
13968 defaultSelector: '.popover.modal-in',
13969 }),
13970 {
13971 open: function open(popoverEl, targetEl, animate) {
13972 var $popoverEl = $(popoverEl);
13973 var popover = $popoverEl[0].f7Modal;
13974 if (!popover) { popover = new Popover(app, { el: $popoverEl, targetEl: targetEl }); }
13975 return popover.open(targetEl, animate);
13976 },
13977 }
13978 );
13979 },
13980 clicks: {
13981 '.popover-open': function openPopover($clickedEl, data) {
13982 if ( data === void 0 ) data = {};
13983
13984 var app = this;
13985 app.popover.open(data.popover, $clickedEl, data.animate);
13986 },
13987 '.popover-close': function closePopover($clickedEl, data) {
13988 if ( data === void 0 ) data = {};
13989
13990 var app = this;
13991 app.popover.close(data.popover, data.animate);
13992 },
13993 },
13994 };
13995
13996 /* eslint indent: ["off"] */
13997
13998 var Actions = /*@__PURE__*/(function (Modal$$1) {
13999 function Actions(app, params) {
14000 var extendedParams = Utils.extend(
14001 { on: {} },
14002 app.params.actions,
14003 params
14004 );
14005
14006 // Extends with open/close Modal methods;
14007 Modal$$1.call(this, app, extendedParams);
14008
14009 var actions = this;
14010
14011 actions.params = extendedParams;
14012
14013 // Buttons
14014 var groups;
14015 if (actions.params.buttons) {
14016 groups = actions.params.buttons;
14017 if (!Array.isArray(groups[0])) { groups = [groups]; }
14018 }
14019 actions.groups = groups;
14020
14021 // Find Element
14022 var $el;
14023 if (actions.params.el) {
14024 $el = $(actions.params.el);
14025 } else if (actions.params.content) {
14026 $el = $(actions.params.content);
14027 } else if (actions.params.buttons) {
14028 if (actions.params.convertToPopover) {
14029 actions.popoverHtml = actions.renderPopover();
14030 }
14031 actions.actionsHtml = actions.render();
14032 }
14033
14034 if ($el && $el.length > 0 && $el[0].f7Modal) {
14035 return $el[0].f7Modal;
14036 }
14037
14038 if ($el && $el.length === 0 && !(actions.actionsHtml || actions.popoverHtml)) {
14039 return actions.destroy();
14040 }
14041
14042 // Backdrop
14043 var $backdropEl;
14044 if (actions.params.backdrop) {
14045 $backdropEl = app.root.children('.actions-backdrop');
14046 if ($backdropEl.length === 0) {
14047 $backdropEl = $('<div class="actions-backdrop"></div>');
14048 app.root.append($backdropEl);
14049 }
14050 }
14051
14052 var originalOpen = actions.open;
14053 var originalClose = actions.close;
14054
14055 var popover;
14056 function buttonOnClick(e) {
14057 var buttonEl = this;
14058 var buttonIndex;
14059 var groupIndex;
14060 if ($(buttonEl).hasClass('list-button')) {
14061 buttonIndex = $(buttonEl).parents('li').index();
14062 groupIndex = $(buttonEl).parents('.list').index();
14063 } else {
14064 buttonIndex = $(buttonEl).index();
14065 groupIndex = $(buttonEl).parents('.actions-group').index();
14066 }
14067 if (typeof groups !== 'undefined') {
14068 var button = groups[groupIndex][buttonIndex];
14069 if (button.onClick) { button.onClick(actions, e); }
14070 if (actions.params.onClick) { actions.params.onClick(actions, e); }
14071 if (button.close !== false) { actions.close(); }
14072 }
14073 }
14074 actions.open = function open(animate) {
14075 var convertToPopover = false;
14076 var ref = actions.params;
14077 var targetEl = ref.targetEl;
14078 var targetX = ref.targetX;
14079 var targetY = ref.targetY;
14080 var targetWidth = ref.targetWidth;
14081 var targetHeight = ref.targetHeight;
14082 if (actions.params.convertToPopover && (targetEl || (targetX !== undefined && targetY !== undefined))) {
14083 // Popover
14084 if (
14085 actions.params.forceToPopover
14086 || (app.device.ios && app.device.ipad)
14087 || app.width >= 768
14088 ) {
14089 convertToPopover = true;
14090 }
14091 }
14092 if (convertToPopover && actions.popoverHtml) {
14093 popover = app.popover.create({
14094 content: actions.popoverHtml,
14095 backdrop: actions.params.backdrop,
14096 targetEl: targetEl,
14097 targetX: targetX,
14098 targetY: targetY,
14099 targetWidth: targetWidth,
14100 targetHeight: targetHeight,
14101 });
14102 popover.open(animate);
14103 popover.once('popoverOpened', function () {
14104 popover.$el.find('.list-button').each(function (groupIndex, buttonEl) {
14105 $(buttonEl).on('click', buttonOnClick);
14106 });
14107 });
14108 popover.once('popoverClosed', function () {
14109 popover.$el.find('.list-button').each(function (groupIndex, buttonEl) {
14110 $(buttonEl).off('click', buttonOnClick);
14111 });
14112 Utils.nextTick(function () {
14113 popover.destroy();
14114 popover = undefined;
14115 });
14116 });
14117 } else {
14118 actions.$el = actions.actionsHtml ? $(actions.actionsHtml) : actions.$el;
14119 actions.$el[0].f7Modal = actions;
14120 if (actions.groups) {
14121 actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
14122 $(buttonEl).on('click', buttonOnClick);
14123 });
14124 actions.once('actionsClosed', function () {
14125 actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
14126 $(buttonEl).off('click', buttonOnClick);
14127 });
14128 });
14129 }
14130 actions.el = actions.$el[0];
14131 originalOpen.call(actions, animate);
14132 }
14133 return actions;
14134 };
14135
14136 actions.close = function close(animate) {
14137 if (popover) {
14138 popover.close(animate);
14139 } else {
14140 originalClose.call(actions, animate);
14141 }
14142 return actions;
14143 };
14144
14145 Utils.extend(actions, {
14146 app: app,
14147 $el: $el,
14148 el: $el ? $el[0] : undefined,
14149 $backdropEl: $backdropEl,
14150 backdropEl: $backdropEl && $backdropEl[0],
14151 type: 'actions',
14152 });
14153
14154 function handleClick(e) {
14155 var target = e.target;
14156 var $target = $(target);
14157 if ($target.closest(actions.el).length === 0) {
14158 if (
14159 actions.params.closeByBackdropClick
14160 && actions.params.backdrop
14161 && actions.backdropEl
14162 && actions.backdropEl === target
14163 ) {
14164 actions.close();
14165 } else if (actions.params.closeByOutsideClick) {
14166 actions.close();
14167 }
14168 }
14169 }
14170
14171 actions.on('opened', function () {
14172 if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
14173 app.on('click', handleClick);
14174 }
14175 });
14176 actions.on('close', function () {
14177 if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
14178 app.off('click', handleClick);
14179 }
14180 });
14181
14182 if ($el) {
14183 $el[0].f7Modal = actions;
14184 }
14185
14186 return actions;
14187 }
14188
14189 if ( Modal$$1 ) Actions.__proto__ = Modal$$1;
14190 Actions.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
14191 Actions.prototype.constructor = Actions;
14192
14193 Actions.prototype.render = function render () {
14194 var actions = this;
14195 if (actions.params.render) { return actions.params.render.call(actions, actions); }
14196 var groups = actions.groups;
14197 return ("\n <div class=\"actions-modal" + (actions.params.grid ? ' actions-grid' : '') + "\">\n " + (groups.map(function (group) { return ("<div class=\"actions-group\">\n " + (group.map(function (button) {
14198 var buttonClasses = [("actions-" + (button.label ? 'label' : 'button'))];
14199 var color = button.color;
14200 var bg = button.bg;
14201 var bold = button.bold;
14202 var disabled = button.disabled;
14203 var label = button.label;
14204 var text = button.text;
14205 var icon = button.icon;
14206 if (color) { buttonClasses.push(("color-" + color)); }
14207 if (bg) { buttonClasses.push(("bg-color-" + bg)); }
14208 if (bold) { buttonClasses.push('actions-button-bold'); }
14209 if (disabled) { buttonClasses.push('disabled'); }
14210 if (label) {
14211 return ("<div class=\"" + (buttonClasses.join(' ')) + "\">" + text + "</div>");
14212 }
14213 return ("\n <div class=\"" + (buttonClasses.join(' ')) + "\">\n " + (icon ? ("<div class=\"actions-button-media\">" + icon + "</div>") : '') + "\n <div class=\"actions-button-text\">" + text + "</div>\n </div>").trim();
14214 }).join('')) + "\n </div>"); }).join('')) + "\n </div>\n ").trim();
14215 };
14216
14217 Actions.prototype.renderPopover = function renderPopover () {
14218 var actions = this;
14219 if (actions.params.renderPopover) { return actions.params.renderPopover.call(actions, actions); }
14220 var groups = actions.groups;
14221 return ("\n <div class=\"popover popover-from-actions\">\n <div class=\"popover-inner\">\n " + (groups.map(function (group) { return ("\n <div class=\"list\">\n <ul>\n " + (group.map(function (button) {
14222 var itemClasses = [];
14223 var color = button.color;
14224 var bg = button.bg;
14225 var bold = button.bold;
14226 var disabled = button.disabled;
14227 var label = button.label;
14228 var text = button.text;
14229 var icon = button.icon;
14230 if (color) { itemClasses.push(("color-" + color)); }
14231 if (bg) { itemClasses.push(("bg-color-" + bg)); }
14232 if (bold) { itemClasses.push('popover-from-actions-bold'); }
14233 if (disabled) { itemClasses.push('disabled'); }
14234 if (label) {
14235 itemClasses.push('popover-from-actions-label');
14236 return ("<li class=\"" + (itemClasses.join(' ')) + "\">" + text + "</li>");
14237 }
14238 if (icon) {
14239 itemClasses.push('item-link item-content');
14240 return ("\n <li>\n <a class=\"" + (itemClasses.join(' ')) + "\">\n <div class=\"item-media\">\n " + icon + "\n </div>\n <div class=\"item-inner\">\n <div class=\"item-title\">\n " + text + "\n </div>\n </div>\n </a>\n </li>\n ");
14241 }
14242 itemClasses.push('list-button');
14243 return ("\n <li>\n <a href=\"#\" class=\"" + (itemClasses.join(' ')) + "\">" + text + "</a>\n </li>\n ");
14244 }).join('')) + "\n </ul>\n </div>\n "); }).join('')) + "\n </div>\n </div>\n ").trim();
14245 };
14246
14247 return Actions;
14248 }(Modal));
14249
14250 var Actions$1 = {
14251 name: 'actions',
14252 params: {
14253 actions: {
14254 convertToPopover: true,
14255 forceToPopover: false,
14256 closeByBackdropClick: true,
14257 render: null,
14258 renderPopover: null,
14259 backdrop: true,
14260 },
14261 },
14262 static: {
14263 Actions: Actions,
14264 },
14265 create: function create() {
14266 var app = this;
14267 app.actions = ModalMethods({
14268 app: app,
14269 constructor: Actions,
14270 defaultSelector: '.actions-modal.modal-in',
14271 });
14272 },
14273 clicks: {
14274 '.actions-open': function openActions($clickedEl, data) {
14275 if ( data === void 0 ) data = {};
14276
14277 var app = this;
14278 app.actions.open(data.actions, data.animate);
14279 },
14280 '.actions-close': function closeActions($clickedEl, data) {
14281 if ( data === void 0 ) data = {};
14282
14283 var app = this;
14284 app.actions.close(data.actions, data.animate);
14285 },
14286 },
14287 };
14288
14289 var Sheet = /*@__PURE__*/(function (Modal$$1) {
14290 function Sheet(app, params) {
14291 var extendedParams = Utils.extend(
14292 { on: {} },
14293 app.params.sheet,
14294 params
14295 );
14296
14297 // Extends with open/close Modal methods;
14298 Modal$$1.call(this, app, extendedParams);
14299
14300 var sheet = this;
14301
14302 sheet.params = extendedParams;
14303
14304 // Find Element
14305 var $el;
14306 if (!sheet.params.el) {
14307 $el = $(sheet.params.content);
14308 } else {
14309 $el = $(sheet.params.el);
14310 }
14311
14312 if ($el && $el.length > 0 && $el[0].f7Modal) {
14313 return $el[0].f7Modal;
14314 }
14315
14316 if ($el.length === 0) {
14317 return sheet.destroy();
14318 }
14319 var $backdropEl;
14320 if (sheet.params.backdrop) {
14321 $backdropEl = app.root.children('.sheet-backdrop');
14322 if ($backdropEl.length === 0) {
14323 $backdropEl = $('<div class="sheet-backdrop"></div>');
14324 app.root.append($backdropEl);
14325 }
14326 }
14327
14328 var $pageContentEl;
14329 function scrollToOpen() {
14330 var $scrollEl = $(sheet.params.scrollToEl).eq(0);
14331 if ($scrollEl.length === 0) { return; }
14332 $pageContentEl = $scrollEl.parents('.page-content');
14333 if ($pageContentEl.length === 0) { return; }
14334
14335 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
14336 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
14337 var pageHeight = $pageContentEl[0].offsetHeight - paddingTop - $el.height();
14338 var pageScrollHeight = $pageContentEl[0].scrollHeight - paddingTop - $el.height();
14339 var pageScroll = $pageContentEl.scrollTop();
14340
14341 var newPaddingBottom;
14342
14343 var scrollElTop = ($scrollEl.offset().top - paddingTop) + $scrollEl[0].offsetHeight;
14344 if (scrollElTop > pageHeight) {
14345 var scrollTop = (pageScroll + scrollElTop) - pageHeight;
14346 if (scrollTop + pageHeight > pageScrollHeight) {
14347 newPaddingBottom = ((scrollTop + pageHeight) - pageScrollHeight) + paddingBottom;
14348 if (pageHeight === pageScrollHeight) {
14349 newPaddingBottom = $el.height();
14350 }
14351 $pageContentEl.css({
14352 'padding-bottom': (newPaddingBottom + "px"),
14353 });
14354 }
14355 $pageContentEl.scrollTop(scrollTop, 300);
14356 }
14357 }
14358
14359 function scrollToClose() {
14360 if ($pageContentEl && $pageContentEl.length > 0) {
14361 $pageContentEl.css({
14362 'padding-bottom': '',
14363 });
14364 }
14365 }
14366 function handleClick(e) {
14367 var target = e.target;
14368 var $target = $(target);
14369 if ($target.closest(sheet.el).length === 0) {
14370 if (
14371 sheet.params.closeByBackdropClick
14372 && sheet.params.backdrop
14373 && sheet.backdropEl
14374 && sheet.backdropEl === target
14375 ) {
14376 sheet.close();
14377 } else if (sheet.params.closeByOutsideClick) {
14378 sheet.close();
14379 }
14380 }
14381 }
14382
14383 sheet.on('sheetOpen', function () {
14384 if (sheet.params.scrollToEl) {
14385 scrollToOpen();
14386 }
14387 });
14388 sheet.on('sheetOpened', function () {
14389 if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
14390 app.on('click', handleClick);
14391 }
14392 });
14393 sheet.on('sheetClose', function () {
14394 if (sheet.params.scrollToEl) {
14395 scrollToClose();
14396 }
14397 if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
14398 app.off('click', handleClick);
14399 }
14400 });
14401
14402 Utils.extend(sheet, {
14403 app: app,
14404 $el: $el,
14405 el: $el[0],
14406 $backdropEl: $backdropEl,
14407 backdropEl: $backdropEl && $backdropEl[0],
14408 type: 'sheet',
14409 });
14410
14411 $el[0].f7Modal = sheet;
14412
14413 return sheet;
14414 }
14415
14416 if ( Modal$$1 ) Sheet.__proto__ = Modal$$1;
14417 Sheet.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
14418 Sheet.prototype.constructor = Sheet;
14419
14420 return Sheet;
14421 }(Modal));
14422
14423 var Sheet$1 = {
14424 name: 'sheet',
14425 params: {
14426 sheet: {
14427 closeByBackdropClick: true,
14428 closeByOutsideClick: false,
14429 },
14430 },
14431 static: {
14432 Sheet: Sheet,
14433 },
14434 create: function create() {
14435 var app = this;
14436 if (!app.passedParams.sheet || app.passedParams.sheet.backdrop === undefined) {
14437 app.params.sheet.backdrop = app.theme === 'md';
14438 }
14439 app.sheet = Utils.extend(
14440 {},
14441 ModalMethods({
14442 app: app,
14443 constructor: Sheet,
14444 defaultSelector: '.sheet-modal.modal-in',
14445 })
14446 );
14447 },
14448 clicks: {
14449 '.sheet-open': function openSheet($clickedEl, data) {
14450 if ( data === void 0 ) data = {};
14451
14452 var app = this;
14453 if ($('.sheet-modal.modal-in').length > 0 && data.sheet && $(data.sheet)[0] !== $('.sheet-modal.modal-in')[0]) {
14454 app.sheet.close('.sheet-modal.modal-in');
14455 }
14456 app.sheet.open(data.sheet, data.animate);
14457 },
14458 '.sheet-close': function closeSheet($clickedEl, data) {
14459 if ( data === void 0 ) data = {};
14460
14461 var app = this;
14462 app.sheet.close(data.sheet, data.animate);
14463 },
14464 },
14465 };
14466
14467 var Toast = /*@__PURE__*/(function (Modal$$1) {
14468 function Toast(app, params) {
14469 var extendedParams = Utils.extend({
14470 on: {},
14471 }, app.params.toast, params);
14472
14473 // Extends with open/close Modal methods;
14474 Modal$$1.call(this, app, extendedParams);
14475
14476 var toast = this;
14477
14478 toast.app = app;
14479
14480 toast.params = extendedParams;
14481
14482 var ref = toast.params;
14483 var closeButton = ref.closeButton;
14484 var closeTimeout = ref.closeTimeout;
14485
14486 var $el;
14487 if (!toast.params.el) {
14488 // Find Element
14489 var toastHtml = toast.render();
14490
14491 $el = $(toastHtml);
14492 } else {
14493 $el = $(toast.params.el);
14494 }
14495
14496 if ($el && $el.length > 0 && $el[0].f7Modal) {
14497 return $el[0].f7Modal;
14498 }
14499
14500 if ($el.length === 0) {
14501 return toast.destroy();
14502 }
14503
14504 Utils.extend(toast, {
14505 $el: $el,
14506 el: $el[0],
14507 type: 'toast',
14508 });
14509
14510 $el[0].f7Modal = toast;
14511
14512 if (closeButton) {
14513 $el.find('.toast-button').on('click', function () {
14514 toast.emit('local::closeButtonClick toastCloseButtonClick', toast);
14515 toast.close();
14516 });
14517
14518 toast.on('beforeDestroy', function () {
14519 $el.find('.toast-button').off('click');
14520 });
14521 }
14522
14523 var timeoutId;
14524 toast.on('open', function () {
14525 $('.toast.modal-in').each(function (index, openedEl) {
14526 var toastInstance = app.toast.get(openedEl);
14527 if (openedEl !== toast.el && toastInstance) {
14528 toastInstance.close();
14529 }
14530 });
14531 if (closeTimeout) {
14532 timeoutId = Utils.nextTick(function () {
14533 toast.close();
14534 }, closeTimeout);
14535 }
14536 });
14537 toast.on('close', function () {
14538 win.clearTimeout(timeoutId);
14539 });
14540
14541 if (toast.params.destroyOnClose) {
14542 toast.once('closed', function () {
14543 setTimeout(function () {
14544 toast.destroy();
14545 }, 0);
14546 });
14547 }
14548
14549 return toast;
14550 }
14551
14552 if ( Modal$$1 ) Toast.__proto__ = Modal$$1;
14553 Toast.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
14554 Toast.prototype.constructor = Toast;
14555
14556 Toast.prototype.render = function render () {
14557 var toast = this;
14558 if (toast.params.render) { return toast.params.render.call(toast, toast); }
14559 var ref = toast.params;
14560 var position = ref.position;
14561 var cssClass = ref.cssClass;
14562 var icon = ref.icon;
14563 var text = ref.text;
14564 var closeButton = ref.closeButton;
14565 var closeButtonColor = ref.closeButtonColor;
14566 var closeButtonText = ref.closeButtonText;
14567 return ("\n <div class=\"toast toast-" + position + " " + (cssClass || '') + " " + (icon ? 'toast-with-icon' : '') + "\">\n <div class=\"toast-content\">\n " + (icon ? ("<div class=\"toast-icon\">" + icon + "</div>") : '') + "\n <div class=\"toast-text\">" + text + "</div>\n " + (closeButton && !icon ? ("\n <a class=\"toast-button button " + (closeButtonColor ? ("color-" + closeButtonColor) : '') + "\">" + closeButtonText + "</a>\n ").trim() : '') + "\n </div>\n </div>\n ").trim();
14568 };
14569
14570 return Toast;
14571 }(Modal));
14572
14573 var Toast$1 = {
14574 name: 'toast',
14575 static: {
14576 Toast: Toast,
14577 },
14578 create: function create() {
14579 var app = this;
14580 app.toast = Utils.extend(
14581 {},
14582 ModalMethods({
14583 app: app,
14584 constructor: Toast,
14585 defaultSelector: '.toast.modal-in',
14586 }),
14587 {
14588 // Shortcuts
14589 show: function show(params) {
14590 Utils.extend(params, {
14591 destroyOnClose: true,
14592 });
14593 return new Toast(app, params).open();
14594 },
14595 }
14596 );
14597 },
14598 params: {
14599 toast: {
14600 icon: null,
14601 text: null,
14602 position: 'bottom',
14603 closeButton: false,
14604 closeButtonColor: null,
14605 closeButtonText: 'Ok',
14606 closeTimeout: null,
14607 cssClass: null,
14608 render: null,
14609 },
14610 },
14611 };
14612
14613 var Preloader = {
14614 init: function init(el) {
14615 var app = this;
14616 var $el = $(el);
14617 if ($el.length === 0 || $el.children('.preloader-inner').length > 0 || $el.children('.preloader-inner-line').length > 0) { return; }
14618 $el.append(Utils[((app.theme) + "PreloaderContent")]);
14619 },
14620 // Modal
14621 visible: false,
14622 show: function show(color) {
14623 if ( color === void 0 ) color = 'white';
14624
14625 var app = this;
14626 if (Preloader.visible) { return; }
14627 var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
14628 $('html').addClass('with-modal-preloader');
14629 app.root.append(("\n <div class=\"preloader-backdrop\"></div>\n <div class=\"preloader-modal\">\n <div class=\"preloader color-" + color + "\">" + preloaderInner + "</div>\n </div>\n "));
14630 Preloader.visible = true;
14631 },
14632 hide: function hide() {
14633 var app = this;
14634 if (!Preloader.visible) { return; }
14635 $('html').removeClass('with-modal-preloader');
14636 app.root.find('.preloader-backdrop, .preloader-modal').remove();
14637 Preloader.visible = false;
14638 },
14639 };
14640 var Preloader$1 = {
14641 name: 'preloader',
14642 create: function create() {
14643 var app = this;
14644 Utils.extend(app, {
14645 preloader: {
14646 init: Preloader.init.bind(app),
14647 show: Preloader.show.bind(app),
14648 hide: Preloader.hide.bind(app),
14649 },
14650 });
14651 },
14652 on: {
14653 photoBrowserOpen: function photoBrowserOpen(pb) {
14654 var app = this;
14655 pb.$el.find('.preloader').each(function (index, preloaderEl) {
14656 app.preloader.init(preloaderEl);
14657 });
14658 },
14659 pageInit: function pageInit(page) {
14660 var app = this;
14661 page.$el.find('.preloader').each(function (index, preloaderEl) {
14662 app.preloader.init(preloaderEl);
14663 });
14664 },
14665 },
14666 vnode: {
14667 preloader: {
14668 insert: function insert(vnode) {
14669 var app = this;
14670 var preloaderEl = vnode.elm;
14671 app.preloader.init(preloaderEl);
14672 },
14673 },
14674 },
14675 };
14676
14677 var Progressbar = {
14678 set: function set() {
14679 var assign;
14680
14681 var args = [], len = arguments.length;
14682 while ( len-- ) args[ len ] = arguments[ len ];
14683 var app = this;
14684 var el = args[0];
14685 var progress = args[1];
14686 var duration = args[2];
14687 if (typeof args[0] === 'number') {
14688 (assign = args, progress = assign[0], duration = assign[1]);
14689 el = app.root;
14690 }
14691 if (typeof progress === 'undefined' || progress === null) { return el; }
14692 if (!progress) { progress = 0; }
14693
14694 var $el = $(el || app.root);
14695 if ($el.length === 0) {
14696 return el;
14697 }
14698 var progressNormalized = Math.min(Math.max(progress, 0), 100);
14699 var $progressbarEl;
14700 if ($el.hasClass('progressbar')) { $progressbarEl = $el.eq(0); }
14701 else {
14702 $progressbarEl = $el.children('.progressbar');
14703 }
14704 if ($progressbarEl.length === 0 || $progressbarEl.hasClass('progressbar-infinite')) {
14705 return $progressbarEl;
14706 }
14707 var $progressbarLine = $progressbarEl.children('span');
14708 if ($progressbarLine.length === 0) {
14709 $progressbarLine = $('<span></span>');
14710 $progressbarEl.append($progressbarLine);
14711 }
14712 $progressbarLine
14713 .transition(typeof duration !== 'undefined' ? duration : '')
14714 .transform(("translate3d(" + ((-100 + progressNormalized)) + "%,0,0)"));
14715
14716 return $progressbarEl[0];
14717 },
14718 show: function show() {
14719 var assign, assign$1;
14720
14721 var args = [], len = arguments.length;
14722 while ( len-- ) args[ len ] = arguments[ len ];
14723 var app = this;
14724
14725 // '.page', 50, 'multi'
14726 var el = args[0];
14727 var progress = args[1];
14728 var color = args[2];
14729 var type = 'determined';
14730
14731 if (args.length === 2) {
14732 if ((typeof args[0] === 'string' || typeof args[0] === 'object') && typeof args[1] === 'string') {
14733 // '.page', 'multi'
14734 (assign = args, el = assign[0], color = assign[1], progress = assign[2]);
14735 type = 'infinite';
14736 } else if (typeof args[0] === 'number' && typeof args[1] === 'string') {
14737 // 50, 'multi'
14738 (assign$1 = args, progress = assign$1[0], color = assign$1[1]);
14739 el = app.root;
14740 }
14741 } else if (args.length === 1) {
14742 if (typeof args[0] === 'number') {
14743 el = app.root;
14744 progress = args[0];
14745 } else if (typeof args[0] === 'string') {
14746 type = 'infinite';
14747 el = app.root;
14748 color = args[0];
14749 }
14750 } else if (args.length === 0) {
14751 type = 'infinite';
14752 el = app.root;
14753 }
14754
14755 var $el = $(el);
14756 if ($el.length === 0) { return undefined; }
14757
14758 var $progressbarEl;
14759 if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
14760 $progressbarEl = $el;
14761 } else {
14762 $progressbarEl = $el.children('.progressbar:not(.progressbar-out), .progressbar-infinite:not(.progressbar-out)');
14763 if ($progressbarEl.length === 0) {
14764 $progressbarEl = $(("\n <span class=\"progressbar" + (type === 'infinite' ? '-infinite' : '') + (color ? (" color-" + color) : '') + " progressbar-in\">\n " + (type === 'infinite' ? '' : '<span></span>') + "\n </span>"));
14765 $el.append($progressbarEl);
14766 }
14767 }
14768
14769 if (typeof progress !== 'undefined') {
14770 app.progressbar.set($progressbarEl, progress);
14771 }
14772
14773 return $progressbarEl[0];
14774 },
14775 hide: function hide(el, removeAfterHide) {
14776 if ( removeAfterHide === void 0 ) removeAfterHide = true;
14777
14778 var app = this;
14779 var $el = $(el || app.root);
14780 if ($el.length === 0) { return undefined; }
14781 var $progressbarEl;
14782 if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
14783 $progressbarEl = $el;
14784 } else {
14785 $progressbarEl = $el.children('.progressbar, .progressbar-infinite');
14786 }
14787 if ($progressbarEl.length === 0 || !$progressbarEl.hasClass('progressbar-in') || $progressbarEl.hasClass('progressbar-out')) {
14788 return $progressbarEl;
14789 }
14790 $progressbarEl
14791 .removeClass('progressbar-in')
14792 .addClass('progressbar-out')
14793 .animationEnd(function () {
14794 if (removeAfterHide) {
14795 $progressbarEl.remove();
14796 }
14797 });
14798 return $progressbarEl;
14799 },
14800 };
14801
14802 var Progressbar$1 = {
14803 name: 'progressbar',
14804 create: function create() {
14805 var app = this;
14806 Utils.extend(app, {
14807 progressbar: {
14808 set: Progressbar.set.bind(app),
14809 show: Progressbar.show.bind(app),
14810 hide: Progressbar.hide.bind(app),
14811 },
14812 });
14813 },
14814 on: {
14815 pageInit: function pageInit(page) {
14816 var app = this;
14817 page.$el.find('.progressbar').each(function (index, progressbarEl) {
14818 var $progressbarEl = $(progressbarEl);
14819 app.progressbar.set($progressbarEl, $progressbarEl.attr('data-progress'));
14820 });
14821 },
14822 },
14823 };
14824
14825 var Sortable = {
14826 init: function init() {
14827 var app = this;
14828 var isTouched;
14829 var isMoved;
14830 var touchStartY;
14831 var touchesDiff;
14832 var $sortingEl;
14833 var $sortingItems;
14834 var $sortableContainer;
14835 var sortingElHeight;
14836 var minTop;
14837 var maxTop;
14838 var $insertAfterEl;
14839 var $insertBeforeEl;
14840 var indexFrom;
14841 var $pageEl;
14842 var $pageContentEl;
14843 var pageHeight;
14844 var pageOffset;
14845 var sortingElOffsetLocal;
14846 var sortingElOffsetTop;
14847 var initialScrollTop;
14848
14849 function handleTouchStart(e) {
14850 isMoved = false;
14851 isTouched = true;
14852 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
14853 $sortingEl = $(this).parent('li');
14854 indexFrom = $sortingEl.index();
14855 $sortableContainer = $sortingEl.parents('.sortable');
14856 var $listGroup = $sortingEl.parents('.list-group');
14857 if ($listGroup.length && $listGroup.parents($sortableContainer).length) {
14858 $sortableContainer = $listGroup;
14859 }
14860 $sortingItems = $sortableContainer.children('ul').children('li');
14861 if (app.panel) { app.panel.allowOpen = false; }
14862 if (app.swipeout) { app.swipeout.allow = false; }
14863 }
14864 function handleTouchMove(e) {
14865 if (!isTouched || !$sortingEl) { return; }
14866 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
14867 if (!isMoved) {
14868 $pageEl = $sortingEl.parents('.page');
14869 $pageContentEl = $sortingEl.parents('.page-content');
14870 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
14871 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
14872 initialScrollTop = $pageContentEl[0].scrollTop;
14873 pageOffset = $pageEl.offset().top + paddingTop;
14874 pageHeight = $pageEl.height() - paddingTop - paddingBottom;
14875 $sortingEl.addClass('sorting');
14876 $sortableContainer.addClass('sortable-sorting');
14877 sortingElOffsetLocal = $sortingEl[0].offsetTop;
14878 minTop = $sortingEl[0].offsetTop;
14879 maxTop = $sortingEl.parent().height() - sortingElOffsetLocal - $sortingEl.height();
14880 sortingElHeight = $sortingEl[0].offsetHeight;
14881 sortingElOffsetTop = $sortingEl.offset().top;
14882 }
14883 isMoved = true;
14884
14885 e.preventDefault();
14886 e.f7PreventSwipePanel = true;
14887
14888 touchesDiff = pageY - touchStartY;
14889
14890 var translateScrollOffset = $pageContentEl[0].scrollTop - initialScrollTop;
14891 var translate = Math.min(Math.max(touchesDiff + translateScrollOffset, -minTop), maxTop);
14892 $sortingEl.transform(("translate3d(0," + translate + "px,0)"));
14893
14894 var scrollAddition = 44;
14895 var allowScroll = true;
14896 if ((touchesDiff + translateScrollOffset) + scrollAddition < -minTop) {
14897 allowScroll = false;
14898 }
14899 if ((touchesDiff + translateScrollOffset) - scrollAddition > maxTop) {
14900 allowScroll = false;
14901 }
14902
14903 $insertBeforeEl = undefined;
14904 $insertAfterEl = undefined;
14905
14906 var scrollDiff;
14907 if (allowScroll) {
14908 if (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition > pageOffset + pageHeight) {
14909 // To Bottom
14910 scrollDiff = (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition) - (pageOffset + pageHeight);
14911 }
14912 if (sortingElOffsetTop + touchesDiff < pageOffset + scrollAddition) {
14913 // To Top
14914 scrollDiff = (sortingElOffsetTop + touchesDiff) - pageOffset - scrollAddition;
14915 }
14916 if (scrollDiff) {
14917 $pageContentEl[0].scrollTop += scrollDiff;
14918 }
14919 }
14920
14921 $sortingItems.each(function (index, el) {
14922 var $currentEl = $(el);
14923 if ($currentEl[0] === $sortingEl[0]) { return; }
14924 var currentElOffset = $currentEl[0].offsetTop;
14925 var currentElHeight = $currentEl.height();
14926 var sortingElOffset = sortingElOffsetLocal + translate;
14927
14928 if ((sortingElOffset >= currentElOffset - (currentElHeight / 2)) && $sortingEl.index() < $currentEl.index()) {
14929 $currentEl.transform(("translate3d(0, " + (-sortingElHeight) + "px,0)"));
14930 $insertAfterEl = $currentEl;
14931 $insertBeforeEl = undefined;
14932 } else if ((sortingElOffset <= currentElOffset + (currentElHeight / 2)) && $sortingEl.index() > $currentEl.index()) {
14933 $currentEl.transform(("translate3d(0, " + sortingElHeight + "px,0)"));
14934 $insertAfterEl = undefined;
14935 if (!$insertBeforeEl) { $insertBeforeEl = $currentEl; }
14936 } else {
14937 $currentEl.transform('translate3d(0, 0%,0)');
14938 }
14939 });
14940 }
14941 function handleTouchEnd() {
14942 if (!isTouched || !isMoved) {
14943 isTouched = false;
14944 isMoved = false;
14945 if (isTouched && !isMoved) {
14946 if (app.panel) { app.panel.allowOpen = true; }
14947 if (app.swipeout) { app.swipeout.allow = true; }
14948 }
14949 return;
14950 }
14951 if (app.panel) { app.panel.allowOpen = true; }
14952 if (app.swipeout) { app.swipeout.allow = true; }
14953
14954 $sortingItems.transform('');
14955 $sortingEl.removeClass('sorting');
14956 $sortableContainer.removeClass('sortable-sorting');
14957
14958 var indexTo;
14959 if ($insertAfterEl) { indexTo = $insertAfterEl.index(); }
14960 else if ($insertBeforeEl) { indexTo = $insertBeforeEl.index(); }
14961
14962 if (app.params.sortable.moveElements) {
14963 if ($insertAfterEl) {
14964 $sortingEl.insertAfter($insertAfterEl);
14965 }
14966 if ($insertBeforeEl) {
14967 $sortingEl.insertBefore($insertBeforeEl);
14968 }
14969 }
14970
14971 if (($insertAfterEl || $insertBeforeEl)
14972 && $sortableContainer.hasClass('virtual-list')
14973 ) {
14974 indexFrom = $sortingEl[0].f7VirtualListIndex;
14975 if (typeof indexFrom === 'undefined') { indexFrom = $sortingEl.attr('data-virtual-list-index'); }
14976 if ($insertBeforeEl) {
14977 indexTo = $insertBeforeEl[0].f7VirtualListIndex;
14978 if (typeof indexTo === 'undefined') { indexTo = $insertBeforeEl.attr('data-virtual-list-index'); }
14979 } else {
14980 indexTo = $insertAfterEl[0].f7VirtualListIndex;
14981 if (typeof indexTo === 'undefined') { indexTo = $insertAfterEl.attr('data-virtual-list-index'); }
14982 }
14983 if (indexTo !== null) { indexTo = parseInt(indexTo, 10); }
14984 else { indexTo = undefined; }
14985
14986 var virtualList = $sortableContainer[0].f7VirtualList;
14987 if (virtualList) { virtualList.moveItem(indexFrom, indexTo); }
14988 }
14989 if (typeof indexTo !== 'undefined' && !Number.isNaN(indexTo) && indexTo !== indexFrom) {
14990 $sortingEl.trigger('sortable:sort', { from: indexFrom, to: indexTo });
14991 app.emit('sortableSort', $sortingEl[0], { from: indexFrom, to: indexTo });
14992 }
14993
14994 $insertBeforeEl = undefined;
14995 $insertAfterEl = undefined;
14996 isTouched = false;
14997 isMoved = false;
14998 }
14999
15000 var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
15001
15002 $(doc).on(app.touchEvents.start, '.list.sortable .sortable-handler', handleTouchStart, activeListener);
15003 app.on('touchmove:active', handleTouchMove);
15004 app.on('touchend:passive', handleTouchEnd);
15005 },
15006 enable: function enable(el) {
15007 if ( el === void 0 ) el = '.list.sortable';
15008
15009 var app = this;
15010 var $el = $(el);
15011 if ($el.length === 0) { return; }
15012 $el.addClass('sortable-enabled');
15013 $el.trigger('sortable:enable');
15014 app.emit('sortableEnable', $el[0]);
15015 },
15016 disable: function disable(el) {
15017 if ( el === void 0 ) el = '.list.sortable';
15018
15019 var app = this;
15020 var $el = $(el);
15021 if ($el.length === 0) { return; }
15022 $el.removeClass('sortable-enabled');
15023 $el.trigger('sortable:disable');
15024 app.emit('sortableDisable', $el[0]);
15025 },
15026 toggle: function toggle(el) {
15027 if ( el === void 0 ) el = '.list.sortable';
15028
15029 var app = this;
15030 var $el = $(el);
15031 if ($el.length === 0) { return; }
15032 if ($el.hasClass('sortable-enabled')) {
15033 app.sortable.disable($el);
15034 } else {
15035 app.sortable.enable($el);
15036 }
15037 },
15038 };
15039 var Sortable$1 = {
15040 name: 'sortable',
15041 params: {
15042 sortable: {
15043 moveElements: true,
15044 },
15045 },
15046 create: function create() {
15047 var app = this;
15048 Utils.extend(app, {
15049 sortable: {
15050 init: Sortable.init.bind(app),
15051 enable: Sortable.enable.bind(app),
15052 disable: Sortable.disable.bind(app),
15053 toggle: Sortable.toggle.bind(app),
15054 },
15055 });
15056 },
15057 on: {
15058 init: function init() {
15059 var app = this;
15060 if (!app.params.sortable) { return; }
15061 app.sortable.init();
15062 },
15063 },
15064 clicks: {
15065 '.sortable-enable': function enable($clickedEl, data) {
15066 if ( data === void 0 ) data = {};
15067
15068 var app = this;
15069 app.sortable.enable(data.sortable);
15070 },
15071 '.sortable-disable': function disable($clickedEl, data) {
15072 if ( data === void 0 ) data = {};
15073
15074 var app = this;
15075 app.sortable.disable(data.sortable);
15076 },
15077 '.sortable-toggle': function toggle($clickedEl, data) {
15078 if ( data === void 0 ) data = {};
15079
15080 var app = this;
15081 app.sortable.toggle(data.sortable);
15082 },
15083 },
15084 };
15085
15086 var Swipeout = {
15087 init: function init() {
15088 var app = this;
15089 var touchesStart = {};
15090 var isTouched;
15091 var isMoved;
15092 var isScrolling;
15093 var touchStartTime;
15094 var touchesDiff;
15095 var $swipeoutEl;
15096 var $swipeoutContent;
15097 var $actionsRight;
15098 var $actionsLeft;
15099 var actionsLeftWidth;
15100 var actionsRightWidth;
15101 var translate;
15102 var opened;
15103 var openedActionsSide;
15104 var $leftButtons;
15105 var $rightButtons;
15106 var direction;
15107 var $overswipeLeftButton;
15108 var $overswipeRightButton;
15109 var overswipeLeft;
15110 var overswipeRight;
15111
15112 function handleTouchStart(e) {
15113 if (!Swipeout.allow) { return; }
15114 isMoved = false;
15115 isTouched = true;
15116 isScrolling = undefined;
15117 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
15118 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
15119 touchStartTime = (new Date()).getTime();
15120 $swipeoutEl = $(this);
15121 }
15122 function handleTouchMove(e) {
15123 if (!isTouched) { return; }
15124 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
15125 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
15126 if (typeof isScrolling === 'undefined') {
15127 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
15128 }
15129 if (isScrolling) {
15130 isTouched = false;
15131 return;
15132 }
15133
15134 if (!isMoved) {
15135 if ($('.list.sortable-opened').length > 0) { return; }
15136 $swipeoutContent = $swipeoutEl.find('.swipeout-content');
15137 $actionsRight = $swipeoutEl.find('.swipeout-actions-right');
15138 $actionsLeft = $swipeoutEl.find('.swipeout-actions-left');
15139 actionsLeftWidth = null;
15140 actionsRightWidth = null;
15141 $leftButtons = null;
15142 $rightButtons = null;
15143 $overswipeRightButton = null;
15144 $overswipeLeftButton = null;
15145 if ($actionsLeft.length > 0) {
15146 actionsLeftWidth = $actionsLeft.outerWidth();
15147 $leftButtons = $actionsLeft.children('a');
15148 $overswipeLeftButton = $actionsLeft.find('.swipeout-overswipe');
15149 }
15150 if ($actionsRight.length > 0) {
15151 actionsRightWidth = $actionsRight.outerWidth();
15152 $rightButtons = $actionsRight.children('a');
15153 $overswipeRightButton = $actionsRight.find('.swipeout-overswipe');
15154 }
15155 opened = $swipeoutEl.hasClass('swipeout-opened');
15156 if (opened) {
15157 openedActionsSide = $swipeoutEl.find('.swipeout-actions-left.swipeout-actions-opened').length > 0 ? 'left' : 'right';
15158 }
15159 $swipeoutEl.removeClass('swipeout-transitioning');
15160 if (!app.params.swipeout.noFollow) {
15161 $swipeoutEl.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
15162 $swipeoutEl.removeClass('swipeout-opened');
15163 }
15164 }
15165 isMoved = true;
15166 e.preventDefault();
15167
15168 touchesDiff = pageX - touchesStart.x;
15169 translate = touchesDiff;
15170
15171 if (opened) {
15172 if (openedActionsSide === 'right') { translate -= actionsRightWidth; }
15173 else { translate += actionsLeftWidth; }
15174 }
15175
15176 if (
15177 (translate > 0 && $actionsLeft.length === 0)
15178 || (translate < 0 && $actionsRight.length === 0)
15179 ) {
15180 if (!opened) {
15181 isTouched = false;
15182 isMoved = false;
15183 $swipeoutContent.transform('');
15184 if ($rightButtons && $rightButtons.length > 0) {
15185 $rightButtons.transform('');
15186 }
15187 if ($leftButtons && $leftButtons.length > 0) {
15188 $leftButtons.transform('');
15189 }
15190 return;
15191 }
15192 translate = 0;
15193 }
15194
15195 if (translate < 0) { direction = 'to-left'; }
15196 else if (translate > 0) { direction = 'to-right'; }
15197 else if (!direction) { direction = 'to-left'; }
15198
15199 var buttonOffset;
15200 var progress;
15201
15202 e.f7PreventSwipePanel = true;
15203 if (app.params.swipeout.noFollow) {
15204 if (opened) {
15205 if (openedActionsSide === 'right' && touchesDiff > 0) {
15206 app.swipeout.close($swipeoutEl);
15207 }
15208 if (openedActionsSide === 'left' && touchesDiff < 0) {
15209 app.swipeout.close($swipeoutEl);
15210 }
15211 } else {
15212 if (touchesDiff < 0 && $actionsRight.length > 0) {
15213 app.swipeout.open($swipeoutEl, 'right');
15214 }
15215 if (touchesDiff > 0 && $actionsLeft.length > 0) {
15216 app.swipeout.open($swipeoutEl, 'left');
15217 }
15218 }
15219 isTouched = false;
15220 isMoved = false;
15221 return;
15222 }
15223 overswipeLeft = false;
15224 overswipeRight = false;
15225 if ($actionsRight.length > 0) {
15226 // Show right actions
15227 var buttonTranslate = translate;
15228 progress = buttonTranslate / actionsRightWidth;
15229 if (buttonTranslate < -actionsRightWidth) {
15230 buttonTranslate = -actionsRightWidth - (Math.pow( (-buttonTranslate - actionsRightWidth), 0.8 ));
15231 translate = buttonTranslate;
15232 if ($overswipeRightButton.length > 0) {
15233 overswipeRight = true;
15234 }
15235 }
15236 if (direction !== 'to-left') {
15237 progress = 0;
15238 buttonTranslate = 0;
15239 }
15240 $rightButtons.each(function (index, buttonEl) {
15241 var $buttonEl = $(buttonEl);
15242 if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
15243 $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
15244 }
15245 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
15246 if ($overswipeRightButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-left') {
15247 $buttonEl.css({ left: ((overswipeRight ? -buttonOffset : 0) + "px") });
15248 if (overswipeRight) {
15249 if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
15250 $swipeoutEl.trigger('swipeout:overswipeenter');
15251 app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
15252 }
15253 $buttonEl.addClass('swipeout-overswipe-active');
15254 } else {
15255 if ($buttonEl.hasClass('swipeout-overswipe-active')) {
15256 $swipeoutEl.trigger('swipeout:overswipeexit');
15257 app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
15258 }
15259 $buttonEl.removeClass('swipeout-overswipe-active');
15260 }
15261 }
15262 $buttonEl.transform(("translate3d(" + (buttonTranslate - (buttonOffset * (1 + Math.max(progress, -1)))) + "px,0,0)"));
15263 });
15264 }
15265 if ($actionsLeft.length > 0) {
15266 // Show left actions
15267 var buttonTranslate$1 = translate;
15268 progress = buttonTranslate$1 / actionsLeftWidth;
15269 if (buttonTranslate$1 > actionsLeftWidth) {
15270 buttonTranslate$1 = actionsLeftWidth + (Math.pow( (buttonTranslate$1 - actionsLeftWidth), 0.8 ));
15271 translate = buttonTranslate$1;
15272 if ($overswipeLeftButton.length > 0) {
15273 overswipeLeft = true;
15274 }
15275 }
15276 if (direction !== 'to-right') {
15277 buttonTranslate$1 = 0;
15278 progress = 0;
15279 }
15280 $leftButtons.each(function (index, buttonEl) {
15281 var $buttonEl = $(buttonEl);
15282 if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
15283 $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
15284 }
15285 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
15286 if ($overswipeLeftButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-right') {
15287 $buttonEl.css({ left: ((overswipeLeft ? buttonOffset : 0) + "px") });
15288 if (overswipeLeft) {
15289 if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
15290 $swipeoutEl.trigger('swipeout:overswipeenter');
15291 app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
15292 }
15293 $buttonEl.addClass('swipeout-overswipe-active');
15294 } else {
15295 if ($buttonEl.hasClass('swipeout-overswipe-active')) {
15296 $swipeoutEl.trigger('swipeout:overswipeexit');
15297 app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
15298 }
15299 $buttonEl.removeClass('swipeout-overswipe-active');
15300 }
15301 }
15302 if ($leftButtons.length > 1) {
15303 $buttonEl.css('z-index', $leftButtons.length - index);
15304 }
15305 $buttonEl.transform(("translate3d(" + (buttonTranslate$1 + (buttonOffset * (1 - Math.min(progress, 1)))) + "px,0,0)"));
15306 });
15307 }
15308 $swipeoutEl.trigger('swipeout', progress);
15309 app.emit('swipeout', $swipeoutEl[0], progress);
15310 $swipeoutContent.transform(("translate3d(" + translate + "px,0,0)"));
15311 }
15312 function handleTouchEnd() {
15313 if (!isTouched || !isMoved) {
15314 isTouched = false;
15315 isMoved = false;
15316 return;
15317 }
15318
15319 isTouched = false;
15320 isMoved = false;
15321 var timeDiff = (new Date()).getTime() - touchStartTime;
15322 var $actions = direction === 'to-left' ? $actionsRight : $actionsLeft;
15323 var actionsWidth = direction === 'to-left' ? actionsRightWidth : actionsLeftWidth;
15324 var action;
15325 var $buttons;
15326 var i;
15327
15328 if (
15329 (
15330 timeDiff < 300
15331 && (
15332 (touchesDiff < -10 && direction === 'to-left')
15333 || (touchesDiff > 10 && direction === 'to-right')
15334 )
15335 )
15336 || (
15337 timeDiff >= 300
15338 && (Math.abs(translate) > actionsWidth / 2)
15339 )
15340 ) {
15341 action = 'open';
15342 } else {
15343 action = 'close';
15344 }
15345 if (timeDiff < 300) {
15346 if (Math.abs(translate) === 0) { action = 'close'; }
15347 if (Math.abs(translate) === actionsWidth) { action = 'open'; }
15348 }
15349
15350 if (action === 'open') {
15351 Swipeout.el = $swipeoutEl[0];
15352 $swipeoutEl.trigger('swipeout:open');
15353 app.emit('swipeoutOpen', $swipeoutEl[0]);
15354 $swipeoutEl.addClass('swipeout-opened swipeout-transitioning');
15355 var newTranslate = direction === 'to-left' ? -actionsWidth : actionsWidth;
15356 $swipeoutContent.transform(("translate3d(" + newTranslate + "px,0,0)"));
15357 $actions.addClass('swipeout-actions-opened');
15358 $buttons = direction === 'to-left' ? $rightButtons : $leftButtons;
15359 if ($buttons) {
15360 for (i = 0; i < $buttons.length; i += 1) {
15361 $($buttons[i]).transform(("translate3d(" + newTranslate + "px,0,0)"));
15362 }
15363 }
15364 if (overswipeRight) {
15365 $actionsRight.find('.swipeout-overswipe')[0].click();
15366 }
15367 if (overswipeLeft) {
15368 $actionsLeft.find('.swipeout-overswipe')[0].click();
15369 }
15370 } else {
15371 $swipeoutEl.trigger('swipeout:close');
15372 app.emit('swipeoutClose', $swipeoutEl[0]);
15373 Swipeout.el = undefined;
15374 $swipeoutEl.addClass('swipeout-transitioning').removeClass('swipeout-opened');
15375 $swipeoutContent.transform('');
15376 $actions.removeClass('swipeout-actions-opened');
15377 }
15378
15379 var buttonOffset;
15380 if ($leftButtons && $leftButtons.length > 0 && $leftButtons !== $buttons) {
15381 $leftButtons.each(function (index, buttonEl) {
15382 var $buttonEl = $(buttonEl);
15383 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
15384 if (typeof buttonOffset === 'undefined') {
15385 $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
15386 }
15387 $buttonEl.transform(("translate3d(" + buttonOffset + "px,0,0)"));
15388 });
15389 }
15390 if ($rightButtons && $rightButtons.length > 0 && $rightButtons !== $buttons) {
15391 $rightButtons.each(function (index, buttonEl) {
15392 var $buttonEl = $(buttonEl);
15393 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
15394 if (typeof buttonOffset === 'undefined') {
15395 $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
15396 }
15397 $buttonEl.transform(("translate3d(" + (-buttonOffset) + "px,0,0)"));
15398 });
15399 }
15400 $swipeoutContent.transitionEnd(function () {
15401 if ((opened && action === 'open') || (!opened && action === 'close')) { return; }
15402 $swipeoutEl.trigger(action === 'open' ? 'swipeout:opened' : 'swipeout:closed');
15403 app.emit(action === 'open' ? 'swipeoutOpened' : 'swipeoutClosed', $swipeoutEl[0]);
15404 $swipeoutEl.removeClass('swipeout-transitioning');
15405 if (opened && action === 'close') {
15406 if ($actionsRight.length > 0) {
15407 $rightButtons.transform('');
15408 }
15409 if ($actionsLeft.length > 0) {
15410 $leftButtons.transform('');
15411 }
15412 }
15413 });
15414 }
15415
15416 var passiveListener = app.support.passiveListener ? { passive: true } : false;
15417
15418 app.on('touchstart', function (e) {
15419 if (Swipeout.el) {
15420 var $targetEl = $(e.target);
15421 if (!(
15422 $(Swipeout.el).is($targetEl[0])
15423 || $targetEl.parents('.swipeout').is(Swipeout.el)
15424 || $targetEl.hasClass('modal-in')
15425 || ($targetEl.attr('class') || '').indexOf('-backdrop') > 0
15426 || $targetEl.hasClass('actions-modal')
15427 || $targetEl.parents('.actions-modal.modal-in, .dialog.modal-in').length > 0
15428 )) {
15429 app.swipeout.close(Swipeout.el);
15430 }
15431 }
15432 });
15433 $(doc).on(app.touchEvents.start, 'li.swipeout', handleTouchStart, passiveListener);
15434 app.on('touchmove:active', handleTouchMove);
15435 app.on('touchend:passive', handleTouchEnd);
15436 },
15437 allow: true,
15438 el: undefined,
15439 open: function open() {
15440 var assign;
15441
15442 var args = [], len = arguments.length;
15443 while ( len-- ) args[ len ] = arguments[ len ];
15444 var app = this;
15445 var el = args[0];
15446 var side = args[1];
15447 var callback = args[2];
15448 if (typeof args[1] === 'function') {
15449 (assign = args, el = assign[0], callback = assign[1], side = assign[2]);
15450 }
15451 var $el = $(el).eq(0);
15452
15453 if ($el.length === 0) { return; }
15454 if (!$el.hasClass('swipeout') || $el.hasClass('swipeout-opened')) { return; }
15455 if (!side) {
15456 if ($el.find('.swipeout-actions-right').length > 0) { side = 'right'; }
15457 else { side = 'left'; }
15458 }
15459 var $swipeoutActions = $el.find((".swipeout-actions-" + side));
15460 var $swipeoutContent = $el.find('.swipeout-content');
15461 if ($swipeoutActions.length === 0) { return; }
15462 $el.trigger('swipeout:open').addClass('swipeout-opened').removeClass('swipeout-transitioning');
15463 app.emit('swipeoutOpen', $el[0]);
15464 $swipeoutActions.addClass('swipeout-actions-opened');
15465 var $buttons = $swipeoutActions.children('a');
15466 var swipeoutActionsWidth = $swipeoutActions.outerWidth();
15467 var translate = side === 'right' ? -swipeoutActionsWidth : swipeoutActionsWidth;
15468 if ($buttons.length > 1) {
15469 $buttons.each(function (buttonIndex, buttonEl) {
15470 var $buttonEl = $(buttonEl);
15471 if (side === 'right') {
15472 $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px,0,0)"));
15473 } else {
15474 $buttonEl.css('z-index', $buttons.length - buttonIndex).transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"));
15475 }
15476 });
15477 }
15478 $el.addClass('swipeout-transitioning');
15479 $swipeoutContent.transitionEnd(function () {
15480 $el.trigger('swipeout:opened');
15481 app.emit('swipeoutOpened', $el[0]);
15482 if (callback) { callback.call($el[0]); }
15483 });
15484 Utils.nextFrame(function () {
15485 $buttons.transform(("translate3d(" + translate + "px,0,0)"));
15486 $swipeoutContent.transform(("translate3d(" + translate + "px,0,0)"));
15487 });
15488 Swipeout.el = $el[0];
15489 },
15490 close: function close(el, callback) {
15491 var app = this;
15492 var $el = $(el).eq(0);
15493 if ($el.length === 0) { return; }
15494 if (!$el.hasClass('swipeout-opened')) { return; }
15495 var side = $el.find('.swipeout-actions-opened').hasClass('swipeout-actions-right') ? 'right' : 'left';
15496 var $swipeoutActions = $el.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
15497 var $buttons = $swipeoutActions.children('a');
15498 var swipeoutActionsWidth = $swipeoutActions.outerWidth();
15499 Swipeout.allow = false;
15500 $el.trigger('swipeout:close');
15501 app.emit('swipeoutClose', $el[0]);
15502 $el.removeClass('swipeout-opened').addClass('swipeout-transitioning');
15503
15504 var closeTimeout;
15505 function onSwipeoutClose() {
15506 Swipeout.allow = true;
15507 if ($el.hasClass('swipeout-opened')) { return; }
15508 $el.removeClass('swipeout-transitioning');
15509 $buttons.transform('');
15510 $el.trigger('swipeout:closed');
15511 app.emit('swipeoutClosed', $el[0]);
15512 if (callback) { callback.call($el[0]); }
15513 if (closeTimeout) { clearTimeout(closeTimeout); }
15514 }
15515 $el.find('.swipeout-content').transform('').transitionEnd(onSwipeoutClose);
15516 closeTimeout = setTimeout(onSwipeoutClose, 500);
15517
15518 $buttons.each(function (index, buttonEl) {
15519 var $buttonEl = $(buttonEl);
15520 if (side === 'right') {
15521 $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px,0,0)"));
15522 } else {
15523 $buttonEl.transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"));
15524 }
15525 $buttonEl.css({ left: '0px' }).removeClass('swipeout-overswipe-active');
15526 });
15527 if (Swipeout.el && Swipeout.el === $el[0]) { Swipeout.el = undefined; }
15528 },
15529 delete: function delete$1(el, callback) {
15530 var app = this;
15531 var $el = $(el).eq(0);
15532 if ($el.length === 0) { return; }
15533 Swipeout.el = undefined;
15534 $el.trigger('swipeout:delete');
15535 app.emit('swipeoutDelete', $el[0]);
15536 $el.css({ height: (($el.outerHeight()) + "px") });
15537 $el.transitionEnd(function () {
15538 $el.trigger('swipeout:deleted');
15539 app.emit('swipeoutDeleted', $el[0]);
15540 if (callback) { callback.call($el[0]); }
15541 if ($el.parents('.virtual-list').length > 0) {
15542 var virtualList = $el.parents('.virtual-list')[0].f7VirtualList;
15543 var virtualIndex = $el[0].f7VirtualListIndex;
15544 if (virtualList && typeof virtualIndex !== 'undefined') { virtualList.deleteItem(virtualIndex); }
15545 } else if (app.params.swipeout.removeElements) {
15546 if (app.params.swipeout.removeElementsWithTimeout) {
15547 setTimeout(function () {
15548 $el.remove();
15549 }, app.params.swipeout.removeElementsTimeout);
15550 } else {
15551 $el.remove();
15552 }
15553 } else {
15554 $el.removeClass('swipeout-deleting swipeout-transitioning');
15555 }
15556 });
15557 // eslint-disable-next-line
15558 // $el[0]._clientLeft = $el[0].clientLeft;
15559 Utils.nextFrame(function () {
15560 $el
15561 .addClass('swipeout-deleting swipeout-transitioning')
15562 .css({ height: '0px' })
15563 .find('.swipeout-content')
15564 .transform('translate3d(-100%,0,0)');
15565 });
15566 },
15567 };
15568 var Swipeout$1 = {
15569 name: 'swipeout',
15570 params: {
15571 swipeout: {
15572 actionsNoFold: false,
15573 noFollow: false,
15574 removeElements: true,
15575 removeElementsWithTimeout: false,
15576 removeElementsTimeout: 0,
15577 },
15578 },
15579 create: function create() {
15580 var app = this;
15581 Utils.extend(app, {
15582 swipeout: {
15583 init: Swipeout.init.bind(app),
15584 open: Swipeout.open.bind(app),
15585 close: Swipeout.close.bind(app),
15586 delete: Swipeout.delete.bind(app),
15587 },
15588 });
15589 Object.defineProperty(app.swipeout, 'el', {
15590 enumerable: true,
15591 configurable: true,
15592 get: function () { return Swipeout.el; },
15593 set: function set(el) {
15594 Swipeout.el = el;
15595 },
15596 });
15597 Object.defineProperty(app.swipeout, 'allow', {
15598 enumerable: true,
15599 configurable: true,
15600 get: function () { return Swipeout.allow; },
15601 set: function set(allow) {
15602 Swipeout.allow = allow;
15603 },
15604 });
15605 },
15606 clicks: {
15607 '.swipeout-open': function openSwipeout($clickedEl, data) {
15608 if ( data === void 0 ) data = {};
15609
15610 var app = this;
15611 app.swipeout.open(data.swipeout, data.side);
15612 },
15613 '.swipeout-close': function closeSwipeout($clickedEl) {
15614 var app = this;
15615 var $swipeoutEl = $clickedEl.closest('.swipeout');
15616 if ($swipeoutEl.length === 0) { return; }
15617 app.swipeout.close($swipeoutEl);
15618 },
15619 '.swipeout-delete': function deleteSwipeout($clickedEl, data) {
15620 if ( data === void 0 ) data = {};
15621
15622 var app = this;
15623 var $swipeoutEl = $clickedEl.closest('.swipeout');
15624 if ($swipeoutEl.length === 0) { return; }
15625 var confirm = data.confirm;
15626 var confirmTitle = data.confirmTitle;
15627 if (data.confirm) {
15628 app.dialog.confirm(confirm, confirmTitle, function () {
15629 app.swipeout.delete($swipeoutEl);
15630 });
15631 } else {
15632 app.swipeout.delete($swipeoutEl);
15633 }
15634 },
15635 },
15636 on: {
15637 init: function init() {
15638 var app = this;
15639 if (!app.params.swipeout) { return; }
15640 app.swipeout.init();
15641 },
15642 },
15643 };
15644
15645 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
15646
15647 var Accordion = {
15648 toggleClicked: function toggleClicked($clickedEl) {
15649 var app = this;
15650 var $accordionItemEl = $clickedEl.closest('.accordion-item').eq(0);
15651 if (!$accordionItemEl.length) { $accordionItemEl = $clickedEl.parents('li').eq(0); }
15652
15653 var $accordionContent = $clickedEl.parents('.accordion-item-content').eq(0);
15654 if ($accordionContent.length) {
15655 if ($accordionContent.parents($accordionItemEl).length) { return; }
15656 }
15657
15658 if ($clickedEl.parents('li').length > 1 && $clickedEl.parents('li')[0] !== $accordionItemEl[0]) { return; }
15659 app.accordion.toggle($accordionItemEl);
15660 },
15661 open: function open(el) {
15662 var app = this;
15663 var $el = $(el);
15664 var prevented = false;
15665 function prevent() {
15666 prevented = true;
15667 }
15668 $el.trigger('accordion:beforeopen', { prevent: prevent }, prevent);
15669 app.emit('accordionBeforeOpen', $el[0], prevent);
15670 if (prevented) { return; }
15671 var $list = $el.parents('.accordion-list').eq(0);
15672 var $contentEl = $el.children('.accordion-item-content');
15673 $contentEl.removeAttr('aria-hidden');
15674 if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
15675 if ($contentEl.length === 0) { return; }
15676 var $openedItem = $list.length > 0 && $el.parent().children('.accordion-item-opened');
15677 if ($openedItem.length > 0) {
15678 app.accordion.close($openedItem);
15679 }
15680 $contentEl.transitionEnd(function () {
15681 if ($el.hasClass('accordion-item-opened')) {
15682 $contentEl.transition(0);
15683 $contentEl.css('height', 'auto');
15684 Utils.nextFrame(function () {
15685 $contentEl.transition('');
15686 $el.trigger('accordion:opened');
15687 app.emit('accordionOpened', $el[0]);
15688 });
15689 } else {
15690 $contentEl.css('height', '');
15691 $el.trigger('accordion:closed');
15692 app.emit('accordionClosed', $el[0]);
15693 }
15694 });
15695 $contentEl.css('height', (($contentEl[0].scrollHeight) + "px"));
15696 $el.trigger('accordion:open');
15697 $el.addClass('accordion-item-opened');
15698 app.emit('accordionOpen', $el[0]);
15699 },
15700 close: function close(el) {
15701 var app = this;
15702 var $el = $(el);
15703 var prevented = false;
15704 function prevent() {
15705 prevented = true;
15706 }
15707 $el.trigger('accordion:beforeclose', { prevent: prevent }, prevent);
15708 app.emit('accordionBeforeClose', $el[0], prevent);
15709 if (prevented) { return; }
15710 var $contentEl = $el.children('.accordion-item-content');
15711 if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
15712 $el.removeClass('accordion-item-opened');
15713 $contentEl.attr('aria-hidden', true);
15714 $contentEl.transition(0);
15715 $contentEl.css('height', (($contentEl[0].scrollHeight) + "px"));
15716 // Close
15717 $contentEl.transitionEnd(function () {
15718 if ($el.hasClass('accordion-item-opened')) {
15719 $contentEl.transition(0);
15720 $contentEl.css('height', 'auto');
15721 Utils.nextFrame(function () {
15722 $contentEl.transition('');
15723 $el.trigger('accordion:opened');
15724 app.emit('accordionOpened', $el[0]);
15725 });
15726 } else {
15727 $contentEl.css('height', '');
15728 $el.trigger('accordion:closed');
15729 app.emit('accordionClosed', $el[0]);
15730 }
15731 });
15732 Utils.nextFrame(function () {
15733 $contentEl.transition('');
15734 $contentEl.css('height', '');
15735 $el.trigger('accordion:close');
15736 app.emit('accordionClose', $el[0]);
15737 });
15738 },
15739 toggle: function toggle(el) {
15740 var app = this;
15741 var $el = $(el);
15742 if ($el.length === 0) { return; }
15743 if ($el.hasClass('accordion-item-opened')) { app.accordion.close(el); }
15744 else { app.accordion.open(el); }
15745 },
15746 };
15747
15748 var Accordion$1 = {
15749 name: 'accordion',
15750 create: function create() {
15751 var app = this;
15752 Utils.extend(app, {
15753 accordion: {
15754 open: Accordion.open.bind(app),
15755 close: Accordion.close.bind(app),
15756 toggle: Accordion.toggle.bind(app),
15757 },
15758 });
15759 },
15760 clicks: {
15761 '.accordion-item .item-link, .accordion-item-toggle, .links-list.accordion-list > ul > li > a': function open($clickedEl) {
15762 var app = this;
15763 Accordion.toggleClicked.call(app, $clickedEl);
15764 },
15765 },
15766 };
15767
15768 var ContactsList = {
15769 name: 'contactsList',
15770 };
15771
15772 var VirtualList = /*@__PURE__*/(function (Framework7Class$$1) {
15773 function VirtualList(app, params) {
15774 if ( params === void 0 ) params = {};
15775
15776 Framework7Class$$1.call(this, params, [app]);
15777 var vl = this;
15778
15779 var defaults = {
15780 cols: 1,
15781 height: app.theme === 'md' ? 48 : 44,
15782 cache: true,
15783 dynamicHeightBufferSize: 1,
15784 showFilteredItemsOnly: false,
15785 renderExternal: undefined,
15786 setListHeight: true,
15787 searchByItem: undefined,
15788 searchAll: undefined,
15789 itemTemplate: undefined,
15790 ul: null,
15791 createUl: true,
15792 renderItem: function renderItem(item) {
15793 return ("\n <li>\n <div class=\"item-content\">\n <div class=\"item-inner\">\n <div class=\"item-title\">" + item + "</div>\n </div>\n </div>\n </li>\n ").trim();
15794 },
15795 on: {},
15796 };
15797
15798 // Extend defaults with modules params
15799 vl.useModulesParams(defaults);
15800
15801 vl.params = Utils.extend(defaults, params);
15802 if (vl.params.height === undefined || !vl.params.height) {
15803 vl.params.height = app.theme === 'md' ? 48 : 44;
15804 }
15805
15806 vl.$el = $(params.el);
15807 vl.el = vl.$el[0];
15808
15809 if (vl.$el.length === 0) { return undefined; }
15810 vl.$el[0].f7VirtualList = vl;
15811
15812 vl.items = vl.params.items;
15813 if (vl.params.showFilteredItemsOnly) {
15814 vl.filteredItems = [];
15815 }
15816 if (vl.params.itemTemplate) {
15817 if (typeof vl.params.itemTemplate === 'string') { vl.renderItem = app.t7.compile(vl.params.itemTemplate); }
15818 else if (typeof vl.params.itemTemplate === 'function') { vl.renderItem = vl.params.itemTemplate; }
15819 } else if (vl.params.renderItem) {
15820 vl.renderItem = vl.params.renderItem;
15821 }
15822 vl.$pageContentEl = vl.$el.parents('.page-content');
15823 vl.pageContentEl = vl.$pageContentEl[0];
15824
15825 // Bad scroll
15826 if (typeof vl.params.updatableScroll !== 'undefined') {
15827 vl.updatableScroll = vl.params.updatableScroll;
15828 } else {
15829 vl.updatableScroll = true;
15830 if (Device.ios && Device.osVersion.split('.')[0] < 8) {
15831 vl.updatableScroll = false;
15832 }
15833 }
15834
15835 // Append <ul>
15836 var ul = vl.params.ul;
15837 vl.$ul = ul ? $(vl.params.ul) : vl.$el.children('ul');
15838 if (vl.$ul.length === 0 && vl.params.createUl) {
15839 vl.$el.append('<ul></ul>');
15840 vl.$ul = vl.$el.children('ul');
15841 }
15842 vl.ul = vl.$ul[0];
15843
15844 var $itemsWrapEl;
15845 if (!vl.ul && !vl.params.createUl) { $itemsWrapEl = vl.$el; }
15846 else { $itemsWrapEl = vl.$ul; }
15847
15848 Utils.extend(vl, {
15849 $itemsWrapEl: $itemsWrapEl,
15850 itemsWrapEl: $itemsWrapEl[0],
15851 // DOM cached items
15852 domCache: {},
15853 displayDomCache: {},
15854 // Temporary DOM Element
15855 tempDomElement: doc.createElement('ul'),
15856 // Last repain position
15857 lastRepaintY: null,
15858 // Fragment
15859 fragment: doc.createDocumentFragment(),
15860 // Props
15861 pageHeight: undefined,
15862 rowsPerScreen: undefined,
15863 rowsBefore: undefined,
15864 rowsAfter: undefined,
15865 rowsToRender: undefined,
15866 maxBufferHeight: 0,
15867 listHeight: undefined,
15868 dynamicHeight: typeof vl.params.height === 'function',
15869 });
15870
15871 // Install Modules
15872 vl.useModules();
15873
15874 // Attach events
15875 var handleScrollBound = vl.handleScroll.bind(vl);
15876 var handleResizeBound = vl.handleResize.bind(vl);
15877 var $pageEl;
15878 var $tabEl;
15879 var $panelEl;
15880 var $popupEl;
15881 vl.attachEvents = function attachEvents() {
15882 $pageEl = vl.$el.parents('.page').eq(0);
15883 $tabEl = vl.$el.parents('.tab').eq(0);
15884 $panelEl = vl.$el.parents('.panel').eq(0);
15885 $popupEl = vl.$el.parents('.popup').eq(0);
15886
15887 vl.$pageContentEl.on('scroll', handleScrollBound);
15888 if ($pageEl) { $pageEl.on('page:reinit', handleResizeBound); }
15889 if ($tabEl) { $tabEl.on('tab:show', handleResizeBound); }
15890 if ($panelEl) { $panelEl.on('panel:open', handleResizeBound); }
15891 if ($popupEl) { $popupEl.on('popup:open', handleResizeBound); }
15892 app.on('resize', handleResizeBound);
15893 };
15894 vl.detachEvents = function attachEvents() {
15895 vl.$pageContentEl.off('scroll', handleScrollBound);
15896 if ($pageEl) { $pageEl.off('page:reinit', handleResizeBound); }
15897 if ($tabEl) { $tabEl.off('tab:show', handleResizeBound); }
15898 if ($panelEl) { $panelEl.off('panel:open', handleResizeBound); }
15899 if ($popupEl) { $popupEl.off('popup:open', handleResizeBound); }
15900 app.off('resize', handleResizeBound);
15901 };
15902 // Init
15903 vl.init();
15904
15905 return vl;
15906 }
15907
15908 if ( Framework7Class$$1 ) VirtualList.__proto__ = Framework7Class$$1;
15909 VirtualList.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
15910 VirtualList.prototype.constructor = VirtualList;
15911
15912 VirtualList.prototype.setListSize = function setListSize () {
15913 var vl = this;
15914 var items = vl.filteredItems || vl.items;
15915 vl.pageHeight = vl.$pageContentEl[0].offsetHeight;
15916 if (vl.dynamicHeight) {
15917 vl.listHeight = 0;
15918 vl.heights = [];
15919 for (var i = 0; i < items.length; i += 1) {
15920 var itemHeight = vl.params.height(items[i]);
15921 vl.listHeight += itemHeight;
15922 vl.heights.push(itemHeight);
15923 }
15924 } else {
15925 vl.listHeight = Math.ceil(items.length / vl.params.cols) * vl.params.height;
15926 vl.rowsPerScreen = Math.ceil(vl.pageHeight / vl.params.height);
15927 vl.rowsBefore = vl.params.rowsBefore || vl.rowsPerScreen * 2;
15928 vl.rowsAfter = vl.params.rowsAfter || vl.rowsPerScreen;
15929 vl.rowsToRender = (vl.rowsPerScreen + vl.rowsBefore + vl.rowsAfter);
15930 vl.maxBufferHeight = (vl.rowsBefore / 2) * vl.params.height;
15931 }
15932
15933 if (vl.updatableScroll || vl.params.setListHeight) {
15934 vl.$itemsWrapEl.css({ height: ((vl.listHeight) + "px") });
15935 }
15936 };
15937
15938 VirtualList.prototype.render = function render (force, forceScrollTop) {
15939 var vl = this;
15940 if (force) { vl.lastRepaintY = null; }
15941
15942 var scrollTop = -(vl.$el[0].getBoundingClientRect().top - vl.$pageContentEl[0].getBoundingClientRect().top);
15943
15944 if (typeof forceScrollTop !== 'undefined') { scrollTop = forceScrollTop; }
15945 if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > vl.maxBufferHeight || (!vl.updatableScroll && (vl.$pageContentEl[0].scrollTop + vl.pageHeight >= vl.$pageContentEl[0].scrollHeight))) {
15946 vl.lastRepaintY = scrollTop;
15947 } else {
15948 return;
15949 }
15950
15951 var items = vl.filteredItems || vl.items;
15952 var fromIndex;
15953 var toIndex;
15954 var heightBeforeFirstItem = 0;
15955 var heightBeforeLastItem = 0;
15956 if (vl.dynamicHeight) {
15957 var itemTop = 0;
15958 var itemHeight;
15959 vl.maxBufferHeight = vl.pageHeight;
15960
15961 for (var j = 0; j < vl.heights.length; j += 1) {
15962 itemHeight = vl.heights[j];
15963 if (typeof fromIndex === 'undefined') {
15964 if (itemTop + itemHeight >= scrollTop - (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize)) { fromIndex = j; }
15965 else { heightBeforeFirstItem += itemHeight; }
15966 }
15967
15968 if (typeof toIndex === 'undefined') {
15969 if (itemTop + itemHeight >= scrollTop + (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize) || j === vl.heights.length - 1) { toIndex = j + 1; }
15970 heightBeforeLastItem += itemHeight;
15971 }
15972 itemTop += itemHeight;
15973 }
15974 toIndex = Math.min(toIndex, items.length);
15975 } else {
15976 fromIndex = (parseInt(scrollTop / vl.params.height, 10) - vl.rowsBefore) * vl.params.cols;
15977 if (fromIndex < 0) {
15978 fromIndex = 0;
15979 }
15980 toIndex = Math.min(fromIndex + (vl.rowsToRender * vl.params.cols), items.length);
15981 }
15982
15983 var topPosition;
15984 var renderExternalItems = [];
15985 vl.reachEnd = false;
15986 var i;
15987 for (i = fromIndex; i < toIndex; i += 1) {
15988 var itemEl = (void 0);
15989 // Define real item index
15990 var index = vl.items.indexOf(items[i]);
15991
15992 if (i === fromIndex) { vl.currentFromIndex = index; }
15993 if (i === toIndex - 1) { vl.currentToIndex = index; }
15994 if (vl.filteredItems) {
15995 if (vl.items[index] === vl.filteredItems[vl.filteredItems.length - 1]) { vl.reachEnd = true; }
15996 } else if (index === vl.items.length - 1) { vl.reachEnd = true; }
15997
15998 // Find items
15999 if (vl.params.renderExternal) {
16000 renderExternalItems.push(items[i]);
16001 } else if (vl.domCache[index]) {
16002 itemEl = vl.domCache[index];
16003 itemEl.f7VirtualListIndex = index;
16004 } else {
16005 if (vl.renderItem) {
16006 vl.tempDomElement.innerHTML = vl.renderItem(items[i], index).trim();
16007 } else {
16008 vl.tempDomElement.innerHTML = items[i].toString().trim();
16009 }
16010 itemEl = vl.tempDomElement.childNodes[0];
16011 if (vl.params.cache) { vl.domCache[index] = itemEl; }
16012 itemEl.f7VirtualListIndex = index;
16013 }
16014
16015 // Set item top position
16016 if (i === fromIndex) {
16017 if (vl.dynamicHeight) {
16018 topPosition = heightBeforeFirstItem;
16019 } else {
16020 topPosition = ((i * vl.params.height) / vl.params.cols);
16021 }
16022 }
16023 if (!vl.params.renderExternal) {
16024 itemEl.style.top = topPosition + "px";
16025
16026 // Before item insert
16027 vl.emit('local::itemBeforeInsert vlItemBeforeInsert', vl, itemEl, items[i]);
16028
16029 // Append item to fragment
16030 vl.fragment.appendChild(itemEl);
16031 }
16032 }
16033
16034 // Update list height with not updatable scroll
16035 if (!vl.updatableScroll) {
16036 if (vl.dynamicHeight) {
16037 vl.itemsWrapEl.style.height = heightBeforeLastItem + "px";
16038 } else {
16039 vl.itemsWrapEl.style.height = ((i * vl.params.height) / vl.params.cols) + "px";
16040 }
16041 }
16042
16043 // Update list html
16044 if (vl.params.renderExternal) {
16045 if (items && items.length === 0) {
16046 vl.reachEnd = true;
16047 }
16048 } else {
16049 vl.emit('local::beforeClear vlBeforeClear', vl, vl.fragment);
16050 vl.itemsWrapEl.innerHTML = '';
16051
16052 vl.emit('local::itemsBeforeInsert vlItemsBeforeInsert', vl, vl.fragment);
16053
16054 if (items && items.length === 0) {
16055 vl.reachEnd = true;
16056 if (vl.params.emptyTemplate) { vl.itemsWrapEl.innerHTML = vl.params.emptyTemplate; }
16057 } else {
16058 vl.itemsWrapEl.appendChild(vl.fragment);
16059 }
16060
16061 vl.emit('local::itemsAfterInsert vlItemsAfterInsert', vl, vl.fragment);
16062 }
16063
16064 if (typeof forceScrollTop !== 'undefined' && force) {
16065 vl.$pageContentEl.scrollTop(forceScrollTop, 0);
16066 }
16067 if (vl.params.renderExternal) {
16068 vl.params.renderExternal(vl, {
16069 fromIndex: fromIndex,
16070 toIndex: toIndex,
16071 listHeight: vl.listHeight,
16072 topPosition: topPosition,
16073 items: renderExternalItems,
16074 });
16075 }
16076 };
16077
16078 // Filter
16079 VirtualList.prototype.filterItems = function filterItems (indexes, resetScrollTop) {
16080 if ( resetScrollTop === void 0 ) resetScrollTop = true;
16081
16082 var vl = this;
16083 vl.filteredItems = [];
16084 for (var i = 0; i < indexes.length; i += 1) {
16085 vl.filteredItems.push(vl.items[indexes[i]]);
16086 }
16087 if (resetScrollTop) {
16088 vl.$pageContentEl[0].scrollTop = 0;
16089 }
16090 vl.update();
16091 };
16092
16093 VirtualList.prototype.resetFilter = function resetFilter () {
16094 var vl = this;
16095 if (vl.params.showFilteredItemsOnly) {
16096 vl.filteredItems = [];
16097 } else {
16098 vl.filteredItems = null;
16099 delete vl.filteredItems;
16100 }
16101 vl.update();
16102 };
16103
16104 VirtualList.prototype.scrollToItem = function scrollToItem (index) {
16105 var vl = this;
16106 if (index > vl.items.length) { return false; }
16107 var itemTop = 0;
16108 if (vl.dynamicHeight) {
16109 for (var i = 0; i < index; i += 1) {
16110 itemTop += vl.heights[i];
16111 }
16112 } else {
16113 itemTop = index * vl.params.height;
16114 }
16115 var listTop = vl.$el[0].offsetTop;
16116 vl.render(true, (listTop + itemTop) - parseInt(vl.$pageContentEl.css('padding-top'), 10));
16117 return true;
16118 };
16119
16120 VirtualList.prototype.handleScroll = function handleScroll () {
16121 var vl = this;
16122 vl.render();
16123 };
16124
16125 // Handle resize event
16126 VirtualList.prototype.isVisible = function isVisible () {
16127 var vl = this;
16128 return !!(vl.el.offsetWidth || vl.el.offsetHeight || vl.el.getClientRects().length);
16129 };
16130
16131 VirtualList.prototype.handleResize = function handleResize () {
16132 var vl = this;
16133 if (vl.isVisible()) {
16134 vl.setListSize();
16135 vl.render(true);
16136 }
16137 };
16138
16139 // Append
16140 VirtualList.prototype.appendItems = function appendItems (items) {
16141 var vl = this;
16142 for (var i = 0; i < items.length; i += 1) {
16143 vl.items.push(items[i]);
16144 }
16145 vl.update();
16146 };
16147
16148 VirtualList.prototype.appendItem = function appendItem (item) {
16149 var vl = this;
16150 vl.appendItems([item]);
16151 };
16152
16153 // Replace
16154 VirtualList.prototype.replaceAllItems = function replaceAllItems (items) {
16155 var vl = this;
16156 vl.items = items;
16157 delete vl.filteredItems;
16158 vl.domCache = {};
16159 vl.update();
16160 };
16161
16162 VirtualList.prototype.replaceItem = function replaceItem (index, item) {
16163 var vl = this;
16164 vl.items[index] = item;
16165 if (vl.params.cache) { delete vl.domCache[index]; }
16166 vl.update();
16167 };
16168
16169 // Prepend
16170 VirtualList.prototype.prependItems = function prependItems (items) {
16171 var vl = this;
16172 for (var i = items.length - 1; i >= 0; i -= 1) {
16173 vl.items.unshift(items[i]);
16174 }
16175 if (vl.params.cache) {
16176 var newCache = {};
16177 Object.keys(vl.domCache).forEach(function (cached) {
16178 newCache[parseInt(cached, 10) + items.length] = vl.domCache[cached];
16179 });
16180 vl.domCache = newCache;
16181 }
16182 vl.update();
16183 };
16184
16185 VirtualList.prototype.prependItem = function prependItem (item) {
16186 var vl = this;
16187 vl.prependItems([item]);
16188 };
16189
16190 // Move
16191 VirtualList.prototype.moveItem = function moveItem (from, to) {
16192 var vl = this;
16193 var fromIndex = from;
16194 var toIndex = to;
16195 if (fromIndex === toIndex) { return; }
16196 // remove item from array
16197 var item = vl.items.splice(fromIndex, 1)[0];
16198 if (toIndex >= vl.items.length) {
16199 // Add item to the end
16200 vl.items.push(item);
16201 toIndex = vl.items.length - 1;
16202 } else {
16203 // Add item to new index
16204 vl.items.splice(toIndex, 0, item);
16205 }
16206 // Update cache
16207 if (vl.params.cache) {
16208 var newCache = {};
16209 Object.keys(vl.domCache).forEach(function (cached) {
16210 var cachedIndex = parseInt(cached, 10);
16211 var leftIndex = fromIndex < toIndex ? fromIndex : toIndex;
16212 var rightIndex = fromIndex < toIndex ? toIndex : fromIndex;
16213 var indexShift = fromIndex < toIndex ? -1 : 1;
16214 if (cachedIndex < leftIndex || cachedIndex > rightIndex) { newCache[cachedIndex] = vl.domCache[cachedIndex]; }
16215 if (cachedIndex === leftIndex) { newCache[rightIndex] = vl.domCache[cachedIndex]; }
16216 if (cachedIndex > leftIndex && cachedIndex <= rightIndex) { newCache[cachedIndex + indexShift] = vl.domCache[cachedIndex]; }
16217 });
16218 vl.domCache = newCache;
16219 }
16220 vl.update();
16221 };
16222
16223 // Insert before
16224 VirtualList.prototype.insertItemBefore = function insertItemBefore (index, item) {
16225 var vl = this;
16226 if (index === 0) {
16227 vl.prependItem(item);
16228 return;
16229 }
16230 if (index >= vl.items.length) {
16231 vl.appendItem(item);
16232 return;
16233 }
16234 vl.items.splice(index, 0, item);
16235 // Update cache
16236 if (vl.params.cache) {
16237 var newCache = {};
16238 Object.keys(vl.domCache).forEach(function (cached) {
16239 var cachedIndex = parseInt(cached, 10);
16240 if (cachedIndex >= index) {
16241 newCache[cachedIndex + 1] = vl.domCache[cachedIndex];
16242 }
16243 });
16244 vl.domCache = newCache;
16245 }
16246 vl.update();
16247 };
16248
16249 // Delete
16250 VirtualList.prototype.deleteItems = function deleteItems (indexes) {
16251 var vl = this;
16252 var prevIndex;
16253 var indexShift = 0;
16254 var loop = function ( i ) {
16255 var index = indexes[i];
16256 if (typeof prevIndex !== 'undefined') {
16257 if (index > prevIndex) {
16258 indexShift = -i;
16259 }
16260 }
16261 index += indexShift;
16262 prevIndex = indexes[i];
16263 // Delete item
16264 var deletedItem = vl.items.splice(index, 1)[0];
16265
16266 // Delete from filtered
16267 if (vl.filteredItems && vl.filteredItems.indexOf(deletedItem) >= 0) {
16268 vl.filteredItems.splice(vl.filteredItems.indexOf(deletedItem), 1);
16269 }
16270 // Update cache
16271 if (vl.params.cache) {
16272 var newCache = {};
16273 Object.keys(vl.domCache).forEach(function (cached) {
16274 var cachedIndex = parseInt(cached, 10);
16275 if (cachedIndex === index) {
16276 delete vl.domCache[index];
16277 } else if (parseInt(cached, 10) > index) {
16278 newCache[cachedIndex - 1] = vl.domCache[cached];
16279 } else {
16280 newCache[cachedIndex] = vl.domCache[cached];
16281 }
16282 });
16283 vl.domCache = newCache;
16284 }
16285 };
16286
16287 for (var i = 0; i < indexes.length; i += 1) loop( i );
16288 vl.update();
16289 };
16290
16291 VirtualList.prototype.deleteAllItems = function deleteAllItems () {
16292 var vl = this;
16293 vl.items = [];
16294 delete vl.filteredItems;
16295 if (vl.params.cache) { vl.domCache = {}; }
16296 vl.update();
16297 };
16298
16299 VirtualList.prototype.deleteItem = function deleteItem (index) {
16300 var vl = this;
16301 vl.deleteItems([index]);
16302 };
16303
16304 // Clear cache
16305 VirtualList.prototype.clearCache = function clearCache () {
16306 var vl = this;
16307 vl.domCache = {};
16308 };
16309
16310 // Update Virtual List
16311 VirtualList.prototype.update = function update (deleteCache) {
16312 var vl = this;
16313 if (deleteCache && vl.params.cache) {
16314 vl.domCache = {};
16315 }
16316 vl.setListSize();
16317 vl.render(true);
16318 };
16319
16320 VirtualList.prototype.init = function init () {
16321 var vl = this;
16322 vl.attachEvents();
16323 vl.setListSize();
16324 vl.render();
16325 };
16326
16327 VirtualList.prototype.destroy = function destroy () {
16328 var vl = this;
16329 vl.detachEvents();
16330 vl.$el[0].f7VirtualList = null;
16331 delete vl.$el[0].f7VirtualList;
16332 Utils.deleteProps(vl);
16333 vl = null;
16334 };
16335
16336 return VirtualList;
16337 }(Framework7Class));
16338
16339 var VirtualList$1 = {
16340 name: 'virtualList',
16341 static: {
16342 VirtualList: VirtualList,
16343 },
16344 create: function create() {
16345 var app = this;
16346 app.virtualList = ConstructorMethods({
16347 defaultSelector: '.virtual-list',
16348 constructor: VirtualList,
16349 app: app,
16350 domProp: 'f7VirtualList',
16351 });
16352 },
16353 };
16354
16355 var ListIndex = /*@__PURE__*/(function (Framework7Class$$1) {
16356 function ListIndex(app, params) {
16357 if ( params === void 0 ) params = {};
16358
16359 Framework7Class$$1.call(this, params, [app]);
16360 var index = this;
16361
16362 var defaults = {
16363 el: null, // where to render indexes
16364 listEl: null, // list el to generate indexes
16365 indexes: 'auto', // or array of indexes
16366 iosItemHeight: 14,
16367 mdItemHeight: 14,
16368 scrollList: true,
16369 label: false,
16370 // eslint-disable-next-line
16371 renderItem: function renderItem(itemContent, itemIndex) {
16372 return ("\n <li>" + itemContent + "</li>\n ").trim();
16373 },
16374 renderSkipPlaceholder: function renderSkipPlaceholder() {
16375 return '<li class="list-index-skip-placeholder"></li>';
16376 },
16377 on: {},
16378 };
16379
16380 // Extend defaults with modules params
16381 index.useModulesParams(defaults);
16382
16383 index.params = Utils.extend(defaults, params);
16384
16385 var $el;
16386 var $listEl;
16387 var $pageContentEl;
16388 var $ul;
16389
16390 if (index.params.el) {
16391 $el = $(index.params.el);
16392 } else {
16393 return index;
16394 }
16395
16396 if ($el[0].f7ListIndex) {
16397 return $el[0].f7ListIndex;
16398 }
16399
16400 $ul = $el.find('ul');
16401 if ($ul.length === 0) {
16402 $ul = $('<ul></ul>');
16403 $el.append($ul);
16404 }
16405
16406 if (index.params.listEl) {
16407 $listEl = $(index.params.listEl);
16408 }
16409
16410 if (index.params.indexes === 'auto' && !$listEl) {
16411 return index;
16412 }
16413
16414 if ($listEl) {
16415 $pageContentEl = $listEl.parents('.page-content').eq(0);
16416 } else {
16417 $pageContentEl = $el.siblings('.page-content').eq(0);
16418 if ($pageContentEl.length === 0) {
16419 $pageContentEl = $el.parents('.page').eq(0).find('.page-content').eq(0);
16420 }
16421 }
16422
16423 $el[0].f7ListIndex = index;
16424
16425 Utils.extend(index, {
16426 app: app,
16427 $el: $el,
16428 el: $el && $el[0],
16429 $ul: $ul,
16430 ul: $ul && $ul[0],
16431 $listEl: $listEl,
16432 listEl: $listEl && $listEl[0],
16433 $pageContentEl: $pageContentEl,
16434 pageContentEl: $pageContentEl && $pageContentEl[0],
16435 indexes: params.indexes,
16436 height: 0,
16437 skipRate: 0,
16438 });
16439
16440 // Install Modules
16441 index.useModules();
16442
16443 // Attach events
16444 function handleResize() {
16445 var height = { index: index };
16446 index.calcSize();
16447 if (height !== index.height) {
16448 index.render();
16449 }
16450 }
16451
16452 function handleClick(e) {
16453 var $clickedLi = $(e.target).closest('li');
16454 if (!$clickedLi.length) { return; }
16455
16456 var itemIndex = $clickedLi.index();
16457 if (index.skipRate > 0) {
16458 var percentage = itemIndex / ($clickedLi.siblings('li').length - 1);
16459 itemIndex = Math.round((index.indexes.length - 1) * percentage);
16460 }
16461 var itemContent = index.indexes[itemIndex];
16462
16463 index.$el.trigger('listindex:click', itemContent, itemIndex);
16464 index.emit('local::click listIndexClick', index, itemContent, itemIndex);
16465 index.$el.trigger('listindex:select', itemContent, itemIndex);
16466 index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
16467
16468 if (index.$listEl && index.params.scrollList) {
16469 index.scrollListToIndex(itemContent, itemIndex);
16470 }
16471 }
16472
16473 var touchesStart = {};
16474 var isTouched;
16475 var isMoved;
16476 var topPoint;
16477 var bottomPoint;
16478 var $labelEl;
16479 var previousIndex = null;
16480 function handleTouchStart(e) {
16481 var $children = $ul.children();
16482 if (!$children.length) { return; }
16483 topPoint = $children[0].getBoundingClientRect().top;
16484 bottomPoint = $children[$children.length - 1].getBoundingClientRect().top + $children[0].offsetHeight;
16485
16486 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
16487 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
16488 isTouched = true;
16489 isMoved = false;
16490 previousIndex = null;
16491 }
16492 function handleTouchMove(e) {
16493 if (!isTouched) { return; }
16494 if (!isMoved && index.params.label) {
16495 $labelEl = $('<span class="list-index-label"></span>');
16496 $el.append($labelEl);
16497 }
16498 isMoved = true;
16499 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
16500 e.preventDefault();
16501
16502 var percentage = (pageY - topPoint) / (bottomPoint - topPoint);
16503 percentage = Math.min(Math.max(percentage, 0), 1);
16504
16505 var itemIndex = Math.round((index.indexes.length - 1) * percentage);
16506 var itemContent = index.indexes[itemIndex];
16507
16508
16509 var ulHeight = bottomPoint - topPoint;
16510 var bubbleBottom = ((index.height - ulHeight) / 2) + ((1 - percentage) * ulHeight);
16511
16512 if (itemIndex !== previousIndex) {
16513 if (index.params.label) {
16514 $labelEl.html(itemContent).transform(("translateY(-" + bubbleBottom + "px)"));
16515 }
16516
16517 if (index.$listEl && index.params.scrollList) {
16518 index.scrollListToIndex(itemContent, itemIndex);
16519 }
16520 }
16521
16522 previousIndex = itemIndex;
16523
16524 index.$el.trigger('listindex:select', index);
16525 index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
16526 }
16527 function handleTouchEnd() {
16528 if (!isTouched) { return; }
16529 isTouched = false;
16530 isMoved = false;
16531 if (index.params.label) {
16532 if ($labelEl) { $labelEl.remove(); }
16533 $labelEl = undefined;
16534 }
16535 }
16536 var passiveListener = app.support.passiveListener ? { passive: true } : false;
16537 index.attachEvents = function attachEvents() {
16538 $el.parents('.tab').on('tab:show', handleResize);
16539 $el.parents('.page').on('page:reinit', handleResize);
16540 $el.parents('.panel').on('panel:open', handleResize);
16541 $el
16542 .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
16543 .on('modal:open', handleResize);
16544 app.on('resize', handleResize);
16545
16546 $el.on('click', handleClick);
16547 $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
16548 app.on('touchmove:active', handleTouchMove);
16549 app.on('touchend:passive', handleTouchEnd);
16550 };
16551 index.detachEvents = function attachEvents() {
16552 $el.parents('.tab').off('tab:show', handleResize);
16553 $el.parents('.page').off('page:reinit', handleResize);
16554 $el.parents('.panel').off('panel:open', handleResize);
16555 $el
16556 .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
16557 .off('modal:open', handleResize);
16558 app.off('resize', handleResize);
16559
16560 $el.off('click', handleClick);
16561 $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
16562 app.off('touchmove:active', handleTouchMove);
16563 app.off('touchend:passive', handleTouchEnd);
16564 };
16565 // Init
16566 index.init();
16567
16568 return index;
16569 }
16570
16571 if ( Framework7Class$$1 ) ListIndex.__proto__ = Framework7Class$$1;
16572 ListIndex.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
16573 ListIndex.prototype.constructor = ListIndex;
16574 // eslint-disable-next-line
16575 ListIndex.prototype.scrollListToIndex = function scrollListToIndex (itemContent, itemIndex) {
16576 var index = this;
16577 var $listEl = index.$listEl;
16578 var $pageContentEl = index.$pageContentEl;
16579 if (!$listEl || !$pageContentEl || $pageContentEl.length === 0) { return index; }
16580
16581 var $scrollToEl;
16582 $listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
16583 if ($scrollToEl) { return; }
16584 var $el = $(el);
16585 if ($el.text() === itemContent) {
16586 $scrollToEl = $el;
16587 }
16588 });
16589 if (!$scrollToEl || $scrollToEl.length === 0) { return index; }
16590
16591 var parentTop = $scrollToEl.parent().offset().top;
16592 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
16593 var scrollTop = $pageContentEl[0].scrollTop;
16594 var scrollToElTop = $scrollToEl.offset().top;
16595
16596 if (parentTop <= paddingTop) {
16597 $pageContentEl.scrollTop((parentTop + scrollTop) - paddingTop);
16598 } else {
16599 $pageContentEl.scrollTop((scrollToElTop + scrollTop) - paddingTop);
16600 }
16601 return index;
16602 };
16603
16604 ListIndex.prototype.renderSkipPlaceholder = function renderSkipPlaceholder () {
16605 var index = this;
16606 return index.params.renderSkipPlaceholder.call(index);
16607 };
16608
16609 ListIndex.prototype.renderItem = function renderItem (itemContent, itemIndex) {
16610 var index = this;
16611 return index.params.renderItem.call(index, itemContent, itemIndex);
16612 };
16613
16614 ListIndex.prototype.render = function render () {
16615 var index = this;
16616 var $ul = index.$ul;
16617 var indexes = index.indexes;
16618 var skipRate = index.skipRate;
16619 var wasSkipped;
16620
16621 var html = indexes.map(function (itemContent, itemIndex) {
16622 if (itemIndex % skipRate !== 0 && skipRate > 0) {
16623 wasSkipped = true;
16624 return '';
16625 }
16626 var itemHtml = index.renderItem(itemContent, itemIndex);
16627 if (wasSkipped) {
16628 itemHtml = index.renderSkipPlaceholder() + itemHtml;
16629 }
16630 wasSkipped = false;
16631 return itemHtml;
16632 }).join('');
16633
16634 $ul.html(html);
16635
16636 return index;
16637 };
16638
16639 ListIndex.prototype.calcSize = function calcSize () {
16640 var index = this;
16641 var app = index.app;
16642 var params = index.params;
16643 var el = index.el;
16644 var indexes = index.indexes;
16645 var height = el.offsetHeight;
16646 var itemHeight = app.theme === 'ios' ? params.iosItemHeight : params.mdItemHeight;
16647 var maxItems = Math.floor(height / itemHeight);
16648 var items = indexes.length;
16649 var skipRate = 0;
16650 if (items > maxItems) {
16651 skipRate = Math.ceil(((items * 2) - 1) / maxItems);
16652 }
16653
16654 index.height = height;
16655 index.skipRate = skipRate;
16656
16657 return index;
16658 };
16659
16660 ListIndex.prototype.calcIndexes = function calcIndexes () {
16661 var index = this;
16662 if (index.params.indexes === 'auto') {
16663 index.indexes = [];
16664
16665 index.$listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
16666 var elContent = $(el).text();
16667 if (index.indexes.indexOf(elContent) < 0) {
16668 index.indexes.push(elContent);
16669 }
16670 });
16671 } else {
16672 index.indexes = index.params.indexes;
16673 }
16674 return index;
16675 };
16676
16677 ListIndex.prototype.update = function update () {
16678 var index = this;
16679 index.calcIndexes();
16680 index.calcSize();
16681 index.render();
16682
16683 return index;
16684 };
16685
16686 ListIndex.prototype.init = function init () {
16687 var index = this;
16688 index.calcIndexes();
16689 index.calcSize();
16690 index.render();
16691 index.attachEvents();
16692 };
16693
16694 ListIndex.prototype.destroy = function destroy () {
16695 var index = this;
16696 index.$el.trigger('listindex:beforedestroy', index);
16697 index.emit('local::beforeDestroy listIndexBeforeDestroy', index);
16698 index.detachEvents();
16699 if (index.$el[0]) {
16700 index.$el[0].f7ListIndex = null;
16701 delete index.$el[0].f7ListIndex;
16702 }
16703 Utils.deleteProps(index);
16704 index = null;
16705 };
16706
16707 return ListIndex;
16708 }(Framework7Class));
16709
16710 var ListIndex$1 = {
16711 name: 'listIndex',
16712 static: {
16713 ListIndex: ListIndex,
16714 },
16715 create: function create() {
16716 var app = this;
16717 app.listIndex = ConstructorMethods({
16718 defaultSelector: '.list-index',
16719 constructor: ListIndex,
16720 app: app,
16721 domProp: 'f7ListIndex',
16722 });
16723 },
16724 on: {
16725 tabMounted: function tabMounted(tabEl) {
16726 var app = this;
16727 $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
16728 var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
16729 app.listIndex.create(params);
16730 });
16731 },
16732 tabBeforeRemove: function tabBeforeRemove(tabEl) {
16733 $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
16734 if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
16735 });
16736 },
16737 pageInit: function pageInit(page) {
16738 var app = this;
16739 page.$el.find('.list-index-init').each(function (index, listIndexEl) {
16740 var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
16741 app.listIndex.create(params);
16742 });
16743 },
16744 pageBeforeRemove: function pageBeforeRemove(page) {
16745 page.$el.find('.list-index-init').each(function (index, listIndexEl) {
16746 if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
16747 });
16748 },
16749 },
16750 vnode: {
16751 'list-index-init': {
16752 insert: function insert(vnode) {
16753 var app = this;
16754 var listIndexEl = vnode.elm;
16755 var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
16756 app.listIndex.create(params);
16757 },
16758 destroy: function destroy(vnode) {
16759 var listIndexEl = vnode.elm;
16760 if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
16761 },
16762 },
16763 },
16764 };
16765
16766 var Timeline = {
16767 name: 'timeline',
16768 };
16769
16770 var Tab = {
16771 show: function show() {
16772 var assign, assign$1, assign$2;
16773
16774 var args = [], len = arguments.length;
16775 while ( len-- ) args[ len ] = arguments[ len ];
16776 var app = this;
16777
16778 var tabEl;
16779 var tabLinkEl;
16780 var animate;
16781 var tabRoute;
16782 if (args.length === 1 && args[0].constructor === Object) {
16783 tabEl = args[0].tabEl;
16784 tabLinkEl = args[0].tabLinkEl;
16785 animate = args[0].animate;
16786 tabRoute = args[0].tabRoute;
16787 } else {
16788 (assign = args, tabEl = assign[0], tabLinkEl = assign[1], animate = assign[2], tabRoute = assign[3]);
16789 if (typeof args[1] === 'boolean') {
16790 (assign$1 = args, tabEl = assign$1[0], animate = assign$1[1], tabLinkEl = assign$1[2], tabRoute = assign$1[3]);
16791 if (args.length > 2 && tabLinkEl.constructor === Object) {
16792 (assign$2 = args, tabEl = assign$2[0], animate = assign$2[1], tabRoute = assign$2[2], tabLinkEl = assign$2[3]);
16793 }
16794 }
16795 }
16796 if (typeof animate === 'undefined') { animate = true; }
16797
16798 var $newTabEl = $(tabEl);
16799 if (tabRoute && $newTabEl[0]) {
16800 $newTabEl[0].f7TabRoute = tabRoute;
16801 }
16802
16803 if ($newTabEl.length === 0 || $newTabEl.hasClass('tab-active')) {
16804 return {
16805 $newTabEl: $newTabEl,
16806 newTabEl: $newTabEl[0],
16807 };
16808 }
16809
16810 var $tabLinkEl;
16811 if (tabLinkEl) { $tabLinkEl = $(tabLinkEl); }
16812
16813 var $tabsEl = $newTabEl.parent('.tabs');
16814 if ($tabsEl.length === 0) {
16815 return {
16816 $newTabEl: $newTabEl,
16817 newTabEl: $newTabEl[0],
16818 };
16819 }
16820
16821 // Release swipeouts in hidden tabs
16822 if (app.swipeout) { app.swipeout.allowOpen = true; }
16823
16824 // Animated tabs
16825 var tabsChangedCallbacks = [];
16826
16827 function onTabsChanged(callback) {
16828 tabsChangedCallbacks.push(callback);
16829 }
16830 function tabsChanged() {
16831 tabsChangedCallbacks.forEach(function (callback) {
16832 callback();
16833 });
16834 }
16835
16836 var animated = false;
16837
16838 if ($tabsEl.parent().hasClass('tabs-animated-wrap')) {
16839 $tabsEl.parent()[animate ? 'removeClass' : 'addClass']('not-animated');
16840
16841 var transitionDuration = parseFloat($tabsEl.css('transition-duration').replace(',', '.'));
16842 if (animate && transitionDuration) {
16843 $tabsEl.transitionEnd(tabsChanged);
16844 animated = true;
16845 }
16846
16847 var tabsTranslate = (app.rtl ? $newTabEl.index() : -$newTabEl.index()) * 100;
16848 $tabsEl.transform(("translate3d(" + tabsTranslate + "%,0,0)"));
16849 }
16850
16851 // Swipeable tabs
16852 var swiper;
16853 if ($tabsEl.parent().hasClass('tabs-swipeable-wrap') && app.swiper) {
16854 swiper = $tabsEl.parent()[0].swiper;
16855 if (swiper && swiper.activeIndex !== $newTabEl.index()) {
16856 animated = true;
16857 swiper
16858 .once('slideChangeTransitionEnd', function () {
16859 tabsChanged();
16860 })
16861 .slideTo($newTabEl.index(), animate ? undefined : 0);
16862 } else if (swiper && swiper.animating) {
16863 animated = true;
16864 swiper
16865 .once('slideChangeTransitionEnd', function () {
16866 tabsChanged();
16867 });
16868 }
16869 }
16870
16871 // Remove active class from old tabs
16872 var $oldTabEl = $tabsEl.children('.tab-active');
16873 $oldTabEl.removeClass('tab-active');
16874 if (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute)) {
16875 $oldTabEl.trigger('tab:hide');
16876 app.emit('tabHide', $oldTabEl[0]);
16877 }
16878
16879 // Trigger 'show' event on new tab
16880 $newTabEl.addClass('tab-active');
16881 if (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute)) {
16882 $newTabEl.trigger('tab:show');
16883 app.emit('tabShow', $newTabEl[0]);
16884 }
16885
16886 // Find related link for new tab
16887 if (!$tabLinkEl) {
16888 // Search by id
16889 if (typeof tabEl === 'string') { $tabLinkEl = $((".tab-link[href=\"" + tabEl + "\"]")); }
16890 else { $tabLinkEl = $((".tab-link[href=\"#" + ($newTabEl.attr('id')) + "\"]")); }
16891 // Search by data-tab
16892 if (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0)) {
16893 $('[data-tab]').each(function (index, el) {
16894 if ($newTabEl.is($(el).attr('data-tab'))) { $tabLinkEl = $(el); }
16895 });
16896 }
16897 if (tabRoute && (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0))) {
16898 $tabLinkEl = $(("[data-route-tab-id=\"" + (tabRoute.route.tab.id) + "\"]"));
16899 if ($tabLinkEl.length === 0) {
16900 $tabLinkEl = $((".tab-link[href=\"" + (tabRoute.url) + "\"]"));
16901 }
16902 }
16903 if ($tabLinkEl.length > 1 && $newTabEl.parents('.page').length) {
16904 // eslint-disable-next-line
16905 $tabLinkEl = $tabLinkEl.filter(function (index, tabLinkElement) {
16906 return $(tabLinkElement).parents('.page')[0] === $newTabEl.parents('.page')[0];
16907 });
16908 if (app.theme === 'ios' && $tabLinkEl.length === 0 && tabRoute) {
16909 var $pageEl = $newTabEl.parents('.page');
16910 var $navbarEl = $(app.navbar.getElByPage($pageEl));
16911 $tabLinkEl = $navbarEl.find(("[data-route-tab-id=\"" + (tabRoute.route.tab.id) + "\"]"));
16912 if ($tabLinkEl.length === 0) {
16913 $tabLinkEl = $navbarEl.find((".tab-link[href=\"" + (tabRoute.url) + "\"]"));
16914 }
16915 }
16916 }
16917 }
16918 if ($tabLinkEl.length > 0) {
16919 // Find related link for old tab
16920 var $oldTabLinkEl;
16921 if ($oldTabEl && $oldTabEl.length > 0) {
16922 // Search by id
16923 var oldTabId = $oldTabEl.attr('id');
16924 if (oldTabId) {
16925 $oldTabLinkEl = $((".tab-link[href=\"#" + oldTabId + "\"]"));
16926 // Search by data-route-tab-id
16927 if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
16928 $oldTabLinkEl = $((".tab-link[data-route-tab-id=\"" + oldTabId + "\"]"));
16929 }
16930 }
16931 // Search by data-tab
16932 if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
16933 $('[data-tab]').each(function (index, tabLinkElement) {
16934 if ($oldTabEl.is($(tabLinkElement).attr('data-tab'))) { $oldTabLinkEl = $(tabLinkElement); }
16935 });
16936 }
16937 if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
16938 $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
16939 }
16940 } else if (tabRoute) {
16941 $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
16942 }
16943
16944 if ($oldTabLinkEl && $oldTabLinkEl.length > 1 && $oldTabEl && $oldTabEl.parents('.page').length) {
16945 // eslint-disable-next-line
16946 $oldTabLinkEl = $oldTabLinkEl.filter(function (index, tabLinkElement) {
16947 return $(tabLinkElement).parents('.page')[0] === $oldTabEl.parents('.page')[0];
16948 });
16949 }
16950
16951 if ($oldTabLinkEl && $oldTabLinkEl.length > 0) { $oldTabLinkEl.removeClass('tab-link-active'); }
16952
16953 // Update links' classes
16954 if ($tabLinkEl && $tabLinkEl.length > 0) {
16955 $tabLinkEl.addClass('tab-link-active');
16956 // Material Highlight
16957 if (app.theme === 'md' && app.toolbar) {
16958 var $tabbarEl = $tabLinkEl.parents('.tabbar, .tabbar-labels');
16959 if ($tabbarEl.length > 0) {
16960 app.toolbar.setHighlight($tabbarEl);
16961 }
16962 }
16963 }
16964 }
16965 return {
16966 $newTabEl: $newTabEl,
16967 newTabEl: $newTabEl[0],
16968 $oldTabEl: $oldTabEl,
16969 oldTabEl: $oldTabEl[0],
16970 onTabsChanged: onTabsChanged,
16971 animated: animated,
16972 };
16973 },
16974 };
16975 var Tabs = {
16976 name: 'tabs',
16977 create: function create() {
16978 var app = this;
16979 Utils.extend(app, {
16980 tab: {
16981 show: Tab.show.bind(app),
16982 },
16983 });
16984 },
16985 clicks: {
16986 '.tab-link': function tabLinkClick($clickedEl, data) {
16987 if ( data === void 0 ) data = {};
16988
16989 var app = this;
16990 if (($clickedEl.attr('href') && $clickedEl.attr('href').indexOf('#') === 0) || $clickedEl.attr('data-tab')) {
16991 app.tab.show({
16992 tabEl: data.tab || $clickedEl.attr('href'),
16993 tabLinkEl: $clickedEl,
16994 animate: data.animate,
16995 });
16996 }
16997 },
16998 },
16999 };
17000
17001 function swipePanel(panel) {
17002 var app = panel.app;
17003 Utils.extend(panel, {
17004 swipeable: true,
17005 swipeInitialized: true,
17006 });
17007 var params = app.params.panel;
17008 var $el = panel.$el;
17009 var $backdropEl = panel.$backdropEl;
17010 var side = panel.side;
17011 var effect = panel.effect;
17012 var otherPanel;
17013
17014 var isTouched;
17015 var isMoved;
17016 var isScrolling;
17017 var touchesStart = {};
17018 var touchStartTime;
17019 var touchesDiff;
17020 var translate;
17021 var backdropOpacity;
17022 var panelWidth;
17023 var direction;
17024
17025 var $viewEl;
17026
17027 var touchMoves = 0;
17028 function handleTouchStart(e) {
17029 if (!panel.swipeable) { return; }
17030 if (!app.panel.allowOpen || (!params.swipe && !params.swipeOnlyClose) || isTouched) { return; }
17031 if ($('.modal-in:not(.toast):not(.notification), .photo-browser-in').length > 0) { return; }
17032 otherPanel = app.panel[side === 'left' ? 'right' : 'left'] || {};
17033 if (!panel.opened && otherPanel.opened) { return; }
17034 if (!(params.swipeCloseOpposite || params.swipeOnlyClose)) {
17035 if (otherPanel.opened) { return; }
17036 }
17037 if (e.target && e.target.nodeName.toLowerCase() === 'input' && e.target.type === 'range') { return; }
17038 if ($(e.target).closest('.range-slider, .tabs-swipeable-wrap, .calendar-months, .no-swipe-panel, .card-opened').length > 0) { return; }
17039 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
17040 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
17041 if (params.swipeOnlyClose && !panel.opened) {
17042 return;
17043 }
17044 if (params.swipe !== 'both' && params.swipeCloseOpposite && params.swipe !== side && !panel.opened) {
17045 return;
17046 }
17047 if (params.swipeActiveArea && !panel.opened) {
17048 if (side === 'left') {
17049 if (touchesStart.x > params.swipeActiveArea) { return; }
17050 }
17051 if (side === 'right') {
17052 if (touchesStart.x < app.width - params.swipeActiveArea) { return; }
17053 }
17054 }
17055 if (params.swipeCloseActiveAreaSide && panel.opened) {
17056 if (side === 'left') {
17057 if (touchesStart.x < ($el[0].offsetWidth - params.swipeCloseActiveAreaSide)) { return; }
17058 }
17059 if (side === 'right') {
17060 if (touchesStart.x > ((app.width - $el[0].offsetWidth) + params.swipeCloseActiveAreaSide)) { return; }
17061 }
17062 }
17063 touchMoves = 0;
17064 $viewEl = $(panel.getViewEl());
17065 isMoved = false;
17066 isTouched = true;
17067 isScrolling = undefined;
17068
17069 touchStartTime = Utils.now();
17070 direction = undefined;
17071 }
17072 function handleTouchMove(e) {
17073 if (!isTouched) { return; }
17074 touchMoves += 1;
17075 if (touchMoves < 2) { return; }
17076 if (e.f7PreventSwipePanel || app.preventSwipePanelBySwipeBack || app.preventSwipePanel) {
17077 isTouched = false;
17078 return;
17079 }
17080 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
17081 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
17082 if (typeof isScrolling === 'undefined') {
17083 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
17084 }
17085 if (isScrolling) {
17086 isTouched = false;
17087 return;
17088 }
17089 if (!direction) {
17090 if (pageX > touchesStart.x) {
17091 direction = 'to-right';
17092 } else {
17093 direction = 'to-left';
17094 }
17095
17096 if (params.swipe === 'both') {
17097 if (params.swipeActiveArea > 0 && !panel.opened) {
17098 if (side === 'left' && touchesStart.x > params.swipeActiveArea) {
17099 isTouched = false;
17100 return;
17101 }
17102 if (side === 'right' && touchesStart.x < app.width - params.swipeActiveArea) {
17103 isTouched = false;
17104 return;
17105 }
17106 }
17107 }
17108 if ($el.hasClass('panel-visible-by-breakpoint')) {
17109 isTouched = false;
17110 return;
17111 }
17112
17113 if (
17114 (side === 'left'
17115 && (
17116 direction === 'to-left' && !$el.hasClass('panel-active')
17117 )
17118 )
17119 || (side === 'right'
17120 && (
17121 direction === 'to-right' && !$el.hasClass('panel-active')
17122 )
17123 )
17124 ) {
17125 isTouched = false;
17126 return;
17127 }
17128 }
17129
17130 var threshold = panel.opened ? 0 : -params.swipeThreshold;
17131 if (side === 'right') { threshold = -threshold; }
17132
17133 if (params.swipeNoFollow) {
17134 var touchesDiffNoFollow = (pageX - touchesStart.x);
17135 var timeDiff = (new Date()).getTime() - touchStartTime;
17136 var needToSwitch;
17137 if (!panel.opened && (
17138 (side === 'left' && touchesDiffNoFollow > -threshold)
17139 || (side === 'right' && -touchesDiffNoFollow > threshold)
17140 )) {
17141 needToSwitch = true;
17142 }
17143 if (panel.opened && (
17144 (side === 'left' && touchesDiffNoFollow < 0)
17145 || (side === 'right' && touchesDiffNoFollow > 0)
17146 )) {
17147 needToSwitch = true;
17148 }
17149
17150 if (needToSwitch) {
17151 if (timeDiff < 300) {
17152 if (direction === 'to-left') {
17153 if (side === 'right') { app.panel.open(side); }
17154 if (side === 'left' && $el.hasClass('panel-active')) { app.panel.close(); }
17155 }
17156 if (direction === 'to-right') {
17157 if (side === 'left') { app.panel.open(side); }
17158 if (side === 'right' && $el.hasClass('panel-active')) { app.panel.close(); }
17159 }
17160 }
17161 isTouched = false;
17162 isMoved = false;
17163 }
17164 return;
17165 }
17166
17167 if (!isMoved) {
17168 if (!panel.opened) {
17169 $el.show();
17170 $backdropEl.show();
17171 $el.trigger('panel:swipeopen', panel);
17172 panel.emit('local::swipeOpen panelSwipeOpen', panel);
17173 }
17174 panelWidth = $el[0].offsetWidth;
17175 $el.transition(0);
17176 }
17177
17178 isMoved = true;
17179
17180 e.preventDefault();
17181
17182 touchesDiff = (pageX - touchesStart.x) + threshold;
17183
17184 if (side === 'right') {
17185 if (effect === 'cover') {
17186 translate = touchesDiff + (panel.opened ? 0 : panelWidth);
17187 if (translate < 0) { translate = 0; }
17188 if (translate > panelWidth) {
17189 translate = panelWidth;
17190 }
17191 } else {
17192 translate = touchesDiff - (panel.opened ? panelWidth : 0);
17193 if (translate > 0) { translate = 0; }
17194 if (translate < -panelWidth) {
17195 translate = -panelWidth;
17196 }
17197 }
17198 } else {
17199 translate = touchesDiff + (panel.opened ? panelWidth : 0);
17200 if (translate < 0) { translate = 0; }
17201 if (translate > panelWidth) {
17202 translate = panelWidth;
17203 }
17204 }
17205 if (effect === 'reveal') {
17206 $viewEl.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
17207 $backdropEl.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
17208
17209 $el.trigger('panel:swipe', panel, Math.abs(translate / panelWidth));
17210 panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
17211 } else {
17212 if (side === 'left') { translate -= panelWidth; }
17213 $el.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
17214
17215 $backdropEl.transition(0);
17216 backdropOpacity = 1 - Math.abs(translate / panelWidth);
17217 $backdropEl.css({ opacity: backdropOpacity });
17218
17219 $el.trigger('panel:swipe', panel, Math.abs(translate / panelWidth));
17220 panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
17221 }
17222 }
17223 function handleTouchEnd() {
17224 if (!isTouched || !isMoved) {
17225 isTouched = false;
17226 isMoved = false;
17227 return;
17228 }
17229 isTouched = false;
17230 isMoved = false;
17231 var timeDiff = (new Date()).getTime() - touchStartTime;
17232 var action;
17233 var edge = (translate === 0 || Math.abs(translate) === panelWidth);
17234
17235 var threshold = params.swipeThreshold || 0;
17236
17237 if (!panel.opened) {
17238 if (Math.abs(touchesDiff) < threshold) {
17239 action = 'reset';
17240 } else if (effect === 'cover') {
17241 if (translate === 0) {
17242 action = 'swap'; // open
17243 } else if (timeDiff < 300 && Math.abs(translate) > 0) {
17244 action = 'swap'; // open
17245 } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
17246 action = 'swap'; // open
17247 } else {
17248 action = 'reset'; // close
17249 }
17250 } else if (translate === 0) {
17251 action = 'reset';
17252 } else if (
17253 (timeDiff < 300 && Math.abs(translate) > 0)
17254 || (timeDiff >= 300 && (Math.abs(translate) >= panelWidth / 2))
17255 ) {
17256 action = 'swap';
17257 } else {
17258 action = 'reset';
17259 }
17260 } else if (effect === 'cover') {
17261 if (translate === 0) {
17262 action = 'reset'; // open
17263 } else if (timeDiff < 300 && Math.abs(translate) > 0) {
17264 action = 'swap'; // open
17265 } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
17266 action = 'reset'; // open
17267 } else {
17268 action = 'swap'; // close
17269 }
17270 } else if (translate === -panelWidth) {
17271 action = 'reset';
17272 } else if (
17273 (timeDiff < 300 && Math.abs(translate) >= 0)
17274 || (timeDiff >= 300 && (Math.abs(translate) <= panelWidth / 2))
17275 ) {
17276 if (side === 'left' && translate === panelWidth) { action = 'reset'; }
17277 else { action = 'swap'; }
17278 } else {
17279 action = 'reset';
17280 }
17281 if (action === 'swap') {
17282 if (panel.opened) {
17283 panel.close(!edge);
17284 } else {
17285 panel.open(!edge);
17286 }
17287 }
17288 if (action === 'reset') {
17289 if (!panel.opened) {
17290 if (edge) {
17291 $el.css({ display: '' });
17292 } else {
17293 var target = effect === 'reveal' ? $viewEl : $el;
17294 $('html').addClass('with-panel-transitioning');
17295 target.transitionEnd(function () {
17296 if ($el.hasClass('panel-active')) { return; }
17297 $el.css({ display: '' });
17298 $('html').removeClass('with-panel-transitioning');
17299 });
17300 }
17301 }
17302 }
17303 if (effect === 'reveal') {
17304 Utils.nextFrame(function () {
17305 $viewEl.transition('');
17306 $viewEl.transform('');
17307 });
17308 }
17309 $el.transition('').transform('');
17310 $backdropEl.css({ display: '' }).transform('').transition('').css('opacity', '');
17311 }
17312
17313 // Add Events
17314 app.on('touchstart:passive', handleTouchStart);
17315 app.on('touchmove:active', handleTouchMove);
17316 app.on('touchend:passive', handleTouchEnd);
17317 panel.on('panelDestroy', function () {
17318 app.off('touchstart:passive', handleTouchStart);
17319 app.off('touchmove:active', handleTouchMove);
17320 app.off('touchend:passive', handleTouchEnd);
17321 });
17322 }
17323
17324 var Panel = /*@__PURE__*/(function (Framework7Class$$1) {
17325 function Panel(app, params) {
17326 var obj;
17327
17328 if ( params === void 0 ) params = {};
17329 Framework7Class$$1.call(this, params, [app]);
17330 var panel = this;
17331
17332 var el = params.el;
17333
17334 if (!el && params.content) {
17335 el = params.content;
17336 }
17337
17338 var $el = $(el);
17339 if ($el.length === 0) { return panel; }
17340 if ($el[0].f7Panel) { return $el[0].f7Panel; }
17341
17342 $el[0].f7Panel = panel;
17343
17344 var opened = params.opened;
17345 var side = params.side;
17346 var effect = params.effect;
17347 if (typeof opened === 'undefined') { opened = $el.hasClass('panel-active'); }
17348 if (typeof side === 'undefined') { side = $el.hasClass('panel-left') ? 'left' : 'right'; }
17349 if (typeof effect === 'undefined') { effect = $el.hasClass('panel-cover') ? 'cover' : 'reveal'; }
17350
17351 if (!app.panel[side]) {
17352 Utils.extend(app.panel, ( obj = {}, obj[side] = panel, obj ));
17353 } else {
17354 throw new Error(("Framework7: Can't create panel; app already has a " + side + " panel!"));
17355 }
17356
17357 var $backdropEl = $('.panel-backdrop');
17358
17359 if ($backdropEl.length === 0) {
17360 $backdropEl = $('<div class="panel-backdrop"></div>');
17361 $backdropEl.insertBefore($el);
17362 }
17363
17364 Utils.extend(panel, {
17365 app: app,
17366 side: side,
17367 effect: effect,
17368 $el: $el,
17369 el: $el[0],
17370 opened: opened,
17371 $backdropEl: $backdropEl,
17372 backdropEl: $backdropEl[0],
17373 });
17374
17375 // Install Modules
17376 panel.useModules();
17377
17378 // Init
17379 panel.init();
17380
17381 return panel;
17382 }
17383
17384 if ( Framework7Class$$1 ) Panel.__proto__ = Framework7Class$$1;
17385 Panel.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
17386 Panel.prototype.constructor = Panel;
17387
17388 Panel.prototype.init = function init () {
17389 var panel = this;
17390 var app = panel.app;
17391 if (app.params.panel[((panel.side) + "Breakpoint")]) {
17392 panel.initBreakpoints();
17393 }
17394 {
17395 if (
17396 (app.params.panel.swipe === panel.side)
17397 || (app.params.panel.swipe === 'both')
17398 || (app.params.panel.swipe && app.params.panel.swipe !== panel.side && app.params.panel.swipeCloseOpposite)
17399 ) {
17400 panel.initSwipePanel();
17401 }
17402 }
17403 };
17404
17405 Panel.prototype.getViewEl = function getViewEl () {
17406 var panel = this;
17407 var app = panel.app;
17408 var viewEl;
17409 if (app.root.children('.views').length > 0) {
17410 viewEl = app.root.children('.views')[0];
17411 } else {
17412 viewEl = app.root.children('.view')[0];
17413 }
17414 return viewEl;
17415 };
17416
17417 Panel.prototype.setBreakpoint = function setBreakpoint () {
17418 var obj, obj$1;
17419
17420 var panel = this;
17421 var app = panel.app;
17422 var side = panel.side;
17423 var $el = panel.$el;
17424 var $viewEl = $(panel.getViewEl());
17425 var breakpoint = app.params.panel[(side + "Breakpoint")];
17426 var wasVisible = $el.hasClass('panel-visible-by-breakpoint');
17427
17428 if (app.width >= breakpoint) {
17429 if (!wasVisible) {
17430 $('html').removeClass(("with-panel-" + side + "-reveal with-panel-" + side + "-cover with-panel"));
17431 $el.css('display', '').addClass('panel-visible-by-breakpoint').removeClass('panel-active');
17432 panel.onOpen();
17433 panel.onOpened();
17434 $viewEl.css(( obj = {}, obj[("margin-" + side)] = (($el.width()) + "px"), obj ));
17435 app.allowPanelOpen = true;
17436 app.emit('local::breakpoint panelBreakpoint');
17437 panel.$el.trigger('panel:breakpoint', panel);
17438 }
17439 } else if (wasVisible) {
17440 $el.css('display', '').removeClass('panel-visible-by-breakpoint panel-active');
17441 panel.onClose();
17442 panel.onClosed();
17443 $viewEl.css(( obj$1 = {}, obj$1[("margin-" + side)] = '', obj$1 ));
17444 app.emit('local::breakpoint panelBreakpoint');
17445 panel.$el.trigger('panel:breakpoint', panel);
17446 }
17447 };
17448
17449 Panel.prototype.initBreakpoints = function initBreakpoints () {
17450 var panel = this;
17451 var app = panel.app;
17452 panel.resizeHandler = function resizeHandler() {
17453 panel.setBreakpoint();
17454 };
17455 if (app.params.panel[((panel.side) + "Breakpoint")]) {
17456 app.on('resize', panel.resizeHandler);
17457 }
17458 panel.setBreakpoint();
17459 return panel;
17460 };
17461
17462 Panel.prototype.initSwipePanel = function initSwipePanel () {
17463 {
17464 swipePanel(this);
17465 }
17466 };
17467
17468 Panel.prototype.destroy = function destroy () {
17469 var panel = this;
17470 var app = panel.app;
17471
17472 if (!panel.$el) {
17473 // Panel already destroyed
17474 return;
17475 }
17476
17477 panel.emit('local::beforeDestroy panelBeforeDestroy', panel);
17478 panel.$el.trigger('panel:beforedestroy', panel);
17479
17480 if (panel.resizeHandler) {
17481 app.off('resize', panel.resizeHandler);
17482 }
17483 panel.$el.trigger('panel:destroy', panel);
17484 panel.emit('local::destroy panelDestroy');
17485 delete app.panel[panel.side];
17486 if (panel.el) {
17487 panel.el.f7Panel = null;
17488 delete panel.el.f7Panel;
17489 }
17490 Utils.deleteProps(panel);
17491 panel = null;
17492 };
17493
17494 Panel.prototype.open = function open (animate) {
17495 if ( animate === void 0 ) animate = true;
17496
17497 var panel = this;
17498 var app = panel.app;
17499 if (!app.panel.allowOpen) { return false; }
17500
17501 var side = panel.side;
17502 var effect = panel.effect;
17503 var $el = panel.$el;
17504 var $backdropEl = panel.$backdropEl;
17505 var opened = panel.opened;
17506
17507 var $panelParentEl = $el.parent();
17508 var wasInDom = $el.parents(document).length > 0;
17509
17510 if (!$panelParentEl.is(app.root) || $el.prevAll('.views, .view').length) {
17511 var $insertBeforeEl = app.root.children('.panel, .views, .view').eq(0);
17512 var $insertAfterEl = app.root.children('.statusbar').eq(0);
17513
17514 if ($insertBeforeEl.length) {
17515 $el.insertBefore($insertBeforeEl);
17516 } else if ($insertAfterEl.length) {
17517 $el.insertAfter($insertBeforeEl);
17518 } else {
17519 app.root.prepend($el);
17520 }
17521
17522 if ($backdropEl
17523 && $backdropEl.length
17524 && (
17525 (
17526 !$backdropEl.parent().is(app.root)
17527 && $backdropEl.nextAll('.panel').length === 0
17528 )
17529 || (
17530 $backdropEl.parent().is(app.root)
17531 && $backdropEl.nextAll('.panel').length === 0
17532 )
17533 )
17534 ) {
17535 $backdropEl.insertBefore($el);
17536 }
17537
17538 panel.once('panelClosed', function () {
17539 if (wasInDom) {
17540 $panelParentEl.append($el);
17541 } else {
17542 $el.remove();
17543 }
17544 });
17545 }
17546
17547 // Ignore if opened
17548 if (opened || $el.hasClass('panel-visible-by-breakpoint') || $el.hasClass('panel-active')) { return false; }
17549
17550 // Close if some panel is opened
17551 app.panel.close(side === 'left' ? 'right' : 'left', animate);
17552
17553 app.panel.allowOpen = false;
17554
17555 $el[animate ? 'removeClass' : 'addClass']('not-animated');
17556 $el
17557 .css({ display: 'block' })
17558 .addClass('panel-active');
17559
17560 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
17561 $backdropEl.show();
17562
17563 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
17564 panel._clientLeft = $el[0].clientLeft;
17565
17566 $('html').addClass(("with-panel with-panel-" + side + "-" + effect));
17567 panel.onOpen();
17568
17569 // Transition End;
17570 var transitionEndTarget = effect === 'reveal' ? $el.nextAll('.view, .views').eq(0) : $el;
17571
17572 function panelTransitionEnd() {
17573 transitionEndTarget.transitionEnd(function (e) {
17574 if ($(e.target).is(transitionEndTarget)) {
17575 if ($el.hasClass('panel-active')) {
17576 panel.onOpened();
17577 $backdropEl.css({ display: '' });
17578 } else {
17579 panel.onClosed();
17580 $backdropEl.css({ display: '' });
17581 }
17582 } else { panelTransitionEnd(); }
17583 });
17584 }
17585 if (animate) {
17586 panelTransitionEnd();
17587 } else {
17588 panel.onOpened();
17589 $backdropEl.css({ display: '' });
17590 }
17591
17592 return true;
17593 };
17594
17595 Panel.prototype.close = function close (animate) {
17596 if ( animate === void 0 ) animate = true;
17597
17598 var panel = this;
17599 var app = panel.app;
17600
17601 var side = panel.side;
17602 var effect = panel.effect;
17603 var $el = panel.$el;
17604 var $backdropEl = panel.$backdropEl;
17605 var opened = panel.opened;
17606
17607 if (!opened || $el.hasClass('panel-visible-by-breakpoint') || !$el.hasClass('panel-active')) { return false; }
17608
17609 $el[animate ? 'removeClass' : 'addClass']('not-animated');
17610 $el.removeClass('panel-active');
17611
17612 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
17613
17614 var transitionEndTarget = effect === 'reveal' ? $el.nextAll('.view, .views').eq(0) : $el;
17615
17616 panel.onClose();
17617 app.panel.allowOpen = false;
17618
17619 if (animate) {
17620 transitionEndTarget.transitionEnd(function () {
17621 if ($el.hasClass('panel-active')) { return; }
17622 $el.css({ display: '' });
17623 $('html').removeClass('with-panel-transitioning');
17624 panel.onClosed();
17625 });
17626 $('html')
17627 .removeClass(("with-panel with-panel-" + side + "-" + effect))
17628 .addClass('with-panel-transitioning');
17629 } else {
17630 $el.css({ display: '' });
17631 $el.removeClass('not-animated');
17632 $('html').removeClass(("with-panel with-panel-transitioning with-panel-" + side + "-" + effect));
17633 panel.onClosed();
17634 }
17635 return true;
17636 };
17637
17638 Panel.prototype.onOpen = function onOpen () {
17639 var panel = this;
17640 panel.opened = true;
17641 panel.$el.trigger('panel:open', panel);
17642 panel.emit('local::open panelOpen', panel);
17643 };
17644
17645 Panel.prototype.onOpened = function onOpened () {
17646 var panel = this;
17647 var app = panel.app;
17648 app.panel.allowOpen = true;
17649
17650 panel.$el.trigger('panel:opened', panel);
17651 panel.emit('local::opened panelOpened', panel);
17652 };
17653
17654 Panel.prototype.onClose = function onClose () {
17655 var panel = this;
17656 panel.opened = false;
17657 panel.$el.addClass('panel-closing');
17658 panel.$el.trigger('panel:close', panel);
17659 panel.emit('local::close panelClose', panel);
17660 };
17661
17662 Panel.prototype.onClosed = function onClosed () {
17663 var panel = this;
17664 var app = panel.app;
17665 app.panel.allowOpen = true;
17666 panel.$el.removeClass('panel-closing');
17667 panel.$el.trigger('panel:closed', panel);
17668 panel.emit('local::closed panelClosed', panel);
17669 };
17670
17671 return Panel;
17672 }(Framework7Class));
17673
17674 var Panel$1 = {
17675 name: 'panel',
17676 params: {
17677 panel: {
17678 leftBreakpoint: 0,
17679 rightBreakpoint: 0,
17680 swipe: undefined, // or 'left' or 'right' or 'both'
17681 swipeActiveArea: 0,
17682 swipeCloseActiveAreaSide: 0,
17683 swipeCloseOpposite: true,
17684 swipeOnlyClose: false,
17685 swipeNoFollow: false,
17686 swipeThreshold: 0,
17687 closeByBackdropClick: true,
17688 },
17689 },
17690 static: {
17691 Panel: Panel,
17692 },
17693 instance: {
17694 panel: {
17695 allowOpen: true,
17696 },
17697 },
17698 create: function create() {
17699 var app = this;
17700 Utils.extend(app.panel, {
17701 disableSwipe: function disableSwipe(panel) {
17702 if ( panel === void 0 ) panel = 'both';
17703
17704 var side;
17705 var panels = [];
17706 if (typeof panel === 'string') {
17707 if (panel === 'both') {
17708 side = 'both';
17709 panels = [app.panel.left, app.panel.right];
17710 } else {
17711 side = panel;
17712 panels.push(app.panel[side]);
17713 }
17714 } else {
17715 panels = [panel];
17716 }
17717 panels.forEach(function (panelInstance) {
17718 if (panelInstance) { Utils.extend(panelInstance, { swipeable: false }); }
17719 });
17720 },
17721 enableSwipe: function enableSwipe(panel) {
17722 if ( panel === void 0 ) panel = 'both';
17723
17724 var panels = [];
17725 var side;
17726 if (typeof panel === 'string') {
17727 side = panel;
17728 if (
17729 (app.params.panel.swipe === 'left' && side === 'right')
17730 || (app.params.panel.swipe === 'right' && side === 'left')
17731 || side === 'both'
17732 ) {
17733 side = 'both';
17734 app.params.panel.swipe = side;
17735 panels = [app.panel.left, app.panel.right];
17736 } else {
17737 app.params.panel.swipe = side;
17738 panels.push(app.panel[side]);
17739 }
17740 } else if (panel) {
17741 panels.push(panel);
17742 }
17743 if (panels.length) {
17744 panels.forEach(function (panelInstance) {
17745 if (!panelInstance) { return; }
17746 if (!panelInstance.swipeInitialized) {
17747 panelInstance.initSwipePanel();
17748 } else {
17749 Utils.extend(panelInstance, { swipeable: true });
17750 }
17751 });
17752 }
17753 },
17754 create: function create(params) {
17755 return new Panel(app, params);
17756 },
17757 open: function open(side, animate) {
17758 var panelSide = side;
17759 if (!panelSide) {
17760 if ($('.panel').length > 1) {
17761 return false;
17762 }
17763 panelSide = $('.panel').hasClass('panel-left') ? 'left' : 'right';
17764 }
17765 if (!panelSide) { return false; }
17766 if (app.panel[panelSide]) {
17767 return app.panel[panelSide].open(animate);
17768 }
17769 var $panelEl = $((".panel-" + panelSide));
17770 if ($panelEl.length > 0) {
17771 return app.panel.create({ el: $panelEl }).open(animate);
17772 }
17773 return false;
17774 },
17775 close: function close(side, animate) {
17776 var $panelEl;
17777 var panelSide;
17778 if (panelSide) {
17779 panelSide = side;
17780 $panelEl = $((".panel-" + panelSide));
17781 } else {
17782 $panelEl = $('.panel.panel-active');
17783 panelSide = $panelEl.hasClass('panel-left') ? 'left' : 'right';
17784 }
17785 if (!panelSide) { return false; }
17786 if (app.panel[panelSide]) {
17787 return app.panel[panelSide].close(animate);
17788 }
17789 if ($panelEl.length > 0) {
17790 return app.panel.create({ el: $panelEl }).close(animate);
17791 }
17792 return false;
17793 },
17794 get: function get(side) {
17795 var panelSide = side;
17796 if (!panelSide) {
17797 if ($('.panel').length > 1) {
17798 return undefined;
17799 }
17800 panelSide = $('.panel').hasClass('panel-left') ? 'left' : 'right';
17801 }
17802 if (!panelSide) { return undefined; }
17803 if (app.panel[panelSide]) {
17804 return app.panel[panelSide];
17805 }
17806 var $panelEl = $((".panel-" + panelSide));
17807 if ($panelEl.length > 0) {
17808 return app.panel.create({ el: $panelEl });
17809 }
17810 return undefined;
17811 },
17812 });
17813 },
17814 on: {
17815 init: function init() {
17816 var app = this;
17817
17818 // Create Panels
17819 $('.panel').each(function (index, panelEl) {
17820 var side = $(panelEl).hasClass('panel-left') ? 'left' : 'right';
17821 app.panel[side] = app.panel.create({ el: panelEl, side: side });
17822 });
17823 },
17824 },
17825 clicks: {
17826 '.panel-open': function open(clickedEl, data) {
17827 if ( data === void 0 ) data = {};
17828
17829 var app = this;
17830 var side = 'left';
17831 if (data.panel === 'right' || ($('.panel').length === 1 && $('.panel').hasClass('panel-right'))) {
17832 side = 'right';
17833 }
17834 app.panel.open(side, data.animate);
17835 },
17836 '.panel-close': function close(clickedEl, data) {
17837 if ( data === void 0 ) data = {};
17838
17839 var app = this;
17840 var side = data.panel;
17841 app.panel.close(side, data.animate);
17842 },
17843 '.panel-backdrop': function close() {
17844 var app = this;
17845 var $panelEl = $('.panel-active');
17846 var instance = $panelEl[0] && $panelEl[0].f7Panel;
17847 $panelEl.trigger('panel:backdrop-click');
17848 if (instance) {
17849 instance.emit('backdropClick', instance);
17850 }
17851 app.emit('panelBackdropClick', instance || $panelEl[0]);
17852 if (app.params.panel.closeByBackdropClick) { app.panel.close(); }
17853 },
17854 },
17855 };
17856
17857 var CardExpandable = {
17858 open: function open(cardEl, animate) {
17859 var assign;
17860
17861 if ( cardEl === void 0 ) cardEl = '.card-expandable';
17862 if ( animate === void 0 ) animate = true;
17863 var app = this;
17864 if ($('.card-opened').length) { return; }
17865 var $cardEl = $(cardEl).eq(0);
17866
17867 if (!$cardEl || !$cardEl.length) { return; }
17868 if ($cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) { return; }
17869
17870 var $pageEl = $cardEl.parents('.page').eq(0);
17871 if (!$pageEl.length) { return; }
17872
17873 var prevented;
17874
17875 function prevent() {
17876 prevented = true;
17877 }
17878
17879 $cardEl.trigger('card:beforeopen', { prevent: prevent });
17880 app.emit('cardBeforeOpen', $cardEl[0], prevent);
17881
17882 if (prevented) { return; }
17883
17884 var $backropEl;
17885 if (app.params.card.backrop) {
17886 $backropEl = $cardEl.parents('.page-content').find('.card-backdrop');
17887 if (!$backropEl.length) {
17888 $backropEl = $('<div class="card-backdrop"></div>');
17889 $cardEl.parents('.page-content').append($backropEl);
17890 }
17891 }
17892
17893 var $navbarEl;
17894 var $toolbarEl;
17895 if (app.params.card.hideNavbarOnOpen) {
17896 $navbarEl = $pageEl.children('.navbar');
17897 if (!$navbarEl.length) {
17898 if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
17899 }
17900 }
17901 if (app.params.card.hideToolbarOnOpen) {
17902 $toolbarEl = $pageEl.children('.toolbar');
17903 if (!$toolbarEl.length) {
17904 $toolbarEl = $pageEl.parents('.view').children('.toolbar');
17905 }
17906 if (!$toolbarEl.length) {
17907 $toolbarEl = $pageEl.parents('.views').children('.toolbar');
17908 }
17909 }
17910
17911 var currTransform = $cardEl.css('transform');
17912 var hasTransform;
17913 if (currTransform && currTransform.match(/[2-9]/)) {
17914 hasTransform = true;
17915 }
17916 var $cardContentEl = $cardEl.children('.card-content');
17917
17918 var $cardSizeEl = $(document.createElement('div')).addClass('card-expandable-size');
17919 $cardEl.append($cardSizeEl);
17920
17921 var cardWidth = $cardEl[0].offsetWidth;
17922 var cardHeight = $cardEl[0].offsetHeight;
17923 var pageWidth = $pageEl[0].offsetWidth;
17924 var pageHeight = $pageEl[0].offsetHeight;
17925
17926 var maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
17927 var maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
17928
17929 var scaleX = maxWidth / cardWidth;
17930 var scaleY = maxHeight / cardHeight;
17931
17932 var offset = $cardEl.offset();
17933
17934 var cardLeftOffset;
17935 var cardTopOffset;
17936
17937 if (hasTransform) {
17938 cardLeftOffset = $cardEl[0].offsetLeft;
17939 cardTopOffset = $cardEl[0].offsetTop - $cardEl.parents('.page-content')[0].scrollTop;
17940 } else {
17941 cardLeftOffset = offset.left;
17942 cardTopOffset = offset.top - $pageEl.offset().top;
17943 if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
17944 }
17945
17946 cardLeftOffset -= (pageWidth - maxWidth) / 2;
17947 cardTopOffset -= (pageHeight - maxHeight) / 2;
17948
17949 var cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
17950 if (app.rtl) {
17951 (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
17952 }
17953 var cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
17954 var translateX = (cardRightOffset - cardLeftOffset) / 2;
17955 var translateY = (cardBottomOffset - cardTopOffset) / 2;
17956 if (app.params.card.hideNavbarOnOpen && $navbarEl && $navbarEl.length) {
17957 app.navbar.hide($navbarEl, animate);
17958 }
17959 if (app.params.card.hideToolbarOnOpen && $toolbarEl && $toolbarEl.length) {
17960 app.toolbar.hide($toolbarEl, animate);
17961 }
17962 if ($backropEl) {
17963 $backropEl.removeClass('card-backdrop-out').addClass('card-backdrop-in');
17964 }
17965 $cardEl.removeClass('card-transitioning');
17966 if (animate) {
17967 $cardEl.addClass('card-opening');
17968 }
17969 $cardEl.trigger('card:open');
17970 app.emit('cardOpen', $cardEl[0]);
17971 function transitionEnd() {
17972 $cardEl.addClass('card-opened');
17973 $cardEl.removeClass('card-opening');
17974 $cardEl.trigger('card:opened');
17975 app.emit('cardOpened', $cardEl[0]);
17976 }
17977 $cardContentEl
17978 .css({
17979 width: (maxWidth + "px"),
17980 height: (maxHeight + "px"),
17981 })
17982 .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
17983
17984 $cardEl
17985 .transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
17986 if (animate) {
17987 $cardEl.transitionEnd(function () {
17988 transitionEnd();
17989 });
17990 } else {
17991 transitionEnd();
17992 }
17993
17994 $pageEl.addClass('page-with-card-opened');
17995
17996 function onResize() {
17997 var assign;
17998
17999 $cardEl.removeClass('card-transitioning');
18000 cardWidth = $cardEl[0].offsetWidth;
18001 cardHeight = $cardEl[0].offsetHeight;
18002 pageWidth = $pageEl[0].offsetWidth;
18003 pageHeight = $pageEl[0].offsetHeight;
18004 maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
18005 maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
18006
18007 scaleX = maxWidth / cardWidth;
18008 scaleY = maxHeight / cardHeight;
18009
18010 $cardEl.transform('translate3d(0px, 0px, 0) scale(1)');
18011 offset = $cardEl.offset();
18012
18013 cardLeftOffset = offset.left - (pageWidth - maxWidth) / 2;
18014 if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
18015 cardTopOffset = offset.top - (pageHeight - maxHeight) / 2;
18016
18017 cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
18018 cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
18019 if (app.rtl) {
18020 (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
18021 }
18022 translateX = (cardRightOffset - cardLeftOffset) / 2;
18023 translateY = (cardBottomOffset - cardTopOffset) / 2;
18024
18025 $cardEl.transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
18026 $cardContentEl
18027 .css({
18028 width: (maxWidth + "px"),
18029 height: (maxHeight + "px"),
18030 })
18031 .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
18032 }
18033
18034 var cardScrollTop;
18035 var isTouched;
18036 var isMoved;
18037 var touchStartX;
18038 var touchStartY;
18039 var touchEndX;
18040 var touchEndY;
18041 var isScrolling;
18042 var progress;
18043 var isV;
18044 var isH;
18045 function onTouchStart(e) {
18046 if (!$(e.target).closest($cardEl).length) { return; }
18047 if (!$cardEl.hasClass('card-opened')) { return; }
18048 cardScrollTop = $cardContentEl.scrollTop();
18049 isTouched = true;
18050 touchStartX = e.targetTouches[0].pageX;
18051 touchStartY = e.targetTouches[0].pageY;
18052 isScrolling = undefined;
18053 isV = false;
18054 isH = false;
18055 }
18056 function onTouchMove(e) {
18057 if (!isTouched) { return; }
18058 touchEndX = e.targetTouches[0].pageX;
18059 touchEndY = e.targetTouches[0].pageY;
18060 if (typeof isScrolling === 'undefined') {
18061 isScrolling = !!(isScrolling || Math.abs(touchEndY - touchStartY) > Math.abs(touchEndX - touchStartX));
18062 }
18063 if (!isH && !isV) {
18064 if (!isScrolling && e.targetTouches[0].clientX <= 50) {
18065 isH = true;
18066 } else {
18067 isV = true;
18068 }
18069 }
18070
18071 if (!(isH || isV) || (isV && cardScrollTop !== 0)) {
18072 isTouched = true;
18073 isMoved = true;
18074 return;
18075 }
18076 if (!isMoved) {
18077 $cardEl.removeClass('card-transitioning');
18078 }
18079
18080 isMoved = true;
18081 progress = isV ? Math.max((touchEndY - touchStartY) / 150, 0) : Math.max((touchEndX - touchStartX) / (cardWidth / 2), 0);
18082 if ((progress > 0 && isV) || isH) {
18083 if (isV && app.device.ios) {
18084 $cardContentEl.css('-webkit-overflow-scrolling', 'auto');
18085 $cardContentEl.scrollTop(0);
18086 }
18087 e.preventDefault();
18088 }
18089
18090 if (progress > 1) { progress = Math.pow( progress, 0.3 ); }
18091 if (progress > (isV ? 1.3 : 1.1)) {
18092 isTouched = false;
18093 isMoved = false;
18094 app.card.close($cardEl);
18095 } else {
18096 $cardEl.transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + (scaleX * (1 - progress * 0.2)) + ", " + (scaleY * (1 - progress * 0.2)) + ")"));
18097 }
18098 }
18099 function onTouchEnd() {
18100 if (!isTouched || !isMoved) { return; }
18101 isTouched = false;
18102 isMoved = false;
18103 if (app.device.ios) {
18104 $cardContentEl.css('-webkit-overflow-scrolling', '');
18105 }
18106 if (progress >= 0.8) {
18107 app.card.close($cardEl);
18108 } else {
18109 $cardEl
18110 .addClass('card-transitioning')
18111 .transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
18112 }
18113 }
18114
18115 $cardEl[0].detachEventHandlers = function detachEventHandlers() {
18116 app.off('resize', onResize);
18117 if (Support.touch && app.params.card.swipeToClose) {
18118 app.off('touchstart:passive', onTouchStart);
18119 app.off('touchmove:active', onTouchMove);
18120 app.off('touchend:passive', onTouchEnd);
18121 }
18122 };
18123
18124 app.on('resize', onResize);
18125 if (Support.touch && app.params.card.swipeToClose) {
18126 app.on('touchstart:passive', onTouchStart);
18127 app.on('touchmove:active', onTouchMove);
18128 app.on('touchend:passive', onTouchEnd);
18129 }
18130 },
18131 close: function close(cardEl, animate) {
18132 if ( cardEl === void 0 ) cardEl = '.card-expandable.card-opened';
18133 if ( animate === void 0 ) animate = true;
18134
18135 var app = this;
18136 var $cardEl = $(cardEl).eq(0);
18137 if (!$cardEl || !$cardEl.length) { return; }
18138 if (!$cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) { return; }
18139
18140 var $cardContentEl = $cardEl.children('.card-content');
18141
18142 var $pageEl = $cardEl.parents('.page').eq(0);
18143 if (!$pageEl.length) { return; }
18144 var $navbarEl;
18145 var $toolbarEl;
18146
18147 var $backropEl;
18148 if (app.params.card.backrop) {
18149 $backropEl = $cardEl.parents('.page-content').find('.card-backdrop');
18150 }
18151
18152 if (app.params.card.hideNavbarOnOpen) {
18153 $navbarEl = $pageEl.children('.navbar');
18154 if (!$navbarEl.length) {
18155 if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
18156 }
18157 if ($navbarEl && $navbarEl.length) {
18158 app.navbar.show($navbarEl, animate);
18159 }
18160 }
18161 if (app.params.card.hideToolbarOnOpen) {
18162 $toolbarEl = $pageEl.children('.toolbar');
18163 if (!$toolbarEl.length) {
18164 $toolbarEl = $pageEl.parents('.view').children('.toolbar');
18165 }
18166 if (!$toolbarEl.length) {
18167 $toolbarEl = $pageEl.parents('.views').children('.toolbar');
18168 }
18169 if ($toolbarEl && $toolbarEl.length) {
18170 app.toolbar.show($toolbarEl, animate);
18171 }
18172 }
18173 $pageEl.removeClass('page-with-card-opened');
18174
18175
18176 if ($backropEl && $backropEl.length) {
18177 $backropEl.removeClass('card-backdrop-in').addClass('card-backdrop-out');
18178 }
18179
18180 $cardEl.removeClass('card-opened card-transitioning');
18181 if (animate) {
18182 $cardEl.addClass('card-closing');
18183 } else {
18184 $cardEl.addClass('card-no-transition');
18185 }
18186 $cardEl.transform('');
18187 $cardEl.trigger('card:close');
18188 app.emit('cardClose', $cardEl[0]);
18189
18190 function transitionEnd() {
18191 $cardEl.removeClass('card-closing card-no-transition');
18192 $cardEl.trigger('card:closed');
18193 $cardEl.find('.card-expandable-size').remove();
18194 app.emit('cardClosed', $cardEl[0]);
18195 }
18196 $cardContentEl
18197 .css({
18198 width: '',
18199 height: '',
18200 })
18201 .transform('')
18202 .scrollTop(0, animate ? 300 : 0);
18203 if (animate) {
18204 $cardContentEl.transitionEnd(function () {
18205 transitionEnd();
18206 });
18207 } else {
18208 transitionEnd();
18209 }
18210
18211 if ($cardEl[0].detachEventHandlers) {
18212 $cardEl[0].detachEventHandlers();
18213 delete $cardEl[0].detachEventHandlers;
18214 }
18215 },
18216 toggle: function toggle(cardEl, animate) {
18217 if ( cardEl === void 0 ) cardEl = '.card-expandable';
18218
18219 var app = this;
18220 var $cardEl = $(cardEl).eq(0);
18221 if (!$cardEl.length) { return; }
18222 if ($cardEl.hasClass('card-opened')) {
18223 app.card.close($cardEl, animate);
18224 } else {
18225 app.card.open($cardEl, animate);
18226 }
18227 },
18228 };
18229
18230 var Card = {
18231 name: 'card',
18232 params: {
18233 card: {
18234 hideNavbarOnOpen: true,
18235 hideToolbarOnOpen: true,
18236 swipeToClose: true,
18237 closeByBackdropClick: true,
18238 backrop: true,
18239 },
18240 },
18241 create: function create() {
18242 var app = this;
18243 Utils.extend(app, {
18244 card: {
18245 open: CardExpandable.open.bind(app),
18246 close: CardExpandable.close.bind(app),
18247 toggle: CardExpandable.toggle.bind(app),
18248 },
18249 });
18250 },
18251 clicks: {
18252 '.card-close': function closeCard($clickedEl, data) {
18253 var app = this;
18254 app.card.close(data.card);
18255 },
18256 '.card-open': function closeCard($clickedEl, data) {
18257 var app = this;
18258 app.card.open(data.card);
18259 },
18260 '.card-expandable': function toggleExpandableCard($clickedEl, data, e) {
18261 var app = this;
18262 if ($clickedEl.hasClass('card-opened') || $clickedEl.hasClass('card-opening') || $clickedEl.hasClass('card-closing')) { return; }
18263 if ($(e.target).closest('.card-prevent-open').length) { return; }
18264 app.card.open($clickedEl);
18265 },
18266 '.card-backdrop-in': function onBackdropClick() {
18267 var app = this;
18268 var needToClose = false;
18269 if (app.params.card.closeByBackdropClick) { needToClose = true; }
18270 var $openedCardEl = $('.card-opened');
18271 if (!$openedCardEl.length) { return; }
18272 if ($openedCardEl.attr('data-close-on-backdrop-click') === 'true') {
18273 needToClose = true;
18274 } else if ($openedCardEl.attr('data-close-on-backdrop-click') === 'false') {
18275 needToClose = false;
18276 }
18277 if (needToClose) { app.card.close($openedCardEl); }
18278 },
18279 },
18280 };
18281
18282 var Chip = {
18283 name: 'chip',
18284 };
18285
18286 // Form Data
18287 var FormData$1 = {
18288 store: function store(form, data) {
18289 var app = this;
18290 var formId = form;
18291
18292 var $formEl = $(form);
18293 if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
18294 formId = $formEl.attr('id');
18295 }
18296 // Store form data in app.formsData
18297 app.form.data[("form-" + formId)] = data;
18298
18299 // Store form data in local storage also
18300 try {
18301 win.localStorage[("f7form-" + formId)] = JSON.stringify(data);
18302 } catch (e) {
18303 throw e;
18304 }
18305 },
18306 get: function get(form) {
18307 var app = this;
18308 var formId = form;
18309
18310 var $formEl = $(form);
18311 if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
18312 formId = $formEl.attr('id');
18313 }
18314
18315 try {
18316 if (win.localStorage[("f7form-" + formId)]) {
18317 return JSON.parse(win.localStorage[("f7form-" + formId)]);
18318 }
18319 } catch (e) {
18320 throw e;
18321 }
18322 if (app.form.data[("form-" + formId)]) {
18323 return app.form.data[("form-" + formId)];
18324 }
18325 return undefined;
18326 },
18327 remove: function remove(form) {
18328 var app = this;
18329 var formId = form;
18330
18331 var $formEl = $(form);
18332 if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
18333 formId = $formEl.attr('id');
18334 }
18335
18336 // Delete form data from app.formsData
18337 if (app.form.data[("form-" + formId)]) {
18338 app.form.data[("form-" + formId)] = '';
18339 delete app.form.data[("form-" + formId)];
18340 }
18341
18342 // Delete form data from local storage also
18343 try {
18344 if (win.localStorage[("f7form-" + formId)]) {
18345 win.localStorage[("f7form-" + formId)] = '';
18346 win.localStorage.removeItem(("f7form-" + formId));
18347 }
18348 } catch (e) {
18349 throw e;
18350 }
18351 },
18352 };
18353
18354 // Form Storage
18355 var FormStorage = {
18356 init: function init(formEl) {
18357 var app = this;
18358 var $formEl = $(formEl);
18359 var formId = $formEl.attr('id');
18360 if (!formId) { return; }
18361 var initialData = app.form.getFormData(formId);
18362 if (initialData) {
18363 app.form.fillFromData($formEl, initialData);
18364 }
18365 function store() {
18366 var data = app.form.convertToData($formEl);
18367 if (!data) { return; }
18368 app.form.storeFormData(formId, data);
18369 $formEl.trigger('form:storedata', data);
18370 app.emit('formStoreData', $formEl[0], data);
18371 }
18372 $formEl.on('change submit', store);
18373 },
18374 destroy: function destroy(formEl) {
18375 var $formEl = $(formEl);
18376 $formEl.off('change submit');
18377 },
18378 };
18379
18380 // Form To/From Data
18381 function formToData(formEl) {
18382 var app = this;
18383 var $formEl = $(formEl).eq(0);
18384 if ($formEl.length === 0) { return undefined; }
18385
18386 // Form data
18387 var data = {};
18388
18389 // Skip input types
18390 var skipTypes = ['submit', 'image', 'button', 'file'];
18391 var skipNames = [];
18392 $formEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
18393 var $inputEl = $(inputEl);
18394 if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
18395 return;
18396 }
18397 var name = $inputEl.attr('name');
18398 var type = $inputEl.attr('type');
18399 var tag = inputEl.nodeName.toLowerCase();
18400 if (skipTypes.indexOf(type) >= 0) { return; }
18401 if (skipNames.indexOf(name) >= 0 || !name) { return; }
18402 if (tag === 'select' && $inputEl.prop('multiple')) {
18403 skipNames.push(name);
18404 data[name] = [];
18405 $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
18406 if (el.selected) { data[name].push(el.value); }
18407 });
18408 } else {
18409 switch (type) {
18410 case 'checkbox':
18411 skipNames.push(name);
18412 data[name] = [];
18413 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
18414 if (el.checked) { data[name].push(el.value); }
18415 });
18416 break;
18417 case 'radio':
18418 skipNames.push(name);
18419 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
18420 if (el.checked) { data[name] = el.value; }
18421 });
18422 break;
18423 default:
18424 data[name] = $inputEl.val();
18425 break;
18426 }
18427 }
18428 });
18429 $formEl.trigger('form:todata', data);
18430 app.emit('formToData', $formEl[0], data);
18431
18432 return data;
18433 }
18434 function formFromData(formEl, formData) {
18435 var app = this;
18436 var $formEl = $(formEl).eq(0);
18437 if (!$formEl.length) { return; }
18438
18439 var data = formData;
18440 var formId = $formEl.attr('id');
18441
18442 if (!data && formId) {
18443 data = app.form.getFormData(formId);
18444 }
18445
18446 if (!data) { return; }
18447
18448 // Skip input types
18449 var skipTypes = ['submit', 'image', 'button', 'file'];
18450 var skipNames = [];
18451
18452 $formEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
18453 var $inputEl = $(inputEl);
18454 if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
18455 return;
18456 }
18457 var name = $inputEl.attr('name');
18458 var type = $inputEl.attr('type');
18459 var tag = inputEl.nodeName.toLowerCase();
18460 if (typeof data[name] === 'undefined' || data[name] === null) { return; }
18461 if (skipTypes.indexOf(type) >= 0) { return; }
18462 if (skipNames.indexOf(name) >= 0 || !name) { return; }
18463 if (tag === 'select' && $inputEl.prop('multiple')) {
18464 skipNames.push(name);
18465 $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
18466 var selectEl = el;
18467 if (data[name].indexOf(el.value) >= 0) { selectEl.selected = true; }
18468 else { selectEl.selected = false; }
18469 });
18470 } else {
18471 switch (type) {
18472 case 'checkbox':
18473 skipNames.push(name);
18474 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
18475 var checkboxEl = el;
18476 if (data[name].indexOf(el.value) >= 0) { checkboxEl.checked = true; }
18477 else { checkboxEl.checked = false; }
18478 });
18479 break;
18480 case 'radio':
18481 skipNames.push(name);
18482 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
18483 var radioEl = el;
18484 if (data[name] === el.value) { radioEl.checked = true; }
18485 else { radioEl.checked = false; }
18486 });
18487 break;
18488 default:
18489 $inputEl.val(data[name]);
18490 break;
18491 }
18492 }
18493 if (tag === 'select' || tag === 'input' || tag === 'textarea') {
18494 $inputEl.trigger('change', 'fromdata');
18495 }
18496 });
18497 $formEl.trigger('form:fromdata', data);
18498 app.emit('formFromData', $formEl[0], data);
18499 }
18500
18501 function initAjaxForm() {
18502 var app = this;
18503
18504 function onSubmitChange(e, fromData) {
18505 var $formEl = $(this);
18506 if (e.type === 'change' && !$formEl.hasClass('form-ajax-submit-onchange')) { return; }
18507 if (e.type === 'submit') { e.preventDefault(); }
18508
18509 if (e.type === 'change' && fromData === 'fromdata') { return; }
18510
18511 var method = ($formEl.attr('method') || 'GET').toUpperCase();
18512 var contentType = $formEl.prop('enctype') || $formEl.attr('enctype');
18513
18514 var url = $formEl.attr('action');
18515 if (!url) { return; }
18516
18517 var data;
18518 if (method === 'POST') {
18519 if (contentType === 'application/x-www-form-urlencoded') {
18520 data = app.form.convertToData($formEl[0]);
18521 } else {
18522 data = new win.FormData($formEl[0]);
18523 }
18524 } else {
18525 data = Utils.serializeObject(app.form.convertToData($formEl[0]));
18526 }
18527
18528 app.request({
18529 method: method,
18530 url: url,
18531 contentType: contentType,
18532 data: data,
18533 beforeSend: function beforeSend(xhr) {
18534 $formEl.trigger('formajax:beforesend', data, xhr);
18535 app.emit('formAjaxBeforeSend', $formEl[0], data, xhr);
18536 },
18537 error: function error(xhr) {
18538 $formEl.trigger('formajax:error', data, xhr);
18539 app.emit('formAjaxError', $formEl[0], data, xhr);
18540 },
18541 complete: function complete(xhr) {
18542 $formEl.trigger('formajax:complete', data, xhr);
18543 app.emit('formAjaxComplete', $formEl[0], data, xhr);
18544 },
18545 success: function success(response, status, xhr) {
18546 $formEl.trigger('formajax:success', data, xhr);
18547 app.emit('formAjaxSuccess', $formEl[0], data, xhr);
18548 },
18549 });
18550 }
18551 $(doc).on('submit change', 'form.form-ajax-submit, form.form-ajax-submit-onchange', onSubmitChange);
18552 }
18553
18554 var Form = {
18555 name: 'form',
18556 create: function create() {
18557 var app = this;
18558 Utils.extend(app, {
18559 form: {
18560 data: {},
18561 storeFormData: FormData$1.store.bind(app),
18562 getFormData: FormData$1.get.bind(app),
18563 removeFormData: FormData$1.remove.bind(app),
18564 convertToData: formToData.bind(app),
18565 fillFromData: formFromData.bind(app),
18566 storage: {
18567 init: FormStorage.init.bind(app),
18568 destroy: FormStorage.destroy.bind(app),
18569 },
18570 },
18571 });
18572 },
18573 on: {
18574 init: function init() {
18575 var app = this;
18576 initAjaxForm.call(app);
18577 },
18578 tabBeforeRemove: function tabBeforeRemove(tabEl) {
18579 var app = this;
18580 $(tabEl).find('.form-store-data').each(function (index, formEl) {
18581 app.form.storage.destroy(formEl);
18582 });
18583 },
18584 tabMounted: function tabMounted(tabEl) {
18585 var app = this;
18586 $(tabEl).find('.form-store-data').each(function (index, formEl) {
18587 app.form.storage.init(formEl);
18588 });
18589 },
18590 pageBeforeRemove: function pageBeforeRemove(page) {
18591 var app = this;
18592 page.$el.find('.form-store-data').each(function (index, formEl) {
18593 app.form.storage.destroy(formEl);
18594 });
18595 },
18596 pageInit: function pageInit(page) {
18597 var app = this;
18598 page.$el.find('.form-store-data').each(function (index, formEl) {
18599 app.form.storage.init(formEl);
18600 });
18601 },
18602 },
18603 };
18604
18605 var Input = {
18606 ignoreTypes: ['checkbox', 'button', 'submit', 'range', 'radio', 'image'],
18607 createTextareaResizableShadow: function createTextareaResizableShadow() {
18608 var $shadowEl = $(doc.createElement('textarea'));
18609 $shadowEl.addClass('textarea-resizable-shadow');
18610 $shadowEl.prop({
18611 disabled: true,
18612 readonly: true,
18613 });
18614 Input.textareaResizableShadow = $shadowEl;
18615 },
18616 textareaResizableShadow: undefined,
18617 resizeTextarea: function resizeTextarea(textareaEl) {
18618 var app = this;
18619 var $textareaEl = $(textareaEl);
18620 if (!Input.textareaResizableShadow) {
18621 Input.createTextareaResizableShadow();
18622 }
18623 var $shadowEl = Input.textareaResizableShadow;
18624 if (!$textareaEl.length) { return; }
18625 if (!$textareaEl.hasClass('resizable')) { return; }
18626 if (Input.textareaResizableShadow.parents().length === 0) {
18627 app.root.append($shadowEl);
18628 }
18629
18630 var styles = win.getComputedStyle($textareaEl[0]);
18631 ('padding-top padding-bottom padding-left padding-right margin-left margin-right margin-top margin-bottom width font-size font-family font-style font-weight line-height font-variant text-transform letter-spacing border box-sizing display').split(' ').forEach(function (style) {
18632 var styleValue = styles[style];
18633 if (('font-size line-height letter-spacing width').split(' ').indexOf(style) >= 0) {
18634 styleValue = styleValue.replace(',', '.');
18635 }
18636 $shadowEl.css(style, styleValue);
18637 });
18638 var currentHeight = $textareaEl[0].clientHeight;
18639
18640 $shadowEl.val('');
18641 var initialHeight = $shadowEl[0].scrollHeight;
18642
18643 $shadowEl.val($textareaEl.val());
18644 $shadowEl.css('height', 0);
18645 var scrollHeight = $shadowEl[0].scrollHeight;
18646
18647 if (currentHeight !== scrollHeight) {
18648 if (scrollHeight > initialHeight) {
18649 $textareaEl.css('height', (scrollHeight + "px"));
18650 $textareaEl.trigger('textarea:resize', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
18651 } else if (scrollHeight < currentHeight) {
18652 $textareaEl.css('height', '');
18653 $textareaEl.trigger('textarea:resize', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
18654 }
18655 }
18656 },
18657 validate: function validate(inputEl) {
18658 var $inputEl = $(inputEl);
18659 if (!$inputEl.length) { return; }
18660 var $itemInputEl = $inputEl.parents('.item-input');
18661 var $inputWrapEl = $inputEl.parents('.input');
18662 var validity = $inputEl[0].validity;
18663 var validationMessage = $inputEl.dataset().errorMessage || $inputEl[0].validationMessage || '';
18664 if (!validity) { return; }
18665 if (!validity.valid) {
18666 var $errorEl = $inputEl.nextAll('.item-input-error-message, .input-error-message');
18667 if (validationMessage) {
18668 if ($errorEl.length === 0) {
18669 $errorEl = $(("<div class=\"" + ($inputWrapEl.length ? 'input-error-message' : 'item-input-error-message') + "\"></div>"));
18670 $errorEl.insertAfter($inputEl);
18671 }
18672 $errorEl.text(validationMessage);
18673 }
18674 if ($errorEl.length > 0) {
18675 $itemInputEl.addClass('item-input-with-error-message');
18676 $inputWrapEl.addClass('input-with-eror-message');
18677 }
18678 $itemInputEl.addClass('item-input-invalid');
18679 $inputWrapEl.addClass('input-invalid');
18680 $inputEl.addClass('input-invalid');
18681 } else {
18682 $itemInputEl.removeClass('item-input-invalid item-input-with-error-message');
18683 $inputWrapEl.removeClass('input-invalid input-with-error-message');
18684 $inputEl.removeClass('input-invalid');
18685 }
18686 },
18687 validateInputs: function validateInputs(el) {
18688 var app = this;
18689 $(el).find('input, textarea, select').each(function (index, inputEl) {
18690 app.input.validate(inputEl);
18691 });
18692 },
18693 focus: function focus(inputEl) {
18694 var $inputEl = $(inputEl);
18695 var type = $inputEl.attr('type');
18696 if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
18697 $inputEl.parents('.item-input').addClass('item-input-focused');
18698 $inputEl.parents('.input').addClass('input-focused');
18699 $inputEl.addClass('input-focused');
18700 },
18701 blur: function blur(inputEl) {
18702 var $inputEl = $(inputEl);
18703 $inputEl.parents('.item-input').removeClass('item-input-focused');
18704 $inputEl.parents('.input').removeClass('input-focused');
18705 $inputEl.removeClass('input-focused');
18706 },
18707 checkEmptyState: function checkEmptyState(inputEl) {
18708 var $inputEl = $(inputEl);
18709 if (!$inputEl.is('input, select, textarea')) {
18710 $inputEl = $inputEl.find('input, select, textarea').eq(0);
18711 }
18712 if (!$inputEl.length) { return; }
18713
18714 var value = $inputEl.val();
18715 var $itemInputEl = $inputEl.parents('.item-input');
18716 var $inputWrapEl = $inputEl.parents('.input');
18717 if ((value && (typeof value === 'string' && value.trim() !== '')) || (Array.isArray(value) && value.length > 0)) {
18718 $itemInputEl.addClass('item-input-with-value');
18719 $inputWrapEl.addClass('input-with-value');
18720 $inputEl.addClass('input-with-value');
18721 $inputEl.trigger('input:notempty');
18722 } else {
18723 $itemInputEl.removeClass('item-input-with-value');
18724 $inputWrapEl.removeClass('input-with-value');
18725 $inputEl.removeClass('input-with-value');
18726 $inputEl.trigger('input:empty');
18727 }
18728 },
18729 scrollIntoView: function scrollIntoView(inputEl, duration, centered, force) {
18730 if ( duration === void 0 ) duration = 0;
18731
18732 var $inputEl = $(inputEl);
18733 var $scrollableEl = $inputEl.parents('.page-content, .panel').eq(0);
18734 if (!$scrollableEl.length) {
18735 return false;
18736 }
18737 var contentHeight = $scrollableEl[0].offsetHeight;
18738 var contentScrollTop = $scrollableEl[0].scrollTop;
18739 var contentPaddingTop = parseInt($scrollableEl.css('padding-top'), 10);
18740 var contentPaddingBottom = parseInt($scrollableEl.css('padding-bottom'), 10);
18741 var contentOffsetTop = $scrollableEl.offset().top - contentScrollTop;
18742
18743 var inputOffsetTop = $inputEl.offset().top - contentOffsetTop;
18744 var inputHeight = $inputEl[0].offsetHeight;
18745
18746 var min = (inputOffsetTop + contentScrollTop) - contentPaddingTop;
18747 var max = ((inputOffsetTop + contentScrollTop) - contentHeight) + contentPaddingBottom + inputHeight;
18748 var centeredPosition = min + ((max - min) / 2);
18749
18750 if (contentScrollTop > min) {
18751 $scrollableEl.scrollTop(centered ? centeredPosition : min, duration);
18752 return true;
18753 }
18754 if (contentScrollTop < max) {
18755 $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
18756 return true;
18757 }
18758 if (force) {
18759 $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
18760 }
18761 return false;
18762 },
18763 init: function init() {
18764 var app = this;
18765 Input.createTextareaResizableShadow();
18766 function onFocus() {
18767 var inputEl = this;
18768 if (app.params.input.scrollIntoViewOnFocus) {
18769 if (Device.android) {
18770 $(win).once('resize', function () {
18771 if (doc && doc.activeElement === inputEl) {
18772 app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
18773 }
18774 });
18775 } else {
18776 app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
18777 }
18778 }
18779 app.input.focus(inputEl);
18780 }
18781 function onBlur() {
18782 var $inputEl = $(this);
18783 var tag = $inputEl[0].nodeName.toLowerCase();
18784 app.input.blur($inputEl);
18785 if ($inputEl.dataset().validate || $inputEl.attr('validate') !== null || $inputEl.attr('data-validate-on-blur') !== null) {
18786 app.input.validate($inputEl);
18787 }
18788 // Resize textarea
18789 if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
18790 if (Input.textareaResizableShadow) { Input.textareaResizableShadow.remove(); }
18791 }
18792 }
18793 function onChange() {
18794 var $inputEl = $(this);
18795 var type = $inputEl.attr('type');
18796 var tag = $inputEl[0].nodeName.toLowerCase();
18797 if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
18798
18799 // Check Empty State
18800 app.input.checkEmptyState($inputEl);
18801
18802 // Check validation
18803 if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
18804 app.input.validate($inputEl);
18805 }
18806
18807 // Resize textarea
18808 if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
18809 app.input.resizeTextarea($inputEl);
18810 }
18811 }
18812 function onInvalid(e) {
18813 var $inputEl = $(this);
18814 if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
18815 e.preventDefault();
18816 app.input.validate($inputEl);
18817 }
18818 }
18819 function clearInput() {
18820 var $clicked = $(this);
18821 var $inputEl = $clicked.siblings('input, textarea').eq(0);
18822 var previousValue = $inputEl.val();
18823 $inputEl
18824 .val('')
18825 .trigger('input change')
18826 .focus()
18827 .trigger('input:clear', previousValue);
18828 }
18829 $(doc).on('click', '.input-clear-button', clearInput);
18830 $(doc).on('change input', 'input, textarea, select', onChange, true);
18831 $(doc).on('focus', 'input, textarea, select', onFocus, true);
18832 $(doc).on('blur', 'input, textarea, select', onBlur, true);
18833 $(doc).on('invalid', 'input, textarea, select', onInvalid, true);
18834 },
18835 };
18836
18837 var Input$1 = {
18838 name: 'input',
18839 params: {
18840 input: {
18841 scrollIntoViewOnFocus: Device.android,
18842 scrollIntoViewCentered: false,
18843 scrollIntoViewDuration: 0,
18844 scrollIntoViewAlways: false,
18845 },
18846 },
18847 create: function create() {
18848 var app = this;
18849 Utils.extend(app, {
18850 input: {
18851 scrollIntoView: Input.scrollIntoView.bind(app),
18852 focus: Input.focus.bind(app),
18853 blur: Input.blur.bind(app),
18854 validate: Input.validate.bind(app),
18855 validateInputs: Input.validateInputs.bind(app),
18856 checkEmptyState: Input.checkEmptyState.bind(app),
18857 resizeTextarea: Input.resizeTextarea.bind(app),
18858 init: Input.init.bind(app),
18859 },
18860 });
18861 },
18862 on: {
18863 init: function init() {
18864 var app = this;
18865 app.input.init();
18866 },
18867 tabMounted: function tabMounted(tabEl) {
18868 var app = this;
18869 var $tabEl = $(tabEl);
18870 $tabEl.find('.item-input, .input').each(function (itemInputIndex, itemInputEl) {
18871 var $itemInputEl = $(itemInputEl);
18872 $itemInputEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
18873 var $inputEl = $(inputEl);
18874 if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) { return; }
18875 app.input.checkEmptyState($inputEl);
18876 });
18877 });
18878 $tabEl.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
18879 app.input.resizeTextarea(textareaEl);
18880 });
18881 },
18882 pageInit: function pageInit(page) {
18883 var app = this;
18884 var $pageEl = page.$el;
18885 $pageEl.find('.item-input, .input').each(function (itemInputIndex, itemInputEl) {
18886 var $itemInputEl = $(itemInputEl);
18887 $itemInputEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
18888 var $inputEl = $(inputEl);
18889 if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) { return; }
18890 app.input.checkEmptyState($inputEl);
18891 });
18892 });
18893 $pageEl.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
18894 app.input.resizeTextarea(textareaEl);
18895 });
18896 },
18897 },
18898 };
18899
18900 var Checkbox = {
18901 name: 'checkbox',
18902 };
18903
18904 var Radio = {
18905 name: 'radio',
18906 };
18907
18908 var Toggle = /*@__PURE__*/(function (Framework7Class$$1) {
18909 function Toggle(app, params) {
18910 if ( params === void 0 ) params = {};
18911
18912 Framework7Class$$1.call(this, params, [app]);
18913 var toggle = this;
18914
18915 var defaults = {};
18916
18917 // Extend defaults with modules params
18918 toggle.useModulesParams(defaults);
18919
18920 toggle.params = Utils.extend(defaults, params);
18921
18922 var el = toggle.params.el;
18923 if (!el) { return toggle; }
18924
18925 var $el = $(el);
18926 if ($el.length === 0) { return toggle; }
18927
18928 if ($el[0].f7Toggle) { return $el[0].f7Toggle; }
18929
18930 var $inputEl = $el.children('input[type="checkbox"]');
18931
18932 Utils.extend(toggle, {
18933 app: app,
18934 $el: $el,
18935 el: $el[0],
18936 $inputEl: $inputEl,
18937 inputEl: $inputEl[0],
18938 disabled: $el.hasClass('disabled') || $inputEl.hasClass('disabled') || $inputEl.attr('disabled') || $inputEl[0].disabled,
18939 });
18940
18941 Object.defineProperty(toggle, 'checked', {
18942 enumerable: true,
18943 configurable: true,
18944 set: function set(checked) {
18945 if (!toggle || typeof toggle.$inputEl === 'undefined') { return; }
18946 if (toggle.checked === checked) { return; }
18947 $inputEl[0].checked = checked;
18948 toggle.$inputEl.trigger('change');
18949 },
18950 get: function get() {
18951 return $inputEl[0].checked;
18952 },
18953 });
18954
18955 $el[0].f7Toggle = toggle;
18956
18957 var isTouched;
18958 var touchesStart = {};
18959 var isScrolling;
18960 var touchesDiff;
18961 var toggleWidth;
18962 var touchStartTime;
18963 var touchStartChecked;
18964 function handleTouchStart(e) {
18965 if (isTouched || toggle.disabled) { return; }
18966 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
18967 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
18968 touchesDiff = 0;
18969
18970 isTouched = true;
18971 isScrolling = undefined;
18972 touchStartTime = Utils.now();
18973 touchStartChecked = toggle.checked;
18974
18975 toggleWidth = $el[0].offsetWidth;
18976 Utils.nextTick(function () {
18977 if (isTouched) {
18978 $el.addClass('toggle-active-state');
18979 }
18980 });
18981 }
18982 function handleTouchMove(e) {
18983 if (!isTouched || toggle.disabled) { return; }
18984 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
18985 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
18986 var inverter = app.rtl ? -1 : 1;
18987
18988 if (typeof isScrolling === 'undefined') {
18989 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
18990 }
18991 if (isScrolling) {
18992 isTouched = false;
18993 return;
18994 }
18995 e.preventDefault();
18996
18997 touchesDiff = pageX - touchesStart.x;
18998
18999
19000 var changed;
19001 if (touchesDiff * inverter < 0 && Math.abs(touchesDiff) > toggleWidth / 3 && touchStartChecked) {
19002 changed = true;
19003 }
19004 if (touchesDiff * inverter > 0 && Math.abs(touchesDiff) > toggleWidth / 3 && !touchStartChecked) {
19005 changed = true;
19006 }
19007 if (changed) {
19008 touchesStart.x = pageX;
19009 toggle.checked = !touchStartChecked;
19010 touchStartChecked = !touchStartChecked;
19011 }
19012 }
19013 function handleTouchEnd() {
19014 if (!isTouched || toggle.disabled) {
19015 if (isScrolling) { $el.removeClass('toggle-active-state'); }
19016 isTouched = false;
19017 return;
19018 }
19019 var inverter = app.rtl ? -1 : 1;
19020 isTouched = false;
19021
19022 $el.removeClass('toggle-active-state');
19023
19024 var changed;
19025 if ((Utils.now() - touchStartTime) < 300) {
19026 if (touchesDiff * inverter < 0 && touchStartChecked) {
19027 changed = true;
19028 }
19029 if (touchesDiff * inverter > 0 && !touchStartChecked) {
19030 changed = true;
19031 }
19032 if (changed) {
19033 toggle.checked = !touchStartChecked;
19034 }
19035 }
19036 }
19037 function handleInputChange() {
19038 toggle.$el.trigger('toggle:change', toggle);
19039 toggle.emit('local::change toggleChange', toggle);
19040 }
19041 toggle.attachEvents = function attachEvents() {
19042 if (Support.touch) {
19043 var passive = Support.passiveListener ? { passive: true } : false;
19044 $el.on(app.touchEvents.start, handleTouchStart, passive);
19045 app.on('touchmove', handleTouchMove);
19046 app.on('touchend:passive', handleTouchEnd);
19047 }
19048 toggle.$inputEl.on('change', handleInputChange);
19049 };
19050 toggle.detachEvents = function detachEvents() {
19051 if (Support.touch) {
19052 var passive = Support.passiveListener ? { passive: true } : false;
19053 $el.off(app.touchEvents.start, handleTouchStart, passive);
19054 app.off('touchmove', handleTouchMove);
19055 app.off('touchend:passive', handleTouchEnd);
19056 }
19057 toggle.$inputEl.off('change', handleInputChange);
19058 };
19059
19060 // Install Modules
19061 toggle.useModules();
19062
19063 // Init
19064 toggle.init();
19065 }
19066
19067 if ( Framework7Class$$1 ) Toggle.__proto__ = Framework7Class$$1;
19068 Toggle.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
19069 Toggle.prototype.constructor = Toggle;
19070
19071 Toggle.prototype.toggle = function toggle () {
19072 var toggle = this;
19073 toggle.checked = !toggle.checked;
19074 };
19075
19076 Toggle.prototype.init = function init () {
19077 var toggle = this;
19078 toggle.attachEvents();
19079 };
19080
19081 Toggle.prototype.destroy = function destroy () {
19082 var toggle = this;
19083 toggle.$el.trigger('toggle:beforedestroy', toggle);
19084 toggle.emit('local::beforeDestroy toggleBeforeDestroy', toggle);
19085 delete toggle.$el[0].f7Toggle;
19086 toggle.detachEvents();
19087 Utils.deleteProps(toggle);
19088 toggle = null;
19089 };
19090
19091 return Toggle;
19092 }(Framework7Class));
19093
19094 var Toggle$1 = {
19095 name: 'toggle',
19096 create: function create() {
19097 var app = this;
19098 app.toggle = ConstructorMethods({
19099 defaultSelector: '.toggle',
19100 constructor: Toggle,
19101 app: app,
19102 domProp: 'f7Toggle',
19103 });
19104 },
19105 static: {
19106 Toggle: Toggle,
19107 },
19108 on: {
19109 tabMounted: function tabMounted(tabEl) {
19110 var app = this;
19111 $(tabEl).find('.toggle-init').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
19112 },
19113 tabBeforeRemove: function tabBeforeRemove(tabEl) {
19114 $(tabEl).find('.toggle-init').each(function (index, toggleEl) {
19115 if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
19116 });
19117 },
19118 pageInit: function pageInit(page) {
19119 var app = this;
19120 page.$el.find('.toggle-init').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
19121 },
19122 pageBeforeRemove: function pageBeforeRemove(page) {
19123 page.$el.find('.toggle-init').each(function (index, toggleEl) {
19124 if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
19125 });
19126 },
19127 },
19128 vnode: {
19129 'toggle-init': {
19130 insert: function insert(vnode) {
19131 var app = this;
19132 var toggleEl = vnode.elm;
19133 app.toggle.create({ el: toggleEl });
19134 },
19135 destroy: function destroy(vnode) {
19136 var toggleEl = vnode.elm;
19137 if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
19138 },
19139 },
19140 },
19141 };
19142
19143 var Range = /*@__PURE__*/(function (Framework7Class$$1) {
19144 function Range(app, params) {
19145 Framework7Class$$1.call(this, params, [app]);
19146
19147 var range = this;
19148
19149 var defaults = {
19150 el: null,
19151 inputEl: null,
19152 dual: false,
19153 step: 1,
19154 label: false,
19155 min: 0,
19156 max: 100,
19157 value: 0,
19158 draggableBar: true,
19159 vertical: false,
19160 verticalReversed: false,
19161 formatLabel: null,
19162 scale: false,
19163 scaleSteps: 5,
19164 scaleSubSteps: 0,
19165 formatScaleLabel: null,
19166 };
19167
19168 // Extend defaults with modules params
19169 range.useModulesParams(defaults);
19170
19171 range.params = Utils.extend(defaults, params);
19172
19173 var el = range.params.el;
19174 if (!el) { return range; }
19175
19176 var $el = $(el);
19177 if ($el.length === 0) { return range; }
19178
19179 if ($el[0].f7Range) { return $el[0].f7Range; }
19180
19181 var dataset = $el.dataset();
19182
19183 ('step min max value scaleSteps scaleSubSteps').split(' ').forEach(function (paramName) {
19184 if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
19185 range.params[paramName] = parseFloat(dataset[paramName]);
19186 }
19187 });
19188 ('dual label vertical verticalReversed scale').split(' ').forEach(function (paramName) {
19189 if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
19190 range.params[paramName] = dataset[paramName];
19191 }
19192 });
19193
19194 if (!range.params.value) {
19195 if (typeof dataset.value !== 'undefined') { range.params.value = dataset.value; }
19196 if (typeof dataset.valueLeft !== 'undefined' && typeof dataset.valueRight !== 'undefined') {
19197 range.params.value = [parseFloat(dataset.valueLeft), parseFloat(dataset.valueRight)];
19198 }
19199 }
19200
19201 var $inputEl;
19202 if (!range.params.dual) {
19203 if (range.params.inputEl) {
19204 $inputEl = $(range.params.inputEl);
19205 } else if ($el.find('input[type="range"]').length) {
19206 $inputEl = $el.find('input[type="range"]').eq(0);
19207 }
19208 }
19209
19210 var ref = range.params;
19211 var dual = ref.dual;
19212 var step = ref.step;
19213 var label = ref.label;
19214 var min = ref.min;
19215 var max = ref.max;
19216 var value = ref.value;
19217 var vertical = ref.vertical;
19218 var verticalReversed = ref.verticalReversed;
19219 var scale = ref.scale;
19220 var scaleSteps = ref.scaleSteps;
19221 var scaleSubSteps = ref.scaleSubSteps;
19222
19223 Utils.extend(range, {
19224 app: app,
19225 $el: $el,
19226 el: $el[0],
19227 $inputEl: $inputEl,
19228 inputEl: $inputEl ? $inputEl[0] : undefined,
19229 dual: dual,
19230 step: step,
19231 label: label,
19232 min: min,
19233 max: max,
19234 value: value,
19235 previousValue: value,
19236 vertical: vertical,
19237 verticalReversed: verticalReversed,
19238 scale: scale,
19239 scaleSteps: scaleSteps,
19240 scaleSubSteps: scaleSubSteps,
19241 });
19242
19243 if ($inputEl) {
19244 ('step min max').split(' ').forEach(function (paramName) {
19245 if (!params[paramName] && $inputEl.attr(paramName)) {
19246 range.params[paramName] = parseFloat($inputEl.attr(paramName));
19247 range[paramName] = parseFloat($inputEl.attr(paramName));
19248 }
19249 });
19250 if (typeof $inputEl.val() !== 'undefined') {
19251 range.params.value = parseFloat($inputEl.val());
19252 range.value = parseFloat($inputEl.val());
19253 }
19254 }
19255
19256 // Dual
19257 if (range.dual) {
19258 $el.addClass('range-slider-dual');
19259 }
19260 if (range.label) {
19261 $el.addClass('range-slider-label');
19262 }
19263
19264 // Vertical
19265 if (range.vertical) {
19266 $el.addClass('range-slider-vertical');
19267 if (range.verticalReversed) {
19268 $el.addClass('range-slider-vertical-reversed');
19269 }
19270 } else {
19271 $el.addClass('range-slider-horizontal');
19272 }
19273
19274 // Check for layout
19275 var $barEl = $('<div class="range-bar"></div>');
19276 var $barActiveEl = $('<div class="range-bar-active"></div>');
19277 $barEl.append($barActiveEl);
19278
19279 // Create Knobs
19280 var knobHTML = "\n <div class=\"range-knob-wrap\">\n <div class=\"range-knob\"></div>\n " + (range.label ? '<div class="range-knob-label"></div>' : '') + "\n </div>\n ";
19281 var knobs = [$(knobHTML)];
19282
19283 if (range.dual) {
19284 knobs.push($(knobHTML));
19285 }
19286
19287 $el.append($barEl);
19288 knobs.forEach(function ($knobEl) {
19289 $el.append($knobEl);
19290 });
19291
19292 // Labels
19293 var labels = [];
19294 if (range.label) {
19295 labels.push(knobs[0].find('.range-knob-label'));
19296 if (range.dual) {
19297 labels.push(knobs[1].find('.range-knob-label'));
19298 }
19299 }
19300
19301 // Scale
19302 var $scaleEl;
19303 if (range.scale && range.scaleSteps > 1) {
19304 $scaleEl = $(("\n <div class=\"range-scale\">\n " + (range.renderScale()) + "\n </div>\n "));
19305 $el.append($scaleEl);
19306 }
19307
19308 Utils.extend(range, {
19309 knobs: knobs,
19310 labels: labels,
19311 $barEl: $barEl,
19312 $barActiveEl: $barActiveEl,
19313 $scaleEl: $scaleEl,
19314 });
19315
19316 $el[0].f7Range = range;
19317
19318 // Touch Events
19319 var isTouched;
19320 var touchesStart = {};
19321 var isScrolling;
19322 var rangeOffset;
19323 var rangeOffsetLeft;
19324 var rangeOffsetTop;
19325 var $touchedKnobEl;
19326 var dualValueIndex;
19327 var valueChangedByTouch;
19328 function onTouchChange() {
19329 valueChangedByTouch = true;
19330 }
19331 function handleTouchStart(e) {
19332 if (isTouched) { return; }
19333 if (!range.params.draggableBar) {
19334 if ($(e.target).closest('.range-knob').length === 0) {
19335 return;
19336 }
19337 }
19338 valueChangedByTouch = false;
19339 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
19340 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
19341
19342 isTouched = true;
19343 isScrolling = undefined;
19344 rangeOffset = $el.offset();
19345 rangeOffsetLeft = rangeOffset.left;
19346 rangeOffsetTop = rangeOffset.top;
19347
19348 var progress;
19349 if (range.vertical) {
19350 progress = (touchesStart.y - rangeOffsetTop) / range.rangeHeight;
19351 if (!range.verticalReversed) { progress = 1 - progress; }
19352 } else if (range.app.rtl) {
19353 progress = ((rangeOffsetLeft + range.rangeWidth) - touchesStart.x) / range.rangeWidth;
19354 } else {
19355 progress = (touchesStart.x - rangeOffsetLeft) / range.rangeWidth;
19356 }
19357
19358 var newValue = (progress * (range.max - range.min)) + range.min;
19359 if (range.dual) {
19360 if (Math.abs(range.value[0] - newValue) < Math.abs(range.value[1] - newValue)) {
19361 dualValueIndex = 0;
19362 $touchedKnobEl = range.knobs[0];
19363 newValue = [newValue, range.value[1]];
19364 } else {
19365 dualValueIndex = 1;
19366 $touchedKnobEl = range.knobs[1];
19367 newValue = [range.value[0], newValue];
19368 }
19369 } else {
19370 $touchedKnobEl = range.knobs[0];
19371 newValue = (progress * (range.max - range.min)) + range.min;
19372 }
19373 Utils.nextTick(function () {
19374 if (isTouched) { $touchedKnobEl.addClass('range-knob-active-state'); }
19375 }, 70);
19376 range.on('change', onTouchChange);
19377 range.setValue(newValue, true);
19378 }
19379 function handleTouchMove(e) {
19380 if (!isTouched) { return; }
19381 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
19382 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
19383
19384 if (typeof isScrolling === 'undefined') {
19385 if (range.vertical) {
19386 isScrolling = !(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
19387 } else {
19388 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
19389 }
19390 }
19391 if (isScrolling) {
19392 isTouched = false;
19393 return;
19394 }
19395 e.preventDefault();
19396
19397 var progress;
19398 if (range.vertical) {
19399 progress = (pageY - rangeOffsetTop) / range.rangeHeight;
19400 if (!range.verticalReversed) { progress = 1 - progress; }
19401 } else if (range.app.rtl) {
19402 progress = ((rangeOffsetLeft + range.rangeWidth) - pageX) / range.rangeWidth;
19403 } else {
19404 progress = (pageX - rangeOffsetLeft) / range.rangeWidth;
19405 }
19406
19407 var newValue = (progress * (range.max - range.min)) + range.min;
19408 if (range.dual) {
19409 var leftValue;
19410 var rightValue;
19411 if (dualValueIndex === 0) {
19412 leftValue = newValue;
19413 rightValue = range.value[1];
19414 if (leftValue > rightValue) {
19415 rightValue = leftValue;
19416 }
19417 } else {
19418 leftValue = range.value[0];
19419 rightValue = newValue;
19420 if (rightValue < leftValue) {
19421 leftValue = rightValue;
19422 }
19423 }
19424 newValue = [leftValue, rightValue];
19425 }
19426 range.setValue(newValue, true);
19427 }
19428 function handleTouchEnd() {
19429 if (!isTouched) {
19430 if (isScrolling) { $touchedKnobEl.removeClass('range-knob-active-state'); }
19431 isTouched = false;
19432 return;
19433 }
19434 range.off('change', onTouchChange);
19435 isTouched = false;
19436 $touchedKnobEl.removeClass('range-knob-active-state');
19437 if (valueChangedByTouch && range.$inputEl && !range.dual) {
19438 range.$inputEl.trigger('change');
19439 }
19440 valueChangedByTouch = false;
19441 if (typeof range.previousValue !== 'undefined') {
19442 if (
19443 (
19444 range.dual
19445 && (
19446 range.previousValue[0] !== range.value[0]
19447 || range.previousValue[1] !== range.value[1]
19448 )
19449 )
19450 || (
19451 !range.dual
19452 && range.previousValue !== range.value
19453 )
19454 ) {
19455 range.$el.trigger('range:changed', range, range.value);
19456 range.emit('local::changed rangeChanged', range, range.value);
19457 }
19458 }
19459 }
19460
19461 function handleResize() {
19462 range.calcSize();
19463 range.layout();
19464 }
19465 var parentModals;
19466 var parentPanel;
19467 var parentPage;
19468 range.attachEvents = function attachEvents() {
19469 var passive = Support.passiveListener ? { passive: true } : false;
19470 range.$el.on(app.touchEvents.start, handleTouchStart, passive);
19471 app.on('touchmove', handleTouchMove);
19472 app.on('touchend:passive', handleTouchEnd);
19473 app.on('tabShow', handleResize);
19474 app.on('resize', handleResize);
19475 parentModals = range.$el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast');
19476 parentModals.on('modal:open', handleResize);
19477 parentPanel = range.$el.parents('.panel');
19478 parentPanel.on('panel:open', handleResize);
19479 parentPage = range.$el.parents('.page').eq(0);
19480 parentPage.on('page:reinit', handleResize);
19481 };
19482 range.detachEvents = function detachEvents() {
19483 var passive = Support.passiveListener ? { passive: true } : false;
19484 range.$el.off(app.touchEvents.start, handleTouchStart, passive);
19485 app.off('touchmove', handleTouchMove);
19486 app.off('touchend:passive', handleTouchEnd);
19487 app.off('tabShow', handleResize);
19488 app.off('resize', handleResize);
19489 if (parentModals) {
19490 parentModals.off('modal:open', handleResize);
19491 }
19492 if (parentPanel) {
19493 parentPanel.off('panel:open', handleResize);
19494 }
19495 if (parentPage) {
19496 parentPage.off('page:reinit', handleResize);
19497 }
19498 parentModals = null;
19499 parentPanel = null;
19500 parentPage = null;
19501 };
19502
19503 // Install Modules
19504 range.useModules();
19505
19506 // Init
19507 range.init();
19508
19509 return range;
19510 }
19511
19512 if ( Framework7Class$$1 ) Range.__proto__ = Framework7Class$$1;
19513 Range.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
19514 Range.prototype.constructor = Range;
19515
19516 Range.prototype.calcSize = function calcSize () {
19517 var range = this;
19518 if (range.vertical) {
19519 var height = range.$el.outerHeight();
19520 if (height === 0) { return; }
19521 range.rangeHeight = height;
19522 range.knobHeight = range.knobs[0].outerHeight();
19523 } else {
19524 var width = range.$el.outerWidth();
19525 if (width === 0) { return; }
19526 range.rangeWidth = width;
19527 range.knobWidth = range.knobs[0].outerWidth();
19528 }
19529 };
19530
19531 Range.prototype.layout = function layout () {
19532 var obj;
19533
19534 var range = this;
19535 var app = range.app;
19536 var knobWidth = range.knobWidth;
19537 var knobHeight = range.knobHeight;
19538 var rangeWidth = range.rangeWidth;
19539 var rangeHeight = range.rangeHeight;
19540 var min = range.min;
19541 var max = range.max;
19542 var knobs = range.knobs;
19543 var $barActiveEl = range.$barActiveEl;
19544 var value = range.value;
19545 var label = range.label;
19546 var labels = range.labels;
19547 var vertical = range.vertical;
19548 var verticalReversed = range.verticalReversed;
19549 var knobSize = vertical ? knobHeight : knobWidth;
19550 var rangeSize = vertical ? rangeHeight : rangeWidth;
19551 // eslint-disable-next-line
19552 var positionProperty = vertical
19553 ? (verticalReversed ? 'top' : 'bottom')
19554 : (app.rtl ? 'right' : 'left');
19555 if (range.dual) {
19556 var progress = [((value[0] - min) / (max - min)), ((value[1] - min) / (max - min))];
19557 $barActiveEl.css(( obj = {}, obj[positionProperty] = ((progress[0] * 100) + "%"), obj[vertical ? 'height' : 'width'] = (((progress[1] - progress[0]) * 100) + "%"), obj ));
19558 knobs.forEach(function ($knobEl, knobIndex) {
19559 var startPos = rangeSize * progress[knobIndex];
19560 if (app.theme === 'ios') {
19561 var realStartPos = (rangeSize * progress[knobIndex]) - (knobSize / 2);
19562 if (realStartPos < 0) { startPos = knobSize / 2; }
19563 if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
19564 }
19565 $knobEl.css(positionProperty, (startPos + "px"));
19566 if (label) { labels[knobIndex].text(range.formatLabel(value[knobIndex], labels[knobIndex][0])); }
19567 });
19568 } else {
19569 var progress$1 = ((value - min) / (max - min));
19570 $barActiveEl.css(vertical ? 'height' : 'width', ((progress$1 * 100) + "%"));
19571
19572 var startPos = rangeSize * progress$1;
19573 if (app.theme === 'ios') {
19574 var realStartPos = (rangeSize * progress$1) - (knobSize / 2);
19575 if (realStartPos < 0) { startPos = knobSize / 2; }
19576 if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
19577 }
19578 knobs[0].css(positionProperty, (startPos + "px"));
19579 if (label) { labels[0].text(range.formatLabel(value, labels[0][0])); }
19580 }
19581 if ((range.dual && value.indexOf(min) >= 0) || (!range.dual && value === min)) {
19582 range.$el.addClass('range-slider-min');
19583 } else {
19584 range.$el.removeClass('range-slider-min');
19585 }
19586 if ((range.dual && value.indexOf(max) >= 0) || (!range.dual && value === max)) {
19587 range.$el.addClass('range-slider-max');
19588 } else {
19589 range.$el.removeClass('range-slider-max');
19590 }
19591 };
19592
19593 Range.prototype.setValue = function setValue (newValue, byTouchMove) {
19594 var range = this;
19595 var step = range.step;
19596 var min = range.min;
19597 var max = range.max;
19598 var valueChanged;
19599 var oldValue;
19600 if (range.dual) {
19601 oldValue = [range.value[0], range.value[1]];
19602 var newValues = newValue;
19603 if (!Array.isArray(newValues)) { newValues = [newValue, newValue]; }
19604 if (newValue[0] > newValue[1]) {
19605 newValues = [newValues[0], newValues[0]];
19606 }
19607 newValues = newValues.map(function (value) { return Math.max(Math.min(Math.round(value / step) * step, max), min); });
19608 if (newValues[0] === range.value[0] && newValues[1] === range.value[1]) {
19609 return range;
19610 }
19611 newValues.forEach(function (value, valueIndex) {
19612 range.value[valueIndex] = value;
19613 });
19614 valueChanged = oldValue[0] !== newValues[0] || oldValue[1] !== newValues[1];
19615 range.layout();
19616 } else {
19617 oldValue = range.value;
19618 var value = Math.max(Math.min(Math.round(newValue / step) * step, max), min);
19619 range.value = value;
19620 range.layout();
19621 valueChanged = oldValue !== value;
19622 }
19623
19624 if (valueChanged) {
19625 range.previousValue = oldValue;
19626 }
19627 // Events
19628 if (!valueChanged) { return range; }
19629 range.$el.trigger('range:change', range, range.value);
19630 if (range.$inputEl && !range.dual) {
19631 range.$inputEl.val(range.value);
19632 if (!byTouchMove) {
19633 range.$inputEl.trigger('input change');
19634 } else {
19635 range.$inputEl.trigger('input');
19636 }
19637 }
19638 if (!byTouchMove) {
19639 range.$el.trigger('range:changed', range, range.value);
19640 range.emit('local::changed rangeChanged', range, range.value);
19641 }
19642 range.emit('local::change rangeChange', range, range.value);
19643 return range;
19644 };
19645
19646 Range.prototype.getValue = function getValue () {
19647 return this.value;
19648 };
19649
19650 Range.prototype.formatLabel = function formatLabel (value, labelEl) {
19651 var range = this;
19652 if (range.params.formatLabel) { return range.params.formatLabel.call(range, value, labelEl); }
19653 return value;
19654 };
19655
19656 Range.prototype.formatScaleLabel = function formatScaleLabel (value) {
19657 var range = this;
19658 if (range.params.formatScaleLabel) { return range.params.formatScaleLabel.call(range, value); }
19659 return value;
19660 };
19661
19662 Range.prototype.renderScale = function renderScale () {
19663 var range = this;
19664 var app = range.app;
19665 var verticalReversed = range.verticalReversed;
19666 var vertical = range.vertical;
19667
19668 // eslint-disable-next-line
19669 var positionProperty = vertical
19670 ? (verticalReversed ? 'top' : 'bottom')
19671 : (app.rtl ? 'right' : 'left');
19672
19673 var html = '';
19674
19675 Array
19676 .from({ length: range.scaleSteps + 1 })
19677 .forEach(function (scaleEl, index) {
19678 var scaleStepValue = (range.max - range.min) / range.scaleSteps;
19679 var scaleValue = range.min + scaleStepValue * index;
19680 var progress = ((scaleValue - range.min) / (range.max - range.min));
19681 html += "<div class=\"range-scale-step\" style=\"" + positionProperty + ": " + (progress * 100) + "%\">" + (range.formatScaleLabel(scaleValue)) + "</div>";
19682
19683 if (range.scaleSubSteps && range.scaleSubSteps > 1 && index < range.scaleSteps) {
19684 Array
19685 .from({ length: range.scaleSubSteps - 1 })
19686 .forEach(function (subStepEl, subIndex) {
19687 var subStep = scaleStepValue / range.scaleSubSteps;
19688 var scaleSubValue = scaleValue + subStep * (subIndex + 1);
19689 var subProgress = ((scaleSubValue - range.min) / (range.max - range.min));
19690 html += "<div class=\"range-scale-step range-scale-substep\" style=\"" + positionProperty + ": " + (subProgress * 100) + "%\"></div>";
19691 });
19692 }
19693 });
19694
19695 return html;
19696 };
19697
19698 Range.prototype.updateScale = function updateScale () {
19699 var range = this;
19700 if (!range.scale || range.scaleSteps < 2) {
19701 if (range.$scaleEl) { range.$scaleEl.remove(); }
19702 delete range.$scaleEl;
19703 return;
19704 }
19705 if (!range.$scaleEl) {
19706 range.$scaleEl = $('<div class="range-scale"></div>');
19707 range.$el.append(range.$scaleEl);
19708 }
19709
19710 range.$scaleEl.html(range.renderScale());
19711 };
19712
19713 Range.prototype.init = function init () {
19714 var range = this;
19715 range.calcSize();
19716 range.layout();
19717 range.attachEvents();
19718 return range;
19719 };
19720
19721 Range.prototype.destroy = function destroy () {
19722 var range = this;
19723 range.$el.trigger('range:beforedestroy', range);
19724 range.emit('local::beforeDestroy rangeBeforeDestroy', range);
19725 delete range.$el[0].f7Range;
19726 range.detachEvents();
19727 Utils.deleteProps(range);
19728 range = null;
19729 };
19730
19731 return Range;
19732 }(Framework7Class));
19733
19734 var Range$1 = {
19735 name: 'range',
19736 create: function create() {
19737 var app = this;
19738 app.range = Utils.extend(
19739 ConstructorMethods({
19740 defaultSelector: '.range-slider',
19741 constructor: Range,
19742 app: app,
19743 domProp: 'f7Range',
19744 }),
19745 {
19746 getValue: function getValue(el) {
19747 if ( el === void 0 ) el = '.range-slider';
19748
19749 var range = app.range.get(el);
19750 if (range) { return range.getValue(); }
19751 return undefined;
19752 },
19753 setValue: function setValue(el, value) {
19754 if ( el === void 0 ) el = '.range-slider';
19755
19756 var range = app.range.get(el);
19757 if (range) { return range.setValue(value); }
19758 return undefined;
19759 },
19760 }
19761 );
19762 },
19763 static: {
19764 Range: Range,
19765 },
19766 on: {
19767 tabMounted: function tabMounted(tabEl) {
19768 var app = this;
19769 $(tabEl).find('.range-slider-init').each(function (index, rangeEl) { return new Range(app, {
19770 el: rangeEl,
19771 }); });
19772 },
19773 tabBeforeRemove: function tabBeforeRemove(tabEl) {
19774 $(tabEl).find('.range-slider-init').each(function (index, rangeEl) {
19775 if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
19776 });
19777 },
19778 pageInit: function pageInit(page) {
19779 var app = this;
19780 page.$el.find('.range-slider-init').each(function (index, rangeEl) { return new Range(app, {
19781 el: rangeEl,
19782 }); });
19783 },
19784 pageBeforeRemove: function pageBeforeRemove(page) {
19785 page.$el.find('.range-slider-init').each(function (index, rangeEl) {
19786 if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
19787 });
19788 },
19789 },
19790 vnode: {
19791 'range-slider-init': {
19792 insert: function insert(vnode) {
19793 var rangeEl = vnode.elm;
19794 var app = this;
19795 app.range.create({ el: rangeEl });
19796 },
19797 destroy: function destroy(vnode) {
19798 var rangeEl = vnode.elm;
19799 if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
19800 },
19801 },
19802 },
19803 };
19804
19805 var Stepper = /*@__PURE__*/(function (Framework7Class$$1) {
19806 function Stepper(app, params) {
19807 Framework7Class$$1.call(this, params, [app]);
19808 var stepper = this;
19809
19810 var defaults = {
19811 el: null,
19812 inputEl: null,
19813 valueEl: null,
19814 value: 0,
19815 formatValue: null,
19816 step: 1,
19817 min: 0,
19818 max: 100,
19819 watchInput: true,
19820 autorepeat: false,
19821 autorepeatDynamic: false,
19822 wraps: false,
19823 manualInputMode: false,
19824 decimalPoint: 4,
19825 buttonsEndInputMode: true,
19826 };
19827
19828 // Extend defaults with modules params
19829 stepper.useModulesParams(defaults);
19830
19831 stepper.params = Utils.extend(defaults, params);
19832 if (stepper.params.value < stepper.params.min) {
19833 stepper.params.value = stepper.params.min;
19834 }
19835 if (stepper.params.value > stepper.params.max) {
19836 stepper.params.value = stepper.params.max;
19837 }
19838
19839 var el = stepper.params.el;
19840 if (!el) { return stepper; }
19841
19842 var $el = $(el);
19843 if ($el.length === 0) { return stepper; }
19844
19845 if ($el[0].f7Stepper) { return $el[0].f7Stepper; }
19846
19847 var $inputEl;
19848 if (stepper.params.inputEl) {
19849 $inputEl = $(stepper.params.inputEl);
19850 } else if ($el.find('.stepper-input-wrap').find('input, textarea').length) {
19851 $inputEl = $el.find('.stepper-input-wrap').find('input, textarea').eq(0);
19852 }
19853
19854 if ($inputEl && $inputEl.length) {
19855 ('step min max').split(' ').forEach(function (paramName) {
19856 if (!params[paramName] && $inputEl.attr(paramName)) {
19857 stepper.params[paramName] = parseFloat($inputEl.attr(paramName));
19858 }
19859 });
19860
19861 var decimalPoint$1 = parseInt(stepper.params.decimalPoint, 10);
19862 if (Number.isNaN(decimalPoint$1)) {
19863 stepper.params.decimalPoint = 0;
19864 } else {
19865 stepper.params.decimalPoint = decimalPoint$1;
19866 }
19867
19868 var inputValue = parseFloat($inputEl.val());
19869 if (typeof params.value === 'undefined' && !Number.isNaN(inputValue) && (inputValue || inputValue === 0)) {
19870 stepper.params.value = inputValue;
19871 }
19872 }
19873
19874 var $valueEl;
19875 if (stepper.params.valueEl) {
19876 $valueEl = $(stepper.params.valueEl);
19877 } else if ($el.find('.stepper-value').length) {
19878 $valueEl = $el.find('.stepper-value').eq(0);
19879 }
19880
19881 var $buttonPlusEl = $el.find('.stepper-button-plus');
19882 var $buttonMinusEl = $el.find('.stepper-button-minus');
19883
19884 var ref = stepper.params;
19885 var step = ref.step;
19886 var min = ref.min;
19887 var max = ref.max;
19888 var value = ref.value;
19889 var decimalPoint = ref.decimalPoint;
19890
19891 Utils.extend(stepper, {
19892 app: app,
19893 $el: $el,
19894 el: $el[0],
19895 $buttonPlusEl: $buttonPlusEl,
19896 buttonPlusEl: $buttonPlusEl[0],
19897 $buttonMinusEl: $buttonMinusEl,
19898 buttonMinusEl: $buttonMinusEl[0],
19899 $inputEl: $inputEl,
19900 inputEl: $inputEl ? $inputEl[0] : undefined,
19901 $valueEl: $valueEl,
19902 valueEl: $valueEl ? $valueEl[0] : undefined,
19903 step: step,
19904 min: min,
19905 max: max,
19906 value: value,
19907 decimalPoint: decimalPoint,
19908 typeModeChanged: false,
19909 });
19910
19911 $el[0].f7Stepper = stepper;
19912
19913 // Handle Events
19914 var touchesStart = {};
19915 var isTouched;
19916 var isScrolling;
19917 var preventButtonClick;
19918 var intervalId;
19919 var timeoutId;
19920 var autorepeatAction = null;
19921 var autorepeatInAction = false;
19922 var manualInput = false;
19923
19924 function dynamicRepeat(current, progressions, startsIn, progressionStep, repeatEvery, action) {
19925 clearTimeout(timeoutId);
19926 timeoutId = setTimeout(function () {
19927 if (current === 1) {
19928 preventButtonClick = true;
19929 autorepeatInAction = true;
19930 }
19931 clearInterval(intervalId);
19932 action();
19933 intervalId = setInterval(function () {
19934 action();
19935 }, repeatEvery);
19936 if (current < progressions) {
19937 dynamicRepeat(current + 1, progressions, startsIn, progressionStep, repeatEvery / 2, action);
19938 }
19939 }, current === 1 ? startsIn : progressionStep);
19940 }
19941
19942 function onTouchStart(e) {
19943 if (isTouched) { return; }
19944 if (manualInput) { return; }
19945 if ($(e.target).closest($buttonPlusEl).length) {
19946 autorepeatAction = 'increment';
19947 } else if ($(e.target).closest($buttonMinusEl).length) {
19948 autorepeatAction = 'decrement';
19949 }
19950 if (!autorepeatAction) { return; }
19951
19952 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
19953 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
19954 isTouched = true;
19955 isScrolling = undefined;
19956
19957 var progressions = stepper.params.autorepeatDynamic ? 4 : 1;
19958 dynamicRepeat(1, progressions, 500, 1000, 300, function () {
19959 stepper[autorepeatAction]();
19960 });
19961 }
19962 function onTouchMove(e) {
19963 if (!isTouched) { return; }
19964 if (manualInput) { return; }
19965 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
19966 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
19967
19968 if (typeof isScrolling === 'undefined' && !autorepeatInAction) {
19969 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
19970 }
19971 var distance = Math.pow( ((Math.pow( (pageX - touchesStart.x), 2 )) + (Math.pow( (pageY - touchesStart.y), 2 ))), 0.5 );
19972
19973 if (isScrolling || distance > 20) {
19974 isTouched = false;
19975 clearTimeout(timeoutId);
19976 clearInterval(intervalId);
19977 }
19978 }
19979 function onTouchEnd() {
19980 clearTimeout(timeoutId);
19981 clearInterval(intervalId);
19982 autorepeatAction = null;
19983 autorepeatInAction = false;
19984 isTouched = false;
19985 }
19986
19987 function onMinusClick() {
19988 if (manualInput) {
19989 if (stepper.params.buttonsEndInputMode) {
19990 manualInput = false;
19991 stepper.endTypeMode(true);
19992 }
19993 return;
19994 }
19995 if (preventButtonClick) {
19996 preventButtonClick = false;
19997 return;
19998 }
19999 stepper.decrement(true);
20000 }
20001 function onPlusClick() {
20002 if (manualInput) {
20003 if (stepper.params.buttonsEndInputMode) {
20004 manualInput = false;
20005 stepper.endTypeMode(true);
20006 }
20007 return;
20008 }
20009 if (preventButtonClick) {
20010 preventButtonClick = false;
20011 return;
20012 }
20013 stepper.increment(true);
20014 }
20015 function onInputClick(e) {
20016 if (!e.target.readOnly && stepper.params.manualInputMode) {
20017 manualInput = true;
20018 if (typeof e.target.selectionStart === 'number') {
20019 e.target.selectionStart = e.target.value.length;
20020 e.target.selectionEnd = e.target.value.length;
20021 }
20022 }
20023 }
20024 function onInputKey(e) {
20025 if (e.keyCode === 13 || e.which === 13) {
20026 e.preventDefault();
20027 manualInput = false;
20028 stepper.endTypeMode();
20029 }
20030 }
20031 function onInputBlur() {
20032 manualInput = false;
20033 stepper.endTypeMode(true);
20034 }
20035 function onInput(e) {
20036 if (manualInput) {
20037 stepper.typeValue(e.target.value);
20038 return;
20039 }
20040 if (e.detail && e.detail.sentByF7Stepper) { return; }
20041 stepper.setValue(e.target.value, true);
20042 }
20043 stepper.attachEvents = function attachEvents() {
20044 $buttonMinusEl.on('click', onMinusClick);
20045 $buttonPlusEl.on('click', onPlusClick);
20046 if (stepper.params.watchInput && $inputEl && $inputEl.length) {
20047 $inputEl.on('input', onInput);
20048 $inputEl.on('click', onInputClick);
20049 $inputEl.on('blur', onInputBlur);
20050 $inputEl.on('keyup', onInputKey);
20051 }
20052 if (stepper.params.autorepeat) {
20053 app.on('touchstart:passive', onTouchStart);
20054 app.on('touchmove:active', onTouchMove);
20055 app.on('touchend:passive', onTouchEnd);
20056 }
20057 };
20058 stepper.detachEvents = function detachEvents() {
20059 $buttonMinusEl.off('click', onMinusClick);
20060 $buttonPlusEl.off('click', onPlusClick);
20061 if (stepper.params.watchInput && $inputEl && $inputEl.length) {
20062 $inputEl.off('input', onInput);
20063 $inputEl.off('click', onInputClick);
20064 $inputEl.off('blur', onInputBlur);
20065 $inputEl.off('keyup', onInputKey);
20066 }
20067 };
20068
20069 // Install Modules
20070 stepper.useModules();
20071
20072 // Init
20073 stepper.init();
20074
20075 return stepper;
20076 }
20077
20078 if ( Framework7Class$$1 ) Stepper.__proto__ = Framework7Class$$1;
20079 Stepper.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
20080 Stepper.prototype.constructor = Stepper;
20081
20082 Stepper.prototype.minus = function minus () {
20083 return this.decrement();
20084 };
20085
20086 Stepper.prototype.plus = function plus () {
20087 return this.increment();
20088 };
20089
20090 Stepper.prototype.decrement = function decrement () {
20091 var stepper = this;
20092 return stepper.setValue(stepper.value - stepper.step, false, true);
20093 };
20094
20095 Stepper.prototype.increment = function increment () {
20096 var stepper = this;
20097 return stepper.setValue(stepper.value + stepper.step, false, true);
20098 };
20099
20100 Stepper.prototype.setValue = function setValue (newValue, forceUpdate, withWraps) {
20101 var stepper = this;
20102 var step = stepper.step;
20103 var min = stepper.min;
20104 var max = stepper.max;
20105
20106 var oldValue = stepper.value;
20107
20108 var value = Math.round(newValue / step) * step;
20109 if (stepper.params.wraps && withWraps) {
20110 if (value > max) { value = min; }
20111 if (value < min) { value = max; }
20112 } else {
20113 value = Math.max(Math.min(value, max), min);
20114 }
20115
20116 if (Number.isNaN(value)) {
20117 value = oldValue;
20118 }
20119 stepper.value = value;
20120
20121 var valueChanged = oldValue !== value;
20122
20123 // Events
20124 if (!valueChanged && !forceUpdate) { return stepper; }
20125
20126 stepper.$el.trigger('stepper:change', stepper, stepper.value);
20127 var formattedValue = stepper.formatValue(stepper.value);
20128 if (stepper.$inputEl && stepper.$inputEl.length) {
20129 stepper.$inputEl.val(formattedValue);
20130 stepper.$inputEl.trigger('input change', { sentByF7Stepper: true });
20131 }
20132 if (stepper.$valueEl && stepper.$valueEl.length) {
20133 stepper.$valueEl.html(formattedValue);
20134 }
20135 stepper.emit('local::change stepperChange', stepper, stepper.value);
20136 return stepper;
20137 };
20138
20139 Stepper.prototype.endTypeMode = function endTypeMode (noBlur) {
20140 var stepper = this;
20141 var min = stepper.min;
20142 var max = stepper.max;
20143 var value = parseFloat(stepper.value);
20144
20145 if (Number.isNaN(value)) { value = 0; }
20146
20147 value = Math.max(Math.min(value, max), min);
20148
20149 stepper.value = value;
20150 if (!stepper.typeModeChanged) {
20151 if (stepper.$inputEl && stepper.$inputEl.length && !noBlur) {
20152 stepper.$inputEl.blur();
20153 }
20154 return stepper;
20155 }
20156 stepper.typeModeChanged = false;
20157
20158 stepper.$el.trigger('stepper:change', stepper, stepper.value);
20159 var formattedValue = stepper.formatValue(stepper.value);
20160 if (stepper.$inputEl && stepper.$inputEl.length) {
20161 stepper.$inputEl.val(formattedValue);
20162 stepper.$inputEl.trigger('input change', { sentByF7Stepper: true });
20163 if (!noBlur) { stepper.$inputEl.blur(); }
20164 }
20165 if (stepper.$valueEl && stepper.$valueEl.length) {
20166 stepper.$valueEl.html(formattedValue);
20167 }
20168 stepper.emit('local::change stepperChange', stepper, stepper.value);
20169 return stepper;
20170 };
20171
20172 Stepper.prototype.typeValue = function typeValue (value) {
20173 var stepper = this;
20174 stepper.typeModeChanged = true;
20175 var inputTxt = String(value);
20176 if (inputTxt.lastIndexOf('.') + 1 === inputTxt.length || inputTxt.lastIndexOf(',') + 1 === inputTxt.length) {
20177 if (inputTxt.lastIndexOf('.') !== inputTxt.indexOf('.') || inputTxt.lastIndexOf(',') !== inputTxt.indexOf(',')) {
20178 inputTxt = inputTxt.slice(0, -1);
20179 stepper.value = inputTxt;
20180 stepper.$inputEl.val(stepper.value);
20181 return stepper;
20182 }
20183 } else {
20184 var newValue = parseFloat(inputTxt.replace(',', '.'));
20185 if (newValue === 0) {
20186 stepper.value = inputTxt.replace(',', '.');
20187 stepper.$inputEl.val(stepper.value);
20188 return stepper;
20189 }
20190 if (Number.isNaN(newValue)) {
20191 stepper.value = 0;
20192 stepper.$inputEl.val(stepper.value);
20193 return stepper;
20194 }
20195 var powVal = Math.pow( 10, stepper.params.decimalPoint );
20196 newValue = (Math.round((newValue) * powVal)).toFixed(stepper.params.decimalPoint + 1) / powVal;
20197 stepper.value = parseFloat(String(newValue).replace(',', '.'));
20198 stepper.$inputEl.val(stepper.value);
20199 return stepper;
20200 }
20201 stepper.value = inputTxt;
20202 stepper.$inputEl.val(inputTxt);
20203 return stepper;
20204 };
20205
20206 Stepper.prototype.getValue = function getValue () {
20207 return this.value;
20208 };
20209
20210 Stepper.prototype.formatValue = function formatValue (value) {
20211 var stepper = this;
20212 if (!stepper.params.formatValue) { return value; }
20213 return stepper.params.formatValue.call(stepper, value);
20214 };
20215
20216 Stepper.prototype.init = function init () {
20217 var stepper = this;
20218 stepper.attachEvents();
20219 if (stepper.$valueEl && stepper.$valueEl.length) {
20220 var formattedValue = stepper.formatValue(stepper.value);
20221 stepper.$valueEl.html(formattedValue);
20222 }
20223 return stepper;
20224 };
20225
20226 Stepper.prototype.destroy = function destroy () {
20227 var stepper = this;
20228 stepper.$el.trigger('stepper:beforedestroy', stepper);
20229 stepper.emit('local::beforeDestroy stepperBeforeDestroy', stepper);
20230 delete stepper.$el[0].f7Stepper;
20231 stepper.detachEvents();
20232 Utils.deleteProps(stepper);
20233 stepper = null;
20234 };
20235
20236 return Stepper;
20237 }(Framework7Class));
20238
20239 var Stepper$1 = {
20240 name: 'stepper',
20241 create: function create() {
20242 var app = this;
20243 app.stepper = Utils.extend(
20244 ConstructorMethods({
20245 defaultSelector: '.stepper',
20246 constructor: Stepper,
20247 app: app,
20248 domProp: 'f7Stepper',
20249 }),
20250 {
20251 getValue: function getValue(el) {
20252 if ( el === void 0 ) el = '.stepper';
20253
20254 var stepper = app.stepper.get(el);
20255 if (stepper) { return stepper.getValue(); }
20256 return undefined;
20257 },
20258 setValue: function setValue(el, value) {
20259 if ( el === void 0 ) el = '.stepper';
20260
20261 var stepper = app.stepper.get(el);
20262 if (stepper) { return stepper.setValue(value); }
20263 return undefined;
20264 },
20265 }
20266 );
20267 },
20268 static: {
20269 Stepper: Stepper,
20270 },
20271 on: {
20272 tabMounted: function tabMounted(tabEl) {
20273 var app = this;
20274 $(tabEl).find('.stepper-init').each(function (index, stepperEl) {
20275 var dataset = $(stepperEl).dataset();
20276 app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
20277 });
20278 },
20279 tabBeforeRemove: function tabBeforeRemove(tabEl) {
20280 $(tabEl).find('.stepper-init').each(function (index, stepperEl) {
20281 if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
20282 });
20283 },
20284 pageInit: function pageInit(page) {
20285 var app = this;
20286 page.$el.find('.stepper-init').each(function (index, stepperEl) {
20287 var dataset = $(stepperEl).dataset();
20288 app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
20289 });
20290 },
20291 pageBeforeRemove: function pageBeforeRemove(page) {
20292 page.$el.find('.stepper-init').each(function (index, stepperEl) {
20293 if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
20294 });
20295 },
20296 },
20297 vnode: {
20298 'stepper-init': {
20299 insert: function insert(vnode) {
20300 var app = this;
20301 var stepperEl = vnode.elm;
20302 var dataset = $(stepperEl).dataset();
20303 app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
20304 },
20305 destroy: function destroy(vnode) {
20306 var stepperEl = vnode.elm;
20307 if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
20308 },
20309 },
20310 },
20311 };
20312
20313 var SmartSelect = /*@__PURE__*/(function (Framework7Class$$1) {
20314 function SmartSelect(app, params) {
20315 if ( params === void 0 ) params = {};
20316
20317 Framework7Class$$1.call(this, params, [app]);
20318 var ss = this;
20319
20320 var defaults = Utils.extend({
20321 on: {},
20322 }, app.params.smartSelect);
20323
20324 // Extend defaults with modules params
20325 ss.useModulesParams(defaults);
20326
20327 ss.params = Utils.extend({}, defaults, params);
20328
20329 ss.app = app;
20330
20331 var $el = $(ss.params.el).eq(0);
20332 if ($el.length === 0) { return ss; }
20333
20334 if ($el[0].f7SmartSelect) { return $el[0].f7SmartSelect; }
20335
20336 var $selectEl = $el.find('select').eq(0);
20337 if ($selectEl.length === 0) { return ss; }
20338
20339 var $valueEl = $(ss.params.valueEl);
20340 if ($valueEl.length === 0) {
20341 $valueEl = $el.find('.item-after');
20342 }
20343 if ($valueEl.length === 0) {
20344 $valueEl = $('<div class="item-after"></div>');
20345 $valueEl.insertAfter($el.find('.item-title'));
20346 }
20347
20348 // View
20349 var view;
20350
20351 // Url
20352 var url = params.url;
20353 if (!url) {
20354 if ($el.attr('href') && $el.attr('href') !== '#') { url = $el.attr('href'); }
20355 else if ($selectEl.attr('name')) { url = ($selectEl.attr('name').toLowerCase()) + "-select/"; }
20356 }
20357 if (!url) { url = ss.params.url; }
20358
20359 var multiple = $selectEl[0].multiple;
20360 var inputType = multiple ? 'checkbox' : 'radio';
20361 var id = Utils.id();
20362
20363 Utils.extend(ss, {
20364 $el: $el,
20365 el: $el[0],
20366 $selectEl: $selectEl,
20367 selectEl: $selectEl[0],
20368 $valueEl: $valueEl,
20369 valueEl: $valueEl[0],
20370 url: url,
20371 multiple: multiple,
20372 inputType: inputType,
20373 id: id,
20374 view: view,
20375 inputName: (inputType + "-" + id),
20376 selectName: $selectEl.attr('name'),
20377 maxLength: $selectEl.attr('maxlength') || params.maxLength,
20378 });
20379
20380 $el[0].f7SmartSelect = ss;
20381
20382 // Events
20383 function onClick() {
20384 ss.open();
20385 }
20386 function onChange() {
20387 var value = ss.$selectEl.val();
20388 ss.$el.trigger('smartselect:change', ss, value);
20389 ss.emit('local::change smartSelectChange', ss, value);
20390 ss.setTextValue();
20391 }
20392 ss.attachEvents = function attachEvents() {
20393 $el.on('click', onClick);
20394 $el.on('change', 'select', onChange);
20395 };
20396 ss.detachEvents = function detachEvents() {
20397 $el.off('click', onClick);
20398 $el.off('change', 'select', onChange);
20399 };
20400
20401 function handleInputChange() {
20402 var optionEl;
20403 var text;
20404 var inputEl = this;
20405 var value = inputEl.value;
20406 var optionText = [];
20407 var displayAs;
20408 if (inputEl.type === 'checkbox') {
20409 for (var i = 0; i < ss.selectEl.options.length; i += 1) {
20410 optionEl = ss.selectEl.options[i];
20411 if (optionEl.value === value) {
20412 optionEl.selected = inputEl.checked;
20413 }
20414 if (optionEl.selected) {
20415 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
20416 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
20417 optionText.push(text.trim());
20418 }
20419 }
20420 if (ss.maxLength) {
20421 ss.checkMaxLength();
20422 }
20423 } else {
20424 optionEl = ss.$selectEl.find(("option[value=\"" + value + "\"]"))[0];
20425 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
20426 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
20427 optionText = [text];
20428 ss.selectEl.value = value;
20429 }
20430
20431 ss.$selectEl.trigger('change');
20432 ss.$valueEl.text(optionText.join(', '));
20433 if (ss.params.closeOnSelect && ss.inputType === 'radio') {
20434 ss.close();
20435 }
20436 }
20437
20438 ss.attachInputsEvents = function attachInputsEvents() {
20439 ss.$containerEl.on('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
20440 };
20441 ss.detachInputsEvents = function detachInputsEvents() {
20442 ss.$containerEl.off('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
20443 };
20444
20445 // Install Modules
20446 ss.useModules();
20447
20448 // Init
20449 ss.init();
20450
20451 return ss;
20452 }
20453
20454 if ( Framework7Class$$1 ) SmartSelect.__proto__ = Framework7Class$$1;
20455 SmartSelect.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
20456 SmartSelect.prototype.constructor = SmartSelect;
20457
20458 SmartSelect.prototype.setValue = function setValue (value) {
20459 var ss = this;
20460 var newValue = value;
20461 var optionText = [];
20462 var optionEl;
20463 var displayAs;
20464 var text;
20465 if (ss.multiple) {
20466 if (!Array.isArray(newValue)) { newValue = [newValue]; }
20467 for (var i = 0; i < ss.selectEl.options.length; i += 1) {
20468 optionEl = ss.selectEl.options[i];
20469 if (newValue.indexOf(optionEl.value) >= 0) {
20470 optionEl.selected = true;
20471 } else {
20472 optionEl.selected = false;
20473 }
20474 if (optionEl.selected) {
20475 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
20476 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
20477 optionText.push(text.trim());
20478 }
20479 }
20480 } else {
20481 optionEl = ss.$selectEl.find(("option[value=\"" + newValue + "\"]"))[0];
20482 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
20483 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
20484 optionText = [text];
20485 ss.selectEl.value = newValue;
20486 }
20487 ss.$valueEl.text(optionText.join(', '));
20488 };
20489
20490 SmartSelect.prototype.getValue = function getValue () {
20491 var ss = this;
20492 return ss.$selectEl.val();
20493 };
20494
20495 SmartSelect.prototype.getView = function getView () {
20496 var ss = this;
20497 var view = ss.view || ss.params.view;
20498 if (!view) {
20499 view = ss.$el.parents('.view').length && ss.$el.parents('.view')[0].f7View;
20500 }
20501 if (!view) {
20502 throw Error('Smart Select requires initialized View');
20503 }
20504 ss.view = view;
20505 return view;
20506 };
20507
20508 SmartSelect.prototype.checkMaxLength = function checkMaxLength () {
20509 var ss = this;
20510 var $containerEl = ss.$containerEl;
20511 if (ss.selectEl.selectedOptions.length >= ss.maxLength) {
20512 $containerEl.find('input[type="checkbox"]').each(function (index, inputEl) {
20513 if (!inputEl.checked) {
20514 $(inputEl).parents('li').addClass('disabled');
20515 } else {
20516 $(inputEl).parents('li').removeClass('disabled');
20517 }
20518 });
20519 } else {
20520 $containerEl.find('.disabled').removeClass('disabled');
20521 }
20522 };
20523
20524 SmartSelect.prototype.setTextValue = function setTextValue (value) {
20525 var ss = this;
20526 var valueArray = [];
20527 if (typeof value !== 'undefined') {
20528 if (Array.isArray(value)) {
20529 valueArray = value;
20530 } else {
20531 valueArray = [value];
20532 }
20533 } else {
20534 ss.$selectEl.find('option').each(function (optionIndex, optionEl) {
20535 var $optionEl = $(optionEl);
20536 if (optionEl.selected) {
20537 var displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $optionEl.data('display-value-as');
20538 if (displayAs && typeof displayAs !== 'undefined') {
20539 valueArray.push(displayAs);
20540 } else {
20541 valueArray.push(optionEl.textContent.trim());
20542 }
20543 }
20544 });
20545 }
20546 ss.$valueEl.text(valueArray.join(', '));
20547 };
20548
20549 SmartSelect.prototype.getItemsData = function getItemsData () {
20550 var ss = this;
20551 var items = [];
20552 var previousGroupEl;
20553 ss.$selectEl.find('option').each(function (index, optionEl) {
20554 var $optionEl = $(optionEl);
20555 var optionData = $optionEl.dataset();
20556 var optionImage = optionData.optionImage || ss.params.optionImage;
20557 var optionIcon = optionData.optionIcon || ss.params.optionIcon;
20558 var optionHasMedia = optionImage || optionIcon;
20559 // if (material) optionHasMedia = optionImage || optionIcon;
20560 var optionColor = optionData.optionColor;
20561
20562 var optionClassName = optionData.optionClass || '';
20563 if ($optionEl[0].disabled) { optionClassName += ' disabled'; }
20564
20565 var optionGroupEl = $optionEl.parent('optgroup')[0];
20566 var optionGroupLabel = optionGroupEl && optionGroupEl.label;
20567 var optionIsLabel = false;
20568 if (optionGroupEl && optionGroupEl !== previousGroupEl) {
20569 optionIsLabel = true;
20570 previousGroupEl = optionGroupEl;
20571 items.push({
20572 groupLabel: optionGroupLabel,
20573 isLabel: optionIsLabel,
20574 });
20575 }
20576 items.push({
20577 value: $optionEl[0].value,
20578 text: $optionEl[0].textContent.trim(),
20579 selected: $optionEl[0].selected,
20580 groupEl: optionGroupEl,
20581 groupLabel: optionGroupLabel,
20582 image: optionImage,
20583 icon: optionIcon,
20584 color: optionColor,
20585 className: optionClassName,
20586 disabled: $optionEl[0].disabled,
20587 id: ss.id,
20588 hasMedia: optionHasMedia,
20589 checkbox: ss.inputType === 'checkbox',
20590 radio: ss.inputType === 'radio',
20591 inputName: ss.inputName,
20592 inputType: ss.inputType,
20593 });
20594 });
20595 ss.items = items;
20596 return items;
20597 };
20598
20599 SmartSelect.prototype.renderSearchbar = function renderSearchbar () {
20600 var ss = this;
20601 if (ss.params.renderSearchbar) { return ss.params.renderSearchbar.call(ss); }
20602 var searchbarHTML = "\n <form class=\"searchbar\">\n <div class=\"searchbar-inner\">\n <div class=\"searchbar-input-wrap\">\n <input type=\"search\" placeholder=\"" + (ss.params.searchbarPlaceholder) + "\"/>\n <i class=\"searchbar-icon\"></i>\n <span class=\"input-clear-button\"></span>\n </div>\n <span class=\"searchbar-disable-button\">" + (ss.params.searchbarDisableText) + "</span>\n </div>\n </form>\n ";
20603 return searchbarHTML;
20604 };
20605
20606 SmartSelect.prototype.renderItem = function renderItem (item, index) {
20607 var ss = this;
20608 if (ss.params.renderItem) { return ss.params.renderItem.call(ss, item, index); }
20609 var itemHtml;
20610 if (item.isLabel) {
20611 itemHtml = "<li class=\"item-divider\">" + (item.groupLabel) + "</li>";
20612 } else {
20613 itemHtml = "\n <li class=\"" + (item.className || '') + "\">\n <label class=\"item-" + (item.inputType) + " item-content\">\n <input type=\"" + (item.inputType) + "\" name=\"" + (item.inputName) + "\" value=\"" + (item.value) + "\" " + (item.selected ? 'checked' : '') + "/>\n <i class=\"icon icon-" + (item.inputType) + "\"></i>\n " + (item.hasMedia ? ("\n <div class=\"item-media\">\n " + (item.icon ? ("<i class=\"icon " + (item.icon) + "\"></i>") : '') + "\n " + (item.image ? ("<img src=\"" + (item.image) + "\">") : '') + "\n </div>\n ") : '') + "\n <div class=\"item-inner\">\n <div class=\"item-title" + (item.color ? (" color-" + (item.color)) : '') + "\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
20614 }
20615 return itemHtml;
20616 };
20617
20618 SmartSelect.prototype.renderItems = function renderItems () {
20619 var ss = this;
20620 if (ss.params.renderItems) { return ss.params.renderItems.call(ss, ss.items); }
20621 var itemsHtml = "\n " + (ss.items.map(function (item, index) { return ("" + (ss.renderItem(item, index))); }).join('')) + "\n ";
20622 return itemsHtml;
20623 };
20624
20625 SmartSelect.prototype.renderPage = function renderPage () {
20626 var ss = this;
20627 if (ss.params.renderPage) { return ss.params.renderPage.call(ss, ss.items); }
20628 var pageTitle = ss.params.pageTitle;
20629 if (typeof pageTitle === 'undefined') {
20630 var $itemTitleEl = ss.$el.find('.item-title');
20631 pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
20632 }
20633 var cssClass = ss.params.cssClass;
20634 var pageHtml = "\n <div class=\"page smart-select-page " + cssClass + "\" data-name=\"smart-select-page\" data-select-name=\"" + (ss.selectName) + "\">\n <div class=\"navbar " + (ss.params.navbarColorTheme ? ("color-" + (ss.params.navbarColorTheme)) : '') + "\">\n <div class=\"navbar-inner sliding " + (ss.params.navbarColorTheme ? ("color-" + (ss.params.navbarColorTheme)) : '') + "\">\n <div class=\"left\">\n <a href=\"#\" class=\"link back\">\n <i class=\"icon icon-back\"></i>\n <span class=\"ios-only\">" + (ss.params.pageBackLinkText) + "</span>\n </a>\n </div>\n " + (pageTitle ? ("<div class=\"title\">" + pageTitle + "</div>") : '') + "\n " + (ss.params.searchbar ? ("<div class=\"subnavbar\">" + (ss.renderSearchbar()) + "</div>") : '') + "\n </div>\n </div>\n " + (ss.params.searchbar ? '<div class="searchbar-backdrop"></div>' : '') + "\n <div class=\"page-content\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n ";
20635 return pageHtml;
20636 };
20637
20638 SmartSelect.prototype.renderPopup = function renderPopup () {
20639 var ss = this;
20640 if (ss.params.renderPopup) { return ss.params.renderPopup.call(ss, ss.items); }
20641 var pageTitle = ss.params.pageTitle;
20642 if (typeof pageTitle === 'undefined') {
20643 var $itemTitleEl = ss.$el.find('.item-title');
20644 pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
20645 }
20646 var cssClass = ss.params.cssClass || '';
20647 var popupHtml = "\n <div class=\"popup smart-select-popup " + cssClass + " " + (ss.params.popupTabletFullscreen ? 'popup-tablet-fullscreen' : '') + "\" data-select-name=\"" + (ss.selectName) + "\">\n <div class=\"view\">\n <div class=\"page smart-select-page " + (ss.params.searchbar ? 'page-with-subnavbar' : '') + "\" data-name=\"smart-select-page\">\n <div class=\"navbar " + (ss.params.navbarColorTheme ? ("color-" + (ss.params.navbarColorTheme)) : '') + "\">\n <div class=\"navbar-inner sliding\">\n <div class=\"left\">\n <a href=\"#\" class=\"link popup-close\" data-popup=\".smart-select-popup[data-select-name='" + (ss.selectName) + "']\">\n <i class=\"icon icon-back\"></i>\n <span class=\"ios-only\">" + (ss.params.popupCloseLinkText) + "</span>\n </a>\n </div>\n " + (pageTitle ? ("<div class=\"title\">" + pageTitle + "</div>") : '') + "\n " + (ss.params.searchbar ? ("<div class=\"subnavbar\">" + (ss.renderSearchbar()) + "</div>") : '') + "\n </div>\n </div>\n " + (ss.params.searchbar ? '<div class="searchbar-backdrop"></div>' : '') + "\n <div class=\"page-content\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n ";
20648 return popupHtml;
20649 };
20650
20651 SmartSelect.prototype.renderSheet = function renderSheet () {
20652 var ss = this;
20653 if (ss.params.renderSheet) { return ss.params.renderSheet.call(ss, ss.items); }
20654 var cssClass = ss.params.cssClass;
20655 var sheetHtml = "\n <div class=\"sheet-modal smart-select-sheet " + cssClass + "\" data-select-name=\"" + (ss.selectName) + "\">\n <div class=\"toolbar toolbar-top " + (ss.params.toolbarColorTheme ? ("color-" + (ss.params.toolbarColorTheme)) : '') + "\">\n <div class=\"toolbar-inner\">\n <div class=\"left\"></div>\n <div class=\"right\">\n <a class=\"link sheet-close\">" + (ss.params.sheetCloseLinkText) + "</a>\n </div>\n </div>\n </div>\n <div class=\"sheet-modal-inner\">\n <div class=\"page-content\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n </div>\n ";
20656 return sheetHtml;
20657 };
20658
20659 SmartSelect.prototype.renderPopover = function renderPopover () {
20660 var ss = this;
20661 if (ss.params.renderPopover) { return ss.params.renderPopover.call(ss, ss.items); }
20662 var cssClass = ss.params.cssClass;
20663 var popoverHtml = "\n <div class=\"popover smart-select-popover " + cssClass + "\" data-select-name=\"" + (ss.selectName) + "\">\n <div class=\"popover-inner\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n ";
20664 return popoverHtml;
20665 };
20666
20667 SmartSelect.prototype.onOpen = function onOpen (type, containerEl) {
20668 var ss = this;
20669 var app = ss.app;
20670 var $containerEl = $(containerEl);
20671 ss.$containerEl = $containerEl;
20672 ss.openedIn = type;
20673 ss.opened = true;
20674
20675 // Init VL
20676 if (ss.params.virtualList) {
20677 ss.vl = app.virtualList.create({
20678 el: $containerEl.find('.virtual-list'),
20679 items: ss.items,
20680 renderItem: ss.renderItem.bind(ss),
20681 height: ss.params.virtualListHeight,
20682 searchByItem: function searchByItem(query, item) {
20683 if (item.text && item.text.toLowerCase().indexOf(query.trim().toLowerCase()) >= 0) { return true; }
20684 return false;
20685 },
20686 });
20687 }
20688
20689 // Init SB
20690 if (ss.params.searchbar) {
20691 var $searchbarEl = $containerEl.find('.searchbar');
20692 if (type === 'page' && app.theme === 'ios') {
20693 $searchbarEl = $(app.navbar.getElByPage($containerEl)).find('.searchbar');
20694 }
20695
20696 if (ss.params.appendSearchbarNotFound && (type === 'page' || type === 'popup')) {
20697 var $notFoundEl = null;
20698
20699 if (typeof ss.params.appendSearchbarNotFound === 'string') {
20700 $notFoundEl = $(("<div class=\"block searchbar-not-found\">" + (ss.params.appendSearchbarNotFound) + "</div>"));
20701 } else if (typeof ss.params.appendSearchbarNotFound === 'boolean') {
20702 $notFoundEl = $('<div class="block searchbar-not-found">Nothing found</div>');
20703 } else {
20704 $notFoundEl = ss.params.appendSearchbarNotFound;
20705 }
20706
20707 if ($notFoundEl) {
20708 $containerEl.find('.page-content').append($notFoundEl[0]);
20709 }
20710 }
20711
20712 var searchbarParams = Utils.extend({
20713 el: $searchbarEl,
20714 backdropEl: $containerEl.find('.searchbar-backdrop'),
20715 searchContainer: (".smart-select-list-" + (ss.id)),
20716 searchIn: '.item-title',
20717 }, typeof ss.params.searchbar === 'object' ? ss.params.searchbar : {});
20718
20719 ss.searchbar = app.searchbar.create(searchbarParams);
20720 }
20721
20722 // Check for max length
20723 if (ss.maxLength) {
20724 ss.checkMaxLength();
20725 }
20726
20727 // Close on select
20728 if (ss.params.closeOnSelect) {
20729 ss.$containerEl.find(("input[type=\"radio\"][name=\"" + (ss.inputName) + "\"]:checked")).parents('label').once('click', function () {
20730 ss.close();
20731 });
20732 }
20733
20734 // Attach input events
20735 ss.attachInputsEvents();
20736
20737 ss.$el.trigger('smartselect:open', ss);
20738 ss.emit('local::open smartSelectOpen', ss);
20739 };
20740
20741 SmartSelect.prototype.onOpened = function onOpened () {
20742 var ss = this;
20743
20744 ss.$el.trigger('smartselect:opened', ss);
20745 ss.emit('local::opened smartSelectOpened', ss);
20746 };
20747
20748 SmartSelect.prototype.onClose = function onClose () {
20749 var ss = this;
20750 if (ss.destroyed) { return; }
20751
20752 // Destroy VL
20753 if (ss.vl && ss.vl.destroy) {
20754 ss.vl.destroy();
20755 ss.vl = null;
20756 delete ss.vl;
20757 }
20758
20759 // Destroy SB
20760 if (ss.searchbar && ss.searchbar.destroy) {
20761 ss.searchbar.destroy();
20762 ss.searchbar = null;
20763 delete ss.searchbar;
20764 }
20765 // Detach events
20766 ss.detachInputsEvents();
20767
20768 ss.$el.trigger('smartselect:close', ss);
20769 ss.emit('local::close smartSelectClose', ss);
20770 };
20771
20772 SmartSelect.prototype.onClosed = function onClosed () {
20773 var ss = this;
20774 if (ss.destroyed) { return; }
20775 ss.opened = false;
20776 ss.$containerEl = null;
20777 delete ss.$containerEl;
20778
20779 ss.$el.trigger('smartselect:closed', ss);
20780 ss.emit('local::closed smartSelectClosed', ss);
20781 };
20782
20783 SmartSelect.prototype.openPage = function openPage () {
20784 var ss = this;
20785 if (ss.opened) { return ss; }
20786 ss.getItemsData();
20787 var pageHtml = ss.renderPage(ss.items);
20788 var view = ss.getView();
20789
20790 view.router.navigate({
20791 url: ss.url,
20792 route: {
20793 content: pageHtml,
20794 path: ss.url,
20795 on: {
20796 pageBeforeIn: function pageBeforeIn(e, page) {
20797 ss.onOpen('page', page.el);
20798 },
20799 pageAfterIn: function pageAfterIn(e, page) {
20800 ss.onOpened('page', page.el);
20801 },
20802 pageBeforeOut: function pageBeforeOut(e, page) {
20803 ss.onClose('page', page.el);
20804 },
20805 pageAfterOut: function pageAfterOut(e, page) {
20806 ss.onClosed('page', page.el);
20807 },
20808 },
20809 },
20810 });
20811 return ss;
20812 };
20813
20814 SmartSelect.prototype.openPopup = function openPopup () {
20815 var ss = this;
20816 if (ss.opened) { return ss; }
20817 ss.getItemsData();
20818 var popupHtml = ss.renderPopup(ss.items);
20819
20820 var popupParams = {
20821 content: popupHtml,
20822 on: {
20823 popupOpen: function popupOpen(popup) {
20824 ss.onOpen('popup', popup.el);
20825 },
20826 popupOpened: function popupOpened(popup) {
20827 ss.onOpened('popup', popup.el);
20828 },
20829 popupClose: function popupClose(popup) {
20830 ss.onClose('popup', popup.el);
20831 },
20832 popupClosed: function popupClosed(popup) {
20833 ss.onClosed('popup', popup.el);
20834 },
20835 },
20836 };
20837
20838 if (ss.params.routableModals) {
20839 var view = ss.getView();
20840 view.router.navigate({
20841 url: ss.url,
20842 route: {
20843 path: ss.url,
20844 popup: popupParams,
20845 },
20846 });
20847 } else {
20848 ss.modal = ss.app.popup.create(popupParams).open();
20849 }
20850 return ss;
20851 };
20852
20853 SmartSelect.prototype.openSheet = function openSheet () {
20854 var ss = this;
20855 if (ss.opened) { return ss; }
20856 ss.getItemsData();
20857 var sheetHtml = ss.renderSheet(ss.items);
20858
20859 var sheetParams = {
20860 content: sheetHtml,
20861 backdrop: false,
20862 scrollToEl: ss.$el,
20863 closeByOutsideClick: true,
20864 on: {
20865 sheetOpen: function sheetOpen(sheet) {
20866 ss.onOpen('sheet', sheet.el);
20867 },
20868 sheetOpened: function sheetOpened(sheet) {
20869 ss.onOpened('sheet', sheet.el);
20870 },
20871 sheetClose: function sheetClose(sheet) {
20872 ss.onClose('sheet', sheet.el);
20873 },
20874 sheetClosed: function sheetClosed(sheet) {
20875 ss.onClosed('sheet', sheet.el);
20876 },
20877 },
20878 };
20879
20880 if (ss.params.routableModals) {
20881 var view = ss.getView();
20882 view.router.navigate({
20883 url: ss.url,
20884 route: {
20885 path: ss.url,
20886 sheet: sheetParams,
20887 },
20888 });
20889 } else {
20890 ss.modal = ss.app.sheet.create(sheetParams).open();
20891 }
20892 return ss;
20893 };
20894
20895 SmartSelect.prototype.openPopover = function openPopover () {
20896 var ss = this;
20897 if (ss.opened) { return ss; }
20898 ss.getItemsData();
20899 var popoverHtml = ss.renderPopover(ss.items);
20900 var popoverParams = {
20901 content: popoverHtml,
20902 targetEl: ss.$el,
20903 on: {
20904 popoverOpen: function popoverOpen(popover) {
20905 ss.onOpen('popover', popover.el);
20906 },
20907 popoverOpened: function popoverOpened(popover) {
20908 ss.onOpened('popover', popover.el);
20909 },
20910 popoverClose: function popoverClose(popover) {
20911 ss.onClose('popover', popover.el);
20912 },
20913 popoverClosed: function popoverClosed(popover) {
20914 ss.onClosed('popover', popover.el);
20915 },
20916 },
20917 };
20918 if (ss.params.routableModals) {
20919 var view = ss.getView();
20920 view.router.navigate({
20921 url: ss.url,
20922 route: {
20923 path: ss.url,
20924 popover: popoverParams,
20925 },
20926 });
20927 } else {
20928 ss.modal = ss.app.popover.create(popoverParams).open();
20929 }
20930 return ss;
20931 };
20932
20933 SmartSelect.prototype.open = function open (type) {
20934 var ss = this;
20935 if (ss.opened) { return ss; }
20936 var openIn = type || ss.params.openIn;
20937 ss[("open" + (openIn.split('').map(function (el, index) {
20938 if (index === 0) { return el.toUpperCase(); }
20939 return el;
20940 }).join('')))]();
20941 return ss;
20942 };
20943
20944 SmartSelect.prototype.close = function close () {
20945 var ss = this;
20946 if (!ss.opened) { return ss; }
20947 if (ss.params.routableModals || ss.openedIn === 'page') {
20948 var view = ss.getView();
20949 view.router.back();
20950 } else {
20951 ss.modal.once('modalClosed', function () {
20952 Utils.nextTick(function () {
20953 ss.modal.destroy();
20954 delete ss.modal;
20955 });
20956 });
20957 ss.modal.close();
20958 }
20959 return ss;
20960 };
20961
20962 SmartSelect.prototype.init = function init () {
20963 var ss = this;
20964 ss.attachEvents();
20965 ss.setTextValue();
20966 };
20967
20968 SmartSelect.prototype.destroy = function destroy () {
20969 var ss = this;
20970 ss.emit('local::beforeDestroy smartSelectBeforeDestroy', ss);
20971 ss.$el.trigger('smartselect:beforedestroy', ss);
20972 ss.detachEvents();
20973 delete ss.$el[0].f7SmartSelect;
20974 Utils.deleteProps(ss);
20975 ss.destroyed = true;
20976 };
20977
20978 return SmartSelect;
20979 }(Framework7Class));
20980
20981 var SmartSelect$1 = {
20982 name: 'smartSelect',
20983 params: {
20984 smartSelect: {
20985 el: undefined,
20986 valueEl: undefined,
20987 openIn: 'page', // or 'popup' or 'sheet' or 'popover'
20988 pageTitle: undefined,
20989 pageBackLinkText: 'Back',
20990 popupCloseLinkText: 'Close',
20991 popupTabletFullscreen: false,
20992 sheetCloseLinkText: 'Done',
20993 searchbar: false,
20994 searchbarPlaceholder: 'Search',
20995 searchbarDisableText: 'Cancel',
20996 closeOnSelect: false,
20997 virtualList: false,
20998 virtualListHeight: undefined,
20999 formColorTheme: undefined,
21000 navbarColorTheme: undefined,
21001 routableModals: true,
21002 url: 'select/',
21003 cssClass: '',
21004 /*
21005 Custom render functions
21006 */
21007 renderPage: undefined,
21008 renderPopup: undefined,
21009 renderSheet: undefined,
21010 renderPopover: undefined,
21011 renderItems: undefined,
21012 renderItem: undefined,
21013 renderSearchbar: undefined,
21014 },
21015 },
21016 static: {
21017 SmartSelect: SmartSelect,
21018 },
21019 create: function create() {
21020 var app = this;
21021 app.smartSelect = Utils.extend(
21022 ConstructorMethods({
21023 defaultSelector: '.smart-select',
21024 constructor: SmartSelect,
21025 app: app,
21026 domProp: 'f7SmartSelect',
21027 }),
21028 {
21029 open: function open(smartSelectEl) {
21030 var ss = app.smartSelect.get(smartSelectEl);
21031 if (ss && ss.open) { return ss.open(); }
21032 return undefined;
21033 },
21034 close: function close(smartSelectEl) {
21035 var ss = app.smartSelect.get(smartSelectEl);
21036 if (ss && ss.close) { return ss.close(); }
21037 return undefined;
21038 },
21039 }
21040 );
21041 },
21042
21043 on: {
21044 tabMounted: function tabMounted(tabEl) {
21045 var app = this;
21046 $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
21047 app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
21048 });
21049 },
21050 tabBeforeRemove: function tabBeforeRemove(tabEl) {
21051 $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
21052 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
21053 smartSelectEl.f7SmartSelect.destroy();
21054 }
21055 });
21056 },
21057 pageInit: function pageInit(page) {
21058 var app = this;
21059 page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
21060 app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
21061 });
21062 },
21063 pageBeforeRemove: function pageBeforeRemove(page) {
21064 page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
21065 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
21066 smartSelectEl.f7SmartSelect.destroy();
21067 }
21068 });
21069 },
21070 },
21071 clicks: {
21072 '.smart-select': function open($clickedEl, data) {
21073 var app = this;
21074 if (!$clickedEl[0].f7SmartSelect) {
21075 var ss = app.smartSelect.create(Utils.extend({ el: $clickedEl }, data));
21076 ss.open();
21077 }
21078 },
21079 },
21080 vnode: {
21081 'smart-select-init': {
21082 insert: function insert(vnode) {
21083 var app = this;
21084 var smartSelectEl = vnode.elm;
21085 app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
21086 },
21087 destroy: function destroy(vnode) {
21088 var smartSelectEl = vnode.elm;
21089 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
21090 smartSelectEl.f7SmartSelect.destroy();
21091 }
21092 },
21093 },
21094 },
21095 };
21096
21097 var Grid = {
21098 name: 'grid',
21099 };
21100
21101 /*
21102 Converts a Gregorian date to Jalaali.
21103 */
21104 function toJalaali (gy, gm, gd) {
21105 if (Object.prototype.toString.call(gy) === '[object Date]') {
21106 gd = gy.getDate();
21107 gm = gy.getMonth() + 1;
21108 gy = gy.getFullYear();
21109 }
21110 return d2j(g2d(gy, gm, gd))
21111 }
21112
21113 /*
21114 Converts a Jalaali date to Gregorian.
21115 */
21116 function toGregorian (jy, jm, jd) {
21117 return d2g(j2d(jy, jm, jd))
21118 }
21119
21120 // /*
21121 // Checks whether a Jalaali date is valid or not.
21122 // */
21123 // function isValidJalaaliDate (jy, jm, jd) {
21124 // return jy >= -61 && jy <= 3177 &&
21125 // jm >= 1 && jm <= 12 &&
21126 // jd >= 1 && jd <= monthLength(jy, jm)
21127 // }
21128
21129 /*
21130 Is this a leap year or not?
21131 */
21132 function isLeapJalaaliYear (jy) {
21133 return jalCal(jy).leap === 0
21134 }
21135
21136 /*
21137 Number of days in a given month in a Jalaali year.
21138 */
21139 function monthLength (jy, jm) {
21140 if (jm <= 6) { return 31 }
21141 if (jm <= 11) { return 30 }
21142 if (isLeapJalaaliYear(jy)) { return 30 }
21143 return 29
21144 }
21145
21146 /*
21147 This function determines if the Jalaali (Persian) year is
21148 leap (366-day long) or is the common year (365 days), and
21149 finds the day in March (Gregorian calendar) of the first
21150 day of the Jalaali year (jy).
21151 @param jy Jalaali calendar year (-61 to 3177)
21152 @return
21153 leap: number of years since the last leap year (0 to 4)
21154 gy: Gregorian year of the beginning of Jalaali year
21155 march: the March day of Farvardin the 1st (1st day of jy)
21156 @see: http://www.astro.uni.torun.pl/~kb/Papers/EMP/PersianC-EMP.htm
21157 @see: http://www.fourmilab.ch/documents/calendar/
21158 */
21159 function jalCal (jy) {
21160 // Jalaali years starting the 33-year rule.
21161 var breaks = [-61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178];
21162 var bl = breaks.length;
21163 var gy = jy + 621;
21164 var leapJ = -14;
21165 var jp = breaks[0];
21166 var jm;
21167 var jump;
21168 var leap;
21169 var leapG;
21170 var march;
21171 var n;
21172 var i;
21173
21174 if (jy < jp || jy >= breaks[bl - 1]) { throw new Error('Invalid Jalaali year ' + jy) }
21175
21176 // Find the limiting years for the Jalaali year jy.
21177 for (i = 1; i < bl; i += 1) {
21178 jm = breaks[i];
21179 jump = jm - jp;
21180 if (jy < jm) { break }
21181 leapJ = leapJ + div(jump, 33) * 8 + div(mod(jump, 33), 4);
21182 jp = jm;
21183 }
21184 n = jy - jp;
21185
21186 // Find the number of leap years from AD 621 to the beginning
21187 // of the current Jalaali year in the Persian calendar.
21188 leapJ = leapJ + div(n, 33) * 8 + div(mod(n, 33) + 3, 4);
21189 if (mod(jump, 33) === 4 && jump - n === 4) { leapJ += 1; }
21190
21191 // And the same in the Gregorian calendar (until the year gy).
21192 leapG = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150;
21193
21194 // Determine the Gregorian date of Farvardin the 1st.
21195 march = 20 + leapJ - leapG;
21196
21197 // Find how many years have passed since the last leap year.
21198 if (jump - n < 6) { n = n - jump + div(jump + 4, 33) * 33; }
21199 leap = mod(mod(n + 1, 33) - 1, 4);
21200 if (leap === -1) {
21201 leap = 4;
21202 }
21203
21204 return { leap: leap,
21205 gy: gy,
21206 march: march
21207 }
21208 }
21209
21210 /*
21211 Converts a date of the Jalaali calendar to the Julian Day number.
21212 @param jy Jalaali year (1 to 3100)
21213 @param jm Jalaali month (1 to 12)
21214 @param jd Jalaali day (1 to 29/31)
21215 @return Julian Day number
21216 */
21217 function j2d (jy, jm, jd) {
21218 var r = jalCal(jy);
21219 return g2d(r.gy, 3, r.march) + (jm - 1) * 31 - div(jm, 7) * (jm - 7) + jd - 1
21220 }
21221
21222 /*
21223 Converts the Julian Day number to a date in the Jalaali calendar.
21224 @param jdn Julian Day number
21225 @return
21226 jy: Jalaali year (1 to 3100)
21227 jm: Jalaali month (1 to 12)
21228 jd: Jalaali day (1 to 29/31)
21229 */
21230 function d2j (jdn) {
21231 var gy = d2g(jdn).gy; // Calculate Gregorian year (gy).
21232 var jy = gy - 621;
21233 var r = jalCal(jy);
21234 var jdn1f = g2d(gy, 3, r.march);
21235 var jd;
21236 var jm;
21237 var k;
21238
21239 // Find number of days that passed since 1 Farvardin.
21240 k = jdn - jdn1f;
21241 if (k >= 0) {
21242 if (k <= 185) {
21243 // The first 6 months.
21244 jm = 1 + div(k, 31);
21245 jd = mod(k, 31) + 1;
21246 return { jy: jy,
21247 jm: jm,
21248 jd: jd
21249 }
21250 } else {
21251 // The remaining months.
21252 k -= 186;
21253 }
21254 } else {
21255 // Previous Jalaali year.
21256 jy -= 1;
21257 k += 179;
21258 if (r.leap === 1) { k += 1; }
21259 }
21260 jm = 7 + div(k, 30);
21261 jd = mod(k, 30) + 1;
21262 return { jy: jy,
21263 jm: jm,
21264 jd: jd
21265 }
21266 }
21267
21268 /*
21269 Calculates the Julian Day number from Gregorian or Julian
21270 calendar dates. This integer number corresponds to the noon of
21271 the date (i.e. 12 hours of Universal Time).
21272 The procedure was tested to be good since 1 March, -100100 (of both
21273 calendars) up to a few million years into the future.
21274 @param gy Calendar year (years BC numbered 0, -1, -2, ...)
21275 @param gm Calendar month (1 to 12)
21276 @param gd Calendar day of the month (1 to 28/29/30/31)
21277 @return Julian Day number
21278 */
21279 function g2d (gy, gm, gd) {
21280 var d = div((gy + div(gm - 8, 6) + 100100) * 1461, 4) +
21281 div(153 * mod(gm + 9, 12) + 2, 5) +
21282 gd - 34840408;
21283 d = d - div(div(gy + 100100 + div(gm - 8, 6), 100) * 3, 4) + 752;
21284 return d
21285 }
21286
21287 /*
21288 Calculates Gregorian and Julian calendar dates from the Julian Day number
21289 (jdn) for the period since jdn=-34839655 (i.e. the year -100100 of both
21290 calendars) to some millions years ahead of the present.
21291 @param jdn Julian Day number
21292 @return
21293 gy: Calendar year (years BC numbered 0, -1, -2, ...)
21294 gm: Calendar month (1 to 12)
21295 gd: Calendar day of the month M (1 to 28/29/30/31)
21296 */
21297 function d2g (jdn) {
21298 var j,
21299 i,
21300 gd,
21301 gm,
21302 gy;
21303 j = 4 * jdn + 139361631;
21304 j = j + div(div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
21305 i = div(mod(j, 1461), 4) * 5 + 308;
21306 gd = div(mod(i, 153), 5) + 1;
21307 gm = mod(div(i, 153), 12) + 1;
21308 gy = div(j, 1461) - 100100 + div(8 - gm, 6);
21309 return { gy: gy,
21310 gm: gm,
21311 gd: gd
21312 }
21313 }
21314
21315 /*
21316 Utility helper functions.
21317 */
21318
21319 function div (a, b) {
21320 return ~~(a / b)
21321 }
21322
21323 function mod (a, b) {
21324 return a - ~~(a / b) * b
21325 }
21326
21327 function fixDate (y, m, d) {
21328 if (m > 11) {
21329 y += Math.floor(m / 12);
21330 m = m % 12;
21331 }
21332 while (m < 0) {
21333 y -= 1;
21334 m += 12;
21335 }
21336 while (d > monthLength(y, m + 1)) {
21337 m = m !== 11 ? m + 1 : 0;
21338 y = m === 0 ? y + 1 : y;
21339 d -= monthLength(y, m + 1);
21340 }
21341 while (d <= 0) {
21342 m = m !== 0 ? m - 1 : 11;
21343 y = m === 11 ? y - 1 : y;
21344 d += monthLength(y, m + 1);
21345 }
21346 return [y, m || 0, d || 1]
21347 }
21348
21349 /*
21350 Copyright nainemom <nainemom@gmail.com>
21351 https://github.com/nainemom/idate/blob/dev/package.json
21352 */
21353
21354 var methods = [
21355 'getHours',
21356 'getMilliseconds',
21357 'getMinutes',
21358 'getSeconds',
21359 'getTime',
21360 'getTimezoneOffset',
21361 'getUTCDate',
21362 'getUTCDay',
21363 'getUTCFullYear',
21364 'getUTCHours',
21365 'getUTCMilliseconds',
21366 'getUTCMinutes',
21367 'getUTCMonth',
21368 'getUTCSeconds',
21369 'now',
21370 'parse',
21371 'setHours',
21372 'setMilliseconds',
21373 'setMinutes',
21374 'setSeconds',
21375 'setTime',
21376 'setUTCDate',
21377 'setUTCFullYear',
21378 'setUTCHours',
21379 'setUTCMilliseconds',
21380 'setUTCMinutes',
21381 'setUTCMonth',
21382 'setUTCSeconds',
21383 'toDateString',
21384 'toISOString',
21385 'toJSON',
21386 'toLocaleDateString',
21387 'toLocaleTimeString',
21388 'toLocaleString',
21389 'toTimeString',
21390 'toUTCString',
21391 'UTC',
21392 'valueOf'
21393 ];
21394
21395 var DAY_NAMES = ['Shanbe', 'Yekshanbe', 'Doshanbe', 'Seshanbe', 'Chaharshanbe', 'Panjshanbe', 'Jom\'e'];
21396 var PERSIAN_DAY_NAMES = ['شنبه', 'یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه'];
21397 var MONTH_NAMES = ['Farvardin', 'Ordibehesht', 'Khordad', 'Tir', 'Mordad', 'Shahrivar', 'Mehr', 'Aban', 'Azar', 'Dey', 'Bahman', 'Esfand'];
21398 var PERSIAN_MONTH_NAMES = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'];
21399 var PERSIAN_NUMBERS = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
21400
21401 var IDate = /*@__PURE__*/(function (Date) {
21402 function IDate () {
21403 Date.call(this);
21404
21405 var date;
21406 var args = Array.from(arguments);
21407 if (args.length === 0) {
21408 date = Date.now();
21409 } else if (args.length === 1) {
21410 date = args[0] instanceof Date ? args[0].getTime() : args[0];
21411 } else {
21412 var fixed = fixDate(
21413 args[0],
21414 args[1] || 0,
21415 typeof args[2] === 'undefined' ? 1 : args[2]);
21416 var converted$1 = toGregorian(fixed[0], fixed[1] + 1, fixed[2]);
21417 date = [converted$1.gy, converted$1.gm - 1, converted$1.gd].concat([args[3] || 0, args[4] || 0, args[5] || 0, args[6] || 0]);
21418 }
21419
21420 if (Array.isArray(date)) {
21421 this.gdate = new (Function.prototype.bind.apply( Date, [ null ].concat( date) ));
21422 } else {
21423 this.gdate = new Date(date);
21424 }
21425
21426 var converted = toJalaali(this.gdate.getFullYear(), this.gdate.getMonth() + 1, this.gdate.getDate());
21427 this.jdate = [converted.jy, converted.jm - 1, converted.jd];
21428
21429 methods.forEach(function (method) {
21430 IDate.prototype[method] = function () {
21431 var ref;
21432
21433 return (ref = this.gdate)[method].apply(ref, arguments)
21434 };
21435 });
21436 }
21437
21438 if ( Date ) IDate.__proto__ = Date;
21439 IDate.prototype = Object.create( Date && Date.prototype );
21440 IDate.prototype.constructor = IDate;
21441
21442 IDate.prototype.getFullYear = function getFullYear () {
21443 return this.jdate[0]
21444 };
21445
21446 IDate.prototype.setFullYear = function setFullYear (value) {
21447 this.jdate = fixDate(value, this.jdate[1], this.jdate[2]);
21448 this.syncDate();
21449 return this.gdate.getTime()
21450 };
21451
21452 IDate.prototype.getMonth = function getMonth () {
21453 return this.jdate[1]
21454 };
21455
21456 IDate.prototype.setMonth = function setMonth (value) {
21457 this.jdate = fixDate(this.jdate[0], value, this.jdate[2]);
21458 this.syncDate();
21459 return this.gdate.getTime()
21460 };
21461
21462 IDate.prototype.getDate = function getDate () {
21463 return this.jdate[2]
21464 };
21465
21466 IDate.prototype.setDate = function setDate (value) {
21467 this.jdate = fixDate(this.jdate[0], this.jdate[1], value);
21468 this.syncDate();
21469 return this.gdate.getTime()
21470 };
21471
21472 IDate.prototype.getDay = function getDay () {
21473 return (this.gdate.getDay() + 1) % 7
21474 };
21475
21476 IDate.prototype.syncDate = function syncDate () {
21477 var converted = toGregorian(this.jdate[0], this.jdate[1] + 1, this.jdate[2]);
21478 this.gdate.setFullYear(converted.gy);
21479 this.gdate.setMonth(converted.gm - 1);
21480 this.gdate.setDate(converted.gd);
21481 };
21482 IDate.prototype.toString = function toString (persianString) {
21483 if ( persianString === void 0 ) persianString = true;
21484
21485 var replaceNums = function (str) {
21486 return str.replace(/./g, function (c) { return PERSIAN_NUMBERS[c] || c; })
21487 };
21488 var padNumber = function (num) { return num.toString().length === 1 ? ("0" + num) : num.toString(); };
21489 var time = (padNumber(this.getHours())) + ":" + (padNumber(this.getMinutes())) + ":" + (padNumber(this.getSeconds()));
21490 if (persianString) {
21491 return replaceNums(((PERSIAN_DAY_NAMES[this.getDay()]) + " " + (this.getDate()) + " " + (PERSIAN_MONTH_NAMES[this.getMonth()]) + " " + (this.getFullYear()) + " ساعت " + time))
21492 }
21493 return ((DAY_NAMES[this.getDay()]) + " " + (this.getDate()) + " " + (MONTH_NAMES[this.getMonth()]) + " " + (this.getFullYear()) + " " + time)
21494 };
21495
21496 return IDate;
21497 }(Date));
21498
21499 var Calendar = /*@__PURE__*/(function (Framework7Class$$1) {
21500 function Calendar(app, params) {
21501 if ( params === void 0 ) params = {};
21502
21503 Framework7Class$$1.call(this, params, [app]);
21504 var calendar = this;
21505
21506 calendar.params = Utils.extend({}, app.params.calendar, params);
21507
21508 if (calendar.params.calendarType === 'jalali') {
21509 Object.keys(calendar.params.jalali).forEach(function (param) {
21510 if (!params[param]) {
21511 calendar.params[param] = calendar.params.jalali[param];
21512 }
21513 });
21514 }
21515
21516 if (calendar.params.calendarType === 'jalali') {
21517 calendar.DateHandleClass = IDate;
21518 } else {
21519 calendar.DateHandleClass = Date;
21520 }
21521
21522 var $containerEl;
21523 if (calendar.params.containerEl) {
21524 $containerEl = $(calendar.params.containerEl);
21525 if ($containerEl.length === 0) { return calendar; }
21526 }
21527
21528 var $inputEl;
21529 if (calendar.params.inputEl) {
21530 $inputEl = $(calendar.params.inputEl);
21531 }
21532
21533 var view;
21534 if ($inputEl) {
21535 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
21536 }
21537 if (!view) { view = app.views.main; }
21538
21539 var isHorizontal = calendar.params.direction === 'horizontal';
21540
21541 var inverter = 1;
21542 if (isHorizontal) {
21543 inverter = app.rtl ? -1 : 1;
21544 }
21545
21546 Utils.extend(calendar, {
21547 app: app,
21548 $containerEl: $containerEl,
21549 containerEl: $containerEl && $containerEl[0],
21550 inline: $containerEl && $containerEl.length > 0,
21551 $inputEl: $inputEl,
21552 inputEl: $inputEl && $inputEl[0],
21553 initialized: false,
21554 opened: false,
21555 url: calendar.params.url,
21556 isHorizontal: isHorizontal,
21557 inverter: inverter,
21558 view: view,
21559 animating: false,
21560 });
21561
21562 function onInputClick() {
21563 calendar.open();
21564 }
21565 function onInputFocus(e) {
21566 e.preventDefault();
21567 }
21568 function onHtmlClick(e) {
21569 var $targetEl = $(e.target);
21570 if (calendar.isPopover()) { return; }
21571 if (!calendar.opened || calendar.closing) { return; }
21572 if ($targetEl.closest('[class*="backdrop"]').length) { return; }
21573 if ($inputEl && $inputEl.length > 0) {
21574 if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal, .calendar-modal').length === 0) {
21575 calendar.close();
21576 }
21577 } else if ($(e.target).closest('.sheet-modal, .calendar-modal').length === 0) {
21578 calendar.close();
21579 }
21580 }
21581
21582 // Events
21583 Utils.extend(calendar, {
21584 attachInputEvents: function attachInputEvents() {
21585 calendar.$inputEl.on('click', onInputClick);
21586 if (calendar.params.inputReadOnly) {
21587 calendar.$inputEl.on('focus mousedown', onInputFocus);
21588 }
21589 },
21590 detachInputEvents: function detachInputEvents() {
21591 calendar.$inputEl.off('click', onInputClick);
21592 if (calendar.params.inputReadOnly) {
21593 calendar.$inputEl.off('focus mousedown', onInputFocus);
21594 }
21595 },
21596 attachHtmlEvents: function attachHtmlEvents() {
21597 app.on('click', onHtmlClick);
21598 },
21599 detachHtmlEvents: function detachHtmlEvents() {
21600 app.off('click', onHtmlClick);
21601 },
21602 });
21603 calendar.attachCalendarEvents = function attachCalendarEvents() {
21604 var allowItemClick = true;
21605 var isTouched;
21606 var isMoved;
21607 var touchStartX;
21608 var touchStartY;
21609 var touchCurrentX;
21610 var touchCurrentY;
21611 var touchStartTime;
21612 var touchEndTime;
21613 var currentTranslate;
21614 var wrapperWidth;
21615 var wrapperHeight;
21616 var percentage;
21617 var touchesDiff;
21618 var isScrolling;
21619
21620 var $el = calendar.$el;
21621 var $wrapperEl = calendar.$wrapperEl;
21622
21623 function handleTouchStart(e) {
21624 if (isMoved || isTouched) { return; }
21625 isTouched = true;
21626 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
21627 touchCurrentX = touchStartX;
21628 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
21629 touchCurrentY = touchStartY;
21630 touchStartTime = (new calendar.DateHandleClass()).getTime();
21631 percentage = 0;
21632 allowItemClick = true;
21633 isScrolling = undefined;
21634 currentTranslate = calendar.monthsTranslate;
21635 }
21636 function handleTouchMove(e) {
21637 if (!isTouched) { return; }
21638 var isH = calendar.isHorizontal;
21639
21640 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
21641 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
21642 if (typeof isScrolling === 'undefined') {
21643 isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));
21644 }
21645 if (isH && isScrolling) {
21646 isTouched = false;
21647 return;
21648 }
21649 e.preventDefault();
21650 if (calendar.animating) {
21651 isTouched = false;
21652 return;
21653 }
21654 allowItemClick = false;
21655 if (!isMoved) {
21656 // First move
21657 isMoved = true;
21658 wrapperWidth = $wrapperEl[0].offsetWidth;
21659 wrapperHeight = $wrapperEl[0].offsetHeight;
21660 $wrapperEl.transition(0);
21661 }
21662
21663 touchesDiff = isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY;
21664 percentage = touchesDiff / (isH ? wrapperWidth : wrapperHeight);
21665 currentTranslate = ((calendar.monthsTranslate * calendar.inverter) + percentage) * 100;
21666
21667 // Transform wrapper
21668 $wrapperEl.transform(("translate3d(" + (isH ? currentTranslate : 0) + "%, " + (isH ? 0 : currentTranslate) + "%, 0)"));
21669 }
21670 function handleTouchEnd() {
21671 if (!isTouched || !isMoved) {
21672 isTouched = false;
21673 isMoved = false;
21674 return;
21675 }
21676 isTouched = false;
21677 isMoved = false;
21678
21679 touchEndTime = new calendar.DateHandleClass().getTime();
21680 if (touchEndTime - touchStartTime < 300) {
21681 if (Math.abs(touchesDiff) < 10) {
21682 calendar.resetMonth();
21683 } else if (touchesDiff >= 10) {
21684 if (app.rtl) { calendar.nextMonth(); }
21685 else { calendar.prevMonth(); }
21686 } else if (app.rtl) { calendar.prevMonth(); }
21687 else { calendar.nextMonth(); }
21688 } else if (percentage <= -0.5) {
21689 if (app.rtl) { calendar.prevMonth(); }
21690 else { calendar.nextMonth(); }
21691 } else if (percentage >= 0.5) {
21692 if (app.rtl) { calendar.nextMonth(); }
21693 else { calendar.prevMonth(); }
21694 } else {
21695 calendar.resetMonth();
21696 }
21697
21698 // Allow click
21699 setTimeout(function () {
21700 allowItemClick = true;
21701 }, 100);
21702 }
21703
21704 function handleDayClick(e) {
21705 if (!allowItemClick) { return; }
21706 var $dayEl = $(e.target).parents('.calendar-day');
21707 if ($dayEl.length === 0 && $(e.target).hasClass('calendar-day')) {
21708 $dayEl = $(e.target);
21709 }
21710 if ($dayEl.length === 0) { return; }
21711 if ($dayEl.hasClass('calendar-day-disabled')) { return; }
21712 if (!calendar.params.rangePicker) {
21713 if ($dayEl.hasClass('calendar-day-next')) { calendar.nextMonth(); }
21714 if ($dayEl.hasClass('calendar-day-prev')) { calendar.prevMonth(); }
21715 }
21716 var dateYear = parseInt($dayEl.attr('data-year'), 10);
21717 var dateMonth = parseInt($dayEl.attr('data-month'), 10);
21718 var dateDay = parseInt($dayEl.attr('data-day'), 10);
21719 calendar.emit(
21720 'local::dayClick calendarDayClick',
21721 calendar,
21722 $dayEl[0],
21723 dateYear,
21724 dateMonth,
21725 dateDay
21726 );
21727 if (!$dayEl.hasClass('calendar-day-selected') || calendar.params.multiple || calendar.params.rangePicker) {
21728 calendar.addValue(new calendar.DateHandleClass(dateYear, dateMonth, dateDay, 0, 0, 0));
21729 }
21730 if (calendar.params.closeOnSelect) {
21731 if (
21732 (calendar.params.rangePicker && calendar.value.length === 2)
21733 || !calendar.params.rangePicker
21734 ) {
21735 calendar.close();
21736 }
21737 }
21738 }
21739
21740 function onNextMonthClick() {
21741 calendar.nextMonth();
21742 }
21743
21744 function onPrevMonthClick() {
21745 calendar.prevMonth();
21746 }
21747
21748 function onNextYearClick() {
21749 calendar.nextYear();
21750 }
21751
21752 function onPrevYearClick() {
21753 calendar.prevYear();
21754 }
21755
21756 var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
21757 // Selectors clicks
21758 $el.find('.calendar-prev-month-button').on('click', onPrevMonthClick);
21759 $el.find('.calendar-next-month-button').on('click', onNextMonthClick);
21760 $el.find('.calendar-prev-year-button').on('click', onPrevYearClick);
21761 $el.find('.calendar-next-year-button').on('click', onNextYearClick);
21762 // Day clicks
21763 $wrapperEl.on('click', handleDayClick);
21764 // Touch events
21765 {
21766 if (calendar.params.touchMove) {
21767 $wrapperEl.on(app.touchEvents.start, handleTouchStart, passiveListener);
21768 app.on('touchmove:active', handleTouchMove);
21769 app.on('touchend:passive', handleTouchEnd);
21770 }
21771 }
21772
21773 calendar.detachCalendarEvents = function detachCalendarEvents() {
21774 $el.find('.calendar-prev-month-button').off('click', onPrevMonthClick);
21775 $el.find('.calendar-next-month-button').off('click', onNextMonthClick);
21776 $el.find('.calendar-prev-year-button').off('click', onPrevYearClick);
21777 $el.find('.calendar-next-year-button').off('click', onNextYearClick);
21778 $wrapperEl.off('click', handleDayClick);
21779 {
21780 if (calendar.params.touchMove) {
21781 $wrapperEl.off(app.touchEvents.start, handleTouchStart, passiveListener);
21782 app.off('touchmove:active', handleTouchMove);
21783 app.off('touchend:passive', handleTouchEnd);
21784 }
21785 }
21786 };
21787 };
21788
21789 calendar.init();
21790
21791 return calendar;
21792 }
21793
21794 if ( Framework7Class$$1 ) Calendar.__proto__ = Framework7Class$$1;
21795 Calendar.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
21796 Calendar.prototype.constructor = Calendar;
21797 // eslint-disable-next-line
21798 Calendar.prototype.normalizeDate = function normalizeDate (date) {
21799 var calendar = this;
21800 var d = new calendar.DateHandleClass(date);
21801 return new calendar.DateHandleClass(d.getFullYear(), d.getMonth(), d.getDate());
21802 };
21803
21804 Calendar.prototype.normalizeValues = function normalizeValues (values) {
21805 var calendar = this;
21806 var newValues = [];
21807 if (values && Array.isArray(values)) {
21808 newValues = values.map(function (val) { return calendar.normalizeDate(val); });
21809 }
21810 return newValues;
21811 };
21812
21813 Calendar.prototype.initInput = function initInput () {
21814 var calendar = this;
21815 if (!calendar.$inputEl) { return; }
21816 if (calendar.params.inputReadOnly) { calendar.$inputEl.prop('readOnly', true); }
21817 };
21818
21819 Calendar.prototype.isPopover = function isPopover () {
21820 var calendar = this;
21821 var app = calendar.app;
21822 var modal = calendar.modal;
21823 var params = calendar.params;
21824 if (params.openIn === 'sheet') { return false; }
21825 if (modal && modal.type !== 'popover') { return false; }
21826
21827 if (!calendar.inline && calendar.inputEl) {
21828 if (params.openIn === 'popover') { return true; }
21829 if (app.device.ios) {
21830 return !!app.device.ipad;
21831 }
21832 if (app.width >= 768) {
21833 return true;
21834 }
21835 }
21836 return false;
21837 };
21838
21839 Calendar.prototype.formatDate = function formatDate (d) {
21840 var calendar = this;
21841 var date = new calendar.DateHandleClass(d);
21842 var year = date.getFullYear();
21843 var month = date.getMonth();
21844 var month1 = month + 1;
21845 var day = date.getDate();
21846 var weekDay = date.getDay();
21847 var ref = calendar.params;
21848 var dateFormat = ref.dateFormat;
21849 var monthNames = ref.monthNames;
21850 var monthNamesShort = ref.monthNamesShort;
21851 var dayNames = ref.dayNames;
21852 var dayNamesShort = ref.dayNamesShort;
21853
21854 return dateFormat
21855 .replace(/yyyy/g, year)
21856 .replace(/yy/g, String(year).substring(2))
21857 .replace(/mm/g, month1 < 10 ? ("0" + month1) : month1)
21858 .replace(/m(\W+)/g, (month1 + "$1"))
21859 .replace(/MM/g, monthNames[month])
21860 .replace(/M(\W+)/g, ((monthNamesShort[month]) + "$1"))
21861 .replace(/dd/g, day < 10 ? ("0" + day) : day)
21862 .replace(/d(\W+)/g, (day + "$1"))
21863 .replace(/DD/g, dayNames[weekDay])
21864 .replace(/D(\W+)/g, ((dayNamesShort[weekDay]) + "$1"));
21865 };
21866
21867 Calendar.prototype.formatValue = function formatValue () {
21868 var calendar = this;
21869 var value = calendar.value;
21870 if (calendar.params.formatValue) {
21871 return calendar.params.formatValue.call(calendar, value);
21872 }
21873 return value
21874 .map(function (v) { return calendar.formatDate(v); })
21875 .join(calendar.params.rangePicker ? ' - ' : ', ');
21876 };
21877
21878 Calendar.prototype.addValue = function addValue (newValue) {
21879 var calendar = this;
21880 var ref = calendar.params;
21881 var multiple = ref.multiple;
21882 var rangePicker = ref.rangePicker;
21883 var rangePickerMinDays = ref.rangePickerMinDays;
21884 var rangePickerMaxDays = ref.rangePickerMaxDays;
21885 if (multiple) {
21886 if (!calendar.value) { calendar.value = []; }
21887 var inValuesIndex;
21888 for (var i = 0; i < calendar.value.length; i += 1) {
21889 if (new calendar.DateHandleClass(newValue).getTime() === new calendar.DateHandleClass(calendar.value[i]).getTime()) {
21890 inValuesIndex = i;
21891 }
21892 }
21893 if (typeof inValuesIndex === 'undefined') {
21894 calendar.value.push(newValue);
21895 } else {
21896 calendar.value.splice(inValuesIndex, 1);
21897 }
21898 calendar.updateValue();
21899 } else if (rangePicker) {
21900 if (!calendar.value) { calendar.value = []; }
21901 if (calendar.value.length === 2 || calendar.value.length === 0) {
21902 calendar.value = [];
21903 }
21904
21905 if ((calendar.value.length === 0
21906 || ((Math.abs(calendar.value[0].getTime() - newValue.getTime()) >= (rangePickerMinDays - 1) * 60 * 60 * 24 * 1000) && (rangePickerMaxDays === 0 || Math.abs(calendar.value[0].getTime() - newValue.getTime()) <= (rangePickerMaxDays - 1) * 60 * 60 * 24 * 1000)))) { calendar.value.push(newValue); }
21907 else { calendar.value = []; }
21908
21909 calendar.value.sort(function (a, b) { return a - b; });
21910 calendar.updateValue();
21911 } else {
21912 calendar.value = [newValue];
21913 calendar.updateValue();
21914 }
21915 };
21916
21917 Calendar.prototype.setValue = function setValue (values) {
21918 var calendar = this;
21919 calendar.value = values;
21920 calendar.updateValue();
21921 };
21922
21923 Calendar.prototype.getValue = function getValue () {
21924 var calendar = this;
21925 return calendar.value;
21926 };
21927
21928 Calendar.prototype.updateValue = function updateValue (onlyHeader) {
21929 var calendar = this;
21930 var $el = calendar.$el;
21931 var $wrapperEl = calendar.$wrapperEl;
21932 var $inputEl = calendar.$inputEl;
21933 var value = calendar.value;
21934 var params = calendar.params;
21935 var i;
21936 if ($el && $el.length > 0) {
21937 $wrapperEl.find('.calendar-day-selected').removeClass('calendar-day-selected');
21938 var valueDate;
21939 if (params.rangePicker && value.length === 2) {
21940 for (i = new calendar.DateHandleClass(value[0]).getTime(); i <= new calendar.DateHandleClass(value[1]).getTime(); i += 24 * 60 * 60 * 1000) {
21941 valueDate = new calendar.DateHandleClass(i);
21942 $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
21943 }
21944 } else {
21945 for (i = 0; i < calendar.value.length; i += 1) {
21946 valueDate = new calendar.DateHandleClass(value[i]);
21947 $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
21948 }
21949 }
21950 }
21951 if (!onlyHeader) {
21952 calendar.emit('local::change calendarChange', calendar, value);
21953 }
21954
21955
21956 if (($inputEl && $inputEl.length) || params.header) {
21957 var inputValue = calendar.formatValue(value);
21958 if (params.header && $el && $el.length) {
21959 $el.find('.calendar-selected-date').text(inputValue);
21960 }
21961 if ($inputEl && $inputEl.length && !onlyHeader) {
21962 $inputEl.val(inputValue);
21963 $inputEl.trigger('change');
21964 }
21965 }
21966 };
21967
21968 Calendar.prototype.updateCurrentMonthYear = function updateCurrentMonthYear (dir) {
21969 var calendar = this;
21970 var $months = calendar.$months;
21971 var $el = calendar.$el;
21972 var params = calendar.params;
21973 if (typeof dir === 'undefined') {
21974 calendar.currentMonth = parseInt($months.eq(1).attr('data-month'), 10);
21975 calendar.currentYear = parseInt($months.eq(1).attr('data-year'), 10);
21976 } else {
21977 calendar.currentMonth = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-month'), 10);
21978 calendar.currentYear = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-year'), 10);
21979 }
21980 $el.find('.current-month-value').text(params.monthNames[calendar.currentMonth]);
21981 $el.find('.current-year-value').text(calendar.currentYear);
21982 };
21983
21984 Calendar.prototype.update = function update () {
21985 var calendar = this;
21986 var currentYear = calendar.currentYear;
21987 var currentMonth = calendar.currentMonth;
21988 var $wrapperEl = calendar.$wrapperEl;
21989 var currentDate = new calendar.DateHandleClass(currentYear, currentMonth);
21990 var prevMonthHtml = calendar.renderMonth(currentDate, 'prev');
21991 var currentMonthHtml = calendar.renderMonth(currentDate);
21992 var nextMonthHtml = calendar.renderMonth(currentDate, 'next');
21993
21994 $wrapperEl
21995 .transition(0)
21996 .html(("" + prevMonthHtml + currentMonthHtml + nextMonthHtml))
21997 .transform('translate3d(0,0,0)');
21998 calendar.$months = $wrapperEl.find('.calendar-month');
21999 calendar.monthsTranslate = 0;
22000 calendar.setMonthsTranslate();
22001 calendar.$months.each(function (index, monthEl) {
22002 calendar.emit(
22003 'local::monthAdd calendarMonthAdd',
22004 monthEl
22005 );
22006 });
22007 };
22008
22009 Calendar.prototype.onMonthChangeStart = function onMonthChangeStart (dir) {
22010 var calendar = this;
22011 var $months = calendar.$months;
22012 var currentYear = calendar.currentYear;
22013 var currentMonth = calendar.currentMonth;
22014 calendar.updateCurrentMonthYear(dir);
22015 $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
22016 var currentIndex = dir === 'next' ? $months.length - 1 : 0;
22017
22018 $months.eq(currentIndex).addClass('calendar-month-current');
22019 $months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'calendar-month-prev' : 'calendar-month-next');
22020
22021 calendar.emit(
22022 'local::monthYearChangeStart calendarMonthYearChangeStart',
22023 calendar,
22024 currentYear,
22025 currentMonth
22026 );
22027 };
22028
22029 Calendar.prototype.onMonthChangeEnd = function onMonthChangeEnd (dir, rebuildBoth) {
22030 var calendar = this;
22031 var currentYear = calendar.currentYear;
22032 var currentMonth = calendar.currentMonth;
22033 var $wrapperEl = calendar.$wrapperEl;
22034 var monthsTranslate = calendar.monthsTranslate;
22035 calendar.animating = false;
22036 var nextMonthHtml;
22037 var prevMonthHtml;
22038 var currentMonthHtml;
22039 $wrapperEl
22040 .find('.calendar-month:not(.calendar-month-prev):not(.calendar-month-current):not(.calendar-month-next)')
22041 .remove();
22042
22043 if (typeof dir === 'undefined') {
22044 dir = 'next'; // eslint-disable-line
22045 rebuildBoth = true; // eslint-disable-line
22046 }
22047 if (!rebuildBoth) {
22048 currentMonthHtml = calendar.renderMonth(new calendar.DateHandleClass(currentYear, currentMonth), dir);
22049 } else {
22050 $wrapperEl.find('.calendar-month-next, .calendar-month-prev').remove();
22051 prevMonthHtml = calendar.renderMonth(new calendar.DateHandleClass(currentYear, currentMonth), 'prev');
22052 nextMonthHtml = calendar.renderMonth(new calendar.DateHandleClass(currentYear, currentMonth), 'next');
22053 }
22054 if (dir === 'next' || rebuildBoth) {
22055 $wrapperEl.append(currentMonthHtml || nextMonthHtml);
22056 }
22057 if (dir === 'prev' || rebuildBoth) {
22058 $wrapperEl.prepend(currentMonthHtml || prevMonthHtml);
22059 }
22060 var $months = $wrapperEl.find('.calendar-month');
22061 calendar.$months = $months;
22062 calendar.setMonthsTranslate(monthsTranslate);
22063 calendar.emit(
22064 'local::monthAdd calendarMonthAdd',
22065 calendar,
22066 dir === 'next' ? $months.eq($months.length - 1)[0] : $months.eq(0)[0]
22067 );
22068 calendar.emit(
22069 'local::monthYearChangeEnd calendarMonthYearChangeEnd',
22070 calendar,
22071 currentYear,
22072 currentMonth
22073 );
22074 };
22075
22076 Calendar.prototype.setMonthsTranslate = function setMonthsTranslate (translate) {
22077 var calendar = this;
22078 var $months = calendar.$months;
22079 var isH = calendar.isHorizontal;
22080 var inverter = calendar.inverter;
22081 // eslint-disable-next-line
22082 translate = translate || calendar.monthsTranslate || 0;
22083 if (typeof calendar.monthsTranslate === 'undefined') {
22084 calendar.monthsTranslate = translate;
22085 }
22086 $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
22087 var prevMonthTranslate = -(translate + 1) * 100 * inverter;
22088 var currentMonthTranslate = -translate * 100 * inverter;
22089 var nextMonthTranslate = -(translate - 1) * 100 * inverter;
22090 $months.eq(0)
22091 .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
22092 .addClass('calendar-month-prev');
22093 $months.eq(1)
22094 .transform(("translate3d(" + (isH ? currentMonthTranslate : 0) + "%, " + (isH ? 0 : currentMonthTranslate) + "%, 0)"))
22095 .addClass('calendar-month-current');
22096 $months.eq(2)
22097 .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
22098 .addClass('calendar-month-next');
22099 };
22100
22101 Calendar.prototype.nextMonth = function nextMonth (transition) {
22102 var calendar = this;
22103 var params = calendar.params;
22104 var $wrapperEl = calendar.$wrapperEl;
22105 var inverter = calendar.inverter;
22106 var isH = calendar.isHorizontal;
22107 if (typeof transition === 'undefined' || typeof transition === 'object') {
22108 transition = ''; // eslint-disable-line
22109 if (!params.animate) { transition = 0; } // eslint-disable-line
22110 }
22111 var nextMonth = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-month'), 10);
22112 var nextYear = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-year'), 10);
22113 var nextDate = new calendar.DateHandleClass(nextYear, nextMonth);
22114 var nextDateTime = nextDate.getTime();
22115 var transitionEndCallback = !calendar.animating;
22116 if (params.maxDate) {
22117 if (nextDateTime > new calendar.DateHandleClass(params.maxDate).getTime()) {
22118 calendar.resetMonth();
22119 return;
22120 }
22121 }
22122 calendar.monthsTranslate -= 1;
22123 if (nextMonth === calendar.currentMonth) {
22124 var nextMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
22125 var nextMonthHtml = $(calendar.renderMonth(nextDateTime, 'next'))
22126 .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
22127 .addClass('calendar-month-next');
22128 $wrapperEl.append(nextMonthHtml[0]);
22129 calendar.$months = $wrapperEl.find('.calendar-month');
22130 calendar.emit(
22131 'local::monthAdd calendarMonthAdd',
22132 calendar.$months.eq(calendar.$months.length - 1)[0]
22133 );
22134 }
22135 calendar.animating = true;
22136 calendar.onMonthChangeStart('next');
22137 var translate = (calendar.monthsTranslate * 100) * inverter;
22138
22139 $wrapperEl.transition(transition).transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
22140 if (transitionEndCallback) {
22141 $wrapperEl.transitionEnd(function () {
22142 calendar.onMonthChangeEnd('next');
22143 });
22144 }
22145 if (!params.animate) {
22146 calendar.onMonthChangeEnd('next');
22147 }
22148 };
22149
22150 Calendar.prototype.prevMonth = function prevMonth (transition) {
22151 var calendar = this;
22152 var params = calendar.params;
22153 var $wrapperEl = calendar.$wrapperEl;
22154 var inverter = calendar.inverter;
22155 var isH = calendar.isHorizontal;
22156 if (typeof transition === 'undefined' || typeof transition === 'object') {
22157 transition = ''; // eslint-disable-line
22158 if (!params.animate) { transition = 0; } // eslint-disable-line
22159 }
22160 var prevMonth = parseInt(calendar.$months.eq(0).attr('data-month'), 10);
22161 var prevYear = parseInt(calendar.$months.eq(0).attr('data-year'), 10);
22162 var prevDate = new calendar.DateHandleClass(prevYear, prevMonth + 1, -1);
22163 var prevDateTime = prevDate.getTime();
22164 var transitionEndCallback = !calendar.animating;
22165 if (params.minDate) {
22166 var minDate = new calendar.DateHandleClass(params.minDate);
22167 minDate = new calendar.DateHandleClass(minDate.getFullYear(), minDate.getMonth(), 1);
22168 if (prevDateTime < minDate.getTime()) {
22169 calendar.resetMonth();
22170 return;
22171 }
22172 }
22173 calendar.monthsTranslate += 1;
22174 if (prevMonth === calendar.currentMonth) {
22175 var prevMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
22176 var prevMonthHtml = $(calendar.renderMonth(prevDateTime, 'prev'))
22177 .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
22178 .addClass('calendar-month-prev');
22179 $wrapperEl.prepend(prevMonthHtml[0]);
22180 calendar.$months = $wrapperEl.find('.calendar-month');
22181 calendar.emit(
22182 'local::monthAdd calendarMonthAdd',
22183 calendar.$months.eq(0)[0]
22184 );
22185 }
22186 calendar.animating = true;
22187 calendar.onMonthChangeStart('prev');
22188 var translate = (calendar.monthsTranslate * 100) * inverter;
22189 $wrapperEl
22190 .transition(transition)
22191 .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
22192 if (transitionEndCallback) {
22193 $wrapperEl.transitionEnd(function () {
22194 calendar.onMonthChangeEnd('prev');
22195 });
22196 }
22197 if (!params.animate) {
22198 calendar.onMonthChangeEnd('prev');
22199 }
22200 };
22201
22202 Calendar.prototype.resetMonth = function resetMonth (transition) {
22203 if ( transition === void 0 ) transition = '';
22204
22205 var calendar = this;
22206 var $wrapperEl = calendar.$wrapperEl;
22207 var inverter = calendar.inverter;
22208 var isH = calendar.isHorizontal;
22209 var monthsTranslate = calendar.monthsTranslate;
22210 var translate = (monthsTranslate * 100) * inverter;
22211 $wrapperEl
22212 .transition(transition)
22213 .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
22214 };
22215 // eslint-disable-next-line
22216 Calendar.prototype.setYearMonth = function setYearMonth (year, month, transition) {
22217 var calendar = this;
22218 var params = calendar.params;
22219 var isH = calendar.isHorizontal;
22220 var $wrapperEl = calendar.$wrapperEl;
22221 var inverter = calendar.inverter;
22222 // eslint-disable-next-line
22223 if (typeof year === 'undefined') { year = calendar.currentYear; }
22224 // eslint-disable-next-line
22225 if (typeof month === 'undefined') { month = calendar.currentMonth; }
22226 if (typeof transition === 'undefined' || typeof transition === 'object') {
22227 // eslint-disable-next-line
22228 transition = '';
22229 // eslint-disable-next-line
22230 if (!params.animate) { transition = 0; }
22231 }
22232 var targetDate;
22233 if (year < calendar.currentYear) {
22234 targetDate = new calendar.DateHandleClass(year, month + 1, -1).getTime();
22235 } else {
22236 targetDate = new calendar.DateHandleClass(year, month).getTime();
22237 }
22238 if (params.maxDate && targetDate > new calendar.DateHandleClass(params.maxDate).getTime()) {
22239 return false;
22240 }
22241 if (params.minDate) {
22242 var minDate = new calendar.DateHandleClass(params.minDate);
22243 minDate = new calendar.DateHandleClass(minDate.getFullYear(), minDate.getMonth(), 1);
22244 if (targetDate < minDate.getTime()) {
22245 return false;
22246 }
22247 }
22248 var currentDate = new calendar.DateHandleClass(calendar.currentYear, calendar.currentMonth).getTime();
22249 var dir = targetDate > currentDate ? 'next' : 'prev';
22250 var newMonthHTML = calendar.renderMonth(new calendar.DateHandleClass(year, month));
22251 calendar.monthsTranslate = calendar.monthsTranslate || 0;
22252 var prevTranslate = calendar.monthsTranslate;
22253 var monthTranslate;
22254 var transitionEndCallback = !calendar.animating;
22255 if (targetDate > currentDate) {
22256 // To next
22257 calendar.monthsTranslate -= 1;
22258 if (!calendar.animating) { calendar.$months.eq(calendar.$months.length - 1).remove(); }
22259 $wrapperEl.append(newMonthHTML);
22260 calendar.$months = $wrapperEl.find('.calendar-month');
22261 monthTranslate = -(prevTranslate - 1) * 100 * inverter;
22262 calendar.$months
22263 .eq(calendar.$months.length - 1)
22264 .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
22265 .addClass('calendar-month-next');
22266 } else {
22267 // To prev
22268 calendar.monthsTranslate += 1;
22269 if (!calendar.animating) { calendar.$months.eq(0).remove(); }
22270 $wrapperEl.prepend(newMonthHTML);
22271 calendar.$months = $wrapperEl.find('.calendar-month');
22272 monthTranslate = -(prevTranslate + 1) * 100 * inverter;
22273 calendar.$months
22274 .eq(0)
22275 .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
22276 .addClass('calendar-month-prev');
22277 }
22278 calendar.emit(
22279 'local::monthAdd calendarMonthAdd',
22280 dir === 'next'
22281 ? calendar.$months.eq(calendar.$months.length - 1)[0]
22282 : calendar.$months.eq(0)[0]
22283 );
22284
22285 calendar.animating = true;
22286 calendar.onMonthChangeStart(dir);
22287 var wrapperTranslate = (calendar.monthsTranslate * 100) * inverter;
22288 $wrapperEl
22289 .transition(transition)
22290 .transform(("translate3d(" + (isH ? wrapperTranslate : 0) + "%, " + (isH ? 0 : wrapperTranslate) + "%, 0)"));
22291 if (transitionEndCallback) {
22292 $wrapperEl.transitionEnd(function () {
22293 calendar.onMonthChangeEnd(dir, true);
22294 });
22295 }
22296 if (!params.animate) {
22297 calendar.onMonthChangeEnd(dir);
22298 }
22299 };
22300
22301 Calendar.prototype.nextYear = function nextYear () {
22302 var calendar = this;
22303 calendar.setYearMonth(calendar.currentYear + 1);
22304 };
22305
22306 Calendar.prototype.prevYear = function prevYear () {
22307 var calendar = this;
22308 calendar.setYearMonth(calendar.currentYear - 1);
22309 };
22310 // eslint-disable-next-line
22311 Calendar.prototype.dateInRange = function dateInRange (dayDate, range) {
22312 var calendar = this;
22313 var match = false;
22314 var i;
22315 if (!range) { return false; }
22316 if (Array.isArray(range)) {
22317 for (i = 0; i < range.length; i += 1) {
22318 if (range[i].from || range[i].to) {
22319 if (range[i].from && range[i].to) {
22320 if ((dayDate <= new calendar.DateHandleClass(range[i].to).getTime()) && (dayDate >= new calendar.DateHandleClass(range[i].from).getTime())) {
22321 match = true;
22322 }
22323 } else if (range[i].from) {
22324 if (dayDate >= new calendar.DateHandleClass(range[i].from).getTime()) {
22325 match = true;
22326 }
22327 } else if (range[i].to) {
22328 if (dayDate <= new calendar.DateHandleClass(range[i].to).getTime()) {
22329 match = true;
22330 }
22331 }
22332 } else if (range[i].date) {
22333 if (dayDate === new calendar.DateHandleClass(range[i].date).getTime()) {
22334 match = true;
22335 }
22336 } else if (dayDate === new calendar.DateHandleClass(range[i]).getTime()) {
22337 match = true;
22338 }
22339 }
22340 } else if (range.from || range.to) {
22341 if (range.from && range.to) {
22342 if ((dayDate <= new calendar.DateHandleClass(range.to).getTime()) && (dayDate >= new calendar.DateHandleClass(range.from).getTime())) {
22343 match = true;
22344 }
22345 } else if (range.from) {
22346 if (dayDate >= new calendar.DateHandleClass(range.from).getTime()) {
22347 match = true;
22348 }
22349 } else if (range.to) {
22350 if (dayDate <= new calendar.DateHandleClass(range.to).getTime()) {
22351 match = true;
22352 }
22353 }
22354 } else if (range.date) {
22355 match = dayDate === new calendar.DateHandleClass(range.date).getTime();
22356 } else if (typeof range === 'function') {
22357 match = range(new calendar.DateHandleClass(dayDate));
22358 }
22359 return match;
22360 };
22361 // eslint-disable-next-line
22362 Calendar.prototype.daysInMonth = function daysInMonth (date) {
22363 var calendar = this;
22364 var d = new calendar.DateHandleClass(date);
22365 return new calendar.DateHandleClass(d.getFullYear(), d.getMonth() + 1, 0).getDate();
22366 };
22367
22368 Calendar.prototype.renderMonths = function renderMonths (date) {
22369 var calendar = this;
22370 if (calendar.params.renderMonths) {
22371 return calendar.params.renderMonths.call(calendar, date);
22372 }
22373 return ("\n <div class=\"calendar-months-wrapper\">\n " + (calendar.renderMonth(date, 'prev')) + "\n " + (calendar.renderMonth(date)) + "\n " + (calendar.renderMonth(date, 'next')) + "\n </div>\n ").trim();
22374 };
22375
22376 Calendar.prototype.renderMonth = function renderMonth (d, offset) {
22377 var calendar = this;
22378 var params = calendar.params;
22379 var value = calendar.value;
22380 if (params.renderMonth) {
22381 return params.renderMonth.call(calendar, d, offset);
22382 }
22383 var date = new calendar.DateHandleClass(d);
22384 var year = date.getFullYear();
22385 var month = date.getMonth();
22386
22387 if (offset === 'next') {
22388 if (month === 11) { date = new calendar.DateHandleClass(year + 1, 0); }
22389 else { date = new calendar.DateHandleClass(year, month + 1, 1); }
22390 }
22391 if (offset === 'prev') {
22392 if (month === 0) { date = new calendar.DateHandleClass(year - 1, 11); }
22393 else { date = new calendar.DateHandleClass(year, month - 1, 1); }
22394 }
22395 if (offset === 'next' || offset === 'prev') {
22396 month = date.getMonth();
22397 year = date.getFullYear();
22398 }
22399
22400 var currentValues = [];
22401 var today = new calendar.DateHandleClass().setHours(0, 0, 0, 0);
22402 var minDate = params.minDate ? new calendar.DateHandleClass(params.minDate).getTime() : null;
22403 var maxDate = params.maxDate ? new calendar.DateHandleClass(params.maxDate).getTime() : null;
22404 var rows = 6;
22405 var cols = 7;
22406 var daysInPrevMonth = calendar.daysInMonth(new calendar.DateHandleClass(date.getFullYear(), date.getMonth()).getTime() - (10 * 24 * 60 * 60 * 1000));
22407 var daysInMonth = calendar.daysInMonth(date);
22408 var minDayNumber = params.firstDay === 6 ? 0 : 1;
22409
22410 var monthHtml = '';
22411 var dayIndex = 0 + (params.firstDay - 1);
22412 var disabled;
22413 var hasEvents;
22414 var firstDayOfMonthIndex = new calendar.DateHandleClass(date.getFullYear(), date.getMonth()).getDay();
22415 if (firstDayOfMonthIndex === 0) { firstDayOfMonthIndex = 7; }
22416
22417 if (value && value.length) {
22418 for (var i = 0; i < value.length; i += 1) {
22419 currentValues.push(new calendar.DateHandleClass(value[i]).setHours(0, 0, 0, 0));
22420 }
22421 }
22422
22423 for (var row = 1; row <= rows; row += 1) {
22424 var rowHtml = '';
22425 var loop = function ( col ) {
22426 dayIndex += 1;
22427 var dayDate = (void 0);
22428 var dayNumber = dayIndex - firstDayOfMonthIndex;
22429 var addClass = '';
22430 if (row === 1 && col === 1 && dayNumber > minDayNumber && params.firstDay !== 1) {
22431 dayIndex -= 7;
22432 dayNumber = dayIndex - firstDayOfMonthIndex;
22433 }
22434
22435 var weekDayIndex = ((col - 1) + params.firstDay > 6)
22436 ? ((col - 1 - 7) + params.firstDay)
22437 : ((col - 1) + params.firstDay);
22438
22439 if (dayNumber < 0) {
22440 dayNumber = daysInPrevMonth + dayNumber + 1;
22441 addClass += ' calendar-day-prev';
22442 dayDate = new calendar.DateHandleClass(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime();
22443 } else {
22444 dayNumber += 1;
22445 if (dayNumber > daysInMonth) {
22446 dayNumber -= daysInMonth;
22447 addClass += ' calendar-day-next';
22448 dayDate = new calendar.DateHandleClass(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime();
22449 } else {
22450 dayDate = new calendar.DateHandleClass(year, month, dayNumber).getTime();
22451 }
22452 }
22453 // Today
22454 if (dayDate === today) { addClass += ' calendar-day-today'; }
22455
22456 // Selected
22457 if (params.rangePicker && currentValues.length === 2) {
22458 if (dayDate >= currentValues[0] && dayDate <= currentValues[1]) { addClass += ' calendar-day-selected'; }
22459 } else if (currentValues.indexOf(dayDate) >= 0) { addClass += ' calendar-day-selected'; }
22460 // Weekend
22461 if (params.weekendDays.indexOf(weekDayIndex) >= 0) {
22462 addClass += ' calendar-day-weekend';
22463 }
22464 // Events
22465 var eventsHtml = '';
22466 hasEvents = false;
22467 if (params.events) {
22468 if (calendar.dateInRange(dayDate, params.events)) {
22469 hasEvents = true;
22470 }
22471 }
22472 if (hasEvents) {
22473 addClass += ' calendar-day-has-events';
22474 eventsHtml = "\n <span class=\"calendar-day-events\">\n <span class=\"calendar-day-event\"></span>\n </span>\n ";
22475 if (Array.isArray(params.events)) {
22476 var eventDots = [];
22477 params.events.forEach(function (ev) {
22478 var color = ev.color || '';
22479 if (eventDots.indexOf(color) < 0 && calendar.dateInRange(dayDate, ev)) {
22480 eventDots.push(color);
22481 }
22482 });
22483 eventsHtml = "\n <span class=\"calendar-day-events\">\n " + (eventDots.map(function (color) { return ("\n <span class=\"calendar-day-event\" style=\"" + (color ? ("background-color: " + color) : '') + "\"></span>\n ").trim(); }).join('')) + "\n </span>\n ";
22484 }
22485 }
22486 // Custom Ranges
22487 if (params.rangesClasses) {
22488 for (var k = 0; k < params.rangesClasses.length; k += 1) {
22489 if (calendar.dateInRange(dayDate, params.rangesClasses[k].range)) {
22490 addClass += " " + (params.rangesClasses[k].cssClass);
22491 }
22492 }
22493 }
22494 // Disabled
22495 disabled = false;
22496 if ((minDate && dayDate < minDate) || (maxDate && dayDate > maxDate)) {
22497 disabled = true;
22498 }
22499 if (params.disabled) {
22500 if (calendar.dateInRange(dayDate, params.disabled)) {
22501 disabled = true;
22502 }
22503 }
22504 if (disabled) {
22505 addClass += ' calendar-day-disabled';
22506 }
22507
22508 dayDate = new calendar.DateHandleClass(dayDate);
22509 var dayYear = dayDate.getFullYear();
22510 var dayMonth = dayDate.getMonth();
22511 rowHtml += ("\n <div data-year=\"" + dayYear + "\" data-month=\"" + dayMonth + "\" data-day=\"" + dayNumber + "\" class=\"calendar-day" + addClass + "\" data-date=\"" + dayYear + "-" + dayMonth + "-" + dayNumber + "\">\n <span class=\"calendar-day-number\">" + dayNumber + eventsHtml + "</span>\n </div>").trim();
22512 };
22513
22514 for (var col = 1; col <= cols; col += 1) loop( col );
22515 monthHtml += "<div class=\"calendar-row\">" + rowHtml + "</div>";
22516 }
22517 monthHtml = "<div class=\"calendar-month\" data-year=\"" + year + "\" data-month=\"" + month + "\">" + monthHtml + "</div>";
22518 return monthHtml;
22519 };
22520
22521 Calendar.prototype.renderWeekHeader = function renderWeekHeader () {
22522 var calendar = this;
22523 if (calendar.params.renderWeekHeader) {
22524 return calendar.params.renderWeekHeader.call(calendar);
22525 }
22526 var params = calendar.params;
22527 var weekDaysHtml = '';
22528 for (var i = 0; i < 7; i += 1) {
22529 var dayIndex = (i + params.firstDay > 6)
22530 ? ((i - 7) + params.firstDay)
22531 : (i + params.firstDay);
22532 var dayName = params.dayNamesShort[dayIndex];
22533 weekDaysHtml += "<div class=\"calendar-week-day\">" + dayName + "</div>";
22534 }
22535 return ("\n <div class=\"calendar-week-header\">\n " + weekDaysHtml + "\n </div>\n ").trim();
22536 };
22537
22538 Calendar.prototype.renderMonthSelector = function renderMonthSelector () {
22539 var calendar = this;
22540 if (calendar.params.renderMonthSelector) {
22541 return calendar.params.renderMonthSelector.call(calendar);
22542 }
22543
22544 return "\n <div class=\"calendar-month-selector\">\n <a href=\"#\" class=\"link icon-only calendar-prev-month-button\">\n <i class=\"icon icon-prev\"></i>\n </a>\n <span class=\"current-month-value\"></span>\n <a href=\"#\" class=\"link icon-only calendar-next-month-button\">\n <i class=\"icon icon-next\"></i>\n </a>\n </div>\n ".trim();
22545 };
22546
22547 Calendar.prototype.renderYearSelector = function renderYearSelector () {
22548 var calendar = this;
22549 if (calendar.params.renderYearSelector) {
22550 return calendar.params.renderYearSelector.call(calendar);
22551 }
22552 return "\n <div class=\"calendar-year-selector\">\n <a href=\"#\" class=\"link icon-only calendar-prev-year-button\">\n <i class=\"icon icon-prev\"></i>\n </a>\n <span class=\"current-year-value\"></span>\n <a href=\"#\" class=\"link icon-only calendar-next-year-button\">\n <i class=\"icon icon-next\"></i>\n </a>\n </div>\n ".trim();
22553 };
22554
22555 Calendar.prototype.renderHeader = function renderHeader () {
22556 var calendar = this;
22557 if (calendar.params.renderHeader) {
22558 return calendar.params.renderHeader.call(calendar);
22559 }
22560 return ("\n <div class=\"calendar-header\">\n <div class=\"calendar-selected-date\">" + (calendar.params.headerPlaceholder) + "</div>\n </div>\n ").trim();
22561 };
22562
22563 Calendar.prototype.renderFooter = function renderFooter () {
22564 var calendar = this;
22565 var app = calendar.app;
22566 if (calendar.params.renderFooter) {
22567 return calendar.params.renderFooter.call(calendar);
22568 }
22569 return ("\n <div class=\"calendar-footer\">\n <a href=\"#\" class=\"" + (app.theme === 'md' ? 'button' : 'link') + " calendar-close sheet-close popover-close\">" + (calendar.params.toolbarCloseText) + "</a>\n </div>\n ").trim();
22570 };
22571
22572 Calendar.prototype.renderToolbar = function renderToolbar () {
22573 var calendar = this;
22574 if (calendar.params.renderToolbar) {
22575 return calendar.params.renderToolbar.call(calendar, calendar);
22576 }
22577 return ("\n <div class=\"toolbar toolbar-top no-shadow\">\n <div class=\"toolbar-inner\">\n " + (calendar.renderMonthSelector()) + "\n " + (calendar.renderYearSelector()) + "\n </div>\n </div>\n ").trim();
22578 };
22579 // eslint-disable-next-line
22580 Calendar.prototype.renderInline = function renderInline () {
22581 var calendar = this;
22582 var ref = calendar.params;
22583 var cssClass = ref.cssClass;
22584 var toolbar = ref.toolbar;
22585 var header = ref.header;
22586 var footer = ref.footer;
22587 var rangePicker = ref.rangePicker;
22588 var weekHeader = ref.weekHeader;
22589 var value = calendar.value;
22590 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
22591 var inlineHtml = ("\n <div class=\"calendar calendar-inline " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div class=\"calendar-months\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n ").trim();
22592
22593 return inlineHtml;
22594 };
22595
22596 Calendar.prototype.renderCustomModal = function renderCustomModal () {
22597 var calendar = this;
22598 var ref = calendar.params;
22599 var cssClass = ref.cssClass;
22600 var toolbar = ref.toolbar;
22601 var header = ref.header;
22602 var footer = ref.footer;
22603 var rangePicker = ref.rangePicker;
22604 var weekHeader = ref.weekHeader;
22605 var value = calendar.value;
22606 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
22607 var sheetHtml = ("\n <div class=\"calendar calendar-modal " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div class=\"calendar-months\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n ").trim();
22608
22609 return sheetHtml;
22610 };
22611
22612 Calendar.prototype.renderSheet = function renderSheet () {
22613 var calendar = this;
22614 var ref = calendar.params;
22615 var cssClass = ref.cssClass;
22616 var toolbar = ref.toolbar;
22617 var header = ref.header;
22618 var footer = ref.footer;
22619 var rangePicker = ref.rangePicker;
22620 var weekHeader = ref.weekHeader;
22621 var value = calendar.value;
22622 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
22623 var sheetHtml = ("\n <div class=\"sheet-modal calendar calendar-sheet " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div class=\"sheet-modal-inner calendar-months\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n ").trim();
22624
22625 return sheetHtml;
22626 };
22627
22628 Calendar.prototype.renderPopover = function renderPopover () {
22629 var calendar = this;
22630 var ref = calendar.params;
22631 var cssClass = ref.cssClass;
22632 var toolbar = ref.toolbar;
22633 var header = ref.header;
22634 var footer = ref.footer;
22635 var rangePicker = ref.rangePicker;
22636 var weekHeader = ref.weekHeader;
22637 var value = calendar.value;
22638 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
22639 var popoverHtml = ("\n <div class=\"popover calendar-popover\">\n <div class=\"popover-inner\">\n <div class=\"calendar " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div class=\"calendar-months\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n </div>\n </div>\n ").trim();
22640
22641 return popoverHtml;
22642 };
22643
22644 Calendar.prototype.render = function render () {
22645 var calendar = this;
22646 var params = calendar.params;
22647 if (params.render) { return params.render.call(calendar); }
22648 if (!calendar.inline) {
22649 var modalType = params.openIn;
22650 if (modalType === 'auto') { modalType = calendar.isPopover() ? 'popover' : 'sheet'; }
22651
22652 if (modalType === 'popover') { return calendar.renderPopover(); }
22653 if (modalType === 'sheet') { return calendar.renderSheet(); }
22654 return calendar.renderCustomModal();
22655 }
22656 return calendar.renderInline();
22657 };
22658
22659 Calendar.prototype.onOpen = function onOpen () {
22660 var calendar = this;
22661 var initialized = calendar.initialized;
22662 var $el = calendar.$el;
22663 var app = calendar.app;
22664 var $inputEl = calendar.$inputEl;
22665 var inline = calendar.inline;
22666 var value = calendar.value;
22667 var params = calendar.params;
22668 calendar.closing = false;
22669 calendar.opened = true;
22670 calendar.opening = true;
22671
22672 // Init main events
22673 calendar.attachCalendarEvents();
22674
22675 var updateValue = !value && params.value;
22676
22677 // Set value
22678 if (!initialized) {
22679 if (value) { calendar.setValue(value, 0); }
22680 else if (params.value) {
22681 calendar.setValue(calendar.normalizeValues(params.value), 0);
22682 }
22683 } else if (value) {
22684 calendar.setValue(value, 0);
22685 }
22686
22687 // Update current month and year
22688 calendar.updateCurrentMonthYear();
22689
22690 // Set initial translate
22691 calendar.monthsTranslate = 0;
22692 calendar.setMonthsTranslate();
22693
22694 // Update input value
22695 if (updateValue) { calendar.updateValue(); }
22696 else if (params.header && value) {
22697 calendar.updateValue(true);
22698 }
22699
22700 // Extra focus
22701 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
22702 $inputEl.trigger('focus');
22703 }
22704
22705 calendar.initialized = true;
22706
22707 calendar.$months.each(function (index, monthEl) {
22708 calendar.emit('local::monthAdd calendarMonthAdd', monthEl);
22709 });
22710
22711 // Trigger events
22712 if ($el) {
22713 $el.trigger('calendar:open', calendar);
22714 }
22715 if ($inputEl) {
22716 $inputEl.trigger('calendar:open', calendar);
22717 }
22718 calendar.emit('local::open calendarOpen', calendar);
22719 };
22720
22721 Calendar.prototype.onOpened = function onOpened () {
22722 var calendar = this;
22723 calendar.opening = false;
22724 if (calendar.$el) {
22725 calendar.$el.trigger('calendar:opened', calendar);
22726 }
22727 if (calendar.$inputEl) {
22728 calendar.$inputEl.trigger('calendar:opened', calendar);
22729 }
22730 calendar.emit('local::opened calendarOpened', calendar);
22731 };
22732
22733 Calendar.prototype.onClose = function onClose () {
22734 var calendar = this;
22735 var app = calendar.app;
22736 calendar.opening = false;
22737 calendar.closing = true;
22738
22739 if (calendar.$inputEl && app.theme === 'md') {
22740 calendar.$inputEl.trigger('blur');
22741 }
22742 if (calendar.detachCalendarEvents) {
22743 calendar.detachCalendarEvents();
22744 }
22745
22746 if (calendar.$el) {
22747 calendar.$el.trigger('calendar:close', calendar);
22748 }
22749 if (calendar.$inputEl) {
22750 calendar.$inputEl.trigger('calendar:close', calendar);
22751 }
22752 calendar.emit('local::close calendarClose', calendar);
22753 };
22754
22755 Calendar.prototype.onClosed = function onClosed () {
22756 var calendar = this;
22757 calendar.opened = false;
22758 calendar.closing = false;
22759
22760 if (!calendar.inline) {
22761 Utils.nextTick(function () {
22762 if (calendar.modal && calendar.modal.el && calendar.modal.destroy) {
22763 if (!calendar.params.routableModals) {
22764 calendar.modal.destroy();
22765 }
22766 }
22767 delete calendar.modal;
22768 });
22769 }
22770 if (calendar.$el) {
22771 calendar.$el.trigger('calendar:closed', calendar);
22772 }
22773 if (calendar.$inputEl) {
22774 calendar.$inputEl.trigger('calendar:closed', calendar);
22775 }
22776 calendar.emit('local::closed calendarClosed', calendar);
22777 };
22778
22779 Calendar.prototype.open = function open () {
22780 var obj;
22781
22782 var calendar = this;
22783 var app = calendar.app;
22784 var opened = calendar.opened;
22785 var inline = calendar.inline;
22786 var $inputEl = calendar.$inputEl;
22787 var params = calendar.params;
22788 if (opened) { return; }
22789
22790 if (inline) {
22791 calendar.$el = $(calendar.render());
22792 calendar.$el[0].f7Calendar = calendar;
22793 calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
22794 calendar.$months = calendar.$wrapperEl.find('.calendar-month');
22795 calendar.$containerEl.append(calendar.$el);
22796 calendar.onOpen();
22797 calendar.onOpened();
22798 return;
22799 }
22800 var modalType = params.openIn;
22801 if (modalType === 'auto') {
22802 modalType = calendar.isPopover() ? 'popover' : 'sheet';
22803 }
22804 var modalContent = calendar.render();
22805
22806 var modalParams = {
22807 targetEl: $inputEl,
22808 scrollToEl: calendar.params.scrollToInput ? $inputEl : undefined,
22809 content: modalContent,
22810 backdrop: calendar.params.backdrop === true || (modalType === 'popover' && app.params.popover.backdrop !== false && calendar.params.backdrop !== false),
22811 closeByBackdropClick: calendar.params.closeByBackdropClick,
22812 on: {
22813 open: function open() {
22814 var modal = this;
22815 calendar.modal = modal;
22816 calendar.$el = modalType === 'popover' ? modal.$el.find('.calendar') : modal.$el;
22817 calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
22818 calendar.$months = calendar.$wrapperEl.find('.calendar-month');
22819 calendar.$el[0].f7Calendar = calendar;
22820 if (modalType === 'customModal') {
22821 $(calendar.$el).find('.calendar-close').once('click', function () {
22822 calendar.close();
22823 });
22824 }
22825 calendar.onOpen();
22826 },
22827 opened: function opened() { calendar.onOpened(); },
22828 close: function close() { calendar.onClose(); },
22829 closed: function closed() { calendar.onClosed(); },
22830 },
22831 };
22832 if (calendar.params.routableModals) {
22833 calendar.view.router.navigate({
22834 url: calendar.url,
22835 route: ( obj = {
22836 path: calendar.url
22837 }, obj[modalType] = modalParams, obj ),
22838 });
22839 } else {
22840 calendar.modal = app[modalType].create(modalParams);
22841 calendar.modal.open();
22842 }
22843 };
22844
22845 Calendar.prototype.close = function close () {
22846 var calendar = this;
22847 var opened = calendar.opened;
22848 var inline = calendar.inline;
22849 if (!opened) { return; }
22850 if (inline) {
22851 calendar.onClose();
22852 calendar.onClosed();
22853 return;
22854 }
22855 if (calendar.params.routableModals) {
22856 calendar.view.router.back();
22857 } else {
22858 calendar.modal.close();
22859 }
22860 };
22861
22862 Calendar.prototype.init = function init () {
22863 var calendar = this;
22864
22865 calendar.initInput();
22866
22867 if (calendar.inline) {
22868 calendar.open();
22869 calendar.emit('local::init calendarInit', calendar);
22870 return;
22871 }
22872
22873 if (!calendar.initialized && calendar.params.value) {
22874 calendar.setValue(calendar.normalizeValues(calendar.params.value));
22875 }
22876
22877 // Attach input Events
22878 if (calendar.$inputEl) {
22879 calendar.attachInputEvents();
22880 }
22881 if (calendar.params.closeByOutsideClick) {
22882 calendar.attachHtmlEvents();
22883 }
22884 calendar.emit('local::init calendarInit', calendar);
22885 };
22886
22887 Calendar.prototype.destroy = function destroy () {
22888 var calendar = this;
22889 if (calendar.destroyed) { return; }
22890 var $el = calendar.$el;
22891 calendar.emit('local::beforeDestroy calendarBeforeDestroy', calendar);
22892 if ($el) { $el.trigger('calendar:beforedestroy', calendar); }
22893
22894 calendar.close();
22895
22896 // Detach Events
22897 if (calendar.$inputEl) {
22898 calendar.detachInputEvents();
22899 }
22900 if (calendar.params.closeByOutsideClick) {
22901 calendar.detachHtmlEvents();
22902 }
22903
22904 if ($el && $el.length) { delete calendar.$el[0].f7Calendar; }
22905 Utils.deleteProps(calendar);
22906 calendar.destroyed = true;
22907 };
22908
22909 return Calendar;
22910 }(Framework7Class));
22911
22912 var Calendar$1 = {
22913 name: 'calendar',
22914 static: {
22915 Calendar: Calendar,
22916 },
22917 create: function create() {
22918 var app = this;
22919 app.calendar = ConstructorMethods({
22920 defaultSelector: '.calendar',
22921 constructor: Calendar,
22922 app: app,
22923 domProp: 'f7Calendar',
22924 });
22925 app.calendar.close = function close(el) {
22926 if ( el === void 0 ) el = '.calendar';
22927
22928 var $el = $(el);
22929 if ($el.length === 0) { return; }
22930 var calendar = $el[0].f7Calendar;
22931 if (!calendar || (calendar && !calendar.opened)) { return; }
22932 calendar.close();
22933 };
22934 },
22935 params: {
22936 calendar: {
22937 // Calendar settings
22938 calendarType: 'gregorian', // or 'jalali'
22939 monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
22940 monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
22941 dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
22942 dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
22943 firstDay: 1, // First day of the week, Monday
22944 weekendDays: [0, 6], // Sunday and Saturday
22945 jalali: {
22946 monthNames: ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'],
22947 monthNamesShort: ['فَر', 'اُر', 'خُر', 'تیر', 'مُر', 'شَه', 'مهر', 'آب', 'آذر', 'دی', 'بَه', 'اِس'],
22948 dayNames: ['یک‌شنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنج‌شنبه', 'جمعه', 'شنبه'],
22949 dayNamesShort: ['1ش', '۲ش', '۳ش', '۴ش', '۵ش', 'ج', 'ش'],
22950 firstDay: 6, // Saturday
22951 weekendDays: [5], // Friday
22952 },
22953 multiple: false,
22954 rangePicker: false,
22955 rangePickerMinDays: 1, // when calendar is used as rangePicker
22956 rangePickerMaxDays: 0, // when calendar is used as rangePicker, 0 means unlimited
22957 dateFormat: 'yyyy-mm-dd',
22958 direction: 'horizontal', // or 'vertical'
22959 minDate: null,
22960 maxDate: null,
22961 disabled: null, // dates range of disabled days
22962 events: null, // dates range of days with events
22963 rangesClasses: null, // array with custom classes date ranges
22964 touchMove: true,
22965 animate: true,
22966 closeOnSelect: false,
22967 monthSelector: true,
22968 yearSelector: true,
22969 weekHeader: true,
22970 value: null,
22971 // Common opener settings
22972 containerEl: null,
22973 openIn: 'auto', // or 'popover' or 'sheet' or 'customModal'
22974 formatValue: null,
22975 inputEl: null,
22976 inputReadOnly: true,
22977 closeByOutsideClick: true,
22978 scrollToInput: true,
22979 header: false,
22980 headerPlaceholder: 'Select date',
22981 footer: false,
22982 toolbar: true,
22983 toolbarCloseText: 'Done',
22984 cssClass: null,
22985 routableModals: true,
22986 view: null,
22987 url: 'date/',
22988 backdrop: null,
22989 closeByBackdropClick: true,
22990 // Render functions
22991 renderWeekHeader: null,
22992 renderMonths: null,
22993 renderMonth: null,
22994 renderMonthSelector: null,
22995 renderYearSelector: null,
22996 renderHeader: null,
22997 renderFooter: null,
22998 renderToolbar: null,
22999 renderInline: null,
23000 renderPopover: null,
23001 renderSheet: null,
23002 render: null,
23003 },
23004 },
23005 };
23006
23007 function pickerColumn (colEl, updateItems) {
23008 var picker = this;
23009 var app = picker.app;
23010 var $colEl = $(colEl);
23011 var colIndex = $colEl.index();
23012 var col = picker.cols[colIndex];
23013 if (col.divider) { return; }
23014
23015 col.$el = $colEl;
23016 col.el = $colEl[0];
23017 col.$itemsEl = col.$el.find('.picker-items');
23018 col.items = col.$itemsEl.find('.picker-item');
23019
23020 var itemHeight;
23021 var itemsHeight;
23022 var minTranslate;
23023 var maxTranslate;
23024 var animationFrameId;
23025
23026 function updateDuringScroll() {
23027 animationFrameId = Utils.requestAnimationFrame(function () {
23028 col.updateItems(undefined, undefined, 0);
23029 updateDuringScroll();
23030 });
23031 }
23032
23033 col.replaceValues = function replaceColValues(values, displayValues) {
23034 col.detachEvents();
23035 col.values = values;
23036 col.displayValues = displayValues;
23037 col.$itemsEl.html(picker.renderColumn(col, true));
23038 col.items = col.$itemsEl.find('.picker-item');
23039 col.calcSize();
23040 col.setValue(col.values[0], 0, true);
23041 col.attachEvents();
23042 };
23043 col.calcSize = function calcColSize() {
23044 if (picker.params.rotateEffect) {
23045 col.$el.removeClass('picker-column-absolute');
23046 if (!col.width) { col.$el.css({ width: '' }); }
23047 }
23048 var colWidth = 0;
23049 var colHeight = col.$el[0].offsetHeight;
23050 itemHeight = col.items[0].offsetHeight;
23051 itemsHeight = itemHeight * col.items.length;
23052 minTranslate = ((colHeight / 2) - itemsHeight) + (itemHeight / 2);
23053 maxTranslate = (colHeight / 2) - (itemHeight / 2);
23054 if (col.width) {
23055 colWidth = col.width;
23056 if (parseInt(colWidth, 10) === colWidth) { colWidth += 'px'; }
23057 col.$el.css({ width: colWidth });
23058 }
23059 if (picker.params.rotateEffect) {
23060 if (!col.width) {
23061 col.items.each(function (index, itemEl) {
23062 var item = $(itemEl).children('span');
23063 colWidth = Math.max(colWidth, item[0].offsetWidth);
23064 });
23065 col.$el.css({ width: ((colWidth + 2) + "px") });
23066 }
23067 col.$el.addClass('picker-column-absolute');
23068 }
23069 };
23070
23071 col.setValue = function setColValue(newValue, transition, valueCallbacks) {
23072 if ( transition === void 0 ) transition = '';
23073
23074 var newActiveIndex = col.$itemsEl.find((".picker-item[data-picker-value=\"" + newValue + "\"]")).index();
23075 if (typeof newActiveIndex === 'undefined' || newActiveIndex === -1) {
23076 return;
23077 }
23078 var newTranslate = (-newActiveIndex * itemHeight) + maxTranslate;
23079 // Update wrapper
23080 col.$itemsEl.transition(transition);
23081 col.$itemsEl.transform(("translate3d(0," + newTranslate + "px,0)"));
23082
23083 // Watch items
23084 if (picker.params.updateValuesOnMomentum && col.activeIndex && col.activeIndex !== newActiveIndex) {
23085 Utils.cancelAnimationFrame(animationFrameId);
23086 col.$itemsEl.transitionEnd(function () {
23087 Utils.cancelAnimationFrame(animationFrameId);
23088 });
23089 updateDuringScroll();
23090 }
23091
23092 // Update items
23093 col.updateItems(newActiveIndex, newTranslate, transition, valueCallbacks);
23094 };
23095
23096 col.updateItems = function updateColItems(activeIndex, translate, transition, valueCallbacks) {
23097 if (typeof translate === 'undefined') {
23098 // eslint-disable-next-line
23099 translate = Utils.getTranslate(col.$itemsEl[0], 'y');
23100 }
23101 // eslint-disable-next-line
23102 if (typeof activeIndex === 'undefined') { activeIndex = -Math.round((translate - maxTranslate) / itemHeight); }
23103 // eslint-disable-next-line
23104 if (activeIndex < 0) { activeIndex = 0; }
23105 // eslint-disable-next-line
23106 if (activeIndex >= col.items.length) { activeIndex = col.items.length - 1; }
23107 var previousActiveIndex = col.activeIndex;
23108 col.activeIndex = activeIndex;
23109 col.$itemsEl.find('.picker-item-selected').removeClass('picker-item-selected');
23110
23111 col.items.transition(transition);
23112
23113 var selectedItem = col.items.eq(activeIndex).addClass('picker-item-selected').transform('');
23114
23115 // Set 3D rotate effect
23116 if (picker.params.rotateEffect) {
23117 col.items.each(function (index, itemEl) {
23118 var $itemEl = $(itemEl);
23119 var itemOffsetTop = $itemEl.index() * itemHeight;
23120 var translateOffset = maxTranslate - translate;
23121 var itemOffset = itemOffsetTop - translateOffset;
23122 var percentage = itemOffset / itemHeight;
23123 var itemsFit = Math.ceil(col.height / itemHeight / 2) + 1;
23124
23125 var angle = (-18 * percentage);
23126 if (angle > 180) { angle = 180; }
23127 if (angle < -180) { angle = -180; }
23128 if (Math.abs(percentage) > itemsFit) {
23129 $itemEl.addClass('picker-item-far');
23130 } else {
23131 $itemEl.removeClass('picker-item-far');
23132 }
23133 $itemEl.transform(("translate3d(0, " + (-translate + maxTranslate) + "px, " + (picker.needsOriginFix ? -110 : 0) + "px) rotateX(" + angle + "deg)"));
23134 });
23135 }
23136
23137 if (valueCallbacks || typeof valueCallbacks === 'undefined') {
23138 // Update values
23139 col.value = selectedItem.attr('data-picker-value');
23140 col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value;
23141 // On change callback
23142 if (previousActiveIndex !== activeIndex) {
23143 if (col.onChange) {
23144 col.onChange(picker, col.value, col.displayValue);
23145 }
23146 picker.updateValue();
23147 }
23148 }
23149 };
23150
23151 var allowItemClick = true;
23152 var isTouched;
23153 var isMoved;
23154 var touchStartY;
23155 var touchCurrentY;
23156 var touchStartTime;
23157 var touchEndTime;
23158 var startTranslate;
23159 var returnTo;
23160 var currentTranslate;
23161 var prevTranslate;
23162 var velocityTranslate;
23163 function handleTouchStart(e) {
23164 if (isMoved || isTouched) { return; }
23165 e.preventDefault();
23166 isTouched = true;
23167 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
23168 touchCurrentY = touchStartY;
23169 touchStartTime = (new Date()).getTime();
23170
23171 allowItemClick = true;
23172 startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
23173 currentTranslate = startTranslate;
23174 }
23175 function handleTouchMove(e) {
23176 if (!isTouched) { return; }
23177 e.preventDefault();
23178 allowItemClick = false;
23179 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
23180 if (!isMoved) {
23181 // First move
23182 Utils.cancelAnimationFrame(animationFrameId);
23183 isMoved = true;
23184 startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
23185 currentTranslate = startTranslate;
23186 col.$itemsEl.transition(0);
23187 }
23188
23189 var diff = touchCurrentY - touchStartY;
23190 currentTranslate = startTranslate + diff;
23191 returnTo = undefined;
23192
23193 // Normalize translate
23194 if (currentTranslate < minTranslate) {
23195 currentTranslate = minTranslate - (Math.pow( (minTranslate - currentTranslate), 0.8 ));
23196 returnTo = 'min';
23197 }
23198 if (currentTranslate > maxTranslate) {
23199 currentTranslate = maxTranslate + (Math.pow( (currentTranslate - maxTranslate), 0.8 ));
23200 returnTo = 'max';
23201 }
23202 // Transform wrapper
23203 col.$itemsEl.transform(("translate3d(0," + currentTranslate + "px,0)"));
23204
23205 // Update items
23206 col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnTouchmove);
23207
23208 // Calc velocity
23209 velocityTranslate = currentTranslate - prevTranslate || currentTranslate;
23210 prevTranslate = currentTranslate;
23211 }
23212 function handleTouchEnd() {
23213 if (!isTouched || !isMoved) {
23214 isTouched = false;
23215 isMoved = false;
23216 return;
23217 }
23218 isTouched = false;
23219 isMoved = false;
23220 col.$itemsEl.transition('');
23221 if (returnTo) {
23222 if (returnTo === 'min') {
23223 col.$itemsEl.transform(("translate3d(0," + minTranslate + "px,0)"));
23224 } else { col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)")); }
23225 }
23226 touchEndTime = new Date().getTime();
23227 var newTranslate;
23228 if (touchEndTime - touchStartTime > 300) {
23229 newTranslate = currentTranslate;
23230 } else {
23231 newTranslate = currentTranslate + (velocityTranslate * picker.params.momentumRatio);
23232 }
23233
23234 newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);
23235
23236 // Active Index
23237 var activeIndex = -Math.floor((newTranslate - maxTranslate) / itemHeight);
23238
23239 // Normalize translate
23240 if (!picker.params.freeMode) { newTranslate = (-activeIndex * itemHeight) + maxTranslate; }
23241
23242 // Transform wrapper
23243 col.$itemsEl.transform(("translate3d(0," + (parseInt(newTranslate, 10)) + "px,0)"));
23244
23245 // Update items
23246 col.updateItems(activeIndex, newTranslate, '', true);
23247
23248 // Watch items
23249 if (picker.params.updateValuesOnMomentum) {
23250 updateDuringScroll();
23251 col.$itemsEl.transitionEnd(function () {
23252 Utils.cancelAnimationFrame(animationFrameId);
23253 });
23254 }
23255
23256 // Allow click
23257 setTimeout(function () {
23258 allowItemClick = true;
23259 }, 100);
23260 }
23261
23262 function handleClick() {
23263 if (!allowItemClick) { return; }
23264 Utils.cancelAnimationFrame(animationFrameId);
23265 var value = $(this).attr('data-picker-value');
23266 col.setValue(value);
23267 }
23268
23269 var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
23270 col.attachEvents = function attachColEvents() {
23271 col.$el.on(app.touchEvents.start, handleTouchStart, activeListener);
23272 app.on('touchmove:active', handleTouchMove);
23273 app.on('touchend:passive', handleTouchEnd);
23274 col.items.on('click', handleClick);
23275 };
23276 col.detachEvents = function detachColEvents() {
23277 col.$el.off(app.touchEvents.start, handleTouchStart, activeListener);
23278 app.off('touchmove:active', handleTouchMove);
23279 app.off('touchend:passive', handleTouchEnd);
23280 col.items.off('click', handleClick);
23281 };
23282
23283 col.init = function initCol() {
23284 col.calcSize();
23285 col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)")).transition(0);
23286 if (colIndex === 0) { col.$el.addClass('picker-column-first'); }
23287 if (colIndex === picker.cols.length - 1) { col.$el.addClass('picker-column-last'); }
23288 // Update items on init
23289 if (updateItems) { col.updateItems(0, maxTranslate, 0); }
23290
23291 col.attachEvents();
23292 };
23293
23294 col.destroy = function destroyCol() {
23295 col.detachEvents();
23296 };
23297
23298 col.init();
23299 }
23300
23301 var Picker = /*@__PURE__*/(function (Framework7Class$$1) {
23302 function Picker(app, params) {
23303 if ( params === void 0 ) params = {};
23304
23305 Framework7Class$$1.call(this, params, [app]);
23306 var picker = this;
23307 picker.params = Utils.extend({}, app.params.picker, params);
23308
23309 var $containerEl;
23310 if (picker.params.containerEl) {
23311 $containerEl = $(picker.params.containerEl);
23312 if ($containerEl.length === 0) { return picker; }
23313 }
23314
23315 var $inputEl;
23316 if (picker.params.inputEl) {
23317 $inputEl = $(picker.params.inputEl);
23318 }
23319
23320 var view;
23321 if ($inputEl) {
23322 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
23323 }
23324 if (!view) { view = app.views.main; }
23325
23326 Utils.extend(picker, {
23327 app: app,
23328 $containerEl: $containerEl,
23329 containerEl: $containerEl && $containerEl[0],
23330 inline: $containerEl && $containerEl.length > 0,
23331 needsOriginFix: app.device.ios || ((win.navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && win.navigator.userAgent.toLowerCase().indexOf('chrome') < 0) && !app.device.android),
23332 cols: [],
23333 $inputEl: $inputEl,
23334 inputEl: $inputEl && $inputEl[0],
23335 initialized: false,
23336 opened: false,
23337 url: picker.params.url,
23338 view: view,
23339 });
23340
23341 function onResize() {
23342 picker.resizeCols();
23343 }
23344 function onInputClick() {
23345 picker.open();
23346 }
23347 function onInputFocus(e) {
23348 e.preventDefault();
23349 }
23350 function onHtmlClick(e) {
23351 var $targetEl = $(e.target);
23352 if (picker.isPopover()) { return; }
23353 if (!picker.opened || picker.closing) { return; }
23354 if ($targetEl.closest('[class*="backdrop"]').length) { return; }
23355 if ($inputEl && $inputEl.length > 0) {
23356 if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal').length === 0) {
23357 picker.close();
23358 }
23359 } else if ($(e.target).closest('.sheet-modal').length === 0) {
23360 picker.close();
23361 }
23362 }
23363
23364 // Events
23365 Utils.extend(picker, {
23366 attachResizeEvent: function attachResizeEvent() {
23367 app.on('resize', onResize);
23368 },
23369 detachResizeEvent: function detachResizeEvent() {
23370 app.off('resize', onResize);
23371 },
23372 attachInputEvents: function attachInputEvents() {
23373 picker.$inputEl.on('click', onInputClick);
23374 if (picker.params.inputReadOnly) {
23375 picker.$inputEl.on('focus mousedown', onInputFocus);
23376 }
23377 },
23378 detachInputEvents: function detachInputEvents() {
23379 picker.$inputEl.off('click', onInputClick);
23380 if (picker.params.inputReadOnly) {
23381 picker.$inputEl.off('focus mousedown', onInputFocus);
23382 }
23383 },
23384 attachHtmlEvents: function attachHtmlEvents() {
23385 app.on('click', onHtmlClick);
23386 },
23387 detachHtmlEvents: function detachHtmlEvents() {
23388 app.off('click', onHtmlClick);
23389 },
23390 });
23391
23392 picker.init();
23393
23394 return picker;
23395 }
23396
23397 if ( Framework7Class$$1 ) Picker.__proto__ = Framework7Class$$1;
23398 Picker.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
23399 Picker.prototype.constructor = Picker;
23400
23401 Picker.prototype.initInput = function initInput () {
23402 var picker = this;
23403 if (!picker.$inputEl) { return; }
23404 if (picker.params.inputReadOnly) { picker.$inputEl.prop('readOnly', true); }
23405 };
23406
23407 Picker.prototype.resizeCols = function resizeCols () {
23408 var picker = this;
23409 if (!picker.opened) { return; }
23410 for (var i = 0; i < picker.cols.length; i += 1) {
23411 if (!picker.cols[i].divider) {
23412 picker.cols[i].calcSize();
23413 picker.cols[i].setValue(picker.cols[i].value, 0, false);
23414 }
23415 }
23416 };
23417
23418 Picker.prototype.isPopover = function isPopover () {
23419 var picker = this;
23420 var app = picker.app;
23421 var modal = picker.modal;
23422 var params = picker.params;
23423 if (params.openIn === 'sheet') { return false; }
23424 if (modal && modal.type !== 'popover') { return false; }
23425
23426 if (!picker.inline && picker.inputEl) {
23427 if (params.openIn === 'popover') { return true; }
23428 if (app.device.ios) {
23429 return !!app.device.ipad;
23430 } if (app.width >= 768) {
23431 return true;
23432 }
23433 }
23434 return false;
23435 };
23436
23437 Picker.prototype.formatValue = function formatValue () {
23438 var picker = this;
23439 var value = picker.value;
23440 var displayValue = picker.displayValue;
23441 if (picker.params.formatValue) {
23442 return picker.params.formatValue.call(picker, value, displayValue);
23443 }
23444 return value.join(' ');
23445 };
23446
23447 Picker.prototype.setValue = function setValue (values, transition) {
23448 var picker = this;
23449 var valueIndex = 0;
23450 if (picker.cols.length === 0) {
23451 picker.value = values;
23452 picker.updateValue(values);
23453 return;
23454 }
23455 for (var i = 0; i < picker.cols.length; i += 1) {
23456 if (picker.cols[i] && !picker.cols[i].divider) {
23457 picker.cols[i].setValue(values[valueIndex], transition);
23458 valueIndex += 1;
23459 }
23460 }
23461 };
23462
23463 Picker.prototype.getValue = function getValue () {
23464 var picker = this;
23465 return picker.value;
23466 };
23467
23468 Picker.prototype.updateValue = function updateValue (forceValues) {
23469 var picker = this;
23470 var newValue = forceValues || [];
23471 var newDisplayValue = [];
23472 var column;
23473 if (picker.cols.length === 0) {
23474 var noDividerColumns = picker.params.cols.filter(function (c) { return !c.divider; });
23475 for (var i = 0; i < noDividerColumns.length; i += 1) {
23476 column = noDividerColumns[i];
23477 if (column.displayValues !== undefined && column.values !== undefined && column.values.indexOf(newValue[i]) !== -1) {
23478 newDisplayValue.push(column.displayValues[column.values.indexOf(newValue[i])]);
23479 } else {
23480 newDisplayValue.push(newValue[i]);
23481 }
23482 }
23483 } else {
23484 for (var i$1 = 0; i$1 < picker.cols.length; i$1 += 1) {
23485 if (!picker.cols[i$1].divider) {
23486 newValue.push(picker.cols[i$1].value);
23487 newDisplayValue.push(picker.cols[i$1].displayValue);
23488 }
23489 }
23490 }
23491
23492 if (newValue.indexOf(undefined) >= 0) {
23493 return;
23494 }
23495 picker.value = newValue;
23496 picker.displayValue = newDisplayValue;
23497 picker.emit('local::change pickerChange', picker, picker.value, picker.displayValue);
23498 if (picker.inputEl) {
23499 picker.$inputEl.val(picker.formatValue());
23500 picker.$inputEl.trigger('change');
23501 }
23502 };
23503
23504 Picker.prototype.initColumn = function initColumn (colEl, updateItems) {
23505 var picker = this;
23506 pickerColumn.call(picker, colEl, updateItems);
23507 };
23508 // eslint-disable-next-line
23509 Picker.prototype.destroyColumn = function destroyColumn (colEl) {
23510 var picker = this;
23511 var $colEl = $(colEl);
23512 var index = $colEl.index();
23513 if (picker.cols[index] && picker.cols[index].destroy) {
23514 picker.cols[index].destroy();
23515 }
23516 };
23517
23518 Picker.prototype.renderToolbar = function renderToolbar () {
23519 var picker = this;
23520 if (picker.params.renderToolbar) { return picker.params.renderToolbar.call(picker, picker); }
23521 return ("\n <div class=\"toolbar toolbar-top no-shadow\">\n <div class=\"toolbar-inner\">\n <div class=\"left\"></div>\n <div class=\"right\">\n <a href=\"#\" class=\"link sheet-close popover-close\">" + (picker.params.toolbarCloseText) + "</a>\n </div>\n </div>\n </div>\n ").trim();
23522 };
23523 // eslint-disable-next-line
23524 Picker.prototype.renderColumn = function renderColumn (col, onlyItems) {
23525 var colClasses = "picker-column " + (col.textAlign ? ("picker-column-" + (col.textAlign)) : '') + " " + (col.cssClass || '');
23526 var columnHtml;
23527 var columnItemsHtml;
23528
23529 if (col.divider) {
23530 columnHtml = "\n <div class=\"" + colClasses + " picker-column-divider\">" + (col.content) + "</div>\n ";
23531 } else {
23532 columnItemsHtml = col.values.map(function (value, index) { return ("\n <div class=\"picker-item\" data-picker-value=\"" + value + "\">\n <span>" + (col.displayValues ? col.displayValues[index] : value) + "</span>\n </div>\n "); }).join('');
23533 columnHtml = "\n <div class=\"" + colClasses + "\">\n <div class=\"picker-items\">" + columnItemsHtml + "</div>\n </div>\n ";
23534 }
23535
23536 return onlyItems ? columnItemsHtml.trim() : columnHtml.trim();
23537 };
23538
23539 Picker.prototype.renderInline = function renderInline () {
23540 var picker = this;
23541 var ref = picker.params;
23542 var rotateEffect = ref.rotateEffect;
23543 var cssClass = ref.cssClass;
23544 var toolbar = ref.toolbar;
23545 var inlineHtml = ("\n <div class=\"picker picker-inline " + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '') + "\">\n " + (toolbar ? picker.renderToolbar() : '') + "\n <div class=\"picker-columns\">\n " + (picker.cols.map(function (col) { return picker.renderColumn(col); }).join('')) + "\n <div class=\"picker-center-highlight\"></div>\n </div>\n </div>\n ").trim();
23546
23547 return inlineHtml;
23548 };
23549
23550 Picker.prototype.renderSheet = function renderSheet () {
23551 var picker = this;
23552 var ref = picker.params;
23553 var rotateEffect = ref.rotateEffect;
23554 var cssClass = ref.cssClass;
23555 var toolbar = ref.toolbar;
23556 var sheetHtml = ("\n <div class=\"sheet-modal picker picker-sheet " + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '') + "\">\n " + (toolbar ? picker.renderToolbar() : '') + "\n <div class=\"sheet-modal-inner picker-columns\">\n " + (picker.cols.map(function (col) { return picker.renderColumn(col); }).join('')) + "\n <div class=\"picker-center-highlight\"></div>\n </div>\n </div>\n ").trim();
23557
23558 return sheetHtml;
23559 };
23560
23561 Picker.prototype.renderPopover = function renderPopover () {
23562 var picker = this;
23563 var ref = picker.params;
23564 var rotateEffect = ref.rotateEffect;
23565 var cssClass = ref.cssClass;
23566 var toolbar = ref.toolbar;
23567 var popoverHtml = ("\n <div class=\"popover picker-popover\">\n <div class=\"popover-inner\">\n <div class=\"picker " + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '') + "\">\n " + (toolbar ? picker.renderToolbar() : '') + "\n <div class=\"picker-columns\">\n " + (picker.cols.map(function (col) { return picker.renderColumn(col); }).join('')) + "\n <div class=\"picker-center-highlight\"></div>\n </div>\n </div>\n </div>\n </div>\n ").trim();
23568
23569 return popoverHtml;
23570 };
23571
23572 Picker.prototype.render = function render () {
23573 var picker = this;
23574 if (picker.params.render) { return picker.params.render.call(picker); }
23575 if (!picker.inline) {
23576 if (picker.isPopover()) { return picker.renderPopover(); }
23577 return picker.renderSheet();
23578 }
23579 return picker.renderInline();
23580 };
23581
23582 Picker.prototype.onOpen = function onOpen () {
23583 var picker = this;
23584 var initialized = picker.initialized;
23585 var $el = picker.$el;
23586 var app = picker.app;
23587 var $inputEl = picker.$inputEl;
23588 var inline = picker.inline;
23589 var value = picker.value;
23590 var params = picker.params;
23591 picker.opened = true;
23592 picker.closing = false;
23593 picker.opening = true;
23594
23595 // Init main events
23596 picker.attachResizeEvent();
23597
23598 // Init cols
23599 $el.find('.picker-column').each(function (index, colEl) {
23600 var updateItems = true;
23601 if (
23602 (!initialized && params.value)
23603 || (initialized && value)
23604 ) {
23605 updateItems = false;
23606 }
23607 picker.initColumn(colEl, updateItems);
23608 });
23609
23610 // Set value
23611 if (!initialized) {
23612 if (value) { picker.setValue(value, 0); }
23613 else if (params.value) {
23614 picker.setValue(params.value, 0);
23615 }
23616 } else if (value) {
23617 picker.setValue(value, 0);
23618 }
23619
23620 // Extra focus
23621 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
23622 $inputEl.trigger('focus');
23623 }
23624
23625 picker.initialized = true;
23626
23627 // Trigger events
23628 if ($el) {
23629 $el.trigger('picker:open', picker);
23630 }
23631 if ($inputEl) {
23632 $inputEl.trigger('picker:open', picker);
23633 }
23634 picker.emit('local::open pickerOpen', picker);
23635 };
23636
23637 Picker.prototype.onOpened = function onOpened () {
23638 var picker = this;
23639 picker.opening = false;
23640
23641 if (picker.$el) {
23642 picker.$el.trigger('picker:opened', picker);
23643 }
23644 if (picker.$inputEl) {
23645 picker.$inputEl.trigger('picker:opened', picker);
23646 }
23647 picker.emit('local::opened pickerOpened', picker);
23648 };
23649
23650 Picker.prototype.onClose = function onClose () {
23651 var picker = this;
23652 var app = picker.app;
23653 picker.opening = false;
23654 picker.closing = true;
23655
23656 // Detach events
23657 picker.detachResizeEvent();
23658
23659 picker.cols.forEach(function (col) {
23660 if (col.destroy) { col.destroy(); }
23661 });
23662 if (picker.$inputEl && app.theme === 'md') {
23663 picker.$inputEl.trigger('blur');
23664 }
23665
23666 if (picker.$el) {
23667 picker.$el.trigger('picker:close', picker);
23668 }
23669 if (picker.$inputEl) {
23670 picker.$inputEl.trigger('picker:close', picker);
23671 }
23672 picker.emit('local::close pickerClose', picker);
23673 };
23674
23675 Picker.prototype.onClosed = function onClosed () {
23676 var picker = this;
23677 picker.opened = false;
23678 picker.closing = false;
23679
23680 if (!picker.inline) {
23681 Utils.nextTick(function () {
23682 if (picker.modal && picker.modal.el && picker.modal.destroy) {
23683 if (!picker.params.routableModals) {
23684 picker.modal.destroy();
23685 }
23686 }
23687 delete picker.modal;
23688 });
23689 }
23690
23691 if (picker.$el) {
23692 picker.$el.trigger('picker:closed', picker);
23693 }
23694 if (picker.$inputEl) {
23695 picker.$inputEl.trigger('picker:closed', picker);
23696 }
23697 picker.emit('local::closed pickerClosed', picker);
23698 };
23699
23700 Picker.prototype.open = function open () {
23701 var obj;
23702
23703 var picker = this;
23704 var app = picker.app;
23705 var opened = picker.opened;
23706 var inline = picker.inline;
23707 var $inputEl = picker.$inputEl;
23708 if (opened) { return; }
23709 if (picker.cols.length === 0 && picker.params.cols.length) {
23710 picker.params.cols.forEach(function (col) {
23711 picker.cols.push(col);
23712 });
23713 }
23714 if (inline) {
23715 picker.$el = $(picker.render());
23716 picker.$el[0].f7Picker = picker;
23717 picker.$containerEl.append(picker.$el);
23718 picker.onOpen();
23719 picker.onOpened();
23720 return;
23721 }
23722 var isPopover = picker.isPopover();
23723 var modalType = isPopover ? 'popover' : 'sheet';
23724 var modalParams = {
23725 targetEl: $inputEl,
23726 scrollToEl: picker.params.scrollToInput ? $inputEl : undefined,
23727 content: picker.render(),
23728 backdrop: isPopover,
23729 on: {
23730 open: function open() {
23731 var modal = this;
23732 picker.modal = modal;
23733 picker.$el = isPopover ? modal.$el.find('.picker') : modal.$el;
23734 picker.$el[0].f7Picker = picker;
23735 picker.onOpen();
23736 },
23737 opened: function opened() { picker.onOpened(); },
23738 close: function close() { picker.onClose(); },
23739 closed: function closed() { picker.onClosed(); },
23740 },
23741 };
23742 if (picker.params.routableModals) {
23743 picker.view.router.navigate({
23744 url: picker.url,
23745 route: ( obj = {
23746 path: picker.url
23747 }, obj[modalType] = modalParams, obj ),
23748 });
23749 } else {
23750 picker.modal = app[modalType].create(modalParams);
23751 picker.modal.open();
23752 }
23753 };
23754
23755 Picker.prototype.close = function close () {
23756 var picker = this;
23757 var opened = picker.opened;
23758 var inline = picker.inline;
23759 if (!opened) { return; }
23760 if (inline) {
23761 picker.onClose();
23762 picker.onClosed();
23763 return;
23764 }
23765 if (picker.params.routableModals) {
23766 picker.view.router.back();
23767 } else {
23768 picker.modal.close();
23769 }
23770 };
23771
23772 Picker.prototype.init = function init () {
23773 var picker = this;
23774
23775 picker.initInput();
23776
23777 if (picker.inline) {
23778 picker.open();
23779 picker.emit('local::init pickerInit', picker);
23780 return;
23781 }
23782
23783 if (!picker.initialized && picker.params.value) {
23784 picker.setValue(picker.params.value);
23785 }
23786
23787 // Attach input Events
23788 if (picker.$inputEl) {
23789 picker.attachInputEvents();
23790 }
23791 if (picker.params.closeByOutsideClick) {
23792 picker.attachHtmlEvents();
23793 }
23794 picker.emit('local::init pickerInit', picker);
23795 };
23796
23797 Picker.prototype.destroy = function destroy () {
23798 var picker = this;
23799 if (picker.destroyed) { return; }
23800 var $el = picker.$el;
23801 picker.emit('local::beforeDestroy pickerBeforeDestroy', picker);
23802 if ($el) { $el.trigger('picker:beforedestroy', picker); }
23803
23804 picker.close();
23805
23806 // Detach Events
23807 if (picker.$inputEl) {
23808 picker.detachInputEvents();
23809 }
23810 if (picker.params.closeByOutsideClick) {
23811 picker.detachHtmlEvents();
23812 }
23813
23814 if ($el && $el.length) { delete picker.$el[0].f7Picker; }
23815 Utils.deleteProps(picker);
23816 picker.destroyed = true;
23817 };
23818
23819 return Picker;
23820 }(Framework7Class));
23821
23822 var Picker$1 = {
23823 name: 'picker',
23824 static: {
23825 Picker: Picker,
23826 },
23827 create: function create() {
23828 var app = this;
23829 app.picker = ConstructorMethods({
23830 defaultSelector: '.picker',
23831 constructor: Picker,
23832 app: app,
23833 domProp: 'f7Picker',
23834 });
23835 app.picker.close = function close(el) {
23836 if ( el === void 0 ) el = '.picker';
23837
23838 var $el = $(el);
23839 if ($el.length === 0) { return; }
23840 var picker = $el[0].f7Picker;
23841 if (!picker || (picker && !picker.opened)) { return; }
23842 picker.close();
23843 };
23844 },
23845 params: {
23846 picker: {
23847 // Picker settings
23848 updateValuesOnMomentum: false,
23849 updateValuesOnTouchmove: true,
23850 rotateEffect: false,
23851 momentumRatio: 7,
23852 freeMode: false,
23853 cols: [],
23854 // Common opener settings
23855 containerEl: null,
23856 openIn: 'auto', // or 'popover' or 'sheet'
23857 formatValue: null,
23858 inputEl: null,
23859 inputReadOnly: true,
23860 closeByOutsideClick: true,
23861 scrollToInput: true,
23862 toolbar: true,
23863 toolbarCloseText: 'Done',
23864 cssClass: null,
23865 routableModals: true,
23866 view: null,
23867 url: 'select/',
23868 // Render functions
23869 renderToolbar: null,
23870 render: null,
23871 },
23872 },
23873 };
23874
23875 var InfiniteScroll = {
23876 handleScroll: function handleScroll(el, e) {
23877 var app = this;
23878 var $el = $(el);
23879 var scrollTop = $el[0].scrollTop;
23880 var scrollHeight = $el[0].scrollHeight;
23881 var height = $el[0].offsetHeight;
23882 var distance = $el[0].getAttribute('data-infinite-distance');
23883
23884 var virtualListContainer = $el.find('.virtual-list');
23885 var virtualList;
23886
23887 var onTop = $el.hasClass('infinite-scroll-top');
23888 if (!distance) { distance = 50; }
23889 if (typeof distance === 'string' && distance.indexOf('%') >= 0) {
23890 distance = (parseInt(distance, 10) / 100) * height;
23891 }
23892 if (distance > height) { distance = height; }
23893 if (onTop) {
23894 if (scrollTop < distance) {
23895 $el.trigger('infinite', e);
23896 app.emit('infinite', $el[0], e);
23897 }
23898 } else if (scrollTop + height >= scrollHeight - distance) {
23899 if (virtualListContainer.length > 0) {
23900 virtualList = virtualListContainer.eq(-1)[0].f7VirtualList;
23901 if (virtualList && !virtualList.reachEnd && !virtualList.params.updatableScroll) {
23902 return;
23903 }
23904 }
23905 $el.trigger('infinite', e);
23906 app.emit('infinite', $el[0], e);
23907 }
23908 },
23909 create: function create(el) {
23910 var $el = $(el);
23911 var app = this;
23912 $el.on('scroll', function handle(e) {
23913 app.infiniteScroll.handle(this, e);
23914 });
23915 },
23916 destroy: function destroy(el) {
23917 var $el = $(el);
23918 $el.off('scroll');
23919 },
23920 };
23921 var InfiniteScroll$1 = {
23922 name: 'infiniteScroll',
23923 create: function create() {
23924 var app = this;
23925 Utils.extend(app, {
23926 infiniteScroll: {
23927 handle: InfiniteScroll.handleScroll.bind(app),
23928 create: InfiniteScroll.create.bind(app),
23929 destroy: InfiniteScroll.destroy.bind(app),
23930 },
23931 });
23932 },
23933 on: {
23934 tabMounted: function tabMounted(tabEl) {
23935 var app = this;
23936 var $tabEl = $(tabEl);
23937 $tabEl.find('.infinite-scroll-content').each(function (index, el) {
23938 app.infiniteScroll.create(el);
23939 });
23940 },
23941 tabBeforeRemove: function tabBeforeRemove(tabEl) {
23942 var $tabEl = $(tabEl);
23943 var app = this;
23944 $tabEl.find('.infinite-scroll-content').each(function (index, el) {
23945 app.infiniteScroll.destroy(el);
23946 });
23947 },
23948 pageInit: function pageInit(page) {
23949 var app = this;
23950 page.$el.find('.infinite-scroll-content').each(function (index, el) {
23951 app.infiniteScroll.create(el);
23952 });
23953 },
23954 pageBeforeRemove: function pageBeforeRemove(page) {
23955 var app = this;
23956 page.$el.find('.infinite-scroll-content').each(function (index, el) {
23957 app.infiniteScroll.destroy(el);
23958 });
23959 },
23960 },
23961 };
23962
23963 var PullToRefresh = /*@__PURE__*/(function (Framework7Class$$1) {
23964 function PullToRefresh(app, el) {
23965 Framework7Class$$1.call(this, {}, [app]);
23966 var ptr = this;
23967 var $el = $(el);
23968 var $preloaderEl = $el.find('.ptr-preloader');
23969
23970 ptr.$el = $el;
23971 ptr.el = $el[0];
23972 ptr.app = app;
23973
23974 ptr.bottom = ptr.$el.hasClass('ptr-bottom');
23975
23976 // Extend defaults with modules params
23977 ptr.useModulesParams({});
23978
23979 var isMaterial = app.theme === 'md';
23980
23981 // Done
23982 ptr.done = function done() {
23983 var $transitionTarget = isMaterial ? $preloaderEl : $el;
23984 $transitionTarget.transitionEnd(function () {
23985 $el.removeClass('ptr-transitioning ptr-pull-up ptr-pull-down');
23986 $el.trigger('ptr:done');
23987 ptr.emit('local::done ptrDone', $el[0]);
23988 });
23989 $el.removeClass('ptr-refreshing').addClass('ptr-transitioning');
23990 return ptr;
23991 };
23992
23993 ptr.refresh = function refresh() {
23994 if ($el.hasClass('ptr-refreshing')) { return ptr; }
23995 $el.addClass('ptr-transitioning ptr-refreshing');
23996 $el.trigger('ptr:refresh', ptr.done);
23997 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
23998 return ptr;
23999 };
24000
24001 // Events handling
24002 var touchId;
24003 var isTouched;
24004 var isMoved;
24005 var touchesStart = {};
24006 var isScrolling;
24007 var touchesDiff;
24008 var refresh = false;
24009 var useTranslate = false;
24010 var forceUseTranslate = false;
24011 var startTranslate = 0;
24012 var translate;
24013 var scrollTop;
24014 var wasScrolled;
24015 var triggerDistance;
24016 var dynamicTriggerDistance;
24017 var pullStarted;
24018 var hasNavbar = false;
24019 var scrollHeight;
24020 var offsetHeight;
24021 var maxScrollTop;
24022 var $pageEl = $el.parents('.page');
24023
24024 if ($pageEl.find('.navbar').length > 0 || $pageEl.parents('.view').children('.navbar').length > 0) { hasNavbar = true; }
24025 if ($pageEl.hasClass('no-navbar')) { hasNavbar = false; }
24026 if (!hasNavbar && !ptr.bottom) { $el.addClass('ptr-no-navbar'); }
24027
24028 // Define trigger distance
24029 if ($el.attr('data-ptr-distance')) {
24030 dynamicTriggerDistance = true;
24031 } else {
24032 triggerDistance = isMaterial ? 66 : 44;
24033 }
24034
24035 function handleTouchStart(e) {
24036 if (isTouched) {
24037 if (Device.os === 'android') {
24038 if ('targetTouches' in e && e.targetTouches.length > 1) { return; }
24039 } else { return; }
24040 }
24041
24042 if ($el.hasClass('ptr-refreshing')) {
24043 return;
24044 }
24045 if ($(e.target).closest('.sortable-handler').length) { return; }
24046
24047 isMoved = false;
24048 pullStarted = false;
24049 isTouched = true;
24050 isScrolling = undefined;
24051 wasScrolled = undefined;
24052 if (e.type === 'touchstart') { touchId = e.targetTouches[0].identifier; }
24053 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
24054 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
24055 }
24056
24057 function handleTouchMove(e) {
24058 if (!isTouched) { return; }
24059 var pageX;
24060 var pageY;
24061 var touch;
24062 if (e.type === 'touchmove') {
24063 if (touchId && e.touches) {
24064 for (var i = 0; i < e.touches.length; i += 1) {
24065 if (e.touches[i].identifier === touchId) {
24066 touch = e.touches[i];
24067 }
24068 }
24069 }
24070 if (!touch) { touch = e.targetTouches[0]; }
24071 pageX = touch.pageX;
24072 pageY = touch.pageY;
24073 } else {
24074 pageX = e.pageX;
24075 pageY = e.pageY;
24076 }
24077 if (!pageX || !pageY) { return; }
24078
24079
24080 if (typeof isScrolling === 'undefined') {
24081 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
24082 }
24083 if (!isScrolling) {
24084 isTouched = false;
24085 return;
24086 }
24087
24088 scrollTop = $el[0].scrollTop;
24089
24090 if (!isMoved) {
24091 $el.removeClass('ptr-transitioning');
24092 var targetIsScrollable;
24093 scrollHeight = $el[0].scrollHeight;
24094 offsetHeight = $el[0].offsetHeight;
24095 if (ptr.bottom) {
24096 maxScrollTop = scrollHeight - offsetHeight;
24097 }
24098 if (scrollTop > scrollHeight) {
24099 isTouched = false;
24100 return;
24101 }
24102 var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
24103 if ($ptrWatchScrollable.length) {
24104 $ptrWatchScrollable.each(function (ptrScrollableIndex, ptrScrollableEl) {
24105 if (ptrScrollableEl === el) { return; }
24106 if (
24107 (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight)
24108 && $(ptrScrollableEl).css('overflow') === 'auto'
24109 && (
24110 (!ptr.bottom && ptrScrollableEl.scrollTop > 0)
24111 || (ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)
24112 )
24113 ) {
24114 targetIsScrollable = true;
24115 }
24116 });
24117 }
24118 if (targetIsScrollable) {
24119 isTouched = false;
24120 return;
24121 }
24122 if (dynamicTriggerDistance) {
24123 triggerDistance = $el.attr('data-ptr-distance');
24124 if (triggerDistance.indexOf('%') >= 0) { triggerDistance = (scrollHeight * parseInt(triggerDistance, 10)) / 100; }
24125 }
24126 startTranslate = $el.hasClass('ptr-refreshing') ? triggerDistance : 0;
24127 if (scrollHeight === offsetHeight || Device.os !== 'ios' || isMaterial) {
24128 useTranslate = true;
24129 } else {
24130 useTranslate = false;
24131 }
24132 forceUseTranslate = false;
24133 }
24134 isMoved = true;
24135 touchesDiff = pageY - touchesStart.y;
24136
24137 if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) { wasScrolled = true; }
24138
24139 var ptrStarted = ptr.bottom
24140 ? (touchesDiff < 0 && scrollTop >= maxScrollTop) || scrollTop > maxScrollTop
24141 : (touchesDiff > 0 && scrollTop <= 0) || scrollTop < 0;
24142
24143 if (ptrStarted) {
24144 // iOS 8 fix
24145 if (Device.os === 'ios' && parseInt(Device.osVersion.split('.')[0], 10) > 7) {
24146 if (!ptr.bottom && scrollTop === 0 && !wasScrolled) { useTranslate = true; }
24147 if (ptr.bottom && scrollTop === maxScrollTop && !wasScrolled) { useTranslate = true; }
24148 }
24149
24150 if (!useTranslate && ptr.bottom && !isMaterial) {
24151 $el.css('-webkit-overflow-scrolling', 'auto');
24152 $el.scrollTop(maxScrollTop);
24153 forceUseTranslate = true;
24154 }
24155
24156 if (useTranslate || forceUseTranslate) {
24157 if (e.cancelable) {
24158 e.preventDefault();
24159 }
24160 translate = (ptr.bottom ? -1 * (Math.pow( Math.abs(touchesDiff), 0.85 )) : Math.pow( touchesDiff, 0.85 )) + startTranslate;
24161 if (isMaterial) {
24162 $preloaderEl.transform(("translate3d(0," + translate + "px,0)"))
24163 .find('.ptr-arrow').transform(("rotate(" + ((180 * (Math.abs(touchesDiff) / 66)) + 100) + "deg)"));
24164 } else {
24165 // eslint-disable-next-line
24166 if (ptr.bottom) {
24167 $el.children().transform(("translate3d(0," + translate + "px,0)"));
24168 } else {
24169 $el.transform(("translate3d(0," + translate + "px,0)"));
24170 }
24171 }
24172 }
24173
24174 if (((useTranslate || forceUseTranslate) && (Math.pow( Math.abs(touchesDiff), 0.85 )) > triggerDistance) || (!useTranslate && Math.abs(touchesDiff) >= triggerDistance * 2)) {
24175 refresh = true;
24176 $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
24177 } else {
24178 refresh = false;
24179 $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
24180 }
24181 if (!pullStarted) {
24182 $el.trigger('ptr:pullstart');
24183 ptr.emit('local::pullStart ptrPullStart', $el[0]);
24184 pullStarted = true;
24185 }
24186 $el.trigger('ptr:pullmove', {
24187 event: e,
24188 scrollTop: scrollTop,
24189 translate: translate,
24190 touchesDiff: touchesDiff,
24191 });
24192 ptr.emit('local::pullMove ptrPullMove', $el[0], {
24193 event: e,
24194 scrollTop: scrollTop,
24195 translate: translate,
24196 touchesDiff: touchesDiff,
24197 });
24198 } else {
24199 pullStarted = false;
24200 $el.removeClass('ptr-pull-up ptr-pull-down');
24201 refresh = false;
24202 }
24203 }
24204 function handleTouchEnd(e) {
24205 if (e.type === 'touchend' && e.changedTouches && e.changedTouches.length > 0 && touchId) {
24206 if (e.changedTouches[0].identifier !== touchId) {
24207 isTouched = false;
24208 isScrolling = false;
24209 isMoved = false;
24210 touchId = null;
24211 return;
24212 }
24213 }
24214 if (!isTouched || !isMoved) {
24215 isTouched = false;
24216 isMoved = false;
24217 return;
24218 }
24219 if (translate) {
24220 $el.addClass('ptr-transitioning');
24221 translate = 0;
24222 }
24223 if (isMaterial) {
24224 $preloaderEl.transform('')
24225 .find('.ptr-arrow').transform('');
24226 } else {
24227 // eslint-disable-next-line
24228 if (ptr.bottom) {
24229 $el.children().transform('');
24230 } else {
24231 $el.transform('');
24232 }
24233 }
24234
24235 if (!useTranslate && ptr.bottom && !isMaterial) {
24236 $el.css('-webkit-overflow-scrolling', '');
24237 }
24238
24239 if (refresh) {
24240 $el.addClass('ptr-refreshing');
24241 $el.trigger('ptr:refresh', ptr.done);
24242 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
24243 } else {
24244 $el.removeClass('ptr-pull-down');
24245 }
24246 isTouched = false;
24247 isMoved = false;
24248 if (pullStarted) {
24249 $el.trigger('ptr:pullend');
24250 ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
24251 }
24252 }
24253
24254 if (!$pageEl.length || !$el.length) { return ptr; }
24255
24256 $el[0].f7PullToRefresh = ptr;
24257
24258 // Events
24259 ptr.attachEvents = function attachEvents() {
24260 var passive = Support.passiveListener ? { passive: true } : false;
24261 $el.on(app.touchEvents.start, handleTouchStart, passive);
24262 app.on('touchmove:active', handleTouchMove);
24263 app.on('touchend:passive', handleTouchEnd);
24264 };
24265 ptr.detachEvents = function detachEvents() {
24266 var passive = Support.passiveListener ? { passive: true } : false;
24267 $el.off(app.touchEvents.start, handleTouchStart, passive);
24268 app.off('touchmove:active', handleTouchMove);
24269 app.off('touchend:passive', handleTouchEnd);
24270 };
24271
24272 // Install Modules
24273 ptr.useModules();
24274
24275 // Init
24276 ptr.init();
24277
24278 return ptr;
24279 }
24280
24281 if ( Framework7Class$$1 ) PullToRefresh.__proto__ = Framework7Class$$1;
24282 PullToRefresh.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
24283 PullToRefresh.prototype.constructor = PullToRefresh;
24284
24285 PullToRefresh.prototype.init = function init () {
24286 var ptr = this;
24287 ptr.attachEvents();
24288 };
24289
24290 PullToRefresh.prototype.destroy = function destroy () {
24291 var ptr = this;
24292 ptr.emit('local::beforeDestroy ptrBeforeDestroy', ptr);
24293 ptr.$el.trigger('ptr:beforedestroy', ptr);
24294 delete ptr.el.f7PullToRefresh;
24295 ptr.detachEvents();
24296 Utils.deleteProps(ptr);
24297 ptr = null;
24298 };
24299
24300 return PullToRefresh;
24301 }(Framework7Class));
24302
24303 var PullToRefresh$1 = {
24304 name: 'pullToRefresh',
24305 create: function create() {
24306 var app = this;
24307 app.ptr = Utils.extend(
24308 ConstructorMethods({
24309 defaultSelector: '.ptr-content',
24310 constructor: PullToRefresh,
24311 app: app,
24312 domProp: 'f7PullToRefresh',
24313 }),
24314 {
24315 done: function done(el) {
24316 var ptr = app.ptr.get(el);
24317 if (ptr) { return ptr.done(); }
24318 return undefined;
24319 },
24320 refresh: function refresh(el) {
24321 var ptr = app.ptr.get(el);
24322 if (ptr) { return ptr.refresh(); }
24323 return undefined;
24324 },
24325 }
24326 );
24327 },
24328 static: {
24329 PullToRefresh: PullToRefresh,
24330 },
24331 on: {
24332 tabMounted: function tabMounted(tabEl) {
24333 var app = this;
24334 var $tabEl = $(tabEl);
24335 $tabEl.find('.ptr-content').each(function (index, el) {
24336 app.ptr.create(el);
24337 });
24338 },
24339 tabBeforeRemove: function tabBeforeRemove(tabEl) {
24340 var $tabEl = $(tabEl);
24341 var app = this;
24342 $tabEl.find('.ptr-content').each(function (index, el) {
24343 app.ptr.destroy(el);
24344 });
24345 },
24346 pageInit: function pageInit(page) {
24347 var app = this;
24348 page.$el.find('.ptr-content').each(function (index, el) {
24349 app.ptr.create(el);
24350 });
24351 },
24352 pageBeforeRemove: function pageBeforeRemove(page) {
24353 var app = this;
24354 page.$el.find('.ptr-content').each(function (index, el) {
24355 app.ptr.destroy(el);
24356 });
24357 },
24358 },
24359 };
24360
24361 var Lazy = {
24362 destroy: function destroy(pageEl) {
24363 var $pageEl = $(pageEl).closest('.page');
24364 if (!$pageEl.length) { return; }
24365 if ($pageEl[0].f7LazyDestroy) {
24366 $pageEl[0].f7LazyDestroy();
24367 }
24368 },
24369 create: function create(pageEl) {
24370 var app = this;
24371 var $pageEl = $(pageEl).closest('.page').eq(0);
24372
24373 // Lazy images
24374 var $lazyLoadImages = $pageEl.find('.lazy');
24375 if ($lazyLoadImages.length === 0 && !$pageEl.hasClass('lazy')) { return; }
24376
24377 // Placeholder
24378 var placeholderSrc = app.params.lazy.placeholder;
24379
24380 if (placeholderSrc !== false) {
24381 $lazyLoadImages.each(function (index, lazyEl) {
24382 if ($(lazyEl).attr('data-src') && !$(lazyEl).attr('src')) { $(lazyEl).attr('src', placeholderSrc); }
24383 });
24384 }
24385
24386 // load image
24387 var imagesSequence = [];
24388 var imageIsLoading = false;
24389
24390 function onImageComplete(lazyEl) {
24391 if (imagesSequence.indexOf(lazyEl) >= 0) {
24392 imagesSequence.splice(imagesSequence.indexOf(lazyEl), 1);
24393 }
24394 imageIsLoading = false;
24395 if (app.params.lazy.sequential && imagesSequence.length > 0) {
24396 imageIsLoading = true;
24397 app.lazy.loadImage(imagesSequence[0], onImageComplete);
24398 }
24399 }
24400
24401 function observerCallback(entries, observer) {
24402 entries.forEach(function (entry) {
24403 if (entry.isIntersecting) {
24404 if (app.params.lazy.sequential && imageIsLoading) {
24405 if (imagesSequence.indexOf(entry.target) < 0) { imagesSequence.push(entry.target); }
24406 return;
24407 }
24408 // Load image
24409 imageIsLoading = true;
24410 app.lazy.loadImage(entry.target, onImageComplete);
24411 // Detach
24412 observer.unobserve(entry.target);
24413 }
24414 });
24415 }
24416 if (app.params.lazy.observer && Support.intersectionObserver) {
24417 var observer = $pageEl[0].f7LazyObserver;
24418 if (!observer) {
24419 observer = new win.IntersectionObserver(observerCallback, {
24420 root: $pageEl[0],
24421 });
24422 }
24423 $lazyLoadImages.each(function (index, el) {
24424 if (el.f7LazyObserverAdded) { return; }
24425 el.f7LazyObserverAdded = true;
24426 observer.observe(el);
24427 });
24428 if (!$pageEl[0].f7LazyDestroy) {
24429 $pageEl[0].f7LazyDestroy = function () {
24430 observer.disconnect();
24431 delete $pageEl[0].f7LazyDestroy;
24432 delete $pageEl[0].f7LazyObserver;
24433 };
24434 }
24435 return;
24436 }
24437
24438 function lazyHandler() {
24439 app.lazy.load($pageEl, function (lazyEl) {
24440 if (app.params.lazy.sequential && imageIsLoading) {
24441 if (imagesSequence.indexOf(lazyEl) < 0) { imagesSequence.push(lazyEl); }
24442 return;
24443 }
24444 imageIsLoading = true;
24445 app.lazy.loadImage(lazyEl, onImageComplete);
24446 });
24447 }
24448
24449 function attachEvents() {
24450 $pageEl[0].f7LazyAttached = true;
24451 $pageEl.on('lazy', lazyHandler);
24452 $pageEl.on('scroll', lazyHandler, true);
24453 $pageEl.find('.tab').on('tab:mounted tab:show', lazyHandler);
24454 app.on('resize', lazyHandler);
24455 }
24456 function detachEvents() {
24457 $pageEl[0].f7LazyAttached = false;
24458 delete $pageEl[0].f7LazyAttached;
24459 $pageEl.off('lazy', lazyHandler);
24460 $pageEl.off('scroll', lazyHandler, true);
24461 $pageEl.find('.tab').off('tab:mounted tab:show', lazyHandler);
24462 app.off('resize', lazyHandler);
24463 }
24464
24465 // Store detach function
24466 if (!$pageEl[0].f7LazyDestroy) {
24467 $pageEl[0].f7LazyDestroy = detachEvents;
24468 }
24469
24470 // Attach events
24471 if (!$pageEl[0].f7LazyAttached) {
24472 attachEvents();
24473 }
24474
24475 // Run loader on page load/init
24476 lazyHandler();
24477 },
24478 isInViewport: function isInViewport(lazyEl) {
24479 var app = this;
24480 var rect = lazyEl.getBoundingClientRect();
24481 var threshold = app.params.lazy.threshold || 0;
24482
24483 return (
24484 rect.top >= (0 - threshold)
24485 && rect.left >= (0 - threshold)
24486 && rect.top <= (app.height + threshold)
24487 && rect.left <= (app.width + threshold)
24488 );
24489 },
24490 loadImage: function loadImage(imageEl, callback) {
24491 var app = this;
24492 var $imageEl = $(imageEl);
24493
24494 var bg = $imageEl.attr('data-background');
24495 var src = bg || $imageEl.attr('data-src');
24496 if (!src) { return; }
24497 function onLoad() {
24498 $imageEl.removeClass('lazy').addClass('lazy-loaded');
24499 if (bg) {
24500 $imageEl.css('background-image', ("url(" + src + ")"));
24501 } else {
24502 $imageEl.attr('src', src);
24503 }
24504 if (callback) { callback(imageEl); }
24505 $imageEl.trigger('lazy:loaded');
24506 app.emit('lazyLoaded', $imageEl[0]);
24507 }
24508
24509 function onError() {
24510 $imageEl.removeClass('lazy').addClass('lazy-loaded');
24511 if (bg) {
24512 $imageEl.css('background-image', ("url(" + (app.params.lazy.placeholder || '') + ")"));
24513 } else {
24514 $imageEl.attr('src', app.params.lazy.placeholder || '');
24515 }
24516 if (callback) { callback(imageEl); }
24517 $imageEl.trigger('lazy:error');
24518 app.emit('lazyError', $imageEl[0]);
24519 }
24520 var image = new win.Image();
24521 image.onload = onLoad;
24522 image.onerror = onError;
24523 image.src = src;
24524
24525 $imageEl.removeAttr('data-src').removeAttr('data-background');
24526
24527 // Add loaded callback and events
24528 $imageEl.trigger('lazy:load');
24529 app.emit('lazyLoad', $imageEl[0]);
24530 },
24531 load: function load(pageEl, callback) {
24532 var app = this;
24533 var $pageEl = $(pageEl);
24534 if (!$pageEl.hasClass('page')) { $pageEl = $pageEl.parents('.page').eq(0); }
24535 if ($pageEl.length === 0) {
24536 return;
24537 }
24538 $pageEl.find('.lazy').each(function (index, lazyEl) {
24539 var $lazyEl = $(lazyEl);
24540 if ($lazyEl.parents('.tab:not(.tab-active)').length > 0) {
24541 return;
24542 }
24543 if (app.lazy.isInViewport(lazyEl)) {
24544 if (callback) { callback(lazyEl); }
24545 else { app.lazy.loadImage(lazyEl); }
24546 }
24547 });
24548 },
24549
24550 };
24551 var Lazy$1 = {
24552 name: 'lazy',
24553 params: {
24554 lazy: {
24555 placeholder: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEXCwsK592mkAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==',
24556 threshold: 0,
24557 sequential: true,
24558 observer: true,
24559 },
24560 },
24561 create: function create() {
24562 var app = this;
24563 Utils.extend(app, {
24564 lazy: {
24565 create: Lazy.create.bind(app),
24566 destroy: Lazy.destroy.bind(app),
24567 loadImage: Lazy.loadImage.bind(app),
24568 load: Lazy.load.bind(app),
24569 isInViewport: Lazy.isInViewport.bind(app),
24570 },
24571 });
24572 },
24573 on: {
24574 pageInit: function pageInit(page) {
24575 var app = this;
24576 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
24577 app.lazy.create(page.$el);
24578 }
24579 },
24580 pageAfterIn: function pageAfterIn(page) {
24581 var app = this;
24582 if (app.params.lazy.observer && Support.intersectionObserver) { return; }
24583 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
24584 app.lazy.create(page.$el);
24585 }
24586 },
24587 pageBeforeRemove: function pageBeforeRemove(page) {
24588 var app = this;
24589 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
24590 app.lazy.destroy(page.$el);
24591 }
24592 },
24593 tabMounted: function tabMounted(tabEl) {
24594 var app = this;
24595 var $tabEl = $(tabEl);
24596 if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
24597 app.lazy.create($tabEl);
24598 }
24599 },
24600 tabBeforeRemove: function tabBeforeRemove(tabEl) {
24601 var app = this;
24602 if (app.params.lazy.observer && Support.intersectionObserver) { return; }
24603 var $tabEl = $(tabEl);
24604 if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
24605 app.lazy.destroy($tabEl);
24606 }
24607 },
24608 },
24609 };
24610
24611 var DataTable = /*@__PURE__*/(function (Framework7Class$$1) {
24612 function DataTable(app, params) {
24613 if ( params === void 0 ) params = {};
24614
24615 Framework7Class$$1.call(this, params, [app]);
24616
24617 var table = this;
24618
24619 var defaults = {
24620
24621 };
24622
24623 // Extend defaults with modules params
24624 table.useModulesParams(defaults);
24625
24626 table.params = Utils.extend(defaults, params);
24627
24628 // El
24629 var $el = $(table.params.el);
24630 if ($el.length === 0) { return undefined; }
24631
24632 table.$el = $el;
24633 table.el = $el[0];
24634
24635 if (table.$el[0].f7DataTable) {
24636 var instance = table.$el[0].f7DataTable;
24637 table.destroy();
24638 return instance;
24639 }
24640
24641 table.$el[0].f7DataTable = table;
24642
24643 Utils.extend(table, {
24644 collapsible: $el.hasClass('data-table-collapsible'),
24645 // Headers
24646 $headerEl: $el.find('.data-table-header'),
24647 $headerSelectedEl: $el.find('.data-table-header-selected'),
24648 });
24649
24650 // Events
24651 function handleChange(e) {
24652 if (e.detail && e.detail.sentByF7DataTable) {
24653 // Scripted event, don't do anything
24654 return;
24655 }
24656 var $inputEl = $(this);
24657 var checked = $inputEl[0].checked;
24658 var columnIndex = $inputEl.parents('td,th').index();
24659
24660 if ($inputEl.parents('thead').length > 0) {
24661 if (columnIndex === 0) {
24662 $el
24663 .find('tbody tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
24664 }
24665 $el
24666 .find(("tbody tr td:nth-child(" + (columnIndex + 1) + ") input"))
24667 .prop('checked', checked)
24668 .trigger('change', { sentByF7DataTable: true });
24669 } else {
24670 if (columnIndex === 0) {
24671 $inputEl.parents('tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
24672 }
24673
24674 if (!checked) {
24675 $el.find(("thead .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]")).prop('checked', false);
24676 } else if ($el.find(("tbody .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]:checked")).length === $el.find('tbody tr').length) {
24677 $el.find(("thead .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]")).prop('checked', true).trigger('change', { sentByF7DataTable: true });
24678 }
24679 }
24680 table.checkSelectedHeader();
24681 }
24682 function handleSortableClick() {
24683 var $cellEl = $(this);
24684 var isActive = $cellEl.hasClass('sortable-cell-active');
24685 var currentSort = $cellEl.hasClass('sortable-desc') ? 'desc' : 'asc';
24686 var newSort;
24687 if (isActive) {
24688 newSort = currentSort === 'desc' ? 'asc' : 'desc';
24689 $cellEl.removeClass('sortable-desc sortable-asc').addClass(("sortable-" + newSort));
24690 } else {
24691 $el.find('thead .sortable-cell-active').removeClass('sortable-cell-active');
24692 $cellEl.addClass('sortable-cell-active');
24693 newSort = currentSort;
24694 }
24695 $cellEl.trigger('datatable:sort', newSort);
24696 table.emit('local::sort dataTableSort', table, newSort);
24697 }
24698 table.attachEvents = function attachEvents() {
24699 table.$el.on('change', '.checkbox-cell input[type="checkbox"]', handleChange);
24700 table.$el.find('thead .sortable-cell').on('click', handleSortableClick);
24701 };
24702 table.detachEvents = function detachEvents() {
24703 table.$el.off('change', '.checkbox-cell input[type="checkbox"]', handleChange);
24704 table.$el.find('thead .sortable-cell').off('click', handleSortableClick);
24705 };
24706
24707 // Install Modules
24708 table.useModules();
24709
24710 // Init
24711 table.init();
24712
24713 return table;
24714 }
24715
24716 if ( Framework7Class$$1 ) DataTable.__proto__ = Framework7Class$$1;
24717 DataTable.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
24718 DataTable.prototype.constructor = DataTable;
24719
24720 DataTable.prototype.setCollapsibleLabels = function setCollapsibleLabels () {
24721 var table = this;
24722 if (!table.collapsible) { return; }
24723 table.$el.find('tbody td:not(.checkbox-cell)').each(function (index, el) {
24724 var $el = $(el);
24725 var elIndex = $el.index();
24726 var collpsibleTitle = $el.attr('data-collapsible-title');
24727 if (!collpsibleTitle && collpsibleTitle !== '') {
24728 $el.attr('data-collapsible-title', table.$el.find('thead th').eq(elIndex).text());
24729 }
24730 });
24731 };
24732
24733 DataTable.prototype.checkSelectedHeader = function checkSelectedHeader () {
24734 var table = this;
24735 if (table.$headerEl.length > 0 && table.$headerSelectedEl.length > 0) {
24736 var checkedItems = table.$el.find('tbody .checkbox-cell input:checked').length;
24737 table.$el[checkedItems > 0 ? 'addClass' : 'removeClass']('data-table-has-checked');
24738 table.$headerSelectedEl.find('.data-table-selected-count').text(checkedItems);
24739 }
24740 };
24741
24742 DataTable.prototype.init = function init () {
24743 var table = this;
24744 table.attachEvents();
24745 table.setCollapsibleLabels();
24746 table.checkSelectedHeader();
24747 };
24748
24749 DataTable.prototype.destroy = function destroy () {
24750 var table = this;
24751
24752 table.$el.trigger('datatable:beforedestroy', table);
24753 table.emit('local::beforeDestroy dataTableBeforeDestroy', table);
24754
24755 table.attachEvents();
24756
24757 if (table.$el[0]) {
24758 table.$el[0].f7DataTable = null;
24759 delete table.$el[0].f7DataTable;
24760 }
24761 Utils.deleteProps(table);
24762 table = null;
24763 };
24764
24765 return DataTable;
24766 }(Framework7Class));
24767
24768 var DataTable$1 = {
24769 name: 'dataTable',
24770 static: {
24771 DataTable: DataTable,
24772 },
24773 create: function create() {
24774 var app = this;
24775 app.dataTable = ConstructorMethods({
24776 defaultSelector: '.data-table',
24777 constructor: DataTable,
24778 app: app,
24779 domProp: 'f7DataTable',
24780 });
24781 },
24782 on: {
24783 tabBeforeRemove: function tabBeforeRemove(tabEl) {
24784 var app = this;
24785 $(tabEl).find('.data-table-init').each(function (index, tableEl) {
24786 app.dataTable.destroy(tableEl);
24787 });
24788 },
24789 tabMounted: function tabMounted(tabEl) {
24790 var app = this;
24791 $(tabEl).find('.data-table-init').each(function (index, tableEl) {
24792 app.dataTable.create({ el: tableEl });
24793 });
24794 },
24795 pageBeforeRemove: function pageBeforeRemove(page) {
24796 var app = this;
24797 page.$el.find('.data-table-init').each(function (index, tableEl) {
24798 app.dataTable.destroy(tableEl);
24799 });
24800 },
24801 pageInit: function pageInit(page) {
24802 var app = this;
24803 page.$el.find('.data-table-init').each(function (index, tableEl) {
24804 app.dataTable.create({ el: tableEl });
24805 });
24806 },
24807 },
24808 vnode: {
24809 'data-table-init': {
24810 insert: function insert(vnode) {
24811 var app = this;
24812 var tableEl = vnode.elm;
24813 app.dataTable.create({ el: tableEl });
24814 },
24815 destroy: function destroy(vnode) {
24816 var app = this;
24817 var tableEl = vnode.elm;
24818 app.dataTable.destroy(tableEl);
24819 },
24820 },
24821 },
24822 };
24823
24824 var Fab = {
24825 morphOpen: function morphOpen(fabEl, targetEl) {
24826 var app = this;
24827 var $fabEl = $(fabEl);
24828 var $targetEl = $(targetEl);
24829 if ($targetEl.length === 0) { return; }
24830
24831 $targetEl.transition(0).addClass('fab-morph-target-visible');
24832 var target = {
24833 width: $targetEl[0].offsetWidth,
24834 height: $targetEl[0].offsetHeight,
24835 offset: $targetEl.offset(),
24836 borderRadius: $targetEl.css('border-radius'),
24837 zIndex: $targetEl.css('z-index'),
24838 };
24839 var fab = {
24840 width: $fabEl[0].offsetWidth,
24841 height: $fabEl[0].offsetHeight,
24842 offset: $fabEl.offset(),
24843 translateX: Utils.getTranslate($fabEl[0], 'x'),
24844 translateY: Utils.getTranslate($fabEl[0], 'y'),
24845 };
24846
24847 $fabEl[0].f7FabMorphData = {
24848 $targetEl: $targetEl,
24849 target: target,
24850 fab: fab,
24851 };
24852
24853 var diffX = (fab.offset.left + (fab.width / 2))
24854 - (target.offset.left + (target.width / 2))
24855 - fab.translateX;
24856 var diffY = (fab.offset.top + (fab.height / 2))
24857 - (target.offset.top + (target.height / 2))
24858 - fab.translateY;
24859 var scaleX = target.width / fab.width;
24860 var scaleY = target.height / fab.height;
24861
24862 var borderRadius = Math.ceil(parseInt(target.borderRadius, 10) / Math.max(scaleX, scaleY));
24863 if (borderRadius > 0) { borderRadius += 2; }
24864
24865 $fabEl[0].f7FabMorphResizeHandler = function resizeHandler() {
24866 $fabEl.transition(0).transform('');
24867 $targetEl.transition(0);
24868 target.width = $targetEl[0].offsetWidth;
24869 target.height = $targetEl[0].offsetHeight;
24870 target.offset = $targetEl.offset();
24871 fab.offset = $fabEl.offset();
24872
24873 var diffXNew = (fab.offset.left + (fab.width / 2))
24874 - (target.offset.left + (target.width / 2))
24875 - fab.translateX;
24876 var diffYNew = (fab.offset.top + (fab.height / 2))
24877 - (target.offset.top + (target.height / 2))
24878 - fab.translateY;
24879 var scaleXNew = target.width / fab.width;
24880 var scaleYNew = target.height / fab.height;
24881
24882 $fabEl.transform(("translate3d(" + (-diffXNew) + "px, " + (-diffYNew) + "px, 0) scale(" + scaleXNew + ", " + scaleYNew + ")"));
24883 };
24884
24885 $targetEl
24886 .css('opacity', 0)
24887 .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
24888 $fabEl
24889 .addClass('fab-opened')
24890 .css('z-index', target.zIndex - 1)
24891 .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0)"));
24892 $fabEl.transitionEnd(function () {
24893 $targetEl.transition('');
24894 Utils.nextFrame(function () {
24895 $targetEl.css('opacity', 1).transform('scale(1,1)');
24896 $fabEl
24897 .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0) scale(" + scaleX + ", " + scaleY + ")"))
24898 .css('border-radius', (borderRadius + "px"))
24899 .css('box-shadow', 'none');
24900 });
24901 app.on('resize', $fabEl[0].f7FabMorphResizeHandler);
24902 if ($targetEl.parents('.page-content').length > 0) {
24903 $targetEl.parents('.page-content').on('scroll', $fabEl[0].f7FabMorphResizeHandler);
24904 }
24905 });
24906 },
24907 morphClose: function morphClose(fabEl) {
24908 var app = this;
24909 var $fabEl = $(fabEl);
24910 var morphData = $fabEl[0].f7FabMorphData;
24911 if (!morphData) { return; }
24912 var $targetEl = morphData.$targetEl;
24913 var target = morphData.target;
24914 var fab = morphData.fab;
24915 if ($targetEl.length === 0) { return; }
24916
24917 var diffX = (fab.offset.left + (fab.width / 2))
24918 - (target.offset.left + (target.width / 2))
24919 - fab.translateX;
24920 var diffY = (fab.offset.top + (fab.height / 2))
24921 - (target.offset.top + (target.height / 2))
24922 - fab.translateY;
24923 var scaleX = target.width / fab.width;
24924 var scaleY = target.height / fab.height;
24925
24926 app.off('resize', $fabEl[0].f7FabMorphResizeHandler);
24927 if ($targetEl.parents('.page-content').length > 0) {
24928 $targetEl.parents('.page-content').off('scroll', $fabEl[0].f7FabMorphResizeHandler);
24929 }
24930
24931 $targetEl
24932 .css('opacity', 0)
24933 .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
24934 $fabEl
24935 .transition('')
24936 .css('box-shadow', '')
24937 .css('border-radius', '')
24938 .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0)"));
24939 $fabEl.transitionEnd(function () {
24940 $fabEl
24941 .css('z-index', '')
24942 .removeClass('fab-opened')
24943 .transform('');
24944 Utils.nextFrame(function () {
24945 $fabEl.transitionEnd(function () {
24946 $targetEl
24947 .removeClass('fab-morph-target-visible')
24948 .css('opacity', '')
24949 .transform('')
24950 .transition('');
24951 });
24952 });
24953 });
24954 },
24955 open: function open(fabEl, targetEl) {
24956 var app = this;
24957 var $fabEl = $(fabEl).eq(0);
24958 var $buttonsEl = $fabEl.find('.fab-buttons');
24959 if (!$fabEl.length) { return; }
24960 if ($fabEl.hasClass('fab-opened')) { return; }
24961 if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
24962
24963 if (app.fab.openedEl) {
24964 if (app.fab.openedEl === $fabEl[0]) { return; }
24965 app.fab.close(app.fab.openedEl);
24966 }
24967 app.fab.openedEl = $fabEl[0];
24968 if ($fabEl.hasClass('fab-morph')) {
24969 app.fab.morphOpen($fabEl, targetEl || $fabEl.attr('data-morph-to'));
24970 } else {
24971 $fabEl.addClass('fab-opened');
24972 }
24973 $fabEl.trigger('fab:open');
24974 },
24975 close: function close(fabEl) {
24976 if ( fabEl === void 0 ) fabEl = '.fab-opened';
24977
24978 var app = this;
24979 var $fabEl = $(fabEl).eq(0);
24980 var $buttonsEl = $fabEl.find('.fab-buttons');
24981 if (!$fabEl.length) { return; }
24982 if (!$fabEl.hasClass('fab-opened')) { return; }
24983 if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
24984 app.fab.openedEl = null;
24985 if ($fabEl.hasClass('fab-morph')) {
24986 app.fab.morphClose($fabEl);
24987 } else {
24988 $fabEl.removeClass('fab-opened');
24989 }
24990 $fabEl.trigger('fab:close');
24991 },
24992 toggle: function toggle(fabEl) {
24993 var app = this;
24994 var $fabEl = $(fabEl);
24995 if (!$fabEl.hasClass('fab-opened')) { app.fab.open(fabEl); }
24996 else { app.fab.close(fabEl); }
24997 },
24998 };
24999
25000 var Fab$1 = {
25001 name: 'fab',
25002 create: function create() {
25003 var app = this;
25004 Utils.extend(app, {
25005 fab: {
25006 openedEl: null,
25007 morphOpen: Fab.morphOpen.bind(app),
25008 morphClose: Fab.morphClose.bind(app),
25009 open: Fab.open.bind(app),
25010 close: Fab.close.bind(app),
25011 toggle: Fab.toggle.bind(app),
25012 },
25013 });
25014 },
25015 clicks: {
25016 '.fab > a': function open($clickedEl) {
25017 var app = this;
25018 app.fab.toggle($clickedEl.parents('.fab'));
25019 },
25020 '.fab-open': function open($clickedEl, data) {
25021 if ( data === void 0 ) data = {};
25022
25023 var app = this;
25024 app.fab.open(data.fab);
25025 },
25026 '.fab-close': function close($clickedEl, data) {
25027 if ( data === void 0 ) data = {};
25028
25029 var app = this;
25030 app.fab.close(data.fab);
25031 },
25032 },
25033 };
25034
25035 var Searchbar = /*@__PURE__*/(function (FrameworkClass) {
25036 function Searchbar(app, params) {
25037 if ( params === void 0 ) params = {};
25038
25039 FrameworkClass.call(this, params, [app]);
25040
25041 var sb = this;
25042
25043 var defaults = {
25044 el: undefined,
25045 inputEl: undefined,
25046 inputEvents: 'change input compositionend',
25047 disableButton: true,
25048 disableButtonEl: undefined,
25049 backdropEl: undefined,
25050 searchContainer: undefined, // container to search, HTMLElement or CSS selector
25051 searchItem: 'li', // single item selector, CSS selector
25052 searchIn: undefined, // where to search in item, CSS selector
25053 searchGroup: '.list-group',
25054 searchGroupTitle: '.item-divider, .list-group-title',
25055 ignore: '.searchbar-ignore',
25056 foundEl: '.searchbar-found',
25057 notFoundEl: '.searchbar-not-found',
25058 hideOnEnableEl: '.searchbar-hide-on-enable',
25059 hideOnSearchEl: '.searchbar-hide-on-search',
25060 backdrop: true,
25061 removeDiacritics: true,
25062 customSearch: false,
25063 hideDividers: true,
25064 hideGroups: true,
25065 disableOnBackdropClick: true,
25066 expandable: false,
25067 };
25068
25069 // Extend defaults with modules params
25070 sb.useModulesParams(defaults);
25071
25072 sb.params = Utils.extend(defaults, params);
25073
25074 var $el = $(sb.params.el);
25075 if ($el.length === 0) { return sb; }
25076
25077 if ($el[0].f7Searchbar) { return $el[0].f7Searchbar; }
25078
25079 $el[0].f7Searchbar = sb;
25080
25081 var $pageEl;
25082 var $navbarEl = $el.parents('.navbar-inner');
25083 if ($el.parents('.page').length > 0) {
25084 $pageEl = $el.parents('.page');
25085 } else if ($navbarEl.length > 0) {
25086 $pageEl = $(app.navbar.getPageByEl($navbarEl[0]));
25087 if (!$pageEl.length) {
25088 var $currentPageEl = $el.parents('.view').find('.page-current');
25089 if ($currentPageEl[0] && $currentPageEl[0].f7Page && $currentPageEl[0].f7Page.navbarEl === $navbarEl[0]) {
25090 $pageEl = $currentPageEl;
25091 }
25092 }
25093 }
25094
25095 var $foundEl;
25096 if (params.foundEl) {
25097 $foundEl = $(params.foundEl);
25098 } else if (typeof sb.params.foundEl === 'string' && $pageEl) {
25099 $foundEl = $pageEl.find(sb.params.foundEl);
25100 }
25101
25102 var $notFoundEl;
25103 if (params.notFoundEl) {
25104 $notFoundEl = $(params.notFoundEl);
25105 } else if (typeof sb.params.notFoundEl === 'string' && $pageEl) {
25106 $notFoundEl = $pageEl.find(sb.params.notFoundEl);
25107 }
25108
25109 var $hideOnEnableEl;
25110 if (params.hideOnEnableEl) {
25111 $hideOnEnableEl = $(params.hideOnEnableEl);
25112 } else if (typeof sb.params.hideOnEnableEl === 'string' && $pageEl) {
25113 $hideOnEnableEl = $pageEl.find(sb.params.hideOnEnableEl);
25114 }
25115
25116 var $hideOnSearchEl;
25117 if (params.hideOnSearchEl) {
25118 $hideOnSearchEl = $(params.hideOnSearchEl);
25119 } else if (typeof sb.params.hideOnSearchEl === 'string' && $pageEl) {
25120 $hideOnSearchEl = $pageEl.find(sb.params.hideOnSearchEl);
25121 }
25122
25123 var $backdropEl;
25124 if (sb.params.backdrop) {
25125 if (sb.params.backdropEl) {
25126 $backdropEl = $(sb.params.backdropEl);
25127 } else if ($pageEl && $pageEl.length > 0) {
25128 $backdropEl = $pageEl.find('.searchbar-backdrop');
25129 } else {
25130 $backdropEl = $el.siblings('.searchbar-backdrop');
25131 }
25132 if ($backdropEl.length === 0) {
25133 $backdropEl = $('<div class="searchbar-backdrop"></div>');
25134 if ($pageEl && $pageEl.length) {
25135 if ($el.parents($pageEl).length > 0 && $navbarEl && $el.parents($navbarEl).length === 0) {
25136 $backdropEl.insertBefore($el);
25137 } else {
25138 $backdropEl.insertBefore($pageEl.find('.page-content').eq(0));
25139 }
25140 } else {
25141 $backdropEl.insertBefore($el);
25142 }
25143 }
25144 }
25145
25146 var $searchContainer;
25147 if (sb.params.searchContainer) {
25148 $searchContainer = $(sb.params.searchContainer);
25149 }
25150
25151 var $inputEl;
25152 if (sb.params.inputEl) {
25153 $inputEl = $(sb.params.inputEl);
25154 } else {
25155 $inputEl = $el.find('input[type="search"]').eq(0);
25156 }
25157
25158 var $disableButtonEl;
25159 if (sb.params.disableButton) {
25160 if (sb.params.disableButtonEl) {
25161 $disableButtonEl = $(sb.params.disableButtonEl);
25162 } else {
25163 $disableButtonEl = $el.find('.searchbar-disable-button');
25164 }
25165 }
25166
25167 Utils.extend(sb, {
25168 app: app,
25169 view: app.views.get($el.parents('.view')),
25170 $el: $el,
25171 el: $el[0],
25172 $backdropEl: $backdropEl,
25173 backdropEl: $backdropEl && $backdropEl[0],
25174 $searchContainer: $searchContainer,
25175 searchContainer: $searchContainer && $searchContainer[0],
25176 $inputEl: $inputEl,
25177 inputEl: $inputEl[0],
25178 $disableButtonEl: $disableButtonEl,
25179 disableButtonEl: $disableButtonEl && $disableButtonEl[0],
25180 disableButtonHasMargin: false,
25181 $pageEl: $pageEl,
25182 pageEl: $pageEl && $pageEl[0],
25183 $navbarEl: $navbarEl,
25184 navbarEl: $navbarEl && $navbarEl[0],
25185 $foundEl: $foundEl,
25186 foundEl: $foundEl && $foundEl[0],
25187 $notFoundEl: $notFoundEl,
25188 notFoundEl: $notFoundEl && $notFoundEl[0],
25189 $hideOnEnableEl: $hideOnEnableEl,
25190 hideOnEnableEl: $hideOnEnableEl && $hideOnEnableEl[0],
25191 $hideOnSearchEl: $hideOnSearchEl,
25192 hideOnSearchEl: $hideOnSearchEl && $hideOnSearchEl[0],
25193 previousQuery: '',
25194 query: '',
25195 isVirtualList: $searchContainer && $searchContainer.hasClass('virtual-list'),
25196 virtualList: undefined,
25197 enabled: false,
25198 expandable: sb.params.expandable || $el.hasClass('searchbar-expandable'),
25199 });
25200
25201 // Events
25202 function preventSubmit(e) {
25203 e.preventDefault();
25204 }
25205 function onInputFocus(e) {
25206 sb.enable(e);
25207 sb.$el.addClass('searchbar-focused');
25208 }
25209 function onInputBlur() {
25210 sb.$el.removeClass('searchbar-focused');
25211 }
25212 function onInputChange() {
25213 var value = sb.$inputEl.val().trim();
25214 if (
25215 (
25216 (sb.$searchContainer && sb.$searchContainer.length > 0)
25217 && (sb.params.searchIn || sb.isVirtualList || sb.params.searchIn === sb.params.searchItem)
25218 )
25219 || sb.params.customSearch
25220 ) {
25221 sb.search(value, true);
25222 }
25223 }
25224 function onInputClear(e, previousValue) {
25225 sb.$el.trigger('searchbar:clear', previousValue);
25226 sb.emit('local::clear searchbarClear', sb, previousValue);
25227 }
25228 function disableOnClick(e) {
25229 sb.disable(e);
25230 }
25231 function onPageBeforeOut() {
25232 if (!sb || (sb && !sb.$el)) { return; }
25233 if (sb.enabled) {
25234 sb.$el.removeClass('searchbar-enabled');
25235 if (sb.expandable) {
25236 sb.$el.parents('.navbar-inner').removeClass('with-searchbar-expandable-enabled');
25237 }
25238 }
25239 }
25240 function onPageBeforeIn() {
25241 if (!sb || (sb && !sb.$el)) { return; }
25242 if (sb.enabled) {
25243 sb.$el.addClass('searchbar-enabled');
25244 if (sb.expandable) {
25245 sb.$el.parents('.navbar-inner').addClass('with-searchbar-expandable-enabled');
25246 }
25247 }
25248 }
25249 sb.attachEvents = function attachEvents() {
25250 $el.on('submit', preventSubmit);
25251 if (sb.params.disableButton) {
25252 sb.$disableButtonEl.on('click', disableOnClick);
25253 }
25254 if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
25255 sb.$backdropEl.on('click', disableOnClick);
25256 }
25257 if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
25258 sb.$pageEl.on('page:beforeout', onPageBeforeOut);
25259 sb.$pageEl.on('page:beforein', onPageBeforeIn);
25260 }
25261 sb.$inputEl.on('focus', onInputFocus);
25262 sb.$inputEl.on('blur', onInputBlur);
25263 sb.$inputEl.on(sb.params.inputEvents, onInputChange);
25264 sb.$inputEl.on('input:clear', onInputClear);
25265 };
25266 sb.detachEvents = function detachEvents() {
25267 $el.off('submit', preventSubmit);
25268 if (sb.params.disableButton) {
25269 sb.$disableButtonEl.off('click', disableOnClick);
25270 }
25271 if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
25272 sb.$backdropEl.off('click', disableOnClick);
25273 }
25274 if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
25275 sb.$pageEl.off('page:beforeout', onPageBeforeOut);
25276 sb.$pageEl.off('page:beforein', onPageBeforeIn);
25277 }
25278 sb.$inputEl.off('focus', onInputFocus);
25279 sb.$inputEl.off('blur', onInputBlur);
25280 sb.$inputEl.off(sb.params.inputEvents, onInputChange);
25281 sb.$inputEl.off('input:clear', onInputClear);
25282 };
25283
25284 // Install Modules
25285 sb.useModules();
25286
25287 // Init
25288 sb.init();
25289
25290 return sb;
25291 }
25292
25293 if ( FrameworkClass ) Searchbar.__proto__ = FrameworkClass;
25294 Searchbar.prototype = Object.create( FrameworkClass && FrameworkClass.prototype );
25295 Searchbar.prototype.constructor = Searchbar;
25296
25297 Searchbar.prototype.clear = function clear (e) {
25298 var sb = this;
25299 if (!sb.query && e && $(e.target).hasClass('searchbar-clear')) {
25300 sb.disable();
25301 return sb;
25302 }
25303 var previousQuery = sb.value;
25304 sb.$inputEl.val('').trigger('change').focus();
25305 sb.$el.trigger('searchbar:clear', previousQuery);
25306 sb.emit('local::clear searchbarClear', sb, previousQuery);
25307 return sb;
25308 };
25309
25310 Searchbar.prototype.setDisableButtonMargin = function setDisableButtonMargin () {
25311 var sb = this;
25312 if (sb.expandable) { return; }
25313 var app = sb.app;
25314 sb.$disableButtonEl.transition(0).show();
25315 sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px"));
25316 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
25317 sb._clientLeft = sb.$disableButtonEl[0].clientLeft;
25318 sb.$disableButtonEl.transition('');
25319 sb.disableButtonHasMargin = true;
25320 };
25321
25322 Searchbar.prototype.enable = function enable (setFocus) {
25323 var sb = this;
25324 if (sb.enabled) { return sb; }
25325 var app = sb.app;
25326 sb.enabled = true;
25327 function enable() {
25328 if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch) && !sb.$el.hasClass('searchbar-enabled') && !sb.query) {
25329 sb.backdropShow();
25330 }
25331 sb.$el.addClass('searchbar-enabled');
25332 if (!sb.$disableButtonEl || (sb.$disableButtonEl && sb.$disableButtonEl.length === 0)) {
25333 sb.$el.addClass('searchbar-enabled-no-disable-button');
25334 }
25335 if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme === 'ios') {
25336 if (!sb.disableButtonHasMargin) {
25337 sb.setDisableButtonMargin();
25338 }
25339 sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), '0px');
25340 }
25341 if (sb.expandable) {
25342 if (sb.$el.parents('.navbar-inner').hasClass('navbar-inner-large') && sb.$pageEl) {
25343 sb.$pageEl.find('.page-content').addClass('with-searchbar-expandable-enabled');
25344 }
25345 if (app.theme === 'md' && sb.$el.parent('.navbar-inner').parent('.navbar').length) {
25346 sb.$el.parent('.navbar-inner').parent('.navbar').addClass('with-searchbar-expandable-enabled');
25347 } else {
25348 sb.$el.parent('.navbar-inner').addClass('with-searchbar-expandable-enabled');
25349 sb.$el.parent('.navbar-inner-large').addClass('navbar-inner-large-collapsed');
25350 }
25351 }
25352 if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.addClass('hidden-by-searchbar'); }
25353 sb.$el.trigger('searchbar:enable');
25354 sb.emit('local::enable searchbarEnable', sb);
25355 }
25356 var needsFocus = false;
25357 if (setFocus === true) {
25358 if (doc.activeElement !== sb.inputEl) {
25359 needsFocus = true;
25360 }
25361 }
25362 var isIos = app.device.ios && app.theme === 'ios';
25363 if (isIos) {
25364 if (sb.expandable) {
25365 if (needsFocus) { sb.$inputEl.focus(); }
25366 enable();
25367 } else {
25368 if (needsFocus) { sb.$inputEl.focus(); }
25369 if (setFocus && (setFocus.type === 'focus' || setFocus === true)) {
25370 Utils.nextTick(function () {
25371 enable();
25372 }, 400);
25373 } else {
25374 enable();
25375 }
25376 }
25377 } else {
25378 if (needsFocus) { sb.$inputEl.focus(); }
25379 if (app.theme === 'md' && sb.expandable) {
25380 sb.$el.parents('.page, .view, .navbar-inner').scrollLeft(0);
25381 }
25382 enable();
25383 }
25384 return sb;
25385 };
25386
25387 Searchbar.prototype.disable = function disable () {
25388 var sb = this;
25389 if (!sb.enabled) { return sb; }
25390 var app = sb.app;
25391 sb.$inputEl.val('').trigger('change');
25392 sb.$el.removeClass('searchbar-enabled searchbar-focused searchbar-enabled-no-disable-button');
25393 if (sb.expandable) {
25394 if (sb.$el.parents('.navbar-inner').hasClass('navbar-inner-large') && sb.$pageEl) {
25395 sb.$pageEl.find('.page-content').removeClass('with-searchbar-expandable-enabled');
25396 }
25397 if (app.theme === 'md' && sb.$el.parent('.navbar-inner').parent('.navbar').length) {
25398 sb.$el.parent('.navbar-inner').parent('.navbar').removeClass('with-searchbar-expandable-enabled');
25399 } else {
25400 sb.$el.parent('.navbar-inner').removeClass('with-searchbar-expandable-enabled');
25401 if (sb.$pageEl) {
25402 sb.$pageEl.find('.page-content').trigger('scroll');
25403 }
25404 }
25405 }
25406 if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme === 'ios') {
25407 sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px"));
25408 }
25409 if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch)) {
25410 sb.backdropHide();
25411 }
25412
25413 sb.enabled = false;
25414
25415 sb.$inputEl.blur();
25416
25417 if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.removeClass('hidden-by-searchbar'); }
25418
25419 sb.$el.trigger('searchbar:disable');
25420 sb.emit('local::disable searchbarDisable', sb);
25421 return sb;
25422 };
25423
25424 Searchbar.prototype.toggle = function toggle () {
25425 var sb = this;
25426 if (sb.enabled) { sb.disable(); }
25427 else { sb.enable(true); }
25428 return sb;
25429 };
25430
25431 Searchbar.prototype.backdropShow = function backdropShow () {
25432 var sb = this;
25433 if (sb.$backdropEl) {
25434 sb.$backdropEl.addClass('searchbar-backdrop-in');
25435 }
25436 return sb;
25437 };
25438
25439 Searchbar.prototype.backdropHide = function backdropHide () {
25440 var sb = this;
25441 if (sb.$backdropEl) {
25442 sb.$backdropEl.removeClass('searchbar-backdrop-in');
25443 }
25444 return sb;
25445 };
25446
25447 Searchbar.prototype.search = function search (query, internal) {
25448 var sb = this;
25449 sb.previousQuery = sb.query || '';
25450 if (query === sb.previousQuery) { return sb; }
25451
25452 if (!internal) {
25453 if (!sb.enabled) {
25454 sb.enable();
25455 }
25456 sb.$inputEl.val(query);
25457 sb.$inputEl.trigger('input');
25458 }
25459 sb.query = query;
25460 sb.value = query;
25461
25462 var $searchContainer = sb.$searchContainer;
25463 var $el = sb.$el;
25464 var $foundEl = sb.$foundEl;
25465 var $notFoundEl = sb.$notFoundEl;
25466 var $hideOnSearchEl = sb.$hideOnSearchEl;
25467 var isVirtualList = sb.isVirtualList;
25468
25469 // Hide on search element
25470 if (query.length > 0 && $hideOnSearchEl) {
25471 $hideOnSearchEl.addClass('hidden-by-searchbar');
25472 } else if ($hideOnSearchEl) {
25473 $hideOnSearchEl.removeClass('hidden-by-searchbar');
25474 }
25475 // Add active/inactive classes on overlay
25476 if (
25477 ($searchContainer && $searchContainer.length && $el.hasClass('searchbar-enabled'))
25478 || (sb.params.customSearch && $el.hasClass('searchbar-enabled'))
25479 ) {
25480 if (query.length === 0) {
25481 sb.backdropShow();
25482 } else {
25483 sb.backdropHide();
25484 }
25485 }
25486
25487 if (sb.params.customSearch) {
25488 $el.trigger('searchbar:search', query, sb.previousQuery);
25489 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
25490 return sb;
25491 }
25492
25493 var foundItems = [];
25494 var vlQuery;
25495 if (isVirtualList) {
25496 sb.virtualList = $searchContainer[0].f7VirtualList;
25497 if (query.trim() === '') {
25498 sb.virtualList.resetFilter();
25499 if ($notFoundEl) { $notFoundEl.hide(); }
25500 if ($foundEl) { $foundEl.show(); }
25501 $el.trigger('searchbar:search', query, sb.previousQuery);
25502 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
25503 return sb;
25504 }
25505 vlQuery = sb.params.removeDiacritics ? Utils.removeDiacritics(query) : query;
25506 if (sb.virtualList.params.searchAll) {
25507 foundItems = sb.virtualList.params.searchAll(vlQuery, sb.virtualList.items) || [];
25508 } else if (sb.virtualList.params.searchByItem) {
25509 for (var i = 0; i < sb.virtualList.items.length; i += 1) {
25510 if (sb.virtualList.params.searchByItem(vlQuery, sb.virtualList.params.items[i], i)) {
25511 foundItems.push(i);
25512 }
25513 }
25514 }
25515 } else {
25516 var values;
25517 if (sb.params.removeDiacritics) { values = Utils.removeDiacritics(query.trim().toLowerCase()).split(' '); }
25518 else {
25519 values = query.trim().toLowerCase().split(' ');
25520 }
25521 $searchContainer.find(sb.params.searchItem).removeClass('hidden-by-searchbar').each(function (itemIndex, itemEl) {
25522 var $itemEl = $(itemEl);
25523 var compareWithText = [];
25524 var $searchIn = sb.params.searchIn ? $itemEl.find(sb.params.searchIn) : $itemEl;
25525 if (sb.params.searchIn === sb.params.searchItem) {
25526 $searchIn = $itemEl;
25527 }
25528 $searchIn.each(function (searchInIndex, searchInEl) {
25529 var itemText = $(searchInEl).text().trim().toLowerCase();
25530 if (sb.params.removeDiacritics) { itemText = Utils.removeDiacritics(itemText); }
25531 compareWithText.push(itemText);
25532 });
25533 compareWithText = compareWithText.join(' ');
25534 var wordsMatch = 0;
25535 for (var i = 0; i < values.length; i += 1) {
25536 if (compareWithText.indexOf(values[i]) >= 0) { wordsMatch += 1; }
25537 }
25538 if (wordsMatch !== values.length && !(sb.params.ignore && $itemEl.is(sb.params.ignore))) {
25539 $itemEl.addClass('hidden-by-searchbar');
25540 } else {
25541 foundItems.push($itemEl[0]);
25542 }
25543 });
25544
25545 if (sb.params.hideDividers) {
25546 $searchContainer.find(sb.params.searchGroupTitle).each(function (titleIndex, titleEl) {
25547 var $titleEl = $(titleEl);
25548 var $nextElements = $titleEl.nextAll(sb.params.searchItem);
25549 var hide = true;
25550 for (var i = 0; i < $nextElements.length; i += 1) {
25551 var $nextEl = $nextElements.eq(i);
25552 if ($nextEl.is(sb.params.searchGroupTitle)) { break; }
25553 if (!$nextEl.hasClass('hidden-by-searchbar')) {
25554 hide = false;
25555 }
25556 }
25557 var ignore = sb.params.ignore && $titleEl.is(sb.params.ignore);
25558 if (hide && !ignore) { $titleEl.addClass('hidden-by-searchbar'); }
25559 else { $titleEl.removeClass('hidden-by-searchbar'); }
25560 });
25561 }
25562 if (sb.params.hideGroups) {
25563 $searchContainer.find(sb.params.searchGroup).each(function (groupIndex, groupEl) {
25564 var $groupEl = $(groupEl);
25565 var ignore = sb.params.ignore && $groupEl.is(sb.params.ignore);
25566 // eslint-disable-next-line
25567 var notHidden = $groupEl.find(sb.params.searchItem).filter(function (index, el) {
25568 return !$(el).hasClass('hidden-by-searchbar');
25569 });
25570 if (notHidden.length === 0 && !ignore) {
25571 $groupEl.addClass('hidden-by-searchbar');
25572 } else {
25573 $groupEl.removeClass('hidden-by-searchbar');
25574 }
25575 });
25576 }
25577 }
25578
25579 if (foundItems.length === 0) {
25580 if ($notFoundEl) { $notFoundEl.show(); }
25581 if ($foundEl) { $foundEl.hide(); }
25582 } else {
25583 if ($notFoundEl) { $notFoundEl.hide(); }
25584 if ($foundEl) { $foundEl.show(); }
25585 }
25586 if (isVirtualList && sb.virtualList) {
25587 sb.virtualList.filterItems(foundItems);
25588 }
25589
25590 $el.trigger('searchbar:search', query, sb.previousQuery, foundItems);
25591 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery, foundItems);
25592
25593 return sb;
25594 };
25595
25596 Searchbar.prototype.init = function init () {
25597 var sb = this;
25598 sb.attachEvents();
25599 };
25600
25601 Searchbar.prototype.destroy = function destroy () {
25602 var sb = this;
25603 sb.emit('local::beforeDestroy searchbarBeforeDestroy', sb);
25604 sb.$el.trigger('searchbar:beforedestroy', sb);
25605 sb.detachEvents();
25606 if (sb.$el[0]) {
25607 sb.$el[0].f7Searchbar = null;
25608 delete sb.$el[0].f7Searchbar;
25609 }
25610 Utils.deleteProps(sb);
25611 };
25612
25613 return Searchbar;
25614 }(Framework7Class));
25615
25616 var Searchbar$1 = {
25617 name: 'searchbar',
25618 static: {
25619 Searchbar: Searchbar,
25620 },
25621 create: function create() {
25622 var app = this;
25623 app.searchbar = ConstructorMethods({
25624 defaultSelector: '.searchbar',
25625 constructor: Searchbar,
25626 app: app,
25627 domProp: 'f7Searchbar',
25628 addMethods: 'clear enable disable toggle search'.split(' '),
25629 });
25630 },
25631 on: {
25632 tabMounted: function tabMounted(tabEl) {
25633 var app = this;
25634 $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
25635 var $searchbarEl = $(searchbarEl);
25636 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
25637 });
25638 },
25639 tabBeforeRemove: function tabBeforeRemove(tabEl) {
25640 $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
25641 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
25642 searchbarEl.f7Searchbar.destroy();
25643 }
25644 });
25645 },
25646 pageInit: function pageInit(page) {
25647 var app = this;
25648 page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
25649 var $searchbarEl = $(searchbarEl);
25650 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
25651 });
25652 if (app.theme === 'ios' && page.view && page.view.router.separateNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
25653 page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
25654 var $searchbarEl = $(searchbarEl);
25655 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
25656 });
25657 }
25658 },
25659 pageBeforeRemove: function pageBeforeRemove(page) {
25660 var app = this;
25661 page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
25662 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
25663 searchbarEl.f7Searchbar.destroy();
25664 }
25665 });
25666 if (app.theme === 'ios' && page.view && page.view.router.separateNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
25667 page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
25668 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
25669 searchbarEl.f7Searchbar.destroy();
25670 }
25671 });
25672 }
25673 },
25674 },
25675 clicks: {
25676 '.searchbar-clear': function clear($clickedEl, data) {
25677 if ( data === void 0 ) data = {};
25678
25679 var app = this;
25680 var sb = app.searchbar.get(data.searchbar);
25681 if (sb) { sb.clear(); }
25682 },
25683 '.searchbar-enable': function enable($clickedEl, data) {
25684 if ( data === void 0 ) data = {};
25685
25686 var app = this;
25687 var sb = app.searchbar.get(data.searchbar);
25688 if (sb) { sb.enable(true); }
25689 },
25690 '.searchbar-disable': function disable($clickedEl, data) {
25691 if ( data === void 0 ) data = {};
25692
25693 var app = this;
25694 var sb = app.searchbar.get(data.searchbar);
25695 if (sb) { sb.disable(); }
25696 },
25697 '.searchbar-toggle': function toggle($clickedEl, data) {
25698 if ( data === void 0 ) data = {};
25699
25700 var app = this;
25701 var sb = app.searchbar.get(data.searchbar);
25702 if (sb) { sb.toggle(); }
25703 },
25704 },
25705 vnode: {
25706 'searchbar-init': {
25707 insert: function insert(vnode) {
25708 var app = this;
25709 var searchbarEl = vnode.elm;
25710 var $searchbarEl = $(searchbarEl);
25711 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
25712 },
25713 destroy: function destroy(vnode) {
25714 var searchbarEl = vnode.elm;
25715 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
25716 searchbarEl.f7Searchbar.destroy();
25717 }
25718 },
25719 },
25720 },
25721 };
25722
25723 var Messages = /*@__PURE__*/(function (Framework7Class$$1) {
25724 function Messages(app, params) {
25725 if ( params === void 0 ) params = {};
25726
25727 Framework7Class$$1.call(this, params, [app]);
25728
25729 var m = this;
25730
25731 var defaults = {
25732 autoLayout: true,
25733 messages: [],
25734 newMessagesFirst: false,
25735 scrollMessages: true,
25736 scrollMessagesOnEdge: true,
25737 firstMessageRule: undefined,
25738 lastMessageRule: undefined,
25739 tailMessageRule: undefined,
25740 sameNameMessageRule: undefined,
25741 sameHeaderMessageRule: undefined,
25742 sameFooterMessageRule: undefined,
25743 sameAvatarMessageRule: undefined,
25744 customClassMessageRule: undefined,
25745 renderMessage: undefined,
25746 };
25747
25748 // Extend defaults with modules params
25749 m.useModulesParams(defaults);
25750
25751 m.params = Utils.extend(defaults, params);
25752
25753 var $el = $(params.el).eq(0);
25754 if ($el.length === 0) { return m; }
25755
25756 if ($el[0].f7Messages) { return $el[0].f7Messages; }
25757
25758 $el[0].f7Messages = m;
25759
25760 var $pageContentEl = $el.closest('.page-content').eq(0);
25761
25762 Utils.extend(m, {
25763 messages: m.params.messages,
25764 $el: $el,
25765 el: $el[0],
25766 $pageContentEl: $pageContentEl,
25767 pageContentEl: $pageContentEl[0],
25768
25769 });
25770 // Install Modules
25771 m.useModules();
25772
25773 // Init
25774 m.init();
25775
25776 return m;
25777 }
25778
25779 if ( Framework7Class$$1 ) Messages.__proto__ = Framework7Class$$1;
25780 Messages.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
25781 Messages.prototype.constructor = Messages;
25782 // eslint-disable-next-line
25783 Messages.prototype.getMessageData = function getMessageData (messageEl) {
25784 var $messageEl = $(messageEl);
25785 var data = {
25786 name: $messageEl.find('.message-name').html(),
25787 header: $messageEl.find('.message-header').html(),
25788 textHeader: $messageEl.find('.message-text-header').html(),
25789 textFooter: $messageEl.find('.message-text-footer').html(),
25790 footer: $messageEl.find('.message-footer').html(),
25791 isTitle: $messageEl.hasClass('messages-title'),
25792 type: $messageEl.hasClass('message-sent') ? 'sent' : 'received',
25793 text: $messageEl.find('.message-text').html(),
25794 image: $messageEl.find('.message-image').html(),
25795 imageSrc: $messageEl.find('.message-image img').attr('src'),
25796 typing: $messageEl.hasClass('message-typing'),
25797 };
25798 if (data.isTitle) {
25799 data.text = $messageEl.html();
25800 }
25801 if (data.text && data.textHeader) {
25802 data.text = data.text.replace(("<div class=\"message-text-header\">" + (data.textHeader) + "</div>"), '');
25803 }
25804 if (data.text && data.textFooter) {
25805 data.text = data.text.replace(("<div class=\"message-text-footer\">" + (data.textFooter) + "</div>"), '');
25806 }
25807 var avatar = $messageEl.find('.message-avatar').css('background-image');
25808 if (avatar === 'none' || avatar === '') { avatar = undefined; }
25809 if (avatar && typeof avatar === 'string') {
25810 avatar = avatar.replace('url(', '').replace(')', '').replace(/"/g, '').replace(/'/g, '');
25811 } else {
25812 avatar = undefined;
25813 }
25814 data.avatar = avatar;
25815
25816 return data;
25817 };
25818
25819 Messages.prototype.getMessagesData = function getMessagesData () {
25820 var m = this;
25821 var data = [];
25822 m.$el.find('.message, .messages-title').each(function (index, messageEl) {
25823 data.push(m.getMessageData(messageEl));
25824 });
25825 return data;
25826 };
25827
25828 Messages.prototype.renderMessage = function renderMessage (messageToRender) {
25829 var m = this;
25830 var message = Utils.extend({
25831 type: 'sent',
25832 attrs: {},
25833 }, messageToRender);
25834 if (m.params.renderMessage) {
25835 return m.params.renderMessage.call(m, message);
25836 }
25837 if (message.isTitle) {
25838 return ("<div class=\"messages-title\">" + (message.text) + "</div>");
25839 }
25840 var attrs = Object.keys(message.attrs).map(function (attr) { return (attr + "=\"" + (message.attrs[attr]) + "\""); }).join(' ');
25841 return ("\n <div class=\"message message-" + (message.type) + " " + (message.isTyping ? 'message-typing' : '') + " " + (message.cssClass || '') + "\" " + attrs + ">\n " + (message.avatar ? ("\n <div class=\"message-avatar\" style=\"background-image:url(" + (message.avatar) + ")\"></div>\n ") : '') + "\n <div class=\"message-content\">\n " + (message.name ? ("<div class=\"message-name\">" + (message.name) + "</div>") : '') + "\n " + (message.header ? ("<div class=\"message-header\">" + (message.header) + "</div>") : '') + "\n <div class=\"message-bubble\">\n " + (message.textHeader ? ("<div class=\"message-text-header\">" + (message.textHeader) + "</div>") : '') + "\n " + (message.image ? ("<div class=\"message-image\">" + (message.image) + "</div>") : '') + "\n " + (message.imageSrc && !message.image ? ("<div class=\"message-image\"><img src=\"" + (message.imageSrc) + "\"></div>") : '') + "\n " + (message.text || message.isTyping ? ("<div class=\"message-text\">" + (message.text || '') + (message.isTyping ? '<div class="message-typing-indicator"><div></div><div></div><div></div></div>' : '') + "</div>") : '') + "\n " + (message.textFooter ? ("<div class=\"message-text-footer\">" + (message.textFooter) + "</div>") : '') + "\n </div>\n " + (message.footer ? ("<div class=\"message-footer\">" + (message.footer) + "</div>") : '') + "\n </div>\n </div>\n ");
25842 };
25843
25844 Messages.prototype.renderMessages = function renderMessages (messagesToRender, method) {
25845 if ( messagesToRender === void 0 ) messagesToRender = this.messages;
25846 if ( method === void 0 ) method = this.params.newMessagesFirst ? 'prepend' : 'append';
25847
25848 var m = this;
25849 var html = messagesToRender.map(function (message) { return m.renderMessage(message); }).join('');
25850 m.$el[method](html);
25851 };
25852
25853 Messages.prototype.isFirstMessage = function isFirstMessage () {
25854 var ref;
25855
25856 var args = [], len = arguments.length;
25857 while ( len-- ) args[ len ] = arguments[ len ];
25858 var m = this;
25859 if (m.params.firstMessageRule) { return (ref = m.params).firstMessageRule.apply(ref, args); }
25860 return false;
25861 };
25862
25863 Messages.prototype.isLastMessage = function isLastMessage () {
25864 var ref;
25865
25866 var args = [], len = arguments.length;
25867 while ( len-- ) args[ len ] = arguments[ len ];
25868 var m = this;
25869 if (m.params.lastMessageRule) { return (ref = m.params).lastMessageRule.apply(ref, args); }
25870 return false;
25871 };
25872
25873 Messages.prototype.isTailMessage = function isTailMessage () {
25874 var ref;
25875
25876 var args = [], len = arguments.length;
25877 while ( len-- ) args[ len ] = arguments[ len ];
25878 var m = this;
25879 if (m.params.tailMessageRule) { return (ref = m.params).tailMessageRule.apply(ref, args); }
25880 return false;
25881 };
25882
25883 Messages.prototype.isSameNameMessage = function isSameNameMessage () {
25884 var ref;
25885
25886 var args = [], len = arguments.length;
25887 while ( len-- ) args[ len ] = arguments[ len ];
25888 var m = this;
25889 if (m.params.sameNameMessageRule) { return (ref = m.params).sameNameMessageRule.apply(ref, args); }
25890 return false;
25891 };
25892
25893 Messages.prototype.isSameHeaderMessage = function isSameHeaderMessage () {
25894 var ref;
25895
25896 var args = [], len = arguments.length;
25897 while ( len-- ) args[ len ] = arguments[ len ];
25898 var m = this;
25899 if (m.params.sameHeaderMessageRule) { return (ref = m.params).sameHeaderMessageRule.apply(ref, args); }
25900 return false;
25901 };
25902
25903 Messages.prototype.isSameFooterMessage = function isSameFooterMessage () {
25904 var ref;
25905
25906 var args = [], len = arguments.length;
25907 while ( len-- ) args[ len ] = arguments[ len ];
25908 var m = this;
25909 if (m.params.sameFooterMessageRule) { return (ref = m.params).sameFooterMessageRule.apply(ref, args); }
25910 return false;
25911 };
25912
25913 Messages.prototype.isSameAvatarMessage = function isSameAvatarMessage () {
25914 var ref;
25915
25916 var args = [], len = arguments.length;
25917 while ( len-- ) args[ len ] = arguments[ len ];
25918 var m = this;
25919 if (m.params.sameAvatarMessageRule) { return (ref = m.params).sameAvatarMessageRule.apply(ref, args); }
25920 return false;
25921 };
25922
25923 Messages.prototype.isCustomClassMessage = function isCustomClassMessage () {
25924 var ref;
25925
25926 var args = [], len = arguments.length;
25927 while ( len-- ) args[ len ] = arguments[ len ];
25928 var m = this;
25929 if (m.params.customClassMessageRule) { return (ref = m.params).customClassMessageRule.apply(ref, args); }
25930 return undefined;
25931 };
25932
25933 Messages.prototype.layout = function layout () {
25934 var m = this;
25935 m.$el.find('.message, .messages-title').each(function (index, messageEl) {
25936 var $messageEl = $(messageEl);
25937 if (!m.messages) {
25938 m.messages = m.getMessagesData();
25939 }
25940 var classes = [];
25941 var message = m.messages[index];
25942 var previousMessage = m.messages[index - 1];
25943 var nextMessage = m.messages[index + 1];
25944 if (m.isFirstMessage(message, previousMessage, nextMessage)) {
25945 classes.push('message-first');
25946 }
25947 if (m.isLastMessage(message, previousMessage, nextMessage)) {
25948 classes.push('message-last');
25949 }
25950 if (m.isTailMessage(message, previousMessage, nextMessage)) {
25951 classes.push('message-tail');
25952 }
25953 if (m.isSameNameMessage(message, previousMessage, nextMessage)) {
25954 classes.push('message-same-name');
25955 }
25956 if (m.isSameHeaderMessage(message, previousMessage, nextMessage)) {
25957 classes.push('message-same-header');
25958 }
25959 if (m.isSameFooterMessage(message, previousMessage, nextMessage)) {
25960 classes.push('message-same-footer');
25961 }
25962 if (m.isSameAvatarMessage(message, previousMessage, nextMessage)) {
25963 classes.push('message-same-avatar');
25964 }
25965 var customMessageClasses = m.isCustomClassMessage(message, previousMessage, nextMessage);
25966 if (customMessageClasses && customMessageClasses.length) {
25967 if (typeof customMessageClasses === 'string') {
25968 customMessageClasses = customMessageClasses.split(' ');
25969 }
25970 customMessageClasses.forEach(function (customClass) {
25971 classes.push(customClass);
25972 });
25973 }
25974 $messageEl.removeClass('message-first message-last message-tail message-same-name message-same-header message-same-footer message-same-avatar');
25975 classes.forEach(function (className) {
25976 $messageEl.addClass(className);
25977 });
25978 });
25979 };
25980
25981 Messages.prototype.clear = function clear () {
25982 var m = this;
25983 m.messages = [];
25984 m.$el.html('');
25985 };
25986
25987 Messages.prototype.removeMessage = function removeMessage (messageToRemove, layout) {
25988 if ( layout === void 0 ) layout = true;
25989
25990 var m = this;
25991 // Index or El
25992 var index;
25993 var $el;
25994 if (typeof messageToRemove === 'number') {
25995 index = messageToRemove;
25996 $el = m.$el.find('.message, .messages-title').eq(index);
25997 } else if (m.messages && m.messages.indexOf(messageToRemove) >= 0) {
25998 index = m.messages.indexOf(messageToRemove);
25999 $el = m.$el.children().eq(index);
26000 } else {
26001 $el = $(messageToRemove);
26002 index = $el.index();
26003 }
26004 if ($el.length === 0) {
26005 return m;
26006 }
26007 $el.remove();
26008 m.messages.splice(index, 1);
26009 if (m.params.autoLayout && layout) { m.layout(); }
26010 return m;
26011 };
26012
26013 Messages.prototype.removeMessages = function removeMessages (messagesToRemove, layout) {
26014 if ( layout === void 0 ) layout = true;
26015
26016 var m = this;
26017 if (Array.isArray(messagesToRemove)) {
26018 var messagesToRemoveEls = [];
26019 messagesToRemove.forEach(function (messageToRemoveIndex) {
26020 messagesToRemoveEls.push(m.$el.find('.message, .messages-title').eq(messageToRemoveIndex));
26021 });
26022 messagesToRemoveEls.forEach(function (messageToRemove) {
26023 m.removeMessage(messageToRemove, false);
26024 });
26025 } else {
26026 $(messagesToRemove).each(function (index, messageToRemove) {
26027 m.removeMessage(messageToRemove, false);
26028 });
26029 }
26030 if (m.params.autoLayout && layout) { m.layout(); }
26031 return m;
26032 };
26033
26034 Messages.prototype.addMessage = function addMessage () {
26035 var assign, assign$1;
26036
26037 var args = [], len = arguments.length;
26038 while ( len-- ) args[ len ] = arguments[ len ];
26039 var m = this;
26040 var messageToAdd;
26041 var animate;
26042 var method;
26043 if (typeof args[1] === 'boolean') {
26044 (assign = args, messageToAdd = assign[0], animate = assign[1], method = assign[2]);
26045 } else {
26046 (assign$1 = args, messageToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
26047 }
26048 if (typeof animate === 'undefined') {
26049 animate = true;
26050 }
26051 if (typeof method === 'undefined') {
26052 method = m.params.newMessagesFirst ? 'prepend' : 'append';
26053 }
26054
26055 return m.addMessages([messageToAdd], animate, method);
26056 };
26057
26058 Messages.prototype.addMessages = function addMessages () {
26059 var assign, assign$1;
26060
26061 var args = [], len = arguments.length;
26062 while ( len-- ) args[ len ] = arguments[ len ];
26063 var m = this;
26064 var messagesToAdd;
26065 var animate;
26066 var method;
26067 if (typeof args[1] === 'boolean') {
26068 (assign = args, messagesToAdd = assign[0], animate = assign[1], method = assign[2]);
26069 } else {
26070 (assign$1 = args, messagesToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
26071 }
26072 if (typeof animate === 'undefined') {
26073 animate = true;
26074 }
26075 if (typeof method === 'undefined') {
26076 method = m.params.newMessagesFirst ? 'prepend' : 'append';
26077 }
26078
26079 // Define scroll positions before new messages added
26080 var scrollHeightBefore = m.pageContentEl.scrollHeight;
26081 var heightBefore = m.pageContentEl.offsetHeight;
26082 var scrollBefore = m.pageContentEl.scrollTop;
26083
26084 // Add message to DOM and data
26085 var messagesHTML = '';
26086 var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
26087 messagesToAdd.forEach(function (messageToAdd) {
26088 if (typingMessage) {
26089 if (method === 'append') {
26090 m.messages.splice(m.messages.indexOf(typingMessage), 0, messageToAdd);
26091 } else {
26092 m.messages.splice(m.messages.indexOf(typingMessage) + 1, 0, messageToAdd);
26093 }
26094 } else {
26095 m.messages[method === 'append' ? 'push' : 'unshift'](messageToAdd);
26096 }
26097 messagesHTML += m.renderMessage(messageToAdd);
26098 });
26099 var $messagesEls = $(messagesHTML);
26100 if (animate) {
26101 if (method === 'append' && !m.params.newMessagesFirst) {
26102 $messagesEls.addClass('message-appear-from-bottom');
26103 }
26104 if (method === 'prepend' && m.params.newMessagesFirst) {
26105 $messagesEls.addClass('message-appear-from-top');
26106 }
26107 }
26108 if (typingMessage) {
26109 if (method === 'append') {
26110 $messagesEls.insertBefore(m.$el.find('.message-typing'));
26111 } else {
26112 $messagesEls.insertAfter(m.$el.find('.message-typing'));
26113 }
26114 } else {
26115 m.$el[method]($messagesEls);
26116 }
26117
26118 // Layout
26119 if (m.params.autoLayout) { m.layout(); }
26120
26121 if (method === 'prepend' && !typingMessage) {
26122 m.pageContentEl.scrollTop = scrollBefore + (m.pageContentEl.scrollHeight - scrollHeightBefore);
26123 }
26124
26125 if (m.params.scrollMessages && ((method === 'append' && !m.params.newMessagesFirst) || (method === 'prepend' && m.params.newMessagesFirst && !typingMessage))) {
26126 if (m.params.scrollMessagesOnEdge) {
26127 var onEdge = false;
26128 if (m.params.newMessagesFirst && scrollBefore === 0) {
26129 onEdge = true;
26130 }
26131 if (!m.params.newMessagesFirst && (scrollBefore - (scrollHeightBefore - heightBefore) >= -10)) {
26132 onEdge = true;
26133 }
26134 if (onEdge) { m.scroll(animate ? undefined : 0); }
26135 } else {
26136 m.scroll(animate ? undefined : 0);
26137 }
26138 }
26139
26140 return m;
26141 };
26142
26143 Messages.prototype.showTyping = function showTyping (message) {
26144 if ( message === void 0 ) message = {};
26145
26146 var m = this;
26147 var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
26148 if (typingMessage) {
26149 m.removeMessage(m.messages.indexOf(typingMessage));
26150 }
26151 m.addMessage(Utils.extend({
26152 type: 'received',
26153 isTyping: true,
26154 }, message));
26155 return m;
26156 };
26157
26158 Messages.prototype.hideTyping = function hideTyping () {
26159 var m = this;
26160 var typingMessageIndex;
26161 var typingFound;
26162 m.messages.forEach(function (message, index) {
26163 if (message.isTyping) { typingMessageIndex = index; }
26164 });
26165 if (typeof typingMessageIndex !== 'undefined') {
26166 if (m.$el.find('.message').eq(typingMessageIndex).hasClass('message-typing')) {
26167 typingFound = true;
26168 m.removeMessage(typingMessageIndex);
26169 }
26170 }
26171 if (!typingFound) {
26172 var $typingMessageEl = m.$el.find('.message-typing');
26173 if ($typingMessageEl.length) {
26174 m.removeMessage($typingMessageEl);
26175 }
26176 }
26177 return m;
26178 };
26179
26180 Messages.prototype.scroll = function scroll (duration, scrollTop) {
26181 if ( duration === void 0 ) duration = 300;
26182
26183 var m = this;
26184 var currentScroll = m.pageContentEl.scrollTop;
26185 var newScrollTop;
26186 if (typeof scrollTop !== 'undefined') { newScrollTop = scrollTop; }
26187 else {
26188 newScrollTop = m.params.newMessagesFirst ? 0 : m.pageContentEl.scrollHeight - m.pageContentEl.offsetHeight;
26189 if (newScrollTop === currentScroll) { return m; }
26190 }
26191 m.$pageContentEl.scrollTop(newScrollTop, duration);
26192 return m;
26193 };
26194
26195 Messages.prototype.init = function init () {
26196 var m = this;
26197 if (!m.messages || m.messages.length === 0) {
26198 m.messages = m.getMessagesData();
26199 }
26200 if (m.params.messages && m.params.messages.length) {
26201 m.renderMessages();
26202 }
26203 if (m.params.autoLayout) { m.layout(); }
26204 if (m.params.scrollMessages) { m.scroll(0); }
26205 };
26206
26207 Messages.prototype.destroy = function destroy () {
26208 var m = this;
26209 m.emit('local::beforeDestroy messagesBeforeDestroy', m);
26210 m.$el.trigger('messages:beforedestroy', m);
26211 if (m.$el[0]) {
26212 m.$el[0].f7Messages = null;
26213 delete m.$el[0].f7Messages;
26214 }
26215 Utils.deleteProps(m);
26216 };
26217
26218 return Messages;
26219 }(Framework7Class));
26220
26221 var Messages$1 = {
26222 name: 'messages',
26223 static: {
26224 Messages: Messages,
26225 },
26226 create: function create() {
26227 var app = this;
26228 app.messages = ConstructorMethods({
26229 defaultSelector: '.messages',
26230 constructor: Messages,
26231 app: app,
26232 domProp: 'f7Messages',
26233 addMethods: 'renderMessages layout scroll clear removeMessage removeMessages addMessage addMessages'.split(' '),
26234 });
26235 },
26236 on: {
26237 tabBeforeRemove: function tabBeforeRemove(tabEl) {
26238 var app = this;
26239 $(tabEl).find('.messages-init').each(function (index, messagesEl) {
26240 app.messages.destroy(messagesEl);
26241 });
26242 },
26243 tabMounted: function tabMounted(tabEl) {
26244 var app = this;
26245 $(tabEl).find('.messages-init').each(function (index, messagesEl) {
26246 app.messages.create({ el: messagesEl });
26247 });
26248 },
26249 pageBeforeRemove: function pageBeforeRemove(page) {
26250 var app = this;
26251 page.$el.find('.messages-init').each(function (index, messagesEl) {
26252 app.messages.destroy(messagesEl);
26253 });
26254 },
26255 pageInit: function pageInit(page) {
26256 var app = this;
26257 page.$el.find('.messages-init').each(function (index, messagesEl) {
26258 app.messages.create({ el: messagesEl });
26259 });
26260 },
26261 },
26262 vnode: {
26263 'messages-init': {
26264 insert: function insert(vnode) {
26265 var app = this;
26266 var messagesEl = vnode.elm;
26267 app.messages.create({ el: messagesEl });
26268 },
26269 destroy: function destroy(vnode) {
26270 var app = this;
26271 var messagesEl = vnode.elm;
26272 app.messages.destroy(messagesEl);
26273 },
26274 },
26275 },
26276 };
26277
26278 var Messagebar = /*@__PURE__*/(function (Framework7Class$$1) {
26279 function Messagebar(app, params) {
26280 if ( params === void 0 ) params = {};
26281
26282 Framework7Class$$1.call(this, params, [app]);
26283
26284 var messagebar = this;
26285
26286 var defaults = {
26287 top: false,
26288 topOffset: 0,
26289 bottomOffset: 0,
26290 attachments: [],
26291 renderAttachments: undefined,
26292 renderAttachment: undefined,
26293 maxHeight: null,
26294 resizePage: true,
26295 };
26296
26297 // Extend defaults with modules params
26298 messagebar.useModulesParams(defaults);
26299
26300 messagebar.params = Utils.extend(defaults, params);
26301
26302 // El
26303 var $el = $(messagebar.params.el);
26304 if ($el.length === 0) { return messagebar; }
26305
26306 if ($el[0].f7Messagebar) { return $el[0].f7Messagebar; }
26307
26308 $el[0].f7Messagebar = messagebar;
26309
26310 // Page and PageContent
26311 var $pageEl = $el.parents('.page').eq(0);
26312 var $pageContentEl = $pageEl.find('.page-content').eq(0);
26313
26314 // Area
26315 var $areaEl = $el.find('.messagebar-area');
26316
26317 // Textarea
26318 var $textareaEl;
26319 if (messagebar.params.textareaEl) {
26320 $textareaEl = $(messagebar.params.textareaEl);
26321 } else {
26322 $textareaEl = $el.find('textarea');
26323 }
26324
26325 // Attachments & Library
26326 var $attachmentsEl = $el.find('.messagebar-attachments');
26327 var $sheetEl = $el.find('.messagebar-sheet');
26328
26329 if (messagebar.params.top) {
26330 $el.addClass('messagebar-top');
26331 }
26332
26333 Utils.extend(messagebar, {
26334 $el: $el,
26335 el: $el[0],
26336 $areaEl: $areaEl,
26337 areaEl: $areaEl[0],
26338 $textareaEl: $textareaEl,
26339 textareaEl: $textareaEl[0],
26340 $attachmentsEl: $attachmentsEl,
26341 attachmentsEl: $attachmentsEl[0],
26342 attachmentsVisible: $attachmentsEl.hasClass('messagebar-attachments-visible'),
26343 $sheetEl: $sheetEl,
26344 sheetEl: $sheetEl[0],
26345 sheetVisible: $sheetEl.hasClass('messagebar-sheet-visible'),
26346 $pageEl: $pageEl,
26347 pageEl: $pageEl[0],
26348 $pageContentEl: $pageContentEl,
26349 pageContentEl: $pageContentEl,
26350 top: $el.hasClass('messagebar-top') || messagebar.params.top,
26351 attachments: [],
26352 });
26353
26354 // Events
26355 function onAppResize() {
26356 if (messagebar.params.resizePage) {
26357 messagebar.resizePage();
26358 }
26359 }
26360 function onSubmit(e) {
26361 e.preventDefault();
26362 }
26363 function onAttachmentClick(e) {
26364 var index = $(this).index();
26365 if ($(e.target).closest('.messagebar-attachment-delete').length) {
26366 $(this).trigger('messagebar:attachmentdelete', index);
26367 messagebar.emit('local::attachmentDelete messagebarAttachmentDelete', messagebar, this, index);
26368 } else {
26369 $(this).trigger('messagebar:attachmentclick', index);
26370 messagebar.emit('local::attachmentClick messagebarAttachmentClick', messagebar, this, index);
26371 }
26372 }
26373 function onTextareaChange() {
26374 messagebar.checkEmptyState();
26375 messagebar.$el.trigger('messagebar:change');
26376 messagebar.emit('local::change messagebarChange', messagebar);
26377 }
26378 function onTextareaFocus() {
26379 messagebar.sheetHide();
26380 messagebar.$el.addClass('messagebar-focused');
26381 messagebar.$el.trigger('messagebar:focus');
26382 messagebar.emit('local::focus messagebarFocus', messagebar);
26383 }
26384 function onTextareaBlur() {
26385 messagebar.$el.removeClass('messagebar-focused');
26386 messagebar.$el.trigger('messagebar:blur');
26387 messagebar.emit('local::blur messagebarBlur', messagebar);
26388 }
26389
26390 messagebar.attachEvents = function attachEvents() {
26391 $el.on('textarea:resize', onAppResize);
26392 $el.on('submit', onSubmit);
26393 $el.on('click', '.messagebar-attachment', onAttachmentClick);
26394 $textareaEl.on('change input', onTextareaChange);
26395 $textareaEl.on('focus', onTextareaFocus);
26396 $textareaEl.on('blur', onTextareaBlur);
26397 app.on('resize', onAppResize);
26398 };
26399 messagebar.detachEvents = function detachEvents() {
26400 $el.off('textarea:resize', onAppResize);
26401 $el.off('submit', onSubmit);
26402 $el.off('click', '.messagebar-attachment', onAttachmentClick);
26403 $textareaEl.off('change input', onTextareaChange);
26404 $textareaEl.off('focus', onTextareaFocus);
26405 $textareaEl.off('blur', onTextareaBlur);
26406 app.off('resize', onAppResize);
26407 };
26408
26409
26410 // Install Modules
26411 messagebar.useModules();
26412
26413 // Init
26414 messagebar.init();
26415
26416 return messagebar;
26417 }
26418
26419 if ( Framework7Class$$1 ) Messagebar.__proto__ = Framework7Class$$1;
26420 Messagebar.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
26421 Messagebar.prototype.constructor = Messagebar;
26422
26423 Messagebar.prototype.focus = function focus () {
26424 var messagebar = this;
26425 messagebar.$textareaEl.focus();
26426 return messagebar;
26427 };
26428
26429 Messagebar.prototype.blur = function blur () {
26430 var messagebar = this;
26431 messagebar.$textareaEl.blur();
26432 return messagebar;
26433 };
26434
26435 Messagebar.prototype.clear = function clear () {
26436 var messagebar = this;
26437 messagebar.$textareaEl.val('').trigger('change');
26438 return messagebar;
26439 };
26440
26441 Messagebar.prototype.getValue = function getValue () {
26442 var messagebar = this;
26443 return messagebar.$textareaEl.val().trim();
26444 };
26445
26446 Messagebar.prototype.setValue = function setValue (value) {
26447 var messagebar = this;
26448 messagebar.$textareaEl.val(value).trigger('change');
26449 return messagebar;
26450 };
26451
26452 Messagebar.prototype.setPlaceholder = function setPlaceholder (placeholder) {
26453 var messagebar = this;
26454 messagebar.$textareaEl.attr('placeholder', placeholder);
26455 return messagebar;
26456 };
26457
26458 Messagebar.prototype.resizePage = function resizePage () {
26459 var messagebar = this;
26460 var params = messagebar.params;
26461 var $el = messagebar.$el;
26462 var top = messagebar.top;
26463 var $pageEl = messagebar.$pageEl;
26464 var $pageContentEl = messagebar.$pageContentEl;
26465 var $areaEl = messagebar.$areaEl;
26466 var $textareaEl = messagebar.$textareaEl;
26467 var $sheetEl = messagebar.$sheetEl;
26468 var $attachmentsEl = messagebar.$attachmentsEl;
26469 var elHeight = $el[0].offsetHeight;
26470 var maxHeight = params.maxHeight;
26471 if (top) ; else {
26472 var currentPaddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
26473 var requiredPaddingBottom = elHeight + params.bottomOffset;
26474 if (requiredPaddingBottom !== currentPaddingBottom && $pageContentEl.length) {
26475 var currentPaddingTop = parseInt($pageContentEl.css('padding-top'), 10);
26476 var pageScrollHeight = $pageContentEl[0].scrollHeight;
26477 var pageOffsetHeight = $pageContentEl[0].offsetHeight;
26478 var pageScrollTop = $pageContentEl[0].scrollTop;
26479 var scrollOnBottom = (pageScrollTop === pageScrollHeight - pageOffsetHeight);
26480 if (!maxHeight) {
26481 maxHeight = $pageEl[0].offsetHeight - currentPaddingTop - $sheetEl.outerHeight() - $attachmentsEl.outerHeight() - parseInt($areaEl.css('margin-top'), 10) - parseInt($areaEl.css('margin-bottom'), 10);
26482 }
26483 $textareaEl.css('max-height', (maxHeight + "px"));
26484 $pageContentEl.css('padding-bottom', (requiredPaddingBottom + "px"));
26485 if (scrollOnBottom) {
26486 $pageContentEl.scrollTop($pageContentEl[0].scrollHeight - pageOffsetHeight);
26487 }
26488 $el.trigger('messagebar:resizepage');
26489 messagebar.emit('local::resizePage messagebarResizePage', messagebar);
26490 }
26491 }
26492 };
26493
26494 Messagebar.prototype.checkEmptyState = function checkEmptyState () {
26495 var messagebar = this;
26496 var $el = messagebar.$el;
26497 var $textareaEl = messagebar.$textareaEl;
26498 var value = $textareaEl.val().trim();
26499 if (value && value.length) {
26500 $el.addClass('messagebar-with-value');
26501 } else {
26502 $el.removeClass('messagebar-with-value');
26503 }
26504 };
26505
26506 Messagebar.prototype.attachmentsCreate = function attachmentsCreate (innerHTML) {
26507 if ( innerHTML === void 0 ) innerHTML = '';
26508
26509 var messagebar = this;
26510 var $attachmentsEl = $(("<div class=\"messagebar-attachments\">" + innerHTML + "</div>"));
26511 $attachmentsEl.insertBefore(messagebar.$textareaEl);
26512 Utils.extend(messagebar, {
26513 $attachmentsEl: $attachmentsEl,
26514 attachmentsEl: $attachmentsEl[0],
26515 });
26516 return messagebar;
26517 };
26518
26519 Messagebar.prototype.attachmentsShow = function attachmentsShow (innerHTML) {
26520 if ( innerHTML === void 0 ) innerHTML = '';
26521
26522 var messagebar = this;
26523 messagebar.$attachmentsEl = messagebar.$el.find('.messagebar-attachments');
26524 if (messagebar.$attachmentsEl.length === 0) {
26525 messagebar.attachmentsCreate(innerHTML);
26526 }
26527 messagebar.$el.addClass('messagebar-attachments-visible');
26528 messagebar.attachmentsVisible = true;
26529 if (messagebar.params.resizePage) {
26530 messagebar.resizePage();
26531 }
26532 return messagebar;
26533 };
26534
26535 Messagebar.prototype.attachmentsHide = function attachmentsHide () {
26536 var messagebar = this;
26537 messagebar.$el.removeClass('messagebar-attachments-visible');
26538 messagebar.attachmentsVisible = false;
26539 if (messagebar.params.resizePage) {
26540 messagebar.resizePage();
26541 }
26542 return messagebar;
26543 };
26544
26545 Messagebar.prototype.attachmentsToggle = function attachmentsToggle () {
26546 var messagebar = this;
26547 if (messagebar.attachmentsVisible) {
26548 messagebar.attachmentsHide();
26549 } else {
26550 messagebar.attachmentsShow();
26551 }
26552 return messagebar;
26553 };
26554
26555 Messagebar.prototype.renderAttachment = function renderAttachment (attachment) {
26556 var messagebar = this;
26557 if (messagebar.params.renderAttachment) {
26558 return messagebar.params.renderAttachment.call(messagebar, attachment);
26559 }
26560 return ("\n <div class=\"messagebar-attachment\">\n <img src=\"" + attachment + "\">\n <span class=\"messagebar-attachment-delete\"></span>\n </div>\n ");
26561 };
26562
26563 Messagebar.prototype.renderAttachments = function renderAttachments () {
26564 var messagebar = this;
26565 var html;
26566 if (messagebar.params.renderAttachments) {
26567 html = messagebar.params.renderAttachments.call(messagebar, messagebar.attachments);
26568 } else {
26569 html = "" + (messagebar.attachments.map(function (attachment) { return messagebar.renderAttachment(attachment); }).join(''));
26570 }
26571 if (messagebar.$attachmentsEl.length === 0) {
26572 messagebar.attachmentsCreate(html);
26573 } else {
26574 messagebar.$attachmentsEl.html(html);
26575 }
26576 };
26577
26578 Messagebar.prototype.sheetCreate = function sheetCreate (innerHTML) {
26579 if ( innerHTML === void 0 ) innerHTML = '';
26580
26581 var messagebar = this;
26582 var $sheetEl = $(("<div class=\"messagebar-sheet\">" + innerHTML + "</div>"));
26583 messagebar.$el.append($sheetEl);
26584 Utils.extend(messagebar, {
26585 $sheetEl: $sheetEl,
26586 sheetEl: $sheetEl[0],
26587 });
26588 return messagebar;
26589 };
26590
26591 Messagebar.prototype.sheetShow = function sheetShow (innerHTML) {
26592 if ( innerHTML === void 0 ) innerHTML = '';
26593
26594 var messagebar = this;
26595 messagebar.$sheetEl = messagebar.$el.find('.messagebar-sheet');
26596 if (messagebar.$sheetEl.length === 0) {
26597 messagebar.sheetCreate(innerHTML);
26598 }
26599 messagebar.$el.addClass('messagebar-sheet-visible');
26600 messagebar.sheetVisible = true;
26601 if (messagebar.params.resizePage) {
26602 messagebar.resizePage();
26603 }
26604 return messagebar;
26605 };
26606
26607 Messagebar.prototype.sheetHide = function sheetHide () {
26608 var messagebar = this;
26609 messagebar.$el.removeClass('messagebar-sheet-visible');
26610 messagebar.sheetVisible = false;
26611 if (messagebar.params.resizePage) {
26612 messagebar.resizePage();
26613 }
26614 return messagebar;
26615 };
26616
26617 Messagebar.prototype.sheetToggle = function sheetToggle () {
26618 var messagebar = this;
26619 if (messagebar.sheetVisible) {
26620 messagebar.sheetHide();
26621 } else {
26622 messagebar.sheetShow();
26623 }
26624 return messagebar;
26625 };
26626
26627 Messagebar.prototype.init = function init () {
26628 var messagebar = this;
26629 messagebar.attachEvents();
26630 messagebar.checkEmptyState();
26631 return messagebar;
26632 };
26633
26634 Messagebar.prototype.destroy = function destroy () {
26635 var messagebar = this;
26636 messagebar.emit('local::beforeDestroy messagebarBeforeDestroy', messagebar);
26637 messagebar.$el.trigger('messagebar:beforedestroy', messagebar);
26638 messagebar.detachEvents();
26639 if (messagebar.$el[0]) {
26640 messagebar.$el[0].f7Messagebar = null;
26641 delete messagebar.$el[0].f7Messagebar;
26642 }
26643 Utils.deleteProps(messagebar);
26644 };
26645
26646 return Messagebar;
26647 }(Framework7Class));
26648
26649 var Messagebar$1 = {
26650 name: 'messagebar',
26651 static: {
26652 Messagebar: Messagebar,
26653 },
26654 create: function create() {
26655 var app = this;
26656 app.messagebar = ConstructorMethods({
26657 defaultSelector: '.messagebar',
26658 constructor: Messagebar,
26659 app: app,
26660 domProp: 'f7Messagebar',
26661 addMethods: 'clear getValue setValue setPlaceholder resizePage focus blur attachmentsCreate attachmentsShow attachmentsHide attachmentsToggle renderAttachments sheetCreate sheetShow sheetHide sheetToggle'.split(' '),
26662 });
26663 },
26664 on: {
26665 tabBeforeRemove: function tabBeforeRemove(tabEl) {
26666 var app = this;
26667 $(tabEl).find('.messagebar-init').each(function (index, messagebarEl) {
26668 app.messagebar.destroy(messagebarEl);
26669 });
26670 },
26671 tabMounted: function tabMounted(tabEl) {
26672 var app = this;
26673 $(tabEl).find('.messagebar-init').each(function (index, messagebarEl) {
26674 app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
26675 });
26676 },
26677 pageBeforeRemove: function pageBeforeRemove(page) {
26678 var app = this;
26679 page.$el.find('.messagebar-init').each(function (index, messagebarEl) {
26680 app.messagebar.destroy(messagebarEl);
26681 });
26682 },
26683 pageInit: function pageInit(page) {
26684 var app = this;
26685 page.$el.find('.messagebar-init').each(function (index, messagebarEl) {
26686 app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
26687 });
26688 },
26689 },
26690 vnode: {
26691 'messagebar-init': {
26692 insert: function insert(vnode) {
26693 var app = this;
26694 var messagebarEl = vnode.elm;
26695 app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
26696 },
26697 destroy: function destroy(vnode) {
26698 var app = this;
26699 var messagebarEl = vnode.elm;
26700 app.messagebar.destroy(messagebarEl);
26701 },
26702 },
26703 },
26704 };
26705
26706 function updateSize () {
26707 var swiper = this;
26708 var width;
26709 var height;
26710 var $el = swiper.$el;
26711 if (typeof swiper.params.width !== 'undefined') {
26712 width = swiper.params.width;
26713 } else {
26714 width = $el[0].clientWidth;
26715 }
26716 if (typeof swiper.params.height !== 'undefined') {
26717 height = swiper.params.height;
26718 } else {
26719 height = $el[0].clientHeight;
26720 }
26721 if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {
26722 return;
26723 }
26724
26725 // Subtract paddings
26726 width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);
26727 height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);
26728
26729 Utils.extend(swiper, {
26730 width: width,
26731 height: height,
26732 size: swiper.isHorizontal() ? width : height,
26733 });
26734 }
26735
26736 function updateSlides () {
26737 var swiper = this;
26738 var params = swiper.params;
26739
26740 var $wrapperEl = swiper.$wrapperEl;
26741 var swiperSize = swiper.size;
26742 var rtl = swiper.rtlTranslate;
26743 var wrongRTL = swiper.wrongRTL;
26744 var isVirtual = swiper.virtual && params.virtual.enabled;
26745 var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
26746 var slides = $wrapperEl.children(("." + (swiper.params.slideClass)));
26747 var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
26748 var snapGrid = [];
26749 var slidesGrid = [];
26750 var slidesSizesGrid = [];
26751
26752 var offsetBefore = params.slidesOffsetBefore;
26753 if (typeof offsetBefore === 'function') {
26754 offsetBefore = params.slidesOffsetBefore.call(swiper);
26755 }
26756
26757 var offsetAfter = params.slidesOffsetAfter;
26758 if (typeof offsetAfter === 'function') {
26759 offsetAfter = params.slidesOffsetAfter.call(swiper);
26760 }
26761
26762 var previousSnapGridLength = swiper.snapGrid.length;
26763 var previousSlidesGridLength = swiper.snapGrid.length;
26764
26765 var spaceBetween = params.spaceBetween;
26766 var slidePosition = -offsetBefore;
26767 var prevSlideSize = 0;
26768 var index = 0;
26769 if (typeof swiperSize === 'undefined') {
26770 return;
26771 }
26772 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
26773 spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;
26774 }
26775
26776 swiper.virtualSize = -spaceBetween;
26777
26778 // reset margins
26779 if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }
26780 else { slides.css({ marginRight: '', marginBottom: '' }); }
26781
26782 var slidesNumberEvenToRows;
26783 if (params.slidesPerColumn > 1) {
26784 if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
26785 slidesNumberEvenToRows = slidesLength;
26786 } else {
26787 slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
26788 }
26789 if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {
26790 slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
26791 }
26792 }
26793
26794 // Calc slides
26795 var slideSize;
26796 var slidesPerColumn = params.slidesPerColumn;
26797 var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
26798 var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
26799 for (var i = 0; i < slidesLength; i += 1) {
26800 slideSize = 0;
26801 var slide = slides.eq(i);
26802 if (params.slidesPerColumn > 1) {
26803 // Set slides order
26804 var newSlideOrderIndex = (void 0);
26805 var column = (void 0);
26806 var row = (void 0);
26807 if (params.slidesPerColumnFill === 'column') {
26808 column = Math.floor(i / slidesPerColumn);
26809 row = i - (column * slidesPerColumn);
26810 if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {
26811 row += 1;
26812 if (row >= slidesPerColumn) {
26813 row = 0;
26814 column += 1;
26815 }
26816 }
26817 newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);
26818 slide
26819 .css({
26820 '-webkit-box-ordinal-group': newSlideOrderIndex,
26821 '-moz-box-ordinal-group': newSlideOrderIndex,
26822 '-ms-flex-order': newSlideOrderIndex,
26823 '-webkit-order': newSlideOrderIndex,
26824 order: newSlideOrderIndex,
26825 });
26826 } else {
26827 row = Math.floor(i / slidesPerRow);
26828 column = i - (row * slidesPerRow);
26829 }
26830 slide
26831 .css(
26832 ("margin-" + (swiper.isHorizontal() ? 'top' : 'left')),
26833 (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + "px"))
26834 )
26835 .attr('data-swiper-column', column)
26836 .attr('data-swiper-row', row);
26837 }
26838 if (slide.css('display') === 'none') { continue; } // eslint-disable-line
26839
26840 if (params.slidesPerView === 'auto') {
26841 var slideStyles = win.getComputedStyle(slide[0], null);
26842 var currentTransform = slide[0].style.transform;
26843 var currentWebKitTransform = slide[0].style.webkitTransform;
26844 if (currentTransform) {
26845 slide[0].style.transform = 'none';
26846 }
26847 if (currentWebKitTransform) {
26848 slide[0].style.webkitTransform = 'none';
26849 }
26850 if (params.roundLengths) {
26851 slideSize = swiper.isHorizontal()
26852 ? slide.outerWidth(true)
26853 : slide.outerHeight(true);
26854 } else {
26855 // eslint-disable-next-line
26856 if (swiper.isHorizontal()) {
26857 var width = parseFloat(slideStyles.getPropertyValue('width'));
26858 var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));
26859 var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));
26860 var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));
26861 var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));
26862 var boxSizing = slideStyles.getPropertyValue('box-sizing');
26863 if (boxSizing && boxSizing === 'border-box') {
26864 slideSize = width + marginLeft + marginRight;
26865 } else {
26866 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;
26867 }
26868 } else {
26869 var height = parseFloat(slideStyles.getPropertyValue('height'));
26870 var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));
26871 var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));
26872 var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));
26873 var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));
26874 var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');
26875 if (boxSizing$1 && boxSizing$1 === 'border-box') {
26876 slideSize = height + marginTop + marginBottom;
26877 } else {
26878 slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;
26879 }
26880 }
26881 }
26882 if (currentTransform) {
26883 slide[0].style.transform = currentTransform;
26884 }
26885 if (currentWebKitTransform) {
26886 slide[0].style.webkitTransform = currentWebKitTransform;
26887 }
26888 if (params.roundLengths) { slideSize = Math.floor(slideSize); }
26889 } else {
26890 slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;
26891 if (params.roundLengths) { slideSize = Math.floor(slideSize); }
26892
26893 if (slides[i]) {
26894 if (swiper.isHorizontal()) {
26895 slides[i].style.width = slideSize + "px";
26896 } else {
26897 slides[i].style.height = slideSize + "px";
26898 }
26899 }
26900 }
26901 if (slides[i]) {
26902 slides[i].swiperSlideSize = slideSize;
26903 }
26904 slidesSizesGrid.push(slideSize);
26905
26906
26907 if (params.centeredSlides) {
26908 slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;
26909 if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
26910 if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
26911 if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }
26912 if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
26913 if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
26914 slidesGrid.push(slidePosition);
26915 } else {
26916 if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
26917 if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
26918 slidesGrid.push(slidePosition);
26919 slidePosition = slidePosition + slideSize + spaceBetween;
26920 }
26921
26922 swiper.virtualSize += slideSize + spaceBetween;
26923
26924 prevSlideSize = slideSize;
26925
26926 index += 1;
26927 }
26928 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
26929 var newSlidesGrid;
26930
26931 if (
26932 rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
26933 $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") });
26934 }
26935 if (!Support.flexbox || params.setWrapperSize) {
26936 if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
26937 else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
26938 }
26939
26940 if (params.slidesPerColumn > 1) {
26941 swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;
26942 swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
26943 if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
26944 else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
26945 if (params.centeredSlides) {
26946 newSlidesGrid = [];
26947 for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {
26948 var slidesGridItem = snapGrid[i$1];
26949 if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }
26950 if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }
26951 }
26952 snapGrid = newSlidesGrid;
26953 }
26954 }
26955
26956 // Remove last grid elements depending on width
26957 if (!params.centeredSlides) {
26958 newSlidesGrid = [];
26959 for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {
26960 var slidesGridItem$1 = snapGrid[i$2];
26961 if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }
26962 if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {
26963 newSlidesGrid.push(slidesGridItem$1);
26964 }
26965 }
26966 snapGrid = newSlidesGrid;
26967 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
26968 snapGrid.push(swiper.virtualSize - swiperSize);
26969 }
26970 }
26971 if (snapGrid.length === 0) { snapGrid = [0]; }
26972
26973 if (params.spaceBetween !== 0) {
26974 if (swiper.isHorizontal()) {
26975 if (rtl) { slides.css({ marginLeft: (spaceBetween + "px") }); }
26976 else { slides.css({ marginRight: (spaceBetween + "px") }); }
26977 } else { slides.css({ marginBottom: (spaceBetween + "px") }); }
26978 }
26979
26980 if (params.centerInsufficientSlides) {
26981 var allSlidesSize = 0;
26982 slidesSizesGrid.forEach(function (slideSizeValue) {
26983 allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
26984 });
26985 allSlidesSize -= params.spaceBetween;
26986 if (allSlidesSize < swiperSize) {
26987 var allSlidesOffset = (swiperSize - allSlidesSize) / 2;
26988 snapGrid.forEach(function (snap, snapIndex) {
26989 snapGrid[snapIndex] = snap - allSlidesOffset;
26990 });
26991 slidesGrid.forEach(function (snap, snapIndex) {
26992 slidesGrid[snapIndex] = snap + allSlidesOffset;
26993 });
26994 }
26995 }
26996
26997 Utils.extend(swiper, {
26998 slides: slides,
26999 snapGrid: snapGrid,
27000 slidesGrid: slidesGrid,
27001 slidesSizesGrid: slidesSizesGrid,
27002 });
27003
27004 if (slidesLength !== previousSlidesLength) {
27005 swiper.emit('slidesLengthChange');
27006 }
27007 if (snapGrid.length !== previousSnapGridLength) {
27008 if (swiper.params.watchOverflow) { swiper.checkOverflow(); }
27009 swiper.emit('snapGridLengthChange');
27010 }
27011 if (slidesGrid.length !== previousSlidesGridLength) {
27012 swiper.emit('slidesGridLengthChange');
27013 }
27014
27015 if (params.watchSlidesProgress || params.watchSlidesVisibility) {
27016 swiper.updateSlidesOffset();
27017 }
27018 }
27019
27020 function updateAutoHeight (speed) {
27021 var swiper = this;
27022 var activeSlides = [];
27023 var newHeight = 0;
27024 var i;
27025 if (typeof speed === 'number') {
27026 swiper.setTransition(speed);
27027 } else if (speed === true) {
27028 swiper.setTransition(swiper.params.speed);
27029 }
27030 // Find slides currently in view
27031 if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
27032 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
27033 var index = swiper.activeIndex + i;
27034 if (index > swiper.slides.length) { break; }
27035 activeSlides.push(swiper.slides.eq(index)[0]);
27036 }
27037 } else {
27038 activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);
27039 }
27040
27041 // Find new height from highest slide in view
27042 for (i = 0; i < activeSlides.length; i += 1) {
27043 if (typeof activeSlides[i] !== 'undefined') {
27044 var height = activeSlides[i].offsetHeight;
27045 newHeight = height > newHeight ? height : newHeight;
27046 }
27047 }
27048
27049 // Update Height
27050 if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + "px")); }
27051 }
27052
27053 function updateSlidesOffset () {
27054 var swiper = this;
27055 var slides = swiper.slides;
27056 for (var i = 0; i < slides.length; i += 1) {
27057 slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
27058 }
27059 }
27060
27061 function updateSlidesProgress (translate) {
27062 if ( translate === void 0 ) translate = (this && this.translate) || 0;
27063
27064 var swiper = this;
27065 var params = swiper.params;
27066
27067 var slides = swiper.slides;
27068 var rtl = swiper.rtlTranslate;
27069
27070 if (slides.length === 0) { return; }
27071 if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }
27072
27073 var offsetCenter = -translate;
27074 if (rtl) { offsetCenter = translate; }
27075
27076 // Visible Slides
27077 slides.removeClass(params.slideVisibleClass);
27078
27079 swiper.visibleSlidesIndexes = [];
27080 swiper.visibleSlides = [];
27081
27082 for (var i = 0; i < slides.length; i += 1) {
27083 var slide = slides[i];
27084 var slideProgress = (
27085 (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset
27086 ) / (slide.swiperSlideSize + params.spaceBetween);
27087 if (params.watchSlidesVisibility) {
27088 var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
27089 var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
27090 var isVisible = (slideBefore >= 0 && slideBefore < swiper.size)
27091 || (slideAfter > 0 && slideAfter <= swiper.size)
27092 || (slideBefore <= 0 && slideAfter >= swiper.size);
27093 if (isVisible) {
27094 swiper.visibleSlides.push(slide);
27095 swiper.visibleSlidesIndexes.push(i);
27096 slides.eq(i).addClass(params.slideVisibleClass);
27097 }
27098 }
27099 slide.progress = rtl ? -slideProgress : slideProgress;
27100 }
27101 swiper.visibleSlides = $(swiper.visibleSlides);
27102 }
27103
27104 function updateProgress (translate) {
27105 if ( translate === void 0 ) translate = (this && this.translate) || 0;
27106
27107 var swiper = this;
27108 var params = swiper.params;
27109
27110 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
27111 var progress = swiper.progress;
27112 var isBeginning = swiper.isBeginning;
27113 var isEnd = swiper.isEnd;
27114 var wasBeginning = isBeginning;
27115 var wasEnd = isEnd;
27116 if (translatesDiff === 0) {
27117 progress = 0;
27118 isBeginning = true;
27119 isEnd = true;
27120 } else {
27121 progress = (translate - swiper.minTranslate()) / (translatesDiff);
27122 isBeginning = progress <= 0;
27123 isEnd = progress >= 1;
27124 }
27125 Utils.extend(swiper, {
27126 progress: progress,
27127 isBeginning: isBeginning,
27128 isEnd: isEnd,
27129 });
27130
27131 if (params.watchSlidesProgress || params.watchSlidesVisibility) { swiper.updateSlidesProgress(translate); }
27132
27133 if (isBeginning && !wasBeginning) {
27134 swiper.emit('reachBeginning toEdge');
27135 }
27136 if (isEnd && !wasEnd) {
27137 swiper.emit('reachEnd toEdge');
27138 }
27139 if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {
27140 swiper.emit('fromEdge');
27141 }
27142
27143 swiper.emit('progress', progress);
27144 }
27145
27146 function updateSlidesClasses () {
27147 var swiper = this;
27148
27149 var slides = swiper.slides;
27150 var params = swiper.params;
27151 var $wrapperEl = swiper.$wrapperEl;
27152 var activeIndex = swiper.activeIndex;
27153 var realIndex = swiper.realIndex;
27154 var isVirtual = swiper.virtual && params.virtual.enabled;
27155
27156 slides.removeClass(((params.slideActiveClass) + " " + (params.slideNextClass) + " " + (params.slidePrevClass) + " " + (params.slideDuplicateActiveClass) + " " + (params.slideDuplicateNextClass) + " " + (params.slideDuplicatePrevClass)));
27157
27158 var activeSlide;
27159 if (isVirtual) {
27160 activeSlide = swiper.$wrapperEl.find(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + activeIndex + "\"]"));
27161 } else {
27162 activeSlide = slides.eq(activeIndex);
27163 }
27164
27165 // Active classes
27166 activeSlide.addClass(params.slideActiveClass);
27167
27168 if (params.loop) {
27169 // Duplicate to all looped slides
27170 if (activeSlide.hasClass(params.slideDuplicateClass)) {
27171 $wrapperEl
27172 .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + realIndex + "\"]"))
27173 .addClass(params.slideDuplicateActiveClass);
27174 } else {
27175 $wrapperEl
27176 .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]"))
27177 .addClass(params.slideDuplicateActiveClass);
27178 }
27179 }
27180 // Next Slide
27181 var nextSlide = activeSlide.nextAll(("." + (params.slideClass))).eq(0).addClass(params.slideNextClass);
27182 if (params.loop && nextSlide.length === 0) {
27183 nextSlide = slides.eq(0);
27184 nextSlide.addClass(params.slideNextClass);
27185 }
27186 // Prev Slide
27187 var prevSlide = activeSlide.prevAll(("." + (params.slideClass))).eq(0).addClass(params.slidePrevClass);
27188 if (params.loop && prevSlide.length === 0) {
27189 prevSlide = slides.eq(-1);
27190 prevSlide.addClass(params.slidePrevClass);
27191 }
27192 if (params.loop) {
27193 // Duplicate to all looped slides
27194 if (nextSlide.hasClass(params.slideDuplicateClass)) {
27195 $wrapperEl
27196 .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
27197 .addClass(params.slideDuplicateNextClass);
27198 } else {
27199 $wrapperEl
27200 .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
27201 .addClass(params.slideDuplicateNextClass);
27202 }
27203 if (prevSlide.hasClass(params.slideDuplicateClass)) {
27204 $wrapperEl
27205 .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
27206 .addClass(params.slideDuplicatePrevClass);
27207 } else {
27208 $wrapperEl
27209 .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
27210 .addClass(params.slideDuplicatePrevClass);
27211 }
27212 }
27213 }
27214
27215 function updateActiveIndex (newActiveIndex) {
27216 var swiper = this;
27217 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
27218 var slidesGrid = swiper.slidesGrid;
27219 var snapGrid = swiper.snapGrid;
27220 var params = swiper.params;
27221 var previousIndex = swiper.activeIndex;
27222 var previousRealIndex = swiper.realIndex;
27223 var previousSnapIndex = swiper.snapIndex;
27224 var activeIndex = newActiveIndex;
27225 var snapIndex;
27226 if (typeof activeIndex === 'undefined') {
27227 for (var i = 0; i < slidesGrid.length; i += 1) {
27228 if (typeof slidesGrid[i + 1] !== 'undefined') {
27229 if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {
27230 activeIndex = i;
27231 } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
27232 activeIndex = i + 1;
27233 }
27234 } else if (translate >= slidesGrid[i]) {
27235 activeIndex = i;
27236 }
27237 }
27238 // Normalize slideIndex
27239 if (params.normalizeSlideIndex) {
27240 if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }
27241 }
27242 }
27243 if (snapGrid.indexOf(translate) >= 0) {
27244 snapIndex = snapGrid.indexOf(translate);
27245 } else {
27246 snapIndex = Math.floor(activeIndex / params.slidesPerGroup);
27247 }
27248 if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
27249 if (activeIndex === previousIndex) {
27250 if (snapIndex !== previousSnapIndex) {
27251 swiper.snapIndex = snapIndex;
27252 swiper.emit('snapIndexChange');
27253 }
27254 return;
27255 }
27256
27257 // Get real index
27258 var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);
27259
27260 Utils.extend(swiper, {
27261 snapIndex: snapIndex,
27262 realIndex: realIndex,
27263 previousIndex: previousIndex,
27264 activeIndex: activeIndex,
27265 });
27266 swiper.emit('activeIndexChange');
27267 swiper.emit('snapIndexChange');
27268 if (previousRealIndex !== realIndex) {
27269 swiper.emit('realIndexChange');
27270 }
27271 swiper.emit('slideChange');
27272 }
27273
27274 function updateClickedSlide (e) {
27275 var swiper = this;
27276 var params = swiper.params;
27277 var slide = $(e.target).closest(("." + (params.slideClass)))[0];
27278 var slideFound = false;
27279 if (slide) {
27280 for (var i = 0; i < swiper.slides.length; i += 1) {
27281 if (swiper.slides[i] === slide) { slideFound = true; }
27282 }
27283 }
27284
27285 if (slide && slideFound) {
27286 swiper.clickedSlide = slide;
27287 if (swiper.virtual && swiper.params.virtual.enabled) {
27288 swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);
27289 } else {
27290 swiper.clickedIndex = $(slide).index();
27291 }
27292 } else {
27293 swiper.clickedSlide = undefined;
27294 swiper.clickedIndex = undefined;
27295 return;
27296 }
27297 if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
27298 swiper.slideToClickedSlide();
27299 }
27300 }
27301
27302 var update = {
27303 updateSize: updateSize,
27304 updateSlides: updateSlides,
27305 updateAutoHeight: updateAutoHeight,
27306 updateSlidesOffset: updateSlidesOffset,
27307 updateSlidesProgress: updateSlidesProgress,
27308 updateProgress: updateProgress,
27309 updateSlidesClasses: updateSlidesClasses,
27310 updateActiveIndex: updateActiveIndex,
27311 updateClickedSlide: updateClickedSlide,
27312 };
27313
27314 function getTranslate (axis) {
27315 if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';
27316
27317 var swiper = this;
27318
27319 var params = swiper.params;
27320 var rtl = swiper.rtlTranslate;
27321 var translate = swiper.translate;
27322 var $wrapperEl = swiper.$wrapperEl;
27323
27324 if (params.virtualTranslate) {
27325 return rtl ? -translate : translate;
27326 }
27327
27328 var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);
27329 if (rtl) { currentTranslate = -currentTranslate; }
27330
27331 return currentTranslate || 0;
27332 }
27333
27334 function setTranslate (translate, byController) {
27335 var swiper = this;
27336 var rtl = swiper.rtlTranslate;
27337 var params = swiper.params;
27338 var $wrapperEl = swiper.$wrapperEl;
27339 var progress = swiper.progress;
27340 var x = 0;
27341 var y = 0;
27342 var z = 0;
27343
27344 if (swiper.isHorizontal()) {
27345 x = rtl ? -translate : translate;
27346 } else {
27347 y = translate;
27348 }
27349
27350 if (params.roundLengths) {
27351 x = Math.floor(x);
27352 y = Math.floor(y);
27353 }
27354
27355 if (!params.virtualTranslate) {
27356 if (Support.transforms3d) { $wrapperEl.transform(("translate3d(" + x + "px, " + y + "px, " + z + "px)")); }
27357 else { $wrapperEl.transform(("translate(" + x + "px, " + y + "px)")); }
27358 }
27359 swiper.previousTranslate = swiper.translate;
27360 swiper.translate = swiper.isHorizontal() ? x : y;
27361
27362 // Check if we need to update progress
27363 var newProgress;
27364 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
27365 if (translatesDiff === 0) {
27366 newProgress = 0;
27367 } else {
27368 newProgress = (translate - swiper.minTranslate()) / (translatesDiff);
27369 }
27370 if (newProgress !== progress) {
27371 swiper.updateProgress(translate);
27372 }
27373
27374 swiper.emit('setTranslate', swiper.translate, byController);
27375 }
27376
27377 function minTranslate () {
27378 return (-this.snapGrid[0]);
27379 }
27380
27381 function maxTranslate () {
27382 return (-this.snapGrid[this.snapGrid.length - 1]);
27383 }
27384
27385 var translate = {
27386 getTranslate: getTranslate,
27387 setTranslate: setTranslate,
27388 minTranslate: minTranslate,
27389 maxTranslate: maxTranslate,
27390 };
27391
27392 function setTransition (duration, byController) {
27393 var swiper = this;
27394
27395 swiper.$wrapperEl.transition(duration);
27396
27397 swiper.emit('setTransition', duration, byController);
27398 }
27399
27400 function transitionStart (runCallbacks, direction) {
27401 if ( runCallbacks === void 0 ) runCallbacks = true;
27402
27403 var swiper = this;
27404 var activeIndex = swiper.activeIndex;
27405 var params = swiper.params;
27406 var previousIndex = swiper.previousIndex;
27407 if (params.autoHeight) {
27408 swiper.updateAutoHeight();
27409 }
27410
27411 var dir = direction;
27412 if (!dir) {
27413 if (activeIndex > previousIndex) { dir = 'next'; }
27414 else if (activeIndex < previousIndex) { dir = 'prev'; }
27415 else { dir = 'reset'; }
27416 }
27417
27418 swiper.emit('transitionStart');
27419
27420 if (runCallbacks && activeIndex !== previousIndex) {
27421 if (dir === 'reset') {
27422 swiper.emit('slideResetTransitionStart');
27423 return;
27424 }
27425 swiper.emit('slideChangeTransitionStart');
27426 if (dir === 'next') {
27427 swiper.emit('slideNextTransitionStart');
27428 } else {
27429 swiper.emit('slidePrevTransitionStart');
27430 }
27431 }
27432 }
27433
27434 function transitionEnd$1 (runCallbacks, direction) {
27435 if ( runCallbacks === void 0 ) runCallbacks = true;
27436
27437 var swiper = this;
27438 var activeIndex = swiper.activeIndex;
27439 var previousIndex = swiper.previousIndex;
27440 swiper.animating = false;
27441 swiper.setTransition(0);
27442
27443 var dir = direction;
27444 if (!dir) {
27445 if (activeIndex > previousIndex) { dir = 'next'; }
27446 else if (activeIndex < previousIndex) { dir = 'prev'; }
27447 else { dir = 'reset'; }
27448 }
27449
27450 swiper.emit('transitionEnd');
27451
27452 if (runCallbacks && activeIndex !== previousIndex) {
27453 if (dir === 'reset') {
27454 swiper.emit('slideResetTransitionEnd');
27455 return;
27456 }
27457 swiper.emit('slideChangeTransitionEnd');
27458 if (dir === 'next') {
27459 swiper.emit('slideNextTransitionEnd');
27460 } else {
27461 swiper.emit('slidePrevTransitionEnd');
27462 }
27463 }
27464 }
27465
27466 var transition$1 = {
27467 setTransition: setTransition,
27468 transitionStart: transitionStart,
27469 transitionEnd: transitionEnd$1,
27470 };
27471
27472 function slideTo (index, speed, runCallbacks, internal) {
27473 if ( index === void 0 ) index = 0;
27474 if ( speed === void 0 ) speed = this.params.speed;
27475 if ( runCallbacks === void 0 ) runCallbacks = true;
27476
27477 var swiper = this;
27478 var slideIndex = index;
27479 if (slideIndex < 0) { slideIndex = 0; }
27480
27481 var params = swiper.params;
27482 var snapGrid = swiper.snapGrid;
27483 var slidesGrid = swiper.slidesGrid;
27484 var previousIndex = swiper.previousIndex;
27485 var activeIndex = swiper.activeIndex;
27486 var rtl = swiper.rtlTranslate;
27487 if (swiper.animating && params.preventInteractionOnTransition) {
27488 return false;
27489 }
27490
27491 var snapIndex = Math.floor(slideIndex / params.slidesPerGroup);
27492 if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
27493
27494 if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
27495 swiper.emit('beforeSlideChangeStart');
27496 }
27497
27498 var translate = -snapGrid[snapIndex];
27499
27500 // Update progress
27501 swiper.updateProgress(translate);
27502
27503 // Normalize slideIndex
27504 if (params.normalizeSlideIndex) {
27505 for (var i = 0; i < slidesGrid.length; i += 1) {
27506 if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {
27507 slideIndex = i;
27508 }
27509 }
27510 }
27511 // Directions locks
27512 if (swiper.initialized && slideIndex !== activeIndex) {
27513 if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
27514 return false;
27515 }
27516 if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
27517 if ((activeIndex || 0) !== slideIndex) { return false; }
27518 }
27519 }
27520
27521 var direction;
27522 if (slideIndex > activeIndex) { direction = 'next'; }
27523 else if (slideIndex < activeIndex) { direction = 'prev'; }
27524 else { direction = 'reset'; }
27525
27526
27527 // Update Index
27528 if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {
27529 swiper.updateActiveIndex(slideIndex);
27530 // Update Height
27531 if (params.autoHeight) {
27532 swiper.updateAutoHeight();
27533 }
27534 swiper.updateSlidesClasses();
27535 if (params.effect !== 'slide') {
27536 swiper.setTranslate(translate);
27537 }
27538 if (direction !== 'reset') {
27539 swiper.transitionStart(runCallbacks, direction);
27540 swiper.transitionEnd(runCallbacks, direction);
27541 }
27542 return false;
27543 }
27544
27545 if (speed === 0 || !Support.transition) {
27546 swiper.setTransition(0);
27547 swiper.setTranslate(translate);
27548 swiper.updateActiveIndex(slideIndex);
27549 swiper.updateSlidesClasses();
27550 swiper.emit('beforeTransitionStart', speed, internal);
27551 swiper.transitionStart(runCallbacks, direction);
27552 swiper.transitionEnd(runCallbacks, direction);
27553 } else {
27554 swiper.setTransition(speed);
27555 swiper.setTranslate(translate);
27556 swiper.updateActiveIndex(slideIndex);
27557 swiper.updateSlidesClasses();
27558 swiper.emit('beforeTransitionStart', speed, internal);
27559 swiper.transitionStart(runCallbacks, direction);
27560 if (!swiper.animating) {
27561 swiper.animating = true;
27562 if (!swiper.onSlideToWrapperTransitionEnd) {
27563 swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
27564 if (!swiper || swiper.destroyed) { return; }
27565 if (e.target !== this) { return; }
27566 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
27567 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
27568 swiper.onSlideToWrapperTransitionEnd = null;
27569 delete swiper.onSlideToWrapperTransitionEnd;
27570 swiper.transitionEnd(runCallbacks, direction);
27571 };
27572 }
27573 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
27574 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
27575 }
27576 }
27577
27578 return true;
27579 }
27580
27581 function slideToLoop (index, speed, runCallbacks, internal) {
27582 if ( index === void 0 ) index = 0;
27583 if ( speed === void 0 ) speed = this.params.speed;
27584 if ( runCallbacks === void 0 ) runCallbacks = true;
27585
27586 var swiper = this;
27587 var newIndex = index;
27588 if (swiper.params.loop) {
27589 newIndex += swiper.loopedSlides;
27590 }
27591
27592 return swiper.slideTo(newIndex, speed, runCallbacks, internal);
27593 }
27594
27595 /* eslint no-unused-vars: "off" */
27596 function slideNext (speed, runCallbacks, internal) {
27597 if ( speed === void 0 ) speed = this.params.speed;
27598 if ( runCallbacks === void 0 ) runCallbacks = true;
27599
27600 var swiper = this;
27601 var params = swiper.params;
27602 var animating = swiper.animating;
27603 if (params.loop) {
27604 if (animating) { return false; }
27605 swiper.loopFix();
27606 // eslint-disable-next-line
27607 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
27608 return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);
27609 }
27610 return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);
27611 }
27612
27613 /* eslint no-unused-vars: "off" */
27614 function slidePrev (speed, runCallbacks, internal) {
27615 if ( speed === void 0 ) speed = this.params.speed;
27616 if ( runCallbacks === void 0 ) runCallbacks = true;
27617
27618 var swiper = this;
27619 var params = swiper.params;
27620 var animating = swiper.animating;
27621 var snapGrid = swiper.snapGrid;
27622 var slidesGrid = swiper.slidesGrid;
27623 var rtlTranslate = swiper.rtlTranslate;
27624
27625 if (params.loop) {
27626 if (animating) { return false; }
27627 swiper.loopFix();
27628 // eslint-disable-next-line
27629 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
27630 }
27631 var translate = rtlTranslate ? swiper.translate : -swiper.translate;
27632 function normalize(val) {
27633 if (val < 0) { return -Math.floor(Math.abs(val)); }
27634 return Math.floor(val);
27635 }
27636 var normalizedTranslate = normalize(translate);
27637 var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });
27638 var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });
27639
27640 var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
27641 var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
27642 var prevIndex;
27643 if (typeof prevSnap !== 'undefined') {
27644 prevIndex = slidesGrid.indexOf(prevSnap);
27645 if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }
27646 }
27647 return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
27648 }
27649
27650 /* eslint no-unused-vars: "off" */
27651 function slideReset (speed, runCallbacks, internal) {
27652 if ( speed === void 0 ) speed = this.params.speed;
27653 if ( runCallbacks === void 0 ) runCallbacks = true;
27654
27655 var swiper = this;
27656 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
27657 }
27658
27659 /* eslint no-unused-vars: "off" */
27660 function slideToClosest (speed, runCallbacks, internal) {
27661 if ( speed === void 0 ) speed = this.params.speed;
27662 if ( runCallbacks === void 0 ) runCallbacks = true;
27663
27664 var swiper = this;
27665 var index = swiper.activeIndex;
27666 var snapIndex = Math.floor(index / swiper.params.slidesPerGroup);
27667
27668 if (snapIndex < swiper.snapGrid.length - 1) {
27669 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
27670
27671 var currentSnap = swiper.snapGrid[snapIndex];
27672 var nextSnap = swiper.snapGrid[snapIndex + 1];
27673
27674 if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) {
27675 index = swiper.params.slidesPerGroup;
27676 }
27677 }
27678
27679 return swiper.slideTo(index, speed, runCallbacks, internal);
27680 }
27681
27682 function slideToClickedSlide () {
27683 var swiper = this;
27684 var params = swiper.params;
27685 var $wrapperEl = swiper.$wrapperEl;
27686
27687 var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
27688 var slideToIndex = swiper.clickedIndex;
27689 var realIndex;
27690 if (params.loop) {
27691 if (swiper.animating) { return; }
27692 realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);
27693 if (params.centeredSlides) {
27694 if (
27695 (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))
27696 || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))
27697 ) {
27698 swiper.loopFix();
27699 slideToIndex = $wrapperEl
27700 .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
27701 .eq(0)
27702 .index();
27703
27704 Utils.nextTick(function () {
27705 swiper.slideTo(slideToIndex);
27706 });
27707 } else {
27708 swiper.slideTo(slideToIndex);
27709 }
27710 } else if (slideToIndex > swiper.slides.length - slidesPerView) {
27711 swiper.loopFix();
27712 slideToIndex = $wrapperEl
27713 .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
27714 .eq(0)
27715 .index();
27716
27717 Utils.nextTick(function () {
27718 swiper.slideTo(slideToIndex);
27719 });
27720 } else {
27721 swiper.slideTo(slideToIndex);
27722 }
27723 } else {
27724 swiper.slideTo(slideToIndex);
27725 }
27726 }
27727
27728 var slide = {
27729 slideTo: slideTo,
27730 slideToLoop: slideToLoop,
27731 slideNext: slideNext,
27732 slidePrev: slidePrev,
27733 slideReset: slideReset,
27734 slideToClosest: slideToClosest,
27735 slideToClickedSlide: slideToClickedSlide,
27736 };
27737
27738 function loopCreate () {
27739 var swiper = this;
27740 var params = swiper.params;
27741 var $wrapperEl = swiper.$wrapperEl;
27742 // Remove duplicated slides
27743 $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass))).remove();
27744
27745 var slides = $wrapperEl.children(("." + (params.slideClass)));
27746
27747 if (params.loopFillGroupWithBlank) {
27748 var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);
27749 if (blankSlidesNum !== params.slidesPerGroup) {
27750 for (var i = 0; i < blankSlidesNum; i += 1) {
27751 var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + " " + (params.slideBlankClass)));
27752 $wrapperEl.append(blankNode);
27753 }
27754 slides = $wrapperEl.children(("." + (params.slideClass)));
27755 }
27756 }
27757
27758 if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }
27759
27760 swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10);
27761 swiper.loopedSlides += params.loopAdditionalSlides;
27762 if (swiper.loopedSlides > slides.length) {
27763 swiper.loopedSlides = slides.length;
27764 }
27765
27766 var prependSlides = [];
27767 var appendSlides = [];
27768 slides.each(function (index, el) {
27769 var slide = $(el);
27770 if (index < swiper.loopedSlides) { appendSlides.push(el); }
27771 if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }
27772 slide.attr('data-swiper-slide-index', index);
27773 });
27774 for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {
27775 $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));
27776 }
27777 for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {
27778 $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));
27779 }
27780 }
27781
27782 function loopFix () {
27783 var swiper = this;
27784 var params = swiper.params;
27785 var activeIndex = swiper.activeIndex;
27786 var slides = swiper.slides;
27787 var loopedSlides = swiper.loopedSlides;
27788 var allowSlidePrev = swiper.allowSlidePrev;
27789 var allowSlideNext = swiper.allowSlideNext;
27790 var snapGrid = swiper.snapGrid;
27791 var rtl = swiper.rtlTranslate;
27792 var newIndex;
27793 swiper.allowSlidePrev = true;
27794 swiper.allowSlideNext = true;
27795
27796 var snapTranslate = -snapGrid[activeIndex];
27797 var diff = snapTranslate - swiper.getTranslate();
27798
27799
27800 // Fix For Negative Oversliding
27801 if (activeIndex < loopedSlides) {
27802 newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;
27803 newIndex += loopedSlides;
27804 var slideChanged = swiper.slideTo(newIndex, 0, false, true);
27805 if (slideChanged && diff !== 0) {
27806 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
27807 }
27808 } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) {
27809 // Fix For Positive Oversliding
27810 newIndex = -slides.length + activeIndex + loopedSlides;
27811 newIndex += loopedSlides;
27812 var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);
27813 if (slideChanged$1 && diff !== 0) {
27814 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
27815 }
27816 }
27817 swiper.allowSlidePrev = allowSlidePrev;
27818 swiper.allowSlideNext = allowSlideNext;
27819 }
27820
27821 function loopDestroy () {
27822 var swiper = this;
27823 var $wrapperEl = swiper.$wrapperEl;
27824 var params = swiper.params;
27825 var slides = swiper.slides;
27826 $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + ",." + (params.slideClass) + "." + (params.slideBlankClass))).remove();
27827 slides.removeAttr('data-swiper-slide-index');
27828 }
27829
27830 var loop = {
27831 loopCreate: loopCreate,
27832 loopFix: loopFix,
27833 loopDestroy: loopDestroy,
27834 };
27835
27836 function setGrabCursor (moving) {
27837 var swiper = this;
27838 if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }
27839 var el = swiper.el;
27840 el.style.cursor = 'move';
27841 el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
27842 el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
27843 el.style.cursor = moving ? 'grabbing' : 'grab';
27844 }
27845
27846 function unsetGrabCursor () {
27847 var swiper = this;
27848 if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }
27849 swiper.el.style.cursor = '';
27850 }
27851
27852 var grabCursor = {
27853 setGrabCursor: setGrabCursor,
27854 unsetGrabCursor: unsetGrabCursor,
27855 };
27856
27857 function appendSlide (slides) {
27858 var swiper = this;
27859 var $wrapperEl = swiper.$wrapperEl;
27860 var params = swiper.params;
27861 if (params.loop) {
27862 swiper.loopDestroy();
27863 }
27864 if (typeof slides === 'object' && 'length' in slides) {
27865 for (var i = 0; i < slides.length; i += 1) {
27866 if (slides[i]) { $wrapperEl.append(slides[i]); }
27867 }
27868 } else {
27869 $wrapperEl.append(slides);
27870 }
27871 if (params.loop) {
27872 swiper.loopCreate();
27873 }
27874 if (!(params.observer && Support.observer)) {
27875 swiper.update();
27876 }
27877 }
27878
27879 function prependSlide (slides) {
27880 var swiper = this;
27881 var params = swiper.params;
27882 var $wrapperEl = swiper.$wrapperEl;
27883 var activeIndex = swiper.activeIndex;
27884
27885 if (params.loop) {
27886 swiper.loopDestroy();
27887 }
27888 var newActiveIndex = activeIndex + 1;
27889 if (typeof slides === 'object' && 'length' in slides) {
27890 for (var i = 0; i < slides.length; i += 1) {
27891 if (slides[i]) { $wrapperEl.prepend(slides[i]); }
27892 }
27893 newActiveIndex = activeIndex + slides.length;
27894 } else {
27895 $wrapperEl.prepend(slides);
27896 }
27897 if (params.loop) {
27898 swiper.loopCreate();
27899 }
27900 if (!(params.observer && Support.observer)) {
27901 swiper.update();
27902 }
27903 swiper.slideTo(newActiveIndex, 0, false);
27904 }
27905
27906 function addSlide (index, slides) {
27907 var swiper = this;
27908 var $wrapperEl = swiper.$wrapperEl;
27909 var params = swiper.params;
27910 var activeIndex = swiper.activeIndex;
27911 var activeIndexBuffer = activeIndex;
27912 if (params.loop) {
27913 activeIndexBuffer -= swiper.loopedSlides;
27914 swiper.loopDestroy();
27915 swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
27916 }
27917 var baseLength = swiper.slides.length;
27918 if (index <= 0) {
27919 swiper.prependSlide(slides);
27920 return;
27921 }
27922 if (index >= baseLength) {
27923 swiper.appendSlide(slides);
27924 return;
27925 }
27926 var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
27927
27928 var slidesBuffer = [];
27929 for (var i = baseLength - 1; i >= index; i -= 1) {
27930 var currentSlide = swiper.slides.eq(i);
27931 currentSlide.remove();
27932 slidesBuffer.unshift(currentSlide);
27933 }
27934
27935 if (typeof slides === 'object' && 'length' in slides) {
27936 for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
27937 if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }
27938 }
27939 newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
27940 } else {
27941 $wrapperEl.append(slides);
27942 }
27943
27944 for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {
27945 $wrapperEl.append(slidesBuffer[i$2]);
27946 }
27947
27948 if (params.loop) {
27949 swiper.loopCreate();
27950 }
27951 if (!(params.observer && Support.observer)) {
27952 swiper.update();
27953 }
27954 if (params.loop) {
27955 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
27956 } else {
27957 swiper.slideTo(newActiveIndex, 0, false);
27958 }
27959 }
27960
27961 function removeSlide (slidesIndexes) {
27962 var swiper = this;
27963 var params = swiper.params;
27964 var $wrapperEl = swiper.$wrapperEl;
27965 var activeIndex = swiper.activeIndex;
27966
27967 var activeIndexBuffer = activeIndex;
27968 if (params.loop) {
27969 activeIndexBuffer -= swiper.loopedSlides;
27970 swiper.loopDestroy();
27971 swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
27972 }
27973 var newActiveIndex = activeIndexBuffer;
27974 var indexToRemove;
27975
27976 if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
27977 for (var i = 0; i < slidesIndexes.length; i += 1) {
27978 indexToRemove = slidesIndexes[i];
27979 if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
27980 if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
27981 }
27982 newActiveIndex = Math.max(newActiveIndex, 0);
27983 } else {
27984 indexToRemove = slidesIndexes;
27985 if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
27986 if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
27987 newActiveIndex = Math.max(newActiveIndex, 0);
27988 }
27989
27990 if (params.loop) {
27991 swiper.loopCreate();
27992 }
27993
27994 if (!(params.observer && Support.observer)) {
27995 swiper.update();
27996 }
27997 if (params.loop) {
27998 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
27999 } else {
28000 swiper.slideTo(newActiveIndex, 0, false);
28001 }
28002 }
28003
28004 function removeAllSlides () {
28005 var swiper = this;
28006
28007 var slidesIndexes = [];
28008 for (var i = 0; i < swiper.slides.length; i += 1) {
28009 slidesIndexes.push(i);
28010 }
28011 swiper.removeSlide(slidesIndexes);
28012 }
28013
28014 var manipulation = {
28015 appendSlide: appendSlide,
28016 prependSlide: prependSlide,
28017 addSlide: addSlide,
28018 removeSlide: removeSlide,
28019 removeAllSlides: removeAllSlides,
28020 };
28021
28022 function onTouchStart (event) {
28023 var swiper = this;
28024 var data = swiper.touchEventsData;
28025 var params = swiper.params;
28026 var touches = swiper.touches;
28027 if (swiper.animating && params.preventInteractionOnTransition) {
28028 return;
28029 }
28030 var e = event;
28031 if (e.originalEvent) { e = e.originalEvent; }
28032 data.isTouchEvent = e.type === 'touchstart';
28033 if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }
28034 if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }
28035 if (data.isTouched && data.isMoved) { return; }
28036 if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : ("." + (params.noSwipingClass)))[0]) {
28037 swiper.allowClick = true;
28038 return;
28039 }
28040 if (params.swipeHandler) {
28041 if (!$(e).closest(params.swipeHandler)[0]) { return; }
28042 }
28043
28044 touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
28045 touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
28046 var startX = touches.currentX;
28047 var startY = touches.currentY;
28048
28049 // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore
28050
28051 var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
28052 var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
28053 if (
28054 edgeSwipeDetection
28055 && ((startX <= edgeSwipeThreshold)
28056 || (startX >= win.screen.width - edgeSwipeThreshold))
28057 ) {
28058 return;
28059 }
28060
28061 Utils.extend(data, {
28062 isTouched: true,
28063 isMoved: false,
28064 allowTouchCallbacks: true,
28065 isScrolling: undefined,
28066 startMoving: undefined,
28067 });
28068
28069 touches.startX = startX;
28070 touches.startY = startY;
28071 data.touchStartTime = Utils.now();
28072 swiper.allowClick = true;
28073 swiper.updateSize();
28074 swiper.swipeDirection = undefined;
28075 if (params.threshold > 0) { data.allowThresholdMove = false; }
28076 if (e.type !== 'touchstart') {
28077 var preventDefault = true;
28078 if ($(e.target).is(data.formElements)) { preventDefault = false; }
28079 if (
28080 doc.activeElement
28081 && $(doc.activeElement).is(data.formElements)
28082 && doc.activeElement !== e.target
28083 ) {
28084 doc.activeElement.blur();
28085 }
28086
28087 var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
28088 if (params.touchStartForcePreventDefault || shouldPreventDefault) {
28089 e.preventDefault();
28090 }
28091 }
28092 swiper.emit('touchStart', e);
28093 }
28094
28095 function onTouchMove (event) {
28096 var swiper = this;
28097 var data = swiper.touchEventsData;
28098 var params = swiper.params;
28099 var touches = swiper.touches;
28100 var rtl = swiper.rtlTranslate;
28101 var e = event;
28102 if (e.originalEvent) { e = e.originalEvent; }
28103 if (!data.isTouched) {
28104 if (data.startMoving && data.isScrolling) {
28105 swiper.emit('touchMoveOpposite', e);
28106 }
28107 return;
28108 }
28109 if (data.isTouchEvent && e.type === 'mousemove') { return; }
28110 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
28111 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
28112 if (e.preventedByNestedSwiper) {
28113 touches.startX = pageX;
28114 touches.startY = pageY;
28115 return;
28116 }
28117 if (!swiper.allowTouchMove) {
28118 // isMoved = true;
28119 swiper.allowClick = false;
28120 if (data.isTouched) {
28121 Utils.extend(touches, {
28122 startX: pageX,
28123 startY: pageY,
28124 currentX: pageX,
28125 currentY: pageY,
28126 });
28127 data.touchStartTime = Utils.now();
28128 }
28129 return;
28130 }
28131 if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
28132 if (swiper.isVertical()) {
28133 // Vertical
28134 if (
28135 (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())
28136 || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())
28137 ) {
28138 data.isTouched = false;
28139 data.isMoved = false;
28140 return;
28141 }
28142 } else if (
28143 (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())
28144 || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())
28145 ) {
28146 return;
28147 }
28148 }
28149 if (data.isTouchEvent && doc.activeElement) {
28150 if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {
28151 data.isMoved = true;
28152 swiper.allowClick = false;
28153 return;
28154 }
28155 }
28156 if (data.allowTouchCallbacks) {
28157 swiper.emit('touchMove', e);
28158 }
28159 if (e.targetTouches && e.targetTouches.length > 1) { return; }
28160
28161 touches.currentX = pageX;
28162 touches.currentY = pageY;
28163
28164 var diffX = touches.currentX - touches.startX;
28165 var diffY = touches.currentY - touches.startY;
28166 if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }
28167
28168 if (typeof data.isScrolling === 'undefined') {
28169 var touchAngle;
28170 if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {
28171 data.isScrolling = false;
28172 } else {
28173 // eslint-disable-next-line
28174 if ((diffX * diffX) + (diffY * diffY) >= 25) {
28175 touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;
28176 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);
28177 }
28178 }
28179 }
28180 if (data.isScrolling) {
28181 swiper.emit('touchMoveOpposite', e);
28182 }
28183 if (typeof data.startMoving === 'undefined') {
28184 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
28185 data.startMoving = true;
28186 }
28187 }
28188 if (data.isScrolling) {
28189 data.isTouched = false;
28190 return;
28191 }
28192 if (!data.startMoving) {
28193 return;
28194 }
28195 swiper.allowClick = false;
28196 e.preventDefault();
28197 if (params.touchMoveStopPropagation && !params.nested) {
28198 e.stopPropagation();
28199 }
28200
28201 if (!data.isMoved) {
28202 if (params.loop) {
28203 swiper.loopFix();
28204 }
28205 data.startTranslate = swiper.getTranslate();
28206 swiper.setTransition(0);
28207 if (swiper.animating) {
28208 swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
28209 }
28210 data.allowMomentumBounce = false;
28211 // Grab Cursor
28212 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
28213 swiper.setGrabCursor(true);
28214 }
28215 swiper.emit('sliderFirstMove', e);
28216 }
28217 swiper.emit('sliderMove', e);
28218 data.isMoved = true;
28219
28220 var diff = swiper.isHorizontal() ? diffX : diffY;
28221 touches.diff = diff;
28222
28223 diff *= params.touchRatio;
28224 if (rtl) { diff = -diff; }
28225
28226 swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
28227 data.currentTranslate = diff + data.startTranslate;
28228
28229 var disableParentSwiper = true;
28230 var resistanceRatio = params.resistanceRatio;
28231 if (params.touchReleaseOnEdges) {
28232 resistanceRatio = 0;
28233 }
28234 if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {
28235 disableParentSwiper = false;
28236 if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }
28237 } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
28238 disableParentSwiper = false;
28239 if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }
28240 }
28241
28242 if (disableParentSwiper) {
28243 e.preventedByNestedSwiper = true;
28244 }
28245
28246 // Directions locks
28247 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
28248 data.currentTranslate = data.startTranslate;
28249 }
28250 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
28251 data.currentTranslate = data.startTranslate;
28252 }
28253
28254
28255 // Threshold
28256 if (params.threshold > 0) {
28257 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
28258 if (!data.allowThresholdMove) {
28259 data.allowThresholdMove = true;
28260 touches.startX = touches.currentX;
28261 touches.startY = touches.currentY;
28262 data.currentTranslate = data.startTranslate;
28263 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
28264 return;
28265 }
28266 } else {
28267 data.currentTranslate = data.startTranslate;
28268 return;
28269 }
28270 }
28271
28272 if (!params.followFinger) { return; }
28273
28274 // Update active index in free mode
28275 if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
28276 swiper.updateActiveIndex();
28277 swiper.updateSlidesClasses();
28278 }
28279 if (params.freeMode) {
28280 // Velocity
28281 if (data.velocities.length === 0) {
28282 data.velocities.push({
28283 position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
28284 time: data.touchStartTime,
28285 });
28286 }
28287 data.velocities.push({
28288 position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
28289 time: Utils.now(),
28290 });
28291 }
28292 // Update progress
28293 swiper.updateProgress(data.currentTranslate);
28294 // Update translate
28295 swiper.setTranslate(data.currentTranslate);
28296 }
28297
28298 function onTouchEnd (event) {
28299 var swiper = this;
28300 var data = swiper.touchEventsData;
28301
28302 var params = swiper.params;
28303 var touches = swiper.touches;
28304 var rtl = swiper.rtlTranslate;
28305 var $wrapperEl = swiper.$wrapperEl;
28306 var slidesGrid = swiper.slidesGrid;
28307 var snapGrid = swiper.snapGrid;
28308 var e = event;
28309 if (e.originalEvent) { e = e.originalEvent; }
28310 if (data.allowTouchCallbacks) {
28311 swiper.emit('touchEnd', e);
28312 }
28313 data.allowTouchCallbacks = false;
28314 if (!data.isTouched) {
28315 if (data.isMoved && params.grabCursor) {
28316 swiper.setGrabCursor(false);
28317 }
28318 data.isMoved = false;
28319 data.startMoving = false;
28320 return;
28321 }
28322 // Return Grab Cursor
28323 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
28324 swiper.setGrabCursor(false);
28325 }
28326
28327 // Time diff
28328 var touchEndTime = Utils.now();
28329 var timeDiff = touchEndTime - data.touchStartTime;
28330
28331 // Tap, doubleTap, Click
28332 if (swiper.allowClick) {
28333 swiper.updateClickedSlide(e);
28334 swiper.emit('tap', e);
28335 if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) {
28336 if (data.clickTimeout) { clearTimeout(data.clickTimeout); }
28337 data.clickTimeout = Utils.nextTick(function () {
28338 if (!swiper || swiper.destroyed) { return; }
28339 swiper.emit('click', e);
28340 }, 300);
28341 }
28342 if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {
28343 if (data.clickTimeout) { clearTimeout(data.clickTimeout); }
28344 swiper.emit('doubleTap', e);
28345 }
28346 }
28347
28348 data.lastClickTime = Utils.now();
28349 Utils.nextTick(function () {
28350 if (!swiper.destroyed) { swiper.allowClick = true; }
28351 });
28352
28353 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
28354 data.isTouched = false;
28355 data.isMoved = false;
28356 data.startMoving = false;
28357 return;
28358 }
28359 data.isTouched = false;
28360 data.isMoved = false;
28361 data.startMoving = false;
28362
28363 var currentPos;
28364 if (params.followFinger) {
28365 currentPos = rtl ? swiper.translate : -swiper.translate;
28366 } else {
28367 currentPos = -data.currentTranslate;
28368 }
28369
28370 if (params.freeMode) {
28371 if (currentPos < -swiper.minTranslate()) {
28372 swiper.slideTo(swiper.activeIndex);
28373 return;
28374 }
28375 if (currentPos > -swiper.maxTranslate()) {
28376 if (swiper.slides.length < snapGrid.length) {
28377 swiper.slideTo(snapGrid.length - 1);
28378 } else {
28379 swiper.slideTo(swiper.slides.length - 1);
28380 }
28381 return;
28382 }
28383
28384 if (params.freeModeMomentum) {
28385 if (data.velocities.length > 1) {
28386 var lastMoveEvent = data.velocities.pop();
28387 var velocityEvent = data.velocities.pop();
28388
28389 var distance = lastMoveEvent.position - velocityEvent.position;
28390 var time = lastMoveEvent.time - velocityEvent.time;
28391 swiper.velocity = distance / time;
28392 swiper.velocity /= 2;
28393 if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
28394 swiper.velocity = 0;
28395 }
28396 // this implies that the user stopped moving a finger then released.
28397 // There would be no events with distance zero, so the last event is stale.
28398 if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {
28399 swiper.velocity = 0;
28400 }
28401 } else {
28402 swiper.velocity = 0;
28403 }
28404 swiper.velocity *= params.freeModeMomentumVelocityRatio;
28405
28406 data.velocities.length = 0;
28407 var momentumDuration = 1000 * params.freeModeMomentumRatio;
28408 var momentumDistance = swiper.velocity * momentumDuration;
28409
28410 var newPosition = swiper.translate + momentumDistance;
28411 if (rtl) { newPosition = -newPosition; }
28412
28413 var doBounce = false;
28414 var afterBouncePosition;
28415 var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
28416 var needsLoopFix;
28417 if (newPosition < swiper.maxTranslate()) {
28418 if (params.freeModeMomentumBounce) {
28419 if (newPosition + swiper.maxTranslate() < -bounceAmount) {
28420 newPosition = swiper.maxTranslate() - bounceAmount;
28421 }
28422 afterBouncePosition = swiper.maxTranslate();
28423 doBounce = true;
28424 data.allowMomentumBounce = true;
28425 } else {
28426 newPosition = swiper.maxTranslate();
28427 }
28428 if (params.loop && params.centeredSlides) { needsLoopFix = true; }
28429 } else if (newPosition > swiper.minTranslate()) {
28430 if (params.freeModeMomentumBounce) {
28431 if (newPosition - swiper.minTranslate() > bounceAmount) {
28432 newPosition = swiper.minTranslate() + bounceAmount;
28433 }
28434 afterBouncePosition = swiper.minTranslate();
28435 doBounce = true;
28436 data.allowMomentumBounce = true;
28437 } else {
28438 newPosition = swiper.minTranslate();
28439 }
28440 if (params.loop && params.centeredSlides) { needsLoopFix = true; }
28441 } else if (params.freeModeSticky) {
28442 var nextSlide;
28443 for (var j = 0; j < snapGrid.length; j += 1) {
28444 if (snapGrid[j] > -newPosition) {
28445 nextSlide = j;
28446 break;
28447 }
28448 }
28449
28450 if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
28451 newPosition = snapGrid[nextSlide];
28452 } else {
28453 newPosition = snapGrid[nextSlide - 1];
28454 }
28455 newPosition = -newPosition;
28456 }
28457 if (needsLoopFix) {
28458 swiper.once('transitionEnd', function () {
28459 swiper.loopFix();
28460 });
28461 }
28462 // Fix duration
28463 if (swiper.velocity !== 0) {
28464 if (rtl) {
28465 momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
28466 } else {
28467 momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
28468 }
28469 } else if (params.freeModeSticky) {
28470 swiper.slideToClosest();
28471 return;
28472 }
28473
28474 if (params.freeModeMomentumBounce && doBounce) {
28475 swiper.updateProgress(afterBouncePosition);
28476 swiper.setTransition(momentumDuration);
28477 swiper.setTranslate(newPosition);
28478 swiper.transitionStart(true, swiper.swipeDirection);
28479 swiper.animating = true;
28480 $wrapperEl.transitionEnd(function () {
28481 if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }
28482 swiper.emit('momentumBounce');
28483
28484 swiper.setTransition(params.speed);
28485 swiper.setTranslate(afterBouncePosition);
28486 $wrapperEl.transitionEnd(function () {
28487 if (!swiper || swiper.destroyed) { return; }
28488 swiper.transitionEnd();
28489 });
28490 });
28491 } else if (swiper.velocity) {
28492 swiper.updateProgress(newPosition);
28493 swiper.setTransition(momentumDuration);
28494 swiper.setTranslate(newPosition);
28495 swiper.transitionStart(true, swiper.swipeDirection);
28496 if (!swiper.animating) {
28497 swiper.animating = true;
28498 $wrapperEl.transitionEnd(function () {
28499 if (!swiper || swiper.destroyed) { return; }
28500 swiper.transitionEnd();
28501 });
28502 }
28503 } else {
28504 swiper.updateProgress(newPosition);
28505 }
28506
28507 swiper.updateActiveIndex();
28508 swiper.updateSlidesClasses();
28509 } else if (params.freeModeSticky) {
28510 swiper.slideToClosest();
28511 return;
28512 }
28513
28514 if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
28515 swiper.updateProgress();
28516 swiper.updateActiveIndex();
28517 swiper.updateSlidesClasses();
28518 }
28519 return;
28520 }
28521
28522 // Find current slide
28523 var stopIndex = 0;
28524 var groupSize = swiper.slidesSizesGrid[0];
28525 for (var i = 0; i < slidesGrid.length; i += params.slidesPerGroup) {
28526 if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') {
28527 if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) {
28528 stopIndex = i;
28529 groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i];
28530 }
28531 } else if (currentPos >= slidesGrid[i]) {
28532 stopIndex = i;
28533 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
28534 }
28535 }
28536
28537 // Find current slide size
28538 var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
28539
28540 if (timeDiff > params.longSwipesMs) {
28541 // Long touches
28542 if (!params.longSwipes) {
28543 swiper.slideTo(swiper.activeIndex);
28544 return;
28545 }
28546 if (swiper.swipeDirection === 'next') {
28547 if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + params.slidesPerGroup); }
28548 else { swiper.slideTo(stopIndex); }
28549 }
28550 if (swiper.swipeDirection === 'prev') {
28551 if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + params.slidesPerGroup); }
28552 else { swiper.slideTo(stopIndex); }
28553 }
28554 } else {
28555 // Short swipes
28556 if (!params.shortSwipes) {
28557 swiper.slideTo(swiper.activeIndex);
28558 return;
28559 }
28560 if (swiper.swipeDirection === 'next') {
28561 swiper.slideTo(stopIndex + params.slidesPerGroup);
28562 }
28563 if (swiper.swipeDirection === 'prev') {
28564 swiper.slideTo(stopIndex);
28565 }
28566 }
28567 }
28568
28569 function onResize () {
28570 var swiper = this;
28571
28572 var params = swiper.params;
28573 var el = swiper.el;
28574
28575 if (el && el.offsetWidth === 0) { return; }
28576
28577 // Breakpoints
28578 if (params.breakpoints) {
28579 swiper.setBreakpoint();
28580 }
28581
28582 // Save locks
28583 var allowSlideNext = swiper.allowSlideNext;
28584 var allowSlidePrev = swiper.allowSlidePrev;
28585 var snapGrid = swiper.snapGrid;
28586
28587 // Disable locks on resize
28588 swiper.allowSlideNext = true;
28589 swiper.allowSlidePrev = true;
28590
28591 swiper.updateSize();
28592 swiper.updateSlides();
28593
28594 if (params.freeMode) {
28595 var newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate());
28596 swiper.setTranslate(newTranslate);
28597 swiper.updateActiveIndex();
28598 swiper.updateSlidesClasses();
28599
28600 if (params.autoHeight) {
28601 swiper.updateAutoHeight();
28602 }
28603 } else {
28604 swiper.updateSlidesClasses();
28605 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
28606 swiper.slideTo(swiper.slides.length - 1, 0, false, true);
28607 } else {
28608 swiper.slideTo(swiper.activeIndex, 0, false, true);
28609 }
28610 }
28611 // Return locks after resize
28612 swiper.allowSlidePrev = allowSlidePrev;
28613 swiper.allowSlideNext = allowSlideNext;
28614
28615 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
28616 swiper.checkOverflow();
28617 }
28618 }
28619
28620 function onClick (e) {
28621 var swiper = this;
28622 if (!swiper.allowClick) {
28623 if (swiper.params.preventClicks) { e.preventDefault(); }
28624 if (swiper.params.preventClicksPropagation && swiper.animating) {
28625 e.stopPropagation();
28626 e.stopImmediatePropagation();
28627 }
28628 }
28629 }
28630
28631 function attachEvents() {
28632 var swiper = this;
28633 var params = swiper.params;
28634 var touchEvents = swiper.touchEvents;
28635 var el = swiper.el;
28636 var wrapperEl = swiper.wrapperEl;
28637
28638 {
28639 swiper.onTouchStart = onTouchStart.bind(swiper);
28640 swiper.onTouchMove = onTouchMove.bind(swiper);
28641 swiper.onTouchEnd = onTouchEnd.bind(swiper);
28642 }
28643
28644 swiper.onClick = onClick.bind(swiper);
28645
28646 var target = params.touchEventsTarget === 'container' ? el : wrapperEl;
28647 var capture = !!params.nested;
28648
28649 // Touch Events
28650 {
28651 if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {
28652 target.addEventListener(touchEvents.start, swiper.onTouchStart, false);
28653 doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
28654 doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
28655 } else {
28656 if (Support.touch) {
28657 var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
28658 target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
28659 target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);
28660 target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
28661 }
28662 if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
28663 target.addEventListener('mousedown', swiper.onTouchStart, false);
28664 doc.addEventListener('mousemove', swiper.onTouchMove, capture);
28665 doc.addEventListener('mouseup', swiper.onTouchEnd, false);
28666 }
28667 }
28668 // Prevent Links Clicks
28669 if (params.preventClicks || params.preventClicksPropagation) {
28670 target.addEventListener('click', swiper.onClick, true);
28671 }
28672 }
28673
28674 // Resize handler
28675 swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);
28676 }
28677
28678 function detachEvents() {
28679 var swiper = this;
28680
28681 var params = swiper.params;
28682 var touchEvents = swiper.touchEvents;
28683 var el = swiper.el;
28684 var wrapperEl = swiper.wrapperEl;
28685
28686 var target = params.touchEventsTarget === 'container' ? el : wrapperEl;
28687 var capture = !!params.nested;
28688
28689 // Touch Events
28690 {
28691 if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {
28692 target.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
28693 doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
28694 doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
28695 } else {
28696 if (Support.touch) {
28697 var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
28698 target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
28699 target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
28700 target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
28701 }
28702 if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
28703 target.removeEventListener('mousedown', swiper.onTouchStart, false);
28704 doc.removeEventListener('mousemove', swiper.onTouchMove, capture);
28705 doc.removeEventListener('mouseup', swiper.onTouchEnd, false);
28706 }
28707 }
28708 // Prevent Links Clicks
28709 if (params.preventClicks || params.preventClicksPropagation) {
28710 target.removeEventListener('click', swiper.onClick, true);
28711 }
28712 }
28713
28714 // Resize handler
28715 swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);
28716 }
28717
28718 var events = {
28719 attachEvents: attachEvents,
28720 detachEvents: detachEvents,
28721 };
28722
28723 function setBreakpoint () {
28724 var swiper = this;
28725 var activeIndex = swiper.activeIndex;
28726 var initialized = swiper.initialized;
28727 var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;
28728 var params = swiper.params;
28729 var breakpoints = params.breakpoints;
28730 if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }
28731
28732 // Set breakpoint for window width and update parameters
28733 var breakpoint = swiper.getBreakpoint(breakpoints);
28734
28735 if (breakpoint && swiper.currentBreakpoint !== breakpoint) {
28736 var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
28737 if (breakpointOnlyParams) {
28738 ['slidesPerView', 'spaceBetween', 'slidesPerGroup'].forEach(function (param) {
28739 var paramValue = breakpointOnlyParams[param];
28740 if (typeof paramValue === 'undefined') { return; }
28741 if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {
28742 breakpointOnlyParams[param] = 'auto';
28743 } else if (param === 'slidesPerView') {
28744 breakpointOnlyParams[param] = parseFloat(paramValue);
28745 } else {
28746 breakpointOnlyParams[param] = parseInt(paramValue, 10);
28747 }
28748 });
28749 }
28750
28751 var breakpointParams = breakpointOnlyParams || swiper.originalParams;
28752 var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView);
28753
28754 Utils.extend(swiper.params, breakpointParams);
28755
28756 Utils.extend(swiper, {
28757 allowTouchMove: swiper.params.allowTouchMove,
28758 allowSlideNext: swiper.params.allowSlideNext,
28759 allowSlidePrev: swiper.params.allowSlidePrev,
28760 });
28761
28762 swiper.currentBreakpoint = breakpoint;
28763
28764 if (needsReLoop && initialized) {
28765 swiper.loopDestroy();
28766 swiper.loopCreate();
28767 swiper.updateSlides();
28768 swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);
28769 }
28770 swiper.emit('breakpoint', breakpointParams);
28771 }
28772 }
28773
28774 function getBreakpoint (breakpoints) {
28775 var swiper = this;
28776 // Get breakpoint for window width
28777 if (!breakpoints) { return undefined; }
28778 var breakpoint = false;
28779 var points = [];
28780 Object.keys(breakpoints).forEach(function (point) {
28781 points.push(point);
28782 });
28783 points.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); });
28784 for (var i = 0; i < points.length; i += 1) {
28785 var point = points[i];
28786 if (swiper.params.breakpointsInverse) {
28787 if (point <= win.innerWidth) {
28788 breakpoint = point;
28789 }
28790 } else if (point >= win.innerWidth && !breakpoint) {
28791 breakpoint = point;
28792 }
28793 }
28794 return breakpoint || 'max';
28795 }
28796
28797 var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };
28798
28799 var Browser = (function Browser() {
28800 function isSafari() {
28801 var ua = win.navigator.userAgent.toLowerCase();
28802 return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);
28803 }
28804 return {
28805 isIE: !!win.navigator.userAgent.match(/Trident/g) || !!win.navigator.userAgent.match(/MSIE/g),
28806 isSafari: isSafari(),
28807 isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),
28808 };
28809 }());
28810
28811 function addClasses () {
28812 var swiper = this;
28813 var classNames = swiper.classNames;
28814 var params = swiper.params;
28815 var rtl = swiper.rtl;
28816 var $el = swiper.$el;
28817 var suffixes = [];
28818
28819 suffixes.push(params.direction);
28820
28821 if (params.freeMode) {
28822 suffixes.push('free-mode');
28823 }
28824 if (!Support.flexbox) {
28825 suffixes.push('no-flexbox');
28826 }
28827 if (params.autoHeight) {
28828 suffixes.push('autoheight');
28829 }
28830 if (rtl) {
28831 suffixes.push('rtl');
28832 }
28833 if (params.slidesPerColumn > 1) {
28834 suffixes.push('multirow');
28835 }
28836 if (Device.android) {
28837 suffixes.push('android');
28838 }
28839 if (Device.ios) {
28840 suffixes.push('ios');
28841 }
28842 // WP8 Touch Events Fix
28843 if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {
28844 suffixes.push(("wp8-" + (params.direction)));
28845 }
28846
28847 suffixes.forEach(function (suffix) {
28848 classNames.push(params.containerModifierClass + suffix);
28849 });
28850
28851 $el.addClass(classNames.join(' '));
28852 }
28853
28854 function removeClasses () {
28855 var swiper = this;
28856 var $el = swiper.$el;
28857 var classNames = swiper.classNames;
28858
28859 $el.removeClass(classNames.join(' '));
28860 }
28861
28862 var classes = { addClasses: addClasses, removeClasses: removeClasses };
28863
28864 function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {
28865 var image;
28866 function onReady() {
28867 if (callback) { callback(); }
28868 }
28869 if (!imageEl.complete || !checkForComplete) {
28870 if (src) {
28871 image = new win.Image();
28872 image.onload = onReady;
28873 image.onerror = onReady;
28874 if (sizes) {
28875 image.sizes = sizes;
28876 }
28877 if (srcset) {
28878 image.srcset = srcset;
28879 }
28880 if (src) {
28881 image.src = src;
28882 }
28883 } else {
28884 onReady();
28885 }
28886 } else {
28887 // image already loaded...
28888 onReady();
28889 }
28890 }
28891
28892 function preloadImages () {
28893 var swiper = this;
28894 swiper.imagesToLoad = swiper.$el.find('img');
28895 function onReady() {
28896 if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }
28897 if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }
28898 if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
28899 if (swiper.params.updateOnImagesReady) { swiper.update(); }
28900 swiper.emit('imagesReady');
28901 }
28902 }
28903 for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
28904 var imageEl = swiper.imagesToLoad[i];
28905 swiper.loadImage(
28906 imageEl,
28907 imageEl.currentSrc || imageEl.getAttribute('src'),
28908 imageEl.srcset || imageEl.getAttribute('srcset'),
28909 imageEl.sizes || imageEl.getAttribute('sizes'),
28910 true,
28911 onReady
28912 );
28913 }
28914 }
28915
28916 var images = {
28917 loadImage: loadImage,
28918 preloadImages: preloadImages,
28919 };
28920
28921 function checkOverflow() {
28922 var swiper = this;
28923 var wasLocked = swiper.isLocked;
28924
28925 swiper.isLocked = swiper.snapGrid.length === 1;
28926 swiper.allowSlideNext = !swiper.isLocked;
28927 swiper.allowSlidePrev = !swiper.isLocked;
28928
28929 // events
28930 if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }
28931
28932 if (wasLocked && wasLocked !== swiper.isLocked) {
28933 swiper.isEnd = false;
28934 swiper.navigation.update();
28935 }
28936 }
28937
28938 var checkOverflow$1 = { checkOverflow: checkOverflow };
28939
28940 var defaults = {
28941 init: true,
28942 direction: 'horizontal',
28943 touchEventsTarget: 'container',
28944 initialSlide: 0,
28945 speed: 300,
28946 //
28947 preventInteractionOnTransition: false,
28948
28949 // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).
28950 edgeSwipeDetection: false,
28951 edgeSwipeThreshold: 20,
28952
28953 // Free mode
28954 freeMode: false,
28955 freeModeMomentum: true,
28956 freeModeMomentumRatio: 1,
28957 freeModeMomentumBounce: true,
28958 freeModeMomentumBounceRatio: 1,
28959 freeModeMomentumVelocityRatio: 1,
28960 freeModeSticky: false,
28961 freeModeMinimumVelocity: 0.02,
28962
28963 // Autoheight
28964 autoHeight: false,
28965
28966 // Set wrapper width
28967 setWrapperSize: false,
28968
28969 // Virtual Translate
28970 virtualTranslate: false,
28971
28972 // Effects
28973 effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
28974
28975 // Breakpoints
28976 breakpoints: undefined,
28977 breakpointsInverse: false,
28978
28979 // Slides grid
28980 spaceBetween: 0,
28981 slidesPerView: 1,
28982 slidesPerColumn: 1,
28983 slidesPerColumnFill: 'column',
28984 slidesPerGroup: 1,
28985 centeredSlides: false,
28986 slidesOffsetBefore: 0, // in px
28987 slidesOffsetAfter: 0, // in px
28988 normalizeSlideIndex: true,
28989 centerInsufficientSlides: false,
28990
28991 // Disable swiper and hide navigation when container not overflow
28992 watchOverflow: false,
28993
28994 // Round length
28995 roundLengths: false,
28996
28997 // Touches
28998 touchRatio: 1,
28999 touchAngle: 45,
29000 simulateTouch: true,
29001 shortSwipes: true,
29002 longSwipes: true,
29003 longSwipesRatio: 0.5,
29004 longSwipesMs: 300,
29005 followFinger: true,
29006 allowTouchMove: true,
29007 threshold: 0,
29008 touchMoveStopPropagation: true,
29009 touchStartPreventDefault: true,
29010 touchStartForcePreventDefault: false,
29011 touchReleaseOnEdges: false,
29012
29013 // Unique Navigation Elements
29014 uniqueNavElements: true,
29015
29016 // Resistance
29017 resistance: true,
29018 resistanceRatio: 0.85,
29019
29020 // Progress
29021 watchSlidesProgress: false,
29022 watchSlidesVisibility: false,
29023
29024 // Cursor
29025 grabCursor: false,
29026
29027 // Clicks
29028 preventClicks: true,
29029 preventClicksPropagation: true,
29030 slideToClickedSlide: false,
29031
29032 // Images
29033 preloadImages: true,
29034 updateOnImagesReady: true,
29035
29036 // loop
29037 loop: false,
29038 loopAdditionalSlides: 0,
29039 loopedSlides: null,
29040 loopFillGroupWithBlank: false,
29041
29042 // Swiping/no swiping
29043 allowSlidePrev: true,
29044 allowSlideNext: true,
29045 swipeHandler: null, // '.swipe-handler',
29046 noSwiping: true,
29047 noSwipingClass: 'swiper-no-swiping',
29048 noSwipingSelector: null,
29049
29050 // Passive Listeners
29051 passiveListeners: true,
29052
29053 // NS
29054 containerModifierClass: 'swiper-container-', // NEW
29055 slideClass: 'swiper-slide',
29056 slideBlankClass: 'swiper-slide-invisible-blank',
29057 slideActiveClass: 'swiper-slide-active',
29058 slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
29059 slideVisibleClass: 'swiper-slide-visible',
29060 slideDuplicateClass: 'swiper-slide-duplicate',
29061 slideNextClass: 'swiper-slide-next',
29062 slideDuplicateNextClass: 'swiper-slide-duplicate-next',
29063 slidePrevClass: 'swiper-slide-prev',
29064 slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
29065 wrapperClass: 'swiper-wrapper',
29066
29067 // Callbacks
29068 runCallbacksOnInit: true,
29069 };
29070
29071 var prototypes = {
29072 update: update,
29073 translate: translate,
29074 transition: transition$1,
29075 slide: slide,
29076 loop: loop,
29077 grabCursor: grabCursor,
29078 manipulation: manipulation,
29079 events: events,
29080 breakpoints: breakpoints,
29081 checkOverflow: checkOverflow$1,
29082 classes: classes,
29083 images: images,
29084 };
29085
29086 var extendedDefaults = {};
29087
29088 var Swiper = /*@__PURE__*/(function (SwiperClass) {
29089 function Swiper() {
29090 var assign;
29091
29092 var args = [], len = arguments.length;
29093 while ( len-- ) args[ len ] = arguments[ len ];
29094 var el;
29095 var params;
29096 if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {
29097 params = args[0];
29098 } else {
29099 (assign = args, el = assign[0], params = assign[1]);
29100 }
29101 if (!params) { params = {}; }
29102
29103 params = Utils.extend({}, params);
29104 if (el && !params.el) { params.el = el; }
29105
29106 SwiperClass.call(this, params);
29107
29108 Object.keys(prototypes).forEach(function (prototypeGroup) {
29109 Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
29110 if (!Swiper.prototype[protoMethod]) {
29111 Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
29112 }
29113 });
29114 });
29115
29116 // Swiper Instance
29117 var swiper = this;
29118 if (typeof swiper.modules === 'undefined') {
29119 swiper.modules = {};
29120 }
29121 Object.keys(swiper.modules).forEach(function (moduleName) {
29122 var module = swiper.modules[moduleName];
29123 if (module.params) {
29124 var moduleParamName = Object.keys(module.params)[0];
29125 var moduleParams = module.params[moduleParamName];
29126 if (typeof moduleParams !== 'object' || moduleParams === null) { return; }
29127 if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }
29128 if (params[moduleParamName] === true) {
29129 params[moduleParamName] = { enabled: true };
29130 }
29131 if (
29132 typeof params[moduleParamName] === 'object'
29133 && !('enabled' in params[moduleParamName])
29134 ) {
29135 params[moduleParamName].enabled = true;
29136 }
29137 if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }
29138 }
29139 });
29140
29141 // Extend defaults with modules params
29142 var swiperParams = Utils.extend({}, defaults);
29143 swiper.useModulesParams(swiperParams);
29144
29145 // Extend defaults with passed params
29146 swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);
29147 swiper.originalParams = Utils.extend({}, swiper.params);
29148 swiper.passedParams = Utils.extend({}, params);
29149
29150 // Save Dom lib
29151 swiper.$ = $;
29152
29153 // Find el
29154 var $el = $(swiper.params.el);
29155 el = $el[0];
29156
29157 if (!el) {
29158 return undefined;
29159 }
29160
29161 if ($el.length > 1) {
29162 var swipers = [];
29163 $el.each(function (index, containerEl) {
29164 var newParams = Utils.extend({}, params, { el: containerEl });
29165 swipers.push(new Swiper(newParams));
29166 });
29167 return swipers;
29168 }
29169
29170 el.swiper = swiper;
29171 $el.data('swiper', swiper);
29172
29173 // Find Wrapper
29174 var $wrapperEl = $el.children(("." + (swiper.params.wrapperClass)));
29175
29176 // Extend Swiper
29177 Utils.extend(swiper, {
29178 $el: $el,
29179 el: el,
29180 $wrapperEl: $wrapperEl,
29181 wrapperEl: $wrapperEl[0],
29182
29183 // Classes
29184 classNames: [],
29185
29186 // Slides
29187 slides: $(),
29188 slidesGrid: [],
29189 snapGrid: [],
29190 slidesSizesGrid: [],
29191
29192 // isDirection
29193 isHorizontal: function isHorizontal() {
29194 return swiper.params.direction === 'horizontal';
29195 },
29196 isVertical: function isVertical() {
29197 return swiper.params.direction === 'vertical';
29198 },
29199 // RTL
29200 rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
29201 rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
29202 wrongRTL: $wrapperEl.css('display') === '-webkit-box',
29203
29204 // Indexes
29205 activeIndex: 0,
29206 realIndex: 0,
29207
29208 //
29209 isBeginning: true,
29210 isEnd: false,
29211
29212 // Props
29213 translate: 0,
29214 previousTranslate: 0,
29215 progress: 0,
29216 velocity: 0,
29217 animating: false,
29218
29219 // Locks
29220 allowSlideNext: swiper.params.allowSlideNext,
29221 allowSlidePrev: swiper.params.allowSlidePrev,
29222
29223 // Touch Events
29224 touchEvents: (function touchEvents() {
29225 var touch = ['touchstart', 'touchmove', 'touchend'];
29226 var desktop = ['mousedown', 'mousemove', 'mouseup'];
29227 if (Support.pointerEvents) {
29228 desktop = ['pointerdown', 'pointermove', 'pointerup'];
29229 } else if (Support.prefixedPointerEvents) {
29230 desktop = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp'];
29231 }
29232 swiper.touchEventsTouch = {
29233 start: touch[0],
29234 move: touch[1],
29235 end: touch[2],
29236 };
29237 swiper.touchEventsDesktop = {
29238 start: desktop[0],
29239 move: desktop[1],
29240 end: desktop[2],
29241 };
29242 return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;
29243 }()),
29244 touchEventsData: {
29245 isTouched: undefined,
29246 isMoved: undefined,
29247 allowTouchCallbacks: undefined,
29248 touchStartTime: undefined,
29249 isScrolling: undefined,
29250 currentTranslate: undefined,
29251 startTranslate: undefined,
29252 allowThresholdMove: undefined,
29253 // Form elements to match
29254 formElements: 'input, select, option, textarea, button, video',
29255 // Last click time
29256 lastClickTime: Utils.now(),
29257 clickTimeout: undefined,
29258 // Velocities
29259 velocities: [],
29260 allowMomentumBounce: undefined,
29261 isTouchEvent: undefined,
29262 startMoving: undefined,
29263 },
29264
29265 // Clicks
29266 allowClick: true,
29267
29268 // Touches
29269 allowTouchMove: swiper.params.allowTouchMove,
29270
29271 touches: {
29272 startX: 0,
29273 startY: 0,
29274 currentX: 0,
29275 currentY: 0,
29276 diff: 0,
29277 },
29278
29279 // Images
29280 imagesToLoad: [],
29281 imagesLoaded: 0,
29282
29283 });
29284
29285 // Install Modules
29286 swiper.useModules();
29287
29288 // Init
29289 if (swiper.params.init) {
29290 swiper.init();
29291 }
29292
29293 // Return app instance
29294 return swiper;
29295 }
29296
29297 if ( SwiperClass ) Swiper.__proto__ = SwiperClass;
29298 Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );
29299 Swiper.prototype.constructor = Swiper;
29300
29301 var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };
29302
29303 Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {
29304 var swiper = this;
29305 var params = swiper.params;
29306 var slides = swiper.slides;
29307 var slidesGrid = swiper.slidesGrid;
29308 var swiperSize = swiper.size;
29309 var activeIndex = swiper.activeIndex;
29310 var spv = 1;
29311 if (params.centeredSlides) {
29312 var slideSize = slides[activeIndex].swiperSlideSize;
29313 var breakLoop;
29314 for (var i = activeIndex + 1; i < slides.length; i += 1) {
29315 if (slides[i] && !breakLoop) {
29316 slideSize += slides[i].swiperSlideSize;
29317 spv += 1;
29318 if (slideSize > swiperSize) { breakLoop = true; }
29319 }
29320 }
29321 for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {
29322 if (slides[i$1] && !breakLoop) {
29323 slideSize += slides[i$1].swiperSlideSize;
29324 spv += 1;
29325 if (slideSize > swiperSize) { breakLoop = true; }
29326 }
29327 }
29328 } else {
29329 for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {
29330 if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {
29331 spv += 1;
29332 }
29333 }
29334 }
29335 return spv;
29336 };
29337
29338 Swiper.prototype.update = function update$$1 () {
29339 var swiper = this;
29340 if (!swiper || swiper.destroyed) { return; }
29341 var snapGrid = swiper.snapGrid;
29342 var params = swiper.params;
29343 // Breakpoints
29344 if (params.breakpoints) {
29345 swiper.setBreakpoint();
29346 }
29347 swiper.updateSize();
29348 swiper.updateSlides();
29349 swiper.updateProgress();
29350 swiper.updateSlidesClasses();
29351
29352 function setTranslate() {
29353 var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
29354 var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
29355 swiper.setTranslate(newTranslate);
29356 swiper.updateActiveIndex();
29357 swiper.updateSlidesClasses();
29358 }
29359 var translated;
29360 if (swiper.params.freeMode) {
29361 setTranslate();
29362 if (swiper.params.autoHeight) {
29363 swiper.updateAutoHeight();
29364 }
29365 } else {
29366 if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
29367 translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);
29368 } else {
29369 translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
29370 }
29371 if (!translated) {
29372 setTranslate();
29373 }
29374 }
29375 if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
29376 swiper.checkOverflow();
29377 }
29378 swiper.emit('update');
29379 };
29380
29381 Swiper.prototype.init = function init () {
29382 var swiper = this;
29383 if (swiper.initialized) { return; }
29384
29385 swiper.emit('beforeInit');
29386
29387 // Set breakpoint
29388 if (swiper.params.breakpoints) {
29389 swiper.setBreakpoint();
29390 }
29391
29392 // Add Classes
29393 swiper.addClasses();
29394
29395 // Create loop
29396 if (swiper.params.loop) {
29397 swiper.loopCreate();
29398 }
29399
29400 // Update size
29401 swiper.updateSize();
29402
29403 // Update slides
29404 swiper.updateSlides();
29405
29406 if (swiper.params.watchOverflow) {
29407 swiper.checkOverflow();
29408 }
29409
29410 // Set Grab Cursor
29411 if (swiper.params.grabCursor) {
29412 swiper.setGrabCursor();
29413 }
29414
29415 if (swiper.params.preloadImages) {
29416 swiper.preloadImages();
29417 }
29418
29419 // Slide To Initial Slide
29420 if (swiper.params.loop) {
29421 swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);
29422 } else {
29423 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);
29424 }
29425
29426 // Attach events
29427 swiper.attachEvents();
29428
29429 // Init Flag
29430 swiper.initialized = true;
29431
29432 // Emit
29433 swiper.emit('init');
29434 };
29435
29436 Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {
29437 if ( deleteInstance === void 0 ) deleteInstance = true;
29438 if ( cleanStyles === void 0 ) cleanStyles = true;
29439
29440 var swiper = this;
29441 var params = swiper.params;
29442 var $el = swiper.$el;
29443 var $wrapperEl = swiper.$wrapperEl;
29444 var slides = swiper.slides;
29445
29446 if (typeof swiper.params === 'undefined' || swiper.destroyed) {
29447 return null;
29448 }
29449
29450 swiper.emit('beforeDestroy');
29451
29452 // Init Flag
29453 swiper.initialized = false;
29454
29455 // Detach events
29456 swiper.detachEvents();
29457
29458 // Destroy loop
29459 if (params.loop) {
29460 swiper.loopDestroy();
29461 }
29462
29463 // Cleanup styles
29464 if (cleanStyles) {
29465 swiper.removeClasses();
29466 $el.removeAttr('style');
29467 $wrapperEl.removeAttr('style');
29468 if (slides && slides.length) {
29469 slides
29470 .removeClass([
29471 params.slideVisibleClass,
29472 params.slideActiveClass,
29473 params.slideNextClass,
29474 params.slidePrevClass ].join(' '))
29475 .removeAttr('style')
29476 .removeAttr('data-swiper-slide-index')
29477 .removeAttr('data-swiper-column')
29478 .removeAttr('data-swiper-row');
29479 }
29480 }
29481
29482 swiper.emit('destroy');
29483
29484 // Detach emitter events
29485 Object.keys(swiper.eventsListeners).forEach(function (eventName) {
29486 swiper.off(eventName);
29487 });
29488
29489 if (deleteInstance !== false) {
29490 swiper.$el[0].swiper = null;
29491 swiper.$el.data('swiper', null);
29492 Utils.deleteProps(swiper);
29493 }
29494 swiper.destroyed = true;
29495
29496 return null;
29497 };
29498
29499 Swiper.extendDefaults = function extendDefaults (newDefaults) {
29500 Utils.extend(extendedDefaults, newDefaults);
29501 };
29502
29503 staticAccessors.extendedDefaults.get = function () {
29504 return extendedDefaults;
29505 };
29506
29507 staticAccessors.defaults.get = function () {
29508 return defaults;
29509 };
29510
29511 staticAccessors.Class.get = function () {
29512 return SwiperClass;
29513 };
29514
29515 staticAccessors.$.get = function () {
29516 return $;
29517 };
29518
29519 Object.defineProperties( Swiper, staticAccessors );
29520
29521 return Swiper;
29522 }(Framework7Class));
29523
29524 var Device$1 = {
29525 name: 'device',
29526 proto: {
29527 device: Device,
29528 },
29529 static: {
29530 device: Device,
29531 },
29532 };
29533
29534 var Support$1 = {
29535 name: 'support',
29536 proto: {
29537 support: Support,
29538 },
29539 static: {
29540 support: Support,
29541 },
29542 };
29543
29544 var Browser$1 = {
29545 name: 'browser',
29546 proto: {
29547 browser: Browser,
29548 },
29549 static: {
29550 browser: Browser,
29551 },
29552 };
29553
29554 var Resize = {
29555 name: 'resize',
29556 create: function create() {
29557 var swiper = this;
29558 Utils.extend(swiper, {
29559 resize: {
29560 resizeHandler: function resizeHandler() {
29561 if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
29562 swiper.emit('beforeResize');
29563 swiper.emit('resize');
29564 },
29565 orientationChangeHandler: function orientationChangeHandler() {
29566 if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
29567 swiper.emit('orientationchange');
29568 },
29569 },
29570 });
29571 },
29572 on: {
29573 init: function init() {
29574 var swiper = this;
29575 // Emit resize
29576 win.addEventListener('resize', swiper.resize.resizeHandler);
29577
29578 // Emit orientationchange
29579 win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);
29580 },
29581 destroy: function destroy() {
29582 var swiper = this;
29583 win.removeEventListener('resize', swiper.resize.resizeHandler);
29584 win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);
29585 },
29586 },
29587 };
29588
29589 var Observer = {
29590 func: win.MutationObserver || win.WebkitMutationObserver,
29591 attach: function attach(target, options) {
29592 if ( options === void 0 ) options = {};
29593
29594 var swiper = this;
29595
29596 var ObserverFunc = Observer.func;
29597 var observer = new ObserverFunc(function (mutations) {
29598 // The observerUpdate event should only be triggered
29599 // once despite the number of mutations. Additional
29600 // triggers are redundant and are very costly
29601 if (mutations.length === 1) {
29602 swiper.emit('observerUpdate', mutations[0]);
29603 return;
29604 }
29605 var observerUpdate = function observerUpdate() {
29606 swiper.emit('observerUpdate', mutations[0]);
29607 };
29608
29609 if (win.requestAnimationFrame) {
29610 win.requestAnimationFrame(observerUpdate);
29611 } else {
29612 win.setTimeout(observerUpdate, 0);
29613 }
29614 });
29615
29616 observer.observe(target, {
29617 attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
29618 childList: typeof options.childList === 'undefined' ? true : options.childList,
29619 characterData: typeof options.characterData === 'undefined' ? true : options.characterData,
29620 });
29621
29622 swiper.observer.observers.push(observer);
29623 },
29624 init: function init() {
29625 var swiper = this;
29626 if (!Support.observer || !swiper.params.observer) { return; }
29627 if (swiper.params.observeParents) {
29628 var containerParents = swiper.$el.parents();
29629 for (var i = 0; i < containerParents.length; i += 1) {
29630 swiper.observer.attach(containerParents[i]);
29631 }
29632 }
29633 // Observe container
29634 swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });
29635
29636 // Observe wrapper
29637 swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });
29638 },
29639 destroy: function destroy() {
29640 var swiper = this;
29641 swiper.observer.observers.forEach(function (observer) {
29642 observer.disconnect();
29643 });
29644 swiper.observer.observers = [];
29645 },
29646 };
29647
29648 var Observer$1 = {
29649 name: 'observer',
29650 params: {
29651 observer: false,
29652 observeParents: false,
29653 observeSlideChildren: false,
29654 },
29655 create: function create() {
29656 var swiper = this;
29657 Utils.extend(swiper, {
29658 observer: {
29659 init: Observer.init.bind(swiper),
29660 attach: Observer.attach.bind(swiper),
29661 destroy: Observer.destroy.bind(swiper),
29662 observers: [],
29663 },
29664 });
29665 },
29666 on: {
29667 init: function init() {
29668 var swiper = this;
29669 swiper.observer.init();
29670 },
29671 destroy: function destroy() {
29672 var swiper = this;
29673 swiper.observer.destroy();
29674 },
29675 },
29676 };
29677
29678 var Virtual = {
29679 update: function update(force) {
29680 var swiper = this;
29681 var ref = swiper.params;
29682 var slidesPerView = ref.slidesPerView;
29683 var slidesPerGroup = ref.slidesPerGroup;
29684 var centeredSlides = ref.centeredSlides;
29685 var ref$1 = swiper.params.virtual;
29686 var addSlidesBefore = ref$1.addSlidesBefore;
29687 var addSlidesAfter = ref$1.addSlidesAfter;
29688 var ref$2 = swiper.virtual;
29689 var previousFrom = ref$2.from;
29690 var previousTo = ref$2.to;
29691 var slides = ref$2.slides;
29692 var previousSlidesGrid = ref$2.slidesGrid;
29693 var renderSlide = ref$2.renderSlide;
29694 var previousOffset = ref$2.offset;
29695 swiper.updateActiveIndex();
29696 var activeIndex = swiper.activeIndex || 0;
29697
29698 var offsetProp;
29699 if (swiper.rtlTranslate) { offsetProp = 'right'; }
29700 else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }
29701
29702 var slidesAfter;
29703 var slidesBefore;
29704 if (centeredSlides) {
29705 slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
29706 slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
29707 } else {
29708 slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;
29709 slidesBefore = slidesPerGroup + addSlidesAfter;
29710 }
29711 var from = Math.max((activeIndex || 0) - slidesBefore, 0);
29712 var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
29713 var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
29714
29715 Utils.extend(swiper.virtual, {
29716 from: from,
29717 to: to,
29718 offset: offset,
29719 slidesGrid: swiper.slidesGrid,
29720 });
29721
29722 function onRendered() {
29723 swiper.updateSlides();
29724 swiper.updateProgress();
29725 swiper.updateSlidesClasses();
29726 if (swiper.lazy && swiper.params.lazy.enabled) {
29727 swiper.lazy.load();
29728 }
29729 }
29730
29731 if (previousFrom === from && previousTo === to && !force) {
29732 if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
29733 swiper.slides.css(offsetProp, (offset + "px"));
29734 }
29735 swiper.updateProgress();
29736 return;
29737 }
29738 if (swiper.params.virtual.renderExternal) {
29739 swiper.params.virtual.renderExternal.call(swiper, {
29740 offset: offset,
29741 from: from,
29742 to: to,
29743 slides: (function getSlides() {
29744 var slidesToRender = [];
29745 for (var i = from; i <= to; i += 1) {
29746 slidesToRender.push(slides[i]);
29747 }
29748 return slidesToRender;
29749 }()),
29750 });
29751 onRendered();
29752 return;
29753 }
29754 var prependIndexes = [];
29755 var appendIndexes = [];
29756 if (force) {
29757 swiper.$wrapperEl.find(("." + (swiper.params.slideClass))).remove();
29758 } else {
29759 for (var i = previousFrom; i <= previousTo; i += 1) {
29760 if (i < from || i > to) {
29761 swiper.$wrapperEl.find(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + i + "\"]")).remove();
29762 }
29763 }
29764 }
29765 for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
29766 if (i$1 >= from && i$1 <= to) {
29767 if (typeof previousTo === 'undefined' || force) {
29768 appendIndexes.push(i$1);
29769 } else {
29770 if (i$1 > previousTo) { appendIndexes.push(i$1); }
29771 if (i$1 < previousFrom) { prependIndexes.push(i$1); }
29772 }
29773 }
29774 }
29775 appendIndexes.forEach(function (index) {
29776 swiper.$wrapperEl.append(renderSlide(slides[index], index));
29777 });
29778 prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {
29779 swiper.$wrapperEl.prepend(renderSlide(slides[index], index));
29780 });
29781 swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + "px"));
29782 onRendered();
29783 },
29784 renderSlide: function renderSlide(slide, index) {
29785 var swiper = this;
29786 var params = swiper.params.virtual;
29787 if (params.cache && swiper.virtual.cache[index]) {
29788 return swiper.virtual.cache[index];
29789 }
29790 var $slideEl = params.renderSlide
29791 ? $(params.renderSlide.call(swiper, slide, index))
29792 : $(("<div class=\"" + (swiper.params.slideClass) + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>"));
29793 if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }
29794 if (params.cache) { swiper.virtual.cache[index] = $slideEl; }
29795 return $slideEl;
29796 },
29797 appendSlide: function appendSlide(slide) {
29798 var swiper = this;
29799 swiper.virtual.slides.push(slide);
29800 swiper.virtual.update(true);
29801 },
29802 prependSlide: function prependSlide(slide) {
29803 var swiper = this;
29804 swiper.virtual.slides.unshift(slide);
29805 if (swiper.params.virtual.cache) {
29806 var cache = swiper.virtual.cache;
29807 var newCache = {};
29808 Object.keys(cache).forEach(function (cachedIndex) {
29809 newCache[cachedIndex + 1] = cache[cachedIndex];
29810 });
29811 swiper.virtual.cache = newCache;
29812 }
29813 swiper.virtual.update(true);
29814 swiper.slideNext(0);
29815 },
29816 };
29817
29818 var Virtual$1 = {
29819 name: 'virtual',
29820 params: {
29821 virtual: {
29822 enabled: false,
29823 slides: [],
29824 cache: true,
29825 renderSlide: null,
29826 renderExternal: null,
29827 addSlidesBefore: 0,
29828 addSlidesAfter: 0,
29829 },
29830 },
29831 create: function create() {
29832 var swiper = this;
29833 Utils.extend(swiper, {
29834 virtual: {
29835 update: Virtual.update.bind(swiper),
29836 appendSlide: Virtual.appendSlide.bind(swiper),
29837 prependSlide: Virtual.prependSlide.bind(swiper),
29838 renderSlide: Virtual.renderSlide.bind(swiper),
29839 slides: swiper.params.virtual.slides,
29840 cache: {},
29841 },
29842 });
29843 },
29844 on: {
29845 beforeInit: function beforeInit() {
29846 var swiper = this;
29847 if (!swiper.params.virtual.enabled) { return; }
29848 swiper.classNames.push(((swiper.params.containerModifierClass) + "virtual"));
29849 var overwriteParams = {
29850 watchSlidesProgress: true,
29851 };
29852 Utils.extend(swiper.params, overwriteParams);
29853 Utils.extend(swiper.originalParams, overwriteParams);
29854
29855 if (!swiper.params.initialSlide) {
29856 swiper.virtual.update();
29857 }
29858 },
29859 setTranslate: function setTranslate() {
29860 var swiper = this;
29861 if (!swiper.params.virtual.enabled) { return; }
29862 swiper.virtual.update();
29863 },
29864 },
29865 };
29866
29867 var Navigation = {
29868 update: function update() {
29869 // Update Navigation Buttons
29870 var swiper = this;
29871 var params = swiper.params.navigation;
29872
29873 if (swiper.params.loop) { return; }
29874 var ref = swiper.navigation;
29875 var $nextEl = ref.$nextEl;
29876 var $prevEl = ref.$prevEl;
29877
29878 if ($prevEl && $prevEl.length > 0) {
29879 if (swiper.isBeginning) {
29880 $prevEl.addClass(params.disabledClass);
29881 } else {
29882 $prevEl.removeClass(params.disabledClass);
29883 }
29884 $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
29885 }
29886 if ($nextEl && $nextEl.length > 0) {
29887 if (swiper.isEnd) {
29888 $nextEl.addClass(params.disabledClass);
29889 } else {
29890 $nextEl.removeClass(params.disabledClass);
29891 }
29892 $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
29893 }
29894 },
29895 onPrevClick: function onPrevClick(e) {
29896 var swiper = this;
29897 e.preventDefault();
29898 if (swiper.isBeginning && !swiper.params.loop) { return; }
29899 swiper.slidePrev();
29900 },
29901 onNextClick: function onNextClick(e) {
29902 var swiper = this;
29903 e.preventDefault();
29904 if (swiper.isEnd && !swiper.params.loop) { return; }
29905 swiper.slideNext();
29906 },
29907 init: function init() {
29908 var swiper = this;
29909 var params = swiper.params.navigation;
29910 if (!(params.nextEl || params.prevEl)) { return; }
29911
29912 var $nextEl;
29913 var $prevEl;
29914 if (params.nextEl) {
29915 $nextEl = $(params.nextEl);
29916 if (
29917 swiper.params.uniqueNavElements
29918 && typeof params.nextEl === 'string'
29919 && $nextEl.length > 1
29920 && swiper.$el.find(params.nextEl).length === 1
29921 ) {
29922 $nextEl = swiper.$el.find(params.nextEl);
29923 }
29924 }
29925 if (params.prevEl) {
29926 $prevEl = $(params.prevEl);
29927 if (
29928 swiper.params.uniqueNavElements
29929 && typeof params.prevEl === 'string'
29930 && $prevEl.length > 1
29931 && swiper.$el.find(params.prevEl).length === 1
29932 ) {
29933 $prevEl = swiper.$el.find(params.prevEl);
29934 }
29935 }
29936
29937 if ($nextEl && $nextEl.length > 0) {
29938 $nextEl.on('click', swiper.navigation.onNextClick);
29939 }
29940 if ($prevEl && $prevEl.length > 0) {
29941 $prevEl.on('click', swiper.navigation.onPrevClick);
29942 }
29943
29944 Utils.extend(swiper.navigation, {
29945 $nextEl: $nextEl,
29946 nextEl: $nextEl && $nextEl[0],
29947 $prevEl: $prevEl,
29948 prevEl: $prevEl && $prevEl[0],
29949 });
29950 },
29951 destroy: function destroy() {
29952 var swiper = this;
29953 var ref = swiper.navigation;
29954 var $nextEl = ref.$nextEl;
29955 var $prevEl = ref.$prevEl;
29956 if ($nextEl && $nextEl.length) {
29957 $nextEl.off('click', swiper.navigation.onNextClick);
29958 $nextEl.removeClass(swiper.params.navigation.disabledClass);
29959 }
29960 if ($prevEl && $prevEl.length) {
29961 $prevEl.off('click', swiper.navigation.onPrevClick);
29962 $prevEl.removeClass(swiper.params.navigation.disabledClass);
29963 }
29964 },
29965 };
29966
29967 var Navigation$1 = {
29968 name: 'navigation',
29969 params: {
29970 navigation: {
29971 nextEl: null,
29972 prevEl: null,
29973
29974 hideOnClick: false,
29975 disabledClass: 'swiper-button-disabled',
29976 hiddenClass: 'swiper-button-hidden',
29977 lockClass: 'swiper-button-lock',
29978 },
29979 },
29980 create: function create() {
29981 var swiper = this;
29982 Utils.extend(swiper, {
29983 navigation: {
29984 init: Navigation.init.bind(swiper),
29985 update: Navigation.update.bind(swiper),
29986 destroy: Navigation.destroy.bind(swiper),
29987 onNextClick: Navigation.onNextClick.bind(swiper),
29988 onPrevClick: Navigation.onPrevClick.bind(swiper),
29989 },
29990 });
29991 },
29992 on: {
29993 init: function init() {
29994 var swiper = this;
29995 swiper.navigation.init();
29996 swiper.navigation.update();
29997 },
29998 toEdge: function toEdge() {
29999 var swiper = this;
30000 swiper.navigation.update();
30001 },
30002 fromEdge: function fromEdge() {
30003 var swiper = this;
30004 swiper.navigation.update();
30005 },
30006 destroy: function destroy() {
30007 var swiper = this;
30008 swiper.navigation.destroy();
30009 },
30010 click: function click(e) {
30011 var swiper = this;
30012 var ref = swiper.navigation;
30013 var $nextEl = ref.$nextEl;
30014 var $prevEl = ref.$prevEl;
30015 if (
30016 swiper.params.navigation.hideOnClick
30017 && !$(e.target).is($prevEl)
30018 && !$(e.target).is($nextEl)
30019 ) {
30020 if ($nextEl) { $nextEl.toggleClass(swiper.params.navigation.hiddenClass); }
30021 if ($prevEl) { $prevEl.toggleClass(swiper.params.navigation.hiddenClass); }
30022 }
30023 },
30024 },
30025 };
30026
30027 var Pagination = {
30028 update: function update() {
30029 // Render || Update Pagination bullets/items
30030 var swiper = this;
30031 var rtl = swiper.rtl;
30032 var params = swiper.params.pagination;
30033 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
30034 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
30035 var $el = swiper.pagination.$el;
30036 // Current/Total
30037 var current;
30038 var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
30039 if (swiper.params.loop) {
30040 current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);
30041 if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {
30042 current -= (slidesLength - (swiper.loopedSlides * 2));
30043 }
30044 if (current > total - 1) { current -= total; }
30045 if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }
30046 } else if (typeof swiper.snapIndex !== 'undefined') {
30047 current = swiper.snapIndex;
30048 } else {
30049 current = swiper.activeIndex || 0;
30050 }
30051 // Types
30052 if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
30053 var bullets = swiper.pagination.bullets;
30054 var firstIndex;
30055 var lastIndex;
30056 var midIndex;
30057 if (params.dynamicBullets) {
30058 swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
30059 $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + "px"));
30060 if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {
30061 swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);
30062 if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {
30063 swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;
30064 } else if (swiper.pagination.dynamicBulletIndex < 0) {
30065 swiper.pagination.dynamicBulletIndex = 0;
30066 }
30067 }
30068 firstIndex = current - swiper.pagination.dynamicBulletIndex;
30069 lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
30070 midIndex = (lastIndex + firstIndex) / 2;
30071 }
30072 bullets.removeClass(((params.bulletActiveClass) + " " + (params.bulletActiveClass) + "-next " + (params.bulletActiveClass) + "-next-next " + (params.bulletActiveClass) + "-prev " + (params.bulletActiveClass) + "-prev-prev " + (params.bulletActiveClass) + "-main"));
30073 if ($el.length > 1) {
30074 bullets.each(function (index, bullet) {
30075 var $bullet = $(bullet);
30076 var bulletIndex = $bullet.index();
30077 if (bulletIndex === current) {
30078 $bullet.addClass(params.bulletActiveClass);
30079 }
30080 if (params.dynamicBullets) {
30081 if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
30082 $bullet.addClass(((params.bulletActiveClass) + "-main"));
30083 }
30084 if (bulletIndex === firstIndex) {
30085 $bullet
30086 .prev()
30087 .addClass(((params.bulletActiveClass) + "-prev"))
30088 .prev()
30089 .addClass(((params.bulletActiveClass) + "-prev-prev"));
30090 }
30091 if (bulletIndex === lastIndex) {
30092 $bullet
30093 .next()
30094 .addClass(((params.bulletActiveClass) + "-next"))
30095 .next()
30096 .addClass(((params.bulletActiveClass) + "-next-next"));
30097 }
30098 }
30099 });
30100 } else {
30101 var $bullet = bullets.eq(current);
30102 $bullet.addClass(params.bulletActiveClass);
30103 if (params.dynamicBullets) {
30104 var $firstDisplayedBullet = bullets.eq(firstIndex);
30105 var $lastDisplayedBullet = bullets.eq(lastIndex);
30106 for (var i = firstIndex; i <= lastIndex; i += 1) {
30107 bullets.eq(i).addClass(((params.bulletActiveClass) + "-main"));
30108 }
30109 $firstDisplayedBullet
30110 .prev()
30111 .addClass(((params.bulletActiveClass) + "-prev"))
30112 .prev()
30113 .addClass(((params.bulletActiveClass) + "-prev-prev"));
30114 $lastDisplayedBullet
30115 .next()
30116 .addClass(((params.bulletActiveClass) + "-next"))
30117 .next()
30118 .addClass(((params.bulletActiveClass) + "-next-next"));
30119 }
30120 }
30121 if (params.dynamicBullets) {
30122 var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
30123 var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);
30124 var offsetProp = rtl ? 'right' : 'left';
30125 bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + "px"));
30126 }
30127 }
30128 if (params.type === 'fraction') {
30129 $el.find(("." + (params.currentClass))).text(params.formatFractionCurrent(current + 1));
30130 $el.find(("." + (params.totalClass))).text(params.formatFractionTotal(total));
30131 }
30132 if (params.type === 'progressbar') {
30133 var progressbarDirection;
30134 if (params.progressbarOpposite) {
30135 progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
30136 } else {
30137 progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
30138 }
30139 var scale = (current + 1) / total;
30140 var scaleX = 1;
30141 var scaleY = 1;
30142 if (progressbarDirection === 'horizontal') {
30143 scaleX = scale;
30144 } else {
30145 scaleY = scale;
30146 }
30147 $el.find(("." + (params.progressbarFillClass))).transform(("translate3d(0,0,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")")).transition(swiper.params.speed);
30148 }
30149 if (params.type === 'custom' && params.renderCustom) {
30150 $el.html(params.renderCustom(swiper, current + 1, total));
30151 swiper.emit('paginationRender', swiper, $el[0]);
30152 } else {
30153 swiper.emit('paginationUpdate', swiper, $el[0]);
30154 }
30155 $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
30156 },
30157 render: function render() {
30158 // Render Container
30159 var swiper = this;
30160 var params = swiper.params.pagination;
30161 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
30162 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
30163
30164 var $el = swiper.pagination.$el;
30165 var paginationHTML = '';
30166 if (params.type === 'bullets') {
30167 var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
30168 for (var i = 0; i < numberOfBullets; i += 1) {
30169 if (params.renderBullet) {
30170 paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
30171 } else {
30172 paginationHTML += "<" + (params.bulletElement) + " class=\"" + (params.bulletClass) + "\"></" + (params.bulletElement) + ">";
30173 }
30174 }
30175 $el.html(paginationHTML);
30176 swiper.pagination.bullets = $el.find(("." + (params.bulletClass)));
30177 }
30178 if (params.type === 'fraction') {
30179 if (params.renderFraction) {
30180 paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
30181 } else {
30182 paginationHTML = "<span class=\"" + (params.currentClass) + "\"></span>"
30183 + ' / '
30184 + "<span class=\"" + (params.totalClass) + "\"></span>";
30185 }
30186 $el.html(paginationHTML);
30187 }
30188 if (params.type === 'progressbar') {
30189 if (params.renderProgressbar) {
30190 paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
30191 } else {
30192 paginationHTML = "<span class=\"" + (params.progressbarFillClass) + "\"></span>";
30193 }
30194 $el.html(paginationHTML);
30195 }
30196 if (params.type !== 'custom') {
30197 swiper.emit('paginationRender', swiper.pagination.$el[0]);
30198 }
30199 },
30200 init: function init() {
30201 var swiper = this;
30202 var params = swiper.params.pagination;
30203 if (!params.el) { return; }
30204
30205 var $el = $(params.el);
30206 if ($el.length === 0) { return; }
30207
30208 if (
30209 swiper.params.uniqueNavElements
30210 && typeof params.el === 'string'
30211 && $el.length > 1
30212 && swiper.$el.find(params.el).length === 1
30213 ) {
30214 $el = swiper.$el.find(params.el);
30215 }
30216
30217 if (params.type === 'bullets' && params.clickable) {
30218 $el.addClass(params.clickableClass);
30219 }
30220
30221 $el.addClass(params.modifierClass + params.type);
30222
30223 if (params.type === 'bullets' && params.dynamicBullets) {
30224 $el.addClass(("" + (params.modifierClass) + (params.type) + "-dynamic"));
30225 swiper.pagination.dynamicBulletIndex = 0;
30226 if (params.dynamicMainBullets < 1) {
30227 params.dynamicMainBullets = 1;
30228 }
30229 }
30230 if (params.type === 'progressbar' && params.progressbarOpposite) {
30231 $el.addClass(params.progressbarOppositeClass);
30232 }
30233
30234 if (params.clickable) {
30235 $el.on('click', ("." + (params.bulletClass)), function onClick(e) {
30236 e.preventDefault();
30237 var index = $(this).index() * swiper.params.slidesPerGroup;
30238 if (swiper.params.loop) { index += swiper.loopedSlides; }
30239 swiper.slideTo(index);
30240 });
30241 }
30242
30243 Utils.extend(swiper.pagination, {
30244 $el: $el,
30245 el: $el[0],
30246 });
30247 },
30248 destroy: function destroy() {
30249 var swiper = this;
30250 var params = swiper.params.pagination;
30251 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
30252 var $el = swiper.pagination.$el;
30253
30254 $el.removeClass(params.hiddenClass);
30255 $el.removeClass(params.modifierClass + params.type);
30256 if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }
30257 if (params.clickable) {
30258 $el.off('click', ("." + (params.bulletClass)));
30259 }
30260 },
30261 };
30262
30263 var Pagination$1 = {
30264 name: 'pagination',
30265 params: {
30266 pagination: {
30267 el: null,
30268 bulletElement: 'span',
30269 clickable: false,
30270 hideOnClick: false,
30271 renderBullet: null,
30272 renderProgressbar: null,
30273 renderFraction: null,
30274 renderCustom: null,
30275 progressbarOpposite: false,
30276 type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'
30277 dynamicBullets: false,
30278 dynamicMainBullets: 1,
30279 formatFractionCurrent: function (number) { return number; },
30280 formatFractionTotal: function (number) { return number; },
30281 bulletClass: 'swiper-pagination-bullet',
30282 bulletActiveClass: 'swiper-pagination-bullet-active',
30283 modifierClass: 'swiper-pagination-', // NEW
30284 currentClass: 'swiper-pagination-current',
30285 totalClass: 'swiper-pagination-total',
30286 hiddenClass: 'swiper-pagination-hidden',
30287 progressbarFillClass: 'swiper-pagination-progressbar-fill',
30288 progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',
30289 clickableClass: 'swiper-pagination-clickable', // NEW
30290 lockClass: 'swiper-pagination-lock',
30291 },
30292 },
30293 create: function create() {
30294 var swiper = this;
30295 Utils.extend(swiper, {
30296 pagination: {
30297 init: Pagination.init.bind(swiper),
30298 render: Pagination.render.bind(swiper),
30299 update: Pagination.update.bind(swiper),
30300 destroy: Pagination.destroy.bind(swiper),
30301 dynamicBulletIndex: 0,
30302 },
30303 });
30304 },
30305 on: {
30306 init: function init() {
30307 var swiper = this;
30308 swiper.pagination.init();
30309 swiper.pagination.render();
30310 swiper.pagination.update();
30311 },
30312 activeIndexChange: function activeIndexChange() {
30313 var swiper = this;
30314 if (swiper.params.loop) {
30315 swiper.pagination.update();
30316 } else if (typeof swiper.snapIndex === 'undefined') {
30317 swiper.pagination.update();
30318 }
30319 },
30320 snapIndexChange: function snapIndexChange() {
30321 var swiper = this;
30322 if (!swiper.params.loop) {
30323 swiper.pagination.update();
30324 }
30325 },
30326 slidesLengthChange: function slidesLengthChange() {
30327 var swiper = this;
30328 if (swiper.params.loop) {
30329 swiper.pagination.render();
30330 swiper.pagination.update();
30331 }
30332 },
30333 snapGridLengthChange: function snapGridLengthChange() {
30334 var swiper = this;
30335 if (!swiper.params.loop) {
30336 swiper.pagination.render();
30337 swiper.pagination.update();
30338 }
30339 },
30340 destroy: function destroy() {
30341 var swiper = this;
30342 swiper.pagination.destroy();
30343 },
30344 click: function click(e) {
30345 var swiper = this;
30346 if (
30347 swiper.params.pagination.el
30348 && swiper.params.pagination.hideOnClick
30349 && swiper.pagination.$el.length > 0
30350 && !$(e.target).hasClass(swiper.params.pagination.bulletClass)
30351 ) {
30352 swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);
30353 }
30354 },
30355 },
30356 };
30357
30358 var Scrollbar = {
30359 setTranslate: function setTranslate() {
30360 var swiper = this;
30361 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
30362 var scrollbar = swiper.scrollbar;
30363 var rtl = swiper.rtlTranslate;
30364 var progress = swiper.progress;
30365 var dragSize = scrollbar.dragSize;
30366 var trackSize = scrollbar.trackSize;
30367 var $dragEl = scrollbar.$dragEl;
30368 var $el = scrollbar.$el;
30369 var params = swiper.params.scrollbar;
30370
30371 var newSize = dragSize;
30372 var newPos = (trackSize - dragSize) * progress;
30373 if (rtl) {
30374 newPos = -newPos;
30375 if (newPos > 0) {
30376 newSize = dragSize - newPos;
30377 newPos = 0;
30378 } else if (-newPos + dragSize > trackSize) {
30379 newSize = trackSize + newPos;
30380 }
30381 } else if (newPos < 0) {
30382 newSize = dragSize + newPos;
30383 newPos = 0;
30384 } else if (newPos + dragSize > trackSize) {
30385 newSize = trackSize - newPos;
30386 }
30387 if (swiper.isHorizontal()) {
30388 if (Support.transforms3d) {
30389 $dragEl.transform(("translate3d(" + newPos + "px, 0, 0)"));
30390 } else {
30391 $dragEl.transform(("translateX(" + newPos + "px)"));
30392 }
30393 $dragEl[0].style.width = newSize + "px";
30394 } else {
30395 if (Support.transforms3d) {
30396 $dragEl.transform(("translate3d(0px, " + newPos + "px, 0)"));
30397 } else {
30398 $dragEl.transform(("translateY(" + newPos + "px)"));
30399 }
30400 $dragEl[0].style.height = newSize + "px";
30401 }
30402 if (params.hide) {
30403 clearTimeout(swiper.scrollbar.timeout);
30404 $el[0].style.opacity = 1;
30405 swiper.scrollbar.timeout = setTimeout(function () {
30406 $el[0].style.opacity = 0;
30407 $el.transition(400);
30408 }, 1000);
30409 }
30410 },
30411 setTransition: function setTransition(duration) {
30412 var swiper = this;
30413 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
30414 swiper.scrollbar.$dragEl.transition(duration);
30415 },
30416 updateSize: function updateSize() {
30417 var swiper = this;
30418 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
30419
30420 var scrollbar = swiper.scrollbar;
30421 var $dragEl = scrollbar.$dragEl;
30422 var $el = scrollbar.$el;
30423
30424 $dragEl[0].style.width = '';
30425 $dragEl[0].style.height = '';
30426 var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;
30427
30428 var divider = swiper.size / swiper.virtualSize;
30429 var moveDivider = divider * (trackSize / swiper.size);
30430 var dragSize;
30431 if (swiper.params.scrollbar.dragSize === 'auto') {
30432 dragSize = trackSize * divider;
30433 } else {
30434 dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
30435 }
30436
30437 if (swiper.isHorizontal()) {
30438 $dragEl[0].style.width = dragSize + "px";
30439 } else {
30440 $dragEl[0].style.height = dragSize + "px";
30441 }
30442
30443 if (divider >= 1) {
30444 $el[0].style.display = 'none';
30445 } else {
30446 $el[0].style.display = '';
30447 }
30448 if (swiper.params.scrollbarHide) {
30449 $el[0].style.opacity = 0;
30450 }
30451 Utils.extend(scrollbar, {
30452 trackSize: trackSize,
30453 divider: divider,
30454 moveDivider: moveDivider,
30455 dragSize: dragSize,
30456 });
30457 scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);
30458 },
30459 setDragPosition: function setDragPosition(e) {
30460 var swiper = this;
30461 var scrollbar = swiper.scrollbar;
30462 var rtl = swiper.rtlTranslate;
30463 var $el = scrollbar.$el;
30464 var dragSize = scrollbar.dragSize;
30465 var trackSize = scrollbar.trackSize;
30466
30467 var pointerPosition;
30468 if (swiper.isHorizontal()) {
30469 pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX);
30470 } else {
30471 pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY);
30472 }
30473 var positionRatio;
30474 positionRatio = ((pointerPosition) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragSize / 2)) / (trackSize - dragSize);
30475 positionRatio = Math.max(Math.min(positionRatio, 1), 0);
30476 if (rtl) {
30477 positionRatio = 1 - positionRatio;
30478 }
30479
30480 var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);
30481
30482 swiper.updateProgress(position);
30483 swiper.setTranslate(position);
30484 swiper.updateActiveIndex();
30485 swiper.updateSlidesClasses();
30486 },
30487 onDragStart: function onDragStart(e) {
30488 var swiper = this;
30489 var params = swiper.params.scrollbar;
30490 var scrollbar = swiper.scrollbar;
30491 var $wrapperEl = swiper.$wrapperEl;
30492 var $el = scrollbar.$el;
30493 var $dragEl = scrollbar.$dragEl;
30494 swiper.scrollbar.isTouched = true;
30495 e.preventDefault();
30496 e.stopPropagation();
30497
30498 $wrapperEl.transition(100);
30499 $dragEl.transition(100);
30500 scrollbar.setDragPosition(e);
30501
30502 clearTimeout(swiper.scrollbar.dragTimeout);
30503
30504 $el.transition(0);
30505 if (params.hide) {
30506 $el.css('opacity', 1);
30507 }
30508 swiper.emit('scrollbarDragStart', e);
30509 },
30510 onDragMove: function onDragMove(e) {
30511 var swiper = this;
30512 var scrollbar = swiper.scrollbar;
30513 var $wrapperEl = swiper.$wrapperEl;
30514 var $el = scrollbar.$el;
30515 var $dragEl = scrollbar.$dragEl;
30516
30517 if (!swiper.scrollbar.isTouched) { return; }
30518 if (e.preventDefault) { e.preventDefault(); }
30519 else { e.returnValue = false; }
30520 scrollbar.setDragPosition(e);
30521 $wrapperEl.transition(0);
30522 $el.transition(0);
30523 $dragEl.transition(0);
30524 swiper.emit('scrollbarDragMove', e);
30525 },
30526 onDragEnd: function onDragEnd(e) {
30527 var swiper = this;
30528
30529 var params = swiper.params.scrollbar;
30530 var scrollbar = swiper.scrollbar;
30531 var $el = scrollbar.$el;
30532
30533 if (!swiper.scrollbar.isTouched) { return; }
30534 swiper.scrollbar.isTouched = false;
30535 if (params.hide) {
30536 clearTimeout(swiper.scrollbar.dragTimeout);
30537 swiper.scrollbar.dragTimeout = Utils.nextTick(function () {
30538 $el.css('opacity', 0);
30539 $el.transition(400);
30540 }, 1000);
30541 }
30542 swiper.emit('scrollbarDragEnd', e);
30543 if (params.snapOnRelease) {
30544 swiper.slideToClosest();
30545 }
30546 },
30547 enableDraggable: function enableDraggable() {
30548 var swiper = this;
30549 if (!swiper.params.scrollbar.el) { return; }
30550 var scrollbar = swiper.scrollbar;
30551 var touchEventsTouch = swiper.touchEventsTouch;
30552 var touchEventsDesktop = swiper.touchEventsDesktop;
30553 var params = swiper.params;
30554 var $el = scrollbar.$el;
30555 var target = $el[0];
30556 var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
30557 var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
30558 if (!Support.touch) {
30559 target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
30560 doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
30561 doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
30562 } else {
30563 target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
30564 target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
30565 target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
30566 }
30567 },
30568 disableDraggable: function disableDraggable() {
30569 var swiper = this;
30570 if (!swiper.params.scrollbar.el) { return; }
30571 var scrollbar = swiper.scrollbar;
30572 var touchEventsTouch = swiper.touchEventsTouch;
30573 var touchEventsDesktop = swiper.touchEventsDesktop;
30574 var params = swiper.params;
30575 var $el = scrollbar.$el;
30576 var target = $el[0];
30577 var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
30578 var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
30579 if (!Support.touch) {
30580 target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
30581 doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
30582 doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
30583 } else {
30584 target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
30585 target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
30586 target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
30587 }
30588 },
30589 init: function init() {
30590 var swiper = this;
30591 if (!swiper.params.scrollbar.el) { return; }
30592 var scrollbar = swiper.scrollbar;
30593 var $swiperEl = swiper.$el;
30594 var params = swiper.params.scrollbar;
30595
30596 var $el = $(params.el);
30597 if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {
30598 $el = $swiperEl.find(params.el);
30599 }
30600
30601 var $dragEl = $el.find(("." + (swiper.params.scrollbar.dragClass)));
30602 if ($dragEl.length === 0) {
30603 $dragEl = $(("<div class=\"" + (swiper.params.scrollbar.dragClass) + "\"></div>"));
30604 $el.append($dragEl);
30605 }
30606
30607 Utils.extend(scrollbar, {
30608 $el: $el,
30609 el: $el[0],
30610 $dragEl: $dragEl,
30611 dragEl: $dragEl[0],
30612 });
30613
30614 if (params.draggable) {
30615 scrollbar.enableDraggable();
30616 }
30617 },
30618 destroy: function destroy() {
30619 var swiper = this;
30620 swiper.scrollbar.disableDraggable();
30621 },
30622 };
30623
30624 var Scrollbar$1 = {
30625 name: 'scrollbar',
30626 params: {
30627 scrollbar: {
30628 el: null,
30629 dragSize: 'auto',
30630 hide: false,
30631 draggable: false,
30632 snapOnRelease: true,
30633 lockClass: 'swiper-scrollbar-lock',
30634 dragClass: 'swiper-scrollbar-drag',
30635 },
30636 },
30637 create: function create() {
30638 var swiper = this;
30639 Utils.extend(swiper, {
30640 scrollbar: {
30641 init: Scrollbar.init.bind(swiper),
30642 destroy: Scrollbar.destroy.bind(swiper),
30643 updateSize: Scrollbar.updateSize.bind(swiper),
30644 setTranslate: Scrollbar.setTranslate.bind(swiper),
30645 setTransition: Scrollbar.setTransition.bind(swiper),
30646 enableDraggable: Scrollbar.enableDraggable.bind(swiper),
30647 disableDraggable: Scrollbar.disableDraggable.bind(swiper),
30648 setDragPosition: Scrollbar.setDragPosition.bind(swiper),
30649 onDragStart: Scrollbar.onDragStart.bind(swiper),
30650 onDragMove: Scrollbar.onDragMove.bind(swiper),
30651 onDragEnd: Scrollbar.onDragEnd.bind(swiper),
30652 isTouched: false,
30653 timeout: null,
30654 dragTimeout: null,
30655 },
30656 });
30657 },
30658 on: {
30659 init: function init() {
30660 var swiper = this;
30661 swiper.scrollbar.init();
30662 swiper.scrollbar.updateSize();
30663 swiper.scrollbar.setTranslate();
30664 },
30665 update: function update() {
30666 var swiper = this;
30667 swiper.scrollbar.updateSize();
30668 },
30669 resize: function resize() {
30670 var swiper = this;
30671 swiper.scrollbar.updateSize();
30672 },
30673 observerUpdate: function observerUpdate() {
30674 var swiper = this;
30675 swiper.scrollbar.updateSize();
30676 },
30677 setTranslate: function setTranslate() {
30678 var swiper = this;
30679 swiper.scrollbar.setTranslate();
30680 },
30681 setTransition: function setTransition(duration) {
30682 var swiper = this;
30683 swiper.scrollbar.setTransition(duration);
30684 },
30685 destroy: function destroy() {
30686 var swiper = this;
30687 swiper.scrollbar.destroy();
30688 },
30689 },
30690 };
30691
30692 var Parallax = {
30693 setTransform: function setTransform(el, progress) {
30694 var swiper = this;
30695 var rtl = swiper.rtl;
30696
30697 var $el = $(el);
30698 var rtlFactor = rtl ? -1 : 1;
30699
30700 var p = $el.attr('data-swiper-parallax') || '0';
30701 var x = $el.attr('data-swiper-parallax-x');
30702 var y = $el.attr('data-swiper-parallax-y');
30703 var scale = $el.attr('data-swiper-parallax-scale');
30704 var opacity = $el.attr('data-swiper-parallax-opacity');
30705
30706 if (x || y) {
30707 x = x || '0';
30708 y = y || '0';
30709 } else if (swiper.isHorizontal()) {
30710 x = p;
30711 y = '0';
30712 } else {
30713 y = p;
30714 x = '0';
30715 }
30716
30717 if ((x).indexOf('%') >= 0) {
30718 x = (parseInt(x, 10) * progress * rtlFactor) + "%";
30719 } else {
30720 x = (x * progress * rtlFactor) + "px";
30721 }
30722 if ((y).indexOf('%') >= 0) {
30723 y = (parseInt(y, 10) * progress) + "%";
30724 } else {
30725 y = (y * progress) + "px";
30726 }
30727
30728 if (typeof opacity !== 'undefined' && opacity !== null) {
30729 var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));
30730 $el[0].style.opacity = currentOpacity;
30731 }
30732 if (typeof scale === 'undefined' || scale === null) {
30733 $el.transform(("translate3d(" + x + ", " + y + ", 0px)"));
30734 } else {
30735 var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));
30736 $el.transform(("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")"));
30737 }
30738 },
30739 setTranslate: function setTranslate() {
30740 var swiper = this;
30741 var $el = swiper.$el;
30742 var slides = swiper.slides;
30743 var progress = swiper.progress;
30744 var snapGrid = swiper.snapGrid;
30745 $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')
30746 .each(function (index, el) {
30747 swiper.parallax.setTransform(el, progress);
30748 });
30749 slides.each(function (slideIndex, slideEl) {
30750 var slideProgress = slideEl.progress;
30751 if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
30752 slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));
30753 }
30754 slideProgress = Math.min(Math.max(slideProgress, -1), 1);
30755 $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')
30756 .each(function (index, el) {
30757 swiper.parallax.setTransform(el, slideProgress);
30758 });
30759 });
30760 },
30761 setTransition: function setTransition(duration) {
30762 if ( duration === void 0 ) duration = this.params.speed;
30763
30764 var swiper = this;
30765 var $el = swiper.$el;
30766 $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')
30767 .each(function (index, parallaxEl) {
30768 var $parallaxEl = $(parallaxEl);
30769 var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
30770 if (duration === 0) { parallaxDuration = 0; }
30771 $parallaxEl.transition(parallaxDuration);
30772 });
30773 },
30774 };
30775
30776 var Parallax$1 = {
30777 name: 'parallax',
30778 params: {
30779 parallax: {
30780 enabled: false,
30781 },
30782 },
30783 create: function create() {
30784 var swiper = this;
30785 Utils.extend(swiper, {
30786 parallax: {
30787 setTransform: Parallax.setTransform.bind(swiper),
30788 setTranslate: Parallax.setTranslate.bind(swiper),
30789 setTransition: Parallax.setTransition.bind(swiper),
30790 },
30791 });
30792 },
30793 on: {
30794 beforeInit: function beforeInit() {
30795 var swiper = this;
30796 if (!swiper.params.parallax.enabled) { return; }
30797 swiper.params.watchSlidesProgress = true;
30798 swiper.originalParams.watchSlidesProgress = true;
30799 },
30800 init: function init() {
30801 var swiper = this;
30802 if (!swiper.params.parallax) { return; }
30803 swiper.parallax.setTranslate();
30804 },
30805 setTranslate: function setTranslate() {
30806 var swiper = this;
30807 if (!swiper.params.parallax) { return; }
30808 swiper.parallax.setTranslate();
30809 },
30810 setTransition: function setTransition(duration) {
30811 var swiper = this;
30812 if (!swiper.params.parallax) { return; }
30813 swiper.parallax.setTransition(duration);
30814 },
30815 },
30816 };
30817
30818 var Zoom = {
30819 // Calc Scale From Multi-touches
30820 getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {
30821 if (e.targetTouches.length < 2) { return 1; }
30822 var x1 = e.targetTouches[0].pageX;
30823 var y1 = e.targetTouches[0].pageY;
30824 var x2 = e.targetTouches[1].pageX;
30825 var y2 = e.targetTouches[1].pageY;
30826 var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));
30827 return distance;
30828 },
30829 // Events
30830 onGestureStart: function onGestureStart(e) {
30831 var swiper = this;
30832 var params = swiper.params.zoom;
30833 var zoom = swiper.zoom;
30834 var gesture = zoom.gesture;
30835 zoom.fakeGestureTouched = false;
30836 zoom.fakeGestureMoved = false;
30837 if (!Support.gestures) {
30838 if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {
30839 return;
30840 }
30841 zoom.fakeGestureTouched = true;
30842 gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);
30843 }
30844 if (!gesture.$slideEl || !gesture.$slideEl.length) {
30845 gesture.$slideEl = $(e.target).closest('.swiper-slide');
30846 if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }
30847 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');
30848 gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
30849 gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
30850 if (gesture.$imageWrapEl.length === 0) {
30851 gesture.$imageEl = undefined;
30852 return;
30853 }
30854 }
30855 gesture.$imageEl.transition(0);
30856 swiper.zoom.isScaling = true;
30857 },
30858 onGestureChange: function onGestureChange(e) {
30859 var swiper = this;
30860 var params = swiper.params.zoom;
30861 var zoom = swiper.zoom;
30862 var gesture = zoom.gesture;
30863 if (!Support.gestures) {
30864 if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {
30865 return;
30866 }
30867 zoom.fakeGestureMoved = true;
30868 gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);
30869 }
30870 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
30871 if (Support.gestures) {
30872 zoom.scale = e.scale * zoom.currentScale;
30873 } else {
30874 zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;
30875 }
30876 if (zoom.scale > gesture.maxRatio) {
30877 zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));
30878 }
30879 if (zoom.scale < params.minRatio) {
30880 zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));
30881 }
30882 gesture.$imageEl.transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
30883 },
30884 onGestureEnd: function onGestureEnd(e) {
30885 var swiper = this;
30886 var params = swiper.params.zoom;
30887 var zoom = swiper.zoom;
30888 var gesture = zoom.gesture;
30889 if (!Support.gestures) {
30890 if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {
30891 return;
30892 }
30893 if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {
30894 return;
30895 }
30896 zoom.fakeGestureTouched = false;
30897 zoom.fakeGestureMoved = false;
30898 }
30899 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
30900 zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
30901 gesture.$imageEl.transition(swiper.params.speed).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
30902 zoom.currentScale = zoom.scale;
30903 zoom.isScaling = false;
30904 if (zoom.scale === 1) { gesture.$slideEl = undefined; }
30905 },
30906 onTouchStart: function onTouchStart(e) {
30907 var swiper = this;
30908 var zoom = swiper.zoom;
30909 var gesture = zoom.gesture;
30910 var image = zoom.image;
30911 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
30912 if (image.isTouched) { return; }
30913 if (Device.android) { e.preventDefault(); }
30914 image.isTouched = true;
30915 image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
30916 image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
30917 },
30918 onTouchMove: function onTouchMove(e) {
30919 var swiper = this;
30920 var zoom = swiper.zoom;
30921 var gesture = zoom.gesture;
30922 var image = zoom.image;
30923 var velocity = zoom.velocity;
30924 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
30925 swiper.allowClick = false;
30926 if (!image.isTouched || !gesture.$slideEl) { return; }
30927
30928 if (!image.isMoved) {
30929 image.width = gesture.$imageEl[0].offsetWidth;
30930 image.height = gesture.$imageEl[0].offsetHeight;
30931 image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;
30932 image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;
30933 gesture.slideWidth = gesture.$slideEl[0].offsetWidth;
30934 gesture.slideHeight = gesture.$slideEl[0].offsetHeight;
30935 gesture.$imageWrapEl.transition(0);
30936 if (swiper.rtl) {
30937 image.startX = -image.startX;
30938 image.startY = -image.startY;
30939 }
30940 }
30941 // Define if we need image drag
30942 var scaledWidth = image.width * zoom.scale;
30943 var scaledHeight = image.height * zoom.scale;
30944
30945 if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }
30946
30947 image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
30948 image.maxX = -image.minX;
30949 image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
30950 image.maxY = -image.minY;
30951
30952 image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
30953 image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
30954
30955 if (!image.isMoved && !zoom.isScaling) {
30956 if (
30957 swiper.isHorizontal()
30958 && (
30959 (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)
30960 || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)
30961 )
30962 ) {
30963 image.isTouched = false;
30964 return;
30965 } if (
30966 !swiper.isHorizontal()
30967 && (
30968 (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)
30969 || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)
30970 )
30971 ) {
30972 image.isTouched = false;
30973 return;
30974 }
30975 }
30976 e.preventDefault();
30977 e.stopPropagation();
30978
30979 image.isMoved = true;
30980 image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;
30981 image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;
30982
30983 if (image.currentX < image.minX) {
30984 image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));
30985 }
30986 if (image.currentX > image.maxX) {
30987 image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));
30988 }
30989
30990 if (image.currentY < image.minY) {
30991 image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));
30992 }
30993 if (image.currentY > image.maxY) {
30994 image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));
30995 }
30996
30997 // Velocity
30998 if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }
30999 if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }
31000 if (!velocity.prevTime) { velocity.prevTime = Date.now(); }
31001 velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
31002 velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
31003 if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }
31004 if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }
31005 velocity.prevPositionX = image.touchesCurrent.x;
31006 velocity.prevPositionY = image.touchesCurrent.y;
31007 velocity.prevTime = Date.now();
31008
31009 gesture.$imageWrapEl.transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
31010 },
31011 onTouchEnd: function onTouchEnd() {
31012 var swiper = this;
31013 var zoom = swiper.zoom;
31014 var gesture = zoom.gesture;
31015 var image = zoom.image;
31016 var velocity = zoom.velocity;
31017 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
31018 if (!image.isTouched || !image.isMoved) {
31019 image.isTouched = false;
31020 image.isMoved = false;
31021 return;
31022 }
31023 image.isTouched = false;
31024 image.isMoved = false;
31025 var momentumDurationX = 300;
31026 var momentumDurationY = 300;
31027 var momentumDistanceX = velocity.x * momentumDurationX;
31028 var newPositionX = image.currentX + momentumDistanceX;
31029 var momentumDistanceY = velocity.y * momentumDurationY;
31030 var newPositionY = image.currentY + momentumDistanceY;
31031
31032 // Fix duration
31033 if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }
31034 if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }
31035 var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
31036
31037 image.currentX = newPositionX;
31038 image.currentY = newPositionY;
31039
31040 // Define if we need image drag
31041 var scaledWidth = image.width * zoom.scale;
31042 var scaledHeight = image.height * zoom.scale;
31043 image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
31044 image.maxX = -image.minX;
31045 image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
31046 image.maxY = -image.minY;
31047 image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
31048 image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
31049
31050 gesture.$imageWrapEl.transition(momentumDuration).transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
31051 },
31052 onTransitionEnd: function onTransitionEnd() {
31053 var swiper = this;
31054 var zoom = swiper.zoom;
31055 var gesture = zoom.gesture;
31056 if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {
31057 gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');
31058 gesture.$imageWrapEl.transform('translate3d(0,0,0)');
31059
31060 zoom.scale = 1;
31061 zoom.currentScale = 1;
31062
31063 gesture.$slideEl = undefined;
31064 gesture.$imageEl = undefined;
31065 gesture.$imageWrapEl = undefined;
31066 }
31067 },
31068 // Toggle Zoom
31069 toggle: function toggle(e) {
31070 var swiper = this;
31071 var zoom = swiper.zoom;
31072
31073 if (zoom.scale && zoom.scale !== 1) {
31074 // Zoom Out
31075 zoom.out();
31076 } else {
31077 // Zoom In
31078 zoom.in(e);
31079 }
31080 },
31081 in: function in$1(e) {
31082 var swiper = this;
31083
31084 var zoom = swiper.zoom;
31085 var params = swiper.params.zoom;
31086 var gesture = zoom.gesture;
31087 var image = zoom.image;
31088
31089 if (!gesture.$slideEl) {
31090 gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);
31091 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');
31092 gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
31093 }
31094 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
31095
31096 gesture.$slideEl.addClass(("" + (params.zoomedSlideClass)));
31097
31098 var touchX;
31099 var touchY;
31100 var offsetX;
31101 var offsetY;
31102 var diffX;
31103 var diffY;
31104 var translateX;
31105 var translateY;
31106 var imageWidth;
31107 var imageHeight;
31108 var scaledWidth;
31109 var scaledHeight;
31110 var translateMinX;
31111 var translateMinY;
31112 var translateMaxX;
31113 var translateMaxY;
31114 var slideWidth;
31115 var slideHeight;
31116
31117 if (typeof image.touchesStart.x === 'undefined' && e) {
31118 touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
31119 touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
31120 } else {
31121 touchX = image.touchesStart.x;
31122 touchY = image.touchesStart.y;
31123 }
31124
31125 zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
31126 zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
31127 if (e) {
31128 slideWidth = gesture.$slideEl[0].offsetWidth;
31129 slideHeight = gesture.$slideEl[0].offsetHeight;
31130 offsetX = gesture.$slideEl.offset().left;
31131 offsetY = gesture.$slideEl.offset().top;
31132 diffX = (offsetX + (slideWidth / 2)) - touchX;
31133 diffY = (offsetY + (slideHeight / 2)) - touchY;
31134
31135 imageWidth = gesture.$imageEl[0].offsetWidth;
31136 imageHeight = gesture.$imageEl[0].offsetHeight;
31137 scaledWidth = imageWidth * zoom.scale;
31138 scaledHeight = imageHeight * zoom.scale;
31139
31140 translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);
31141 translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);
31142 translateMaxX = -translateMinX;
31143 translateMaxY = -translateMinY;
31144
31145 translateX = diffX * zoom.scale;
31146 translateY = diffY * zoom.scale;
31147
31148 if (translateX < translateMinX) {
31149 translateX = translateMinX;
31150 }
31151 if (translateX > translateMaxX) {
31152 translateX = translateMaxX;
31153 }
31154
31155 if (translateY < translateMinY) {
31156 translateY = translateMinY;
31157 }
31158 if (translateY > translateMaxY) {
31159 translateY = translateMaxY;
31160 }
31161 } else {
31162 translateX = 0;
31163 translateY = 0;
31164 }
31165 gesture.$imageWrapEl.transition(300).transform(("translate3d(" + translateX + "px, " + translateY + "px,0)"));
31166 gesture.$imageEl.transition(300).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
31167 },
31168 out: function out() {
31169 var swiper = this;
31170
31171 var zoom = swiper.zoom;
31172 var params = swiper.params.zoom;
31173 var gesture = zoom.gesture;
31174
31175 if (!gesture.$slideEl) {
31176 gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);
31177 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');
31178 gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
31179 }
31180 if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
31181
31182 zoom.scale = 1;
31183 zoom.currentScale = 1;
31184 gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');
31185 gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');
31186 gesture.$slideEl.removeClass(("" + (params.zoomedSlideClass)));
31187 gesture.$slideEl = undefined;
31188 },
31189 // Attach/Detach Events
31190 enable: function enable() {
31191 var swiper = this;
31192 var zoom = swiper.zoom;
31193 if (zoom.enabled) { return; }
31194 zoom.enabled = true;
31195
31196 var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
31197
31198 // Scale image
31199 if (Support.gestures) {
31200 swiper.$wrapperEl.on('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);
31201 swiper.$wrapperEl.on('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);
31202 swiper.$wrapperEl.on('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);
31203 } else if (swiper.touchEvents.start === 'touchstart') {
31204 swiper.$wrapperEl.on(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);
31205 swiper.$wrapperEl.on(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);
31206 swiper.$wrapperEl.on(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);
31207 }
31208
31209 // Move image
31210 swiper.$wrapperEl.on(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove);
31211 },
31212 disable: function disable() {
31213 var swiper = this;
31214 var zoom = swiper.zoom;
31215 if (!zoom.enabled) { return; }
31216
31217 swiper.zoom.enabled = false;
31218
31219 var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
31220
31221 // Scale image
31222 if (Support.gestures) {
31223 swiper.$wrapperEl.off('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);
31224 swiper.$wrapperEl.off('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);
31225 swiper.$wrapperEl.off('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);
31226 } else if (swiper.touchEvents.start === 'touchstart') {
31227 swiper.$wrapperEl.off(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);
31228 swiper.$wrapperEl.off(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);
31229 swiper.$wrapperEl.off(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);
31230 }
31231
31232 // Move image
31233 swiper.$wrapperEl.off(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove);
31234 },
31235 };
31236
31237 var Zoom$1 = {
31238 name: 'zoom',
31239 params: {
31240 zoom: {
31241 enabled: false,
31242 maxRatio: 3,
31243 minRatio: 1,
31244 toggle: true,
31245 containerClass: 'swiper-zoom-container',
31246 zoomedSlideClass: 'swiper-slide-zoomed',
31247 },
31248 },
31249 create: function create() {
31250 var swiper = this;
31251 var zoom = {
31252 enabled: false,
31253 scale: 1,
31254 currentScale: 1,
31255 isScaling: false,
31256 gesture: {
31257 $slideEl: undefined,
31258 slideWidth: undefined,
31259 slideHeight: undefined,
31260 $imageEl: undefined,
31261 $imageWrapEl: undefined,
31262 maxRatio: 3,
31263 },
31264 image: {
31265 isTouched: undefined,
31266 isMoved: undefined,
31267 currentX: undefined,
31268 currentY: undefined,
31269 minX: undefined,
31270 minY: undefined,
31271 maxX: undefined,
31272 maxY: undefined,
31273 width: undefined,
31274 height: undefined,
31275 startX: undefined,
31276 startY: undefined,
31277 touchesStart: {},
31278 touchesCurrent: {},
31279 },
31280 velocity: {
31281 x: undefined,
31282 y: undefined,
31283 prevPositionX: undefined,
31284 prevPositionY: undefined,
31285 prevTime: undefined,
31286 },
31287 };
31288
31289 ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {
31290 zoom[methodName] = Zoom[methodName].bind(swiper);
31291 });
31292 Utils.extend(swiper, {
31293 zoom: zoom,
31294 });
31295
31296 var scale = 1;
31297 Object.defineProperty(swiper.zoom, 'scale', {
31298 get: function get() {
31299 return scale;
31300 },
31301 set: function set(value) {
31302 if (scale !== value) {
31303 var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;
31304 var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;
31305 swiper.emit('zoomChange', value, imageEl, slideEl);
31306 }
31307 scale = value;
31308 },
31309 });
31310 },
31311 on: {
31312 init: function init() {
31313 var swiper = this;
31314 if (swiper.params.zoom.enabled) {
31315 swiper.zoom.enable();
31316 }
31317 },
31318 destroy: function destroy() {
31319 var swiper = this;
31320 swiper.zoom.disable();
31321 },
31322 touchStart: function touchStart(e) {
31323 var swiper = this;
31324 if (!swiper.zoom.enabled) { return; }
31325 swiper.zoom.onTouchStart(e);
31326 },
31327 touchEnd: function touchEnd(e) {
31328 var swiper = this;
31329 if (!swiper.zoom.enabled) { return; }
31330 swiper.zoom.onTouchEnd(e);
31331 },
31332 doubleTap: function doubleTap(e) {
31333 var swiper = this;
31334 if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
31335 swiper.zoom.toggle(e);
31336 }
31337 },
31338 transitionEnd: function transitionEnd() {
31339 var swiper = this;
31340 if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
31341 swiper.zoom.onTransitionEnd();
31342 }
31343 },
31344 },
31345 };
31346
31347 var Lazy$2 = {
31348 loadInSlide: function loadInSlide(index, loadInDuplicate) {
31349 if ( loadInDuplicate === void 0 ) loadInDuplicate = true;
31350
31351 var swiper = this;
31352 var params = swiper.params.lazy;
31353 if (typeof index === 'undefined') { return; }
31354 if (swiper.slides.length === 0) { return; }
31355 var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
31356
31357 var $slideEl = isVirtual
31358 ? swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]"))
31359 : swiper.slides.eq(index);
31360
31361 var $images = $slideEl.find(("." + (params.elementClass) + ":not(." + (params.loadedClass) + "):not(." + (params.loadingClass) + ")"));
31362 if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {
31363 $images = $images.add($slideEl[0]);
31364 }
31365 if ($images.length === 0) { return; }
31366
31367 $images.each(function (imageIndex, imageEl) {
31368 var $imageEl = $(imageEl);
31369 $imageEl.addClass(params.loadingClass);
31370
31371 var background = $imageEl.attr('data-background');
31372 var src = $imageEl.attr('data-src');
31373 var srcset = $imageEl.attr('data-srcset');
31374 var sizes = $imageEl.attr('data-sizes');
31375
31376 swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {
31377 if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }
31378 if (background) {
31379 $imageEl.css('background-image', ("url(\"" + background + "\")"));
31380 $imageEl.removeAttr('data-background');
31381 } else {
31382 if (srcset) {
31383 $imageEl.attr('srcset', srcset);
31384 $imageEl.removeAttr('data-srcset');
31385 }
31386 if (sizes) {
31387 $imageEl.attr('sizes', sizes);
31388 $imageEl.removeAttr('data-sizes');
31389 }
31390 if (src) {
31391 $imageEl.attr('src', src);
31392 $imageEl.removeAttr('data-src');
31393 }
31394 }
31395
31396 $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);
31397 $slideEl.find(("." + (params.preloaderClass))).remove();
31398 if (swiper.params.loop && loadInDuplicate) {
31399 var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');
31400 if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {
31401 var originalSlide = swiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + (swiper.params.slideDuplicateClass) + ")"));
31402 swiper.lazy.loadInSlide(originalSlide.index(), false);
31403 } else {
31404 var duplicatedSlide = swiper.$wrapperEl.children(("." + (swiper.params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]"));
31405 swiper.lazy.loadInSlide(duplicatedSlide.index(), false);
31406 }
31407 }
31408 swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);
31409 });
31410
31411 swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);
31412 });
31413 },
31414 load: function load() {
31415 var swiper = this;
31416 var $wrapperEl = swiper.$wrapperEl;
31417 var swiperParams = swiper.params;
31418 var slides = swiper.slides;
31419 var activeIndex = swiper.activeIndex;
31420 var isVirtual = swiper.virtual && swiperParams.virtual.enabled;
31421 var params = swiperParams.lazy;
31422
31423 var slidesPerView = swiperParams.slidesPerView;
31424 if (slidesPerView === 'auto') {
31425 slidesPerView = 0;
31426 }
31427
31428 function slideExist(index) {
31429 if (isVirtual) {
31430 if ($wrapperEl.children(("." + (swiperParams.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]")).length) {
31431 return true;
31432 }
31433 } else if (slides[index]) { return true; }
31434 return false;
31435 }
31436 function slideIndex(slideEl) {
31437 if (isVirtual) {
31438 return $(slideEl).attr('data-swiper-slide-index');
31439 }
31440 return $(slideEl).index();
31441 }
31442
31443 if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }
31444 if (swiper.params.watchSlidesVisibility) {
31445 $wrapperEl.children(("." + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {
31446 var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();
31447 swiper.lazy.loadInSlide(index);
31448 });
31449 } else if (slidesPerView > 1) {
31450 for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {
31451 if (slideExist(i)) { swiper.lazy.loadInSlide(i); }
31452 }
31453 } else {
31454 swiper.lazy.loadInSlide(activeIndex);
31455 }
31456 if (params.loadPrevNext) {
31457 if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {
31458 var amount = params.loadPrevNextAmount;
31459 var spv = slidesPerView;
31460 var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);
31461 var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);
31462 // Next Slides
31463 for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {
31464 if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }
31465 }
31466 // Prev Slides
31467 for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {
31468 if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }
31469 }
31470 } else {
31471 var nextSlide = $wrapperEl.children(("." + (swiperParams.slideNextClass)));
31472 if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }
31473
31474 var prevSlide = $wrapperEl.children(("." + (swiperParams.slidePrevClass)));
31475 if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }
31476 }
31477 }
31478 },
31479 };
31480
31481 var Lazy$3 = {
31482 name: 'lazy',
31483 params: {
31484 lazy: {
31485 enabled: false,
31486 loadPrevNext: false,
31487 loadPrevNextAmount: 1,
31488 loadOnTransitionStart: false,
31489
31490 elementClass: 'swiper-lazy',
31491 loadingClass: 'swiper-lazy-loading',
31492 loadedClass: 'swiper-lazy-loaded',
31493 preloaderClass: 'swiper-lazy-preloader',
31494 },
31495 },
31496 create: function create() {
31497 var swiper = this;
31498 Utils.extend(swiper, {
31499 lazy: {
31500 initialImageLoaded: false,
31501 load: Lazy$2.load.bind(swiper),
31502 loadInSlide: Lazy$2.loadInSlide.bind(swiper),
31503 },
31504 });
31505 },
31506 on: {
31507 beforeInit: function beforeInit() {
31508 var swiper = this;
31509 if (swiper.params.lazy.enabled && swiper.params.preloadImages) {
31510 swiper.params.preloadImages = false;
31511 }
31512 },
31513 init: function init() {
31514 var swiper = this;
31515 if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {
31516 swiper.lazy.load();
31517 }
31518 },
31519 scroll: function scroll() {
31520 var swiper = this;
31521 if (swiper.params.freeMode && !swiper.params.freeModeSticky) {
31522 swiper.lazy.load();
31523 }
31524 },
31525 resize: function resize() {
31526 var swiper = this;
31527 if (swiper.params.lazy.enabled) {
31528 swiper.lazy.load();
31529 }
31530 },
31531 scrollbarDragMove: function scrollbarDragMove() {
31532 var swiper = this;
31533 if (swiper.params.lazy.enabled) {
31534 swiper.lazy.load();
31535 }
31536 },
31537 transitionStart: function transitionStart() {
31538 var swiper = this;
31539 if (swiper.params.lazy.enabled) {
31540 if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {
31541 swiper.lazy.load();
31542 }
31543 }
31544 },
31545 transitionEnd: function transitionEnd() {
31546 var swiper = this;
31547 if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {
31548 swiper.lazy.load();
31549 }
31550 },
31551 },
31552 };
31553
31554 /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
31555
31556 var Controller = {
31557 LinearSpline: function LinearSpline(x, y) {
31558 var binarySearch = (function search() {
31559 var maxIndex;
31560 var minIndex;
31561 var guess;
31562 return function (array, val) {
31563 minIndex = -1;
31564 maxIndex = array.length;
31565 while (maxIndex - minIndex > 1) {
31566 guess = maxIndex + minIndex >> 1;
31567 if (array[guess] <= val) {
31568 minIndex = guess;
31569 } else {
31570 maxIndex = guess;
31571 }
31572 }
31573 return maxIndex;
31574 };
31575 }());
31576 this.x = x;
31577 this.y = y;
31578 this.lastIndex = x.length - 1;
31579 // Given an x value (x2), return the expected y2 value:
31580 // (x1,y1) is the known point before given value,
31581 // (x3,y3) is the known point after given value.
31582 var i1;
31583 var i3;
31584
31585 this.interpolate = function interpolate(x2) {
31586 if (!x2) { return 0; }
31587
31588 // Get the indexes of x1 and x3 (the array indexes before and after given x2):
31589 i3 = binarySearch(this.x, x2);
31590 i1 = i3 - 1;
31591
31592 // We have our indexes i1 & i3, so we can calculate already:
31593 // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
31594 return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];
31595 };
31596 return this;
31597 },
31598 // xxx: for now i will just save one spline function to to
31599 getInterpolateFunction: function getInterpolateFunction(c) {
31600 var swiper = this;
31601 if (!swiper.controller.spline) {
31602 swiper.controller.spline = swiper.params.loop
31603 ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)
31604 : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);
31605 }
31606 },
31607 setTranslate: function setTranslate(setTranslate$1, byController) {
31608 var swiper = this;
31609 var controlled = swiper.controller.control;
31610 var multiplier;
31611 var controlledTranslate;
31612 function setControlledTranslate(c) {
31613 // this will create an Interpolate function based on the snapGrids
31614 // x is the Grid of the scrolled scroller and y will be the controlled scroller
31615 // it makes sense to create this only once and recall it for the interpolation
31616 // the function does a lot of value caching for performance
31617 var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
31618 if (swiper.params.controller.by === 'slide') {
31619 swiper.controller.getInterpolateFunction(c);
31620 // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
31621 // but it did not work out
31622 controlledTranslate = -swiper.controller.spline.interpolate(-translate);
31623 }
31624
31625 if (!controlledTranslate || swiper.params.controller.by === 'container') {
31626 multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
31627 controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();
31628 }
31629
31630 if (swiper.params.controller.inverse) {
31631 controlledTranslate = c.maxTranslate() - controlledTranslate;
31632 }
31633 c.updateProgress(controlledTranslate);
31634 c.setTranslate(controlledTranslate, swiper);
31635 c.updateActiveIndex();
31636 c.updateSlidesClasses();
31637 }
31638 if (Array.isArray(controlled)) {
31639 for (var i = 0; i < controlled.length; i += 1) {
31640 if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
31641 setControlledTranslate(controlled[i]);
31642 }
31643 }
31644 } else if (controlled instanceof Swiper && byController !== controlled) {
31645 setControlledTranslate(controlled);
31646 }
31647 },
31648 setTransition: function setTransition(duration, byController) {
31649 var swiper = this;
31650 var controlled = swiper.controller.control;
31651 var i;
31652 function setControlledTransition(c) {
31653 c.setTransition(duration, swiper);
31654 if (duration !== 0) {
31655 c.transitionStart();
31656 if (c.params.autoHeight) {
31657 Utils.nextTick(function () {
31658 c.updateAutoHeight();
31659 });
31660 }
31661 c.$wrapperEl.transitionEnd(function () {
31662 if (!controlled) { return; }
31663 if (c.params.loop && swiper.params.controller.by === 'slide') {
31664 c.loopFix();
31665 }
31666 c.transitionEnd();
31667 });
31668 }
31669 }
31670 if (Array.isArray(controlled)) {
31671 for (i = 0; i < controlled.length; i += 1) {
31672 if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
31673 setControlledTransition(controlled[i]);
31674 }
31675 }
31676 } else if (controlled instanceof Swiper && byController !== controlled) {
31677 setControlledTransition(controlled);
31678 }
31679 },
31680 };
31681 var Controller$1 = {
31682 name: 'controller',
31683 params: {
31684 controller: {
31685 control: undefined,
31686 inverse: false,
31687 by: 'slide', // or 'container'
31688 },
31689 },
31690 create: function create() {
31691 var swiper = this;
31692 Utils.extend(swiper, {
31693 controller: {
31694 control: swiper.params.controller.control,
31695 getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),
31696 setTranslate: Controller.setTranslate.bind(swiper),
31697 setTransition: Controller.setTransition.bind(swiper),
31698 },
31699 });
31700 },
31701 on: {
31702 update: function update() {
31703 var swiper = this;
31704 if (!swiper.controller.control) { return; }
31705 if (swiper.controller.spline) {
31706 swiper.controller.spline = undefined;
31707 delete swiper.controller.spline;
31708 }
31709 },
31710 resize: function resize() {
31711 var swiper = this;
31712 if (!swiper.controller.control) { return; }
31713 if (swiper.controller.spline) {
31714 swiper.controller.spline = undefined;
31715 delete swiper.controller.spline;
31716 }
31717 },
31718 observerUpdate: function observerUpdate() {
31719 var swiper = this;
31720 if (!swiper.controller.control) { return; }
31721 if (swiper.controller.spline) {
31722 swiper.controller.spline = undefined;
31723 delete swiper.controller.spline;
31724 }
31725 },
31726 setTranslate: function setTranslate(translate, byController) {
31727 var swiper = this;
31728 if (!swiper.controller.control) { return; }
31729 swiper.controller.setTranslate(translate, byController);
31730 },
31731 setTransition: function setTransition(duration, byController) {
31732 var swiper = this;
31733 if (!swiper.controller.control) { return; }
31734 swiper.controller.setTransition(duration, byController);
31735 },
31736 },
31737 };
31738
31739 var a11y = {
31740 makeElFocusable: function makeElFocusable($el) {
31741 $el.attr('tabIndex', '0');
31742 return $el;
31743 },
31744 addElRole: function addElRole($el, role) {
31745 $el.attr('role', role);
31746 return $el;
31747 },
31748 addElLabel: function addElLabel($el, label) {
31749 $el.attr('aria-label', label);
31750 return $el;
31751 },
31752 disableEl: function disableEl($el) {
31753 $el.attr('aria-disabled', true);
31754 return $el;
31755 },
31756 enableEl: function enableEl($el) {
31757 $el.attr('aria-disabled', false);
31758 return $el;
31759 },
31760 onEnterKey: function onEnterKey(e) {
31761 var swiper = this;
31762 var params = swiper.params.a11y;
31763 if (e.keyCode !== 13) { return; }
31764 var $targetEl = $(e.target);
31765 if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {
31766 if (!(swiper.isEnd && !swiper.params.loop)) {
31767 swiper.slideNext();
31768 }
31769 if (swiper.isEnd) {
31770 swiper.a11y.notify(params.lastSlideMessage);
31771 } else {
31772 swiper.a11y.notify(params.nextSlideMessage);
31773 }
31774 }
31775 if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {
31776 if (!(swiper.isBeginning && !swiper.params.loop)) {
31777 swiper.slidePrev();
31778 }
31779 if (swiper.isBeginning) {
31780 swiper.a11y.notify(params.firstSlideMessage);
31781 } else {
31782 swiper.a11y.notify(params.prevSlideMessage);
31783 }
31784 }
31785 if (swiper.pagination && $targetEl.is(("." + (swiper.params.pagination.bulletClass)))) {
31786 $targetEl[0].click();
31787 }
31788 },
31789 notify: function notify(message) {
31790 var swiper = this;
31791 var notification = swiper.a11y.liveRegion;
31792 if (notification.length === 0) { return; }
31793 notification.html('');
31794 notification.html(message);
31795 },
31796 updateNavigation: function updateNavigation() {
31797 var swiper = this;
31798
31799 if (swiper.params.loop) { return; }
31800 var ref = swiper.navigation;
31801 var $nextEl = ref.$nextEl;
31802 var $prevEl = ref.$prevEl;
31803
31804 if ($prevEl && $prevEl.length > 0) {
31805 if (swiper.isBeginning) {
31806 swiper.a11y.disableEl($prevEl);
31807 } else {
31808 swiper.a11y.enableEl($prevEl);
31809 }
31810 }
31811 if ($nextEl && $nextEl.length > 0) {
31812 if (swiper.isEnd) {
31813 swiper.a11y.disableEl($nextEl);
31814 } else {
31815 swiper.a11y.enableEl($nextEl);
31816 }
31817 }
31818 },
31819 updatePagination: function updatePagination() {
31820 var swiper = this;
31821 var params = swiper.params.a11y;
31822 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
31823 swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {
31824 var $bulletEl = $(bulletEl);
31825 swiper.a11y.makeElFocusable($bulletEl);
31826 swiper.a11y.addElRole($bulletEl, 'button');
31827 swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1));
31828 });
31829 }
31830 },
31831 init: function init() {
31832 var swiper = this;
31833
31834 swiper.$el.append(swiper.a11y.liveRegion);
31835
31836 // Navigation
31837 var params = swiper.params.a11y;
31838 var $nextEl;
31839 var $prevEl;
31840 if (swiper.navigation && swiper.navigation.$nextEl) {
31841 $nextEl = swiper.navigation.$nextEl;
31842 }
31843 if (swiper.navigation && swiper.navigation.$prevEl) {
31844 $prevEl = swiper.navigation.$prevEl;
31845 }
31846 if ($nextEl) {
31847 swiper.a11y.makeElFocusable($nextEl);
31848 swiper.a11y.addElRole($nextEl, 'button');
31849 swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);
31850 $nextEl.on('keydown', swiper.a11y.onEnterKey);
31851 }
31852 if ($prevEl) {
31853 swiper.a11y.makeElFocusable($prevEl);
31854 swiper.a11y.addElRole($prevEl, 'button');
31855 swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);
31856 $prevEl.on('keydown', swiper.a11y.onEnterKey);
31857 }
31858
31859 // Pagination
31860 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
31861 swiper.pagination.$el.on('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
31862 }
31863 },
31864 destroy: function destroy() {
31865 var swiper = this;
31866 if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }
31867
31868 var $nextEl;
31869 var $prevEl;
31870 if (swiper.navigation && swiper.navigation.$nextEl) {
31871 $nextEl = swiper.navigation.$nextEl;
31872 }
31873 if (swiper.navigation && swiper.navigation.$prevEl) {
31874 $prevEl = swiper.navigation.$prevEl;
31875 }
31876 if ($nextEl) {
31877 $nextEl.off('keydown', swiper.a11y.onEnterKey);
31878 }
31879 if ($prevEl) {
31880 $prevEl.off('keydown', swiper.a11y.onEnterKey);
31881 }
31882
31883 // Pagination
31884 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
31885 swiper.pagination.$el.off('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
31886 }
31887 },
31888 };
31889 var A11y = {
31890 name: 'a11y',
31891 params: {
31892 a11y: {
31893 enabled: true,
31894 notificationClass: 'swiper-notification',
31895 prevSlideMessage: 'Previous slide',
31896 nextSlideMessage: 'Next slide',
31897 firstSlideMessage: 'This is the first slide',
31898 lastSlideMessage: 'This is the last slide',
31899 paginationBulletMessage: 'Go to slide {{index}}',
31900 },
31901 },
31902 create: function create() {
31903 var swiper = this;
31904 Utils.extend(swiper, {
31905 a11y: {
31906 liveRegion: $(("<span class=\"" + (swiper.params.a11y.notificationClass) + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")),
31907 },
31908 });
31909 Object.keys(a11y).forEach(function (methodName) {
31910 swiper.a11y[methodName] = a11y[methodName].bind(swiper);
31911 });
31912 },
31913 on: {
31914 init: function init() {
31915 var swiper = this;
31916 if (!swiper.params.a11y.enabled) { return; }
31917 swiper.a11y.init();
31918 swiper.a11y.updateNavigation();
31919 },
31920 toEdge: function toEdge() {
31921 var swiper = this;
31922 if (!swiper.params.a11y.enabled) { return; }
31923 swiper.a11y.updateNavigation();
31924 },
31925 fromEdge: function fromEdge() {
31926 var swiper = this;
31927 if (!swiper.params.a11y.enabled) { return; }
31928 swiper.a11y.updateNavigation();
31929 },
31930 paginationUpdate: function paginationUpdate() {
31931 var swiper = this;
31932 if (!swiper.params.a11y.enabled) { return; }
31933 swiper.a11y.updatePagination();
31934 },
31935 destroy: function destroy() {
31936 var swiper = this;
31937 if (!swiper.params.a11y.enabled) { return; }
31938 swiper.a11y.destroy();
31939 },
31940 },
31941 };
31942
31943 /* eslint no-underscore-dangle: "off" */
31944
31945 var Autoplay = {
31946 run: function run() {
31947 var swiper = this;
31948 var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);
31949 var delay = swiper.params.autoplay.delay;
31950 if ($activeSlideEl.attr('data-swiper-autoplay')) {
31951 delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;
31952 }
31953 swiper.autoplay.timeout = Utils.nextTick(function () {
31954 if (swiper.params.autoplay.reverseDirection) {
31955 if (swiper.params.loop) {
31956 swiper.loopFix();
31957 swiper.slidePrev(swiper.params.speed, true, true);
31958 swiper.emit('autoplay');
31959 } else if (!swiper.isBeginning) {
31960 swiper.slidePrev(swiper.params.speed, true, true);
31961 swiper.emit('autoplay');
31962 } else if (!swiper.params.autoplay.stopOnLastSlide) {
31963 swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
31964 swiper.emit('autoplay');
31965 } else {
31966 swiper.autoplay.stop();
31967 }
31968 } else if (swiper.params.loop) {
31969 swiper.loopFix();
31970 swiper.slideNext(swiper.params.speed, true, true);
31971 swiper.emit('autoplay');
31972 } else if (!swiper.isEnd) {
31973 swiper.slideNext(swiper.params.speed, true, true);
31974 swiper.emit('autoplay');
31975 } else if (!swiper.params.autoplay.stopOnLastSlide) {
31976 swiper.slideTo(0, swiper.params.speed, true, true);
31977 swiper.emit('autoplay');
31978 } else {
31979 swiper.autoplay.stop();
31980 }
31981 }, delay);
31982 },
31983 start: function start() {
31984 var swiper = this;
31985 if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }
31986 if (swiper.autoplay.running) { return false; }
31987 swiper.autoplay.running = true;
31988 swiper.emit('autoplayStart');
31989 swiper.autoplay.run();
31990 return true;
31991 },
31992 stop: function stop() {
31993 var swiper = this;
31994 if (!swiper.autoplay.running) { return false; }
31995 if (typeof swiper.autoplay.timeout === 'undefined') { return false; }
31996
31997 if (swiper.autoplay.timeout) {
31998 clearTimeout(swiper.autoplay.timeout);
31999 swiper.autoplay.timeout = undefined;
32000 }
32001 swiper.autoplay.running = false;
32002 swiper.emit('autoplayStop');
32003 return true;
32004 },
32005 pause: function pause(speed) {
32006 var swiper = this;
32007 if (!swiper.autoplay.running) { return; }
32008 if (swiper.autoplay.paused) { return; }
32009 if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }
32010 swiper.autoplay.paused = true;
32011 if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
32012 swiper.autoplay.paused = false;
32013 swiper.autoplay.run();
32014 } else {
32015 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);
32016 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
32017 }
32018 },
32019 };
32020
32021 var Autoplay$1 = {
32022 name: 'autoplay',
32023 params: {
32024 autoplay: {
32025 enabled: false,
32026 delay: 3000,
32027 waitForTransition: true,
32028 disableOnInteraction: true,
32029 stopOnLastSlide: false,
32030 reverseDirection: false,
32031 },
32032 },
32033 create: function create() {
32034 var swiper = this;
32035 Utils.extend(swiper, {
32036 autoplay: {
32037 running: false,
32038 paused: false,
32039 run: Autoplay.run.bind(swiper),
32040 start: Autoplay.start.bind(swiper),
32041 stop: Autoplay.stop.bind(swiper),
32042 pause: Autoplay.pause.bind(swiper),
32043 onTransitionEnd: function onTransitionEnd(e) {
32044 if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }
32045 if (e.target !== this) { return; }
32046 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);
32047 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
32048 swiper.autoplay.paused = false;
32049 if (!swiper.autoplay.running) {
32050 swiper.autoplay.stop();
32051 } else {
32052 swiper.autoplay.run();
32053 }
32054 },
32055 },
32056 });
32057 },
32058 on: {
32059 init: function init() {
32060 var swiper = this;
32061 if (swiper.params.autoplay.enabled) {
32062 swiper.autoplay.start();
32063 }
32064 },
32065 beforeTransitionStart: function beforeTransitionStart(speed, internal) {
32066 var swiper = this;
32067 if (swiper.autoplay.running) {
32068 if (internal || !swiper.params.autoplay.disableOnInteraction) {
32069 swiper.autoplay.pause(speed);
32070 } else {
32071 swiper.autoplay.stop();
32072 }
32073 }
32074 },
32075 sliderFirstMove: function sliderFirstMove() {
32076 var swiper = this;
32077 if (swiper.autoplay.running) {
32078 if (swiper.params.autoplay.disableOnInteraction) {
32079 swiper.autoplay.stop();
32080 } else {
32081 swiper.autoplay.pause();
32082 }
32083 }
32084 },
32085 destroy: function destroy() {
32086 var swiper = this;
32087 if (swiper.autoplay.running) {
32088 swiper.autoplay.stop();
32089 }
32090 },
32091 },
32092 };
32093
32094 var Fade = {
32095 setTranslate: function setTranslate() {
32096 var swiper = this;
32097 var slides = swiper.slides;
32098 for (var i = 0; i < slides.length; i += 1) {
32099 var $slideEl = swiper.slides.eq(i);
32100 var offset = $slideEl[0].swiperSlideOffset;
32101 var tx = -offset;
32102 if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }
32103 var ty = 0;
32104 if (!swiper.isHorizontal()) {
32105 ty = tx;
32106 tx = 0;
32107 }
32108 var slideOpacity = swiper.params.fadeEffect.crossFade
32109 ? Math.max(1 - Math.abs($slideEl[0].progress), 0)
32110 : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);
32111 $slideEl
32112 .css({
32113 opacity: slideOpacity,
32114 })
32115 .transform(("translate3d(" + tx + "px, " + ty + "px, 0px)"));
32116 }
32117 },
32118 setTransition: function setTransition(duration) {
32119 var swiper = this;
32120 var slides = swiper.slides;
32121 var $wrapperEl = swiper.$wrapperEl;
32122 slides.transition(duration);
32123 if (swiper.params.virtualTranslate && duration !== 0) {
32124 var eventTriggered = false;
32125 slides.transitionEnd(function () {
32126 if (eventTriggered) { return; }
32127 if (!swiper || swiper.destroyed) { return; }
32128 eventTriggered = true;
32129 swiper.animating = false;
32130 var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
32131 for (var i = 0; i < triggerEvents.length; i += 1) {
32132 $wrapperEl.trigger(triggerEvents[i]);
32133 }
32134 });
32135 }
32136 },
32137 };
32138
32139 var EffectFade = {
32140 name: 'effect-fade',
32141 params: {
32142 fadeEffect: {
32143 crossFade: false,
32144 },
32145 },
32146 create: function create() {
32147 var swiper = this;
32148 Utils.extend(swiper, {
32149 fadeEffect: {
32150 setTranslate: Fade.setTranslate.bind(swiper),
32151 setTransition: Fade.setTransition.bind(swiper),
32152 },
32153 });
32154 },
32155 on: {
32156 beforeInit: function beforeInit() {
32157 var swiper = this;
32158 if (swiper.params.effect !== 'fade') { return; }
32159 swiper.classNames.push(((swiper.params.containerModifierClass) + "fade"));
32160 var overwriteParams = {
32161 slidesPerView: 1,
32162 slidesPerColumn: 1,
32163 slidesPerGroup: 1,
32164 watchSlidesProgress: true,
32165 spaceBetween: 0,
32166 virtualTranslate: true,
32167 };
32168 Utils.extend(swiper.params, overwriteParams);
32169 Utils.extend(swiper.originalParams, overwriteParams);
32170 },
32171 setTranslate: function setTranslate() {
32172 var swiper = this;
32173 if (swiper.params.effect !== 'fade') { return; }
32174 swiper.fadeEffect.setTranslate();
32175 },
32176 setTransition: function setTransition(duration) {
32177 var swiper = this;
32178 if (swiper.params.effect !== 'fade') { return; }
32179 swiper.fadeEffect.setTransition(duration);
32180 },
32181 },
32182 };
32183
32184 var Cube = {
32185 setTranslate: function setTranslate() {
32186 var swiper = this;
32187 var $el = swiper.$el;
32188 var $wrapperEl = swiper.$wrapperEl;
32189 var slides = swiper.slides;
32190 var swiperWidth = swiper.width;
32191 var swiperHeight = swiper.height;
32192 var rtl = swiper.rtlTranslate;
32193 var swiperSize = swiper.size;
32194 var params = swiper.params.cubeEffect;
32195 var isHorizontal = swiper.isHorizontal();
32196 var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
32197 var wrapperRotate = 0;
32198 var $cubeShadowEl;
32199 if (params.shadow) {
32200 if (isHorizontal) {
32201 $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');
32202 if ($cubeShadowEl.length === 0) {
32203 $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
32204 $wrapperEl.append($cubeShadowEl);
32205 }
32206 $cubeShadowEl.css({ height: (swiperWidth + "px") });
32207 } else {
32208 $cubeShadowEl = $el.find('.swiper-cube-shadow');
32209 if ($cubeShadowEl.length === 0) {
32210 $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
32211 $el.append($cubeShadowEl);
32212 }
32213 }
32214 }
32215 for (var i = 0; i < slides.length; i += 1) {
32216 var $slideEl = slides.eq(i);
32217 var slideIndex = i;
32218 if (isVirtual) {
32219 slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);
32220 }
32221 var slideAngle = slideIndex * 90;
32222 var round = Math.floor(slideAngle / 360);
32223 if (rtl) {
32224 slideAngle = -slideAngle;
32225 round = Math.floor(-slideAngle / 360);
32226 }
32227 var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
32228 var tx = 0;
32229 var ty = 0;
32230 var tz = 0;
32231 if (slideIndex % 4 === 0) {
32232 tx = -round * 4 * swiperSize;
32233 tz = 0;
32234 } else if ((slideIndex - 1) % 4 === 0) {
32235 tx = 0;
32236 tz = -round * 4 * swiperSize;
32237 } else if ((slideIndex - 2) % 4 === 0) {
32238 tx = swiperSize + (round * 4 * swiperSize);
32239 tz = swiperSize;
32240 } else if ((slideIndex - 3) % 4 === 0) {
32241 tx = -swiperSize;
32242 tz = (3 * swiperSize) + (swiperSize * 4 * round);
32243 }
32244 if (rtl) {
32245 tx = -tx;
32246 }
32247
32248 if (!isHorizontal) {
32249 ty = tx;
32250 tx = 0;
32251 }
32252
32253 var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)";
32254 if (progress <= 1 && progress > -1) {
32255 wrapperRotate = (slideIndex * 90) + (progress * 90);
32256 if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }
32257 }
32258 $slideEl.transform(transform);
32259 if (params.slideShadows) {
32260 // Set shadows
32261 var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
32262 var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
32263 if (shadowBefore.length === 0) {
32264 shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
32265 $slideEl.append(shadowBefore);
32266 }
32267 if (shadowAfter.length === 0) {
32268 shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
32269 $slideEl.append(shadowAfter);
32270 }
32271 if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
32272 if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
32273 }
32274 }
32275 $wrapperEl.css({
32276 '-webkit-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
32277 '-moz-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
32278 '-ms-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
32279 'transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
32280 });
32281
32282 if (params.shadow) {
32283 if (isHorizontal) {
32284 $cubeShadowEl.transform(("translate3d(0px, " + ((swiperWidth / 2) + params.shadowOffset) + "px, " + (-swiperWidth / 2) + "px) rotateX(90deg) rotateZ(0deg) scale(" + (params.shadowScale) + ")"));
32285 } else {
32286 var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);
32287 var multiplier = 1.5 - (
32288 (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)
32289 + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)
32290 );
32291 var scale1 = params.shadowScale;
32292 var scale2 = params.shadowScale / multiplier;
32293 var offset = params.shadowOffset;
32294 $cubeShadowEl.transform(("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + ((swiperHeight / 2) + offset) + "px, " + (-swiperHeight / 2 / scale2) + "px) rotateX(-90deg)"));
32295 }
32296 }
32297 var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;
32298 $wrapperEl
32299 .transform(("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)"));
32300 },
32301 setTransition: function setTransition(duration) {
32302 var swiper = this;
32303 var $el = swiper.$el;
32304 var slides = swiper.slides;
32305 slides
32306 .transition(duration)
32307 .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
32308 .transition(duration);
32309 if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
32310 $el.find('.swiper-cube-shadow').transition(duration);
32311 }
32312 },
32313 };
32314
32315 var EffectCube = {
32316 name: 'effect-cube',
32317 params: {
32318 cubeEffect: {
32319 slideShadows: true,
32320 shadow: true,
32321 shadowOffset: 20,
32322 shadowScale: 0.94,
32323 },
32324 },
32325 create: function create() {
32326 var swiper = this;
32327 Utils.extend(swiper, {
32328 cubeEffect: {
32329 setTranslate: Cube.setTranslate.bind(swiper),
32330 setTransition: Cube.setTransition.bind(swiper),
32331 },
32332 });
32333 },
32334 on: {
32335 beforeInit: function beforeInit() {
32336 var swiper = this;
32337 if (swiper.params.effect !== 'cube') { return; }
32338 swiper.classNames.push(((swiper.params.containerModifierClass) + "cube"));
32339 swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
32340 var overwriteParams = {
32341 slidesPerView: 1,
32342 slidesPerColumn: 1,
32343 slidesPerGroup: 1,
32344 watchSlidesProgress: true,
32345 resistanceRatio: 0,
32346 spaceBetween: 0,
32347 centeredSlides: false,
32348 virtualTranslate: true,
32349 };
32350 Utils.extend(swiper.params, overwriteParams);
32351 Utils.extend(swiper.originalParams, overwriteParams);
32352 },
32353 setTranslate: function setTranslate() {
32354 var swiper = this;
32355 if (swiper.params.effect !== 'cube') { return; }
32356 swiper.cubeEffect.setTranslate();
32357 },
32358 setTransition: function setTransition(duration) {
32359 var swiper = this;
32360 if (swiper.params.effect !== 'cube') { return; }
32361 swiper.cubeEffect.setTransition(duration);
32362 },
32363 },
32364 };
32365
32366 var Flip = {
32367 setTranslate: function setTranslate() {
32368 var swiper = this;
32369 var slides = swiper.slides;
32370 var rtl = swiper.rtlTranslate;
32371 for (var i = 0; i < slides.length; i += 1) {
32372 var $slideEl = slides.eq(i);
32373 var progress = $slideEl[0].progress;
32374 if (swiper.params.flipEffect.limitRotation) {
32375 progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
32376 }
32377 var offset = $slideEl[0].swiperSlideOffset;
32378 var rotate = -180 * progress;
32379 var rotateY = rotate;
32380 var rotateX = 0;
32381 var tx = -offset;
32382 var ty = 0;
32383 if (!swiper.isHorizontal()) {
32384 ty = tx;
32385 tx = 0;
32386 rotateX = -rotateY;
32387 rotateY = 0;
32388 } else if (rtl) {
32389 rotateY = -rotateY;
32390 }
32391
32392 $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
32393
32394 if (swiper.params.flipEffect.slideShadows) {
32395 // Set shadows
32396 var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
32397 var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
32398 if (shadowBefore.length === 0) {
32399 shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'left' : 'top') + "\"></div>"));
32400 $slideEl.append(shadowBefore);
32401 }
32402 if (shadowAfter.length === 0) {
32403 shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'right' : 'bottom') + "\"></div>"));
32404 $slideEl.append(shadowAfter);
32405 }
32406 if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
32407 if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
32408 }
32409 $slideEl
32410 .transform(("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)"));
32411 }
32412 },
32413 setTransition: function setTransition(duration) {
32414 var swiper = this;
32415 var slides = swiper.slides;
32416 var activeIndex = swiper.activeIndex;
32417 var $wrapperEl = swiper.$wrapperEl;
32418 slides
32419 .transition(duration)
32420 .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
32421 .transition(duration);
32422 if (swiper.params.virtualTranslate && duration !== 0) {
32423 var eventTriggered = false;
32424 // eslint-disable-next-line
32425 slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {
32426 if (eventTriggered) { return; }
32427 if (!swiper || swiper.destroyed) { return; }
32428 // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
32429 eventTriggered = true;
32430 swiper.animating = false;
32431 var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
32432 for (var i = 0; i < triggerEvents.length; i += 1) {
32433 $wrapperEl.trigger(triggerEvents[i]);
32434 }
32435 });
32436 }
32437 },
32438 };
32439
32440 var EffectFlip = {
32441 name: 'effect-flip',
32442 params: {
32443 flipEffect: {
32444 slideShadows: true,
32445 limitRotation: true,
32446 },
32447 },
32448 create: function create() {
32449 var swiper = this;
32450 Utils.extend(swiper, {
32451 flipEffect: {
32452 setTranslate: Flip.setTranslate.bind(swiper),
32453 setTransition: Flip.setTransition.bind(swiper),
32454 },
32455 });
32456 },
32457 on: {
32458 beforeInit: function beforeInit() {
32459 var swiper = this;
32460 if (swiper.params.effect !== 'flip') { return; }
32461 swiper.classNames.push(((swiper.params.containerModifierClass) + "flip"));
32462 swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
32463 var overwriteParams = {
32464 slidesPerView: 1,
32465 slidesPerColumn: 1,
32466 slidesPerGroup: 1,
32467 watchSlidesProgress: true,
32468 spaceBetween: 0,
32469 virtualTranslate: true,
32470 };
32471 Utils.extend(swiper.params, overwriteParams);
32472 Utils.extend(swiper.originalParams, overwriteParams);
32473 },
32474 setTranslate: function setTranslate() {
32475 var swiper = this;
32476 if (swiper.params.effect !== 'flip') { return; }
32477 swiper.flipEffect.setTranslate();
32478 },
32479 setTransition: function setTransition(duration) {
32480 var swiper = this;
32481 if (swiper.params.effect !== 'flip') { return; }
32482 swiper.flipEffect.setTransition(duration);
32483 },
32484 },
32485 };
32486
32487 var Coverflow = {
32488 setTranslate: function setTranslate() {
32489 var swiper = this;
32490 var swiperWidth = swiper.width;
32491 var swiperHeight = swiper.height;
32492 var slides = swiper.slides;
32493 var $wrapperEl = swiper.$wrapperEl;
32494 var slidesSizesGrid = swiper.slidesSizesGrid;
32495 var params = swiper.params.coverflowEffect;
32496 var isHorizontal = swiper.isHorizontal();
32497 var transform = swiper.translate;
32498 var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);
32499 var rotate = isHorizontal ? params.rotate : -params.rotate;
32500 var translate = params.depth;
32501 // Each slide offset from center
32502 for (var i = 0, length = slides.length; i < length; i += 1) {
32503 var $slideEl = slides.eq(i);
32504 var slideSize = slidesSizesGrid[i];
32505 var slideOffset = $slideEl[0].swiperSlideOffset;
32506 var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;
32507
32508 var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
32509 var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
32510 // var rotateZ = 0
32511 var translateZ = -translate * Math.abs(offsetMultiplier);
32512
32513 var translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier);
32514 var translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0;
32515
32516 // Fix for ultra small values
32517 if (Math.abs(translateX) < 0.001) { translateX = 0; }
32518 if (Math.abs(translateY) < 0.001) { translateY = 0; }
32519 if (Math.abs(translateZ) < 0.001) { translateZ = 0; }
32520 if (Math.abs(rotateY) < 0.001) { rotateY = 0; }
32521 if (Math.abs(rotateX) < 0.001) { rotateX = 0; }
32522
32523 var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)";
32524
32525 $slideEl.transform(slideTransform);
32526 $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
32527 if (params.slideShadows) {
32528 // Set shadows
32529 var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
32530 var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
32531 if ($shadowBeforeEl.length === 0) {
32532 $shadowBeforeEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
32533 $slideEl.append($shadowBeforeEl);
32534 }
32535 if ($shadowAfterEl.length === 0) {
32536 $shadowAfterEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
32537 $slideEl.append($shadowAfterEl);
32538 }
32539 if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }
32540 if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }
32541 }
32542 }
32543
32544 // Set correct perspective for IE10
32545 if (Support.pointerEvents || Support.prefixedPointerEvents) {
32546 var ws = $wrapperEl[0].style;
32547 ws.perspectiveOrigin = center + "px 50%";
32548 }
32549 },
32550 setTransition: function setTransition(duration) {
32551 var swiper = this;
32552 swiper.slides
32553 .transition(duration)
32554 .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
32555 .transition(duration);
32556 },
32557 };
32558
32559 var EffectCoverflow = {
32560 name: 'effect-coverflow',
32561 params: {
32562 coverflowEffect: {
32563 rotate: 50,
32564 stretch: 0,
32565 depth: 100,
32566 modifier: 1,
32567 slideShadows: true,
32568 },
32569 },
32570 create: function create() {
32571 var swiper = this;
32572 Utils.extend(swiper, {
32573 coverflowEffect: {
32574 setTranslate: Coverflow.setTranslate.bind(swiper),
32575 setTransition: Coverflow.setTransition.bind(swiper),
32576 },
32577 });
32578 },
32579 on: {
32580 beforeInit: function beforeInit() {
32581 var swiper = this;
32582 if (swiper.params.effect !== 'coverflow') { return; }
32583
32584 swiper.classNames.push(((swiper.params.containerModifierClass) + "coverflow"));
32585 swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
32586
32587 swiper.params.watchSlidesProgress = true;
32588 swiper.originalParams.watchSlidesProgress = true;
32589 },
32590 setTranslate: function setTranslate() {
32591 var swiper = this;
32592 if (swiper.params.effect !== 'coverflow') { return; }
32593 swiper.coverflowEffect.setTranslate();
32594 },
32595 setTransition: function setTransition(duration) {
32596 var swiper = this;
32597 if (swiper.params.effect !== 'coverflow') { return; }
32598 swiper.coverflowEffect.setTransition(duration);
32599 },
32600 },
32601 };
32602
32603 var Thumbs = {
32604 init: function init() {
32605 var swiper = this;
32606 var ref = swiper.params;
32607 var thumbsParams = ref.thumbs;
32608 var SwiperClass = swiper.constructor;
32609 if (thumbsParams.swiper instanceof SwiperClass) {
32610 swiper.thumbs.swiper = thumbsParams.swiper;
32611 Utils.extend(swiper.thumbs.swiper.originalParams, {
32612 watchSlidesProgress: true,
32613 slideToClickedSlide: false,
32614 });
32615 Utils.extend(swiper.thumbs.swiper.params, {
32616 watchSlidesProgress: true,
32617 slideToClickedSlide: false,
32618 });
32619 } else if (Utils.isObject(thumbsParams.swiper)) {
32620 swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {
32621 watchSlidesVisibility: true,
32622 watchSlidesProgress: true,
32623 slideToClickedSlide: false,
32624 }));
32625 swiper.thumbs.swiperCreated = true;
32626 }
32627 swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
32628 swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);
32629 },
32630 onThumbClick: function onThumbClick() {
32631 var swiper = this;
32632 var thumbsSwiper = swiper.thumbs.swiper;
32633 if (!thumbsSwiper) { return; }
32634 var clickedIndex = thumbsSwiper.clickedIndex;
32635 var clickedSlide = thumbsSwiper.clickedSlide;
32636 if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }
32637 if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }
32638 var slideToIndex;
32639 if (thumbsSwiper.params.loop) {
32640 slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
32641 } else {
32642 slideToIndex = clickedIndex;
32643 }
32644 if (swiper.params.loop) {
32645 var currentIndex = swiper.activeIndex;
32646 if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
32647 swiper.loopFix();
32648 // eslint-disable-next-line
32649 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
32650 currentIndex = swiper.activeIndex;
32651 }
32652 var prevIndex = swiper.slides.eq(currentIndex).prevAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
32653 var nextIndex = swiper.slides.eq(currentIndex).nextAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
32654 if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }
32655 else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }
32656 else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }
32657 else { slideToIndex = prevIndex; }
32658 }
32659 swiper.slideTo(slideToIndex);
32660 },
32661 update: function update(initial) {
32662 var swiper = this;
32663 var thumbsSwiper = swiper.thumbs.swiper;
32664 if (!thumbsSwiper) { return; }
32665
32666 var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'
32667 ? thumbsSwiper.slidesPerViewDynamic()
32668 : thumbsSwiper.params.slidesPerView;
32669
32670 if (swiper.realIndex !== thumbsSwiper.realIndex) {
32671 var currentThumbsIndex = thumbsSwiper.activeIndex;
32672 var newThumbsIndex;
32673 if (thumbsSwiper.params.loop) {
32674 if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
32675 thumbsSwiper.loopFix();
32676 // eslint-disable-next-line
32677 thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
32678 currentThumbsIndex = thumbsSwiper.activeIndex;
32679 }
32680 // Find actual thumbs index to slide to
32681 var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
32682 var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index();
32683 if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }
32684 else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }
32685 else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }
32686 else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }
32687 else { newThumbsIndex = prevThumbsIndex; }
32688 } else {
32689 newThumbsIndex = swiper.realIndex;
32690 }
32691 if (thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
32692 if (thumbsSwiper.params.centeredSlides) {
32693 if (newThumbsIndex > currentThumbsIndex) {
32694 newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
32695 } else {
32696 newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
32697 }
32698 } else if (newThumbsIndex > currentThumbsIndex) {
32699 newThumbsIndex = newThumbsIndex - slidesPerView + 1;
32700 }
32701 thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
32702 }
32703 }
32704
32705 // Activate thumbs
32706 var thumbsToActivate = 1;
32707 var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
32708
32709 if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
32710 thumbsToActivate = swiper.params.slidesPerView;
32711 }
32712
32713 thumbsSwiper.slides.removeClass(thumbActiveClass);
32714 if (thumbsSwiper.params.loop) {
32715 for (var i = 0; i < thumbsToActivate; i += 1) {
32716 thumbsSwiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]")).addClass(thumbActiveClass);
32717 }
32718 } else {
32719 for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {
32720 thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);
32721 }
32722 }
32723 },
32724 };
32725 var Thumbs$1 = {
32726 name: 'thumbs',
32727 params: {
32728 thumbs: {
32729 swiper: null,
32730 slideThumbActiveClass: 'swiper-slide-thumb-active',
32731 thumbsContainerClass: 'swiper-container-thumbs',
32732 },
32733 },
32734 create: function create() {
32735 var swiper = this;
32736 Utils.extend(swiper, {
32737 thumbs: {
32738 swiper: null,
32739 init: Thumbs.init.bind(swiper),
32740 update: Thumbs.update.bind(swiper),
32741 onThumbClick: Thumbs.onThumbClick.bind(swiper),
32742 },
32743 });
32744 },
32745 on: {
32746 beforeInit: function beforeInit() {
32747 var swiper = this;
32748 var ref = swiper.params;
32749 var thumbs = ref.thumbs;
32750 if (!thumbs || !thumbs.swiper) { return; }
32751 swiper.thumbs.init();
32752 swiper.thumbs.update(true);
32753 },
32754 slideChange: function slideChange() {
32755 var swiper = this;
32756 if (!swiper.thumbs.swiper) { return; }
32757 swiper.thumbs.update();
32758 },
32759 update: function update() {
32760 var swiper = this;
32761 if (!swiper.thumbs.swiper) { return; }
32762 swiper.thumbs.update();
32763 },
32764 resize: function resize() {
32765 var swiper = this;
32766 if (!swiper.thumbs.swiper) { return; }
32767 swiper.thumbs.update();
32768 },
32769 observerUpdate: function observerUpdate() {
32770 var swiper = this;
32771 if (!swiper.thumbs.swiper) { return; }
32772 swiper.thumbs.update();
32773 },
32774 setTransition: function setTransition(duration) {
32775 var swiper = this;
32776 var thumbsSwiper = swiper.thumbs.swiper;
32777 if (!thumbsSwiper) { return; }
32778 thumbsSwiper.setTransition(duration);
32779 },
32780 beforeDestroy: function beforeDestroy() {
32781 var swiper = this;
32782 var thumbsSwiper = swiper.thumbs.swiper;
32783 if (!thumbsSwiper) { return; }
32784 if (swiper.thumbs.swiperCreated && thumbsSwiper) {
32785 thumbsSwiper.destroy();
32786 }
32787 },
32788 },
32789 };
32790
32791 // Swiper Class
32792
32793 Swiper.use([
32794 Device$1,
32795 Browser$1,
32796 Support$1,
32797 Resize,
32798 Observer$1,
32799 Virtual$1,
32800 Navigation$1,
32801 Pagination$1,
32802 Scrollbar$1,
32803 Parallax$1,
32804 Zoom$1,
32805 Lazy$3,
32806 Controller$1,
32807 A11y,
32808 Autoplay$1,
32809 EffectFade,
32810 EffectCube,
32811 EffectFlip,
32812 EffectCoverflow,
32813 Thumbs$1 ]);
32814
32815 {
32816 if (!window.Swiper) {
32817 window.Swiper = Swiper;
32818 }
32819 }
32820
32821 function initSwiper(swiperEl) {
32822 var app = this;
32823 var $swiperEl = $(swiperEl);
32824 if ($swiperEl.length === 0) { return; }
32825 if ($swiperEl[0].swiper) { return; }
32826 var initialSlide;
32827 var params = {};
32828 var isTabs;
32829 var isRoutableTabs;
32830 if ($swiperEl.hasClass('tabs-swipeable-wrap')) {
32831 $swiperEl
32832 .addClass('swiper-container')
32833 .children('.tabs')
32834 .addClass('swiper-wrapper')
32835 .children('.tab')
32836 .addClass('swiper-slide');
32837 initialSlide = $swiperEl.children('.tabs').children('.tab-active').index();
32838 isTabs = true;
32839 isRoutableTabs = $swiperEl.find('.tabs-routable').length > 0;
32840 }
32841 if ($swiperEl.attr('data-swiper')) {
32842 params = JSON.parse($swiperEl.attr('data-swiper'));
32843 } else {
32844 params = $swiperEl.dataset();
32845 Object.keys(params).forEach(function (key) {
32846 var value = params[key];
32847 if (typeof value === 'string' && value.indexOf('{') === 0 && value.indexOf('}') > 0) {
32848 try {
32849 params[key] = JSON.parse(value);
32850 } catch (e) {
32851 // not JSON
32852 }
32853 }
32854 });
32855 }
32856 if (typeof params.initialSlide === 'undefined' && typeof initialSlide !== 'undefined') {
32857 params.initialSlide = initialSlide;
32858 }
32859
32860 var swiper = app.swiper.create($swiperEl[0], params);
32861 if (isTabs) {
32862 swiper.on('slideChange', function () {
32863 if (isRoutableTabs) {
32864 var view = app.views.get($swiperEl.parents('.view'));
32865 if (!view) { view = app.views.main; }
32866 var router = view.router;
32867 var tabRoute = router.findTabRoute(swiper.slides.eq(swiper.activeIndex)[0]);
32868 if (tabRoute) {
32869 setTimeout(function () {
32870 router.navigate(tabRoute.path);
32871 }, 0);
32872 }
32873 } else {
32874 app.tab.show({
32875 tabEl: swiper.slides.eq(swiper.activeIndex),
32876 });
32877 }
32878 });
32879 }
32880 }
32881
32882 var Swiper$1 = {
32883 name: 'swiper',
32884 static: {
32885 Swiper: Swiper,
32886 },
32887 create: function create() {
32888 var app = this;
32889 app.swiper = ConstructorMethods({
32890 defaultSelector: '.swiper-container',
32891 constructor: Swiper,
32892 domProp: 'swiper',
32893 });
32894 },
32895 on: {
32896 pageBeforeRemove: function pageBeforeRemove(page) {
32897 var app = this;
32898 page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
32899 app.swiper.destroy(swiperEl);
32900 });
32901 },
32902 pageMounted: function pageMounted(page) {
32903 var app = this;
32904 page.$el.find('.tabs-swipeable-wrap').each(function (index, swiperEl) {
32905 initSwiper.call(app, swiperEl);
32906 });
32907 },
32908 pageInit: function pageInit(page) {
32909 var app = this;
32910 page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
32911 initSwiper.call(app, swiperEl);
32912 });
32913 },
32914 pageReinit: function pageReinit(page) {
32915 var app = this;
32916 page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
32917 var swiper = app.swiper.get(swiperEl);
32918 if (swiper && swiper.update) { swiper.update(); }
32919 });
32920 },
32921 tabMounted: function tabMounted(tabEl) {
32922 var app = this;
32923 $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
32924 initSwiper.call(app, swiperEl);
32925 });
32926 },
32927 tabShow: function tabShow(tabEl) {
32928 var app = this;
32929 $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
32930 var swiper = app.swiper.get(swiperEl);
32931 if (swiper && swiper.update) { swiper.update(); }
32932 });
32933 },
32934 tabBeforeRemove: function tabBeforeRemove(tabEl) {
32935 var app = this;
32936 $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
32937 app.swiper.destroy(swiperEl);
32938 });
32939 },
32940 },
32941 vnode: {
32942 'swiper-init': {
32943 insert: function insert(vnode) {
32944 var app = this;
32945 var swiperEl = vnode.elm;
32946 initSwiper.call(app, swiperEl);
32947 },
32948 destroy: function destroy(vnode) {
32949 var app = this;
32950 var swiperEl = vnode.elm;
32951 app.swiper.destroy(swiperEl);
32952 },
32953 },
32954 'tabs-swipeable-wrap': {
32955 insert: function insert(vnode) {
32956 var app = this;
32957 var swiperEl = vnode.elm;
32958 initSwiper.call(app, swiperEl);
32959 },
32960 destroy: function destroy(vnode) {
32961 var app = this;
32962 var swiperEl = vnode.elm;
32963 app.swiper.destroy(swiperEl);
32964 },
32965 },
32966 },
32967 };
32968
32969 /* eslint indent: ["off"] */
32970
32971 var PhotoBrowser = /*@__PURE__*/(function (Framework7Class$$1) {
32972 function PhotoBrowser(app, params) {
32973 if ( params === void 0 ) params = {};
32974
32975 Framework7Class$$1.call(this, params, [app]);
32976
32977 var pb = this;
32978 pb.app = app;
32979
32980 var defaults = Utils.extend({
32981 on: {},
32982 }, app.params.photoBrowser);
32983
32984 // Extend defaults with modules params
32985 pb.useModulesParams(defaults);
32986
32987 pb.params = Utils.extend(defaults, params);
32988
32989 Utils.extend(pb, {
32990 exposed: false,
32991 opened: false,
32992 activeIndex: pb.params.swiper.initialSlide,
32993 url: pb.params.url,
32994 view: pb.params.view || app.views.main,
32995 swipeToClose: {
32996 allow: true,
32997 isTouched: false,
32998 diff: undefined,
32999 start: undefined,
33000 current: undefined,
33001 started: false,
33002 activeSlide: undefined,
33003 timeStart: undefined,
33004 },
33005 });
33006
33007 // Install Modules
33008 pb.useModules();
33009
33010 // Init
33011 pb.init();
33012 }
33013
33014 if ( Framework7Class$$1 ) PhotoBrowser.__proto__ = Framework7Class$$1;
33015 PhotoBrowser.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
33016 PhotoBrowser.prototype.constructor = PhotoBrowser;
33017
33018 PhotoBrowser.prototype.onSlideChange = function onSlideChange (swiper) {
33019 var pb = this;
33020 pb.activeIndex = swiper.activeIndex;
33021
33022 var current = swiper.activeIndex + 1;
33023 var total = pb.params.virtualSlides ? pb.params.photos.length : swiper.slides.length;
33024 if (swiper.params.loop) {
33025 total -= 2;
33026 current -= swiper.loopedSlides;
33027 if (current < 1) { current = total + current; }
33028 if (current > total) { current -= total; }
33029 }
33030
33031 var $activeSlideEl = pb.params.virtualSlides
33032 ? swiper.$wrapperEl.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper.activeIndex) + "\"]"))
33033 : swiper.slides.eq(swiper.activeIndex);
33034 var $previousSlideEl = pb.params.virtualSlides
33035 ? swiper.$wrapperEl.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper.previousIndex) + "\"]"))
33036 : swiper.slides.eq(swiper.previousIndex);
33037
33038 var $currentEl = pb.$el.find('.photo-browser-current');
33039 var $totalEl = pb.$el.find('.photo-browser-total');
33040 if (pb.params.type === 'page' && pb.params.navbar && $currentEl.length === 0 && pb.app.theme === 'ios') {
33041 var navbarEl = pb.app.navbar.getElByPage(pb.$el);
33042 if (navbarEl) {
33043 $currentEl = $(navbarEl).find('.photo-browser-current');
33044 $totalEl = $(navbarEl).find('.photo-browser-total');
33045 }
33046 }
33047 $currentEl.text(current);
33048 $totalEl.text(total);
33049
33050 // Update captions
33051 if (pb.captions.length > 0) {
33052 var captionIndex = swiper.params.loop ? $activeSlideEl.attr('data-swiper-slide-index') : pb.activeIndex;
33053 pb.$captionsContainerEl.find('.photo-browser-caption-active').removeClass('photo-browser-caption-active');
33054 pb.$captionsContainerEl.find(("[data-caption-index=\"" + captionIndex + "\"]")).addClass('photo-browser-caption-active');
33055 }
33056
33057 // Stop Video
33058 var previousSlideVideo = $previousSlideEl.find('video');
33059 if (previousSlideVideo.length > 0) {
33060 if ('pause' in previousSlideVideo[0]) { previousSlideVideo[0].pause(); }
33061 }
33062 };
33063
33064 PhotoBrowser.prototype.onTouchStart = function onTouchStart () {
33065 var pb = this;
33066 var swipeToClose = pb.swipeToClose;
33067 if (!swipeToClose.allow) { return; }
33068 swipeToClose.isTouched = true;
33069 };
33070
33071 PhotoBrowser.prototype.onTouchMove = function onTouchMove (e) {
33072 var pb = this;
33073 var swipeToClose = pb.swipeToClose;
33074
33075 if (!swipeToClose.isTouched) { return; }
33076 if (!swipeToClose.started) {
33077 swipeToClose.started = true;
33078 swipeToClose.start = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
33079 if (pb.params.virtualSlides) {
33080 swipeToClose.activeSlide = pb.swiper.$wrapperEl.children('.swiper-slide-active');
33081 } else {
33082 swipeToClose.activeSlide = pb.swiper.slides.eq(pb.swiper.activeIndex);
33083 }
33084 swipeToClose.timeStart = Utils.now();
33085 }
33086 e.preventDefault();
33087 swipeToClose.current = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
33088 swipeToClose.diff = swipeToClose.start - swipeToClose.current;
33089 var opacity = 1 - (Math.abs(swipeToClose.diff) / 300);
33090 var color = pb.exposed || pb.params.theme === 'dark' ? 0 : 255;
33091 swipeToClose.activeSlide.transform(("translate3d(0," + (-swipeToClose.diff) + "px,0)"));
33092 pb.swiper.$el.css('background-color', ("rgba(" + color + ", " + color + ", " + color + ", " + opacity + ")")).transition(0);
33093 };
33094
33095 PhotoBrowser.prototype.onTouchEnd = function onTouchEnd () {
33096 var pb = this;
33097 var swipeToClose = pb.swipeToClose;
33098 swipeToClose.isTouched = false;
33099 if (!swipeToClose.started) {
33100 swipeToClose.started = false;
33101 return;
33102 }
33103 swipeToClose.started = false;
33104 swipeToClose.allow = false;
33105 var diff = Math.abs(swipeToClose.diff);
33106 var timeDiff = (new Date()).getTime() - swipeToClose.timeStart;
33107 if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > 100)) {
33108 Utils.nextTick(function () {
33109 if (pb.$el) {
33110 if (swipeToClose.diff < 0) { pb.$el.addClass('swipe-close-to-bottom'); }
33111 else { pb.$el.addClass('swipe-close-to-top'); }
33112 }
33113 pb.emit('local::swipeToClose', pb);
33114 pb.close();
33115 swipeToClose.allow = true;
33116 });
33117 return;
33118 }
33119 if (diff !== 0) {
33120 swipeToClose.activeSlide.addClass('photo-browser-transitioning').transitionEnd(function () {
33121 swipeToClose.allow = true;
33122 swipeToClose.activeSlide.removeClass('photo-browser-transitioning');
33123 });
33124 } else {
33125 swipeToClose.allow = true;
33126 }
33127 pb.swiper.$el.transition('').css('background-color', '');
33128 swipeToClose.activeSlide.transform('');
33129 };
33130
33131 // Render Functions
33132 PhotoBrowser.prototype.renderNavbar = function renderNavbar () {
33133 var pb = this;
33134 if (pb.params.renderNavbar) { return pb.params.renderNavbar.call(pb); }
33135
33136 var iconsColor = pb.params.iconsColor;
33137 if (!pb.params.iconsColor && pb.params.theme === 'dark') { iconsColor = 'white'; }
33138
33139 var backLinkText = pb.app.theme === 'ios' && pb.params.backLinkText ? pb.params.backLinkText : '';
33140
33141 var isPopup = pb.params.type !== 'page';
33142 var navbarHtml = ("\n <div class=\"navbar\">\n <div class=\"navbar-inner sliding\">\n <div class=\"left\">\n <a href=\"#\" class=\"link " + (isPopup ? 'popup-close' : '') + " " + (!backLinkText ? 'icon-only' : '') + " " + (!isPopup ? 'back' : '') + "\" " + (isPopup ? 'data-popup=".photo-browser-popup"' : '') + ">\n <i class=\"icon icon-back " + (iconsColor ? ("color-" + iconsColor) : '') + "\"></i>\n " + (backLinkText ? ("<span>" + backLinkText + "</span>") : '') + "\n </a>\n </div>\n <div class=\"title\">\n <span class=\"photo-browser-current\"></span>\n <span class=\"photo-browser-of\">" + (pb.params.navbarOfText) + "</span>\n <span class=\"photo-browser-total\"></span>\n </div>\n <div class=\"right\"></div>\n </div>\n </div>\n ").trim();
33143 return navbarHtml;
33144 };
33145
33146 PhotoBrowser.prototype.renderToolbar = function renderToolbar () {
33147 var pb = this;
33148 if (pb.params.renderToolbar) { return pb.params.renderToolbar.call(pb); }
33149
33150 var iconsColor = pb.params.iconsColor;
33151 if (!pb.params.iconsColor && pb.params.theme === 'dark') { iconsColor = 'white'; }
33152
33153 var toolbarHtml = ("\n <div class=\"toolbar toolbar-bottom tabbar\">\n <div class=\"toolbar-inner\">\n <a href=\"#\" class=\"link photo-browser-prev\">\n <i class=\"icon icon-back " + (iconsColor ? ("color-" + iconsColor) : '') + "\"></i>\n </a>\n <a href=\"#\" class=\"link photo-browser-next\">\n <i class=\"icon icon-forward " + (iconsColor ? ("color-" + iconsColor) : '') + "\"></i>\n </a>\n </div>\n </div>\n ").trim();
33154 return toolbarHtml;
33155 };
33156
33157 PhotoBrowser.prototype.renderCaption = function renderCaption (caption, index) {
33158 var pb = this;
33159 if (pb.params.renderCaption) { return pb.params.renderCaption.call(pb, caption, index); }
33160 var captionHtml = ("\n <div class=\"photo-browser-caption\" data-caption-index=\"" + index + "\">\n " + caption + "\n </div>\n ").trim();
33161 return captionHtml;
33162 };
33163
33164 PhotoBrowser.prototype.renderObject = function renderObject (photo, index) {
33165 var pb = this;
33166 if (pb.params.renderObject) { return pb.params.renderObject.call(pb, photo, index); }
33167 var objHtml = "\n <div class=\"photo-browser-slide photo-browser-object-slide swiper-slide\" data-swiper-slide-index=\"" + index + "\">" + (photo.html ? photo.html : photo) + "</div>\n ";
33168 return objHtml;
33169 };
33170
33171 PhotoBrowser.prototype.renderLazyPhoto = function renderLazyPhoto (photo, index) {
33172 var pb = this;
33173 if (pb.params.renderLazyPhoto) { return pb.params.renderLazyPhoto.call(pb, photo, index); }
33174 var photoHtml = ("\n <div class=\"photo-browser-slide photo-browser-slide-lazy swiper-slide\" data-swiper-slide-index=\"" + index + "\">\n <div class=\"preloader swiper-lazy-preloader " + (pb.params.theme === 'dark' ? 'color-white' : '') + "\">" + (Utils[((pb.app.theme) + "PreloaderContent")] || '') + "</div>\n <span class=\"swiper-zoom-container\">\n <img data-src=\"" + (photo.url ? photo.url : photo) + "\" class=\"swiper-lazy\">\n </span>\n </div>\n ").trim();
33175 return photoHtml;
33176 };
33177
33178 PhotoBrowser.prototype.renderPhoto = function renderPhoto (photo, index) {
33179 var pb = this;
33180 if (pb.params.renderPhoto) { return pb.params.renderPhoto.call(pb, photo, index); }
33181 var photoHtml = ("\n <div class=\"photo-browser-slide swiper-slide\" data-swiper-slide-index=\"" + index + "\">\n <span class=\"swiper-zoom-container\">\n <img src=\"" + (photo.url ? photo.url : photo) + "\">\n </span>\n </div>\n ").trim();
33182 return photoHtml;
33183 };
33184
33185 PhotoBrowser.prototype.render = function render () {
33186 var pb = this;
33187 if (pb.params.render) { return pb.params.render.call(pb, pb.params); }
33188 var html = ("\n <div class=\"photo-browser photo-browser-" + (pb.params.theme) + "\">\n <div class=\"view\">\n <div class=\"page photo-browser-page photo-browser-page-" + (pb.params.theme) + " no-toolbar " + (!pb.params.navbar ? 'no-navbar' : '') + "\" data-name=\"photo-browser-page\">\n " + (pb.params.navbar ? pb.renderNavbar() : '') + "\n " + (pb.params.toolbar ? pb.renderToolbar() : '') + "\n <div class=\"photo-browser-captions photo-browser-captions-" + (pb.params.captionsTheme || pb.params.theme) + "\">\n " + (pb.params.photos.map(function (photo, index) {
33189 if (photo.caption) { return pb.renderCaption(photo.caption, index); }
33190 return '';
33191 }).join(' ')) + "\n </div>\n <div class=\"photo-browser-swiper-container swiper-container\">\n <div class=\"photo-browser-swiper-wrapper swiper-wrapper\">\n " + (pb.params.virtualSlides ? '' : pb.params.photos.map(function (photo, index) {
33192 if (photo.html || ((typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0)) {
33193 return pb.renderObject(photo, index);
33194 }
33195 if (pb.params.swiper.lazy === true || (pb.params.swiper.lazy && pb.params.swiper.lazy.enabled)) {
33196 return pb.renderLazyPhoto(photo, index);
33197 }
33198 return pb.renderPhoto(photo, index);
33199 }).join(' ')) + "\n </div>\n </div>\n </div>\n </div>\n </div>\n ").trim();
33200 return html;
33201 };
33202
33203 PhotoBrowser.prototype.renderStandalone = function renderStandalone () {
33204 var pb = this;
33205 if (pb.params.renderStandalone) { return pb.params.renderStandalone.call(pb); }
33206 var standaloneHtml = "<div class=\"popup photo-browser-popup photo-browser-standalone popup-tablet-fullscreen\">" + (pb.render()) + "</div>";
33207 return standaloneHtml;
33208 };
33209
33210 PhotoBrowser.prototype.renderPage = function renderPage () {
33211 var pb = this;
33212 if (pb.params.renderPage) { return pb.params.renderPage.call(pb); }
33213 var pageHtml = pb.render();
33214
33215 return pageHtml;
33216 };
33217
33218 PhotoBrowser.prototype.renderPopup = function renderPopup () {
33219 var pb = this;
33220 if (pb.params.renderPopup) { return pb.params.renderPopup.call(pb); }
33221 var popupHtml = "<div class=\"popup photo-browser-popup\">" + (pb.render()) + "</div>";
33222
33223 return popupHtml;
33224 };
33225
33226 // Callbacks
33227 PhotoBrowser.prototype.onOpen = function onOpen (type, el) {
33228 var pb = this;
33229 var app = pb.app;
33230 var $el = $(el);
33231
33232 $el[0].f7PhotoBrowser = pb;
33233
33234 pb.$el = $el;
33235 pb.el = $el[0];
33236 pb.openedIn = type;
33237 pb.opened = true;
33238
33239 pb.$swiperContainerEl = pb.$el.find('.photo-browser-swiper-container');
33240 pb.$swiperWrapperEl = pb.$el.find('.photo-browser-swiper-wrapper');
33241 pb.slides = pb.$el.find('.photo-browser-slide');
33242 pb.$captionsContainerEl = pb.$el.find('.photo-browser-captions');
33243 pb.captions = pb.$el.find('.photo-browser-caption');
33244
33245 // Init Swiper
33246 var swiperParams = Utils.extend({}, pb.params.swiper, {
33247 initialSlide: pb.activeIndex,
33248 on: {
33249 tap: function tap(e) {
33250 pb.emit('local::tap', e);
33251 },
33252 click: function click(e) {
33253 if (pb.params.exposition) {
33254 pb.expositionToggle();
33255 }
33256 pb.emit('local::click', e);
33257 },
33258 doubleTap: function doubleTap(e) {
33259 pb.emit('local::doubleTap', e);
33260 },
33261 slideChange: function slideChange() {
33262 var args = [], len = arguments.length;
33263 while ( len-- ) args[ len ] = arguments[ len ];
33264
33265 var swiper = this;
33266 pb.onSlideChange(swiper);
33267 pb.emit.apply(pb, [ 'local::slideChange' ].concat( args ));
33268 },
33269 transitionStart: function transitionStart() {
33270 var args = [], len = arguments.length;
33271 while ( len-- ) args[ len ] = arguments[ len ];
33272
33273 pb.emit.apply(pb, [ 'local::transitionStart' ].concat( args ));
33274 },
33275 transitionEnd: function transitionEnd() {
33276 var args = [], len = arguments.length;
33277 while ( len-- ) args[ len ] = arguments[ len ];
33278
33279 pb.emit.apply(pb, [ 'local::transitionEnd' ].concat( args ));
33280 },
33281 slideChangeTransitionStart: function slideChangeTransitionStart() {
33282 var args = [], len = arguments.length;
33283 while ( len-- ) args[ len ] = arguments[ len ];
33284
33285 pb.emit.apply(pb, [ 'local::slideChangeTransitionStart' ].concat( args ));
33286 },
33287 slideChangeTransitionEnd: function slideChangeTransitionEnd() {
33288 var args = [], len = arguments.length;
33289 while ( len-- ) args[ len ] = arguments[ len ];
33290
33291 pb.emit.apply(pb, [ 'local::slideChangeTransitionEnd' ].concat( args ));
33292 },
33293 lazyImageLoad: function lazyImageLoad() {
33294 var args = [], len = arguments.length;
33295 while ( len-- ) args[ len ] = arguments[ len ];
33296
33297 pb.emit.apply(pb, [ 'local::lazyImageLoad' ].concat( args ));
33298 },
33299 lazyImageReady: function lazyImageReady() {
33300 var args = [], len = arguments.length;
33301 while ( len-- ) args[ len ] = arguments[ len ];
33302
33303 var slideEl = args[0];
33304 $(slideEl).removeClass('photo-browser-slide-lazy');
33305 pb.emit.apply(pb, [ 'local::lazyImageReady' ].concat( args ));
33306 },
33307 },
33308 });
33309 if (pb.params.swipeToClose && pb.params.type !== 'page') {
33310 Utils.extend(swiperParams.on, {
33311 touchStart: function touchStart(e) {
33312 pb.onTouchStart(e);
33313 pb.emit('local::touchStart', e);
33314 },
33315 touchMoveOpposite: function touchMoveOpposite(e) {
33316 pb.onTouchMove(e);
33317 pb.emit('local::touchMoveOpposite', e);
33318 },
33319 touchEnd: function touchEnd(e) {
33320 pb.onTouchEnd(e);
33321 pb.emit('local::touchEnd', e);
33322 },
33323 });
33324 }
33325 if (pb.params.virtualSlides) {
33326 Utils.extend(swiperParams, {
33327 virtual: {
33328 slides: pb.params.photos,
33329 renderSlide: function renderSlide(photo, index) {
33330 if (photo.html || ((typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0)) {
33331 return pb.renderObject(photo, index);
33332 }
33333 if (pb.params.swiper.lazy === true || (pb.params.swiper.lazy && pb.params.swiper.lazy.enabled)) {
33334 return pb.renderLazyPhoto(photo, index);
33335 }
33336 return pb.renderPhoto(photo, index);
33337 },
33338 },
33339 });
33340 }
33341
33342 pb.swiper = app.swiper.create(pb.$swiperContainerEl, swiperParams);
33343
33344 if (pb.activeIndex === 0) {
33345 pb.onSlideChange(pb.swiper);
33346 }
33347 if (pb.$el) {
33348 pb.$el.trigger('photobrowser:open');
33349 }
33350 pb.emit('local::open photoBrowserOpen', pb);
33351 };
33352
33353 PhotoBrowser.prototype.onOpened = function onOpened () {
33354 var pb = this;
33355
33356 if (pb.$el) {
33357 pb.$el.trigger('photobrowser:opened');
33358 }
33359 pb.emit('local::opened photoBrowserOpened', pb);
33360 };
33361
33362 PhotoBrowser.prototype.onClose = function onClose () {
33363 var pb = this;
33364 if (pb.destroyed) { return; }
33365
33366 // Destroy Swiper
33367 if (pb.swiper && pb.swiper.destroy) {
33368 pb.swiper.destroy(true, false);
33369 pb.swiper = null;
33370 delete pb.swiper;
33371 }
33372 if (pb.$el) {
33373 pb.$el.trigger('photobrowser:close');
33374 }
33375 pb.emit('local::close photoBrowserClose', pb);
33376 };
33377
33378 PhotoBrowser.prototype.onClosed = function onClosed () {
33379 var pb = this;
33380 if (pb.destroyed) { return; }
33381 pb.opened = false;
33382 pb.$el = null;
33383 pb.el = null;
33384 delete pb.$el;
33385 delete pb.el;
33386 if (pb.$el) {
33387 pb.$el.trigger('photobrowser:closed');
33388 }
33389 pb.emit('local::closed photoBrowserClosed', pb);
33390 };
33391
33392 // Open
33393 PhotoBrowser.prototype.openPage = function openPage () {
33394 var pb = this;
33395 if (pb.opened) { return pb; }
33396
33397 var pageHtml = pb.renderPage();
33398
33399 pb.view.router.navigate({
33400 url: pb.url,
33401 route: {
33402 content: pageHtml,
33403 path: pb.url,
33404 on: {
33405 pageBeforeIn: function pageBeforeIn(e, page) {
33406 pb.view.$el.addClass(("with-photo-browser-page with-photo-browser-page-" + (pb.params.theme)));
33407 pb.onOpen('page', page.el);
33408 },
33409 pageAfterIn: function pageAfterIn(e, page) {
33410 pb.onOpened('page', page.el);
33411 },
33412 pageBeforeOut: function pageBeforeOut(e, page) {
33413 pb.view.$el.removeClass(("with-photo-browser-page with-photo-browser-page-exposed with-photo-browser-page-" + (pb.params.theme)));
33414 pb.onClose('page', page.el);
33415 },
33416 pageAfterOut: function pageAfterOut(e, page) {
33417 pb.onClosed('page', page.el);
33418 },
33419 },
33420 },
33421 });
33422 return pb;
33423 };
33424
33425 PhotoBrowser.prototype.openStandalone = function openStandalone () {
33426 var pb = this;
33427 if (pb.opened) { return pb; }
33428
33429 var standaloneHtml = pb.renderStandalone();
33430
33431 var popupParams = {
33432 backdrop: false,
33433 content: standaloneHtml,
33434 on: {
33435 popupOpen: function popupOpen(popup) {
33436 pb.onOpen('popup', popup.el);
33437 },
33438 popupOpened: function popupOpened(popup) {
33439 pb.onOpened('popup', popup.el);
33440 },
33441 popupClose: function popupClose(popup) {
33442 pb.onClose('popup', popup.el);
33443 },
33444 popupClosed: function popupClosed(popup) {
33445 pb.onClosed('popup', popup.el);
33446 },
33447 },
33448 };
33449
33450 if (pb.params.routableModals) {
33451 pb.view.router.navigate({
33452 url: pb.url,
33453 route: {
33454 path: pb.url,
33455 popup: popupParams,
33456 },
33457 });
33458 } else {
33459 pb.modal = pb.app.popup.create(popupParams).open();
33460 }
33461 return pb;
33462 };
33463
33464 PhotoBrowser.prototype.openPopup = function openPopup () {
33465 var pb = this;
33466 if (pb.opened) { return pb; }
33467
33468 var popupHtml = pb.renderPopup();
33469
33470 var popupParams = {
33471 content: popupHtml,
33472 on: {
33473 popupOpen: function popupOpen(popup) {
33474 pb.onOpen('popup', popup.el);
33475 },
33476 popupOpened: function popupOpened(popup) {
33477 pb.onOpened('popup', popup.el);
33478 },
33479 popupClose: function popupClose(popup) {
33480 pb.onClose('popup', popup.el);
33481 },
33482 popupClosed: function popupClosed(popup) {
33483 pb.onClosed('popup', popup.el);
33484 },
33485 },
33486 };
33487
33488 if (pb.params.routableModals) {
33489 pb.view.router.navigate({
33490 url: pb.url,
33491 route: {
33492 path: pb.url,
33493 popup: popupParams,
33494 },
33495 });
33496 } else {
33497 pb.modal = pb.app.popup.create(popupParams).open();
33498 }
33499 return pb;
33500 };
33501
33502 // Exposition
33503 PhotoBrowser.prototype.expositionEnable = function expositionEnable () {
33504 var pb = this;
33505 if (pb.params.type === 'page') {
33506 pb.view.$el.addClass('with-photo-browser-page-exposed');
33507 }
33508 if (pb.$el) { pb.$el.addClass('photo-browser-exposed'); }
33509 if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.addClass('photo-browser-captions-exposed'); }
33510 pb.exposed = true;
33511 return pb;
33512 };
33513
33514 PhotoBrowser.prototype.expositionDisable = function expositionDisable () {
33515 var pb = this;
33516 if (pb.params.type === 'page') {
33517 pb.view.$el.removeClass('with-photo-browser-page-exposed');
33518 }
33519 if (pb.$el) { pb.$el.removeClass('photo-browser-exposed'); }
33520 if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.removeClass('photo-browser-captions-exposed'); }
33521 pb.exposed = false;
33522 return pb;
33523 };
33524
33525 PhotoBrowser.prototype.expositionToggle = function expositionToggle () {
33526 var pb = this;
33527 if (pb.params.type === 'page') {
33528 pb.view.$el.toggleClass('with-photo-browser-page-exposed');
33529 }
33530 if (pb.$el) { pb.$el.toggleClass('photo-browser-exposed'); }
33531 if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.toggleClass('photo-browser-captions-exposed'); }
33532 pb.exposed = !pb.exposed;
33533 return pb;
33534 };
33535
33536 PhotoBrowser.prototype.open = function open (index) {
33537 var pb = this;
33538 var type = pb.params.type;
33539 if (pb.opened) {
33540 if (pb.swiper && typeof index !== 'undefined') {
33541 pb.swiper.slideTo(parseInt(index, 10));
33542 }
33543 return pb;
33544 }
33545 if (typeof index !== 'undefined') {
33546 pb.activeIndex = index;
33547 }
33548 if (type === 'standalone') {
33549 pb.openStandalone();
33550 }
33551 if (type === 'page') {
33552 pb.openPage();
33553 }
33554 if (type === 'popup') {
33555 pb.openPopup();
33556 }
33557 return pb;
33558 };
33559
33560 PhotoBrowser.prototype.close = function close () {
33561 var pb = this;
33562 if (!pb.opened) { return pb; }
33563 if (pb.params.routableModals || pb.openedIn === 'page') {
33564 if (pb.view) { pb.view.router.back(); }
33565 } else {
33566 pb.modal.once('modalClosed', function () {
33567 Utils.nextTick(function () {
33568 pb.modal.destroy();
33569 delete pb.modal;
33570 });
33571 });
33572 pb.modal.close();
33573 }
33574 return pb;
33575 };
33576 // eslint-disable-next-line
33577 PhotoBrowser.prototype.init = function init () {};
33578
33579 PhotoBrowser.prototype.destroy = function destroy () {
33580 var pb = this;
33581 pb.emit('local::beforeDestroy photoBrowserBeforeDestroy', pb);
33582 if (pb.$el) {
33583 pb.$el.trigger('photobrowser:beforedestroy');
33584 pb.$el[0].f7PhotoBrowser = null;
33585 delete pb.$el[0].f7PhotoBrowser;
33586 }
33587 Utils.deleteProps(pb);
33588 pb = null;
33589 };
33590
33591 return PhotoBrowser;
33592 }(Framework7Class));
33593
33594 var PhotoBrowser$1 = {
33595 name: 'photoBrowser',
33596 params: {
33597 photoBrowser: {
33598 photos: [],
33599 exposition: true,
33600 expositionHideCaptions: false,
33601 type: 'standalone',
33602 navbar: true,
33603 toolbar: true,
33604 theme: 'light',
33605 captionsTheme: undefined,
33606 iconsColor: undefined,
33607 swipeToClose: true,
33608 backLinkText: 'Close',
33609 navbarOfText: 'of',
33610 view: undefined,
33611 url: 'photos/',
33612 routableModals: true,
33613 virtualSlides: true,
33614
33615 renderNavbar: undefined,
33616 renderToolbar: undefined,
33617 renderCaption: undefined,
33618 renderObject: undefined,
33619 renderLazyPhoto: undefined,
33620 renderPhoto: undefined,
33621 renderPage: undefined,
33622 renderPopup: undefined,
33623 renderStandalone: undefined,
33624
33625 swiper: {
33626 initialSlide: 0,
33627 spaceBetween: 20,
33628 speed: 300,
33629 loop: false,
33630 preloadImages: true,
33631 navigation: {
33632 nextEl: '.photo-browser-next',
33633 prevEl: '.photo-browser-prev',
33634 },
33635 zoom: {
33636 enabled: true,
33637 maxRatio: 3,
33638 minRatio: 1,
33639 },
33640 lazy: {
33641 enabled: true,
33642 },
33643 },
33644 },
33645 },
33646 create: function create() {
33647 var app = this;
33648 app.photoBrowser = ConstructorMethods({
33649 defaultSelector: '.photo-browser',
33650 constructor: PhotoBrowser,
33651 app: app,
33652 domProp: 'f7PhotoBrowser',
33653 });
33654 },
33655 static: {
33656 PhotoBrowser: PhotoBrowser,
33657 },
33658 };
33659
33660 var Notification = /*@__PURE__*/(function (Modal$$1) {
33661 function Notification(app, params) {
33662 var extendedParams = Utils.extend({
33663 on: {},
33664 }, app.params.notification, params);
33665
33666 // Extends with open/close Modal methods;
33667 Modal$$1.call(this, app, extendedParams);
33668
33669 var notification = this;
33670
33671 notification.app = app;
33672
33673 notification.params = extendedParams;
33674
33675 var ref = notification.params;
33676 var icon = ref.icon;
33677 var title = ref.title;
33678 var titleRightText = ref.titleRightText;
33679 var subtitle = ref.subtitle;
33680 var text = ref.text;
33681 var closeButton = ref.closeButton;
33682 var closeTimeout = ref.closeTimeout;
33683 var cssClass = ref.cssClass;
33684 var closeOnClick = ref.closeOnClick;
33685
33686 var $el;
33687 if (!notification.params.el) {
33688 // Find Element
33689 var notificationHtml = notification.render({
33690 icon: icon,
33691 title: title,
33692 titleRightText: titleRightText,
33693 subtitle: subtitle,
33694 text: text,
33695 closeButton: closeButton,
33696 cssClass: cssClass,
33697 });
33698
33699 $el = $(notificationHtml);
33700 } else {
33701 $el = $(notification.params.el);
33702 }
33703
33704 if ($el && $el.length > 0 && $el[0].f7Modal) {
33705 return $el[0].f7Modal;
33706 }
33707
33708 if ($el.length === 0) {
33709 return notification.destroy();
33710 }
33711
33712 Utils.extend(notification, {
33713 $el: $el,
33714 el: $el[0],
33715 type: 'notification',
33716 });
33717
33718 $el[0].f7Modal = notification;
33719
33720 if (closeButton) {
33721 $el.find('.notification-close-button').on('click', function () {
33722 notification.close();
33723 });
33724 }
33725 $el.on('click', function (e) {
33726 if (closeButton && $(e.target).closest('.notification-close-button').length) {
33727 return;
33728 }
33729 notification.emit('local::click notificationClick', notification);
33730 if (closeOnClick) { notification.close(); }
33731 });
33732
33733 notification.on('beforeDestroy', function () {
33734 $el.off('click');
33735 });
33736
33737 /* Touch Events */
33738 var isTouched;
33739 var isMoved;
33740 var isScrolling;
33741 var touchesDiff;
33742 var touchStartTime;
33743 var notificationHeight;
33744 var touchesStart = {};
33745 function handleTouchStart(e) {
33746 if (isTouched) { return; }
33747 isTouched = true;
33748 isMoved = false;
33749 isScrolling = undefined;
33750 touchStartTime = Utils.now();
33751 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
33752 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
33753 }
33754 function handleTouchMove(e) {
33755 if (!isTouched) { return; }
33756 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
33757 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
33758 if (typeof isScrolling === 'undefined') {
33759 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) < Math.abs(pageX - touchesStart.x));
33760 }
33761 if (isScrolling) {
33762 isTouched = false;
33763 return;
33764 }
33765 e.preventDefault();
33766 if (!isMoved) {
33767 notification.$el.removeClass('notification-transitioning');
33768 notification.$el.transition(0);
33769 notificationHeight = notification.$el[0].offsetHeight / 2;
33770 }
33771 isMoved = true;
33772 touchesDiff = (pageY - touchesStart.y);
33773 var newTranslate = touchesDiff;
33774 if (touchesDiff > 0) {
33775 newTranslate = Math.pow( touchesDiff, 0.8 );
33776 }
33777 notification.$el.transform(("translate3d(0, " + newTranslate + "px, 0)"));
33778 }
33779 function handleTouchEnd() {
33780 if (!isTouched || !isMoved) {
33781 isTouched = false;
33782 isMoved = false;
33783 return;
33784 }
33785 isTouched = false;
33786 isMoved = false;
33787 if (touchesDiff === 0) {
33788 return;
33789 }
33790
33791 var timeDiff = Utils.now() - touchStartTime;
33792 notification.$el.transition('');
33793 notification.$el.addClass('notification-transitioning');
33794 notification.$el.transform('');
33795
33796 if (
33797 (touchesDiff < -10 && timeDiff < 300)
33798 || (-touchesDiff >= notificationHeight / 1)
33799 ) {
33800 notification.close();
33801 }
33802 }
33803
33804 function attachTouchEvents() {
33805 {
33806 notification.$el.on(app.touchEvents.start, handleTouchStart, { passive: true });
33807 app.on('touchmove:active', handleTouchMove);
33808 app.on('touchend:passive', handleTouchEnd);
33809 }
33810 }
33811 function detachTouchEvents() {
33812 {
33813 notification.$el.off(app.touchEvents.start, handleTouchStart, { passive: true });
33814 app.off('touchmove:active', handleTouchMove);
33815 app.off('touchend:passive', handleTouchEnd);
33816 }
33817 }
33818
33819 var timeoutId;
33820 function closeOnTimeout() {
33821 timeoutId = Utils.nextTick(function () {
33822 if (isTouched && isMoved) {
33823 closeOnTimeout();
33824 return;
33825 }
33826 notification.close();
33827 }, closeTimeout);
33828 }
33829 notification.on('open', function () {
33830 if (notification.params.swipeToClose) {
33831 attachTouchEvents();
33832 }
33833 $('.notification.modal-in').each(function (index, openedEl) {
33834 var notificationInstance = app.notification.get(openedEl);
33835 if (openedEl !== notification.el && notificationInstance) {
33836 notificationInstance.close();
33837 }
33838 });
33839 if (closeTimeout) {
33840 closeOnTimeout();
33841 }
33842 });
33843 notification.on('close beforeDestroy', function () {
33844 if (notification.params.swipeToClose) {
33845 detachTouchEvents();
33846 }
33847 win.clearTimeout(timeoutId);
33848 });
33849
33850 return notification;
33851 }
33852
33853 if ( Modal$$1 ) Notification.__proto__ = Modal$$1;
33854 Notification.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
33855 Notification.prototype.constructor = Notification;
33856
33857 Notification.prototype.render = function render () {
33858 var notification = this;
33859 if (notification.params.render) { return notification.params.render.call(notification, notification); }
33860 var ref = notification.params;
33861 var icon = ref.icon;
33862 var title = ref.title;
33863 var titleRightText = ref.titleRightText;
33864 var subtitle = ref.subtitle;
33865 var text = ref.text;
33866 var closeButton = ref.closeButton;
33867 var cssClass = ref.cssClass;
33868 return ("\n <div class=\"notification " + (cssClass || '') + "\">\n <div class=\"notification-header\">\n " + (icon ? ("<div class=\"notification-icon\">" + icon + "</div>") : '') + "\n " + (title ? ("<div class=\"notification-title\">" + title + "</div>") : '') + "\n " + (titleRightText ? ("<div class=\"notification-title-right-text\">" + titleRightText + "</div>") : '') + "\n " + (closeButton ? '<span class="notification-close-button"></span>' : '') + "\n </div>\n <div class=\"notification-content\">\n " + (subtitle ? ("<div class=\"notification-subtitle\">" + subtitle + "</div>") : '') + "\n " + (text ? ("<div class=\"notification-text\">" + text + "</div>") : '') + "\n </div>\n </div>\n ").trim();
33869 };
33870
33871 return Notification;
33872 }(Modal));
33873
33874 var Notification$1 = {
33875 name: 'notification',
33876 static: {
33877 Notification: Notification,
33878 },
33879 create: function create() {
33880 var app = this;
33881 app.notification = Utils.extend(
33882 {},
33883 ModalMethods({
33884 app: app,
33885 constructor: Notification,
33886 defaultSelector: '.notification.modal-in',
33887 })
33888 );
33889 },
33890 params: {
33891 notification: {
33892 icon: null,
33893 title: null,
33894 titleRightText: null,
33895 subtitle: null,
33896 text: null,
33897 closeButton: false,
33898 closeTimeout: null,
33899 closeOnClick: false,
33900 swipeToClose: true,
33901 cssClass: null,
33902 render: null,
33903 },
33904 },
33905 };
33906
33907 /* eslint "no-useless-escape": "off" */
33908
33909 var Autocomplete = /*@__PURE__*/(function (Framework7Class$$1) {
33910 function Autocomplete(app, params) {
33911 if ( params === void 0 ) params = {};
33912
33913 Framework7Class$$1.call(this, params, [app]);
33914
33915 var ac = this;
33916 ac.app = app;
33917
33918 var defaults = Utils.extend({
33919 on: {},
33920 }, app.params.autocomplete);
33921
33922
33923 // Extend defaults with modules params
33924 ac.useModulesParams(defaults);
33925
33926 ac.params = Utils.extend(defaults, params);
33927
33928 var $openerEl;
33929 if (ac.params.openerEl) {
33930 $openerEl = $(ac.params.openerEl);
33931 if ($openerEl.length) { $openerEl[0].f7Autocomplete = ac; }
33932 }
33933
33934 var $inputEl;
33935 if (ac.params.inputEl) {
33936 $inputEl = $(ac.params.inputEl);
33937 if ($inputEl.length) { $inputEl[0].f7Autocomplete = ac; }
33938 }
33939
33940 var view;
33941 if (ac.params.view) {
33942 view = ac.params.view;
33943 } else if ($openerEl || $inputEl) {
33944 view = app.views.get($openerEl || $inputEl);
33945 }
33946 if (!view) { view = app.views.main; }
33947
33948 var id = Utils.id();
33949
33950 var url = params.url;
33951 if (!url && $openerEl && $openerEl.length) {
33952 if ($openerEl.attr('href')) { url = $openerEl.attr('href'); }
33953 else if ($openerEl.find('a').length > 0) {
33954 url = $openerEl.find('a').attr('href');
33955 }
33956 }
33957 if (!url || url === '#' || url === '') { url = ac.params.url; }
33958
33959 var inputType = ac.params.multiple ? 'checkbox' : 'radio';
33960
33961 Utils.extend(ac, {
33962 $openerEl: $openerEl,
33963 openerEl: $openerEl && $openerEl[0],
33964 $inputEl: $inputEl,
33965 inputEl: $inputEl && $inputEl[0],
33966 id: id,
33967 view: view,
33968 url: url,
33969 value: ac.params.value || [],
33970 inputType: inputType,
33971 inputName: (inputType + "-" + id),
33972 $modalEl: undefined,
33973 $dropdownEl: undefined,
33974 });
33975
33976 var previousQuery = '';
33977 function onInputChange() {
33978 var query = ac.$inputEl.val().trim();
33979
33980 if (!ac.params.source) { return; }
33981 ac.params.source.call(ac, query, function (items) {
33982 var itemsHTML = '';
33983 var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
33984 ac.items = items;
33985 var regExp;
33986 if (ac.params.highlightMatches) {
33987 query = query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
33988 regExp = new RegExp(("(" + query + ")"), 'i');
33989 }
33990
33991 var firstValue;
33992 var firstItem;
33993 for (var i = 0; i < limit; i += 1) {
33994 var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
33995 var itemText = typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i];
33996 if (i === 0) {
33997 firstValue = itemValue;
33998 firstItem = ac.items[i];
33999 }
34000 itemsHTML += ac.renderItem({
34001 value: itemValue,
34002 text: ac.params.highlightMatches ? itemText.replace(regExp, '<b>$1</b>') : itemText,
34003 }, i);
34004 }
34005 if (itemsHTML === '' && query === '' && ac.params.dropdownPlaceholderText) {
34006 itemsHTML += ac.renderItem({
34007 placeholder: true,
34008 text: ac.params.dropdownPlaceholderText,
34009 });
34010 }
34011 ac.$dropdownEl.find('ul').html(itemsHTML);
34012 if (ac.params.typeahead) {
34013 if (!firstValue || !firstItem) {
34014 return;
34015 }
34016 if (firstValue.toLowerCase().indexOf(query.toLowerCase()) !== 0) {
34017 return;
34018 }
34019 if (previousQuery.toLowerCase() === query.toLowerCase()) {
34020 ac.value = [];
34021 return;
34022 }
34023
34024 if (previousQuery.toLowerCase().indexOf(query.toLowerCase()) === 0) {
34025 previousQuery = query;
34026 ac.value = [];
34027 return;
34028 }
34029 $inputEl.val(firstValue);
34030 $inputEl[0].setSelectionRange(query.length, firstValue.length);
34031
34032 var previousValue = typeof ac.value[0] === 'object' ? ac.value[0][ac.params.valueProperty] : ac.value[0];
34033 if (!previousValue || firstValue.toLowerCase() !== previousValue.toLowerCase()) {
34034 ac.value = [firstItem];
34035 ac.emit('local::change autocompleteChange', [firstItem]);
34036 }
34037 }
34038
34039 previousQuery = query;
34040 });
34041 }
34042 function onPageInputChange() {
34043 var input = this;
34044 var value = input.value;
34045 var isValues = $(input).parents('.autocomplete-values').length > 0;
34046 var item;
34047 var itemValue;
34048 var aValue;
34049 if (isValues) {
34050 if (ac.inputType === 'checkbox' && !input.checked) {
34051 for (var i = 0; i < ac.value.length; i += 1) {
34052 aValue = typeof ac.value[i] === 'string' ? ac.value[i] : ac.value[i][ac.params.valueProperty];
34053 if (aValue === value || aValue * 1 === value * 1) {
34054 ac.value.splice(i, 1);
34055 }
34056 }
34057 ac.updateValues();
34058 ac.emit('local::change autocompleteChange', ac.value);
34059 }
34060 return;
34061 }
34062
34063 // Find Related Item
34064 for (var i$1 = 0; i$1 < ac.items.length; i$1 += 1) {
34065 itemValue = typeof ac.items[i$1] === 'object' ? ac.items[i$1][ac.params.valueProperty] : ac.items[i$1];
34066 if (itemValue === value || itemValue * 1 === value * 1) { item = ac.items[i$1]; }
34067 }
34068 if (ac.inputType === 'radio') {
34069 ac.value = [item];
34070 } else if (input.checked) {
34071 ac.value.push(item);
34072 } else {
34073 for (var i$2 = 0; i$2 < ac.value.length; i$2 += 1) {
34074 aValue = typeof ac.value[i$2] === 'object' ? ac.value[i$2][ac.params.valueProperty] : ac.value[i$2];
34075 if (aValue === value || aValue * 1 === value * 1) {
34076 ac.value.splice(i$2, 1);
34077 }
34078 }
34079 }
34080
34081 // Update Values Block
34082 ac.updateValues();
34083
34084 // On Select Callback
34085 if (((ac.inputType === 'radio' && input.checked) || ac.inputType === 'checkbox')) {
34086 ac.emit('local::change autocompleteChange', ac.value);
34087 }
34088 }
34089 function onHtmlClick(e) {
34090 var $targetEl = $(e.target);
34091 if ($targetEl.is(ac.$inputEl[0]) || (ac.$dropdownEl && $targetEl.closest(ac.$dropdownEl[0]).length)) { return; }
34092 ac.close();
34093 }
34094 function onOpenerClick() {
34095 ac.open();
34096 }
34097 function onInputFocus() {
34098 ac.open();
34099 }
34100 function onInputBlur() {
34101 if (ac.$dropdownEl.find('label.active-state').length > 0) { return; }
34102 ac.close();
34103 }
34104 function onResize() {
34105 ac.positionDropdown();
34106 }
34107
34108 function onKeyDown(e) {
34109 if (ac.opened && e.keyCode === 13) {
34110 e.preventDefault();
34111 ac.$inputEl.blur();
34112 }
34113 }
34114 function onDropdownclick() {
34115 var $clickedEl = $(this);
34116 var clickedItem;
34117 for (var i = 0; i < ac.items.length; i += 1) {
34118 var itemValue = typeof ac.items[i] === 'object' ? ac.items[i][ac.params.valueProperty] : ac.items[i];
34119 var value = $clickedEl.attr('data-value');
34120 if (itemValue === value || itemValue * 1 === value * 1) {
34121 clickedItem = ac.items[i];
34122 }
34123 }
34124 if (ac.params.updateInputValueOnSelect) {
34125 ac.$inputEl.val(typeof clickedItem === 'object' ? clickedItem[ac.params.valueProperty] : clickedItem);
34126 ac.$inputEl.trigger('input change');
34127 }
34128 ac.value = [clickedItem];
34129 ac.emit('local::change autocompleteChange', [clickedItem]);
34130
34131 ac.close();
34132 }
34133
34134 ac.attachEvents = function attachEvents() {
34135 if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
34136 ac.$openerEl.on('click', onOpenerClick);
34137 }
34138 if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
34139 ac.$inputEl.on('focus', onInputFocus);
34140 ac.$inputEl.on(ac.params.inputEvents, onInputChange);
34141 if (app.device.android) {
34142 $('html').on('click', onHtmlClick);
34143 } else {
34144 ac.$inputEl.on('blur', onInputBlur);
34145 }
34146 if (ac.params.typeahead) {
34147 ac.$inputEl.on('keydown', onKeyDown);
34148 }
34149 }
34150 };
34151 ac.detachEvents = function attachEvents() {
34152 if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
34153 ac.$openerEl.off('click', onOpenerClick);
34154 }
34155 if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
34156 ac.$inputEl.off('focus', onInputFocus);
34157 ac.$inputEl.off(ac.params.inputEvents, onInputChange);
34158 if (app.device.android) {
34159 $('html').off('click', onHtmlClick);
34160 } else {
34161 ac.$inputEl.off('blur', onInputBlur);
34162 }
34163 if (ac.params.typeahead) {
34164 ac.$inputEl.off('keydown', onKeyDown);
34165 }
34166 }
34167 };
34168 ac.attachDropdownEvents = function attachDropdownEvents() {
34169 ac.$dropdownEl.on('click', 'label', onDropdownclick);
34170 app.on('resize', onResize);
34171 };
34172 ac.detachDropdownEvents = function detachDropdownEvents() {
34173 ac.$dropdownEl.off('click', 'label', onDropdownclick);
34174 app.off('resize', onResize);
34175 };
34176
34177 ac.attachPageEvents = function attachPageEvents() {
34178 ac.$el.on('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
34179 if (ac.params.closeOnSelect && !ac.params.multiple) {
34180 ac.$el.once('click', '.list label', function () {
34181 Utils.nextTick(function () {
34182 ac.close();
34183 });
34184 });
34185 }
34186 };
34187 ac.detachPageEvents = function detachPageEvents() {
34188 ac.$el.off('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
34189 };
34190
34191 // Install Modules
34192 ac.useModules();
34193
34194 // Init
34195 ac.init();
34196
34197 return ac;
34198 }
34199
34200 if ( Framework7Class$$1 ) Autocomplete.__proto__ = Framework7Class$$1;
34201 Autocomplete.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
34202 Autocomplete.prototype.constructor = Autocomplete;
34203
34204 Autocomplete.prototype.positionDropdown = function positionDropdown () {
34205 var obj;
34206
34207 var ac = this;
34208 var $inputEl = ac.$inputEl;
34209 var app = ac.app;
34210 var $dropdownEl = ac.$dropdownEl;
34211
34212 var $pageContentEl = $inputEl.parents('.page-content');
34213 if ($pageContentEl.length === 0) { return; }
34214 var inputOffset = $inputEl.offset();
34215 var inputOffsetWidth = $inputEl[0].offsetWidth;
34216 var inputOffsetHeight = $inputEl[0].offsetHeight;
34217 var $listEl = $inputEl.parents('.list');
34218
34219 var $listParent;
34220 $listEl.parents().each(function (index, parentEl) {
34221 if ($listParent) { return; }
34222 var $parentEl = $(parentEl);
34223 if ($parentEl.parent($pageContentEl).length) { $listParent = $parentEl; }
34224 });
34225
34226 var listOffset = $listEl.offset();
34227 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
34228 var listOffsetLeft = $listEl.length > 0 ? listOffset.left - $pageContentEl.offset().left : 0;
34229 var inputOffsetLeft = inputOffset.left - ($listEl.length > 0 ? listOffset.left : 0) - (app.rtl ? 0 : 0);
34230 var inputOffsetTop = inputOffset.top - ($pageContentEl.offset().top - $pageContentEl[0].scrollTop);
34231
34232 var maxHeight = $pageContentEl[0].scrollHeight - paddingBottom - (inputOffsetTop + $pageContentEl[0].scrollTop) - $inputEl[0].offsetHeight;
34233
34234 var paddingProp = app.rtl ? 'padding-right' : 'padding-left';
34235 var paddingValue;
34236 if ($listEl.length && !ac.params.expandInput) {
34237 paddingValue = (app.rtl ? $listEl[0].offsetWidth - inputOffsetLeft - inputOffsetWidth : inputOffsetLeft) - (app.theme === 'md' ? 16 : 15);
34238 }
34239
34240 $dropdownEl.css({
34241 left: (($listEl.length > 0 ? listOffsetLeft : inputOffsetLeft) + "px"),
34242 top: ((inputOffsetTop + $pageContentEl[0].scrollTop + inputOffsetHeight) + "px"),
34243 width: (($listEl.length > 0 ? $listEl[0].offsetWidth : inputOffsetWidth) + "px"),
34244 });
34245 $dropdownEl.children('.autocomplete-dropdown-inner').css(( obj = {
34246 maxHeight: (maxHeight + "px")
34247 }, obj[paddingProp] = $listEl.length > 0 && !ac.params.expandInput ? (paddingValue + "px") : '', obj ));
34248 };
34249
34250 Autocomplete.prototype.focus = function focus () {
34251 var ac = this;
34252 ac.$el.find('input[type=search]').focus();
34253 };
34254
34255 Autocomplete.prototype.source = function source (query) {
34256 var ac = this;
34257 if (!ac.params.source) { return; }
34258
34259 var $el = ac.$el;
34260
34261 ac.params.source.call(ac, query, function (items) {
34262 var itemsHTML = '';
34263 var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
34264 ac.items = items;
34265 for (var i = 0; i < limit; i += 1) {
34266 var selected = false;
34267 var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
34268 for (var j = 0; j < ac.value.length; j += 1) {
34269 var aValue = typeof ac.value[j] === 'object' ? ac.value[j][ac.params.valueProperty] : ac.value[j];
34270 if (aValue === itemValue || aValue * 1 === itemValue * 1) { selected = true; }
34271 }
34272 itemsHTML += ac.renderItem({
34273 value: itemValue,
34274 text: typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i],
34275 inputType: ac.inputType,
34276 id: ac.id,
34277 inputName: ac.inputName,
34278 selected: selected,
34279 }, i);
34280 }
34281 $el.find('.autocomplete-found ul').html(itemsHTML);
34282 if (items.length === 0) {
34283 if (query.length !== 0) {
34284 $el.find('.autocomplete-not-found').show();
34285 $el.find('.autocomplete-found, .autocomplete-values').hide();
34286 } else {
34287 $el.find('.autocomplete-values').show();
34288 $el.find('.autocomplete-found, .autocomplete-not-found').hide();
34289 }
34290 } else {
34291 $el.find('.autocomplete-found').show();
34292 $el.find('.autocomplete-not-found, .autocomplete-values').hide();
34293 }
34294 });
34295 };
34296
34297 Autocomplete.prototype.updateValues = function updateValues () {
34298 var ac = this;
34299 var valuesHTML = '';
34300 for (var i = 0; i < ac.value.length; i += 1) {
34301 valuesHTML += ac.renderItem({
34302 value: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.valueProperty] : ac.value[i],
34303 text: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.textProperty] : ac.value[i],
34304 inputType: ac.inputType,
34305 id: ac.id,
34306 inputName: ((ac.inputName) + "-checked}"),
34307 selected: true,
34308 }, i);
34309 }
34310 ac.$el.find('.autocomplete-values ul').html(valuesHTML);
34311 };
34312
34313 Autocomplete.prototype.preloaderHide = function preloaderHide () {
34314 var ac = this;
34315 if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
34316 ac.$dropdownEl.find('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
34317 } else {
34318 $('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
34319 }
34320 };
34321
34322 Autocomplete.prototype.preloaderShow = function preloaderShow () {
34323 var ac = this;
34324 if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
34325 ac.$dropdownEl.find('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
34326 } else {
34327 $('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
34328 }
34329 };
34330
34331 Autocomplete.prototype.renderPreloader = function renderPreloader () {
34332 var ac = this;
34333 return ("\n <div class=\"autocomplete-preloader preloader " + (ac.params.preloaderColor ? ("color-" + (ac.params.preloaderColor)) : '') + "\">" + (Utils[((ac.app.theme) + "PreloaderContent")] || '') + "</div>\n ").trim();
34334 };
34335
34336 Autocomplete.prototype.renderSearchbar = function renderSearchbar () {
34337 var ac = this;
34338 if (ac.params.renderSearchbar) { return ac.params.renderSearchbar.call(ac); }
34339 var searchbarHTML = ("\n <form class=\"searchbar\">\n <div class=\"searchbar-inner\">\n <div class=\"searchbar-input-wrap\">\n <input type=\"search\" placeholder=\"" + (ac.params.searchbarPlaceholder) + "\"/>\n <i class=\"searchbar-icon\"></i>\n <span class=\"input-clear-button\"></span>\n </div>\n <span class=\"searchbar-disable-button\">" + (ac.params.searchbarDisableText) + "</span>\n </div>\n </form>\n ").trim();
34340 return searchbarHTML;
34341 };
34342
34343 Autocomplete.prototype.renderItem = function renderItem (item, index) {
34344 var ac = this;
34345 if (ac.params.renderItem) { return ac.params.renderItem.call(ac, item, index); }
34346 var itemHtml;
34347 var itemValue = item.value && typeof item.value === 'string' ? item.value.replace(/"/g, '&quot;') : item.value;
34348 if (ac.params.openIn !== 'dropdown') {
34349 itemHtml = "\n <li>\n <label class=\"item-" + (item.inputType) + " item-content\">\n <input type=\"" + (item.inputType) + "\" name=\"" + (item.inputName) + "\" value=\"" + itemValue + "\" " + (item.selected ? 'checked' : '') + ">\n <i class=\"icon icon-" + (item.inputType) + "\"></i>\n <div class=\"item-inner\">\n <div class=\"item-title\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
34350 } else if (!item.placeholder) {
34351 // Dropdown
34352 itemHtml = "\n <li>\n <label class=\"item-radio item-content\" data-value=\"" + itemValue + "\">\n <div class=\"item-inner\">\n <div class=\"item-title\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
34353 } else {
34354 // Dropwdown placeholder
34355 itemHtml = "\n <li class=\"autocomplete-dropdown-placeholder\">\n <label class=\"item-content\">\n <div class=\"item-inner\">\n <div class=\"item-title\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
34356 }
34357 return itemHtml.trim();
34358 };
34359
34360 Autocomplete.prototype.renderNavbar = function renderNavbar () {
34361 var ac = this;
34362 if (ac.params.renderNavbar) { return ac.params.renderNavbar.call(ac); }
34363 var pageTitle = ac.params.pageTitle;
34364 if (typeof pageTitle === 'undefined' && ac.$openerEl && ac.$openerEl.length) {
34365 pageTitle = ac.$openerEl.find('.item-title').text().trim();
34366 }
34367 var navbarHtml = ("\n <div class=\"navbar " + (ac.params.navbarColorTheme ? ("color-" + (ac.params.navbarColorTheme)) : '') + "\">\n <div class=\"navbar-inner " + (ac.params.navbarColorTheme ? ("color-" + (ac.params.navbarColorTheme)) : '') + "\">\n <div class=\"left sliding\">\n <a href=\"#\" class=\"link " + (ac.params.openIn === 'page' ? 'back' : 'popup-close') + "\" " + (ac.params.openIn === 'popup' ? 'data-popup=".autocomplete-popup"' : '') + ">\n <i class=\"icon icon-back\"></i>\n <span class=\"ios-only\">" + (ac.params.openIn === 'page' ? ac.params.pageBackLinkText : ac.params.popupCloseLinkText) + "</span>\n </a>\n </div>\n " + (pageTitle ? ("<div class=\"title sliding\">" + pageTitle + "</div>") : '') + "\n " + (ac.params.preloader ? ("\n <div class=\"right\">\n " + (ac.renderPreloader()) + "\n </div>\n ") : '') + "\n <div class=\"subnavbar sliding\">" + (ac.renderSearchbar()) + "</div>\n </div>\n </div>\n ").trim();
34368 return navbarHtml;
34369 };
34370
34371 Autocomplete.prototype.renderDropdown = function renderDropdown () {
34372 var ac = this;
34373 if (ac.params.renderDropdown) { return ac.params.renderDropdown.call(ac, ac.items); }
34374 var dropdownHtml = ("\n <div class=\"autocomplete-dropdown\">\n <div class=\"autocomplete-dropdown-inner\">\n <div class=\"list " + (!ac.params.expandInput ? 'no-safe-areas' : '') + "\">\n <ul></ul>\n </div>\n </div>\n " + (ac.params.preloader ? ac.renderPreloader() : '') + "\n </div>\n ").trim();
34375 return dropdownHtml;
34376 };
34377
34378 Autocomplete.prototype.renderPage = function renderPage () {
34379 var ac = this;
34380 if (ac.params.renderPage) { return ac.params.renderPage.call(ac, ac.items); }
34381
34382 var pageHtml = ("\n <div class=\"page page-with-subnavbar autocomplete-page\" data-name=\"autocomplete-page\">\n " + (ac.renderNavbar()) + "\n <div class=\"searchbar-backdrop\"></div>\n <div class=\"page-content\">\n <div class=\"list autocomplete-list autocomplete-found autocomplete-list-" + (ac.id) + " " + (ac.params.formColorTheme ? ("color-" + (ac.params.formColorTheme)) : '') + "\">\n <ul></ul>\n </div>\n <div class=\"list autocomplete-not-found\">\n <ul>\n <li class=\"item-content\"><div class=\"item-inner\"><div class=\"item-title\">" + (ac.params.notFoundText) + "</div></div></li>\n </ul>\n </div>\n <div class=\"list autocomplete-values\">\n <ul></ul>\n </div>\n </div>\n </div>\n ").trim();
34383 return pageHtml;
34384 };
34385
34386 Autocomplete.prototype.renderPopup = function renderPopup () {
34387 var ac = this;
34388 if (ac.params.renderPopup) { return ac.params.renderPopup.call(ac, ac.items); }
34389 var popupHtml = ("\n <div class=\"popup autocomplete-popup\">\n <div class=\"view\">\n " + (ac.renderPage()) + ";\n </div>\n </div>\n ").trim();
34390 return popupHtml;
34391 };
34392
34393 Autocomplete.prototype.onOpen = function onOpen (type, el) {
34394 var ac = this;
34395 var app = ac.app;
34396 var $el = $(el);
34397 ac.$el = $el;
34398 ac.el = $el[0];
34399 ac.openedIn = type;
34400 ac.opened = true;
34401
34402 if (ac.params.openIn === 'dropdown') {
34403 ac.attachDropdownEvents();
34404
34405 ac.$dropdownEl.addClass('autocomplete-dropdown-in');
34406 ac.$inputEl.trigger('input');
34407 } else {
34408 // Init SB
34409 var $searchbarEl = $el.find('.searchbar');
34410 if (ac.params.openIn === 'page' && app.theme === 'ios' && $searchbarEl.length === 0) {
34411 $searchbarEl = $(app.navbar.getElByPage($el)).find('.searchbar');
34412 }
34413 ac.searchbar = app.searchbar.create({
34414 el: $searchbarEl,
34415 backdropEl: $el.find('.searchbar-backdrop'),
34416 customSearch: true,
34417 on: {
34418 search: function search(sb, query) {
34419 if (query.length === 0 && ac.searchbar.enabled) {
34420 ac.searchbar.backdropShow();
34421 } else {
34422 ac.searchbar.backdropHide();
34423 }
34424 ac.source(query);
34425 },
34426 },
34427 });
34428
34429 // Attach page events
34430 ac.attachPageEvents();
34431
34432 // Update Values On Page Init
34433 ac.updateValues();
34434
34435 // Source on load
34436 if (ac.params.requestSourceOnOpen) { ac.source(''); }
34437 }
34438
34439 ac.emit('local::open autocompleteOpen', ac);
34440 };
34441
34442 Autocomplete.prototype.autoFocus = function autoFocus () {
34443 var ac = this;
34444 if (ac.searchbar && ac.searchbar.$inputEl) {
34445 ac.searchbar.$inputEl.focus();
34446 }
34447 return ac;
34448 };
34449
34450 Autocomplete.prototype.onOpened = function onOpened () {
34451 var ac = this;
34452 if (ac.params.openIn !== 'dropdown' && ac.params.autoFocus) {
34453 ac.autoFocus();
34454 }
34455 ac.emit('local::opened autocompleteOpened', ac);
34456 };
34457
34458 Autocomplete.prototype.onClose = function onClose () {
34459 var ac = this;
34460 if (ac.destroyed) { return; }
34461
34462 // Destroy SB
34463 if (ac.searchbar && ac.searchbar.destroy) {
34464 ac.searchbar.destroy();
34465 ac.searchbar = null;
34466 delete ac.searchbar;
34467 }
34468
34469 if (ac.params.openIn === 'dropdown') {
34470 ac.detachDropdownEvents();
34471 ac.$dropdownEl.removeClass('autocomplete-dropdown-in').remove();
34472 ac.$inputEl.parents('.item-content-dropdown-expanded').removeClass('item-content-dropdown-expanded');
34473 } else {
34474 ac.detachPageEvents();
34475 }
34476
34477 ac.emit('local::close autocompleteClose', ac);
34478 };
34479
34480 Autocomplete.prototype.onClosed = function onClosed () {
34481 var ac = this;
34482 if (ac.destroyed) { return; }
34483 ac.opened = false;
34484 ac.$el = null;
34485 ac.el = null;
34486 delete ac.$el;
34487 delete ac.el;
34488
34489 ac.emit('local::closed autocompleteClosed', ac);
34490 };
34491
34492 Autocomplete.prototype.openPage = function openPage () {
34493 var ac = this;
34494 if (ac.opened) { return ac; }
34495 var pageHtml = ac.renderPage();
34496 ac.view.router.navigate({
34497 url: ac.url,
34498 route: {
34499 content: pageHtml,
34500 path: ac.url,
34501 on: {
34502 pageBeforeIn: function pageBeforeIn(e, page) {
34503 ac.onOpen('page', page.el);
34504 },
34505 pageAfterIn: function pageAfterIn(e, page) {
34506 ac.onOpened('page', page.el);
34507 },
34508 pageBeforeOut: function pageBeforeOut(e, page) {
34509 ac.onClose('page', page.el);
34510 },
34511 pageAfterOut: function pageAfterOut(e, page) {
34512 ac.onClosed('page', page.el);
34513 },
34514 },
34515 options: {
34516 animate: ac.params.animate,
34517 },
34518 },
34519 });
34520 return ac;
34521 };
34522
34523 Autocomplete.prototype.openPopup = function openPopup () {
34524 var ac = this;
34525 if (ac.opened) { return ac; }
34526 var popupHtml = ac.renderPopup();
34527
34528 var popupParams = {
34529 content: popupHtml,
34530 animate: ac.params.animate,
34531 on: {
34532 popupOpen: function popupOpen(popup) {
34533 ac.onOpen('popup', popup.el);
34534 },
34535 popupOpened: function popupOpened(popup) {
34536 ac.onOpened('popup', popup.el);
34537 },
34538 popupClose: function popupClose(popup) {
34539 ac.onClose('popup', popup.el);
34540 },
34541 popupClosed: function popupClosed(popup) {
34542 ac.onClosed('popup', popup.el);
34543 },
34544 },
34545 };
34546
34547 if (ac.params.routableModals) {
34548 ac.view.router.navigate({
34549 url: ac.url,
34550 route: {
34551 path: ac.url,
34552 popup: popupParams,
34553 },
34554 });
34555 } else {
34556 ac.modal = ac.app.popup.create(popupParams).open(ac.params.animate);
34557 }
34558 return ac;
34559 };
34560
34561 Autocomplete.prototype.openDropdown = function openDropdown () {
34562 var ac = this;
34563
34564 if (!ac.$dropdownEl) {
34565 ac.$dropdownEl = $(ac.renderDropdown());
34566 }
34567 var $listEl = ac.$inputEl.parents('.list');
34568 if ($listEl.length && ac.$inputEl.parents('.item-content').length > 0 && ac.params.expandInput) {
34569 ac.$inputEl.parents('.item-content').addClass('item-content-dropdown-expanded');
34570 }
34571
34572 var $pageContentEl = ac.$inputEl.parents('.page-content');
34573 if (ac.params.dropdownContainerEl) {
34574 $(ac.params.dropdownContainerEl).append(ac.$dropdownEl);
34575 } else if ($pageContentEl.length === 0) {
34576 ac.$dropdownEl.insertAfter(ac.$inputEl);
34577 } else {
34578 ac.positionDropdown();
34579 $pageContentEl.append(ac.$dropdownEl);
34580 }
34581 ac.onOpen('dropdown', ac.$dropdownEl);
34582 ac.onOpened('dropdown', ac.$dropdownEl);
34583 };
34584
34585 Autocomplete.prototype.open = function open () {
34586 var ac = this;
34587 if (ac.opened) { return ac; }
34588 var openIn = ac.params.openIn;
34589 ac[("open" + (openIn.split('').map(function (el, index) {
34590 if (index === 0) { return el.toUpperCase(); }
34591 return el;
34592 }).join('')))]();
34593 return ac;
34594 };
34595
34596 Autocomplete.prototype.close = function close () {
34597 var ac = this;
34598 if (!ac.opened) { return ac; }
34599 if (ac.params.openIn === 'dropdown') {
34600 ac.onClose();
34601 ac.onClosed();
34602 } else if (ac.params.routableModals || ac.openedIn === 'page') {
34603 ac.view.router.back({ animate: ac.params.animate });
34604 } else {
34605 ac.modal.once('modalClosed', function () {
34606 Utils.nextTick(function () {
34607 ac.modal.destroy();
34608 delete ac.modal;
34609 });
34610 });
34611 ac.modal.close();
34612 }
34613 return ac;
34614 };
34615
34616 Autocomplete.prototype.init = function init () {
34617 var ac = this;
34618 ac.attachEvents();
34619 };
34620
34621 Autocomplete.prototype.destroy = function destroy () {
34622 var ac = this;
34623 ac.emit('local::beforeDestroy autocompleteBeforeDestroy', ac);
34624 ac.detachEvents();
34625 if (ac.$inputEl && ac.$inputEl[0]) {
34626 delete ac.$inputEl[0].f7Autocomplete;
34627 }
34628 if (ac.$openerEl && ac.$openerEl[0]) {
34629 delete ac.$openerEl[0].f7Autocomplete;
34630 }
34631 Utils.deleteProps(ac);
34632 ac.destroyed = true;
34633 };
34634
34635 return Autocomplete;
34636 }(Framework7Class));
34637
34638 var Autocomplete$1 = {
34639 name: 'autocomplete',
34640 params: {
34641 autocomplete: {
34642 openerEl: undefined,
34643 inputEl: undefined,
34644 view: undefined,
34645
34646 // DropDown
34647 dropdownContainerEl: undefined,
34648 dropdownPlaceholderText: undefined,
34649 typeahead: false,
34650 highlightMatches: true,
34651 expandInput: false,
34652 updateInputValueOnSelect: true,
34653 inputEvents: 'input',
34654
34655 value: undefined,
34656 multiple: false,
34657
34658 source: undefined,
34659 limit: undefined,
34660 valueProperty: 'id',
34661 textProperty: 'text',
34662
34663 openIn: 'page', // or 'popup' or 'dropdown'
34664 pageBackLinkText: 'Back',
34665 popupCloseLinkText: 'Close',
34666 pageTitle: undefined,
34667 searchbarPlaceholder: 'Search...',
34668 searchbarDisableText: 'Cancel',
34669
34670 animate: true,
34671
34672 autoFocus: false,
34673 closeOnSelect: false,
34674 notFoundText: 'Nothing found',
34675 requestSourceOnOpen: false,
34676
34677 // Preloader
34678 preloaderColor: undefined,
34679 preloader: false,
34680
34681 // Colors
34682 formColorTheme: undefined,
34683 navbarColorTheme: undefined,
34684
34685 // Routing
34686 routableModals: true,
34687 url: 'select/',
34688
34689 // Custom render functions
34690 renderDropdown: undefined,
34691 renderPage: undefined,
34692 renderPopup: undefined,
34693 renderItem: undefined,
34694 renderSearchbar: undefined,
34695 renderNavbar: undefined,
34696
34697 },
34698 },
34699 static: {
34700 Autocomplete: Autocomplete,
34701 },
34702 create: function create() {
34703 var app = this;
34704 app.autocomplete = Utils.extend(
34705 ConstructorMethods({
34706 defaultSelector: undefined,
34707 constructor: Autocomplete,
34708 app: app,
34709 domProp: 'f7Autocomplete',
34710 }),
34711 {
34712 open: function open(autocompleteEl) {
34713 var ac = app.autocomplete.get(autocompleteEl);
34714 if (ac && ac.open) { return ac.open(); }
34715 return undefined;
34716 },
34717 close: function close(autocompleteEl) {
34718 var ac = app.autocomplete.get(autocompleteEl);
34719 if (ac && ac.close) { return ac.close(); }
34720 return undefined;
34721 },
34722 }
34723 );
34724 },
34725 };
34726
34727 var Tooltip = /*@__PURE__*/(function (Framework7Class$$1) {
34728 function Tooltip(app, params) {
34729 if ( params === void 0 ) params = {};
34730
34731 Framework7Class$$1.call(this, app, params);
34732
34733 var tooltip = this;
34734
34735 var defaults = Utils.extend({}, app.params.tooltip);
34736
34737 // Extend defaults with modules params
34738 tooltip.useModulesParams(defaults);
34739
34740 tooltip.params = Utils.extend(defaults, params);
34741
34742 var ref = tooltip.params;
34743 var targetEl = ref.targetEl;
34744 if (!targetEl) { return tooltip; }
34745
34746 var $targetEl = $(targetEl);
34747 if ($targetEl.length === 0) { return tooltip; }
34748
34749 if ($targetEl[0].f7Tooltip) { return $targetEl[0].f7Tooltip; }
34750
34751 var $el = $(tooltip.render()).eq(0);
34752
34753 Utils.extend(tooltip, {
34754 app: app,
34755 $targetEl: $targetEl,
34756 targetEl: $targetEl && $targetEl[0],
34757 $el: $el,
34758 el: $el && $el[0],
34759 text: tooltip.params.text || '',
34760 visible: false,
34761 opened: false,
34762 });
34763
34764 $targetEl[0].f7Tooltip = tooltip;
34765
34766 var touchesStart = {};
34767 var isTouched;
34768 function handleTouchStart(e) {
34769 if (isTouched) { return; }
34770 isTouched = true;
34771 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
34772 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
34773 tooltip.show(this);
34774 }
34775 function handleTouchMove(e) {
34776 if (!isTouched) { return; }
34777 var x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
34778 var y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
34779 var distance = Math.pow( (
34780 (Math.pow( (x - touchesStart.x), 2 ))
34781 + (Math.pow( (y - touchesStart.y), 2 ))
34782 ), 0.5 );
34783 if (distance > 50) {
34784 isTouched = false;
34785 tooltip.hide();
34786 }
34787 }
34788 function handleTouchEnd() {
34789 if (!isTouched) { return; }
34790 isTouched = false;
34791 tooltip.hide();
34792 }
34793 function handleMouseEnter() {
34794 tooltip.show(this);
34795 }
34796 function handleMouseLeave() {
34797 tooltip.hide();
34798 }
34799 function handleTransitionEnd() {
34800 if (!$el.hasClass('tooltip-in')) {
34801 $el.removeClass('tooltip-out').remove();
34802 }
34803 }
34804
34805 tooltip.attachEvents = function attachEvents() {
34806 $el.on('transitionend', handleTransitionEnd);
34807 if (Support.touch) {
34808 var passive = Support.passiveListener ? { passive: true } : false;
34809 $targetEl.on(app.touchEvents.start, handleTouchStart, passive);
34810 app.on('touchmove', handleTouchMove);
34811 app.on('touchend:passive', handleTouchEnd);
34812 } else {
34813 $targetEl.on('mouseenter', handleMouseEnter);
34814 $targetEl.on('mouseleave', handleMouseLeave);
34815 }
34816 };
34817 tooltip.detachEvents = function detachEvents() {
34818 $el.off('transitionend', handleTransitionEnd);
34819 if (Support.touch) {
34820 var passive = Support.passiveListener ? { passive: true } : false;
34821 $targetEl.off(app.touchEvents.start, handleTouchStart, passive);
34822 app.off('touchmove', handleTouchMove);
34823 app.off('touchend:passive', handleTouchEnd);
34824 } else {
34825 $targetEl.off('mouseenter', handleMouseEnter);
34826 $targetEl.off('mouseleave', handleMouseLeave);
34827 }
34828 };
34829
34830 // Install Modules
34831 tooltip.useModules();
34832
34833 tooltip.init();
34834
34835 return tooltip;
34836 }
34837
34838 if ( Framework7Class$$1 ) Tooltip.__proto__ = Framework7Class$$1;
34839 Tooltip.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
34840 Tooltip.prototype.constructor = Tooltip;
34841
34842 Tooltip.prototype.position = function position (targetEl) {
34843 var tooltip = this;
34844 var $el = tooltip.$el;
34845 var app = tooltip.app;
34846 $el.css({ left: '', top: '' });
34847 var $targetEl = $(targetEl || tooltip.targetEl);
34848 var ref = [$el.width(), $el.height()];
34849 var width = ref[0];
34850 var height = ref[1];
34851
34852 $el.css({ left: '', top: '' });
34853
34854 var targetWidth;
34855 var targetHeight;
34856 var targetOffsetLeft;
34857 var targetOffsetTop;
34858 if ($targetEl && $targetEl.length > 0) {
34859 targetWidth = $targetEl.outerWidth();
34860 targetHeight = $targetEl.outerHeight();
34861
34862 var targetOffset = $targetEl.offset();
34863 targetOffsetLeft = targetOffset.left - app.left;
34864 targetOffsetTop = targetOffset.top - app.top;
34865
34866 var targetParentPage = $targetEl.parents('.page');
34867 if (targetParentPage.length > 0) {
34868 targetOffsetTop -= targetParentPage[0].scrollTop;
34869 }
34870 }
34871 var ref$1 = [0, 0, 0];
34872 var left = ref$1[0];
34873 var top = ref$1[1];
34874
34875 // Top Position
34876 var position = 'top';
34877
34878 if (height < targetOffsetTop) {
34879 // On top
34880 top = targetOffsetTop - height;
34881 } else if (height < app.height - targetOffsetTop - targetHeight) {
34882 // On bottom
34883 position = 'bottom';
34884 top = targetOffsetTop + targetHeight;
34885 } else {
34886 // On middle
34887 position = 'middle';
34888 top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
34889 if (top <= 0) {
34890 top = 8;
34891 } else if (top + height >= app.height) {
34892 top = app.height - height - 8;
34893 }
34894 }
34895
34896 // Horizontal Position
34897 if (position === 'top' || position === 'bottom') {
34898 left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
34899 if (left < 8) { left = 8; }
34900 if (left + width > app.width) { left = app.width - width - 8; }
34901 if (left < 0) { left = 0; }
34902 } else if (position === 'middle') {
34903 left = targetOffsetLeft - width;
34904 if (left < 8 || (left + width > app.width)) {
34905 if (left < 8) { left = targetOffsetLeft + targetWidth; }
34906 if (left + width > app.width) { left = app.width - width - 8; }
34907 }
34908 }
34909
34910 // Apply Styles
34911 $el.css({ top: (top + "px"), left: (left + "px") });
34912 };
34913
34914 Tooltip.prototype.show = function show (aroundEl) {
34915 var tooltip = this;
34916 var app = tooltip.app;
34917 var $el = tooltip.$el;
34918 var $targetEl = tooltip.$targetEl;
34919 app.root.append($el);
34920 tooltip.position(aroundEl);
34921 var $aroundEl = $(aroundEl);
34922 tooltip.visible = true;
34923 tooltip.opened = true;
34924 $targetEl.trigger('tooltip:show', tooltip);
34925 $el.trigger('tooltip:show', tooltip);
34926 if ($aroundEl.length && $aroundEl[0] !== $targetEl[0]) {
34927 $aroundEl.trigger('tooltip:show', tooltip);
34928 }
34929 tooltip.emit('local::show tooltipShow', tooltip);
34930 $el.removeClass('tooltip-out').addClass('tooltip-in');
34931 return tooltip;
34932 };
34933
34934 Tooltip.prototype.hide = function hide () {
34935 var tooltip = this;
34936 var $el = tooltip.$el;
34937 var $targetEl = tooltip.$targetEl;
34938 tooltip.visible = false;
34939 tooltip.opened = false;
34940 $targetEl.trigger('tooltip:hide', tooltip);
34941 $el.trigger('tooltip:hide', tooltip);
34942 tooltip.emit('local::hide tooltipHide', tooltip);
34943 $el.addClass('tooltip-out').removeClass('tooltip-in');
34944 return tooltip;
34945 };
34946
34947 Tooltip.prototype.render = function render () {
34948 var tooltip = this;
34949 if (tooltip.params.render) { return tooltip.params.render.call(tooltip, tooltip); }
34950 var ref = tooltip.params;
34951 var cssClass = ref.cssClass;
34952 var text = ref.text;
34953 return ("\n <div class=\"tooltip " + (cssClass || '') + "\">\n <div class=\"tooltip-content\">" + (text || '') + "</div>\n </div>\n ").trim();
34954 };
34955
34956 Tooltip.prototype.setText = function setText (newText) {
34957 var tooltip = this;
34958 if (typeof newText === 'undefined') {
34959 return tooltip;
34960 }
34961 tooltip.params.text = newText;
34962 tooltip.text = newText;
34963 if (tooltip.$el) {
34964 tooltip.$el.children('.tooltip-content').html(newText);
34965 }
34966 if (tooltip.opened) {
34967 tooltip.position();
34968 }
34969 return tooltip;
34970 };
34971
34972 Tooltip.prototype.init = function init () {
34973 var tooltip = this;
34974 tooltip.attachEvents();
34975 };
34976
34977 Tooltip.prototype.destroy = function destroy () {
34978 var tooltip = this;
34979 if (!tooltip.$targetEl || tooltip.destroyed) { return; }
34980 tooltip.$targetEl.trigger('tooltip:beforedestroy', tooltip);
34981 tooltip.emit('local::beforeDestroy tooltipBeforeDestroy', tooltip);
34982 tooltip.$el.remove();
34983 delete tooltip.$targetEl[0].f7Tooltip;
34984 tooltip.detachEvents();
34985 Utils.deleteProps(tooltip);
34986 tooltip.destroyed = true;
34987 };
34988
34989 return Tooltip;
34990 }(Framework7Class));
34991
34992 var Tooltip$1 = {
34993 name: 'tooltip',
34994 static: {
34995 Tooltip: Tooltip,
34996 },
34997 create: function create() {
34998 var app = this;
34999 app.tooltip = ConstructorMethods({
35000 defaultSelector: '.tooltip',
35001 constructor: Tooltip,
35002 app: app,
35003 domProp: 'f7Tooltip',
35004 });
35005 app.tooltip.show = function show(el) {
35006 var $el = $(el);
35007 if ($el.length === 0) { return undefined; }
35008 var tooltip = $el[0].f7Tooltip;
35009 if (!tooltip) { return undefined; }
35010 tooltip.show($el[0]);
35011 return tooltip;
35012 };
35013 app.tooltip.hide = function hide(el) {
35014 var $el = $(el);
35015 if ($el.length === 0) { return undefined; }
35016 var tooltip = $el[0].f7Tooltip;
35017 if (!tooltip) { return undefined; }
35018 tooltip.hide();
35019 return tooltip;
35020 };
35021 app.tooltip.setText = function text(el, newText) {
35022 var $el = $(el);
35023 if ($el.length === 0) { return undefined; }
35024 var tooltip = $el[0].f7Tooltip;
35025 if (!tooltip) { return undefined; }
35026 tooltip.setText(newText);
35027 return tooltip;
35028 };
35029 },
35030 params: {
35031 tooltip: {
35032 targetEl: null,
35033 text: null,
35034 cssClass: null,
35035 render: null,
35036 },
35037 },
35038 on: {
35039 tabMounted: function tabMounted(tabEl) {
35040 var app = this;
35041 $(tabEl).find('.tooltip-init').each(function (index, el) {
35042 var text = $(el).attr('data-tooltip');
35043 if (!text) { return; }
35044 app.tooltip.create({ targetEl: el, text: text });
35045 });
35046 },
35047 tabBeforeRemove: function tabBeforeRemove(tabEl) {
35048 $(tabEl).find('.tooltip-init').each(function (index, el) {
35049 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
35050 });
35051 },
35052 pageInit: function pageInit(page) {
35053 var app = this;
35054 page.$el.find('.tooltip-init').each(function (index, el) {
35055 var text = $(el).attr('data-tooltip');
35056 if (!text) { return; }
35057 app.tooltip.create({ targetEl: el, text: text });
35058 });
35059 },
35060 pageBeforeRemove: function pageBeforeRemove(page) {
35061 page.$el.find('.tooltip-init').each(function (index, el) {
35062 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
35063 });
35064 },
35065 },
35066 vnode: {
35067 'tooltip-init': {
35068 insert: function insert(vnode) {
35069 var app = this;
35070 var el = vnode.elm;
35071 var text = $(el).attr('data-tooltip');
35072 if (!text) { return; }
35073 app.tooltip.create({ targetEl: el, text: text });
35074 },
35075 destroy: function destroy(vnode) {
35076 var el = vnode.elm;
35077 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
35078 },
35079 },
35080 },
35081 };
35082
35083 /* eslint no-nested-ternary: off */
35084
35085 var Gauge = /*@__PURE__*/(function (Framework7Class$$1) {
35086 function Gauge(app, params) {
35087 if ( params === void 0 ) params = {};
35088
35089 // Extends with open/close Modal methods;
35090 Framework7Class$$1.call(this, app, params);
35091
35092 var gauge = this;
35093
35094 var defaults = Utils.extend({}, app.params.gauge);
35095
35096 // Extend defaults with modules params
35097 gauge.useModulesParams(defaults);
35098
35099 gauge.params = Utils.extend(defaults, params);
35100
35101 var ref = gauge.params;
35102 var el = ref.el;
35103 if (!el) { return gauge; }
35104
35105 var $el = $(el);
35106 if ($el.length === 0) { return gauge; }
35107
35108 if ($el[0].f7Gauge) { return $el[0].f7Gauge; }
35109
35110 Utils.extend(gauge, {
35111 app: app,
35112 $el: $el,
35113 el: $el && $el[0],
35114 });
35115
35116 $el[0].f7Gauge = gauge;
35117
35118 // Install Modules
35119 gauge.useModules();
35120
35121 gauge.init();
35122
35123 return gauge;
35124 }
35125
35126 if ( Framework7Class$$1 ) Gauge.__proto__ = Framework7Class$$1;
35127 Gauge.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
35128 Gauge.prototype.constructor = Gauge;
35129
35130 Gauge.prototype.calcRadius = function calcRadius () {
35131 var gauge = this;
35132 var ref = gauge.params;
35133 var size = ref.size;
35134 var borderWidth = ref.borderWidth;
35135 return (size / 2) - (borderWidth / 2);
35136 };
35137
35138 Gauge.prototype.calcBorderLength = function calcBorderLength () {
35139 var gauge = this;
35140 var radius = gauge.calcRadius();
35141 return 2 * Math.PI * radius;
35142 };
35143
35144 Gauge.prototype.render = function render () {
35145 var gauge = this;
35146 if (gauge.params.render) { return gauge.params.render.call(gauge, gauge); }
35147
35148 var ref = gauge.params;
35149 var type = ref.type;
35150 var value = ref.value;
35151 var size = ref.size;
35152 var bgColor = ref.bgColor;
35153 var borderBgColor = ref.borderBgColor;
35154 var borderColor = ref.borderColor;
35155 var borderWidth = ref.borderWidth;
35156 var valueText = ref.valueText;
35157 var valueTextColor = ref.valueTextColor;
35158 var valueFontSize = ref.valueFontSize;
35159 var valueFontWeight = ref.valueFontWeight;
35160 var labelText = ref.labelText;
35161 var labelTextColor = ref.labelTextColor;
35162 var labelFontSize = ref.labelFontSize;
35163 var labelFontWeight = ref.labelFontWeight;
35164
35165 var semiCircle = type === 'semicircle';
35166 var radius = gauge.calcRadius();
35167 var length = gauge.calcBorderLength();
35168 var progress = Math.max(Math.min(value, 1), 0);
35169
35170 return ("\n <svg class=\"gauge-svg\" width=\"" + size + "px\" height=\"" + (semiCircle ? size / 2 : size) + "px\" viewBox=\"0 0 " + size + " " + (semiCircle ? size / 2 : size) + "\">\n " + (semiCircle ? ("\n <path\n class=\"gauge-back-semi\"\n d=\"M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0\"\n stroke=\"" + borderBgColor + "\"\n stroke-width=\"" + borderWidth + "\"\n fill=\"" + (bgColor || 'none') + "\"\n />\n <path\n class=\"gauge-front-semi\"\n d=\"M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0\"\n stroke=\"" + borderColor + "\"\n stroke-width=\"" + borderWidth + "\"\n stroke-dasharray=\"" + (length / 2) + "\"\n stroke-dashoffset=\"" + ((length / 2) * (1 + progress)) + "\"\n fill=\"" + (borderBgColor ? 'none' : (bgColor || 'none')) + "\"\n />\n ") : ("\n " + (borderBgColor ? ("\n <circle\n class=\"gauge-back-circle\"\n stroke=\"" + borderBgColor + "\"\n stroke-width=\"" + borderWidth + "\"\n fill=\"" + (bgColor || 'none') + "\"\n cx=\"" + (size / 2) + "\"\n cy=\"" + (size / 2) + "\"\n r=\"" + radius + "\"\n ></circle>\n ") : '') + "\n <circle\n class=\"gauge-front-circle\"\n transform=\"" + ("rotate(-90 " + (size / 2) + " " + (size / 2) + ")") + "\"\n stroke=\"" + borderColor + "\"\n stroke-width=\"" + borderWidth + "\"\n stroke-dasharray=\"" + length + "\"\n stroke-dashoffset=\"" + (length * (1 - progress)) + "\"\n fill=\"" + (borderBgColor ? 'none' : bgColor || 'none') + "\"\n cx=\"" + (size / 2) + "\"\n cy=\"" + (size / 2) + "\"\n r=\"" + radius + "\"\n ></circle>\n ")) + "\n " + (valueText ? ("\n <text\n class=\"gauge-value-text\"\n x=\"50%\"\n y=\"" + (semiCircle ? '100%' : '50%') + "\"\n font-weight=\"" + valueFontWeight + "\"\n font-size=\"" + valueFontSize + "\"\n fill=\"" + valueTextColor + "\"\n dy=\"" + (semiCircle ? (labelText ? -labelFontSize - 15 : -5) : 0) + "\"\n text-anchor=\"middle\"\n dominant-baseline=\"" + (!semiCircle && 'middle') + "\"\n >" + valueText + "</text>\n ") : '') + "\n " + (labelText ? ("\n <text\n class=\"gauge-label-text\"\n x=\"50%\"\n y=\"" + (semiCircle ? '100%' : '50%') + "\"\n font-weight=\"" + labelFontWeight + "\"\n font-size=\"" + labelFontSize + "\"\n fill=\"" + labelTextColor + "\"\n dy=\"" + (semiCircle ? -5 : (valueText ? ((valueFontSize / 2) + 10) : 0)) + "\"\n text-anchor=\"middle\"\n dominant-baseline=\"" + (!semiCircle && 'middle') + "\"\n >" + labelText + "</text>\n ") : '') + "\n </svg>\n ").trim();
35171 };
35172
35173 Gauge.prototype.update = function update (newParams) {
35174 if ( newParams === void 0 ) newParams = {};
35175
35176 var gauge = this;
35177 var params = gauge.params;
35178 var $gaugeSvgEl = gauge.$gaugeSvgEl;
35179
35180 Object.keys(newParams).forEach(function (param) {
35181 if (typeof newParams[param] !== 'undefined') {
35182 params[param] = newParams[param];
35183 }
35184 });
35185 if ($gaugeSvgEl.length === 0) { return gauge; }
35186
35187 var value = params.value;
35188 var size = params.size;
35189 var bgColor = params.bgColor;
35190 var borderBgColor = params.borderBgColor;
35191 var borderColor = params.borderColor;
35192 var borderWidth = params.borderWidth;
35193 var valueText = params.valueText;
35194 var valueTextColor = params.valueTextColor;
35195 var valueFontSize = params.valueFontSize;
35196 var valueFontWeight = params.valueFontWeight;
35197 var labelText = params.labelText;
35198 var labelTextColor = params.labelTextColor;
35199 var labelFontSize = params.labelFontSize;
35200 var labelFontWeight = params.labelFontWeight;
35201
35202 var length = gauge.calcBorderLength();
35203 var progress = Math.max(Math.min(value, 1), 0);
35204 var radius = gauge.calcRadius();
35205 var semiCircle = params.type === 'semicircle';
35206
35207 var svgAttrs = {
35208 width: (size + "px"),
35209 height: ((semiCircle ? size / 2 : size) + "px"),
35210 viewBox: ("0 0 " + size + " " + (semiCircle ? size / 2 : size)),
35211 };
35212 Object.keys(svgAttrs).forEach(function (attr) {
35213 $gaugeSvgEl.attr(attr, svgAttrs[attr]);
35214 });
35215 if (semiCircle) {
35216 var backAttrs = {
35217 d: ("M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0"),
35218 stroke: borderBgColor,
35219 'stroke-width': borderWidth,
35220 fill: bgColor || 'none',
35221 };
35222 var frontAttrs = {
35223 d: ("M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0"),
35224 stroke: borderColor,
35225 'stroke-width': borderWidth,
35226 'stroke-dasharray': length / 2,
35227 'stroke-dashoffset': (length / 2) * (progress - 1),
35228 fill: borderBgColor ? 'none' : (bgColor || 'none'),
35229 };
35230 Object.keys(backAttrs).forEach(function (attr) {
35231 $gaugeSvgEl.find('.gauge-back-semi').attr(attr, backAttrs[attr]);
35232 });
35233 Object.keys(frontAttrs).forEach(function (attr) {
35234 $gaugeSvgEl.find('.gauge-front-semi').attr(attr, frontAttrs[attr]);
35235 });
35236 } else {
35237 var backAttrs$1 = {
35238 stroke: borderBgColor,
35239 'stroke-width': borderWidth,
35240 fill: bgColor || 'none',
35241 cx: size / 2,
35242 cy: size / 2,
35243 r: radius,
35244 };
35245 var frontAttrs$1 = {
35246 transform: ("rotate(-90 " + (size / 2) + " " + (size / 2) + ")"),
35247 stroke: borderColor,
35248 'stroke-width': borderWidth,
35249 'stroke-dasharray': length,
35250 'stroke-dashoffset': length * (1 - progress),
35251 fill: borderBgColor ? 'none' : bgColor || 'none',
35252 cx: size / 2,
35253 cy: size / 2,
35254 r: radius,
35255 };
35256 Object.keys(backAttrs$1).forEach(function (attr) {
35257 $gaugeSvgEl.find('.gauge-back-circle').attr(attr, backAttrs$1[attr]);
35258 });
35259 Object.keys(frontAttrs$1).forEach(function (attr) {
35260 $gaugeSvgEl.find('.gauge-front-circle').attr(attr, frontAttrs$1[attr]);
35261 });
35262 }
35263 if (valueText) {
35264 if (!$gaugeSvgEl.find('.gauge-value-text').length) {
35265 $gaugeSvgEl.append('<text class="gauge-value-text"></text>');
35266 }
35267 var textAttrs = {
35268 x: '50%',
35269 y: semiCircle ? '100%' : '50%',
35270 'font-weight': valueFontWeight,
35271 'font-size': valueFontSize,
35272 fill: valueTextColor,
35273 dy: semiCircle ? (labelText ? -labelFontSize - 15 : -5) : 0,
35274 'text-anchor': 'middle',
35275 'dominant-baseline': !semiCircle && 'middle',
35276 };
35277 Object.keys(textAttrs).forEach(function (attr) {
35278 $gaugeSvgEl.find('.gauge-value-text').attr(attr, textAttrs[attr]);
35279 });
35280 $gaugeSvgEl.find('.gauge-value-text').text(valueText);
35281 } else {
35282 $gaugeSvgEl.find('.gauge-value-text').remove();
35283 }
35284 if (labelText) {
35285 if (!$gaugeSvgEl.find('.gauge-label-text').length) {
35286 $gaugeSvgEl.append('<text class="gauge-label-text"></text>');
35287 }
35288 var labelAttrs = {
35289 x: '50%',
35290 y: semiCircle ? '100%' : '50%',
35291 'font-weight': labelFontWeight,
35292 'font-size': labelFontSize,
35293 fill: labelTextColor,
35294 dy: semiCircle ? -5 : (valueText ? ((valueFontSize / 2) + 10) : 0),
35295 'text-anchor': 'middle',
35296 'dominant-baseline': !semiCircle && 'middle',
35297 };
35298 Object.keys(labelAttrs).forEach(function (attr) {
35299 $gaugeSvgEl.find('.gauge-label-text').attr(attr, labelAttrs[attr]);
35300 });
35301 $gaugeSvgEl.find('.gauge-label-text').text(labelText);
35302 } else {
35303 $gaugeSvgEl.find('.gauge-label-text').remove();
35304 }
35305 return gauge;
35306 };
35307
35308 Gauge.prototype.init = function init () {
35309 var gauge = this;
35310 var $gaugeSvgEl = $(gauge.render()).eq(0);
35311 $gaugeSvgEl.f7Gauge = gauge;
35312 Utils.extend(gauge, {
35313 $gaugeSvgEl: $gaugeSvgEl,
35314 gaugeSvgEl: $gaugeSvgEl && $gaugeSvgEl[0],
35315 });
35316 gauge.$el.append($gaugeSvgEl);
35317 return gauge;
35318 };
35319
35320 Gauge.prototype.destroy = function destroy () {
35321 var gauge = this;
35322 if (!gauge.$el || gauge.destroyed) { return; }
35323 gauge.$el.trigger('gauge:beforedestroy', gauge);
35324 gauge.emit('local::beforeDestroy gaugeBeforeDestroy', gauge);
35325 gauge.$gaugeSvgEl.remove();
35326 delete gauge.$el[0].f7Gauge;
35327 Utils.deleteProps(gauge);
35328 gauge.destroyed = true;
35329 };
35330
35331 return Gauge;
35332 }(Framework7Class));
35333
35334 var Gauge$1 = {
35335 name: 'gauge',
35336 static: {
35337 Gauge: Gauge,
35338 },
35339 create: function create() {
35340 var app = this;
35341 app.gauge = ConstructorMethods({
35342 defaultSelector: '.gauge',
35343 constructor: Gauge,
35344 app: app,
35345 domProp: 'f7Gauge',
35346 });
35347 app.gauge.update = function update(el, newParams) {
35348 var $el = $(el);
35349 if ($el.length === 0) { return undefined; }
35350 var gauge = app.gauge.get(el);
35351 if (!gauge) { return undefined; }
35352 gauge.update(newParams);
35353 return gauge;
35354 };
35355 },
35356 params: {
35357 gauge: {
35358 el: null,
35359 type: 'circle',
35360 value: 0,
35361 size: 200,
35362 bgColor: 'transparent',
35363 borderBgColor: '#eeeeee',
35364 borderColor: '#000000',
35365 borderWidth: 10,
35366 valueText: null,
35367 valueTextColor: '#000000',
35368 valueFontSize: 31,
35369 valueFontWeight: 500,
35370 labelText: null,
35371 labelTextColor: '#888888',
35372 labelFontSize: 14,
35373 labelFontWeight: 400,
35374 },
35375 },
35376 on: {
35377 tabMounted: function tabMounted(tabEl) {
35378 var app = this;
35379 $(tabEl).find('.gauge-init').each(function (index, el) {
35380 app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
35381 });
35382 },
35383 tabBeforeRemove: function tabBeforeRemove(tabEl) {
35384 $(tabEl).find('.gauge-init').each(function (index, el) {
35385 if (el.f7Gauge) { el.f7Gauge.destroy(); }
35386 });
35387 },
35388 pageInit: function pageInit(page) {
35389 var app = this;
35390 page.$el.find('.gauge-init').each(function (index, el) {
35391 app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
35392 });
35393 },
35394 pageBeforeRemove: function pageBeforeRemove(page) {
35395 page.$el.find('.gauge-init').each(function (index, el) {
35396 if (el.f7Gauge) { el.f7Gauge.destroy(); }
35397 });
35398 },
35399 },
35400 vnode: {
35401 'gauge-init': {
35402 insert: function insert(vnode) {
35403 var app = this;
35404 var el = vnode.elm;
35405 app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
35406 },
35407 destroy: function destroy(vnode) {
35408 var el = vnode.elm;
35409 if (el.f7Gauge) { el.f7Gauge.destroy(); }
35410 },
35411 },
35412 },
35413 };
35414
35415 var Skeleton = {
35416 name: 'skeleton',
35417 };
35418
35419 var Menu = {
35420 open: function open(el) {
35421 if ( el === void 0 ) el = '.menu-item-dropdown';
35422
35423 var app = this;
35424 if (!el) { return; }
35425 var $el = $(el).closest('.menu-item-dropdown');
35426 if (!$el.length) { return; }
35427 $el.eq(0).addClass('menu-item-dropdown-opened').trigger('menu:opened');
35428 app.emit('menuOpened', $el.eq(0)[0]);
35429 },
35430 close: function close(el) {
35431 if ( el === void 0 ) el = '.menu-item-dropdown-opened';
35432
35433 var app = this;
35434 if (!el) { return; }
35435 var $el = $(el).closest('.menu-item-dropdown-opened');
35436 if (!$el.length) { return; }
35437 $el.eq(0).removeClass('menu-item-dropdown-opened').trigger('menu:closed');
35438 app.emit('menuClosed', $el.eq(0)[0]);
35439 },
35440 };
35441
35442 var Menu$1 = {
35443 name: 'menu',
35444 create: function create() {
35445 var app = this;
35446 app.menu = {
35447 open: Menu.open.bind(app),
35448 close: Menu.close.bind(app),
35449 };
35450 },
35451 on: {
35452 click: function click(e) {
35453 var app = this;
35454 var openedMenus = $('.menu-item-dropdown-opened');
35455 if (!openedMenus.length) { return; }
35456 openedMenus.each(function (index, el) {
35457 if (!$(e.target).closest('.menu-item-dropdown-opened').length) {
35458 app.menu.close(el);
35459 }
35460 });
35461 },
35462 },
35463 clicks: {
35464 '.menu-item-dropdown': function onClick($clickedEl, dataset, e) {
35465 var app = this;
35466 if ($clickedEl.hasClass('menu-item-dropdown-opened')) {
35467 if ($(e.target).closest('.menu-dropdown').length) { return; }
35468 app.menu.close($clickedEl);
35469 } else {
35470 app.menu.open($clickedEl);
35471 }
35472 },
35473 '.menu-close': function onClick() {
35474 var app = this;
35475 app.menu.close();
35476 },
35477 },
35478 };
35479
35480 var ViAd = /*@__PURE__*/(function (Framework7Class$$1) {
35481 function ViAd(app, params) {
35482 if ( params === void 0 ) params = {};
35483
35484 Framework7Class$$1.call(this, params, [app]);
35485 var vi = this;
35486 if (!win.vi) {
35487 throw new Error('Framework7: vi SDK not found.');
35488 }
35489
35490 var orientation;
35491 if (typeof win.orientation !== 'undefined') {
35492 orientation = win.orientation === -90 || win.orientation === 90 ? 'horizontal' : 'vertical';
35493 }
35494 var defaults = Utils.extend(
35495 {},
35496 app.params.vi,
35497 {
35498 appId: app.id,
35499 appVer: app.version,
35500 language: app.language,
35501 width: app.width,
35502 height: app.height,
35503 os: Device.os,
35504 osVersion: Device.osVersion,
35505 orientation: orientation,
35506 }
35507 );
35508
35509 // Extend defaults with modules params
35510 vi.useModulesParams(defaults);
35511
35512 vi.params = Utils.extend(defaults, params);
35513
35514 var adParams = {};
35515 var skipParams = ('on autoplay fallbackOverlay fallbackOverlayText enabled').split(' ');
35516 Object.keys(vi.params).forEach(function (paramName) {
35517 if (skipParams.indexOf(paramName) >= 0) { return; }
35518 var paramValue = vi.params[paramName];
35519 if ([null, undefined].indexOf(paramValue) >= 0) { return; }
35520 adParams[paramName] = paramValue;
35521 });
35522
35523 if (!vi.params.appId) {
35524 throw new Error('Framework7: "app.id" is required to display an ad. Make sure you have specified it on app initialization.');
35525 }
35526 if (!vi.params.placementId) {
35527 throw new Error('Framework7: "placementId" is required to display an ad.');
35528 }
35529
35530 function onResize() {
35531 var $viFrame = $('iframe#viAd');
35532 if ($viFrame.length === 0) { return; }
35533 $viFrame
35534 .css({
35535 width: ((app.width) + "px"),
35536 height: ((app.height) + "px"),
35537 });
35538 }
35539
35540 function removeOverlay() {
35541 if (!vi.$overlayEl) { return; }
35542 vi.$overlayEl.off('click touchstart');
35543 vi.$overlayEl.remove();
35544 }
35545 function createOverlay(videoEl) {
35546 if (!videoEl) { return; }
35547 vi.$overlayEl = $(("\n <div class=\"vi-overlay no-fastclick\">\n " + (vi.params.fallbackOverlayText ? ("<div class=\"vi-overlay-text\">" + (vi.params.fallbackOverlayText) + "</div>") : '') + "\n <div class=\"vi-overlay-play-button\"></div>\n </div>\n ").trim());
35548
35549 var touchStartTime;
35550 vi.$overlayEl.on('touchstart', function () {
35551 touchStartTime = Utils.now();
35552 });
35553 vi.$overlayEl.on('click', function () {
35554 var timeDiff = Utils.now() - touchStartTime;
35555 if (timeDiff > 300) { return; }
35556 if (videoEl) {
35557 videoEl.play();
35558 removeOverlay();
35559 return;
35560 }
35561 vi.start();
35562 removeOverlay();
35563 });
35564 app.root.append(vi.$overlayEl);
35565 }
35566
35567 // Create ad
35568 vi.ad = new win.vi.Ad(adParams);
35569
35570 Utils.extend(vi.ad, {
35571 onAdReady: function onAdReady() {
35572 app.on('resize', onResize);
35573 vi.emit('local::ready');
35574 if (vi.params.autoplay) {
35575 vi.start();
35576 }
35577 },
35578 onAdStarted: function onAdStarted() {
35579 vi.emit('local::started');
35580 },
35581 onAdClick: function onAdClick(targetUrl) {
35582 vi.emit('local::click', targetUrl);
35583 },
35584 onAdImpression: function onAdImpression() {
35585 vi.emit('local::impression');
35586 },
35587 onAdStopped: function onAdStopped(reason) {
35588 app.off('resize', onResize);
35589 removeOverlay();
35590
35591 vi.emit('local::stopped', reason);
35592 if (reason === 'complete') {
35593 vi.emit('local::complete');
35594 vi.emit('local::completed');
35595 }
35596 if (reason === 'userexit') {
35597 vi.emit('local::userexit');
35598 }
35599 vi.destroyed = true;
35600 },
35601 onAutoPlayFailed: function onAutoPlayFailed(reason, videoEl) {
35602 vi.emit('local::autoplayFailed', reason, videoEl);
35603 if (reason && reason.name && reason.name.indexOf('NotAllowedError') !== -1 && vi.params.fallbackOverlay) {
35604 createOverlay(videoEl);
35605 }
35606 },
35607 onAdError: function onAdError(msg) {
35608 removeOverlay();
35609 app.off('resize', onResize);
35610 vi.emit('local::error', msg);
35611 vi.destroyed = true;
35612 },
35613 });
35614
35615 vi.init();
35616
35617 Utils.extend(vi, {
35618 app: app,
35619 });
35620 }
35621
35622 if ( Framework7Class$$1 ) ViAd.__proto__ = Framework7Class$$1;
35623 ViAd.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
35624 ViAd.prototype.constructor = ViAd;
35625
35626 ViAd.prototype.start = function start () {
35627 var vi = this;
35628 if (vi.destroyed) { return; }
35629 if (vi.ad) { vi.ad.startAd(); }
35630 };
35631
35632 ViAd.prototype.pause = function pause () {
35633 var vi = this;
35634 if (vi.destroyed) { return; }
35635 if (vi.ad) { vi.ad.pauseAd(); }
35636 };
35637
35638 ViAd.prototype.resume = function resume () {
35639 var vi = this;
35640 if (vi.destroyed) { return; }
35641 if (vi.ad) { vi.ad.resumeAd(); }
35642 };
35643
35644 ViAd.prototype.stop = function stop () {
35645 var vi = this;
35646 if (vi.destroyed) { return; }
35647 if (vi.ad) { vi.ad.stopAd(); }
35648 };
35649
35650 ViAd.prototype.init = function init () {
35651 var vi = this;
35652 if (vi.destroyed) { return; }
35653 if (vi.ad) { vi.ad.initAd(); }
35654 };
35655
35656 ViAd.prototype.destroy = function destroy () {
35657 var vi = this;
35658 vi.destroyed = true;
35659 vi.emit('local::beforeDestroy');
35660 Utils.deleteProps(vi);
35661 };
35662
35663 return ViAd;
35664 }(Framework7Class));
35665
35666 var Vi = {
35667 name: 'vi',
35668 params: {
35669 vi: {
35670 enabled: false,
35671 autoplay: true,
35672 fallbackOverlay: true,
35673 fallbackOverlayText: 'Please watch this ad',
35674 showMute: true,
35675 startMuted: (Device.ios || Device.android) && !Device.cordova,
35676 appId: null,
35677 appVer: null,
35678 language: null,
35679 width: null,
35680 height: null,
35681 placementId: 'pltd4o7ibb9rc653x14',
35682 placementType: 'interstitial',
35683 videoSlot: null,
35684 showProgress: true,
35685 showBranding: true,
35686 os: null,
35687 osVersion: null,
35688 orientation: null,
35689 age: null,
35690 gender: null,
35691 advertiserId: null,
35692 latitude: null,
35693 longitude: null,
35694 accuracy: null,
35695 storeId: null,
35696 ip: null,
35697 manufacturer: null,
35698 model: null,
35699 connectionType: null,
35700 connectionProvider: null,
35701 },
35702 },
35703 create: function create() {
35704 var app = this;
35705 app.vi = {
35706 sdkReady: false,
35707 createAd: function createAd(adParams) {
35708 return new ViAd(app, adParams);
35709 },
35710 loadSdk: function loadSdk() {
35711 if (app.vi.sdkReady) { return; }
35712 var script = doc.createElement('script');
35713 script.onload = function onload() {
35714 app.emit('viSdkReady');
35715 app.vi.sdkReady = true;
35716 };
35717 script.src = 'https://c.vi-serve.com/viadshtml/vi.min.js';
35718 $('head').append(script);
35719 },
35720 };
35721 },
35722 on: {
35723 init: function init() {
35724 var app = this;
35725 if (app.params.vi.enabled || (app.passedParams.vi && app.passedParams.vi.enabled !== false)) { app.vi.loadSdk(); }
35726 },
35727 },
35728 };
35729
35730 var Elevation = {
35731 name: 'elevation',
35732 };
35733
35734 var Typography = {
35735 name: 'typography',
35736 };
35737
35738 {
35739 if (typeof window !== 'undefined') {
35740 // Template7
35741 if (!window.Template7) { window.Template7 = Template7; }
35742
35743 // Dom7
35744 if (!window.Dom7) { window.Dom7 = $; }
35745 }
35746 }
35747
35748 // Install Core Modules & Components
35749 Router.use([
35750 RouterTemplateLoaderModule,
35751 RouterComponentLoaderModule ]);
35752
35753 Framework7.use([
35754 DeviceModule,
35755 SupportModule,
35756 UtilsModule,
35757 ResizeModule,
35758 RequestModule,
35759 TouchModule,
35760 ClicksModule,
35761 Router$1,
35762 HistoryModule,
35763 StorageModule,
35764 ComponentModule,
35765 ServiceWorkerModule,
35766 Statusbar$1,
35767 View$1,
35768 Navbar$1,
35769 Toolbar$1,
35770 Subnavbar,
35771 TouchRipple$1,
35772 Modal$1,
35773 Dialog$1,
35774 Popup$1,
35775 LoginScreen$1,
35776 Popover$1,
35777 Actions$1,
35778 Sheet$1,
35779 Toast$1,
35780 Preloader$1,
35781 Progressbar$1,
35782 Sortable$1,
35783 Swipeout$1,
35784 Accordion$1,
35785 ContactsList,
35786 VirtualList$1,
35787 ListIndex$1,
35788 Timeline,
35789 Tabs,
35790 Panel$1,
35791 Card,
35792 Chip,
35793 Form,
35794 Input$1,
35795 Checkbox,
35796 Radio,
35797 Toggle$1,
35798 Range$1,
35799 Stepper$1,
35800 SmartSelect$1,
35801 Grid,
35802 Calendar$1,
35803 Picker$1,
35804 InfiniteScroll$1,
35805 PullToRefresh$1,
35806 Lazy$1,
35807 DataTable$1,
35808 Fab$1,
35809 Searchbar$1,
35810 Messages$1,
35811 Messagebar$1,
35812 Swiper$1,
35813 PhotoBrowser$1,
35814 Notification$1,
35815 Autocomplete$1,
35816 Tooltip$1,
35817 Gauge$1,
35818 Skeleton,
35819 Menu$1,
35820 Vi,
35821 Elevation,
35822 Typography
35823 ]);
35824
35825 return Framework7;
35826
35827 }));